]>
Commit | Line | Data |
---|---|---|
b00d2d73 DC |
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; | |
85d295d6 | 15 | use PMG::Config; |
b00d2d73 DC |
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.", | |
46607089 | 28 | permissions => { check => [ 'admin', 'audit' ] }, |
b00d2d73 DC |
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', | |
46607089 DM |
57 | description => "SpamAssassin rules status.", |
58 | permissions => { check => [ 'admin', 'audit' ] }, | |
59 | proxyto => 'node', | |
b00d2d73 DC |
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, | |
46607089 DM |
135 | permissions => { check => [ 'admin' ] }, |
136 | proxyto => 'node', | |
b00d2d73 DC |
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 | ||
85d295d6 DM |
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 | ||
b00d2d73 DC |
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; |