blob: ef96c6b1c8ba18ef443dc1363cd6c456ef7159bd [file] [log] [blame]
#!/usr/bin/env python3
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 ffdc_collector # NOQA
@click.command(context_settings=dict(help_option_names=["-h", "--help"]))
@click.option("-r", "--remote", help="Hostname/IP of the remote host")
@click.option("-u", "--username", help="Username of the remote host.")
@click.option("-p", "--password", help="Password of the remote host.")
@click.option(
"-c",
"--config",
default=abs_path + "/ffdc_config.yaml",
show_default=True,
help="YAML Configuration file for log collection.",
)
@click.option(
"-l",
"--location",
default="/tmp",
show_default=True,
help="Location to save logs",
)
@click.option(
"-t",
"--type",
help=(
"OS type of the remote (targeting) host. OPENBMC, RHEL, UBUNTU,"
" SLES, AIX"
),
)
@click.option(
"-rp",
"--protocol",
default="ALL",
show_default=True,
help="Select protocol to communicate with remote host.",
)
@click.option(
"-e",
"--env_vars",
show_default=True,
help="Environment variables e.g: {'var':value}",
)
@click.option(
"-ec",
"--econfig",
show_default=True,
help="Predefine environment variables, refer en_vars_template.yaml ",
)
@click.option(
"--log_level",
default="INFO",
show_default=True,
help="Log level (CRITICAL, ERROR, WARNING, INFO, DEBUG)",
)
def cli_ffdc(
remote,
username,
password,
config,
location,
type,
protocol,
env_vars,
econfig,
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, config, type):
this_ffdc = ffdc_collector(
remote,
username,
password,
config,
location,
type,
protocol,
env_vars,
econfig,
log_level,
)
this_ffdc.collect_ffdc()
if len(os.listdir(this_ffdc.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(this_ffdc.ffdc_dir_path)))
+ " files were retrieved from "
+ remote
)
)
click.echo("\tFiles are stored in " + this_ffdc.ffdc_dir_path)
click.echo("\tTotal elapsed time " + this_ffdc.elapsed_time + "\n\n")
click.echo("\n********** FFDC Finishes **********\n\n")
def input_options_ok(remote, username, password, config, 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."
)
if not username:
all_options_ok = False
print(
" \n\tERROR: User of the remote host is not specified in"
" CLI options."
)
if not password:
all_options_ok = False
print(
" \n\tERROR: Password of the user remote host is not"
" specified in CLI options."
)
if not type:
all_options_ok = False
print(
" \n\tERROR: Remote host os type is not specified in CLI"
" options."
)
if not os.path.isfile(config):
all_options_ok = False
print(
" \n\tERROR: Config file %s is not found. Please verify"
" path and filename." % config
)
return all_options_ok
if __name__ == "__main__":
cli_ffdc()