X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fgosa-si-server;h=e40768d456d1abd2ecfe3d11b44d15d4250aef96;hb=db4ee12e76d797fcb59ee9860c27a5c8a28edc4b;hp=e7ae82f0ea03ba1b0d79832fc3834fded0b744ac;hpb=a8d023f96217e8d374f88d9953de3f96200aa405;p=gosa.git diff --git a/gosa-si/gosa-si-server b/gosa-si/gosa-si-server index e7ae82f0e..e40768d45 100755 --- a/gosa-si/gosa-si-server +++ b/gosa-si/gosa-si-server @@ -68,7 +68,6 @@ our $prg= basename($0); our $global_kernel; my ($foreground, $ping_timeout); -my ($bus_activ, $bus, $msg_to_bus, $bus_cipher); my ($server); my ($gosa_server, $job_queue_timeout, $job_queue_loop_delay); my ($messaging_db_loop_delay); @@ -92,9 +91,7 @@ our (%cfg_defaults, $log_file, $pid_file, # additional variable which should be globaly accessable our $server_address; our $server_mac_address; -our $bus_address; our $gosa_address; -our $no_bus; our $no_arp; our $verbose; our $forground; @@ -111,8 +108,6 @@ $foreground = 0 ; # specifies the timeout seconds while checking the online status of a registrating client $ping_timeout = 5; -$no_bus = 0; -$bus_activ = "true"; $no_arp = 0; my $packages_list_under_construction = "/tmp/packages_list_creation_in_progress"; my @packages_list_statements; @@ -147,7 +142,7 @@ my @job_queue_col_names = ("id INTEGER PRIMARY KEY", "plainname DEFAULT 'none'", ); -# holds all other gosa-sd as well as the gosa-sd-bus +# holds all other gosa-si-server our $known_server_db; our $known_server_tn = "known_server"; my $known_server_file_name; @@ -211,9 +206,6 @@ my $max_children = 2; "log-file" => [\$log_file, "/var/run/".$prg.".log"], "pid-file" => [\$pid_file, "/var/run/".$prg.".pid"], }, -"bus" => { - "activ" => [\$bus_activ, "true"], - }, "server" => { "port" => [\$server_port, "20081"], "known-clients" => [\$known_clients_file_name, '/var/lib/gosa-si/clients.db' ], @@ -268,7 +260,6 @@ usage: $prg [-hvf] [-c config] -c : config file -f : foreground, process will not be forked to background -v : be verbose (multiple to increase verbosity) - -no-bus : starts $prg without connection to bus -no-arp : starts $prg without connection to arp module EOF @@ -819,33 +810,34 @@ sub open_socket { } +# moved to GosaSupportDaemon: 03-06-2008: rettenbe #=== FUNCTION ================================================================ # NAME: get_ip # PARAMETERS: interface name (i.e. eth0) # RETURNS: (ip address) # DESCRIPTION: Uses ioctl to get ip address directly from system. #=============================================================================== -sub get_ip { - my $ifreq= shift; - my $result= ""; - my $SIOCGIFADDR= 0x8915; # man 2 ioctl_list - my $proto= getprotobyname('ip'); - - socket SOCKET, PF_INET, SOCK_DGRAM, $proto - or die "socket: $!"; - - if(ioctl SOCKET, $SIOCGIFADDR, $ifreq) { - my ($if, $sin) = unpack 'a16 a16', $ifreq; - my ($port, $addr) = sockaddr_in $sin; - my $ip = inet_ntoa $addr; - - if ($ip && length($ip) > 0) { - $result = $ip; - } - } - - return $result; -} +#sub get_ip { +# my $ifreq= shift; +# my $result= ""; +# my $SIOCGIFADDR= 0x8915; # man 2 ioctl_list +# my $proto= getprotobyname('ip'); +# +# socket SOCKET, PF_INET, SOCK_DGRAM, $proto +# or die "socket: $!"; +# +# if(ioctl SOCKET, $SIOCGIFADDR, $ifreq) { +# my ($if, $sin) = unpack 'a16 a16', $ifreq; +# my ($port, $addr) = sockaddr_in $sin; +# my $ip = inet_ntoa $addr; +# +# if ($ip && length($ip) > 0) { +# $result = $ip; +# } +# } +# +# return $result; +#} sub get_local_ip_for_remote_ip { @@ -1029,7 +1021,7 @@ sub msg_to_decrypt { # msg is from a new client or gosa ($msg, $msg_hash, $module) = &input_from_unknown_host($next_msg, $session_id); - # msg is from a gosa-si-server or gosa-si-bus + # msg is from a gosa-si-server if(( !$msg ) || ( !$msg_hash ) || ( !$module )){ ($msg, $msg_hash, $module) = &input_from_known_server($next_msg, $heap->{'remote_ip'}, $session_id); } @@ -1062,11 +1054,22 @@ sub msg_to_decrypt { my $done = 0; my $sql; my $res; + # check whether this message should be processed here if ($error == 0) { $header = @{$msg_hash->{'header'}}[0]; $target = @{$msg_hash->{'target'}}[0]; $source = @{$msg_hash->{'source'}}[0]; + my $not_found_in_known_clients_db = 0; + my $not_found_in_known_server_db = 0; + my $not_found_in_foreign_clients_db = 0; + my $local_address; + my ($target_ip, $target_port) = split(':', $target); + if ($target =~ /^\d+\.\d+\.\d+\.\d+:\d+$/) { + $local_address = &get_local_ip_for_remote_ip($target_ip).":$server_port"; + } else { + $local_address = $server_address; + } # target and source is equal to GOSA -> process here if (not $done) { @@ -1077,70 +1080,70 @@ sub msg_to_decrypt { # target is own address without forward_to_gosa-tag -> process here if (not $done) { - if (($target eq $server_address) && (not exists $msg_hash->{'forward_to_gosa'})) { + if (($target eq $local_address) && (not exists $msg_hash->{'forward_to_gosa'})) { $done = 1; if ($source eq "GOSA") { - $msg =~ s/<\/xml>/$server_address,$session_id<\/forward_to_gosa><\/xml>/; + $msg =~ s/<\/xml>/$local_address,$session_id<\/forward_to_gosa><\/xml>/; } - print STDERR "target is own address without forward_to_gosa-tag -> process here\n"; + #print STDERR "target is own address without forward_to_gosa-tag -> process here\n"; } } # target is a client address in known_clients -> process here - if (not $done) { - $sql = "SELECT * FROM $known_clients_tn WHERE (hostname='$target' OR macaddress LIKE '$target')"; - $res = $known_clients_db->select_dbentry($sql); - if (keys(%$res) > 0) { - $done = 1; - my $hostname = $res->{1}->{'hostname'}; - $msg =~ s/$target<\/target>/$hostname<\/target>/; - print STDERR "target is a client address in known_clients -> process here\n"; - } - } - + if (not $done) { + $sql = "SELECT * FROM $known_clients_tn WHERE (hostname='$target' OR macaddress LIKE '$target')"; + $res = $known_clients_db->select_dbentry($sql); + if (keys(%$res) > 0) { + $done = 1; + my $hostname = $res->{1}->{'hostname'}; + $msg =~ s/$target<\/target>/$hostname<\/target>/; + #print STDERR "target is a client address in known_clients -> process here\n"; + } else { + $not_found_in_known_clients_db = 1; + } + } + # target ist own address with forward_to_gosa-tag not pointing to myself -> process here if (not $done) { my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0]; my $gosa_at; my $gosa_session_id; - if (($target eq $server_address) && (defined $forward_to_gosa)){ + if (($target eq $local_address) && (defined $forward_to_gosa)){ my ($gosa_at, $gosa_session_id) = split(/,/, $forward_to_gosa); - if ($gosa_at ne $server_address) { + if ($gosa_at ne $local_address) { $done = 1; - print STDERR "target is own address with forward_to_gosa-tag not pointing to myself -> process here\n"; + #print STDERR "target is own address with forward_to_gosa-tag not pointing to myself -> process here\n"; } } } # if message should be processed here -> add message to incoming_db - if ($done) { - - # if a job or a gosa message comes from a foreign server, fake module to GosaPackages - # so gosa-si-server knows how to process this kind of messages - if ($header =~ /^gosa_/ || $header =~ /job_/) { - $module = "GosaPackages"; - } - - my $res = $incoming_db->add_dbentry( {table=>$incoming_tn, - primkey=>[], - headertag=>$header, - targettag=>$target, - xmlmessage=>$msg, - timestamp=>&get_time, - module=>$module, - sessionid=>$session_id, - } ); + if ($done) { + # if a job or a gosa message comes from a foreign server, fake module to GosaPackages + # so gosa-si-server knows how to process this kind of messages + if ($header =~ /^gosa_/ || $header =~ /job_/) { + $module = "GosaPackages"; + } - } + my $res = $incoming_db->add_dbentry( {table=>$incoming_tn, + primkey=>[], + headertag=>$header, + targettag=>$target, + xmlmessage=>&encode_base64($msg), + timestamp=>&get_time, + module=>$module, + sessionid=>$session_id, + } ); + } # target is own address with forward_to_gosa-tag pointing at myself -> forward to gosa if (not $done) { my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0]; my $gosa_at; my $gosa_session_id; - if (($target eq $server_address) && (defined $forward_to_gosa)){ + if (($target eq $local_address) && (defined $forward_to_gosa)){ my ($gosa_at, $gosa_session_id) = split(/,/, $forward_to_gosa); - if ($gosa_at eq $server_address) { + if ($gosa_at eq $local_address) { my $session_reference = $kernel->ID_id_to_session($gosa_session_id); if( defined $session_reference ) { $heap = $session_reference->get_heap(); @@ -1150,7 +1153,7 @@ sub msg_to_decrypt { $heap->{'client'}->put($msg); } $done = 1; - print STDERR "target is own address with forward_to_gosa-tag pointing at myself -> forward to gosa\n"; + #print STDERR "target is own address with forward_to_gosa-tag pointing at myself -> forward to gosa\n"; } } @@ -1167,16 +1170,18 @@ sub msg_to_decrypt { my $res = $known_server_db->select_dbentry($sql); if (keys(%$res) > 0) { my $regserver_key = $res->{1}->{'hostkey'}; - $msg =~ s/GOSA<\/source>/$server_address<\/source>/; + $msg =~ s/GOSA<\/source>/$local_address<\/source>/; $msg =~ s/$target<\/target>/$hostname<\/target>/; if ($source eq "GOSA") { - $msg =~ s/<\/xml>/$server_address,$session_id<\/forward_to_gosa><\/xml>/; + $msg =~ s/<\/xml>/$local_address,$session_id<\/forward_to_gosa><\/xml>/; } &send_msg_to_target($msg, $regserver, $regserver_key, $header, $session_id); } $done = 1; - print STDERR "target is a client address in foreign_clients -> forward to registration server\n"; - } + #print STDERR "target is a client address in foreign_clients -> forward to registration server\n"; + } else { + $not_found_in_foreign_clients_db = 1; + } } # target is a server address -> forward to server @@ -1187,22 +1192,54 @@ sub msg_to_decrypt { my $hostkey = $res->{1}->{'hostkey'}; if ($source eq "GOSA") { - $msg =~ s/GOSA<\/source>/$server_address<\/source>/; - $msg =~ s/<\/xml>/$server_address,$session_id<\/forward_to_gosa><\/xml>/; + $msg =~ s/GOSA<\/source>/$local_address<\/source>/; + $msg =~ s/<\/xml>/$local_address,$session_id<\/forward_to_gosa><\/xml>/; } &send_msg_to_target($msg, $target, $hostkey, $header, $session_id); $done = 1; - print STDERR "target is a server address -> forward to server\n"; - } + #print STDERR "target is a server address -> forward to server\n"; + } else { + $not_found_in_known_server_db = 1; + } + } + + # target is not in foreign_clients_db, known_server_db or known_clients_db, maybe it is a complete new one -> process here + if ( $not_found_in_foreign_clients_db + && $not_found_in_known_server_db + && $not_found_in_known_clients_db) { + my $res = $incoming_db->add_dbentry( {table=>$incoming_tn, + primkey=>[], + headertag=>$header, + targettag=>$target, + xmlmessage=>&encode_base64($msg), + timestamp=>&get_time, + module=>$module, + sessionid=>$session_id, + } ); + $done = 1; + } - } if (not $done) { daemon_log("$session_id ERROR: do not know what to do with this message: $msg", 1); + if ($source eq "GOSA") { + my %data = ('error_msg' => &encode_base64($msg), 'error_string' => "Do not know what to do with this message!"); + my $error_msg = &build_msg("error", $local_address, "GOSA", \%data ); + + my $session_reference = $kernel->ID_id_to_session($session_id); + if( defined $session_reference ) { + $heap = $session_reference->get_heap(); + } + if(exists $heap->{'client'}) { + $error_msg = &encrypt_msg($error_msg, $GosaPackages_key); + $heap->{'client'}->put($error_msg); + } + } } + } return; @@ -1259,7 +1296,8 @@ sub process_task { my $client_answer = ""; # prepare all variables needed to process message - my $msg = $task->{'xmlmessage'}; + #my $msg = $task->{'xmlmessage'}; + my $msg = &decode_base64($task->{'xmlmessage'}); my $incoming_id = $task->{'id'}; my $module = $task->{'module'}; my $header = $task->{'headertag'}; @@ -1374,19 +1412,6 @@ sub process_task { } if( $found_ip_flag == 0) { daemon_log("$session_id WARNING: no host found in known_clients with mac address '$answer_target'", 3); - if( $bus_activ eq "true" ) { - daemon_log("$session_id INFO: try to forward msg '$answer_header' to bus '$bus_address'", 5); - my $sql_statement = "SELECT * FROM known_server WHERE hostname='$bus_address'"; - my $query_res = $known_server_db->select_dbentry( $sql_statement ); - while( my ($hit_num, $hit) = each %{ $query_res } ) { - my $bus_address = $hit->{hostname}; - my $bus_key = $hit->{hostkey}; - my $error = &send_msg_to_target($answer, $bus_address, $bus_key, $answer_header, $session_id); - &update_jobdb_status_for_send_msgs($answer, $error); - last; - } - } - } # answer is for one specific host @@ -1394,25 +1419,8 @@ sub process_task { # get encrypt_key my $encrypt_key = &get_encrypt_key($answer_target); if( not defined $encrypt_key ) { - # unknown target, forward msg to bus + # unknown target daemon_log("$session_id WARNING: unknown target '$answer_target'", 3); - if( $bus_activ eq "true" ) { - daemon_log("$session_id INFO: try to forward msg '$answer_header' to bus '$bus_address'", 5); - my $sql_statement = "SELECT * FROM known_server WHERE hostname='$bus_address'"; - my $query_res = $known_server_db->select_dbentry( $sql_statement ); - my $res_length = keys( %{$query_res} ); - if( $res_length == 0 ){ - daemon_log("$session_id WARNING: send '$answer_header' to '$bus_address' failed, ". - "no bus found in known_server", 3); - } - else { - while( my ($hit_num, $hit) = each %{ $query_res } ) { - my $bus_key = $hit->{hostkey}; - my $error = &send_msg_to_target($answer, $bus_address, $bus_key, $answer_header,$session_id ); - &update_jobdb_status_for_send_msgs($answer, $error); - } - } - } next; } my $error = &send_msg_to_target($answer, $answer_target, $encrypt_key, $answer_header,$session_id); @@ -1436,7 +1444,6 @@ sub process_task { sub session_start { my ($kernel) = $_[KERNEL]; - &trigger_db_loop($kernel); $global_kernel = $kernel; $kernel->yield('register_at_foreign_servers'); $kernel->yield('create_fai_server_db', $fai_server_tn ); @@ -1453,16 +1460,6 @@ sub session_start { } -sub trigger_db_loop { - my ($kernel) = @_ ; -# $kernel->delay_set('watch_for_new_jobs', $job_queue_loop_delay); -# $kernel->delay_set('watch_for_done_jobs', $job_queue_loop_delay); -# $kernel->delay_set('watch_for_new_messages', $messaging_db_loop_delay); -# $kernel->delay_set('watch_for_delivery_messages', $messaging_db_loop_delay); -# $kernel->delay_set('watch_for_done_messages', $messaging_db_loop_delay); -# $kernel->delay_set('watch_for_old_known_clients', $job_queue_loop_delay); -} - sub watch_for_done_jobs { my ($kernel,$heap) = @_[KERNEL, HEAP]; @@ -1694,7 +1691,7 @@ sub watch_for_delivery_messages { # fetch key to encrypt msg propperly for usr/host my $sql = "SELECT * FROM $known_clients_tn WHERE (hostname='$receiver_host')"; &daemon_log("0 DEBUG: $sql", 7); - my $res = $known_clients_db->select_dbentry($sql); + my $res = $known_clients_db->exec_statement($sql); # host is already down if (not ref(@$res[0]) eq "ARRAY") { next; } @@ -1804,7 +1801,7 @@ sub watch_for_next_tasks { my $res = $incoming_db->exec_statement($sql); } - $kernel->delay_set('watch_for_next_tasks', 1); + $kernel->delay_set('watch_for_next_tasks', 0.1); } @@ -1819,7 +1816,7 @@ sub get_ldap_handle { if ($session_id == 0) { daemon_log("$session_id DEBUG: get_ldap_handle invoked without a session_id, create a new ldap_handle", 7); $ldap_handle = Net::LDAP->new( $ldap_uri ); - $ldap_handle->bind($ldap_admin_dn, apassword => $ldap_admin_password); + $ldap_handle->bind($ldap_admin_dn, password => $ldap_admin_password); } else { my $session_reference = $global_kernel->ID_id_to_session($session_id); @@ -1894,6 +1891,10 @@ sub change_fai_state { if ($mesg->count) { my @entries = $mesg->entries; + if (0 == @entries) { + daemon_log("$session_id ERROR: ldap search failed: ldap_base=$ldap_base, filter=$search", 1); + } + foreach my $entry (@entries) { # Only modify entry if it is not set to '$state' if ($entry->get_value("FAIstate") ne "$state"){ @@ -1922,12 +1923,16 @@ sub change_fai_state { daemon_log("$session_id DEBUG FAIstate at host '".$entry->dn."' already at state '$st'", 7); } } + } else { + daemon_log("$session_id ERROR: LDAP search failed: ldap_base=$ldap_base, filter=$search", 1); } + # if no ldap handle defined } else { daemon_log("$session_id ERROR: no LDAP handle defined for update FAIstate", 1); } + return; } @@ -1980,7 +1985,9 @@ sub change_goto_state { } } - } + } else { + daemon_log("$session_id ERROR: LDAP search failed in function change_goto_state: ldap_base=$ldap_base, filter=$search", 1); + } } } @@ -2807,7 +2814,6 @@ GetOptions("h|help" => \&usage, "c|config=s" => \$cfg_file, "f|foreground" => \$foreground, "v|verbose+" => \$verbose, - "no-bus+" => \$no_bus, "no-arp+" => \$no_arp, ); @@ -2863,10 +2869,6 @@ daemon_log("$0 started!", 1); daemon_log("status: $server_status", 1); daemon_log($server_status_hash->{$server_status}.": $server_revision", 1); -if ($no_bus > 0) { - $bus_activ = "false" -} - # connect to incoming_db unlink($incoming_file_name); $incoming_db = GOSA::DBsqlite->new($incoming_file_name); @@ -2961,6 +2963,14 @@ daemon_log("0 INFO: found foreign server in config file and DNS: $all_foreign_se # add all found foreign servers to known_server my $act_timestamp = &get_time(); foreach my $foreign_server (@foreign_server_list) { + + ####################################### + # TODO for jan + # do not add myself to known_server_db + # work around!!! + if ($foreign_server eq '172.16.2.89:20081') { next; } + ###################################### + my $res = $known_server_db->add_dbentry( {table=>$known_server_tn, primkey=>['hostname'], hostname=>$foreign_server,