blob: e783e0cb1455257143ec63307ceb1ded272da5fc [file] [log] [blame]
#!/usr/bin/env python
r"""
CLI FFDC Collector.
"""
import os
import sys
import click
# ---------Set sys.path for cli command execution---------------------------------------
# Absolute path to openbmc-test-automation/ffdc
abs_path = os.path.abspath(os.path.dirname(sys.argv[0]))
full_path = abs_path.split('ffdc')[0]
sys.path.append(full_path)
# Walk path and append to sys.path
for root, dirs, files in os.walk(full_path):
for found_dir in dirs:
sys.path.append(os.path.join(root, found_dir))
from ffdc_collector import FFDCCollector
@click.command(context_settings=dict(help_option_names=['-h', '--help']))
@click.option('-r', '--remote', envvar='OPENBMC_HOST',
help="Name/IP of the remote (targeting) host. [default: OPENBMC_HOST]")
@click.option('-u', '--username', envvar='OPENBMC_USERNAME',
help="User on the remote host with access to FFDC files.[default: OPENBMC_USERNAME]")
@click.option('-p', '--password', envvar='OPENBMC_PASSWORD',
help="Password for user on remote host. [default: OPENBMC_PASSWORD]")
@click.option('-c', '--ffdc_config', default=abs_path + "/ffdc_config.yaml",
show_default=True, help="YAML Configuration file listing commands and files for FFDC.")
@click.option('-l', '--location', default="/tmp",
show_default=True, help="Location to store collected FFDC data")
@click.option('-t', '--remote_type',
help="OS type of the remote (targeting) host. OPENBMC, RHEL, UBUNTU, SLES, AIX")
@click.option('-rp', '--remote_protocol', default="ALL",
show_default=True,
help="Select protocol (SSH, SCP, REDFISH) to communicate with remote host. \
Default: all available.")
@click.option('-e', '--env_vars', show_default=True,
help="Environment variables as dictionary e.g: {'var':value}")
@click.option('--log_level', default="INFO",
show_default=True,
help="python logging level (CRITICAL, ERROR, WARNING, INFO, DEBUG)")
def cli_ffdc(remote, username, password,
ffdc_config, location, remote_type,
remote_protocol, env_vars, log_level):
r"""
Stand alone CLI to generate and collect FFDC from the selected target.
"""
click.echo("\n********** FFDC (First Failure Data Collection) Starts **********")
if input_options_ok(remote, username, password, ffdc_config, remote_type):
thisFFDC = FFDCCollector(remote, username, password,
ffdc_config, location, remote_type,
remote_protocol, env_vars, log_level)
thisFFDC.collect_ffdc()
if len(os.listdir(thisFFDC.ffdc_dir_path)) == 0:
click.echo("\n\tFFDC Collection from " + remote + " has failed.\n\n")
else:
click.echo(str("\n\t" + str(len(os.listdir(thisFFDC.ffdc_dir_path)))
+ " files were retrieved from " + remote))
click.echo("\tFiles are stored in " + thisFFDC.ffdc_dir_path)
click.echo("\tTotal elapsed time " + thisFFDC.elapsed_time + "\n\n")
click.echo("\n********** FFDC Finishes **********\n\n")
def input_options_ok(remote, username, password, ffdc_config, remote_type):
r"""
Verify script options exist via CLI options or environment variables.
"""
all_options_ok = True
if not remote:
all_options_ok = False
print("\
\n\tERROR: Name/IP of the remote host is not specified in CLI options or env OPENBMC_HOST.")
if not username:
all_options_ok = False
print("\
\n\tERROR: User on the remote host is not specified in CLI options or env OPENBMC_USERNAME.")
if not password:
all_options_ok = False
print("\
\n\tERROR: Password for user on remote host is not specified in CLI options "
+ "or env OPENBMC_PASSWORD.")
if not remote_type:
all_options_ok = False
print("\
\n\tERROR: Remote host os type is not specified in CLI options.")
if not os.path.isfile(ffdc_config):
all_options_ok = False
print("\
\n\tERROR: Config file %s is not found. Please verify path and filename." % ffdc_config)
return all_options_ok
if __name__ == '__main__':
cli_ffdc()