예제 #1
0
def _lldp_connections(ip, data):
    if not _network_connections_in_results(data):
        return  # No reason to run it...
    external_priorities = get_external_results_priorities(data)
    devices = find_devices(data)
    if len(devices) == 0:
        logger.warning('No device found for the IP address %s. '
                       'There are some connections.' % ip.address)
        return
    elif len(devices) > 1:
        logger.warning('Many devices found for the IP address %s. '
                       'There are some connections.' % ip.address)
        return
    _append_connections_to_device(devices[0], data, external_priorities)
예제 #2
0
def _mount_shares(ip, data):
    shares_in_device, shares_in_subdevice = _shares_in_results(data)
    if not shares_in_device and not shares_in_subdevice:
        return  # No reason to run it.
    external_priorities = get_external_results_priorities(data)
    # main devices
    if shares_in_device:
        devices = find_devices(data)
        if len(devices) == 1:
            _append_shares_to_device(ip, devices[0], data, external_priorities)
        else:
            if len(devices) == 0:
                logger.warning('No device found for the IP address %s. '
                               'There are some shares.' % ip.address)
            else:
                logger.warning('Many devices found for the IP address %s. '
                               'There are some shares.' % ip.address)
    # subdevices
    if shares_in_subdevice:
        for plugin_name, plugin_result in data.iteritems():
            if plugin_result['status'] == 'error':
                continue
            if 'device' not in plugin_result:
                continue
            for subdev_data in plugin_result['device'].get('subdevices', []):
                if 'disk_shares' not in subdev_data:
                    continue
                serials = set()
                if subdev_data.get('serial_number'):
                    serials.add(subdev_data['serial_number'])
                macs = set()
                for mac in subdev_data.get('mac_addresses', []):
                    macs.add(mac)
                devices = Device.admin_objects.filter(
                    Q(sn__in=serials) | Q(ethernet__mac__in=macs)).distinct()
                if len(devices) == 1:
                    _append_shares_to_subdevice(ip, devices[0],
                                                subdev_data['disk_shares'])
                else:
                    if len(devices) == 0:
                        logger.warning(
                            'No subdevice found for the hypervisor IP '
                            'address %s. SNs: %r; MACs: %r. There are some '
                            'shares.' % (ip.address, serials, macs))
                    else:
                        logger.warning(
                            'Many subdevices found for the hypervisor IP '
                            'address %s. Devices: %r. There are some '
                            'shares.' % (ip.address, devices))
예제 #3
0
def _lldp_connections(ip, data):
    if not _network_connections_in_results(data):
        return  # No reason to run it...
    external_priorities = get_external_results_priorities(data)
    devices = find_devices(data)
    if len(devices) == 0:
        logger.warning(
            'No device found for the IP address %s. '
            'There are some connections.' % ip.address
        )
        return
    elif len(devices) > 1:
        logger.warning(
            'Many devices found for the IP address %s. '
            'There are some connections.' % ip.address
        )
        return
    _append_connections_to_device(devices[0], data, external_priorities)
예제 #4
0
def _save_job_results(job_id, start_ts):
    if (int(time.time()) - start_ts) > 86100:  # 24h - 5min
        return
    try:
        job = rq.job.Job.fetch(job_id, django_rq.get_connection())
    except rq.exceptions.NoSuchJobError:
        return  # job with this id does not exist...
    if job.result is None and not job.is_failed:
        # we must wait...
        _enqueue_save_job_results(job_id)
        return
    elif job.is_failed:
        # nothing to do...
        return
    external_priorities = get_external_results_priorities(job.result)
    # management?
    is_management = False
    if job.args:
        try:
            is_management = IPAddress.objects.filter(
                address=job.args[0]).values_list('is_management', flat=True)[0]
        except IndexError:
            pass
    # first... update device
    devices, ids_lookup, sn_lookup, macs_lookup = _find_devices(job.result)
    if len(devices) > 1:
        raise AutomergerError(
            'Many devices found for: ids=%s, sn=%s, macs=%s' %
            (ids_lookup, sn_lookup, macs_lookup))
    used_serial_numbers = set()
    used_mac_addresses = set()
    for device in devices:
        device_data = get_device_data(device)
        if 'serial_number' in device_data:
            used_serial_numbers |= set([device_data['serial_number']])
        if 'mac_addresses' in device_data:
            used_mac_addresses |= set(device_data['mac_addresses'])
        data = merge_data(
            job.result,
            {
                'database': {
                    'device': device_data
                },
            },
            only_multiple=True,
        )
        append_merged_proposition(data, device, external_priorities)
        selected_data = _select_data(data, external_priorities, is_management)
        set_device_data(device, selected_data, save_priority=SAVE_PRIORITY)
        device.save(priority=SAVE_PRIORITY)
    # now... we create new devices from `garbage`
    if not devices:
        garbage = {}
        for plugin_name, plugin_result in job.result.items():
            if 'device' not in plugin_result:
                continue
            if 'serial_number' in plugin_result['device']:
                if plugin_result['device'][
                        'serial_number'] in used_serial_numbers:
                    continue
            if 'mac_addresses' in plugin_result['device']:
                if set(plugin_result['device']['mac_addresses'], ) != set(
                        plugin_result['device']['mac_addresses'],
                ) - used_mac_addresses:
                    continue
            if any((
                    plugin_result['device'].get('serial_number'),
                    plugin_result['device'].get('mac_addresses'),
            )):
                garbage[plugin_name] = plugin_result
        if garbage:
            data = merge_data(garbage)
            selected_data = _select_data(data, external_priorities)
            if all((
                    any((
                        selected_data.get('serial_number'),
                        selected_data.get('mac_addresses', []),
                    )),
                    any((
                        selected_data.get('model_name'),
                        selected_data.get('type'),
                    )),
            )):
                device_from_data(selected_data, save_priority=SAVE_PRIORITY)
    # mark this scan results
    update_scan_summary(job)
