Code

Updated strings
[gosa.git] / gosa-si / gosa-si-server
index 2e43b6fc3375dd2f6458590b7c62e8f6186519aa..a8e2bf2494da232ee7e6fd2f7d3f78a0aff5b837 100755 (executable)
@@ -127,7 +127,7 @@ our $fai_server_tn = "fai_server";
 my $fai_server_file_name;
 our @fai_server_col_names = ('timestamp', 'server', 'release', 'tag'); 
 our $fai_release_tn = "fai_release"; 
-our @fai_release_col_names = ('timestamp', 'release', 'class', 'type'); 
+our @fai_release_col_names = ('timestamp', 'release', 'class', 'type', 'state'); 
 
 # holds all packages available from different repositories
 our $packages_list_db;
@@ -143,6 +143,9 @@ our $messaging_tn = "messaging";
 our @messaging_col_names = ('subject', 'from', 'to', 'flag', 'direction', 'delivery_time', 'message', 'timestamp', 'id INTEGER', );
 my $messaging_file_name;
 
+# path to directory to store client install log files
+our $client_fai_log_dir = "/var/log/fai"; 
+
 %cfg_defaults = (
 "general" => {
     "log-file" => [\$log_file, "/var/run/".$prg.".log"],
@@ -414,7 +417,7 @@ sub check_key_and_xml_validity {
         $msg = &decrypt_msg($crypted_msg, $module_key);
 
         if ($msg =~ /<xml>/i){
-            &main::daemon_log("decrypted_msg: \n$msg", 8);
+            daemon_log("decrypted_msg: \n$msg", 8);
             $msg_hash = $xml->XMLin($msg, ForceArray=>1);
 
             ##############
@@ -443,7 +446,7 @@ sub check_key_and_xml_validity {
         }
     };
     if($@) {
-        &main::daemon_log("WARNING: do not understand the message: $@", 5);
+        daemon_log("WARNING: do not understand the message: $@", 5);
         $msg = undef;
         $msg_hash = undef;
     }
@@ -547,7 +550,7 @@ sub input_from_known_server {
     }
 
     if( (!$msg) || (!$msg_hash) || (!$module) ) {
-        daemon_log("INFO: Incoming message is not from a known server", 5);
+        daemon_log("DEBUG: Incoming message is not from a known server", 7);
     }
   
     return ($msg, $msg_hash, $module);
@@ -584,7 +587,7 @@ sub input_from_known_client {
     }
 
     if( (!$msg) || (!$msg_hash) || (!$module) ) {
-        &daemon_log("INFO: Incoming message is not from a known client", 5);
+        &daemon_log("DEBUG: Incoming message is not from a known client", 7);
     }
 
     return ($msg, $msg_hash, $module);
@@ -624,7 +627,7 @@ sub input_from_unknown_host {
     }
 
     if( (!$msg) || (!$msg_hash) || (!$module)) {
-        daemon_log("INFO: Incoming message is not from an unknown host", 5);
+        daemon_log("DEBUG: Incoming message is not from an unknown host", 7);
     }
 
     return ($msg, $msg_hash, $module);
@@ -763,6 +766,7 @@ sub get_ip {
        return $result;
 }
 
+
 sub get_local_ip_for_remote_ip {
        my $remote_ip= shift;
        my $result="0.0.0.0";
@@ -903,16 +907,18 @@ sub update_jobdb_status_for_send_msgs {
     if( $answer =~ /<jobdb_id>(\d+)<\/jobdb_id>/ ) {
         my $jobdb_id = $1;
         if( $error ) {
-            # sending msg faild
-            my $sql_statement = "UPDATE $job_queue_tn ".
-                "SET status='error', result='can not deliver msg, please consult log file' ".
-                "WHERE id='$jobdb_id'";
-            my $res = $job_db->update_dbentry($sql_statement);
+            if (not $answer =~ /<header>trigger_action_reinstall<\/header>/) {
+                # sending msg faild
+                my $sql_statement = "UPDATE $job_queue_tn ".
+                    "SET status='error', result='can not deliver msg, please consult log file' ".
+                    "WHERE id='$jobdb_id'";
+                my $res = $job_db->update_dbentry($sql_statement);
+            }
         } else {
             # sending msg was successful
             my $sql_statement = "UPDATE $job_queue_tn ".
                 "SET status='done' ".
-                "WHERE id='$jobdb_id'";
+                "WHERE id='$jobdb_id' AND status='processed'";
             my $res = $job_db->update_dbentry($sql_statement);
         }
     }
@@ -938,8 +944,9 @@ sub client_input {
     my ($answer_header, @answer_target_l, $answer_source);
     my $client_answer;
 
+    daemon_log("", 5); 
     daemon_log("INFO: Incoming msg from '".$heap->{'remote_ip'}."'", 5);
-    daemon_log("DEBUG: Incoming message:\n$input", 8);
+    daemon_log("DEBUG: Incoming msg:\n$input", 9);
 
     ####################
     # check incoming msg
@@ -961,6 +968,7 @@ sub client_input {
     ######################
     # process incoming msg
     if( $error == 0) {
+        daemon_log("INFO: Incoming msg with header '".@{$msg_hash->{'header'}}[0]."'", 5); 
         daemon_log("DEBUG: Processing module ".$module, 7);
         $answer_l = &{ $module."::process_incoming_msg" }($msg, $msg_hash, $session_id);
 
@@ -1226,6 +1234,141 @@ sub refresh_ldap_handle {
 }
 
 
+sub change_fai_state {
+    my ($st, $targets) = @_;
+
+    # Set FAI state to localboot
+    my %mapActions= (
+        reboot    => '',
+        update    => 'softupdate',
+        localboot => 'localboot',
+        reinstall => 'install',
+        rescan    => '',
+        wake      => '',
+        memcheck  => 'memcheck',
+        sysinfo   => 'sysinfo',
+    );
+
+    # Return if this is unknown
+    if (!exists $mapActions{ $st }){
+      return;
+    }
+
+    my $state= $mapActions{ $st };
+
+    &refresh_ldap_handle();
+    if( defined($ldap_handle) ) {
+
+      # Build search filter for hosts
+      my $search= "(&(objectClass=GOhard)";
+      foreach (@{$targets}){
+        $search.= "(macAddress=$_)";
+      }
+      $search.= ")";
+
+      # If there's any host inside of the search string, procress them
+      if (!($search =~ /macAddress/)){
+        return;
+      }
+
+      # Perform search for Unit Tag
+      my $mesg = $ldap_handle->search(
+          base   => $ldap_base,
+          scope  => 'sub',
+          attrs  => ['dn', 'FAIstate', 'objectClass'],
+          filter => "$search"
+          );
+
+      if ($mesg->count) {
+        my @entries = $mesg->entries;
+        foreach my $entry (@entries) {
+
+          # Only modify entry if it is not set to '$state'
+          if ($entry->get_value("FAIstate") ne "$state"){
+
+            daemon_log("INFO: Setting FAIstate to '$state' for ".$entry->dn, 5);
+            my $result;
+            my %tmp = map { $_ => 1 } $entry->get_value("objectClass");
+            if (exists $tmp{'FAIobject'}){
+              if ($state eq ''){
+                $result= $ldap_handle->modify($entry->dn, changes => [
+                            delete => [ FAIstate => [] ] ]);
+              } else {
+                $result= $ldap_handle->modify($entry->dn, changes => [
+                            replace => [ FAIstate => $state ] ]);
+              }
+            } elsif ($state ne ''){
+              $result= $ldap_handle->modify($entry->dn, changes => [
+                          add     => [ objectClass => 'FAIobject' ],
+                          add     => [ FAIstate => $state ] ]);
+            }
+
+            # Errors?
+            if ($result->code){
+              daemon_log("Error: Setting FAIstate to '$state' for ".$entry->dn. "failed: ".$result->error, 1);
+            }
+
+          }
+        }
+      }
+    }
+}
+
+
+sub change_goto_state {
+    my ($st, $targets) = @_;
+
+    # Switch on or off?
+    my $state= $st eq 'active' ? 'active': 'locked';
+
+    &refresh_ldap_handle();
+    if( defined($ldap_handle) ) {
+
+      # Build search filter for hosts
+      my $search= "(&(objectClass=GOhard)";
+      foreach (@{$targets}){
+        $search.= "(macAddress=$_)";
+      }
+      $search.= ")";
+
+      # If there's any host inside of the search string, procress them
+      if (!($search =~ /macAddress/)){
+        return;
+      }
+
+      # Perform search for Unit Tag
+      my $mesg = $ldap_handle->search(
+          base   => $ldap_base,
+          scope  => 'sub',
+          attrs  => ['dn', 'gotoMode'],
+          filter => "$search"
+          );
+
+      if ($mesg->count) {
+        my @entries = $mesg->entries;
+        foreach my $entry (@entries) {
+
+          # Only modify entry if it is not set to '$state'
+          if ($entry->get_value("gotoMode") ne $state){
+
+            daemon_log("INFO: Setting gotoMode to '$state' for ".$entry->dn, 5);
+            my $result;
+            $result= $ldap_handle->modify($entry->dn, changes => [
+                                                replace => [ gotoMode => $state ] ]);
+
+            # Errors?
+            if ($result->code){
+              &daemon_log("Error: Setting gotoMode to '$state' for ".$entry->dn. "failed: ".$result->error, 1);
+            }
+
+          }
+        }
+      }
+
+    }
+}
+
+
 sub create_fai_server_db {
     my ($table_name) = $_[ARG0];
        my $result;
@@ -1233,7 +1376,7 @@ sub create_fai_server_db {
        if(defined($ldap_handle)) {
                daemon_log("Creating fai_server_db",4);
                my $mesg= $ldap_handle->search(
-                       base   => $main::ldap_base,
+                       base   => $ldap_base,
                        scope  => 'sub',
                        attrs  => ['FAIrepository', 'gosaUnitTag'],
                        filter => "(&(FAIrepository=*)(objectClass=FAIrepositoryServer))",
@@ -1271,7 +1414,7 @@ sub create_fai_release_db {
        if(defined($ldap_handle)) {
                daemon_log("Creating fai_release_db",4);
                my $mesg= $ldap_handle->search(
-                       base   => $main::ldap_base,
+                       base   => $ldap_base,
                        scope  => 'sub',
                        attrs  => [],
                        filter => "(&(objectClass=organizationalUnit)(ou=fai))",
@@ -1279,6 +1422,7 @@ sub create_fai_release_db {
                if($mesg->{'resultCode'} == 0 &&
                        $mesg->count != 0) {
                        # Walk through all possible FAI container ou's
+                       my @sql_list;
                        foreach my $ou (@{$mesg->{entries}}) {
                                my $tmp_classes= resolve_fai_classes($ou->dn);
                                if(defined($tmp_classes)) {
@@ -1286,18 +1430,22 @@ sub create_fai_release_db {
                                        if(@tmp_array) {
                                                foreach my $entry (@tmp_array) {
                                                        if(defined($entry) && ref($entry) eq 'HASH') {
-                                                               $fai_server_db->add_dbentry( { 
-                                                                               table => $table_name,
-                                                                               primkey => ['release', 'class', 'type'],
-                                                                               release => $entry->{'release'},
-                                                                               class => $entry->{'class'},
-                                                                               type => $entry->{'type'}
-                                                                       } );
+                                                               my $timestamp= &get_time();
+                                                               my $sql= 
+                                                                "INSERT INTO $table_name "
+                                                               ."(timestamp, release, class, type, state) VALUES ("
+                                                               .$timestamp.","
+                                                               ."'".$entry->{'release'}."',"
+                                                               ."'".$entry->{'class'}."',"
+                                                               ."'".$entry->{'type'}."',"
+                                                               ."'".$entry->{'state'}."')";
+                                                               push @sql_list, $sql;
                                                        }
                                                }
                                        }
                                }
                        }
+                       $fai_server_db->exec_statementlist(\@sql_list);
                }
                daemon_log("Done with creating fai_release_db",4);
        }
@@ -1324,13 +1472,16 @@ sub get_fai_release_entries {
                                        push @result, $bufentry;
                                }
                        } else {
-                               my $types = get_fai_types($tmp_classes->{$entry});
-                               push @result, 
-                               {
-                                       'class' => $entry,
-                                       'type' => $types,
-                                       'release' => $parent,
-                               };
+                               my @types = get_fai_types($tmp_classes->{$entry});
+                               foreach my $type (@types) {
+                                       push @result, 
+                                       {
+                                               'class' => $entry,
+                                               'type' => $type->{'type'},
+                                               'release' => $parent,
+                                               'state' => $type->{'state'},
+                                       };
+                               }
                        }
                }
        }
@@ -1340,14 +1491,34 @@ sub get_fai_release_entries {
 
 sub get_fai_types {
        my $tmp_classes = shift || return undef;
-       my $result = "";
+       my @result;
 
        foreach my $type(keys %{$tmp_classes}) {
                if(defined($tmp_classes->{$type}[0]) && (!($tmp_classes->{$type}[0] =~ /^.*?removed.*?$/))) {
-                       $result.= "$type|";
+                       my $entry = {
+                               type => $type,
+                               state => $tmp_classes->{$type}[0],
+                       };
+                       push @result, $entry;
                }
        }
-       chop($result);
+
+       return @result;
+}
+
+sub get_fai_state {
+       my $result = "";
+       my $tmp_classes = shift || return $result;
+
+       foreach my $type(keys %{$tmp_classes}) {
+               if(defined($tmp_classes->{$type}[0])) {
+                       $result = $tmp_classes->{$type}[0];
+                       
+               # State is equal for all types in class
+                       last;
+               }
+       }
+
        return $result;
 }