Code

bugfix gosa-si-server: update of client event module krb5.pm
[gosa.git] / gosa-si / gosa-si-client
index cd639b3ca9aefe1bf2957d5e19698fc12860d1bc..df75a81e132eb39d4bac2be1406c9428cf0a1f02 100755 (executable)
@@ -49,11 +49,11 @@ my $event_dir = "/usr/lib/gosa-si/client/events";
 use lib "/usr/lib/gosa-si/client/events";
 
 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 ($server_ip, $server_port, $server_timeout, $server_domain, $server_key_lifetime);
+my ($client_port, $ldap_enabled, $ldap_config, $pam_config, $nss_config);
 my $xml;
-my $default_server_key;
 my $event_hash;
+my $default_server_key;
 my @servers;
 my $gotoHardwareChecksum;
 my $gosa_si_client_fifo;
@@ -61,6 +61,7 @@ my %files_to_watch;
 $verbose= 1;
 
 # globalise variables which are used in imported events
+our $global_kernel;
 our $cfg_file;
 our $opts_file;
 our $server_address;
@@ -239,33 +240,35 @@ $SIG{INT} = \&sig_int_handler;
 #  DESCRIPTION: 
 #===============================================================================
 sub daemon_log {
-    # log into log_file
+# log into log_file
     my( $msg, $level ) = @_;
     if(not defined $msg) { return }
     if(not defined $level) { $level = 1 }
     if(defined $log_file){
         open(LOG_HANDLE, ">>$log_file");
+        chmod 0600, $log_file;
         if(not defined open( LOG_HANDLE, ">>$log_file" )) {
             print STDERR "cannot open $log_file: $!";
-            return }
-            chomp($msg);
-            if($level <= $verbose){
-                my ($seconds, $minutes, $hours, $monthday, $month,
-                        $year, $weekday, $yearday, $sommertime) = localtime(time);
-                $hours = $hours < 10 ? $hours = "0".$hours : $hours;
-                $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes;
-                $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds;
-                my @monthnames = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
-                $month = $monthnames[$month];
-                $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday;
-                $year+=1900;
-
-                my $log_msg = "$month $monthday $hours:$minutes:$seconds $prg $msg\n";
-                print LOG_HANDLE $log_msg;
-                if( $foreground ) { 
-                    print STDERR $log_msg;
-                }
+            return 
+        }
+        chomp($msg);
+        if($level <= $verbose){
+            my ($seconds, $minutes, $hours, $monthday, $month,
+                    $year, $weekday, $yearday, $sommertime) = localtime(time);
+            $hours = $hours < 10 ? $hours = "0".$hours : $hours;
+            $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes;
+            $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds;
+            my @monthnames = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
+            $month = $monthnames[$month];
+            $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday;
+            $year+=1900;
+
+            my $log_msg = "$month $monthday $hours:$minutes:$seconds $prg $msg\n";
+            print LOG_HANDLE $log_msg;
+            if( $foreground ) { 
+                print STDERR $log_msg;
             }
+        }
         close( LOG_HANDLE );
     }
 }
@@ -619,14 +622,16 @@ 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 ) {
         daemon_log("ERROR: cannot send ".$msg_header."msg to $address , host not reachable", 1);
+        if ($REGISTERED == 1) {
+            $REGISTERED = 0;        # if server is not available, cause reregistering
+            daemon_log("INFO: cause reregistering at gosa-si-server", 5); 
+            $global_kernel->yield('register_at_gosa_si_server');
+
+        }
         $error++;
     }
     
