[pmg-devel] [PATCH pmg-api v4 02/11] fix #2371: reload pmg-smtp-filter on config change
Stoiko Ivanov
s.ivanov at proxmox.com
Mon Oct 21 19:23:26 CEST 2019
the external services (postfix, clamav,...) are restarted if their configfile
changes (which Template::Toolkit tells us).
By writing a current-config to '/run/pmg-smtp-filter.cfg' we can use the same
logic to reload it on a config-change affecting it - currently hide_received
Signed-off-by: Stoiko Ivanov <s.ivanov at proxmox.com>
---
src/PMG/Config.pm | 65 +++++++++++++++++++++++++++++++++++++++++
src/bin/pmg-smtp-filter | 1 +
2 files changed, 66 insertions(+)
diff --git a/src/PMG/Config.pm b/src/PMG/Config.pm
index 0c907a2..a0acd4a 100755
--- a/src/PMG/Config.pm
+++ b/src/PMG/Config.pm
@@ -1548,6 +1548,65 @@ sub rewrite_config_postfix {
return $changes;
}
+#parameters affecting services w/o config-file (pmgpolicy, pmg-smtp-filter)
+my $pmg_service_params = {
+ mail => { hide_received => 1 },
+};
+
+my $smtp_filter_cfg = '/run/pmg-smtp-filter.cfg';
+my $smtp_filter_cfg_lock = '/run/pmg-smtp-filter.cfg.lck';
+
+sub dump_smtp_filter_config {
+ my ($self) = @_;
+
+ my $conf = '';
+ my $val;
+ foreach my $sec (sort keys %$pmg_service_params) {
+ my $conf_sec = $self->{ids}->{$sec} // {};
+ foreach my $key (sort keys %{$pmg_service_params->{$sec}}) {
+ $val = $conf_sec->{$key};
+ $conf .= "$sec.$key:$val\n" if defined($val);
+ }
+ }
+
+ return $conf;
+}
+
+sub compare_smtp_filter_config {
+ my ($self) = @_;
+
+ my $ret = 0;
+ my $old;
+ eval {
+ $old = PVE::Tools::file_get_contents($smtp_filter_cfg);
+ };
+
+ if (my $err = $@) {
+ syslog ('warning', "reloading pmg-smtp-filter: $err");
+ $ret = 1;
+ } else {
+ my $new = $self->dump_smtp_filter_config();
+ $ret = 1 if $old ne $new;
+ }
+
+ $self->write_smtp_filter_config() if $ret;
+
+ return $ret;
+}
+
+# writes the parameters relevant for pmg-smtp-filter to /run/ for comparison
+# on config change
+sub write_smtp_filter_config {
+ my ($self) = @_;
+
+ PVE::Tools::lock_file($smtp_filter_cfg_lock, undef, sub {
+ PVE::Tools::file_set_contents($smtp_filter_cfg,
+ $self->dump_smtp_filter_config());
+ });
+
+ die $@ if $@;
+}
+
sub rewrite_config {
my ($self, $rulecache, $restart_services, $force_restart) = @_;
@@ -1589,6 +1648,12 @@ sub rewrite_config {
$log_restart->('clamav-freshclam');
PMG::Utils::service_cmd('clamav-freshclam', 'restart');
}
+
+ if (($self->compare_smtp_filter_config() && $restart_services) ||
+ $force_restart->{spam}) {
+ syslog ('info', "scheduled reload for pmg-smtp-filter");
+ PMG::Utils::reload_smtp_filter();
+ }
}
1;
diff --git a/src/bin/pmg-smtp-filter b/src/bin/pmg-smtp-filter
index 61eaf92..62ce9ab 100755
--- a/src/bin/pmg-smtp-filter
+++ b/src/bin/pmg-smtp-filter
@@ -440,6 +440,7 @@ sub pre_loop_hook {
my ($backup_umask) = umask;
my $pmg_cfg = PMG::Config->new();
+ $pmg_cfg->write_smtp_filter_config();
# Note: you need to restart the daemon when you change 'rbl_checks'
my $rbl_checks = $pmg_cfg->get('spam', 'rbl_checks');
--
2.20.1
More information about the pmg-devel
mailing list