def _snmp_modular(ip, community, parent): oid = (1, 3, 6, 1, 4, 1, 343, 2, 19, 1, 2, 10, 12, 0) # Max blades message = network.snmp(ip, community, oid, attempts=1, timeout=0.5) max_blades = int(message[0][1]) blades_macs = {} for blade_no in range(1, max_blades + 1): oid = (1, 3, 6, 1, 4, 1, 343, 2, 19, 1, 2, 10, 202, 3, 1, 1, blade_no) blades_macs[blade_no] = set(network.snmp_macs(ip, community, oid, attempts=1, timeout=0.5)) for i, macs in blades_macs.iteritems(): unique_macs = macs for j, other_macs in blades_macs.iteritems(): if i == j: continue unique_macs -= other_macs ethernets = [Eth('Intel Modular MAC', mac, speed=None) for mac in unique_macs] if ethernets: dev = Device.create( name='Intel Modular Blade', model_name='Intel Modular Blade', model_type=DeviceType.blade_server, ethernets=ethernets, management=parent.management, chassis_position=i, position = str(i), parent=parent, ) dev.save(update_last_seen=True)
def snmp_vmware(parent, ipaddr, **kwargs): ip = str(kwargs['ip']) community = str(kwargs['community']) oid = (1,3,6,1,4,1,6876,2,4,1,7) snmp_version = 1 for mac in network.snmp_macs(ip, community, oid, attempts=2, timeout=3, snmp_version=snmp_version): dev = Device.create(parent=parent, management=ipaddr, ethernets=[Eth(mac=mac, label='Virtual MAC', speed=0)], model_name='VMware ESX virtual server', model_type=DeviceType.virtual_server)
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 network.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) elif model_name == 'Linux': Software.create(dev, '', 'Linux', label=snmp_name, family='Linux').save() elif model_name == 'SunOs': Software.create(dev, '', 'Solaris', label=snmp_name, family='Sun').save() return ethernets