Example #1
0
File: facts.py Project: 4i60r/ralph
def handle_facts_ip_addresses(facts):
    ip_addresses = set()
    for interface in facts['interfaces'].split(','):
        try:
            ip = network.validate_ip(facts['ipaddress_{}'.format(interface)])
            ip_addresses.add(ip)
        except (ValueError, KeyError):
            pass
    return list(ip_addresses)
Example #2
0
def handle_facts_ip_addresses(facts):
    ip_addresses = set()
    for interface in facts['interfaces'].split(','):
        try:
            ip = network.validate_ip(facts['ipaddress_{}'.format(interface)])
            ip_addresses.add(ip)
        except (ValueError, KeyError):
            pass
    return list(ip_addresses)
Example #3
0
def handle_facts_ethernets(facts):
    ethernets = []
    ip_addresses = []
    for interface in facts['interfaces'].split(','):
        try:
            ip = network.validate_ip(facts['ipaddress_{}'.format(interface)])
            ip_addresses.append(ip)
        except (ValueError, KeyError):
            pass
        mac = facts.get('macaddress_{}'.format(interface))
        if not mac:
            continue
        label = 'Ethernet {}'.format(interface)
        ethernets.append(Eth(label, mac, speed=None))
    return ip_addresses, ethernets
Example #4
0
def handle_facts_ethernets(facts):
    ethernets = []
    ip_addresses = []
    for interface in facts['interfaces'].split(','):
        try:
            ip = network.validate_ip(facts['ipaddress_{}'.format(interface)])
            ip_addresses.append(ip)
        except (ValueError, KeyError):
            pass
        mac = facts.get('macaddress_{}'.format(interface))
        if not mac:
            continue
        label = 'Ethernet {}'.format(interface)
        ethernets.append(Eth(label, mac, speed=None))
    return ip_addresses, ethernets
Example #5
0
def _add_hp_oa_devices(devices, device_type, parent=None):
    if devices and not isinstance(devices, list):
        devices = [devices]
    for i, device in enumerate(devices):
        bay = device['BAY']['CONNECTION2']['BLADESYMBOLICNUMBER'] or str(device['BAY']['CONNECTION'])
        name = device['PN'].strip() or device['SPN'].strip()
        if not name.startswith('HP'):
            name = 'HP ' + name
        firmware = str(device.get('FWRI', ''))
        sn = device['SN'].strip()
        if sn in SERIAL_BLACKLIST:
            sn = None
        if not sn:
            sn = device['BSN'].strip()
        if sn in SERIAL_BLACKLIST:
            sn = None

        try:
            ip = network.validate_ip(device['MGMTIPADDR'])
        except ValueError:
            continue

        ip_address, created = IPAddress.concurrent_get_or_create(address=str(ip))
        if created:
            ip_address.hostname = network.hostname(ip_address.address)
            ip_address.snmp_name = name
            ip_address.save(update_last_seen=True) # no priorities for IP addresses

        if device_type == DeviceType.management:
            ip_address.is_management = True
            if  parent and not parent.management:
                parent.management = ip_address
                parent.save(priority=SAVE_PRIORITY)
            extra = name
            model, mcreated = ComponentModel.concurrent_get_or_create(
                    type=ComponentType.management.id,
                    extra_hash=hashlib.md5(extra).hexdigest(), extra=extra)
            model.name = name
            model.save(priority=SAVE_PRIORITY)
            component, created = GenericComponent.concurrent_get_or_create(
                    device=parent, sn=sn)
            component.model = model
            component.label = name
            component.save(priority=SAVE_PRIORITY)

            if ip:
                ip_address.is_management = True
                ip_address.device = parent
                ip_address.save() # no priorities for IP addresses

            continue

        if device_type == DeviceType.switch and 'SAN' in name:
            device_type = DeviceType.fibre_channel_switch

        ethernets = list(_get_ethernets(device))
        if not (ip and name and (sn or ethernets)):
            continue

        dev = None

        if ip and device_type in (DeviceType.switch, DeviceType.fibre_channel_switch):
            ip_addr, ip_created = IPAddress.concurrent_get_or_create(address=ip)
            if ip_addr.device:
                dev = ip_addr.device
                dev.parent = parent

        if dev is None:
            dev = Device.create(sn=sn, model_name=name, model_type=device_type,
                            ethernets=ethernets, parent=parent,
                            priority=SAVE_PRIORITY)

        if firmware:
            dev.hard_firmware = firmware
        if bay:
            name = '%s [%s]' % (name, bay)
        if bay:
            if 'A' in bay or 'B' in bay:
                dev.chassis_position = int(bay[:-1])
                if bay[-1] == 'A':
                    dev.chassis_position += 1000
                elif bay[-1] == 'B':
                    dev.chassis_position += 2000
            else:
                dev.chassis_position = int(bay)
            dev.position = bay
        else:
            dev.chassis_position = i + 1
        dev.save(update_last_seen=True, priority=SAVE_PRIORITY)
        ip_address.device = dev
        ip_address.save(update_last_seen=True) # no priorities for IP addresses
