def switch_do_search(request): """Does a search in cam and arp based on a switch""" querydict = ProcessInput(request.GET).swp() form = forms.SwitchTrackerForm(querydict) info_dict = { 'form': form, 'form_data': None, 'mac_tracker': None, 'mac_tracker_count': 0, } if form.is_valid(): switch = form.cleaned_data['switch'] module = form.cleaned_data.get('module') port_interface = form.cleaned_data.get('port') days = form.cleaned_data['days'] from_time = date.today() - timedelta(days=days) criteria = {} if module: criteria['module'] = module # If port is specified, match on ifindex if port_interface: try: cam_with_ifindex = Cam.objects.filter( Q(sysname__istartswith=switch) | Q(netbox__sysname__istartswith=switch), end_time__gt=from_time, port=port_interface, **criteria, ).values('ifindex')[0] criteria['ifindex'] = cam_with_ifindex['ifindex'] except IndexError: criteria['port'] = port_interface cam_result = ( Cam.objects.select_related('netbox') .filter( Q(sysname__istartswith=switch) | Q(netbox__sysname__istartswith=switch), end_time__gt=from_time, **criteria, ) .order_by('sysname', 'module', 'mac', '-start_time') ) # Get last topo jobs on netboxes netboxes_topo = get_last_job_log_from_netboxes(cam_result, 'topo') # Flag rows overdue as fishy 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 swp_count = len(cam_result) swp_tracker = track_mac( ('mac', 'sysname', 'module', 'port'), cam_result, dns=False ) info_dict.update( { 'form_data': form.cleaned_data, 'mac_tracker': swp_tracker, 'mac_tracker_count': swp_count, } ) info_dict.update(SWP_DEFAULTS) return render(request, 'machinetracker/switch_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)