(N.B. In this question, a leading #
indicates a root prompt, not a comment. Also, I have replaced the actual hostname with <myhostname>
.)
As the debconf (7)
man-page states, dpkg-reconfigure
can be invoked with any one of several front-ends, including the default ("dialog") interactive front-end, and the "noninteractive" frontend.
Am I right in thinking that running
# dpkg-reconfigure postfix
to invoke the dialog front-end, and pressing Enter in response to each question, should be equivalent to running the following?
# dpkg-reconfigure -f noninteractive postfix
If so, then I do not understand the following discrepancy.
Discrepancy
On a VPS freshly-populated with Debian 9 "Stretch" from my web host's image (which has postfix already installed), I preseed using debconf-set-selections
:
# debconf-set-selections <<< "postfix postfix/destinations string <myhostname>"
# debconf-set-selections <<< "postfix postfix/mailbox_limit string 51200000"
# debconf-set-selections <<< "postfix postfix/mailname string <myhostname>"
# debconf-set-selections <<< "postfix postfix/main_mailer_type select Internet Site"
# debconf-set-selections <<< "postfix postfix/protocols select ipv4"
# debconf-set-selections <<< "postfix postfix/root_address string root"
If I then run dpkg-reconfigure
interactively, and press Enter for every question, I get:
# dpkg-reconfigure postfix
dpkg-reconfigure postfix
Removing sqlite map entry from /etc/postfix/dynamicmaps.cf
setting synchronous mail queue updates: false
Adding sqlite map entry to /etc/postfix/dynamicmaps.cf
changing /etc/mailname to <myhostname>
setting myorigin
setting destinations: localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 51200000
setting recipient_delimiter: +
setting inet_interfaces: all
setting default_transport: smtp
setting relay_transport: smtp
setting inet_protocols: ipv4
WARNING: /etc/aliases exists, but does not have a root alias.
Postfix (main.cf) is now set up with the changes above. If you need to make
changes, edit /etc/postfix/main.cf (and others) as needed. To view Postfix
configuration values, see postconf(1).
After modifying main.cf, be sure to run 'service postfix reload'.
Running newaliases
Note that this does quite a lot, including setting /etc/mailname
. At this point, postfix is ready to send mail.
By contrast, if I use the same VPS, starting again from a fresh image, and run the same commands except for invoking dpkg-reconfigure
non-interactively, I get:
# dpkg-reconfigure --frontend noninteractive postfix
Removing sqlite map entry from /etc/postfix/dynamicmaps.cf
Adding sqlite map entry to /etc/postfix/dynamicmaps.cf
Postfix (main.cf) configuration was not changed. If you need to make changes,
edit /etc/postfix/main.cf (and others) as needed. To view Postfix
configuration values, see postconf(1).
After modifying main.cf, be sure to run 'service postfix reload'.
Running newaliases
Note that this time, /etc/mailname
was not set. Moreover, at this point, postfix is not ready to send mail and any attempts to make it do so result in bounces showing up in /var/log/mail.log
.
My questions
- Was my initial assumption correct?
- Is the above discrepancy a bug, or is it expected behaviour? (And if it is expected behaviour, then what was the rationale for this design choice?)
Addendum
If I run rm /etc/postfix/main.cf
before running dpkg-reconfigure --frontend noninteractive postfix
, then /etc/mailname
and /etc/postfix/main.cf
both end up being created, and postfix ends up ready to send mail. This seems to be a viable workaround for the above failure, but it certainly violates the Rule of Least Surprise and feels as though it might be undefined behaviour that should not be relied upon.