Code

Fixed a couple of additional _/-
[gosa.git] / gosa-si / modules / SIPackages.pm
index fa4d03fd5b948e8200649f76c8ca88446aff6da4..b36fa497e92bf85d14dfce6b0f6f8ec3a38a38b5 100644 (file)
@@ -12,6 +12,7 @@ use GOSA::GosaSupportDaemon;
 use IO::Socket::INET;
 use XML::Simple;
 use Data::Dumper;
+use NetAddr::IP;
 use Net::LDAP;
 use Socket;
 use Net::hostent;
@@ -20,8 +21,7 @@ use Net::DNS;
 BEGIN{}
 END {}
 
-my ($known_clients_file_name);
-my ($server_activ, $server_ip, $server_mac_address, $server_port, $SIPackages_key, $max_clients, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password);
+my ($server_ip, $server_mac_address, $server_port, $SIPackages_key, $max_clients, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $server_interface);
 my ($bus_activ, $bus_key, $bus_ip, $bus_port);
 my $server;
 my $network_interface;
@@ -29,25 +29,25 @@ my $no_bus;
 my (@ldap_cfg, @pam_cfg, @nss_cfg, $goto_admin, $goto_secret);
 
 
-my %cfg_defaults =
-(
-"server" =>
-    {"server_activ" => [\$server_activ, "on"],
-    "server_ip" => [\$server_ip, "0.0.0.0"],
-    "server_mac_address" => [\$server_mac_address, ""],
-    "server_port" => [\$server_port, "20081"],
-    "SIPackages_key" => [\$SIPackages_key, ""],
-    "max_clients" => [\$max_clients, 100],
-    "ldap_uri" => [\$ldap_uri, ""],
-    "ldap_base" => [\$ldap_base, ""],
-    "ldap_admin_dn" => [\$ldap_admin_dn, ""],
-    "ldap_admin_password" => [\$ldap_admin_password, ""],
+my %cfg_defaults = (
+"bus" => {
+    "activ" => [\$bus_activ, "on"],
+    "key" => [\$bus_key, ""],
+    "ip" => [\$bus_ip, ""],
+    "port" => [\$bus_port, "20080"],
     },
-"bus" =>
-    {"bus_activ" => [\$bus_activ, "on"],
-    "bus_passwd" => [\$bus_key, ""],
-    "bus_ip" => [\$bus_ip, ""],
-    "bus_port" => [\$bus_port, "20080"],
+"server" => {
+    "ip" => [\$server_ip, "0.0.0.0"],
+    "mac_address" => [\$server_mac_address, "00:00:00:00:00"],
+    "port" => [\$server_port, "20081"],
+    "ldap-uri" => [\$ldap_uri, ""],
+    "ldap-base" => [\$ldap_base, ""],
+    "ldap-admin_dn" => [\$ldap_admin_dn, ""],
+    "ldap-admin_password" => [\$ldap_admin_password, ""],
+    "max-clients" => [\$max_clients, 100],
+    },
+"SIPackages" => {
+    "key" => [\$SIPackages_key, ""],
     },
 );
 
@@ -56,16 +56,17 @@ my %cfg_defaults =
 # read configfile and import variables
 &read_configfile();
 
-# detect interfaces and mac address
 $network_interface= &get_interface_for_ip($server_ip);
-$server_mac_address= &get_mac($network_interface); 
+$server_mac_address= &get_mac($network_interface);
 
 # complete addresses
-if( $server_ip eq "0.0.0.0" ) {
-    $server_ip = "127.0.0.1";
-}
+#if( $server_ip eq "0.0.0.0" ) {
+#    $server_ip = "127.0.0.1";
+#}
 my $server_address = "$server_ip:$server_port";
+$main::server_address = $server_address;
 my $bus_address = "$bus_ip:$bus_port";
+$main::bus_address = $bus_address;
 
 # create general settings for this module
 my $xml = new XML::Simple();
@@ -95,15 +96,11 @@ my $res = $main::known_server_db->add_dbentry( {table=>'known_server',
 sub get_module_info {
     my @info = ($server_address,
                 $SIPackages_key,
-                $server,
-                $server_activ,
-                "socket",
                 );
     return \@info;
 }
 
 
-
 sub do_wake {
         my $host    = shift;
         my $ipaddr  = shift || '255.255.255.255';
@@ -296,34 +293,6 @@ sub get_mac {
        return $result;
 }
 
-#===  FUNCTION  ================================================================
-#         NAME:  get_ip 
-#   PARAMETERS:  interface name (i.e. eth0)
-#      RETURNS:  (ip address) 
-#  DESCRIPTION:  Uses ioctl to get ip address directly from system.
-#===============================================================================
-sub get_ip {
-       my $ifreq= shift;
-       my $result= "";
-       my $SIOCGIFADDR= 0x8915;       # man 2 ioctl_list
-       my $proto= getprotobyname('ip');
-
-       socket SOCKET, PF_INET, SOCK_DGRAM, $proto
-               or die "socket: $!";
-
-       if(ioctl SOCKET, $SIOCGIFADDR, $ifreq) {
-               my ($if, $sin)    = unpack 'a16 a16', $ifreq;
-               my ($port, $addr) = sockaddr_in $sin;
-               my $ip            = inet_ntoa $addr;
-
-               if ($ip && length($ip) > 0) {
-                       $result = $ip;
-               }
-       }
-
-       return $result;
-}
-
 
 #===  FUNCTION  ================================================================
 #         NAME:  register_at_bus
@@ -346,14 +315,6 @@ sub register_at_bus {
 
     &main::send_msg_to_target($msg, $bus_address, $bus_key, "here_i_am");
     return $msg;
-#    my $answer = "";
-#    $answer = &send_msg_hash2address($msg_hash, $bus_address, $bus_passwd);
-#    if ($answer == 0) {
-#        &main::daemon_log("register at bus: $bus_address", 1);
-#    } else {
-#        &main::daemon_log("unable to send 'register'-msg to bus '$bus_address': $answer", 1);
-#    }
-#    return;
 }
 
 
@@ -384,7 +345,7 @@ sub process_incoming_msg {
 
     if( 1 == length @target_l) {
         my $target = $target_l[0];
-        if( $target eq $server_address ) {  
+               if(&server_matches($target)) {
             if ($header eq 'new_key') {
                 @out_msg_l = &new_key($msg_hash)
             } elsif ($header eq 'here_i_am') {
@@ -473,7 +434,7 @@ sub new_key {
             "SET hostkey='$source_key', timestamp='$act_time' ".
             "WHERE hostname='$source_name'";
         my $res = $main::known_clients_db->update_dbentry( $sql_statement );
-        my $hash = &create_xml_hash("confirm_new_passwd", $server_address, $source_name);
+        my $hash = &create_xml_hash("confirm_new_key", $server_address, $source_name);
         my $out_msg = &create_xml_string($hash);
         push(@out_msg_l, $out_msg);
     }
@@ -490,7 +451,7 @@ sub new_key {
                 "WHERE hostname='$source_name'";
             my $res = $main::known_server_db->update_dbentry( $sql_statement );
 
-            my $hash = &create_xml_hash("confirm_new_passwd", $server_address, $source_name);
+            my $hash = &create_xml_hash("confirm_new_key", $server_address, $source_name);
             my $out_msg = &create_xml_string($hash);
             push(@out_msg_l, $out_msg);
         }
@@ -764,7 +725,7 @@ sub new_ldap_config {
                # Find admin base and department name
                $mesg = $ldap->search( base   => $ldap_base,
                        scope  => 'sub',
-                       attrs => ['dn', 'ou'],
+                       attrs => ['dn', 'ou', 'FAIclass'],
                        filter => "(&(objectClass=gosaAdministrativeUnit)(gosaUnitTag=$unit_tag))");
                #$mesg->code && die $mesg->error;
                if($mesg->code) {
@@ -786,6 +747,13 @@ sub new_ldap_config {
                $data{'unit_tag'}= $unit_tag;
        }
 
+       # Fill release if available
+       my $FAIclass= $entry->get_value("FAIclass");
+       if (defined $FAIclass && $FAIclass =~ /^.* :([A-Za-z0-9\/.]+).*$/) {
+               $data{'release'}= $1;
+       }
+
+
        # Unbind
        $mesg = $ldap->unbind;
 
@@ -847,6 +815,7 @@ sub process_detected_hardware {
                $entry->add("objectClass" => "goHard");
                $entry->add("cn" => $cn);
                $entry->add("macAddress" => $macaddress);
+               $entry->add("gotomode" => "locked");
                $entry->add("gotoSysStatus" => "new-system");
                $entry->add("ipHostNumber" => $ipaddress);
                if(my $res=$entry->update($ldap)) {
@@ -857,7 +826,7 @@ sub process_detected_hardware {
                                filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))"
                        );
                } else {
-                       &main::daemon_log("There was a problem adding the entry", 1);
+                       &main::daemon_log("ERROR: There was a problem adding the entry", 1);
                }
 
        }
@@ -1024,6 +993,51 @@ sub hardware_config {
        return send_msg("detect_hardware", $server_address, $address, \%data);
 }
 
+sub server_matches {
+       my $target = shift;
+       my $target_ip = sprintf("%s", $target =~ /^([0-9\.]*?):.*$/);
+       my $result = 0;
+
+       if($server_ip eq $target_ip) {
+               $result= 1;
+       } elsif ($server_ip eq "0.0.0.0") {     
+               if ($target_ip eq "127.0.0.1") {
+                       $result= 1;
+               } else {
+                       my $PROC_NET_ROUTE= ('/proc/net/route');
+
+                       open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE")
+                               or die "Could not open $PROC_NET_ROUTE";
+
+                       my @ifs = <PROC_NET_ROUTE>;
+
+                       close(PROC_NET_ROUTE);
+
+                       # Eat header line
+                       shift @ifs;
+                       chomp @ifs;
+                       foreach my $line(@ifs) {
+                               my ($Iface,$Destination,$Gateway,$Flags,$RefCnt,$Use,$Metric,$Mask,$MTU,$Window,$IRTT)=split(/\s/, $line);
+                               my $destination;
+                               my $mask;
+                               my ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Destination);
+                               $destination= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
+                               ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Mask);
+                               $mask= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
+                               if(new NetAddr::IP($target_ip)->within(new NetAddr::IP($destination, $mask))) {
+                                       # destination matches route, save mac and exit
+                                       $result= 1;
+                                       last;
+                               }
+                       }
+               }
+       } else {
+               &main::daemon_log("Target ip $target_ip does not match Server ip $server_ip",1);
+       }
+
+       return $result;
+}
+
 
 #===  FUNCTION  ================================================================
 #         NAME:  execute_actions