Code

add job entries if missing while installation
[gosa.git] / gosa-si / modules / SIPackages.pm
index 1859b3003d6ad5883a86d8de5bc83c66d6b6b1fe..7ee752072f553f6f864efb872c32985b4e4a3829 100644 (file)
@@ -16,7 +16,6 @@ use NetAddr::IP;
 use Net::LDAP;
 use Socket;
 use Net::hostent;
-use utf8;
 
 my $event_dir = "/usr/lib/gosa-si/server/events";
 use lib "/usr/lib/gosa-si/server/events";
@@ -248,7 +247,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;
                                }
                        }       
@@ -390,7 +389,7 @@ sub process_incoming_msg {
     my $error = 0;
     my $host_name;
     my $host_key;
-    my @out_msg_l = ();
+    my @out_msg_l = ("nohandler");
 
     # process incoming msg
     my $header = @{$msg_hash->{header}}[0]; 
@@ -399,11 +398,10 @@ sub process_incoming_msg {
     # skip PREFIX
     $header =~ s/^CLMSG_//;
 
-    &main::daemon_log("DEBUG: SIPackages: msg to process: $header", 7);
-    &main::daemon_log("$msg", 8);
+    &main::daemon_log("$session_id DEBUG: SIPackages: msg to process: $header", 7);
 
     if( 0 == length @target_l){     
-        &main::daemon_log("ERROR: no target specified for msg $header", 1);
+        &main::daemon_log("$session_id ERROR: no target specified for msg $header", 1);
         $error++;
     }
 
@@ -415,22 +413,24 @@ sub process_incoming_msg {
             if ($header eq 'new_key') {
                 @out_msg_l = &new_key($msg_hash)
             } elsif ($header eq 'here_i_am') {
-                @out_msg_l = &here_i_am($msg_hash)
+                @out_msg_l = &here_i_am($msg, $msg_hash, $session_id)
             } else {
                 if( exists $event_hash->{$header} ) {
                     # a event exists with the header as name
-                    &main::daemon_log("INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5);
+                    &main::daemon_log("$session_id INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5);
                     no strict 'refs';
                     @out_msg_l = &{$event_hash->{$header}."::$header"}($msg, $msg_hash, $session_id);
                 }
             }
 
             # 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);
-            } elsif( 0 == @out_msg_l) {
-                &main::daemon_log("ERROR: SIPackages: no event handler or core function defined for '$header'", 1);
+            if( not defined $out_msg_l[0] ) {
+                @out_msg_l = ();
+            } elsif( $out_msg_l[0] eq 'nohandler') {
+                &main::daemon_log("$session_id ERROR: SIPackages: no event handler or core function defined for '$header'", 1);
+                @out_msg_l = ();
             } 
+
         }
                else {
                        &main::daemon_log("INFO: msg is not for gosa-si-server '$server_address', deliver it to target '$target'", 5);
@@ -500,7 +500,7 @@ sub new_key {
 #  DESCRIPTION:  process this incoming message
 #===============================================================================
 sub here_i_am {
-    my ($msg_hash) = @_;
+    my ($msg, $msg_hash, $session_id) = @_;
     my @out_msg_l;
     my $out_hash;
 
@@ -516,16 +516,16 @@ sub here_i_am {
     my $db_res= $main::known_clients_db->select_dbentry( $sql_statement );
     
     if ( 1 == keys %{$db_res} ) {
-        &main::daemon_log("WARNING: $source is already known as a client", 1);
-        &main::daemon_log("WARNING: values for $source are being overwritten", 1);   
+        &main::daemon_log("$session_id WARNING: $source is already known as a client", 1);
+        &main::daemon_log("$session_id WARNING: values for $source are being overwritten", 1);   
         $nu_clients --;
     }
 
     # number of actual activ clients
     my $act_nu_clients = $nu_clients;
 
-    &main::daemon_log("INFO: number of actual activ clients: $act_nu_clients", 5);
-    &main::daemon_log("INFO: number of maximal allowed clients: $max_clients", 5);
+    &main::daemon_log("$session_id INFO: number of actual activ clients: $act_nu_clients", 5);
+    &main::daemon_log("$session_id INFO: number of maximal allowed clients: $max_clients", 5);
 
     if($max_clients <= $act_nu_clients) {
         my $out_hash = &create_xml_hash("denied", $server_address, $source);
@@ -555,14 +555,12 @@ sub here_i_am {
                                                 } );
 
     if ($res != 0)  {
-        &main::daemon_log("ERROR: cannot add entry to known_clients: $res");
+        &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $res");
         return;
     }
     
     # 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") {
@@ -577,16 +575,32 @@ 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("$session_id INFO: send bus msg that client '$source' has registered at server '$server_address'", 5);
     }
 
     # give the new client his ldap config
-    my $new_ldap_config_out = &new_ldap_config($source);
-    if( $new_ldap_config_out ) {
-        push(@out_msg_l, $new_ldap_config_out);
+    # Workaround: Send within the registration response, if the client will get an ldap config later
+       my $new_ldap_config_out = &new_ldap_config($source, $session_id);
+       if($new_ldap_config_out && (!($new_ldap_config_out =~ /error/))) {
+               &add_content2xml_hash($out_hash, "ldap_available", "true");
+       } elsif($new_ldap_config_out && $new_ldap_config_out =~ /error/){
+               &add_content2xml_hash($out_hash, "error", $new_ldap_config_out);
+
+               my $sql_statement = "UPDATE $main::job_queue_tn ".
+               "SET status='error', result='$new_ldap_config_out' ".
+               "WHERE status='processing' AND macaddress LIKE '$mac_address'";
+               my $res = $main::job_db->update_dbentry($sql_statement);
+               &main::daemon_log("$session_id DEBUG: $sql_statement RESULT: $res", 7);         
+       }
+    my $register_out = &create_xml_string($out_hash);
+    push(@out_msg_l, $register_out);
+
+    # Really send the ldap config
+    if( $new_ldap_config_out && (!($new_ldap_config_out =~ /error/))) {
+            push(@out_msg_l, $new_ldap_config_out);
     }
 
-       my $hardware_config_out = &hardware_config($source, $gotoHardwareChecksum);
+       my $hardware_config_out = &hardware_config($msg, $msg_hash, $session_id);
        if( $hardware_config_out ) {
                push(@out_msg_l, $hardware_config_out);
        }
@@ -651,15 +665,15 @@ sub who_has_i_do {
 #  DESCRIPTION:  send to address the ldap configuration found for dn gotoLdapServer
 #===============================================================================
 sub new_ldap_config {
-       my ($address) = @_ ;
+       my ($address, $session_id) = @_ ;
 
-       my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address' OR macaddress='$address'";
+       my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address' OR macaddress LIKE '$address'";
        my $res = $main::known_clients_db->select_dbentry( $sql_statement );
 
        # check hit
        my $hit_counter = keys %{$res};
        if( not $hit_counter == 1 ) {
-               &main::daemon_log("ERROR: more or no hit found in known_clients_db by query by '$address'", 1);
+               &main::daemon_log("$session_id ERROR: more or no hit found in known_clients_db by query by '$address'", 1);
        }
 
     $address = $res->{1}->{hostname};
@@ -667,14 +681,14 @@ sub new_ldap_config {
        my $hostkey = $res->{1}->{hostkey};
 
        if (not defined $macaddress) {
-               &main::daemon_log("ERROR: no mac address found for client $address", 1);
+               &main::daemon_log("$session_id ERROR: no mac address found for client $address", 1);
                return;
        }
 
        # Build LDAP connection
   &main::refresh_ldap_handle();
        if( not defined $main::ldap_handle ) {
-               &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1);
+               &main::daemon_log("$session_id ERROR: cannot connect to ldap: $ldap_uri", 1);
                return;
        } 
 
@@ -682,20 +696,20 @@ sub new_ldap_config {
        $mesg = $main::ldap_handle->search( base   => $ldap_base,
                scope  => 'sub',
                attrs => ['dn', 'gotoLdapServer', 'gosaUnitTag', 'FAIclass'],
-               filter => "(&(objectClass=GOhard)(macaddress=$macaddress)(gotoMode=active))");
+               filter => "(&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))");
        #$mesg->code && die $mesg->error;
        if($mesg->code) {
-               &main::daemon_log($mesg->error, 1);
+               &main::daemon_log("$session_id ".$mesg->error, 1);
                return;
        }
 
        # Sanity check
        if ($mesg->count != 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("$session_id WARNING: client with mac address $macaddress not found/unique/active - not sending ldap config".
+                "\n\tbase: $ldap_base".
+                "\n\tscope: sub".
+                "\n\tattrs: dn, gotoLdapServer".
+                "\n\tfilter: (&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))", 1);
                return;
        }
 
@@ -722,13 +736,13 @@ sub new_ldap_config {
                        filter => "(&(objectClass=gosaGroupOfNames)(member=$dn))");
                #$mesg->code && die $mesg->error;
                if($mesg->code) {
-                       &main::daemon_log($mesg->error, 1);
+                       &main::daemon_log("$session_id ".$mesg->error, 1);
                        return;
                }
 
                # Sanity check
                if ($mesg->count != 1) {
-                       &main::daemon_log("WARNING: no LDAP information found for client mac $macaddress", 1);
+                       &main::daemon_log("$session_id WARNING: no LDAP information found for client mac $macaddress", 1);
                        return;
                }
 
@@ -786,13 +800,13 @@ sub new_ldap_config {
                #$mesg->code && die $mesg->error;
                if($mesg->code) {
                        &main::daemon_log($mesg->error, 1);
-                       return;
+                       return "error-unit-tag-count-0";
                }
 
                # Sanity check
                if ($mesg->count != 1) {
                        &main::daemon_log("WARNING: cannot find administrative unit for client with tag $unit_tag", 1);
-                       return;
+                       return "error-unit-tag-count-".$mesg->count;
                }
 
                $entry= $mesg->entry(0);
@@ -815,7 +829,10 @@ sub new_ldap_config {
 #  DESCRIPTION:  
 #===============================================================================
 sub hardware_config {
-       my ($address, $gotoHardwareChecksum) = @_ ;
+       my ($msg, $msg_hash, $session_id) = @_ ;
+       my $address = @{$msg_hash->{source}}[0];
+       my $header = @{$msg_hash->{header}}[0];
+       my $gotoHardwareChecksum = @{$msg_hash->{gotoHardwareChecksum}}[0];
 
        my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address'";
        my $res = $main::known_clients_db->select_dbentry( $sql_statement );
@@ -825,7 +842,6 @@ sub hardware_config {
        if( not $hit_counter == 1 ) {
                &main::daemon_log("ERROR: more or no hit found in known_clients_db by query by '$address'", 1);
        }
-
        my $macaddress = $res->{1}->{macaddress};
        my $hostkey = $res->{1}->{hostkey};
 
@@ -875,9 +891,23 @@ sub hardware_config {
                $data{'goto_secret'}= $goto_secret;
        }
 
-       &main::daemon_log("Send detect_hardware message to $address", 4);
+       # set status = hardware_detection at jobqueue if entry exists
+       my $func_dic = {table=>$main::job_queue_tn,
+               primkey=>['id'],
+               timestamp=>&get_time,
+               status=>'processing',
+               result=>'none',
+               progress=>'hardware-detection',
+               headertag=>$header,
+               targettag=>$address,
+               xmlmessage=>$msg,
+               macaddress=>$macaddress,
+       };
+       my $hd_res = $main::job_db->add_dbentry($func_dic);
+       &main::daemon_log("$session_id INFO: add '$macaddress' to job queue as an installing job", 5);
 
        # Send information
+       &main::daemon_log("$session_id INFO: Send detect_hardware message to $address", 5);
        return &build_msg("detect_hardware", $server_address, $address, \%data);
 }
 
@@ -888,6 +918,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;