New 'Build IPMI Ext Cmd' keyword

A new keyword to build the IPMI_EXT_CMD global variable for use by
keywords in ipmi_client.robot.

Also, made changes to appropriate keywords to call 'Build IPMI Ext Cmd'.

Change-Id: Ibe41c884d96cd57d6ac19f0be6ee5130632722e6
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/lib/ipmi_client.py b/lib/ipmi_client.py
new file mode 100644
index 0000000..6ed5a51
--- /dev/null
+++ b/lib/ipmi_client.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+
+r"""
+A python companion file for ipmi_client.robot.
+"""
+
+import gen_print as gp
+import gen_cmd as gc
+from robot.libraries.BuiltIn import BuiltIn
+
+
+def build_ipmi_ext_cmd(quiet=None):
+    r"""
+    Build the global IPMI_EXT_CMD variable.
+
+    If global variable IPMI_EXT_CMD already has a value, this keyword will
+    simply return without taking any action.
+
+    This keyword is designed for use by keywords which use the IPMI_EXT_CMD
+    variable (e.g. 'Run External IPMI Raw Command').  This keyword is
+    warranted because the ipmitool program may or may not accept the -U (i.e.
+    username) parameter depending on the version of code loaded on the BMC.
+    This keyword will determine whether the "-U" parameter should be used and
+    create IPMI_EXT_CMD accordingly.
+
+    Furthermore, this keyword will run the command to create the 'root' IPMI
+    username.
+
+    Description of argument(s):
+    # quiet                         Indicates whether this keyword should run
+    #                               without any output to the console.
+    """
+
+    ipmi_ext_cmd = BuiltIn().get_variable_value("${IPMI_EXT_CMD}", "")
+    if ipmi_ext_cmd != "":
+        return
+
+    quiet = int(gp.get_var_value(quiet, 0))
+    openbmc_host = BuiltIn().get_variable_value("${OPENBMC_HOST}")
+    ipmi_username = BuiltIn().get_variable_value("${IPMI_USERNAME}", "root")
+    ipmi_password = BuiltIn().get_variable_value("${IPMI_PASSWORD}",
+                                                 "0penBmc")
+    ipmi_cipher_level = BuiltIn().get_variable_value("${IPMI_CIPHER_LEVEL}",
+                                                     "3")
+
+    old_ipmi_ext_cmd = "ipmitool -I lanplus -C " + str(ipmi_cipher_level)\
+        + " -P " + ipmi_password
+    new_ipmi_ext_cmd = "ipmitool -I lanplus -C " + str(ipmi_cipher_level)\
+        + " -U " + ipmi_username + " -P " + ipmi_password
+    # Use a basic ipmitool command to help us determine whether the BMC will
+    # accept the -U parm.
+    ipmi_cmd = "power status"
+    ipmi_cmd_suffix = " -H " + openbmc_host + " " + ipmi_cmd
+    print_output = 0
+    cmd_buf = new_ipmi_ext_cmd + ipmi_cmd_suffix
+    new_rc, stdout = gc.shell_cmd(cmd_buf,
+                                  print_output=print_output,
+                                  show_err=0,
+                                  ignore_err=1)
+    gp.qprint_varx("rc", new_rc, 1)
+    if new_rc == 0:
+        ipmi_ext_cmd = new_ipmi_ext_cmd
+        BuiltIn().set_global_variable("${IPMI_EXT_CMD}", ipmi_ext_cmd)
+        return
+
+    cmd_buf = old_ipmi_ext_cmd + ipmi_cmd_suffix
+    old_rc, stdout = gc.shell_cmd(cmd_buf,
+                                  print_output=print_output,
+                                  show_err=0,
+                                  ignore_err=1)
+    gp.qprint_varx("rc", old_rc, 1)
+
+    if old_rc == 0:
+        ipmi_ext_cmd = old_ipmi_ext_cmd
+        BuiltIn().set_global_variable("${IPMI_EXT_CMD}", ipmi_ext_cmd)
+        return
+
+    message = "Unable to run ipmitool, (with or without the '-U' parm)."
+    BuiltIn().fail(message)
+
+
+build_ipmi_ext_cmd()