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')
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')
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()
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
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
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
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
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()