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];
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;
125 }
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);
143 my @out_msg_l = ( $out_msg );
144 return @out_msg_l;
145 }
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;
165 }
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;
183 }
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;
211 }
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;
239 }
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;
298 }
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 );
316 }
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 );
347 }
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;
371 }
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;
389 }
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;
416 }
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 );
436 return @out_msg_l;
437 }
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 }
453 my @out_msg_l;
454 return @out_msg_l;
455 }
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 }
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 );
478 }
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;
494 }
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;
511 }
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;
528 }
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;
545 }
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;
558 }
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;
571 }
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;
591 }
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;
608 }
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 }
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;
624 }
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;
641 }
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;
659 }
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 );
688 }
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;
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;
854 }
857 1;