remove interface
[dell-switch] / sbw-parse.pl
index ca540b9..7d4997d 100755 (executable)
@@ -6,6 +6,9 @@ use autodie;
 # ./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);
 
@@ -15,18 +18,25 @@ my $debug = $ENV{DEBUG} || 0;
 
 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;
+my $mac_name_use;
 
-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(/ /,$_);
+               $name =~ s/_/ /g;       # replace underscore with space
                $mac = lc($mac);
                $mac2name->{$mac} = $name;
+               $mac_name_use->{$name} = 0;
+               $count++;
        }
+       warn "## $name_mac $count";
 }
 
 sub mac2name {
@@ -257,11 +267,11 @@ fake_gv( 'sw-b101' => 24, 'sw-rack1' => 48 );
 
 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 ]
-node [ shape = record ]
+node [ shape = record; fontname="Helvetica" ]
 edge [ color = "gray" ]
 |;
 
@@ -285,23 +295,52 @@ foreach my $sw1 ( sort keys %$gv ) {
        }
 }
 
-foreach my $n ( keys %$node ) {
+foreach my $n ( sort keys %$node ) {
        no warnings;
        my @port_sw =
-               sort { $a->[0] <=> $b->[0] }
+               sort { join(' ',@$a) <=> join(' ',@$b) }
                @{ $node->{$n} };
        print $dot_fh qq!"$n" [ label="!.uc($n).'|' . join('|', map {
+               $mac_name_use->{$_->[1]}++;
                sprintf "<%d>%2d %s%s", $_->[0], $_->[0], $_->[1], $_->[2] eq 'no_port' ? '' : ' ' . $_->[2]
        } @port_sw ) . qq!" ];\n!;
 }
 
-foreach my $e ( @edges ) {
+foreach my $e ( sort { join(' ',@$a) cmp join(' ', @$b) } @edges ) {
        no warnings;
-       print $dot_fh sprintf qq{ "%s":%d -> "%s":%d\n}, $e->[0], $e->[2], $e->[1], $e->[3];
+       if ( $e->[3] == 0 ) {
+               #print $dot_fh sprintf qq{ "%s":%d -> "%s"\n}, $e->[0], $e->[2], $e->[1];
+       } else {
+               print $dot_fh sprintf qq{ "%s":%d -> "%s":%d\n}, $e->[0], $e->[2], $e->[1], $e->[3];
+       }
+}
+
+sub git_commit {
+       return if $debug;
+       my $file = shift;
+       $file =~ s{/dev/shm/}{} && warn "## git_commit $file";
+       system qq{git -C /dev/shm add -f $file && git -C /dev/shm commit -m "\$( date +%Y-%m-%d ) $file" $file };
 }
 
+warn "## mac_name_use ",dump( $mac_name_use );
+
+my @mac_name_use_zero = sort grep { $mac_name_use->{$_} == 0 } keys %$mac_name_use;
+warn "# mac_name_use_zero=",dump( \@mac_name_use_zero );
+open(my $zero_fh, '>', '/dev/shm/mac_name_use.0');
+print $zero_fh "$_\n" foreach map {
+       s/^\w+\s//; $_; # remote msw_ prefix and leave only mac
+} @mac_name_use_zero;
+close($zero_fh);
+git_commit 'mac_name_use.0';
+
 print $dot_fh qq|
 }
 |;
+close($dot_fh);
+git_commit 'network.dot';
+
+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;
 
-system "dot -Tsvg /tmp/network.dot > /var/www/network.svg";
+warn "# strange neihbours:";
+system "grep -f /dev/shm/mac_name_use.0 /dev/shm/neighbors.tab";