1#!/usr/bin/env python3 2 3r""" 4CLI FFDC Collector. 5""" 6 7from ffdc_collector import ffdc_collector 8 9import os 10import sys 11import click 12 13# ---------Set sys.path for cli command execution--------------------------------------- 14# Absolute path to openbmc-test-automation/ffdc 15abs_path = os.path.abspath(os.path.dirname(sys.argv[0])) 16full_path = abs_path.split('ffdc')[0] 17 18sys.path.append(full_path) 19# Walk path and append to sys.path 20for root, dirs, files in os.walk(full_path): 21 for found_dir in dirs: 22 sys.path.append(os.path.join(root, found_dir)) 23 24 25@click.command(context_settings=dict(help_option_names=['-h', '--help'])) 26@click.option('-r', '--remote', 27 help="Hostname/IP of the remote host") 28@click.option('-u', '--username', 29 help="Username of the remote host.") 30@click.option('-p', '--password', 31 help="Password of the remote host.") 32@click.option('-c', '--config', default=abs_path + "/ffdc_config.yaml", 33 show_default=True, help="YAML Configuration file for log collection.") 34@click.option('-l', '--location', default="/tmp", 35 show_default=True, help="Location to save logs") 36@click.option('-t', '--type', 37 help="OS type of the remote (targeting) host. OPENBMC, RHEL, UBUNTU, SLES, AIX") 38@click.option('-rp', '--protocol', default="ALL", 39 show_default=True, 40 help="Select protocol to communicate with remote host.") 41@click.option('-e', '--env_vars', show_default=True, 42 help="Environment variables e.g: {'var':value}") 43@click.option('-ec', '--econfig', show_default=True, 44 help="Predefine environment variables, refer en_vars_template.yaml ") 45@click.option('--log_level', default="INFO", 46 show_default=True, 47 help="Log level (CRITICAL, ERROR, WARNING, INFO, DEBUG)") 48def cli_ffdc(remote, 49 username, 50 password, 51 config, 52 location, 53 type, 54 protocol, 55 env_vars, 56 econfig, 57 log_level): 58 r""" 59 Stand alone CLI to generate and collect FFDC from the selected target. 60 """ 61 62 click.echo("\n********** FFDC (First Failure Data Collection) Starts **********") 63 64 if input_options_ok(remote, username, password, config, type): 65 this_ffdc = ffdc_collector(remote, 66 username, 67 password, 68 config, 69 location, 70 type, 71 protocol, 72 env_vars, 73 econfig, 74 log_level) 75 this_ffdc.collect_ffdc() 76 77 if len(os.listdir(this_ffdc.ffdc_dir_path)) == 0: 78 click.echo("\n\tFFDC Collection from " + remote + " has failed.\n\n") 79 else: 80 click.echo(str("\n\t" + str(len(os.listdir(this_ffdc.ffdc_dir_path))) 81 + " files were retrieved from " + remote)) 82 click.echo("\tFiles are stored in " + this_ffdc.ffdc_dir_path) 83 84 click.echo("\tTotal elapsed time " + this_ffdc.elapsed_time + "\n\n") 85 click.echo("\n********** FFDC Finishes **********\n\n") 86 87 88def input_options_ok(remote, username, password, config, type): 89 r""" 90 Verify script options exist via CLI options or environment variables. 91 """ 92 93 all_options_ok = True 94 95 if not remote: 96 all_options_ok = False 97 print("\ 98 \n\tERROR: Name/IP of the remote host is not specified in CLI options.") 99 if not username: 100 all_options_ok = False 101 print("\ 102 \n\tERROR: User of the remote host is not specified in CLI options.") 103 if not password: 104 all_options_ok = False 105 print("\ 106 \n\tERROR: Password of the user remote host is not specified in CLI options.") 107 if not type: 108 all_options_ok = False 109 print("\ 110 \n\tERROR: Remote host os type is not specified in CLI options.") 111 if not os.path.isfile(config): 112 all_options_ok = False 113 print("\ 114 \n\tERROR: Config file %s is not found. Please verify path and filename." % config) 115 116 return all_options_ok 117 118 119if __name__ == '__main__': 120 cli_ffdc() 121