X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=gosa-si%2Fmodules%2FSIPackages.pm;h=f8c56e6bf88b4517a087db15677ec31ee466807b;hb=bca3ce5ba8e04e21c5a0460fe0863ecead3936ce;hp=96a6edc15dd00e19bd95039ea4a0d900add8ae8c;hpb=c311fe5c4a7aad9374a2583acbc5598efc82f6d6;p=gosa.git diff --git a/gosa-si/modules/SIPackages.pm b/gosa-si/modules/SIPackages.pm index 96a6edc15..f8c56e6bf 100644 --- a/gosa-si/modules/SIPackages.pm +++ b/gosa-si/modules/SIPackages.pm @@ -12,6 +12,7 @@ use GOSA::GosaSupportDaemon; use IO::Socket::INET; use XML::Simple; use Data::Dumper; +use NetAddr::IP; use Net::LDAP; use Socket; use Net::hostent; @@ -20,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); +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, ""], - "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, ""], }, ); @@ -56,16 +57,43 @@ my %cfg_defaults = # read configfile and import variables &read_configfile(); -# detect interfaces and mac address $network_interface= &get_interface_for_ip($server_ip); -$server_mac_address= &get_mac($network_interface); +$server_mac_address= &get_mac($network_interface); + +# 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)) { + 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; + } + $mesg = $tmp_ldap->unbind; + } + } +} # complete addresses -if( $server_ip eq "0.0.0.0" ) { - $server_ip = "127.0.0.1"; -} +#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"; +$main::bus_address = $bus_address; # create general settings for this module my $xml = new XML::Simple(); @@ -95,15 +123,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'; @@ -296,34 +320,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; -} - #=== FUNCTION ================================================================ # NAME: register_at_bus @@ -346,14 +342,6 @@ sub register_at_bus { &main::send_msg_to_target($msg, $bus_address, $bus_key, "here_i_am"); return $msg; -# my $answer = ""; -# $answer = &send_msg_hash2address($msg_hash, $bus_address, $bus_passwd); -# if ($answer == 0) { -# &main::daemon_log("register at bus: $bus_address", 1); -# } else { -# &main::daemon_log("unable to send 'register'-msg to bus '$bus_address': $answer", 1); -# } -# return; } @@ -384,7 +372,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') { @@ -473,7 +461,7 @@ sub new_key { "SET hostkey='$source_key', timestamp='$act_time' ". "WHERE hostname='$source_name'"; my $res = $main::known_clients_db->update_dbentry( $sql_statement ); - my $hash = &create_xml_hash("confirm_new_passwd", $server_address, $source_name); + my $hash = &create_xml_hash("confirm_new_key", $server_address, $source_name); my $out_msg = &create_xml_string($hash); push(@out_msg_l, $out_msg); } @@ -490,7 +478,7 @@ sub new_key { "WHERE hostname='$source_name'"; my $res = $main::known_server_db->update_dbentry( $sql_statement ); - my $hash = &create_xml_hash("confirm_new_passwd", $server_address, $source_name); + my $hash = &create_xml_hash("confirm_new_key", $server_address, $source_name); my $out_msg = &create_xml_string($hash); push(@out_msg_l, $out_msg); } @@ -782,16 +770,17 @@ 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; @@ -856,6 +845,10 @@ sub process_detected_hardware { $entry->add("gotomode" => "locked"); $entry->add("gotoSysStatus" => "new-system"); $entry->add("ipHostNumber" => $ipaddress); + if(defined($gosa_unit_tag) && length($gosa_unit_tag) > 0) { + $entry->add("objectClass" => "gosaAdministrativeUnit"); + $entry->add("gosaUnitTag" => $gosa_unit_tag); + } if(my $res=$entry->update($ldap)) { # Fill $mesg again $mesg = $ldap->search( @@ -864,7 +857,7 @@ sub process_detected_hardware { filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))" ); } else { - &main::daemon_log("There was a problem adding the entry", 1); + &main::daemon_log("ERROR: There was a problem adding the entry", 1); } } @@ -1031,6 +1024,51 @@ sub hardware_config { return send_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 = ; + + 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; +} + #=== FUNCTION ================================================================ # NAME: execute_actions