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 );
168 }
170 # vim:ts=4:shiftwidth:expandtab
171 1;