From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 9CF7369688 for ; Mon, 18 Jan 2021 20:47:59 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8D9991774E for ; Mon, 18 Jan 2021 20:47:59 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 3793A1773E for ; Mon, 18 Jan 2021 20:47:58 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 0257246066 for ; Mon, 18 Jan 2021 20:47:58 +0100 (CET) Date: Mon, 18 Jan 2021 20:47:56 +0100 From: Stoiko Ivanov To: Thomas Lamprecht Cc: pmg-devel@lists.proxmox.com Message-ID: <20210118204756.2ac6db0e@rosa.proxmox.com> In-Reply-To: <5c086b1d-86f6-77e2-1f44-302656162535@proxmox.com> References: <20201230171539.7644-1-s.ivanov@proxmox.com> <20201230171539.7644-3-s.ivanov@proxmox.com> <5c086b1d-86f6-77e2-1f44-302656162535@proxmox.com> X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.070 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pmg-devel] [PATCH pmg-api v2 2/4] api: spamassassin: read local channels X-BeenThere: pmg-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Mail Gateway development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jan 2021 19:47:59 -0000 On Fri, 15 Jan 2021 11:02:42 +0100 Thomas Lamprecht wrote: > On 30.12.20 18:15, Stoiko Ivanov wrote: > > Signed-off-by: Stoiko Ivanov > > --- > > v1->v2: > > * changed the transliteration (tr///) to an equivalent more common s/// > > > > src/PMG/API2/SpamAssassin.pm | 83 +++++++++++++++++++++--------------- > > 1 file changed, 49 insertions(+), 34 deletions(-) > > > > diff --git a/src/PMG/API2/SpamAssassin.pm b/src/PMG/API2/SpamAssassin.pm > > index eab02d9..6b9f8f9 100644 > > --- a/src/PMG/API2/SpamAssassin.pm > > +++ b/src/PMG/API2/SpamAssassin.pm > > @@ -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; $version gets initialized to -1 here... > > + 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"; > > I know it was already there, but this mayresults in a undef comparison > when checking `if ($newversion > $version) {` below. > I'd do a separate followup with that being fixed, e.g., by either prepending the > if check with a `!defined($version) || ...` check or setting it to -1000 or so. so it should not be undefined if the metadata is not matching? (I quickly tested in on my system - and if I drop the -1 I get a undef comparison in the logs - but it works as is) or am I missing something? > > > + } > > + } > > + # 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]; > > this reads a bit weird, but can be OK as $check_channel does seem to catch > all actual possible errors. > > > }}); > > > > __PACKAGE__->register_method({ > > > >