cf409c54f7e2a9afcaf3370975de26f9f5437fa4
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, 0, 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;
109 }
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;
131 }
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);
155 return;
156 }
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;
204 }
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 LIKE '$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;
228 }
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 LIKE '$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;
254 }
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 LIKE '$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;
279 }
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 LIKE '$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;
304 }
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 LIKE '$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);
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 LIKE '$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;
350 }
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 LIKE '$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;
381 }
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 LIKE '$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;
412 }
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 LIKE '$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;
437 }
440 1;