commit 64109bb35a047122bb2618d31d3fa79cfc31de38 Author: erjemin Date: Fri Dec 15 15:58:31 2023 +0300 draft 1/2 diff --git a/README.md b/README.md new file mode 100644 index 0000000..3a2abc4 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# Python-скрипт для наблюдения и разбора как служба Linux + + +Чтобы превратить Python-скрипт в службу Linux, вы можете использовать systemd, систему инициализации, используемую в большинстве дистрибутивов Linux. Вам потребуется создать файл службы systemd, который будет запускать ваш Python-скрипт. + +Вот шаги, которые вам нужно выполнить: + +1. Создайте файл службы systemd. Этот файл обычно находится в каталоге `/etc/systemd/system/`. Назовите его, например, `my_python_service.service`. + +2. В этом файле укажите следующее: + +```ini +[Unit] +Description=My Python Service +After=network.target + +[Service] +ExecStart=/usr/bin/python3 /path/to/your/python/script.py +Restart=always +User=username +Group=groupname +Environment=NAME=value + +[Install] +WantedBy=multi-user.target +``` + +В этом файле: + +- `Description` - это описание вашей службы. +- `After` - это указание systemd запускать вашу службу после того, как сеть будет доступна. +- `ExecStart` - это команда, которую systemd выполнит для запуска вашей службы. Укажите здесь путь к вашему Python-скрипту. +- `Restart` - это указание systemd перезапустить вашу службу, если она упадет. +- `User` и `Group` - это имя пользователя и группы, от имени которых будет запущена ваша служба. +- `Environment` - это переменные окружения, которые будут установлены при запуске вашей службы. +- `WantedBy` - это указание systemd, когда должна быть запущена ваша служба. + +3. После создания файла службы systemd, вы должны обновить systemd, чтобы он знал о вашей новой службе. Вы можете сделать это с помощью команды `systemctl daemon-reload`. + +4. Теперь вы можете запустить вашу службу с помощью команды `systemctl start my_python_service`. + +5. Если вы хотите, чтобы ваша служба автоматически запускалась при загрузке системы, вы можете включить ее с помощью команды `systemctl enable my_python_service`. + +Пожалуйста, замените `/path/to/your/python/script.py`, `username`, `groupname` и `NAME=value` на соответствующие значения для вашего скрипта и системы. \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..81525c8 --- /dev/null +++ b/main.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +import time +import sys +import signal +import toml +from watchdog.observers import Observer +from watchdog.events import FileSystemEventHandler +from pathlib import Path + + +def print_hi(name): + # Use a breakpoint in the code line below to debug your script. + print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.\ + + +# Обработчик сигнала SIGTERM (сигнал остановки от systemd) +def handler_stop(signum, frame) -> None: + print(f'Terminate by signal: {signum}') + sys.exit(0) + + +# Чтение файла конфигурации +def read_toml(file_path): + try: + with open(file_path, 'r', encoding='utf-8') as file: + data = toml.load(file) + return data + except FileNotFoundError: + print(f"Config `{file_path}` not found.") + sys.exit(1) + except toml.decoder.TomlDecodeError as e: + print(f"Error decoding config-file from `{file_path}`: {e}.") + sys.exit(1) + + +# Press the green button in the gutter to run the script. +if __name__ == '__main__': + # Установка обработчика сигнала + signal.signal(signal.SIGTERM, handler_stop) + # Считывание имени config-файла их аргументов командной строки + try: + config_file = sys.argv[1] # первый аргумент после имени скрипта + except IndexError: + config_file = "tacacs_watcher.conf" + # Чтение файла конфигурации, приветствие и выставление интервала + config = read_toml(config_file) + if 'hello' in config: + print(config['hello']) + interval = config['interval'] if 'interval' in config else 1 + # получаем все группы в конфиге + group_keys = [key for key, value in config.items() if isinstance(value, dict)] + for group in group_keys: + print(group) + + # все обработчики в этом цикле + try: + while True: + # вечный цикл, чтобы программа не завершилась никогда (только принудительно или через SIGTERM) + print_hi('PyCharm') + time.sleep(interval) + except KeyboardInterrupt: + print('Terminate by `KeyboardInterrupt`.') + sys.exit(0) + except ValueError: + print('Error value in config-file.') + diff --git a/tacacs_watcher.conf b/tacacs_watcher.conf new file mode 100644 index 0000000..33f6800 --- /dev/null +++ b/tacacs_watcher.conf @@ -0,0 +1,16 @@ +# Это сообщение будет напечатано в консоль при старте +hello = "Start watcher log-файлов TACACS+" +# Количество секунд между проверками log-файлов (если не указано = 1) +interval = 15 + + +# Группа настроек (каждая группа для одного входящего лога). +# Хотя бы одна группа (например [default]) должна быть обязательно +[default] +# Log-файл, который будет мониториться +log_in = "M:\\PRJ\\2023_tacacs_watcher\\in\\tac_1.acc" +# Каталог, в который будут разложены log-срезы (каталог должен существовать) +outdir = "M:\\PRJ\\2023_tacacs_watcher\\out" +# Регулярное выражение для поиска в log-файле +regexp = ".*" +