xref: /openbmc/openbmc-test-automation/ffdc/collect_ffdc.py (revision bade11a2432921a471bf39131693dcc197a96084)
1 #!/usr/bin/env python3
2 
3 r"""
4 CLI FFDC Collector.
5 """
6 
7 import os
8 import sys
9 import click
10 
11 # ---------Set sys.path for cli command execution---------------------------------------
12 # Absolute path to openbmc-test-automation/ffdc
13 abs_path = os.path.abspath(os.path.dirname(sys.argv[0]))
14 full_path = abs_path.split('ffdc')[0]
15 sys.path.append(full_path)
16 # Walk path and append to sys.path
17 for 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 
21 from ffdc_collector import ffdc_collector
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)")
47 def 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         this_ffdc = ffdc_collector(remote,
65                                    username,
66                                    password,
67                                    config,
68                                    location,
69                                    type,
70                                    protocol,
71                                    env_vars,
72                                    econfig,
73                                    log_level)
74         this_ffdc.collect_ffdc()
75 
76         if len(os.listdir(this_ffdc.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(this_ffdc.ffdc_dir_path)))
80                            + " files were retrieved from " + remote))
81             click.echo("\tFiles are stored in " + this_ffdc.ffdc_dir_path)
82 
83         click.echo("\tTotal elapsed time " + this_ffdc.elapsed_time + "\n\n")
84     click.echo("\n********** FFDC Finishes **********\n\n")
85 
86 
87 def 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 
118 if __name__ == '__main__':
119     cli_ffdc()
120