Code

Fixes.
[gosa.git] / gosa-si / modules / SIPackages.pm
index 492b109a006bb5294b4c51e0050bf481fe1fc573..099ae2121b449bfd32c8bd2d0266577e74064ca6 100644 (file)
@@ -16,7 +16,6 @@ use NetAddr::IP;
 use Net::LDAP;
 use Socket;
 use Net::hostent;
-use Net::DNS;
 use utf8;
 
 my $event_dir = "/usr/lib/gosa-si/server/events";
@@ -32,6 +31,7 @@ my $event_hash;
 my $network_interface;
 my $no_bus;
 my (@ldap_cfg, @pam_cfg, @nss_cfg, $goto_admin, $goto_secret);
+my $mesg;
 
 my %cfg_defaults = (
 "bus" => {
@@ -71,12 +71,11 @@ $server_mac_address= &get_mac($network_interface);
 # Unit tag can be defined in config
 if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) {
        # Read gosaUnitTag from LDAP
-       my $tmp_ldap= Net::LDAP->new($ldap_uri);
-       if( defined($tmp_ldap) ) {
+  &main::refresh_ldap_handle();
+       if( defined($main::ldap_handle) ) {
                &main::daemon_log("INFO: Searching for servers gosaUnitTag with mac address $server_mac_address",5);
-               my $mesg= $tmp_ldap->bind($ldap_admin_dn, password => $ldap_admin_password);
                # Perform search for Unit Tag
-               $mesg = $tmp_ldap->search(
+               $mesg = $main::ldap_handle->search(
                        base   => $ldap_base,
                        scope  => 'sub',
                        attrs  => ['gosaUnitTag'],
@@ -95,7 +94,7 @@ if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) {
                        my $hostname= `hostname -f`;
                        chomp($hostname);
                        &main::daemon_log("INFO: Searching for servers gosaUnitTag with hostname $hostname",5);
-                       $mesg = $tmp_ldap->search(
+                       $mesg = $main::ldap_handle->search(
                                base   => $ldap_base,
                                scope  => 'sub',
                                attrs  => ['gosaUnitTag'],
@@ -113,7 +112,7 @@ if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) {
                                $hostname= `hostname -s`;
                                chomp($hostname);
                                &main::daemon_log("INFO: Searching for servers gosaUnitTag with hostname $hostname",5);
-                               $mesg = $tmp_ldap->search(
+                               $mesg = $main::ldap_handle->search(
                                        base   => $ldap_base,
                                        scope  => 'sub',
                                        attrs  => ['gosaUnitTag'],
@@ -131,7 +130,6 @@ if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) {
                                }
                        }
                }
-        $tmp_ldap->unbind;
        } else {
                &main::daemon_log("INFO: Using gosaUnitTag from config-file: $main::gosa_unit_tag",5);
        }
@@ -163,7 +161,7 @@ if($bus_activ eq "on") {
 
 # add myself to known_server_db
 my $res = $main::known_server_db->add_dbentry( {table=>'known_server',
-        primkey=>'hostname',
+        primkey=>['hostname'],
         hostname=>$server_address,
         status=>'myself',
         hostkey=>$SIPackages_key,
@@ -250,7 +248,7 @@ sub get_interface_for_ip {
                } else {
                        foreach (@ifs) {
                                my $if=$_;
-                               if(get_ip($if) eq $ip) {
+                               if(&main::get_ip($if) eq $ip) {
                                        $result = $if;
                                }
                        }       
@@ -338,7 +336,7 @@ sub register_at_bus {
 
     # add bus to known_server_db
     my $res = $main::known_server_db->add_dbentry( {table=>'known_server',
-                                                    primkey=>'hostname',
+                                                    primkey=>['hostname'],
                                                     hostname=>$bus_address,
                                                     status=>'bus',
                                                     hostkey=>$bus_key,
@@ -402,7 +400,6 @@ sub process_incoming_msg {
     $header =~ s/^CLMSG_//;
 
     &main::daemon_log("DEBUG: SIPackages: msg to process: $header", 7);
-    &main::daemon_log("$msg", 8);
 
     if( 0 == length @target_l){     
         &main::daemon_log("ERROR: no target specified for msg $header", 1);
@@ -429,7 +426,7 @@ sub process_incoming_msg {
 
             # if delivery not possible raise error and return 
             if( not @out_msg_l ) {
-                &main::daemon_log("WARNING: SIPackages got not answer from event handler '$header'", 3);
+                &main::daemon_log("WARNING: SIPackages got no answer from event handler '$header'", 3);
             } elsif( 0 == @out_msg_l) {
                 &main::daemon_log("ERROR: SIPackages: no event handler or core function defined for '$header'", 1);
             } 
@@ -547,14 +544,13 @@ sub here_i_am {
     # add entry to known_clients_db
     my $act_timestamp = &get_time;
     my $res = $main::known_clients_db->add_dbentry( {table=>'known_clients', 
-                                                primkey=>'hostname',
+                                                primkey=>['hostname'],
                                                 hostname=>$source,
                                                 events=>$events,
                                                 macaddress=>$mac_address,
                                                 status=>'registered',
                                                 hostkey=>$new_passwd,
                                                 timestamp=>$act_timestamp,
-                                                login=>"nobody",
                                                 } );
 
     if ($res != 0)  {
@@ -564,8 +560,6 @@ sub here_i_am {
     
     # return acknowledgement to client
     $out_hash = &create_xml_hash("registered", $server_address, $source);
-    my $register_out = &create_xml_string($out_hash);
-    push(@out_msg_l, $register_out);
 
     # notify registered client to bus
     if( $bus_activ eq "on") {
@@ -580,13 +574,21 @@ sub here_i_am {
         &add_content2xml_hash($out_hash, "timestamp", $act_timestamp);
         my $new_client_out = &create_xml_string($out_hash);
         push(@out_msg_l, $new_client_out);
-        &main::daemon_log("INFO: send bus msg that client '$source' has registerd at server '$server_address'", 5);
+        &main::daemon_log("INFO: send bus msg that client '$source' has registered at server '$server_address'", 5);
     }
 
     # give the new client his ldap config
+    # Workaround: Send within the registration response, if the client will get an ldap config later
     my $new_ldap_config_out = &new_ldap_config($source);
     if( $new_ldap_config_out ) {
-        push(@out_msg_l, $new_ldap_config_out);
+            &add_content2xml_hash($out_hash, "ldap_available", "true");
+    }
+    my $register_out = &create_xml_string($out_hash);
+    push(@out_msg_l, $register_out);
+
+    # Really send the ldap config
+    if( $new_ldap_config_out ) {
+            push(@out_msg_l, $new_ldap_config_out);
     }
 
        my $hardware_config_out = &hardware_config($source, $gotoHardwareChecksum);
@@ -646,10 +648,11 @@ sub who_has_i_do {
     print "\ngot msg $header:\nserver $source has client with $search_param $search_value\n";
 }
 
+
 #===  FUNCTION  ================================================================
 #         NAME:  new_ldap_config
 #   PARAMETERS:  address - string - ip address and port of a host
-#      RETURNS:  nothing
+#      RETURNS:  gosa-si conform message
 #  DESCRIPTION:  send to address the ldap configuration found for dn gotoLdapServer
 #===============================================================================
 sub new_ldap_config {
@@ -674,21 +677,17 @@ sub new_ldap_config {
        }
 
        # Build LDAP connection
-       my $ldap = Net::LDAP->new($ldap_uri);
-       if( not defined $ldap ) {
+  &main::refresh_ldap_handle();
+       if( not defined $main::ldap_handle ) {
                &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1);
                return;
        } 
 
-
-       # Bind to a directory with dn and password
-       my $mesg= $ldap->bind($ldap_admin_dn, password => $ldap_admin_password);
-
        # Perform search
-       $mesg = $ldap->search( base   => $ldap_base,
+       $mesg = $main::ldap_handle->search( base   => $ldap_base,
                scope  => 'sub',
                attrs => ['dn', 'gotoLdapServer', 'gosaUnitTag', 'FAIclass'],
-               filter => "(&(objectClass=GOhard)(macaddress=$macaddress))");
+               filter => "(&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))");
        #$mesg->code && die $mesg->error;
        if($mesg->code) {
                &main::daemon_log($mesg->error, 1);
@@ -697,11 +696,11 @@ sub new_ldap_config {
 
        # Sanity check
        if ($mesg->count != 1) {
-               &main::daemon_log("WARNING: client mac address $macaddress not found/not unique in ldap search", 1);
+               &main::daemon_log("WARNING: client with mac address $macaddress not found/unique/active - not sending ldap config", 1);
                &main::daemon_log("\tbase: $ldap_base", 1);
                &main::daemon_log("\tscope: sub", 1);
                &main::daemon_log("\tattrs: dn, gotoLdapServer", 1);
-               &main::daemon_log("\tfilter: (&(objectClass=GOhard)(macaddress=$macaddress))", 1);
+               &main::daemon_log("\tfilter: (&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))", 1);
                return;
        }
 
@@ -722,7 +721,7 @@ sub new_ldap_config {
 
        # Do we need to look at an object class?
        if (length(@servers) < 1){
-               $mesg = $ldap->search( base   => $ldap_base,
+               $mesg = $main::ldap_handle->search( base   => $ldap_base,
                        scope  => 'sub',
                        attrs => ['dn', 'gotoLdapServer', 'FAIclass'],
                        filter => "(&(objectClass=gosaGroupOfNames)(member=$dn))");
@@ -753,17 +752,19 @@ sub new_ldap_config {
        @servers= sort (@servers);
 
        foreach $server (@servers){
-               # Conversation for backward compatibility
-               if (not $server =~ /^ldap[^:]+:\/\// ) {
-                   if ($server =~ /^([^:]+):(.*)$/ ) {
-                $server= "1:dummy:ldap://$1/$2";
-                   }
-               }
+                # Conversation for backward compatibility
+                if (not $server =~ /^\d+:[^:]+:ldap[^:]*:\/\// ) {
+                    if ($server =~ /^([^:]+):([^:]+)$/ ) {
+                      $server= "1:dummy:ldap://$1/$2";
+                    } elsif ($server =~ /^(\d+):([^:]+):(.*)$/ ) {
+                      $server= "$1:dummy:ldap://$2/$3";
+                    }
+                }
 
-               $base= $server;
-               $server =~ s%^[^:]+:[^:]+:(ldap.*://[^/]+)/.*$%$1%;
-               $base =~ s%^[^:]+:[^:]+:ldap.*://[^/]+/(.*)$%$1%;
-               push (@ldap_uris, $server);
+                $base= $server;
+                $server =~ s%^[^:]+:[^:]+:(ldap.*://[^/]+)/.*$%$1%;
+                $base =~ s%^[^:]+:[^:]+:ldap.*://[^/]+/(.*)$%$1%;
+                push (@ldap_uris, $server);
        }
 
        # Assemble data package
@@ -783,7 +784,7 @@ sub new_ldap_config {
        if (defined $unit_tag){
 
                # Find admin base and department name
-               $mesg = $ldap->search( base   => $ldap_base,
+               $mesg = $main::ldap_handle->search( base   => $ldap_base,
                        scope  => 'sub',
                        attrs => ['dn', 'ou'],
                        filter => "(&(objectClass=gosaAdministrativeUnit)(gosaUnitTag=$unit_tag))");
@@ -807,14 +808,6 @@ sub new_ldap_config {
                $data{'unit_tag'}= $unit_tag;
        }
 
-
-       # Unbind
-       $mesg = $ldap->unbind;
-       if($mesg->code) {
-               &main::daemon_log($mesg->error, 1);
-               return;
-       }
-
        # Send information
        return &build_msg("new_ldap_config", $server_address, $address, \%data);
 }
@@ -847,17 +840,14 @@ sub hardware_config {
        }
 
        # Build LDAP connection
-       my $ldap = Net::LDAP->new($ldap_uri);
-       if( not defined $ldap ) {
+  &main::refresh_ldap_handle();
+       if( not defined $main::ldap_handle ) {
                &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1);
                return;
        } 
 
-       # Bind to a directory with dn and password
-       my $mesg= $ldap->bind($ldap_admin_dn, password => $ldap_admin_password);
-
        # Perform search
-       $mesg = $ldap->search(
+       $mesg = $main::ldap_handle->search(
                base   => $ldap_base,
                scope  => 'sub',
                filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))"
@@ -871,7 +861,7 @@ sub hardware_config {
                if(defined($entry->get_value("gotoHardwareChecksum"))) {
                        if(! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) {
                                $entry->replace(gotoHardwareChecksum => $gotoHardwareChecksum);
-                               if($entry->update($ldap)) {
+                               if($entry->update($main::ldap_handle)) {
                                        &main::daemon_log("Hardware changed! Detection triggered.", 4);
                                }
                        } else {
@@ -890,9 +880,6 @@ sub hardware_config {
                $data{'goto_secret'}= $goto_secret;
        }
 
-       # Unbind
-       $mesg = $ldap->unbind;
-
        &main::daemon_log("Send detect_hardware message to $address", 4);
 
        # Send information
@@ -906,6 +893,8 @@ sub server_matches {
 
        if($server_ip eq $target_ip) {
                $result= 1;
+       } elsif ($target_ip eq "0.0.0.0") {
+               $result= 1;
        } elsif ($server_ip eq "0.0.0.0") {     
                if ($target_ip eq "127.0.0.1") {
                        $result= 1;