kiwi-scp/src/kiwi/subcommands/conf.py

101 lines
2.8 KiB
Python
Raw Normal View History

2020-08-17 14:47:08 +00:00
# system
import logging
import os
import subprocess
# local
from ._subcommand import SubCommand
from .utils.misc import list_projects, get_project_dir
2020-08-18 10:28:59 +00:00
from .utils.rootkit import Rootkit, prefix_path_mnt
# parent
from .._constants import CONF_DIRECTORY_NAME
2020-08-17 14:47:08 +00:00
class ConfCopyCommand(SubCommand):
"""kiwi conf-copy"""
2020-08-17 14:47:08 +00:00
def __init__(self):
super().__init__(
'conf-copy',
2020-08-17 14:47:08 +00:00
description="Synchronize all config files to target directory"
)
def run(self, runner, config, args):
conf_dirs = []
2020-08-17 14:47:08 +00:00
for project_name in list_projects(config):
project_conf = f"{get_project_dir(config, project_name)}/{CONF_DIRECTORY_NAME}"
2020-08-17 14:47:08 +00:00
if os.path.isdir(project_conf):
conf_dirs.append(project_conf)
2020-08-17 14:47:08 +00:00
if conf_dirs:
# add target directory
conf_dirs.append(config['runtime:storage'])
logging.info(f"Sync directories: {conf_dirs}")
2020-08-17 14:47:08 +00:00
Rootkit('rsync').run(
2020-08-18 10:28:59 +00:00
config, args, ['rsync', '-r', *prefix_path_mnt(conf_dirs)],
2020-08-17 14:47:08 +00:00
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
)
return True
class ConfPurgeCommand(SubCommand):
"""kiwi conf-purge"""
def __init__(self):
super().__init__(
'conf-purge',
description="Remove all config files in target directory"
)
def run(self, runner, config, args):
conf_target = f"{config['runtime:storage']}/{CONF_DIRECTORY_NAME}"
logging.info(f"Purging directories: {conf_target}")
Rootkit().run(
2020-08-18 10:28:59 +00:00
config, args, ['rm', '-rf', prefix_path_mnt(conf_target)],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
)
return True
2020-08-18 15:49:49 +00:00
class ConfCleanCommand(SubCommand):
"""kiwi conf-clean"""
def __init__(self):
super().__init__(
'conf-clean',
description="Cleanly sync all configs to target folder, relaunch affected projects"
)
def run(self, runner, config, args):
result = True
# down all projects with config directories
affected_projects = []
for project_name in list_projects(config):
project_conf = f"{get_project_dir(config, project_name)}/{CONF_DIRECTORY_NAME}"
if os.path.isdir(project_conf):
affected_projects.append(project_name)
for project_name in affected_projects:
args.projects = project_name
result &= runner.run('down')
# cleanly sync configs
result &= runner.run('conf-purge')
result &= runner.run('conf-purge')
# bring projects back up
for project_name in affected_projects:
args.projects = project_name
result &= runner.run('up')
return result