X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fgosa-si-bus;h=8f3935256c7af4674f6eb070afc0160f3562fbca;hb=f43cbfeee15e2d08b67c9e80b011ee96d74ef8fc;hp=c37d14b7eb0dbde7c0e699c85f3cfc8dac1d212e;hpb=706eb68e0982d0805024d220893bba575ddadd59;p=gosa.git diff --git a/gosa-si/gosa-si-bus b/gosa-si/gosa-si-bus index c37d14b7e..8f3935256 100755 --- a/gosa-si/gosa-si-bus +++ b/gosa-si/gosa-si-bus @@ -470,12 +470,16 @@ sub send_msg_hash2address { sub send_msg_to_target { my ($msg, $address, $encrypt_key, $msg_header) = @_ ; my $error = 0; + my $header; + my $new_status; + my $act_status; + my ($sql_statement, $res); if( $msg_header ) { - $msg_header = "'$msg_header'-"; + $header = "'$msg_header'-"; } else { - $msg_header = ""; + $header = ""; } # encrypt xml msg @@ -484,7 +488,7 @@ sub send_msg_to_target { # opensocket my $socket = &open_socket($address); if( !$socket ) { - daemon_log("cannot send ".$msg_header."msg to $address , host not reachable", 1); + daemon_log("cannot send ".$header."msg to $address , host not reachable", 1); $error++; } @@ -492,7 +496,7 @@ sub send_msg_to_target { # send xml msg print $socket $crypted_msg."\n"; - daemon_log("send ".$msg_header."msg to $address", 1); + daemon_log("send ".$header."msg to $address", 1); daemon_log("message:\n$msg", 8); } @@ -502,6 +506,44 @@ sub send_msg_to_target { close $socket; } + if( $error > 0 ) { $new_status = "down"; } + else { $new_status = $msg_header; } + + + # known_clients + $sql_statement = "SELECT * FROM bus_known_clients WHERE hostname='$address'"; + $res = $bus_known_clients_db->select_dbentry($sql_statement); + if( keys(%$res) > 0 ) { + $act_status = $res->{1}->{'status'}; + if( $act_status eq "down" ) { + $sql_statement = "DELETE FROM bus_known_clients WHERE hostname='$address'"; + $res = $bus_known_clients_db->del_dbentry($sql_statement); + daemon_log("WARNING: failed 2x to send msg to host '$address', delete host from bus_known_clients", 3); + } + else { + $sql_statement = "UPDATE bus_known_clients SET status='$new_status' WHERE hostname='$address'"; + $res = $bus_known_clients_db->update_dbentry($sql_statement); + daemon_log("INFO: set '$address' from status '$act_status' to '$new_status'", 5); + } + } + + # known_server + $sql_statement = "SELECT * FROM bus_known_server WHERE hostname='$address'"; + $res = $bus_known_server_db->select_dbentry($sql_statement); + if( keys(%$res) > 0) { + $act_status = $res->{1}->{'status'}; + if( $act_status eq "down" ) { + $sql_statement = "DELETE FROM bus_known_clients WHERE hostname='$address'"; + $res = $bus_known_clients_db->del_dbentry($sql_statement); + daemon_log("WARNING: failed 2x to a send msg to host '$address', delete host from bus_known_server", 3); + } + else { + $sql_statement = "UPDATE bus_known_server SET status='$new_status' WHERE hostname='$address'"; + $res = $bus_known_server_db->update_dbentry($sql_statement); + daemon_log("INFO: set '$address' from status '$act_status' to '$new_status'", 5) + } + } + return; } @@ -677,33 +719,74 @@ sub bus_input { my $source = @{$msg_hash->{'source'}}[0]; my $header = @{$msg_hash->{header}}[0]; + my $target_string = join(",", @target_l); + daemon_log("got msg '$header' with target '$target_string' from ".$heap->{'remote_ip'}, 3); + if( 1 == length(@target_l) && $target_l[0] eq $bus_address ) { # msg is for bus +#print STDERR "msg is for bus\n"; $kernel->post('gosa_si_bus_session', $header, $msg, $msg_hash); } else { # msg is for someone else, deliver it - print STDERR "msg is for someone else\n"; +#print STDERR "msg is for someone else\n"; foreach my $target (@target_l) { - print STDERR "target: $target\n"; - if( $target =~ /(\d{3}\.\d{3}\.\d{3}\.\d{3}:\d+)/ ) { + if( $target =~ /(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}:\d+)/ ) { # target is a ip address - - my $sql_statement = "SELECT * FROM bus_known_server WHERE hostname='$target'"; - my $sql_statement = "SELECT * FROM bus_known_clients WHERE hostname='$target'"; + my ($sql_statement, $query_res); + + $sql_statement = "SELECT * FROM bus_known_server WHERE hostname='$target'"; + $query_res = $bus_known_server_db->select_dbentry( $sql_statement ); + if( 1 == keys(%$query_res) ) { + my $host_name = $query_res->{1}->{'hostname'}; + my $host_key = $query_res->{1}->{'hostkey'}; + &send_msg_to_target($msg, $host_name, $host_key, $header); + next; + } + + $sql_statement = "SELECT * FROM bus_known_clients WHERE hostname='$target'"; + $query_res = $bus_known_clients_db->select_dbentry( $sql_statement ); + if( 1 == keys(%$query_res) ) { + my $host_name = $query_res->{1}->{'hostname'}; + my $server_name = $query_res->{1}->{'registered'}; + # fetch correct key for server + my $sql_statement = "SELECT * FROM bus_known_server WHERE hostname='$server_name'"; + my $query_res = $bus_known_server_db->select_dbentry( $sql_statement ); + my $server_key = $query_res->{1}->{'hostkey'}; + &send_msg_to_target($msg, $server_name, $server_key, $header); + next; + } + + daemon_log("ERROR:unknown host, can not process message '$header'", 1); } elsif( $target =~ /([0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2})/ ) { # target is a mac address - - my $sql_statement = "SELECT registerd FROM bus_known_clients WHERE macaddress='$target'"; + my $sql_statement = "SELECT * FROM bus_known_clients WHERE macaddress='$target'"; my $query_res = $bus_known_clients_db->select_dbentry( $sql_statement ); - print Dumper $query_res; - - + if( 1 > keys(%{$query_res})) { + daemon_log("ERROR: there are more than one hosts in bus_known_clients_db with mac address '$target'", 1); + } + elsif( 0 == keys(%{$query_res})) { + daemon_log("WARNING: no host found in bus_known_clients_db with mac address '$target'", 3); + } + else { + my $host_name = $query_res->{1}->{'hostname'}; + my $server_name = $query_res->{1}->{'registered'}; + my $out_msg = $msg; + $out_msg =~ s/$target<\/target>/$host_name<\/target>/; + + # fetch correct key for server + my $sql_statement = "SELECT * FROM bus_known_server WHERE hostname='$server_name'"; + my $query_res = $bus_known_server_db->select_dbentry( $sql_statement ); + my $server_key = $query_res->{1}->{'hostkey'}; + + &send_msg_to_target($out_msg, $server_name, $server_key, $header); + } } else { - + daemon_log("ERROR: target address '$target' does not match neiter ". + "to ip address nor to mac address, can not process msg", 1); } } @@ -766,6 +849,7 @@ sub new_client { timestamp=>$act_timestamp, }; $bus_known_clients_db->add_dbentry($add_hash); + daemon_log("add new client '$new_client' to bus_known_clients_db", 3); } @@ -858,7 +942,7 @@ POE::Session->create( _start => \&_start, _default => \&_default, here_i_am => \&here_i_am, - confirm_new_passwd => \&confirm_new_key, + confirm_new_key => \&confirm_new_key, new_client => \&new_client, } );