6 |
use Data::Dump qw/dump/; |
use Data::Dump qw/dump/; |
7 |
|
|
8 |
use html; |
use html; |
9 |
|
use server; |
10 |
|
|
11 |
sub lines { |
sub lines { |
12 |
my ( $object ) = @_; |
my ( $object ) = @_; |
13 |
|
|
14 |
|
my $debug = server::debug; |
15 |
|
|
16 |
$object ||= 'link'; |
$object ||= 'link'; |
17 |
|
|
18 |
my $i = 0; |
my $i = 0; |
22 |
my $headers; |
my $headers; |
23 |
|
|
24 |
foreach my $line ( split(/\n/, `ip $object`) ) { |
foreach my $line ( split(/\n/, `ip $object`) ) { |
25 |
warn "# $line\n"; |
warn "# $line\n" if $debug; |
26 |
my $add_header; |
my $add_header; |
27 |
|
|
28 |
if ( $line =~ s{^(\d+):\s+(\w+):\s+}{} ) { |
if ( $line =~ s{^(\d+):\s+(\w+):\s+}{} ) { |
29 |
$i = $1; |
$i = $1; |
30 |
$objects[$i] = { $object => $2 }; |
$objects[$i] = { dev => $2 }; |
31 |
$add_header = $object; |
$add_header = $object; |
32 |
} elsif ( $line =~ s{^\s+}{} ) { |
} elsif ( $line =~ s{^\s+}{} ) { |
33 |
# line continues |
# line continues |
91 |
return html::table( @table ); |
return html::table( @table ); |
92 |
} |
} |
93 |
|
|
94 |
|
sub devices_up { |
95 |
|
my @links = ip::lines( 'link' ); |
96 |
|
my @devs; |
97 |
|
foreach ( 1 .. $#links ) { |
98 |
|
push @devs, $links[$_]->{dev} if $links[$_]->{flags} =~ m{UP}; |
99 |
|
} |
100 |
|
return @devs; |
101 |
|
} |
102 |
|
|
103 |
|
sub default_route_dev { |
104 |
|
my @routes = ip::lines 'route'; |
105 |
|
|
106 |
|
return |
107 |
|
map { $_->{dev} } |
108 |
|
grep { $_->{route} eq 'default' } |
109 |
|
splice @routes, 1 # FIXME ship header |
110 |
|
; |
111 |
|
} |
112 |
|
|
113 |
|
sub to_int { |
114 |
|
pack( 'C*', split(/\./, shift) ) |
115 |
|
} |
116 |
|
|
117 |
|
sub from_int { |
118 |
|
join( '.', unpack('C4', shift) ) |
119 |
|
} |
120 |
|
|
121 |
1; |
1; |