Blame cloudinit/cmd/clean.py

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