]> git.proxmox.com Git - pmg-api.git/blob - PMG/API2/Transport.pm
implement transport API
[pmg-api.git] / PMG / API2 / Transport.pm
1 package PMG::API2::Transport;
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 HTTP::Status qw(:constants);
10 use PVE::JSONSchema qw(get_standard_option);
11 use PVE::RESTHandler;
12 use PVE::INotify;
13
14 use PMG::Config;
15
16 use base qw(PVE::RESTHandler);
17
18 __PACKAGE__->register_method ({
19 name => 'index',
20 path => '',
21 method => 'GET',
22 description => "List transport map entries.",
23 proxyto => 'master',
24 parameters => {
25 additionalProperties => 0,
26 properties => {},
27 },
28 returns => {
29 type => 'array',
30 items => {
31 type => "object",
32 properties => {
33 domain => { type => 'string' },
34 host => { type => 'string' },
35 port => { type => 'integer' },
36 nomx => { type => 'boolean' },
37 comment => { type => 'string'},
38 },
39 },
40 links => [ { rel => 'child', href => "{id}" } ],
41 },
42 code => sub {
43 my ($param) = @_;
44
45 my $tmap = PVE::INotify::read_file('transport');
46
47 my $res = [];
48
49 foreach my $domain (sort keys %$tmap) {
50 push @$res, $tmap->{$domain};
51 }
52
53 return $res;
54 }});
55
56 __PACKAGE__->register_method ({
57 name => 'create',
58 path => '',
59 method => 'POST',
60 proxyto => 'master',
61 protected => 1,
62 description => "Add transport map entry.",
63 parameters => {
64 additionalProperties => 0,
65 properties => {
66 domain => {
67 description => "Domain name.",
68 type => 'string', format => 'dns-name',
69 },
70 host => {
71 description => "Target host (name or IP address).",
72 type => 'string', format => 'address',
73 },
74 port => {
75 description => "SMTP port.",
76 type => 'integer',
77 minimum => 1,
78 maximum => 65535,
79 optional => 1,
80 default => 25,
81 },
82 nomx => {
83 description => "Disable MX lookups.",
84 type => 'boolean',
85 optional => 1,
86 default => 0,
87 },
88 comment => {
89 description => "Comment.",
90 type => 'string',
91 optional => 1,
92 },
93 },
94 },
95 returns => { type => 'null' },
96 code => sub {
97 my ($param) = @_;
98
99 my $code = sub {
100
101 my $tmap = PVE::INotify::read_file('transport');
102
103 die "Transport map entry '$param->{domain}' already exists\n"
104 if $tmap->{$param->{domain}};
105
106 $tmap->{$param->{domain}} = {
107 domain => $param->{domain},
108 host => $param->{host},
109 port => $param->{port} // 25,
110 nomx => $param->{nomx} // 0,
111 comment => $param->{comment} // '',
112 };
113
114 PVE::INotify::write_file('transport', $tmap);
115
116 PMG::Config::postmap_pmg_transport();
117 };
118
119 PMG::Config::lock_config($code, "add transport map entry failed");
120
121 return undef;
122 }});
123
124 __PACKAGE__->register_method ({
125 name => 'read',
126 path => '{domain}',
127 method => 'GET',
128 description => "Read transport map entry.",
129 proxyto => 'master',
130 parameters => {
131 additionalProperties => 0,
132 properties => {
133 domain => {
134 description => "Domain name.",
135 type => 'string', format => 'dns-name',
136 },
137 },
138 },
139 returns => {
140 type => "object",
141 properties => {
142 domain => { type => 'string'},
143 host => { type => 'string'},
144 port => { type => 'integer'},
145 nomx => { type => 'boolean'},
146 comment => { type => 'string'},
147 },
148 },
149 code => sub {
150 my ($param) = @_;
151
152 my $tmap = PVE::INotify::read_file('transport');
153
154 if (my $entry = $tmap->{$param->{domain}}) {
155 return $entry;
156 }
157
158 die "Transport map entry '$param->{domain}' does not exist\n";
159 }});
160
161 __PACKAGE__->register_method ({
162 name => 'write',
163 path => '{domain}',
164 method => 'PUT',
165 description => "Update transport map entry.",
166 protected => 1,
167 proxyto => 'master',
168 parameters => {
169 additionalProperties => 0,
170 properties => {
171 domain => {
172 description => "Domain name.",
173 type => 'string', format => 'dns-name',
174 },
175 host => {
176 description => "Target host (name or IP address).",
177 type => 'string', format => 'address',
178 optional => 1,
179 },
180 port => {
181 description => "SMTP port.",
182 type => 'integer',
183 minimum => 1,
184 maximum => 65535,
185 optional => 1,
186 },
187 nomx => {
188 description => "Disable MX lookups.",
189 type => 'boolean',
190 optional => 1,
191 },
192 comment => {
193 description => "Comment.",
194 type => 'string',
195 optional => 1,
196 },
197 },
198 },
199 returns => { type => 'null' },
200 code => sub {
201 my ($param) = @_;
202
203 my $code = sub {
204
205 my $tmap = PVE::INotify::read_file('transport');
206
207 my $domain = extract_param($param, 'domain');
208
209 my $data = $tmap->{$domain};
210
211 die "Transport map entry '$param->{domain}' does not exist\n" if !$data;
212
213 die "no options specified\n" if !scalar(keys %$param);
214
215 for my $prop (qw(host port nomx comment)) {
216 $data->{$prop} = $param->{$prop} if defined($param->{$prop});
217 }
218
219 PVE::INotify::write_file('transport', $tmap);
220
221 PMG::Config::postmap_pmg_transport();
222 };
223
224 PMG::Config::lock_config($code, "update transport map entry failed");
225
226 return undef;
227 }});
228
229 __PACKAGE__->register_method ({
230 name => 'delete',
231 path => '{domain}',
232 method => 'DELETE',
233 description => "Delete a transport map entry",
234 protected => 1,
235 proxyto => 'master',
236 parameters => {
237 additionalProperties => 0,
238 properties => {
239 domain => {
240 description => "Domain name.",
241 type => 'string', format => 'dns-name',
242 },
243 }
244 },
245 returns => { type => 'null' },
246 code => sub {
247 my ($param) = @_;
248
249 my $code = sub {
250
251 my $tmap = PVE::INotify::read_file('transport');
252
253 die "Transport map entry '$param->{domain}' does not exist\n"
254 if !$tmap->{$param->{domain}};
255
256 delete $tmap->{$param->{domain}};
257
258 PVE::INotify::write_file('transport', $tmap);
259
260 PMG::Config::postmap_pmg_transport();
261 };
262
263 PMG::Config::lock_config($code, "delete transport map extry failed");
264
265 return undef;
266 }});
267
268 1;