Code

Added default for session lifetime
[gosa.git] / gosa-si / gosa-si-server
index 8e7f37918bb0331802da5a19d64f2114f7c1e6e5..1e56d7ce7066ed3b9cdf0f9ae743cc7880d81eb5 100755 (executable)
@@ -1,9 +1,9 @@
 #!/usr/bin/perl
 #===============================================================================
 #
-#         FILE:  gosa-sd
+#         FILE:  gosa-si-server
 #
-#        USAGE:  ./gosa-sd
+#        USAGE:  ./gosa-si-server
 #
 #  DESCRIPTION:
 #
@@ -20,8 +20,6 @@
 #     REVISION:  ---
 #===============================================================================
 
-my $server_version = '$HeadURL: https://oss.gonicus.de/repositories/gosa/trunk/gosa-si/gosa-si-server $:$Rev$';
-
 use strict;
 use warnings;
 use Getopt::Long;
@@ -39,7 +37,7 @@ use Digest::MD5  qw(md5 md5_hex md5_base64);
 use XML::Simple;
 use Data::Dumper;
 use Sys::Syslog qw( :DEFAULT setlogsock);
-use Time::HiRes qw( usleep);
+use Time::HiRes qw( usleep clock_gettime );
 use Cwd;
 use File::Spec;
 use File::Basename;
@@ -51,6 +49,8 @@ use POE qw(Component::Server::TCP Wheel::Run Filter::Reference);
 use Net::LDAP;
 use Net::LDAP::Util qw(:escape);
 
+my $server_version = '$HeadURL: https://oss.gonicus.de/repositories/gosa/trunk/gosa-si/gosa-si-server $:$Rev$';
+
 # revision number of server and program name
 my $server_headURL;
 my $server_revision;
@@ -63,7 +63,6 @@ my $db_module = "DBsqlite";
 no strict "refs";
 require ("GOSA/".$db_module.".pm");
 ("GOSA/".$db_module)->import;
-#daemon_log("0 INFO: importing database module '$db_module'", 1);
 }
 
 my $modules_path = "/usr/lib/gosa-si/modules";
@@ -94,7 +93,8 @@ our (%cfg_defaults, $log_file, $pid_file,
     $wake_on_lan_passwd, $job_synchronization, $modified_jobs_loop_delay,
     $arp_enabled, $arp_interface,
     $opsi_enabled, $opsi_server, $opsi_admin, $opsi_password,
-               $new_systems_ou,
+    $new_systems_ou,
+    $arch,
 );
 
 # additional variable which should be globaly accessable
@@ -104,7 +104,7 @@ our $gosa_address;
 our $no_arp;
 our $forground;
 our $cfg_file;
-our ($ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $ldap_server_dn, $ldap_version);
+our ($ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $ldap_server_dn, $ldap_version, $ldap_retry_sec);
 our ($mysql_username, $mysql_password, $mysql_database, $mysql_host);
 our $known_modules;
 our $known_functions;
@@ -195,7 +195,6 @@ our $packages_list_tn = "packages_list";
 my $packages_list_file_name;
 our @packages_list_col_names = ("distribution VARCHAR(255)", "package VARCHAR(255)", "version VARCHAR(255)", "section VARCHAR(255)", "description TEXT", "template LONGBLOB", "timestamp VARCHAR(14)");
 my $outdir = "/tmp/packages_list_db";
-my $arch = "i386"; 
 
 # holds all messages which should be delivered to a user
 our $messaging_db;
