Dovecot 配额警告可执行文件无法记录到标准输出

Dovecot 配额警告可执行文件无法记录到标准输出

我在 Docker 容器内使用基于 DB 的 userdb 和 passdb 运行 dovecots6-覆盖

一切都运行良好。现在我尝试添加配额警告并遇到登录问题/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 鸽舍服务

run启动 dovecot 的S6脚本非常简单:

#!/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从容器内的 shell 手动运行该脚本,没有任何问题。它会将警告消息发送到用户邮箱。

答案1

如果您执行以下操作,它将起作用:

将执行配额警告脚本的用户更改为

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

即使以 root 身份运行脚本(从安全角度来看这并不理想),它也不起作用。

因此,我将以下选项附加到多夫科特-lda命令行:

/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"

执行此操作时,日志记录将被重定向到 PID=1 进程的 STDOUT 和 STDERR,该进程的输出通常会被 docker 记录。

我不知道为什么 /dev/stdout 和 /dev/stderr 对配额警告脚本不可用,即使它由...

与此同时,您是否找到了更好的解决方案?

谨致问候,Stefan

相关内容