blob: ec67dc90880e9531fa401aa022cb0c0c75cddc07 [file] [log] [blame]
George Keishinge7e91712021-09-03 11:28:44 -05001#!/usr/bin/env python3
Michael Walshe11a1362017-10-19 15:35:26 -05002
3r"""
4This file contains functions which are useful for processing BMC dumps.
5"""
6
Brian Ma139f1da2024-10-18 13:34:14 +08007import importlib.util
Michael Walsh4f3ce172017-10-19 17:28:49 -05008import os
Michael Walshe11a1362017-10-19 15:35:26 -05009import sys
Patrick Williams20f38712022-12-08 06:18:26 -060010
11import bmc_ssh_utils as bsu
12import gen_misc as gm
13import gen_print as gp
14import gen_robot_keyword as grk
Patrick Williams20f38712022-12-08 06:18:26 -060015from robot.libraries.BuiltIn import BuiltIn
16
17base_path = (
Brian Ma139f1da2024-10-18 13:34:14 +080018 os.path.dirname(
19 os.path.dirname(importlib.util.find_spec("gen_robot_print").origin)
20 )
Patrick Williams20f38712022-12-08 06:18:26 -060021 + os.sep
22)
Michael Walshe11a1362017-10-19 15:35:26 -050023sys.path.append(base_path + "data/")
Patrick Williams20f38712022-12-08 06:18:26 -060024import variables as var # NOQA
Michael Walshe11a1362017-10-19 15:35:26 -050025
26
27def get_dump_dict(quiet=None):
Michael Walshe11a1362017-10-19 15:35:26 -050028 r"""
29 Get dump information and return as an ordered dictionary where the keys
30 are the dump IDs and the values are the full path names of the dumps.
31
32 Example robot program call:
33
34 ${dump_dict}= Get Dump Dict
Michael Walsh39c00512019-07-17 10:54:06 -050035 Rprint Vars dump_dict
Michael Walshe11a1362017-10-19 15:35:26 -050036
37 Example output:
38
39 dump_dict:
Joy Onyerikwu004ad3c2018-06-11 16:29:56 -050040 [1]:
41 /var/lib/phosphor-debug-collector/dumps/1/obmcdump_1_1508255216.tar.xz
42 [2]:
43 /var/lib/phosphor-debug-collector/dumps/2/obmcdump_2_1508255245.tar.xz
44 [3]:
45 /var/lib/phosphor-debug-collector/dumps/3/obmcdump_3_1508255267.tar.xz
46 [4]:
47 /var/lib/phosphor-debug-collector/dumps/4/obmcdump_4_1508255283.tar.xz
Michael Walshe11a1362017-10-19 15:35:26 -050048
49 Description of argument(s):
50 quiet If quiet is set to 1, this function will
51 NOT write status messages to stdout.
52 """
53
54 quiet = int(gp.get_var_value(quiet, 1))
George Keishingbd8ec922022-03-31 13:39:35 -050055 cmd_buf = "find /var/lib/phosphor-debug-collector/ -maxdepth 4 -type f"
Michael Walshe11a1362017-10-19 15:35:26 -050056 output, stderr, rc = bsu.bmc_execute_command(cmd_buf, quiet=quiet)
57
George Keishingbd8ec922022-03-31 13:39:35 -050058 BuiltIn().log_to_console(output)
59 return output.split("\n")
Michael Walshe11a1362017-10-19 15:35:26 -050060
61
Patrick Williams20f38712022-12-08 06:18:26 -060062def valid_dump(dump_id, dump_dict=None, quiet=None):
Michael Walshe11a1362017-10-19 15:35:26 -050063 r"""
64 Verify that dump_id is a valid. If it is not valid, issue robot failure
65 message.
66
67 A dump is valid if the indicated dump_id refers to an existing dump with a
68 valid associated dump file.
69
70 Description of argument(s):
71 dump_id A dump ID (e.g. "1", "2", etc.)
72 dump_dict A dump dictionary such as the one returned
73 by get_dump_dict. If this value is None,
74 this function will call get_dump_dict on
75 the caller's behalf.
76 quiet If quiet is set to 1, this function will
77 NOT write status messages to stdout.
78 """
79
80 if dump_dict is None:
81 dump_dict = get_dump_dict(quiet=quiet)
82
83 if dump_id not in dump_dict:
Patrick Williams20f38712022-12-08 06:18:26 -060084 message = (
85 "The specified dump ID was not found among the existing"
Michael Walshe11a1362017-10-19 15:35:26 -050086 + " dumps:\n"
Patrick Williams20f38712022-12-08 06:18:26 -060087 )
Michael Walshe11a1362017-10-19 15:35:26 -050088 message += gp.sprint_var(dump_id)
89 message += gp.sprint_var(dump_dict)
90 BuiltIn().fail(gp.sprint_error(message))
91
92 if not dump_dict[dump_id].endswith("tar.xz"):
Patrick Williams20f38712022-12-08 06:18:26 -060093 message = (
94 'There is no "tar.xz" file associated with the given'
Michael Walshe11a1362017-10-19 15:35:26 -050095 + " dump_id:\n"
Patrick Williams20f38712022-12-08 06:18:26 -060096 )
Michael Walshe11a1362017-10-19 15:35:26 -050097 message += gp.sprint_var(dump_id)
98 dump_file_path = dump_dict[dump_id]
99 message += gp.sprint_var(dump_file_path)
100 BuiltIn().fail(gp.sprint_error(message))
Michael Walsh4f3ce172017-10-19 17:28:49 -0500101
102
Patrick Williams20f38712022-12-08 06:18:26 -0600103def scp_dumps(targ_dir_path, targ_file_prefix="", dump_dict=None, quiet=None):
Michael Walsh4f3ce172017-10-19 17:28:49 -0500104 r"""
105 SCP all dumps from the BMC to the indicated directory on the local system
106 and return a list of the new files.
107
108 Description of argument(s):
109 targ_dir_path The path of the directory to receive the
110 dump files.
George Keishinge16f1582022-12-15 07:32:21 -0600111 targ_file_prefix Prefix which will be prepended to each
Michael Walsh4f3ce172017-10-19 17:28:49 -0500112 target file's name.
113 dump_dict A dump dictionary such as the one returned
114 by get_dump_dict. If this value is None,
115 this function will call get_dump_dict on
116 the caller's behalf.
117 quiet If quiet is set to 1, this function will
118 NOT write status messages to stdout.
119 """
120
121 targ_dir_path = gm.add_trailing_slash(targ_dir_path)
122
123 if dump_dict is None:
George Keishingbd8ec922022-03-31 13:39:35 -0500124 dump_list = get_dump_dict(quiet=quiet)
Michael Walsh4f3ce172017-10-19 17:28:49 -0500125
126 status, ret_values = grk.run_key("Open Connection for SCP", quiet=quiet)
127
128 dump_file_list = []
George Keishingbd8ec922022-03-31 13:39:35 -0500129 for file_path in dump_list:
Patrick Williams20f38712022-12-08 06:18:26 -0600130 targ_file_path = (
131 targ_dir_path + targ_file_prefix + os.path.basename(file_path)
132 )
133 status, ret_values = grk.run_key(
134 "scp.Get File " + file_path + " " + targ_file_path, quiet=quiet
135 )
George Keishing1165a022021-05-19 06:23:13 -0500136 dump_file_list.append(targ_file_path)
137
138 return dump_file_list