@@ -248,43 +247,45 @@ our $check_periodic = {"months"=>'', "weeks"=>'', "days"=>'', "hours"=>'', "minu
     "messaging"             => [\$messaging_file_name, '/var/lib/gosa-si/messaging.db'],
     "foreign-clients"       => [\$foreign_clients_file_name, '/var/lib/gosa-si/foreign_clients.db'],
     "source-list"           => [\$sources_list, '/etc/apt/sources.list'],
-    "repo-path"             => [\$repo_path, '/srv/www/repository'],
+    "repo-path"             => [\$repo_path, '/srv/www'],
+    "debian-arch"           => [\$arch, 'i386'],     
     "ldap-uri"              => [\$ldap_uri, ""],
     "ldap-base"             => [\$ldap_base, ""],
     "ldap-admin-dn"         => [\$ldap_admin_dn, ""],
     "ldap-admin-password"   => [\$ldap_admin_password, ""],
     "ldap-version"          => [\$ldap_version, 3],
+    "ldap-retry-sec"        => [\$ldap_retry_sec, 10],
     "gosa-unit-tag"         => [\$gosa_unit_tag, ""],
     "max-clients"           => [\$max_clients, 10],
     "wol-password"          => [\$wake_on_lan_passwd, ""],
-       "mysql-username"        => [\$mysql_username, "gosa_si"],
-       "mysql-password"        => [\$mysql_password, ""],
-       "mysql-database"        => [\$mysql_database, "gosa_si"],
-       "mysql-host"            => [\$mysql_host, "127.0.0.1"],
+    "mysql-username"        => [\$mysql_username, "gosa_si"],
+    "mysql-password"        => [\$mysql_password, ""],
+    "mysql-database"        => [\$mysql_database, "gosa_si"],
+    "mysql-host"            => [\$mysql_host, "127.0.0.1"],
     },
 "GOsaPackages" => {
     "job-queue" => [\$job_queue_file_name, '/var/lib/gosa-si/jobs.db'],
     "job-queue-loop-delay" => [\$job_queue_loop_delay, 3],
     "messaging-db-loop-delay" => [\$messaging_db_loop_delay, 3],
     "key" => [\$GosaPackages_key, "none"],
-               "new-systems-ou" => [\$new_systems_ou, 'ou=workstations,ou=systems'],
+    "new-systems-ou" => [\$new_systems_ou, 'ou=workstations,ou=systems'],
     },
 "ClientPackages" => {
     "key" => [\$ClientPackages_key, "none"],
     "user-date-of-expiry" => [\$logged_in_user_date_of_expiry, 600],
     },
 "ServerPackages"=> {
-       "enabled" => [\$serverPackages_enabled, "true"],
+    "enabled"      => [\$serverPackages_enabled, "true"],
     "address"      => [\$foreign_server_string, ""],
-    "dns-lookup"            => [\$dns_lookup, "true"],
-    "domain"  => [\$server_domain, ""],
-    "key"     => [\$ServerPackages_key, "none"],
+    "dns-lookup"   => [\$dns_lookup, "true"],
+    "domain"       => [\$server_domain, ""],
+    "key"          => [\$ServerPackages_key, "none"],
     "key-lifetime" => [\$foreign_servers_register_delay, 120],
     "job-synchronization-enabled" => [\$job_synchronization, "true"],
     "synchronization-loop" => [\$modified_jobs_loop_delay, 5],
     },
 "ArpHandler" => {
-    "enabled"   => [\$arp_enabled, "true"],
+    "enabled"   => [\$arp_enabled, "false"],
     "interface" => [\$arp_interface, "all"],
        },
 "Opsi" => {
@@ -317,14 +318,16 @@ usage: $prg [-hvf] [-c config] [-d number]
                         'vvvvvvv': debug plus info logs
            -no-arp   : starts $prg without connection to arp module
            -d <int>  : if verbose level is higher than 7x 'v' specified parts can be debugged
-                           1 : receiving messages
-                           2 : sending messages
-                           4 : encrypting/decrypting messages
-                           8 : verification if a message complies gosa-si requirements
+                           1 : report incoming messages
+                           2 : report unencrypted outgoing messages 
+                           4 : report encrypting key for messages
+                           8 : report decrypted incoming message and verification if the message complies gosa-si requirements
                           16 : message processing
                           32 : ldap connectivity
                           64 : database status and connectivity
                          128 : main process 
+                         256 : creation of packages_list_db
+                         512 : ARP debug information
 EOF
        exit(0);
 }
