Code

Updated gosaSupportDaemon
[gosa.git] / gosa-si / gosa-si-server
index 667a8f8fc1510f4f28ca7fdfafcbdddd7c1cf243..3dcb9daf3377905a42fea3704e3ec032ada5fc17 100755 (executable)
@@ -126,6 +126,8 @@ our $fai_server_db;
 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'); 
 
 # holds all packages available from different repositories
 our $packages_list_db;
@@ -135,6 +137,12 @@ our @packages_list_col_names = ('distribution', 'package', 'version', 'section',
 my $outdir = "/tmp/packages_list_db";
 my $arch = "i386"; 
 
+# holds all messages which should be delivered to a user
+our $messaging_db;
+our $messaging_tn = "messaging"; 
+our @messaging_col_names = ('subject', 'from', 'to', 'flag', 'direction', 'delivery_time', 'message', 'timestamp', 'id INTEGER', );
+my $messaging_file_name;
+
 %cfg_defaults = (
 "general" => {
     "log-file" => [\$log_file, "/var/run/".$prg.".log"],
@@ -150,6 +158,7 @@ my $arch = "i386";
     "login-users" => [\$login_users_file_name, '/var/lib/gosa-si/users.db'],
     "fai-server" => [\$fai_server_file_name, '/var/lib/gosa-si/fai.db'],
     "packages-list" => [\$packages_list_file_name, '/var/lib/gosa-si/packages.db'],
+    "messaging" => [\$messaging_file_name, '/var/lib/gosa-si/messaging.db'],
     "source-list" => [\$sources_list, '/etc/apt/sources.list'],
     "ldap-uri" => [\$ldap_uri, ""],
     "ldap-base" => [\$ldap_base, ""],
@@ -795,6 +804,7 @@ sub get_local_ip_for_remote_ip {
        return $result;
 }
 
+
 sub send_msg_to_target {
     my ($msg, $address, $encrypt_key, $msg_header) = @_ ;
     my $error = 0;
@@ -805,8 +815,7 @@ sub send_msg_to_target {
   
     if( $msg_header ) {
         $header = "'$msg_header'-";
-    }
-    else {
+    } else {
         $header = "";
     }
 
@@ -853,14 +862,12 @@ sub send_msg_to_target {
             $sql_statement = "DELETE FROM known_clients WHERE hostname='$address'";
             $res = $known_clients_db->del_dbentry($sql_statement);
             daemon_log("WARNING: failed 2x to send msg to host '$address', delete host from known_clients", 3);
-        } 
-        else { 
+        } else { 
             $sql_statement = "UPDATE known_clients SET status='$new_status' WHERE hostname='$address'";
             $res = $known_clients_db->update_dbentry($sql_statement);
             if($new_status eq "down"){
                 daemon_log("WARNING: set '$address' from status '$act_status' to '$new_status'", 3);
-            }
-            else {
+            } else {
                 daemon_log("INFO: set '$address' from status '$act_status' to '$new_status'", 5);
             }
         }
@@ -891,17 +898,39 @@ sub send_msg_to_target {
 }
 
 
+sub update_jobdb_status_for_send_msgs {
+    my ($answer, $error) = @_;
+    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);
+        } else {
+            # sending msg was successful
+            my $sql_statement = "UPDATE $job_queue_tn ".
+                "SET status='done' ".
+                "WHERE id='$jobdb_id'";
+            my $res = $job_db->update_dbentry($sql_statement);
+        }
+    }
+}
+
+
 sub _start {
     my ($kernel) = $_[KERNEL];
     &trigger_db_loop($kernel);
-    #$kernel->yield('create_fai_server_db', $fai_server_tn );
+    $kernel->yield('create_fai_server_db', $fai_server_tn );
+    $kernel->yield('create_fai_release_db', $fai_release_tn );
     #$kernel->yield('create_packages_list_db', $sources_list );
 }
 
 
 sub client_input {
     no strict "refs";
-    my ($kernel, $session, $heap,$input,$wheel) = @_[KERNEL, SESSION, HEAP, ARG0, ARG1];
+    my ($kernel, $session, $heap, $input, $wheel) = @_[KERNEL, SESSION, HEAP, ARG0, ARG1];
     my $session_id = $session->ID;
     my ($msg, $msg_hash, $module);
     my $error = 0;
@@ -970,7 +999,8 @@ sub client_input {
                     while( my ($hit_num, $hit) = each %{ $query_res } ) {    
                         my $host_name = $hit->{hostname};
                         my $host_key = $hit->{hostkey};
-                        &send_msg_to_target($answer, $host_name, $host_key, $answer_header);
+                        my $error = &send_msg_to_target($answer, $host_name, $host_key, $answer_header);
+                        &update_jobdb_status_for_send_msgs($answer, $error);
                     }
                 }
 
@@ -983,7 +1013,8 @@ sub client_input {
                         my $host_name = $hit->{hostname};
                         my $host_key = $hit->{hostkey};
                         $answer =~ s/KNOWN_SERVER/$host_name/g;
-                        &send_msg_to_target($answer, $host_name, $host_key, $answer_header);
+                        my $error = &send_msg_to_target($answer, $host_name, $host_key, $answer_header);
+                        &update_jobdb_status_for_send_msgs($answer, $error);
                     }
                 }
 
@@ -1005,12 +1036,13 @@ sub client_input {
                     $answer =~ /<header>(\S+)<\/header>/;   
                     my $header;
                     if( defined $1 ) { $header = $1; }
-                    &send_msg_to_target($answer, $server_address, $GosaPackages_key, $header);
+                    my $error = &send_msg_to_target($answer, $server_address, $GosaPackages_key, $header);
+                    &update_jobdb_status_for_send_msgs($answer, $error);
                 }
 
                 # target of msg is a mac address
                 elsif( $answer_target =~ /^([0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2})$/i ) {
-                    daemon_log("target is mac address '$answer_target', looking for host in known_clients", 3);
+                    daemon_log("INFO: target is mac address '$answer_target', looking for host in known_clients", 5);
                     my $sql_statement = "SELECT * FROM known_clients WHERE macaddress='$answer_target'";
                     my $query_res = $known_clients_db->select_dbentry( $sql_statement );
                     my $found_ip_flag = 0;
@@ -1018,8 +1050,9 @@ sub client_input {
                         my $host_name = $hit->{hostname};
                         my $host_key = $hit->{hostkey};
                         $answer =~ s/$answer_target/$host_name/g;
-                        daemon_log("found host '$host_name', associated to '$answer_target'", 3);
-                        &send_msg_to_target($answer, $host_name, $host_key, $answer_header);
+                        daemon_log("INFO: found host '$host_name', associated to '$answer_target'", 5);
+                        my $error = &send_msg_to_target($answer, $host_name, $host_key, $answer_header);
+                        &update_jobdb_status_for_send_msgs($answer, $error);
                         $found_ip_flag++ ;
                     }   
                     if( $found_ip_flag == 0) {
@@ -1031,7 +1064,8 @@ sub client_input {
                             while( my ($hit_num, $hit) = each %{ $query_res } ) {    
                                 my $bus_address = $hit->{hostname};
                                 my $bus_key = $hit->{hostkey};
-                                &send_msg_to_target($answer, $bus_address, $bus_key, $answer_header);
+                                my $error = &send_msg_to_target($answer, $bus_address, $bus_key, $answer_header);
+                                &update_jobdb_status_for_send_msgs($answer, $error);
                                 last;
                             }
                         }
@@ -1051,19 +1085,21 @@ sub client_input {
                             my $query_res = $known_server_db->select_dbentry( $sql_statement );
                             my $res_length = keys( %{$query_res} );
                             if( $res_length == 0 ){
-                                daemon_log("WARNING: send '$answer_header' to '$bus_address' failed, no bus found in known_server", 3);
+                                daemon_log("WARNING: send '$answer_header' to '$bus_address' failed, ".
+                                        "no bus found in known_server", 3);
                             }
                             else {
                                 while( my ($hit_num, $hit) = each %{ $query_res } ) {    
                                     my $bus_key = $hit->{hostkey};
-                                    &send_msg_to_target($answer, $bus_address, $bus_key, $answer_header);
+                                    my $error = &send_msg_to_target($answer, $bus_address, $bus_key, $answer_header);
+                                    &update_jobdb_status_for_send_msgs($answer, $error);
                                 }
                             }
                         }
                         next;
                     }
-                    # send_msg
-                    &send_msg_to_target($answer, $answer_target, $encrypt_key, $answer_header);
+                    my $error = &send_msg_to_target($answer, $answer_target, $encrypt_key, $answer_header);
+                    &update_jobdb_status_for_send_msgs($answer, $error);
                 }
             }
         }
