Code

Merge Statements.
[gosa.git] / trunk / gosa-si / gosa-si-server
index 514e8b1bde1f54442d4e053c6c7d3d9025959613..7d43973982d1435c91096771e4b3be3de231ff9c 100755 (executable)
@@ -28,7 +28,7 @@ use Getopt::Long;
 use Config::IniFiles;
 use POSIX;
 
-use Fcntl;
+use Fcntl qw/:flock/;
 use IO::Socket::INET;
 use IO::Handle;
 use IO::Select;
@@ -127,7 +127,7 @@ my $watch_for_new_jobs_in_progress = 0;
 our $incoming_db;
 our $incoming_tn = 'incoming';
 my $incoming_file_name;
-my @incoming_col_names = ("id INTEGER PRIMARY KEY auto_increment",
+my @incoming_col_names = ("id INTEGER PRIMARY KEY",
        "timestamp VARCHAR(14) DEFAULT 'none'", 
        "headertag VARCHAR(255) DEFAULT 'none'",
        "targettag VARCHAR(255) DEFAULT 'none'",
@@ -140,7 +140,7 @@ my @incoming_col_names = ("id INTEGER PRIMARY KEY auto_increment",
 our $job_db;
 our $job_queue_tn = 'jobs';
 my $job_queue_file_name;
-my @job_queue_col_names = ("id INTEGER PRIMARY KEY auto_increment",
+my @job_queue_col_names = ("id INTEGER PRIMARY KEY",
        "timestamp VARCHAR(14) DEFAULT 'none'", 
        "status VARCHAR(255) DEFAULT 'none'", 
        "result TEXT",
@@ -200,7 +200,7 @@ my $arch = "i386";
 # holds all messages which should be delivered to a user
 our $messaging_db;
 our $messaging_tn = "messaging"; 
-our @messaging_col_names = ("id INTEGER", "subject TEXT", "message_from VARCHAR(255)", "message_to VARCHAR(255)", 
+our @messaging_col_names = ("id INTEGER PRIMARY KEY", "subject TEXT", "message_from VARCHAR(255)", "message_to VARCHAR(255)", 
         "flag VARCHAR(255)", "direction VARCHAR(255)", "delivery_time VARCHAR(255)", "message TEXT", "timestamp VARCHAR(14)" );
 my $messaging_file_name;
 
@@ -212,6 +212,8 @@ our $client_fai_log_dir = "/var/log/fai";
 my @msgs_to_decrypt = qw();
 my $max_children = 2;
 
+# Allow 50 POE Childs
+sub MAX_CONCURRENT_TASKS () { 50 }
 
 # loop delay for job queue to look for opsi jobs
 my $job_queue_opsi_delay = 10;
@@ -324,11 +326,17 @@ sub daemon_log {
     if(not defined $msg) { return }
     if(not defined $level) { $level = 1 }
     if(defined $log_file){
-        open(LOG_HANDLE, ">>$log_file");
-        if(not defined open( LOG_HANDLE, ">>$log_file" )) {
+        my $open_log_fh = sysopen(LOG_HANDLE, $log_file, O_WRONLY | O_CREAT | O_APPEND , 0440);
+        if(not $open_log_fh) {
             print STDERR "cannot open $log_file: $!";
-            return 
+            return;
+        }
+        # check owner and group of log_file and update settings if necessary
+        my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat($log_file);
+        if((not $uid eq $root_uid) || (not $gid eq $adm_gid)) {
+            chown($root_uid, $adm_gid, $log_file);
         }
+
         chomp($msg);
         #$msg =~s/\n//g;   # no newlines are allowed in log messages, this is important for later log parsing
         if($level <= $verbose){
@@ -344,7 +352,10 @@ sub daemon_log {
             my $name = $prg;
 
             my $log_msg = "$month $monthday $hours:$minutes:$seconds $name $msg\n";
+                       flock(LOG_HANDLE, LOCK_EX);
+                       seek(LOG_HANDLE, 0, 2);
             print LOG_HANDLE $log_msg;
+                       flock(LOG_HANDLE, LOCK_UN);
             if( $foreground ) { 
                 print STDERR $log_msg;
             }
@@ -599,7 +610,7 @@ sub check_outgoing_xml_validity {
         }
 
                                # Check if source contains hostname instead of ip address
-                               if(not $source =~ /^[a-z0-9\.]+:\d+$/i) {
+                               if($source =~ /^[a-z][a-z0-9\.]+:\d+$/i) {
                                                my ($hostname,$port) = split(/:/, $source);
                                                my $ip_address = inet_ntoa(scalar gethostbyname($hostname));
                                                if(defined($ip_address) && $ip_address =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ && $port =~ /^\d+$/) {
@@ -1376,8 +1387,8 @@ sub process_task {
     
     # set timestamp of incoming client uptodate, so client will not 
     # be deleted from known_clients because of expiration
-    my $act_time = &get_time();
-    my $sql = "UPDATE $known_clients_tn SET timestamp='$act_time' WHERE hostname='$source'"; 
+    my $cur_time = &get_time();
+    my $sql = "UPDATE $known_clients_tn SET timestamp='$cur_time' WHERE hostname='$source'"; 
     my $res = $known_clients_db->exec_statement($sql);
 
     ######################
@@ -1780,8 +1791,7 @@ sub watch_for_new_jobs {
                                        my $res_2 = $job_db->exec_statement( $sql_statement_2 );
                                        if(defined($res_2) and defined @{$res_2}[0]) {
                                                # Set status from goto-activation to 'waiting' and update timestamp
-                                               $job_db->exec_statement("UPDATE $job_queue_tn SET status='waiting' WHERE macaddress LIKE '$macaddress' AND headertag = 'trigger_action_reinstall'");
-                                               $job_db->exec_statement("UPDATE $job_queue_tn SET timestamp='".&calc_timestamp(&get_time(), 'plus', 30)."' WHERE macaddress LIKE '$macaddress' AND headertag = 'trigger_action_reinstall'");
+                                               $job_db->exec_statement("UPDATE $job_queue_tn SET status='waiting', timestamp='".&calc_timestamp(&get_time(), 'plus', 30)."' WHERE macaddress LIKE '$macaddress' AND headertag = 'trigger_action_reinstall'");
                                        }
                                }
                                next;
@@ -2061,7 +2071,7 @@ sub watch_for_old_known_clients {
     my $sql_statement = "SELECT * FROM $known_clients_tn";
     my $res = $known_clients_db->select_dbentry( $sql_statement );
 
-    my $act_time = int(&get_time());
+    my $cur_time = int(&get_time());
 
     while ( my ($hit_num, $hit) = each %$res) {
         my $expired_timestamp = int($hit->{'timestamp'});
@@ -2076,7 +2086,7 @@ sub watch_for_old_known_clients {
 
         $dt->add( seconds => 2 * int($hit->{'keylifetime'}) );
         $expired_timestamp = $dt->ymd('').$dt->hms('');
-        if ($act_time > $expired_timestamp) {
+        if ($cur_time > $expired_timestamp) {
             my $hostname = $hit->{'hostname'};
             my $del_sql = "DELETE FROM $known_clients_tn WHERE hostname='$hostname'"; 
             my $del_res = $known_clients_db->exec_statement($del_sql);
@@ -3193,6 +3203,10 @@ GetOptions("h|help" => \&usage,
         "no-arp+" => \$no_arp,
            );
 
+# Prepare UID / GID as daemon_log may need it quite early
+$root_uid = getpwnam('root');
+$adm_gid = getgrnam('adm');
+
 #  read and set config parameters
 &check_cmdline_param ;
 &read_configfile($cfg_file, %cfg_defaults);
@@ -3239,10 +3253,10 @@ if ($server_headURL =~ /\/tag\// ||
     $server_status = "developmental" ;
 }
 
-# Prepare log file
-$root_uid = getpwnam('root');
-$adm_gid = getgrnam('adm');
-chmod(0640, $log_file);
+# Prepare log file and set permissons
+open(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");
 
@@ -3293,60 +3307,61 @@ daemon_log($server_status_hash->{$server_status}.": $server_revision", 1);
         # connect to gosa-si job queue
         unlink($job_queue_file_name);  ## just for debugging
         $job_db = GOSA::DBsqlite->new($job_queue_file_name);
-        chmod(0660, $job_queue_file_name);
+        chmod(0640, $job_queue_file_name);
         chown($root_uid, $adm_gid, $job_queue_file_name);
         
         # connect to known_clients_db
         unlink($known_clients_file_name);   ## just for debugging
         $known_clients_db = GOSA::DBsqlite->new($known_clients_file_name);
-        chmod(0660, $known_clients_file_name);
+        chmod(0640, $known_clients_file_name);
         chown($root_uid, $adm_gid, $known_clients_file_name);
         
         # connect to foreign_clients_db
         unlink($foreign_clients_file_name);
         $foreign_clients_db = GOSA::DBsqlite->new($foreign_clients_file_name);
-        chmod(0660, $foreign_clients_file_name);
+        chmod(0640, $foreign_clients_file_name);
         chown($root_uid, $adm_gid, $foreign_clients_file_name);
         
         # connect to known_server_db
         unlink($known_server_file_name);
         $known_server_db = GOSA::DBsqlite->new($known_server_file_name);
-        chmod(0660, $known_server_file_name);
+        chmod(0640, $known_server_file_name);
         chown($root_uid, $adm_gid, $known_server_file_name);
         
         # connect to login_usr_db
         unlink($login_users_file_name);
         $login_users_db = GOSA::DBsqlite->new($login_users_file_name);
-        chmod(0660, $login_users_file_name);
+        chmod(0640, $login_users_file_name);
         chown($root_uid, $adm_gid, $login_users_file_name);
         
         # connect to fai_server_db
         unlink($fai_server_file_name);
         $fai_server_db = GOSA::DBsqlite->new($fai_server_file_name);
-        chmod(0660, $fai_server_file_name);
+        chmod(0640, $fai_server_file_name);
         chown($root_uid, $adm_gid, $fai_server_file_name);
         
         # connect to fai_release_db
         unlink($fai_release_file_name);
         $fai_release_db = GOSA::DBsqlite->new($fai_release_file_name);
-        chmod(0660, $fai_release_file_name);
+        chmod(0640, $fai_release_file_name);
         chown($root_uid, $adm_gid, $fai_release_file_name);
         
         # connect to packages_list_db
         #unlink($packages_list_file_name);
         unlink($packages_list_under_construction);
         $packages_list_db = GOSA::DBsqlite->new($packages_list_file_name);
-        chmod(0660, $packages_list_file_name);
+        chmod(0640, $packages_list_file_name);
         chown($root_uid, $adm_gid, $packages_list_file_name);
         
         # connect to messaging_db
         unlink($messaging_file_name);
         $messaging_db = GOSA::DBsqlite->new($messaging_file_name);
-        chmod(0660, $messaging_file_name);
+        chmod(0640, $messaging_file_name);
         chown($root_uid, $adm_gid, $messaging_file_name);
     }
 }
 
+
 # Creating tables
 $messaging_db->create_table($messaging_tn, \@messaging_col_names);
 $packages_list_db->create_table($packages_list_tn, \@packages_list_col_names);
@@ -3359,7 +3374,6 @@ $known_clients_db->create_table($known_clients_tn, \@known_clients_col_names);
 $incoming_db->create_table($incoming_tn, \@incoming_col_names);
 $job_db->create_table($job_queue_tn, \@job_queue_col_names);
 
-
 # create xml object used for en/decrypting
 $xml = new XML::Simple();
 
@@ -3418,7 +3432,7 @@ my $all_foreign_server = join(", ", @foreign_server_list);
 daemon_log("0 INFO: found foreign server in config file and DNS: '$all_foreign_server'", 5);
 
 # add all found foreign servers to known_server
-my $act_timestamp = &get_time();
+my $cur_timestamp = &get_time();
 foreach my $foreign_server (@foreign_server_list) {
 
        # do not add myself to known_server_db
@@ -3429,10 +3443,10 @@ foreach my $foreign_server (@foreign_server_list) {
             primkey=>['hostname'],
             hostname=>$foreign_server,
             macaddress=>"",
-            status=>'not_jet_registered',
+            status=>'not_yet_registered',
             hostkey=>"none",
             loaded_modules => "none", 
-            timestamp=>$act_timestamp,
+            timestamp=>$cur_timestamp,
             } );
 }