X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fgosa-si-client;h=d9bf2393d29dd576ce5850a5106a87a3e39ecf01;hb=1164b82972575c6389707407a1b11ccc066e2028;hp=9aaa5db31995657ab6f0fb7189b88af297bcc3a0;hpb=12b8221fa3b18c5379df5188d1e094fb19121911;p=gosa.git diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client index 9aaa5db31..d9bf2393d 100755 --- a/gosa-si/gosa-si-client +++ b/gosa-si/gosa-si-client @@ -20,13 +20,12 @@ use strict; use warnings; -use utf8; use Getopt::Long; use Config::IniFiles; use POSIX; use Time::HiRes qw( gettimeofday ); -use POE qw(Component::Server::TCP Wheel::FollowTail); +use POE qw(Component::Server::TCP Wheel::FollowTail Wheel::Run); use IO::Socket::INET; use NetAddr::IP; use Data::Dumper; @@ -37,11 +36,15 @@ use MIME::Base64; use XML::Simple; use Net::DNS; use File::Basename; +use File::Spec; + +# Workaround: need pure perl to make it work with UTF-8 :-( +$XML::Simple::PREFERRED_PARSER= "XML::SAX::PurePerl"; my $event_dir = "/usr/lib/gosa-si/client/events"; use lib "/usr/lib/gosa-si/client/events"; -my ($cfg_file, %cfg_defaults, $foreground, $verbose, $pid_file, $opts_file, $procid, $pid, $log_file, $fai_logpath); +my (%cfg_defaults, $foreground, $verbose, $pid_file, $procid, $pid, $log_file, $fai_logpath); my ($server_ip, $server_port, $server_key, $server_timeout, $server_domain, $server_key_lifetime); my ($client_ip, $client_port, $client_mac_address, $ldap_enabled, $ldap_config, $pam_config, $nss_config); my $xml; @@ -55,8 +58,13 @@ $verbose= 1; # globalise variables which are used in imported events our $cfg_file; +our $opts_file; our $server_address; our $client_address; +our $client_ip; +our $client_mac_address; +our $client_dnsname; +our $client_force_hostname; our $server_key; # default variables @@ -68,9 +76,15 @@ $gosa_si_client_fifo = "/var/run/gosa-si-client.socket"; # in function register_at_gosa_si_server, after which period of seconds a new registration should be tried if a registration was # not successful until now -my $delay_set_time = 5; +my $delay_set_time = 10; our $prg= basename($0); +# all x seconds the client reports logged_in users to gosa-si-server +my $trigger_logged_in_users_report_delay = 600; + +# directory where all log files from installation are stored +my $fai_log_dir = "/tmp/fai"; + %cfg_defaults = ( "general" => {"log-file" => [\$log_file, "/var/run/".$prg.".log"], @@ -85,8 +99,9 @@ our $prg= basename($0); "ldap" => [\$ldap_enabled, 1], "ldap-config" => [\$ldap_config, "/etc/ldap/ldap.conf"], "pam-config" => [\$pam_config, "/etc/pam_ldap.conf"], - "nss-config" => [\$nss_config, "/etc/libnss_ldap.conf"], + "nss-config" => [\$nss_config, "/etc/libnss-ldap.conf"], "fai-logpath" => [\$fai_logpath, "/var/log/fai/fai.log"], + "force-hostname" => [\$client_force_hostname, "false"], }, "server" => { "ip" => [\$server_ip, "127.0.0.1"], @@ -135,7 +150,7 @@ sub check_cmdline_param () { sub read_configfile { my ($cfg_file, %cfg_defaults) = @_ ; my $cfg; - if( defined( $cfg_file) && ( length($cfg_file) > 0 )) { + if( defined( $cfg_file) && ( (-s $cfg_file) > 0 )) { if( -r $cfg_file ) { $cfg = Config::IniFiles->new( -file => $cfg_file ); } else { @@ -147,7 +162,7 @@ sub read_configfile { foreach my $section (keys %cfg_defaults) { foreach my $param (keys %{$cfg_defaults{ $section }}) { my $pinfo = $cfg_defaults{ $section }{ $param }; - ${@$pinfo[ 0 ]} = $cfg->val( $section, $param, @$pinfo[ 1 ] ); + ${@$pinfo[ 0 ]} = $cfg->val( $section, $param, @$pinfo[ 1 ] ); } } } @@ -204,9 +219,9 @@ sub check_pid { sub sig_int_handler { my ($signal) = @_; - - daemon_log("shutting down gosa-si-server", 1); - exit(1); + + daemon_log("shutting down gosa-si-client", 1); + system("kill `ps -C gosa-si-client -o pid=`"); } $SIG{INT} = \&sig_int_handler; @@ -249,15 +264,6 @@ sub daemon_log { } close( LOG_HANDLE ); } -#log into syslog -# my ($msg, $level, $facility) = @_; -# if(not defined $msg) {return} -# if(not defined $level) {$level = "info"} -# if(not defined $facility) {$facility = "LOG_DAEMON"} -# openlog($0, "pid,cons,", $facility); -# syslog($level, $msg); -# closelog; -# return; } @@ -575,91 +581,10 @@ sub get_server_addresses { } } -# my $dig_cmd= 'dig +nocomments srv _gosa-si._tcp.'.$domain; -# -# my $output= `$dig_cmd 2>&1`; -# open (PIPE, "$dig_cmd 2>&1 |"); -# while() { -# chomp $_; -# # If it's not a comment -# if($_ =~ m/^[^;]/) { -# my @matches= split /\s+/; -# -# # Push hostname with port -# if($matches[3] eq 'SRV') { -# push @result, $matches[7].':'.$matches[6]; -# } elsif ($matches[3] eq 'A') { -# my $i=0; -# -# # Substitute the hostname with the ip address of the matching A record -# foreach my $host (@result) { -# if ((split /\:/, $host)[0] eq $matches[0]) { -# $result[$i]= $matches[4].':'.(split /\:/, $host)[1]; -# } -# $i++; -# } -# } -# } -# } -# close(PIPE); return @result; } -##=== FUNCTION ================================================================ -## NAME: create_ciphering -## PARAMETERS: passwd - string - used to create ciphering -## RETURNS: cipher - object -## DESCRIPTION: creates a Crypt::Rijndael::MODE_CBC object with passwd as key -##=============================================================================== -#sub create_ciphering { -# my ($passwd) = @_; -# $passwd = substr(md5_hex("$passwd") x 32, 0, 32); -# my $iv = substr(md5_hex('GONICUS GmbH'),0, 16); -# -# #daemon_log("iv: $iv", 7); -# #daemon_log("key: $passwd", 7); -# my $my_cipher = Crypt::Rijndael->new($passwd , Crypt::Rijndael::MODE_CBC()); -# $my_cipher->set_iv($iv); -# return $my_cipher; -#} -# -# -#sub create_ciphering { -# my ($passwd) = @_; -# $passwd = substr(md5_hex("$passwd") x 32, 0, 32); -# my $iv = substr(md5_hex('GONICUS GmbH'),0, 16); -# my $my_cipher = Crypt::Rijndael->new($passwd , Crypt::Rijndael::MODE_CBC()); -# $my_cipher->set_iv($iv); -# return $my_cipher; -#} -# -# -#sub encrypt_msg { -# my ($msg, $key) = @_; -# my $my_cipher = &create_ciphering($key); -# { -# use bytes; -# $msg = "\0"x(16-length($msg)%16).$msg; -# } -# $msg = $my_cipher->encrypt($msg); -# chomp($msg = &encode_base64($msg)); -# # there are no newlines allowed inside msg -# $msg=~ s/\n//g; -# return $msg; -#} -# -# -#sub decrypt_msg { -# my ($msg, $key) = @_ ; -# $msg = &decode_base64($msg); -# my $my_cipher = &create_ciphering($key); -# $msg = $my_cipher->decrypt($msg); -# $msg =~ s/\0*//g; -# return $msg; -#} - - #=== FUNCTION ================================================================ # NAME: send_msg_hash_to_target # PARAMETERS: msg_hash - hash - xml_hash created with function create_xml_hash @@ -682,30 +607,28 @@ sub send_msg_to_target { my ($msg, $address, $encrypt_key, $msg_header) = @_ ; my $error = 0; - if( $msg_header ) { - $msg_header = "'$msg_header'-"; - } - else { - $msg_header = ""; - } + if( $msg_header ) { $msg_header = "'$msg_header'-"; } + else { $msg_header = ""; } # encrypt xml msg my $crypted_msg = &encrypt_msg($msg, $encrypt_key); + # xxxxxxxxxxxxxx + + + # opensocket my $socket = &open_socket($address); if( !$socket ) { - daemon_log("cannot send ".$msg_header."msg to $address , host not reachable", 1); + daemon_log("ERROR: cannot send ".$msg_header."msg to $address , host not reachable", 1); $error++; } + # send xml msg if( $error == 0 ) { - # send xml msg print $socket $crypted_msg."\n"; - - daemon_log("send ".$msg_header."msg to $address", 1); - daemon_log("message:\n$msg", 8); - + daemon_log("INFO: send ".$msg_header."msg to $address", 5); + daemon_log("DEBUG: message:\n$msg", 8); } # close socket in any case @@ -734,9 +657,10 @@ sub write_to_file { chomp($string); - open(FILE, ">> $file"); - print FILE $string."\n"; - close(FILE); + if (open(FILE, ">> $file")){ + print FILE $string."\n"; + close(FILE); + } } return; @@ -769,92 +693,99 @@ sub open_socket { # DESCRIPTION: #=============================================================================== sub register_at_gosa_si_server { - my ($kernel) = $_[KERNEL]; - my $try_to_register = 0; - - if( not $REGISTERED ) { - # create new passwd and ciphering object for client-server communication - $server_key = &create_passwd(); - - my $events = join( ", ", keys %{$event_hash} ); - while(1) { - - if( $try_to_register >= @servers ) { - last; - } - - # fetch first gosa-si-server from @servers - my $server = shift(@servers); - - # append shifted gosa-si-server at the end of @servers, so looking for servers never stop if - # a registration never occured - push( @servers, $server ); - - # Check if our ip is resolvable - if not: don't try to register - my $ip= &get_local_ip_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/)); - my $resolver= Net::DNS::Resolver->new; - my $dnsresult= $resolver->search($ip); - my $dnsname=""; - if(!defined($dnsresult)) { - &write_to_file("goto-error-dns:$ip", $fai_logpath); - exit(1); - } else { - $dnsname=$dnsresult->{answer}[0]->{ptrdname}; + my ($kernel) = $_[KERNEL]; + my $try_to_register = 0; + + # if client is already registered, stop registration process + if ($REGISTERED) { + $kernel->delay('register_at_gosa_si_server'); + + # client is not registered, start registration process + } else { + # clear all other triggered events and wait till registration was successful + $kernel->delay('trigger_new_key'); + + # create new passwd and ciphering object for client-server communication + $server_key = &create_passwd(); + + my $events = join( ",", keys %{$event_hash} ); + while(1) { + # fetch first gosa-si-server from @servers + my $server = shift(@servers); + + # append shifted gosa-si-server at the end of @servers, so looking for servers never stop if + # a registration never occured + push( @servers, $server ); + + # Check if our ip is resolvable - if not: don't try to register + my $ip= &get_local_ip_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/)); + my $dnsname= gethostbyaddr(inet_aton($ip), AF_INET); + if(!defined($dnsname)) { + &write_to_file("goto-error-dns:$ip", $fai_logpath); + exit(1); + } + + # create registration msg + my $local_ip = &get_local_ip_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/)); + my $local_mac = &get_local_mac_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/)); + my $register_hash = &create_xml_hash("here_i_am", $local_ip.":".$client_port, $server); + &add_content2xml_hash($register_hash, "new_passwd", $server_key); + &add_content2xml_hash($register_hash, "mac_address", $local_mac); + &add_content2xml_hash($register_hash, "events", $events); + &add_content2xml_hash($register_hash, "gotoHardwareChecksum", $gotoHardwareChecksum); + + # Add $HOSTNAME from ENV if force-hostname is set + if( defined($client_force_hostname) && $client_force_hostname eq "true") { + if(defined($ENV{HOSTNAME}) && length($ENV{HOSTNAME}) >0 ) { + &add_content2xml_hash($register_hash, "force-hostname", $ENV{HOSTNAME}); + } else { + &main::daemon_log("force-hostname was set to true, but no \$HOSTNAME was found in Environment!",0); + } } - # create registration msg - my $local_ip = &get_local_ip_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/)); - my $local_mac = &get_local_mac_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/)); - my $register_hash = &create_xml_hash("here_i_am", $local_ip.":".$client_port, $server); - &add_content2xml_hash($register_hash, "new_passwd", $server_key); - &add_content2xml_hash($register_hash, "mac_address", $local_mac); - &add_content2xml_hash($register_hash, "events", $events); - &add_content2xml_hash($register_hash, "gotoHardwareChecksum", $gotoHardwareChecksum); + # send xml hash to server with general server passwd + my $res = &send_msg_hash_to_target($register_hash, $server, $default_server_key); + + if( $try_to_register >= @servers ) { last; } - # send xml hash to server with general server passwd - my $res = &send_msg_hash_to_target($register_hash, $server, $default_server_key); + # if delivery of registration msg succeed if($res == 0) { - # reset try_to_register - $try_to_register = 0; - - # Set fixed client address + # reset try_to_register + $try_to_register = 0; + + # Set fixed client address and mac address $client_ip= &get_local_ip_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/)); $client_address= "$client_ip:$client_port"; + $client_mac_address = $local_mac; + $client_dnsname = $dnsname; + last; - # Write the MAC address to file - if(stat($opts_file)) { - unlink($opts_file); - } - my $opts_file_FH; - my $hostname= $dnsname; - $hostname =~ s/\..*$//; - open($opts_file_FH, ">$opts_file"); - print $opts_file_FH "MAC=\"$local_mac\"\n"; - print $opts_file_FH "IPADDRESS=\"$client_ip\"\n"; - print $opts_file_FH "HOSTNAME=\"$hostname\"\n"; - print $opts_file_FH "FQDN=\"$dnsname\"\n"; - close($opts_file_FH); - last; + # delivery of registration msg failed } else { - $try_to_register++; - # wait 1 sec until trying to register again - sleep(1); + $try_to_register++; + # wait 1 sec until trying to register again + sleep(1); next; } - } - if( $try_to_register >= @servers ) { - &write_to_file("gosa-si-no-server-available", $fai_logpath); - $kernel->delay_set('register_at_gosa_si_server', $delay_set_time); - } - else { - daemon_log("waiting for msg 'register_at_gosa_si_server'",1); - $kernel->delay_set('register_at_gosa_si_server', $delay_set_time); - # clear old settings and set it again - $kernel->delay_set('trigger_new_key', $server_key_lifetime); - } - } - return; + } # end of while + + # one circle through all servers finished and no registration succeed + if ( $try_to_register >= @servers ) { + &write_to_file("gosa-si-no-server-available", $fai_logpath); + $kernel->delay_set('register_at_gosa_si_server', $delay_set_time); + + # delivery of registraion msg succeed, waiting for server response + } else { + daemon_log("INFO: waiting for msg 'register_at_gosa_si_server'",5); + $kernel->delay_set('register_at_gosa_si_server', $delay_set_time); + # clear old settings and set it again + $kernel->delay('trigger_new_key'); + $kernel->delay_set('trigger_new_key', $server_key_lifetime); + } + + } + return; } @@ -989,7 +920,7 @@ sub import_events { eval{ require $event; }; if( $@ ) { daemon_log("ERROR: import of event module '$event' failed", 1); - daemon_log("$@", 8); + daemon_log("$@", 1); next; } @@ -1015,18 +946,38 @@ sub trigger_new_key { &send_msg_to_target($msg, $client_address, $server_key, 'new_key'); $kernel->delay_set('trigger_new_key', $server_key_lifetime); - } -sub generic_file_reset { - my ( $heap, $wheel_id ) = @_[ HEAP, ARG0 ]; +sub trigger_logged_in_users_report { + my ($kernel) = $_[KERNEL] ; - my $service = $heap->{services}->{$wheel_id}; - daemon_log("INFO: '$service' watching reset", 5); - return; + # just do if client is registered already + if( $REGISTERED ) { + my $result = qx(/usr/bin/users); + my @logged_in_user_list; + if( defined $result ) { + chomp($result); + @logged_in_user_list = split(/\s/, $result); + } + + system("echo 'CURRENTLY_LOGGED_IN ".join(" ", @logged_in_user_list)."' > /var/run/gosa-si-client.socket"); + $kernel->delay_set('trigger_logged_in_users_report', $trigger_logged_in_users_report_delay); + } else { + # try it in 10 sec again + $kernel->delay_set('trigger_logged_in_users_report', 10); + } } + +#sub generic_file_reset { +# my ( $heap, $wheel_id ) = @_[ HEAP, ARG0 ]; +# +# my $service = $heap->{services}->{$wheel_id}; +# daemon_log("INFO: '$service' watching reset", 5); +# return; +#} + sub generic_file_error { my ( $heap, $operation, $errno, $error_string, $wheel_id ) = @_[ HEAP, ARG0, ARG1, ARG2, ARG3 ]; @@ -1040,10 +991,12 @@ sub generic_file_error { return; } + sub fifo_got_record { my $file_record = $_[ARG0]; my $header; my $content = ""; + daemon_log("DEBUG: fifo got record: $file_record", 7); $file_record =~ /^(\S+)[ ]?([\s\S]+)?$/; if( defined $1 ) { @@ -1059,11 +1012,56 @@ sub fifo_got_record { my $clmsg_hash = &create_xml_hash("CLMSG_$header", $client_address, $server_address, $content); &add_content2xml_hash($clmsg_hash, "macaddress", $client_mac_address); my $clmsg = &create_xml_string($clmsg_hash); - &send_msg_to_target($clmsg, $server_address, $server_key); + &send_msg_to_target($clmsg, $server_address, $server_key, "CLMSG_$header"); + + # if installation finished, save all log files + if ($file_record eq "TASKBEGIN finish") { + &save_fai_log($fai_log_dir); + } + return; } +sub save_fai_log { + my ($fai_log_dir) = @_ ; + my $FAI_DIR; + + opendir($FAI_DIR, $fai_log_dir); + if (not defined $FAI_DIR) { + daemon_log("ERROR: can not open directory $fai_log_dir: $!", 1); + return; + } + + my @log_files = readdir($FAI_DIR); + closedir($FAI_DIR); + my @log_list; + + foreach my $log_file (@log_files) { + if( $log_file eq "." || $log_file eq ".." ) { next; } + my $log = "log_file:$log_file:"; + $log_file = File::Spec->catfile( $fai_log_dir, $log_file ); + open(my $FILE, "<$log_file"); + if (not defined $FILE ) { + daemon_log("ERROR: can not open '$log_file': $!", 1); + next; + } + my @lines = <$FILE>; + my $log_string = join("", @lines); + $log .= &encode_base64($log_string); + push(@log_list, $log); + close ($FILE); + } + + my $all_log_string = join("\n", @log_list); + my $msg_hash = &create_xml_hash("CLMSG_save_fai_log", $client_address, $server_address, $all_log_string); + &add_content2xml_hash($msg_hash, "macaddress", $client_mac_address); + my $msg = &create_xml_string($msg_hash); + &send_msg_to_target($msg, $server_address, $server_key, "CLMSG_save_fai_log"); + +} + + sub _start { my ($kernel, $heap) = @_[KERNEL, HEAP]; $kernel->alias_set('client_session'); @@ -1072,29 +1070,57 @@ sub _start { $kernel->yield('register_at_gosa_si_server'); # install all file watcher defined - while( my($file_name, $file) = each %files_to_watch ) { - my $file_watcher = POE::Wheel::FollowTail->new( + while( my($name, $file) = each %files_to_watch ) { + my $watcher = POE::Wheel::FollowTail->new( Filename => $file, - InputEvent => $file_name."_record", - ResetEvent => "file_reset", + InputEvent => $name."_record", + # ResetEvent => "file_reset", ErrorEvent => "file_error", ); - $heap->{services}->{ $file_watcher->ID } = $file_name; - $heap->{watchers}->{ $file_watcher->ID } = $file_watcher; +# $heap->{tail} = POE::Wheel::Run->new( +# Program => [ "/usr/bin/tail", "-f", $file ], +# StdoutEvent => $file_name."_record", +# ); + $heap->{services}->{ $watcher->ID } = $name; + $heap->{watchers}->{ $watcher->ID } = $watcher; } + $kernel->yield('trigger_logged_in_users_report'); +} + + +sub _default { + daemon_log("ERROR: can not handle incoming msg with header '$_[ARG0]'", 1); + return; } sub server_input { my ($kernel, $heap, $input, $wheel) = @_[KERNEL, HEAP, ARG0, ARG1]; + my $remote_ip = $heap->{'remote_ip'}, my $error = 0; my $answer; - daemon_log("Incoming msg:\n$input\n", 8); + + daemon_log("INFO: Incoming msg from '$remote_ip'", 5); + daemon_log("DEBUG: Incoming msg:\n$input\n", 8); my ($msg, $msg_hash) = &check_key_and_xml_validity($input, $server_key); if( (!$msg) || (!$msg_hash) ) { - daemon_log("Deciphering of incoming msg failed", 5); + daemon_log("WARNING: Deciphering of incoming msg failed", 3); + if($server_address =~ /$remote_ip/) { + # got a msg from gosa-si-server which can not be decrypted, may the secrete not up-to-date + # cause a reregistering with a new secrete handshake + daemon_log("WARNING: Message from gosa-si-server could not be understood, cause reregistering at server", 3); + + # if client is alread in a registration process, that means not registered, do nothing + # if not, cause re-registration + if (not $REGISTERED) { + &daemon_log("WARNING: gosa-si-client is already in a registration process so ignore this message", 3); + } else { + $REGISTERED = 0; + $kernel->post('client_session', 'register_at_gosa_si_server'); + } + } $error++; } @@ -1106,8 +1132,9 @@ sub server_input { my $source = @{$msg_hash->{source}}[0]; if( exists $event_hash->{$header} ) { + # a event exists with the header as name - daemon_log("found event '$header' at event-module '".$event_hash->{$header}."'", 5); + daemon_log("DEBUG: found event '$header' at event-module '".$event_hash->{$header}."'", 7); no strict 'refs'; $answer = &{$event_hash->{$header}."::$header"}($msg, $msg_hash); } @@ -1132,7 +1159,8 @@ sub server_input { $REGISTERED = 1; } else { - &send_msg_to_target($answer, $server_address, $server_key); + $answer =~ /
(\S+)<\/header>/; + &send_msg_to_target($answer, $server_address, $server_key, $1); } # postprocessing @@ -1167,9 +1195,9 @@ GetOptions("h|help" => \&usage, # forward error messages to logfile if ( ! $foreground ) { - open STDIN, '/dev/null' or die "Can’t read /dev/null: $!"; - open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!"; - open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!"; + open( STDIN, '+>/dev/null' ); + open( STDOUT, '+>&STDIN' ); + open( STDERR, '+>&STDIN' ); } # Just fork, if we are not in foreground mode @@ -1200,11 +1228,6 @@ daemon_log("$prg started!", 1); system('rm -f /tmp/gosa_si_lock*gosa-si-client*'); # detect ip and mac address and complete host address -#if( inet_aton($client_ip) ){ -#print STDERR "ip: $client_ip\n"; -# $client_ip = inet_ntoa(inet_aton($client_ip)); -#print STDERR "ip: $client_ip\n"; -#} $client_address = $client_ip.":".$client_port; my $network_interface= &get_interface_for_ip($client_ip); $client_mac_address= &get_mac($network_interface); @@ -1245,7 +1268,7 @@ $default_server_key = $server_key; # add gosa-si-server address from config file at first position of server list my $server_check_cfg = Config::IniFiles->new( -file => $cfg_file ); -my $server_check = $server_check_cfg->val( "server", "ip"); +my $server_check = (defined($server_check_cfg))?$server_check_cfg->val( "server", "ip"):undef; if( defined $server_check ) { unshift(@servers, $server_address); my $servers_string = join(", ", @servers); @@ -1291,8 +1314,12 @@ POSIX::mkfifo("$gosa_si_client_fifo", "0600"); POE::Session->create( inline_states => { _start => \&_start, + _default => \&_default, register_at_gosa_si_server => \®ister_at_gosa_si_server, + + # trigger periodical tasks trigger_new_key => \&trigger_new_key, + trigger_logged_in_users_report => \&trigger_logged_in_users_report, # handle records from each defined file differently fifo_record => \&fifo_got_record,