draft 1/2
This commit is contained in:
commit
64109bb35a
44
README.md
Normal file
44
README.md
Normal 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
66
main.py
Normal 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
16
tacacs_watcher.conf
Normal 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 = ".*"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user