dfac6725555c7010e51e5952778697f663a9ff64
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 "goto_activation_start",
18 );
19 @EXPORT = @events;
21 use strict;
22 use warnings;
23 use Data::Dumper;
24 use GOSA::GosaSupportDaemon;
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 goto_activation_start {
78 my ($msg, $msg_hash, $session_id) = @_;
79 my $header = @{$msg_hash->{'header'}}[0];
80 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
82 my $sql_statement = "UPDATE $main::job_queue_tn ".
83 "SET status='processing', progress='goto-activation' ".
84 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
85 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
86 my $res = $main::job_db->update_dbentry($sql_statement);
87 &main::daemon_log("$session_id INFO: '$header' at '$macaddress'", 5);
89 }
92 sub save_fai_log {
93 my ($msg, $msg_hash, $session_id) = @_;
94 my $header = @{$msg_hash->{'header'}}[0];
95 my $source = @{$msg_hash->{'source'}}[0];
96 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
97 my $all_logs = @{$msg_hash->{$header}}[0];
99 # if there is nothing to log
100 if( ref($all_logs) eq "HASH" ) { return; }
102 my $client_fai_log_dir = $main::client_fai_log_dir;
103 if (not -d $client_fai_log_dir) {
104 mkdir($client_fai_log_dir, 0755)
105 }
107 $client_fai_log_dir = File::Spec->catfile( $client_fai_log_dir, $macaddress );
108 if (not -d $client_fai_log_dir) {
109 mkdir($client_fai_log_dir, 0755)
110 }
112 my $time = &get_time;
113 $time = substr($time, 0, 8)."_".substr($time, 8, 6);
114 $client_fai_log_dir = File::Spec->catfile( $client_fai_log_dir, "install-$time" );
115 mkdir($client_fai_log_dir, 0755);
117 my @all_logs = split(/log_file:/, $all_logs);
118 foreach my $log (@all_logs) {
119 if (length $log == 0) { next; };
120 my ($log_file, $log_string) = split(":", $log);
121 my $client_fai_log_file = File::Spec->catfile( $client_fai_log_dir, $log_file);
123 open(my $LOG_FILE, ">$client_fai_log_file");
124 print $LOG_FILE &decode_base64($log_string);
125 close($LOG_FILE);
127 }
128 return;
129 }
132 sub LOGIN {
133 my ($msg, $msg_hash, $session_id) = @_;
134 my $header = @{$msg_hash->{'header'}}[0];
135 my $source = @{$msg_hash->{'source'}}[0];
136 my $login = @{$msg_hash->{$header}}[0];
138 my %add_hash = ( table=>$main::login_users_tn,
139 primkey=> ['client', 'user'],
140 client=>$source,
141 user=>$login,
142 timestamp=>&get_time,
143 );
144 my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash );
145 if ($res != 0) {
146 &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $error_str");
147 return;
148 }
150 return;
151 }
153 # TODO umstellen wie bei LOGIN
154 sub LOGOUT {
155 my ($msg, $msg_hash, $session_id) = @_;
156 my $header = @{$msg_hash->{'header'}}[0];
157 my $source = @{$msg_hash->{'source'}}[0];
158 my $login = @{$msg_hash->{$header}}[0];
160 my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$source'";
161 my $res = $main::known_clients_db->select_dbentry($sql_statement);
162 if( 1 != keys(%$res) ) {
163 &main::daemon_log("DEBUG: clMessages.pm: LOGOUT: no or more hits found in known_clients_db for host '$source'");
164 return;
165 }
167 my $act_login = $res->{'1'}->{'login'};
168 $act_login =~ s/$login,?//gi;
170 if( $act_login eq "" ){ $act_login = "nobody"; }
172 $sql_statement = "UPDATE known_clients SET login='$act_login' WHERE hostname='$source'";
173 $res = $main::known_clients_db->update_dbentry($sql_statement);
175 return;
176 }
179 sub CURRENTLY_LOGGED_IN {
180 my ($msg, $msg_hash, $session_id) = @_;
181 my ($sql_statement, $db_res);
182 my $header = @{$msg_hash->{'header'}}[0];
183 my $source = @{$msg_hash->{'source'}}[0];
184 my $login = @{$msg_hash->{$header}}[0];
186 if(ref $login eq "HASH") {
187 &main::daemon_log("$session_id INFO: no logged in users reported from host '$source'", 5);
188 return;
189 }
191 # fetch all user currently assigned to the client at login_users_db
192 my %currently_logged_in_user = ();
193 $sql_statement = "SELECT * FROM $main::login_users_tn WHERE client='$source'";
194 $db_res = $main::login_users_db->select_dbentry($sql_statement);
195 while( my($hit_id, $hit) = each(%{$db_res}) ) {
196 $currently_logged_in_user{$hit->{'user'}} = 1;
197 }
198 &main::daemon_log("$session_id DEBUG: logged in users from login_user_db: ".join(", ", keys(%currently_logged_in_user)), 7);
200 # update all reported users in login_user_db
201 my @logged_in_user = split(/\s+/, $login);
202 &main::daemon_log("$session_id DEBUG: logged in users reported from client: ".join(", ", @logged_in_user), 7);
203 foreach my $user (@logged_in_user) {
204 my %add_hash = ( table=>$main::login_users_tn,
205 primkey=> ['client', 'user'],
206 client=>$source,
207 user=>$user,
208 timestamp=>&get_time,
209 );
210 my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash );
211 if ($res != 0) {
212 &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $error_str");
213 return;
214 }
216 delete $currently_logged_in_user{$user};
217 }
219 # if there is still a user in %currently_logged_in_user
220 # although he is not reported by client
221 # then delete it from $login_user_db
222 foreach my $obsolete_user (keys(%currently_logged_in_user)) {
223 &main::daemon_log("$session_id WARNING: user '$obsolete_user' is currently not logged ".
224 "in at client '$source' but still found at login_user_db", 3);
225 my $sql_statement = "DELETE FROM $main::login_users_tn WHERE client='$source' AND user='$obsolete_user'";
226 my $res = $main::login_users_db->del_dbentry($sql_statement);
227 &main::daemon_log("$session_id WARNING: delete user '$obsolete_user' at client '$source' from login_user_db", 3);
228 }
230 return;
231 }
234 sub GOTOACTIVATION {
235 my ($msg, $msg_hash, $session_id) = @_;
236 my $header = @{$msg_hash->{'header'}}[0];
237 my $source = @{$msg_hash->{'target'}}[0];
238 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
240 # test whether content is an empty hash or a string which is required
241 #########
242 # testing
243 my $content = @{$msg_hash->{$header}}[0];
244 if(ref($content) eq "HASH") { $content = ""; }
245 #eval{ if( 0 == keys(%$content) ) { $content = ""; } };
246 #if( $@ ) { $content = "$content"; }
247 # testing
248 ########
250 # clean up header
251 $header =~ s/CLMSG_//g;
253 my $sql_statement = "UPDATE $main::job_queue_tn ".
254 "SET status='processing', result='$header"."$content' ".
255 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
256 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
257 my $res = $main::job_db->update_dbentry($sql_statement);
258 &main::daemon_log("$session_id INFO: $header at '$macaddress'", 5);
259 return;
260 }
263 sub PROGRESS {
264 my ($msg, $msg_hash, $session_id) = @_;
265 my $header = @{$msg_hash->{'header'}}[0];
266 my $source = @{$msg_hash->{'target'}}[0];
267 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
269 # test whether content is an empty hash or a string which is required
270 # TODO eval ändern auf if(ref($content) eq "HASH") dann ... else, dann...
271 #########
272 # testing
273 my $content = @{$msg_hash->{$header}}[0];
274 if(ref($content) eq "HASH") { $content = ""; }
275 #eval{ if( 0 == keys(%$content) ) { $content = ""; } };
276 #if( $@ ) { $content = "$content"; }
277 # testing
278 ########
280 # clean up header
281 $header =~ s/CLMSG_//g;
283 my $sql_statement = "UPDATE $main::job_queue_tn ".
284 "SET progress='$content' ".
285 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
286 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
287 my $res = $main::job_db->update_dbentry($sql_statement);
288 &main::daemon_log("$session_id INFO: $header at '$macaddress' - $content%", 5);
290 return;
291 }
294 sub FAIREBOOT {
295 my ($msg, $msg_hash, $session_id) = @_;
296 my $header = @{$msg_hash->{'header'}}[0];
297 my $source = @{$msg_hash->{'target'}}[0];
298 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
300 # test whether content is an empty hash or a string which is required
301 # TODO eval ändern auf if(ref($content) eq "HASH") dann ... else, dann...
302 #########
303 # testing
304 my $content = @{$msg_hash->{$header}}[0];
305 if(ref($content) eq "HASH") { $content = ""; }
306 #eval{ if( 0 == keys(%$content) ) { $content = ""; } };
307 #if( $@ ) { $content = "$content"; }
308 # testing
309 #########
311 # clean up header
312 $header =~ s/CLMSG_//g;
314 my $sql_statement = "UPDATE $main::job_queue_tn ".
315 "SET status='processing', result='$header "."$content' ".
316 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
317 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
318 my $res = $main::job_db->update_dbentry($sql_statement);
319 &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5);
321 return;
322 }
325 sub TASKSKIP {
326 my ($msg, $msg_hash, $session_id) = @_;
327 my $header = @{$msg_hash->{'header'}}[0];
328 my $source = @{$msg_hash->{'target'}}[0];
329 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
331 # test whether content is an empty hash or a string which is required
332 # TODO eval ändern auf if(ref($content) eq "HASH") dann ... else, dann...
333 #########
334 # testing
335 my $content = @{$msg_hash->{$header}}[0];
336 if(ref($content) eq "HASH") { $content = ""; }
337 #eval{ if( 0 == keys(%$content) ) { $content = ""; } };
338 #if( $@ ) { $content = "$content"; }
339 # testing
340 #########
342 # clean up header
343 $header =~ s/CLMSG_//g;
345 my $sql_statement = "UPDATE $main::job_queue_tn ".
346 "SET status='processing', result='$header "."$content' ".
347 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
348 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
349 my $res = $main::job_db->update_dbentry($sql_statement);
350 &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5);
352 return;
353 }
356 sub TASKBEGIN {
357 my ($msg, $msg_hash, $session_id) = @_;
358 my $header = @{$msg_hash->{'header'}}[0];
359 my $source = @{$msg_hash->{'target'}}[0];
360 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
361 my $content = @{$msg_hash->{$header}}[0];
363 # test whether content is an empty hash or a string which is required
364 # TODO eval ändern auf if(ref($content) eq "HASH") dann ... else, dann...
365 #########
366 # testing
367 my $content = @{$msg_hash->{$header}}[0];
368 if(ref($content) eq "HASH") { $content = ""; }
369 #eval{ if( 0 == keys(%$content) ) { $content = ""; } };
370 #if( $@ ) { $content = "$content"; }
371 # testing
372 #########
374 # clean up header
375 $header =~ s/CLMSG_//g;
377 # check if installation finished
378 if (($content eq 'finish') || ($content eq 'faiend')){
379 my $sql_statement = "UPDATE $main::job_queue_tn ".
380 "SET status='done', result='$header "."$content' ".
381 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
382 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
383 my $res = $main::job_db->update_dbentry($sql_statement);
384 &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5);
386 # set fai_state to localboot
387 &main::change_fai_state('localboot', \@{$msg_hash->{'macaddress'}}, $session_id);
389 } else {
390 my $sql_statement = "UPDATE $main::job_queue_tn ".
391 "SET status='processing', result='$header "."$content' ".
392 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
393 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
394 my $res = $main::job_db->update_dbentry($sql_statement);
395 &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5);
398 # -----------------------> Update hier
399 # <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
400 # <header>CLMSG_TASKBEGIN</header>
401 # macaddress auslesen, Client im LDAP lokalisieren
402 # FAIstate auf "localboot" setzen, wenn FAIstate "install" oder "softupdate" war
403 }
405 return;
406 }
409 sub TASKEND {
410 my ($msg, $msg_hash, $session_id) = @_;
411 my $header = @{$msg_hash->{'header'}}[0];
412 my $source = @{$msg_hash->{'target'}}[0];
413 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
415 # test whether content is an empty hash or a string which is required
416 # TODO eval ändern auf if(ref($content) eq "HASH") dann ... else, dann...
417 #########
418 # testing
419 my $content = @{$msg_hash->{$header}}[0];
420 if(ref($content) eq "HASH") { $content = ""; }
421 #eval{ if( 0 == keys(%$content) ) { $content = ""; } };
422 #if( $@ ) { $content = "$content"; }
423 # testing
424 #########
426 # clean up header
427 $header =~ s/CLMSG_//g;
429 my $sql_statement = "UPDATE $main::job_queue_tn ".
430 "SET status='processing', result='$header "."$content' ".
431 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
432 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
433 my $res = $main::job_db->update_dbentry($sql_statement);
434 &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5);
436 # -----------------------> Update hier
437 # <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
438 # <header>CLMSG_TASKBEGIN</header>
439 # macaddress auslesen, Client im LDAP lokalisieren
440 # FAIstate auf "error" setzen
442 return;
443 }
446 sub TASKERROR {
447 my ($msg, $msg_hash, $session_id) = @_;
448 my $header = @{$msg_hash->{'header'}}[0];
449 my $source = @{$msg_hash->{'target'}}[0];
450 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
452 # clean up header
453 $header =~ s/CLMSG_//g;
455 # test whether content is an empty hash or a string which is required
456 # TODO eval ändern auf if(ref($content) eq "HASH") dann ... else, dann...
457 #########
458 # testing
459 my $content = @{$msg_hash->{$header}}[0];
460 if(ref($content) eq "HASH") { $content = ""; }
461 #eval{ if( 0 == keys(%$content) ) { $content = ""; } };
462 #if( $@ ) { $content = "$content"; }
463 # testing
464 #########
466 # set fai_state to localboot
467 &main::change_fai_state('error', \@{$msg_hash->{'macaddress'}}, $session_id);
469 my $sql_statement = "UPDATE $main::job_queue_tn ".
470 "SET status='processing', result='$header "."$content' ".
471 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
472 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
473 my $res = $main::job_db->update_dbentry($sql_statement);
474 &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5);
476 # -----------------------> Update hier
477 # <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
478 # <header>CLMSG_TASKBEGIN</header>
479 # macaddress auslesen, Client im LDAP lokalisieren
480 # FAIstate auf "error" setzen
482 return;
483 }
486 sub HOOK {
487 my ($msg, $msg_hash, $session_id) = @_;
488 my $header = @{$msg_hash->{'header'}}[0];
489 my $source = @{$msg_hash->{'target'}}[0];
490 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
492 # clean up header
493 $header =~ s/CLMSG_//g;
495 # test whether content is an empty hash or a string which is required
496 # TODO eval ändern auf if(ref($content) eq "HASH") dann ... else, dann...
497 #########
498 # testing
499 my $content = @{$msg_hash->{$header}}[0];
500 if(ref($content) eq "HASH") { $content = ""; }
501 #eval{ if( 0 == keys(%$content) ) { $content = ""; } };
502 #if( $@ ) { $content = "$content"; }
503 # testing
504 #########
506 my $sql_statement = "UPDATE $main::job_queue_tn ".
507 "SET status='processing', result='$header "."$content' ".
508 "WHERE status='processing' AND macaddress LIKE '$macaddress'";
509 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
510 my $res = $main::job_db->update_dbentry($sql_statement);
511 &main::daemon_log("$session_id INFO: $header at '$macaddress' - '$content'", 5);
513 return;
514 }
517 1;