def mac_search(request): """Controller for doing a search based on a mac address""" if 'mac' in request.GET: return mac_do_search(request) info_dict = {'form': forms.MacTrackerForm()} info_dict.update(MAC_DEFAULTS) return render(request, 'machinetracker/mac_search.html', info_dict)
def mac_do_search(request): """Does a search based on a mac address""" querydict = ProcessInput(request.GET).mac() form = forms.MacTrackerForm(querydict) info_dict = { 'form': form, 'form_data': None, 'mac_tracker': None, 'ip_tracker': None, 'mac_tracker_count': 0, 'ip_tracker_count': 0, 'disable_ip_context': True, } if form.is_valid(): _logger.debug("mac_do_search: form is valid") mac = form.cleaned_data['mac'] days = form.cleaned_data['days'] dns = form.cleaned_data['dns'] from_time = date.today() - timedelta(days=days) mac_min, mac_max = min_max_mac(mac) cam_result = Cam.objects.select_related('netbox').filter( end_time__gt=from_time, ).extra( where=['mac BETWEEN %s and %s'], params=[mac_min, mac_max] ).order_by('mac', 'sysname', 'module', 'port', '-start_time') arp_result = Arp.objects.select_related('netbox').filter( end_time__gt=from_time, mac__range=(mac_min, mac_max) ).order_by('mac', 'ip', '-start_time') if form.cleaned_data['netbios']: arp_result = arp_result.extra( select={'netbiosname': get_netbios_query()}) # Get last ip2mac and topo jobs on netboxes netboxes_ip2mac = get_last_job_log_from_netboxes(arp_result, 'ip2mac') netboxes_topo = get_last_job_log_from_netboxes(cam_result, 'topo') # Flag rows overdue as fishy for row in arp_result: if row.netbox in netboxes_ip2mac: job_log = netboxes_ip2mac[row.netbox] fishy = job_log and job_log.is_overdue() row.fishy = job_log if fishy else None for row in cam_result: if row.netbox in netboxes_topo: job_log = netboxes_topo[row.netbox] fishy = job_log and job_log.is_overdue() row.fishy = job_log if fishy else None mac_count = len(cam_result) ip_count = len(arp_result) _logger.debug("mac_do_search: processed %d cam rows and %d arp rows", mac_count, ip_count) mac_tracker = track_mac(('mac', 'sysname', 'module', 'port'), cam_result, dns=False) _logger.debug("mac_do_search: track_mac finished") uplink_tracker = UplinkTracker(mac_min, mac_max) interface_tracker = InterfaceTracker(mac_min, mac_max) ip_tracker = track_mac(('ip', 'mac'), arp_result, dns) info_dict.update({ 'form_data': form.cleaned_data, 'mac_tracker': mac_tracker, 'uplink_tracker': uplink_tracker, 'interface_tracker': interface_tracker, 'ip_tracker': ip_tracker, 'mac_tracker_count': mac_count, 'ip_tracker_count': ip_count, 'colspan': find_colspan('ip', form) }) info_dict.update(MAC_DEFAULTS) _logger.debug("mac_do_search: rendering") return render(request, 'machinetracker/mac_search.html', info_dict)