Code

Updated to generate autonetwork conf
[gosa.git] / gosa-si / modules / SIPackages.pm
index 6494c4f7d4a7291197da2bbabd434a6eb55ec67b..8f052d07c7db414b6aa2761ecb114d1537f7ae65 100644 (file)
@@ -21,34 +21,34 @@ use Net::DNS;
 BEGIN{}
 END {}
 
-my ($known_clients_file_name);
-my ($server_activ, $server_ip, $server_mac_address, $server_port, $SIPackages_key, $max_clients, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $server_interface);
+my ($server_ip, $server_mac_address, $server_port, $SIPackages_key, $max_clients, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $server_interface);
 my ($bus_activ, $bus_key, $bus_ip, $bus_port);
 my $server;
 my $network_interface;
 my $no_bus;
-my (@ldap_cfg, @pam_cfg, @nss_cfg, $goto_admin, $goto_secret);
-
-
-my %cfg_defaults =
-(
-"server" =>
-    {"server_activ" => [\$server_activ, "on"],
-    "server_ip" => [\$server_ip, "0.0.0.0"],
-    "server_mac_address" => [\$server_mac_address, "00:00:00:00:00"],
-    "server_port" => [\$server_port, "20081"],
-    "SIPackages_key" => [\$SIPackages_key, ""],
-    "max_clients" => [\$max_clients, 100],
-    "ldap_uri" => [\$ldap_uri, ""],
-    "ldap_base" => [\$ldap_base, ""],
-    "ldap_admin_dn" => [\$ldap_admin_dn, ""],
-    "ldap_admin_password" => [\$ldap_admin_password, ""],
+my (@ldap_cfg, @pam_cfg, @nss_cfg, $goto_admin, $goto_secret, $gosa_unit_tag);
+
+
+my %cfg_defaults = (
+"bus" => {
+    "activ" => [\$bus_activ, "on"],
+    "key" => [\$bus_key, ""],
+    "ip" => [\$bus_ip, ""],
+    "port" => [\$bus_port, "20080"],
+    },
+"server" => {
+    "ip" => [\$server_ip, "0.0.0.0"],
+    "mac-address" => [\$server_mac_address, "00:00:00:00:00"],
+    "port" => [\$server_port, "20081"],
+    "ldap-uri" => [\$ldap_uri, ""],
+    "ldap-base" => [\$ldap_base, ""],
+    "ldap-admin-dn" => [\$ldap_admin_dn, ""],
+    "ldap-admin-password" => [\$ldap_admin_password, ""],
+    "max-clients" => [\$max_clients, 100],
+       "gosa-unit-tag" => [\$gosa_unit_tag, ""],
     },
-"bus" =>
-    {"bus_activ" => [\$bus_activ, "on"],
-    "bus_passwd" => [\$bus_key, ""],
-    "bus_ip" => [\$bus_ip, ""],
-    "bus_port" => [\$bus_port, "20080"],
+"SIPackages" => {
+    "key" => [\$SIPackages_key, ""],
     },
 );
 
@@ -57,15 +57,80 @@ my %cfg_defaults =
 # read configfile and import variables
 &read_configfile();
 
-$server_ip = &get_local_ip_for_remote_ip($server_ip);
-
 $network_interface= &get_interface_for_ip($server_ip);
 $server_mac_address= &get_mac($network_interface);
 
-# complete addresses
-if( $server_ip eq "0.0.0.0" ) {
-    $server_ip = "127.0.0.1";
+# Unit tag can be defined in config
+if((not defined($gosa_unit_tag)) || length($gosa_unit_tag) == 0) {
+       # Read gosaUnitTag from LDAP
+       my $tmp_ldap= Net::LDAP->new($ldap_uri);
+       if(defined($tmp_ldap)) {
+               &main::daemon_log("Searching for servers gosaUnitTag with mac address $server_mac_address",6);
+               my $mesg= $tmp_ldap->bind($ldap_admin_dn, password => $ldap_admin_password);
+               # Perform search for Unit Tag
+               $mesg = $tmp_ldap->search(
+                       base   => $ldap_base,
+                       scope  => 'sub',
+                       attrs  => ['gosaUnitTag'],
+                       filter => "(macaddress=$server_mac_address)"
+               );
+
+               if ($mesg->count == 1) {
+                       my $entry= $mesg->entry(0);
+                       my $unit_tag= $entry->get_value("gosaUnitTag");
+                       if(defined($unit_tag) && length($unit_tag) > 0) {
+                               &main::daemon_log("Detected gosaUnitTag $unit_tag for creating entries", 4);
+                               $gosa_unit_tag= $unit_tag;
+                       }
+               } else {
+                       # Perform another search for Unit Tag
+                       my $hostname= `hostname -f`;
+                       &main::daemon_log("Searching for servers gosaUnitTag with hostname $hostname",6);
+                       $mesg = $tmp_ldap->search(
+                               base   => $ldap_base,
+                               scope  => 'sub',
+                               attrs  => ['gosaUnitTag'],
+                               filter => "(&(cn=$hostname)(objectClass=goServer))"
+                       );
+                       if ($mesg->count == 1) {
+                               my $entry= $mesg->entry(0);
+                               my $unit_tag= $entry->get_value("gosaUnitTag");
+                               if(defined($unit_tag) && length($unit_tag) > 0) {
+                                       &main::daemon_log("Detected gosaUnitTag $unit_tag for creating entries", 4);
+                                       $gosa_unit_tag= $unit_tag;
+                               }
+                       } else {
+                               # Perform another search for Unit Tag
+                               $hostname= `hostname -s`;
+                               &main::daemon_log("Searching for servers gosaUnitTag with hostname $hostname",6);
+                               $mesg = $tmp_ldap->search(
+                                       base   => $ldap_base,
+                                       scope  => 'sub',
+                                       attrs  => ['gosaUnitTag'],
+                                       filter => "(&(cn=$hostname)(objectClass=goServer))"
+                               );
+                               if ($mesg->count == 1) {
+                                       my $entry= $mesg->entry(0);
+                                       my $unit_tag= $entry->get_value("gosaUnitTag");
+                                       if(defined($unit_tag) && length($unit_tag) > 0) {
+                                               &main::daemon_log("Detected gosaUnitTag $unit_tag for creating entries", 4);
+                                               $gosa_unit_tag= $unit_tag;
+                                       }
+                               } else {
+                                       &main::daemon_log("Not using gosaUnitTag", 6);
+                               }
+                       }
+               }
+       } else {
+               &main::daemon_log("Using gosaUnitTag from config-file: $gosa_unit_tag",6);
+       }
+       $tmp_ldap->unbind;
 }
+
+# complete addresses
+#if( $server_ip eq "0.0.0.0" ) {
+#    $server_ip = "127.0.0.1";
+#}
 my $server_address = "$server_ip:$server_port";
 $main::server_address = $server_address;
 my $bus_address = "$bus_ip:$bus_port";
@@ -99,15 +164,11 @@ my $res = $main::known_server_db->add_dbentry( {table=>'known_server',
 sub get_module_info {
     my @info = ($server_address,
                 $SIPackages_key,
-                $server,
-                $server_activ,
-                "socket",
                 );
     return \@info;
 }
 
 
-
 sub do_wake {
         my $host    = shift;
         my $ipaddr  = shift || '255.255.255.255';
@@ -300,76 +361,6 @@ sub get_mac {
        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;
-}
-
-
-sub get_local_ip_for_remote_ip {
-       my $server_ip= shift;
-       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 {
-                       my $PROC_NET_ROUTE= ('/proc/net/route');
-
-                       open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE")
-                               or die "Could not open $PROC_NET_ROUTE";
-
-                       my @ifs = <PROC_NET_ROUTE>;
-
-                       close(PROC_NET_ROUTE);
-
-                       # Eat header line
-                       shift @ifs;
-                       chomp @ifs;
-                       foreach my $line(@ifs) {
-                               my ($Iface,$Destination,$Gateway,$Flags,$RefCnt,$Use,$Metric,$Mask,$MTU,$Window,$IRTT)=split(/\s/, $line);
-                               my $destination;
-                               my $mask;
-                               my ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Destination);
-                               $destination= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
-                               ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Mask);
-                               $mask= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
-                               if(new NetAddr::IP($server_ip)->within(new NetAddr::IP($destination, $mask))) {
-                                       # destination matches route, save mac and exit
-                                       $result= &get_ip($Iface);
-                                       last;
-                               }
-                       }
-               }
-       } else {
-               daemon_log("get_local_ip_for_remote_ip was called with a non-ip parameter: $server_ip", 1);
-       }
-       return $result;
-}
-
 
 #===  FUNCTION  ================================================================
 #         NAME:  register_at_bus
@@ -422,7 +413,7 @@ sub process_incoming_msg {
 
     if( 1 == length @target_l) {
         my $target = $target_l[0];
-        if( $target eq $server_address ) {  
+               if(&server_matches($target)) {
             if ($header eq 'new_key') {
                 @out_msg_l = &new_key($msg_hash)
             } elsif ($header eq 'here_i_am') {
@@ -442,24 +433,16 @@ sub process_incoming_msg {
                     &main::daemon_log("SIPackages: trigger wake for $_", 1);
                     do_wake($_);
                 }
-
             } else {
                 &main::daemon_log("ERROR: $header is an unknown core function", 1);
                 $error++;
             }
-        }
-               else {
-                       &main::daemon_log("msg is not for gosa-si-server '$server_address', deliver it to target '$target'", 5);
-                       push(@out_msg_l, $msg);
-               }
+        } else {
+               &main::daemon_log("msg is not for gosa-si-server '$server_address', deliver it to target '$target'", 5);
+               push(@out_msg_l, $msg);
+       }
     }
 
-#    if( $error == 0) {
-#        if( 0 == @out_msg_l ) {
-#                      push(@out_msg_l, $msg);
-#        }
-#    }
-    
     return \@out_msg_l;
 }
 
@@ -472,21 +455,44 @@ sub process_incoming_msg {
 #===============================================================================
 sub got_ping {
     my ($msg_hash) = @_;
-    
+
     my $source = @{$msg_hash->{source}}[0];
     my $target = @{$msg_hash->{target}}[0];
     my $header = @{$msg_hash->{header}}[0];
+    my $session_id = @{$msg_hash->{'session_id'}}[0];
+    my $act_time = &get_time;
+    my @out_msg_l;
+    my $out_msg;
+
+    # check known_clients_db
+    my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$source'";
+    my $query_res = $main::known_clients_db->select_dbentry( $sql_statement );
+    if( 1 == keys %{$query_res} ) {
+         my $sql_statement= "UPDATE known_clients ".
+            "SET status='$header', timestamp='$act_time' ".
+            "WHERE hostname='$source'";
+         my $res = $main::known_clients_db->update_dbentry( $sql_statement );
+    } 
     
-    if(exists $main::known_daemons->{$source}) {
-        &main::add_content2known_daemons(hostname=>$source, status=>$header);
-    } else {
-        &main::add_content2known_clients(hostname=>$source, status=>$header);
-    }
+    # check known_server_db
+    $sql_statement = "SELECT * FROM known_server WHERE hostname='$source'";
+    $query_res = $main::known_server_db->select_dbentry( $sql_statement );
+    if( 1 == keys %{$query_res} ) {
+         my $sql_statement= "UPDATE known_server ".
+            "SET status='$header', timestamp='$act_time' ".
+            "WHERE hostname='$source'";
+         my $res = $main::known_server_db->update_dbentry( $sql_statement );
+    } 
+
+    # create out_msg
+    my $out_hash = &create_xml_hash($header, $source, "GOSA");
+    &add_content2xml_hash($out_hash, "session_id", $session_id);
+    $out_msg = &create_xml_string($out_hash);
+    push(@out_msg_l, $out_msg);
     
-    return;
+    return @out_msg_l;
 }
 
-
 #===  FUNCTION  ================================================================
 #         NAME:  new_passwd
 #   PARAMETERS:  msg_hash - ref - hash from function create_xml_hash
@@ -780,6 +786,13 @@ sub new_ldap_config {
        @servers= sort (@servers);
 
        foreach $server (@servers){
+        # Conversation for backward compatibility
+        if ($server !=~ /^ldap[^:]+:\/\// ) {
+            if ($server =~ /^([^:]+):(.*)$/ ) {
+                $server= "1:dummy:ldap://$1/$2";
+            }
+        }
+
                $base= $server;
                $server =~ s%^[^:]+:[^:]+:(ldap.*://[^/]+)/.*$%$1%;
                $base =~ s%^[^:]+:[^:]+:ldap.*://[^/]+/(.*)$%$1%;
@@ -820,21 +833,22 @@ sub new_ldap_config {
                $data{'admin_base'}= $entry->dn;
                $data{'department'}= $entry->get_value("ou");
 
-               # Fill release if available
-               my $ou= $entry->get_value("ou");
-               if (defined $ou && $ou =~ /^.* :([A-Za-z0-9\/.]+).*$/) {
-                       $data{'release'}= $1;
-               }
-
                # Append unit Tag
                $data{'unit_tag'}= $unit_tag;
        }
 
+       # Fill release if available
+       my $FAIclass= $entry->get_value("FAIclass");
+       if (defined $FAIclass && $FAIclass =~ /^.* :([A-Za-z0-9\/.]+).*$/) {
+               $data{'release'}= $1;
+       }
+
+
        # Unbind
        $mesg = $ldap->unbind;
 
        # Send information
-       return send_msg("new_ldap_config", $server_address, $address, \%data);
+       return &build_msg("new_ldap_config", $server_address, $address, \%data);
 }
 
 sub process_detected_hardware {
@@ -894,17 +908,24 @@ sub process_detected_hardware {
                $entry->add("gotomode" => "locked");
                $entry->add("gotoSysStatus" => "new-system");
                $entry->add("ipHostNumber" => $ipaddress);
-               if(my $res=$entry->update($ldap)) {
+               if(defined($gosa_unit_tag) && length($gosa_unit_tag) > 0) {
+                       $entry->add("objectClass" => "gosaAdministrativeUnit");
+                       $entry->add("gosaUnitTag" => $gosa_unit_tag);
+               }
+               my $res=$entry->update($ldap);
+               if(defined($res->{'errorMessage'}) &&
+                       length($res->{'errorMessage'}) >0) {
+                       &main::daemon_log("There was a problem adding the entries to LDAP:", 1);
+                       &main::daemon_log($res->{'errorMessage'}, 1);
+                       return;
+               } else {
                        # Fill $mesg again
                        $mesg = $ldap->search(
                                base   => $ldap_base,
                                scope  => 'sub',
                                filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))"
                        );
-               } else {
-                       &main::daemon_log("ERROR: There was a problem adding the entry", 1);
                }
-
        }
        
        if($mesg->count == 1) {
@@ -914,7 +935,8 @@ sub process_detected_hardware {
                        "gotoSndModule", "ghNetNic", "gotoXResolution", "ghSoundAdapter", "ghCpuType", "gotoXkbModel", 
                        "ghGfxAdapter", "gotoXMousePort", "ghMemSize", "gotoXMouseType", "ghUsbSupport", "gotoXHsync", 
                        "gotoXDriver", "gotoXVsync", "gotoXMonitor", "gotoHardwareChecksum") {
-                       if(defined($msg_hash->{detected_hardware}[0]->{$attribute})) {
+                       if(defined($msg_hash->{detected_hardware}[0]->{$attribute}) &&
+                               length($msg_hash->{detected_hardware}[0]->{$attribute}) >0 ) {
                                if(defined($entry->get_value($attribute))) {
                                        $entry->delete($attribute);
                                }
@@ -924,7 +946,8 @@ sub process_detected_hardware {
                }
                foreach my $attribute (
                        "gotoModules", "ghScsiDev", "ghIdeDev") {
-                       if(defined($msg_hash->{detected_hardware}[0]->{$attribute})) {
+                       if(defined($msg_hash->{detected_hardware}[0]->{$attribute}) &&
+                               length($msg_hash->{detected_hardware}[0]->{$attribute}) >0 ) {
                                if(defined($entry->get_value($attribute))) {
                                        $entry->delete($attribute);
                                }
@@ -932,10 +955,14 @@ sub process_detected_hardware {
                                        $entry->add($attribute => $array_entry);
                                }
                        }
-
                }
 
-               if($entry->update($ldap)) {
+               my $res=$entry->update($ldap);
+               if(defined($res->{'errorMessage'}) &&
+                       length($res->{'errorMessage'}) >0) {
+                       &main::daemon_log("There was a problem adding the entries to LDAP:", 1);
+                       &main::daemon_log($res->{'errorMessage'}, 1);
+               } else {
                        &main::daemon_log("Added Hardware configuration to LDAP", 4);
                }
 
@@ -1066,7 +1093,52 @@ sub hardware_config {
        &main::daemon_log("Send detect_hardware message to $address", 4);
 
        # Send information
-       return send_msg("detect_hardware", $server_address, $address, \%data);
+       return &build_msg("detect_hardware", $server_address, $address, \%data);
+}
+
+sub server_matches {
+       my $target = shift;
+       my $target_ip = sprintf("%s", $target =~ /^([0-9\.]*?):.*$/);
+       my $result = 0;
+
+       if($server_ip eq $target_ip) {
+               $result= 1;
+       } elsif ($server_ip eq "0.0.0.0") {     
+               if ($target_ip eq "127.0.0.1") {
+                       $result= 1;
+               } else {
+                       my $PROC_NET_ROUTE= ('/proc/net/route');
+
+                       open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE")
+                               or die "Could not open $PROC_NET_ROUTE";
+
+                       my @ifs = <PROC_NET_ROUTE>;
+
+                       close(PROC_NET_ROUTE);
+
+                       # Eat header line
+                       shift @ifs;
+                       chomp @ifs;
+                       foreach my $line(@ifs) {
+                               my ($Iface,$Destination,$Gateway,$Flags,$RefCnt,$Use,$Metric,$Mask,$MTU,$Window,$IRTT)=split(/\s/, $line);
+                               my $destination;
+                               my $mask;
+                               my ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Destination);
+                               $destination= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
+                               ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Mask);
+                               $mask= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
+                               if(new NetAddr::IP($target_ip)->within(new NetAddr::IP($destination, $mask))) {
+                                       # destination matches route, save mac and exit
+                                       $result= 1;
+                                       last;
+                               }
+                       }
+               }
+       } else {
+               &main::daemon_log("Target ip $target_ip does not match Server ip $server_ip",1);
+       }
+
+       return $result;
 }
 
 
@@ -1121,4 +1193,5 @@ sub execute_actions {
 }
 
 
+#vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 1;