Что делают эти строки синтаксического анализа журнала Perl и как я могу придумать что-то, что могло бы сработать?
-
12-12-2019 - |
Вопрос
Эта проблема возникает в контексте pop-before-smtp / Postfix / Dovecot, но если бы я знал синтаксический анализ строк Perl, я мог бы сам придумать ответ.Однако я настолько растерян, что даже не знаю точного вопроса.А именно:
Мы уже давно используем Postfix и в некотором роде подсели на него.Теперь нам нужно "перейти в современную эпоху" и позволить людям отправлять электронную почту с наших SMTP-серверов, даже когда они находятся за пределами нашей сети.Итак, получив задание на эту работу, я нашел pop-before-smtp.
Вы можете найти его здесь.
Итак, у меня все настроено, но при тестировании происходит сбой.Я устранил неполадку, используя инструкции здесь, и определил, что Perl, который пытается проанализировать журнал, по-видимому, неверен.Мы используем Dovecot в качестве нашего сервера IMAP / POP, и в файле конфигурации указаны три варианта.Вот выдержка из конфигурационного файла, показывающая три набора:
# For Dovecot POP3/IMAP when using syslog.
#$pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
# 'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
#$out_pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
# 'Disconnected.*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
# For Dovecot POP3/IMAP when it does its own logging.
##$logtime_pat = '(\d\d\d\d-\d+-\d+ \d+:\d+:\d+)';
#$pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' .
# 'Login: .+? rip=[:f]*(\d+\.\d+\.\d+\.\d+),';
#$out_pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' .
# 'Disconnected.*? rip=[:f]*(\d+\.\d+\.\d+\.\d+),';
# For older Dovecot POP3/IMAP when it does its own logging.
#$pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' .
# 'Login: \S+ \[[:f]*(\d+\.\d+\.\d+\.\d+)\]';
#$out_pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' .
# 'Disconnected.*? \[[:f]*(\d+\.\d+\.\d+\.\d+)\]';
Предполагается раскомментировать те, которые применимы, однако ни один из них не работает.
Я предполагаю, что "pat" - это шаблон для входа в систему, а out-pat - это шаблон для выхода из системы или иного отключения.
Фактический формат записи журнала явно отличается от любого из этих трех, но они близки.Вот пример пары:
Mar 11 17:53:55 imap-login: Info: Login: user=<username>, method=PLAIN, rip=208.54.4.205, lip=192.168.1.1, TLS
Mar 11 17:59:10 IMAP(username): Info: Disconnected: Logged out bytes=352/43743
При использовании POP "imap-login" заменяется на "pop-login", а при выходе из системы "POP" заменяет "IMAP" - почему произошли изменения в заглавных буквах, я не могу сказать!
Важными данными являются:Временная метка, имя пользователя и, при входе в систему, "удаленный" ip-адрес ("rip").
Если у меня будет достаточно времени, я, возможно, смогу собрать воедино что-то, что сработает, но поскольку я на самом деле не знаю Perl, это довольно сложно.Пожалуйста, помогите мне написать новые правила для анализа выходных данных журнала, используемых в нашем пакете Dovecot.
Решение
То (:?..
часть регулярного выражения Perl запрашивает кластеризация но не захватывающий;это позволяет сопоставлять целые группы или игнорировать их как группу as, не влияя на номера групп захвата;все строки содержат ровно одно поле - разрешенный IP-адрес.(Что немного странно, я мог бы ожидать и имени пользователя, и IP, но в долгосрочной перспективе это может быть проще.)
# For Dovecot POP3/IMAP when using syslog.
$pat = '^[LOGTIME] \S+ (?:imap|pop3)-login: Info: ' .
'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
# not necessary? see comment header START OF PATTERNS
# $out_pat = '^[LOGTIME] \S+ (?:IMAP|POP3)\(\S+\): Info: ' .
# 'Disconnected.*';
Я удалил dovecot
фрагменты, поскольку их не было в вашем вводе.Я добавил Info:
к обеим линиям.Я изменил $out_pat
использовать IMAP(username)
вместо того, чего больше нет imap-login
из оригинала.(Использование \S+
будет прерываться, если в именах пользователей есть пробелы.Поскольку это предположение было сделано в другом месте файла, я надеюсь, что все в порядке.)
Поскольку больше нет никакого IP-адреса для записи в строке выхода из системы, вероятно, лучше всего использовать не определять $out_pat
-- тот START OF PATTERNS
блок комментариев включает фразу Если выбранная вами запись также содержит $out_pat
, вы также должны раскомментировать эту переменную, что позволяет нам отслеживать пользователей, которые все еще подключены к серверу (напримерThunderbird кэширует открытые IMAP-соединения).
Я не тестировал это, но у меня хорошие предчувствия по этому поводу.