diff --git a/gosa-si/gosa-si-server b/gosa-si/gosa-si-server
index 81b36b20dddf9e587996b8c2e6bdf3dfbdf21321..1dd69157831df62552ae5277a4f56412f38b6b34 100755 (executable)
--- a/gosa-si/gosa-si-server
+++ b/gosa-si/gosa-si-server
#
# 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>
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);
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";
# 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 }
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 );
}
my $answer;
my %act_modules = %$known_modules;
while( my ($module, $info) = each(%act_modules)) {
- &daemon_log("##########", 5);
my $tmp = &{ $module."::process_incoming_msg" }($msg);
if (defined $tmp) {
$answer = $tmp;
}
- &daemon_log("##########", 5);
}
-
- #&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", 5);
- daemon_log("$answer", 5);
+ daemon_log("with answer: length of answer: $len_answer", 7);
+ daemon_log("\n$answer", 7);
} else {
print $PARENT_wr "done"."\n";
- daemon_log(" ", 5);
+ print $PARENT_wr "ENDMESSAGE\n";
}
redo;
}
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
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");
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", 5);
+
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);
}
}
}
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;
&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);
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);
}