1 package ServerPackages;
3 use Exporter;
4 @ISA = ("Exporter");
6 # Each module has to have a function 'process_incoming_msg'. This function works as a interface to gosa-sd and receives the msg hash from gosa-sd. 'process_incoming_function checks, wether it has a function to process the incoming msg and forward the msg to it.
8 use strict;
9 use warnings;
10 use GOSA::GosaSupportDaemon;
11 use Data::Dumper;
13 my $event_dir = "/usr/lib/gosa-si/server/ServerPackages";
14 use lib "/usr/lib/gosa-si/server/ServerPackages";
16 BEGIN{}
17 END {}
20 ### START #####################################################################
22 # import local events
23 my ($error, $result, $event_hash) = &import_events($event_dir);
24 foreach my $log_line (@$result) {
25 if ($log_line =~ / succeed: /) {
26 &main::daemon_log("0 DEBUG: ServerPackages - $log_line", 7);
27 } else {
28 &main::daemon_log("0 ERROR: ServerPackages - $log_line", 1);
29 }
30 }
32 ### FUNCTIONS #####################################################################
34 sub get_module_info {
35 my @info = ($main::server_address,
36 $main::ServerPackages_key,
37 $event_hash,
38 );
39 return \@info;
40 }
42 sub process_incoming_msg {
43 my ($msg, $msg_hash, $session_id) = @_ ;
44 my $header = @{$msg_hash->{header}}[0];
45 my $source = @{$msg_hash->{source}}[0];
46 my $target = @{$msg_hash->{target}}[0];
47 my $sql_events;
49 my @msg_l;
50 my @out_msg_l = ( 'nohandler' );
53 # if message is being forwarded from another server, strip of header prefixes
54 $header =~ s/^gosa_|^job_//;
55 $msg =~ s/<header>gosa_(\w+)<\/header>|<header>job_(\w+)<\/header>/<header>$1<\/header>/;
58 &main::daemon_log("$session_id DEBUG: ServerPackages: msg to process '$header'", 7);
59 if( exists $event_hash->{$header} ) {
60 # a event exists with the header as name
61 &main::daemon_log("$session_id INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5);
62 no strict 'refs';
63 @out_msg_l = &{$event_hash->{$header}."::$header"}($msg, $msg_hash, $session_id);
65 } else {
66 $sql_events = "SELECT * FROM $main::known_clients_tn WHERE ( (macaddress LIKE '$target') OR (hostname='$target') )";
67 my $res = $main::known_clients_db->select_dbentry( $sql_events );
68 my $l = keys(%$res);
71 # TODO
72 # $l == 1, knownclienterror wird eigentlich nicht gebraucht. hier soll nohandler anspringen
73 # set error if no or more than 1 hits are found for sql query
74 if ( $l != 1) {
75 @out_msg_l = ('knownclienterror');
77 # found exact 1 hit in db
78 } else {
79 my $client_events = $res->{'1'}->{'events'};
81 # client is registered for this event, deliver this message to client
82 if ($client_events =~ /,$header,/) {
83 $msg =~ s/<header>gosa_/<header>/;
84 @out_msg_l = ( $msg );
86 # client is not registered for this event, set error
87 } else {
88 @out_msg_l = ('noeventerror');
89 }
90 }
91 }
93 # if delivery not possible raise error and return
94 if (not defined $out_msg_l[0]) {
95 @out_msg_l = ();
96 } elsif ($out_msg_l[0] eq 'nohandler') {
97 &main::daemon_log("$session_id ERROR: ServerPackages: no event handler defined for '$header'", 1);
98 @out_msg_l = ();
99 } elsif ($out_msg_l[0] eq 'knownclienterror') {
100 &main::daemon_log("$session_id ERROR: no or more than 1 hits are found at known_clients_db with sql query: '$sql_events'", 1);
101 &main::daemon_log("$session_id ERROR: processing is aborted and message will not be forwarded", 1);
102 @out_msg_l = ();
103 } elsif ($out_msg_l[0] eq 'noeventerror') {
104 &main::daemon_log("$session_id ERROR: client '$target' is not registered for event '$header', processing is aborted", 1);
105 @out_msg_l = ();
106 }
108 return \@out_msg_l;
109 }
111 1;