index d13b4212d51357cd98b92a388f633224541a5293..c79bfdd1c9297b919b8121f3477987557619fb61 100755 (executable)
# 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;
}
+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) = @_;
}
# 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+$/) {
$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'";
}
-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;
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);
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?
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;
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 );
"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);
}
# 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,