예제 #5
0
def _mount_shares(ip, data):
    shares_in_device, shares_in_subdevice = _shares_in_results(data)
    if not shares_in_device and not shares_in_subdevice:
        return  # No reason to run it.
    external_priorities = get_external_results_priorities(data)
    # main devices
    if shares_in_device:
        devices = find_devices(data)
        if len(devices) == 1:
            _append_shares_to_device(ip, devices[0], data, external_priorities)
        else:
            if len(devices) == 0:
                logger.warning(
                    'No device found for the IP address %s. '
                    'There are some shares.' % ip.address
                )
            else:
                logger.warning(
                    'Many devices found for the IP address %s. '
                    'There are some shares.' % ip.address
                )
    # subdevices
    if shares_in_subdevice:
        for plugin_name, plugin_result in data.iteritems():
            if plugin_result['status'] == 'error':
                continue
            if 'device' not in plugin_result:
                continue
            for subdev_data in plugin_result['device'].get('subdevices', []):
                if 'disk_shares' not in subdev_data:
                    continue
                serials = set()
                if subdev_data.get('serial_number'):
                    serials.add(subdev_data['serial_number'])
                macs = set()
                for mac in subdev_data.get('mac_addresses', []):
                    macs.add(mac)
                devices = Device.admin_objects.filter(
                    Q(sn__in=serials) |
                    Q(ethernet__mac__in=macs)
                ).distinct()
                if len(devices) == 1:
                    _append_shares_to_subdevice(
                        ip,
                        devices[0],
                        subdev_data['disk_shares']
                    )
                else:
                    if len(devices) == 0:
                        logger.warning(
                            'No subdevice found for the hypervisor IP '
                            'address %s. SNs: %r; MACs: %r. There are some '
                            'shares.' % (
                                ip.address,
                                serials,
                                macs
                            )
                        )
                    else:
                        logger.warning(
                            'Many subdevices found for the hypervisor IP '
                            'address %s. Devices: %r. There are some '
                            'shares.' % (
                                ip.address,
                                devices
                            )
                        )
예제 #6
0
파일: automerger.py 프로젝트: 4i60r/ralph
def _save_job_results(job_id, start_ts):
    if (int(time.time()) - start_ts) > 86100:  # 24h - 5min
        return
    try:
        job = rq.job.Job.fetch(job_id, django_rq.get_connection())
    except rq.exceptions.NoSuchJobError:
        return  # job with this id does not exist...
    if job.result is None and not job.is_failed:
        # we must wait...
        _enqueue_save_job_results(job_id)
        return
    elif job.is_failed:
        # nothing to do...
        return
    external_priorities = get_external_results_priorities(job.result)
    # management?
    is_management = False
    if job.args:
        try:
            is_management = IPAddress.objects.filter(
                address=job.args[0]
            ).values_list(
                'is_management', flat=True
            )[0]
        except IndexError:
            pass
    # first... update device
    devices, ids_lookup, sn_lookup, macs_lookup = _find_devices(job.result)
    if len(devices) > 1:
        raise AutomergerError(
            'Many devices found for: ids=%s, sn=%s, macs=%s' % (
                ids_lookup, sn_lookup, macs_lookup
            )
        )
    used_serial_numbers = set()
    used_mac_addresses = set()
    for device in devices:
        device_data = get_device_data(device)
        if 'serial_number' in device_data:
            used_serial_numbers |= set([device_data['serial_number']])
        if 'mac_addresses' in device_data:
            used_mac_addresses |= set(device_data['mac_addresses'])
        data = merge_data(
            job.result,
            {
                'database': {'device': device_data},
            },
            only_multiple=True,
        )
        append_merged_proposition(data, device, external_priorities)
        selected_data = select_data(data, external_priorities, is_management)
        set_device_data(device, selected_data, save_priority=SAVE_PRIORITY)
        device.save(priority=SAVE_PRIORITY)
    # now... we create new devices from `garbage`
    if not devices:
        garbage = {}
        for plugin_name, plugin_result in job.result.items():
            if 'device' not in plugin_result:
                continue
            if 'serial_number' in plugin_result['device']:
                if plugin_result['device'][
                    'serial_number'
                ] in used_serial_numbers:
                    continue
            if 'mac_addresses' in plugin_result['device']:
                if set(
                    plugin_result['device']['mac_addresses'],
                ) != set(
                    plugin_result['device']['mac_addresses'],
                ) - used_mac_addresses:
                    continue
            if any((
                plugin_result['device'].get('serial_number'),
                plugin_result['device'].get('mac_addresses'),
            )):
                garbage[plugin_name] = plugin_result
        if garbage:
            data = merge_data(garbage)
            selected_data = select_data(data, external_priorities)
            if all((
                any(
                    (
                        selected_data.get('serial_number'),
                        selected_data.get('mac_addresses', []),
                    )
                ),
                any(
                    (
                        selected_data.get('model_name'),
                        selected_data.get('type'),
                    )
                ),
            )):
                device_from_data(selected_data, save_priority=SAVE_PRIORITY)
    # mark this scan results
    update_scan_summary(job)