| #!/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_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_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_https, port_ipmi, config, type |
| ): |
| this_ffdc = ffdc_collector( |
| remote, |
| username, |
| password, |
| 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_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() |