@@ -634,7 +639,7 @@ sub send_msg_to_target {
     if( $error == 0 ) {
         print $socket $crypted_msg."\n";
         daemon_log("INFO: send ".$msg_header."msg to $address", 5);
-        daemon_log("DEBUG: message:\n$msg", 8);
+        daemon_log("DEBUG: message:\n$msg", 9);
     }
 
     # close socket in any case
@@ -687,7 +692,7 @@ sub open_socket {
     if(not defined $socket) {
         return;
     }
-    &daemon_log("open_socket: $PeerAddr", 7);
+    &daemon_log("DEBUG: open_socket: $PeerAddr", 7);
     return $socket;
 }
 
@@ -716,12 +721,25 @@ sub register_at_gosa_si_server {
 
        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 );
+            $try_to_register++;
+
+                       # after one complete round through all server, stop trying to register           
+            if( $try_to_register > @servers )  { last; }
+
+            # fetch first gosa-si-server from @servers
+            # append shifted gosa-si-server at the end of @servers, so looking for servers never stop if
+            # a registration never occured
+            my $server = shift(@servers);
+            push( @servers, $server );
+
+            # Check if our ip is resolvable - if not: don't try to register
+                       if(!(defined($server) && $server =~ m/^[0-9\.]*?:.*$/)) {
+                               &main::daemon_log("ERROR: Server with address '".defined($server)?$server:""."' is invalid!", 1);
+                               if (length(@servers) == 1) {
+                                       &main::daemon_log("ERROR: No valid servers found!", 1);
+                                       exit(1);
+                               }
+                       }
 
                # 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\.]*?):.*$/));
@@ -741,6 +759,7 @@ sub register_at_gosa_si_server {
             &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_content2xml_hash($register_hash, "key_lifetime", $server_key_lifetime);
 
                        # Add $HOSTNAME from ENV if force-hostname is set
                        if( defined($client_force_hostname) && $client_force_hostname eq "true") {
@@ -753,11 +772,9 @@ sub register_at_gosa_si_server {
 
                # 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) {
+                       if($res eq "0") {
                        # reset try_to_register
                                $try_to_register = 0;
 
@@ -770,14 +787,12 @@ sub register_at_gosa_si_server {
 
                        # 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);
@@ -804,7 +819,7 @@ sub check_key_and_xml_validity {
     my $msg_hash;
     eval{
         $msg = &decrypt_msg($crypted_msg, $module_key);
-        &main::daemon_log("decrypted_msg: \n$msg", 8);
+        &main::daemon_log("decrypted_msg: \n$msg", 9);
 
         $msg_hash = $xml->XMLin($msg, ForceArray=>1);
 
@@ -915,37 +930,37 @@ sub check_outgoing_xml_validity {
 }
 
 
-sub import_events {
-
-    if (not -e $event_dir) {
-        daemon_log("ERROR: cannot find directory or directory is not readable: $event_dir", 1);   
-    }
-    opendir (DIR, $event_dir) or die "ERROR while loading gosa-si-events from directory $event_dir : $!\n";
-
-    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);
-            daemon_log("$@", 1);
-            next;
-        }
-
-        $event =~ /(\S*?).pm$/;
-        my $event_module = $1;
-        my $events_l = eval( $1."::get_events()") ;
-        foreach my $event_name (@{$events_l}) {
-            $event_hash->{$event_name} = $event_module;
-        }
-
-    }
-
-    my @all_events = keys %$event_hash;
-    my $all_events_string = join(", ", @all_events);
-    
-    daemon_log("INFO: imported events: $all_events_string", 5);
-}
+#sub import_events {
+#
+#    if (not -e $event_dir) {
+#        daemon_log("ERROR: cannot find directory or directory is not readable: $event_dir", 1);   
+#    }
+#    opendir (DIR, $event_dir) or die "ERROR while loading gosa-si-events from directory $event_dir : $!\n";
+#
+#    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);
+#            daemon_log("$@", 1);
+#            next;
+#        }
+#
+#        $event =~ /(\S*?).pm$/;
+#        my $event_module = $1;
+#        my $events_l = eval( $1."::get_events()") ;
+#        foreach my $event_name (@{$events_l}) {
+#            $event_hash->{$event_name} = $event_module;
+#        }
+#
+#    }
+#
+#    my @all_events = keys %$event_hash;
+#    my $all_events_string = join(", ", @all_events);
+#    
+#    daemon_log("INFO: imported events: $all_events_string", 5);
+#}
 
 sub trigger_new_key {
     my ($kernel) = $_[KERNEL] ;   
@@ -978,14 +993,6 @@ sub trigger_logged_in_users_report {
 }
 
 
-#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 ];
@@ -1073,6 +1080,7 @@ sub save_fai_log {
 sub _start {
     my ($kernel, $heap) = @_[KERNEL, HEAP];
     $kernel->alias_set('client_session');
+    $global_kernel = $kernel;       # this is used to throw events at each point of the skript
     
     # force a registration at a gosa-si-server
     $kernel->yield('register_at_gosa_si_server');
@@ -1110,7 +1118,7 @@ sub server_input {
     
 
     daemon_log("INFO: Incoming msg from '$remote_ip'", 5);
-    daemon_log("DEBUG: Incoming msg:\n$input\n", 8);
+    daemon_log("DEBUG: Incoming msg:\n$input\n", 9);
 
     my ($msg, $msg_hash) = &check_key_and_xml_validity($input, $server_key);
     if( (!$msg) || (!$msg_hash) ) {
@@ -1142,12 +1150,12 @@ sub server_input {
         if( exists $event_hash->{$header} ) {
 
             # a event exists with the header as name
-            daemon_log("DEBUG: found event '$header' at event-module '".$event_hash->{$header}."'", 7);
+            daemon_log("INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5);
             no strict 'refs';
             $answer = &{$event_hash->{$header}."::$header"}($msg, $msg_hash);
         }
         else {
-            daemon_log("WARNING: no event '$header' found in event modules under $event_dir", 1);
+            daemon_log("WARNING: no event '$header' found in event modules under $event_dir", 3);
         }
     }
 
@@ -1242,8 +1250,8 @@ if ($client_headURL =~ /\/tag\// ||
 
 daemon_log(" ", 1);
 daemon_log("$prg started!", 1);
-daemon_log("status: $client_status", 1);
-daemon_log($client_status_hash->{$client_status}.": $client_revision", 1); 
+daemon_log("INFO: status: $client_status", 1);
+daemon_log("INFO: ".$client_status_hash->{$client_status}.": $client_revision", 1); 
 
 # delete old DBsqlite lock files
 system('rm -f /tmp/gosa_si_lock*gosa-si-client*');
@@ -1252,17 +1260,27 @@ system('rm -f /tmp/gosa_si_lock*gosa-si-client*');
 $client_address = $client_ip.":".$client_port;
 my $network_interface= &get_interface_for_ip($client_ip);
 $client_mac_address= &get_mac($network_interface);
-daemon_log("gosa-si-client ip address detected: $client_ip", 1);
-daemon_log("gosa-si-client mac address detected: $client_mac_address", 1);
+daemon_log("INFO: ip address detected: $client_ip", 1);
+daemon_log("INFO: gosa-si-client mac address detected: $client_mac_address", 1);
 
 
 # import events
-&import_events();
+my ($error, $result, $tmp_hash) = &import_events($event_dir);
+$event_hash = $tmp_hash;
+if ($error == 0) {
+    foreach my $log_line (@$result) {
+        daemon_log("DEBUG: $log_line", 7);
+    }
+} else {
+    foreach my $log_line (@$result) {
+        daemon_log("ERROR: $log_line", 1);
+    }
+}
 
 
 # compute hardware checksum
 $gotoHardwareChecksum= &generate_hw_digest();
-daemon_log("gosa-si-client gotoHardwareChecksum detected: $gotoHardwareChecksum", 1);
+daemon_log("INFO: gotoHardwareChecksum detected: $gotoHardwareChecksum", 1);
 
 
 # create socket for incoming xml messages
@@ -1271,7 +1289,7 @@ POE::Component::Server::TCP->new(
        Port => $client_port,
        ClientInput => \&server_input,
 );
-daemon_log("start socket for incoming xml messages at port '$client_port' ", 1);
+daemon_log("INFO: start socket for incoming xml messages at port '$client_port' ", 1);
 
 
 # prepare variables