Code

Migrated to get_cfg_value
[gosa.git] / gosa-si / gosa-si-client
index df75a81e132eb39d4bac2be1406c9428cf0a1f02..c3608750a3458e474bd86618ef628b7a7bdce57b 100755 (executable)
@@ -34,7 +34,6 @@ use GOSA::GosaSupportDaemon;
 use Digest::MD5  qw(md5_hex md5 md5_base64);
 use MIME::Base64;
 use XML::Simple;
-#use Net::DNS;    # no longer used because function moved to GosaSupportDaemon.pm : rettenbe : 16.05.2008
 use File::Basename;
 use File::Spec;
 
@@ -100,13 +99,13 @@ my $fai_log_dir = "/tmp/fai";
     {"port"        => [\$client_port, "20083"],
      "ip"          => [\$client_ip, "0.0.0.0"],
      "mac-address" => [\$client_mac_address, "00:00:00:00:00:00"],
-     "server-domain"       => [\$server_domain, ""],
+     "server-domain"      => [\$server_domain, ""],
      "ldap"               => [\$ldap_enabled, 1],
      "ldap-config"        => [\$ldap_config, "/etc/ldap/ldap.conf"],
      "pam-config"         => [\$pam_config, "/etc/pam_ldap.conf"],
      "nss-config"         => [\$nss_config, "/etc/libnss-ldap.conf"],
-     "fai-logpath"         => [\$fai_logpath, "/var/log/fai/fai.log"],
-        "force-hostname"               => [\$client_force_hostname, "false"],
+     "fai-logpath"        => [\$fai_logpath, "/var/log/fai/fai.log"],
+     "force-hostname"    => [\$client_force_hostname, "false"],
     },
 "server" => {
     "ip"          => [\$server_ip, "127.0.0.1"],
@@ -274,37 +273,6 @@ sub daemon_log {
 }
 
 
-#===  FUNCTION  ================================================================
-#         NAME:  get_interfaces 
-#   PARAMETERS:  none
-#      RETURNS:  (list of interfaces) 
-#  DESCRIPTION:  Uses proc fs (/proc/net/dev) to get list of interfaces.
-#===============================================================================
-sub get_interfaces {
-    my @result;
-    my $PROC_NET_DEV= ('/proc/net/dev');
-
-    open(PROC_NET_DEV, "<$PROC_NET_DEV")
-        or die "Could not open $PROC_NET_DEV";
-
-    my @ifs = <PROC_NET_DEV>;
-
-    close(PROC_NET_DEV);
-
-    # Eat first two line
-    shift @ifs;
-    shift @ifs;
-
-    chomp @ifs;
-    foreach my $line(@ifs) {
-        my $if= (split /:/, $line)[0];
-        $if =~ s/^\s+//;
-        push @result, $if;
-    }
-
-    return @result;
-}
-
 #===  FUNCTION  ================================================================
 #         NAME:  get_mac 
 #   PARAMETERS:  interface name (i.e. eth0)
@@ -352,61 +320,6 @@ sub get_mac {
 }
 
 
-#===  FUNCTION  ================================================================
-#         NAME:  get_interface_for_ip
-#   PARAMETERS:  ip address (i.e. 192.168.0.1)
-#      RETURNS:  array: list of interfaces if ip=0.0.0.0, matching interface if found, undef else
-#  DESCRIPTION:  Uses proc fs (/proc/net/dev) to get list of interfaces.
-#===============================================================================
-sub get_interface_for_ip {
-    my $result;
-    my $ip= shift;
-    if ($ip && length($ip) > 0) {
-        my @ifs= &get_interfaces();
-        if($ip eq "0.0.0.0") {
-            $result = "all";
-        } else {
-            foreach (@ifs) {
-                my $if=$_;
-                if(get_ip($if) eq $ip) {
-                    $result = $if;
-                    last;
-                }
-            }       
-        }
-    }       
-    return $result;
-}
-
-
-#===  FUNCTION  ================================================================
-#         NAME:  get_ip 
-#   PARAMETERS:  interface name (i.e. eth0)
-#      RETURNS:  (ip address) 
-#  DESCRIPTION:  Uses ioctl to get ip address directly from system.
-#===============================================================================
-sub get_ip {
-    my $ifreq= shift;
-    my $result= "";
-    my $SIOCGIFADDR= 0x8915;       # man 2 ioctl_list
-        my $proto= getprotobyname('ip');
-
-    socket SOCKET, PF_INET, SOCK_DGRAM, $proto
-        or die "socket: $!";
-
-    if(ioctl SOCKET, $SIOCGIFADDR, $ifreq) {
-        my ($if, $sin)    = unpack 'a16 a16', $ifreq;
-        my ($port, $addr) = sockaddr_in $sin;
-        my $ip            = inet_ntoa $addr;
-
-        if ($ip && length($ip) > 0) {
-            $result = $ip;
-        }
-    }
-
-    return $result;
-}
-
 
 #===  FUNCTION  ================================================================
 #         NAME:  get_local_mac_for_remote_ip
@@ -457,9 +370,11 @@ sub get_local_ip_for_remote_ip {
        my $result="0.0.0.0";
 
        if($server_ip =~ /^(\d\d?\d?\.){3}\d\d?\d?$/) {
-               if($server_ip eq "127.0.0.1") {
-                       $result="127.0.0.1";
-               } else {
+        # 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")
@@ -486,7 +401,7 @@ sub get_local_ip_for_remote_ip {
                                        last;
                                }
                        }
-               }
+               #}
        } else {
                daemon_log("get_local_ip_for_remote_ip was called with a non-ip parameter: $server_ip", 1);
        }
@@ -503,17 +418,6 @@ sub generate_hw_digest {
 }
 
 
-# moved to GosaSupportDaemon: rettenbe, 19.05.2008
-#sub create_passwd {
-#    my $new_passwd = "";
-#    for(my $i=0; $i<31; $i++) {
-#        $new_passwd .= ("a".."z","A".."Z",0..9)[int(rand(62))]
-#    }
-#
-#    return $new_passwd;
-#}
-
-
 sub create_ciphering {
     my ($passwd) = @_;
        if((!defined($passwd)) || length($passwd)==0) {
@@ -555,45 +459,6 @@ sub decrypt_msg {
 }
 
 
-# moved to GosaSupportDaemon: rettenbe: 16.05.2008
-#sub get_server_addresses {
-#    my $domain= shift;
-#    my @result;
-# 
-#    my $error = 0;
-#    my $res   = Net::DNS::Resolver->new;
-#    my $query = $res->send("_gosa-si._tcp.".$domain, "SRV");
-#    my @hits;
-#
-#    if ($query) {
-#        foreach my $rr ($query->answer) {
-#            push(@hits, $rr->target.":".$rr->port);
-#        }
-#    }
-#    else {
-#        #warn "query failed: ", $res->errorstring, "\n";
-#        $error++;
-#    }
-#
-#    if( $error == 0 ) {
-#        foreach my $hit (@hits) {
-#            my ($hit_name, $hit_port) = split(/:/, $hit);
-#                      chomp($hit_name);
-#                      chomp($hit_port);
-#
-#            my $address_query = $res->send($hit_name);
-#            if( 1 == length($address_query->answer) ) {
-#                foreach my $rr ($address_query->answer) {
-#                    push(@result, $rr->address.":".$hit_port);
-#                }
-#            }
-#        }
-#    }
-#
-#    return @result;
-#}
-
-
 #===  FUNCTION  ================================================================
 #         NAME:  send_msg_hash_to_target
 #   PARAMETERS:  msg_hash - hash - xml_hash created with function create_xml_hash
@@ -745,8 +610,12 @@ sub register_at_gosa_si_server {
                my $ip= &get_local_ip_for_remote_ip(sprintf("%s", $server =~ /^([0-9\.]*?):.*$/));
                my $dnsname= gethostbyaddr(inet_aton($ip), AF_INET);
                if(!defined($dnsname)) {
-                       &write_to_file("goto-error-dns:$ip", $fai_logpath);
-                       exit(1);
+                       if( defined($client_force_hostname) && $client_force_hostname eq "true") {
+                               $dnsname = `hostname`;
+                       } else {
+                               &write_to_file("goto-error-dns:$ip", $fai_logpath);
+                               exit(1);
+                       }
                }
 
                # create registration msg
@@ -930,38 +799,6 @@ sub check_outgoing_xml_validity {
 }
 
 
-#sub import_events {
-#
-#    if (not -e $event_dir) {
-#        daemon_log("ERROR: cannot find directory or directory is not readable: $event_dir", 1);   
-#    }
-#    opendir (DIR, $event_dir) or die "ERROR while loading gosa-si-events from directory $event_dir : $!\n";
-#
-#    while (defined (my $event = readdir (DIR))) {
-#        if( $event eq "." || $event eq ".." ) { next; }    
-#        daemon_log("INFO: found event module: $event", 5); 
-#        eval{ require $event; };
-#        if( $@ ) {
-#            daemon_log("ERROR: import of event module '$event' failed", 1);
-#            daemon_log("$@", 1);
-#            next;
-#        }
-#
-#        $event =~ /(\S*?).pm$/;
-#        my $event_module = $1;
-#        my $events_l = eval( $1."::get_events()") ;
-#        foreach my $event_name (@{$events_l}) {
-#            $event_hash->{$event_name} = $event_module;
-#        }
-#
-#    }
-#
-#    my @all_events = keys %$event_hash;
-#    my $all_events_string = join(", ", @all_events);
-#    
-#    daemon_log("INFO: imported events: $all_events_string", 5);
-#}
-
 sub trigger_new_key {
     my ($kernel) = $_[KERNEL] ;   
 
@@ -1077,11 +914,21 @@ sub save_fai_log {
 }
 
 
+sub sig_handler {
+       my ($kernel, $signal) = @_[KERNEL, ARG0] ;
+       daemon_log("0 INFO got signal '$signal'", 1); 
+       $kernel->sig_handled();
+       return;
+}
+
+
 sub _start {
     my ($kernel, $heap) = @_[KERNEL, HEAP];
     $kernel->alias_set('client_session');
     $global_kernel = $kernel;       # this is used to throw events at each point of the skript
-    
+    $kernel->sig(USR1 => "sig_handler");
+
     # force a registration at a gosa-si-server
     $kernel->yield('register_at_gosa_si_server');
     
@@ -1267,13 +1114,12 @@ 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;
-if ($error == 0) {
-    foreach my $log_line (@$result) {
-        daemon_log("DEBUG: $log_line", 7);
-    }
-} else {
-    foreach my $log_line (@$result) {
-        daemon_log("ERROR: $log_line", 1);
+
+foreach my $log_line (@$result) {
+    if ($log_line =~ / succeed: /) {
+        &main::daemon_log("0 DEBUG: $log_line", 7);
+    } else {
+        &main::daemon_log("0 ERROR: $log_line", 1);
     }
 }
 
@@ -1294,10 +1140,6 @@ daemon_log("INFO: start socket for incoming xml messages at port '$client_port'
 
 # prepare variables
 if( inet_aton($server_ip) ){ $server_ip = inet_ntoa(inet_aton($server_ip)); }
-############################################################
-# to change
-#if( $server_ip eq "127.0.1.1" ) { $server_ip = "127.0.0.1" } 
-############################################################
 if (defined $server_ip && defined $server_port) {
     $server_address = $server_ip.":".$server_port;
 }
@@ -1354,6 +1196,7 @@ POE::Session->create(
        inline_states => {
                _start => \&_start, 
         _default => \&_default,
+        sig_handler => \&sig_handler,
         register_at_gosa_si_server => \&register_at_gosa_si_server,
 
         # trigger periodical tasks