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
|
* [#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]
|
||||||
|
|
||||||
|
|||||||
@@ -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'},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
@@ -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 %]';
|
||||||
|
|||||||
@@ -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>
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user