# ./sw-name-mac.sh
# usage: NAME_MAC=/dev/shm/file-with-name-space-mac sbw-parse.pl [optional-switch-snmpbulkwalk-dump]
+#
+# cat /dev/shm/neighbors.tab | grep MikroTik | tee /dev/stderr | awk '{ print $7 "_" $8 " " $3 }' > /tmp/name-mac
+# NAME_MAC=/tmp/name-mac ./sbw-parse.pl
use Data::Dump qw(dump);
my @cols = qw( ifName ifHighSpeed ifAdminStatus ifOperStatus ifType dot1dStpPortPathCost ifAlias );
+my @name_mac_files = ( qw( /dev/shm/sw-name-mac /dev/shm/wap-name-mac ), $ENV{NAME_MAC}, glob '/dev/shm/name-mac*' );
my $mac2name;
-foreach my $name_mac ( qw( /dev/shm/sw-name-mac /dev/shm/wap-name-mac ), $ENV{NAME_MAC} ) {
+foreach my $name_mac ( @name_mac_files ) {
next unless -e $name_mac;
open(my $f, '<'. $name_mac);
+ my $count = 0;
while(<$f>) {
chomp;
#my ( $ip, $name, $mac ) = split(/ /,$_);
my ( $name, $mac ) = split(/ /,$_);
$mac = lc($mac);
$mac2name->{$mac} = $name;
+ $count++;
}
+ warn "## $name_mac $count";
}
sub mac2name {
if ( m/::(sysName|sysLocation|ipDefaultTTL|dot1dStpPriority|dot1dStpTopChanges|dot1dStpDesignatedRoot|dot1dStpRootCost|dot1dStpRootPort|dot1qNumVlans)\./ ) {
my ( undef, $v ) = split(/ = \w+: /,$_,2);
$sw->{$name}->{$1} = $v;
- } elsif ( m/::(ifMtu|ifHighSpeed)\[(\d\d?)\] = (?:INTEGER|Gauge32): (\d+)/ ) {
+ } elsif ( m/::(ifMtu|ifHighSpeed|ifSpeed)\[(\d\d?)\] = (?:INTEGER|Gauge32): (\d+)/ ) {
$sw->{$name}->{$1}->[$2] = $3;
+ # Dell PowerConnect 5548 doeesn't have ifHighSpeed
+ if ( $1 eq 'ifSpeed' && ! exists $sw->{$name}->{'ifHighSpeed'}->[$2] ) {
+ $sw->{$name}->{'ifHighSpeed'}->[$2] = $3 / 1_000_000;
+ }
} elsif ( m/::(ifPhysAddress)\[(\d\d?)\] = STRING: ([0-9a-f:]+)/ ) {
$sw->{$name}->{$1}->[$2] = fix_mac($3);
- } elsif ( m/::(ifName|ifAlias)\[(\d\d?)\] = STRING: (.+)/ ) {
+ } elsif ( m/::(ifDescr|ifName|ifAlias)\[(\d\d?)\] = STRING: (.+)/ ) {
$sw->{$name}->{$1}->[$2] = $3;
if ( $1 eq 'ifName' ) {
my ( $if_name, $port ) = ($3,$2);
- $sw->{$name}->{port_name_to_number}->{$3} = $2;
+ $sw->{$name}->{port_name_to_number}->{$if_name} = $port;
+ }
+ if ( $1 eq 'ifDescr' ) { # some switches miss ifName
+ my ( $if_name, $port ) = ($3,$2);
+ $if_name =~ s/gigabitethernet/ge/;
+ $if_name =~ s/tengigabitethernet/te/;
+ $sw->{$name}->{'ifName'}->[$port] = $if_name
+ if ( ! exists $sw->{name}->{'ifName'} );
+ $sw->{$name}->{port_name_to_number}->{$if_name} = $port
+ if ( ! exists $sw->{$name}->{port_name_to_number}->{$if_name} );
}
} elsif ( m/::(ifAdminStatus|ifOperStatus|ifType|dot3StatsDuplexStatus)\[(\d\d?)\] = INTEGER: (\w+)\(/ ) {
$sw->{$name}->{$1}->[$2] = $3;
}
warn "# sw $name = ",dump($sw->{$name}) if $debug;
- foreach my $port ( 1 .. $#{ $sw->{$name}->{ifName} } ) {
+ foreach my $port ( 1 .. $#{ $sw->{$name}->{ifDescr} } ) {
print "$name $port";
foreach my $oid ( @cols ) {
if ( $oid eq 'ifAlias' ) {
print "# gv = ",dump( $gv );
-open(my $dot_fh, '>', '/tmp/network.dot');
+open(my $dot_fh, '>', '/dev/shm/network.dot');
print $dot_fh qq|
digraph topology {
graph [ rankdir = LR ]
warn "SKIP same switch $sw1 == $sw2\n";
next;
}
- push @{ $node->{$sw1} }, [ $p1, $sw2 ];
+ #push @{ $node->{$sw1} }, [ $p1, $sw2 ];
foreach my $p2 ( keys %{ $gv->{$sw1}->{$p1}->{$sw2} } ) {
push @edges, [ $sw1, $sw2, $p1, $p2 ];
- #push @{ $node->{$sw2} }, [ $p2, $sw1 ];
+ ##push @{ $node->{$sw2} }, [ $p2, $sw1 ];
+ push @{ $node->{$sw1} }, [ $p1, $sw2, $p2 ];
}
}
}
my @port_sw =
sort { $a->[0] <=> $b->[0] }
@{ $node->{$n} };
- print $dot_fh qq!"$n" [ label="!.uc($n).'|' . join('|', map { sprintf "<%d>%2d %s", $_->[0], $_->[0], $_->[1] } @port_sw ) . qq!" ];\n!;
+ print $dot_fh qq!"$n" [ label="!.uc($n).'|' . join('|', map {
+ sprintf "<%d>%2d %s%s", $_->[0], $_->[0], $_->[1], $_->[2] eq 'no_port' ? '' : ' ' . $_->[2]
+ } @port_sw ) . qq!" ];\n!;
}
foreach my $e ( @edges ) {
}
|;
-system "dot -Tsvg /tmp/network.dot > /var/www/network.svg";
+system "dot -Tsvg /dev/shm/network.dot > /var/www/network.svg";
+system 'git -C /dev/shm commit -m $( date +%Y-%m-%d ) network.dot' if ! $debug;