X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fgosa-si-client;h=7330d128d4263c6fee1d3876f6a7651c02675705;hb=c14234ab8007a7112cbf34c1896b7d38fb948e6a;hp=1aae6effd35bd4c9a02a2290b0db763d38dcb8a8;hpb=3f9341f18399991ea1f30c49076e40c5c98cc40e;p=gosa.git diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client index 1aae6effd..7330d128d 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; @@ -41,6 +41,10 @@ use File::Spec; # Workaround: need pure perl to make it work with UTF-8 :-( $XML::Simple::PREFERRED_PARSER= "XML::SAX::PurePerl"; +my $client_version = '$HeadURL$:$Rev$'; +my $client_headURL; +my $client_revision; +my $client_status; my $event_dir = "/usr/lib/gosa-si/client/events"; use lib "/usr/lib/gosa-si/client/events"; @@ -76,7 +80,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 @@ -150,7 +154,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 { @@ -162,7 +166,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 ] ); } } } @@ -221,7 +225,7 @@ sub sig_int_handler { my ($signal) = @_; daemon_log("shutting down gosa-si-client", 1); - system("killall gosa-si-client"); + system("kill `ps -C gosa-si-client -o pid=`"); } $SIG{INT} = \&sig_int_handler; @@ -613,6 +617,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 ) { @@ -706,9 +714,6 @@ sub register_at_gosa_si_server { 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); @@ -724,49 +729,50 @@ sub register_at_gosa_si_server { 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); + # 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, "client_status", $client_status); + &add_content2xml_hash($register_hash, "client_revision", $client_revision); + &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 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; - } + 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 @@ -916,7 +922,7 @@ sub import_events { while (defined (my $event = readdir (DIR))) { if( $event eq "." || $event eq ".." ) { next; } - + daemon_log("INFO: found event module: $event", 5); eval{ require $event; }; if( $@ ) { daemon_log("ERROR: import of event module '$event' failed", 1); @@ -954,36 +960,29 @@ 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); + } + 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); + # 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_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 ) = @@ -1077,15 +1076,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'); } @@ -1114,8 +1117,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++; } @@ -1202,8 +1212,7 @@ if( ! $foreground ) { $pid = fork; setsid or die "Can't start a new session: $!"; umask 0; -} -else { +} else { $pid = $$; } @@ -1217,8 +1226,22 @@ if( 0 != $pid ) { }; } +# parse head url and revision from svn +my $client_status_hash = { 'developmental'=>'revision', 'stable'=>'release'}; +$client_version =~ /^\$HeadURL: (\S+) \$:\$Rev: (\d+) \$$/; +$client_headURL = defined $1 ? $1 : 'unknown' ; +$client_revision = defined $2 ? $2 : 'unknown' ; +if ($client_headURL =~ /\/tag\// || + $client_headURL =~ /\/branches\// ) { + $client_status = "stable"; +} else { + $client_status = "developmental" ; +} + daemon_log(" ", 1); daemon_log("$prg started!", 1); +daemon_log("status: $client_status", 1); +daemon_log($client_status_hash->{$client_status}.": $client_revision", 1); # delete old DBsqlite lock files system('rm -f /tmp/gosa_si_lock*gosa-si-client*'); @@ -1264,7 +1287,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);