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