|
Packit Service |
a04d08 |
# Copyright (C) 2017 Canonical Ltd.
|
|
Packit Service |
a04d08 |
#
|
|
Packit Service |
a04d08 |
# This file is part of cloud-init. See LICENSE file for license information.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
"""Define 'clean' utility and handler as part of cloud-init commandline."""
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
import argparse
|
|
Packit Service |
a04d08 |
import glob
|
|
Packit Service |
a04d08 |
import os
|
|
Packit Service |
a04d08 |
import sys
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
from cloudinit.stages import Init
|
|
Packit Service |
751c4a |
from cloudinit.subp import (ProcessExecutionError, subp)
|
|
Packit Service |
751c4a |
from cloudinit.util import (del_dir, del_file, get_config_logfiles, is_link)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def error(msg):
|
|
Packit Service |
a04d08 |
sys.stderr.write("ERROR: " + msg + "\n")
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def get_parser(parser=None):
|
|
Packit Service |
a04d08 |
"""Build or extend an arg parser for clean utility.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@param parser: Optional existing ArgumentParser instance representing the
|
|
Packit Service |
a04d08 |
clean subcommand which will be extended to support the args of
|
|
Packit Service |
a04d08 |
this utility.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@returns: ArgumentParser with proper argument configuration.
|
|
Packit Service |
a04d08 |
"""
|
|
Packit Service |
a04d08 |
if not parser:
|
|
Packit Service |
a04d08 |
parser = argparse.ArgumentParser(
|
|
Packit Service |
a04d08 |
prog='clean',
|
|
Packit Service |
a04d08 |
description=('Remove logs and artifacts so cloud-init re-runs on '
|
|
Packit Service |
a04d08 |
'a clean system'))
|
|
Packit Service |
a04d08 |
parser.add_argument(
|
|
Packit Service |
a04d08 |
'-l', '--logs', action='store_true', default=False, dest='remove_logs',
|
|
Packit Service |
a04d08 |
help='Remove cloud-init logs.')
|
|
Packit Service |
a04d08 |
parser.add_argument(
|
|
Packit Service |
a04d08 |
'-r', '--reboot', action='store_true', default=False,
|
|
Packit Service |
a04d08 |
help='Reboot system after logs are cleaned so cloud-init re-runs.')
|
|
Packit Service |
a04d08 |
parser.add_argument(
|
|
Packit Service |
a04d08 |
'-s', '--seed', action='store_true', default=False, dest='remove_seed',
|
|
Packit Service |
a04d08 |
help='Remove cloud-init seed directory /var/lib/cloud/seed.')
|
|
Packit Service |
a04d08 |
return parser
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def remove_artifacts(remove_logs, remove_seed=False):
|
|
Packit Service |
a04d08 |
"""Helper which removes artifacts dir and optionally log files.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@param: remove_logs: Boolean. Set True to delete the cloud_dir path. False
|
|
Packit Service |
a04d08 |
preserves them.
|
|
Packit Service |
a04d08 |
@param: remove_seed: Boolean. Set True to also delete seed subdir in
|
|
Packit Service |
a04d08 |
paths.cloud_dir.
|
|
Packit Service |
a04d08 |
@returns: 0 on success, 1 otherwise.
|
|
Packit Service |
a04d08 |
"""
|
|
Packit Service |
a04d08 |
init = Init(ds_deps=[])
|
|
Packit Service |
a04d08 |
init.read_cfg()
|
|
Packit Service |
a04d08 |
if remove_logs:
|
|
Packit Service |
a04d08 |
for log_file in get_config_logfiles(init.cfg):
|
|
Packit Service |
a04d08 |
del_file(log_file)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if not os.path.isdir(init.paths.cloud_dir):
|
|
Packit Service |
a04d08 |
return 0 # Artifacts dir already cleaned
|
|
Packit Service |
a04d08 |
seed_path = os.path.join(init.paths.cloud_dir, 'seed')
|
|
Packit Service |
a04d08 |
for path in glob.glob('%s/*' % init.paths.cloud_dir):
|
|
Packit Service |
a04d08 |
if path == seed_path and not remove_seed:
|
|
Packit Service |
a04d08 |
continue
|
|
Packit Service |
a04d08 |
try:
|
|
Packit Service |
a04d08 |
if os.path.isdir(path) and not is_link(path):
|
|
Packit Service |
a04d08 |
del_dir(path)
|
|
Packit Service |
a04d08 |
else:
|
|
Packit Service |
a04d08 |
del_file(path)
|
|
Packit Service |
a04d08 |
except OSError as e:
|
|
Packit Service |
a04d08 |
error('Could not remove {0}: {1}'.format(path, str(e)))
|
|
Packit Service |
a04d08 |
return 1
|
|
Packit Service |
a04d08 |
return 0
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def handle_clean_args(name, args):
|
|
Packit Service |
a04d08 |
"""Handle calls to 'cloud-init clean' as a subcommand."""
|
|
Packit Service |
a04d08 |
exit_code = remove_artifacts(args.remove_logs, args.remove_seed)
|
|
Packit Service |
a04d08 |
if exit_code == 0 and args.reboot:
|
|
Packit Service |
a04d08 |
cmd = ['shutdown', '-r', 'now']
|
|
Packit Service |
a04d08 |
try:
|
|
Packit Service |
a04d08 |
subp(cmd, capture=False)
|
|
Packit Service |
a04d08 |
except ProcessExecutionError as e:
|
|
Packit Service |
a04d08 |
error(
|
|
Packit Service |
a04d08 |
'Could not reboot this system using "{0}": {1}'.format(
|
|
Packit Service |
a04d08 |
cmd, str(e)))
|
|
Packit Service |
a04d08 |
exit_code = 1
|
|
Packit Service |
a04d08 |
return exit_code
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def main():
|
|
Packit Service |
a04d08 |
"""Tool to collect and tar all cloud-init related logs."""
|
|
Packit Service |
a04d08 |
parser = get_parser()
|
|
Packit Service |
a04d08 |
sys.exit(handle_clean_args('clean', parser.parse_args()))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if __name__ == '__main__':
|
|
Packit Service |
a04d08 |
main()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# vi: ts=4 expandtab
|