helpful_warnings=no schaltet nicht "override earlier entry" Warnings aus

Axel Beckert beckert at phys.ethz.ch
Mi Jan 28 11:54:42 CET 2015


Hallo,

wir verteilen unsere main.cf auf Server und Workstations per
Konfigurationsmanagement.

Es gibt eine Default-main.cf, die meistens ausreicht. Braucht es
Abweichungen, so werden diese durch ein beim Deployment angehängtes
per-host-Konfigurationsschnipsel gelöst. In diesem sind
ggf. Einstellungen  drin, die in der Default-Datei bereits mit anderen
Wertten drin sind, um diese zu überschreiben.

Mit Debian 7 Wheezy und Postfix 2.9.6 funktioniert dies wunderbar,
aber seit Debian 8 Jessie und Postfix 2.11.3 jammert Postfix in
verschiedensten Situationen über diese "Überschreib"-Methoden:

# postconf > /dev/null
postconf: warning: /etc/postfix/main.cf, line 29: overriding earlier entry: mydestination=
postconf: warning: /etc/postfix/main.cf, line 30: overriding earlier entry: relayhost=smtp.phys.ethz.ch
postconf: warning: /etc/postfix/main.cf, line 31: overriding earlier entry: inet_interfaces=loopback-only
#

Die dazugehörige main.cf sieht wie folgt aus:

---8<---
# Note: file generated by dphys-config   DO NOT EDIT IN /etc/postfix/main.cf

# Default settings (hostname has been inserted by the configuration
# deployment tool)
myhostname = silberspitz.ethz.ch
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU Linux)
biff = no
append_dot_mydomain = no
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
relayhost = smtp.phys.ethz.ch
mynetworks = 127.0.0.0/8, [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
sender_canonical_maps = pcre:/etc/postfix/sender_canonical
mydestination = 

# Per-host settings
mydestination =
        silberspitz.ethz.ch
        silberspitz
        localhost
        bb.phys.ethz.ch
        hobbit.phys.ethz.ch
        xymon.phys.ethz.ch
relayhost = 
inet_interfaces = all
--->8---

(Grundidee bei diesem Beispiel: Alle Standard-Server sollen Mails via
Mailserver verschicken, nicht aber der Monitoring-Server von dem
o.g. Beispiel stammt. Der soll auch noch Mails an das SMS-Gateway
verschicken können, wenn der Mailserver down ist.)

Um o.g. Warnungen zu unterdrücken habe ich dann noch ein

  helpful_warnings = no

ganz vorne in der main.cf hinzugefügt.

Gemäss man page unterdrückt dies "warnings about problematic
configuration settings, and helpful suggestions." -- Klang für mich
nach genau der richtigen Einstellung, hat aber leider keinen
Unterschied gemacht.

Deswegen meine Frage: Wie bekomme ich Postfix dazu, diese Warnungen
nicht mehr auszugeben? Sie verursachen diverse Mails von Cron-Jobs,
weil Output (auf STDERR) kommt, z.B. von popularity-contest:

---8<---
Subject: Cron <root at silberspitz> test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

/etc/cron.daily/popularity-contest:
sendmail: warning: /etc/postfix/main.cf, line 28: overriding earlier entry: mydestination=
sendmail: warning: /etc/postfix/main.cf, line 29: overriding earlier entry: relayhost=smtp.phys.ethz.ch
sendmail: warning: /etc/postfix/main.cf, line 30: overriding earlier entry: inet_interfaces=loopback-only
postdrop: warning: /etc/postfix/main.cf, line 28: overriding earlier entry: mydestination=
postdrop: warning: /etc/postfix/main.cf, line 29: overriding earlier entry: relayhost=smtp.phys.ethz.ch
postdrop: warning: /etc/postfix/main.cf, line 30: overriding earlier entry: inet_interfaces=loopback-only
--->8---

Und nein, ich will nicht pauschal allen Output nach STDERR
unterdrücken, da könnte ja durchaus mal ein relevanter Fehler drin
sein. :-) (Mal ganz davon abgesehen, dass ich das nicht in jedem
Skript machen will, welches irgendwann mal "sendmail" aufruft.)

Im Changelog habe ich diesen Eintrag gefunden:

20130404

        Human factors: warning when a main.cf parameter has multiple
        entries with different values.  File: util/dict.c.

Aber das ist doch gar kein Bug, das ist ein Feature! ;-)

Code-Stelle dazu ist recht sicher dies hier:

    459         if ((old = dict->lookup(dict, member)) != 0
    460             && strcmp(old, val) != 0)
    461             msg_warn("%s, line %d: overriding earlier entry: %s=%s",
    462                      VSTREAM_PATH(fp), lineno, member, old);

Bei Weiterverfolgen, ob das Log-Level irgendwo ausgewertet wird und
beeinflusst werden kann, bin ich bis zur Funktion msg_text am Ende von
util/msg_output.c gekommen, aber da haben mich meine C-Kenntnisse dann
irgendwann verlassen...

		Mit freundlichem Gruss, Axel Beckert
-- 
Axel Beckert <beckert at phys.ethz.ch>       support: +41 44 633 26 68
IT Services Group, HPT H 6                  voice: +41 44 633 41 89
Departement of Physics, ETH Zurich
CH-8093 Zurich, Switzerland		   http://nic.phys.ethz.ch/


Mehr Informationen über die Mailingliste postfix-users