X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fgosa-si-server;h=e0299693216f9db80a1657e67783690b72d67000;hb=03d7b0b804bf70999933386682c2712313c23d28;hp=e18545c310a075f5bfeb780d14909407e02c2540;hpb=bdf52a118c83754979d7de2476f98908b25bf317;p=gosa.git diff --git a/gosa-si/gosa-si-server b/gosa-si/gosa-si-server index e18545c31..e02996932 100755 --- a/gosa-si/gosa-si-server +++ b/gosa-si/gosa-si-server @@ -77,7 +77,7 @@ our $no_arp; our $verbose; our $forground; our $cfg_file; -our ($ldap_handle, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password ); +our ($ldap_handle, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $ldap_server_dn); # specifies the verbosity of the daemon_log @@ -125,7 +125,7 @@ my @login_users_col_names = ('client', 'user', 'timestamp'); our $fai_server_db; our $fai_server_tn = "fai_server"; my $fai_server_file_name; -our @fai_server_col_names = ('timestamp', 'server', 'release', 'tag'); +our @fai_server_col_names = ('timestamp', 'server', 'release', 'sections', 'tag'); our $fai_release_tn = "fai_release"; our @fai_release_col_names = ('timestamp', 'release', 'class', 'type', 'state'); @@ -149,6 +149,7 @@ our $client_fai_log_dir = "/var/log/fai"; # queue which stores taskes while max_clients are reached my @tasks = qw(); + %cfg_defaults = ( "general" => { "log-file" => [\$log_file, "/var/run/".$prg.".log"], @@ -410,7 +411,7 @@ sub sig_int_handler { } daemon_log("shutting down gosa-si-server", 1); - exit(0); + system("killall gosa-si-server"); } $SIG{INT} = \&sig_int_handler; @@ -852,7 +853,7 @@ sub send_msg_to_target { print $socket $crypted_msg."\n"; daemon_log("INFO: send ".$header."msg to $address", 5); - daemon_log("message:\n$msg", 8); + daemon_log("DEBUG: message:\n$msg", 9); } @@ -936,8 +937,7 @@ sub _start { my ($kernel) = $_[KERNEL]; &trigger_db_loop($kernel); $kernel->yield('create_fai_server_db', $fai_server_tn ); - #$kernel->yield('create_fai_release_db', $fai_release_tn ); - #$kernel->yield('create_packages_list_db', $sources_list ); + $kernel->yield('create_fai_release_db', $fai_release_tn ); } sub next_task { @@ -969,9 +969,9 @@ sub handle_task_result { if( defined $session_reference ) { $heap = $session_reference->get_heap(); } - } + } + $heap->{'client'}->put($client_answer); } - $heap->{client}->put($client_answer); $kernel->sig(CHLD => "child_reap"); } @@ -1014,6 +1014,15 @@ sub process_task { } # an error occurred if(( !$msg ) || ( !$msg_hash ) || ( !$module )){ + my $sql_statement = "SELECT * FROM $main::known_clients_tn WHERE (hostname LIKE '".$heap->{'remote_ip'}."%')"; + my $query_res = $known_clients_db->select_dbentry( $sql_statement ); + while( my ($hit_num, $hit) = each %{ $query_res } ) { + my $host_name = $hit->{'hostname'}; + my $host_key = $hit->{'hostkey'}; + my $ping_msg = "
gosa_ping
$server_address $host_name
"; + my $error = &send_msg_to_target($ping_msg, $host_name, $host_key, "gosa_ping"); + &update_jobdb_status_for_send_msgs($ping_msg, $error); + } $error++; } @@ -1174,209 +1183,9 @@ sub process_task { print @$output; -# print STDERR $client_answer."\n"; -# print $client_answer; -# return; } -#sub client_input { -# no strict "refs"; -# my ($kernel, $session, $heap, $input, $wheel) = @_[KERNEL, SESSION, HEAP, ARG0, ARG1]; -# my $session_id = $session->ID; -# my ($msg, $msg_hash, $module); -# my $error = 0; -# my $answer_l; -# my ($answer_header, @answer_target_l, $answer_source); -# my $client_answer; -# -# daemon_log("", 5); -# daemon_log("INFO: Incoming msg with session ID $session_id from '".$heap->{'remote_ip'}."'", 5); -# daemon_log("DEBUG: Incoming msg:\n$input", 9); -# -# #################### -# # check incoming msg -# # msg is from a new client or gosa -# ($msg, $msg_hash, $module) = &input_from_unknown_host($input); -# # msg is from a gosa-si-server or gosa-si-bus -# if(( !$msg ) || ( !$msg_hash ) || ( !$module )){ -# ($msg, $msg_hash, $module) = &input_from_known_server($input, $heap->{'remote_ip'}); -# } -# # msg is from a gosa-si-client -# if(( !$msg ) || ( !$msg_hash ) || ( !$module )){ -# ($msg, $msg_hash, $module) = &input_from_known_client($input, $heap->{'remote_ip'}); -# } -# # an error occurred -# if(( !$msg ) || ( !$msg_hash ) || ( !$module )){ -# $error++; -# } -# -# ###################### -# # process incoming msg -# if( $error == 0) { -# daemon_log("INFO: Incoming msg with header '".@{$msg_hash->{'header'}}[0]."'", 5); -# daemon_log("DEBUG: Processing module ".$module, 7); -# $answer_l = &{ $module."::process_incoming_msg" }($msg, $msg_hash, $session_id); -# -# if ( 0 < @{$answer_l} ) { -# my $answer_str = join("\n", @{$answer_l}); -# daemon_log("DEGUB: $module: Got answer from module: \n".$answer_str,8); -# } -# } -# if( !$answer_l ) { $error++ }; -# -# ######## -# # answer -# if( $error == 0 ) { -# -# foreach my $answer ( @{$answer_l} ) { -# # for each answer in answer list -# -# # check outgoing msg to xml validity -# my $answer_hash = &check_outgoing_xml_validity($answer); -# if( not defined $answer_hash ) { -# next; -# } -# -# $answer_header = @{$answer_hash->{'header'}}[0]; -# @answer_target_l = @{$answer_hash->{'target'}}; -# $answer_source = @{$answer_hash->{'source'}}[0]; -# -# # deliver msg to all targets -# foreach my $answer_target ( @answer_target_l ) { -# -# # targets of msg are all gosa-si-clients in known_clients_db -# if( $answer_target eq "*" ) { -# # answer is for all clients -# my $sql_statement= "SELECT * FROM known_clients"; -# my $query_res = $known_clients_db->select_dbentry( $sql_statement ); -# while( my ($hit_num, $hit) = each %{ $query_res } ) { -# my $host_name = $hit->{hostname}; -# my $host_key = $hit->{hostkey}; -# my $error = &send_msg_to_target($answer, $host_name, $host_key, $answer_header); -# &update_jobdb_status_for_send_msgs($answer, $error); -# } -# } -# -# # targets of msg are all gosa-si-server in known_server_db -# elsif( $answer_target eq "KNOWN_SERVER" ) { -# # answer is for all server in known_server -# my $sql_statement= "SELECT * FROM known_server"; -# my $query_res = $known_server_db->select_dbentry( $sql_statement ); -# while( my ($hit_num, $hit) = each %{ $query_res } ) { -# my $host_name = $hit->{hostname}; -# my $host_key = $hit->{hostkey}; -# $answer =~ s/KNOWN_SERVER/$host_name/g; -# my $error = &send_msg_to_target($answer, $host_name, $host_key, $answer_header); -# &update_jobdb_status_for_send_msgs($answer, $error); -# } -# } -# -# # target of msg is GOsa -# elsif( $answer_target eq "GOSA" ) { -# $answer =~ /(\d+)<\/session_id>/; -# my $session_id = $1; -# my $add_on = ""; -# if( defined $session_id ) { -# $add_on = ".session_id=$session_id"; -# } -# # answer is for GOSA and has to returned to connected client -# my $gosa_answer = &encrypt_msg($answer, $GosaPackages_key); -# $client_answer = $gosa_answer.$add_on; -# } -# -# # target of msg is job queue at this host -# elsif( $answer_target eq "JOBDB") { -# $answer =~ /
(\S+)<\/header>/; -# my $header; -# if( defined $1 ) { $header = $1; } -# my $error = &send_msg_to_target($answer, $server_address, $GosaPackages_key, $header); -# &update_jobdb_status_for_send_msgs($answer, $error); -# } -# -# # target of msg is a mac address -# elsif( $answer_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})$/i ) { -# daemon_log("INFO: target is mac address '$answer_target', looking for host in known_clients", 5); -# my $sql_statement = "SELECT * FROM known_clients WHERE macaddress LIKE '$answer_target'"; -# my $query_res = $known_clients_db->select_dbentry( $sql_statement ); -# my $found_ip_flag = 0; -# while( my ($hit_num, $hit) = each %{ $query_res } ) { -# my $host_name = $hit->{hostname}; -# my $host_key = $hit->{hostkey}; -# $answer =~ s/$answer_target/$host_name/g; -# daemon_log("INFO: found host '$host_name', associated to '$answer_target'", 5); -# my $error = &send_msg_to_target($answer, $host_name, $host_key, $answer_header); -# &update_jobdb_status_for_send_msgs($answer, $error); -# $found_ip_flag++ ; -# } -# if( $found_ip_flag == 0) { -# daemon_log("WARNING: no host found in known_clients with mac address '$answer_target'", 3); -# if( $bus_activ eq "true" ) { -# daemon_log("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); -# &update_jobdb_status_for_send_msgs($answer, $error); -# last; -# } -# } -# -# } -# -# # answer is for one specific host -# } else { -# # get encrypt_key -# my $encrypt_key = &get_encrypt_key($answer_target); -# if( not defined $encrypt_key ) { -# # unknown target, forward msg to bus -# daemon_log("WARNING: unknown target '$answer_target'", 3); -# if( $bus_activ eq "true" ) { -# daemon_log("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("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); -# &update_jobdb_status_for_send_msgs($answer, $error); -# } -# } -# } -# next; -# } -# my $error = &send_msg_to_target($answer, $answer_target, $encrypt_key, $answer_header); -# &update_jobdb_status_for_send_msgs($answer, $error); -# } -# } -# } -# } -# -# if( $client_answer ) { -# if( $client_answer =~ s/session_id=(\d+)$// ) { -# my $session_id = $1; -# if( defined $session_id ) { -# my $session_reference = $kernel->ID_id_to_session($session_id); -# if( defined $session_reference ) { -# $heap = $session_reference->get_heap(); -# } -# } -# } -# $heap->{client}->put($client_answer); -# } -# -# return; -#} - - - sub trigger_db_loop { my ($kernel) = @_ ; $kernel->delay_set('watch_for_new_jobs', $job_queue_loop_delay); @@ -1616,7 +1425,7 @@ sub change_goto_state { sub create_fai_server_db { - my ($table_name) = @_; + my ($table_name, $kernel) = @_; my $result; if(defined($ldap_handle)) { @@ -1640,6 +1449,7 @@ sub create_fai_server_db { primkey => ['server', 'release', 'tag'], server => $tmp_url, release => $tmp_release, + sections => $tmp_sections, tag => (length($tmp_tag)>0)?$tmp_tag:"", } ); } @@ -1647,13 +1457,18 @@ sub create_fai_server_db { } } daemon_log("INFO: create_fai_server_db: finished", 5); + + # TODO: Find a way to post the 'create_packages_list_db' event + &create_packages_list_db(); } + return $result; } + sub run_create_fai_server_db { - my ($session, $heap, $table_name) = @_[SESSION, HEAP, ARG0]; + my ($kernel, $session, $heap, $table_name) = @_[KERNEL, SESSION, HEAP, ARG0]; my $task = POE::Wheel::Run->new( - Program => sub { &create_fai_server_db($table_name) }, + Program => sub { &create_fai_server_db($table_name,$kernel) }, StdoutEvent => "session_run_result", StderrEvent => "session_run_debug", CloseEvent => "session_run_done", @@ -1965,9 +1780,40 @@ sub session_run_done { delete $heap->{task}->{$task_id}; } +sub create_sources_list { + my $result="/tmp/gosa_si_tmp_sources_list"; + + # Remove old file + if(stat($result)) { + unlink($result); + } + + my $fh; + open($fh, ">$result") or return undef; + if(defined($ldap_server_dn) && length($ldap_server_dn)>0) { + my $mesg=$ldap_handle->search( + base => $ldap_server_dn, + scope => 'base', + attrs => 'FAIrepository', + ); + + if($mesg->count) { + foreach my $entry(@{$mesg->{'entries'}}) { + my ($server, $tag, $release, $sections)= split /\|/, $entry->get_value('FAIrepository'); + my $line = "deb $server $release"; + $sections =~ s/,/ /g; + $line.= " $sections"; + print $fh $line."\n"; + } + } + } + close($fh); + + return $result; +} sub create_packages_list_db { - my ($sources_file) = @_ ; + my ($sources_file) = @_ || &create_sources_list; my $line; daemon_log("INFO: create_packages_list_db: start", 5); @@ -2007,14 +1853,13 @@ sub create_packages_list_db { return; } sub run_create_packages_list_db { - my ($session, $heap, $sources_list) = @_[SESSION, HEAP, ARG0]; + my ($session, $heap) = @_[SESSION, HEAP]; my $task = POE::Wheel::Run->new( - Program => sub { &create_packages_list_db($sources_list) }, + Program => sub {&create_packages_list_db}, StdoutEvent => "session_run_result", StderrEvent => "session_run_debug", CloseEvent => "session_run_done", ); - $heap->{task}->{ $task->ID } = $task; } sub parse_package_info {