Что делают эти строки синтаксического анализа журнала Perl и как я могу придумать что-то, что могло бы сработать?

StackOverflow https://stackoverflow.com//questions/9660941

  •  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-соединения).

Я не тестировал это, но у меня хорошие предчувствия по этому поводу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top