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 );
17 @EXPORT = @events;
19 use strict;
20 use warnings;
21 use Data::Dumper;
22 use GOSA::GosaSupportDaemon;
23 use utf8;
26 BEGIN {}
28 END {}
30 ### Start ######################################################################
32 my $ldap_uri;
33 my $ldap_base;
34 my $ldap_admin_dn;
35 my $ldap_admin_password;
37 my %cfg_defaults = (
38 "server" => {
39 "ldap-uri" => [\$ldap_uri, ""],
40 "ldap-base" => [\$ldap_base, ""],
41 "ldap-admin-dn" => [\$ldap_admin_dn, ""],
42 "ldap-admin-password" => [\$ldap_admin_password, ""],
43 },
44 );
45 &read_configfile($main::cfg_file, %cfg_defaults);
48 sub get_events {
49 return \@events;
50 }
53 sub read_configfile {
54 my ($cfg_file, %cfg_defaults) = @_;
55 my $cfg;
57 if( defined( $cfg_file) && ( length($cfg_file) > 0 )) {
58 if( -r $cfg_file ) {
59 $cfg = Config::IniFiles->new( -file => $cfg_file );
60 } else {
61 &main::daemon_log("ERROR: clMessages.pm couldn't read config file!", 1);
62 }
63 } else {
64 $cfg = Config::IniFiles->new() ;
65 }
66 foreach my $section (keys %cfg_defaults) {
67 foreach my $param (keys %{$cfg_defaults{ $section }}) {
68 my $pinfo = $cfg_defaults{ $section }{ $param };
69 ${@$pinfo[0]} = $cfg->val( $section, $param, @$pinfo[1] );
70 }
71 }
72 }
75 sub LOGIN {
76 my ($msg, $msg_hash, $session_id) = @_;
77 my $header = @{$msg_hash->{'header'}}[0];
78 my $source = @{$msg_hash->{'source'}}[0];
79 my $login = @{$msg_hash->{$header}}[0];
81 my %add_hash = ( table=>$main::login_users_tn,
82 primkey=> ['client', 'user'],
83 client=>$source,
84 user=>$login,
85 timestamp=>&get_time,
86 );
87 my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash );
88 if ($res != 0) {
89 &main::daemon_log("ERROR: cannot add entry to known_clients: $error_str");
90 return;
91 }
93 return;
94 }
96 # TODO umstellen wie bei LOGIN
97 sub LOGOUT {
98 my ($msg, $msg_hash, $session_id) = @_;
99 my $header = @{$msg_hash->{'header'}}[0];
100 my $source = @{$msg_hash->{'source'}}[0];
101 my $login = @{$msg_hash->{$header}}[0];
103 my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$source'";
104 my $res = $main::known_clients_db->select_dbentry($sql_statement);
105 if( 1 != keys(%$res) ) {
106 &main::daemon_log("DEBUG: clMessages.pm: LOGOUT: no or more hits found in known_clients_db for host '$source'");
107 return;
108 }
110 my $act_login = $res->{'1'}->{'login'};
111 $act_login =~ s/$login,?//gi;
113 if( $act_login eq "" ){ $act_login = "nobody"; }
115 $sql_statement = "UPDATE known_clients SET login='$act_login' WHERE hostname='$source'";
116 $res = $main::known_clients_db->update_dbentry($sql_statement);
118 return;
119 }
122 sub CURRENTLY_LOGGED_IN {
123 my ($msg, $msg_hash, $session_id) = @_;
124 my ($sql_statement, $db_res);
125 my $header = @{$msg_hash->{'header'}}[0];
126 my $source = @{$msg_hash->{'source'}}[0];
127 my $login = @{$msg_hash->{$header}}[0];
129 $sql_statement = "SELECT * FROM $main::login_users_tn WHERE client='$source'";
130 $db_res = $main::login_users_db->select_dbentry($sql_statement);
131 my %currently_logged_in_user = ();
132 while( my($hit_id, $hit) = each(%{$db_res}) ) {
133 $currently_logged_in_user{$hit->{'user'}} = 1;
134 }
135 &main::daemon_log("DEBUG: logged in users from login_user_db: ".join(", ", keys(%currently_logged_in_user)), 7);
137 my @logged_in_user = split(/\s+/, $login);
138 &main::daemon_log("DEBUG: logged in users reported from client: ".join(", ", @logged_in_user), 7);
139 foreach my $user (@logged_in_user) {
140 my %add_hash = ( table=>$main::login_users_tn,
141 primkey=> ['client', 'user'],
142 client=>$source,
143 user=>$user,
144 timestamp=>&get_time,
145 );
146 my ($res, $error_str) = $main::login_users_db->add_dbentry( \%add_hash );
147 if ($res != 0) {
148 &main::daemon_log("ERROR: cannot add entry to known_clients: $error_str");
149 return;
150 }
152 delete $currently_logged_in_user{$user};
153 }
155 # if there is still a user in %currently_logged_in_user
156 # although he is not reported by client
157 # then delete it from $login_user_db
158 foreach my $obsolete_user (keys(%currently_logged_in_user)) {
159 &main::daemon_log("WARNING: user '$obsolete_user' is currently not logged ".
160 "in at client '$source' but still found at login_user_db", 3);
161 my $sql_statement = "DELETE FROM $main::login_users_tn WHERE client='$source' AND user='$obsolete_user'";
162 my $res = $main::login_users_db->del_dbentry($sql_statement);
163 &main::daemon_log("WARNING: delete user '$obsolete_user' at client '$source' from login_user_db", 3);
164 }
166 return;
167 }
170 sub GOTOACTIVATION {
171 my ($msg, $msg_hash, $session_id) = @_;
172 my $out_msg = &build_result_update_msg($msg_hash);
173 my @out_msg_l = ($out_msg);
174 return @out_msg_l;
175 }
178 sub PROGRESS {
179 my ($msg, $msg_hash, $session_id) = @_;
180 my $out_msg = &build_progress_update_msg($msg_hash);
181 my @out_msg_l = ($out_msg);
182 return @out_msg_l;
183 }
186 sub FAIREBOOT {
187 my ($msg, $msg_hash, $session_id) = @_;
188 my $out_msg = &build_status_result_update_msg($msg_hash);
189 my @out_msg_l = ($out_msg);
190 return @out_msg_l;
191 }
194 sub TASKSKIP {
195 my ($msg, $msg_hash, $session_id) = @_;
196 my $out_msg = &build_status_result_update_msg($msg_hash);
197 my @out_msg_l = ($out_msg);
198 return @out_msg_l;
199 }
203 sub TASKBEGIN {
204 my ($msg, $msg_hash, $session_id) = @_;
205 my $out_msg = &build_status_result_update_msg($msg_hash);
206 my @out_msg_l = ($out_msg);
208 # -----------------------> Update hier
209 # <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
210 # <header>CLMSG_TASKBEGIN</header>
211 # macaddress auslesen, Client im LDAP lokalisieren
212 # FAIstate auf "localboot" setzen, wenn FAIstate "install" oder "softupdate" war
214 return @out_msg_l;
215 }
218 sub TASKEND {
219 my ($msg, $msg_hash, $session_id) = @_;
220 my $out_msg = &build_status_result_update_msg($msg_hash);
221 my @out_msg_l = ($out_msg);
223 # -----------------------> Update hier
224 # <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
225 # <header>CLMSG_TASKBEGIN</header>
226 # macaddress auslesen, Client im LDAP lokalisieren
227 # FAIstate auf "error" setzen
229 return @out_msg_l;
230 }
233 sub TASKERROR {
234 my ($msg, $msg_hash, $session_id) = @_;
235 my $out_msg = &build_status_result_update_msg($msg_hash);
236 my @out_msg_l = ($out_msg);
238 # -----------------------> Update hier
239 # <CLMSG_TASKBEGIN>finish</CLMSG_TASKBEGIN>
240 # <header>CLMSG_TASKBEGIN</header>
241 # macaddress auslesen, Client im LDAP lokalisieren
242 # FAIstate auf "error" setzen
244 return @out_msg_l;
245 }
248 sub HOOK {
249 my ($msg, $msg_hash, $session_id) = @_;
250 my $out_msg = &build_status_result_update_msg($msg_hash);
251 my @out_msg_l = ($out_msg);
252 return @out_msg_l;
253 }
256 sub build_status_result_update_msg {
257 my ($msg_hash) = @_;
259 my $header = @{$msg_hash->{'header'}}[0];
260 my $source = @{$msg_hash->{'target'}}[0];
261 my $target = @{$msg_hash->{'target'}}[0];
262 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
264 # test whether content is an empty hash or a string which is required
265 my $content = @{$msg_hash->{$header}}[0];
266 eval{
267 if( 0 == keys(%$content) ) {
268 $content = "";
269 }
270 };
271 if( $@ ) {
272 $content = " $content";
273 }
275 $header =~ s/CLMSG_//g;
276 my $out_msg = sprintf("<xml> ".
277 "<header>gosa_update_status_jobdb_entry</header> ".
278 "<source>%s</source> ".
279 "<target>%s</target>".
280 "<where> ".
281 "<clause> ".
282 "<phrase> ".
283 "<status>processing</status> ".
284 "<macaddress>%s</macaddress> ".
285 "</phrase> ".
286 "</clause> ".
287 "</where> ".
288 "<update> ".
289 "<status>processing</status> ".
290 "<result>%s</result> ".
291 "</update> ".
292 "</xml>", $source, "JOBDB", $macaddress, $header.$content);
293 return $out_msg;
294 }
297 sub build_progress_update_msg {
298 my ($msg_hash) = @_;
300 my $header = @{$msg_hash->{'header'}}[0];
301 my $source = @{$msg_hash->{'target'}}[0];
302 my $target = @{$msg_hash->{'target'}}[0];
303 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
305 # test whether content is an empty hash or a string which is required
306 my $content = @{$msg_hash->{$header}}[0];
307 eval{
308 if( 0 == keys(%$content) ) {
309 $content = "";
310 }
311 };
312 if( $@ ) {
313 $content = "$content";
314 }
316 $header =~ s/CLMSG_//g;
317 my $out_msg = sprintf("<xml> ".
318 "<header>gosa_update_status_jobdb_entry</header> ".
319 "<source>%s</source> ".
320 "<target>%s</target>".
321 "<where> ".
322 "<clause> ".
323 "<phrase> ".
324 "<status>processing</status> ".
325 "<macaddress>%s</macaddress> ".
326 "</phrase> ".
327 "</clause> ".
328 "</where> ".
329 "<update> ".
330 "<progress>%s</progress> ".
331 "</update> ".
332 "</xml>", $source, "JOBDB", $macaddress, $content);
333 return $out_msg;
334 }
337 sub build_result_update_msg {
338 my ($msg_hash) = @_;
340 my $header = @{$msg_hash->{'header'}}[0];
341 my $source = @{$msg_hash->{'target'}}[0];
342 my $target = @{$msg_hash->{'target'}}[0];
343 my $macaddress = @{$msg_hash->{'macaddress'}}[0];
345 # test whether content is an empty hash or a string which is required
346 my $content = @{$msg_hash->{$header}}[0];
347 eval{
348 if( 0 == keys(%$content) ) {
349 $content = "";
350 }
351 };
352 if( $@ ) {
353 $content = " $content";
354 }
356 $header =~ s/CLMSG_//g;
357 my $out_msg = sprintf("<xml> ".
358 "<header>gosa_update_status_jobdb_entry</header> ".
359 "<source>%s</source> ".
360 "<target>%s</target>".
361 "<where> ".
362 "<clause> ".
363 "<phrase> ".
364 "<status>processing</status> ".
365 "<macaddress>%s</macaddress> ".
366 "</phrase> ".
367 "</clause> ".
368 "</where> ".
369 "<update> ".
370 "<result>%s</result> ".
371 "</update> ".
372 "</xml>", $source, "JOBDB", $macaddress, $header.$content);
373 return $out_msg;
374 }
377 1;