]> git.proxmox.com Git - pmg-api.git/blob - src/PMG/API2/SpamAssassin.pm
eab02d9707b081402644f532dba691385a24bcca
[pmg-api.git] / src / PMG / API2 / SpamAssassin.pm
1 package PMG::API2::SpamAssassin;
2
3 use strict;
4 use warnings;
5
6 use PVE::Tools;
7 use PVE::SafeSyslog;
8 use PVE::INotify;
9 use PVE::Exception qw(raise_param_exc);
10 use PVE::RESTHandler;
11 use PMG::RESTEnvironment;
12 use PVE::JSONSchema qw(get_standard_option);
13
14 use PMG::Utils;
15 use PMG::Config;
16
17 use Mail::SpamAssassin;
18
19 use base qw(PVE::RESTHandler);
20
21 my $SAUPDATE = '/usr/bin/sa-update';
22
23 __PACKAGE__->register_method ({
24 name => 'index',
25 path => '',
26 method => 'GET',
27 description => "Directory index.",
28 permissions => { check => [ 'admin', 'audit' ] },
29 parameters => {
30 additionalProperties => 0,
31 properties => {
32 node => get_standard_option('pve-node'),
33 },
34 },
35 returns => {
36 type => 'array',
37 items => {
38 type => "object",
39 properties => {},
40 },
41 links => [ { rel => 'child', href => "{subdir}" } ],
42 },
43 code => sub {
44 my ($param) = @_;
45
46 my $res = [];
47
48 push @$res, { subdir => "rules" };
49
50 return $res;
51 }});
52
53 __PACKAGE__->register_method({
54 name => 'rules_status',
55 path => 'rules',
56 method => 'GET',
57 description => "SpamAssassin rules status.",
58 permissions => { check => [ 'admin', 'audit' ] },
59 proxyto => 'node',
60 parameters => {
61 additionalProperties => 0,
62 properties => {
63 node => get_standard_option('pve-node'),
64 },
65 },
66 returns => {
67 type => 'array',
68 items => {
69 type => "object",
70 properties => {
71 channel => { type => 'string' },
72 update_avail => { type => 'boolean' },
73 version => { type => 'string', optional => 1 },
74 last_updated => { type => 'integer', optional => 1},
75 update_version => { type => 'string', optional => 1},
76 },
77 },
78 },
79 code => sub {
80 my ($param) = @_;
81
82 my $saversion = $Mail::SpamAssassin::VERSION;
83 my $channelfile = "/var/lib/spamassassin/$saversion/updates_spamassassin_org.cf";
84
85 my $mtime = -1;
86 my $version = -1;
87 my $newversion = -1;
88
89 if (-f $channelfile) {
90 # stat metadata cf file
91 $mtime = (stat($channelfile))[9]; # 9 is mtime
92
93 # parse version from metadata cf file
94 my $metadata = PVE::Tools::file_read_firstline($channelfile);
95 if ($metadata =~ m/\s([0-9]+)$/) {
96 $version = $1;
97 } else {
98 warn "invalid metadata in '$channelfile'\n";
99 }
100 }
101 # call sa-update to see if updates are available
102
103 my $cmd = "$SAUPDATE -v --checkonly";
104 PVE::Tools::run_command($cmd, noerr => 1, logfunc => sub {
105 my ($line) = @_;
106
107 if ($line =~ m/Update available for channel \S+: -?[0-9]+ -> ([0-9]+)/) {
108 $newversion = $1;
109 }
110 });
111
112 my $result = {
113 channel => 'updates.spamassassin.org',
114 };
115
116 $result->{version} = $version if $version > -1;
117 $result->{update_version} = $newversion if $newversion > -1;
118 $result->{last_updated} = $mtime if $mtime > -1;
119
120 if ($newversion > $version) {
121 $result->{update_avail} = 1;
122 } else {
123 $result->{update_avail} = 0;
124 }
125
126 return [$result];
127 }});
128
129 __PACKAGE__->register_method({
130 name => 'update_rules',
131 path => 'rules',
132 method => 'POST',
133 description => "Update SpamAssassin rules.",
134 protected => 1,
135 permissions => { check => [ 'admin' ] },
136 proxyto => 'node',
137 parameters => {
138 additionalProperties => 0,
139 properties => {
140 node => get_standard_option('pve-node'),
141 },
142 },
143 returns => { type => 'string' },
144 code => sub {
145 my ($param) = @_;
146
147 my $rpcenv = PMG::RESTEnvironment->get();
148 my $authuser = $rpcenv->get_user();
149
150 my $realcmd = sub {
151 my $upid = shift;
152
153 # setup proxy env (assume sa-update use http)
154 my $pmg_cfg = PMG::Config->new();
155 if (my $http_proxy = $pmg_cfg->get('admin', 'http_proxy')) {
156 $ENV{http_proxy} = $http_proxy;
157 }
158
159 my $cmd = "$SAUPDATE -v";
160
161 PVE::Tools::run_command($cmd, noerr => 1);
162 };
163
164 return $rpcenv->fork_worker('saupdate', undef, $authuser, $realcmd);
165 }});
166
167 1;