propage $server HASH and $server_ip all over config
[pxelator] / lib / PXElator / ip.pm
index 127384a..ae7204a 100644 (file)
@@ -6,10 +6,13 @@ use strict;
 use Data::Dump qw/dump/;
 
 use html;
+use server;
 
 sub lines {
        my ( $object ) = @_;
 
+       my $debug = server::debug();
+
        $object ||= 'link';
 
        my $i = 0;
@@ -19,12 +22,12 @@ sub lines {
        my $headers;
 
        foreach my $line ( split(/\n/, `ip $object`) ) {
-               warn "# $line\n";
+               warn "# $line\n" if $debug;
                my $add_header;
 
                if ( $line =~ s{^(\d+):\s+(\w+):\s+}{} ) {
                        $i = $1;
-                       $objects[$i] = { $object => $2 };
+                       $objects[$i] = { dev => $2 };
                        $add_header = $object;
                } elsif ( $line =~ s{^\s+}{} ) {
                        # line continues
@@ -88,4 +91,46 @@ sub html {
        return html::table( @table );
 }
 
+sub devices_up {
+       my @links = ip::lines( 'link' );
+       my @devs;
+       foreach ( 1 .. $#links ) {
+               push @devs, $links[$_]->{dev} if $links[$_]->{flags} =~ m{UP};
+       }
+       return @devs;
+}
+
+sub default_route_dev {
+       my @routes = ip::lines 'route';
+
+       return
+               map { $_->{dev} }
+               grep { $_->{route} eq 'default' }
+               splice @routes, 1 # FIXME ship header
+       ;
+}
+
+sub to_int {
+       unpack( 'N', pack( 'C*', split(/\./, shift) ) )
+}
+
+sub from_int {
+       join( '.', unpack('C4', pack('N',shift)) )
+}
+
+sub in_dhcp_range {
+       my $ip = shift;
+
+       my $server = server::as_hash_for $ip;
+
+       my $i = to_int($ip) & to_int($server->{netmask});
+       my $s = to_int($server->{ip}) & to_int($server->{netmask});
+
+       if ( $i == $s ) {
+               $i = to_int($ip) & ( to_int($server->{netmask}) ^ 0xffffffff );
+               return 1 if ( $i >= $server->{ip_from} && $i <= $server->{ip_to} );
+       }
+       return 0;
+}
+
 1;