6 use Data::Dump qw/dump/;
14 my $debug = server::debug();
24 foreach my $line ( split(/\n/, `ip $object`) ) {
25 warn "# $line\n" if $debug;
28 if ( $line =~ s{^(\d+):\s+(\w+):\s+}{} ) {
30 $objects[$i] = { dev => $2 };
31 $add_header = $object;
32 } elsif ( $line =~ s{^\s+}{} ) {
36 $line =~ s{^(\S+)\s+}{};
40 $add_header = $object;
43 push @headers, $add_header if $add_header && ! $headers->{$add_header}++;
45 if ( $line =~ s{<(\S+)>\s+}{} ) {
46 $add_header = 'flags';
47 $objects[$i]->{$add_header} = $1;
48 push @headers, $add_header unless $headers->{$add_header}++;
51 my @p = split(/\s+/, $line);
53 my ($n,$v) = splice @p, 0, 2;
55 $objects[$i]->{''} = $n;
57 } elsif ( $n =~ m{^(.+)/(.+)$} ) {
59 $objects[$i]->{$n} = $2;
60 $objects[$i]->{mac} = $v;
62 $objects[$i]->{$n} = $v;
64 push @headers, $n unless $headers->{$n}++;
67 # warn dump( $objects[$i] );
70 return unless @objects;
72 $objects[0] = [ @headers ];
78 my @objects = ip::lines( @_ );
79 return '' unless @objects;
81 my @headers = @{ shift @objects };
83 my @table = ( -( $#headers + 1), @headers );
84 foreach my $o ( @objects ) {
85 foreach ( 0 .. $#headers ) {
87 push @table, $o->{$h};
91 return html::table( @table );
95 my @links = ip::lines( 'link' );
97 foreach ( 1 .. $#links ) {
98 push @devs, $links[$_]->{dev} if $links[$_]->{flags} =~ m{UP};
103 sub default_route_dev {
106 grep { $_->{route} eq 'default' }
107 grep { ref $_ eq 'HASH' } # skip header
113 unpack( 'N', pack( 'C*', split(/\./, shift) ) )
117 join( '.', unpack('C4', pack('N',shift)) )
123 my $server = server::as_hash_for $ip;
125 my $i = to_int($ip) & to_int($server->{netmask});
126 my $s = to_int($server->{ip}) & to_int($server->{netmask});
129 $i = to_int($ip) & ( to_int($server->{netmask}) ^ 0xffffffff );
130 return 1 if ( $i >= $server->{ip_from} && $i <= $server->{ip_to} );