#!/usr/bin/env python3 r""" CLI FFDC Collector. """ import os import sys import click # ---------Set sys.path for cli command execution--------------------------------------- # Absolute path to openbmc-test-automation/ffdc abs_path = os.path.abspath(os.path.dirname(sys.argv[0])) full_path = abs_path.split("ffdc")[0] sys.path.append(full_path) # Walk path and append to sys.path for root, dirs, files in os.walk(full_path): for found_dir in dirs: sys.path.append(os.path.join(root, found_dir)) from ffdc_collector import ffdc_collector # NOQA @click.command(context_settings=dict(help_option_names=["-h", "--help"])) @click.option("-r", "--remote", help="Hostname/IP of the remote host") @click.option("-u", "--username", help="Username of the remote host.") @click.option("-p", "--password", help="Password of the remote host.") @click.option( "-port_ssh", default=22, show_default=True, help="SSH port value." ) @click.option( "-port_https", default=443, show_default=True, help="HTTPS port value." ) @click.option( "-port_ipmi", default=623, show_default=True, help="IPMI port value." ) @click.option( "-c", "--config", default=abs_path + "/ffdc_config.yaml", show_default=True, help="YAML Configuration file for log collection.", ) @click.option( "-l", "--location", default="/tmp", show_default=True, help="Location to save logs", ) @click.option( "-t", "--type", help=( "OS type of the remote (targeting) host. OPENBMC, RHEL, UBUNTU," " SLES, AIX" ), ) @click.option( "-rp", "--protocol", default="ALL", show_default=True, help="Select protocol to communicate with remote host.", ) @click.option( "-e", "--env_vars", show_default=True, help="Environment variables e.g: {'var':value}", ) @click.option( "-ec", "--econfig", show_default=True, help="Predefine environment variables, refer en_vars_template.yaml ", ) @click.option( "--log_level", default="INFO", show_default=True, help="Log level (CRITICAL, ERROR, WARNING, INFO, DEBUG)", ) def cli_ffdc( remote, username, password, port_ssh, port_https, port_ipmi, config, location, type, protocol, env_vars, econfig, log_level, ): r""" Stand alone CLI to generate and collect FFDC from the selected target. """ click.echo( "\n********** FFDC (First Failure Data Collection) Starts **********" ) if input_options_ok( remote, username, password, port_ssh, port_https, port_ipmi, config, type, ): this_ffdc = ffdc_collector( remote, username, password, port_ssh, port_https, port_ipmi, config, location, type, protocol, env_vars, econfig, log_level, ) this_ffdc.collect_ffdc() if len(os.listdir(this_ffdc.ffdc_dir_path)) == 0: click.echo( "\n\tFFDC Collection from " + remote + " has failed.\n\n" ) else: click.echo( str( "\n\t" + str(len(os.listdir(this_ffdc.ffdc_dir_path))) + " files were retrieved from " + remote ) ) click.echo("\tFiles are stored in " + this_ffdc.ffdc_dir_path) click.echo("\tTotal elapsed time " + this_ffdc.elapsed_time + "\n\n") click.echo("\n********** FFDC Finishes **********\n\n") def input_options_ok( remote, username, password, port_ssh, port_https, port_ipmi, config, type ): r""" Verify script options exist via CLI options or environment variables. """ all_options_ok = True if not remote: all_options_ok = False print( " \n\tERROR: Name/IP of the remote host is not specified in" " CLI options." ) if not username: all_options_ok = False print( " \n\tERROR: User of the remote host is not specified in" " CLI options." ) if not password: all_options_ok = False print( " \n\tERROR: Password of the user remote host is not" " specified in CLI options." ) if not type: all_options_ok = False print( " \n\tERROR: Remote host os type is not specified in CLI" " options." ) if not os.path.isfile(config): all_options_ok = False print( " \n\tERROR: Config file %s is not found. Please verify" " path and filename." % config ) return all_options_ok if __name__ == "__main__": cli_ffdc()