Code

Correct the source ip if 0.0.0.0
[gosa.git] / gosa-si / gosa-si-bus
index c37d14b7eb0dbde7c0e699c85f3cfc8dac1d212e..8f3935256c7af4674f6eb070afc0160f3562fbca 100755 (executable)
@@ -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<\/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,
        }
 );