1#!/usr/bin/env python3 2 3from gen_arg import * 4from gen_call_robot import * 5from gen_cmd import * 6from gen_misc import * 7from gen_plug_in_utils import * 8from gen_print import * 9from gen_valid import * 10from var_funcs import * 11 12# Set exit_on_error for gen_valid functions. 13set_exit_on_error(True) 14ignore_err = 0 15 16 17parser = argparse.ArgumentParser( 18 usage="%(prog)s [OPTIONS]", 19 description="%(prog)s will calculate the value of num_err_logs and" 20 + " save it as a plug-in value for the benefit of the FFDC plug-in." 21 + " The FFDC plug-in can use that data to decide whether to collect" 22 + " FFDC data.", 23 formatter_class=argparse.ArgumentDefaultsHelpFormatter, 24 prefix_chars="-+", 25) 26 27# The stock_list will be passed to gen_get_options. We populate it with the names of stock parm options we 28# want. These stock parms are pre-defined by gen_get_options. 29stock_list = [ 30 ("test_mode", 0), 31 ("quiet", get_plug_default("quiet", 0)), 32 ("debug", get_plug_default("debug", 0)), 33] 34 35 36def exit_function(signal_number=0, frame=None): 37 r""" 38 Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT). 39 40 This function will be called by gen_exit_function(). 41 """ 42 43 process_robot_output_files() 44 45 46def validate_parms(): 47 r""" 48 Validate program parameters, etc. 49 50 This function will be called by gen_setup(). 51 """ 52 53 get_plug_vars() 54 55 global AUTOSCRIPT_STATUS_FILE_PATH 56 # AUTOSCRIPT_STATUS_FILE_PATH is set when we're called by autoscript. For this program to work 57 # correctly, it must be called with autoscript. 58 AUTOSCRIPT_STATUS_FILE_PATH = os.environ.get( 59 "AUTOSCRIPT_STATUS_FILE_PATH", "" 60 ) 61 valid_value(AUTOSCRIPT_STATUS_FILE_PATH) 62 valid_value(AUTOBOOT_OPENBMC_HOST) 63 64 65def main(): 66 gen_setup() 67 68 print_plug_in_header() 69 70 # Get the number of error logs from the BMC. 71 init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".") 72 high_sev_elogs_file_path = ( 73 AUTOBOOT_FFDC_DIR_PATH 74 + AUTOBOOT_FFDC_PREFIX 75 + "high_severity_errorlog.json" 76 ) 77 lib_file_path = init_robot_file_path("lib/logging_utils.robot") 78 lib_file_path += ":" + init_robot_file_path("lib/gen_robot_print.py") 79 set_mod_global(lib_file_path) 80 81 REDFISH_SUPPORT_TRANS_STATE = int( 82 os.environ.get("REDFISH_SUPPORT_TRANS_STATE", 0) 83 ) 84 if not REDFISH_SUPPORT_TRANS_STATE: 85 try: 86 from robot.libraries.BuiltIn import BuiltIn 87 88 REDFISH_SUPPORT_TRANS_STATE = int( 89 BuiltIn().get_variable_value( 90 "${REDFISH_SUPPORT_TRANS_STATE}", default=0 91 ) 92 ) 93 except Exception: 94 pass 95 96 keyword_redfish_strings = [ 97 ( 98 "${error_logs}= Get Redfish Event Logs " 99 " &{filter_low_severity_errlogs}" 100 ), 101 "${num_error_logs}= Get Length ${error_logs}", 102 "Rprint Vars num_error_logs", 103 ( 104 "${json_string}= Evaluate json.dumps($error_logs, indent=4) " 105 " modules=json" 106 ), 107 "Append To File " + high_sev_elogs_file_path + " ${json_string}", 108 ] 109 110 keyword_strings = [ 111 "${error_logs}= Get Error Logs &{filter_low_severity_errlogs}", 112 "${num_error_logs}= Get Length ${error_logs}", 113 "Rprint Vars num_error_logs", 114 ( 115 "${json_string}= Evaluate json.dumps($error_logs, indent=4) " 116 " modules=json" 117 ), 118 "Append To File " + high_sev_elogs_file_path + " ${json_string}", 119 ] 120 121 if REDFISH_SUPPORT_TRANS_STATE: 122 keyword_string = " ; ".join(keyword_redfish_strings) 123 else: 124 keyword_string = " ; ".join(keyword_strings) 125 126 set_mod_global(keyword_string) 127 cmd_buf = create_robot_cmd_string( 128 "extended/run_keyword.robot", 129 OPENBMC_HOST, 130 SSH_PORT, 131 HTTPS_PORT, 132 REST_USERNAME, 133 REST_PASSWORD, 134 OPENBMC_USERNAME, 135 OPENBMC_PASSWORD, 136 keyword_string, 137 lib_file_path, 138 quiet, 139 test_mode, 140 debug, 141 outputdir, 142 output, 143 log, 144 report, 145 ) 146 if not robot_cmd_fnc(cmd_buf): 147 exit(1) 148 # The output contains the num_error_logs value which we will isolate with egrep. 149 rc, out_buf = shell_cmd( 150 "egrep '^num_error_logs:[ ]' " + AUTOSCRIPT_STATUS_FILE_PATH, 151 quiet=1, 152 print_output=0, 153 ) 154 result = key_value_outbuf_to_dict(out_buf) 155 num_error_logs = int(result["num_error_logs"]) 156 save_plug_in_value(num_error_logs) 157 if num_error_logs > 0: 158 qprint_timen( 159 "Adding the name of our high severity error logs FFDC file " 160 + "to the appropriate file list." 161 ) 162 shell_cmd( 163 "echo " 164 + high_sev_elogs_file_path 165 + " > " 166 + AUTOBOOT_FFDC_LIST_FILE_PATH 167 ) 168 else: 169 os.remove(high_sev_elogs_file_path) 170 171 172main() 173