Демон/фильтр мониторинга лог-файла с вызовом парных команд с ожиданием
при успешном поиске regex-выражений
Автор: Владимир Олейник <dzo@simtreas.ru> (C) 2022
Исходный текст
демона/фильтра. Конечно, подобных программ в сети в достаточном количестве,
но мне либо не хватало их функциональности (в данном демоне 21 ключ),
либо они были написаны на интерпретируемых языках с солидной утилизацией
ресурсов и с сомнительным способом мониторинга входного файла. Данный демон
использует современный способ наблюдения за изменениями входного файла
путем использования механизма inotify.
Программа предназначена для выполнения действий, например
блокировки IP-адресов, согласно поступающим в исходный лог-файл строк,
параллельным ожиданием и выполнением второй команды через указанное время.
Опции позволяют сформировать команды с подстановкой информации из входного
файла, в том числе с получением dot-IP из символьного имени, игнорировать
дубликаты команд, мониторить ротацию входного файла и вести удобный лог
работы.
Можно также использовать в режиме фильтра, работающего
как расширенный grep с выводом нужных полей/подвыражений в нужной
последовательности, добавления к ним строк и, если необходимо, подавления
дубликатов. Режим фильтра изначально добавлен в программу в качестве
отладчика демона перед запуском его в промышленную эксплуатацию.
Вызов:
в режиме демона:
deannoing [-0] [-e regex...] [-r rs# [-4]] [-d|D] [-u user] \
[-1 cmd1...] [-s st[s|m|h]] [-2 cmd2...] [-w|W] \
[-o|O [-C[sf]]] [-l log] [-P[pid]] [-t ta] [-c cfg] \
[-n lines#] -i input_file
или в режиме фильтра:
deannoing -F[IR] [-0] [-e regex...] [-r rs# [-4]] [-d|D] [-u user] \
[-1 show1...] [-s st[s|m|h]] [-2 show2...] [-b] \
[-o|O [-C[sf]]] [-l log] [-t ta] [-c cfg] \
[-n lines#] [-i input_file|-]
-1 cmd1 \1\ \2
если в полученном слове/подвыражении есть имя хоста, то это имя можно
перевести в dot-IP до подстановки в команду, вызвав с ключом
-r номер. Ключ -4 делает выбор только IPv4 адресов;
если указан ключ -o, то в syslog/stderr/log-файл согласно ключу
-l log будет внесен полученный результат декодирования опции ключа
-1 act1. Ключ -O отменяет ключи -o и -С;
в режиме демона происходит вызов сформированной команды. В режиме фильтра
-F выводится полученный результат декодирования опции ключа
-1 show1 в stdout;
в режиме фильтра ключ -b включает буферизацию вывода по строкам,
что позволяет делать запись в выходной файл или pipe по мере
поступления новых строк без буферизации по блокам. В режиме демона ключ
игнорируется;
параллельно считыванию остальных строк входного файла, запускается
ожидание -s sleep_time[s|m|h], по умолчанию 1 час, если не указан
ключ -F и INT_MAX, при указании ключа -F. Суффикс
по умолчанию 's' — в секундах. Если не указан ключ
-2 act2, то время ожидания имеет смысл при указании ключа -d;
по окончанию ожидания, производятся действия для ключа -2
аналогично указанным действиям для ключа -1. Формат ключа -2
идентичен формату ключа -1. Пустая опция выключает ранее заданный
ключ. Указание с опцией хотя бы -1 act1 либо -2 act2
обязательно;
если задан ключ -d, то за время -s sleep_time идентичные
входные строки будут проигнорированы. Если заданы опции у обоих ключей
-1 act1 и -2 act2, то сравниваются дубликаты с результатом
декодирования ключа -2 act2, но дубликаты -1 act1 также
не выполняются (не выводятся для -F). Отчет времени подавления
дубликатов по каждой строке возобновляется сначала от времени получения
этой строки на sleep_time. Ключ -D отменяет ранее заданный ключ
-d;
если не задан ключ -w, то команды выполняются асинхронно, если
время выполнения их значительно, особенно если сравнимо со
-s sleep_time, то результат выполнения команд может быть странным
в виду наложения времени выполняющихся программ друг на друга. Ключ
-w включает ожидание завершения запущенной команды перед
продолжением дальнейшей работы. В режиме фильтра ключ игнорируется. Ключ
-W отменяет ранее заданный ключ -w;
ключ -u user устанавливает euid и uid перед запуском команд
на значение согласно указанной численной опции или у указанного пользователя.
Для режима фильтра открытие входного файла и лог-файла происходит с правами
от указанного пользователя;
если программа выполняется в режиме демона, после всех начальных проверок
и перехода в фоновый режим сообщения об ошибках и, при вызове с ключом
-o предварительно сами команды, будут записываться
в syslog. Первая строка сообщений об ошибках, которые генерируют
в stderr команды -1 cmd1 и -2 cmd2
также будет перенаправлена в syslog, максимальная длина строки 80 символов,
остальные строки будут потеряны. В асинхронном режиме для этого создастся
дополнительный процесс асинхронного считывания stderr.
В режиме фильтра при вызове с ключом -o декодированные сообщения
от ключей -1 "show1 ..." и -2 "show2 ..." будут
также сдублированы в stderr.
При указании непустой опции ключа -l errlog.txt будет производиться
запись в указанный файл errlog.txt в обоих режимах — демона и
фильтра. При записи лога в файл все сообщения об ошибках
при выполнении демоном команд -1 cmd1 и -2 cmd2
будут помещены в лог-файл. Для помещения даты запуска в лог-файле используйте
комбинацию опций -o и -C.
Имя log-файла крайне желательно в конфигурационном файле указывать в
абсолютной форме для возможности дальнейшей работы после получения сигнала
SIGHUP, так как после перехода в режим демона рабочий каталог меняется на
корень /;
при переходе в фоновый режим можно явно указать имя файла для записи
номера процесса -P pidfile, по умолчанию этот путь
/var/run/имя_программы.pid Вызов с пустым путем к pid-файлу
-P отключает запись pid-файла. Ключ срабатывает один раз после
перехода в режим демона, в дальнейшем изменения имени pid-файла
при перечитывании конфигурационного файла по SIGHUP —
игнорируются. Опция желательна при запуске нескольких данных демонов
в системе. В режиме фильтра опция игнорируется;
ключ -C или -Csf совмесно с ключом -o добавляет
первое слово, обычно это дата и время вывода, в stderr/log-файл. Формат опции
определяется согласно описанию man strftime(3). По умолчанию,
если опциональный аргумент у ключа пуст или отсутствует, то это означает
формат "%F %T %z", то есть "YYYY-MM-DD hh:mm:ss +hhmm".
Необязательная опция должна быть склеена с ключом -C в командной
строке, в конфигурационном файле допускается указать через пробел. Ключ
не оказывает никакого влияния на формат вывода в syslog и в таком случае
игнорируется. Для выключения используйте ключ -O;
при получении сигнала TERM, программа выполняет действие в зависимости
от типа, указанного опцией -t term_action. По умолчанию опция имеет
значение -t exec2 при заданном ключе -2 и его опции или
-t quit, если ключ -2 или его опция не задана:
- -t exec2 программа осуществляет немедленное выполнение действий
ключа -2 act2 для всех ожидающих вызова act2 перед своим завершением;
- -t ignore выключит какое-либо реагирование на сигнал TERM;
- -t quit — означает немедленно завершиться.
все ключи могут быть указаны в конфигурационном файле -c config
по одной строке на ключ без кавычек, пустые строки или со знаком # считаются
как комментарии. Ключи -c cfg в самих конфигурационных файлах
подключают содержание этих файлов. Необязательные опции ключей
в конфигурационных файлах можно указывать через пробел. При работе в режиме
демона опции с путями файлов, то есть и подключаемые -c cfg
в конфигурационных файлах для возможности перечитывания по сигналу SIGHUP
необходимо указывать в абсолютной форме, пути в опциях до перечитывания
конфигурационного файла по сигналу SIGHUP будут преобразованы в абсолютную
форму самой программой;
если конфигурационный файл не задан и не задан ключ -F и если
не заданы опции ключей -1 cmd1 и -2 cmd2 и/или
-i file, то программа попытается прочитать конфигурационный файл
по умолчанию DEFAULT_CFG_DIR/имя_программы.cfg, так что сделав линки
с разными именами исполняемого файла, можно запускать разные демоны без
аргументов, они будут брать свои конфигурационные файлы по умолчанию;
если задан конфигурационный файл, то при получении сигнала SIGHUP
осуществляется его перечитывание. Если конфигурационный файл не задан, то
реакция устанавливается в игнорирование SIGHUP только если программа
перейдет в режим демона. В режиме фильтра -F и задании
конфигурационного файла, если не установлены режимы проверки ротации
и наблюдения и после детектирования конца входного файла реакция на SIGHUP
будет сброшена на реакцию по умолчанию для возможности завершения программы
при длительном ожидании завершения команд из -2 show2. Ключ
-F в конфигурационном файле после получения сигнала SIGHUP будет
проигнорирован.
Перезапись опций осуществляется в порядке следования, то есть при вызове
`deannoing опции1 -c config опции2',
в результате опции1 будут перезаписаны вначале из конфигурационного
файла, а потом из опции2, но после подачи сигнала SIGHUP опции
переустановятся уже только из конфигурационного файла и подключаемых
конфигов в нем.
Пример конфигурационного файла: