Code

Added simple locale extractor
[gosa.git] / gosa-si / server / events / gosaTriggered.pm
1 package gosaTriggered;
2 use Exporter;
3 @ISA = qw(Exporter);
4 my @events = (
5     "get_events", 
6     "get_login_usr_for_client",
7     "get_client_for_login_usr",
8     "gen_smb_hash",
9     "trigger_reload_ldap_config",
10     "ping",
11     "network_completition",
12     "set_activated_for_installation",
13     "new_key_for_client",
14     "detect_hardware",
15     "get_login_usr",
16     "get_login_client",
17     "trigger_action_localboot",
18     "trigger_action_faireboot",
19     "trigger_action_reboot",
20     "trigger_action_activate",
21     "trigger_action_lock",
22     "trigger_action_halt",
23     "trigger_action_update", 
24     "trigger_action_reinstall",
25     "trigger_action_memcheck", 
26     "trigger_action_sysinfo",
27     "trigger_action_instant_update",
28     "trigger_action_rescan",
29     "trigger_action_wake",
30     "recreate_fai_server_db",
31     "recreate_fai_release_db",
32     "recreate_packages_list_db",
33     "send_user_msg", 
34     "get_available_kernel",
35         "trigger_activate_new",
36     );
37 @EXPORT = @events;
39 use strict;
40 use warnings;
41 use GOSA::GosaSupportDaemon;
42 use Data::Dumper;
43 use Crypt::SmbHash;
44 use Net::ARP;
45 use Net::Ping;
46 use Socket;
47 use Time::HiRes qw( usleep);
49 BEGIN {}
51 END {}
53 ### Start ######################################################################
55 #&main::read_configfile($main::cfg_file, %cfg_defaults);
57 sub get_events {
58     return \@events;
59 }
61 sub send_user_msg {
62     my ($msg, $msg_hash, $session_id) = @_ ;
63     my $header = @{$msg_hash->{'header'}}[0];
64     my $source = @{$msg_hash->{'source'}}[0];
65     my $target = @{$msg_hash->{'target'}}[0];
67     #my $subject = &decode_base64(@{$msg_hash->{'subject'}}[0]);
68     my $subject = @{$msg_hash->{'subject'}}[0];
69     my $from = @{$msg_hash->{'from'}}[0];
70     my @users = @{$msg_hash->{'users'}};
71         my @groups = @{$msg_hash->{'groups'}};
72     my $delivery_time = @{$msg_hash->{'delivery_time'}}[0];
73     #my $message = &decode_base64(@{$msg_hash->{'message'}}[0]);
74     my $message = @{$msg_hash->{'message'}}[0];
75     
76     # keep job queue uptodate if necessary 
77     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
78     if( defined $jobdb_id) {
79         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
80         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
81         my $res = $main::job_db->exec_statement($sql_statement);
82     }
84     # error handling
85     if (not $delivery_time =~ /^\d{14}$/) {
86         my $error_string = "delivery_time '$delivery_time' is not a valid timestamp, please use format 'yyyymmddhhmmss'";
87         &main::daemon_log("$session_id ERROR: $error_string", 1);
88         return &create_xml_string(&create_xml_hash($header, $target, $source, $error_string));
89     }
91     # add incoming message to messaging_db
92     my $new_msg_id = 1;
93         my $new_msg_id_sql = "SELECT MAX(CAST(id AS INTEGER)) FROM $main::messaging_tn";
94     my $new_msg_id_res = $main::messaging_db->exec_statement($new_msg_id_sql);
95     if (defined @{@{$new_msg_id_res}[0]}[0] ) {
96         $new_msg_id = int(@{@{$new_msg_id_res}[0]}[0]);
97         $new_msg_id += 1;
98     }
100         # highlight user name and group name
101         my @receiver_l;
102         @users = map(push(@receiver_l, "u_$_"), @users);
103         @groups = map(push(@receiver_l, "g_$_"), @groups);
105     my $func_dic = {table=>$main::messaging_tn,
106         primkey=>[],
107         id=>$new_msg_id,
108         subject=>$subject,
109         message_from=>$from,
110         message_to=>join(",", @receiver_l),
111         flag=>"n",
112         direction=>"in",
113         delivery_time=>$delivery_time,
114         message=>$message,
115         timestamp=>&get_time(),
116     };
117     my $res = $main::messaging_db->add_dbentry($func_dic);
118     if (not $res == 0) {
119         &main::daemon_log("$session_id ERROR: gosaTriggered.pm: cannot add message to message_db: $res", 1);
120     } else {
121         &main::daemon_log("$session_id INFO: gosaTriggered.pm: message with subject '$subject' successfully added to message_db", 5);
122     }
124     return;
128 sub recreate_fai_server_db {
129     my ($msg, $msg_hash, $session_id) = @_ ;
130     my $out_msg;
132     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
133     if( defined $jobdb_id) {
134         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
135         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
136         my $res = $main::job_db->exec_statement($sql_statement);
137     }
139     $main::fai_server_db->create_table("new_fai_server", \@main::fai_server_col_names);
140     &main::create_fai_server_db("new_fai_server",undef,"dont", $session_id);
141     $main::fai_server_db->move_table("new_fai_server", $main::fai_server_tn);
142     
143     my @out_msg_l = ( $out_msg );
144     return @out_msg_l;
148 sub recreate_fai_release_db {
149     my ($msg, $msg_hash, $session_id) = @_ ;
150     my $out_msg;
152     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
153     if( defined $jobdb_id) {
154         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
155         &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
156         my $res = $main::job_db->exec_statement($sql_statement);
157     }
159     $main::fai_release_db->create_table("new_fai_release", \@main::fai_release_col_names);
160     &main::create_fai_release_db("new_fai_release", $session_id);
161     $main::fai_release_db->move_table("new_fai_release", $main::fai_release_tn);
163     my @out_msg_l = ( $out_msg );
164     return @out_msg_l;
168 sub recreate_packages_list_db {
169         my ($msg, $msg_hash, $session_id) = @_ ;
170         my $out_msg;
172         my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
173         if( defined $jobdb_id) {
174                 my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
175                 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
176                 my $res = $main::job_db->exec_statement($sql_statement);
177         }
179         &main::create_packages_list_db;
181         my @out_msg_l = ( $out_msg );
182         return @out_msg_l;
186 sub get_login_usr_for_client {
187     my ($msg, $msg_hash, $session_id) = @_ ;
188     my $header = @{$msg_hash->{'header'}}[0];
189     my $source = @{$msg_hash->{'source'}}[0];
190     my $target = @{$msg_hash->{'target'}}[0];
191     my $client = @{$msg_hash->{'client'}}[0];
193     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
194     if( defined $jobdb_id) {
195         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
196         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
197         my $res = $main::job_db->exec_statement($sql_statement);
198     }
200     $header =~ s/^gosa_//;
202     my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$client' OR macaddress LIKE '$client'";
203     my $res = $main::known_clients_db->select_dbentry($sql_statement);
205     my $out_msg = "<xml><header>$header</header><source>$target</source><target>$source</target>";
206     $out_msg .= &db_res2xml($res);
207     $out_msg .= "</xml>";
209     my @out_msg_l = ( $out_msg );
210     return @out_msg_l;
214 sub get_client_for_login_usr {
215     my ($msg, $msg_hash, $session_id) = @_ ;
216     my $header = @{$msg_hash->{'header'}}[0];
217     my $source = @{$msg_hash->{'source'}}[0];
218     my $target = @{$msg_hash->{'target'}}[0];
220     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
221     if( defined $jobdb_id) {
222         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
223         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
224         my $res = $main::job_db->exec_statement($sql_statement);
225     }
227     my $usr = @{$msg_hash->{'usr'}}[0];
228     $header =~ s/^gosa_//;
230     my $sql_statement = "SELECT * FROM known_clients WHERE login LIKE '%$usr%'";
231     my $res = $main::known_clients_db->select_dbentry($sql_statement);
233     my $out_msg = "<xml><header>$header</header><source>$target</source><target>$source</target>";
234     $out_msg .= &db_res2xml($res);
235     $out_msg .= "</xml>";
236     my @out_msg_l = ( $out_msg );
237     return @out_msg_l;
242 sub ping {
243     my ($msg, $msg_hash, $session_id) = @_ ;
244     my $header = @{$msg_hash->{header}}[0];
245     my $target = @{$msg_hash->{target}}[0];
246     my $source = @{$msg_hash->{source}}[0];
248     my ($sql, $res);
249     my $out_msg = $msg;
250     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
251     if( defined $jobdb_id) {
252         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
253         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
254         my $res = $main::job_db->exec_statement($sql_statement);
255     }
257     # send message
258     $sql = "SELECT * FROM $main::known_clients_tn WHERE ((hostname='$target') || (macaddress LIKE '$target'))"; 
259     $res = $main::known_clients_db->exec_statement($sql);
260     my $host_name = @{@$res[0]}[0];
261     my $host_key = @{@$res[0]}[2];
263     my $client_hash = &create_xml_hash("ping", $main::server_address, $host_name);
264     &add_content2xml_hash($client_hash, 'session_id', $session_id); 
265     my $client_msg = &create_xml_string($client_hash);
266     my $error = &main::send_msg_to_target($client_msg, $host_name, $host_key, $header, $session_id);
267     #if ($error != 0) {}
269     my $message_id;
270     my $i = 0;
271     while (1) {
272         $i++;
273         $sql = "SELECT * FROM $main::incoming_tn WHERE headertag='answer_$session_id'";
274         $res = $main::incoming_db->exec_statement($sql);
275         if (ref @$res[0] eq "ARRAY") { 
276             $message_id = @{@$res[0]}[0];
277             last;
278         }
280         # do not run into a endless loop
281         if ($i > 100) { last; }
282         usleep(100000);
283     }
285     my $answer_xml = @{@$res[0]}[3];
286     my %data = ( 'answer_xml'  => 'bin noch da' );
287     my $answer_msg = &build_msg("got_ping", $target, $source, \%data);
288     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
289     if (defined $forward_to_gosa) {
290         $answer_msg =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
291     }
293     $sql = "DELETE FROM $main::incoming_tn WHERE id=$message_id"; 
294     $res = $main::incoming_db->exec_statement($sql);
296     my @answer_msg_l = ( $answer_msg );
297     return @answer_msg_l;
302 sub gen_smb_hash {
303      my ($msg, $msg_hash, $session_id) = @_ ;
304      my $source = @{$msg_hash->{source}}[0];
305      my $target = @{$msg_hash->{target}}[0];
306      my $password = @{$msg_hash->{password}}[0];
308      my %data= ('hash' => join(q[:], ntlmgen $password));
309      my $out_msg = &build_msg("gen_smb_hash", $target, $source, \%data );
310      my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
311      if (defined $forward_to_gosa) {
312          $out_msg =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
313      }
315      return ( $out_msg );
319 sub network_completition {
320      my ($msg, $msg_hash, $session_id) = @_ ;
321      my $source = @{$msg_hash->{source}}[0];
322      my $target = @{$msg_hash->{target}}[0];
323      my $name = @{$msg_hash->{hostname}}[0];
325      # Can we resolv the name?
326      my %data;
327      if (inet_aton($name)){
328              my $address = inet_ntoa(inet_aton($name));
329              my $p = Net::Ping->new('tcp');
330              my $mac= "";
331              if ($p->ping($address, 1)){
332                $mac = Net::ARP::arp_lookup("", $address);
333              }
335              %data= ('ip' => $address, 'mac' => $mac);
336      } else {
337              %data= ('ip' => '', 'mac' => '');
338      }
340      my $out_msg = &build_msg("network_completition", $target, $source, \%data );
341      my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
342      if (defined $forward_to_gosa) {
343          $out_msg =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
344      }
346      return ( $out_msg );
350 sub detect_hardware {
351     my ($msg, $msg_hash, $session_id) = @_ ;
352     # just forward msg to client, but dont forget to split off 'gosa_' in header
353     my $source = @{$msg_hash->{source}}[0];
354     my $target = @{$msg_hash->{target}}[0];
355     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
356     if( defined $jobdb_id) {
357         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
358         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
359         my $res = $main::job_db->exec_statement($sql_statement);
360     }
362     my $out_hash = &create_xml_hash("detect_hardware", $source, $target);
363     if( defined $jobdb_id ) { 
364         &add_content2xml_hash($out_hash, 'jobdb_id', $jobdb_id); 
365     }
366     my $out_msg = &create_xml_string($out_hash);
368     my @out_msg_l = ( $out_msg );
369     return @out_msg_l;
374 sub trigger_reload_ldap_config {
375     my ($msg, $msg_hash, $session_id) = @_ ;
376     my $target = @{$msg_hash->{target}}[0];
378     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
379     if( defined $jobdb_id) {
380         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
381         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
382         my $res = $main::job_db->exec_statement($sql_statement);
383     }
385         my $out_msg = &ClientPackages::new_ldap_config($target, $session_id);
386         my @out_msg_l = ( $out_msg );
388     return @out_msg_l;
392 sub set_activated_for_installation {
393     my ($msg, $msg_hash, $session_id) = @_;
394     my $header = @{$msg_hash->{header}}[0];
395     my $source = @{$msg_hash->{source}}[0];
396     my $target = @{$msg_hash->{target}}[0];
397         my @out_msg_l;
399         # update status of job 
400     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
401     if( defined $jobdb_id) {
402         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
403         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
404         my $res = $main::job_db->exec_statement($sql_statement);
405     }
407         # create set_activated_for_installation message for delivery
408     my $out_hash = &create_xml_hash("set_activated_for_installation", $source, $target);
409     if( defined $jobdb_id ) { 
410         &add_content2xml_hash($out_hash, 'jobdb_id', $jobdb_id); 
411     }
412     my $out_msg = &create_xml_string($out_hash);
413         push(@out_msg_l, $out_msg); 
415     return @out_msg_l;
419 sub trigger_action_faireboot {
420     my ($msg, $msg_hash, $session_id) = @_;
421     my $macaddress = @{$msg_hash->{macaddress}}[0];
422     my $source = @{$msg_hash->{source}}[0];
424     my @out_msg_l;
425     $msg =~ s/<header>gosa_trigger_action_faireboot<\/header>/<header>trigger_action_faireboot<\/header>/;
426     push(@out_msg_l, $msg);
428     &main::change_goto_state('locked', \@{$msg_hash->{macaddress}}, $session_id);
429         &main::change_fai_state('install', \@{$msg_hash->{macaddress}}, $session_id); 
431     # delete all jobs from jobqueue which correspond to fai
432     my $sql_statement = "DELETE FROM $main::job_queue_tn WHERE (macaddress='$macaddress' AND ".
433         "status='processing')";
434     $main::job_db->del_dbentry($sql_statement ); 
435                                              
436     return @out_msg_l;
440 sub trigger_action_lock {
441     my ($msg, $msg_hash, $session_id) = @_;
442     my $macaddress = @{$msg_hash->{macaddress}}[0];
443     my $source = @{$msg_hash->{source}}[0];
445     &main::change_goto_state('locked', \@{$msg_hash->{macaddress}}, $session_id);
446     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
447     if( defined $jobdb_id) {
448         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
449         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
450         my $res = $main::job_db->exec_statement($sql_statement);
451     }
452                                              
453     my @out_msg_l;
454     return @out_msg_l;
458 sub trigger_action_activate {
459     my ($msg, $msg_hash, $session_id) = @_;
460     my $macaddress = @{$msg_hash->{macaddress}}[0];
461     my $source = @{$msg_hash->{source}}[0];
463     &main::change_goto_state('active', \@{$msg_hash->{macaddress}}, $session_id);
464     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
465     if( defined $jobdb_id) {
466         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
467         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
468         my $res = $main::job_db->exec_statement($sql_statement);
469     }
470                                              
471     my $out_hash = &create_xml_hash("set_activated_for_installation", $source, $macaddress);
472     if( exists $msg_hash->{'jobdb_id'} ) { 
473         &add_content2xml_hash($out_hash, 'jobdb_id', @{$msg_hash->{'jobdb_id'}}[0]); 
474     }
475     my $out_msg = &create_xml_string($out_hash);
477     return ( $out_msg );
481 sub trigger_action_localboot {
482     my ($msg, $msg_hash, $session_id) = @_;
483     $msg =~ s/<header>gosa_trigger_action_localboot<\/header>/<header>trigger_action_localboot<\/header>/;
484     &main::change_fai_state('localboot', \@{$msg_hash->{macaddress}}, $session_id);
485     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
486     if( defined $jobdb_id) {
487         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
488         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
489         my $res = $main::job_db->exec_statement($sql_statement);
490     }
492     my @out_msg_l = ($msg);  
493     return @out_msg_l;
497 sub trigger_action_halt {
498     my ($msg, $msg_hash, $session_id) = @_;
499     $msg =~ s/<header>gosa_trigger_action_halt<\/header>/<header>trigger_action_halt<\/header>/;
501     &main::change_fai_state('halt', \@{$msg_hash->{macaddress}}, $session_id);
502     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
503     if( defined $jobdb_id) {
504         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
505         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
506         my $res = $main::job_db->exec_statement($sql_statement);
507     }
509     my @out_msg_l = ($msg);  
510     return @out_msg_l;
514 sub trigger_action_reboot {
515     my ($msg, $msg_hash, $session_id) = @_;
516     $msg =~ s/<header>gosa_trigger_action_reboot<\/header>/<header>trigger_action_reboot<\/header>/;
518     &main::change_fai_state('reboot', \@{$msg_hash->{macaddress}}, $session_id);
519     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
520     if( defined $jobdb_id) {
521         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
522         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
523         my $res = $main::job_db->exec_statement($sql_statement);
524     }
526     my @out_msg_l = ($msg);  
527     return @out_msg_l;
531 sub trigger_action_memcheck {
532     my ($msg, $msg_hash, $session_id) = @_ ;
533     $msg =~ s/<header>gosa_trigger_action_memcheck<\/header>/<header>trigger_action_memcheck<\/header>/;
535     &main::change_fai_state('memcheck', \@{$msg_hash->{macaddress}}, $session_id);
536     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
537     if( defined $jobdb_id) {
538         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
539         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
540         my $res = $main::job_db->exec_statement($sql_statement);
541     }
543     my @out_msg_l = ($msg);  
544     return @out_msg_l;
548 sub trigger_action_reinstall {
549     my ($msg, $msg_hash, $session_id) = @_;
550     $msg =~ s/<header>gosa_trigger_action_reinstall<\/header>/<header>trigger_action_reinstall<\/header>/;
552     &main::change_fai_state('reinstall', \@{$msg_hash->{macaddress}}, $session_id);
554     my %data = ( 'macAddress'  => \@{$msg_hash->{macaddress}} );
555     my $wake_msg = &build_msg("trigger_wake", "GOSA", "KNOWN_SERVER", \%data);
556     my @out_msg_l = ($wake_msg, $msg);  
557     return @out_msg_l;
561 sub trigger_action_update {
562     my ($msg, $msg_hash, $session_id) = @_;
563     $msg =~ s/<header>gosa_trigger_action_update<\/header>/<header>trigger_action_update<\/header>/;
565     &main::change_fai_state('update', \@{$msg_hash->{macaddress}}, $session_id);
567     my %data = ( 'macAddress'  => \@{$msg_hash->{macaddress}} );
568     my $wake_msg = &build_msg("trigger_wake", "GOSA", "KNOWN_SERVER", \%data);
569     my @out_msg_l = ($wake_msg, $msg);  
570     return @out_msg_l;
574 sub trigger_action_instant_update {
575     my ($msg, $msg_hash, $session_id) = @_;
576     $msg =~ s/<header>gosa_trigger_action_instant_update<\/header>/<header>trigger_action_instant_update<\/header>/;
578     &main::change_fai_state('update', \@{$msg_hash->{macaddress}}, $session_id);
580     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
581     if( defined $jobdb_id) {
582         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
583         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
584         my $res = $main::job_db->exec_statement($sql_statement);
585     }
587     my %data = ( 'macAddress'  => \@{$msg_hash->{macaddress}} );
588     my $wake_msg = &build_msg("trigger_wake", "GOSA", "KNOWN_SERVER", \%data);
589     my @out_msg_l = ($wake_msg, $msg);  
590     return @out_msg_l;
594 sub trigger_action_sysinfo {
595     my ($msg, $msg_hash, $session_id) = @_;
596     $msg =~ s/<header>gosa_trigger_action_sysinfo<\/header>/<header>trigger_action_sysinfo<\/header>/;
598     &main::change_fai_state('sysinfo', \@{$msg_hash->{macaddress}}, $session_id);
599     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
600     if( defined $jobdb_id) {
601         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
602         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
603         my $res = $main::job_db->exec_statement($sql_statement);
604     }
606     my @out_msg_l = ($msg);  
607     return @out_msg_l;
611 sub new_key_for_client {
612     my ($msg, $msg_hash, $session_id) = @_;
614     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
615     if( defined $jobdb_id) {
616         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
617         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
618         my $res = $main::job_db->exec_statement($sql_statement);
619     }
620     
621     $msg =~ s/<header>gosa_new_key_for_client<\/header>/<header>new_key<\/header>/;
622     my @out_msg_l = ($msg);  
623     return @out_msg_l;
627 sub trigger_action_rescan {
628     my ($msg, $msg_hash, $session_id) = @_;
630     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
631     if( defined $jobdb_id) {
632         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
633         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
634         my $res = $main::job_db->exec_statement($sql_statement);
635     }
638     $msg =~ s/<header>gosa_trigger_action_rescan<\/header>/<header>trigger_action_rescan<\/header>/;
639     my @out_msg_l = ($msg);  
640     return @out_msg_l;
644 sub trigger_action_wake {
645     my ($msg, $msg_hash, $session_id) = @_;
647     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
648     if( defined $jobdb_id) {
649         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
650         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
651         my $res = $main::job_db->exec_statement($sql_statement);
652     }
655     my %data = ( 'macAddress'  => \@{$msg_hash->{macaddress}} );
656     my $out_msg = &build_msg("trigger_wake", "GOSA", "KNOWN_SERVER", \%data);
657     my @out_msg_l = ($out_msg);  
658     return @out_msg_l;
662 sub get_available_kernel {
663         my ($msg, $msg_hash, $session_id) = @_;
665         my $source = @{$msg_hash->{'source'}}[0];
666         my $target = @{$msg_hash->{'target'}}[0];
667         my $release= @{$msg_hash->{'release'}}[0];
669         my @kernel;
670         # Get Kernel packages for release
671         my $sql_statement = "SELECT * FROM $main::packages_list_tn WHERE distribution='$release' AND package LIKE 'linux\-image\-%'";
672         my $res_hash = $main::packages_list_db->select_dbentry($sql_statement);
673         my %data;
674         my $i=1;
676         foreach my $package (keys %{$res_hash}) {
677                 $data{"answer".$i++}= $data{"answer".$i++}= ${$res_hash}{$package}->{'package'};
678         }
679         $data{"answer".$i++}= "default";
681         my $out_msg = &build_msg("get_available_kernel", $target, $source, \%data);
682         my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
683         if (defined $forward_to_gosa) {
684             $out_msg =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
685         }
687         return ( $out_msg );
691 sub trigger_activate_new {
692         my ($msg, $msg_hash, $session_id) = @_;
694         my $source = @{$msg_hash->{'source'}}[0];
695         my $target = @{$msg_hash->{'target'}}[0];
696         my $header= @{$msg_hash->{'header'}}[0];
697         my $mac= (defined($msg_hash->{'mac'}))?@{$msg_hash->{'mac'}}[0]:undef;
698         my $ogroup= (defined($msg_hash->{'ogroup'}))?@{$msg_hash->{'ogroup'}}[0]:undef;
699         my $timestamp= (defined($msg_hash->{'timestamp'}))?@{$msg_hash->{'timestamp'}}[0]:undef;
700         my $base= (defined($msg_hash->{'base'}))?@{$msg_hash->{'base'}}[0]:undef;
701         my $hostname= (defined($msg_hash->{'fqdn'}))?@{$msg_hash->{'fqdn'}}[0]:undef;
702         my $ip_address= (defined($msg_hash->{'ip'}))?@{$msg_hash->{'ip'}}[0]:undef;
703         my $dhcp_statement= (defined($msg_hash->{'dhcp'}))?@{$msg_hash->{'dhcp'}}[0]:undef;
704         my $jobdb_id= (defined($msg_hash->{'jobdb_id'}))?@{$msg_hash->{'jobdb_id'}}[0]:undef;
706         my $ldap_handle = &main::get_ldap_handle();
707         my $ldap_entry;
708         my $ogroup_entry;
709         my $changed_attributes_counter = 0;
710         
711         eval {
713                 my $ldap_mesg= $ldap_handle->search(
714                         base => $main::ldap_base,
715                         scope => 'sub',
716                         filter => "(&(objectClass=gosaGroupOfnames)(cn=$ogroup))",
717                 );
718                 if($ldap_mesg->count == 1) {
719                         $ogroup_entry= $ldap_mesg->pop_entry();
720                 } elsif ($ldap_mesg->count == 0) {
721                         &main::daemon_log("ERROR: A GosaGroupOfNames with cn '$ogroup' was not found in base '".$main::ldap_base."'!", 1);
722                 } else {
723                         &main::daemon_log("ERROR: More than one ObjectGroups with cn '$ogroup' was found in base '".$main::ldap_base."'!", 1);
724                 }
726                 # build the base, use optional base parameter or take it from ogroup
727                 if(!(defined($base) && (length($base) > 0))) {
728                                 # Subtract the ObjectGroup cn
729                                 $base = $1 if $ogroup_entry->dn =~ /cn=$ogroup,ou=groups,(.*)$/;
730                 }
732                 # prepend ou=systems (configurable through config)
733                 $base = $main::new_systems_ou.",".$base;
735                 # Search for an existing entry (should be in ou=incoming)
736                 $ldap_mesg= $ldap_handle->search(
737                         base => $main::ldap_base,
738                         scope => 'sub',
739                         filter => "(&(objectClass=GOhard)(|(macAddress=$mac)(dhcpHWaddress=$mac)))",
740                 );
742                 # TODO: Find a way to guess an ip address for hosts with no ldap entry (MAC->ARP->IP)
744                 if($ldap_mesg->count == 1) {
745                         &main::daemon_log("DEBUG: One system with mac address '$mac' was found in base '".$main::ldap_base."'!", 6);
746                         # Get the entry from LDAP
747                         $ldap_entry= $ldap_mesg->pop_entry();
749                         if(!($ldap_entry->dn() eq "cn=".$ldap_entry->get_value('cn').",$base")) {
750                                 # Move the entry to the new ou
751                                 $ldap_entry->changetype('moddn');
752                                 $ldap_entry->add(
753                                         newrdn => "cn=".$ldap_entry->get_value('cn'),
754                                         deleteoldrdn => 1,
755                                         newsuperior => $base,
756                                 );
757                         }
759                 } 
761                 $ldap_mesg= $ldap_handle->search(
762                         base => $main::ldap_base,
763                         scope => 'sub',
764                         filter => "(&(objectClass=GOhard)(|(macAddress=$mac)(dhcpHWaddress=$mac)))",
765                 );
767                 # TODO: Find a way to guess an ip address for hosts with no ldap entry (MAC->ARP->IP)
769                 if($ldap_mesg->count == 1) {
770                         $ldap_entry= $ldap_mesg->pop_entry();
771                         # Check for needed objectClasses
772                         my $oclasses = $ldap_entry->get_value('objectClass', asref => 1);
773                         foreach my $oclass ("FAIobject", "GOhard") {
774                                 if(!(scalar grep $_ eq $oclass, map {$_ => 1} @$oclasses)) {
775                                         &main::daemon_log("Adding objectClass $oclass", 1);
776                                         $ldap_entry->add(
777                                                 objectClass => $oclass,
778                                         );
779                                         my $oclass_result = $ldap_entry->update($ldap_handle);
780                                 }
781                         }
783                         # Set FAIstate
784                         if(defined($ldap_entry->get_value('FAIstate'))) {
785                                 if(!($ldap_entry->get_value('FAIstate') eq 'install')) {
786                                         $ldap_entry->replace(
787                                                 'FAIstate' => 'install'
788                                         );
789                                         my $replace_result = $ldap_entry->update($ldap_handle);
790                                 }
791                         } else {
792                                 $ldap_entry->add(
793                                         'FAIstate' => 'install'
794                                 );
795                                 my $add_result = $ldap_entry->update($ldap_handle);
796                         }
799                 } elsif ($ldap_mesg->count == 0) {
800                         # TODO: Create a new entry
801                         # $ldap_entry = Net::LDAP::Entry->new();
802                         # $ldap_entry->dn("cn=$mac,$base");
803                         &main::daemon_log("WARNING: No System with mac address '$mac' was found in base '".$main::ldap_base."'! Re-queuing job.", 4);
804                         $main::job_db->exec_statement("UPDATE jobs SET status = 'waiting', timestamp = '".&get_time()."' WHERE id = $jobdb_id");
805                 } else {
806                         &main::daemon_log("ERROR: More than one system with mac address '$mac' was found in base '".$main::ldap_base."'!", 1);
807                 }
809                 # Add to ObjectGroup
810                 if(!(scalar grep $_, map {$_ => 1} $ogroup_entry->get_value('member', asref => 1))) {
811                         $ogroup_entry->add (
812                                 'member' => $ldap_entry->dn(),
813                         );
814                         my $ogroup_result = $ogroup_entry->update($ldap_handle);
815                         if ($ogroup_result->code() != 0) {
816                                 &main::daemon_log("ERROR: Updating the ObjectGroup '$ogroup' failed (code '".$ogroup_result->code()."') with '".$ogroup_result->{'errorMessage'}."'!", 1);
817                         }
818                 }
820                 # Finally set gotoMode to active
821                 if(defined($ldap_entry->get_value('gotoMode'))) {
822                         if(!($ldap_entry->get_value('gotoMode') eq 'active')) {
823                                 $ldap_entry->replace(
824                                         'gotoMode' => 'active'
825                                 );
826                                 my $activate_result = $ldap_entry->update($ldap_handle);
827                                 if ($activate_result->code() != 0) {
828                                         &main::daemon_log("ERROR: Activating system '".$ldap_entry->dn()."' failed (code '".$activate_result->code()."') with '".$activate_result->{'errorMessage'}."'!", 1);
829                                 }
830                         }
831                 } else {
832                         $ldap_entry->add(
833                                 'gotoMode' => 'active'
834                         );
835                         my $activate_result = $ldap_entry->update($ldap_handle);
836                         if ($activate_result->code() != 0) {
837                                 &main::daemon_log("ERROR: Activating system '".$ldap_entry->dn()."' failed (code '".$activate_result->code()."') with '".$activate_result->{'errorMessage'}."'!", 1);
838                         }
839                 }
840         };
841         if($@) {
842                 &main::daemon_log("ERROR: activate_new failed with '$@'!", 1);
843         }
845         # Delete job
846         $main::job_db->exec_statement("DELETE FROM jobs WHERE id =  $jobdb_id");
848         # create set_activated_for_installation message for delivery
849     my $out_hash = &create_xml_hash("set_activated_for_installation", $source, $target);
850     my $out_msg = &create_xml_string($out_hash);
851         my @out_msg_l = ($out_msg);
853     return @out_msg_l;
857 1;