From ea316107e5e52d1243b29fb5093c9524e7444866 Mon Sep 17 00:00:00 2001 From: rettenbe Date: Thu, 10 Jan 2008 16:59:06 +0000 Subject: [PATCH] switch gosa-si-bus from shared memory to sqlitedb git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@8302 594d385d-05f5-0310-b6e9-bd551577e9d8 --- gosa-si/gosa-si-bus | 833 +++++++++++++++------------ gosa-si/gosa-si-server | 297 +++++----- gosa-si/modules/DBsqlite.pm | 43 +- gosa-si/modules/GosaSupportDaemon.pm | 2 +- gosa-si/modules/ServerPackages.pm | 30 +- gosa-si/tests/client.php | 4 +- 6 files changed, 625 insertions(+), 584 deletions(-) diff --git a/gosa-si/gosa-si-bus b/gosa-si/gosa-si-bus index 90de439b5..bec214a3f 100755 --- a/gosa-si/gosa-si-bus +++ b/gosa-si/gosa-si-bus @@ -34,22 +34,20 @@ use Data::Dumper; use Sys::Syslog qw( :DEFAULT setlogsock); use Cwd; use File::Spec; -use IPC::Shareable qw( :lock); -IPC::Shareable->clean_up_all; +use GOSA::GosaSupportDaemon; +use GOSA::DBsqlite; +#use IPC::Shareable qw( :lock); +#IPC::Shareable->clean_up_all; my ($cfg_file, $default_cfg_file, %cfg_defaults, $foreground, $verbose); my ($bus_activ, $bus_passwd, $bus_ip, $bus_port, $bus_address, $bus, $bus_mac_address); my ($pid_file, $procid, $pid, $log_file, $my_own_address); my (%free_child, %busy_child, $child_max, $child_min, %child_alive_time, $child_timeout); -my ($xml, $bus_cipher, $known_daemons, $shmkh); +my ($bus_known_server_db, $bus_known_server_file_name); +my ($xml, $bus_cipher); $foreground = 0 ; -$known_daemons = {}; -$shmkh = tie($known_daemons, 'IPC::Shareable', undef, {create => 1, - exclusive => 1, - mode => 0666, - destroy => 1, - }); + %cfg_defaults = ("general" => {"log_file" => [\$log_file, "/var/run/".$0.".log"], @@ -57,7 +55,7 @@ $shmkh = tie($known_daemons, 'IPC::Shareable', undef, {create => 1, "child_max" => [\$child_max, 10], "child_min" => [\$child_min, 3], "child_timeout" => [\$child_timeout, 180], - + "bus_known_server_file_name" => [\$bus_known_server_file_name, "/var/lib/gosa-si/bus_known_server.db"] }, "bus" => {"bus_activ" => [\$bus_activ, "on"], @@ -228,7 +226,6 @@ sub sig_int_handler { print "$bus closed\n"; } print "$signal\n"; - IPC::Shareable->clean_up; exit(1); } $SIG{INT} = \&sig_int_handler; @@ -435,112 +432,137 @@ sub process_incoming_msg { $crypted_msg = $1; my $host = sprintf("%s.%s.%s.%s", $2, $3, $4, $5); - daemon_log("msg from host: $host", 1); - daemon_log("crypted_msg: $crypted_msg", 7); + my $msg; + my $msg_hash; + my $host_name; + my $host_key; + + # check wether incoming msg is a new msg + $host_name = $bus_address; + $host_key = $bus_passwd; + daemon_log("process_incoming_msg: host_name: $host_name", 7); + daemon_log("process_incoming_msg: host_key: $host_key", 7); + eval{ + my $key_cipher = &create_ciphering($host_key); + $msg = &decrypt_msg($crypted_msg, $key_cipher); + $msg_hash = &transform_msg2hash($msg); + }; + if($@) { + daemon_log("process_incoming_msg: deciphering raise error", 7); + daemon_log("$@", 8); + $msg = undef; + $msg_hash = undef; + $host_name = undef; + $host_key = undef; + } - my @valid_keys; - my @daemon_keys = keys %$known_daemons; - foreach my $daemon_key (@daemon_keys) { - if($daemon_key =~ "^$daemon_key") { - push(@valid_keys, $daemon_key); + # check wether incoming msg is from a bus_known_server + if( not defined $msg ) { + my $query_res = $bus_known_server_db->select_dbentry( {table=>'bus_known_server'} ); + while( my ($hit_num, $hit) = each %{ $query_res } ) { + $host_name = $hit->{hostname}; + if( not $host_name =~ "^$host") { + next; + } + $host_key = $hit->{hostkey}; + daemon_log("process_incoming_msg: host_name: $host_name", 7); + daemon_log("process_incoming_msg: host_key: $host_key", 7); + eval{ + my $key_cipher = &create_ciphering($host_key); + $msg = &decrypt_msg($crypted_msg, $key_cipher); + $msg_hash = &transform_msg2hash($msg); + }; + if($@) { + daemon_log("process_incoming_msg: deciphering raise error", 7); + daemon_log("$@", 8); + $msg = undef; + $msg_hash = undef; + $host_name = undef; + $host_key = undef; + } else { + last; + } } } - my $l = @valid_keys; - daemon_log("number of valid daemons: $l", 7); - - my ($msg, $msg_hash); - my $msg_flag = 0; - - # collect addresses from possible incoming clients - foreach my $host_key (@valid_keys) { - eval{ - daemon_log( "daemon: $host_key", 7); - my $key_passwd = $known_daemons->{$host_key}->{passwd}; - daemon_log("daemon_passwd: $key_passwd\n", 7); - my $key_cipher = &create_ciphering($key_passwd); - $msg = &decrypt_msg($crypted_msg, $key_cipher); - daemon_log("daemon decrypted msg:$msg", 7); - $msg_hash = $xml->XMLin($msg, ForceArray=>1); - }; - if($@) { - daemon_log("msg processing raise error", 7); - daemon_log("error string: $@", 7); - $msg_flag += 1; - } else { - last; - } - } - - if($msg_flag >= $l) { - daemon_log("\nERROR: do not understand the message:\n$msg" , 1); + if( not defined $msg ) { + daemon_log("WARNING: bus does not understand the message:", 5); return; } - my $header = &get_content_from_xml_hash($msg_hash, "header"); - my $target = &get_content_from_xml_hash($msg_hash, "target"); + # process incoming msg + my $header = @{$msg_hash->{header}}[0]; + my $source = @{$msg_hash->{source}}[0]; daemon_log("header from msg: $header", 1); - daemon_log("msg to process: $msg", 5); - daemon_log("msg is for: $target", 7); - - if($target eq $bus_address) { - # msg is for bus - if($header eq 'here_i_am'){ &here_i_am($msg_hash)} - elsif($header eq 'confirm_new_passwd'){ &confirm_new_passwd($msg_hash)} - elsif($header eq 'got_ping') { &got_ping($msg_hash)} - elsif($header eq 'ping') { &ping($msg_hash)} - elsif($header eq 'who_has') { &who_has($msg_hash)} - elsif($header eq 'new_client') { &new_client($msg_hash)} - elsif($header eq 'delete_client') { &delete_client($msg_hash)} - } else { - # msg is for any other server - my @targets = @{$msg_hash->{target}}; - my $len_targets = @targets; - - if ($len_targets == 0){ - # no targets specified - - daemon_log("ERROR: no target specified for msg $header", 1); - - } elsif ($targets[0] eq "*"){ - # all deamons in known_daemons are targets - - my $target = $targets[0]; - my $source = @{$msg_hash->{source}}[0]; - my @target_addresses = keys(%$known_daemons); - foreach my $target_address (@target_addresses) { - if ($target_address eq $source) { next; } - if ($target_address eq $bus_address) { next ; } - $msg_hash->{target} = [$target_address]; - &send_msg_hash2address($msg_hash, $target_address); + daemon_log("msg to process:", 5); + daemon_log($msg, 5); + + my @targets = @{$msg_hash->{target}}; + my $len_targets = @targets; + + if ($len_targets == 0){ + daemon_log("ERROR: no target specified for msg $header", 1); + + } elsif ($len_targets == 1){ + # we have only one target symbol + my $target = $targets[0]; + daemon_log("msg is for: $target", 7); + + if($target eq $bus_address) { + # msg is for bus + if($header eq 'here_i_am'){ &here_i_am($msg_hash)} + elsif($header eq 'confirm_new_passwd'){ &confirm_new_passwd($msg_hash)} + elsif($header eq 'got_ping') { &got_ping($msg_hash)} + elsif($header eq 'ping') { &ping($msg_hash)} + elsif($header eq 'who_has') { &who_has($msg_hash)} + elsif($header eq 'new_client') { &new_client($msg_hash)} + elsif($header eq 'delete_client') { &delete_client($msg_hash)} + + } elsif ($target eq "*"){ + # msg is for all server + my $query_res = $bus_known_server_db->select_dbentry( {table=>'known_server'} ); + while( my ($hit_num, $hit) = each %{ $query_res } ) { + $host_name = $hit->{hostname}; + $host_key = $hit->{hostkey}; + $msg_hash->{target} = [$host_name]; + &send_msg_hash2address($msg_hash, $host_name, $host_key); } + return; + } - } else { - # a list of targets is specified - - my $target_address; - foreach $target_address (@targets) { - if (exists $known_daemons->{$target_address}) { - &send_msg_hash2address($msg_hash, $target_address); - } else { - my @daemon_addresses = keys %$known_daemons; - my $daemon_address; - foreach $daemon_address (@daemon_addresses) { - if (exists $known_daemons->{$daemon_address}->{clients}->{$target_address}) { - my $header = &get_content_from_xml_hash($msg_hash, "header"); - &send_msg_hash2address($msg_hash, $daemon_address); - daemon_log("bus forwards msg $header for client $target_address to server $daemon_address", 3); - last; + } else { + # a list of targets is specified + my $target_address; + foreach $target_address (@targets) { + + my $query_res = $bus_known_server_db->select_dbentry( {table=>'known_server', hostname=>$target_address} ); + if( 1 == keys %{$query_res} ) { + $host_key = $query_res->{1}->{hostkey}; + &send_msg_hash2address($msg_hash, $target_address, $host_key); + next; + + } else { + $query_res = $bus_known_server_db->select_dbentry( {table=>'known_server'} ); + while( my ($hit_num, $hit) = each %{$query_res} ) { + my $host_name = $hit->{hostname}; + my $host_key = $hit->{hostkey}; + my $clients = $hit->{clients}; + my @clients = split(/,/, $clients); + foreach my $client (@clients) { + if( not $client eq $target_address ) { + next; } + $msg_hash->{target} = [ $target_address ]; + &send_msg_hash2address($msg_hash, $host_name, $host_key); + daemon_log("bus forwards msg $header for client $target_address to server $host_name", 3); + last; } - } } } } - #&print_known_daemons_hash(); return; } @@ -578,17 +600,15 @@ sub create_passwd { # RETURNS: cipher - object # DESCRIPTION: creates a Crypt::Rijndael::MODE_CBC object with passwd as key #=============================================================================== -sub create_ciphering { - my ($passwd) = @_; - $passwd = substr(md5_hex("$passwd") x 32, 0, 32); - my $iv = substr(md5_hex('GONICUS GmbH'),0, 16); - - #daemon_log("iv: $iv", 7); - #daemon_log("key: $passwd", 7); - my $my_cipher = Crypt::Rijndael->new($passwd , Crypt::Rijndael::MODE_CBC()); - $my_cipher->set_iv($iv); - return $my_cipher; -} +#sub create_ciphering { +# my ($passwd) = @_; +# $passwd = substr(md5_hex("$passwd") x 32, 0, 32); +# my $iv = substr(md5_hex('GONICUS GmbH'),0, 16); +# +# my $my_cipher = Crypt::Rijndael->new($passwd , Crypt::Rijndael::MODE_CBC()); +# $my_cipher->set_iv($iv); +# return $my_cipher; +#} #=== FUNCTION ================================================================ @@ -598,14 +618,14 @@ sub create_ciphering { # RETURNS: crypted_msg - string - crypted message # DESCRIPTION: crypts the incoming message with the Crypt::Rijndael module #=============================================================================== -sub encrypt_msg { - my ($msg, $my_cipher) = @_; - if(not defined $my_cipher) { print "no cipher object\n"; } - $msg = "\0"x(16-length($msg)%16).$msg; - my $crypted_msg = $my_cipher->encrypt($msg); - chomp($crypted_msg = &encode_base64($crypted_msg)); - return $crypted_msg; -} +#sub encrypt_msg { +# my ($msg, $my_cipher) = @_; +# if(not defined $my_cipher) { print "no cipher object\n"; } +# $msg = "\0"x(16-length($msg)%16).$msg; +# my $crypted_msg = $my_cipher->encrypt($msg); +# chomp($crypted_msg = &encode_base64($crypted_msg)); +# return $crypted_msg; +#} #=== FUNCTION ================================================================ @@ -615,13 +635,13 @@ sub encrypt_msg { # RETURNS: msg - string - decrypted message # DESCRIPTION: decrypts the incoming message with the Crypt::Rijndael module #=============================================================================== -sub decrypt_msg { - my ($crypted_msg, $my_cipher) = @_ ; - $crypted_msg = &decode_base64($crypted_msg); - my $msg = $my_cipher->decrypt($crypted_msg); - $msg =~ s/^\0*//g; - return $msg; -} +#sub decrypt_msg { +# my ($crypted_msg, $my_cipher) = @_ ; +# $crypted_msg = &decode_base64($crypted_msg); +# my $msg = $my_cipher->decrypt($crypted_msg); +# $msg =~ s/^\0*//g; +# return $msg; +#} #=== FUNCTION ================================================================ @@ -633,24 +653,24 @@ sub decrypt_msg { # RETURNS: hash - hash - nomen est omen # DESCRIPTION: creates a key-value hash, all values are stored in a array #=============================================================================== -sub create_xml_hash { - my ($header, $source, $target, $header_value) = @_ ; - - if (not defined $header || not defined $source || not defined $target) { - daemon_log("ERROR: create_xml_hash function is invoked with uncompleted parameters", 7); - } - - my $hash = { - header => [$header], - source => [$source], - target => [$target], - $header => [$header_value], - }; - #daemon_log("create_xml_hash:", 7), - #chomp(my $tmp = Dumper $hash); - #daemon_log("\t$tmp\n", 7); - return $hash -} +#sub create_xml_hash { +# my ($header, $source, $target, $header_value) = @_ ; +# +# if (not defined $header || not defined $source || not defined $target) { +# daemon_log("ERROR: create_xml_hash function is invoked with uncompleted parameters", 7); +# } +# +# my $hash = { +# header => [$header], +# source => [$source], +# target => [$target], +# $header => [$header_value], +# }; +# #daemon_log("create_xml_hash:", 7), +# #chomp(my $tmp = Dumper $hash); +# #daemon_log("\t$tmp\n", 7); +# return $hash +#} #=== FUNCTION ================================================================ @@ -659,12 +679,12 @@ sub create_xml_hash { # RETURNS: xml_string - string - xml string representation of the hash # DESCRIPTION: transform the hash to a string using XML::Simple module #=============================================================================== -sub create_xml_string { - my ($xml_hash) = @_ ; - my $xml_string = $xml->XMLout($xml_hash, RootName => 'xml'); - #$xml_string =~ s/[\n]+//g; - return $xml_string; -} +#sub create_xml_string { +# my ($xml_hash) = @_ ; +# my $xml_string = $xml->XMLout($xml_hash, RootName => 'xml'); +# #$xml_string =~ s/[\n]+//g; +# return $xml_string; +#} #=== FUNCTION ================================================================ @@ -675,15 +695,15 @@ sub create_xml_string { # RETURNS: nothing # DESCRIPTION: add key-value pair to xml_ref, if key alread exists, then append value to list #=============================================================================== -sub add_content2xml_hash { - my ($xml_ref, $element, $content) = @_; - if(not exists $$xml_ref{$element} ) { - $$xml_ref{$element} = []; - } - my $tmp = $$xml_ref{$element}; - push(@$tmp, $content); - return; -} +#sub add_content2xml_hash { +# my ($xml_ref, $element, $content) = @_; +# if(not exists $$xml_ref{$element} ) { +# $$xml_ref{$element} = []; +# } +# my $tmp = $$xml_ref{$element}; +# push(@$tmp, $content); +# return; +#} #=== FUNCTION ================================================================ @@ -694,14 +714,14 @@ sub add_content2xml_hash { # value - list - for all other keys in xml hash # DESCRIPTION: #=============================================================================== -sub get_content_from_xml_hash { - my ($xml_ref, $element) = @_; - my $result = $xml_ref->{$element}; - if( $element eq "header" || $element eq "target" || $element eq "source") { - return @$result[0]; - } - return @$result; -} +#sub get_content_from_xml_hash { +# my ($xml_ref, $element) = @_; +# my $result = $xml_ref->{$element}; +# if( $element eq "header" || $element eq "target" || $element eq "source") { +# return @$result[0]; +# } +# return @$result; +#} #=== FUNCTION ================================================================ @@ -711,23 +731,23 @@ sub get_content_from_xml_hash { # RETURNS: socket - IO::Socket::INET # DESCRIPTION: open a socket to PeerAddr #=============================================================================== -sub open_socket { - my ($PeerAddr, $PeerPort) = @_ ; - if(defined($PeerPort)){ - $PeerAddr = $PeerAddr.":".$PeerPort; - } - my $socket; - $socket = new IO::Socket::INET(PeerAddr => $PeerAddr , - Porto => "tcp" , - Type => SOCK_STREAM, - Reuse => 1, - Timeout => 5, - ); - if(not defined $socket) { - return; - } - return $socket; -} +#sub open_socket { +# my ($PeerAddr, $PeerPort) = @_ ; +# if(defined($PeerPort)){ +# $PeerAddr = $PeerAddr.":".$PeerPort; +# } +# my $socket; +# $socket = new IO::Socket::INET(PeerAddr => $PeerAddr , +# Porto => "tcp" , +# Type => SOCK_STREAM, +# Reuse => 1, +# Timeout => 5, +# ); +# if(not defined $socket) { +# return; +# } +# return $socket; +#} #=== FUNCTION ================================================================ @@ -769,39 +789,39 @@ sub read_from_socket { # RETURNS: nothing # DESCRIPTION: ???? #=============================================================================== -sub send_msg_hash2address { - my ($msg_hash, $address) = @_ ; - - # fetch header for logging - my $header = &get_content_from_xml_hash($msg_hash, "header"); - - # generate xml string - my $msg_xml = &create_xml_string($msg_hash); - - # fetch the appropriated passwd from hash - my $passwd = $known_daemons->{$address}->{passwd}; - - # create a ciphering object - my $act_cipher = &create_ciphering($passwd); - - # encrypt xml msg - my $crypted_msg = &encrypt_msg($msg_xml, $act_cipher); - - # open socket - my $socket = &open_socket($address); - if(not defined $socket){ - daemon_log("ERROR: cannot send '$header'-msg to $address , server not reachable", 1); - return; - } - - # send xml msg - print $socket $crypted_msg."\n"; - - close $socket; - daemon_log("send '$header'-msg to $address", 5); - daemon_log("crypted_msg:\n\t$crypted_msg", 7); - return; -} +#sub send_msg_hash2address { +# my ($msg_hash, $address) = @_ ; +# +# # fetch header for logging +# my $header = &get_content_from_xml_hash($msg_hash, "header"); +# +# # generate xml string +# my $msg_xml = &create_xml_string($msg_hash); +# +# # fetch the appropriated passwd from hash +# my $passwd = $known_daemons->{$address}->{passwd}; +# +# # create a ciphering object +# my $act_cipher = &create_ciphering($passwd); +# +# # encrypt xml msg +# my $crypted_msg = &encrypt_msg($msg_xml, $act_cipher); +# +# # open socket +# my $socket = &open_socket($address); +# if(not defined $socket){ +# daemon_log("ERROR: cannot send '$header'-msg to $address , server not reachable", 1); +# return; +# } +# +# # send xml msg +# print $socket $crypted_msg."\n"; +# +# close $socket; +# daemon_log("send '$header'-msg to $address", 5); +# daemon_log("crypted_msg:\n\t$crypted_msg", 7); +# return; +#} #=== FUNCTION ================================================================ @@ -810,48 +830,48 @@ sub send_msg_hash2address { # RETURNS: nothing # DESCRIPTION: send msg_hash to all registered daemons #=============================================================================== -sub send_msg_hash2all { - my ($msg_hash) = @_; - - # fetch header for logging - my $header = &get_content_from_xml_hash($msg_hash, "header"); - - # generate xml string - my $msg_xml = &create_xml_string($msg_hash); - - # fetch a list of all target addresses - my @targets = keys(%$known_daemons); - - # itterates through the list an send each the msg - foreach my $target (@targets) { - if($target eq $bus_address) {next}; # do not send msg to bus - - # fetch the appropriated passwd - my $passwd = $known_daemons->{$target}->{passwd}; - - # create ciphering object - my $act_cipher = &create_ciphering($passwd); - - # encrypt xml msg - my $crypted_msg = &encrypt_msg($msg_xml, $act_cipher); - - # open socket - my $socket = &open_socket($target); - if(not defined $socket){ - daemon_log("ERROR: cannot open socket to $target , server not reachable", 1); - &update_known_daemons_entry(hostname=>$target, status=>"down"); - next; - } - - # send xml msg - print $socket $crypted_msg."\n"; - - close $socket; - daemon_log("send '$header'-msg to $target", 5); - daemon_log("crypted_msg:\n\t$crypted_msg", 7); - } - return; -} +#sub send_msg_hash2all { +# my ($msg_hash) = @_; +# +# # fetch header for logging +# my $header = &get_content_from_xml_hash($msg_hash, "header"); +# +# # generate xml string +# my $msg_xml = &create_xml_string($msg_hash); +# +# # fetch a list of all target addresses +# my @targets = keys(%$known_daemons); +# +# # itterates through the list an send each the msg +# foreach my $target (@targets) { +# if($target eq $bus_address) {next}; # do not send msg to bus +# +# # fetch the appropriated passwd +# my $passwd = $known_daemons->{$target}->{passwd}; +# +# # create ciphering object +# my $act_cipher = &create_ciphering($passwd); +# +# # encrypt xml msg +# my $crypted_msg = &encrypt_msg($msg_xml, $act_cipher); +# +# # open socket +# my $socket = &open_socket($target); +# if(not defined $socket){ +# daemon_log("ERROR: cannot open socket to $target , server not reachable", 1); +# &update_known_daemons_entry(hostname=>$target, status=>"down"); +# next; +# } +# +# # send xml msg +# print $socket $crypted_msg."\n"; +# +# close $socket; +# daemon_log("send '$header'-msg to $target", 5); +# daemon_log("crypted_msg:\n\t$crypted_msg", 7); +# } +# return; +#} #=== FUNCTION ================================================================ @@ -862,21 +882,30 @@ sub send_msg_hash2all { #=============================================================================== sub here_i_am { my ($msg_hash) = @_ ; - my $source = &get_content_from_xml_hash($msg_hash, "source"); - - my $new_passwd = &create_passwd(); - - # create known_daemons entry - &create_known_daemons_entry($source); - &update_known_daemons_entry(hostname=>$source, status=>"registered", passwd=>$bus_passwd); + my $source = @{$msg_hash->{source}}[0];; + + my $new_key = &create_passwd(); + + # create bus_known_server entry + my $add_hash = { + table=>"bus_known_server", + primkey=>"hostname", + hostname=>$source, + status=>"registered", + hostkey=>$bus_passwd, + clients=>"", + }; + $bus_known_server_db->add_dbentry($add_hash); # create outgoing msg - my $out_hash = &create_xml_hash("new_passwd", "$bus_ip:$bus_port", $source, $new_passwd); - &send_msg_hash2address($out_hash, $source); + my $out_hash = &create_xml_hash("new_passwd", $bus_address, $source, $new_key); + &send_msg_hash2address($out_hash, $source, $bus_passwd); - # change passwd, reason - # &send_msg_hash2address takes $known_daemons->{"$source"}->{passwd} to cipher msg - &update_known_daemons_entry(hostname=>$source, status=>"new_passwd", passwd=>$new_passwd); + # change hostkey, reason + my $update_hash = { table=>'bus_known_server' }; + $update_hash->{where} = [ { hostname=>[$source] } ]; + $update_hash->{update} = [ { hostkey=>[$new_key] } ]; + $bus_known_server_db->update_dbentry($update_hash); return; } @@ -890,8 +919,13 @@ sub here_i_am { #=============================================================================== sub confirm_new_passwd { my ($msg_hash) = @_ ; - my $source = &get_content_from_xml_hash($msg_hash, "source"); - &update_known_daemons_entry(hostname=>$source, status=>"confirmed_new_passwd"); + my $source = @{$msg_hash->{source}}[0]; + + my $update_hash = { table=>'bus_known_server' }; + $update_hash->{where} = [ { hostname=>[$source] } ]; + $update_hash->{update} = [ { status=>['key_confirmed'] } ]; + $bus_known_server_db->update_dbentry($update_hash); + return; } @@ -904,10 +938,21 @@ sub confirm_new_passwd { #=============================================================================== sub ping { my ($msg_hash) = @_ ; - my $source = &get_content_from_xml_hash($msg_hash, "source"); - &update_known_daemons_entry(hostname=>$source, status=>"ping"); + my $header = @{$msg_hash->{header}}[0]; + my $source = @{$msg_hash->{source}}[0]; + + my $update_hash = { table=>'bus_known_server', + where=> [ { hostname=>[$source] } ], + update=> [ { status=>$header } ], + }; + $bus_known_server_db->update_dbentry($update_hash); + my $out_hash = &create_xml_hash("got_ping", $bus_address, $source); - &send_msg_hash2address($out_hash, $source); + + my $res = $bus_known_server_db->select_dbentry( { table=>'bus_known_server', hostname=>$source } ); + my $hostkey = $res->{1}->{hostkey}; + &send_msg_hash2address($out_hash, $source, $hostkey); + return; } @@ -918,13 +963,13 @@ sub ping { # RETURNS: nothing # DESCRIPTION: send ping message to address #=============================================================================== -sub make_ping { - my ($address) = @_; - daemon_log("ping:$address\n", 1); - my $out_hash = &create_xml_hash("ping", "$bus_ip:$bus_port", $address); - &send_msg_hash2address($out_hash, $address); - return; -} +#sub make_ping { +# my ($address) = @_; +# daemon_log("ping:$address\n", 1); +# my $out_hash = &create_xml_hash("ping", "$bus_ip:$bus_port", $address); +# &send_msg_hash2address($out_hash, $address); +# return; +#} #=== FUNCTION ================================================================ @@ -935,8 +980,14 @@ sub make_ping { #=============================================================================== sub got_ping { my ($msg_hash) = @_; - my $source = &get_content_from_xml_hash($msg_hash, "source"); - &update_known_daemons_entry(hostname=>$source, status=>"got_ping"); + my $source = @{$msg_hash->{source}}[0]; + + my $update_hash = { table=>'bus_known_server', + where=> [ { hostname=>[$source] } ], + update=> [ { status=>'got_ping' } ], + }; + $bus_known_server_db->update_dbentry($update_hash); + return; } @@ -949,11 +1000,26 @@ sub got_ping { #=============================================================================== sub new_client { my ($msg_hash) = @_ ; - my $source = &get_content_from_xml_hash($msg_hash, "source"); - my $header = &get_content_from_xml_hash($msg_hash, "header"); - my $new_client = (&get_content_from_xml_hash($msg_hash, $header))[0]; + my $source = @{$msg_hash->{source}}[0]; + my $header = @{$msg_hash->{header}}[0]; + my $new_client = @{$msg_hash->{$header}}[0]; - &update_known_daemons_entry(hostname=>$source, client=>$new_client); + my $res = $bus_known_server_db->select_dbentry( { table=>'bus_known_server', hostname=>$source } ); + my $clients = $res->{1}->{clients}; + + # if host has alread more clients, than just append + if( length($clients) != 0 ) { + $clients .= ",$new_client"; + } else { + $clients = $new_client; + } + + my $update_hash = { table=>'bus_known_server', + where=>[ {hostname=>[$source] } ], + update=>[ {clients=>[$clients] } ], + }; + + $bus_known_server_db->update_dbentry( $update_hash ); return; } @@ -964,19 +1030,19 @@ sub new_client { # RETURNS: nothing # DESCRIPTION: process this incoming message #=============================================================================== -sub delete_client { - my ($msg_hash) = @_ ; - my $source = &get_content_from_xml_hash($msg_hash, "source"); - my $header = &get_content_from_xml_hash($msg_hash, "header"); - my $del_client = (&get_content_from_xml_hash($msg_hash, $header))[0]; - - if (not exists $known_daemons->{$source}->{$del_client}) { - daemon_log - } - delete $known_daemons->{$source}->{$del_client}; - - return; -} +#sub delete_client { +# my ($msg_hash) = @_ ; +# my $source = &get_content_from_xml_hash($msg_hash, "source"); +# my $header = &get_content_from_xml_hash($msg_hash, "header"); +# my $del_client = (&get_content_from_xml_hash($msg_hash, $header))[0]; +# +# if (not exists $known_daemons->{$source}->{$del_client}) { +# daemon_log +# } +# delete $known_daemons->{$source}->{$del_client}; +# +# return; +#} #=== FUNCTION ================================================================ @@ -985,31 +1051,31 @@ sub delete_client { # RETURNS: nothing # DESCRIPTION: nome est omen #=============================================================================== -sub print_known_daemons_hash { - my ($tmp) = @_; - print "####################################\n"; - print "# status of known_daemons\n"; - my $hosts; - my $host_hash; - $shmkh->shlock(LOCK_EX); - my @hosts = keys %$known_daemons; - foreach my $host (@hosts) { - my $status = $known_daemons->{$host}->{status} ; - my $passwd = $known_daemons->{$host}->{passwd}; - my $timestamp = $known_daemons->{$host}->{timestamp}; - my @clients = keys %{$known_daemons->{$host}->{clients}}; - my $client_string = join(", ", @clients); - print "$host\n"; - print "\tstatus: $status\n"; - print "\tpasswd: $passwd\n"; - print "\ttimestamp: $timestamp\n"; - print "\tclients: $client_string\n"; - - } - $shmkh->shunlock(LOCK_EX); - print "####################################\n\n"; - return; -} +#sub print_known_daemons_hash { +# my ($tmp) = @_; +# print "####################################\n"; +# print "# status of known_daemons\n"; +# my $hosts; +# my $host_hash; +# $shmkh->shlock(LOCK_EX); +# my @hosts = keys %$known_daemons; +# foreach my $host (@hosts) { +# my $status = $known_daemons->{$host}->{status} ; +# my $passwd = $known_daemons->{$host}->{passwd}; +# my $timestamp = $known_daemons->{$host}->{timestamp}; +# my @clients = keys %{$known_daemons->{$host}->{clients}}; +# my $client_string = join(", ", @clients); +# print "$host\n"; +# print "\tstatus: $status\n"; +# print "\tpasswd: $passwd\n"; +# print "\ttimestamp: $timestamp\n"; +# print "\tclients: $client_string\n"; +# +# } +# $shmkh->shunlock(LOCK_EX); +# print "####################################\n\n"; +# return; +#} #=== FUNCTION ================================================================ @@ -1018,17 +1084,17 @@ sub print_known_daemons_hash { # RETURNS: nothing # DESCRIPTION: nome est omen #=============================================================================== -sub create_known_daemons_entry { - my ($hostname) = @_; - $shmkh->shlock(LOCK_EX); - $known_daemons->{$hostname} = {}; - $known_daemons->{$hostname}->{status} = "none"; - $known_daemons->{$hostname}->{passwd} = "none"; - $known_daemons->{$hostname}->{timestamp} = "none"; - $known_daemons->{$hostname}->{clients} = {}; - $shmkh->shunlock(LOCK_EX); - return; -} +#sub create_known_daemons_entry { +# my ($hostname) = @_; +# $shmkh->shlock(LOCK_EX); +# $known_daemons->{$hostname} = {}; +# $known_daemons->{$hostname}->{status} = "none"; +# $known_daemons->{$hostname}->{passwd} = "none"; +# $known_daemons->{$hostname}->{timestamp} = "none"; +# $known_daemons->{$hostname}->{clients} = {}; +# $shmkh->shunlock(LOCK_EX); +# return; +#} #=== FUNCTION ================================================================ @@ -1040,46 +1106,46 @@ sub create_known_daemons_entry { # RETURNS: nothing # DESCRIPTION: nome est omen and updates each time the timestamp of hostname #=============================================================================== -sub update_known_daemons_entry { - my $arg = { - hostname => undef, status => undef, passwd => undef, - client => undef, - @_ }; - my $hostname = $arg->{hostname}; - my $status = $arg->{status}; - my $passwd = $arg->{passwd}; - my $client = $arg->{client}; - - if (not defined $hostname) { - daemon_log("ERROR: function add_content2known_daemons is not invoked with requiered parameter 'hostname'", 1); - return; - } - - my ($seconds, $minutes, $hours, $monthday, $month, - $year, $weekday, $yearday, $sommertime) = localtime(time); - $hours = $hours < 10 ? $hours = "0".$hours : $hours; - $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; - $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; - $month+=1; - $month = $month < 10 ? $month = "0".$month : $month; - $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; - $year+=1900; - my $t = "$year$month$monthday$hours$minutes$seconds"; - - $shmkh->shlock(LOCK_EX); - if (defined $status) { - $known_daemons->{$hostname}->{status} = $status; - } - if (defined $passwd) { - $known_daemons->{$hostname}->{passwd} = $passwd; - } - if (defined $client) { - $known_daemons->{$hostname}->{clients}->{$client} = ""; - } - $known_daemons->{$hostname}->{timestamp} = $t; - $shmkh->shunlock(LOCK_EX); - return; -} +#sub update_known_daemons_entry { +# my $arg = { +# hostname => undef, status => undef, passwd => undef, +# client => undef, +# @_ }; +# my $hostname = $arg->{hostname}; +# my $status = $arg->{status}; +# my $passwd = $arg->{passwd}; +# my $client = $arg->{client}; +# +# if (not defined $hostname) { +# daemon_log("ERROR: function add_content2known_daemons is not invoked with requiered parameter 'hostname'", 1); +# return; +# } +# +# my ($seconds, $minutes, $hours, $monthday, $month, +# $year, $weekday, $yearday, $sommertime) = localtime(time); +# $hours = $hours < 10 ? $hours = "0".$hours : $hours; +# $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; +# $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; +# $month+=1; +# $month = $month < 10 ? $month = "0".$month : $month; +# $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; +# $year+=1900; +# my $t = "$year$month$monthday$hours$minutes$seconds"; +# +# $shmkh->shlock(LOCK_EX); +# if (defined $status) { +# $known_daemons->{$hostname}->{status} = $status; +# } +# if (defined $passwd) { +# $known_daemons->{$hostname}->{passwd} = $passwd; +# } +# if (defined $client) { +# $known_daemons->{$hostname}->{clients}->{$client} = ""; +# } +# $known_daemons->{$hostname}->{timestamp} = $t; +# $shmkh->shunlock(LOCK_EX); +# return; +#} #==== MAIN = main ============================================================== @@ -1116,6 +1182,12 @@ if( 0 != $pid ) { if( !$foreground ) { exit( 0 ) }; } +# connect to bus_known_server_db +my @server_col_names = ('hostname', 'status', 'hostkey', 'timestamp', 'clients' ); +$bus_known_server_db = GOSA::DBsqlite->new($bus_known_server_file_name); +$bus_known_server_db->create_table('bus_known_server', \@server_col_names); + + # detect own ip and mac address ($bus_ip, $bus_mac_address) = &get_ip_and_mac(); if (not defined $bus_ip) { @@ -1124,6 +1196,8 @@ if (not defined $bus_ip) { daemon_log("bus ip address detected: $bus_ip", 1); daemon_log("bus mac address detected: $bus_mac_address", 1); +# complete addresses +$bus_address = "$bus_ip:$bus_port"; # setup xml parser $xml = new XML::Simple(); @@ -1149,8 +1223,9 @@ if($bus_activ eq "on") { } # add bus to known_daemons -&create_known_daemons_entry($bus_address); -&update_known_daemons_entry(hostname=>$bus_address, status=>"bus", passwd=>$bus_passwd); + +#&create_known_daemons_entry($bus_address); +#&update_known_daemons_entry(hostname=>$bus_address, status=>"bus", passwd=>$bus_passwd); while(1) { diff --git a/gosa-si/gosa-si-server b/gosa-si/gosa-si-server index 6f54d2d06..520ba5e00 100755 --- a/gosa-si/gosa-si-server +++ b/gosa-si/gosa-si-server @@ -50,7 +50,7 @@ my (%cfg_defaults, $foreground, $verbose, $ping_timeout); my ($bus, $msg_to_bus, $bus_cipher); my ($server, $server_mac_address, $server_events); my ($gosa_server, $job_queue_timeout, $job_queue_table_name, $job_queue_file_name); -my ($known_daemons, $shmda, $known_clients, $shmcl, $known_modules, $known_clients_file_name, $known_server_file_name, $known_clients_db, $known_server_db); +my ($known_modules, $known_clients_file_name, $known_server_file_name); my ($max_clients); my ($pid_file, $procid, $pid, $log_file); my (%free_child, %busy_child, $child_max, $child_min, %child_alive_time, $child_timeout); @@ -94,12 +94,6 @@ our $job_db; # holds all other gosa-sd as well as the gosa-sd-bus our $known_server_db; -#our $known_daemons = {}; -#our $shmda = tie($known_daemons, 'IPC::Shareable', undef, {create => 1, -# exclusive => 1, -# mode => 0666, -# destroy => 1, -# }); # holds all registrated clients our $known_clients_db; @@ -642,50 +636,50 @@ sub read_from_socket { # RETURNS: nothing # DESCRIPTION: nome est omen and updates each time the timestamp of hostname #=============================================================================== -sub add_content2known_daemons { - my $arg = { - hostname => undef, status => undef, passwd => undef, - mac_address => undef, events => undef, - @_ }; - my $hostname = $arg->{hostname}; - my $status = $arg->{status}; - my $passwd = $arg->{passwd}; - my $mac_address = $arg->{mac_address}; - my $events = $arg->{events}; - - if (not defined $hostname) { - daemon_log("ERROR: function add_content2known_daemons is not invoked with requiered parameter 'hostname'", 1); - return; - } - - my ($seconds, $minutes, $hours, $monthday, $month, - $year, $weekday, $yearday, $sommertime) = localtime(time); - $hours = $hours < 10 ? $hours = "0".$hours : $hours; - $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; - $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; - $month+=1; - $month = $month < 10 ? $month = "0".$month : $month; - $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; - $year+=1900; - my $t = "$year$month$monthday$hours$minutes$seconds"; - - $shmda->shlock(LOCK_EX); - if (defined $status) { - $known_daemons->{$hostname}->{status} = $status; - } - if (defined $passwd) { - $known_daemons->{$hostname}->{passwd} = $passwd; - } - if (defined $mac_address) { - $known_daemons->{$hostname}->{mac_address} = $mac_address; - } - if (defined $events) { - $known_daemons->{$hostname}->{events} = $events; - } - $known_daemons->{$hostname}->{timestamp} = $t; - $shmda->shlock(LOCK_EX); - return; -} +#sub add_content2known_daemons { +# my $arg = { +# hostname => undef, status => undef, passwd => undef, +# mac_address => undef, events => undef, +# @_ }; +# my $hostname = $arg->{hostname}; +# my $status = $arg->{status}; +# my $passwd = $arg->{passwd}; +# my $mac_address = $arg->{mac_address}; +# my $events = $arg->{events}; +# +# if (not defined $hostname) { +# daemon_log("ERROR: function add_content2known_daemons is not invoked with requiered parameter 'hostname'", 1); +# return; +# } +# +# my ($seconds, $minutes, $hours, $monthday, $month, +# $year, $weekday, $yearday, $sommertime) = localtime(time); +# $hours = $hours < 10 ? $hours = "0".$hours : $hours; +# $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; +# $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; +# $month+=1; +# $month = $month < 10 ? $month = "0".$month : $month; +# $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; +# $year+=1900; +# my $t = "$year$month$monthday$hours$minutes$seconds"; +# +# $shmda->shlock(LOCK_EX); +# if (defined $status) { +# $known_daemons->{$hostname}->{status} = $status; +# } +# if (defined $passwd) { +# $known_daemons->{$hostname}->{passwd} = $passwd; +# } +# if (defined $mac_address) { +# $known_daemons->{$hostname}->{mac_address} = $mac_address; +# } +# if (defined $events) { +# $known_daemons->{$hostname}->{events} = $events; +# } +# $known_daemons->{$hostname}->{timestamp} = $t; +# $shmda->shlock(LOCK_EX); +# return; +#} #=== FUNCTION ================================================================ @@ -697,41 +691,41 @@ sub add_content2known_daemons { # RETURNS: nothing # DESCRIPTION: nome est omen and updates each time the timestamp of hostname #=============================================================================== -sub update_known_daemons { - my $arg = { - hostname => undef, status => undef, passwd => undef, - @_ }; - my $hostname = $arg->{hostname}; - my $status = $arg->{status}; - my $passwd = $arg->{passwd}; - - if (not defined $hostname) { - daemon_log("ERROR: function add_content2known_daemons is not invoked with requiered parameter 'hostname'", 1); - return; - } - - my ($seconds, $minutes, $hours, $monthday, $month, - $year, $weekday, $yearday, $sommertime) = localtime(time); - $hours = $hours < 10 ? $hours = "0".$hours : $hours; - $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; - $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; - $month+=1; - $month = $month < 10 ? $month = "0".$month : $month; - $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; - $year+=1900; - my $t = "$year$month$monthday$hours$minutes$seconds"; - - $shmda->shlock(LOCK_EX); - if (defined $status) { - $known_daemons->{$hostname}->{status} = $status; - } - if (defined $passwd) { - $known_daemons->{$hostname}->{passwd} = $passwd; - } - $known_daemons->{$hostname}->{timestamp} = $t; - $shmda->shunlock(LOCK_EX); - return; -} +#sub update_known_daemons { +# my $arg = { +# hostname => undef, status => undef, passwd => undef, +# @_ }; +# my $hostname = $arg->{hostname}; +# my $status = $arg->{status}; +# my $passwd = $arg->{passwd}; +# +# if (not defined $hostname) { +# daemon_log("ERROR: function add_content2known_daemons is not invoked with requiered parameter 'hostname'", 1); +# return; +# } +# +# my ($seconds, $minutes, $hours, $monthday, $month, +# $year, $weekday, $yearday, $sommertime) = localtime(time); +# $hours = $hours < 10 ? $hours = "0".$hours : $hours; +# $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; +# $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; +# $month+=1; +# $month = $month < 10 ? $month = "0".$month : $month; +# $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; +# $year+=1900; +# my $t = "$year$month$monthday$hours$minutes$seconds"; +# +# $shmda->shlock(LOCK_EX); +# if (defined $status) { +# $known_daemons->{$hostname}->{status} = $status; +# } +# if (defined $passwd) { +# $known_daemons->{$hostname}->{passwd} = $passwd; +# } +# $known_daemons->{$hostname}->{timestamp} = $t; +# $shmda->shunlock(LOCK_EX); +# return; +#} #=== FUNCTION ================================================================ @@ -789,14 +783,6 @@ sub create_known_client { daemon_log("ERROR: cannot add entry to known_clients.db: $res", 1); } -# $shmcl->shlock(LOCK_EX); -# $known_clients->{$hostname} = {}; -# $known_clients->{$hostname}->{status} = "none"; -# $known_clients->{$hostname}->{passwd} = "none"; -# $known_clients->{$hostname}->{timestamp} = "none"; -# $known_clients->{$hostname}->{mac_address} = "none"; -# $known_clients->{$hostname}->{events} = "none"; -# $shmcl->shunlock(LOCK_EX); return; } @@ -812,56 +798,45 @@ sub create_known_client { # RETURNS: nothing # DESCRIPTION: nome est omen and updates each time the timestamp of hostname #=============================================================================== -sub update_known_clients { - my $arg = { - hostname => undef, status => undef, hostkey => undef, - macaddress => undef, events => undef, timestamp=>undef, - @_ }; - my $hostname = $arg->{hostname}; - my $status = $arg->{status}; - my $hostkey = $arg->{hostkey}; - my $macaddress = $arg->{macaddress}; - my $events = $arg->{events}; - my $timestamp = $arg->{timestamp}; - - if (not defined $hostname) { - daemon_log("ERROR: function add_content2known_clients is not invoked with requiered parameter 'hostname'", 1); - return; - } - - my ($seconds, $minutes, $hours, $monthday, $month, - $year, $weekday, $yearday, $sommertime) = localtime(time); - $hours = $hours < 10 ? $hours = "0".$hours : $hours; - $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; - $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; - $month+=1; - $month = $month < 10 ? $month = "0".$month : $month; - $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; - $year+=1900; - my $t = "$year$month$monthday$hours$minutes$seconds"; - - my $change_entry = { table=>'known_clients', - where=>'hostname', - timestamp=>$t, - }; - - - if (defined $status) { - $change_entry->{status} = $status; - } - if (defined $hostkey) { - $change_entry->{hostkey} = $hostkey; - } - if (defined $macaddress) { - $change_entry->{macaddress} = $macaddress; - } - if (defined $events) { - $change_entry->{events} = $events; - } - - $known_clients->change_dbentry($change_entry); - return; -} +#sub update_known_clients { +# my $arg = { +# hostname => undef, status => undef, hostkey => undef, +# macaddress => undef, events => undef, timestamp=>undef, +# @_ }; +# my $hostname = $arg->{hostname}; +# my $status = $arg->{status}; +# my $hostkey = $arg->{hostkey}; +# my $macaddress = $arg->{macaddress}; +# my $events = $arg->{events}; +# my $timestamp = $arg->{timestamp}; +# +# if (not defined $hostname) { +# daemon_log("ERROR: function add_content2known_clients is not invoked with requiered parameter 'hostname'", 1); +# return; +# } +# +# my $change_entry = { table=>'known_clients', +# where=>'hostname', +# timestamp=>&get_time, +# }; +# +# +# if (defined $status) { +# $change_entry->{status} = $status; +# } +# if (defined $hostkey) { +# $change_entry->{hostkey} = $hostkey; +# } +# if (defined $macaddress) { +# $change_entry->{macaddress} = $macaddress; +# } +# if (defined $events) { +# $change_entry->{events} = $events; +# } +# +# $known_clients->change_dbentry($change_entry); +# return; +#} #=== FUNCTION ================================================================ @@ -870,23 +845,23 @@ sub update_known_clients { # RETURNS: # DESCRIPTION: #=============================================================================== -sub clean_up_known_clients { - my ($address) = @_ ; - - if (not exists $known_clients->{$address}) { - daemon_log("cannot prune known_clients from $address, client not known", 5); - return; - } - - delete $known_clients->{$address}; - - # send bus a msg that address was deleted from known_clients - my $out_hash = &create_xml_hash('delete_client', $server_address, $bus_address, $address); - &send_msg_hash2bus($out_hash); - - daemon_log("client $address deleted from known_clients because of multiple down time", 3); - return; -} +#sub clean_up_known_clients { +# my ($address) = @_ ; +# +# if (not exists $known_clients->{$address}) { +# daemon_log("cannot prune known_clients from $address, client not known", 5); +# return; +# } +# +# delete $known_clients->{$address}; +# +# # send bus a msg that address was deleted from known_clients +# my $out_hash = &create_xml_hash('delete_client', $server_address, $bus_address, $address); +# &send_msg_hash2bus($out_hash); +# +# daemon_log("client $address deleted from known_clients because of multiple down time", 3); +# return; +#} #=== FUNCTION ================================================================ diff --git a/gosa-si/modules/DBsqlite.pm b/gosa-si/modules/DBsqlite.pm index 840bce0d6..5bee915c4 100644 --- a/gosa-si/modules/DBsqlite.pm +++ b/gosa-si/modules/DBsqlite.pm @@ -52,6 +52,11 @@ sub add_dbentry { if ( ( defined $primkey ) && ( not $arg->{ $primkey } ) ) { return 2; } + + # if timestamp is not provided, add timestamp + if( not exists $arg->{timestamp} ) { + $arg->{timestamp} = &get_time; + } # check wether primkey is unique in table, otherwise return errorflag 3 my $res = @{ $obj->{dbh}->selectall_arrayref( "SELECT * FROM $table WHERE $primkey='$arg->{$primkey}'") }; @@ -93,30 +98,6 @@ sub add_dbentry { } } -# # check wether primkey is unique in table, otherwise return errorflag 3 -# if ( defined $primkey ) { -# my $res = @{ $obj->{dbh}->selectall_arrayref( "SELECT * FROM $table WHERE $primkey='$arg->{$primkey}'") }; -# if ($res != 0) { -# return 3; -# } -# } -# -# # fetch column names of table -# my $col_names = $obj->get_table_columns($table); -# -# # assign values to column name variables -# my @add_list; -# foreach my $col_name (@{$col_names}) { -# # use function parameter for column values -# if (exists $arg->{$col_name}) { -# push(@add_list, $arg->{$col_name}); -# } -# } -# -# my $sql_statement = " INSERT INTO $table VALUES ('".join("', '", @add_list)."')"; -# my $db_res = $obj->{dbh}->do($sql_statement); -# return 0; - } @@ -296,4 +277,18 @@ sub exec_statement { return \@res; } +sub get_time { + my ($seconds, $minutes, $hours, $monthday, $month, + $year, $weekday, $yearday, $sommertime) = localtime(time); + $hours = $hours < 10 ? $hours = "0".$hours : $hours; + $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; + $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; + $month+=1; + $month = $month < 10 ? $month = "0".$month : $month; + $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; + $year+=1900; + return "$year$month$monthday$hours$minutes$seconds"; +} + + 1; diff --git a/gosa-si/modules/GosaSupportDaemon.pm b/gosa-si/modules/GosaSupportDaemon.pm index bb3a30581..023876991 100644 --- a/gosa-si/modules/GosaSupportDaemon.pm +++ b/gosa-si/modules/GosaSupportDaemon.pm @@ -69,7 +69,7 @@ sub transform_msg2hash { # RETURNS: nothing # DESCRIPTION: ???? #=============================================================================== -sub send_msg_hash2address { +sub send_msg_hash2address ($$$){ my ($msg_hash, $address, $passwd) = @_ ; # fetch header for logging diff --git a/gosa-si/modules/ServerPackages.pm b/gosa-si/modules/ServerPackages.pm index ea9632d1e..803a95614 100644 --- a/gosa-si/modules/ServerPackages.pm +++ b/gosa-si/modules/ServerPackages.pm @@ -407,14 +407,15 @@ sub process_incoming_msg { } else { # msg is for one host - my $query_res = $main::known_clients_db->select_dbentry( {table=>'known_clients', hostname=>$target} ); + my $query_res; + $query_res = $main::known_clients_db->select_dbentry( {table=>'known_clients', hostname=>$target} ); if( 1 == keys %{$query_res} ) { $host_key = $query_res->{1}->{host_key}; &send_msg_hash2address($msg_hash, $target, $host_key); return; } - my $query_res = $main::known_server_db->select_dbentry( {table=>'known_server', hostname=>$target} ); + $query_res = $main::known_server_db->select_dbentry( {table=>'known_server', hostname=>$target} ); if( 1 == keys %{$query_res} ) { $host_key = $query_res->{1}->{host_key}; &send_msg_hash2address($msg_hash, $target, $host_key); @@ -571,18 +572,8 @@ sub here_i_am { hostkey=>$new_passwd, timestamp=>&get_time, } ); -# if ($res == 3) { -# my $update_hash = { table=>'known_clients' }; -# $update_hash->{where} = [ { hostname=>[$source] } ]; -# $update_hash->{update} = [ { events=>[$events], -# macaddress=>[$mac_address], -# status=>['registered'], -# hostkey=>[$new_passwd], -# timestamp=>[&get_time], -# } ]; -# $res = $main::known_clients_db->update_dbentry( $update_hash ); -# } - if ($res != 1) { + + if ($res != 0) { &main::daemon_log("ERROR: cannot add entry to known_clients: $res"); return; } @@ -593,9 +584,15 @@ sub here_i_am { # notify registered client to bus if( $bus_activ eq "on") { - &main::daemon_log("send bus msg that client '$source' has registerd at server '$server_address'", 3); + # fetch actual bus key + my $query_res = $main::known_server_db->select_dbentry( {table=>'known_server'} ); + my $hostkey = $query_res->{1}->{hostkey}; + + # send update msg to bus $out_hash = &create_xml_hash("new_client", $server_address, $bus_address, $source); - &send_msg_hash2address($out_hash, $bus_address); + &send_msg_hash2address($out_hash, $bus_address, $hostkey); + + &main::daemon_log("send bus msg that client '$source' has registerd at server '$server_address'", 3); } # give the new client his ldap config @@ -667,7 +664,6 @@ sub new_ldap_config { 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); - my $tmp = print Dumer $res; } my $macaddress = $res->{1}->{macaddress}; diff --git a/gosa-si/tests/client.php b/gosa-si/tests/client.php index 0384e9535..03509692c 100755 --- a/gosa-si/tests/client.php +++ b/gosa-si/tests/client.php @@ -12,7 +12,7 @@ if($sock->connected()){ /* Prepare a hunge bunch of data to be send */ # add - #$data = "
gosa_ping
10.89.1.155:2008211:22:33:44:55
"; + $data = "
gosa_ping
10.89.1.155:2008210.89.1.155:20080
"; #$data = "
job_ping
10.89.1.155:2008300:1B:77:04:8A:6C 19700101000000
"; #$data = "
job_sayHello
10.89.1.155:2008300:1B:77:04:8A:6C 20130102133900
"; #$data = "
job_ping
10.89.1.155:2008300:1B:77:04:8A:6C 20130102133900
"; @@ -29,7 +29,7 @@ if($sock->connected()){ #$data = "
gosa_query_jobdb
statuswaiting
"; # clear - $data = "
gosa_clear_jobdb
"; + #$data = "
gosa_clear_jobdb
"; $sock->write($data); -- 2.30.2