diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client
index e8d37fe34225ed12c2b6803742eedfd1cad81fb3..5a728fcd3cd3d84c1813f9c229edf4eeb5b5cbf0 100755 (executable)
--- a/gosa-si/gosa-si-client
+++ b/gosa-si/gosa-si-client
#!/usr/bin/perl
#===============================================================================
#
-# FILE: gosa-server
+# FILE: gosa-si-client
#
# USAGE: 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 Net::ARP;
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 @servers;
my $gotoHardwareChecksum;
my $system_com;
+my $servers_string;
$verbose= 1;
# globalise variables which are used in imported events
our $client_force_hostname;
our $server_key;
our $terminal_server_hash;
+our $opts_dnslookup;
+
# default variables
-our $REGISTERED = 0;
+my $REGISTERED = 0;
# path to fifo for non-gosa-si-client messages to gosa-si-server
my $fai_com_fifo = "/var/run/gosa-si-client.socket";
"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"],
+ "system-com" => [\$system_com, "disabled"],
},
"server" => {
- "ip" => [\$server_ip, "127.0.0.1"],
+ "ip" => [\$servers_string, "127.0.0.1"],
"port" => [\$server_port, "20081"],
"key" => [\$server_key, ""],
"timeout" => [\$server_timeout, 10],
- "key-lifetime" => [\$server_key_lifetime, 600],
+ "key-lifetime" => [\$server_key_lifetime, 600],
+ "dns-lookup" => [\$opts_dnslookup, "true"],
},
);
sub check_pid {
$pid = -1;
# Check, if we are already running
- if( open(LOCK_FILE, "<$pid_file") ) {
- $pid = <LOCK_FILE>;
+ if( open(my $LOCK_FILE, "<","$pid_file") ) {
+ $pid = <$LOCK_FILE>;
if( defined $pid ) {
chomp( $pid );
if( -f "/proc/$pid/stat" ) {
my($stat) = `cat /proc/$pid/stat` =~ m/$pid \((.+)\).*/;
if( $0 eq $stat ) {
- close( LOCK_FILE );
+ close($LOCK_FILE);
exit -1;
}
}
}
- close( LOCK_FILE );
+ close( $LOCK_FILE );
unlink( $pid_file );
}
# create a syslog msg if it is not to possible to open PID file
if (not sysopen(LOCK_FILE, $pid_file, O_WRONLY|O_CREAT|O_EXCL, 0644)) {
my($msg) = "Couldn't obtain lockfile '$pid_file' ";
- if (open(LOCK_FILE, '<', $pid_file)
- && ($pid = <LOCK_FILE>))
+ if (open(my $LOCK_FILE, '<', $pid_file)
+ && ($pid = <$LOCK_FILE>))
{
chomp($pid);
$msg .= "(PID $pid)\n";
$monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday;
$year+=1900;
- my $log_msg = "$month $monthday $hours:$minutes:$seconds $prg $msg\n";
+ # Microseconds since epoch
+ my $microSeconds = sprintf("%.2f", &Time::HiRes::clock_gettime());
+ $microSeconds =~ s/^\d*(.\d\d)$/$1/;
+
+
+ my $log_msg = "$month $monthday $hours:$minutes:$seconds$microSeconds $prg $msg\n";
print LOG_HANDLE $log_msg;
if( $foreground ) {
print STDERR $log_msg;
$result = "00:00:00:00:00:00";
}
} else {
- my $SIOCGIFHWADDR= 0x8927; # man 2 ioctl_list
-
# A configured MAC Address should always override a guessed value
if ($client_mac_address and length($client_mac_address) > 0 and not($client_mac_address eq "00:00:00:00:00:00")) {
$result= $client_mac_address;
}
else {
- socket SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('ip')
- or die "socket: $!";
-
- if(ioctl SOCKET, $SIOCGIFHWADDR, $ifreq) {
- my ($if, $mac)= unpack 'h36 H12', $ifreq;
-
- if (length($mac) > 0) {
- $mac=~ m/^([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$/;
- $mac= sprintf("%s:%s:%s:%s:%s:%s", $1, $2, $3, $4, $5, $6);
- $result = $mac;
- }
- }
+ $result = Net::ARP::get_mac($ifreq);
}
}
}
if($server_ip =~ /^(\d\d?\d?\.){3}\d\d?\d?$/) {
my $PROC_NET_ROUTE= ('/proc/net/route');
- open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE")
+ open(my $PROC_NET_ROUTE, "<","$PROC_NET_ROUTE")
or die "Could not open $PROC_NET_ROUTE";
- my @ifs = <PROC_NET_ROUTE>;
+ my @ifs = <$PROC_NET_ROUTE>;
- close(PROC_NET_ROUTE);
+ close($PROC_NET_ROUTE);
# Eat header line
shift @ifs;
return $error;
}
+sub _setREGISTERED {
+ my $newStatus = shift;
+ &daemon_log("DEBUG: set REGISTERED flag from '$REGISTERED' to '$newStatus'", 7);
+ $REGISTERED = $newStatus;
+ return;
+}
sub send_msg_to_target {
my ($msg, $address, $encrypt_key, $msg_header) = @_ ;
if( !$socket ) {
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
+ &_setREGISTERED(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');
chomp($string);
- if (open(FILE, ">> $file")){
- print FILE $string."\n";
- close(FILE);
+ if (open(my $FILE, ">>", "$file")){
+ print $FILE $string."\n";
+ close($FILE);
}
}
- return;
+ return;
}
# Check if file has 'seen' tag
foreach my $goto_file (@goto_files) {
- open(FILE, "$goto_dir/$goto_file");
- my @lines = <FILE>;
- close FILE;
+ open(my $FILE, "$goto_dir/$goto_file");
+ my @lines = <$FILE>;
+ close($FILE);
my $source;
my $target;
next;
}
- open(FILE, "<$log_file");
- my @lines = <FILE> ;
- close (FILE);
+ open(my $FILE, "<","$log_file");
+ my @lines = <$FILE> ;
+ close ($FILE);
my $log_string = join("", @lines);
$log .= &encode_base64($log_string);
push(@log_list, $log);
if($server_address =~ /$remote_ip/) {
# Got a msg from gosa-si-server which can not be decrypted, the secrete is not up-to-date
# cause a reregistering with a new secrete handshake
- daemon_log("ERROR: Message from gosa-si-server could not be understood, cause reregistering at server", 1);
- daemon_log("INFO: Set status of si-client to unregistered and throw new registering event", 5);
- $REGISTERED = 0;
- $kernel->post('client_session', 'register_at_gosa_si_server');
+ daemon_log("ERROR: Message from gosa-si-server could not be understood, cause reregistering at server", 1);
+ if ($REGISTERED) {
+ daemon_log("INFO: Client has currently status registered so throw new registering event", 5);
+ &_setREGISTERED(0);
+ $kernel->post('client_session', 'register_at_gosa_si_server');
+ } else {
+ daemon_log("INFO: Client is currently within a registration process so wait for the next registration itteration", 5);
+ }
}
$error++;
}
return;
}
+sub find_servers {
+ # add gosa-si-server address from config file at first position of server list
+ my $server_check_cfg = Config::IniFiles->new( -file => $cfg_file );
+
+ # Parse servers string
+ my @conf_servers = split(',', $servers_string);
+
+ # Now search for fallback servers in the configuration
+ foreach my $cur_server (@conf_servers) {
+ # Remove spaces from the IP
+ $cur_server =~ s/\s//g;
+
+ my $ip = $cur_server;
+ if(not $cur_server =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {
+ my $ip_address = inet_ntoa(scalar gethostbyname($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
+ $ip = $ip_address;
+ }
+ }
+
+ my $server_addr = sprintf("%s:%s", $ip, $server_port);
+ if (not grep { $_ eq $server_addr } @servers) {
+ push(@servers, $server_addr);
+ }
+ }
+
+ my $servers_string = join(", ", @servers);
+ daemon_log("INFO: found servers in configuration file: $servers_string", 1);
+
+ # Last but not least search for fallback servers in the DNS
+ if (defined($opts_dnslookup) and $opts_dnslookup eq "true") {
+ my @tmp_servers;
+ if ( !$server_domain) {
+ # Try our DNS Searchlist
+ 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);
+ if(@$tmp_domains) {
+ for my $tmp_server(@$tmp_domains) {
+ push @tmp_servers, $tmp_server;
+ }
+ }
+ }
+
+ if (0 == @tmp_servers) {
+ daemon_log("INFO: No servers found in DNS.", 1);
+ }
+ else {
+ my $servers_string = join(", ", @tmp_servers);
+ daemon_log("INFO: found servers in DNS: $servers_string", 1);
+ }
+ } else {
+ @tmp_servers = &get_server_addresses($server_domain);
+ if( 0 == @tmp_servers ) {
+ daemon_log("INFO: No servers found in DNS for domain '$server_domain'",1);
+ }
+ }
+
+ if ( 0 != @tmp_servers ) {
+ foreach my $server_addr (@tmp_servers) {
+ if (not grep { $_ eq $server_addr } @servers) {
+ push(@servers, $server_addr);
+ }
+ }
+ }
+ }
+
+ if (0 == scalar(@servers)) {
+ daemon_log("ERROR: No servers found in the configuration or DNS.", 1);
+ exit(1);
+ }
+
+ # Define first server as server_ip
+ $server_ip = $servers[0];
+
+ # prepare variables
+ if( inet_aton($server_ip) ){ $server_ip = inet_ntoa(inet_aton($server_ip)); }
+ if (defined $server_ip && defined $server_port) {
+ $server_address = $server_ip.":".$server_port;
+ }
+}
#==== MAIN = main ==============================================================
# parse commandline options
# Do something useful - put our PID into the pid_file
if( 0 != $pid ) {
- open( LOCK_FILE, ">$pid_file" );
- print LOCK_FILE "$pid\n";
- close( LOCK_FILE );
+ open( my $LOCK_FILE, ">", "$pid_file" );
+ print $LOCK_FILE "$pid\n";
+ close( $LOCK_FILE );
if( !$foreground ) {
exit( 0 )
};
$gotoHardwareChecksum= &generate_hw_digest();
daemon_log("INFO: gotoHardwareChecksum detected: $gotoHardwareChecksum", 1);
-
# create socket for incoming xml messages
POE::Component::Server::TCP->new(
Alias => 'gosa-si-client',
);
daemon_log("INFO: start socket for incoming xml messages at port '$client_port' ", 1);
-
-# prepare variables
-if( inet_aton($server_ip) ){ $server_ip = inet_ntoa(inet_aton($server_ip)); }
-if (defined $server_ip && defined $server_port) {
- $server_address = $server_ip.":".$server_port;
-}
$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;
-if( defined $server_check ) {
- unshift(@servers, $server_address);
- my $servers_string = join(", ", @servers);
- daemon_log("INFO: found servers in configuration file: $servers_string", 1);
-} else {
- my @tmp_servers;
- if ( !$server_domain) {
- # Try our DNS Searchlist
- 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);
- 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 in DNS for domain: ".join(", ", @domain_list) if (@domain_list);
- my $log_string2 = "server addresses in domain: ".join(", ",@$tmp_domains) if (defined($tmp_domains));
- daemon_log("ERROR: $log_string", 1) if (defined($log_string));
- daemon_log("ERROR: $log_string2", 1) if (defined($log_string2));
- 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, $$;
- }
- } else {
- @tmp_servers = &get_server_addresses($server_domain);
- if( 0 == @tmp_servers ) {
- daemon_log("ERROR: no gosa-si-server found in DNS for domain '$server_domain'",1);
- 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);
-}
-
-
# 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);
+# Find servers from config and DNS
+&find_servers;
+
# Open a new fifo for system communication,
if (-p $system_com_fifo) { unlink $system_com_fifo }
if ($system_com eq "enabled")