def hardware_inventory_map(ipmicmd, certverify): hwmap = get_cached_data(ipmicmd, 'lenovo_cached_hwmap') if hwmap: return hwmap hwmap = {} wc = None adapterdata = get_cached_data(ipmicmd, 'lenovo_cached_adapters') if not adapterdata: wc = get_web_session(ipmicmd, certverify, wc) if wc: adapterdata = wc.grab_json_response( '/designs/imm/dataproviders/imm_adapters.php') if adapterdata: ipmicmd.ipmi_session.lenovo_cached_adapters = ( adapterdata, _monotonic_time()) if adapterdata and 'items' in adapterdata: for adata in adapterdata['items']: skipadapter = False if not adata['adapter.oobSupported']: continue aslot = None aname = adata['adapter.adapterName'] clabel = adata['adapter.connectorLabel'] if clabel == 'Unknown': continue if clabel != 'Onboard': aslot = adata['adapter.slotNo'] if clabel == 'ML2': clabel = 'ML2 (Slot {0})'.format(aslot) else: clabel = 'Slot {0}'.format(aslot) bdata = {'location': clabel} for fundata in adata['adapter.functions']: bdata['pcislot'] = '{0:02x}:{1:02x}'.format( fundata['generic.busNo'], fundata['generic.devNo']) serialdata = fundata.get('vpd.serialNo', None) if (serialdata and serialdata != 'N/A' and '---' not in serialdata): bdata['serial'] = serialdata partnum = fundata.get('vpd.partNo', None) if partnum and partnum != 'N/A': bdata['partnumber'] = partnum if 'network.pPorts' in fundata: for portinfo in fundata['network.pPorts']: for lp in portinfo['logicalPorts']: ma = lp['networkAddr'] ma = ':'.join([ ma[i:i + 2] for i in range(0, len(ma), 2) ]).lower() bdata['MAC Address {0}'.format( portinfo['portIndex'])] = ma elif clabel == 'Onboard': # skip the various onboard non-nic skipadapter = True if not skipadapter: hwmap[aname] = bdata ipmicmd.ipmi_session.lenovo_cached_hwmap = (hwmap, _monotonic_time()) if wc: wc.grab_json_response('/data/logout') return hwmap
def hardware_inventory_map(ipmicmd, certverify): hwmap = get_cached_data(ipmicmd, 'lenovo_cached_hwmap') if hwmap: return hwmap hwmap = {} wc = None adapterdata = get_cached_data(ipmicmd, 'lenovo_cached_adapters') if not adapterdata: wc = get_web_session(ipmicmd, certverify, wc) if wc: adapterdata = wc.grab_json_response( '/designs/imm/dataproviders/imm_adapters.php') if adapterdata: ipmicmd.ipmi_session.lenovo_cached_adapters = ( adapterdata, _monotonic_time()) if adapterdata and 'items' in adapterdata: for adata in adapterdata['items']: skipadapter = False if not adata['adapter.oobSupported']: continue aslot = None aname = adata['adapter.adapterName'] clabel = adata['adapter.connectorLabel'] if clabel == 'Unknown': continue if clabel != 'Onboard': aslot = adata['adapter.slotNo'] if clabel == 'ML2': clabel = 'ML2 (Slot {0})'.format(aslot) else: clabel = 'Slot {0}'.format(aslot) bdata = {'location': clabel} for fundata in adata['adapter.functions']: bdata['pcislot'] = '{0:02x}:{1:02x}'.format( fundata['generic.busNo'], fundata['generic.devNo']) serialdata = fundata.get('vpd.serialNo', None) if (serialdata and serialdata != 'N/A' and '---' not in serialdata): bdata['serial'] = serialdata partnum = fundata.get('vpd.partNo', None) if partnum and partnum != 'N/A': bdata['partnumber'] = partnum if 'network.pPorts' in fundata: for portinfo in fundata['network.pPorts']: for lp in portinfo['logicalPorts']: ma = lp['networkAddr'] ma = ':'.join( [ma[i:i+2] for i in xrange( 0, len(ma), 2)]).lower() bdata['MAC Address {0}'.format( portinfo['portIndex'])] = ma elif clabel == 'Onboard': # skip the various onboard non-nic skipadapter = True if not skipadapter: hwmap[aname] = bdata ipmicmd.ipmi_session.lenovo_cached_hwmap = (hwmap, _monotonic_time()) return hwmap
def get_cached_data(ipmicmd, attribute): try: kv = getattr(ipmicmd.ipmi_session, attribute) if kv[1] > _monotonic_time() - 30: return kv[0] except AttributeError: return None
def get_cached_data(ipmicmd, attribute): try: kv = getattr(ipmicmd.ipmi_session, attribute) if kv[1] > _monotonic_time() - 30: return kv[0] except AttributeError: return None
def get_cached_data(self, attribute): try: kv = self.datacache[attribute] if kv[1] > _monotonic_time() - 30: return kv[0] except KeyError: return None
def fetch_agentless_firmware(ipmicmd, certverify): wc = None adapterdata = get_cached_data(ipmicmd, 'lenovo_cached_adapters') if not adapterdata: wc = get_web_session(ipmicmd, certverify, wc) if wc: adapterdata = wc.grab_json_response( '/designs/imm/dataproviders/imm_adapters.php') if adapterdata: ipmicmd.ipmi_session.lenovo_cached_adapters = ( adapterdata, _monotonic_time()) if adapterdata and 'items' in adapterdata: for adata in adapterdata['items']: aname = adata['adapter.adapterName'] donenames = set([]) for fundata in adata['adapter.functions']: fdata = fundata.get('firmwares', ()) for firm in fdata: fname = firm['firmwareName'].rstrip() if '.' in fname: fname = firm['description'].rstrip() if fname in donenames: # ignore redundant entry continue donenames.add(fname) bdata = {} if 'versionStr' in firm and firm['versionStr']: bdata['version'] = firm['versionStr'] if ('releaseDate' in firm and firm['releaseDate'] and firm['releaseDate'] != 'N/A'): try: bdata['date'] = datetime.strptime( firm['releaseDate'], '%m/%d/%Y') except ValueError: try: bdata['date'] = datetime.strptime( firm['releaseDate'], '%m %d %Y') except ValueError: pass yield ('{0} {1}'.format(aname, fname), bdata) storagedata = get_cached_data(ipmicmd, 'lenovo_cached_storage') if not storagedata: wc = get_web_session(ipmicmd, certverify, wc) if wc: storagedata = wc.grab_json_response( '/designs/imm/dataproviders/raid_alldevices.php') if storagedata: ipmicmd.ipmi_session.lenovo_cached_storage = ( storagedata, _monotonic_time()) if storagedata and 'items' in storagedata: for adp in storagedata['items']: if 'storage.vpd.productName' not in adp: continue adpname = adp['storage.vpd.productName'] if 'children' not in adp: adp['children'] = () for diskent in adp['children']: bdata = {} diskname = '{0} Disk {1}'.format( adpname, diskent['storage.slotNo']) bdata['model'] = diskent['storage.vpd.productName'].rstrip() bdata['version'] = diskent['storage.firmwares'][0][ 'versionStr'] yield (diskname, bdata) if wc: wc.request('GET', '/data/logout')
def fetch_agentless_firmware(ipmicmd, certverify): wc = None adapterdata = get_cached_data(ipmicmd, 'lenovo_cached_adapters') if not adapterdata: wc = get_web_session(ipmicmd, certverify, wc) if wc: adapterdata = wc.grab_json_response( '/designs/imm/dataproviders/imm_adapters.php') if adapterdata: ipmicmd.ipmi_session.lenovo_cached_adapters = ( adapterdata, _monotonic_time()) if adapterdata and 'items' in adapterdata: for adata in adapterdata['items']: aname = adata['adapter.adapterName'] donenames = set([]) for fundata in adata['adapter.functions']: fdata = fundata.get('firmwares', ()) for firm in fdata: fname = firm['firmwareName'].rstrip() if '.' in fname: fname = firm['description'].rstrip() if fname in donenames: # ignore redundant entry continue donenames.add(fname) bdata = {} if 'versionStr' in firm and firm['versionStr']: bdata['version'] = firm['versionStr'] if ('releaseDate' in firm and firm['releaseDate'] and firm['releaseDate'] != 'N/A'): try: bdata['date'] = datetime.strptime( firm['releaseDate'], '%m/%d/%Y') except ValueError: try: bdata['date'] = datetime.strptime( firm['releaseDate'], '%m %d %Y') except ValueError: pass yield ('{0} {1}'.format(aname, fname), bdata) storagedata = get_cached_data(ipmicmd, 'lenovo_cached_storage') if not storagedata: wc = get_web_session(ipmicmd, certverify, wc) if wc: storagedata = wc.grab_json_response( '/designs/imm/dataproviders/raid_alldevices.php') if storagedata: ipmicmd.ipmi_session.lenovo_cached_storage = ( storagedata, _monotonic_time()) if storagedata and 'items' in storagedata: for adp in storagedata['items']: if 'storage.vpd.productName' not in adp: continue adpname = adp['storage.vpd.productName'] if 'children' not in adp: adp['children'] = () for diskent in adp['children']: bdata = {} diskname = '{0} Disk {1}'.format(adpname, diskent['storage.slotNo']) bdata['model'] = diskent['storage.vpd.productName'].rstrip() bdata['version'] = diskent['storage.firmwares'][0][ 'versionStr'] yield (diskname, bdata) if wc: wc.request('GET', '/data/logout')
def fetch_agentless_firmware(self): adapterdata = self.get_cached_data('lenovo_cached_adapters') if not adapterdata: if self.wc: adapterdata = self.wc.grab_json_response( '/designs/imm/dataproviders/imm_adapters.php') if adapterdata: self.datacache['lenovo_cached_adapters'] = ( adapterdata, _monotonic_time()) if adapterdata and 'items' in adapterdata: for adata in adapterdata['items']: aname = adata['adapter.adapterName'] donenames = set([]) for fundata in adata['adapter.functions']: fdata = fundata.get('firmwares', ()) for firm in fdata: fname = firm['firmwareName'].rstrip() if '.' in fname: fname = firm['description'].rstrip() if fname in donenames: # ignore redundant entry continue donenames.add(fname) bdata = {} if 'versionStr' in firm and firm['versionStr']: bdata['version'] = firm['versionStr'] if ('releaseDate' in firm and firm['releaseDate'] and firm['releaseDate'] != 'N/A'): try: bdata['date'] = self._parse_builddate( firm['releaseDate']) except ValueError: pass yield ('{0} {1}'.format(aname, fname), bdata) storagedata = self.get_cached_data('lenovo_cached_storage') if not storagedata: if self.wc: storagedata = self.wc.grab_json_response( '/designs/imm/dataproviders/raid_alldevices.php') if storagedata: self.datacache['lenovo_cached_storage'] = ( storagedata, _monotonic_time()) if storagedata and 'items' in storagedata: for adp in storagedata['items']: if 'storage.vpd.productName' not in adp: continue adpname = adp['storage.vpd.productName'] if 'children' not in adp: adp['children'] = () for diskent in adp['children']: bdata = {} diskname = '{0} Disk {1}'.format(adpname, diskent['storage.slotNo']) bdata['model'] = diskent['storage.vpd.productName'].rstrip( ) bdata['version'] = diskent['storage.firmwares'][0][ 'versionStr'] yield (diskname, bdata) if self.wc: self.wc.grab_json_response('/data/logout') self._wc = None