Merge branch 'master' into og-api-tokens-simple
This commit is contained in:
@@ -7,7 +7,7 @@ use Dancer::Plugin::Auth::Extensible;
|
||||
|
||||
use URI ();
|
||||
use URL::Encode 'url_params_mixed';
|
||||
use App::Netdisco::Util::Device 'match_devicetype';
|
||||
use App::Netdisco::Util::Device 'match_to_setting';
|
||||
|
||||
# build view settings for port connected nodes and devices
|
||||
set('connected_properties' => [
|
||||
@@ -20,7 +20,7 @@ hook 'before_template' => sub {
|
||||
my $tokens = shift;
|
||||
|
||||
# allow checking of discoverability of remote connected device
|
||||
$tokens->{has_snmp} = sub { not match_devicetype(shift, 'discover_no_type') };
|
||||
$tokens->{has_snmp} = sub { not match_to_setting(shift, 'discover_no_type') };
|
||||
|
||||
my $defaults = var('sidebar_defaults')->{'device_ports'}
|
||||
or return;
|
||||
|
||||
@@ -9,7 +9,7 @@ use App::Netdisco::Web::Plugin;
|
||||
use Path::Class 'file';
|
||||
use Safe;
|
||||
|
||||
use vars qw/$config @data/;
|
||||
our ($config, @data);
|
||||
|
||||
foreach my $report (@{setting('reports')}) {
|
||||
my $r = $report->{tag};
|
||||
|
||||
@@ -27,6 +27,8 @@ get '/ajax/content/admin/undiscoveredneighbors' => require_role admin => sub {
|
||||
# create a new row object to avoid hitting the DB in get_device()
|
||||
my $dev = schema('netdisco')->resultset('Device')->new({ip => $r->{remote_ip}});
|
||||
next unless is_discoverable( $dev, $r->{remote_type} );
|
||||
next if (not setting('discover_waps')) and $r->{remote_is_wap};
|
||||
next if (not setting('discover_phones')) and $r->{remote_is_phone};
|
||||
push @discoverable_results, $r;
|
||||
}
|
||||
return unless scalar @discoverable_results;
|
||||
|
||||
@@ -125,18 +125,13 @@ sub make_link_infostring {
|
||||
(my $left_name = lc($link->{left_dns} || $link->{left_name} || $link->{left_ip})) =~ s/$domain$//;
|
||||
(my $right_name = lc($link->{right_dns} || $link->{right_name} || $link->{right_ip})) =~ s/$domain$//;
|
||||
|
||||
if ($link->{aggports} == 1) {
|
||||
return sprintf '<b>%s:%s</b> (%s)<br><b>%s:%s</b> (%s)',
|
||||
$left_name, $link->{left_port}->[0],
|
||||
($link->{left_descr}->[0] || 'no description'),
|
||||
$right_name, $link->{right_port}->[0],
|
||||
($link->{right_descr}->[0] || 'no description');
|
||||
}
|
||||
else {
|
||||
return sprintf '<b>%s:(%s)</b><br><b>%s:(%s)</b>',
|
||||
$left_name, join(',', @{$link->{left_port}}),
|
||||
$right_name, join(',', @{$link->{right_port}});
|
||||
}
|
||||
my @zipped = List::MoreUtils::zip6
|
||||
@{$link->{left_port}}, @{$link->{left_descr}},
|
||||
@{$link->{right_port}}, @{$link->{right_descr}};
|
||||
|
||||
return join '<br><br>', map { sprintf '<b>%s:%s</b> (%s)<br><b>%s:%s</b> (%s)',
|
||||
$left_name, $_->[0], ($_->[1] || 'no description'),
|
||||
$right_name, $_->[2], ($_->[3] || 'no description') } @zipped;
|
||||
}
|
||||
|
||||
ajax '/ajax/data/device/netmap' => require_login sub {
|
||||
@@ -179,17 +174,6 @@ ajax '/ajax/data/device/netmap' => require_login sub {
|
||||
]) : ())
|
||||
}, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' });
|
||||
|
||||
if ($vlan) {
|
||||
$links = $links->search({
|
||||
-or => [
|
||||
{ 'left_vlans.vlan' => $vlan },
|
||||
{ 'right_vlans.vlan' => $vlan },
|
||||
],
|
||||
}, {
|
||||
join => [qw/left_vlans right_vlans/],
|
||||
});
|
||||
}
|
||||
|
||||
while (my $link = $links->next) {
|
||||
push @{$data{'links'}}, {
|
||||
FROMID => $link->{left_ip},
|
||||
@@ -217,10 +201,19 @@ ajax '/ajax/data/device/netmap' => require_login sub {
|
||||
join => 'throughput',
|
||||
})->with_times;
|
||||
|
||||
# filter by vlan for all or neighbors only
|
||||
if ($vlan) {
|
||||
$devices = $devices->search(
|
||||
{ 'vlans.vlan' => $vlan },
|
||||
{ join => 'vlans' }
|
||||
);
|
||||
}
|
||||
|
||||
DEVICE: while (my $device = $devices->next) {
|
||||
# if in neighbors or vlan mode then use %ok_dev to filter
|
||||
next DEVICE if (($mapshow eq 'neighbors') or $vlan)
|
||||
and (not $ok_dev{$device->ip});
|
||||
# if in neighbors mode then use %ok_dev to filter
|
||||
next DEVICE if ($device->ip ne $qdev->ip)
|
||||
and ($mapshow eq 'neighbors')
|
||||
and (not $ok_dev{$device->ip}); # showing only neighbors but no link
|
||||
|
||||
# if location picked then filter
|
||||
next DEVICE if ((scalar @lgrplist) and ((!defined $device->location)
|
||||
|
||||
@@ -25,25 +25,6 @@ get '/ajax/content/device/ports' => require_login sub {
|
||||
if ($f) {
|
||||
if (($prefer eq 'vlan') or (not $prefer and $f =~ m/^\d+$/)) {
|
||||
return unless $f =~ m/^\d+$/;
|
||||
|
||||
if (param('invert')) {
|
||||
$set = $set->search({
|
||||
'me.vlan' => { '!=' => $f },
|
||||
'port_vlans.vlan' => [
|
||||
'-or' => { '!=' => $f }, { '=' => undef }
|
||||
],
|
||||
}, { join => 'port_vlans' });
|
||||
}
|
||||
else {
|
||||
$set = $set->search({
|
||||
-or => {
|
||||
'me.vlan' => $f,
|
||||
'port_vlans.vlan' => $f,
|
||||
},
|
||||
}, { join => 'port_vlans' });
|
||||
}
|
||||
|
||||
return unless $set->count;
|
||||
}
|
||||
else {
|
||||
if (param('partial')) {
|
||||
@@ -120,7 +101,7 @@ get '/ajax/content/device/ports' => require_login sub {
|
||||
# now begin to join tables depending on the selected columns/options
|
||||
|
||||
# get vlans on the port
|
||||
# leave this query dormant (lazy) unless c_vmember is set
|
||||
# leave this query dormant (lazy) unless c_vmember is set or vlan filtering
|
||||
my $vlans = $set->search({}, {
|
||||
select => [
|
||||
'port',
|
||||
@@ -131,7 +112,7 @@ get '/ajax/content/device/ports' => require_login sub {
|
||||
group_by => 'me.port',
|
||||
});
|
||||
|
||||
if (param('c_vmember')) {
|
||||
if (param('c_vmember') or ($prefer eq 'vlan') or (not $prefer and $f =~ m/^\d+$/)) {
|
||||
$vlans = { map {(
|
||||
$_->port => {
|
||||
# DBIC smart enough to work out this should be an arrayref :)
|
||||
@@ -194,13 +175,37 @@ get '/ajax/content/device/ports' => require_login sub {
|
||||
# also get remote LLDP inventory if asked for
|
||||
$set = $set->with_remote_inventory if param('n_inventory');
|
||||
|
||||
# sort ports (empty set would be a 'no records' msg)
|
||||
my $results = [ sort { &App::Netdisco::Util::Web::sort_port($a->port, $b->port) } $set->all ];
|
||||
return unless scalar @$results;
|
||||
# run query
|
||||
my @results = $set->all;
|
||||
|
||||
# filter for tagged vlan using existing agg query,
|
||||
# which is better than join inflation
|
||||
if (($prefer eq 'vlan') or (not $prefer and $f =~ m/^\d+$/)) {
|
||||
if (param('invert')) {
|
||||
@results = grep {
|
||||
(!defined $_->vlan or $_->vlan ne $f)
|
||||
and
|
||||
(0 == scalar grep {defined and $_ ne $f} @{ $vlans->{$_->port}->{vlan_set} })
|
||||
} @results;
|
||||
}
|
||||
else {
|
||||
@results = grep {
|
||||
($_->vlan eq $f)
|
||||
or
|
||||
(scalar grep {defined and $_ eq $f} @{ $vlans->{$_->port}->{vlan_set} })
|
||||
} @results;
|
||||
}
|
||||
}
|
||||
|
||||
# sort ports
|
||||
@results = sort { &App::Netdisco::Util::Web::sort_port($a->port, $b->port) } @results;
|
||||
|
||||
# empty set would be a 'no records' msg
|
||||
return unless scalar @results;
|
||||
|
||||
if (request->is_ajax) {
|
||||
template 'ajax/device/ports.tt', {
|
||||
results => $results,
|
||||
results => \@results,
|
||||
nodes => $nodes_name,
|
||||
ips => $ips_name,
|
||||
device => $device,
|
||||
@@ -210,7 +215,7 @@ get '/ajax/content/device/ports' => require_login sub {
|
||||
else {
|
||||
header( 'Content-Type' => 'text/comma-separated-values' );
|
||||
template 'ajax/device/ports_csv.tt', {
|
||||
results => $results,
|
||||
results => \@results,
|
||||
nodes => $nodes_name,
|
||||
ips => $ips_name,
|
||||
device => $device,
|
||||
|
||||
36
lib/App/Netdisco/Web/Plugin/Device/Vlans.pm
Normal file
36
lib/App/Netdisco/Web/Plugin/Device/Vlans.pm
Normal file
@@ -0,0 +1,36 @@
|
||||
package App::Netdisco::Web::Plugin::Device::Vlans;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Dancer ':syntax';
|
||||
use Dancer::Plugin::Ajax;
|
||||
use Dancer::Plugin::DBIC;
|
||||
use Dancer::Plugin::Auth::Extensible;
|
||||
|
||||
use App::Netdisco::Web::Plugin;
|
||||
|
||||
register_device_tab({ tag => 'vlans', label => 'VLANs', provides_csv => 1 });
|
||||
|
||||
get '/ajax/content/device/vlans' => require_login sub {
|
||||
my $q = param('q');
|
||||
|
||||
my $device = schema('netdisco')->resultset('Device')
|
||||
->search_for_device($q) or send_error('Bad device', 400);
|
||||
my @results = $device->vlans->search( {}, { order_by => 'vlan' } )->hri->all;
|
||||
|
||||
return unless scalar @results;
|
||||
|
||||
if (request->is_ajax) {
|
||||
my $json = to_json( \@results );
|
||||
template 'ajax/device/vlans.tt', { results => $json },
|
||||
{ layout => undef };
|
||||
}
|
||||
else {
|
||||
header( 'Content-Type' => 'text/comma-separated-values' );
|
||||
template 'ajax/device/vlans_csv.tt', { results => \@results },
|
||||
{ layout => undef };
|
||||
}
|
||||
};
|
||||
|
||||
true;
|
||||
@@ -110,12 +110,12 @@ get '/ajax/content/report/ipinventory' => require_login sub {
|
||||
'ip', 'mac', 'dns', 'time_last', 'time_first',
|
||||
'active', 'node', 'age'
|
||||
],
|
||||
order_by => [{-asc => 'ip'}, {-desc => 'active'}],
|
||||
order_by => [{-asc => 'ip'}, {-desc => 'active'}, {-asc => 'node'}],
|
||||
}
|
||||
)->as_query;
|
||||
|
||||
my $rs;
|
||||
if ( $start && $end ) {
|
||||
if ( $start and $end ) {
|
||||
$start = $start . ' 00:00:00';
|
||||
$end = $end . ' 23:59:59';
|
||||
|
||||
|
||||
@@ -27,35 +27,48 @@ ajax '/ajax/content/search/node' => require_login sub {
|
||||
my @active = (param('archived') ? () : (-bool => 'active'));
|
||||
|
||||
my (@times, @wifitimes, @porttimes);
|
||||
if ($start and $end) {
|
||||
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 },
|
||||
time_first => [ undef ],
|
||||
time_last => [ { '<', $start }, { '>', $end } ]
|
||||
]);
|
||||
@wifitimes = (-or => [
|
||||
time_last => { '<', $start },
|
||||
time_last => { '>', $end },
|
||||
time_last => [ undef ],
|
||||
time_last => [ { '<', $start }, { '>', $end } ],
|
||||
]);
|
||||
@porttimes = (-or => [
|
||||
creation => { '<', $start },
|
||||
creation => { '>', $end },
|
||||
creation => [ undef ],
|
||||
creation => [ { '<', $start }, { '>', $end } ]
|
||||
]);
|
||||
}
|
||||
else {
|
||||
@times = (-and => [
|
||||
time_first => { '>=', $start },
|
||||
time_last => { '<=', $end },
|
||||
@times = (-or => [
|
||||
-and => [
|
||||
time_first => undef,
|
||||
time_last => undef,
|
||||
],
|
||||
-and => [
|
||||
time_last => { '>=', $start },
|
||||
time_last => { '<=', $end },
|
||||
],
|
||||
]);
|
||||
@wifitimes = (-and => [
|
||||
time_last => { '>=', $start },
|
||||
time_last => { '<=', $end },
|
||||
@wifitimes = (-or => [
|
||||
time_last => undef,
|
||||
-and => [
|
||||
time_last => { '>=', $start },
|
||||
time_last => { '<=', $end },
|
||||
],
|
||||
]);
|
||||
@porttimes = (-and => [
|
||||
creation => { '>=', $start },
|
||||
creation => { '<=', $end },
|
||||
@porttimes = (-or => [
|
||||
creation => undef,
|
||||
-and => [
|
||||
creation => { '>=', $start },
|
||||
creation => { '<=', $end },
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ ajax '/ajax/data/port/typeahead' => require_login sub {
|
||||
if $port;
|
||||
|
||||
my $results = [
|
||||
map {{ label => (sprintf "%s (%s)", $_->port, $_->name), value => $_->port }}
|
||||
map {{ label => (sprintf "%s (%s)", $_->port, ($_->name || '')), value => $_->port }}
|
||||
sort { &App::Netdisco::Util::Web::sort_port($a->port, $b->port) } $set->all
|
||||
];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user