2020-08-17 14:47:08 +00:00
|
|
|
# system
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
# local
|
|
|
|
from ._subcommand import SubCommand
|
2020-08-18 12:18:54 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
2020-08-18 10:24:55 +00:00
|
|
|
class ConfCopyCommand(SubCommand):
|
|
|
|
"""kiwi conf-copy"""
|
2020-08-17 14:47:08 +00:00
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
super().__init__(
|
2020-08-18 10:24:55 +00:00
|
|
|
'conf-copy',
|
2020-08-17 14:47:08 +00:00
|
|
|
description="Synchronize all config files to target directory"
|
|
|
|
)
|
|
|
|
|
|
|
|
def run(self, runner, config, args):
|
2020-08-17 15:56:29 +00:00
|
|
|
conf_dirs = []
|
2020-08-17 14:47:08 +00:00
|
|
|
|
|
|
|
for project_name in list_projects(config):
|
2020-08-18 10:24:55 +00:00
|
|
|
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):
|
2020-08-17 15:56:29 +00:00
|
|
|
conf_dirs.append(project_conf)
|
2020-08-17 14:47:08 +00:00
|
|
|
|
2020-08-17 15:56:29 +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
|
|
|
|
2020-08-17 15:56:29 +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
|
2020-08-18 10:24:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
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)],
|
2020-08-18 10:24:55 +00:00
|
|
|
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
|