|  | #!/usr/bin/env python3 | 
|  |  | 
|  | r""" | 
|  | A python companion file for ipmi_client.robot. | 
|  | """ | 
|  |  | 
|  | import collections | 
|  |  | 
|  | import gen_cmd as gc | 
|  | import gen_print as gp | 
|  | from robot.libraries.BuiltIn import BuiltIn | 
|  |  | 
|  | # Set default values for required IPMI options. | 
|  | ipmi_interface = "lanplus" | 
|  | ipmi_cipher_suite = BuiltIn().get_variable_value("${IPMI_CIPHER_LEVEL}", "17") | 
|  | ipmi_timeout = BuiltIn().get_variable_value("${IPMI_TIMEOUT}", "3") | 
|  | ipmi_port = BuiltIn().get_variable_value("${IPMI_PORT}", "623") | 
|  | ipmi_username = BuiltIn().get_variable_value("${IPMI_USERNAME}", "root") | 
|  | ipmi_password = BuiltIn().get_variable_value("${IPMI_PASSWORD}", "0penBmc") | 
|  | ipmi_host = BuiltIn().get_variable_value("${OPENBMC_HOST}") | 
|  |  | 
|  | # Create a list of the required IPMI options. | 
|  | ipmi_required_options = ["I", "C", "N", "p", "U", "P", "H"] | 
|  | # The following dictionary maps the ipmitool option names (e.g. "I") to our | 
|  | # more descriptive names (e.g. "interface") for the required options. | 
|  | ipmi_option_name_map = { | 
|  | "I": "interface", | 
|  | "C": "cipher_suite", | 
|  | "N": "timeout", | 
|  | "p": "port", | 
|  | "U": "username", | 
|  | "P": "password", | 
|  | "H": "host", | 
|  | } | 
|  |  | 
|  |  | 
|  | def create_ipmi_ext_command_string(command, **options): | 
|  | r""" | 
|  | Create and return an IPMI external command string which is fit to be run | 
|  | from a bash command line. | 
|  |  | 
|  | Example: | 
|  |  | 
|  | ipmi_ext_cmd = create_ipmi_ext_command_string('power status') | 
|  |  | 
|  | Result: | 
|  | ipmitool -I lanplus -C 3 -p 623 -P ******** -H x.x.x.x power status | 
|  |  | 
|  | Example: | 
|  |  | 
|  | ipmi_ext_cmd = create_ipmi_ext_command_string('power status', C='4') | 
|  |  | 
|  | Result: | 
|  | ipmitool -I lanplus -C 4 -p 623 -P ******** -H x.x.x.x power status | 
|  |  | 
|  | Description of argument(s): | 
|  | command                         The ipmitool command (e.g. 'power status'). | 
|  | options                         Any desired options that are understood by | 
|  | ipmitool (see iptmitool's help text for a | 
|  | complete list).  If the caller does NOT | 
|  | provide any of several required options | 
|  | (e.g. "P", i.e. password), this function | 
|  | will include them on the caller's behalf | 
|  | using default values. | 
|  | """ | 
|  |  | 
|  | new_options = collections.OrderedDict() | 
|  | for option in ipmi_required_options: | 
|  | # This is to prevent boot table "-N 10" vs user input timeout. | 
|  | if " -N " in command and option == "N": | 
|  | continue | 
|  | if option in options: | 
|  | # If the caller has specified this particular option, use it in | 
|  | # preference to the default value. | 
|  | new_options[option] = options[option] | 
|  | # Delete the value from the caller's options. | 
|  | del options[option] | 
|  | else: | 
|  | # The caller hasn't specified this required option so specify it | 
|  | # for them using the global value. | 
|  | var_name = "ipmi_" + ipmi_option_name_map[option] | 
|  | value = eval(var_name) | 
|  | new_options[option] = value | 
|  | # Include the remainder of the caller's options in the new options | 
|  | # dictionary. | 
|  | for key, value in options.items(): | 
|  | new_options[key] = value | 
|  |  | 
|  | return gc.create_command_string("ipmitool", command, new_options) | 
|  |  | 
|  |  | 
|  | def verify_ipmi_user_parm_accepted(): | 
|  | r""" | 
|  | Determine whether the OBMC accepts the '-U' ipmitool option and adjust | 
|  | the global ipmi_required_options accordingly. | 
|  | """ | 
|  |  | 
|  | # Assumption: "U" is in the global ipmi_required_options. | 
|  | print_output = 0 | 
|  |  | 
|  | command_string = create_ipmi_ext_command_string("power status") | 
|  | rc, stdout = gc.shell_cmd( | 
|  | command_string, print_output=print_output, show_err=0, ignore_err=1 | 
|  | ) | 
|  | gp.qprint_var(rc, 1) | 
|  | if rc == 0: | 
|  | # The OBMC accepts the ipmitool "-U" option so new further work needs | 
|  | # to be done. | 
|  | return | 
|  |  | 
|  | # Remove the "U" option from ipmi_required_options to allow us to create a | 
|  | # command string without the "U" option. | 
|  | if "U" in ipmi_required_options: | 
|  | del ipmi_required_options[ipmi_required_options.index("U")] | 
|  | command_string = create_ipmi_ext_command_string("power status") | 
|  | rc, stdout = gc.shell_cmd( | 
|  | command_string, print_output=print_output, show_err=0, ignore_err=1 | 
|  | ) | 
|  | gp.qprint_var(rc, 1) | 
|  | if rc == 0: | 
|  | # The "U" option has been removed from the ipmi_required_options | 
|  | # global variable. | 
|  | return | 
|  |  | 
|  | message = "Unable to run ipmitool (with or without the '-U' option).\n" | 
|  | gp.print_error(message) | 
|  |  | 
|  | # Revert to original ipmi_required_options by inserting 'U' right before | 
|  | # 'P'. | 
|  | ipmi_required_options.insert(ipmi_required_options.index("P"), "U") | 
|  |  | 
|  |  | 
|  | def ipmi_setup(): | 
|  | r""" | 
|  | Perform all required setup for running iptmitool commands. | 
|  | """ | 
|  |  | 
|  | verify_ipmi_user_parm_accepted() | 
|  |  | 
|  |  | 
|  | ipmi_setup() | 
|  |  | 
|  |  | 
|  | def process_ipmi_user_options(command): | 
|  | r""" | 
|  | Return the buffer with any ipmi_user_options prepended. | 
|  |  | 
|  | Description of argument(s): | 
|  | command                         An IPMI command (e.g. "power status"). | 
|  | """ | 
|  |  | 
|  | ipmi_user_options = BuiltIn().get_variable_value( | 
|  | "${IPMI_USER_OPTIONS}", "" | 
|  | ) | 
|  | if ipmi_user_options == "": | 
|  | return command | 
|  | return ipmi_user_options + " " + command |