25adebdc91589524866a31e442a6c9e1c62b3912
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;
12 #use IO::Socket::INET;
13 #use XML::Simple;
14 #use Data::Dumper;
15 #use NetAddr::IP;
16 #use Net::LDAP;
17 #use Socket;
18 #use Net::hostent;
20 my $event_dir = "/usr/lib/gosa-si/server/ServerPackages";
21 use lib "/usr/lib/gosa-si/server/ServerPackages";
23 BEGIN{}
24 END {}
27 ### START #####################################################################
29 # import local events
30 my ($error, $result, $event_hash) = &import_events($event_dir);
31 if ($error == 0) {
32 foreach my $log_line (@$result) {
33 &main::daemon_log("0 DEBUG: ServerPackages - $log_line", 7);
34 }
35 } else {
36 foreach my $log_line (@$result) {
37 &main::daemon_log("0 ERROR: ServerPackages - $log_line", 1);
38 }
39 }
41 ### FUNCTIONS #####################################################################
43 sub get_module_info {
44 my @info = ($main::server_address,
45 $main::foreign_server_key,
46 );
47 return \@info;
48 }
50 sub process_incoming_msg {
51 my ($msg, $msg_hash, $session_id) = @_ ;
52 my $header = @{$msg_hash->{header}}[0];
53 my $source = @{$msg_hash->{source}}[0];
54 my $target = @{$msg_hash->{target}}[0];
56 my @msg_l;
57 my @out_msg_l;
59 &main::daemon_log("$session_id DEBUG: ServerPackages: msg to process '$header'", 7);
60 if( exists $event_hash->{$header} ) {
61 # a event exists with the header as name
62 &main::daemon_log("$session_id INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5);
63 no strict 'refs';
64 @out_msg_l = &{$event_hash->{$header}."::$header"}($msg, $msg_hash, $session_id);
66 } else {
67 $sql_events = "SELECT * FROM $main::known_clients_tn WHERE ( (macaddress LIKE '$target') OR (hostname='$target') )";
68 my $res = $main::known_clients_db->select_dbentry( $sql_events );
69 my $l = keys(%$res);
71 # set error if no or more than 1 hits are found for sql query
72 if ( $l != 1) {
73 @out_msg_l = ('knownclienterror');
75 # found exact 1 hit in db
76 } else {
77 my $client_events = $res->{'1'}->{'events'};
79 # client is registered for this event, deliver this message to client
80 if ($client_events =~ /,$header,/) {
81 $msg =~ s/<header>gosa_/<header>/;
82 @out_msg_l = ( $msg );
84 # client is not registered for this event, set error
85 } else {
86 @out_msg_l = ('noeventerror');
87 }
88 }
89 }
91 # if delivery not possible raise error and return
92 if (not defined $out_msg_l[0]) {
93 @out_msg_l = ();
94 } elsif ($out_msg_l[0] eq 'nohandler') {
95 &main::daemon_log("$session_id ERROR: ServerPackages: no event handler defined for '$header'", 1);
96 @out_msg_l = ();
97 } elsif ($out_msg_l[0] eq 'knownclienterror') {
98 &main::daemon_log("$session_id ERROR: no or more than 1 hits are found at known_clients_db with sql query: '$sql_events'", 1);
99 &main::daemon_log("$session_id WARNING: processing is aborted and message will not be forwarded", 3);
100 @out_msg_l = ();
101 } elsif ($out_msg_l[0] eq 'noeventerror') {
102 &main::daemon_log("$session_id WARNING: client '$target' is not registered for event '$header', processing is aborted", 3);
103 @out_msg_l = ();
104 }
106 return @out_msg_l;
107 }
109 1;