On 9/5/19 11:55 AM, Reio Remma wrote:
> On 05/09/2019 11:33, [email protected] wrote:
>> Yes, see the smtpd.conf(5) man page:
>>
>> filter myreporter proc-exec "/tmp/reporting.sh"
>>
>> listen on [...] filter myreporter
>
> smtp: 0x271c2c0: <<< EHLO localhost
> mproc: pony -> lka : 49 IMSG_REPORT_SMTP_PROTOCOL_CLIENT
> mproc: pony -> lka : 50 IMSG_??? (129)
> smtp: 0x271c2c0: STATE_CONNECTED -> STATE_HELO
> smtp: 0x271c2c0: >>> 250-host.domain.com Hello localhost [local], pleased to
> meet you
> mproc: pony -> lka : 102 IMSG_REPORT_SMTP_PROTOCOL_SERVER
> smtp: 0x271c2c0: >>> 250-8BITMIME
> mproc: pony -> lka : 47 IMSG_REPORT_SMTP_PROTOCOL_SERVER
> smtp: 0x271c2c0: >>> 250-ENHANCEDSTATUSCODES
> mproc: pony -> lka : 58 IMSG_REPORT_SMTP_PROTOCOL_SERVER
> smtp: 0x271c2c0: >>> 250-SIZE 104857600
> mproc: pony -> lka : 53 IMSG_REPORT_SMTP_PROTOCOL_SERVER
> smtp: 0x271c2c0: >>> 250 HELP
> mproc: pony -> lka : 43 IMSG_REPORT_SMTP_PROTOCOL_SERVER
> smtp: 0x271c2c0: IO_LOWAT <io:0x271aa40 fd=16 to=300000 fl=W ib=0 ob=0>
> smtp: 0x271c2c0: IO_DATAIN <io:0x271aa40 fd=16 to=300000 fl=R ib=38 ob=0>
> smtp: 0x271c2c0: <<< MAIL FROM:<[email protected]>
> mproc: pony -> lka : 72 IMSG_REPORT_SMTP_PROTOCOL_CLIENT
> mproc: pony -> queue : 8 IMSG_SMTP_MESSAGE_CREATE
> imsg: queue <- pony: IMSG_SMTP_MESSAGE_CREATE (len=8)
> queue-backend: queue_message_create() -> 1 (df19e22a)
> mproc: queue -> pony : 16 IMSG_SMTP_MESSAGE_CREATE
> imsg: pony <- queue: IMSG_SMTP_MESSAGE_CREATE (len=16)
> mproc: pony -> lka : 37 IMSG_REPORT_SMTP_TX_BEGIN
> smtp: 0x271c2c0: >>> 250 2.0.0 Ok
> mproc: pony -> lka : 70 IMSG_??? (134)
> mproc: pony -> lka : 47 IMSG_REPORT_SMTP_PROTOCOL_SERVER
> smtp: 0x271c2c0: IO_LOWAT <io:0x271aa40 fd=16 to=300000 fl=W ib=0 ob=0>
> smtp: 0x271c2c0: IO_DATAIN <io:0x271aa40 fd=16 to=300000 fl=R ib=29 ob=0>
> smtp: 0x271c2c0: <<< RCPT TO:<[email protected]>
> mproc: pony -> lka : 63 IMSG_REPORT_SMTP_PROTOCOL_CLIENT
> mproc: pony -> lka : 291 IMSG_SMTP_EXPAND_RCPT
>
> SMTPD seems to get stuck here with no errors. This is with the simple:
>
> filter reporter proc-exec "/etc/opensmtpd/reporter.sh"
>
> #!/bin/sh
> while read line; do
> echo $line >> /var/log/opensmtpd.log
> done
>
> Reio
>
You need to register what events you want to receive and finish up with
register|ready.
$ cat test.sh
#!/bin/sh
while read line; do
echo $line >&2
if [ "${line%%\|*}" == "config" ]; then
if [ "${line#*\|}" == "ready" ]; then
echo "register|report|smtp-in|link-connect"
echo "register|ready"
fi
continue
fi
done
Possible values for report are (from lka_report.c):
static struct smtp_events {
const char *event;
} smtp_events[] = {
{ "link-connect" },
{ "link-disconnect" },
{ "link-greeting" },
{ "link-identify" },
{ "link-tls" },
{ "link-auth" },
{ "tx-reset" },
{ "tx-begin" },
{ "tx-mail" },
{ "tx-rcpt" },
{ "tx-envelope" },
{ "tx-data" },
{ "tx-commit" },
{ "tx-rollback" },
{ "protocol-client" },
{ "protocol-server" },
{ "filter-response" },
{ "timeout" },
};
Possible values for filter are:
static struct filter_exec {
enum filter_phase phase;
const char *phase_name;
int (*func)(struct filter_session *, struct filter
*, uint64_t, const char *);
} filter_execs[FILTER_PHASES_COUNT] = {
{ FILTER_CONNECT, "connect", filter_builtins_connect },
{ FILTER_HELO, "helo", filter_builtins_helo },
{ FILTER_EHLO, "ehlo", filter_builtins_helo },
{ FILTER_STARTTLS, "starttls", filter_builtins_notimpl },
{ FILTER_AUTH, "auth", filter_builtins_notimpl },
{ FILTER_MAIL_FROM, "mail-from", filter_builtins_mail_from },
{ FILTER_RCPT_TO, "rcpt-to", filter_builtins_rcpt_to },
{ FILTER_DATA, "data", filter_builtins_notimpl },
{ FILTER_DATA_LINE, "data-line", filter_builtins_notimpl },
{ FILTER_RSET, "rset", filter_builtins_notimpl },
{ FILTER_QUIT, "quit", filter_builtins_notimpl },
{ FILTER_NOOP, "noop", filter_builtins_notimpl },
{ FILTER_HELP, "help", filter_builtins_notimpl },
{ FILTER_WIZ, "wiz", filter_builtins_notimpl },
{ FILTER_COMMIT, "commit", filter_builtins_notimpl },
};
reports come in in the format:
report|<version>|<time>|<direction>|<phase>|<reqid>|<parameters>
filters come in in the format:
filter|<version>|<time>|<direction>|<phase>|<reqid>|<token>|<parameter>
Note that filters require a proceed, rewrite, reject, or disconnect
reply in the form:
filter-result|<token>|<reqid>|proceed
filter-result|<token>|<reqid>|reject|<reason>
filter-result|<token>|<reqid>|disconnect|<reason>
filter-result|<token>|<reqid>|rewrite|<value>
Note that this is mostly stable, but some changes may occur, so
keep track of the version. Minor versions are backwards compatible,
major versions are not.