X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=gosa-si%2Fmodules%2FSIPackages.pm;h=7ee752072f553f6f864efb872c32985b4e4a3829;hb=82faa48a67760be8ca82cbb13bc2da08575c6fb6;hp=b038e39635d4e8103c977c0f6fece1c5375a18c4;hpb=8e8603a69220da40e2847dd6d1273fc6cf01f62e;p=gosa.git diff --git a/gosa-si/modules/SIPackages.pm b/gosa-si/modules/SIPackages.pm index b038e3963..7ee752072 100644 --- a/gosa-si/modules/SIPackages.pm +++ b/gosa-si/modules/SIPackages.pm @@ -16,8 +16,6 @@ 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"; @@ -249,7 +247,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; } } @@ -391,7 +389,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]; @@ -400,11 +398,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++; } @@ -416,22 +413,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 not 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); @@ -501,7 +500,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; @@ -517,16 +516,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); @@ -556,14 +555,12 @@ 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; } # 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") { @@ -578,16 +575,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 registerd 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 - my $new_ldap_config_out = &new_ldap_config($source); - if( $new_ldap_config_out ) { - push(@out_msg_l, $new_ldap_config_out); + # Workaround: Send within the registration response, if the client will get an ldap config later + 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 && (!($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); } @@ -652,15 +665,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}; @@ -668,14 +681,14 @@ 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); + &main::daemon_log("$session_id ERROR: cannot connect to ldap: $ldap_uri", 1); return; } @@ -683,20 +696,20 @@ sub new_ldap_config { $mesg = $main::ldap_handle->search( base => $ldap_base, scope => 'sub', attrs => ['dn', 'gotoLdapServer', 'gosaUnitTag', 'FAIclass'], - filter => "(&(objectClass=GOhard)(macaddress=$macaddress)(gotoMode=active))"); + 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))", 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; } @@ -723,13 +736,13 @@ sub new_ldap_config { 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; } @@ -750,8 +763,10 @@ sub new_ldap_config { foreach $server (@servers){ # Conversation for backward compatibility if (not $server =~ /^\d+:[^:]+:ldap[^:]*:\/\// ) { - if ($server =~ /^([^:]+):(.*)$/ ) { + if ($server =~ /^([^:]+):([^:]+)$/ ) { $server= "1:dummy:ldap://$1/$2"; + } elsif ($server =~ /^(\d+):([^:]+):(.*)$/ ) { + $server= "$1:dummy:ldap://$2/$3"; } } @@ -785,13 +800,13 @@ sub new_ldap_config { #$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); @@ -814,7 +829,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 ); @@ -824,7 +842,6 @@ sub hardware_config { if( not $hit_counter == 1 ) { &main::daemon_log("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}; @@ -874,9 +891,23 @@ sub hardware_config { $data{'goto_secret'}= $goto_secret; } - &main::daemon_log("Send detect_hardware message to $address", 4); + # 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=>$header, + targettag=>$address, + xmlmessage=>$msg, + 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); # Send information + &main::daemon_log("$session_id INFO: Send detect_hardware message to $address", 5); return &build_msg("detect_hardware", $server_address, $address, \%data); } @@ -887,6 +918,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;