index 0ec31d5c177fe4ab75446118aaa8bf5abdf190d5..576fca207dfcbbdbc274c9efef6372221451b429 100644 (file)
"LOGIN",
"LOGOUT",
"CURRENTLY_LOGGED_IN",
+ "save_fai_log",
);
@EXPORT = @events;
use warnings;
use Data::Dumper;
use GOSA::GosaSupportDaemon;
-use utf8;
+use MIME::Base64;
BEGIN {}
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 {
}
+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];
);
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;
}
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'],
);
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;
}
# 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;
# 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;
}
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;
}
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;
}
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
+
+# TODO
+ # resolve plain name for host $macaddress
+ &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=>'none',
+ };
+ 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
# <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
# 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
# <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
# <header>CLMSG_TASKBEGIN</header>
# 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
# <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
$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;
}