Назад | Перейти на главную страницу

dpkg-reconfigure: интерфейс диалога успешно устанавливает постфикс; неинтерактивный интерфейс не работает

(N.B. В этом вопросе ведущий # указывает на корневую подсказку, а не на комментарий. Кроме того, я заменил фактическое имя хоста на <myhostname>.)

Как debconf (7) состояния man-страницы, dpkg-reconfigure может быть вызван с помощью любого из нескольких интерфейсов, включая значение по умолчанию ("диалог") интерактивный интерфейс, а"не интерактивный" внешний интерфейс.

Прав ли я, думая, что бег

# dpkg-reconfigure postfix

призвать диалог front-end и нажатие Войти в ответ на каждый вопрос должно быть эквивалентно выполнение следующего?

# dpkg-reconfigure -f noninteractive postfix

Если так, то я не понимаю следующего несоответствия.

Несоответствие

На VPS, недавно заполненном Debian 9 "Stretch" из образа моего веб-хоста (на котором уже установлен постфикс), я использовал 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"                   

Если я тогда бегу dpkg-reconfigure интерактивно и нажмите Войти на каждый вопрос я получаю:

# 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

Обратите внимание, что это довольно много, включая настройку /etc/mailname. На этом этапе postfix готов к отправке почты.

Напротив, если я использую тот же VPS, начиная снова со свежего образа, и запускаю те же команды, за исключением вызова dpkg-reconfigure в неинтерактивном режиме я получаю:

# 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

Обратите внимание, что на этот раз /etc/mailname не было установлено. Более того, на данный момент postfix не готов к отправке почты, и любые попытки сделать это приводят к появлению отказов в /var/log/mail.log.

Мои вопросы

  1. Было ли мое первоначальное предположение правильным?
  2. Является ли указанное выше несоответствие ошибкой или ожидаемым поведением? (И если это ожидаемое поведение, то каково было обоснование этого выбора дизайна?)

Дополнение

Если я сбегу rm /etc/postfix/main.cf перед запуском dpkg-reconfigure --frontend noninteractive postfix, затем /etc/mailname и /etc/postfix/main.cf оба в конечном итоге создаются, и postfix готов к отправке почты. Это кажется жизнеспособным обходным путем для вышеуказанного сбоя, но, безусловно, нарушает Правило наименьшего сюрприза и кажется, что это может быть неопределенное поведение, на которое нельзя полагаться.

Файлы конфигурации постфикса, включая /etc/mailname НЕЛЬЗЯ изменить с помощью debconf-set-selections и dpkg-reconfigure после того, как файлы конфигурации постфикса были записаны. Я потратил слишком много часов, пытаясь понять, почему ...

Зачем?

dpkg-reconfigure -f noninteractive возвращает значение 30 вопрос пропущен для всех вопросов (и использует debconf-set-selections пресеты), код в /var/lib/dpkg/info/postfix.config затем не устанавливает измененные настройки debconf и /var/lib/dpkg/info/postfix.postinst то постфиксный конфиг не пишет.

Обходные пути?

  1. Как вы обнаружили, обходной путь - удалить /etc/postfix/main.cf что заставляет /var/lib/dpkg/info/postfix.postinst написать новый конфиг для постфикса, который будет включать новый debconf-set-selections параметры.

  2. Альтернативное использование dpkg-reconfigure в интерактивном режиме и подтвердите вопросы, в этом случае /var/lib/dpkg/info/postfix.config отмечает параметры как измененные и /var/lib/dpkg/info/postfix.postinst записывает изменения.

  3. Альтернативный переход к управлению /etc/postfix/main.cf и т. д. с использованием postconf. (Вероятно, хорошая идея иметь echo "postfix postfix/main_mailer_type select No configuration" | debconf-set-selections защитная сетка)