def collect_logs(tarfile, include_userdata): """Collect all cloud-init logs and tar them up into the provided tarfile. @param tarfile: The path of the tar-gzipped file to create. @param include_userdata: Boolean, true means include user-data. """ tarfile = os.path.abspath(tarfile) date = datetime.utcnow().date().strftime('%Y-%m-%d') log_dir = 'cloud-init-logs-{0}'.format(date) with tempdir(dir='/tmp') as tmp_dir: log_dir = os.path.join(tmp_dir, log_dir) _write_command_output_to_file( ['dpkg-query', '--show', "-f=${Version}\n", 'cloud-init'], os.path.join(log_dir, 'version')) _write_command_output_to_file(['dmesg'], os.path.join(log_dir, 'dmesg.txt')) _write_command_output_to_file(['journalctl', '-o', 'short-precise'], os.path.join(log_dir, 'journal.txt')) for log in CLOUDINIT_LOGS: copy(log, log_dir) if include_userdata: copy(USER_DATA_FILE, log_dir) run_dir = os.path.join(log_dir, 'run') ensure_dir(run_dir) shutil.copytree(CLOUDINIT_RUN_DIR, os.path.join(run_dir, 'cloud-init')) with chdir(tmp_dir): subp(['tar', 'czvf', tarfile, log_dir.replace(tmp_dir + '/', '')])
def remove_artifacts(remove_logs, remove_seed=False): """Helper which removes artifacts dir and optionally log files. @param: remove_logs: Boolean. Set True to delete the cloud_dir path. False preserves them. @param: remove_seed: Boolean. Set True to also delete seed subdir in paths.cloud_dir. @returns: 0 on success, 1 otherwise. """ init = Init(ds_deps=[]) init.read_cfg() if remove_logs: for log_file in get_config_logfiles(init.cfg): del_file(log_file) if not os.path.isdir(init.paths.cloud_dir): return 0 # Artifacts dir already cleaned with chdir(init.paths.cloud_dir): for path in os.listdir('.'): if path == 'seed' and not remove_seed: continue try: if os.path.isdir(path) and not is_link(path): del_dir(path) else: del_file(path) except OSError as e: error('Could not remove {0}: {1}'.format(path, str(e))) return 1 return 0
def collect_logs(tarfile, include_userdata, verbosity=0): """Collect all cloud-init logs and tar them up into the provided tarfile. @param tarfile: The path of the tar-gzipped file to create. @param include_userdata: Boolean, true means include user-data. """ if include_userdata and os.getuid() != 0: sys.stderr.write("To include userdata, root user is required." " Try sudo cloud-init collect-logs\n") return 1 tarfile = os.path.abspath(tarfile) date = datetime.utcnow().date().strftime('%Y-%m-%d') log_dir = 'cloud-init-logs-{0}'.format(date) with tempdir(dir='/tmp') as tmp_dir: log_dir = os.path.join(tmp_dir, log_dir) version = _write_command_output_to_file(['cloud-init', '--version'], os.path.join( log_dir, 'version'), "cloud-init --version", verbosity) dpkg_ver = _write_command_output_to_file( ['dpkg-query', '--show', "-f=${Version}\n", 'cloud-init'], os.path.join(log_dir, 'dpkg-version'), "dpkg version", verbosity) if not version: version = dpkg_ver if dpkg_ver else "not-available" _debug("collected cloud-init version: %s\n" % version, 1, verbosity) _write_command_output_to_file(['dmesg'], os.path.join(log_dir, 'dmesg.txt'), "dmesg output", verbosity) _write_command_output_to_file( ['journalctl', '--boot=0', '-o', 'short-precise'], os.path.join(log_dir, 'journal.txt'), "systemd journal of current boot", verbosity) for log in CLOUDINIT_LOGS: _collect_file(log, log_dir, verbosity) if include_userdata: _collect_file(USER_DATA_FILE, log_dir, verbosity) run_dir = os.path.join(log_dir, 'run') ensure_dir(run_dir) if os.path.exists(CLOUDINIT_RUN_DIR): try: shutil.copytree(CLOUDINIT_RUN_DIR, os.path.join(run_dir, 'cloud-init'), ignore=_copytree_rundir_ignore_files) except shutil.Error as e: sys.stderr.write("Failed collecting file(s) due to error:\n") sys.stderr.write(str(e) + '\n') _debug("collected dir %s\n" % CLOUDINIT_RUN_DIR, 1, verbosity) else: _debug("directory '%s' did not exist\n" % CLOUDINIT_RUN_DIR, 1, verbosity) with chdir(tmp_dir): subp(['tar', 'czvf', tarfile, log_dir.replace(tmp_dir + '/', '')]) sys.stderr.write("Wrote %s\n" % tarfile) return 0
def collect_logs(tarfile, include_userdata, verbosity=0): """Collect all cloud-init logs and tar them up into the provided tarfile. @param tarfile: The path of the tar-gzipped file to create. @param include_userdata: Boolean, true means include user-data. """ if include_userdata and os.getuid() != 0: sys.stderr.write( "To include userdata, root user is required." " Try sudo cloud-init collect-logs\n") return 1 tarfile = os.path.abspath(tarfile) date = datetime.utcnow().date().strftime('%Y-%m-%d') log_dir = 'cloud-init-logs-{0}'.format(date) with tempdir(dir='/tmp') as tmp_dir: log_dir = os.path.join(tmp_dir, log_dir) version = _write_command_output_to_file( ['cloud-init', '--version'], os.path.join(log_dir, 'version'), "cloud-init --version", verbosity) dpkg_ver = _write_command_output_to_file( ['dpkg-query', '--show', "-f=${Version}\n", 'cloud-init'], os.path.join(log_dir, 'dpkg-version'), "dpkg version", verbosity) if not version: version = dpkg_ver if dpkg_ver else "not-available" _debug("collected cloud-init version: %s\n" % version, 1, verbosity) _write_command_output_to_file( ['dmesg'], os.path.join(log_dir, 'dmesg.txt'), "dmesg output", verbosity) _write_command_output_to_file( ['journalctl', '--boot=0', '-o', 'short-precise'], os.path.join(log_dir, 'journal.txt'), "systemd journal of current boot", verbosity) for log in CLOUDINIT_LOGS: _collect_file(log, log_dir, verbosity) if include_userdata: _collect_file(USER_DATA_FILE, log_dir, verbosity) run_dir = os.path.join(log_dir, 'run') ensure_dir(run_dir) if os.path.exists(CLOUDINIT_RUN_DIR): shutil.copytree(CLOUDINIT_RUN_DIR, os.path.join(run_dir, 'cloud-init'), ignore=_copytree_ignore_sensitive_files) _debug("collected dir %s\n" % CLOUDINIT_RUN_DIR, 1, verbosity) else: _debug("directory '%s' did not exist\n" % CLOUDINIT_RUN_DIR, 1, verbosity) with chdir(tmp_dir): subp(['tar', 'czvf', tarfile, log_dir.replace(tmp_dir + '/', '')]) sys.stderr.write("Wrote %s\n" % tarfile) return 0
def collect_logs(tarfile, include_userdata: bool, verbosity=0): """Collect all cloud-init logs and tar them up into the provided tarfile. @param tarfile: The path of the tar-gzipped file to create. @param include_userdata: Boolean, true means include user-data. """ if include_userdata and os.getuid() != 0: sys.stderr.write("To include userdata, root user is required." " Try sudo cloud-init collect-logs\n") return 1 tarfile = os.path.abspath(tarfile) date = datetime.utcnow().date().strftime("%Y-%m-%d") log_dir = "cloud-init-logs-{0}".format(date) with tempdir(dir="/tmp") as tmp_dir: log_dir = os.path.join(tmp_dir, log_dir) version = _write_command_output_to_file( ["cloud-init", "--version"], os.path.join(log_dir, "version"), "cloud-init --version", verbosity, ) dpkg_ver = _write_command_output_to_file( ["dpkg-query", "--show", "-f=${Version}\n", "cloud-init"], os.path.join(log_dir, "dpkg-version"), "dpkg version", verbosity, ) if not version: version = dpkg_ver if dpkg_ver else "not-available" _debug("collected cloud-init version: %s\n" % version, 1, verbosity) _write_command_output_to_file( ["dmesg"], os.path.join(log_dir, "dmesg.txt"), "dmesg output", verbosity, ) _write_command_output_to_file( ["journalctl", "--boot=0", "-o", "short-precise"], os.path.join(log_dir, "journal.txt"), "systemd journal of current boot", verbosity, ) for log in CLOUDINIT_LOGS: _collect_file(log, log_dir, verbosity) if include_userdata: user_data_file = _get_user_data_file() _collect_file(user_data_file, log_dir, verbosity) run_dir = os.path.join(log_dir, "run") ensure_dir(run_dir) if os.path.exists(CLOUDINIT_RUN_DIR): try: shutil.copytree( CLOUDINIT_RUN_DIR, os.path.join(run_dir, "cloud-init"), ignore=_copytree_rundir_ignore_files, ) except shutil.Error as e: sys.stderr.write("Failed collecting file(s) due to error:\n") sys.stderr.write(str(e) + "\n") _debug("collected dir %s\n" % CLOUDINIT_RUN_DIR, 1, verbosity) else: _debug( "directory '%s' did not exist\n" % CLOUDINIT_RUN_DIR, 1, verbosity, ) with chdir(tmp_dir): subp(["tar", "czvf", tarfile, log_dir.replace(tmp_dir + "/", "")]) sys.stderr.write("Wrote %s\n" % tarfile) return 0