Exemplo n.º 1
0
 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)
Exemplo n.º 2
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
    )
Exemplo n.º 3
0
 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")
Exemplo n.º 4
0
Arquivo: facts.py Projeto: viciu/ralph
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)
Exemplo n.º 5
0
 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")
Exemplo n.º 6
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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)
Exemplo n.º 10
0
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,
    )
Exemplo n.º 11
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
Exemplo n.º 12
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')
    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
Exemplo n.º 13
0
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
Exemplo n.º 14
0
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
Exemplo n.º 15
0
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
Exemplo n.º 16
0
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
Exemplo n.º 17
0
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
Exemplo n.º 18
0
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