diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client
index 9c7e09e2f793d9df08149138d7b8ef61140956c6..cf352ac42c86df9398af9bbd960aa18c2cfed2e2 100755 (executable)
--- a/gosa-si/gosa-si-client
+++ b/gosa-si/gosa-si-client
# REVISION: ---
#===============================================================================
+my $client_version = '$HeadURL$:$Rev$';
+
use strict;
use warnings;
use Getopt::Long;
use XML::Simple;
use File::Basename;
use File::Spec;
+use Fcntl;
# 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 (%cfg_defaults, $foreground, $verbose, $pid_file, $procid, $pid, $log_file, $fai_logpath);
my ($server_ip, $server_port, $server_timeout, $server_domain, $server_key_lifetime);
my ($client_port, $ldap_enabled, $ldap_config, $pam_config, $nss_config);
+my ($root_uid, $adm_gid);
my $xml;
my $event_hash;
my $default_server_key;
if(not defined $msg) { return }
if(not defined $level) { $level = 1 }
if(defined $log_file){
- open(LOG_HANDLE, ">>$log_file");
- if(not defined open( LOG_HANDLE, ">>$log_file" )) {
- print STDERR "cannot open $log_file: $!";
- return
- }
+ my $open_log_fh = sysopen(LOG_HANDLE, $log_file, O_WRONLY | O_CREAT | O_APPEND , 0440);
+ if(not $open_log_fh) {
+ print STDERR "cannot open $log_file: $!";
+ return;
+ }
+ # check owner and group of log_file and update settings if necessary
+ my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat($log_file);
+ if((not $uid eq $root_uid) || (not $gid eq $adm_gid)) {
+ chown($root_uid, $adm_gid, $log_file);
+ }
+
chomp($msg);
if($level <= $verbose){
my ($seconds, $minutes, $hours, $monthday, $month,
if( $msg_header ) { $msg_header = "'$msg_header'-"; }
else { $msg_header = ""; }
+ # Memorize own source address
+ $msg =~ /<source>(\S+)<\/source>/;
+ my $own_source_address = $1;
+
# encrypt xml msg
my $crypted_msg = &encrypt_msg($msg, $encrypt_key);
# 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);
}
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 = <FILE> ;
+ 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);
$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);
-
+# Determine root uid and adm gid, used for creating log files
+$root_uid = getpwnam('root');
+$adm_gid = getgrnam('adm');
+if(not defined $adm_gid){
+ $adm_gid = getgrnam('root');
+}
daemon_log(" ", 1);
daemon_log("$prg started!", 1);
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;
}
}
if (0 == @tmp_servers) {
- my $log_string = "no gosa-si-server found!";
- $log_string .= "\n\tdetermined domains out of /etc/resolv.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, $$;
}
}
}
- 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);
}