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)
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))
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)
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)
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 ) )
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)