| #!/usr/bin/env python3 |
| |
| r""" |
| This file contains functions which are useful for processing BMC dumps. |
| """ |
| |
| import gen_print as gp |
| import gen_misc as gm |
| import gen_robot_keyword as grk |
| import bmc_ssh_utils as bsu |
| import var_funcs as vf |
| import os |
| from robot.libraries.BuiltIn import BuiltIn |
| import sys |
| import os |
| import imp |
| base_path = os.path.dirname(os.path.dirname( |
| imp.find_module("gen_robot_print")[1])) + os.sep |
| sys.path.append(base_path + "data/") |
| import variables as var |
| |
| |
| def get_dump_dict(quiet=None): |
| r""" |
| Get dump information and return as an ordered dictionary where the keys |
| are the dump IDs and the values are the full path names of the dumps. |
| |
| Example robot program call: |
| |
| ${dump_dict}= Get Dump Dict |
| Rprint Vars dump_dict |
| |
| Example output: |
| |
| dump_dict: |
| [1]: |
| /var/lib/phosphor-debug-collector/dumps/1/obmcdump_1_1508255216.tar.xz |
| [2]: |
| /var/lib/phosphor-debug-collector/dumps/2/obmcdump_2_1508255245.tar.xz |
| [3]: |
| /var/lib/phosphor-debug-collector/dumps/3/obmcdump_3_1508255267.tar.xz |
| [4]: |
| /var/lib/phosphor-debug-collector/dumps/4/obmcdump_4_1508255283.tar.xz |
| |
| Description of argument(s): |
| quiet If quiet is set to 1, this function will |
| NOT write status messages to stdout. |
| """ |
| |
| quiet = int(gp.get_var_value(quiet, 1)) |
| cmd_buf = "dump_dir_path=" + var.DUMP_DIR_PATH + " ; " \ |
| + "for dump_id in $(ls ${dump_dir_path} | sort -n) ; do " \ |
| + "file_path=$(ls ${dump_dir_path}${dump_id}/* 2>/dev/null)" \ |
| + " || continue ; echo ${dump_id}:${file_path} ; done" |
| output, stderr, rc = bsu.bmc_execute_command(cmd_buf, quiet=quiet) |
| |
| return vf.key_value_outbuf_to_dict(output) |
| |
| |
| def valid_dump(dump_id, |
| dump_dict=None, |
| quiet=None): |
| r""" |
| Verify that dump_id is a valid. If it is not valid, issue robot failure |
| message. |
| |
| A dump is valid if the indicated dump_id refers to an existing dump with a |
| valid associated dump file. |
| |
| Description of argument(s): |
| dump_id A dump ID (e.g. "1", "2", etc.) |
| dump_dict A dump dictionary such as the one returned |
| by get_dump_dict. If this value is None, |
| this function will call get_dump_dict on |
| the caller's behalf. |
| quiet If quiet is set to 1, this function will |
| NOT write status messages to stdout. |
| """ |
| |
| if dump_dict is None: |
| dump_dict = get_dump_dict(quiet=quiet) |
| |
| if dump_id not in dump_dict: |
| message = "The specified dump ID was not found among the existing" \ |
| + " dumps:\n" |
| message += gp.sprint_var(dump_id) |
| message += gp.sprint_var(dump_dict) |
| BuiltIn().fail(gp.sprint_error(message)) |
| |
| if not dump_dict[dump_id].endswith("tar.xz"): |
| message = "There is no \"tar.xz\" file associated with the given" \ |
| + " dump_id:\n" |
| message += gp.sprint_var(dump_id) |
| dump_file_path = dump_dict[dump_id] |
| message += gp.sprint_var(dump_file_path) |
| BuiltIn().fail(gp.sprint_error(message)) |
| |
| |
| def scp_dumps(targ_dir_path, |
| targ_file_prefix="", |
| dump_dict=None, |
| quiet=None): |
| r""" |
| SCP all dumps from the BMC to the indicated directory on the local system |
| and return a list of the new files. |
| |
| Description of argument(s): |
| targ_dir_path The path of the directory to receive the |
| dump files. |
| targ_file_prefix Prefix which will be pre-pended to each |
| target file's name. |
| dump_dict A dump dictionary such as the one returned |
| by get_dump_dict. If this value is None, |
| this function will call get_dump_dict on |
| the caller's behalf. |
| quiet If quiet is set to 1, this function will |
| NOT write status messages to stdout. |
| """ |
| |
| targ_dir_path = gm.add_trailing_slash(targ_dir_path) |
| |
| if dump_dict is None: |
| dump_dict = get_dump_dict(quiet=quiet) |
| |
| status, ret_values = grk.run_key("Open Connection for SCP", quiet=quiet) |
| |
| dump_file_list = [] |
| for dump_id, source_file_path in dump_dict.items(): |
| targ_file_path = targ_dir_path + targ_file_prefix \ |
| + os.path.basename(source_file_path) |
| status, ret_values = grk.run_key("scp.Get File " + source_file_path |
| + " " + targ_file_path, quiet=quiet) |
| dump_file_list.append(targ_file_path) |
| |
| return dump_file_list |
| |
| |
| def get_dump_hb_dict(quiet=None): |
| r""" |
| Get dump information and return as an ordered dictionary where the keys |
| are the dump IDs and the values are the full path names of the dumps. |
| |
| Example robot program call: |
| |
| ${dump_dict}= Get Dump HB Dict |
| Rprint Vars dump_hb_dict |
| |
| Example output: |
| |
| dump__hb_dict: |
| [1]: |
| /var/lib/phosphor-debug-collector/hostbootdump/1/hbdump_1_1621421112.tar.gz |
| |
| Description of argument(s): |
| quiet If quiet is set to 1, this function will |
| NOT write status messages to stdout. |
| """ |
| |
| quiet = int(gp.get_var_value(quiet, 1)) |
| cmd_buf = "dump_hb_dir_path=" + var.DUMP_HB_DIR_PATH + " ; " \ |
| + "for dump_id in $(ls ${dump_hb_dir_path} | sort -n) ; do " \ |
| + "file_path=$(ls ${dump_hb_dir_path}${dump_id}/* 2>/dev/null)" \ |
| + " || continue ; echo ${dump_id}:${file_path} ; done" |
| output, stderr, rc = bsu.bmc_execute_command(cmd_buf, quiet=quiet) |
| |
| return vf.key_value_outbuf_to_dict(output) |
| |
| |
| def valid_dump_hb(dump_id, |
| dump_dict=None, |
| quiet=None): |
| r""" |
| Verify that dump_id is a valid. If it is not valid, issue robot failure |
| message. |
| |
| A dump is valid if the indicated dump_id refers to an existing dump with a |
| valid associated dump file. |
| |
| Description of argument(s): |
| dump_id A dump ID (e.g. "1", "2", etc.) |
| dump_dict A dump dictionary such as the one returned |
| by get_dump_hb_dict. If this value is None, |
| this function will call get_dump_hb_dict on |
| the caller's behalf. |
| quiet If quiet is set to 1, this function will |
| NOT write status messages to stdout. |
| """ |
| |
| if dump_dict is None: |
| dump_dict = get_dump_hb_dict(quiet=quiet) |
| |
| if dump_id not in dump_dict: |
| message = "The specified dump ID was not found among the existing" \ |
| + " dumps:\n" |
| message += gp.sprint_var(dump_id) |
| message += gp.sprint_var(dump_dict) |
| BuiltIn().fail(gp.sprint_error(message)) |
| |
| if not dump_dict[dump_id].endswith("tar.gz"): |
| message = "There is no \"tar.gz\" file associated with the given" \ |
| + " dump_id:\n" |
| message += gp.sprint_var(dump_id) |
| dump_file_path = dump_dict[dump_id] |
| message += gp.sprint_var(dump_file_path) |
| BuiltIn().fail(gp.sprint_error(message)) |
| |
| |
| def scp_dumps_hb(targ_dir_path, |
| targ_file_prefix="", |
| dump_dict=None, |
| quiet=None): |
| r""" |
| SCP all dumps from the BMC to the indicated directory on the local system |
| and return a list of the new files. |
| |
| Description of argument(s): |
| targ_dir_path The path of the directory to receive the |
| dump files. |
| targ_file_prefix Prefix which will be pre-pended to each |
| target file's name. |
| dump_dict A dump dictionary such as the one returned |
| by get_dump_dict. If this value is None, |
| this function will call get_dump_dict on |
| the caller's behalf. |
| quiet If quiet is set to 1, this function will |
| NOT write status messages to stdout. |
| """ |
| |
| targ_dir_path = gm.add_trailing_slash(targ_dir_path) |
| |
| if dump_dict is None: |
| dump_dict = get_dump_hb_dict(quiet=quiet) |
| |
| status, ret_values = grk.run_key("Open Connection for SCP", quiet=quiet) |
| |
| dump_file_list = [] |
| for dump_id, source_file_path in dump_dict.items(): |
| targ_file_path = targ_dir_path + targ_file_prefix \ |
| + os.path.basename(source_file_path) |
| status, ret_values = grk.run_key("scp.Get File " + source_file_path |
| + " " + targ_file_path, quiet=quiet) |
| dump_file_list.append(targ_file_path) |
| |
| return dump_file_list |