1#!/usr/bin/env python3 2 3r""" 4This file contains functions which are useful for processing BMC dumps. 5""" 6 7import imp 8import os 9import sys 10 11import bmc_ssh_utils as bsu 12import gen_misc as gm 13import gen_print as gp 14import gen_robot_keyword as grk 15import var_funcs as vf 16from robot.libraries.BuiltIn import BuiltIn 17 18base_path = ( 19 os.path.dirname(os.path.dirname(imp.find_module("gen_robot_print")[1])) 20 + os.sep 21) 22sys.path.append(base_path + "data/") 23import variables as var # NOQA 24 25 26def get_dump_dict(quiet=None): 27 r""" 28 Get dump information and return as an ordered dictionary where the keys 29 are the dump IDs and the values are the full path names of the dumps. 30 31 Example robot program call: 32 33 ${dump_dict}= Get Dump Dict 34 Rprint Vars dump_dict 35 36 Example output: 37 38 dump_dict: 39 [1]: 40 /var/lib/phosphor-debug-collector/dumps/1/obmcdump_1_1508255216.tar.xz 41 [2]: 42 /var/lib/phosphor-debug-collector/dumps/2/obmcdump_2_1508255245.tar.xz 43 [3]: 44 /var/lib/phosphor-debug-collector/dumps/3/obmcdump_3_1508255267.tar.xz 45 [4]: 46 /var/lib/phosphor-debug-collector/dumps/4/obmcdump_4_1508255283.tar.xz 47 48 Description of argument(s): 49 quiet If quiet is set to 1, this function will 50 NOT write status messages to stdout. 51 """ 52 53 quiet = int(gp.get_var_value(quiet, 1)) 54 cmd_buf = "find /var/lib/phosphor-debug-collector/ -maxdepth 4 -type f" 55 output, stderr, rc = bsu.bmc_execute_command(cmd_buf, quiet=quiet) 56 57 BuiltIn().log_to_console(output) 58 return output.split("\n") 59 60 61def valid_dump(dump_id, dump_dict=None, quiet=None): 62 r""" 63 Verify that dump_id is a valid. If it is not valid, issue robot failure 64 message. 65 66 A dump is valid if the indicated dump_id refers to an existing dump with a 67 valid associated dump file. 68 69 Description of argument(s): 70 dump_id A dump ID (e.g. "1", "2", etc.) 71 dump_dict A dump dictionary such as the one returned 72 by get_dump_dict. If this value is None, 73 this function will call get_dump_dict on 74 the caller's behalf. 75 quiet If quiet is set to 1, this function will 76 NOT write status messages to stdout. 77 """ 78 79 if dump_dict is None: 80 dump_dict = get_dump_dict(quiet=quiet) 81 82 if dump_id not in dump_dict: 83 message = ( 84 "The specified dump ID was not found among the existing" 85 + " dumps:\n" 86 ) 87 message += gp.sprint_var(dump_id) 88 message += gp.sprint_var(dump_dict) 89 BuiltIn().fail(gp.sprint_error(message)) 90 91 if not dump_dict[dump_id].endswith("tar.xz"): 92 message = ( 93 'There is no "tar.xz" file associated with the given' 94 + " dump_id:\n" 95 ) 96 message += gp.sprint_var(dump_id) 97 dump_file_path = dump_dict[dump_id] 98 message += gp.sprint_var(dump_file_path) 99 BuiltIn().fail(gp.sprint_error(message)) 100 101 102def scp_dumps(targ_dir_path, targ_file_prefix="", dump_dict=None, quiet=None): 103 r""" 104 SCP all dumps from the BMC to the indicated directory on the local system 105 and return a list of the new files. 106 107 Description of argument(s): 108 targ_dir_path The path of the directory to receive the 109 dump files. 110 targ_file_prefix Prefix which will be pre-pended to each 111 target file's name. 112 dump_dict A dump dictionary such as the one returned 113 by get_dump_dict. If this value is None, 114 this function will call get_dump_dict on 115 the caller's behalf. 116 quiet If quiet is set to 1, this function will 117 NOT write status messages to stdout. 118 """ 119 120 targ_dir_path = gm.add_trailing_slash(targ_dir_path) 121 122 if dump_dict is None: 123 dump_list = get_dump_dict(quiet=quiet) 124 125 status, ret_values = grk.run_key("Open Connection for SCP", quiet=quiet) 126 127 dump_file_list = [] 128 for file_path in dump_list: 129 targ_file_path = ( 130 targ_dir_path + targ_file_prefix + os.path.basename(file_path) 131 ) 132 status, ret_values = grk.run_key( 133 "scp.Get File " + file_path + " " + targ_file_path, quiet=quiet 134 ) 135 dump_file_list.append(targ_file_path) 136 137 return dump_file_list 138