Code

Updated referrals
[gosa.git] / gosa-si / gosa-si-server
index 37833524537e8f8fc6756738997871628a6257a1..1dd69157831df62552ae5277a4f56412f38b6b34 100755 (executable)
@@ -9,8 +9,7 @@
 #
 #      OPTIONS:  ---
 # REQUIREMENTS:  libconfig-inifiles-perl libcrypt-rijndael-perl libxml-simple-perl 
-#                libipc-shareable-perl libdata-dumper-simple-perl 
-#                libdbd-sqlite3-perl libnet-ldap-perl
+#                libdata-dumper-simple-perl libdbd-sqlite3-perl libnet-ldap-perl
 #         BUGS:  ---
 #        NOTES:
 #       AUTHOR:   (Andreas Rettenberger), <rettenberger@gonicus.de>
@@ -30,6 +29,9 @@ use Time::HiRes qw( gettimeofday );
 
 use Fcntl;
 use IO::Socket::INET;
+use IO::Handle;
+use IO::Select;
+use Symbol qw(qualify_to_ref);
 use Crypt::Rijndael;
 use MIME::Base64;
 use Digest::MD5  qw(md5 md5_hex md5_base64);
@@ -38,10 +40,9 @@ use Data::Dumper;
 use Sys::Syslog qw( :DEFAULT setlogsock);
 use Cwd;
 use File::Spec;
-use IPC::Shareable qw( :lock);
-IPC::Shareable->clean_up_all;
 use GOSA::GosaSupportDaemon;
 use GOSA::DBsqlite;
+use threads;
 
 my $modules_path = "/usr/lib/gosa-si/modules";
 use lib "/usr/lib/gosa-si/modules";
@@ -192,7 +193,7 @@ sub read_configfile {
 #      RETURNS:  nothing
 #  DESCRIPTION:  function for logging
 #===============================================================================
-sub daemon_log {
+sub daemon_log : locked {
     # log into log_file
     my( $msg, $level ) = @_;
     if(not defined $msg) { return }
@@ -216,7 +217,11 @@ sub daemon_log {
                 my $name = $0;
                 $name =~ s/\.\///;
 
-                print LOG_HANDLE "\n$month $monthday $hours:$minutes:$seconds $name $msg";
+                my $log_msg = "$month $monthday $hours:$minutes:$seconds $name $msg\n";
+                print LOG_HANDLE $log_msg;
+                if( $foreground ) { 
+                    print STDERR $log_msg;
+                }
             }
         close( LOG_HANDLE );
     }
@@ -480,20 +485,17 @@ sub get_processing_child {
                                 $answer = $tmp;
                             }
                     }        
-
-                    #&print_known_daemons();
-                    #&print_known_clients();
-
                     daemon_log("processing of msg finished", 5);
  
                    if (defined $answer) {
                         print $PARENT_wr $answer."\n";
+                        print $PARENT_wr "ENDMESSAGE\n";
                         my $len_answer = length $answer;
                         daemon_log("with answer: length of answer: $len_answer", 7);
                         daemon_log("\n$answer", 7);
                     } else {
                         print $PARENT_wr "done"."\n";
-                        daemon_log(" ", 7);
+                        print $PARENT_wr "ENDMESSAGE\n";
                     }
                     redo;
                 }
@@ -751,142 +753,42 @@ sub create_known_client {
     return;  
 }
 
