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

Исполняемый файл предупреждения о квоте Dovecot не может войти в стандартный вывод

Я запускаю dovecot с базой данных userdb и passdb внутри контейнера докеров, используя s6-оверлей.

Все работает очень хорошо. Теперь попробовал добавить предупреждения о квотах и столкнулись с проблемой при входе в /dev/stdout.

Сообщение об ошибке

Всякий раз, когда должно быть отправлено письмо с предупреждением, я вижу, что это сообщение регистрируется:

Oct 28 10:27:01 quota-warning: Error: Can't open log file /dev/stdout: No such device or address
Oct 28 10:27:01 quota-warning: Fatal: master: service(quota-warning): child 460 returned error 75

Соответствующая конфигурация dovecot

Я установил путь к журналу /dev/stdout чтобы позволить S6 записывать журналы для меня. И я добавил сценарий предупреждения о квоте после руководства. Вот соответствующий конфиг:

log_path = /dev/stdout
first_valid_uid = 100
mail_uid = vmail
mail_gid = dovecot
mail_privileged_group = dovecot
mail_home = /var/mail/domains/%d/%n
mail_location = maildir:/var/mail/domains/%d/%n**
plugin {
  quota = maildir:User quota
  quota_exceeded_message = Storage quota for user %u exceeded
  quota_rule2 = Trash:storage=+100M
  quota_grace = 10%%
  quota_status_success = DUNNO
  quota_status_nouser = DUNNO
  quota_status_overquota = "552 5.2.2 Mailbox is full"
  quota_warning = storage=85%% quota-warning 85 %u %d
}
service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  user = vmail
  group = dovecot
  unix_listener quota-warning {
    user = dovecot
    mode = 0666
  }
}

Сценарий предупреждения о квоте

#!/bin/sh
PERCENT=$1
USER=$2
DOMAIN=$3
cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: no-reply@$DOMAIN
Subject: Qutoa warning

Your mailbox quota is at $PERCENT%.
EOF

S6 dovecot сервис

S6 run Скрипт для запуска dovecot очень прост:

#!/bin/sh
exec /usr/sbin/dovecot -F -c /etc/dovecot/dovecot.conf

Вывод журнала из /dev/stdout захватывается через logs/run сценарий:

#!/bin/sh
exec logutil-service /logs/dovecot

Что я пробовал

Все работает как только меняю log_path в статический файл, например /tmp/dovecot.log. Но я не этого хочу.

Как я вижу, нет /dev/stdout создан для сценария предупреждения о квоте, и я не знаю, как это исправить.

Для записи: все остальное из dovecot отлично регистрируется через /dev/stdout.

ОБНОВЛЕНИЕ: я также могу запустить quota-warning.sh сценарий вручную из оболочки внутри контейнера без проблем. Он отправляет предупреждающее сообщение в почтовый ящик пользователя.

Это работает, если вы сделаете следующее:

Измените пользователя, выполняющего сценарий предупреждения о квоте, на корень:

service quota-warning { executable = script /usr/local/bin/quota-warning.sh user = root }

Однако даже при запуске сценария от имени пользователя root (что не идеально с точки зрения безопасности) он не работает.

Поэтому я добавил следующие параметры к Dovecot-Ida командная строка:

/usr/libexec/dovecot/dovecot-lda -d $USER -o "log_path=/proc/1/fd/2" -o "info_log_path=/proc/1/fd/1" -o "plugin/quota=maildir:User quota:noenforcing"

При этом ведение журнала перенаправляется в STDOUT и STDERR процесса с PID = 1, то есть процесса, выходные данные которого обычно регистрируются докером.

Я не знаю, почему / dev / stdout и / dev / stderr недоступны для сценария предупреждения о квоте, даже если он запускается корень...

Вы тем временем нашли лучшее решение?

С уважением, Стефан