IP Inventory

<% $err %> % $m->comp('SELF:show_age') if $cmd eq 'age';
IPs not used in : Sort By :
Subnet :
(CIDR Format : 192.168.0.0/24)
List IPs
Never Discovered :
>
Resolve IPs: >On >Off Limit :
Finds IP Addresses used by nodes.
To find IP addresses that have never been used in a subnet, select "12 Years" and Check the Checkbox.

Netbios Inventory

% $m->comp('SELF:show_nbt') if $cmd eq 'nbt';
Domain:
Archive Data: >
[ Reset ]
<%args> $subnet => '' $sort => 'IP' $age_val => 2 $age_mul => 'months' $cmd => '' $max => 200 @domain => () $archive => 0 $never => 0 $dns => 1 <%shared> my @sorts = qw/IP Age/; my ($ips,$arg_sort,$odd,$arg_max,$arg_domain,$addrs,$err); my $nodes = []; my $domain_count = {}; my $nbt_domains={}; my $domain = $netdisco::CONFIG{domain} || ''; <%init> $arg_sort = $sort; $arg_max = $max; $arg_domain = \@domain; # get some form filler $nbt_domains = sql_column('node_nbt',['distinct(domain)','true']); delete $nbt_domains->{''}; if ($cmd eq 'age' and !$subnet){ $err = "Subnet Required."; $cmd = ''; } if ($cmd eq 'age'){ $age_val = 2 unless $age_val =~ m/^\d+$/; $age_mul =~ s/[^a-z ]+//g; my $where = {'age(now(),time_last)' => \\">= interval '$age_val $age_mul'"}; $subnet .= '/24' unless $subnet =~ /\//; my $safenet = dbh_quote($subnet); $where->{ip} = \\"<< inet $safenet"; $where->{active} = \'true'; # Grab all active node_ip rows in this subnet that are x old $ips = sql_rows('node_ip',['age(now(),time_last) as age','extract(epoch from time_first) as time_first', 'extract(epoch from time_last) as time_last','ip','active'], $where ); # Find all active IPs my $active_ips = sql_rows('node_ip',['distinct(ip)'],{'ip' => \\"<< inet $safenet", 'active' => \'true'}); my @active_ips = map { $_->{ip} } @$active_ips; # Find IPs that are not active but still in subnet if (scalar @active_ips){ $active_ips[0] = "!$active_ips[0]"; # Question: Is there any limit to IN (LIST) with DBD::Pg / Postgres? $where = {'ip' => [\\"<< inet $safenet",[@active_ips]], active => \'false' }; } else { $where = {'ip' => \\"<< inet $safenet", active => \'false' }; } my $archive_ips = sql_rows('node_ip',['age(now(),time_last) as age','extract(epoch from time_first) as time_first', 'extract(epoch from time_last) as time_last','ip','active'], $where ); # Find the newest archived data my %seen; my %results; foreach my $r (@$archive_ips){ my $ip = $r->{ip}; # First entry unless (defined $results{$ip} ){ $results{$ip}=$r; $seen{$ip}=$r->{time_last}; next; } next unless $r->{time_last} > $seen{$ip}; $results{$ip}=$r; $seen{$ip}=$r->{time_last}; } push (@$ips,values %results); # Look for holes in our IP Space and report on that. if ($never){ # Get all the possible IPs in a subnet $addrs = dump_subnet($subnet) || {}; # Remove all the nodes seen in the subnet my $nodes_seen = sql_rows('node_ip',['distinct(ip)'], { 'ip' => \\"<< inet $safenet"}); foreach my $row (@$nodes_seen){ my $ip = $row->{ip}; delete $addrs->{$ip}; } # Remove all the device / aliases seen my $devs_seen = sql_rows('device', ['distinct(ip)'], { 'ip' => \\"<< inet $safenet"}); my $aliases = sql_rows('device_ip', ['distinct(alias)'], { 'alias' => \\"<< inet $safenet"}); push(@$devs_seen,@$aliases); foreach my $row (@$devs_seen){ my $ip = $row->{alias} || $row->{ip}; delete $addrs->{$ip}; } # Add our missing IPs to the results from above. foreach my $ip (keys %$addrs){ push @$ips, { 'age' => 'Never', 'time_first' => 'Never', 'ip' => $ip, 'active' => 1, 'time_last' => 'Never', }; } } # Do DNS lookups on results if ($dns){ foreach my $i (@$ips){ my $ip = $i->{ip}; $i->{dns} = hostname($ip); } } } if ($cmd eq 'nbt'){ my $where = {}; foreach my $d (@domain) { $d = '' if $d eq 'blank'; } if (grep(/^all$/,@domain)){ @domain = (); } else { $where = {'domain' => [[@domain]]}; } $where->{active} = 1 unless $archive; $nodes = sql_rows('node_nbt',['ip','mac','nbname','domain','server','nbuser','active', 'extract(epoch from time_first) as time_first','extract(epoch from time_last) as time_last'], $where); # count domains foreach my $n (@$nodes){ my $d = $n->{domain}; $domain_count->{$d}++; } } %# %# show_nbt() - Show results from Netbios Search %# <%method show_nbt>

Results

% unless (scalar @$nodes) { No Results Found. % return; } % my $cnt = 0; % foreach my $d (sort keys %$domain_count){ % $cnt++; % if ($cnt%2){ %} % if (($cnt+1)%2) { %} %}
Domain Count Domain Count
<%$d || '[Blank]'%> <%$domain_count->{$d}%>
<% scalar(keys %$domain_count) %> Domains.

% my $last_domain = ''; % foreach my $n (sort {($a->{domain} cmp $b->{domain}) or % (lc($a->{nbname}) cmp lc($b->{nbname}) )} % @$nodes){ % $last_domain = $n->{domain}; % }
Domain Node Name User First Seen Last Seen
<%$last_domain ne $n->{domain} ? $n->{domain} : ' '%> <%$n->{mac}%> <%$n->{domain} ? "\\\\$n->{domain}\\" : '' %><%$n->{nbname} || '[None]'%> <%$n->{nbuser} || '[No User]' %> @ <%$n->{ip}%> <& 'node.html:format_date', date=>$n->{time_first}&> <& 'node.html:format_date', date=>$n->{time_last}&>
<% scalar(@$nodes) %> Nodes.

%# %# show_age() - Show results from IP age inventory %# <%method show_age>

Results

% unless (scalar @$ips) { No Results Found. % return; } <%perl> my @rows; if ($arg_sort eq 'Age'){ @rows = sort { $a->{time_last} <=> $b->{time_last} } @$ips; } else { @rows = sort sort_ip @$ips; } # Truncate the list if too long (too many results) if (scalar @rows > $arg_max) { splice(@rows,$arg_max); $m->out("Found ".scalar(@$ips) ." matching IPs. Only showing $arg_max.
\n"); } foreach my $row (@rows){ my $ip = $row->{ip}; my $dns = $row->{dns} || ' '; $dns =~ s/\Q$domain\E//; my $age = $m->comp('device_inv.html:.trim_age', age => $row->{age}); my $time_first = scalar(localtime($row->{time_first})); my $active = $row->{active}; %}
Node Host Name Last Used First
Discovered
<%$ip%><%!$active ? '*' : ''%> <%$dns%><%!$active ? '*' : ''%> <%$age%><%!$active ? '*' : ''%> <%$time_first%>
<% scalar @rows %> IPs Shown.
* denotes archived data (not currently in use, but seen). <%method title> - Node Inventory \ %# $Id: ip_search.html,v 1.6 2004/11/08 18:07:08 maxbaker Exp $ %# vim:syntax=mason