Code

Updated copy & paste template assignments
[gosa.git] / gosa-si / gosa-si-client
index 992dda4c3cbadf1065374365ae6bae7b9d7520ad..5a728fcd3cd3d84c1813f9c229edf4eeb5b5cbf0 100755 (executable)
@@ -18,8 +18,6 @@
 #     REVISION:  ---
 #===============================================================================
 
-my $client_version = '$HeadURL$:$Rev$';
-
 use strict;
 use warnings;
 use Getopt::Long;
@@ -37,11 +35,14 @@ use MIME::Base64;
 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;
@@ -58,6 +59,7 @@ my $default_server_key;
 my @servers;
 my $gotoHardwareChecksum;
 my $system_com;
+my $servers_string;
 $verbose= 1;
 
 # globalise variables which are used in imported events
@@ -72,6 +74,8 @@ our $client_dnsname;
 our $client_force_hostname;
 our $server_key;
 our $terminal_server_hash;
+our $opts_dnslookup;
+
 
 # default variables
 my $REGISTERED = 0;
@@ -115,11 +119,12 @@ my $fai_log_dir = "/var/log/fai";
      "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"],
     },
 
 );
@@ -174,27 +179,27 @@ sub check_cmdline_param () {
 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";
@@ -297,25 +302,12 @@ sub get_mac {
                                $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);
                        }
                }
        }
@@ -346,12 +338,12 @@ sub get_local_mac_for_remote_ip {
        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;
@@ -517,13 +509,13 @@ sub write_to_file {
 
         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;
 }
 
 
@@ -840,9 +832,9 @@ sub trigger_seen_messages {
 
     # 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;
@@ -1006,9 +998,9 @@ sub save_fai_log {
             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); 
@@ -1138,6 +1130,91 @@ sub post_processing_and_sending
        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
@@ -1173,9 +1250,9 @@ if( ! $foreground ) {
 
 # 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 ) 
     };
@@ -1237,7 +1314,6 @@ foreach my $log_line (@$result) {
 $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',
@@ -1246,68 +1322,16 @@ POE::Component::Server::TCP->new(
 );
 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")