From 49f3e65329553bfeab1d3063a1d412398d47689a Mon Sep 17 00:00:00 2001 From: rettenbe Date: Wed, 20 May 2009 10:04:39 +0000 Subject: [PATCH] * new plugin load_reporter.pm * configuration options 'system-com', 'ts-load-file', 'waiting-for-ts-info' * plugin enables si-client to request system load information from terminal server and evaluate the replying terminal server answers git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@13654 594d385d-05f5-0310-b6e9-bd551577e9d8 --- gosa-si/gosa-si-client | 149 ++++++++++++++++++++------- gosa-si/server/events/siTriggered.pm | 86 +++++++++++----- gosa-si/tests/deploy-gosa-si.pl | 1 + 3 files changed, 173 insertions(+), 63 deletions(-) diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client index ee8be12b0..44ddd467c 100755 --- a/gosa-si/gosa-si-client +++ b/gosa-si/gosa-si-client @@ -58,8 +58,7 @@ my $event_hash; my $default_server_key; my @servers; my $gotoHardwareChecksum; -my $gosa_si_client_fifo; -my %files_to_watch; +my $system_com; $verbose= 1; # globalise variables which are used in imported events @@ -73,13 +72,15 @@ our $client_mac_address; our $client_dnsname; our $client_force_hostname; our $server_key; +our $terminal_server_hash; # default variables our $REGISTERED = 0; # path to fifo for non-gosa-si-client messages to gosa-si-server -$gosa_si_client_fifo = "/var/run/gosa-si-client.socket"; -%files_to_watch = (fifo => $gosa_si_client_fifo); +my $fai_com_fifo = "/var/run/gosa-si-client-fai-com.socket"; +my $system_com_fifo = "/var/run/gosa-si-client-system-com.socket"; +my %files_to_watch = (fai_fifo => $fai_com_fifo, system_fifo => $system_com_fifo); # in function register_at_gosa_si_server, after which period of seconds a new registration should be tried if a registration was # not successful until now @@ -112,6 +113,7 @@ my $fai_log_dir = "/var/log/fai"; "nss-config" => [\$nss_config, "/etc/libnss-ldap.conf"], "fai-logpath" => [\$fai_logpath, "/var/log/fai/fai.log"], "force-hostname" => [\$client_force_hostname, "false"], + "system-com" => [\$system_com, "disabled"], }, "server" => { "ip" => [\$server_ip, "127.0.0.1"], @@ -796,6 +798,20 @@ sub trigger_logged_in_users_report { } } +sub trigger_set_terminal_server +{ + # Function is defined in load_reporter.pm + if (exists $event_hash->{set_terminal_server}) + { + no strict 'refs'; + &{$event_hash->{set_terminal_server}."::set_terminal_server"}; + } + else + { + &daemon_log("0 ERROR: load_reporter.pm needs function set_terminal_server to write terminal server load information to client. Processing aborted!", 1); + } + return; +} sub trigger_seen_messages { my ($kernel) = $_[KERNEL] ; @@ -873,7 +889,7 @@ sub generic_file_error { } -sub fifo_got_record { +sub fai_fifo_got_record { my $file_record = $_[ARG0]; my $header; my $content = ""; @@ -906,6 +922,42 @@ sub fifo_got_record { } +sub system_fifo_got_record { + my ($kernel, $socket_com_record) = @_[KERNEL, ARG0]; + $socket_com_record =~ /^(\S+)\s?([\s\S]*)$/; + my $function = $1; + my $content = $2; + + if( exists $event_hash->{$function} ) + { + # a event exists with the header as name + daemon_log("INFO: found event '$function' at event-module '".$event_hash->{$function}."'", 5); + no strict 'refs'; + my $answer = &{$event_hash->{$function}."::$function"}($content, $kernel); + &post_processing_and_sending($answer) + } + else + { + daemon_log("ERROR: Got input '$socket_com_record' from socket '$system_com_fifo'", 1); + daemon_log("ERROR: No event '$function' found in event modules under '$event_dir'.", 1); + } + +# # Sanity check of fifo record +# +# # Create record message +# my $lr_msg_hash = &create_xml_hash("load_report", $client_address, $server_address, $file_record); +# &add_content2xml_hash($lr_msg_hash, "macaddress", $client_mac_address); +# my $utc_ts = &main::get_utc_time(); +# &add_content2xml_hash($lr_msg_hash, "timestamp", $utc_ts); +# my $lr_msg = &create_xml_string($lr_msg_hash); +# +# # Report message to si-server +# &send_msg_to_target($lr_msg, $server_address, $server_key, "load_report"); + + return; +} + + sub save_fai_log { my ($fai_log_dir) = @_ ; my $FAI_DIR; @@ -978,13 +1030,8 @@ sub _start { my $watcher = POE::Wheel::FollowTail->new( Filename => $file, InputEvent => $name."_record", - # ResetEvent => "file_reset", ErrorEvent => "file_error", ); -# $heap->{tail} = POE::Wheel::Run->new( -# Program => [ "/usr/bin/tail", "-f", $file ], -# StdoutEvent => $file_name."_record", -# ); $heap->{services}->{ $watcher->ID } = $name; $heap->{watchers}->{ $watcher->ID } = $watcher; } @@ -1052,36 +1099,47 @@ sub server_input { ######## # answer - if( $answer ) { - - #check gosa-si envelope validity - my $answer_hash = &check_outgoing_xml_validity($answer); - - if( $answer_hash ) { - # answer is valid - - # preprocessing - if( $answer =~ "
registered
") { - # set registered flag to true to stop sending further registered msgs - $REGISTERED = 1; - } - else { - $answer =~ /
(\S+)<\/header>/; - &send_msg_to_target($answer, $server_address, $server_key, $1); - } + &post_processing_and_sending($answer); - # postprocessing - if( $answer =~ "
new_key
") { - # set new key to global variable - $answer =~ /(\S*?)<\/new_key>/; - my $new_key = $1; - $server_key = $new_key; - } - } + return; +} - } +sub post_processing_and_sending +{ + my ($answer) = @_ ; - return; + # Do nothing if answer does not exists + if (not defined $answer) { return; } + + # Check gosa-si envelope validity + my $answer_hash = &check_outgoing_xml_validity($answer); + + if( $answer_hash ) + { + # Answer is valid + # Pre-sending + if( $answer =~ "
registered
") + { + # Set registered flag to true to stop sending further registered msgs + $REGISTERED = 1; + } + else + { + $answer =~ /
(\S+)<\/header>/; + &send_msg_to_target($answer, $server_address, $server_key, $1); + } + + # Post-sending + if( $answer =~ "
new_key
") + { + # Set new key to global variable + $answer =~ /(\S*?)<\/new_key>/; + my $new_key = $1; + $server_key = $new_key; + } + } + + return; } @@ -1251,9 +1309,16 @@ if( defined $server_check ) { } -# open fifo for non-gosa-si-client-msgs to gosa-si-server -POSIX::mkfifo("$gosa_si_client_fifo", "0600"); +# Open a new fifo for FAI messages to gosa-si-server +if (-p $fai_com_fifo) { unlink $fai_com_fifo } +POSIX::mkfifo("$fai_com_fifo", "0600"); +# Open a new fifo for system communication, +if (-p $system_com_fifo) { unlink $system_com_fifo } +if ($system_com eq "enabled") +{ + POSIX::mkfifo("$system_com_fifo", "0600"); +} POE::Session->create( inline_states => { @@ -1266,9 +1331,13 @@ POE::Session->create( trigger_new_key => \&trigger_new_key, trigger_logged_in_users_report => \&trigger_logged_in_users_report, trigger_seen_messages => \&trigger_seen_messages, + + # trigger non periodical tasks + trigger_set_terminal_server => \&trigger_set_terminal_server, # handle records from each defined file differently - fifo_record => \&fifo_got_record, + fai_fifo_record => \&fai_fifo_got_record, + system_fifo_record => \&system_fifo_got_record, # handle file resets and errors the same way for each file file_reset => \&generic_file_reset, diff --git a/gosa-si/server/events/siTriggered.pm b/gosa-si/server/events/siTriggered.pm index e4493282d..8b9b53b1c 100644 --- a/gosa-si/server/events/siTriggered.pm +++ b/gosa-si/server/events/siTriggered.pm @@ -6,15 +6,18 @@ my @events = ( "detected_hardware", "trigger_wake", "reload_ldap_config", + "get_terminal_server", ); @EXPORT = @events; use strict; use warnings; +use Data::Dumper; use GOSA::GosaSupportDaemon; use Socket; + BEGIN {} END {} @@ -38,32 +41,69 @@ my %cfg_defaults = ( &GOSA::GosaSupportDaemon::read_configfile($main::cfg_file, %cfg_defaults); -sub get_events { - return \@events; -} +sub get_terminal_server +{ + my ($msg, $msg_hash, $session_id) = @_ ; + my $source = @{$msg_hash->{source}}[0]; + my @out_msg_l; + + # Send get_load message to all si-clients at terminal server specified in LDAP + my $ldap_handle = &main::get_ldap_handle(); + if (defined $ldap_handle) + { + my $ldap_mesg = $ldap_handle->search( + base => $ldap_base, + scope => 'sub', + attrs => ['macAddress'], + filter => "objectClass=goTerminalServer", + ); + if ($ldap_mesg->count) + { + # Parse all LDAP results to a sql compliant where statement + my @entries = $ldap_mesg->entries; + @entries = map ($_->get_value("macAddress"), @entries); + @entries = map ("macaddress LIKE '$_'", @entries); + + my ($hit, $hash, $db_res, $out_msg); + # Check known clients if a terminal server is active + $db_res = $main::known_clients_db->select_dbentry("SELECT * FROM $main::known_clients_tn WHERE ".join(" AND ", @entries)); + while (($hit, $hash) = each %$db_res) + { + $out_msg = &create_xml_string(&create_xml_hash('get_load', $source, $hash->{macaddress})); + push(@out_msg_l, $out_msg); + } + # Check foreign_clients if a terminal server is active + $db_res = $main::foreign_clients_db->select_dbentry("SELECT * FROM $main::foreign_clients_tn WHERE ".join(" AND ", @entries)); + while (($hit, $hash) = each %$db_res) + { + $out_msg = &create_xml_string(&create_xml_hash('get_load', $source, $hash->{macaddress})); + push(@out_msg_l, $out_msg); + } + +### JUST FOR DEBUGGING # CAN BE DELETED AT ANY TIME ########################### + my $db_res = $main::foreign_clients_db->select_dbentry("SELECT * FROM $main::foreign_clients_tn WHERE macaddress LIKE '00:01:6c:9d:b9:fa'"); + while (($hit, $hash) = each %$db_res) + { + $out_msg = &create_xml_string(&create_xml_hash('get_load', $source, $hash->{macaddress})); + push(@out_msg_l, $out_msg); + } +### JUST FOR DEBUGGING # CAN BE DELETED AT ANY TIME ########################### + } + # Translating errors ? + if ($ldap_mesg->code) + { + &main::daemon_log("0 ERROR: Cannot fetch terminal server from LDAP: \n\tbase='$ldap_base'\n\tscope='sub'\n\tattrs='['macAddress']'\n\tfilter='objectClass=goTerminalServer'", 1); + } + } + &main::release_ldap_handle($ldap_handle); + return @out_msg_l; +} -#sub read_configfile { -# my ($cfg_file, %cfg_defaults) = @_; -# my $cfg; -# -# if( defined( $cfg_file) && ( (-s $cfg_file) > 0 )) { -# if( -r $cfg_file ) { -# $cfg = Config::IniFiles->new( -file => $cfg_file ); -# } else { -# &main::daemon_log("ERROR: siTriggered.pm couldn't read config file!", 1); -# } -# } else { -# $cfg = Config::IniFiles->new() ; -# } -# foreach my $section (keys %cfg_defaults) { -# foreach my $param (keys %{$cfg_defaults{ $section }}) { -# my $pinfo = $cfg_defaults{ $section }{ $param }; -# ${@$pinfo[0]} = $cfg->val( $section, $param, @$pinfo[1] ); -# } -# } -#} +sub get_events { + return \@events; +} sub reload_ldap_config { my ($msg, $msg_hash, $session_id) = @_; diff --git a/gosa-si/tests/deploy-gosa-si.pl b/gosa-si/tests/deploy-gosa-si.pl index 87a285782..5d2156815 100755 --- a/gosa-si/tests/deploy-gosa-si.pl +++ b/gosa-si/tests/deploy-gosa-si.pl @@ -62,6 +62,7 @@ my %copies = ( "/usr/lib/gosa-si/client/events/gosaTriggered.pm" => "client/events/gosaTriggered.pm", "/usr/lib/gosa-si/client/events/installation.pm" => "client/events/installation.pm", "/usr/lib/gosa-si/client/events/mailqueue.pm" => "client/events/mailqueue.pm", + "/usr/lib/gosa-si/client/events/load_reporter.pm" => "client/events/load_reporter.pm", ); while( my($new_file, $file_name) = each %copies ) { -- 2.30.2