]> git.proxmox.com Git - pmg-api.git/blob - src/PMG/API2/Postfix.pm
certs: reload postfix to activate new certificate
[pmg-api.git] / src / PMG / API2 / Postfix.pm
1 package PMG::API2::Postfix;
2
3 use strict;
4 use warnings;
5 use Data::Dumper;
6
7 use PVE::SafeSyslog;
8 use PVE::Tools qw(extract_param);
9 use PVE::JSONSchema qw(get_standard_option);
10 use PVE::RESTHandler;
11 use PVE::INotify;
12
13 use PMG::Postfix;
14
15 use base qw(PVE::RESTHandler);
16
17 my $postfix_queues = ['deferred', 'active', 'incoming', 'hold'];
18
19 my $queue_name_option = {
20 description => "Postfix queue name.",
21 type => 'string',
22 enum => $postfix_queues,
23 };
24
25 my $queue_id_option = {
26 description => "The Message queue ID.",
27 type => 'string',
28 pattern => '[a-zA-Z0-9]+',
29 minLength => 8,
30 maxLength => 20,
31 };
32
33 __PACKAGE__->register_method ({
34 name => 'index',
35 path => '',
36 method => 'GET',
37 permissions => { user => 'all' },
38 description => "Directory index.",
39 parameters => {
40 additionalProperties => 0,
41 properties => {
42 node => get_standard_option('pve-node'),
43 },
44 },
45 returns => {
46 type => 'array',
47 items => {
48 type => "object",
49 properties => {},
50 },
51 links => [ { rel => 'child', href => "{name}" } ],
52 },
53 code => sub {
54 my ($param) = @_;
55
56 my $result = [
57 { name => 'queue' },
58 { name => 'qshape' },
59 { name => 'flush_queues' },
60 { name => 'discard_verify_cache' },
61 ];
62
63 return $result;
64 }});
65
66 __PACKAGE__->register_method ({
67 name => 'qshape',
68 path => 'qshape',
69 method => 'GET',
70 permissions => { check => [ 'admin', 'audit' ] },
71 protected => 1,
72 proxyto => 'node',
73 description => "Print Postfix queue domain and age distribution.",
74 parameters => {
75 additionalProperties => 0,
76 properties => {
77 node => get_standard_option('pve-node'),
78 queue => {
79 description => $queue_name_option->{description},
80 type => 'string',
81 enum => $postfix_queues,
82 default => 'deferred',
83 optional => 1,
84 },
85 },
86 },
87 returns => {
88 type => 'array',
89 items => {
90 type => "object",
91 properties => {},
92 },
93 },
94 code => sub {
95 my ($param) = @_;
96
97 my $queue = $param->{queue} || 'deferred';
98
99 my $res = PMG::Postfix::qshape($queue);
100
101 return $res;
102 }});
103
104
105 __PACKAGE__->register_method ({
106 name => 'queue_index',
107 path => 'queue',
108 method => 'GET',
109 permissions => { user => 'all' },
110 description => "Directory index.",
111 parameters => {
112 additionalProperties => 0,
113 properties => {
114 node => get_standard_option('pve-node'),
115 },
116 },
117 returns => {
118 type => 'array',
119 items => {
120 type => "object",
121 properties => {},
122 },
123 links => [ { rel => 'child', href => "{name}" } ],
124 },
125 code => sub {
126 my ($param) = @_;
127
128 my $res = [];
129 foreach my $queue (@$postfix_queues) {
130 push @$res, { name => $queue };
131 }
132 return $res;
133 }});
134
135 __PACKAGE__->register_method ({
136 name => 'mailq',
137 path => 'queue/{queue}',
138 method => 'GET',
139 permissions => { check => [ 'admin', 'audit' ] },
140 protected => 1,
141 proxyto => 'node',
142 description => "List the mail queue for a specific domain.",
143 parameters => {
144 additionalProperties => 0,
145 properties => {
146 node => get_standard_option('pve-node'),
147 queue => $queue_name_option,
148 start => {
149 type => 'integer',
150 minimum => 0,
151 optional => 1,
152 },
153 limit => {
154 type => 'integer',
155 minimum => 0,
156 optional => 1,
157 },
158 filter => {
159 description => "Filter string.",
160 type => 'string',
161 maxLength => 64,
162 optional => 1,
163 },
164 sortfield => {
165 description => "Sort field.",
166 type => 'string',
167 optional => 1,
168 enum => ['arrival_time', 'message_size', 'sender', 'receiver', 'reason'],
169 },
170 sortdir => {
171 description => "Sort direction.",
172 type => 'string',
173 optional => 1,
174 enum => ['ASC', 'DESC'],
175 requires => 'sortfield',
176 },
177 },
178 },
179 returns => {
180 type => 'array',
181 items => {
182 type => "object",
183 properties => {},
184 },
185 links => [ { rel => 'child', href => "{queue_id}" } ],
186 },
187 code => sub {
188 my ($param) = @_;
189
190 my $restenv = PMG::RESTEnvironment->get();
191
192 my ($count, $res) = PMG::Postfix::mailq(
193 $param->{queue}, $param->{filter}, $param->{start}, $param->{limit});
194
195 $restenv->set_result_attrib('total', $count);
196
197 my $sortfield = $param->{sortfield};
198 if (defined($sortfield)) {
199 my $sort_func = sub {
200 my ($c, $d) = ($param->{sortdir} eq 'DESC') ? ($b, $a) : ($a, $b);
201 if ($sortfield eq 'message_size' || $sortfield eq 'arrival_time') {
202 return $c->{$sortfield} <=> $d->{$sortfield};
203 } else {
204 return $c->{$sortfield} cmp $d->{$sortfield};
205 }
206 };
207
208 $res = [ sort $sort_func @$res ] ;
209 }
210
211
212 return $res;
213 }});
214
215
216 __PACKAGE__->register_method ({
217 name => 'read_queued_mail',
218 path => 'queue/{queue}/{queue_id}',
219 method => 'GET',
220 permissions => { check => [ 'admin' ] },
221 protected => 1,
222 proxyto => 'node',
223 description => "Get the contents of a queued mail.",
224 parameters => {
225 additionalProperties => 0,
226 properties => {
227 node => get_standard_option('pve-node'),
228 queue => $queue_name_option,
229 queue_id => $queue_id_option,
230 header => {
231 description => "Show message header content.",
232 type => 'boolean',
233 default => 1,
234 optional => 1,
235 },
236 body => {
237 description => "Include body content.",
238 type => 'boolean',
239 default => 0,
240 optional => 1,
241 },
242 },
243 },
244 returns => { type => 'string' },
245 code => sub {
246 my ($param) = @_;
247
248 $param->{header} //= 1;
249
250 return PMG::Postfix::postcat($param->{queue_id}, $param->{header}, $param->{body});
251 }});
252
253 __PACKAGE__->register_method ({
254 name => 'flush_queued_mail',
255 path => 'queue/{queue}/{queue_id}',
256 method => 'POST',
257 permissions => { check => [ 'admin' ] },
258 protected => 1,
259 proxyto => 'node',
260 description => "Schedule immediate delivery of deferred mail with the specified queue ID.",
261 parameters => {
262 additionalProperties => 0,
263 properties => {
264 node => get_standard_option('pve-node'),
265 queue => $queue_name_option,
266 queue_id => $queue_id_option,
267 },
268 },
269 returns => { type => 'null' },
270 code => sub {
271 my ($param) = @_;
272
273 PMG::Postfix::flush_queued_mail($param->{queue_id});
274
275 return undef;
276 }});
277
278 __PACKAGE__->register_method ({
279 name => 'delete_queued_mail',
280 path => 'queue/{queue}/{queue_id}',
281 method => 'DELETE',
282 permissions => { check => [ 'admin' ] },
283 protected => 1,
284 proxyto => 'node',
285 description => "Delete one message with the named queue ID.",
286 parameters => {
287 additionalProperties => 0,
288 properties => {
289 node => get_standard_option('pve-node'),
290 queue => $queue_name_option,
291 queue_id => $queue_id_option,
292 },
293 },
294 returns => { type => 'null' },
295 code => sub {
296 my ($param) = @_;
297
298 PMG::Postfix::delete_queued_mail($param->{queue}, $param->{queue_id});
299
300 return undef;
301 }});
302
303
304 __PACKAGE__->register_method ({
305 name => 'delete_all_queues',
306 path => 'queue',
307 method => 'DELETE',
308 description => "Delete all mails in all posfix queues.",
309 proxyto => 'node',
310 permissions => { check => [ 'admin' ] },
311 protected => 1,
312 parameters => {
313 additionalProperties => 0,
314 properties => {
315 node => get_standard_option('pve-node'),
316 },
317 },
318 returns => { type => 'null' },
319 code => sub {
320 my ($param) = @_;
321
322 PMG::Postfix::delete_queue();
323
324 return undef;
325 }});
326
327 __PACKAGE__->register_method ({
328 name => 'delete_queue',
329 path => 'queue/{queue}',
330 method => 'DELETE',
331 description => "Delete all mails in the queue.",
332 proxyto => 'node',
333 permissions => { check => [ 'admin' ] },
334 protected => 1,
335 parameters => {
336 additionalProperties => 0,
337 properties => {
338 node => get_standard_option('pve-node'),
339 queue => $queue_name_option,
340 },
341 },
342 returns => { type => 'null' },
343 code => sub {
344 my ($param) = @_;
345
346 PMG::Postfix::delete_queue($param->{queue});
347
348 return undef;
349 }});
350
351
352 __PACKAGE__->register_method ({
353 name => 'flush_queues',
354 path => 'flush_queues',
355 method => 'POST',
356 description => "Flush the queue: attempt to deliver all queued mail.",
357 proxyto => 'node',
358 permissions => { check => [ 'admin' ] },
359 protected => 1,
360 parameters => {
361 additionalProperties => 0,
362 properties => {
363 node => get_standard_option('pve-node'),
364 },
365 },
366 returns => { type => 'null' },
367 code => sub {
368 my ($param) = @_;
369
370 PMG::Postfix::flush_queues();
371
372 return undef;
373 }});
374
375
376 __PACKAGE__->register_method ({
377 name => 'discard_verify_cache',
378 path => 'discard_verify_cache',
379 method => 'POST',
380 description => "Discards the address verification cache.",
381 proxyto => 'node',
382 permissions => { check => [ 'admin' ] },
383 protected => 1,
384 parameters => {
385 additionalProperties => 0,
386 properties => {
387 node => get_standard_option('pve-node'),
388 },
389 },
390 returns => { type => 'null' },
391 code => sub {
392 my ($param) = @_;
393
394 PMG::Postfix::discard_verify_cache();
395
396 return undef;
397 }});
398
399 1;