@@ -384,10 +387,13 @@ sub daemon_log {
                        $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday;
                        $year+=1900;
 
-                       
+                       # Microseconds since epoch
+                       my $microSeconds = sprintf("%.2f", &Time::HiRes::clock_gettime());
+                       $microSeconds =~ s/^\d*(.\d\d)$/$1/;
+
                        # Build log message and write it to log file and commandline
                        chomp($msg);
-                       my $log_msg = "$month $monthday $hours:$minutes:$seconds $prg $msg\n";
+                       my $log_msg = "$month $monthday $hours:$minutes:$seconds$microSeconds $prg $msg\n";
                        flock(LOG_HANDLE, LOCK_EX);
                        seek(LOG_HANDLE, 0, 2);
                        print LOG_HANDLE $log_msg;
@@ -448,28 +454,28 @@ sub check_cmdline_param () {
 sub check_pid {
     $pid = -1;
     # Check, if we are already running
-    if( open(LOCK_FILE, "<$pid_file") ) {
-        $pid = <LOCK_FILE>;
+    if( open( my $LOCK_FILE, "<", "$pid_file" ) ) {
+        $pid = <$LOCK_FILE>;
         if( defined $pid ) {
             chomp( $pid );
             if( -f "/proc/$pid/stat" ) {
                 my($stat) = `cat /proc/$pid/stat` =~ m/$pid \((.+)\).*/;
                 if( $stat ) {
                                        print STDERR "\nERROR: Already running!\n";
-                    close( LOCK_FILE );
+                    close( $LOCK_FILE );
                     exit -1;
                 }
             }
         }
-        close( LOCK_FILE );
+        close( $LOCK_FILE );
         unlink( $pid_file );
     }
 
     # create a syslog msg if it is not to possible to open PID file
-    if (not sysopen(LOCK_FILE, $pid_file, O_WRONLY|O_CREAT|O_EXCL, 0644)) {
+    if (not sysopen(my $LOCK_FILE, $pid_file, O_WRONLY|O_CREAT|O_EXCL, 0644)) {
         my($msg) = "Couldn't obtain lockfile '$pid_file' ";
-        if (open(LOCK_FILE, '<', $pid_file)
-                && ($pid = <LOCK_FILE>))
+        if (open(my $LOCK_FILE, '<', $pid_file)
+                && ($pid = <$LOCK_FILE>))
         {
             chomp($pid);
             $msg .= "(PID $pid)\n";
@@ -996,7 +1002,7 @@ sub send_msg_to_target {
             if($new_status eq "down"){
                 daemon_log("$session_id WARNING: set '$address' from status '$act_status' to '$new_status'", 3);
             } else {
-                daemon_log("$session_id INFO: set '$address' from status '$act_status' to '$new_status'", 5);
+                daemon_log("$session_id DEBUG: set '$address' from status '$act_status' to '$new_status'", 138);
             }
         }
     }
@@ -1017,7 +1023,7 @@ sub send_msg_to_target {
             if($new_status eq "down"){
                 daemon_log("$session_id WARNING: set '$address' from status '$act_status' to '$new_status'", 3);
             } else {
-                daemon_log("$session_id INFO: set '$address' from status '$act_status' to '$new_status'", 5);
+                daemon_log("$session_id DEBUG: set '$address' from status '$act_status' to '$new_status'", 138);
             }
         }
     }
@@ -1054,8 +1060,17 @@ sub update_jobdb_status_for_send_msgs {
                     ||($job_header eq "trigger_action_reinstall") 
                     ||($job_header eq "trigger_activate_new")
                     ) {
-                &reactivate_job_with_delay($session_id, $job_target, $job_header, 30 );
-
+                                               if ($job_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) {
+                                                       &reactivate_job_with_delay($session_id, $job_target, $job_header, 30 );
+                                               } else {
+                                                       # If we don't have the mac adress at this time, we use the plainname
+                                                       my $plainname_result = $job_db->select_dbentry("SELECT plainname from jobs where id=$jobdb_id");
+                                                       my $plainname = $job_target;
+                                                       if ((keys(%$plainname_result) > 0) ) {
+                                                               $plainname = $plainname_result->{1}->{$job_target};
+                                                       }
+                                                       &reactivate_job_with_delay($session_id, $plainname, $job_header, 30 );
+                                               }
             # For all other messages
             } else {
                 my $sql_statement = "UPDATE $job_queue_tn ".
@@ -1097,7 +1112,7 @@ sub reactivate_job_with_delay {
     if (not defined $delay) { $delay = 30 } ;
     my $delay_timestamp = &calc_timestamp(&get_time(), "plus", $delay);
 
-    my $sql = "UPDATE $job_queue_tn Set timestamp='$delay_timestamp', status='waiting' WHERE (macaddress LIKE 'target' AND headertag='$header')"; 
+    my $sql = "UPDATE $job_queue_tn Set timestamp='$delay_timestamp', status='waiting' WHERE (macaddress LIKE '$target' OR plainname LIKE '$target') AND headertag='$header'"; 
     my $res = $job_db->update_dbentry($sql);
     daemon_log("$session_id INFO: '$header'-job will be reactivated at '$delay_timestamp' ".
             "cause client '$target' is currently not available", 5);
@@ -1140,7 +1155,15 @@ sub msg_to_decrypt {
        }
        # msg is from a gosa-si-client
        if(( !$msg ) || ( !$msg_hash ) || ( !$module )){
-               ($msg, $msg_hash, $module) = &input_from_known_client($next_msg, $msg_source, $session_id);
+               if (not defined $msg_source) 
+               {
+                       # Only needed, to be compatible with older gosa-si-server versions
+                       ($msg, $msg_hash, $module) = &input_from_known_client($next_msg, $heap->{'remote_ip'}, $session_id);
+               }
+               else
+               {
+                       ($msg, $msg_hash, $module) = &input_from_known_client($next_msg, $msg_source, $session_id);
+               }
        }
        # an error occurred
        if(( !$msg ) || ( !$msg_hash ) || ( !$module )){
@@ -1291,7 +1314,7 @@ sub msg_to_decrypt {
                                        module=>$module,
                                        sessionid=>$session_id,
                                } );
-
+                       $kernel->yield('watch_for_next_tasks');
                }
 
                # target is own address with forward_to_gosa-tag pointing at myself -> forward to gosa
@@ -1411,6 +1434,7 @@ sub msg_to_decrypt {
                                        sessionid=>$session_id,
                                } );
                        $done = 1;
+                       $kernel->yield('watch_for_next_tasks');
                }
 
 
@@ -1523,8 +1547,7 @@ sub process_task {
             while ($answer_str =~ /<header>(\w+)<\/header>/g) {
                                push(@headers, $1);
             }
-                       daemon_log("$session_id INFO: got answer message(s) with header: '".join("', '", @headers)."'", 5);
-            daemon_log("$session_id DEBUG: $module: got answer from module: \n".$answer_str,26);
+                       daemon_log("$session_id DEBUG: got answer message(s) with header: '".join("', '", @headers)."'", 26);
         } else {
             daemon_log("$session_id DEBUG: $module: got no answer from module!" ,26);
         }
@@ -1582,6 +1605,9 @@ sub process_task {
                     if( defined $session_id ) {
                         $add_on = ".session_id=$session_id";
                     }
+                                       my $header = ($1) if $answer =~ /<header>(\S*)<\/header>/;
+                                       daemon_log("$session_id INFO: send ".$header." message to GOsa", 5);
+                                       daemon_log("$session_id DEBUG: message:\n$answer", 12);
                     # answer is for GOSA and has to returned to connected client
                     my $gosa_answer = &encrypt_msg($answer, $GosaPackages_key);
                     $client_answer = $gosa_answer.$add_on;
@@ -1598,7 +1624,7 @@ sub process_task {
 
                 # 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("$session_id INFO: target is mac address '$answer_target', looking for host in known_clients and foreign_clients", 5);
+                    daemon_log("$session_id DEBUG: target is mac address '$answer_target', looking for host in known_clients and foreign_clients", 138);
 
                     # Looking for macaddress in known_clients
                     my $sql_statement = "SELECT * FROM known_clients WHERE macaddress LIKE '$answer_target'";
@@ -1685,7 +1711,6 @@ sub session_start {
     $kernel->yield('register_at_foreign_servers');
        $kernel->yield('create_fai_server_db', $fai_server_tn );
        $kernel->yield('create_fai_release_db', $fai_release_tn );
-    $kernel->yield('watch_for_next_tasks');
        $kernel->sig(USR1 => "sig_handler");
        $kernel->sig(USR2 => "recreate_packages_db");
        $kernel->delay_set('watch_for_new_jobs', $job_queue_loop_delay);
@@ -1712,26 +1737,28 @@ sub watch_for_done_jobs {
 
        while( my ($number, $hit) = each %{$res} ) 
        {
+               # Non periodical jobs can be deleted.
+               if ($hit->{periodic} eq "none")
+               {
+                       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); 
+               }
+
                # Periodical jobs should not be deleted but reactivated with new timestamp instead.
-               if (exists $check_periodic->{$hit->{periodic}})
+               else
                {
+                       my ($p_time, $periodic) = split("_", $hit->{periodic});
                        my $reactivated_ts = $hit->{timestamp};
                        my $act_ts = int(&get_time());
                        while ($act_ts > int($reactivated_ts))   # Redo calculation to avoid multiple jobs in the past
                        {
-                               $reactivated_ts = &calc_timestamp($reactivated_ts, "plus", 1, $hit->{periodic});
+                               $reactivated_ts = &calc_timestamp($reactivated_ts, "plus", $p_time, $periodic);
                        }
                        my $sql = "UPDATE $job_queue_tn SET status='waiting', timestamp='$reactivated_ts' WHERE id='".$hit->{id}."'"; 
                        my $res = $job_db->exec_statement($sql);
                        &daemon_log("J INFO: Update periodical job '".$hit->{headertag}."' for client '".$hit->{targettag}."'. New execution time '$reactivated_ts'.", 5);
                }
-               # Non periodical jobs can be deleted.
-               else
-               {
-                       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);
@@ -1740,7 +1767,6 @@ sub watch_for_done_jobs {
 
 sub watch_for_opsi_jobs {
     my ($kernel) = $_[KERNEL];
-
     # This is not very nice to look for opsi install jobs, but headertag has to be trigger_action_reinstall. The only way to identify a 
     # opsi install job is to parse the xml message. There is still the correct header.
     my $sql_statement = "SELECT * FROM ".$job_queue_tn." WHERE ((xmlmessage LIKE '%opsi_install_client</header>%') AND (status='processing') AND (siserver='localhost'))";
@@ -1764,10 +1790,14 @@ sub watch_for_opsi_jobs {
         };
         
         my $hres = $opsi_client->call($opsi_url, $callobj);
-        #my ($hres_err, $hres_err_string) = &check_opsi_res($hres);
+               # TODO : move all opsi relevant statments to opsi plugin
+               # The following 3 lines must be tested befor they can replace the rubbish above and below !!!
+               #my ($res, $err) = &opsi_com::_getProductStates_hash(hostId=>$hostId)
+               #if (not $err) {
+               #       my $htmp = $res->{$hostId};
+               # 
         if (not &check_opsi_res($hres)) {
             my $htmp= $hres->result->{$hostId};
-        
             # Check state != not_installed or action == setup -> load and add
             my $products= 0;
             my $installed= 0;
@@ -2255,8 +2285,6 @@ sub watch_for_next_tasks {
         my $sql = "DELETE FROM $incoming_tn WHERE id=$message_id";
         my $res = $incoming_db->exec_statement($sql);
     }
-
-    $kernel->delay_set('watch_for_next_tasks', 1); 
 }
 
 
@@ -2277,8 +2305,8 @@ sub get_ldap_handle {
 get_handle:
        my $ldap_handle = Net::LDAP->new( $ldap_uri );
        if (not ref $ldap_handle) {
-               daemon_log("$session_id ERROR: Connection to LDAP URI '$ldap_uri' failed! Retrying!", 1);
-               usleep(100000);
+               daemon_log("$session_id ERROR: Connection to LDAP URI '$ldap_uri' failed! Retrying in $ldap_retry_sec seconds.", 1); 
+               sleep($ldap_retry_sec);
                goto get_handle;
        } else {
                daemon_log("$session_id DEBUG: Connection to LDAP URI '$ldap_uri' established.", 42);
@@ -2851,8 +2879,7 @@ sub create_sources_list {
                &main::daemon_log("$session_id DEBUG: remove an old version of '$result'", 7); 
        }
 
-       my $fh;
-       open($fh, ">$result");
+       open(my $fh, ">", "$result");
        if (not defined $fh) {
                &main::daemon_log("$session_id DEBUG: cannot open '$result' for writing", 7); 
                return undef;
@@ -2935,14 +2962,14 @@ sub create_packages_list_db {
 
        my $line;
 
-       open(CONFIG, "<$sources_file") or do {
+       open(my $CONFIG, "<", "$sources_file") or do {
                daemon_log( "$session_id ERROR: create_packages_list_db: Failed to open '$sources_file'", 1);
                unlink($packages_list_under_construction);
                return;
        };
 
        # Read lines
-       while ($line = <CONFIG>){
+       while ($line = <$CONFIG>){
                # Unify
                chop($line);
                $line =~ s/^\s+//;
@@ -2964,9 +2991,12 @@ sub create_packages_list_db {
                                &parse_package_info( $baseurl, $dist, $section, $session_id );
                        }
                }
+    else {
+        daemon_log("$session_id ERROR: cannot parse line '$line'", 1);
+    }
        }
 
-       close (CONFIG);
+       close ($CONFIG);
 
        if(keys(%repo_dirs)) {
                find(\&cleanup_and_extract, keys( %repo_dirs ));
@@ -3122,7 +3152,7 @@ sub parse_package_info {
     $repo_dirs{ "${repo_path}/pool" } = 1;
 
     foreach $package ("Packages.gz"){
-        daemon_log("$session_id DEBUG: create_packages_list: fetch $baseurl, $dist, $section", 7);
+        daemon_log("$session_id DEBUG: create_packages_list: fetch $baseurl, $dist, $section", 266);
         get_package( "$baseurl/dists/$dist/$section/binary-$arch/$package", "$outdir/$dist/$section", $session_id );
         parse_package( "$outdir/$dist/$section", $dist, $path, $session_id );
     }
@@ -3140,9 +3170,9 @@ sub get_package {
     # This is ugly, but I've no time to take a look at "how it works in perl"
     if(0 == system("wget '$url' -O '$dest' 2>/dev/null") ) {
         system("gunzip -cd '$dest' > '$dest.in'");
-        daemon_log("$session_id DEBUG: run command: gunzip -cd '$dest' > '$dest.in'", 7);
+        daemon_log("$session_id DEBUG: run command: gunzip -cd '$dest' > '$dest.in'", 266);
         unlink($dest);
-        daemon_log("$session_id DEBUG: delete file '$dest'", 7); 
+        daemon_log("$session_id DEBUG: delete file '$dest'", 266); 
     } else {
         daemon_log("$session_id ERROR: create_packages_list_db: get_packages: fetching '$url' into '$dest' failed!", 1);
     }
@@ -3154,7 +3184,6 @@ sub parse_package {
     my ($path, $dist, $srv_path, $session_id)= @_;
     if (not defined $session_id) { $session_id = 0;}
     my ($package, $version, $section, $description);
-    my $PACKAGES;
     my $timestamp = &get_time();
 
     if(not stat("$path.in")) {
@@ -3162,7 +3191,7 @@ sub parse_package {
         return;
     }
 
-    open($PACKAGES, "<$path.in");
+    open(my $PACKAGES, "<", "$path.in");
     if(not defined($PACKAGES)) {
         daemon_log("$session_id ERROR: create_packages_list_db: parse_package: cannot open '$path.in'",1); 
         return;
@@ -3249,13 +3278,13 @@ sub cleanup_and_extract {
 
                if( -f "$dir/DEBIAN/templates" ) {
 
-                       daemon_log("0 DEBUG: Found debconf templates in '$package' - $newver", 7);
+                       daemon_log("0 DEBUG: Found debconf templates in '$package' - $newver", 266);
 
                        my $tmpl= ""; {
                                local $/=undef;
-                               open FILE, "$dir/DEBIAN/templates";
-                               $tmpl = &encode_base64(<FILE>);
-                               close FILE;
+                               open(my $FILE, "$dir/DEBIAN/templates");
+                               $tmpl = &encode_base64(<$FILE>);
+                               close($FILE);
                        }
                        rmtree("$dir/DEBIAN/templates");
 
@@ -3465,9 +3494,9 @@ if( ! $foreground ) {
 
 # Do something useful - put our PID into the pid_file
 if( 0 != $pid ) {
-    open( LOCK_FILE, ">$pid_file" );
-    print LOCK_FILE "$pid\n";
-    close( LOCK_FILE );
+    open( my $LOCK_FILE, ">", "$pid_file" );
+    print $LOCK_FILE "$pid\n";
+    close( $LOCK_FILE );
     if( !$foreground ) { 
         exit( 0 ) 
     };
@@ -3487,8 +3516,8 @@ if ($server_headURL =~ /\/tag\// ||
 # Prepare log file and set permissions
 $root_uid = getpwnam('root');
 $adm_gid = getgrnam('adm');
-open(FH, ">>$log_file");
-close FH;
+open(my $FH, ">>", "$log_file");
+close($FH);
 chmod(0440, $log_file);
 chown($root_uid, $adm_gid, $log_file);
 chown($root_uid, $adm_gid, "/var/lib/gosa-si");
@@ -3503,6 +3532,9 @@ daemon_log($server_status_hash->{$server_status}.": $server_revision", 1);
     no strict "refs";
 
     if ($db_module eq "DBmysql") {
+
+        daemon_log("0 INFO: importing database module '$db_module'", 1);
+
         # connect to incoming_db
         $incoming_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
 
@@ -3534,6 +3566,9 @@ daemon_log($server_status_hash->{$server_status}.": $server_revision", 1);
         $messaging_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
 
     } elsif ($db_module eq "DBsqlite") {
+
+        daemon_log("0 INFO: importing database module '$db_module'", 1);
+
         # connect to incoming_db
         unlink($incoming_file_name);
         $incoming_db = GOSA::DBsqlite->new($incoming_file_name);
@@ -3596,6 +3631,9 @@ daemon_log($server_status_hash->{$server_status}.": $server_revision", 1);
 }
 
 # Creating tables
+
+daemon_log("0 INFO: creating tables in database with '$db_module'", 1);
+
 $messaging_db->create_table($messaging_tn, \@messaging_col_names);
 $packages_list_db->create_table($packages_list_tn, \@packages_list_col_names);
 $fai_release_db->create_table($fai_release_tn, \@fai_release_col_names);
@@ -3665,6 +3703,7 @@ POE::Component::Server::TCP->new(
        },
        InlineStates => {
                msg_to_decrypt => \&msg_to_decrypt,
+               watch_for_next_tasks => \&watch_for_next_tasks,
                next_task => \&next_task,
                task_result => \&handle_task_result,
                task_done   => \&handle_task_done,
@@ -3686,7 +3725,6 @@ POE::Session->create(
         task_result => \&handle_task_result,
         task_done   => \&handle_task_done,
         task_debug  => \&handle_task_debug,
-        watch_for_next_tasks => \&watch_for_next_tasks,
         watch_for_new_messages => \&watch_for_new_messages,
         watch_for_delivery_messages => \&watch_for_delivery_messages,
         watch_for_done_messages => \&watch_for_done_messages,