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