Code

Increased waiting time.
[gosa.git] / gosa-si / modules / SIPackages.pm
index f346ae26d566b13b025f7dcb572d6c2d7cb9e0ad..00def48475f2a6e23380df446f3d58e25854fcef 100644 (file)
@@ -361,7 +361,7 @@ sub register_at_bus {
 #  DESCRIPTION:  handels the proceeded distribution to the appropriated functions
 #===============================================================================
 sub process_incoming_msg {
-    my ($msg, $msg_hash) = @_ ;
+    my ($msg, $msg_hash, $remote_ip) = @_ ;
     my $error = 0;
     my $host_name;
     my $host_key;
@@ -369,7 +369,6 @@ sub process_incoming_msg {
 
     # process incoming msg
     my $header = @{$msg_hash->{header}}[0]; 
-    my $source = @{$msg_hash->{source}}[0];
     my @target_l = @{$msg_hash->{target}};
 
     &main::daemon_log("SIPackages: msg to process: $header", 3);
@@ -383,26 +382,25 @@ sub process_incoming_msg {
     if( 1 == length @target_l) {
         my $target = $target_l[0];
         if( $target eq $server_address ) {  
-            if ($header eq 'new_passwd') {
-               @out_msg_l = &new_passwd($msg_hash)
-           } elsif ($header eq 'here_i_am') {
-               @out_msg_l = &here_i_am($msg_hash)
-           } elsif ($header eq 'who_has') {
-               @out_msg_l = &who_has($msg_hash)
-           } elsif ($header eq 'who_has_i_do') {
-               @out_msg_l = &who_has_i_do($msg_hash)
-           } elsif ($header eq 'got_ping') {
-               @out_msg_l = &got_ping($msg_hash)
-           } elsif ($header eq 'get_load') {
-               @out_msg_l = &execute_actions($msg_hash)
+            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)
+            } elsif ($header eq 'who_has') {
+                @out_msg_l = &who_has($msg_hash)
+            } elsif ($header eq 'who_has_i_do') {
+                @out_msg_l = &who_has_i_do($msg_hash)
+            } elsif ($header eq 'got_ping') {
+                @out_msg_l = &got_ping($msg_hash)
+            } elsif ($header eq 'get_load') {
+                @out_msg_l = &execute_actions($msg_hash)
             } elsif ($header eq 'detected_hardware') {
-               @out_msg_l = &process_detected_hardware($msg_hash)
-           } elsif ($header eq 'trigger_wake') {
-               my $in_hash= &transform_msg2hash($msg);
-               foreach (@{$in_hash->{macAddress}}){
-                   &main::daemon_log("SIPackages: trigger wake for $_", 1);
-                   do_wake($_);
-               }
+                @out_msg_l = &process_detected_hardware($msg_hash)
+            } elsif ($header eq 'trigger_wake') {
+                foreach (@{$msg_hash->{macAddress}}){
+                    &main::daemon_log("SIPackages: trigger wake for $_", 1);
+                    do_wake($_);
+                }
 
             } else {
                 &main::daemon_log("ERROR: $header is an unknown core function", 1);
@@ -454,13 +452,13 @@ sub got_ping {
 #      RETURNS:  nothing
 #  DESCRIPTION:  process this incoming message
 #===============================================================================
-sub new_passwd {
+sub new_key {
     my ($msg_hash) = @_;
     my @out_msg_l;
     
     my $header = @{$msg_hash->{header}}[0];
     my $source_name = @{$msg_hash->{source}}[0];
-    my $source_key = @{$msg_hash->{new_passwd}}[0];
+    my $source_key = @{$msg_hash->{new_key}}[0];
     my $query_res;
 
     # check known_clients_db
@@ -472,7 +470,6 @@ sub new_passwd {
             "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 $out_msg = &create_xml_string($hash);
         push(@out_msg_l, $out_msg);
@@ -792,19 +789,8 @@ sub new_ldap_config {
 
 sub process_detected_hardware {
        my $msg_hash = shift;
+       my $address = $msg_hash->{source}[0];
 
-
-       return;
-}
-#===  FUNCTION  ================================================================
-#         NAME:  hardware_config
-#   PARAMETERS:  address - string - ip address and port of a host
-#      RETURNS:  
-#  DESCRIPTION:  
-#===============================================================================
-sub hardware_config {
-    my ($address, $gotoHardwareChecksum) = @_ ;
-    
     my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address'";
     my $res = $main::known_clients_db->select_dbentry( $sql_statement );
 
@@ -821,7 +807,6 @@ sub hardware_config {
         &main::daemon_log("ERROR: no mac address found for client $address", 1);
         return;
     }
-
     # Build LDAP connection
     my $ldap = Net::LDAP->new($ldap_uri);
     if( not defined $ldap ) {
@@ -838,7 +823,84 @@ sub hardware_config {
                scope  => 'sub',
                filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))"
        );
-       
+
+       if($mesg->count == 1) {
+               my $entry= $mesg->entry(0);
+               $entry->changetype("modify");
+               foreach my $attribute (
+                       "gotoSndModule", "ghNetNic", "gotoXResolution", "ghSoundAdapter", "ghCpuType", "gotoXkbModel", 
+                       "ghGfxAdapter", "gotoXMousePort", "ghMemSize", "gotoXMouseType", "ghUsbSupport", "gotoXHsync", 
+                       "gotoXDriver", "gotoXVsync", "gotoXMonitor") {
+                       if(defined($msg_hash->{detected_hardware}[0]->{$attribute})) {
+                               if(defined($entry->get_value($attribute))) {
+                                       $entry->delete($attribute);
+                               }
+                               &main::daemon_log("Adding attribute $attribute with value ".$msg_hash->{detected_hardware}[0]->{$attribute},1);
+                               $entry->add($attribute => $msg_hash->{detected_hardware}[0]->{$attribute});     
+                       }
+               }
+               foreach my $attribute (
+                       "gotoModules", "ghScsiDev", "ghIdeDev") {
+                       if(defined($msg_hash->{detected_hardware}[0]->{$attribute})) {
+                               if(defined($entry->get_value($attribute))) {
+                                       $entry->delete($attribute);
+                               }
+                               foreach my $array_entry (@{$msg_hash->{detected_hardware}[0]->{$attribute}}) {
+                                       $entry->add($attribute => $array_entry);
+                               }
+                       }
+
+               }
+               if($entry->update($ldap)) {
+                       &main::daemon_log("Added Hardware configuration to LDAP", 4);
+               }
+
+       }
+       return;
+}
+#===  FUNCTION  ================================================================
+#         NAME:  hardware_config
+#   PARAMETERS:  address - string - ip address and port of a host
+#      RETURNS:  
+#  DESCRIPTION:  
+#===============================================================================
+sub hardware_config {
+       my ($address, $gotoHardwareChecksum) = @_ ;
+
+       my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$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);
+       }
+
+       my $macaddress = $res->{1}->{macaddress};
+       my $hostkey = $res->{1}->{hostkey};
+
+       if (not defined $macaddress) {
+               &main::daemon_log("ERROR: no mac address found for client $address", 1);
+               return;
+       }
+
+       # Build LDAP connection
+       my $ldap = Net::LDAP->new($ldap_uri);
+       if( not defined $ldap ) {
+               &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,
+               scope  => 'sub',
+               filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))"
+       );
+
        if($mesg->count() == 0) {
                &main::daemon_log("Host was not found in LDAP!", 1);
                return;
@@ -847,35 +909,82 @@ sub hardware_config {
        my $entry= $mesg->entry(0);
        my $dn= $entry->dn;
        if(defined($entry->get_value("gotoHardwareChecksum"))) {
-               return;
+               if(! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) {
+                       $entry->replace(gotoHardwareChecksum => $gotoHardwareChecksum);
+                       if($entry->update($ldap)) {
+                               &main::daemon_log("Hardware changed! Detection triggered.", 4);
+                       }
+               } else {
+                       # Nothing to do
+                       return;
+               }
        } else {
                # need to fill it to LDAP
                $entry->add(gotoHardwareChecksum => $gotoHardwareChecksum);
-               &main::daemon_log(Dumper($entry->update($ldap)),1);
+               if($entry->update($ldap)) {
+                       &main::daemon_log("gotoHardwareChecksum $gotoHardwareChecksum was added to LDAP", 4);
+               }
+
+               ## Look if there another host with this checksum to use the hardware config
+               #$mesg = $ldap->search(
+               #       base   => $ldap_base,
+               #       scope  => 'sub',
+               #       filter => "(&(objectClass=GOhard)(gotoHardwareChecksum=$gotoHardwareChecksum))"
+               #);
+
+               #if($mesg->count>1) {
+               #       my $clone_entry= $mesg->entry(0);
+               #       $entry->changetype("modify");
+               #       foreach my $attribute (
+               #               "gotoSndModule", "ghNetNic", "gotoXResolution", "ghSoundAdapter", "ghCpuType", "gotoXkbModel", 
+               #               "ghGfxAdapter", "gotoXMousePort", "ghMemSize", "gotoXMouseType", "ghUsbSupport", "gotoXHsync", 
+               #               "gotoXDriver", "gotoXVsync", "gotoXMonitor") {
+               #               my $value= $clone_entry->get_value($attribute);
+               #               if(defined($value)) {
+               #                       if(defined($entry->get_value($attribute))) {
+               #                               $entry->delete($attribute);
+               #                       }
+               #                       &main::daemon_log("Adding attribute $attribute with value $value",1);
+               #                       $entry->add($attribute => $value);
+               #               }
+               #       }
+               #       foreach my $attribute (
+               #               "gotoModules", "ghScsiDev", "ghIdeDev") {
+               #               my $array= $clone_entry->get_value($attribute, 'as_ref' => 1);
+               #               if(defined($array))     {
+               #                       if(defined($entry->get_value($attribute))) {
+               #                               $entry->delete($attribute);
+               #                       }
+               #                       foreach my $array_entry (@{$array}) {
+               #                               $entry->add($attribute => $array_entry);
+               #                       }
+               #               }
+
+               #       }
+               #       if($entry->update($ldap)) {
+               #               &main::daemon_log("Added Hardware configuration to LDAP", 4);
+               #       }
+
+               #}
 
-               # Look if there another host with this checksum to use the hardware config
-               $mesg = $ldap->search(
-                       base   => $ldap_base,
-                       scope  => 'sub',
-                       filter => "(&(objectClass=GOhard)(gotoHardwareChecksum=$gotoHardwareChecksum))"
-               );
        }
 
-    # Assemble data package
-    my %data = ();
+       # Assemble data package
+       my %data = ();
 
-    # Need to append GOto settings?
-    if (defined $goto_admin and defined $goto_secret){
-           $data{'goto_admin'}= $goto_admin;
-           $data{'goto_secret'}= $goto_secret;
-    }
+       # Need to append GOto settings?
+       if (defined $goto_admin and defined $goto_secret){
+               $data{'goto_admin'}= $goto_admin;
+               $data{'goto_secret'}= $goto_secret;
+       }
 
-    # Unbind
-    $mesg = $ldap->unbind;
+       # Unbind
+       $mesg = $ldap->unbind;
 
        &main::daemon_log("Send detect_hardware message to $address", 4);
-    # Send information
-    return send_msg("detect_hardware", $server_address, $address, \%data);
+       
+       # Send information
+       return send_msg("detect_hardware", $server_address, $address, \%data);
 }