diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client
index fce41df0a418b5b489976384bb8ce583c5c4f6ac..7f721da2f1a6675ce2fded8e859549b6b3a91bfe 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 POE qw(Component::Server::TCP Wheel::FollowTail Wheel::Run);
use IO::Socket::INET;
use NetAddr::IP;
-use Data::Dumper;
use Crypt::Rijndael;
use GOSA::GosaSupportDaemon;
use Digest::MD5 qw(md5_hex md5 md5_base64);
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;
my @servers;
my $gotoHardwareChecksum;
-my $gosa_si_client_fifo;
-my %files_to_watch;
+my $system_com;
$verbose= 1;
# globalise variables which are used in imported events
our $client_dnsname;
our $client_force_hostname;
our $server_key;
+our $terminal_server_hash;
# default variables
our $REGISTERED = 0;
# path to fifo for non-gosa-si-client messages to gosa-si-server
-$gosa_si_client_fifo = "/var/run/gosa-si-client.socket";
-%files_to_watch = (fifo => $gosa_si_client_fifo);
+my $fai_com_fifo = "/var/run/gosa-si-client.socket";
+my $system_com_fifo = "/var/run/gosa-si-client-system-com.socket";
+my %files_to_watch = (fai_fifo => $fai_com_fifo, system_fifo => $system_com_fifo);
# 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
"nss-config" => [\$nss_config, "/etc/libnss-ldap.conf"],
"fai-logpath" => [\$fai_logpath, "/var/log/fai/fai.log"],
"force-hostname" => [\$client_force_hostname, "false"],
+ "system-com" => [\$system_com, "disabled"],
},
"server" => {
"ip" => [\$server_ip, "127.0.0.1"],
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,
my $server_ip= shift;
my $result= "00:00:00:00:00:00";
+ if($server_ip =~ /^[a-z][a-z0-9\.]+/i) {
+ my $ip_address = inet_ntoa(scalar gethostbyname($server_ip));
+ if(defined($ip_address) && $ip_address =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {
+ # Write ip address to $server_ip variable
+ $server_ip = $ip_address;
+ }
+ }
+
if($server_ip =~ /^(\d\d?\d?\.){3}\d\d?\d?$/) {
my $PROC_NET_ROUTE= ('/proc/net/route');
# opensocket
my $socket = &open_socket($address);
if( !$socket ) {
- daemon_log("WARNING: cannot send ".$msg_header."msg to $address , host not reachable", 3);
+ daemon_log("WARNING: cannot send ".$msg_header."msg to '$address', host not reachable", 3);
if ($REGISTERED == 1) {
$REGISTERED = 0; # if server is not available, cause reregistering
daemon_log("INFO: cause reregistering at gosa-si-server", 5);
}
}
+sub trigger_set_terminal_server
+{
+ # Function is defined in load_reporter.pm
+ if (exists $event_hash->{set_terminal_server})
+ {
+ no strict 'refs';
+ &{$event_hash->{set_terminal_server}."::set_terminal_server"};
+ }
+ else
+ {
+ &daemon_log("0 ERROR: load_reporter.pm needs function set_terminal_server to write terminal server load information to client. Processing aborted!", 1);
+ }
+ return;
+}
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);
+ my @goto_files = grep { /.+\.goto_notify$/ && -f "$goto_dir/$_" } readdir(DIR);
closedir DIR;
# Check if file has 'seen' tag
}
-sub fifo_got_record {
+sub fai_fifo_got_record {
my $file_record = $_[ARG0];
my $header;
my $content = "";
}
+sub system_fifo_got_record {
+ my ($kernel, $socket_com_record) = @_[KERNEL, ARG0];
+ $socket_com_record =~ /^(\S+)\s?([\s\S]*)$/;
+ my $function = $1;
+ my $content = $2;
+
+ if( exists $event_hash->{$function} )
+ {
+ # a event exists with the header as name
+ daemon_log("INFO: found event '$function' at event-module '".$event_hash->{$function}."'", 5);
+ no strict 'refs';
+ my $answer = &{$event_hash->{$function}."::$function"}($content, $kernel);
+ &post_processing_and_sending($answer)
+ }
+ else
+ {
+ daemon_log("ERROR: Got input '$socket_com_record' from socket '$system_com_fifo'", 1);
+ daemon_log("ERROR: No event '$function' found in event modules under '$event_dir'.", 1);
+ }
+
+# # Sanity check of fifo record
+#
+# # Create record message
+# my $lr_msg_hash = &create_xml_hash("load_report", $client_address, $server_address, $file_record);
+# &add_content2xml_hash($lr_msg_hash, "macaddress", $client_mac_address);
+# my $utc_ts = &main::get_utc_time();
+# &add_content2xml_hash($lr_msg_hash, "timestamp", $utc_ts);
+# my $lr_msg = &create_xml_string($lr_msg_hash);
+#
+# # Report message to si-server
+# &send_msg_to_target($lr_msg, $server_address, $server_key, "load_report");
+
+ return;
+}
+
+
sub save_fai_log {
my ($fai_log_dir) = @_ ;
my $FAI_DIR;
my $watcher = POE::Wheel::FollowTail->new(
Filename => $file,
InputEvent => $name."_record",
- # ResetEvent => "file_reset",
ErrorEvent => "file_error",
);
-# $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;
}
my $error = 0;
my $answer;
-
daemon_log("INFO: Incoming msg from '$remote_ip'", 5);
daemon_log("DEBUG: Incoming msg:\n$input\n", 9);
- my ($msg, $msg_hash) = &check_key_and_xml_validity($input, $server_key);
+ # Cut of ip and port from msgs tail
+ my ($encrypted_msg, $msg_source) = split(/;/, $input);
+
+ my ($msg, $msg_hash) = &check_key_and_xml_validity($encrypted_msg, $server_key);
if( (!$msg) || (!$msg_hash) ) {
daemon_log("WARNING: Deciphering of incoming msg failed", 3);
if($server_address =~ /$remote_ip/) {
# if client is alread in a registration process, that means not registered, do nothing
# if not, cause re-registration
+# TODO : This if-else can cause a registration deadlock. Currently I can not reproduce the deadlock and don't have a clue what is the reason for the deadlock
if (not $REGISTERED) {
&daemon_log("WARNING: gosa-si-client is already in a registration process so ignore this message", 3);
} else {
########
# answer
- if( $answer ) {
-
- #check gosa-si envelope validity
- my $answer_hash = &check_outgoing_xml_validity($answer);
-
- if( $answer_hash ) {
- # answer is valid
-
- # preprocessing
- if( $answer =~ "<header>registered</header>") {
- # set registered flag to true to stop sending further registered msgs
- $REGISTERED = 1;
- }
- else {
- $answer =~ /<header>(\S+)<\/header>/;
- &send_msg_to_target($answer, $server_address, $server_key, $1);
- }
+ &post_processing_and_sending($answer);
- # postprocessing
- if( $answer =~ "<header>new_key</header>") {
- # set new key to global variable
- $answer =~ /<new_key>(\S*?)<\/new_key>/;
- my $new_key = $1;
- $server_key = $new_key;
- }
- }
+ return;
+}
- }
+sub post_processing_and_sending
+{
+ my ($answer) = @_ ;
- return;
+ # Do nothing if answer does not exists
+ if (not defined $answer) { return; }
+
+ # Check gosa-si envelope validity
+ my $answer_hash = &check_outgoing_xml_validity($answer);
+
+ if( $answer_hash )
+ {
+ # Answer is valid
+ # Pre-sending
+ if( $answer =~ "<header>registered</header>")
+ {
+ # Set registered flag to true to stop sending further registered msgs
+ $REGISTERED = 1;
+ }
+ else
+ {
+ $answer =~ /<header>(\S+)<\/header>/;
+ &send_msg_to_target($answer, $server_address, $server_key, $1);
+ }
+
+ # Post-sending
+ if( $answer =~ "<header>new_key</header>")
+ {
+ # Set new key to global variable
+ $answer =~ /<new_key>(\S*?)<\/new_key>/;
+ my $new_key = $1;
+ $server_key = $new_key;
+ }
+ }
+
+ return;
}
$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);
$xml = new XML::Simple();
$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 = (defined($server_check_cfg))?$server_check_cfg->val( "server", "ip"):undef;
}
-# open fifo for non-gosa-si-client-msgs to gosa-si-server
-POSIX::mkfifo("$gosa_si_client_fifo", "0600");
+# Open a new fifo for FAI messages to gosa-si-server
+if (-p $fai_com_fifo) { unlink $fai_com_fifo }
+POSIX::mkfifo("$fai_com_fifo", "0600");
+# Open a new fifo for system communication,
+if (-p $system_com_fifo) { unlink $system_com_fifo }
+if ($system_com eq "enabled")
+{
+ POSIX::mkfifo("$system_com_fifo", "0600");
+}
POE::Session->create(
inline_states => {
trigger_new_key => \&trigger_new_key,
trigger_logged_in_users_report => \&trigger_logged_in_users_report,
trigger_seen_messages => \&trigger_seen_messages,
+
+ # trigger non periodical tasks
+ trigger_set_terminal_server => \&trigger_set_terminal_server,
# handle records from each defined file differently
- fifo_record => \&fifo_got_record,
+ fai_fifo_record => \&fai_fifo_got_record,
+ system_fifo_record => \&system_fifo_got_record,
# handle file resets and errors the same way for each file
file_reset => \&generic_file_reset,