pmbootstrap/pmb/config/workdir.py

88 lines
2.4 KiB
Python

# Copyright 2020 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
""" Save, read, verify workdir state related information in $WORK/workdir.cfg,
for example the init dates of the chroots. This is not saved in
pmbootstrap.cfg, because pmbootstrap.cfg is not tied to a specific work
dir. """
import configparser
import os
import time
import pmb.config
def chroot_save_date(args, suffix):
""" Save the chroot initialization date in $WORK/workdir.cfg. """
# Read existing cfg
cfg = configparser.ConfigParser()
path = args.work + "/workdir.cfg"
if os.path.isfile(path):
cfg.read(path)
# Set current date for chroot suffix
key = "chroot-init-dates"
if key not in cfg:
cfg[key] = {}
cfg[key][suffix] = str(int(time.time()))
# Write back
with open(path, "w") as handle:
cfg.write(handle)
def chroots_outdated(args):
""" Check if init dates from workdir.cfg indicate that any chroot is
outdated.
:returns: True if any of the chroots are outdated and should be zapped,
False otherwise """
# Skip if workdir.cfg doesn't exist
path = args.work + "/workdir.cfg"
if not os.path.exists(path):
return False
cfg = configparser.ConfigParser()
cfg.read(path)
key = "chroot-init-dates"
if key not in cfg:
return False
date_outdated = time.time() - pmb.config.chroot_outdated
for suffix in cfg[key]:
date_init = int(cfg[key][suffix])
if date_init <= date_outdated:
return True
return False
def clean(args):
""" Remove obsolete data data from workdir.cfg.
:returns: None if workdir does not exist,
True if config was rewritten,
False if config did not change """
# Skip if workdir.cfg doesn't exist
path = args.work + "/workdir.cfg"
if not os.path.exists(path):
return None
# Read
cfg = configparser.ConfigParser()
cfg.read(path)
# Remove entries for deleted chroots
key = "chroot-init-dates"
changed = False
if key in cfg:
for suffix in cfg[key]:
path_suffix = args.work + "/chroot_" + suffix
if os.path.exists(path_suffix):
continue
changed = True
del cfg[key][suffix]
# Write back
if changed:
with open(path, "w") as handle:
cfg.write(handle)
return changed