55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| package App::Netdisco::DB::Result::Virtual::SubnetUtilization;
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| use utf8;
 | |
| use base 'DBIx::Class::Core';
 | |
| 
 | |
| __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 net as subnet,
 | |
|          power(2, (32 - masklen(net))) as subnet_size,
 | |
|          count(DISTINCT ip) as active,
 | |
|          round(100 * count(DISTINCT ip) / (power(2, (32 - masklen(net))))) as percent
 | |
|     FROM (
 | |
|       SELECT DISTINCT net, ni.ip
 | |
|         FROM subnets s1, node_ip ni
 | |
|         WHERE s1.net <<= ?::cidr
 | |
|               AND ni.ip <<= s1.net
 | |
|               AND ((
 | |
|                 ni.time_first IS null
 | |
|                 AND ni.time_last IS null
 | |
|               ) OR (
 | |
|                 ni.time_last >= ?
 | |
|                 AND ni.time_last <= ?
 | |
|               ))
 | |
|               AND s1.last_discover >= ?
 | |
|       UNION
 | |
|       SELECT DISTINCT net, di.alias as ip
 | |
|         FROM subnets s2, device_ip di JOIN device d USING (ip)
 | |
|         WHERE s2.net <<= ?::cidr
 | |
|               AND di.alias <<= s2.net
 | |
|               AND s2.last_discover >= ?
 | |
|               AND d.last_discover >= ?
 | |
|     ) as joined
 | |
|     GROUP BY net
 | |
|     ORDER BY percent ASC
 | |
| ENDSQL
 | |
| 
 | |
| __PACKAGE__->add_columns(
 | |
|   "subnet",
 | |
|   { data_type => "cidr", is_nullable => 0 },
 | |
|   "subnet_size",
 | |
|   { data_type => "integer", is_nullable => 0 },
 | |
|   "active",
 | |
|   { data_type => "integer", is_nullable => 0 },
 | |
|   "percent",
 | |
|   { data_type => "integer", is_nullable => 0 },
 | |
| );
 | |
| 
 | |
| 1;
 |