Exemplo n.º 1
0
Arquivo: imm.py Projeto: lanz-/pyghmi
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
Arquivo: imm.py Projeto: throbs/pyghmi
 def get_cached_data(self, attribute):
     try:
         kv = self.datacache[attribute]
         if kv[1] > _monotonic_time() - 30:
             return kv[0]
     except KeyError:
         return None
Exemplo n.º 6
0
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')
Exemplo n.º 7
0
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')
Exemplo n.º 8
0
Arquivo: imm.py Projeto: throbs/pyghmi
 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