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@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