From c4e4bd7633f9a3e9bed8c42c1694205708f35818 Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Tue, 9 Aug 2022 10:19:05 +0100 Subject: [PATCH] add option to limit snmp node search to current device only --- lib/App/Netdisco/Web/Plugin/Device/SNMP.pm | 52 +++++++++++----------- share/views/ajax/device/snmp.tt | 43 +++++++++++------- 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/lib/App/Netdisco/Web/Plugin/Device/SNMP.pm b/lib/App/Netdisco/Web/Plugin/Device/SNMP.pm index a352a7b9..decff052 100644 --- a/lib/App/Netdisco/Web/Plugin/Device/SNMP.pm +++ b/lib/App/Netdisco/Web/Plugin/Device/SNMP.pm @@ -54,18 +54,19 @@ ajax '/ajax/data/device/:ip/snmptree/:base' => require_login sub { to_json $items; }; -# TODO add form option for limiting to this device, so leave :ip -ajax '/ajax/data/device/:ip/typeahead' => require_login sub { - my $device = try { schema('netdisco')->resultset('Device') - ->find( param('ip') ) } - or send_error('Bad Device', 404); - +ajax '/ajax/data/snmp/typeahead' => require_login sub { my $term = param('term') or return to_json []; - $term = '%'. $term .'%'; - my @found = schema('netdisco')->resultset('SNMPObject') - ->search({ leaf => { -ilike => $term } }, - { rows => 25, columns => 'leaf' }) + my $device = param('ip'); + my $deviceonly = param('deviceonly'); + my $table = ($deviceonly ? 'DeviceBrowser' : 'SNMPObject'); + + my @found = schema('netdisco')->resultset($table) + ->search({ -or => [ oid => $term, + oid => { -like => ($term .'.%') }, + leaf => { -ilike => ('%'. $term .'%') } ], + (($deviceonly and $device) ? (ip => $device) : ()), }, + { rows => 25, columns => 'leaf', order_by => 'oid_parts' }) ->get_column('leaf')->all; return to_json [] unless scalar @found; @@ -73,25 +74,24 @@ ajax '/ajax/data/device/:ip/typeahead' => require_login sub { to_json [ sort @found ]; }; -# TODO add form option for limiting to this device, so leave :ip -ajax '/ajax/data/device/:ip/snmpnodesearch' => require_login sub { - my $device = try { schema('netdisco')->resultset('Device') - ->find( param('ip') ) } - or send_error('Bad Device', 404); - - my $to_match = param('str'); +ajax '/ajax/data/snmp/nodesearch' => require_login sub { + my $to_match = param('str') or return to_json []; my $partial = param('partial'); - my $excludeself = param('excludeself'); - return to_json [] unless $to_match or length($to_match); - $to_match = $to_match . '%' if $partial; my $found = undef; - - my $op = ($partial ? '-ilike' : '='); - $found = schema('netdisco')->resultset('SNMPObject') - ->search({ -or => [ oid => { $op => $to_match }, leaf => { $op => $to_match } ] }, - { rows => 1, order_by => 'oid_parts' })->first; - + if ($partial) { + $found = schema('netdisco')->resultset('SNMPObject') + ->search({ -or => [ oid => $to_match, + oid => { -like => ($to_match .'.%') }, + leaf => { -ilike => ($to_match .'%') } ] }, + { rows => 1, order_by => 'oid_parts' })->first; + } + else { + $found = schema('netdisco')->resultset('SNMPObject') + ->search({ -or => [ oid => $to_match, + leaf => $to_match ] }, + { rows => 1, order_by => 'oid_parts' })->first; + } return to_json [] unless $found; $found = $found->oid; diff --git a/share/views/ajax/device/snmp.tt b/share/views/ajax/device/snmp.tt index 2662e897..b6fe6404 100644 --- a/share/views/ajax/device/snmp.tt +++ b/share/views/ajax/device/snmp.tt @@ -3,15 +3,20 @@
-
- - - - - + + + + + + + + + Only this device + +
@@ -73,7 +78,7 @@ var name = node.text.toLowerCase(); var oid = node.id.toLowerCase(); - if (document.getElementById('snmpPartialSearch').checked) { + if (document.getElementById('nd_snmp_search_partial').checked) { if ((name.indexOf(pattern) == 0) || (oid.indexOf(pattern) == 0)) { return true; } @@ -103,10 +108,9 @@ 'plugins': ['search'], 'search': { 'ajax' : { - 'url' : '[% uri_base | none %]/ajax/data/device/[% device %]/snmpnodesearch', + 'url' : '[% uri_base | none %]/ajax/data/snmp/nodesearch', 'beforeSend' : function(jqXHR, settings) { - settings.url = settings.url + '&excludeself=on'; - if (document.getElementById('snmpPartialSearch').checked) { + if (document.getElementById('nd_snmp_search_partial').checked) { settings.url = settings.url + '&partial=on'; } return true; @@ -138,12 +142,17 @@ document.getElementById( parent ).scrollIntoView(); } }); - $("#searchTreeForm").submit(function(e) { - $("#jstree").jstree("search", $("#treeSearchText").val()); + $("#nd_snmp_search_form").submit(function(e) { + $("#jstree").jstree("search", $("#nd_snmp_search_text").val()); e.preventDefault(); }); - $('#treeSearchText').autocomplete({ - source: uri_base + '/ajax/data/device/[% device %]/typeahead' + $('#nd_snmp_search_text').autocomplete({ + source: function (request, response) { + var query = $('.nd_snmp_search_param').serialize(); + return $.get( uri_base + '/ajax/data/snmp/typeahead', query, function (data) { + return response(data); + }); + } ,delay: 150 ,minLength: 2 });