FIX: Allow configuration of IPMI privilege level 77/1077/2
authordave kormann <dk3239@att.com>
Thu, 27 Jun 2019 16:42:04 +0000 (12:42 -0400)
committerd k <davek@research.att.com>
Thu, 11 Jul 2019 12:43:07 +0000 (12:43 +0000)
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 <davek@research.att.com>
Change-Id: I7bdd4f64a4704765761b86cf1d207c2a7849fe46

src/hw_detector/hw_detect_cli.py [changed mode: 0644->0755]
src/hw_detector/hw_detect_lib.py [changed mode: 0644->0755]
src/hw_detector/hw_ipmi_lib.py [changed mode: 0644->0755]
src/hw_detector/hw_utils.py [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 7a4e8b1..e5fc202
@@ -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)
 
old mode 100644 (file)
new mode 100755 (executable)
index 4b46b66..268e02d
@@ -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)
old mode 100644 (file)
new mode 100755 (executable)
index e4e71bd..ec7eca3
@@ -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
old mode 100644 (file)
new mode 100755 (executable)
index 7267e4c..95e1fb0
@@ -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'