Code

after client finish installation, logs are saved at server
[gosa.git] / gosa-si / server / events / clMessages.pm
1 package clMessages;
2 use Exporter;
3 @ISA = qw(Exporter);
4 my @events = (
5     "PROGRESS",
6     "FAIREBOOT",
7     "TASKSKIP",
8     "TASKBEGIN",
9     "TASKEND",
10     "TASKERROR",
11     "HOOK",
12     "GOTOACTIVATION",
13     "LOGIN",
14     "LOGOUT",
15     "CURRENTLY_LOGGED_IN",
16     "save_fai_log",
17     );
18 @EXPORT = @events;
20 use strict;
21 use warnings;
22 use Data::Dumper;
23 use GOSA::GosaSupportDaemon;
24 use utf8;
25 use MIME::Base64;
28 BEGIN {}
30 END {}
32 ### Start ######################################################################
34 my $ldap_uri;
35 my $ldap_base;
36 my $ldap_admin_dn;
37 my $ldap_admin_password;
39 my %cfg_defaults = (
40 "server" => {
41    "ldap-uri" => [\$ldap_uri, ""],
42    "ldap-base" => [\$ldap_base, ""],
43    "ldap-admin-dn" => [\$ldap_admin_dn, ""],
44    "ldap-admin-password" => [\$ldap_admin_password, ""],
45    },
46 );
47 &read_configfile($main::cfg_file, %cfg_defaults);
50 sub get_events {
51     return \@events;
52 }
55 sub read_configfile {
56     my ($cfg_file, %cfg_defaults) = @_;
57     my $cfg;
59     if( defined( $cfg_file) && ( length($cfg_file) > 0 )) {
60         if( -r $cfg_file ) {
61             $cfg = Config::IniFiles->new( -file => $cfg_file );
62         } else {
63             &main::daemon_log("ERROR: clMessages.pm couldn't read config file!", 1);
64         }
65     } else {
66         $cfg = Config::IniFiles->new() ;
67     }
68     foreach my $section (keys %cfg_defaults) {
69         foreach my $param (keys %{$cfg_defaults{ $section }}) {
70             my $pinfo = $cfg_defaults{ $section }{ $param };
71             ${@$pinfo[0]} = $cfg->val( $section, $param, @$pinfo[1] );
72         }
73     }
74 }
77 sub save_fai_log {
78     my ($msg, $msg_hash, $session_id) = @_;
79     my $header = @{$msg_hash->{'header'}}[0];
80     my $source = @{$msg_hash->{'source'}}[0];
81     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
82     my $all_logs = @{$msg_hash->{$header}}[0];
84     my $client_fai_log_dir = $main::client_fai_log_dir;
85     if (not -d $client_fai_log_dir) {
86         mkdir($client_fai_log_dir, 0755)
87     }
89     $client_fai_log_dir = File::Spec->catfile( $client_fai_log_dir, $macaddress );
90     if (not -d $client_fai_log_dir) {
91         mkdir($client_fai_log_dir, 0755)
92     }
94     my $time = &get_time;
95     $time = substr($time, 1, 8)."_".substr($time, 8, 6);
96     $client_fai_log_dir = File::Spec->catfile( $client_fai_log_dir, "install-$time" );
97     mkdir($client_fai_log_dir, 0755);
99     my @all_logs = split(/log_file:/, $all_logs); 
100     foreach my $log (@all_logs) {
101         if (length $log == 0) { next; };
102         my ($log_file, $log_string) = split("\n", $log, 2);
103         my $client_fai_log_file = File::Spec->catfile( $client_fai_log_dir, $log_file);
104         open(my $LOG_FILE, ">$client_fai_log_file"); 
105         print $LOG_FILE &decode_base64($log_string);
106         close($LOG_FILE);
107     }
108     return;
112 sub LOGIN {
113     my ($msg, $msg_hash, $session_id) = @_;
114     my $header = @{$msg_hash->{'header'}}[0];
115     my $source = @{$msg_hash->{'source'}}[0];
116     my $login = @{$msg_hash->{$header}}[0];
118     my %add_hash = ( table=>$main::login_users_tn, 
119         primkey=> ['client', 'user'],
120         client=>$source,
121         user=>$login,
122         timestamp=>&get_time,
123         ); 
124     my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash );
125     if ($res != 0)  {
126         &main::daemon_log("ERROR: cannot add entry to known_clients: $error_str");
127         return;
128     }
130     return;   
133 # TODO umstellen wie bei LOGIN
134 sub LOGOUT {
135     my ($msg, $msg_hash, $session_id) = @_;
136     my $header = @{$msg_hash->{'header'}}[0];
137     my $source = @{$msg_hash->{'source'}}[0];
138     my $login = @{$msg_hash->{$header}}[0];
140     my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$source'";
141     my $res = $main::known_clients_db->select_dbentry($sql_statement);
142     if( 1 != keys(%$res) ) {
143         &main::daemon_log("DEBUG: clMessages.pm: LOGOUT: no or more hits found in known_clients_db for host '$source'");
144         return;
145     }
147     my $act_login = $res->{'1'}->{'login'};
148     $act_login =~ s/$login,?//gi;
150     if( $act_login eq "" ){ $act_login = "nobody"; }
152     $sql_statement = "UPDATE known_clients SET login='$act_login' WHERE hostname='$source'";
153     $res = $main::known_clients_db->update_dbentry($sql_statement);
154     
155     return;
159 sub CURRENTLY_LOGGED_IN {
160     my ($msg, $msg_hash, $session_id) = @_;
161     my ($sql_statement, $db_res);
162     my $header = @{$msg_hash->{'header'}}[0];
163     my $source = @{$msg_hash->{'source'}}[0];
164     my $login = @{$msg_hash->{$header}}[0];
166     $sql_statement = "SELECT * FROM $main::login_users_tn WHERE client='$source'"; 
167     $db_res = $main::login_users_db->select_dbentry($sql_statement);
168     my %currently_logged_in_user = (); 
169     while( my($hit_id, $hit) = each(%{$db_res}) ) {
170         $currently_logged_in_user{$hit->{'user'}} = 1;
171     }
172     &main::daemon_log("DEBUG: logged in users from login_user_db: ".join(", ", keys(%currently_logged_in_user)), 7); 
174     my @logged_in_user = split(/\s+/, $login);
175     &main::daemon_log("DEBUG: logged in users reported from client: ".join(", ", @logged_in_user), 7); 
176     foreach my $user (@logged_in_user) {
177         my %add_hash = ( table=>$main::login_users_tn, 
178                 primkey=> ['client', 'user'],
179                 client=>$source,
180                 user=>$user,
181                 timestamp=>&get_time,
182                 ); 
183         my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash );
184         if ($res != 0)  {
185             &main::daemon_log("ERROR: cannot add entry to known_clients: $error_str");
186             return;
187         }
189         delete $currently_logged_in_user{$user};
190     }
192     # if there is still a user in %currently_logged_in_user 
193     # although he is not reported by client 
194     # then delete it from $login_user_db
195     foreach my $obsolete_user (keys(%currently_logged_in_user)) {
196         &main::daemon_log("WARNING: user '$obsolete_user' is currently not logged ".
197                 "in at client '$source' but still found at login_user_db", 3); 
198         my $sql_statement = "DELETE FROM $main::login_users_tn WHERE client='$source' AND user='$obsolete_user'"; 
199         my $res =  $main::login_users_db->del_dbentry($sql_statement);
200         &main::daemon_log("WARNING: delete user '$obsolete_user' at client '$source' from login_user_db", 3); 
201     }
203     return;
207 sub GOTOACTIVATION {
208     my ($msg, $msg_hash, $session_id) = @_;
209     my $header = @{$msg_hash->{'header'}}[0];
210     my $source = @{$msg_hash->{'target'}}[0];
211     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
213     # test whether content is an empty hash or a string which is required
214     my $content = @{$msg_hash->{$header}}[0];
215     eval{ if( 0 == keys(%$content) ) { $content = ""; } };
216     if( $@ ) { $content = "$content"; }
218     # clean up header
219     $header =~ s/CLMSG_//g;
221     my $sql_statement = "UPDATE $main::job_queue_tn ".
222             "SET status='processing', result='$header"."$content' ".
223             "WHERE status='processing' AND macaddress='$macaddress'"; 
224     &main::daemon_log("DEBUG: $sql_statement", 7);         
225     my $res = $main::job_db->update_dbentry($sql_statement);
226     &main::daemon_log("INFO: $header at '$macaddress'", 5); 
227     return; 
231 sub PROGRESS {
232     my ($msg, $msg_hash, $session_id) = @_;
233     my $header = @{$msg_hash->{'header'}}[0];
234     my $source = @{$msg_hash->{'target'}}[0];
235     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
237     # test whether content is an empty hash or a string which is required
238     my $content;
239     my $cont = @{$msg_hash->{$header}}[0];
240     eval{ if( 0 == keys(%$cont) ) { $content = ""; } };
241     if( $@ ) { $content = "$cont"; }
243     # clean up header
244     $header =~ s/CLMSG_//g;
246     my $sql_statement = "UPDATE $main::job_queue_tn ".
247         "SET progress='$content' ".
248         "WHERE status='processing' AND macaddress='$macaddress'";
249     &main::daemon_log("DEBUG: $sql_statement", 7);         
250     my $res = $main::job_db->update_dbentry($sql_statement);
251     &main::daemon_log("INFO: $header at '$macaddress' - $content%", 5); 
253     return;
257 sub FAIREBOOT {
258     my ($msg, $msg_hash, $session_id) = @_;
259     my $header = @{$msg_hash->{'header'}}[0];
260     my $source = @{$msg_hash->{'target'}}[0];
261     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
263     # test whether content is an empty hash or a string which is required
264     my $content = @{$msg_hash->{$header}}[0];
265     eval{ if( 0 == keys(%$content) ) { $content = ""; } };
266     if( $@ ) { $content = "$content"; }
268     # clean up header
269     $header =~ s/CLMSG_//g;
271     my $sql_statement = "UPDATE $main::job_queue_tn ".
272             "SET status='processing', result='$header "."$content' ".
273             "WHERE status='processing' AND macaddress='$macaddress'"; 
274     &main::daemon_log("DEBUG: $sql_statement", 7);         
275     my $res = $main::job_db->update_dbentry($sql_statement);
276     &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); 
278     return; 
282 sub TASKSKIP {
283     my ($msg, $msg_hash, $session_id) = @_;
284     my $header = @{$msg_hash->{'header'}}[0];
285     my $source = @{$msg_hash->{'target'}}[0];
286     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
288     # test whether content is an empty hash or a string which is required
289     my $content = @{$msg_hash->{$header}}[0];
290     eval{ if( 0 == keys(%$content) ) { $content = ""; } };
291     if( $@ ) { $content = "$content"; }
293     # clean up header
294     $header =~ s/CLMSG_//g;
296     my $sql_statement = "UPDATE $main::job_queue_tn ".
297             "SET status='processing', result='$header "."$content' ".
298             "WHERE status='processing' AND macaddress='$macaddress'"; 
299     &main::daemon_log("DEBUG: $sql_statement", 7);         
300     my $res = $main::job_db->update_dbentry($sql_statement);
301     &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); 
303     return; 
307 sub TASKBEGIN {
308     my ($msg, $msg_hash, $session_id) = @_;
309     my $header = @{$msg_hash->{'header'}}[0];
310     my $source = @{$msg_hash->{'target'}}[0];
311     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
312     my $content = @{$msg_hash->{$header}}[0];
314     # test whether content is an empty hash or a string which is required
315     eval{ if( 0 == keys(%$content) ) { $content = ""; } };
316     if( $@ ) { $content = "$content"; }
318     # clean up header
319     $header =~ s/CLMSG_//g;
321     # check if installation finished
322     if (($content eq 'finish') || ($content eq 'faiend')){
323         my $sql_statement = "UPDATE $main::job_queue_tn ".
324             "SET status='done', result='$header "."$content' ".
325             "WHERE status='processing' AND macaddress='$macaddress'"; 
326         &main::daemon_log("DEBUG: $sql_statement", 7);         
327         my $res = $main::job_db->update_dbentry($sql_statement);
328         &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); 
329         
330         # set fai_state to localboot
331         &main::change_fai_state('localboot', \@{$msg_hash->{target}});
333     } else {
334         my $sql_statement = "UPDATE $main::job_queue_tn ".
335             "SET status='processing', result='$header "."$content' ".
336             "WHERE status='processing' AND macaddress='$macaddress'"; 
337         &main::daemon_log("DEBUG: $sql_statement", 7);         
338         my $res = $main::job_db->update_dbentry($sql_statement);
339         &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); 
342 # -----------------------> Update hier
343 #  <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
344 #  <header>CLMSG_TASKBEGIN</header>
345 # macaddress auslesen, Client im LDAP lokalisieren
346 # FAIstate auf "localboot" setzen, wenn FAIstate "install" oder "softupdate" war
347     }
349     return; 
353 sub TASKEND {
354     my ($msg, $msg_hash, $session_id) = @_;
355     my $header = @{$msg_hash->{'header'}}[0];
356     my $source = @{$msg_hash->{'target'}}[0];
357     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
359     # test whether content is an empty hash or a string which is required
360     my $content = @{$msg_hash->{$header}}[0];
361     eval{ if( 0 == keys(%$content) ) { $content = ""; } };
362     if( $@ ) { $content = "$content"; }
364     # clean up header
365     $header =~ s/CLMSG_//g;
367     my $sql_statement = "UPDATE $main::job_queue_tn ".
368             "SET status='processing', result='$header "."$content' ".
369             "WHERE status='processing' AND macaddress='$macaddress'"; 
370     &main::daemon_log("DEBUG: $sql_statement", 7);         
371     my $res = $main::job_db->update_dbentry($sql_statement);
372     &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); 
374 # -----------------------> Update hier
375 #  <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
376 #  <header>CLMSG_TASKBEGIN</header>
377 # macaddress auslesen, Client im LDAP lokalisieren
378 # FAIstate auf "error" setzen
380     return; 
384 sub TASKERROR {
385     my ($msg, $msg_hash, $session_id) = @_;
386     my $header = @{$msg_hash->{'header'}}[0];
387     my $source = @{$msg_hash->{'target'}}[0];
388     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
390     # clean up header
391     $header =~ s/CLMSG_//g;
393     # test whether content is an empty hash or a string which is required
394     my $content = @{$msg_hash->{$header}}[0];
395     eval{ if( 0 == keys(%$content) ) { $content = ""; } };
396     if( $@ ) { $content = "$content"; }
398     my $sql_statement = "UPDATE $main::job_queue_tn ".
399             "SET status='processing', result='$header "."$content' ".
400             "WHERE status='processing' AND macaddress='$macaddress'"; 
401     &main::daemon_log("DEBUG: $sql_statement", 7);         
402     my $res = $main::job_db->update_dbentry($sql_statement);
403     &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); 
405 # -----------------------> Update hier
406 #  <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
407 #  <header>CLMSG_TASKBEGIN</header>
408 # macaddress auslesen, Client im LDAP lokalisieren
409 # FAIstate auf "error" setzen
411     return; 
415 sub HOOK {
416     my ($msg, $msg_hash, $session_id) = @_;
417     my $header = @{$msg_hash->{'header'}}[0];
418     my $source = @{$msg_hash->{'target'}}[0];
419     my $macaddress = @{$msg_hash->{'macaddress'}}[0];
421     # clean up header
422     $header =~ s/CLMSG_//g;
424     # test whether content is an empty hash or a string which is required
425     my $content = @{$msg_hash->{$header}}[0];
426     eval{ if( 0 == keys(%$content) ) { $content = ""; } };
427     if( $@ ) { $content = "$content"; }
429     my $sql_statement = "UPDATE $main::job_queue_tn ".
430             "SET status='processing', result='$header "."$content' ".
431             "WHERE status='processing' AND macaddress='$macaddress'"; 
432     &main::daemon_log("DEBUG: $sql_statement", 7);         
433     my $res = $main::job_db->update_dbentry($sql_statement);
434     &main::daemon_log("INFO: $header at '$macaddress' - '$content'", 5); 
436     return;
440 1;