aboutsummaryrefslogtreecommitdiffstats
path: root/clients/build-linknets.pl
diff options
context:
space:
mode:
Diffstat (limited to 'clients/build-linknets.pl')
-rwxr-xr-xclients/build-linknets.pl128
1 files changed, 0 insertions, 128 deletions
diff --git a/clients/build-linknets.pl b/clients/build-linknets.pl
deleted file mode 100755
index 015e006..0000000
--- a/clients/build-linknets.pl
+++ /dev/null
@@ -1,128 +0,0 @@
-#! /usr/bin/perl
-
-# sesse testing
-
-use strict;
-use warnings;
-use lib '../include';
-use nms;
-use Net::CIDR;
-
-my $dbh = nms::db_connect();
-
-my $coregws = $dbh->prepare("SELECT switch, ip, community, sysname FROM switches WHERE sysname NOT LIKE 'e%' and sysname NOT LIKE 'sw%creativia%' AND sysname NOT LIKE 'sw%crew'")
- or die "Can't prepare query: $!";
-$coregws->execute;
-
-my %switch_id = (); # sysname -> switch database ID
-my %loopbacks = (); # sysname -> primary address
-my %loop_ipv6 = (); # sysname -> primary address
-my %map = (); # CIDR -> (sysname,ip)*
-my %lldpneigh = (); # sysname -> sysname -> 1
-
-while (my $ref = $coregws->fetchrow_hashref) {
- my $sysname = $ref->{'sysname'};
- $switch_id{$sysname} = $ref->{'switch'};
-
- print "$sysname...\n";
- my $snmp;
- eval {
- $snmp = nms::snmp_open_session($ref->{'ip'}, $ref->{'community'});
- };
- warn $@ if $@;
- next if not $snmp;
-
- my $routes = $snmp->gettable('ipCidrRouteTable');
- my $ifs = $snmp->gettable('ifTable');
- my $addrs = $snmp->gettable('ipAddrTable');
- my $lldp = $snmp->gettable('lldpRemTable');
- my $ipaddresstable = $snmp->gettable('ipAddressTable');
-
- # Find all direct routes we have, and that we also have an address in.
- # These are our linknet candidates.
- for my $route (values %$routes) {
- next if ($route->{'ipCidrRouteMask'} eq '255.255.255.255');
- next if ($route->{'ipCidrRouteNextHop'} ne '0.0.0.0');
- my $cidr = Net::CIDR::addrandmask2cidr($route->{'ipCidrRouteDest'}, $route->{'ipCidrRouteMask'});
-
- for my $addr (values %$addrs) {
- my $ip = $addr->{'ipAdEntAddr'};
- if (Net::CIDR::cidrlookup($ip, $cidr)) {
- push @{$map{$cidr}}, [ $sysname, $ip ];
- }
- }
- }
-
- # Find the first loopback address.
- my %loopbacks_this_switch = ();
- for my $addr (values %$addrs) {
- my $ifdescr = $ifs->{$addr->{'ipAdEntIfIndex'}}->{'ifDescr'};
- next unless $ifdescr =~ /^Loop/;
- $loopbacks_this_switch{$ifdescr} = $addr->{'ipAdEntAddr'};
- }
- for my $if (sort keys %loopbacks_this_switch) {
- $loopbacks{$sysname} = $loopbacks_this_switch{$if};
- last;
- }
-
- my %loopbacks_ipv6_this_switch = ();
- for my $addr (values %$ipaddresstable) {
- next if not $addr->{'ipAddressAddrType'} == 2; # Only IPv6 addresses please.
- my $ifdescr = $ifs->{$addr->{'ipAddressIfIndex'}}->{'ifDescr'};
- next unless $ifdescr =~ /^Loop/;
- $loopbacks_ipv6_this_switch{$ifdescr} = nms::convert_ipv6( $addr->{'ipAddressAddr'} );
- }
- for my $if (sort keys %loopbacks_ipv6_this_switch) {
- $loop_ipv6{$sysname} = $loopbacks_ipv6_this_switch{$if};
- last;
- }
-
- # Find all LLDP neighbors.
- for my $neigh (values %$lldp) {
- $lldpneigh{lc($sysname)}{lc($neigh->{'lldpRemSysName'})} = 1;
- }
-}
-
-# print Dumper(\%switch_id);
-# print Dumper(\%map);
-# print Dumper(\%loopbacks);
-# print Dumper(\%lldpneigh);
-
-$dbh->{AutoCommit} = 0;
-$dbh->{RaiseError} = 1;
-
-# Update the switches we have loopback addresses fora
-while (my ($sysname, $ip) = each %loopbacks) {
- $dbh->do('UPDATE switches SET ip=? WHERE sysname=?',
- undef, $ip, $sysname);
-}
-while (my ($sysname, $ipv6) = each %loop_ipv6) {
- $dbh->do('UPDATE switches SET secondary_ip=? WHERE sysname=?',
- undef, $ipv6, $sysname);
-}
-
-# Now go through each linknet candidate, and see if we can find any
-# direct LLDP neighbors.
-my $qexist = $dbh->prepare('SELECT COUNT(*) AS cnt FROM linknets WHERE switch1=? AND switch2=?');
-#$dbh->do('DELETE FROM linknets');
-while (my ($cidr, $devices) = each %map) {
- for (my $i = 0; $i < scalar @$devices; ++$i) {
- my $device_a = $devices->[$i];
- for (my $j = $i + 1; $j < scalar @$devices; ++$j) {
- my $device_b = $devices->[$j];
- next if $device_a->[0] eq $device_b->[0];
- next unless exists($lldpneigh{lc($device_a->[0])}{lc($device_b->[0])});
-
- my $switch_a = $switch_id{$device_a->[0]};
- my $switch_b = $switch_id{$device_b->[0]};
- my $ref = $dbh->selectrow_hashref($qexist, undef, $switch_a, $switch_b);
- next if ($ref->{'cnt'} != 0);
-
- $dbh->do('INSERT INTO linknets (switch1, addr1, switch2, addr2) VALUES (?,?,?,?)',
- undef,
- $switch_a, $device_a->[1],
- $switch_b, $device_b->[1]);
- }
- }
-}
-$dbh->commit;