X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=trunk%2Fgosa-si%2Fgosa-si-server;h=c79bfdd1c9297b919b8121f3477987557619fb61;hb=a1a3d31a784b87c089b95bfea006f369d928a2b5;hp=d13b4212d51357cd98b92a388f633224541a5293;hpb=d7f33dac5d1a846181dee9c159b000eee1472414;p=gosa.git diff --git a/trunk/gosa-si/gosa-si-server b/trunk/gosa-si/gosa-si-server index d13b4212d..c79bfdd1c 100755 --- a/trunk/gosa-si/gosa-si-server +++ b/trunk/gosa-si/gosa-si-server @@ -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 PRIMARY KEY", "subject TEXT", "message_from VARCHAR(255)", "message_to VARCHAR(255)", +our @messaging_col_names = ("id INTEGER", "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; @@ -510,27 +510,42 @@ sub password_check { } +sub clean_shutdown +{ + unlink($pid_file) if (-w $pid_file); + unlink($packages_list_under_construction) if (-w $packages_list_under_construction); +} -#=== FUNCTION ================================================================ -# NAME: sig_int_handler -# PARAMETERS: signal - string - signal arose from system -# RETURNS: nothing -# DESCRIPTION: handels tasks to be done befor signal becomes active -#=============================================================================== -sub sig_int_handler { +sub sig_int_or_term_handler +{ my ($signal) = @_; + daemon_log("Got SIG${signal} - shutting down gosa-si-server", 1); + clean_shutdown(); + POE::Kernel->signal('gosa-si_server_session', 'KILL'); + POE::Kernel->signal('TCP_SERVER', 'KILL'); + return 1; +} -# if (defined($ldap_handle)) { -# $ldap_handle->disconnect; -# } - # TODO alle verbliebenden ldap verbindungen aus allen heaps beenden - +sub sig_warn_handler +{ + my @loc = caller(0); + daemon_log( "SIGWARN line " . $loc[2] . ": " . $_[0], 1 ); + return 1; +} - daemon_log("shutting down gosa-si-server", 1); - system("kill `ps -C gosa-si-server -o pid=`"); +sub sig_die_handler +{ + my @loc = caller(0); + daemon_log( "SIGDIE line " . $loc[2] . ": " . $_[0], 1 ); + clean_shutdown(); + return 1; } -$SIG{INT} = \&sig_int_handler; +$SIG{'INT'} = \&sig_int_or_term_handler; +$SIG{'TERM'} = \&sig_int_or_term_handler; +$SIG{'__WARN__'} = \&sig_warn_handler; +$SIG{'__DIE__'} = \&sig_die_handler; +$SIG{'USR1'} = 'IGNORE'; sub check_key_and_xml_validity { my ($crypted_msg, $module_key, $session_id) = @_; @@ -610,7 +625,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+$/) { @@ -953,6 +968,10 @@ sub send_msg_to_target { $sql_statement = "DELETE FROM known_server WHERE hostname='$address'"; $res = $known_server_db->del_dbentry($sql_statement); daemon_log("$session_id WARNING: failed 2x to send a message to host '$address', delete host from known_server", 3); + + # Remove the registered clients of the server as well + $sql_statement = "DELETE FROM foreign_clients WHERE regserver='$address'"; + $res = $foreign_clients_db->del_dbentry($sql_statement); } else { $sql_statement = "UPDATE known_server SET status='$new_status', timestamp='$timestamp' WHERE hostname='$address'"; @@ -1052,14 +1071,6 @@ sub reactivate_job_with_delay { } -sub sig_handler { - my ($kernel, $signal) = @_[KERNEL, ARG0] ; - daemon_log("0 INFO got signal '$signal'", 1); - $kernel->sig_handled(); - return; -} - - sub msg_to_decrypt { my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; my $session_id = $session->ID; @@ -1560,12 +1571,12 @@ sub process_task { sub session_start { my ($kernel) = $_[KERNEL]; + $kernel->alias_set('gosa-si_server_session'); $global_kernel = $kernel; $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); $kernel->delay_set('watch_for_done_jobs', $job_queue_loop_delay); @@ -1579,9 +1590,14 @@ sub session_start { if ($opsi_enabled eq "true") { $kernel->delay_set('watch_for_opsi_jobs', $job_queue_opsi_delay); } - } +sub session_stop { + my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; + $kernel->alias_remove($heap->{alias}); + $kernel->alarm_remove_all(); + $kernel->post($heap->{child_session}, '_stop'); +} sub watch_for_done_jobs { #CHECK: $heap for what? @@ -1791,8 +1807,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; @@ -1939,7 +1954,8 @@ sub watch_for_delivery_messages { my ($kernel, $heap) = @_[KERNEL, HEAP]; # select outgoing messages - my $sql_statement = "SELECT * FROM $messaging_tn WHERE ( flag='p' AND direction='out' )"; + my $timestamp= &get_time(); + my $sql_statement = "SELECT * FROM $messaging_tn WHERE ( flag='p' AND direction='out' AND delivery_time<$timestamp)"; #&daemon_log("0 DEBUG: $sql", 7); my $res = $messaging_db->exec_statement( $sql_statement ); @@ -3204,6 +3220,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); @@ -3251,8 +3271,6 @@ if ($server_headURL =~ /\/tag\// || } # Prepare log file and set permissons -$root_uid = getpwnam('root'); -$adm_gid = getgrnam('adm'); open(FH, ">>$log_file"); close FH; chmod(0440, $log_file); @@ -3492,8 +3510,8 @@ daemon_log("0 INFO: start socket for incoming xml messages at port '$server_port POE::Session->create( inline_states => { _start => \&session_start, + _stop => \&session_stop, register_at_foreign_servers => \®ister_at_foreign_servers, - sig_handler => \&sig_handler, next_task => \&next_task, task_result => \&handle_task_result, task_done => \&handle_task_done,