Code

update: ownership of installing jobs can be switch among si-server
[gosa.git] / gosa-si / server / events / clMessages.pm
index 698dad28e6684cde40c197b9d741b2d3ec5cc9ec..fde8b36b43a555b3a70b53f4977a6b1b1cf5aab4 100644 (file)
@@ -1,7 +1,12 @@
+## @file
+# @brief Implementation of a GOsa-SI event module. 
+# @details A GOsa-SI event module containing all functions to handle incoming messages from clients.
+
 package clMessages;
 use Exporter;
 @ISA = qw(Exporter);
 my @events = (
+    "confirm_usr_msg",
     "PROGRESS",
     "FAIREBOOT",
     "TASKSKIP",
@@ -28,51 +33,40 @@ BEGIN {}
 
 END {}
 
-### Start ######################################################################
-
-my $ldap_uri;
-my $ldap_base;
-my $ldap_admin_dn;
-my $ldap_admin_password;
-
-my %cfg_defaults = (
-"server" => {
-   "ldap-uri" => [\$ldap_uri, ""],
-   "ldap-base" => [\$ldap_base, ""],
-   "ldap-admin-dn" => [\$ldap_admin_dn, ""],
-   "ldap-admin-password" => [\$ldap_admin_password, ""],
-   },
-);
-&read_configfile($main::cfg_file, %cfg_defaults);
-
 
+## @method get_events()
+# @details A brief function returning a list of functions which are exported by importing the module.
+# @return List of all provided functions
 sub get_events {
     return \@events;
 }
 
+## @method confirm_usr_msg()
+# @details Confirmed messages are set in the messaging_db from d (deliverd) to s(seen). 
+# @param msg - STRING - xml message with tags 'message', 'subject' and 'usr'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
+sub confirm_usr_msg {
+    my ($msg, $msg_hash, $session_id) = @_;
+    my $message = @{$msg_hash->{'message'}}[0];
+    my $subject = @{$msg_hash->{'subject'}}[0];
+    my $usr = @{$msg_hash->{'usr'}}[0];
 
-sub read_configfile {
-    my ($cfg_file, %cfg_defaults) = @_;
-    my $cfg;
+    # set update for this message
+    my $sql = "UPDATE $main::messaging_tn SET flag='s' WHERE (message='$message' AND subject='$subject' AND message_to='$usr')"; 
+    &main::daemon_log("$session_id DEBUG: $sql", 7);
+    my $res = $main::messaging_db->exec_statement($sql); 
 
-    if( defined( $cfg_file) && ( length($cfg_file) > 0 )) {
-        if( -r $cfg_file ) {
-            $cfg = Config::IniFiles->new( -file => $cfg_file );
-        } else {
-            &main::daemon_log("ERROR: clMessages.pm couldn't read config file!", 1);
-        }
-    } else {
-        $cfg = Config::IniFiles->new() ;
-    }
-    foreach my $section (keys %cfg_defaults) {
-        foreach my $param (keys %{$cfg_defaults{ $section }}) {
-            my $pinfo = $cfg_defaults{ $section }{ $param };
-            ${@$pinfo[0]} = $cfg->val( $section, $param, @$pinfo[1] );
-        }
-    }
+
+    return;
 }
 
 
+## @method save_fai_log()
+# @details Creates under /var/log/fai/ the directory '$macaddress' and stores within all FAI log files from client.
+# @param msg - STRING - xml message with tags 'macaddress' and 'save_fai_log'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub save_fai_log {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
@@ -95,7 +89,7 @@ sub save_fai_log {
 
     my $time = &get_time;
     $time = substr($time, 0, 8)."_".substr($time, 8, 6);
-    $client_fai_log_dir = File::Spec->catfile( $client_fai_log_dir, "install-$time" );
+    $client_fai_log_dir = File::Spec->catfile( $client_fai_log_dir, "install_$time" );
     mkdir($client_fai_log_dir, 0755);
 
     my @all_logs = split(/log_file:/, $all_logs); 
@@ -112,7 +106,11 @@ sub save_fai_log {
     return;
 }
 
-
+## @method LOGIN()
+# @details Reported user from client is added to login_users_db.
+# @param msg - STRING - xml message with tag 'LOGIN'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub LOGIN {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
@@ -134,32 +132,31 @@ sub LOGIN {
     return;   
 }
 
-# TODO umstellen wie bei LOGIN
+
+## @method LOGOUT()
+# @details Reported user from client is deleted from login_users_db.
+# @param msg - STRING - xml message with tag 'LOGOUT'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub LOGOUT {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
     my $source = @{$msg_hash->{'source'}}[0];
     my $login = @{$msg_hash->{$header}}[0];
-
-    my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$source'";
-    my $res = $main::known_clients_db->select_dbentry($sql_statement);
-    if( 1 != keys(%$res) ) {
-        &main::daemon_log("DEBUG: clMessages.pm: LOGOUT: no or more hits found in known_clients_db for host '$source'");
-        return;
-    }
-
-    my $act_login = $res->{'1'}->{'login'};
-    $act_login =~ s/$login,?//gi;
-
-    if( $act_login eq "" ){ $act_login = "nobody"; }
-
-    $sql_statement = "UPDATE known_clients SET login='$act_login' WHERE hostname='$source'";
-    $res = $main::known_clients_db->update_dbentry($sql_statement);
+    
+    my $sql_statement = "DELETE FROM $main::login_users_tn WHERE (client='$source' AND user='$login')"; 
+    my $res =  $main::login_users_db->del_dbentry($sql_statement);
+    &main::daemon_log("$session_id INFO: delete user '$login' at client '$source' from login_user_db", 5); 
     
     return;
 }
 
 
+## @method CURRENTLY_LOGGED_IN()
+# @details Reported users from client are updated in login_users_db. Users which are no longer logged in are deleted from DB. 
+# @param msg - STRING - xml message
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub CURRENTLY_LOGGED_IN {
     my ($msg, $msg_hash, $session_id) = @_;
     my ($sql_statement, $db_res);
@@ -215,10 +212,15 @@ sub CURRENTLY_LOGGED_IN {
 }
 
 
+## @method GOTOACTIVATION()
+# @details Client is set at job_queue_db to status 'processing' and 'modified'.
+# @param msg - STRING - xml message with tag 'macaddress'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub GOTOACTIVATION {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
-    my $source = @{$msg_hash->{'target'}}[0];
+    my $source = @{$msg_hash->{'source'}}[0];
     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
 
     # test whether content is an empty hash or a string which is required
@@ -229,7 +231,7 @@ sub GOTOACTIVATION {
     $header =~ s/CLMSG_//g;
 
     my $sql_statement = "UPDATE $main::job_queue_tn ".
-            "SET status='processing', progress='goto-activation' ".
+            "SET status='processing', progress='goto-activation', modified='1' ".
             "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
     &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
     my $res = $main::job_db->update_dbentry($sql_statement);
@@ -238,10 +240,15 @@ sub GOTOACTIVATION {
 }
 
 
+## @method PROGRESS()
+# @details Message reports installation progress of the client. Installation job at job_queue_db is going to be updated.
+# @param msg - STRING - xml message with tags 'macaddress' and 'PROGRESS'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub PROGRESS {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
-    my $source = @{$msg_hash->{'target'}}[0];
+    my $source = @{$msg_hash->{'source'}}[0];
     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
 
     # test whether content is an empty hash or a string which is required
@@ -252,7 +259,7 @@ sub PROGRESS {
     $header =~ s/CLMSG_//g;
 
     my $sql_statement = "UPDATE $main::job_queue_tn ".
-        "SET progress='$content' ".
+        "SET progress='$content', modified='1' ".
         "WHERE status='processing' AND macaddress LIKE '$macaddress'";
     &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
     my $res = $main::job_db->update_dbentry($sql_statement);
@@ -262,10 +269,15 @@ sub PROGRESS {
 }
 
 
+## @method FAIREBOOT()
+# @details Message reports a FAI reboot. Job at job_queue_db is going to be updated.
+# @param msg - STRING - xml message with tag 'macaddress' and 'FAIREBOOT'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub FAIREBOOT {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
-    my $source = @{$msg_hash->{'target'}}[0];
+    my $source = @{$msg_hash->{'source'}}[0];
     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
 
     # test whether content is an empty hash or a string which is required
@@ -276,7 +288,7 @@ sub FAIREBOOT {
     $header =~ s/CLMSG_//g;
 
     my $sql_statement = "UPDATE $main::job_queue_tn ".
-            "SET status='processing', result='$header "."$content' ".
+            "SET status='processing', result='$header "."$content', modified='1' ".
             "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
     &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
     my $res = $main::job_db->update_dbentry($sql_statement);
@@ -286,10 +298,15 @@ sub FAIREBOOT {
 }
 
 
+## @method TASKSKIP()
+# @details Message reports a skipped FAI task. Job at job_queue_db is going to be updated. 
+# @param msg - STRING - xml message with tag 'macaddress'.
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub TASKSKIP {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
-    my $source = @{$msg_hash->{'target'}}[0];
+    my $source = @{$msg_hash->{'source'}}[0];
     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
 
     # test whether content is an empty hash or a string which is required
@@ -300,7 +317,7 @@ sub TASKSKIP {
     $header =~ s/CLMSG_//g;
 
     my $sql_statement = "UPDATE $main::job_queue_tn ".
-            "SET status='processing', result='$header "."$content' ".
+            "SET status='processing', result='$header "."$content', modified='1' ".
             "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
     &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
     my $res = $main::job_db->update_dbentry($sql_statement);
@@ -310,10 +327,16 @@ sub TASKSKIP {
 }
 
 
+## @method TASKBEGIN()
+# @details Message reports a starting FAI task. If the task is equal to 'finish', 'faiend' or 'savelog', job at job_queue_db is being set to status 'done' and FAI state is being set to 'localboot'. If task is equal to 'chboot', 'test' or 'confdir', just do nothing. In all other cases, job at job_queue_db is going to be updated or created if not exists. 
+# @param msg - STRING - xml message with tag 'macaddress'.
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub TASKBEGIN {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
-    my $source = @{$msg_hash->{'target'}}[0];
+    my $source = @{$msg_hash->{'source'}}[0];
+    my $target = @{$msg_hash->{'target'}}[0];
     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
 
     # test whether content is an empty hash or a string which is required
@@ -324,9 +347,12 @@ sub TASKBEGIN {
     $header =~ s/CLMSG_//g;
 
     # TASKBEGIN eq finish or faiend 
-    if (($content eq 'finish') || ($content eq 'faiend')){
+    if (($content eq 'finish') 
+                       || ($content eq 'faiend')
+                       || ($content eq 'savelog')
+                       ) {
         my $sql_statement = "UPDATE $main::job_queue_tn ".
-            "SET status='done', result='$header "."$content' ".
+            "SET status='done', result='$header "."$content', modified='1' ".
             "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
         &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
         my $res = $main::job_db->update_dbentry($sql_statement);
@@ -335,6 +361,14 @@ sub TASKBEGIN {
         # set fai_state to localboot
         &main::change_fai_state('localboot', \@{$msg_hash->{'macaddress'}}, $session_id);
 
+       # TASKBEGIN eq chboot
+       } elsif (($content eq 'chboot')
+               || ($content eq 'test')
+               || ($content eq 'confdir')
+               ) {
+               # just ignor this client message
+               # do nothing
+
        # other TASKBEGIN msgs
     } else {
                # select processing jobs for host
@@ -345,7 +379,9 @@ sub TASKBEGIN {
                # there is exactly one job entry in queue for this host
                if (keys(%$res) == 1) {
                        &main::daemon_log("$session_id DEBUG: there is already one processing job in queue for host '$macaddress', run an update for this entry", 7);
-                       my $sql_statement = "UPDATE $main::job_queue_tn SET result='$header $content' WHERE status='processing' AND macaddress LIKE '$macaddress'";
+                       my $sql_statement = "UPDATE $main::job_queue_tn ".
+                "SET result='$header $content', modified='1', siserver='localhost' ".
+                "WHERE status='processing' AND macaddress LIKE '$macaddress'";
                        my $err = $main::job_db->update_dbentry($sql_statement);
                        if (not defined  $err) {
                                &main::daemon_log("$session_id ERROR: cannot update job_db entry: ".Dumper($err), 1);
@@ -358,56 +394,76 @@ sub TASKBEGIN {
                                &main::daemon_log("$session_id DEBUG: there are more than one processing job in queue for host '$macaddress', ".
                                                                "delete entries", 7); 
 
-                               my $sql_statement = "DELETE FROM $main::job_queue_tn WHERE status='processing' AND macaddress LIKE '$macaddress'";
-                               my ($err) = $main::job_db->del_dbentry($sql_statement);
-                               if (not defined $err) {
-                                       &main::daemon_log("$session_id ERROR: can not delete multiple processing queue entries for host '$macaddress': ".Dumper($err), 1); 
-                               }
+                # set job to status 'done', job will be deleted automatically
+                my $sql_statement = "UPDATE $main::job_queue_tn ".
+                    "SET status='done', modified='1'".
+                    "WHERE status='processing' AND macaddress LIKE '$macaddress'";
+                &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
+                my $res = $main::job_db->update_dbentry( $sql_statement );
+
                        }
                
-                       # in case of no and more than one running jobs in queue, add on single job
+                       # in case of no and more than one running jobs in queue, add one single job
+                       # resolve plain name for host $macaddress
+                       my $plain_name;
+                       my $ldap_handle = &main::get_ldap_handle($session_id);
+                       if( not defined $ldap_handle ) {
+                               &main::daemon_log("$session_id ERROR: cannot connect to ldap", 1);
+                               $plain_name = "none";
+
+                       # try to fetch a 'real name'
+                       } else {
+                               my $mesg = $ldap_handle->search(
+                                               base => $main::ldap_base,
+                                               scope => 'sub',
+                                               attrs => ['cn'],
+                                               filter => "(macAddress=$macaddress)");
+                               if($mesg->code) {
+                                       &main::daemon_log($mesg->error, 1);
+                                       $plain_name = "none";
+                               } else {
+                                       my $entry= $mesg->entry(0);
+                                       $plain_name = $entry->get_value("cn");
+                               }
+                       }
+
+            # In any case add a new job to job queue
                        &main::daemon_log("$session_id DEBUG: add job to queue for host '$macaddress'", 7); 
                        my $func_dic = {table=>$main::job_queue_tn,
-                                       primkey=>['id'],
+                                       primkey=>['macaddress', 'headertag'],
                                        timestamp=>&get_time,
                                        status=>'processing',
                                        result=>"$header $content",
                                        progress=>'none',
                                        headertag=>'trigger_action_reinstall',
-                                       targettag=>$source,
+                                       targettag=>$target,
                                        xmlmessage=>'none',
                                        macaddress=>$macaddress,
+                                       plainname=>$plain_name,
+                    modified=>'1',
+                    siserver=>'localhost',
                        };
                        my ($err, $error_str) = $main::job_db->add_dbentry($func_dic);
                        if ($err != 0)  {
                                        &main::daemon_log("$session_id ERROR: cannot add entry to job_db: $error_str", 1);
                        }
-
                }
-
-        #my $sql_statement = "UPDATE $main::job_queue_tn ".
-        #    "SET status='processing', result='$header "."$content' ".
-        #    "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
-        #&main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
-        #my $res = $main::job_db->update_dbentry($sql_statement);
-        #&main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); 
-               
-
-# -----------------------> Update hier
-#  <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
-#  <header>CLMSG_TASKBEGIN</header>
-# macaddress auslesen, Client im LDAP lokalisieren
-# FAIstate auf "localboot" setzen, wenn FAIstate "install" oder "softupdate" war
     }
 
     return; 
 }
 
 
+## @method TASKEND()
+# @details Message reports a finished FAI task. If task is equal to 'savelog', job at job_queue_db is going to be set to status 'done'. Otherwise, job is going to be updated. 
+# @param msg - STRING - xml message with tag 'macaddress'.
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub TASKEND {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
-    my $source = @{$msg_hash->{'target'}}[0];
+    my $target = @{$msg_hash->{'target'}}[0];
+    my $source = @{$msg_hash->{'source'}}[0];
     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
 
     # test whether content is an empty hash or a string which is required
@@ -417,36 +473,38 @@ sub TASKEND {
     # clean up header
     $header =~ s/CLMSG_//g;
 
-       if ($header eq "TASKEND softupdate 0") {
-               &main::daemon_log("$session_id DEBUG: softupdate at host '$source' successful", 7);
-               my $sql_statement = "DELETE FROM $main::job_queue_tn WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
-               &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
-               my $res = $main::job_db->del_dbentry($sql_statement);
+       if ($content eq "savelog 0") {
+               &main::daemon_log("$session_id DEBUG: got savelog from host '$target' - job done", 7);
+        
+        # set job to status 'done', job will be deleted automatically
+        my $sql_statement = "UPDATE $main::job_queue_tn ".
+                                       "SET status='done', modified='1'".
+                    "WHERE status='processing' AND macaddress LIKE '$macaddress'";
+        &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
+        my $res = $main::job_db->update_dbentry( $sql_statement );
 
        } else {
-
-                       my $sql_statement = "UPDATE $main::job_queue_tn ".
-                                       "SET status='processing', result='$header "."$content' ".
-                                       "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
-                       &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
-                       my $res = $main::job_db->update_dbentry($sql_statement);
-                       &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); 
-
+        my $sql_statement = "UPDATE $main::job_queue_tn ".
+            "SET status='processing', result='$header "."$content', modified='1' ".
+            "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
+        &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
+        my $res = $main::job_db->update_dbentry($sql_statement);
+        &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); 
        }
-# -----------------------> Update hier
-#  <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
-#  <header>CLMSG_TASKBEGIN</header>
-# macaddress auslesen, Client im LDAP lokalisieren
-# FAIstate auf "error" setzen
 
     return; 
 }
 
 
+## @method TASKERROR()
+# @details Message reports a FAI error. Job at job_queue_db is going to be updated. 
+# @param msg - STRING - xml message with tag 'macaddress' and 'TASKERROR'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub TASKERROR {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
-    my $source = @{$msg_hash->{'target'}}[0];
+    my $source = @{$msg_hash->{'source'}}[0];
     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
 
     # clean up header
@@ -460,26 +518,25 @@ sub TASKERROR {
        &main::change_fai_state('error', \@{$msg_hash->{'macaddress'}}, $session_id);
                
     my $sql_statement = "UPDATE $main::job_queue_tn ".
-            "SET status='processing', result='$header "."$content' ".
+            "SET status='processing', result='$header "."$content', modified='1' ".
             "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
     &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
     my $res = $main::job_db->update_dbentry($sql_statement);
     &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); 
 
-# -----------------------> Update hier
-#  <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
-#  <header>CLMSG_TASKBEGIN</header>
-# macaddress auslesen, Client im LDAP lokalisieren
-# FAIstate auf "error" setzen
-
     return; 
 }
 
 
+## @method HOOK()
+# @details Message reports a FAI hook. Job at job_queue_db is going to be updated. 
+# @param msg - STRING - xml message with tag 'macaddress' and 'HOOK'
+# @param msg_hash - HASHREF - message information parsed into a hash
+# @param session_id - INTEGER - POE session id of the processing of this message
 sub HOOK {
     my ($msg, $msg_hash, $session_id) = @_;
     my $header = @{$msg_hash->{'header'}}[0];
-    my $source = @{$msg_hash->{'target'}}[0];
+    my $source = @{$msg_hash->{'source'}}[0];
     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
 
     # clean up header
@@ -487,10 +544,10 @@ sub HOOK {
 
     # test whether content is an empty hash or a string which is required
        my $content = @{$msg_hash->{$header}}[0];
-    if(ref($content) eq "HASH") { $content = ""; }
+    if(not ref($content) eq "STRING") { $content = ""; }
 
     my $sql_statement = "UPDATE $main::job_queue_tn ".
-            "SET status='processing', result='$header "."$content' ".
+            "SET status='processing', result='$header "."$content', modified='1' ".
             "WHERE status='processing' AND macaddress LIKE '$macaddress'"; 
     &main::daemon_log("$session_id DEBUG: $sql_statement", 7);         
     my $res = $main::job_db->update_dbentry($sql_statement);
@@ -499,5 +556,73 @@ sub HOOK {
     return;
 }
 
+=pod
+
+=head1 NAME
+
+clMessages - Implementation of a GOsa-SI event module for GOsa-SI-server.
+
+=head1 SYNOPSIS
+
+ use GOSA::GosaSupportDaemon;
+ use MIME::Base64;
+
+=head1 DESCRIPTION
+
+This GOsa-SI event module containing all functions to handle messages coming from GOsa-SI-clients. 
+
+This module will be automatically imported by GOsa-SI if it is under F</usr/lib/gosa-si/server/E<lt>PACKAGEMODULEE<gt>/> .
+
+=head1 METHODS
+
+=over 4
+
+=item get_events ( )
+
+=item confirm_usr_msg ( )
+
+=item PROGRESS ( )
+
+=item FAIREBOOT ( )
+
+=item TASKSKIP ( )
+
+=item TASKBEGIN ( )
+
+=item TASKEND ( )
+
+=item TASKERROR ( )
+
+=item HOOK ( )
+
+=item GOTOACTIVATION ( )
+
+=item LOGIN ( )
+
+=item LOGOUT ( )
+
+=item CURRENTLY_LOGGED_IN ( )
+
+=item save_fai_log ( )
+
+=back
+
+=head1 BUGS
+
+Please report any bugs, or post any suggestions, to the GOsa mailing list E<lt>gosa-devel@oss.gonicus.deE<gt> or to L<https://oss.gonicus.de/labs/gosa>
+
+=head1 COPYRIGHT
+
+This code is part of GOsa (L<http://www.gosa-project.org>)
+
+Copyright (C) 2003-2008 GONICUS GmbH
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+=cut
+
 
 1;