X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fgosa-si-client;h=4ce9ceb4c57e283a177826393da0ead47a46cdf4;hb=b77bed70172ae336c5a41e3ea3ece03c4e274bc2;hp=fa4b860472eb2f333482970fc1d5fc138ab04b1b;hpb=51c943e6077c03f14ecc8c01c8c05b8d413fe90f;p=gosa.git diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client index fa4b86047..4ce9ceb4c 100755 --- a/gosa-si/gosa-si-client +++ b/gosa-si/gosa-si-client @@ -25,7 +25,7 @@ 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; @@ -76,7 +76,7 @@ $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 @@ -613,6 +613,10 @@ sub send_msg_to_target { # encrypt xml msg my $crypted_msg = &encrypt_msg($msg, $encrypt_key); + # xxxxxxxxxxxxxx + + + # opensocket my $socket = &open_socket($address); if( !$socket ) { @@ -691,91 +695,95 @@ sub open_socket { sub register_at_gosa_si_server { 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'); - if( not $REGISTERED ) { - # 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) { - - 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 $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); - } - } - - # send xml hash to server with general server passwd - my $res = &send_msg_hash_to_target($register_hash, $server, $default_server_key); - if($res == 0) { - # 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; - } else { - $try_to_register++; - - # wait 1 sec until trying to register again - sleep(1); - next; - } - } + # 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); + } + } - 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("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_set('trigger_new_key', $server_key_lifetime); - } + # 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; } + + # if delivery of registration msg succeed + if($res == 0) { + # 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; + + # delivery of registration msg failed + } else { + $try_to_register++; + # wait 1 sec until trying to register again + sleep(1); + next; + } + + } # 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); + } - } else { - $kernel->delay('register_at_gosa_si_server'); } return; } @@ -946,36 +954,43 @@ sub trigger_logged_in_users_report { # just do if client is registered already if( $REGISTERED ) { - my $result = qx(/usr/bin/w -hs); - my @res_lines; - - if( defined $result ) { - chomp($result); - @res_lines = split("\n", $result); - } - - my @logged_in_user_list; - foreach my $line (@res_lines) { - chomp($line); - my @line_parts = split(/\s+/, $line); - push(@logged_in_user_list, $line_parts[0]); - } + my $result = qx(/usr/bin/users); + my @logged_in_user_list; + if( defined $result ) { + chomp($result); + @logged_in_user_list = split(/\s/, $result); + } + +# my @res_lines; +# +# if( defined $result ) { +# chomp($result); +# @res_lines = split("\n", $result); +# } +# +# my @logged_in_user_list; +# foreach my $line (@res_lines) { +# chomp($line); +# my @line_parts = split(/\s+/, $line); +# push(@logged_in_user_list, $line_parts[0]); +# } +# 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 1 sec again - $kernel->delay_set('trigger_logged_in_users_report', 1); + $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_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 ) = @@ -1069,15 +1084,19 @@ 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'); } @@ -1106,8 +1125,15 @@ sub server_input { # 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); - $REGISTERED = 0; - $kernel->post('client_session', 'register_at_gosa_si_server'); + + # 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++; }