Code

change 'goto-activation-start' function to 'goto_activation_start'
[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         "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];
81         
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); 
88         
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; }
101         
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;
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;   
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);
174     
175     return;
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     }
190     
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;
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; 
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;
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; 
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; 
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); 
385         
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; 
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; 
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);
468                 
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; 
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;
517 1;