X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fgosa-si-client;h=94b7c66f1cdad922a9a26c0df970debf0206259d;hb=5a77c3940d39ad8dc24c34cc5cef77c8df0e9aec;hp=5a1bc3fe1aa95016ac758f762241edeac2be1211;hpb=969463c04805d5fd2de0f5b7c0d4c2f5158144d1;p=gosa.git diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client index 5a1bc3fe1..94b7c66f1 100755 --- a/gosa-si/gosa-si-client +++ b/gosa-si/gosa-si-client @@ -18,6 +18,8 @@ # REVISION: --- #=============================================================================== +my $client_version = '$HeadURL$:$Rev$'; + use strict; use warnings; use Getopt::Long; @@ -40,7 +42,6 @@ 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; @@ -83,9 +84,12 @@ $gosa_si_client_fifo = "/var/run/gosa-si-client.socket"; my $delay_set_time = 10; our $prg= basename($0); -# all x seconds the client reports logged_in users to gosa-si-server +# all n seconds the client reports logged_in users to gosa-si-server my $trigger_logged_in_users_report_delay = 600; +# all n seconds the client reports messages seen by user +my $trigger_seen_messages_delay = 30; + # directory where all log files from installation are stored my $fai_log_dir = "/var/log/fai"; @@ -231,7 +235,6 @@ sub daemon_log { 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 @@ -351,49 +354,6 @@ sub get_local_mac_for_remote_ip { return $result; } -sub get_local_ip_for_remote_ip { - my $server_ip= shift; - my $result="0.0.0.0"; - - if($server_ip =~ /^(\d\d?\d?\.){3}\d\d?\d?$/) { - # client should always have a 'valid' ip-address, which is available from other hosts too, - # 127.0.0.1 says nothing to foreign host - #if($server_ip eq "127.0.0.1") { - # $result="127.0.0.1"; - #} else { - my $PROC_NET_ROUTE= ('/proc/net/route'); - - open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE") - or die "Could not open $PROC_NET_ROUTE"; - - my @ifs = ; - - close(PROC_NET_ROUTE); - - # Eat header line - shift @ifs; - chomp @ifs; - foreach my $line(@ifs) { - my ($Iface,$Destination,$Gateway,$Flags,$RefCnt,$Use,$Metric,$Mask,$MTU,$Window,$IRTT)=split(/\s/, $line); - my $destination; - my $mask; - my ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Destination); - $destination= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d)); - ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Mask); - $mask= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d)); - if(new NetAddr::IP($server_ip)->within(new NetAddr::IP($destination, $mask))) { - # destination matches route, save mac and exit - $result= &get_ip($Iface); - last; - } - } - #} - } else { - daemon_log("get_local_ip_for_remote_ip was called with a non-ip parameter: $server_ip", 1); - } - return $result; -} - sub generate_hw_digest { my $hw_data; @@ -470,6 +430,10 @@ sub send_msg_to_target { if( $msg_header ) { $msg_header = "'$msg_header'-"; } else { $msg_header = ""; } + # Memorize own source address + $msg =~ /(\S+)<\/source>/; + my $own_source_address = $1; + # encrypt xml msg my $crypted_msg = &encrypt_msg($msg, $encrypt_key); @@ -488,7 +452,7 @@ sub send_msg_to_target { # send xml msg if( $error == 0 ) { - print $socket $crypted_msg."\n"; + print $socket $crypted_msg.";$own_source_address\n"; daemon_log("INFO: send ".$msg_header."msg to $address", 5); daemon_log("DEBUG: message:\n$msg", 9); } @@ -595,14 +559,15 @@ sub register_at_gosa_si_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)) { - if( defined($client_force_hostname) && $client_force_hostname eq "true") { - $dnsname = `hostname`; - } else { - &write_to_file("goto-error-dns:$ip", $fai_logpath); - exit(1); - } - } + if(!defined($dnsname)) { + if( defined($client_force_hostname) && $client_force_hostname eq "true") { + $dnsname = `hostname`; + } else { + &write_to_file("goto-error-dns:$ip", $fai_logpath); + &main::daemon_log("ERROR: ip is not resolvable, no registration possible. Write 'goto-error-dns:$ip' to $fai_logpath", 1); + exit(1); + } + } # create registration msg my $local_ip = &get_local_ip_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/)); @@ -816,6 +781,68 @@ sub trigger_logged_in_users_report { } +sub trigger_seen_messages { + my ($kernel) = $_[KERNEL] ; + + # Select all files under /tmp with prefix 'goto_notify' + my $goto_dir = "/tmp"; + opendir(DIR, $goto_dir); + my @goto_files = grep { /^goto_notify_/ && -f "$goto_dir/$_" } readdir(DIR); + closedir DIR; + + # Check if file has 'seen' tag + foreach my $goto_file (@goto_files) { + open(FILE, "$goto_dir/$goto_file"); + my @lines = ; + close FILE; + + my $source; + my $target; + my $usr; + my $subject; + my $message; + my $seen = 0; + chomp(@lines); + foreach my $line (@lines) { + if ($line =~ /^source:([\S\s]*)$/) { + $source = $1 + } + if ($line =~ /^target:([\S\s]*)$/) { + $target = $1; + } + if ($line =~ /^usr:([\S\s]*)$/) { + $usr = $1; + } + if ($line =~ /^subject:([\S\s]*)$/) { + $subject = $1; + } + if ($line =~ /^message:([\S\s]*)$/) { + $message = $1; + } + if ($line =~ /^seen$/) { + $seen++; + } + } + + # Send 'confirm_usr_msg' back to msg-hosting server + if ($seen) { + my %data = ('usr'=>$usr, 'subject'=>$subject, 'message'=>$message); + my $confirm_msg = &build_msg("confirm_usr_msg", $target, $source, \%data); + my $send_error = &send_msg_to_target($confirm_msg, $server_address, $server_key); + + # Delete file + if (not $send_error) { + system("rm $goto_dir/$goto_file"); + } + } + } + + $kernel->delay_set('trigger_seen_messages', $trigger_seen_messages_delay); + + return; +} + + sub generic_file_error { my ( $heap, $operation, $errno, $error_string, $wheel_id ) = @_[ HEAP, ARG0, ARG1, ARG2, ARG3 ]; @@ -849,6 +876,8 @@ 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 $utc_ts = &main::get_utc_time(); + &add_content2xml_hash($clmsg_hash, "timestamp", $utc_ts); my $clmsg = &create_xml_string($clmsg_hash); &send_msg_to_target($clmsg, $server_address, $server_key, "CLMSG_$header"); @@ -865,30 +894,40 @@ 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; + # Directory for log files after a softupdate + my $log_dir = File::Spec->catdir($fai_log_dir, "localhost/last"); + + if (not -d $log_dir) { + # Directory for log files after a new installation + $log_dir = "/tmp/fai"; + if (not -d $log_dir) { + daemon_log("ERROR: cannot open directory $log_dir", 1); + return; + } } + opendir($FAI_DIR, "$log_dir"); my @log_files = readdir($FAI_DIR); closedir($FAI_DIR); - my @log_list; + 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); + $log_file = File::Spec->catfile( $log_dir, $log_file ); + + if (not -f $log_file) { + daemon_log("ERROR: cannot read $log_file", 1); next; } - my @lines = <$FILE>; + + open(FILE, "<$log_file"); + my @lines = ; + close (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); @@ -934,6 +973,7 @@ sub _start { $heap->{watchers}->{ $watcher->ID } = $watcher; } $kernel->yield('trigger_logged_in_users_report'); + $kernel->yield('trigger_seen_messages'); } @@ -1081,6 +1121,13 @@ if ($client_headURL =~ /\/tag\// || $client_status = "developmental" ; } +# Prepare log file +my $root_uid = getpwnam('root'); +my $adm_gid = getgrnam('adm'); +chmod(0640, $log_file); +chown($root_uid, $adm_gid, $log_file); + + daemon_log(" ", 1); daemon_log("$prg started!", 1); daemon_log("INFO: status: $client_status", 1); @@ -1099,7 +1146,11 @@ daemon_log("INFO: gosa-si-client mac address detected: $client_mac_address", 1); # import events my ($error, $result, $tmp_hash) = &import_events($event_dir); -$event_hash = $tmp_hash; +while (my ($module, $mod_event_hash) = each %$tmp_hash) { + while (my ($event_name, $nothing) = each %$mod_event_hash) { + $event_hash->{$event_name} = $module; + } +} foreach my $log_line (@$result) { if ($log_line =~ / succeed: /) { @@ -1144,12 +1195,12 @@ if( defined $server_check ) { my @tmp_servers; if ( !$server_domain) { # Try our DNS Searchlist - my @domain_list = &get_dns_domains(); - my $tmp_domains; - my $error_string; + my @domain_list = &get_dns_domains(); + my $tmp_domains; + my $error_string; for my $domain (@domain_list) { chomp($domain); - ($tmp_domains, $error_string) = &get_server_addresses($domain); + ($tmp_domains, $error_string) = &get_server_addresses($domain); if(@$tmp_domains) { for my $tmp_server(@$tmp_domains) { push @tmp_servers, $tmp_server; @@ -1157,11 +1208,11 @@ if( defined $server_check ) { } } if (0 == @tmp_servers) { - my $log_string = "no gosa-si-server found!"; - $log_string .= "\n\tdetermined domains out of /etc/resolf.conf: ".join(", ", @domain_list); - $log_string .= "\n\tdetermined server addresses in domains: ".join(", ",@$tmp_domains); - daemon_log("ERROR: $log_string", 1); - daemon_log("ERROR: $error_string", 1); + my $log_string = "no gosa-si-server found!"; + $log_string .= "\n\tdetermined domains out of /etc/resolv.conf: ".join(", ", @domain_list) if (@domain_list); + $log_string .= "\n\tdetermined server addresses in domains: ".join(", ",@$tmp_domains) if (defined($tmp_domains)); + daemon_log("ERROR: $log_string", 1) if (defined($log_string)); + daemon_log("ERROR: $error_string", 1) if (defined($error_string)); daemon_log("ERROR: please specify a gosa-si-server address or a domain in config file", 1); kill 2, $$; } @@ -1174,11 +1225,11 @@ if( defined $server_check ) { } } - foreach my $server (@tmp_servers) { - unshift(@servers, $server); - } - my $servers_string = join(", ", @servers); - daemon_log("INFO: found servers in DNS: $servers_string", 1); + foreach my $server (@tmp_servers) { + unshift(@servers, $server); + } + my $servers_string = join(", ", @servers); + daemon_log("INFO: found servers in DNS: $servers_string", 1); } @@ -1196,6 +1247,7 @@ POE::Session->create( # trigger periodical tasks trigger_new_key => \&trigger_new_key, trigger_logged_in_users_report => \&trigger_logged_in_users_report, + trigger_seen_messages => \&trigger_seen_messages, # handle records from each defined file differently fifo_record => \&fifo_got_record,