1e7e9171eSGeorge Keishing#!/usr/bin/env python3 2369b75c1SMichael Walsh 3*20f38712SPatrick Williamsfrom gen_arg import * 4*20f38712SPatrick Williamsfrom gen_call_robot import * 5*20f38712SPatrick Williamsfrom gen_cmd import * 6*20f38712SPatrick Williamsfrom gen_misc import * 7*20f38712SPatrick Williamsfrom gen_plug_in_utils import * 8369b75c1SMichael Walshfrom gen_print import * 9369b75c1SMichael Walshfrom gen_valid import * 10369b75c1SMichael Walshfrom var_funcs import * 11369b75c1SMichael Walsh 12369b75c1SMichael Walsh# Set exit_on_error for gen_valid functions. 13369b75c1SMichael Walshset_exit_on_error(True) 14369b75c1SMichael Walshignore_err = 0 15369b75c1SMichael Walsh 16369b75c1SMichael Walsh 17369b75c1SMichael Walshparser = argparse.ArgumentParser( 18*20f38712SPatrick Williams usage="%(prog)s [OPTIONS]", 19369b75c1SMichael Walsh description="%(prog)s will calculate the value of num_err_logs and" 20369b75c1SMichael Walsh + " save it as a plug-in value for the benefit of the FFDC plug-in." 21369b75c1SMichael Walsh + " The FFDC plug-in can use that data to decide whether to collect" 22369b75c1SMichael Walsh + " FFDC data.", 23369b75c1SMichael Walsh formatter_class=argparse.ArgumentDefaultsHelpFormatter, 24*20f38712SPatrick Williams prefix_chars="-+", 25*20f38712SPatrick Williams) 26369b75c1SMichael Walsh 27369b75c1SMichael Walsh# The stock_list will be passed to gen_get_options. We populate it with the names of stock parm options we 28369b75c1SMichael Walsh# want. These stock parms are pre-defined by gen_get_options. 29*20f38712SPatrick Williamsstock_list = [ 30*20f38712SPatrick Williams ("test_mode", 0), 31369b75c1SMichael Walsh ("quiet", get_plug_default("quiet", 0)), 32*20f38712SPatrick Williams ("debug", get_plug_default("debug", 0)), 33*20f38712SPatrick Williams] 34369b75c1SMichael Walsh 35369b75c1SMichael Walsh 36*20f38712SPatrick Williamsdef exit_function(signal_number=0, frame=None): 37369b75c1SMichael Walsh r""" 38369b75c1SMichael Walsh Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT). 39369b75c1SMichael Walsh 40369b75c1SMichael Walsh This function will be called by gen_exit_function(). 41369b75c1SMichael Walsh """ 42369b75c1SMichael Walsh 43369b75c1SMichael Walsh process_robot_output_files() 44369b75c1SMichael Walsh 45369b75c1SMichael Walsh 46369b75c1SMichael Walshdef validate_parms(): 47369b75c1SMichael Walsh r""" 48369b75c1SMichael Walsh Validate program parameters, etc. 49369b75c1SMichael Walsh 50369b75c1SMichael Walsh This function will be called by gen_setup(). 51369b75c1SMichael Walsh """ 52369b75c1SMichael Walsh 53369b75c1SMichael Walsh get_plug_vars() 54369b75c1SMichael Walsh 55369b75c1SMichael Walsh global AUTOSCRIPT_STATUS_FILE_PATH 56369b75c1SMichael Walsh # AUTOSCRIPT_STATUS_FILE_PATH is set when we're called by autoscript. For this program to work 57369b75c1SMichael Walsh # correctly, it must be called with autoscript. 58*20f38712SPatrick Williams AUTOSCRIPT_STATUS_FILE_PATH = os.environ.get( 59*20f38712SPatrick Williams "AUTOSCRIPT_STATUS_FILE_PATH", "" 60*20f38712SPatrick Williams ) 61369b75c1SMichael Walsh valid_value(AUTOSCRIPT_STATUS_FILE_PATH) 62369b75c1SMichael Walsh valid_value(AUTOBOOT_OPENBMC_HOST) 63369b75c1SMichael Walsh 64369b75c1SMichael Walsh 65369b75c1SMichael Walshdef main(): 66369b75c1SMichael Walsh gen_setup() 67369b75c1SMichael Walsh 68369b75c1SMichael Walsh print_plug_in_header() 69369b75c1SMichael Walsh 70369b75c1SMichael Walsh # Get the number of error logs from the BMC. 71369b75c1SMichael Walsh init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".") 72*20f38712SPatrick Williams high_sev_elogs_file_path = ( 73*20f38712SPatrick Williams AUTOBOOT_FFDC_DIR_PATH 74*20f38712SPatrick Williams + AUTOBOOT_FFDC_PREFIX 75*20f38712SPatrick Williams + "high_severity_errorlog.json" 76*20f38712SPatrick Williams ) 77369b75c1SMichael Walsh lib_file_path = init_robot_file_path("lib/logging_utils.robot") 78369b75c1SMichael Walsh lib_file_path += ":" + init_robot_file_path("lib/gen_robot_print.py") 79369b75c1SMichael Walsh set_mod_global(lib_file_path) 80369b75c1SMichael Walsh 81*20f38712SPatrick Williams REDFISH_SUPPORT_TRANS_STATE = int( 82*20f38712SPatrick Williams os.environ.get("REDFISH_SUPPORT_TRANS_STATE", 0) 83*20f38712SPatrick Williams ) 842720764fSDavid Shaw if not REDFISH_SUPPORT_TRANS_STATE: 852720764fSDavid Shaw try: 862720764fSDavid Shaw from robot.libraries.BuiltIn import BuiltIn 87*20f38712SPatrick Williams 88*20f38712SPatrick Williams REDFISH_SUPPORT_TRANS_STATE = int( 89*20f38712SPatrick Williams BuiltIn().get_variable_value( 90*20f38712SPatrick Williams "${REDFISH_SUPPORT_TRANS_STATE}", default=0 91*20f38712SPatrick Williams ) 92*20f38712SPatrick Williams ) 93a57fef4aSPatrick Williams except Exception: 942720764fSDavid Shaw pass 952720764fSDavid Shaw 96*20f38712SPatrick Williams keyword_redfish_strings = [ 97*20f38712SPatrick Williams ( 98*20f38712SPatrick Williams "${error_logs}= Get Redfish Event Logs " 99*20f38712SPatrick Williams " &{filter_low_severity_errlogs}" 100*20f38712SPatrick Williams ), 1012720764fSDavid Shaw "${num_error_logs}= Get Length ${error_logs}", 1022720764fSDavid Shaw "Rprint Vars num_error_logs", 103*20f38712SPatrick Williams ( 104*20f38712SPatrick Williams "${json_string}= Evaluate json.dumps($error_logs, indent=4) " 105*20f38712SPatrick Williams " modules=json" 106*20f38712SPatrick Williams ), 107*20f38712SPatrick Williams "Append To File " + high_sev_elogs_file_path + " ${json_string}", 1082720764fSDavid Shaw ] 1092720764fSDavid Shaw 110*20f38712SPatrick Williams keyword_strings = [ 111d4fbcf9bSmichael "${error_logs}= Get Error Logs &{filter_low_severity_errlogs}", 112d4fbcf9bSmichael "${num_error_logs}= Get Length ${error_logs}", 113d4fbcf9bSmichael "Rprint Vars num_error_logs", 114*20f38712SPatrick Williams ( 115*20f38712SPatrick Williams "${json_string}= Evaluate json.dumps($error_logs, indent=4) " 116*20f38712SPatrick Williams " modules=json" 117*20f38712SPatrick Williams ), 118*20f38712SPatrick Williams "Append To File " + high_sev_elogs_file_path + " ${json_string}", 119d4fbcf9bSmichael ] 120369b75c1SMichael Walsh 1212720764fSDavid Shaw if REDFISH_SUPPORT_TRANS_STATE: 122*20f38712SPatrick Williams keyword_string = " ; ".join(keyword_redfish_strings) 1232720764fSDavid Shaw else: 124*20f38712SPatrick Williams keyword_string = " ; ".join(keyword_strings) 1252720764fSDavid Shaw 126d4fbcf9bSmichael set_mod_global(keyword_string) 127*20f38712SPatrick Williams cmd_buf = create_robot_cmd_string( 128*20f38712SPatrick Williams "extended/run_keyword.robot", 129*20f38712SPatrick Williams OPENBMC_HOST, 130*20f38712SPatrick Williams SSH_PORT, 131*20f38712SPatrick Williams HTTPS_PORT, 132*20f38712SPatrick Williams OPENBMC_USERNAME, 133*20f38712SPatrick Williams OPENBMC_PASSWORD, 134*20f38712SPatrick Williams keyword_string, 135*20f38712SPatrick Williams lib_file_path, 136*20f38712SPatrick Williams quiet, 137*20f38712SPatrick Williams test_mode, 138*20f38712SPatrick Williams debug, 139*20f38712SPatrick Williams outputdir, 140*20f38712SPatrick Williams output, 141*20f38712SPatrick Williams log, 142*20f38712SPatrick Williams report, 143*20f38712SPatrick Williams ) 144369b75c1SMichael Walsh if not robot_cmd_fnc(cmd_buf): 145369b75c1SMichael Walsh exit(1) 146369b75c1SMichael Walsh # The output contains the num_error_logs value which we will isolate with egrep. 147*20f38712SPatrick Williams rc, out_buf = shell_cmd( 148*20f38712SPatrick Williams "egrep '^num_error_logs:[ ]' " + AUTOSCRIPT_STATUS_FILE_PATH, 149*20f38712SPatrick Williams quiet=1, 150*20f38712SPatrick Williams print_output=0, 151*20f38712SPatrick Williams ) 152369b75c1SMichael Walsh result = key_value_outbuf_to_dict(out_buf) 153*20f38712SPatrick Williams num_error_logs = int(result["num_error_logs"]) 154369b75c1SMichael Walsh save_plug_in_value(num_error_logs) 155d4fbcf9bSmichael if num_error_logs > 0: 156*20f38712SPatrick Williams qprint_timen( 157*20f38712SPatrick Williams "Adding the name of our high severity error logs FFDC file " 158*20f38712SPatrick Williams + "to the appropriate file list." 159*20f38712SPatrick Williams ) 160*20f38712SPatrick Williams shell_cmd( 161*20f38712SPatrick Williams "echo " 162*20f38712SPatrick Williams + high_sev_elogs_file_path 163*20f38712SPatrick Williams + " > " 164*20f38712SPatrick Williams + AUTOBOOT_FFDC_LIST_FILE_PATH 165*20f38712SPatrick Williams ) 166d4fbcf9bSmichael else: 167d4fbcf9bSmichael os.remove(high_sev_elogs_file_path) 168369b75c1SMichael Walsh 169369b75c1SMichael Walsh 170369b75c1SMichael Walshmain() 171