Node search by date (but not time)

This commit is contained in:
Oliver Gorwits
2014-02-03 23:12:17 +00:00
parent a71a69aca4
commit 68275e6986
9 changed files with 73 additions and 29 deletions

View File

@@ -4,6 +4,7 @@
* [#86] Use Vendor abbrevs to enhance node display in device port view * [#86] Use Vendor abbrevs to enhance node display in device port view
* [#74] Device Name / DNS mismatches report * [#74] Device Name / DNS mismatches report
* [#71] Node search by date (but not time)
[ENHANCEMENTS] [ENHANCEMENTS]

View File

@@ -18,15 +18,36 @@ ajax '/ajax/content/search/node' => require_login sub {
send_error('Missing node', 400) unless $node; send_error('Missing node', 400) unless $node;
content_type('text/html'); 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 $mac = Net::MAC->new(mac => $node, 'die' => 0, verbose => 0);
my @active = (param('archived') ? () : (-bool => 'active')); 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) { if (! $mac->get_error) {
my $sightings = schema('netdisco')->resultset('Node') 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') 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') my $ports = schema('netdisco')->resultset('DevicePort')
->search({mac => $mac->as_IEEE}); ->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)) { if (my $ip = NetAddr::IP::Lite->new($node)) {
# search_by_ip() will extract cidr notation if necessary # search_by_ip() will extract cidr notation if necessary
$set = schema('netdisco')->resultset('NodeIp') $set = schema('netdisco')->resultset('NodeIp')
->search_by_ip({ip => $ip, @active}); ->search_by_ip({ip => $ip, @active, @times});
} }
else { else {
if (param('partial')) { if (param('partial')) {
@@ -69,7 +90,7 @@ ajax '/ajax/content/search/node' => require_login sub {
if index($node, setting('domain_suffix')) == -1; if index($node, setting('domain_suffix')) == -1;
} }
$set = schema('netdisco')->resultset('NodeIp') $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 # if the user selects Vendor search opt, then
# we'll try the OUI company name as a fallback # 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') $set = schema('netdisco')->resultset('NodeIp')
->with_times ->with_times
->search( ->search(
{'oui.company' => { -ilike => "\%$node\%"}}, {'oui.company' => { -ilike => "\%$node\%"}, @times},
{'prefetch' => 'oui'}, {'prefetch' => 'oui'},
); );
} }

View File

@@ -271,4 +271,25 @@ $(document).ready(function() {
$('.tab-pane').on('hidden', '.nd_modal', function () { $('.tab-pane').on('hidden', '.nd_modal', function () {
$(this).toggleClass('nd_deep-horizon'); $(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');
});
}); });

View File

@@ -21,6 +21,13 @@
form_inputs.each(function() {device_form_state($(this))}); form_inputs.each(function() {device_form_state($(this))});
form_inputs.change(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 // handler for copy icon in search option
$('.nd_field-copy-icon').click(function() { $('.nd_field-copy-icon').click(function() {
var name = $(this).data('btn-for'); var name = $(this).data('btn-for');

View File

@@ -23,6 +23,8 @@
<script type="text/javascript" src="[% uri_base %]/javascripts/d3.min.js"></script> <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/toastr.js"></script>
<script type="text/javascript" src="[% uri_base %]/javascripts/jquery.floatThead.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"> <script type="text/javascript">
var uri_base = '[% uri_base %]'; var uri_base = '[% uri_base %]';

View File

@@ -31,6 +31,7 @@
<em class="muted">Seen within the date range:</em><br/> <em class="muted">Seen within the date range:</em><br/>
<input class="nd_side-input" id="daterange" <input class="nd_side-input" id="daterange"
type="text" name="daterange" value="[% params.daterange | html_entity %]"/> type="text" name="daterange" value="[% params.daterange | html_entity %]"/>
</div>
</fieldset> </fieldset>
<fieldset> <fieldset>
@@ -72,27 +73,3 @@
<button id="[% report.tag %]_submit" type="submit" class="btn btn-info"> <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> <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>

View File

@@ -38,6 +38,20 @@
<span class="nd_searchcheckbox uneditable-input">Partial Name</span> <span class="nd_searchcheckbox uneditable-input">Partial Name</span>
</label> </label>
</div> </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"> <div class="clearfix">
<em class="muted">MAC address format:</em><br/> <em class="muted">MAC address format:</em><br/>
<select id="nd_node-mac-format" name="mac_format"> <select id="nd_node-mac-format" name="mac_format">
@@ -48,3 +62,4 @@
</div> </div>
<button id="[% tab.tag %]_submit" type="submit" class="btn btn-info"> <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> <i class="icon-search icon-large pull-left nd_navbar-icon"></i> Search Nodes</button>