@@ -1074,7 +1110,9 @@ sub client_input {
             my $session_id = $1;
             if( defined $session_id ) {
                 my $session_reference = $kernel->ID_id_to_session($session_id);
-                $heap = $session_reference->get_heap();
+                if( defined $session_reference ) {
+                    $heap = $session_reference->get_heap();
+                }
             }     
         }
         $heap->{client}->put($client_answer);
@@ -1086,11 +1124,26 @@ sub client_input {
 
 
 sub trigger_db_loop {
-#      my ($kernel) = $_[KERNEL];
        my ($kernel) = @_ ;
        $kernel->delay_set('watch_for_new_jobs', $job_queue_loop_delay);
+    $kernel->delay_set('watch_for_done_jobs', $job_queue_loop_delay); 
 }
 
+sub watch_for_done_jobs {
+    my ($kernel,$heap) = @_[KERNEL, HEAP];
+
+    my $sql_statement = "SELECT * FROM ".$job_queue_tn.
+        " WHERE status='done'";
+       my $res = $job_db->select_dbentry( $sql_statement );
+
+    while( my ($id, $hit) = each %{$res} ) {
+        my $jobdb_id = $hit->{id};
+        my $sql_statement = "DELETE FROM $job_queue_tn WHERE id='$jobdb_id'"; 
+        my $res = $job_db->del_dbentry($sql_statement);
+    }
+
+    $kernel->delay_set('watch_for_done_jobs',$job_queue_loop_delay);
+}
 
 sub watch_for_new_jobs {
        my ($kernel,$heap) = @_[KERNEL, HEAP];
@@ -1105,6 +1158,7 @@ sub watch_for_new_jobs {
                my $jobdb_id = $hit->{id};
                my $macaddress = $hit->{'macaddress'};
         my $job_msg = $hit->{'xmlmessage'};
+        daemon_log("DEBUG: its time to execute $job_msg", 7); 
         my $header = $hit->{'headertag'};
         my $sql_statement = "SELECT * FROM known_clients WHERE macaddress='$macaddress'";
                my $res_hash = $known_clients_db->select_dbentry( $sql_statement );
@@ -1128,9 +1182,13 @@ sub watch_for_new_jobs {
         $job_msg =~ s/<\/xml>$/<jobdb_id>$jobdb_id<\/jobdb_id><\/xml>/;
 
                my $func_error = &send_msg_to_target($job_msg, $server_address, $GosaPackages_key, $header);
+
+        # update status in job queue to 'processing'
+        $sql_statement = "UPDATE $job_queue_tn SET status='processing' WHERE id='$jobdb_id'";
+        my $res = $job_db->update_dbentry($sql_statement);
     }
 
-       $kernel->delay_set('watch_for_new_jobs',3);
+       $kernel->delay_set('watch_for_new_jobs', $job_queue_loop_delay);
 }
 
 
@@ -1170,21 +1228,67 @@ sub refresh_ldap_handle {
 
 sub create_fai_server_db {
     my ($table_name) = $_[ARG0];
-    
-#####################################################################
-#
-# TODO für dich Cajus :-)
-#
-# ###################################################################
-    
-    $fai_server_db->add_dbentry( { 
-            table => $table_name,
-            primkey => [],
-            server => "dummyserver",        # neuer fai-server 
-            release => "kleinkind",         # neuer release
-            tag => "imwachstum",            # neues tag
-            } );
-    return;
+       my $result;
+
+       if(defined($ldap_handle)) {
+               my $mesg= $ldap_handle->search(
+                       base   => $main::ldap_base,
+                       scope  => 'sub',
+                       attrs  => ['FAIrepository', 'gosaUnitTag'],
+                       filter => "(&(FAIrepository=*)(objectClass=FAIrepositoryServer))",
+               );
+               if($mesg->{'resultCode'} == 0 &&
+                  $mesg->count != 0) {
+                  foreach my $entry (@{$mesg->{entries}}) {
+                          if($entry->exists('FAIrepository')) {
+                                  # Add an entry for each Repository configured for server
+                                  foreach my $repo(@{$entry->get_value('FAIrepository', asref => 1)}) {
+                                                  my($tmp_url,$tmp_server,$tmp_release,$tmp_sections) = split(/\|/, $repo);
+                                                  my $tmp_tag= $entry->get_value('gosaUnitTag') || "";
+                                                  $result= $fai_server_db->add_dbentry( { 
+                                                                  table => $table_name,
+                                                                  primkey => ['server', 'release', 'tag'],
+                                                                  server => $tmp_url,
+                                                                  release => $tmp_release,
+                                                                  tag => (length($tmp_tag)>0)?$tmp_tag:"",
+                                                          } );
+                                          }
+                                  }
+                          }
+                  }
+       }       
+   
+       return $result;
+}
+
+
+sub create_fai_release_db {
+       my ($table_name) = $_[ARG0];
+       my $result;
+
+       if(defined($ldap_handle)) {
+               my $mesg= $ldap_handle->search(
+                       base   => $main::ldap_base,
+                       scope  => 'sub',
+                       attrs  => ['cn', 'FAIdebianRelease'],
+                       filter => "(&(FAIdebianRelease=*)(objectClass=FAIclass))",
+               );
+               if($mesg->{'resultCode'} == 0 &&
+                       $mesg->count != 0) {
+                       foreach my $entry (@{$mesg->{entries}}) {
+                               if($entry->exists('FAIdebianRelease') && $entry->exists('cn')) {
+                                       $result= $fai_server_db->add_dbentry( { 
+                                                       table => $table_name,
+                                                       primkey => ['release', 'class'],
+                                                       release => $entry->get_value('FAIdebianRelease'),
+                                                       class => $entry->get_value('cn'),
+                                               } );
+                               }
+                       }
+               }
+       }       
+       
+       return $result;
 }
 
 
@@ -1411,15 +1515,21 @@ $known_server_db->create_table($known_server_tn, \@known_server_col_names);
 $login_users_db = GOSA::DBsqlite->new($login_users_file_name);
 $login_users_db->create_table($login_users_tn, \@login_users_col_names);
 
-# connect to fai_server_db
+# connect to fai_server_db and fai_release_db
 $fai_server_db = GOSA::DBsqlite->new($fai_server_file_name);
 $fai_server_db->create_table($fai_server_tn, \@fai_server_col_names);
+$fai_server_db->create_table($fai_release_tn, \@fai_release_col_names);
 
 # connect to packages_list_db
 unlink($packages_list_file_name);
 $packages_list_db = GOSA::DBsqlite->new($packages_list_file_name);
 $packages_list_db->create_table($packages_list_tn, \@packages_list_col_names);
 
+# connect to messaging_db
+$messaging_db = GOSA::DBsqlite->new($messaging_file_name);
+$messaging_db->create_table($messaging_tn, \@messaging_col_names);
+
+
 # create xml object used for en/decrypting
 $xml = new XML::Simple();
 
@@ -1437,8 +1547,10 @@ POE::Session->create(
         next_task => \&next_task,
         task_result => \&task_result,
                watch_for_new_jobs => \&watch_for_new_jobs,
+        watch_for_done_jobs => \&watch_for_done_jobs,
         create_packages_list_db => \&create_packages_list_db,
         create_fai_server_db => \&create_fai_server_db,
+        create_fai_release_db => \&create_fai_release_db,
        }
 );