added 60 s timeout for host/port to show only live ones
authorDobrica Pavlinusic <dpavlin@rot13.org>
Tue, 19 Jun 2018 13:10:42 +0000 (15:10 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Tue, 19 Jun 2018 13:10:42 +0000 (15:10 +0200)
syslog-count-link.pl

index 5d2baa2..26963cf 100755 (executable)
@@ -13,13 +13,15 @@ use strict;
 use Data::Dump qw(dump);
 use POSIX qw(strftime);
 
+my $timeout = $ENV{TIMEOUT} || 60; # forget switch after sec
+
 my $name = $0;
 $name =~ s/.*\/([^\/]+)$/$1/;
 $name =~ s/\.pl$//;
 my $dir = "/dev/shm/$name";
 mkdir $dir unless -e $dir;
 
-my $stat;
+our $stat;
 
 sub print_stats {
        open(my $fh, '>', "$dir/stats");
@@ -32,7 +34,12 @@ sub print_stats {
                        $a1 <=> $b1;
                } keys %{ $stat->{$host} } ) {
                        next if $port =~ m/^_/;
-                       my $out = sprintf "%s %s:%s %d\n", $host, $port, $stat->{$host}->{$port}, $stat->{$host}->{_count}->{$port};
+                       my $dt = time() - $stat->{$host}->{$port}->[0];
+                       if ( $dt > $timeout ) {
+                               delete $stat->{$host}->{$port};
+                               next;
+                       }
+                       my $out = sprintf "%-12s %-4s %-2d %s\n", $host, $port, $dt, $stat->{$host}->{$port}->[1];
                        print $out;
                        print $fh $out;
                }
@@ -61,6 +68,16 @@ warn "kill -HUP $$  # to dump stats\n";
        close($fh);
 }
 
+sub stat_host_port {
+       my ( $host, $port, $state ) = @_;
+       if ( ! exists $stat->{$host}->{$port} ) {
+               $stat->{$host}->{$port} = [-1, $state];
+       } else {
+               $stat->{$host}->{$port}->[1] .= $state;
+       }
+       $stat->{$host}->{$port}->[0] = time();
+       #warn "# stat_host_port ",dump($stat);
+}
 
 
 my $host_re = '[\w-]+';
@@ -78,36 +95,33 @@ while(<>) {
        ## Dell old
        if ( m/(\S+)\s%LINK-[IW]-(\w+):\s*(\w+)/ ) {
                my ($host,$state,$port) = ($1,$2,$3);
-               $stat->{$host}->{$port} .= substr($state,0,1);
-               $stat->{$host}->{_count}->{$port} += $state =~ m/Up/ ? 1 : -1;
+               stat_host_port( $host, $port, substr($state,0,1) );
        } elsif ( m/(\S+)\s%STP-W-PORTSTATUS:\s([\w\/]+): STP status (\w+)/ ) {
                my ($host,$port,$state) = ($1,$2,$3);
-               $stat->{$host}->{$port} .= '-';
-               $stat->{$host}->{_count}->{$port} += $state =~ m/F/ ? 1 : -1;
+               stat_host_port( $host, $port, '-' );
 
 
        ## Dell new
        } elsif ( m/LINK - (\w+) - Hostname: <($host_re)>, ($port_re)/ ) {
                my ($state, $host, $port ) = ($1,$2,$3);
-               $stat->{$host}->{$port} .= substr($state,0,1);
-               $stat->{$host}->{_count}->{$port} += $state =~ m/U/ ? 1 : -1;
+               stat_host_port( $host, $port, substr($state,0,1) );
        } elsif ( m/STP - PORTSTATUS - Hostname: <($host_re)>,($port_re): STP status (\w+)/ ) {
                my ($host,$port,$state) = ($1,$2,$3);
-               $stat->{$host}->{$port} .= '-';
-               $stat->{$host}->{_count}->{$port} += $state =~ m/F/ ? 1 : -1;
+               stat_host_port( $host, $port, '-' );
 
 
        ## Mikrotik
        } elsif ( m/($host_re) \w+: ([\w\-]+) link (\w+)/ ) {
                my ($host, $port, $state ) = ($1,$2,$3);
-               $stat->{$host}->{$port} .= substr($state,0,1);
-               $stat->{$host}->{_count}->{$port} += $state =~ m/U/i ? 1 : -1;
+               stat_host_port( $host, $port, substr($state,0,1) );
 
 
        } elsif ( m'==> /var/log/' ) {
                # ignore tail output
+               next;
        } else {
                warn "IGNORE: [$_]\n";
+               next;
        }
 
        if ( -e "$dir/dump" ) {