X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fmodules%2FSIPackages.pm;h=4f7bd8611dedec2cd1dae64768424fa369a409f7;hb=1bf6d6303fb62f5b51b9ebff12524f7631a02bc7;hp=3858263834afcf1fd268b431245139cee09fb52b;hpb=c62cee2d9f122481cd9415228d440ad0ff48afb8;p=gosa.git diff --git a/gosa-si/modules/SIPackages.pm b/gosa-si/modules/SIPackages.pm index 385826383..4f7bd8611 100644 --- a/gosa-si/modules/SIPackages.pm +++ b/gosa-si/modules/SIPackages.pm @@ -16,7 +16,6 @@ use NetAddr::IP; use Net::LDAP; use Socket; use Net::hostent; -use utf8; my $event_dir = "/usr/lib/gosa-si/server/events"; use lib "/usr/lib/gosa-si/server/events"; @@ -24,7 +23,7 @@ use lib "/usr/lib/gosa-si/server/events"; BEGIN{} END {} -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 ($server_ip, $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 $event_hash; @@ -42,7 +41,7 @@ my %cfg_defaults = ( }, "server" => { "ip" => [\$server_ip, "0.0.0.0"], - "mac-address" => [\$server_mac_address, "00:00:00:00:00"], + "mac-address" => [\$main::server_mac_address, "00:00:00:00:00"], "port" => [\$server_port, "20081"], "ldap-uri" => [\$ldap_uri, ""], "ldap-base" => [\$ldap_base, ""], @@ -64,27 +63,29 @@ my %cfg_defaults = ( # if server_ip is not an ip address but a name if( inet_aton($server_ip) ){ $server_ip = inet_ntoa(inet_aton($server_ip)); } $network_interface= &get_interface_for_ip($server_ip); -$server_mac_address= &get_mac($network_interface); +$main::server_mac_address= &get_mac($network_interface); &import_events(); # Unit tag can be defined in config if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) { # Read gosaUnitTag from 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 $ldap_handle = &main::get_ldap_handle(); + if( defined($ldap_handle) ) { + &main::daemon_log("INFO: Searching for servers gosaUnitTag with mac address $main::server_mac_address",5); # Perform search for Unit Tag - $mesg = $main::ldap_handle->search( + $mesg = $ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['gosaUnitTag'], - filter => "(macaddress=$server_mac_address)" + filter => "(macaddress=$main::server_mac_address)" ); if ($mesg->count == 1) { my $entry= $mesg->entry(0); my $unit_tag= $entry->get_value("gosaUnitTag"); + $main::ldap_server_dn= $mesg->entry(0)->dn; if(defined($unit_tag) && length($unit_tag) > 0) { &main::daemon_log("INFO: Detected gosaUnitTag $unit_tag for creating entries", 5); $main::gosa_unit_tag= $unit_tag; @@ -94,7 +95,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 = $main::ldap_handle->search( + $mesg = $ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['gosaUnitTag'], @@ -103,6 +104,7 @@ if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) { if ($mesg->count == 1) { my $entry= $mesg->entry(0); my $unit_tag= $entry->get_value("gosaUnitTag"); + $main::ldap_server_dn= $mesg->entry(0)->dn; if(defined($unit_tag) && length($unit_tag) > 0) { &main::daemon_log("INFO: Detected gosaUnitTag $unit_tag for creating entries", 5); $main::gosa_unit_tag= $unit_tag; @@ -112,7 +114,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 = $main::ldap_handle->search( + $mesg = $ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['gosaUnitTag'], @@ -121,6 +123,7 @@ if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) { if ($mesg->count == 1) { my $entry= $mesg->entry(0); my $unit_tag= $entry->get_value("gosaUnitTag"); + $main::ldap_server_dn= $mesg->entry(0)->dn; if(defined($unit_tag) && length($unit_tag) > 0) { &main::daemon_log("INFO: Detected gosaUnitTag $unit_tag for creating entries", 5); $main::gosa_unit_tag= $unit_tag; @@ -248,7 +251,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; } } @@ -304,8 +307,8 @@ sub get_mac { my $SIOCGIFHWADDR= 0x8927; # man 2 ioctl_list # A configured MAC Address should always override a guessed value - if ($server_mac_address and length($server_mac_address) > 0) { - $result= $server_mac_address; + if ($main::server_mac_address and length($main::server_mac_address) > 0) { + $result= $main::server_mac_address; } socket SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('ip') @@ -352,7 +355,7 @@ sub register_at_bus { sub import_events { if (not -e $event_dir) { - &main::daemon_log("ERROR: cannot find directory or directory is not readable: $event_dir", 1); + &main::daemon_log("S 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"; @@ -374,7 +377,7 @@ sub import_events { $event_hash->{$event_name} = $event_module; } my $events_string = join( ", ", @{$events_l}); - &main::daemon_log("INFO: SIPackages imported events $events_string", 5); + &main::daemon_log("S DEBUG: SIPackages imported events $events_string", 8); } } @@ -390,7 +393,7 @@ sub process_incoming_msg { my $error = 0; my $host_name; my $host_key; - my @out_msg_l = (); + my @out_msg_l = ("nohandler"); # process incoming msg my $header = @{$msg_hash->{header}}[0]; @@ -399,11 +402,10 @@ sub process_incoming_msg { # skip PREFIX $header =~ s/^CLMSG_//; - &main::daemon_log("DEBUG: SIPackages: msg to process: $header", 7); - &main::daemon_log("$msg", 8); + &main::daemon_log("$session_id DEBUG: SIPackages: msg to process: $header", 7); if( 0 == length @target_l){ - &main::daemon_log("ERROR: no target specified for msg $header", 1); + &main::daemon_log("$session_id ERROR: no target specified for msg $header", 1); $error++; } @@ -415,22 +417,24 @@ sub process_incoming_msg { if ($header eq 'new_key') { @out_msg_l = &new_key($msg_hash) } elsif ($header eq 'here_i_am') { - @out_msg_l = &here_i_am($msg_hash) + @out_msg_l = &here_i_am($msg, $msg_hash, $session_id) } else { if( exists $event_hash->{$header} ) { # a event exists with the header as name - &main::daemon_log("INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5); + &main::daemon_log("$session_id INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5); no strict 'refs'; @out_msg_l = &{$event_hash->{$header}."::$header"}($msg, $msg_hash, $session_id); } } # if delivery not possible raise error and return - if( not @out_msg_l ) { - &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); + if( not defined $out_msg_l[0] ) { + @out_msg_l = (); + } elsif( $out_msg_l[0] eq 'nohandler') { + &main::daemon_log("$session_id ERROR: SIPackages: no event handler or core function defined for '$header'", 1); + @out_msg_l = (); } + } else { &main::daemon_log("INFO: msg is not for gosa-si-server '$server_address', deliver it to target '$target'", 5); @@ -500,7 +504,7 @@ sub new_key { # DESCRIPTION: process this incoming message #=============================================================================== sub here_i_am { - my ($msg_hash) = @_; + my ($msg, $msg_hash, $session_id) = @_; my @out_msg_l; my $out_hash; @@ -516,16 +520,16 @@ sub here_i_am { my $db_res= $main::known_clients_db->select_dbentry( $sql_statement ); if ( 1 == keys %{$db_res} ) { - &main::daemon_log("WARNING: $source is already known as a client", 1); - &main::daemon_log("WARNING: values for $source are being overwritten", 1); + &main::daemon_log("$session_id WARNING: $source is already known as a client", 1); + &main::daemon_log("$session_id WARNING: values for $source are being overwritten", 1); $nu_clients --; } # number of actual activ clients my $act_nu_clients = $nu_clients; - &main::daemon_log("INFO: number of actual activ clients: $act_nu_clients", 5); - &main::daemon_log("INFO: number of maximal allowed clients: $max_clients", 5); + &main::daemon_log("$session_id INFO: number of actual activ clients: $act_nu_clients", 5); + &main::daemon_log("$session_id INFO: number of maximal allowed clients: $max_clients", 5); if($max_clients <= $act_nu_clients) { my $out_hash = &create_xml_hash("denied", $server_address, $source); @@ -555,7 +559,7 @@ sub here_i_am { } ); if ($res != 0) { - &main::daemon_log("ERROR: cannot add entry to known_clients: $res"); + &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $res"); return; } @@ -575,24 +579,32 @@ 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 registered at server '$server_address'", 5); + &main::daemon_log("$session_id 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 ) { - &add_content2xml_hash($out_hash, "ldap_available", "true"); - } + my $new_ldap_config_out = &new_ldap_config($source, $session_id); + if($new_ldap_config_out && (!($new_ldap_config_out =~ /error/))) { + &add_content2xml_hash($out_hash, "ldap_available", "true"); + } elsif($new_ldap_config_out && $new_ldap_config_out =~ /error/){ + &add_content2xml_hash($out_hash, "error", $new_ldap_config_out); + + my $sql_statement = "UPDATE $main::job_queue_tn ". + "SET status='error', result='$new_ldap_config_out' ". + "WHERE status='processing' AND macaddress LIKE '$mac_address'"; + my $res = $main::job_db->update_dbentry($sql_statement); + &main::daemon_log("$session_id DEBUG: $sql_statement RESULT: $res", 7); + } my $register_out = &create_xml_string($out_hash); push(@out_msg_l, $register_out); # Really send the ldap config - if( $new_ldap_config_out ) { + if( $new_ldap_config_out && (!($new_ldap_config_out =~ /error/))) { push(@out_msg_l, $new_ldap_config_out); } - my $hardware_config_out = &hardware_config($source, $gotoHardwareChecksum); + my $hardware_config_out = &hardware_config($msg, $msg_hash, $session_id); if( $hardware_config_out ) { push(@out_msg_l, $hardware_config_out); } @@ -657,15 +669,15 @@ sub who_has_i_do { # DESCRIPTION: send to address the ldap configuration found for dn gotoLdapServer #=============================================================================== sub new_ldap_config { - my ($address) = @_ ; + my ($address, $session_id) = @_ ; - my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address' OR macaddress='$address'"; + my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address' OR macaddress LIKE '$address'"; my $res = $main::known_clients_db->select_dbentry( $sql_statement ); # check hit my $hit_counter = keys %{$res}; if( not $hit_counter == 1 ) { - &main::daemon_log("ERROR: more or no hit found in known_clients_db by query by '$address'", 1); + &main::daemon_log("$session_id ERROR: more or no hit found in known_clients_db by query by '$address'", 1); } $address = $res->{1}->{hostname}; @@ -673,35 +685,35 @@ sub new_ldap_config { my $hostkey = $res->{1}->{hostkey}; if (not defined $macaddress) { - &main::daemon_log("ERROR: no mac address found for client $address", 1); + &main::daemon_log("$session_id ERROR: no mac address found for client $address", 1); return; } # Build LDAP connection - &main::refresh_ldap_handle(); - if( not defined $main::ldap_handle ) { - &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1); + my $ldap_handle = &main::get_ldap_handle($session_id); + if( not defined $ldap_handle ) { + &main::daemon_log("$session_id ERROR: cannot connect to ldap: $ldap_uri", 1); return; } # Perform search - $mesg = $main::ldap_handle->search( base => $ldap_base, + $mesg = $ldap_handle->search( base => $ldap_base, scope => 'sub', 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); + &main::daemon_log("$session_id ".$mesg->error, 1); return; } # Sanity check if ($mesg->count != 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)(gotoLdapServer=*))", 1); + &main::daemon_log("$session_id WARNING: client with mac address $macaddress not found/unique/active - not sending ldap config". + "\n\tbase: $ldap_base". + "\n\tscope: sub". + "\n\tattrs: dn, gotoLdapServer". + "\n\tfilter: (&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))", 1); return; } @@ -722,19 +734,19 @@ sub new_ldap_config { # Do we need to look at an object class? if (length(@servers) < 1){ - $mesg = $main::ldap_handle->search( base => $ldap_base, + $mesg = $ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['dn', 'gotoLdapServer', 'FAIclass'], filter => "(&(objectClass=gosaGroupOfNames)(member=$dn))"); #$mesg->code && die $mesg->error; if($mesg->code) { - &main::daemon_log($mesg->error, 1); + &main::daemon_log("$session_id ".$mesg->error, 1); return; } # Sanity check if ($mesg->count != 1) { - &main::daemon_log("WARNING: no LDAP information found for client mac $macaddress", 1); + &main::daemon_log("$session_id WARNING: no LDAP information found for client mac $macaddress", 1); return; } @@ -785,20 +797,20 @@ sub new_ldap_config { if (defined $unit_tag){ # Find admin base and department name - $mesg = $main::ldap_handle->search( base => $ldap_base, + $mesg = $ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['dn', 'ou'], filter => "(&(objectClass=gosaAdministrativeUnit)(gosaUnitTag=$unit_tag))"); #$mesg->code && die $mesg->error; if($mesg->code) { &main::daemon_log($mesg->error, 1); - return; + return "error-unit-tag-count-0"; } # Sanity check if ($mesg->count != 1) { &main::daemon_log("WARNING: cannot find administrative unit for client with tag $unit_tag", 1); - return; + return "error-unit-tag-count-".$mesg->count; } $entry= $mesg->entry(0); @@ -821,7 +833,10 @@ sub new_ldap_config { # DESCRIPTION: #=============================================================================== sub hardware_config { - my ($address, $gotoHardwareChecksum) = @_ ; + my ($msg, $msg_hash, $session_id) = @_ ; + my $address = @{$msg_hash->{source}}[0]; + my $header = @{$msg_hash->{header}}[0]; + my $gotoHardwareChecksum = @{$msg_hash->{gotoHardwareChecksum}}[0]; my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address'"; my $res = $main::known_clients_db->select_dbentry( $sql_statement ); @@ -829,26 +844,25 @@ sub hardware_config { # check hit my $hit_counter = keys %{$res}; if( not $hit_counter == 1 ) { - &main::daemon_log("ERROR: more or no hit found in known_clients_db by query by '$address'", 1); + &main::daemon_log("$session_id ERROR: more or no hit found in known_clients_db by query by '$address'", 1); } - my $macaddress = $res->{1}->{macaddress}; my $hostkey = $res->{1}->{hostkey}; if (not defined $macaddress) { - &main::daemon_log("ERROR: no mac address found for client $address", 1); + &main::daemon_log("$session_id ERROR: no mac address found for client $address", 1); return; } # Build LDAP connection - &main::refresh_ldap_handle(); - if( not defined $main::ldap_handle ) { - &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1); + my $ldap_handle = &main::get_ldap_handle($session_id); + if( not defined $ldap_handle ) { + &main::daemon_log("$session_id ERROR: cannot connect to ldap: $ldap_uri", 1); return; } # Perform search - $mesg = $main::ldap_handle->search( + $mesg = $ldap_handle->search( base => $ldap_base, scope => 'sub', filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))" @@ -856,20 +870,36 @@ sub hardware_config { if($mesg->count() == 0) { &main::daemon_log("Host was not found in LDAP!", 1); + + # set status = hardware_detection at jobqueue if entry exists + my $func_dic = {table=>$main::job_queue_tn, + primkey=>['id'], + timestamp=>&get_time, + status=>'processing', + result=>'none', + progress=>'hardware-detection', + headertag=>'trigger_action_reinstall', + targettag=>$address, + xmlmessage=>'none', + macaddress=>$macaddress, + }; + my $hd_res = $main::job_db->add_dbentry($func_dic); + &main::daemon_log("$session_id INFO: add '$macaddress' to job queue as an installing job", 5); + } else { my $entry= $mesg->entry(0); my $dn= $entry->dn; - if(defined($entry->get_value("gotoHardwareChecksum"))) { - if(! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) { + if (defined($entry->get_value("gotoHardwareChecksum"))) { + if (! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) { $entry->replace(gotoHardwareChecksum => $gotoHardwareChecksum); - if($entry->update($main::ldap_handle)) { - &main::daemon_log("Hardware changed! Detection triggered.", 4); + if($entry->update($ldap_handle)) { + &main::daemon_log("$session_id INFO: Hardware changed! Detection triggered.", 5); } } else { # Nothing to do return; } - } + } } # Assemble data package @@ -881,8 +911,6 @@ sub hardware_config { $data{'goto_secret'}= $goto_secret; } - &main::daemon_log("Send detect_hardware message to $address", 4); - # Send information return &build_msg("detect_hardware", $server_address, $address, \%data); } @@ -894,6 +922,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;