d19510ec7cfaeb7c07232267c76de406139e1736
[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 open(my $dot, '>', '/dev/shm/wap-scan.dot');
8 print $dot qq|digraph wap {
9
10 |;
11
12 my $stat;
13
14 sub path2hostname {
15         my $hostname = shift;
16         $hostname =~ s/^.*\///;
17         $hostname =~ s/_.*$//;
18         return $hostname;
19 }
20
21 my $mac2hostname;
22 foreach my $link ( glob "/dev/shm/wap/*ip_link*" ) {
23         my $hostname = path2hostname $link;
24         open(my $fh, '<', $link);
25         my $if;
26         while(<$fh>) {
27                 chomp;
28                 if ( m/^\d+:\s(\S+):/ ) {
29                         $if = $1;
30                 } elsif ( m/link\/ether\s(\S+)/ ) {
31                         push @{ $mac2hostname->{$1}->{$hostname} }, $if;
32                 }
33         }
34
35 }
36
37 warn "# mac2hostname = ",dump($mac2hostname);
38
39 foreach my $scan ( glob "/dev/shm/wap/*iw_*_scan" ) {
40         my $hostname = path2hostname $scan;
41
42         open(my $fh, '<', $scan);
43         my $bss;
44         while(<$fh>) {
45                 chomp;
46                 if ( m/^BSS\s(\S+)\(on\s(\S+)\)/ ) {
47                         $bss = $1;
48                         $stat->{$hostname}->{$bss} = {
49                                 if => $2,
50                         };
51                 
52                 } elsif ( m/^\s*(freq|signal|SSID):\s*(.+)/ ) {
53                         $stat->{$hostname}->{$bss}->{$1} = $2;
54                 }
55         }
56
57 }
58
59 warn "# stat = ", dump($stat);
60
61 sub _dot {
62         my $t = shift;
63         $t =~ s/\W+/_/g;
64         return $t;
65 }
66
67 foreach my $ap ( keys %$stat ) {
68         foreach my $bss ( keys %{ $stat->{$ap} } ) {
69                 if ( exists $mac2hostname->{$bss} ) {
70                         my $remote = join(',', keys %{ $mac2hostname->{$bss} } );
71                         print "$ap $remote ";
72                         my $len = $stat->{$ap}->{$bss}->{signal} || die "no signal in ",dump($stat->{$ap}->{$bss});
73                         $len =~ s/ \w+//;
74                         $len = abs($len);
75                         printf $dot qq| %s -> %s [ len = %d ];\n|, _dot($ap),_dot($remote),$len;
76                 } else {
77                         print "$ap EXTERNAL ";
78                 }
79                 my $info = dump( $stat->{$ap}->{$bss} );
80                 $info =~ s/[\n\r\s]+/ /gs;
81                 print "$bss $info\n";
82         }
83 }
84
85 print $dot qq|
86 }
87 |;
88 __END__
89
90 ls /dev/shm/wap/*iw_*_scan | while read file ; do
91
92         hostname=`echo $file | sed -e 's/^.*\///' -e 's/_.*$//'`
93
94         echo `egrep '(BSS|freq:|signal:|SSID:)' $file` \
95         | sed -e 's/\n  */ /g' -e "s/ *BSS/\n## $hostname BSS/g" -e 's/ *(on \([^ ][^ ]*\)) */ \1 /g'
96 done
97