Example #6
0
def _handle_subdevices(device_info, data):
    for devices_data, devices_type in (
        (data['INFRA2']['MANAGERS']['MANAGER'], DeviceType.management),
        (data['INFRA2']['SWITCHES']['SWITCH'], DeviceType.switch),
        (data['INFRA2']['BLADES']['BLADE'], DeviceType.blade_server),
    ):
        if devices_data and not isinstance(devices_data, list):
            devices_data = [devices_data]
        for i, device in enumerate(devices_data):
            bay = device['BAY']['CONNECTION2']['BLADESYMBOLICNUMBER', ] or str(
                device['BAY']['CONNECTION'])
            name = device['PN'].strip() or device['SPN'].strip()
            if not name.startswith('HP'):
                name = 'HP ' + name
            sn = device['SN'].strip()
            if sn in SERIAL_BLACKLIST:
                sn = None
            if not sn:
                sn = device['BSN'].strip()
            if sn in SERIAL_BLACKLIST:
                sn = None
            try:
                ip = network.validate_ip(device['MGMTIPADDR'])
            except ValueError:
                continue
            if devices_type == DeviceType.management:
                management_ip_addresses = set(
                    device_info.get(
                        'management_ip_addresses',
                        [],
                    ), )
                management_ip_addresses.add(ip)
                device_info.update(
                    management_ip_addresses=list(management_ip_addresses), )
                if 'parts' not in device_info:
                    device_info['parts'] = []
                device_info['parts'].append({
                    'type': devices_type.raw,
                    'model_name': name,
                    'serial_number': sn,
                    'label': name,
                })
                continue
            current_device_type = devices_type
            if devices_type == DeviceType.switch and 'SAN' in name:
                current_device_type = DeviceType.fibre_channel_switch
            mac_addresses = _get_mac_addresses(device)
            if not (ip and name and (sn or mac_addresses)):
                continue
            subdevice = {
                'type': current_device_type.raw,
                'model_name': name,
            }
            if sn:
                subdevice['serial_number'] = sn
            if mac_addresses:
                subdevice['mac_addresses'] = mac_addresses
            if bay:
                if 'A' in bay or 'B' in bay:
                    subdevice['chassis_position'] = int(bay[:-1])
                    if bay[-1] == 'A':
                        subdevice['chassis_position'] += 1000
                    elif bay[-1] == 'B':
                        subdevice['chassis_position'] += 2000
                else:
                    subdevice['chassis_position'] = int(bay)
                subdevice['position'] = bay
            else:
                subdevice['chassis_position'] = i + 1
            subdevices = device_info.get('subdevices', [])
            subdevices.append(subdevice)
            device_info['subdevices'] = subdevices
Example #7
0
def _handle_subdevices(device_info, data):
    for devices_data, devices_type in (
        (data['INFRA2']['MANAGERS']['MANAGER'], DeviceType.management),
        (data['INFRA2']['SWITCHES']['SWITCH'], DeviceType.switch),
        (data['INFRA2']['BLADES']['BLADE'], DeviceType.blade_server),
    ):
        if devices_data and not isinstance(devices_data, list):
            devices_data = [devices_data]
        for i, device in enumerate(devices_data):
            bay = device['BAY']['CONNECTION2'][
                'BLADESYMBOLICNUMBER',
            ] or str(device['BAY']['CONNECTION'])
            name = device['PN'].strip() or device['SPN'].strip()
            if not name.startswith('HP'):
                name = 'HP ' + name
            sn = device['SN'].strip()
            if sn in SERIAL_BLACKLIST:
                sn = None
            if not sn:
                sn = device['BSN'].strip()
            if sn in SERIAL_BLACKLIST:
                sn = None
            try:
                ip = network.validate_ip(device['MGMTIPADDR'])
            except ValueError:
                continue
            if devices_type == DeviceType.management:
                management_ip_addresses = set(
                    device_info.get(
                        'management_ip_addresses', [],
                    ),
                )
                management_ip_addresses.add(ip)
                device_info.update(
                    management_ip_addresses=list(management_ip_addresses),
                )
                if 'parts' not in device_info:
                    device_info['parts'] = []
                device_info['parts'].append({
                    'type': devices_type.raw,
                    'model_name': name,
                    'serial_number': sn,
                    'label': name,
                })
                continue
            current_device_type = devices_type
            if devices_type == DeviceType.switch and 'SAN' in name:
                current_device_type = DeviceType.fibre_channel_switch
            mac_addresses = _get_mac_addresses(device)
            if not (ip and name and (sn or mac_addresses)):
                continue
            subdevice = {
                'type': current_device_type.raw,
                'model_name': name,
            }
            if sn:
                subdevice['serial_number'] = sn
            if mac_addresses:
                subdevice['mac_addresses'] = mac_addresses
            if bay:
                if 'A' in bay or 'B' in bay:
                    subdevice['chassis_position'] = int(bay[:-1])
                    if bay[-1] == 'A':
                        subdevice['chassis_position'] += 1000
                    elif bay[-1] == 'B':
                        subdevice['chassis_position'] += 2000
                else:
                    subdevice['chassis_position'] = int(bay)
                subdevice['position'] = bay
            else:
                subdevice['chassis_position'] = i + 1
            subdevices = device_info.get('subdevices', [])
            subdevices.append(subdevice)
            device_info['subdevices'] = subdevices
