Code

Updated wake
[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     );
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);
117     
118     return;
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;
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; 
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; 
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; 
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; 
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; 
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; 
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; 
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; 
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;
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;
377 1;