X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fserver%2Fevents%2FclMessages.pm;h=7425bfbac4690a6e232317d12598f3c1f3e17e65;hb=5e702a8304a79ec8eedb695efb79fe0cd3e531ef;hp=0ec31d5c177fe4ab75446118aaa8bf5abdf190d5;hpb=ab2d97c8d992a34081be225f830b7245aa8525b1;p=gosa.git diff --git a/gosa-si/server/events/clMessages.pm b/gosa-si/server/events/clMessages.pm index 0ec31d5c1..7425bfbac 100644 --- a/gosa-si/server/events/clMessages.pm +++ b/gosa-si/server/events/clMessages.pm @@ -2,6 +2,7 @@ package clMessages; use Exporter; @ISA = qw(Exporter); my @events = ( + "confirm_usr_msg", "PROGRESS", "FAIREBOOT", "TASKSKIP", @@ -13,6 +14,7 @@ my @events = ( "LOGIN", "LOGOUT", "CURRENTLY_LOGGED_IN", + "save_fai_log", ); @EXPORT = @events; @@ -20,7 +22,7 @@ use strict; use warnings; use Data::Dumper; use GOSA::GosaSupportDaemon; -use utf8; +use MIME::Base64; BEGIN {} @@ -50,11 +52,28 @@ sub get_events { } +sub confirm_usr_msg { + my ($msg, $msg_hash, $session_id) = @_; + my $message = @{$msg_hash->{'message'}}[0]; + my $subject = @{$msg_hash->{'subject'}}[0]; + my $usr = @{$msg_hash->{'usr'}}[0]; + + # set update for this message + my $sql = "UPDATE $main::messaging_tn SET flag='s' WHERE (message='$message' AND subject='$subject' AND message_to='$usr')"; + &main::daemon_log("$session_id DEBUG: $sql", 7); + my $res = $main::messaging_db->exec_statement($sql); + + + return; +} + + + sub read_configfile { my ($cfg_file, %cfg_defaults) = @_; my $cfg; - if( defined( $cfg_file) && ( length($cfg_file) > 0 )) { + if( defined( $cfg_file) && ( (-s $cfg_file) > 0 )) { if( -r $cfg_file ) { $cfg = Config::IniFiles->new( -file => $cfg_file ); } else { @@ -72,6 +91,46 @@ sub read_configfile { } +sub save_fai_log { + my ($msg, $msg_hash, $session_id) = @_; + my $header = @{$msg_hash->{'header'}}[0]; + my $source = @{$msg_hash->{'source'}}[0]; + my $macaddress = @{$msg_hash->{'macaddress'}}[0]; + my $all_logs = @{$msg_hash->{$header}}[0]; + + # if there is nothing to log + if( ref($all_logs) eq "HASH" ) { return; } + + my $client_fai_log_dir = $main::client_fai_log_dir; + if (not -d $client_fai_log_dir) { + mkdir($client_fai_log_dir, 0755) + } + + $client_fai_log_dir = File::Spec->catfile( $client_fai_log_dir, $macaddress ); + if (not -d $client_fai_log_dir) { + mkdir($client_fai_log_dir, 0755) + } + + my $time = &get_time; + $time = substr($time, 0, 8)."_".substr($time, 8, 6); + $client_fai_log_dir = File::Spec->catfile( $client_fai_log_dir, "install_$time" ); + mkdir($client_fai_log_dir, 0755); + + my @all_logs = split(/log_file:/, $all_logs); + foreach my $log (@all_logs) { + if (length $log == 0) { next; }; + my ($log_file, $log_string) = split(":", $log); + my $client_fai_log_file = File::Spec->catfile( $client_fai_log_dir, $log_file); + + open(my $LOG_FILE, ">$client_fai_log_file"); + print $LOG_FILE &decode_base64($log_string); + close($LOG_FILE); + + } + return; +} + + sub LOGIN { my ($msg, $msg_hash, $session_id) = @_; my $header = @{$msg_hash->{'header'}}[0]; @@ -86,34 +145,23 @@ sub LOGIN { ); my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash ); if ($res != 0) { - &main::daemon_log("ERROR: cannot add entry to known_clients: $error_str"); + &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $error_str"); return; } return; } -# TODO umstellen wie bei LOGIN + sub LOGOUT { my ($msg, $msg_hash, $session_id) = @_; my $header = @{$msg_hash->{'header'}}[0]; my $source = @{$msg_hash->{'source'}}[0]; my $login = @{$msg_hash->{$header}}[0]; - - my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$source'"; - my $res = $main::known_clients_db->select_dbentry($sql_statement); - if( 1 != keys(%$res) ) { - &main::daemon_log("DEBUG: clMessages.pm: LOGOUT: no or more hits found in known_clients_db for host '$source'"); - return; - } - - my $act_login = $res->{'1'}->{'login'}; - $act_login =~ s/$login,?//gi; - - if( $act_login eq "" ){ $act_login = "nobody"; } - - $sql_statement = "UPDATE known_clients SET login='$act_login' WHERE hostname='$source'"; - $res = $main::known_clients_db->update_dbentry($sql_statement); + + my $sql_statement = "DELETE FROM $main::login_users_tn WHERE (client='$source' AND user='$login')"; + my $res = $main::login_users_db->del_dbentry($sql_statement); + &main::daemon_log("$session_id INFO: delete user '$login' at client '$source' from login_user_db", 5); return; } @@ -126,16 +174,23 @@ sub CURRENTLY_LOGGED_IN { my $source = @{$msg_hash->{'source'}}[0]; my $login = @{$msg_hash->{$header}}[0]; + if(ref $login eq "HASH") { + &main::daemon_log("$session_id INFO: no logged in users reported from host '$source'", 5); + return; + } + + # fetch all user currently assigned to the client at login_users_db + my %currently_logged_in_user = (); $sql_statement = "SELECT * FROM $main::login_users_tn WHERE client='$source'"; $db_res = $main::login_users_db->select_dbentry($sql_statement); - my %currently_logged_in_user = (); while( my($hit_id, $hit) = each(%{$db_res}) ) { $currently_logged_in_user{$hit->{'user'}} = 1; } - &main::daemon_log("DEBUG: logged in users from login_user_db: ".join(", ", keys(%currently_logged_in_user)), 7); + &main::daemon_log("$session_id DEBUG: logged in users from login_user_db: ".join(", ", keys(%currently_logged_in_user)), 7); + # update all reported users in login_user_db my @logged_in_user = split(/\s+/, $login); - &main::daemon_log("DEBUG: logged in users reported from client: ".join(", ", @logged_in_user), 7); + &main::daemon_log("$session_id DEBUG: logged in users reported from client: ".join(", ", @logged_in_user), 7); foreach my $user (@logged_in_user) { my %add_hash = ( table=>$main::login_users_tn, primkey=> ['client', 'user'], @@ -145,7 +200,7 @@ sub CURRENTLY_LOGGED_IN { ); my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash ); if ($res != 0) { - &main::daemon_log("ERROR: cannot add entry to known_clients: $error_str"); + &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $error_str"); return; } @@ -156,11 +211,11 @@ sub CURRENTLY_LOGGED_IN { # although he is not reported by client # then delete it from $login_user_db foreach my $obsolete_user (keys(%currently_logged_in_user)) { - &main::daemon_log("WARNING: user '$obsolete_user' is currently not logged ". + &main::daemon_log("$session_id WARNING: user '$obsolete_user' is currently not logged ". "in at client '$source' but still found at login_user_db", 3); my $sql_statement = "DELETE FROM $main::login_users_tn WHERE client='$source' AND user='$obsolete_user'"; my $res = $main::login_users_db->del_dbentry($sql_statement); - &main::daemon_log("WARNING: delete user '$obsolete_user' at client '$source' from login_user_db", 3); + &main::daemon_log("$session_id WARNING: delete user '$obsolete_user' at client '$source' from login_user_db", 3); } return; @@ -175,18 +230,17 @@ sub GOTOACTIVATION { # test whether content is an empty hash or a string which is required my $content = @{$msg_hash->{$header}}[0]; - eval{ if( 0 == keys(%$content) ) { $content = ""; } }; - if( $@ ) { $content = "$content"; } + if(ref($content) eq "HASH") { $content = ""; } # clean up header $header =~ s/CLMSG_//g; my $sql_statement = "UPDATE $main::job_queue_tn ". - "SET status='processing', result='$header"."$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); + "SET status='processing', progress='goto-activation' ". + "WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress'", 5); + &main::daemon_log("$session_id INFO: $header at '$macaddress'", 5); return; } @@ -198,20 +252,18 @@ sub PROGRESS { my $macaddress = @{$msg_hash->{'macaddress'}}[0]; # test whether content is an empty hash or a string which is required - my $content; - my $cont = @{$msg_hash->{$header}}[0]; - eval{ if( 0 == keys(%$cont) ) { $content = ""; } }; - if( $@ ) { $content = "$cont"; } + my $content = @{$msg_hash->{$header}}[0]; + if(ref($content) eq "HASH") { $content = ""; } # clean up header $header =~ s/CLMSG_//g; my $sql_statement = "UPDATE $main::job_queue_tn ". "SET progress='$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); + "WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress' - $content%", 5); + &main::daemon_log("$session_id INFO: $header at '$macaddress' - $content%", 5); return; } @@ -224,19 +276,18 @@ sub FAIREBOOT { my $macaddress = @{$msg_hash->{'macaddress'}}[0]; # test whether content is an empty hash or a string which is required - my $content = @{$msg_hash->{$header}}[0]; - eval{ if( 0 == keys(%$content) ) { $content = ""; } }; - if( $@ ) { $content = "$content"; } + my $content = @{$msg_hash->{$header}}[0]; + if(ref($content) eq "HASH") { $content = ""; } # clean up header $header =~ s/CLMSG_//g; my $sql_statement = "UPDATE $main::job_queue_tn ". "SET status='processing', result='$header "."$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); + "WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); + &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); return; } @@ -249,59 +300,122 @@ sub TASKSKIP { my $macaddress = @{$msg_hash->{'macaddress'}}[0]; # test whether content is an empty hash or a string which is required - my $content = @{$msg_hash->{$header}}[0]; - eval{ if( 0 == keys(%$content) ) { $content = ""; } }; - if( $@ ) { $content = "$content"; } + my $content = @{$msg_hash->{$header}}[0]; + if(ref($content) eq "HASH") { $content = ""; } # clean up header $header =~ s/CLMSG_//g; my $sql_statement = "UPDATE $main::job_queue_tn ". "SET status='processing', result='$header "."$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); + "WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); + &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); return; } - sub TASKBEGIN { my ($msg, $msg_hash, $session_id) = @_; my $header = @{$msg_hash->{'header'}}[0]; my $source = @{$msg_hash->{'target'}}[0]; my $macaddress = @{$msg_hash->{'macaddress'}}[0]; - my $content = @{$msg_hash->{$header}}[0]; # test whether content is an empty hash or a string which is required - eval{ if( 0 == keys(%$content) ) { $content = ""; } }; - if( $@ ) { $content = "$content"; } + my $content = @{$msg_hash->{$header}}[0]; + if(ref($content) eq "HASH") { $content = ""; } # clean up header $header =~ s/CLMSG_//g; - # check if installation finished + # TASKBEGIN eq finish or faiend if (($content eq 'finish') || ($content eq 'faiend')){ my $sql_statement = "UPDATE $main::job_queue_tn ". "SET status='done', result='$header "."$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); + "WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); + &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); # set fai_state to localboot - &main::change_fai_state('localboot', \@{$msg_hash->{target}}); + &main::change_fai_state('localboot', \@{$msg_hash->{'macaddress'}}, $session_id); + # other TASKBEGIN msgs } else { - my $sql_statement = "UPDATE $main::job_queue_tn ". - "SET status='processing', result='$header "."$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); - my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); - + # select processing jobs for host + my $sql_statement = "SELECT * FROM $main::job_queue_tn WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); + my $res = $main::job_db->select_dbentry($sql_statement); + + # there is exactly one job entry in queue for this host + if (keys(%$res) == 1) { + &main::daemon_log("$session_id DEBUG: there is already one processing job in queue for host '$macaddress', run an update for this entry", 7); + my $sql_statement = "UPDATE $main::job_queue_tn SET result='$header $content' WHERE status='processing' AND macaddress LIKE '$macaddress'"; + my $err = $main::job_db->update_dbentry($sql_statement); + if (not defined $err) { + &main::daemon_log("$session_id ERROR: cannot update job_db entry: ".Dumper($err), 1); + } + + # there is no entry or more than one enties + } else { + # in case of more than one running jobs in queue, delete all jobs + if (keys(%$res) > 1) { + &main::daemon_log("$session_id DEBUG: there are more than one processing job in queue for host '$macaddress', ". + "delete entries", 7); + + my $sql_statement = "DELETE FROM $main::job_queue_tn WHERE status='processing' AND macaddress LIKE '$macaddress'"; + my ($err) = $main::job_db->del_dbentry($sql_statement); + if (not defined $err) { + &main::daemon_log("$session_id ERROR: can not delete multiple processing queue entries for host '$macaddress': ".Dumper($err), 1); + } + } + + # in case of no and more than one running jobs in queue, add one single job + # resolve plain name for host $macaddress + my $plain_name; + my $ldap_handle = &main::get_ldap_handle($session_id); + if( not defined $ldap_handle ) { + &main::daemon_log("$session_id ERROR: cannot connect to ldap", 1); + $plain_name = "none"; + + # try to fetch a 'real name' + } else { + my $mesg = $ldap_handle->search( + base => $main::ldap_base, + scope => 'sub', + attrs => ['cn'], + filter => "(macAddress=$macaddress)"); + if($mesg->code) { + &main::daemon_log($mesg->error, 1); + $plain_name = "none"; + } else { + my $entry= $mesg->entry(0); + $plain_name = $entry->get_value("cn"); + } + } + + + &main::daemon_log("$session_id DEBUG: add job to queue for host '$macaddress'", 7); + my $func_dic = {table=>$main::job_queue_tn, + primkey=>[], + timestamp=>&get_time, + status=>'processing', + result=>"$header $content", + progress=>'none', + headertag=>'trigger_action_reinstall', + targettag=>$source, + xmlmessage=>'none', + macaddress=>$macaddress, + plainname=>$plain_name, + }; + my ($err, $error_str) = $main::job_db->add_dbentry($func_dic); + if ($err != 0) { + &main::daemon_log("$session_id ERROR: cannot add entry to job_db: $error_str", 1); + } + + } # -----------------------> Update hier # finish @@ -322,19 +436,27 @@ sub TASKEND { # test whether content is an empty hash or a string which is required my $content = @{$msg_hash->{$header}}[0]; - eval{ if( 0 == keys(%$content) ) { $content = ""; } }; - if( $@ ) { $content = "$content"; } + if(ref($content) eq "HASH") { $content = ""; } # clean up header $header =~ s/CLMSG_//g; - my $sql_statement = "UPDATE $main::job_queue_tn ". - "SET status='processing', result='$header "."$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); - my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); + if ($content eq "savelog 0") { + &main::daemon_log("$session_id DEBUG: got savelog from host '$source' - jub done", 7); + my $sql_statement = "DELETE FROM $main::job_queue_tn WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); + my $res = $main::job_db->del_dbentry($sql_statement); + } else { + + my $sql_statement = "UPDATE $main::job_queue_tn ". + "SET status='processing', result='$header "."$content' ". + "WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); + my $res = $main::job_db->update_dbentry($sql_statement); + &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); + + } # -----------------------> Update hier # finish #
CLMSG_TASKBEGIN
@@ -356,15 +478,17 @@ sub TASKERROR { # test whether content is an empty hash or a string which is required my $content = @{$msg_hash->{$header}}[0]; - eval{ if( 0 == keys(%$content) ) { $content = ""; } }; - if( $@ ) { $content = "$content"; } + if(ref($content) eq "HASH") { $content = ""; } + # set fai_state to localboot + &main::change_fai_state('error', \@{$msg_hash->{'macaddress'}}, $session_id); + my $sql_statement = "UPDATE $main::job_queue_tn ". "SET status='processing', result='$header "."$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); + "WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); + &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); # -----------------------> Update hier # finish @@ -386,16 +510,15 @@ sub HOOK { $header =~ s/CLMSG_//g; # test whether content is an empty hash or a string which is required - my $content = @{$msg_hash->{$header}}[0]; - eval{ if( 0 == keys(%$content) ) { $content = ""; } }; - if( $@ ) { $content = "$content"; } + my $content = @{$msg_hash->{$header}}[0]; + if(ref($content) eq "HASH") { $content = ""; } my $sql_statement = "UPDATE $main::job_queue_tn ". "SET status='processing', result='$header "."$content' ". - "WHERE status='processing' AND macaddress='$macaddress'"; - &main::daemon_log("DEBUG: $sql_statement", 7); + "WHERE status='processing' AND macaddress LIKE '$macaddress'"; + &main::daemon_log("$session_id DEBUG: $sql_statement", 7); my $res = $main::job_db->update_dbentry($sql_statement); - &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); + &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5); return; }