X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fgosa-si-server;h=e0299693216f9db80a1657e67783690b72d67000;hb=03d7b0b804bf70999933386682c2712313c23d28;hp=7a3783ee482b382d79b762c00a5061bfd073ff32;hpb=3d20df75b1197a87812c8e0aee4c67711adbbc5d;p=gosa.git diff --git a/gosa-si/gosa-si-server b/gosa-si/gosa-si-server index 7a3783ee4..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"], @@ -316,7 +317,8 @@ sub check_pid { chomp( $pid ); if( -f "/proc/$pid/stat" ) { my($stat) = `cat /proc/$pid/stat` =~ m/$pid \((.+)\).*/; - if( $0 eq $stat ) { + if( $stat ) { + daemon_log("ERROR: Already running",1); close( LOCK_FILE ); exit -1; } @@ -409,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; @@ -851,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); } @@ -931,17 +933,14 @@ sub update_jobdb_status_for_send_msgs { } } - sub _start { my ($kernel) = $_[KERNEL]; &trigger_db_loop($kernel); - $kernel->yield('create_fai_server_db', $fai_server_tn ); + $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 ); } - -sub next_tasks { +sub next_task { my ($session, $heap) = @_[SESSION, HEAP]; while ( keys( %{ $heap->{task} } ) < $max_clients ) { @@ -950,17 +949,19 @@ sub next_tasks { my $task = POE::Wheel::Run->new( Program => sub { process_task($session, $heap, $next_task) }, - StdoutFilter => POE::Filter::Reference->new(), + StdioFilter => POE::Filter::Reference->new(), StdoutEvent => "task_result", StderrEvent => "task_debug", CloseEvent => "task_done", - ); + ); $heap->{task}->{ $task->ID } = $task; } } + sub handle_task_result { - my ($kernel, $heap, $client_answer) = @_[KERNEL, HEAP, ARG0]; + my ($kernel, $heap, $result) = @_[KERNEL, HEAP, ARG0]; + my $client_answer = $result->{'answer'}; if( $client_answer =~ s/session_id=(\d+)$// ) { my $session_id = $1; if( defined $session_id ) { @@ -968,11 +969,12 @@ 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"); } + sub handle_task_debug { my $result = $_[ARG0]; print STDERR "$result\n"; @@ -983,6 +985,7 @@ sub handle_task_done { delete $heap->{task}->{$task_id}; $kernel->yield("next_task"); } + sub process_task { no strict "refs"; my ($session, $heap, $input) = @_; @@ -994,7 +997,7 @@ sub process_task { my $client_answer = ""; daemon_log("", 5); - daemon_log("INFO: Incoming msg from '".$heap->{'remote_ip'}."'", 5); + daemon_log("INFO: Incoming msg with session ID $session_id from '".$heap->{'remote_ip'}."'", 5); daemon_log("DEBUG: Incoming msg:\n$input", 9); #################### @@ -1011,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++; } @@ -1021,9 +1033,9 @@ sub process_task { daemon_log("DEBUG: Processing module ".$module, 7); $answer_l = &{ $module."::process_incoming_msg" }($msg, $msg_hash, $session_id); - if ( 0 > @{$answer_l} ) { + if ( 0 < @{$answer_l} ) { my $answer_str = join("\n", @{$answer_l}); - daemon_log("DEGUB: $module: Got answer from module: \n".$answer_str,8); + daemon_log("DEBUG: $module: Got answer from module: \n".$answer_str,8); } } if( !$answer_l ) { $error++ }; @@ -1076,10 +1088,9 @@ sub process_task { } # target of msg is GOsa - elsif( $answer_target eq "GOSA" ) { - $answer =~ /(\d+)<\/session_id>/; - my $session_id = $1; - my $add_on = ""; + elsif( $answer_target eq "GOSA" ) { + my $session_id = ($1) if $answer =~ s/(\d+?)<\/session_id>//; + my $add_on = ""; if( defined $session_id ) { $add_on = ".session_id=$session_id"; } @@ -1162,208 +1173,19 @@ sub process_task { } } - 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 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; - } - } - - } + my $filter = POE::Filter::Reference->new(); + my %result = ( + status => "seems ok to me", + answer => $client_answer, + ); - # 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); - } - } - } - } + my $output = $filter->put( [ \%result ] ); + print @$output; - 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); @@ -1603,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)) { @@ -1627,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:"", } ); } @@ -1634,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", @@ -1689,12 +1517,12 @@ sub create_fai_release_db { } } } - daemon_log("Inserting entries to DB",6); + daemon_log("DEBUG: Inserting ".scalar @sql_list." entries to DB",6); if(@sql_list) { unshift @sql_list, "DELETE FROM $table_name"; $fai_server_db->exec_statementlist(\@sql_list); } - daemon_log("Done with inserting",6); + daemon_log("DEBUG: Done with inserting",6); } daemon_log("INFO: create_fai_release_db: finished",5); } @@ -1714,42 +1542,6 @@ sub run_create_fai_release_db { return; } -sub get_fai_release_entries { - my $tmp_classes = shift || return; - my $parent = shift || undef; - my @result = shift || (); - - foreach my $entry (keys %{$tmp_classes}) { - if(defined($entry)) { - #daemon_log($entry,1); - if($entry =~ /^ou=.*$/) { - my $release_name = $entry; - $release_name =~ s/ou=//g; - if(defined($parent)) { - $release_name = $parent."/".$release_name; - } - my @bufentries = get_fai_release_entries($tmp_classes->{$entry}, $release_name, @result); - foreach my $bufentry(@bufentries) { - push @result, $bufentry; - } - } else { - my @types = get_fai_types($tmp_classes->{$entry}); - foreach my $type (@types) { - push @result, - { - 'class' => $entry, - 'type' => $type->{'type'}, - 'release' => $parent, - 'state' => $type->{'state'}, - }; - } - } - } - } - - return @result; -} - sub get_fai_types { my $tmp_classes = shift || return undef; my @result; @@ -1790,14 +1582,14 @@ sub resolve_fai_classes { my $fai_filter= "(|(&(objectClass=FAIclass)(|(objectClass=".join(")(objectClass=", @possible_fai_classes).")))(objectClass=FAIbranch))"; my $fai_classes; - daemon_log("Searching for FAI entries in base $fai_base",6); + daemon_log("DEBUG: Searching for FAI entries in base $fai_base",6); my $mesg= $ldap_handle->search( base => $fai_base, scope => 'sub', attrs => ['cn','objectClass','FAIstate'], filter => $fai_filter, ); - daemon_log("Found ".$mesg->count()." FAI entries",6); + daemon_log("DEBUG: Found ".$mesg->count()." FAI entries",6); if($mesg->{'resultCode'} == 0 && $mesg->count != 0) { @@ -1961,23 +1753,6 @@ sub get_fai_release_entries { return @result; } -sub get_fai_types { - my $tmp_classes = shift || return undef; - my @result; - - foreach my $type(keys %{$tmp_classes}) { - if(defined($tmp_classes->{$type}[0]) && (!($tmp_classes->{$type}[0] =~ /^.*?removed.*?$/))) { - my $entry = { - type => $type, - state => $tmp_classes->{$type}[0], - }; - push @result, $entry; - } - } - - return @result; -} - sub deep_copy { my $this = shift; if (not ref $this) { @@ -2005,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); @@ -2047,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 { @@ -2095,10 +1900,11 @@ sub parse_package { return; } - open($PACKAGES, "<$path.in") || sub { + open($PACKAGES, "<$path.in"); + if(not defined($PACKAGES)) { daemon_log("ERROR: create_packages_list_db: parse_package: can not open '$path.in'",1); return; - }; + } # Read lines while (<$PACKAGES>){ @@ -2264,7 +2070,7 @@ POE::Component::Server::TCP->new( $kernel->yield("next_task"); }, InlineStates => { - next_task => \&next_tasks, + next_task => \&next_task, task_result => \&handle_task_result, task_done => \&handle_task_done, task_debug => \&handle_task_debug,