Node search by date (but not time)
This commit is contained in:
		| @@ -4,6 +4,7 @@ | ||||
|  | ||||
|   * [#86] Use Vendor abbrevs to enhance node display in device port view | ||||
|   * [#74] Device Name / DNS mismatches report | ||||
|   * [#71] Node search by date (but not time) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|    | ||||
|   | ||||
| @@ -18,15 +18,36 @@ ajax '/ajax/content/search/node' => require_login sub { | ||||
|     send_error('Missing node', 400) unless $node; | ||||
|     content_type('text/html'); | ||||
|  | ||||
|     my $agenot = param('age_invert') || '0'; | ||||
|     my ( $start, $end ) = param('daterange') =~ /(\d+-\d+-\d+)/gmx; | ||||
|  | ||||
|     my $mac = Net::MAC->new(mac => $node, 'die' => 0, verbose => 0); | ||||
|     my @active = (param('archived') ? () : (-bool => 'active')); | ||||
|  | ||||
|     my @times = (); | ||||
|     if ($start and $end) { | ||||
|         $start = $start . ' 00:00:00'; | ||||
|         $end   = $end   . ' 23:59:59'; | ||||
|         if ($agenot) { | ||||
|             @times = (-or => [ | ||||
|               time_first => [ { '<', $start }, undef ], | ||||
|               time_last => { '>', $end }, | ||||
|             ]); | ||||
|         } | ||||
|         else { | ||||
|             @times = (-and => [ | ||||
|               time_first => { '>=', $start }, | ||||
|               time_last  => { '<=', $end }, | ||||
|             ]); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (! $mac->get_error) { | ||||
|         my $sightings = schema('netdisco')->resultset('Node') | ||||
|           ->search_by_mac({mac => $mac->as_IEEE, @active}); | ||||
|           ->search_by_mac({mac => $mac->as_IEEE, @active, @times}); | ||||
|  | ||||
|         my $ips = schema('netdisco')->resultset('NodeIp') | ||||
|           ->search_by_mac({mac => $mac->as_IEEE, @active}); | ||||
|           ->search_by_mac({mac => $mac->as_IEEE, @active, @times}); | ||||
|  | ||||
|         my $ports = schema('netdisco')->resultset('DevicePort') | ||||
|           ->search({mac => $mac->as_IEEE}); | ||||
| @@ -58,7 +79,7 @@ ajax '/ajax/content/search/node' => require_login sub { | ||||
|         if (my $ip = NetAddr::IP::Lite->new($node)) { | ||||
|             # search_by_ip() will extract cidr notation if necessary | ||||
|             $set = schema('netdisco')->resultset('NodeIp') | ||||
|               ->search_by_ip({ip => $ip, @active}); | ||||
|               ->search_by_ip({ip => $ip, @active, @times}); | ||||
|         } | ||||
|         else { | ||||
|             if (param('partial')) { | ||||
| @@ -69,7 +90,7 @@ ajax '/ajax/content/search/node' => require_login sub { | ||||
|                     if index($node, setting('domain_suffix')) == -1; | ||||
|             } | ||||
|             $set = schema('netdisco')->resultset('NodeIp') | ||||
|               ->search_by_dns({dns => $node, @active}); | ||||
|               ->search_by_dns({dns => $node, @active, @times}); | ||||
|  | ||||
|             # if the user selects Vendor search opt, then | ||||
|             # we'll try the OUI company name as a fallback | ||||
| @@ -78,7 +99,7 @@ ajax '/ajax/content/search/node' => require_login sub { | ||||
|                 $set = schema('netdisco')->resultset('NodeIp') | ||||
|                   ->with_times | ||||
|                   ->search( | ||||
|                     {'oui.company' => { -ilike => "\%$node\%"}}, | ||||
|                     {'oui.company' => { -ilike => "\%$node\%"}, @times}, | ||||
|                     {'prefetch' => 'oui'}, | ||||
|                   ); | ||||
|             } | ||||
|   | ||||
| @@ -271,4 +271,25 @@ $(document).ready(function() { | ||||
|   $('.tab-pane').on('hidden', '.nd_modal', function () { | ||||
|     $(this).toggleClass('nd_deep-horizon'); | ||||
|   }); | ||||
|  | ||||
|   // activate daterange plugin | ||||
|   $('#daterange').daterangepicker({ | ||||
|     ranges: { | ||||
|       'Today': [moment(), moment()] | ||||
|       ,'Yesterday': [moment().subtract('days', 1), moment().subtract('days', 1)] | ||||
|       ,'Last 7 Days': [moment().subtract('days', 6), moment()] | ||||
|       ,'Last 30 Days': [moment().subtract('days', 29), moment()] | ||||
|       ,'This Month': [moment().startOf('month'), moment().endOf('month')] | ||||
|       ,'Last Month': [moment().subtract('month', 1).startOf('month'), moment().subtract('month', 1).endOf('month')] | ||||
|     } | ||||
|     ,minDate: '2004-01-01' | ||||
|     ,showDropdowns: true | ||||
|     ,timePicker: false | ||||
|     ,opens: 'left' | ||||
|     ,format: 'YYYY-MM-DD' | ||||
|     ,separator: ' to ' | ||||
|   } | ||||
|   ,function(start, end) { | ||||
|       $('#daterange').parent('.clearfix').addClass('success'); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -21,6 +21,13 @@ | ||||
|     form_inputs.each(function() {device_form_state($(this))}); | ||||
|     form_inputs.change(function() {device_form_state($(this))}); | ||||
|  | ||||
|     // special case for datepicker in node sidebar | ||||
|     $('.nd_sidebar').on('input', '#daterange', function() { | ||||
|       if ($(this).prop('value') == '') { | ||||
|         $('#daterange').parent('.clearfix').removeClass('success'); | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     // handler for copy icon in search option | ||||
|     $('.nd_field-copy-icon').click(function() { | ||||
|       var name = $(this).data('btn-for'); | ||||
|   | ||||
| @@ -23,6 +23,8 @@ | ||||
|   <script type="text/javascript" src="[% uri_base %]/javascripts/d3.min.js"></script> | ||||
|   <script type="text/javascript" src="[% uri_base %]/javascripts/toastr.js"></script> | ||||
|   <script type="text/javascript" src="[% uri_base %]/javascripts/jquery.floatThead.js"></script> | ||||
|   <script type="text/javascript" src="[% uri_base %]/javascripts/daterangepicker.js"></script> | ||||
|   <script type="text/javascript" src="[% uri_base %]/javascripts/moment.min.js"></script> | ||||
|  | ||||
|   <script type="text/javascript"> | ||||
|     var uri_base = '[% uri_base %]'; | ||||
|   | ||||
| @@ -31,6 +31,7 @@ | ||||
|                 <em class="muted">Seen within the date range:</em><br/> | ||||
|                 <input class="nd_side-input" id="daterange" | ||||
|                   type="text" name="daterange" value="[% params.daterange | html_entity %]"/> | ||||
|               </div> | ||||
|             </fieldset> | ||||
|  | ||||
|             <fieldset> | ||||
| @@ -72,27 +73,3 @@ | ||||
|             <button id="[% report.tag %]_submit" type="submit" class="btn btn-info"> | ||||
|              <i class="icon-search icon-large pull-left nd_navbar-icon"></i> Search IPs</button> | ||||
|  | ||||
| <script type = "text/javascript"> | ||||
| [%+ INCLUDE 'js/daterangepicker.js' -%] | ||||
| [%+ INCLUDE 'js/moment.min.js' -%] | ||||
| $('#daterange').daterangepicker({ | ||||
|             ranges: { | ||||
|                         'Today': [moment(), moment()], | ||||
|                         'Yesterday': [moment().subtract('days', 1), moment().subtract('days', 1)], | ||||
|                         'Last 7 Days': [moment().subtract('days', 6), moment()], | ||||
|                         'Last 30 Days': [moment().subtract('days', 29), moment()], | ||||
|                         'This Month': [moment().startOf('month'), moment().endOf('month')], | ||||
|                         'Last Month': [moment().subtract('month', 1).startOf('month'), moment().subtract('month', 1).endOf('month')] | ||||
|             }, | ||||
|             startDate: moment().subtract('days', 29), | ||||
|             endDate: moment(), | ||||
|             minDate: '2004-01-01', | ||||
|             showDropdowns: true, | ||||
|             timePicker: false, | ||||
|             opens: 'left', | ||||
|             format: 'YYYY-MM-DD', | ||||
|             separator: ' to ', | ||||
| }, function(start, end) { | ||||
|             $('#daterange span').html(start.format('MMM D, YYYY') + ' - ' + end.format('MMM D, YYYY')); | ||||
| }); | ||||
| </script> | ||||
|   | ||||
| @@ -38,6 +38,20 @@ | ||||
|                 <span class="nd_searchcheckbox uneditable-input">Partial Name</span> | ||||
|               </label> | ||||
|             </div> | ||||
|             <div class="clearfix"> | ||||
|               <em class="muted">Date Range:</em><br/> | ||||
|               <div class="clearfix input-prepend"> | ||||
|                 <label class="add-on"> | ||||
|                   <input type="checkbox" id="age_invert" | ||||
|                     name="age_invert"[% ' checked="checked"' IF params.age_invert %]/> | ||||
|                 </label> | ||||
|                 <label class="nd_checkboxlabel" for="age_invert"> | ||||
|                   <span class="nd_searchcheckbox uneditable-input">Not within...</span> | ||||
|                 </label> | ||||
|               </div> | ||||
|               <input class="nd_side-input" id="daterange" | ||||
|                 type="text" name="daterange" value="[% params.daterange | html_entity %]"/> | ||||
|             </div> | ||||
|             <div class="clearfix"> | ||||
|               <em class="muted">MAC address format:</em><br/> | ||||
|               <select id="nd_node-mac-format" name="mac_format"> | ||||
| @@ -48,3 +62,4 @@ | ||||
|             </div> | ||||
|             <button id="[% tab.tag %]_submit" type="submit" class="btn btn-info"> | ||||
|               <i class="icon-search icon-large pull-left nd_navbar-icon"></i> Search Nodes</button> | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user