def setUp(self): device = Device.create( ethernets=[('', 'deadbeefcafe', 0)], model_name='HAL 9000', model_type=DeviceType.unknown, remarks="I'm sorry, Dave.", ) self.deployment = Deployment( hostname='discovery.one', ip='127.0.0.1', mac='deadbeefcafe', device=device, preboot=None, venture=None, venture_role=None, ) self.deployment.save() self.ip = IPAddress(address='127.0.0.1', device=device) self.ip.save() IPAddress(address='127.0.0.2', device=device).save() share_model = ComponentModel(type=ComponentType.share, name="share") share_model.save() share = DiskShare(wwn='x'*33, device=device, model=share_model) share.save() DiskShareMount(share=share, device=device).save() OperatingSystem.create(os_name='GladOS', dev=device, family='', priority=0) Software.create(dev=device, model_name='soft', path='/', family='', priority=0)
def handle_facts_os(dev, facts, is_virtual=False): try: os_name = "%s %s" % (facts['operatingsystem'], facts['operatingsystemrelease']) family = facts['kernel'] os_version = facts.get('kernelrelease', '') except KeyError: return memory_size = None try: memory_size, unit = re.split('\s+', facts['memorysize'].lower()) if unit == 'tb': memory_size = int(float(memory_size) * 1024 * 1024) elif unit == 'gb': memory_size = int(float(memory_size) * 1024) elif unit == 'mb' or unit == 'mib': # can got: 1000.24 mb - just remove float digits. memory_size = int(float(memory_size)) else: raise UnknownUnitError('Got unit: ' + unit) except (KeyError, ValueError): pass cores_key = ('physical' if not is_virtual else '') + 'processorcount' try: cores_count = int(facts.get(cores_key)) except TypeError: cores_count = None storage_size = get_storage_size_from_facts(facts) if not storage_size: lshw = facts.get('lshw', None) if lshw: try: lshw = base64.b64decode(lshw) except TypeError: pass finally: try: lshw = zlib.decompress(lshw) except zlib.error: pass else: lshw = parse_lshw(as_string=lshw) mount_point, storages = get_storage_from_lshw(lshw, True) storage_size = 0 for storage in storages: storage_size += storage['size'] OperatingSystem.create( dev=dev, os_name=os_name, family=family, version=os_version, cores_count=cores_count, storage=storage_size, memory=memory_size, priority=SAVE_PRIORITY )
def test_system(self): OperatingSystem.create( self.device, "Haiku", 0, version="1.0.0", memory="512", storage="2048", cores_count="4", family="BeOS" ) data = get_device_data(Device.objects.get(sn="123456789")) self.assertEqual(data["system_memory"], 512) self.assertEqual(data["system_storage"], 2048) self.assertEqual(data["system_cores_count"], 4) self.assertEqual(data["system_family"], "BeOS") self.assertEqual(data["system_label"], "Haiku 1.0.0")
def handle_facts_os(dev, facts, is_virtual=False): try: os_name = "%s %s" % (facts['operatingsystem'], facts['operatingsystemrelease']) family = facts['kernel'] os_version = facts.get('kernelrelease', '') except KeyError: return os = OperatingSystem.create(dev=dev, os_name=os_name, version=os_version, family=family) memory_size = None try: memory_size, unit = re.split('\s+', facts['memorysize'].lower()) if unit == 'tb': memory_size = int(float(memory_size) * 1024 * 1024) elif unit == 'gb': memory_size = int(float(memory_size) * 1024) elif unit == 'mb' or unit == 'mib': memory_size = int(memory_size) except (KeyError, ValueError): pass os.memory = memory_size if is_virtual: os.cores_count = facts.get('processorcount', None) else: os.cores_count = facts.get('physicalprocessorcorecount', None) os.save(priority=SAVE_PRIORITY)
def test_system(self): OperatingSystem.create( self.device, "Haiku", 0, version="1.0.0", memory='512', storage='2048', cores_count='4', family="BeOS", ) data = get_device_data(Device.objects.get(sn='123456789')) self.assertEqual(data['system_memory'], 512) self.assertEqual(data['system_storage'], 2048) self.assertEqual(data['system_cores_count'], 4) self.assertEqual(data['system_family'], "BeOS") self.assertEqual(data['system_label'], "Haiku 1.0.0")
def save_device_data(data, remote_ip): device = data['device'] ethernets = [ Eth(e.get('label'), MACAddressField.normalize(e.get('mac')), str_to_ethspeed(e.get('speed'))) for e in data['ethernets'] if MACAddressField.normalize(e.get('mac')) not in MAC_PREFIX_BLACKLIST] sn = device.get('sn') vendor = device.get('vendor', '') if not ethernets and not sn: raise NoRequiredDataError('No MAC addresses and no device SN.') ip_addresses = [ e['ipaddress'] for e in data['ethernets'] if e.get('ipaddress') ] if not ip_addresses: raise NoRequiredIPAddressError( "Couldn't find any IP address for this device." ) try: dev = Device.create( sn=sn, ethernets=ethernets, model_name='%s %s %s' % ( device.get('caption'), vendor, device.get('version'), ), model_type=DeviceType.unknown, priority=SAVE_PRIORITY ) except ValueError as e: DiscoveryWarning( message="Failed to create device: " + str(e), plugin=__name__, ip=str(remote_ip), ).save() return None dev.save(priority=SAVE_PRIORITY) os = data['operating_system'] o = OperatingSystem.create(dev, os_name=os.get('label'), family='Windows', priority=SAVE_PRIORITY) o.memory = int(os['memory']) o.storage = int(os['storage']) o.cores_count = int(os['corescount']) o.save(priority=SAVE_PRIORITY) for ip in ip_addresses: ip_address, _ = IPAddress.concurrent_get_or_create(address=str(ip)) ip_address.device = dev ip_address.is_management = False ip_address.save() vendor = vendor.lower() is_virtual = any(virtual in vendor for virtual in CPU_VIRTUAL_LIST) save_processors(data['processors'], dev, is_virtual) save_memory(data['memory'], dev) save_storage(data['storage'], dev) save_shares(data['shares'], dev, ip_address) save_fibre_channel(data['fcs'], dev) save_software(data.get('software', []), dev) return dev
def make_system(ssh, dev): """Create the OperatingSystem component. Also update the hostname.""" stdin, stdout, stderr = ssh.exec_command("/bin/uname -a") family, host, version, release, rest = stdout.read().strip().split(None, 4) os = OperatingSystem.create(dev=dev, os_name=release, version=version, family=family) dev.name = host dev.save(priority=SAVE_PRIORITY) return os
def update_os(ssh, dev): """Update the OperatingSystem component.""" stdin, stdout, stderr = ssh.exec_command("/bin/uname -a") family, host, version, release, rest = stdout.read().strip().split(None, 4) return OperatingSystem.create(dev=dev, os_name=release, version=version, family=family, memory=get_memory(ssh), storage=get_disk(ssh), cores_count=get_cores(ssh), priority=SAVE_PRIORITY)
def update_os(ssh, dev): """Update the OperatingSystem component.""" stdin, stdout, stderr = ssh.exec_command("/bin/uname -a") family, host, version, release, rest = stdout.read().strip().split(None, 4) return OperatingSystem.create( dev=dev, os_name=release, version=version, family=family, memory=get_memory(ssh), storage=get_disk(ssh), cores_count=get_cores(ssh), priority=SAVE_PRIORITY, )
def save_device_data(data, remote_ip): device = data["device"] ethernets = [ Eth(e.get("label"), MACAddressField.normalize(e.get("mac")), str_to_ethspeed(e.get("speed"))) for e in data["ethernets"] if MACAddressField.normalize(e.get("mac")) not in MAC_PREFIX_BLACKLIST ] sn = device.get("sn") vendor = device.get("vendor", "") if not ethernets and not sn: raise NoRequiredDataError("No MAC addresses and no device SN.") ip_addresses = [e["ipaddress"] for e in data["ethernets"] if e.get("ipaddress")] if not ip_addresses: raise NoRequiredIPAddressError("Couldn't find any IP address for this device.") try: dev = Device.create( sn=sn, ethernets=ethernets, model_name="%s %s %s" % (device.get("caption"), vendor, device.get("version")), model_type=DeviceType.unknown, priority=SAVE_PRIORITY, ) except ValueError as e: DiscoveryWarning(message="Failed to create device: " + str(e), plugin=__name__, ip=str(remote_ip)).save() return None dev.save(priority=SAVE_PRIORITY) os = data["operating_system"] o = OperatingSystem.create(dev, os_name=os.get("label"), family="Windows", priority=SAVE_PRIORITY) o.memory = int(os["memory"]) o.storage = int(os["storage"]) o.cores_count = int(os["corescount"]) o.save(priority=SAVE_PRIORITY) for ip in ip_addresses: ip_address, _ = IPAddress.concurrent_get_or_create(address=str(ip)) ip_address.device = dev ip_address.is_management = False ip_address.save() vendor = vendor.lower() is_virtual = any(virtual in vendor for virtual in CPU_VIRTUAL_LIST) save_processors(data["processors"], dev, is_virtual) save_memory(data["memory"], dev) save_storage(data["storage"], dev) save_shares(data["shares"], dev, ip_address) save_fibre_channel(data["fcs"], dev) save_software(data.get("software", []), dev) return dev
def save_device_data(data, remote_ip): device = data['device'] ethernets = [ Eth(e.get('label'), MACAddressField.normalize(e.get('mac')), str_to_ethspeed(e.get('speed'))) for e in data['ethernets'] if MACAddressField.normalize(e.get('mac')) not in MAC_PREFIX_BLACKLIST ] sn = device.get('sn') if not ethernets and not sn: raise NoRequiredDataError('No MAC addresses and no device SN.') try: dev = Device.create(sn=sn, ethernets=ethernets, model_name='%s %s %s' % (device.get('caption'), device.get('vendor'), device.get('version')), model_type=DeviceType.unknown, priority=SAVE_PRIORITY) except ValueError as e: DiscoveryWarning( message="Failed to create device: " + str(e), plugin=__name__, ip=str(remote_ip), ).save() return None dev.save(priority=SAVE_PRIORITY) os = data['operating_system'] o = OperatingSystem.create(dev, os_name=os.get('label'), family='Windows') o.memory = int(os['memory']) o.storage = int(os['storage']) o.cores_count = int(os['corescount']) o.save() ip_address, _ = IPAddress.concurrent_get_or_create(address=str(remote_ip)) ip_address.device = dev ip_address.is_management = False ip_address.save() save_processors(data['processors'], dev) save_memory(data['memory'], dev) save_storage(data['storage'], dev) save_shares(data['shares'], dev, ip_address) save_fibre_channel(data['fcs'], dev) return dev
def save_device_data(data, remote_ip): device = data['device'] shares = data['shares'] fcs = data['fcs'] storage = data['storage'] memory = data['memory'] processors = data['processors'] os = data['operating_system'] device = data['device'] ethernets = [Eth(e.get('label'), MACAddressField.normalize(e.get('mac')), str_to_ethspeed(e.get('speed'))) for e in data['ethernets'] if MACAddressField.normalize(e.get('mac')) not in MAC_PREFIX_BLACKLIST] if not ethernets: raise NoMACError('No MAC addresses.') dev = Device.create( sn=device.get('sn'), ethernets=ethernets, model_name='%s %s %s' % (device.get('caption'), device.get('vendor'), device.get('version')), model_type=DeviceType.unknown, priority=SAVE_PRIORITY ) dev.save(priority=SAVE_PRIORITY) if not dev.operatingsystem_set.exists(): o = OperatingSystem.create(dev, os_name=os.get('label'), family='Windows', ) o.memory = int(os['memory']) o.storage = int(os['storage']) o.cores_count = int(os['corescount']) o.save() ip_address, _ = IPAddress.concurrent_get_or_create(address=str(remote_ip)) ip_address.device = dev ip_address.is_management = False ip_address.save() save_processors(processors, dev) save_memory(memory, dev) save_storage(storage, dev) save_shares(shares, dev, ip_address) save_fibre_channel(fcs, dev) return dev
def do_snmp_mac(snmp_name, community, snmp_version, ip, kwargs): oid = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6) sn = None is_management = False if snmp_name.lower().startswith('sunos'): model_name = 'SunOs' model_type = DeviceType.unknown elif snmp_name.lower().startswith('hardware:') and 'Windows' in snmp_name: model_name = 'Windows' model_type = DeviceType.unknown elif snmp_name.lower().startswith('vmware esx'): model_name = 'VMware ESX' model_type = DeviceType.unknown oid = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6) snmp_version = 1 elif snmp_name.startswith('IronPort'): parts = snmp_name.split(',') model_name = parts[0].strip() model_type = DeviceType.smtp_gateway is_management = True elif snmp_name.startswith('Intel Modular'): model_type = DeviceType.blade_system model_name = 'Intel Modular Blade System' is_management = True elif snmp_name.startswith('IBM PowerPC CHRP Computer'): model_type = DeviceType.unknown model_name = 'IBM pSeries' elif 'Software:UCOS' in snmp_name: model_name = 'Cisco UCOS' model_type = DeviceType.appliance is_management = True elif snmp_name.startswith('Codian'): model_name = snmp_name model_type = DeviceType.appliance is_management = True elif snmp_name.startswith('APC'): m = re.search(r'\sMN:\s*(\S+)', snmp_name) model_name = m.group(1) if m else 'APC' m = re.search(r'\sSN:\s*(\S+)', snmp_name) sn = m.group(1) if m else None is_management = True model_type = DeviceType.power_distribution_unit elif 'fibre channel switch' in snmp_name.lower() or 'san switch module' in snmp_name.lower(): model_name = snmp_name model_type = DeviceType.fibre_channel_switch is_management = True elif 'ethernet switch module' in snmp_name.lower() or snmp_name.startswith('ProCurve'): model_name= snmp_name if ',' in model_name: model_name, trash = model_name.split(',', 1) model_type = DeviceType.switch is_management = True elif '.f5app' in snmp_name: model_name, sn = snmp_f5(**kwargs) model_type = DeviceType.load_balancer elif 'StorageWorks' in snmp_name: model_name = snmp_name model_type = DeviceType.storage elif 'linux' in snmp_name.lower(): model_name = 'Linux' model_type = DeviceType.unknown else: model_name = 'Unknown' model_type = DeviceType.unknown raise Error('no match.') ethernets = [] for mac in snmp_macs(ip, community, oid, attempts=2, timeout=3, snmp_version=snmp_version): # Skip virtual devices if mac[0:6] in MAC_PREFIX_BLACKLIST: continue if snmp_name.startswith('Brocade') and not mac.startswith('00051E'): # Only use the first right mac of the Brocade switches, the rest is trash. continue if model_name == 'Windows' and mac.startswith('000C29'): # Skip VMWare interfaces on Windows continue if mac.startswith('0001D7') and model_type != DeviceType.load_balancer: # This is an F5 model_name, sn = snmp_f5(**kwargs) model_type = DeviceType.load_balancer ethernets.append(Eth('SNMP MAC', mac, speed=None)) if model_type == DeviceType.load_balancer: # For F5, macs that start with 02 are the maqueraded macs ethernets = [e for e in ethernets if not e.mac.startswith('02')] if not ethernets and not sn: raise Error('no MAC.') name = snmp_name dev = Device.create(ethernets=ethernets, model_name=model_name, model_type=model_type, name=name, sn=sn) ip_address = IPAddress.objects.get(address=str(ip)) ip_address.device = dev ip_address.is_management = is_management if is_management: dev.management = ip_address if model_name == 'VMware ESX': snmp_vmware(dev, ip_address, **kwargs) ip_address.save() if model_name.startswith('IronPort'): pairs = dict((k.strip(), v.strip()) for (k, v) in (part.split(':') for part in parts if ':' in part)) dev.boot_firmware = 'AsyncOS %s %s' % ( pairs.get('AsyncOS Version'), pairs.get('Build Date')) dev.sn = pairs.get('Serial #') dev.save(update_last_seen=True, priority=SAVE_PRIORITY) elif model_name == 'Intel Modular Blade System': _snmp_modular(ip, community, dev) if not dev.operatingsystem_set.exists(): if model_name in ('Linux', 'SunOs'): family = 'Linux' if model_name == 'Linux' else 'Sun' OperatingSystem.create(dev, os_name=snmp_name, family=family).save() return ethernets
def run_ssh_aix(ip): ssh = _connect_ssh(ip) try: ethernets = [] for model_line in _ssh_lines(ssh, 'lsattr -El sys0 | grep ^modelname'): machine_model = model_line.split(None, 2)[1] break for mac_line in _ssh_lines(ssh, 'netstat -ia | grep link'): interface, mtu, net, mac, rest = mac_line.split(None, 4) if '.' not in mac: continue octets = mac.split('.') mac = ''.join('%02x' % int(o, 16) for o in octets).upper() ethernets.append(Eth(label=interface, mac=mac, speed=0)) disks = {} os_storage_size = 0 for disk_line in _ssh_lines(ssh, 'lsdev -c disk'): disk, rest = disk_line.split(None, 1) wwn = None model = None for line in _ssh_lines(ssh, 'lscfg -vl %s' % disk): if 'hdisk' in line: match = re.search(r'\(([0-9]+) MB\)', line) if match: os_storage_size += int(match.group(1)) elif 'Serial Number...' in line: label, sn = line.split('.', 1) sn = sn.strip('. \n') elif 'Machine Type and Model.' in line: label, model = line.split('.', 1) model = model.strip('. \n') disks[disk] = (model, sn) os_version = '' for line in _ssh_lines(ssh, 'oslevel'): os_version = line.strip() break os_memory = 0 for line in _ssh_lines(ssh, 'lsattr -El sys0 | grep ^realmem'): match = re.search(r'[0-9]+', line) if match: os_memory = int(int(match.group(0)) / 1024) break os_corescount = 0 for line in _ssh_lines(ssh, 'lparstat -i|grep ^Active\ Phys'): match = re.search(r'[0-9]+', line) if match: os_corescount += int(match.group(0)) finally: ssh.close() dev = Device.create(ethernets=ethernets, model_type=DeviceType.rack_server, model_name='%s AIX' % MODELS.get(machine_model, machine_model)) ipaddr = IPAddress.objects.get(address=ip) ipaddr.device = dev ipaddr.save() wwns = [] sns = [] stors = [] for disk, (model_name, sn) in disks.iteritems(): if not sn: continue if model_name == 'VV': wwns.append(sn) else: stors.append((disk, model_name, sn)) sns.append(sn) for mount in dev.disksharemount_set.exclude(share__wwn__in=wwns): mount.delete() for stor in dev.storage_set.exclude(sn__in=sns): stor.delete() for wwn in wwns: try: share = DiskShare.objects.get(wwn=wwn) except DiskShare.DoesNotExist: continue wwn = normalize_wwn(sn[-4:] + sn[:-4]) mount, created = DiskShareMount.concurrent_get_or_create( share=share, device=dev, is_virtual=False) mount.volume = disk mount.save() for disk, model_name, sn in stors: model, mcreated = ComponentModel.concurrent_get_or_create( type=ComponentType.disk.id, family=model_name, extra_hash='') model.name = model_name model.save() stor, created = Storage.concurrent_get_or_create(device=dev, sn=sn) stor.model = model stor.label = disk stor.save() mem, created = Memory.concurrent_get_or_create(device=dev, index=0) mem.label = 'Memory' mem.model, c = ComponentModel.concurrent_get_or_create( size=0, speed=0, type=ComponentType.memory.id, family='pSeries', extra_hash='') mem.model.name = 'pSeries Memory' mem.model.save() mem.save() cpu, created = Processor.concurrent_get_or_create(device=dev, index=0) cpu.label = 'CPU' cpu.model, c = ComponentModel.concurrent_get_or_create( speed=0, cores=0, type=ComponentType.processor.id, extra_hash='', family='pSeries CPU') cpu.model.name = 'pSeries CPU' cpu.model.save() cpu.save() os = OperatingSystem.create(dev=dev, os_name='AIX', version=os_version, family='AIX') os.memory = os_memory if os_memory else None os.cores_count = os_corescount if os_corescount else None os.storage = os_storage_size if os_storage_size else None os.save() return machine_model
def run_ssh_aix(ip): ssh = _connect_ssh(ip) try: ethernets = [] for model_line in _ssh_lines(ssh, 'lsattr -El sys0 | grep ^modelname'): machine_model = model_line.split(None, 2)[1] break for mac_line in _ssh_lines(ssh, 'netstat -ia | grep link'): interface, mtu, net, mac, rest = mac_line.split(None, 4) if '.' not in mac: continue octets = mac.split('.') mac = ''.join('%02x' % int(o, 16) for o in octets).upper() ethernets.append(Eth(label=interface, mac=mac, speed=0)) disks = {} os_storage_size = 0 for disk_line in _ssh_lines(ssh, 'lsdev -c disk'): disk, rest = disk_line.split(None, 1) wwn = None model = None for line in _ssh_lines(ssh, 'lscfg -vl %s' % disk): if 'hdisk' in line: match = re.search(r'\(([0-9]+) MB\)', line) if match: os_storage_size += int(match.group(1)) elif 'Serial Number...' in line: label, sn = line.split('.', 1) sn = sn.strip('. \n') elif 'Machine Type and Model.' in line: label, model = line.split('.', 1) model = model.strip('. \n') disks[disk] = (model, sn) os_version = '' for line in _ssh_lines(ssh, 'oslevel'): os_version = line.strip() break os_memory = 0 for line in _ssh_lines(ssh, 'lsattr -El sys0 | grep ^realmem'): match = re.search(r'[0-9]+', line) if match: os_memory = int(int(match.group(0)) / 1024) break os_corescount = 0 for line in _ssh_lines(ssh, 'lparstat -i|grep ^Active\ Phys'): match = re.search(r'[0-9]+', line) if match: os_corescount += int(match.group(0)) finally: ssh.close() dev = Device.create( ethernets=ethernets, model_type=DeviceType.rack_server, model_name='%s AIX' % MODELS.get(machine_model, machine_model)) ipaddr = IPAddress.objects.get(address=ip) ipaddr.device = dev ipaddr.save() wwns = [] sns = [] stors = [] for disk, (model_name, sn) in disks.iteritems(): if not sn: continue if model_name == 'VV': wwns.append(sn) else: stors.append((disk, model_name, sn)) sns.append(sn) for mount in dev.disksharemount_set.exclude(share__wwn__in=wwns): mount.delete() for stor in dev.storage_set.exclude(sn__in=sns): stor.delete() for wwn in wwns: try: share = DiskShare.objects.get(wwn=wwn) except DiskShare.DoesNotExist: continue wwn = normalize_wwn(sn[-4:] + sn[:-4]) mount, created = DiskShareMount.concurrent_get_or_create( share=share, device=dev, defaults={'is_virtual':False}) mount.volume = disk mount.save(priority=SAVE_PRIORITY) for disk, model_name, sn in stors: # FIXME: storage with no size model, c = ComponentModel.create( ComponentType.disk, family=model_name, priority=SAVE_PRIORITY, ) stor, created = Storage.concurrent_get_or_create( device=dev, sn=sn, mount_point=None, ) stor.model = model stor.label = disk stor.save(priority=SAVE_PRIORITY) # FIXME: memory with no size mem, created = Memory.concurrent_get_or_create(device=dev, index=0) mem.label = 'Memory' mem.model, c = ComponentModel.create( ComponentType.memory, family='pSeries', priority=SAVE_PRIORITY, ) mem.save(priority=SAVE_PRIORITY) # FIXME: CPUs without info cpu, created = Processor.concurrent_get_or_create(device=dev, index=0) cpu.label = 'CPU' cpu.model, c = ComponentModel.create( ComponentType.processor, family='pSeries', name='pSeries CPU', priority=SAVE_PRIORITY, ) cpu.save(priority=SAVE_PRIORITY) OperatingSystem.create(dev=dev, os_name='AIX', version=os_version, family='AIX', memory=os_memory or None, cores_count=os_corescount or None, storage=os_storage_size or None, priority=SAVE_PRIORITY ) return machine_model
def do_snmp_mac(snmp_name, community, snmp_version, ip, kwargs): oid = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6) sn = None is_management = False if snmp_name.lower().startswith('sunos'): model_name = 'SunOs' model_type = DeviceType.unknown elif snmp_name.lower().startswith('hardware:') and 'Windows' in snmp_name: model_name = 'Windows' model_type = DeviceType.unknown elif snmp_name.lower().startswith('vmware esx'): model_name = 'VMware ESX' model_type = DeviceType.unknown oid = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6) snmp_version = 1 elif snmp_name.startswith('IronPort'): parts = snmp_name.split(',') model_name = parts[0].strip() model_type = DeviceType.smtp_gateway is_management = True elif snmp_name.startswith('Intel Modular'): model_type = DeviceType.blade_system model_name = 'Intel Modular Blade System' is_management = True elif snmp_name.startswith('IBM PowerPC CHRP Computer'): model_type = DeviceType.unknown model_name = 'IBM pSeries' elif 'Software:UCOS' in snmp_name: model_name = 'Cisco UCOS' model_type = DeviceType.appliance is_management = True elif snmp_name.startswith('Codian'): model_name = snmp_name model_type = DeviceType.appliance is_management = True elif snmp_name.startswith('APC'): m = re.search(r'\sMN:\s*(\S+)', snmp_name) model_name = m.group(1) if m else 'APC' m = re.search(r'\sSN:\s*(\S+)', snmp_name) sn = m.group(1) if m else None is_management = True model_type = DeviceType.power_distribution_unit elif 'fibre channel switch' in snmp_name.lower() or 'san switch module' in snmp_name.lower(): model_name = snmp_name model_type = DeviceType.fibre_channel_switch is_management = True elif 'ethernet switch module' in snmp_name.lower() or snmp_name.startswith('ProCurve'): model_name= snmp_name if ',' in model_name: model_name, trash = model_name.split(',', 1) model_type = DeviceType.switch is_management = True elif '.f5app' in snmp_name: model_name, sn = snmp_f5(**kwargs) model_type = DeviceType.load_balancer elif 'StorageWorks' in snmp_name: model_name = snmp_name model_type = DeviceType.storage elif 'linux' in snmp_name.lower(): model_name = 'Linux' model_type = DeviceType.unknown else: model_name = 'Unknown' model_type = DeviceType.unknown raise Error('no match.') ethernets = [] for mac in snmp_macs(ip, community, oid, attempts=2, timeout=3, snmp_version=snmp_version): # Skip virtual devices if mac[0:6] in MAC_PREFIX_BLACKLIST: continue if snmp_name.startswith('Brocade') and not mac.startswith('00051E'): # Only use the first right mac of the Brocade switches, the rest is trash. continue if model_name == 'Windows' and mac.startswith('000C29'): # Skip VMWare interfaces on Windows continue if mac.startswith('0001D7') and model_type != DeviceType.load_balancer: # This is an F5 model_name, sn = snmp_f5(**kwargs) model_type = DeviceType.load_balancer ethernets.append(Eth('SNMP MAC', mac, speed=None)) if model_type == DeviceType.load_balancer: # For F5, macs that start with 02 are the maqueraded macs ethernets = [e for e in ethernets if not e.mac.startswith('02')] if not ethernets and not sn: raise Error('no MAC.') name = snmp_name dev = Device.create(ethernets=ethernets, model_name=model_name, model_type=model_type, name=name, sn=sn) ip_address = IPAddress.objects.get(address=str(ip)) ip_address.device = dev ip_address.is_management = is_management if is_management: dev.management = ip_address if model_name == 'VMware ESX': snmp_vmware(dev, ip_address, **kwargs) ip_address.save() if model_name.startswith('IronPort'): pairs = dict((k.strip(), v.strip()) for (k, v) in (part.split(':') for part in parts if ':' in part)) dev.boot_firmware = 'AsyncOS %s %s' % ( pairs.get('AsyncOS Version'), pairs.get('Build Date')) dev.sn = pairs.get('Serial #') dev.save(update_last_seen=True) elif model_name == 'Intel Modular Blade System': _snmp_modular(ip, community, dev) if not dev.operatingsystem_set.exists(): if model_name == 'Linux': OperatingSystem.create(dev, os_name=snmp_name, family='Linux').save() elif model_name == 'SunOs': OperatingSystem.create(dev, os_name=snmp_name, family='Sun').save() return ethernets
def do_snmp_mac(snmp_name, community, snmp_version, ip, kwargs): oid = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6) sn = None is_management = False if snmp_name.lower().startswith("sunos"): model_name = "SunOs" model_type = DeviceType.unknown elif snmp_name.lower().startswith("hardware:") and "Windows" in snmp_name: model_name = "Windows" model_type = DeviceType.unknown elif snmp_name.lower().startswith("vmware esx"): model_name = "VMware ESX" model_type = DeviceType.unknown oid = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6) snmp_version = 1 elif snmp_name.startswith("IronPort"): parts = snmp_name.split(",") model_name = parts[0].strip() model_type = DeviceType.smtp_gateway is_management = True elif snmp_name.startswith("Intel Modular"): model_type = DeviceType.blade_system model_name = "Intel Modular Blade System" is_management = True elif snmp_name.startswith("IBM PowerPC CHRP Computer"): model_type = DeviceType.unknown model_name = "IBM pSeries" elif "Software:UCOS" in snmp_name: model_name = "Cisco UCOS" model_type = DeviceType.appliance is_management = True elif snmp_name.startswith("Codian"): model_name = snmp_name model_type = DeviceType.appliance is_management = True elif snmp_name.startswith("APC"): m = re.search(r"\sMN:\s*(\S+)", snmp_name) model_name = m.group(1) if m else "APC" m = re.search(r"\sSN:\s*(\S+)", snmp_name) sn = m.group(1) if m else None is_management = True model_type = DeviceType.power_distribution_unit elif "fibre channel switch" in snmp_name.lower() or "san switch module" in snmp_name.lower(): model_name = snmp_name model_type = DeviceType.fibre_channel_switch is_management = True elif "ethernet switch module" in snmp_name.lower() or snmp_name.startswith("ProCurve"): model_name = snmp_name if "," in model_name: model_name, trash = model_name.split(",", 1) model_type = DeviceType.switch is_management = True elif ".f5app" in snmp_name: model_name, sn = snmp_f5(**kwargs) model_type = DeviceType.load_balancer elif "StorageWorks" in snmp_name: model_name = snmp_name model_type = DeviceType.storage elif "linux" in snmp_name.lower(): model_name = "Linux" model_type = DeviceType.unknown else: model_name = "Unknown" model_type = DeviceType.unknown raise Error("no match.") ethernets = [] for mac in snmp_macs(ip, community, oid, attempts=2, timeout=3, snmp_version=snmp_version): # Skip virtual devices if mac[0:6] in MAC_PREFIX_BLACKLIST: continue if snmp_name.startswith("Brocade") and not mac.startswith("00051E"): # Only use the first right mac of the Brocade switches, the rest is trash. continue if model_name == "Windows" and mac.startswith("000C29"): # Skip VMWare interfaces on Windows continue if mac.startswith("0001D7") and model_type != DeviceType.load_balancer: # This is an F5 model_name, sn = snmp_f5(**kwargs) model_type = DeviceType.load_balancer ethernets.append(Eth("SNMP MAC", mac, speed=None)) if model_type == DeviceType.load_balancer: # For F5, macs that start with 02 are the maqueraded macs ethernets = [e for e in ethernets if not e.mac.startswith("02")] if not ethernets and not sn: raise Error("no MAC.") name = snmp_name dev = Device.create(ethernets=ethernets, model_name=model_name, model_type=model_type, name=name, sn=sn) ip_address = IPAddress.objects.get(address=str(ip)) ip_address.device = dev ip_address.is_management = is_management if is_management: dev.management = ip_address if model_name == "VMware ESX": snmp_vmware(dev, ip_address, **kwargs) ip_address.save() if model_name.startswith("IronPort"): pairs = dict((k.strip(), v.strip()) for (k, v) in (part.split(":") for part in parts if ":" in part)) dev.boot_firmware = "AsyncOS %s %s" % (pairs.get("AsyncOS Version"), pairs.get("Build Date")) dev.sn = pairs.get("Serial #") dev.save(update_last_seen=True) elif model_name == "Intel Modular Blade System": _snmp_modular(ip, community, dev) if not dev.operatingsystem_set.exists(): if model_name == "Linux": OperatingSystem.create(dev, os_name=snmp_name, family="Linux").save() elif model_name == "SunOs": OperatingSystem.create(dev, os_name=snmp_name, family="Sun").save() return ethernets