Пример #1
0
 def _sendoutput(self, output, sendbreak=False):
     self.myseq += 1
     self.myseq &= 0xf
     if self.myseq == 0:
         self.myseq = 1
     # currently we don't try to combine ack with outgoing data
     # so we use 0 for ack sequence number and accepted character
     # count
     breakbyte = 0
     if sendbreak:
         breakbyte = 0b10000
     payload = struct.pack("BBBB", self.myseq, 0, 0, breakbyte)
     payload += output
     self.lasttextsize = len(output)
     needskeepalive = False
     if self.lasttextsize == 0:
         needskeepalive = True
     self.awaitingack = True
     payload = struct.unpack("%dB" % len(payload), payload)
     self.lastpayload = payload
     self.send_payload(payload, retry=False, needskeepalive=needskeepalive)
     retries = 5
     while retries and self.awaitingack:
         expiry = _monotonic_time() + 5.5 - retries
         while self.awaitingack and _monotonic_time() < expiry:
             self.wait_for_rsp(0.5)
         if self.awaitingack:
             self.send_payload(payload,
                               retry=False,
                               needskeepalive=needskeepalive)
         retries -= 1
     if not retries:
         self._print_error('Connection lost')
Пример #2
0
 def _sendoutput(self, output, sendbreak=False):
     self.myseq += 1
     self.myseq &= 0xf
     if self.myseq == 0:
         self.myseq = 1
     # currently we don't try to combine ack with outgoing data
     # so we use 0 for ack sequence number and accepted character
     # count
     breakbyte = 0
     if sendbreak:
         breakbyte = 0b10000
     try:
         payload = bytearray((self.myseq, 0, 0, breakbyte)) + output
     except TypeError:  # bytearray hits unicode...
         payload = bytearray(
             (self.myseq, 0, 0, breakbyte)) + output.encode('utf8')
     self.lasttextsize = len(output)
     needskeepalive = False
     if self.lasttextsize == 0:
         needskeepalive = True
     self.awaitingack = True
     self.lastpayload = payload
     self.send_payload(payload, retry=False, needskeepalive=needskeepalive)
     retries = 5
     while retries and self.awaitingack:
         expiry = _monotonic_time() + 5.5 - retries
         while self.awaitingack and _monotonic_time() < expiry:
             self.wait_for_rsp(0.5)
         if self.awaitingack:
             self.send_payload(payload,
                               retry=False,
                               needskeepalive=needskeepalive)
         retries -= 1
     if not retries:
         self._print_error('Connection lost')
Пример #3
0
 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(self.ADP_URL)
             if adapterdata:
                 self.datacache['lenovo_cached_adapters'] = (
                     adapterdata, util._monotonic_time())
     if adapterdata and 'items' in adapterdata:
         for adata in adapterdata['items']:
             aname = adata[self.ADP_NAME]
             donenames = set([])
             for fundata in adata[self.ADP_FUN]:
                 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, util._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)
     self.weblogout()
Пример #4
0
 def hardware_inventory_map(self):
     hwmap = self.get_cached_data('lenovo_cached_hwmap')
     if hwmap:
         return hwmap
     hwmap = {}
     enclosureuuid = self.get_property('/v2/ibmc/smm/chassis/uuid')
     if enclosureuuid:
         hwmap['Enclosure'] = {'UUID': fixup_uuid(enclosureuuid)}
     adapterdata = self.get_cached_data('lenovo_cached_adapters')
     if not adapterdata:
         if self.wc:
             adapterdata = self.wc.grab_json_response(
                 self.ADP_URL, referer=self.adp_referer)
             if adapterdata:
                 self.datacache['lenovo_cached_adapters'] = (
                     adapterdata, util._monotonic_time())
     if adapterdata and 'items' in adapterdata:
         for adata in adapterdata['items']:
             skipadapter = False
             if not adata[self.ADP_OOB]:
                 continue
             aname = adata[self.ADP_NAME]
             clabel = adata[self.ADP_LABEL]
             if clabel == 'Unknown':
                 continue
             if clabel != 'Onboard':
                 aslot = adata[self.ADP_SLOTNO]
                 if clabel == 'ML2':
                     clabel = 'ML2 (Slot {0})'.format(aslot)
                 else:
                     clabel = 'Slot {0}'.format(aslot)
             bdata = {'location': clabel}
             for fundata in adata[self.ADP_FUN]:
                 bdata['pcislot'] = '{0:02x}:{1:02x}'.format(
                     fundata[self.BUSNO], fundata[self.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 self.PORTS in fundata:
                     for portinfo in fundata[self.PORTS]:
                         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 non-nic
                     skipadapter = True
             if not skipadapter:
                 hwmap[aname] = bdata
         self.datacache['lenovo_cached_hwmap'] = (hwmap,
                                                  util._monotonic_time())
     self.weblogout()
     return hwmap
Пример #5
0
 def hardware_inventory_map(self):
     hwmap = self.get_cached_data('lenovo_cached_hwmap')
     if hwmap:
         return hwmap
     hwmap = {}
     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, util._monotonic_time())
     if adapterdata and 'items' in adapterdata:
         for adata in adapterdata['items']:
             skipadapter = False
             if not adata['adapter.oobSupported']:
                 continue
             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 non-nic
                     skipadapter = True
             if not skipadapter:
                 hwmap[aname] = bdata
         self.datacache['lenovo_cached_hwmap'] = (hwmap,
                                                  util._monotonic_time())
     self.weblogout()
     return hwmap
Пример #6
0
 def hardware_inventory_map(self):
     hwmap = self.get_cached_data('lenovo_cached_hwmap')
     if hwmap:
         return hwmap
     hwmap = {}
     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, util._monotonic_time())
     if adapterdata and 'items' in adapterdata:
         for adata in adapterdata['items']:
             skipadapter = False
             if not adata['adapter.oobSupported']:
                 continue
             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 non-nic
                     skipadapter = True
             if not skipadapter:
                 hwmap[aname] = bdata
         self.datacache['lenovo_cached_hwmap'] = (hwmap,
                                                  util._monotonic_time())
     self.weblogout()
     return hwmap
Пример #7
0
 def get_cached_data(self, attribute):
     try:
         kv = self.datacache[attribute]
         if kv[1] > util._monotonic_time() - 30:
             return kv[0]
     except KeyError:
         return None
Пример #8
0
 def get_cached_data(self, attribute):
     try:
         kv = self.datacache[attribute]
         if kv[1] > util._monotonic_time() - 30:
             return kv[0]
     except KeyError:
         return None
Пример #9
0
 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, util._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, util._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)
     self.weblogout()