filter log/ filenames into sw.command
[dell-switch] / vlan-ports.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use autodie;
5 use Data::Dump qw(dump);
6
7 # ./vlan-ports.pl ./log/*sw-{dpc,e300}*vlan* | less
8
9 my @logs = @ARGV;
10
11 my $stat;
12
13 foreach my $log ( @logs ) {
14         open(my $log_fh, '<', $log);
15         my $sw = $log; $sw =~ s/^.*?_//; $sw =~ s/_.*$//;
16         while(<$log_fh>) {
17                 chomp;
18                 if ( m/\s*(\d+)\s+(\S+)\s+([gc]\S+)\s+(\w+)\s+(\w+)/ ) {
19                         my ($vlan,$name,$ports,$type,$authorization) = ( $1,$2,$3,$4,$5 );
20
21                         warn "$sw $vlan $name $ports $type $authorization\n";
22                         $stat->{$sw}->{_vlan_count}->{$vlan}++;
23
24                         while ( $ports =~ s/(ch\([^\)]+\))// ) {
25                                 warn "# removed [$1] from ports\n";
26                         }
27
28                         while ( $ports =~ s/(\d+)-(\d+)// ) {
29                                 foreach my $port ( $1 .. $2 ) {
30                                         push @{ $stat->{$sw}->{port_vlan}->{$port} }, $vlan;
31                                         push @{ $stat->{$sw}->{vlan_port}->{$vlan} }, $port;
32                                 }
33                         }
34                         while ( $ports =~ s/(\d+)// ) {
35                                 my $port = $1;
36                                 push @{ $stat->{$sw}->{port_vlan}->{$port} }, $vlan;
37                                 push @{ $stat->{$sw}->{vlan_port}->{$vlan} }, $port;
38                         }
39                         #warn "# ports left:[$ports] stat = ",dump($stat);
40                 } else {
41                         warn "INGORED [$_]";
42                 }
43         }
44 }
45
46 warn dump($stat),$/;
47
48
49 foreach my $sw ( sort keys %$stat ) {
50         my @ports = sort { $a <=> $b } keys %{ $stat->{$sw}->{port_vlan} };
51         #warn "# ports = ",dump( \@ports );
52         printf( "%-11s %-5s %s\n", ('-' x 11), ('-' x 5), join(' ', map { sprintf("%-2s", $_) } ( 1 .. $ports[-1] )) );
53         foreach my $vlan ( sort { $a <=> $b } keys %{ $stat->{$sw}->{vlan_port} } ) {
54                 my @p = ( '.' ) x ( $ports[-1] + 1 );
55                 foreach my $port ( @{ $stat->{$sw}->{vlan_port}->{$vlan} } ) {
56                         $p[$port] = 'X';
57                 }
58                 shift @p; # skip port 0
59                 #warn "# $sw $vlan p = ",dump( \@p );
60                 printf( "%-11s %-5d %s\n", $sw, $vlan, join(' ', map { sprintf("%-2s", $_) } @p) );
61         }
62 }
63