Демон/фильтр мониторинга лог-файла с вызовом парных команд с ожиданием при успешном поиске 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|-]

Перезапись опций осуществляется в порядке следования, то есть при вызове `deannoing опции1 -c config опции2', в результате опции1 будут перезаписаны вначале из конфигурационного файла, а потом из опции2, но после подачи сигнала SIGHUP опции переустановятся уже только из конфигурационного файла и подключаемых конфигов в нем.

Пример конфигурационного файла:

Показать
# deannoing ftp from proftd.log:
# date time host pid srv (hostname[IP]): msg

# regex with annoing log messages
-0
-e ^([^ ]+ ){5}\([^[]+\[(([0-9]+\.){3}[0-9]+)\]\): USER .*: no such user
-e ^([^ ]+ ){5}\([^[]+\[(([0-9]+\.){3}[0-9]+)\]\): SECURITY VIOLATION: Root login attempted
-e ^([^ ]+ ){5}\([^[]+\[(([0-9]+\.){3}[0-9]+)\]\): client sent HTTP command
# IP from 6-th field as (hostname[IP]), -r not need
# -r 2
# block 2 hours
-s 2h
# use dot-IPv4 from subregex: (([0-9]+\.){3}[0-9]+)
-1 iptables -A INPUT -s \2 -j DROP
-2 iptables -D INPUT -s \2 -j DROP
# do not block a same IP if fast added to the log (the attack)
-d
# write to syslog commands with arguments
-o