sanity check ip inventory subnet, and fix SQL::Abstract glitching on the CidrIps query
This commit is contained in:
@@ -11,15 +11,17 @@ __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
|
||||
__PACKAGE__->table('cidr_ips');
|
||||
__PACKAGE__->result_source_instance->is_virtual(1);
|
||||
__PACKAGE__->result_source_instance->view_definition(<<'ENDSQL');
|
||||
SELECT host(network (cidr) + sub.int)::inet AS ip, NULL::text AS dns,
|
||||
NULL::timestamp AS time_first, NULL::timestamp AS time_last, false::boolean AS active
|
||||
FROM
|
||||
( SELECT cidr, generate_series(1, broadcast(cidr) - (network(cidr)) - 1) AS int
|
||||
SELECT host(network (prefix) + sub.int)::inet AS ip,
|
||||
NULL::text AS dns,
|
||||
NULL::timestamp AS time_first,
|
||||
NULL::timestamp AS time_last,
|
||||
false::boolean AS active
|
||||
FROM (
|
||||
SELECT CASE WHEN family(cidr) = 4 THEN cidr
|
||||
ELSE '0.0.0.0/32'::inet
|
||||
END AS cidr
|
||||
FROM ( SELECT ?::inet AS cidr) AS input) AS addr
|
||||
SELECT prefix,
|
||||
generate_series(1, (broadcast(prefix) - network(prefix) - 1)) AS int
|
||||
FROM (
|
||||
SELECT ?::inet AS prefix
|
||||
) AS addr
|
||||
) AS sub
|
||||
ENDSQL
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ use Dancer::Plugin::DBIC;
|
||||
use Dancer::Plugin::Auth::Extensible;
|
||||
|
||||
use App::Netdisco::Web::Plugin;
|
||||
use NetAddr::IP::Lite ':lower';
|
||||
|
||||
register_report(
|
||||
{ category => 'IP',
|
||||
@@ -37,6 +38,9 @@ get '/ajax/content/report/ipinventory' => require_login sub {
|
||||
# Default to something simple with no results to prevent
|
||||
# "Search failed!" error
|
||||
my $subnet = param('subnet') || '0.0.0.0/32';
|
||||
$subnet = NetAddr::IP::Lite->new($subnet);
|
||||
$subnet = NetAddr::IP::Lite->new('0.0.0.0/32')
|
||||
if (! $subnet) or ($subnet->addr eq '0.0.0.0');
|
||||
|
||||
my $age = param('age_on') || '0';
|
||||
my $agenot = param('age_invert') || '0';
|
||||
@@ -91,9 +95,11 @@ get '/ajax/content/report/ipinventory' => require_login sub {
|
||||
my $rs_union = $rs1->union( [ $rs2, $rs3 ] );
|
||||
|
||||
if ( $never ) {
|
||||
$subnet = NetAddr::IP::Lite->new('0.0.0.0/32') if ($subnet->bits ne 32);
|
||||
|
||||
my $rs4 = schema('netdisco')->resultset('Virtual::CidrIps')->search(
|
||||
undef,
|
||||
{ bind => [ $subnet ],
|
||||
{ bind => [ $subnet->cidr ],
|
||||
columns => [qw( ip time_first time_last dns active)],
|
||||
'+select' => [ \'false AS node', \'age(time_last) AS age' ],
|
||||
'+as' => [ 'node', 'age' ],
|
||||
@@ -104,7 +110,7 @@ get '/ajax/content/report/ipinventory' => require_login sub {
|
||||
}
|
||||
|
||||
my $rs_sub = $rs_union->search(
|
||||
{ ip => { '<<' => $subnet } },
|
||||
{ ip => { '<<' => $subnet->cidr } },
|
||||
{ order_by => [qw( ip time_last )],
|
||||
select => [
|
||||
\'DISTINCT ON (ip) ip',
|
||||
|
||||
Reference in New Issue
Block a user