X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fserver%2Fevents%2FclMessages.pm;h=3415ea14c0ea083d55d05a5003e84c7c9adb4823;hb=f2c8a47a0259aa47d39501bc3b7994c6e4f83470;hp=686c9a0419ac72470d8e5ee1a0810c76abc40b99;hpb=18103664808ee70098bf91f6ad5eb216cb9f3b30;p=gosa.git diff --git a/gosa-si/server/events/clMessages.pm b/gosa-si/server/events/clMessages.pm index 686c9a041..3415ea14c 100644 --- a/gosa-si/server/events/clMessages.pm +++ b/gosa-si/server/events/clMessages.pm @@ -12,6 +12,8 @@ my @events = ( "GOTOACTIVATION", "LOGIN", "LOGOUT", + "CURRENTLY_LOGGED_IN", + "save_fai_log", ); @EXPORT = @events; @@ -19,7 +21,7 @@ use strict; use warnings; use Data::Dumper; use GOSA::GosaSupportDaemon; -use utf8; +use MIME::Base64; BEGIN {} @@ -28,13 +30,27 @@ END {} ### Start ###################################################################### -#&read_configfile($main::cfg_file, %cfg_defaults); +my $ldap_uri; +my $ldap_base; +my $ldap_admin_dn; +my $ldap_admin_password; + +my %cfg_defaults = ( +"server" => { + "ldap-uri" => [\$ldap_uri, ""], + "ldap-base" => [\$ldap_base, ""], + "ldap-admin-dn" => [\$ldap_admin_dn, ""], + "ldap-admin-password" => [\$ldap_admin_password, ""], + }, +); +&read_configfile($main::cfg_file, %cfg_defaults); sub get_events { return \@events; } + sub read_configfile { my ($cfg_file, %cfg_defaults) = @_; my $cfg; @@ -56,41 +72,67 @@ 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("\n", $log, 2); + 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]; 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: LOGIN: no or more hits found in known_clients_db for host '$source'"); + my %add_hash = ( table=>$main::login_users_tn, + primkey=> ['client', 'user'], + client=>$source, + user=>$login, + timestamp=>&get_time, + ); + my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash ); + if ($res != 0) { + &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $error_str"); return; } - my $act_login = $res->{'1'}->{'login'}; - if( $act_login eq "nobody" ) { - $act_login = ""; - } - - $act_login =~ s/$login,?//gi; - my @act_login = split(",", $act_login); - unshift(@act_login, $login); - $act_login = join(",", @act_login); - -#print STDERR "source: $source\n"; -#print STDERR "login: $login\n"; -#print STDERR "act_login: $act_login\n"; -#print STDERR "dbres: ".Dumper($res)."\n"; - $sql_statement = "UPDATE known_clients ". - "SET login='$act_login' ". - "WHERE hostname='$source'"; - $res = $main::known_clients_db->update_dbentry($sql_statement); return; } - +# TODO umstellen wie bei LOGIN sub LOGOUT { my ($msg, $msg_hash, $session_id) = @_; my $header = @{$msg_hash->{'header'}}[0]; @@ -109,203 +151,293 @@ sub LOGOUT { if( $act_login eq "" ){ $act_login = "nobody"; } - $sql_statement = "UPDATE known_clients ". - "SET login='$act_login' ". - "WHERE hostname='$source'"; + $sql_statement = "UPDATE known_clients SET login='$act_login' WHERE hostname='$source'"; $res = $main::known_clients_db->update_dbentry($sql_statement); return; } +sub CURRENTLY_LOGGED_IN { + my ($msg, $msg_hash, $session_id) = @_; + my ($sql_statement, $db_res); + my $header = @{$msg_hash->{'header'}}[0]; + my $source = @{$msg_hash->{'source'}}[0]; + my $login = @{$msg_hash->{$header}}[0]; + + # 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); + while( my($hit_id, $hit) = each(%{$db_res}) ) { + $currently_logged_in_user{$hit->{'user'}} = 1; + } + &main::daemon_log("$session_id DEBUG: logged in users from login_user_db: ".join(", ", keys(%currently_logged_in_user)), 7); + + # + my @logged_in_user = split(/\s+/, $login); + &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'], + client=>$source, + user=>$user, + timestamp=>&get_time, + ); + my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash ); + if ($res != 0) { + &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $error_str"); + return; + } + + delete $currently_logged_in_user{$user}; + } + + # if there is still a user in %currently_logged_in_user + # 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("$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("$session_id WARNING: delete user '$obsolete_user' at client '$source' from login_user_db", 3); + } + + return; +} + -# echo "GOTOACTIVATION" > /var/run/gosa-si-client.socket sub GOTOACTIVATION { my ($msg, $msg_hash, $session_id) = @_; - my $out_msg = &build_result_update_msg($msg_hash); - my @out_msg_l = ($out_msg); - return @out_msg_l; + my $header = @{$msg_hash->{'header'}}[0]; + my $source = @{$msg_hash->{'target'}}[0]; + 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"; } + + # 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 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'", 5); + return; } -# echo "PROGRESS 15" > /var/run/gosa-si-client.socket sub PROGRESS { my ($msg, $msg_hash, $session_id) = @_; - my $out_msg = &build_progress_update_msg($msg_hash); - my @out_msg_l = ($out_msg); - return @out_msg_l; + my $header = @{$msg_hash->{'header'}}[0]; + my $source = @{$msg_hash->{'target'}}[0]; + 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"; } + + # clean up header + $header =~ s/CLMSG_//g; + + my $sql_statement = "UPDATE $main::job_queue_tn ". + "SET progress='$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); + + return; } -# echo "FAIREBOOT" > /tmp/gosa-si-client-fifo + sub FAIREBOOT { my ($msg, $msg_hash, $session_id) = @_; - my $out_msg = &build_status_result_update_msg($msg_hash); - my @out_msg_l = ($out_msg); - return @out_msg_l; + my $header = @{$msg_hash->{'header'}}[0]; + my $source = @{$msg_hash->{'target'}}[0]; + 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"; } + + # 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 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); + + return; } -# echo "TASKSKIP hallo welt" > /tmp/gosa-si-client-fifo + sub TASKSKIP { my ($msg, $msg_hash, $session_id) = @_; - my $out_msg = &build_status_result_update_msg($msg_hash); - my @out_msg_l = ($out_msg); - return @out_msg_l; + my $header = @{$msg_hash->{'header'}}[0]; + my $source = @{$msg_hash->{'target'}}[0]; + 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"; } + + # 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 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); + + return; } -# echo "TASKBEGIN hallo welt" > /tmp/gosa-si-client-fifo sub TASKBEGIN { my ($msg, $msg_hash, $session_id) = @_; - my $out_msg = &build_status_result_update_msg($msg_hash); - my @out_msg_l = ($out_msg); - return @out_msg_l; -} + my $header = @{$msg_hash->{'header'}}[0]; + my $source = @{$msg_hash->{'target'}}[0]; + my $macaddress = @{$msg_hash->{'macaddress'}}[0]; + my $content = @{$msg_hash->{$header}}[0]; -# echo "TASKEND hallo welt" > /tmp/gosa-si-client-fifo -sub TASKEND { - my ($msg, $msg_hash, $session_id) = @_; - my $out_msg = &build_status_result_update_msg($msg_hash); - my @out_msg_l = ($out_msg); - return @out_msg_l; -} + # test whether content is an empty hash or a string which is required + eval{ if( 0 == keys(%$content) ) { $content = ""; } }; + if( $@ ) { $content = "$content"; } + # clean up header + $header =~ s/CLMSG_//g; -# echo "TASKERROR hallo welt" > /tmp/gosa-si-client-fifo -sub TASKERROR { - my ($msg, $msg_hash, $session_id) = @_; - my $out_msg = &build_status_result_update_msg($msg_hash); - my @out_msg_l = ($out_msg); - return @out_msg_l; -} + # check if installation finished + 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 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); + + # set fai_state to localboot + &main::change_fai_state('localboot', \@{$msg_hash->{'macaddress'}}, $session_id); + } 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
+# macaddress auslesen, Client im LDAP lokalisieren +# FAIstate auf "localboot" setzen, wenn FAIstate "install" oder "softupdate" war + } -# echo "HOOK hallo welt" > /tmp/gosa-si-client-fifo -sub HOOK { - my ($msg, $msg_hash, $session_id) = @_; - my $out_msg = &build_status_result_update_msg($msg_hash); - my @out_msg_l = ($out_msg); - return @out_msg_l; + return; } -sub build_status_result_update_msg { - my ($msg_hash) = @_; - +sub TASKEND { + my ($msg, $msg_hash, $session_id) = @_; my $header = @{$msg_hash->{'header'}}[0]; my $source = @{$msg_hash->{'target'}}[0]; - my $target = @{$msg_hash->{'target'}}[0]; 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"; - } + eval{ if( 0 == keys(%$content) ) { $content = ""; } }; + if( $@ ) { $content = "$content"; } + # clean up header $header =~ s/CLMSG_//g; - my $out_msg = sprintf(" ". - "
gosa_update_status_jobdb_entry
". - "%s ". - "%s". - " ". - " ". - " ". - "processing ". - "%s ". - " ". - " ". - " ". - " ". - "processing ". - "%s ". - " ". - "
", $source, "JOBDB", $macaddress, $header.$content); - return $out_msg; -} - - -sub build_progress_update_msg { - my ($msg_hash) = @_; + 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
+# macaddress auslesen, Client im LDAP lokalisieren +# FAIstate auf "error" setzen + + return; +} + + +sub TASKERROR { + my ($msg, $msg_hash, $session_id) = @_; my $header = @{$msg_hash->{'header'}}[0]; my $source = @{$msg_hash->{'target'}}[0]; - my $target = @{$msg_hash->{'target'}}[0]; my $macaddress = @{$msg_hash->{'macaddress'}}[0]; + # clean up header + $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"; - } - - $header =~ s/CLMSG_//g; - my $out_msg = sprintf(" ". - "
gosa_update_status_jobdb_entry
". - "%s ". - "%s". - " ". - " ". - " ". - "processing ". - "%s ". - " ". - " ". - " ". - " ". - "%s ". - " ". - "
", $source, "JOBDB", $macaddress, $content); - return $out_msg; + eval{ if( 0 == keys(%$content) ) { $content = ""; } }; + if( $@ ) { $content = "$content"; } + + 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
+# macaddress auslesen, Client im LDAP lokalisieren +# FAIstate auf "error" setzen + + return; } -sub build_result_update_msg { - my ($msg_hash) = @_; - +sub HOOK { + my ($msg, $msg_hash, $session_id) = @_; my $header = @{$msg_hash->{'header'}}[0]; my $source = @{$msg_hash->{'target'}}[0]; - my $target = @{$msg_hash->{'target'}}[0]; my $macaddress = @{$msg_hash->{'macaddress'}}[0]; + # clean up header + $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"; - } + eval{ if( 0 == keys(%$content) ) { $content = ""; } }; + if( $@ ) { $content = "$content"; } - $header =~ s/CLMSG_//g; - my $out_msg = sprintf(" ". - "
gosa_update_status_jobdb_entry
". - "%s ". - "%s". - " ". - " ". - " ". - "processing ". - "%s ". - " ". - " ". - " ". - " ". - "%s ". - " ". - "
", $source, "JOBDB", $macaddress, $header.$content); - return $out_msg; + 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); + + return; }