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