merge git log from multiple repositories by date
[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 $debug = $ENV{DEBUG} || 1;
10
11 my @logs = @ARGV;
12 @logs = glob('./log/*vlan*') unless @logs;
13
14 my $stat;
15
16 foreach my $log ( @logs ) {
17         warn "###< $log\n" if $debug;
18         open(my $log_fh, '-|', "./table2tab.pl '$log'");
19         my $sw = $log; $sw =~ s/^.*?_//; $sw =~ s/_.*$//;
20         while(<$log_fh>) {
21                 chomp;
22                 if ( m/\t/ ) {
23                         my ($vlan,$name,$ports,$type,$authorization);
24
25                         my @v = split(/\t/, $_);
26
27                         if ( $#v == 4 ) {
28                                 ($vlan,$name,$ports,$type,$authorization) = @v;
29                         } elsif ( $#v == 3 ) {
30                                 ($vlan,$name,$ports,$type) = @v;
31                         } elsif ( $#v == 5 ) {
32                                 ($vlan,$name,$ports,undef,$type) = @v;
33                         } else {
34                                 warn "ERROR: ", scalar(@v), " elements in [$_]" if $#v != 4;
35                         }
36
37                         $ports =~ s{(Po|Gi\d/\d/|Te\d/\d/)}{}gi;
38
39                         warn "$sw $vlan $name $ports $type\n";
40                         $stat->{$sw}->{_vlan_count}->{$vlan}++;
41
42                         while ( $ports =~ s/(ch\([^\)]+\))// ) {
43                                 warn "# removed [$1] from ports\n";
44                         }
45
46                         while ( $ports =~ s/(\d+)-(\d+)// ) {
47                                 foreach my $port ( $1 .. $2 ) {
48                                         push @{ $stat->{$sw}->{port_vlan}->{$port} }, $vlan;
49                                         push @{ $stat->{$sw}->{vlan_port}->{$vlan} }, $port;
50                                 }
51                         }
52                         while ( $ports =~ s/(\d+)// ) {
53                                 my $port = $1;
54                                 push @{ $stat->{$sw}->{port_vlan}->{$port} }, $vlan;
55                                 push @{ $stat->{$sw}->{vlan_port}->{$vlan} }, $port;
56                         }
57                         #warn "# ports left:[$ports] stat = ",dump($stat);
58                 } else {
59                         warn "INGORED [$_]\n";
60                 }
61         }
62 }
63
64 warn dump($stat),$/;
65
66
67 foreach my $sw ( sort keys %$stat ) {
68         my @ports = sort { $a <=> $b } keys %{ $stat->{$sw}->{port_vlan} };
69         #warn "# ports = ",dump( \@ports );
70         printf( "%-11s %-5s %s\n", ('-' x 11), ('-' x 5), join(' ', map { sprintf("%-2s", $_) } ( 1 .. $ports[-1] )) );
71         foreach my $vlan ( sort { $a <=> $b } keys %{ $stat->{$sw}->{vlan_port} } ) {
72                 my @p = ( '.' ) x ( $ports[-1] + 1 );
73                 foreach my $port ( @{ $stat->{$sw}->{vlan_port}->{$vlan} } ) {
74                         $p[$port] = $port;
75                 }
76                 shift @p; # skip port 0
77                 #warn "# $sw $vlan p = ",dump( \@p );
78                 printf( "%-11s %-5d %s\n", $sw, $vlan, join(' ', map { sprintf("%-2s", $_) } @p) );
79         }
80 }
81