]> git.proxmox.com Git - pmg-api.git/commitdiff
api: spamassassin: read local channels
authorStoiko Ivanov <s.ivanov@proxmox.com>
Tue, 19 Jan 2021 10:38:13 +0000 (11:38 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 20 Jan 2021 10:28:49 +0000 (11:28 +0100)
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
src/PMG/API2/SpamAssassin.pm

index eab02d9707b081402644f532dba691385a24bcca..6b9f8f98e373c2d87a9c220c6451e9b22e9065b2 100644 (file)
@@ -80,50 +80,65 @@ __PACKAGE__->register_method({
        my ($param) = @_;
 
        my $saversion = $Mail::SpamAssassin::VERSION;
-       my $channelfile = "/var/lib/spamassassin/$saversion/updates_spamassassin_org.cf";
+       my $sa_update_dir = "/var/lib/spamassassin/$saversion/";
+
+       my $check_channel = sub {
+           my ($channel) = @_;
+
+           # see sa-update source:
+           my $channel_file_base = $channel;
+           $channel_file_base =~ s/[^A-Za-z0-9-]+/_/g;
+           my $channelfile = "${sa_update_dir}${channel_file_base}.cf";
+
+           my $mtime = -1;
+           my $version = -1;
+           my $newversion = -1;
+
+           if (-f $channelfile) {
+               # stat metadata cf file
+               $mtime = (stat($channelfile))[9]; # 9 is mtime
+
+               # parse version from metadata cf file
+               my $metadata = PVE::Tools::file_read_firstline($channelfile);
+               if ($metadata =~ m/\s([0-9]+)$/) {
+                   $version = $1;
+               } else {
+                   warn "invalid metadata in '$channelfile'\n";
+               }
+           }
+           # call sa-update to see if updates are available
 
-       my $mtime = -1;
-       my $version = -1;
-       my $newversion = -1;
+           my $cmd = "$SAUPDATE -v --checkonly --channel $channel";
+           PVE::Tools::run_command($cmd, noerr => 1, logfunc => sub {
+               my ($line) = @_;
 
-       if (-f $channelfile) {
-           # stat metadata cf file
-           $mtime = (stat($channelfile))[9]; # 9 is mtime
+               if ($line =~ m/Update available for channel \S+: -?[0-9]+ -> ([0-9]+)/) {
+                   $newversion = $1;
+               }
+           });
 
-           # parse version from metadata cf file
-           my $metadata = PVE::Tools::file_read_firstline($channelfile);
-           if ($metadata =~ m/\s([0-9]+)$/) {
-               $version = $1;
-           } else {
-               warn "invalid metadata in '$channelfile'\n";
-           }
-       }
-       # call sa-update to see if updates are available
+           my $result = {
+               channel => $channel,
+           };
 
-       my $cmd = "$SAUPDATE -v --checkonly";
-       PVE::Tools::run_command($cmd, noerr => 1, logfunc => sub {
-           my ($line) = @_;
+           $result->{version} = $version if $version > -1;
+           $result->{update_version} = $newversion if $newversion > -1;
+           $result->{last_updated} = $mtime if $mtime > -1;
 
-           if ($line =~ m/Update available for channel \S+: -?[0-9]+ -> ([0-9]+)/) {
-               $newversion = $1;
+           if ($newversion > $version) {
+               $result->{update_avail} = 1;
+           } else {
+               $result->{update_avail} = 0;
            }
-       });
-
-       my $result = {
-           channel => 'updates.spamassassin.org',
+           return $result;
        };
 
-       $result->{version} = $version if $version > -1;
-       $result->{update_version} = $newversion if $newversion > -1;
-       $result->{last_updated} = $mtime if $mtime > -1;
+       my @channels = ('updates.spamassassin.org');
 
-       if ($newversion > $version) {
-           $result->{update_avail} = 1;
-       } else {
-           $result->{update_avail} = 0;
-       }
+       my $localchannels = PMG::Utils::local_spamassassin_channels();
+       push(@channels, map { $_->{channelurl} } @$localchannels);
 
-       return [$result];
+       return [ map { $check_channel->($_) } @channels];
     }});
 
 __PACKAGE__->register_method({