From: dave kormann Date: Thu, 27 Jun 2019 16:42:04 +0000 (-0400) Subject: FIX: Allow configuration of IPMI privilege level X-Git-Url: https://gerrit.akraino.org/r/gitweb?p=ta%2Fhw-detector.git;a=commitdiff_plain;h=a181302dc30122e649ccb19cb735239ee96f632b FIX: Allow configuration of IPMI privilege level This change updates the ipmitool invocation and its wrapper functions to pass an IPMI privilege level value (default 'ADMINISTRATOR'). Without this value, ipmitool requests will fail if the ipmi_user does not have ADMINISTRATOR privilege; this privilege is typically not required for the requests being made by this library. This change depends on https://gerrit.akraino.org/r/c/ta/config-manager/+/1076 signed-off-by: dave kormann Change-Id: I7bdd4f64a4704765761b86cf1d207c2a7849fe46 --- diff --git a/src/hw_detector/hw_detect_cli.py b/src/hw_detector/hw_detect_cli.py old mode 100644 new mode 100755 index 7a4e8b1..e5fc202 --- a/src/hw_detector/hw_detect_cli.py +++ b/src/hw_detector/hw_detect_cli.py @@ -32,8 +32,9 @@ def remote_dump(args): ip = args.ip user = args.user passw = args.passwd + priv = args.priv try: - data = hw.get_hw_data(ip, user, passw, False) + data = hw.get_hw_data(ip, user, passw, priv, False) except HWException as e: data = "Detect failed: {}".format(str(e)) dump_data(data) @@ -47,7 +48,7 @@ def main(): remote_group.add_argument('--ip', type=str, required=True, help='IP') remote_group.add_argument('--user', type=str, required=True, help='User') remote_group.add_argument('--passwd', type=str, required=True, help='Password') - + remote_group.add_argument('--priv', type=str, required=False, default='ADMINISTRATOR', help='Privilege level (default: ADMINISTRATOR)') local_group.set_defaults(func=local_dump) remote_group.set_defaults(func=remote_dump) diff --git a/src/hw_detector/hw_detect_lib.py b/src/hw_detector/hw_detect_lib.py old mode 100644 new mode 100755 index 4b46b66..268e02d --- a/src/hw_detector/hw_detect_lib.py +++ b/src/hw_detector/hw_detect_lib.py @@ -17,8 +17,8 @@ import hw_detector.hw_utils as hw_utils def get_local_hw_type(): return hw_utils.get_type() -def get_hw_type(ipmi_addr, ipmi_user, ipmi_pass, detect_virtual=True): - return hw_utils.get_type(ipmi_addr, ipmi_user, ipmi_pass, detect_virtual) +def get_hw_type(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level='ADMINISTRATOR', detect_virtual=True): + return hw_utils.get_type(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level, detect_virtual) def get_os_hd(hw_type): return hw_utils.os_hd(hw_type) @@ -32,8 +32,8 @@ def get_local_os_hd(): def get_local_osd_hd(): return get_hd_with_usage(get_local_hw_type(), 'osd') -def get_remote_os_hd(ipmi_addr, ipmi_user, ipmi_pass, detect_virtual=True): - return get_os_hd(get_hw_type(ipmi_addr, ipmi_user, ipmi_pass, detect_virtual)) +def get_remote_os_hd(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level='ADMINISTRATOR', detect_virtual=True): + return get_os_hd(get_hw_type(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level, detect_virtual)) def get_vendor(hw_type): return hw_utils.get_vendor(hw_type) @@ -41,25 +41,26 @@ def get_vendor(hw_type): def get_product_family(hw_type): return hw_utils.get_product_family(hw_type) -def _populate_data(hw_type, data_source, ipmi_addr=None, ipmi_user=None, ipmi_pass=None, detect_virtual=True): +def _populate_data(hw_type, data_source, ipmi_addr=None, ipmi_user=None, ipmi_pass=None, ipmi_priv_level='ADMINISTRATOR', detect_virtual=True): data = {} data['hw_type'] = hw_type data['os_hd'] = get_os_hd(hw_type) data['osd_hd'] = get_hd_with_usage(hw_type, 'osd') data['vendor'] = get_vendor(hw_type) data['product_family'] = get_product_family(hw_type) - data['info'] = hw_utils.get_info(ipmi_addr, ipmi_user, ipmi_pass, detect_virtual) + data['info'] = hw_utils.get_info(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level, detect_virtual) data['data_source'] = data_source if data_source == 'remote': data['ipmi_addr'] = ipmi_addr data['ipmi_user'] = ipmi_user data['ipmi_pass'] = ipmi_pass + data['ipmi_priv_level'] = ipmi_priv_level return data def get_local_hw_data(): hw_type = get_local_hw_type() return _populate_data(hw_type, 'local') -def get_hw_data(ipmi_addr, ipmi_user, ipmi_pass, detect_virtual=True): - hw_type = get_hw_type(ipmi_addr, ipmi_user, ipmi_pass, detect_virtual) - return _populate_data(hw_type, 'remote', ipmi_addr, ipmi_user, ipmi_pass, detect_virtual) +def get_hw_data(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level='ADMINISTRATOR', detect_virtual=True): + hw_type = get_hw_type(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level, detect_virtual) + return _populate_data(hw_type, 'remote', ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level, detect_virtual) diff --git a/src/hw_detector/hw_ipmi_lib.py b/src/hw_detector/hw_ipmi_lib.py old mode 100644 new mode 100755 index e4e71bd..ec7eca3 --- a/src/hw_detector/hw_ipmi_lib.py +++ b/src/hw_detector/hw_ipmi_lib.py @@ -17,11 +17,11 @@ import os from hw_detector.hw_exception import HWException -def get_ipmi_info(ipmi_addr, ipmi_user, ipmi_pass): - command = "ipmitool -I lanplus -H %s -U %s -P %s fru print 0" % (ipmi_addr, ipmi_user, ipmi_pass) +def get_ipmi_info(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level='ADMINISTRATOR'): + command = "ipmitool -I lanplus -H %s -U %s -P %s -L %s fru print 0" % (ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level) info = ipmi_info(command) - command = "ipmitool -I lanplus -H %s -U %s -P %s lan print" % (ipmi_addr, ipmi_user, ipmi_pass) + command = "ipmitool -I lanplus -H %s -U %s -P %s -L %s lan print" % (ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level) info.update(ipmi_info(command)) return info diff --git a/src/hw_detector/hw_utils.py b/src/hw_detector/hw_utils.py old mode 100644 new mode 100755 index 7267e4c..95e1fb0 --- a/src/hw_detector/hw_utils.py +++ b/src/hw_detector/hw_utils.py @@ -30,14 +30,14 @@ def get_match(info): return 'Unknown' -def get_info(ipmi_addr=None, ipmi_user=None, ipmi_pass=None, detect_virtual=True): +def get_info(ipmi_addr=None, ipmi_user=None, ipmi_pass=None, ipmi_priv_level='ADMINISTRATOR', detect_virtual=True): global info if is_virtual(detect_virtual): return {'Board Product' : 'VIRTUAL'} if info.get(ipmi_addr, False): return info[ipmi_addr] if ipmi_addr: - info[ipmi_addr] = hw_ipmi_lib.get_ipmi_info(ipmi_addr, ipmi_user, ipmi_pass) + info[ipmi_addr] = hw_ipmi_lib.get_ipmi_info(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level) else: return hw_ipmi_lib.get_local_ipmi_info() if ipmi_addr and not info.get(ipmi_addr): @@ -45,8 +45,8 @@ def get_info(ipmi_addr=None, ipmi_user=None, ipmi_pass=None, detect_virtual=True return info[ipmi_addr] -def get_type(ipmi_addr=None, ipmi_user=None, ipmi_pass=None, detect_virtual=True): - info = get_info(ipmi_addr, ipmi_user, ipmi_pass, detect_virtual) +def get_type(ipmi_addr=None, ipmi_user=None, ipmi_pass=None, ipmi_priv_level='ADMINISTRATOR', detect_virtual=True): + info = get_info(ipmi_addr, ipmi_user, ipmi_pass, ipmi_priv_level, detect_virtual) if not info: return 'Unknown'