Code

mailqueue processing is switched to GOsa-SI
[gosa.git] / gosa-si / server / events / mailqueue_com.pm
1 package mailqueue_com;
2 use Exporter;
3 @ISA = qw(Exporter);
4 my @events = (
5     "get_events",
6     "mailqueue_query",
7     "mailqueue_header",
8 );
9 @EXPORT = @events;
11 use strict;
12 use warnings;
13 use GOSA::GosaSupportDaemon;
14 use Data::Dumper;
15 use Time::HiRes qw( usleep);
16 use MIME::Base64;
19 BEGIN {}
21 END {}
23 ### Start ######################################################################
25 sub get_events {
26     return \@events;
27 }
29 sub mailqueue_query {
30     my ($msg, $msg_hash, $session_id) = @_ ;
31     my $header = @{$msg_hash->{header}}[0];
32     my $target = @{$msg_hash->{target}}[0];
33     my $source = @{$msg_hash->{source}}[0];
34     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
35     my $error = 0;
36     my $error_string;
37     my $answer_msg;
38     my ($sql, $res);
40     if( defined $jobdb_id) {
41         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
42         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
43         my $res = $main::job_db->exec_statement($sql_statement);
44     }
46     # send message
47     $sql = "SELECT * FROM $main::known_clients_tn WHERE ((hostname='$target') || (macaddress LIKE '$target'))"; 
48     $res = $main::known_clients_db->exec_statement($sql);
50     # sanity check of db result
51     my ($host_name, $host_key);
52     if ((defined $res) && (@$res > 0) && @{@$res[0]} > 0) {
53         $host_name = @{@$res[0]}[0];
54         $host_key = @{@$res[0]}[2];
55     } else {
56         &main::daemon_log("$session_id ERROR: cannot determine host_name and host_key from known_clients_db\n$msg", 1);
57         $error_string = "Cannot determine host_name and host_key from known_clients_db";
58         $error = 1;
59     }
61     if (not $error) {
62         $msg =~ s/<source>GOSA<\/source>/<source>$main::server_address<\/source>/g; 
63         $msg =~ s/<\/xml>/<session_id>$session_id<\/session_id><\/xml>/;
64         &main::send_msg_to_target($msg, $host_name, $host_key, $header, $session_id);
66         # waiting for answer
67         my $message_id;
68         my $i = 0;
69         while (1) {
70             $i++;
71             $sql = "SELECT * FROM $main::incoming_tn WHERE headertag='answer_$session_id'";
72             $res = $main::incoming_db->exec_statement($sql);
73             if (ref @$res[0] eq "ARRAY") { 
74                 $message_id = @{@$res[0]}[0];
75                 last;
76             }
78             if ($i > 100) { last; } # do not run into a endless loop
79             usleep(100000);
80         }
81         # if answer exists
82          if (defined $message_id) {
83             $answer_msg = decode_base64(@{@$res[0]}[4]);
84             $answer_msg =~ s/<target>\S+<\/target>/<target>$source<\/target>/;
85             $answer_msg =~ s/<header>\S+<\/header>/<header>$header<\/header>/;
87             my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
88             if (defined $forward_to_gosa){
89                 $answer_msg =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
90             }
91             $sql = "DELETE FROM $main::incoming_tn WHERE id=$message_id"; 
92             $res = $main::incoming_db->exec_statement($sql);
93         }
94     }
96     return ( $answer_msg );
97 }
99 sub mailqueue_header {
100     my ($msg, $msg_hash, $session_id) = @_ ;
101     my $header = @{$msg_hash->{header}}[0];
102     my $target = @{$msg_hash->{target}}[0];
103     my $source = @{$msg_hash->{source}}[0];
104     my $jobdb_id = @{$msg_hash->{'jobdb_id'}}[0];
105     my $error = 0;
106     my $error_string;
107     my $answer_msg;
108     my ($sql, $res);
110     if( defined $jobdb_id) {
111         my $sql_statement = "UPDATE $main::job_queue_tn SET status='processed' WHERE id=jobdb_id";
112         &main::daemon_log("$session_id DEBUG: $sql_statement", 7); 
113         my $res = $main::job_db->exec_statement($sql_statement);
114     }
116     # search for the correct target address
117     $sql = "SELECT * FROM $main::known_clients_tn WHERE ((hostname='$target') || (macaddress LIKE '$target'))"; 
118     $res = $main::known_clients_db->exec_statement($sql);
119     my ($host_name, $host_key);
120     if ((defined $res) && (@$res > 0) && @{@$res[0]} > 0) {   # sanity check of db result
121         $host_name = @{@$res[0]}[0];
122         $host_key = @{@$res[0]}[2];
123     } else {
124         &main::daemon_log("$session_id ERROR: cannot determine host_name and host_key from known_clients_db\n$msg", 1);
125         $error_string = "Cannot determine host_name and host_key from known_clients_db";
126         $error = 1;
127     }
129     # send message to target
130     if (not $error) {
131         $msg =~ s/<source>GOSA<\/source>/<source>$main::server_address<\/source>/g; 
132         $msg =~ s/<\/xml>/<session_id>$session_id<\/session_id><\/xml>/;
133         &main::send_msg_to_target($msg, $host_name, $host_key, $header, $session_id);
134     }
136     # waiting for answer
137     if (not $error) {
138         my $message_id;
139         my $i = 0;
140         while (1) {
141             $i++;
142             $sql = "SELECT * FROM $main::incoming_tn WHERE headertag='answer_$session_id'";
143             $res = $main::incoming_db->exec_statement($sql);
144             if (ref @$res[0] eq "ARRAY") { 
145                 $message_id = @{@$res[0]}[0];
146                 last;
147             }
149             if ($i > 100) { last; } # do not run into a endless loop
150             usleep(100000);
151         }
152         # if answer exists
153         if (defined $message_id) {
154             $answer_msg = decode_base64(@{@$res[0]}[4]);
155             $answer_msg =~ s/<target>\S+<\/target>/<target>$source<\/target>/;
156             $answer_msg =~ s/<header>\S+<\/header>/<header>$header<\/header>/;
158             my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
159             if (defined $forward_to_gosa){
160                 $answer_msg =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
161             }
162             $sql = "DELETE FROM $main::incoming_tn WHERE id=$message_id"; 
163             $res = $main::incoming_db->exec_statement($sql);
164         }
165     }
167     return ( $answer_msg );
170 # vim:ts=4:shiftwidth:expandtab
171 1;