Syslog на Python для Windows ★
Искал простенький Syslog-сервер под Windows и как оказалось их очень мало. Точнее то, что необходимо было мне вообще нет. Мои основные требования к Syslog-серверу заключались в том, что он должен писать в текстовый файл данные приходящие по Syslog и складировать их в файл с именем того дня когда произошло событие. Большинство имеющихся серверов пишут в один файл. Для меня это крайне не удобно, так как бывает необходимо быстро переслать логи по почте и потом анализировать их. Так же это упрощает архивацию логов, можно сделать простейший командный файл который будет кидать старые файлы в архив. Отчасти нужный функционал есть у VisualSyslog. Но он присваивает дату файлу не в момент записи, а в момент переименования общего syslog.log файла. По этому надо помнить, что за вчерашнее число данные хранятся в файле с сегодняшним числом. Так же в эти файлы попадают данные за соседние даты, если велась активная запись в момент переименования.
Есть ещё несколько разных серверов, но одни ведут бинарный файл который необходимо в дальнейшем обрабатывать, а другие непрерывный текстовый, что мне совсем не нравится.
Вродебы у меня мизерные потребности, но их нельзя решить каким-нибудь простым методом. И возникла глупая мысль, что если написать скрипт на Python, который будет просто хватать пакеты Syslog-протокола на нужном порту и складировать эти данные так как я того хочу. Потеря на неоптимизированность скриптового языка по сравнению с компилируемым тут будет не значительна. Точнее нагрузка будет незаметна серверному оборудованию на котором она будет запущена. Задача оказалась крайне простой. В интернете есть уже готовое решение, но мне пришлось его поправить под свои нужды. Первую часть результата я приведу прямо в этой статье.
import datetime import os import sys import socketserver HOST, PORT = "0.0.0.0", 514 class SyslogUDPHandler(socketserver.BaseRequestHandler): def handle(self): data = bytes.decode(self.request[0].strip()) socket = self.request[1] today = datetime.datetime.today() syslog_file = today.strftime("%Y-%m-%d") + ".log" syslog_log = open(syslog_file, 'a') syslog_log.write(self.client_address[0] + " " + today.strftime("%Y-%m-%d %H:%M:%S") + " " + str(data) + " ") syslog_log.close() if __name__ == "__main__": try: server = socketserver.UDPServer((HOST,PORT), SyslogUDPHandler) server.serve_forever(poll_interval=0.5) except (IOError, SystemExit): raise except KeyboardInterrupt: print ("Crtl+C Pressed. Shutting down.")
Да, здесь видно, что я «неправильно» работаю со строками, но данная работа нисколько не противоречит лексике языка и не приводит к каким-либо проблемам. Каждый в праве переделать под себя.
Опубликованный тут скрипт не является моим окончательным вариантом. Он дает костяк для экспериментов и творчества. Вы можете его оптимизировать под свои нужды. Например, перехватывать определённые события и реагировать на них тем или иным способом. Мне нет необходимости разбирать события онлайн. Всё, что надо, реализовано на коммутаторах и роутерах, Syslog необходим лишь как единое место для хранения логов.
На текущий момент скрипт уже умеет извлекать из PRI заголовки Facility и Severity, хотя я действительно не вижу в этом смысла, так как нужное мне оборудование Cisco формирует человекочитаемые логи и я в них легко ориентируюсь. Но ради интереса в моём скрипте сия функциональность реализована.
В дальнейшем планируется написать парсер который будет разгребать логи и анализировать качество подключения к провайдерским каналам, отключение коммутаторов и переключение портов UP/DOWN. Ещё хочу собрать IP-адреса компьютеров которые планомерно подбирают пароль к моему оборудованию. Некоторые считают, что с моей стороны стоит Raspberry Pi с паролем по умолчанию, там вообще каша полная.
Если у вас не установлена библиотека socketserver, то установите Werkzeug. Без него у вас этот скрипт не заработает.
pip3 install Werkzeug
Да, у меня на серверном оборудовании стоит Python, даже на Windows. Если вы не можете найти нужных вам инструментов делайте их сами!
Тэги: ИТ, программирование, Питон
Отредактировано:2020-11-12 05:55:31
а WireShark?