Code

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