-
-#===  FUNCTION  ================================================================
-#         NAME:  add_content2known_clients
-#   PARAMETERS:  hostname - string - ip address and port of host (required)
-#                status - string - (optional)
-#                passwd - string - (optional)
-#                mac_address - string - (optional)
-#                events - string - event of client, executable skripts 
-#                under /etc/gosac/events
-#      RETURNS:  nothing
-#  DESCRIPTION:  nome est omen and updates each time the timestamp of hostname
-#===============================================================================
-#sub update_known_clients {
-#    my $arg = {
-#        hostname => undef, status => undef, hostkey => undef,
-#        macaddress => undef, events => undef, timestamp=>undef,
-#        @_ };
-#    my $hostname = $arg->{hostname};
-#    my $status = $arg->{status};
-#    my $hostkey = $arg->{hostkey};
-#    my $macaddress = $arg->{macaddress};
-#    my $events = $arg->{events};
-#    my $timestamp = $arg->{timestamp}; 
-#
-#    if (not defined $hostname) {
-#        daemon_log("ERROR: function add_content2known_clients is not invoked with requiered parameter 'hostname'", 1);
-#        return;
-#    }
-#
-#    my $change_entry = { table=>'known_clients',
-#                        where=>'hostname', 
-#                        timestamp=>&get_time, 
-#                        };
-#   
-#   
-#    if (defined $status) {
-#        $change_entry->{status} = $status;
-#    }
-#    if (defined $hostkey) {
-#        $change_entry->{hostkey} = $hostkey;
-#    }
-#    if (defined $macaddress) {
-#        $change_entry->{macaddress} = $macaddress;
-#    }
-#    if (defined $events) {
-#        $change_entry->{events} = $events;
-#    }
-#    
-#    $known_clients->change_dbentry($change_entry);
-#    return;
-#}
-
-#===  FUNCTION  ================================================================
-#         NAME:  
-#   PARAMETERS:  
-#      RETURNS:  
-#  DESCRIPTION:  
-#===============================================================================    
-#sub clean_up_known_clients {
-#    my ($address) = @_ ;
-#    
-#    if (not exists $known_clients->{$address}) {
-#        daemon_log("cannot prune known_clients from $address, client not known", 5);
-#        return;
-#    }
+#sub sysreadline(*;$) {
+#    my ($hd, $timeout) = @_;
 #
-#    delete $known_clients->{$address};
+#    $hd = qualify_to_ref($hd, caller());
+#    my $infinitely_patient = (@_ == 1 || $timeout < 0);
+#    my $start_time = time();
+#    my $selector = IO::Select->new();
+#    $selector->add($hd);
+#    my $line = "";
 #
-#    # send bus a msg that address was deleted from known_clients
-#    my $out_hash = &create_xml_hash('delete_client', $server_address, $bus_address, $address);
-#    &send_msg_hash2bus($out_hash);
-#
-#    daemon_log("client $address deleted from known_clients because of multiple down time", 3);
-#    return;
-#}
-
-
-#===  FUNCTION  ================================================================
-#         NAME:  update_known_clients
-#   PARAMETERS:  hostname - string - ip address and port of host (required)
-#                status - string - (optional)
-#                passwd - string - (optional)
-#                client - string - ip address and port of client (optional)
-#      RETURNS:  nothing
-#  DESCRIPTION:  nome est omen and updates each time the timestamp of hostname
-#===============================================================================
-#sub update_known_clients {
-#    my $arg = {
-#        hostname => undef, status => undef, passwd => undef,
-#        mac_address => undef, events => undef,
-#        @_ };
-#    my $hostname = $arg->{hostname};
-#    my $status = $arg->{status};
-#    my $passwd = $arg->{passwd};
-#    my $mac_address = $arg->{mac_address};
-#    my $events = $arg->{events};
+#SLEEP: 
+#    until( at_eol($line)) {
+#        if (not $infinitely_patient) {
+#            return $line if time() > ($start_time + $timeout);
+#        }
+#        next SLEEP unless $selector->can_read(1.0);
+#INPUT_READY:
+#        while( $selector->can_read(0.0)) {
+#            my $was_blocking = $hd->blocking(0);
+#CHAR:       while (sysread($hd, my $nextbyte, 1)) {
+#                $line .= $nextbyte;  
+#                last CHAR if $nextbyte eq "\n";
 #
-#    if (not defined $hostname) {
-#        daemon_log("ERROR: function add_content2known_daemons is not invoked with requiered parameter 'hostname'", 1);
-#        return;
+#            }
+#            $hd->blocking($was_blocking);
+#            next SLEEP unless at_eol($line);
+#            last INPUT_READY;
+#        }
 #    }
+#    return $line;
+#}
 #
-#    my ($seconds, $minutes, $hours, $monthday, $month,
-#    $year, $weekday, $yearday, $sommertime) = localtime(time);
-#    $hours = $hours < 10 ? $hours = "0".$hours : $hours;
-#    $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes;
-#    $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds;
-#    $month+=1;
-#    $month = $month < 10 ? $month = "0".$month : $month;
-#    $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday;
-#    $year+=1900;
-#    my $t = "$year$month$monthday$hours$minutes$seconds";
-#
-#    if (defined $status) {
-#        $known_clients->{$hostname}->{status} = $status;
-#    }
-#    if (defined $passwd) {
-#        $known_clients->{$hostname}->{passwd} = $passwd;
-#    }
-#    if (defined $mac_address) {
-#        $known_clients->{$hostname}->{mac_address} = $mac_address; 
-#    }
-#    if (defined $events) {
-#        $known_clients->{$hostname}->{events} = $events;
-#    }
-#    $known_clients_db->{$hostname}->{timestamp} = $t;
-#    return;
+#sub at_eol($) {
+#    $_[0] =~ /\n\z/ ;
 #}
 
