1#!/usr/bin/env python3
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 ffdc_collector  # NOQA
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        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
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