be5a6e2e08e683dcec2af60ac349ba09d334909c
[dell-switch] / wap-scan.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use autodie;
5 use Data::Dump qw(dump);
6
7 my $stat;
8
9 sub path2hostname {
10         my $hostname = shift;
11         $hostname =~ s/^.*\///;
12         $hostname =~ s/_.*$//;
13         return $hostname;
14 }
15
16 my $mac2hostname;
17 foreach my $link ( glob "/dev/shm/wap/*ip_link*" ) {
18         my $hostname = path2hostname $link;
19         open(my $fh, '<', $link);
20         my $if;
21         while(<$fh>) {
22                 chomp;
23                 if ( m/^\d+:\s(\S+):/ ) {
24                         $if = $1;
25                 } elsif ( m/link\/ether\s(\S+)/ ) {
26                         push @{ $mac2hostname->{$1}->{$hostname} }, $if;
27                 }
28         }
29
30 }
31
32 warn "# mac2hostname = ",dump($mac2hostname);
33
34 foreach my $scan ( glob "/dev/shm/wap/*iw_*_scan" ) {
35         my $hostname = path2hostname $scan;
36
37         open(my $fh, '<', $scan);
38         my $bss;
39         while(<$fh>) {
40                 chomp;
41                 if ( m/^BSS\s(\S+)\(on\s(\S+)\)/ ) {
42                         $bss = $1;
43                         $stat->{$hostname}->{$bss} = {
44                                 if => $2,
45                         };
46                 
47                 } elsif ( m/^\s*(freq|signal|SSID):\s*(.+)/ ) {
48                         $stat->{$hostname}->{$bss}->{$1} = $2;
49                 }
50         }
51
52 }
53
54 warn "# stat = ", dump($stat);
55
56
57 foreach my $ap ( keys %$stat ) {
58         foreach my $bss ( keys %{ $stat->{$ap} } ) {
59                 if ( exists $mac2hostname->{$bss} ) {
60                         my $remote = join(',', keys %{ $mac2hostname->{$bss} } );
61                         print "$ap $remote ";
62                 } else {
63                         print "$ap EXTERNAL ";
64                 }
65                 my $info = dump( $stat->{$ap}->{$bss} );
66                 $info =~ s/[\n\r\s]+/ /gs;
67                 print "$bss $info\n";
68         }
69 }
70
71 __END__
72
73 ls /dev/shm/wap/*iw_*_scan | while read file ; do
74
75         hostname=`echo $file | sed -e 's/^.*\///' -e 's/_.*$//'`
76
77         echo `egrep '(BSS|freq:|signal:|SSID:)' $file` \
78         | sed -e 's/\n  */ /g' -e "s/ *BSS/\n## $hostname BSS/g" -e 's/ *(on \([^ ][^ ]*\)) */ \1 /g'
79 done
80