-
-
-
-
-
-
 #==== MAIN = main ==============================================================
 
 #  parse commandline options
@@ -935,6 +837,8 @@ if( 0 != $pid ) {
 daemon_log(" ", 1);
 daemon_log("$0 started!", 1);
 
+# delete old DBsqlite lock files
+system('rm -f /tmp/gosa_si_lock*');
 
 # connect to gosa-si job queue
 my @job_col_names = ("id", "timestamp", "status", "result", "headertag", "targettag", "xmlmessage", "macaddress");
@@ -1065,39 +969,33 @@ while(1) {
 
         if (vec($rout, fileno $fhd, 1) ) {
             daemon_log("process child $pid is ready to read", 5);
-
-            $fhd->blocking(1);
-            my $in_msg = <$fhd>;
-            $fhd->blocking(0);
-            my $part_in_msg;
-            while ($part_in_msg = <$fhd>) {
-                if (not defined $part_in_msg) {
+            my $in_msg;
+            while (1) {
+                my $part_in_msg = <$fhd>;
+                if( $part_in_msg eq "ENDMESSAGE\n") {
                     last;
                 }
                 $in_msg .= $part_in_msg;
             }
             chomp($in_msg);
-
-            daemon_log("process child read: $in_msg", 7);
-            daemon_log("\n$in_msg", 7);
+            
             if (not defined $in_msg) { 
                 next; 
             } elsif ($in_msg =~ "done") {
+                daemon_log("process child read: $in_msg", 7);
                 delete $busy_child{$pid};
                 $free_child{$pid} = $child_hash;
+
             } else {
+                daemon_log("process child read:", 7);
+                daemon_log("\n$in_msg", 8);
                 # send computed answer back to connected client
                 my $act_client = $busy_child{$pid}{client_ref};
                 print $act_client $in_msg."\n";
-
-                #my $act_pipe = $busy_child{$pid}{pipe_rd};
                 delete $busy_child{$pid};
                 $free_child{$pid} = $child_hash;
 
-                # give the client a chance to read 
-                sleep(2);
-                close ($act_client);   
             }
         }
     }
@@ -1119,7 +1017,7 @@ while(1) {
 
     while( my ($id, $hit) = each %{$res} ) {         
 
-        my $jobdb_id = $hit->{ROWID};
+        my $jobdb_id = $hit->{id};
         my $macaddress = $hit->{macaddress};
         my $job_msg_hash = &transform_msg2hash($hit->{xmlmessage});
         my $out_msg_hash = $job_msg_hash;
@@ -1132,7 +1030,7 @@ while(1) {
             &daemon_log("xml message: $hit->{xmlmessage}", 5);
             my $update_hash = { table=>$job_queue_table_name,
                 update=> [ { status=>['error'], result=>["no host found for mac address"] } ],
-                where=> [ { ROWID=>[$jobdb_id] } ],
+                where=> [ { id=>[$jobdb_id] } ],
             };
             my $res = $job_db->update_dbentry($update_hash);
 
@@ -1159,16 +1057,13 @@ while(1) {
 
         my $error = &send_msg_hash2address($out_msg_hash, "$gosa_ip:$gosa_port", $gosa_passwd);
 
-#######################
-# TODO exchange ROWID with jobid, insert column jobid in table jobs befor
-
         if ($error == 0) {
-            my $sql = "UPDATE '$job_queue_table_name' SET status='processing', targettag='$target' WHERE ROWID='$jobdb_id'";
+            my $sql = "UPDATE '$job_queue_table_name' SET status='processing', targettag='$target' WHERE id='$jobdb_id'";
             my $res = $job_db->exec_statement($sql);
         } else {
             my $update_hash = { table=>$job_queue_table_name, 
                                 update=> [ { status=>'error' } ],
-                                where=> [ { ROWID=>$jobdb_id } ],
+                                where=> [ { id=>$jobdb_id } ],
                               };
             my $res = $job_db->update_dbentry($update_hash);
         }