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', envvar='OPENBMC_HOST',
26              help="Name/IP of the remote (targeting) host. [default: OPENBMC_HOST]")
27@click.option('-u', '--username', envvar='OPENBMC_USERNAME',
28              help="User on the remote host with access to FFDC files.[default: OPENBMC_USERNAME]")
29@click.option('-p', '--password', envvar='OPENBMC_PASSWORD',
30              help="Password for user on remote host. [default: OPENBMC_PASSWORD]")
31@click.option('-c', '--ffdc_config', default=abs_path + "/ffdc_config.yaml",
32              show_default=True, help="YAML Configuration file listing commands and files for FFDC.")
33@click.option('-l', '--location', default="/tmp",
34              show_default=True, help="Location to store collected FFDC data")
35@click.option('-t', '--remote_type',
36              help="OS type of the remote (targeting) host. OPENBMC, RHEL, UBUNTU, SLES, AIX")
37@click.option('-rp', '--remote_protocol', default="ALL",
38              show_default=True,
39              help="Select protocol (SSH, SCP, REDFISH) to communicate with remote host. \
40                    Default: all available.")
41def cli_ffdc(remote, username, password, ffdc_config, location, remote_type, remote_protocol):
42    r"""
43    Stand alone CLI to generate and collect FFDC from the selected target.
44    """
45
46    click.echo("\n********** FFDC (First Failure Data Collection) Starts **********")
47
48    if input_options_ok(remote, username, password, ffdc_config, remote_type):
49        thisFFDC = FFDCCollector(remote, username, password,
50                                 ffdc_config, location, remote_type, remote_protocol)
51        thisFFDC.collect_ffdc()
52
53        if len(os.listdir(thisFFDC.ffdc_dir_path)) == 0:
54            click.echo("\n\tFFDC Collection from " + remote + " has failed.\n\n")
55        else:
56            click.echo(str("\n\t" + str(len(os.listdir(thisFFDC.ffdc_dir_path)))
57                       + " files were retrieved from " + remote))
58            click.echo("\tFiles are stored in " + thisFFDC.ffdc_dir_path)
59
60        click.echo("\tTotal elapsed time " + thisFFDC.elapsed_time + "\n\n")
61    click.echo("\n********** FFDC Finishes **********\n\n")
62
63
64def input_options_ok(remote, username, password, ffdc_config, remote_type):
65    r"""
66    Verify script options exist via CLI options or environment variables.
67    """
68
69    all_options_ok = True
70
71    if not remote:
72        all_options_ok = False
73        print("\
74        \n>>>>>\tERROR: Name/IP of the remote host is not specified in CLI options or env OPENBMC_HOST.")
75    if not username:
76        all_options_ok = False
77        print("\
78        \n>>>>>\tERROR: User on the remote host is not specified in CLI options or env OPENBMC_USERNAME.")
79    if not password:
80        all_options_ok = False
81        print("\
82        \n>>>>>\tERROR: Password for user on remote host is not specified in CLI options "
83              + "or env OPENBMC_PASSWORD.")
84    if not remote_type:
85        all_options_ok = False
86        print("\
87        \n>>>>>\tERROR: Remote host os type is not specified in CLI options.")
88    if not os.path.isfile(ffdc_config):
89        all_options_ok = False
90        print("\
91        \n>>>>>\tERROR: Config file %s is not found.  Please verify path and filename." % ffdc_config)
92
93    return all_options_ok
94
95
96if __name__ == '__main__':
97    cli_ffdc()
98