Example #8
0
def _add_hp_oa_devices(devices, device_type, parent=None):
    if devices and not isinstance(devices, list):
        devices = [devices]
    for i, device in enumerate(devices):
        bay = device['BAY']['CONNECTION2']['BLADESYMBOLICNUMBER'] or str(device['BAY']['CONNECTION'])
        name = device['PN'].strip() or device['SPN'].strip()
        if not name.startswith('HP'):
            name = 'HP ' + name
        firmware = str(device.get('FWRI', ''))
        sn = device['SN'].strip()
        if sn in SERIAL_BLACKLIST:
            sn = None
        if not sn:
            sn = device['BSN'].strip()
        if sn in SERIAL_BLACKLIST:
            sn = None

        try:
            ip = network.validate_ip(device['MGMTIPADDR'])
        except ValueError:
            continue

        ip_address, created = IPAddress.concurrent_get_or_create(address=str(ip))
        if created:
            ip_address.hostname = network.hostname(ip_address.address)
            ip_address.snmp_name = name
            ip_address.save(update_last_seen=True) # no priorities for IP addresses

        if device_type == DeviceType.management:
            ip_address.is_management = True
            if  parent and not parent.management:
                parent.management = ip_address
                parent.save(priority=SAVE_PRIORITY)
            extra = name
            model, mcreated = ComponentModel.concurrent_get_or_create(
                    type=ComponentType.management.id,
                    extra_hash=hashlib.md5(extra).hexdigest(), extra=extra)
            model.name = name
            model.save(priority=SAVE_PRIORITY)
            component, created = GenericComponent.concurrent_get_or_create(
                    device=parent, sn=sn)
            component.model = model
            component.label = name
            component.save(priority=SAVE_PRIORITY)

            if ip:
                ip_address.is_management = True
                ip_address.device = parent
                ip_address.save() # no priorities for IP addresses

            continue

        if device_type == DeviceType.switch and 'SAN' in name:
            device_type = DeviceType.fibre_channel_switch

        ethernets = list(_get_ethernets(device))
        if not (ip and name and (sn or ethernets)):
            continue

        dev = None

        if ip and device_type in (DeviceType.switch, DeviceType.fibre_channel_switch):
            ip_addr, ip_created = IPAddress.concurrent_get_or_create(address=ip)
            if ip_addr.device:
                dev = ip_addr.device
                dev.parent = parent

        if dev is None:
            dev = Device.create(sn=sn, model_name=name, model_type=device_type,
                            ethernets=ethernets, parent=parent,
                            priority=SAVE_PRIORITY)

        if firmware:
            dev.hard_firmware = firmware
        if bay:
            name = '%s [%s]' % (name, bay)
        if bay:
            if 'A' in bay or 'B' in bay:
                dev.chassis_position = int(bay[:-1])
                if bay[-1] == 'A':
                    dev.chassis_position += 1000
                elif bay[-1] == 'B':
                    dev.chassis_position += 2000
            else:
                dev.chassis_position = int(bay)
            dev.position = bay
        else:
            dev.chassis_position = i + 1
        dev.save(update_last_seen=True, priority=SAVE_PRIORITY)
        ip_address.device = dev
        ip_address.save(update_last_seen=True) # no priorities for IP addresses