draft 1/2

This commit is contained in:
Sergei Erjemin 2023-12-15 15:58:31 +03:00
commit 64109bb35a
3 changed files with 126 additions and 0 deletions

44
README.md Normal file
View File

@ -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` на соответствующие значения для вашего скрипта и системы.

66
main.py Normal file
View File

@ -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.')

16
tacacs_watcher.conf Normal file
View File

@ -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 = ".*"