1 package ServerPackages;
5 # 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.
7 use strict;
8 use warnings;
10 use Exporter;
11 use GOSA::GosaSupportDaemon;
12 use Data::Dumper;
14 our @ISA = ("Exporter");
16 my $event_dir = "/usr/lib/gosa-si/server/ServerPackages";
17 use lib "/usr/lib/gosa-si/server/ServerPackages";
19 BEGIN{}
20 END {}
23 ### START #####################################################################
25 # import local events
26 my ($error, $result, $event_hash) = &import_events($event_dir);
27 foreach my $log_line (@$result) {
28 if ($log_line =~ / succeed: /) {
29 &main::daemon_log("0 INFO: ServerPackages - $log_line", 5);
30 } else {
31 &main::daemon_log("0 ERROR: ServerPackages - $log_line", 1);
32 }
33 }
35 # build vice versa event_hash, event_name => module
36 my $event2module_hash = {};
37 while (my ($module, $mod_events) = each %$event_hash) {
38 while (my ($event_name, $nothing) = each %$mod_events) {
39 $event2module_hash->{$event_name} = $module;
40 }
42 }
44 ### FUNCTIONS #####################################################################
46 sub get_module_info {
47 my @info = ($main::server_address,
48 $main::ServerPackages_key,
49 $event_hash,
50 );
51 return \@info;
52 }
54 sub process_incoming_msg {
55 my ($msg, $msg_hash, $session_id) = @_ ;
56 my $header = @{$msg_hash->{header}}[0];
57 my $source = @{$msg_hash->{source}}[0];
58 my $target = @{$msg_hash->{target}}[0];
59 my $sql_events;
61 my @msg_l;
62 my @out_msg_l = ( 'nohandler' );
65 # if message is being forwarded from another server, strip of header prefixes
66 $header =~ s/^gosa_|^job_//;
67 $msg =~ s/<header>gosa_(\w+)<\/header>|<header>job_(\w+)<\/header>/<header>$1<\/header>/;
70 &main::daemon_log("$session_id DEBUG: ServerPackages: msg to process '$header'", 26);
71 if( exists $event2module_hash->{$header} ) {
72 # a event exists with the header as name
73 &main::daemon_log("$session_id INFO: found event '$header' at event-module '".$event2module_hash->{$header}."'", 26);
74 no strict 'refs';
75 @out_msg_l = &{$event2module_hash->{$header}."::$header"}($msg, $msg_hash, $session_id);
77 } else {
78 $sql_events = "SELECT * FROM $main::known_clients_tn WHERE ( (macaddress LIKE '$target') OR (hostname='$target') )";
79 my $res = $main::known_clients_db->select_dbentry( $sql_events );
80 my $l = keys(%$res);
83 # TODO
84 # $l == 1, knownclienterror wird eigentlich nicht gebraucht. hier soll nohandler anspringen
85 # set error if no or more than 1 hits are found for sql query
86 if ( $l != 1) {
87 @out_msg_l = ('knownclienterror');
89 # found exact 1 hit in db
90 } else {
91 my $client_events = $res->{'1'}->{'events'};
93 # client is registered for this event, deliver this message to client
94 if ($client_events =~ /,$header,/) {
95 $msg =~ s/<header>gosa_/<header>/;
96 @out_msg_l = ( $msg );
98 # client is not registered for this event, set error
99 } else {
100 @out_msg_l = ('noeventerror');
101 }
102 }
103 }
105 # if delivery not possible raise error and return
106 if (not defined $out_msg_l[0]) {
107 @out_msg_l = ();
108 } elsif ($out_msg_l[0] eq 'nohandler') {
109 &main::daemon_log("$session_id ERROR: ServerPackages: no event handler defined for '$header'", 1);
110 @out_msg_l = ();
111 } elsif ($out_msg_l[0] eq 'knownclienterror') {
112 &main::daemon_log("$session_id ERROR: no or more than 1 hits are found at known_clients_db with sql query: '$sql_events'", 1);
113 &main::daemon_log("$session_id ERROR: processing is aborted and message will not be forwarded", 1);
114 @out_msg_l = ();
115 } elsif ($out_msg_l[0] eq 'noeventerror') {
116 &main::daemon_log("$session_id ERROR: client '$target' is not registered for event '$header', processing is aborted", 1);
117 @out_msg_l = ();
118 }
120 return \@out_msg_l;
121 }
124 1;