X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=gosa-si%2Fmodules%2FSIPackages.pm;h=099ae2121b449bfd32c8bd2d0266577e74064ca6;hb=af9d2bdd58e8b70f29c64dbe3aa96c3f1692a18d;hp=64c72c0a36f0c3a4905a8df6b0ff164159b847b9;hpb=2f6bb45a553dc70e39918d754f5f9010416676ea;p=gosa.git diff --git a/gosa-si/modules/SIPackages.pm b/gosa-si/modules/SIPackages.pm index 64c72c0a3..099ae2121 100644 --- a/gosa-si/modules/SIPackages.pm +++ b/gosa-si/modules/SIPackages.pm @@ -16,7 +16,7 @@ use NetAddr::IP; use Net::LDAP; use Socket; use Net::hostent; -use Net::DNS; +use utf8; my $event_dir = "/usr/lib/gosa-si/server/events"; use lib "/usr/lib/gosa-si/server/events"; @@ -31,6 +31,7 @@ my $event_hash; my $network_interface; my $no_bus; my (@ldap_cfg, @pam_cfg, @nss_cfg, $goto_admin, $goto_secret); +my $mesg; my %cfg_defaults = ( "bus" => { @@ -70,12 +71,11 @@ $server_mac_address= &get_mac($network_interface); # Unit tag can be defined in config if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) { # Read gosaUnitTag from LDAP - my $tmp_ldap= Net::LDAP->new($ldap_uri); - if( defined($tmp_ldap) ) { + &main::refresh_ldap_handle(); + if( defined($main::ldap_handle) ) { &main::daemon_log("INFO: Searching for servers gosaUnitTag with mac address $server_mac_address",5); - my $mesg= $tmp_ldap->bind($ldap_admin_dn, password => $ldap_admin_password); # Perform search for Unit Tag - $mesg = $tmp_ldap->search( + $mesg = $main::ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['gosaUnitTag'], @@ -94,7 +94,7 @@ if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) { my $hostname= `hostname -f`; chomp($hostname); &main::daemon_log("INFO: Searching for servers gosaUnitTag with hostname $hostname",5); - $mesg = $tmp_ldap->search( + $mesg = $main::ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['gosaUnitTag'], @@ -112,7 +112,7 @@ if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) { $hostname= `hostname -s`; chomp($hostname); &main::daemon_log("INFO: Searching for servers gosaUnitTag with hostname $hostname",5); - $mesg = $tmp_ldap->search( + $mesg = $main::ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['gosaUnitTag'], @@ -130,7 +130,6 @@ if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) { } } } - $tmp_ldap->unbind; } else { &main::daemon_log("INFO: Using gosaUnitTag from config-file: $main::gosa_unit_tag",5); } @@ -162,7 +161,7 @@ if($bus_activ eq "on") { # add myself to known_server_db my $res = $main::known_server_db->add_dbentry( {table=>'known_server', - primkey=>'hostname', + primkey=>['hostname'], hostname=>$server_address, status=>'myself', hostkey=>$SIPackages_key, @@ -182,61 +181,6 @@ sub get_module_info { } -#sub daemon_log { -# my ($msg, $level) = @_ ; -# &main::daemon_log($msg, $level); -# return; -#} -# - -#sub do_wake { -# my $host = shift; -# my $ipaddr = shift || '255.255.255.255'; -# my $port = getservbyname('discard', 'udp'); -# -# my ($raddr, $them, $proto); -# my ($hwaddr, $hwaddr_re, $pkt); -# -# # get the hardware address (ethernet address) -# -# $hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6); -# if ($host =~ m/^$hwaddr_re$/) { -# $hwaddr = $host; -# } else { -# # $host is not a hardware address, try to resolve it -# my $ip_re = join('\.', ('([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))') x 4); -# my $ip_addr; -# if ($host =~ m/^$ip_re$/) { -# $ip_addr = $host; -# } else { -# my $h; -# unless ($h = gethost($host)) { -# return undef; -# } -# $ip_addr = inet_ntoa($h->addr); -# } -# } -# -# # Generate magic sequence -# foreach (split /:/, $hwaddr) { -# $pkt .= chr(hex($_)); -# } -# $pkt = chr(0xFF) x 6 . $pkt x 16; -# -# # Allocate socket and send packet -# -# $raddr = gethostbyname($ipaddr)->addr; -# $them = pack_sockaddr_in($port, $raddr); -# $proto = getprotobyname('udp'); -# -# socket(S, AF_INET, SOCK_DGRAM, $proto) or die "socket : $!"; -# setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1) or die "setsockopt : $!"; -# -# send(S, $pkt, 0, $them) or die "send : $!"; -# close S; -#} - - #=== FUNCTION ================================================================ # NAME: read_configfile # PARAMETERS: cfg_file - string - @@ -304,7 +248,7 @@ sub get_interface_for_ip { } else { foreach (@ifs) { my $if=$_; - if(get_ip($if) eq $ip) { + if(&main::get_ip($if) eq $ip) { $result = $if; } } @@ -392,7 +336,7 @@ sub register_at_bus { # add bus to known_server_db my $res = $main::known_server_db->add_dbentry( {table=>'known_server', - primkey=>'hostname', + primkey=>['hostname'], hostname=>$bus_address, status=>'bus', hostkey=>$bus_key, @@ -456,7 +400,6 @@ sub process_incoming_msg { $header =~ s/^CLMSG_//; &main::daemon_log("DEBUG: SIPackages: msg to process: $header", 7); - &main::daemon_log("$msg", 8); if( 0 == length @target_l){ &main::daemon_log("ERROR: no target specified for msg $header", 1); @@ -483,7 +426,7 @@ sub process_incoming_msg { # if delivery not possible raise error and return if( not @out_msg_l ) { - &main::daemon_log("WARNING: SIPackages got not answer from event handler '$header'", 3); + &main::daemon_log("WARNING: SIPackages got no answer from event handler '$header'", 3); } elsif( 0 == @out_msg_l) { &main::daemon_log("ERROR: SIPackages: no event handler or core function defined for '$header'", 1); } @@ -498,52 +441,6 @@ sub process_incoming_msg { } -#=== FUNCTION ================================================================ -# NAME: got_ping -# PARAMETERS: msg_hash - hash - hash from function create_xml_hash -# RETURNS: nothing -# DESCRIPTION: process this incoming message -#=============================================================================== -#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 ); -# } -# -# # 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 @out_msg_l; -#} - #=== FUNCTION ================================================================ # NAME: new_passwd # PARAMETERS: msg_hash - ref - hash from function create_xml_hash @@ -647,7 +544,7 @@ sub here_i_am { # add entry to known_clients_db my $act_timestamp = &get_time; my $res = $main::known_clients_db->add_dbentry( {table=>'known_clients', - primkey=>'hostname', + primkey=>['hostname'], hostname=>$source, events=>$events, macaddress=>$mac_address, @@ -663,8 +560,6 @@ sub here_i_am { # return acknowledgement to client $out_hash = &create_xml_hash("registered", $server_address, $source); - my $register_out = &create_xml_string($out_hash); - push(@out_msg_l, $register_out); # notify registered client to bus if( $bus_activ eq "on") { @@ -679,13 +574,21 @@ sub here_i_am { &add_content2xml_hash($out_hash, "timestamp", $act_timestamp); my $new_client_out = &create_xml_string($out_hash); push(@out_msg_l, $new_client_out); - &main::daemon_log("INFO: send bus msg that client '$source' has registerd at server '$server_address'", 5); + &main::daemon_log("INFO: send bus msg that client '$source' has registered at server '$server_address'", 5); } # give the new client his ldap config + # Workaround: Send within the registration response, if the client will get an ldap config later my $new_ldap_config_out = &new_ldap_config($source); if( $new_ldap_config_out ) { - push(@out_msg_l, $new_ldap_config_out); + &add_content2xml_hash($out_hash, "ldap_available", "true"); + } + my $register_out = &create_xml_string($out_hash); + push(@out_msg_l, $register_out); + + # Really send the ldap config + if( $new_ldap_config_out ) { + push(@out_msg_l, $new_ldap_config_out); } my $hardware_config_out = &hardware_config($source, $gotoHardwareChecksum); @@ -745,10 +648,11 @@ sub who_has_i_do { print "\ngot msg $header:\nserver $source has client with $search_param $search_value\n"; } + #=== FUNCTION ================================================================ # NAME: new_ldap_config # PARAMETERS: address - string - ip address and port of a host -# RETURNS: nothing +# RETURNS: gosa-si conform message # DESCRIPTION: send to address the ldap configuration found for dn gotoLdapServer #=============================================================================== sub new_ldap_config { @@ -773,21 +677,17 @@ sub new_ldap_config { } # Build LDAP connection - my $ldap = Net::LDAP->new($ldap_uri); - if( not defined $ldap ) { + &main::refresh_ldap_handle(); + if( not defined $main::ldap_handle ) { &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1); return; } - - # Bind to a directory with dn and password - my $mesg= $ldap->bind($ldap_admin_dn, password => $ldap_admin_password); - # Perform search - $mesg = $ldap->search( base => $ldap_base, + $mesg = $main::ldap_handle->search( base => $ldap_base, scope => 'sub', - attrs => ['dn', 'gotoLdapServer', 'gosaUnitTag'], - filter => "(&(objectClass=GOhard)(macaddress=$macaddress))"); + attrs => ['dn', 'gotoLdapServer', 'gosaUnitTag', 'FAIclass'], + filter => "(&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))"); #$mesg->code && die $mesg->error; if($mesg->code) { &main::daemon_log($mesg->error, 1); @@ -796,11 +696,11 @@ sub new_ldap_config { # Sanity check if ($mesg->count != 1) { - &main::daemon_log("WARNING: client mac address $macaddress not found/not unique in ldap search", 1); + &main::daemon_log("WARNING: client with mac address $macaddress not found/unique/active - not sending ldap config", 1); &main::daemon_log("\tbase: $ldap_base", 1); &main::daemon_log("\tscope: sub", 1); &main::daemon_log("\tattrs: dn, gotoLdapServer", 1); - &main::daemon_log("\tfilter: (&(objectClass=GOhard)(macaddress=$macaddress))", 1); + &main::daemon_log("\tfilter: (&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))", 1); return; } @@ -811,12 +711,19 @@ sub new_ldap_config { my @ldap_uris; my $server; my $base; + my $release; + + # Fill release if available + my $FAIclass= $entry->get_value("FAIclass"); + if (defined $FAIclass && $FAIclass =~ /^.* :([A-Za-z0-9\/.]+).*$/) { + $release= $1; + } # Do we need to look at an object class? if (length(@servers) < 1){ - $mesg = $ldap->search( base => $ldap_base, + $mesg = $main::ldap_handle->search( base => $ldap_base, scope => 'sub', - attrs => ['dn', 'gotoLdapServer'], + attrs => ['dn', 'gotoLdapServer', 'FAIclass'], filter => "(&(objectClass=gosaGroupOfNames)(member=$dn))"); #$mesg->code && die $mesg->error; if($mesg->code) { @@ -833,27 +740,39 @@ sub new_ldap_config { $entry= $mesg->entry(0); $dn= $entry->dn; @servers= $entry->get_value("gotoLdapServer"); + + if (not defined $release){ + $FAIclass= $entry->get_value("FAIclass"); + if (defined $FAIclass && $FAIclass =~ /^.* :([A-Za-z0-9\/.]+).*$/) { + $release= $1; + } + } } @servers= sort (@servers); foreach $server (@servers){ - # Conversation for backward compatibility - if (not $server =~ /^ldap[^:]+:\/\// ) { - if ($server =~ /^([^:]+):(.*)$/ ) { - $server= "1:dummy:ldap://$1/$2"; - } - } + # Conversation for backward compatibility + if (not $server =~ /^\d+:[^:]+:ldap[^:]*:\/\// ) { + if ($server =~ /^([^:]+):([^:]+)$/ ) { + $server= "1:dummy:ldap://$1/$2"; + } elsif ($server =~ /^(\d+):([^:]+):(.*)$/ ) { + $server= "$1:dummy:ldap://$2/$3"; + } + } - $base= $server; - $server =~ s%^[^:]+:[^:]+:(ldap.*://[^/]+)/.*$%$1%; - $base =~ s%^[^:]+:[^:]+:ldap.*://[^/]+/(.*)$%$1%; - push (@ldap_uris, $server); + $base= $server; + $server =~ s%^[^:]+:[^:]+:(ldap.*://[^/]+)/.*$%$1%; + $base =~ s%^[^:]+:[^:]+:ldap.*://[^/]+/(.*)$%$1%; + push (@ldap_uris, $server); } # Assemble data package my %data = ( 'ldap_uri' => \@ldap_uris, 'ldap_base' => $base, 'ldap_cfg' => \@ldap_cfg, 'pam_cfg' => \@pam_cfg,'nss_cfg' => \@nss_cfg ); + if (defined $release){ + $data{'release'}= $release; + } # Need to append GOto settings? if (defined $goto_admin and defined $goto_secret){ @@ -865,9 +784,9 @@ sub new_ldap_config { if (defined $unit_tag){ # Find admin base and department name - $mesg = $ldap->search( base => $ldap_base, + $mesg = $main::ldap_handle->search( base => $ldap_base, scope => 'sub', - attrs => ['dn', 'ou', 'FAIclass'], + attrs => ['dn', 'ou'], filter => "(&(objectClass=gosaAdministrativeUnit)(gosaUnitTag=$unit_tag))"); #$mesg->code && die $mesg->error; if($mesg->code) { @@ -889,20 +808,6 @@ sub new_ldap_config { $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; - if($mesg->code) { - &main::daemon_log($mesg->error, 1); - return; - } - # Send information return &build_msg("new_ldap_config", $server_address, $address, \%data); } @@ -935,17 +840,14 @@ sub hardware_config { } # Build LDAP connection - my $ldap = Net::LDAP->new($ldap_uri); - if( not defined $ldap ) { + &main::refresh_ldap_handle(); + if( not defined $main::ldap_handle ) { &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1); return; } - # Bind to a directory with dn and password - my $mesg= $ldap->bind($ldap_admin_dn, password => $ldap_admin_password); - # Perform search - $mesg = $ldap->search( + $mesg = $main::ldap_handle->search( base => $ldap_base, scope => 'sub', filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))" @@ -959,7 +861,7 @@ sub hardware_config { if(defined($entry->get_value("gotoHardwareChecksum"))) { if(! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) { $entry->replace(gotoHardwareChecksum => $gotoHardwareChecksum); - if($entry->update($ldap)) { + if($entry->update($main::ldap_handle)) { &main::daemon_log("Hardware changed! Detection triggered.", 4); } } else { @@ -968,54 +870,6 @@ sub hardware_config { } } } - # need to fill it to LDAP - #$entry->add(gotoHardwareChecksum => $gotoHardwareChecksum); - #if($entry->update($ldap)) { - # &main::daemon_log("gotoHardwareChecksum $gotoHardwareChecksum was added to LDAP", 4); - #} - - ## Look if there another host with this checksum to use the hardware config - #$mesg = $ldap->search( - # base => $ldap_base, - # scope => 'sub', - # filter => "(&(objectClass=GOhard)(gotoHardwareChecksum=$gotoHardwareChecksum))" - #); - - #if($mesg->count>1) { - # my $clone_entry= $mesg->entry(0); - # $entry->changetype("modify"); - # foreach my $attribute ( - # "gotoSndModule", "ghNetNic", "gotoXResolution", "ghSoundAdapter", "ghCpuType", "gotoXkbModel", - # "ghGfxAdapter", "gotoXMousePort", "ghMemSize", "gotoXMouseType", "ghUsbSupport", "gotoXHsync", - # "gotoXDriver", "gotoXVsync", "gotoXMonitor") { - # my $value= $clone_entry->get_value($attribute); - # if(defined($value)) { - # if(defined($entry->get_value($attribute))) { - # $entry->delete($attribute); - # } - # &main::daemon_log("Adding attribute $attribute with value $value",1); - # $entry->add($attribute => $value); - # } - # } - # foreach my $attribute ( - # "gotoModules", "ghScsiDev", "ghIdeDev") { - # my $array= $clone_entry->get_value($attribute, 'as_ref' => 1); - # if(defined($array)) { - # if(defined($entry->get_value($attribute))) { - # $entry->delete($attribute); - # } - # foreach my $array_entry (@{$array}) { - # $entry->add($attribute => $array_entry); - # } - # } - - # } - # if($entry->update($ldap)) { - # &main::daemon_log("Added Hardware configuration to LDAP", 4); - # } - - #} - # Assemble data package my %data = (); @@ -1026,9 +880,6 @@ sub hardware_config { $data{'goto_secret'}= $goto_secret; } - # Unbind - $mesg = $ldap->unbind; - &main::daemon_log("Send detect_hardware message to $address", 4); # Send information @@ -1042,6 +893,8 @@ sub server_matches { if($server_ip eq $target_ip) { $result= 1; + } elsif ($target_ip eq "0.0.0.0") { + $result= 1; } elsif ($server_ip eq "0.0.0.0") { if ($target_ip eq "127.0.0.1") { $result= 1; @@ -1080,56 +933,4 @@ sub server_matches { return $result; } - -##=== FUNCTION ================================================================ -## NAME: execute_actions -## PARAMETERS: msg_hash - hash - hash from function create_xml_hash -## RETURNS: nothing -## DESCRIPTION: invokes the script specified in msg_hash which is located under -## /etc/gosad/actions -##=============================================================================== -#sub execute_actions { -# my ($msg_hash) = @_ ; -# my $configdir= '/etc/gosad/actions/'; -# my $result; -# -# my $header = @{$msg_hash->{header}}[0]; -# my $source = @{$msg_hash->{source}}[0]; -# my $target = @{$msg_hash->{target}}[0]; -# -# if((not defined $source) -# && (not defined $target) -# && (not defined $header)) { -# &main::daemon_log("ERROR: Entries missing in XML msg for gosad actions under /etc/gosad/actions"); -# } else { -# my $parameters=""; -# my @params = @{$msg_hash->{$header}}; -# my $params = join(", ", @params); -# &main::daemon_log("execute_actions: got parameters: $params", 5); -# -# if (@params) { -# foreach my $param (@params) { -# my $param_value = (&get_content_from_xml_hash($msg_hash, $param))[0]; -# &main::daemon_log("execute_actions: parameter -> value: $param -> $param_value", 7); -# $parameters.= " ".$param_value; -# } -# } -# -# my $cmd= $configdir.$header."$parameters"; -# &main::daemon_log("execute_actions: executing cmd: $cmd", 7); -# $result= ""; -# open(PIPE, "$cmd 2>&1 |"); -# while() { -# $result.=$_; -# } -# close(PIPE); -# } -# -# # process the event result -# -# -# return; -#} -# - 1;