Задача 8: классификация и обработчики — живой прогон, cron, archive change
This commit is contained in:
@@ -45,10 +45,43 @@ try:
|
||||
except ImportError:
|
||||
load_dotenv = None
|
||||
|
||||
# Каталог скрипта → .env рядом с проектом
|
||||
|
||||
def _load_env_file(path):
|
||||
"""Загрузить KEY=VALUE из .env-файла, не перезаписывая уже заданные env.
|
||||
|
||||
stdlib-фолбэк python-dotenv (в проекте нет сторонних зависимостей).
|
||||
"""
|
||||
p = Path(path)
|
||||
if not p.exists():
|
||||
return
|
||||
try:
|
||||
lines = p.read_text(encoding="utf-8").splitlines()
|
||||
except OSError:
|
||||
return
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if not line or line.startswith("#") or "=" not in line:
|
||||
continue
|
||||
key, _, val = line.partition("=")
|
||||
key = key.strip()
|
||||
val = val.strip().strip('"').strip("'")
|
||||
if key and key not in os.environ:
|
||||
os.environ[key] = val
|
||||
|
||||
# Каталог скрипта → .env рядом с проектом (+ radicale/.env для RADICALE_PASS)
|
||||
BASE_DIR = Path(__file__).resolve().parents[1]
|
||||
if load_dotenv:
|
||||
load_dotenv(BASE_DIR / ".env", override=False)
|
||||
# radicale/.env — фактический источник RADICALE_PASS (проектного .env нет)
|
||||
load_dotenv(BASE_DIR / "radicale" / ".env", override=False)
|
||||
else:
|
||||
_load_env_file(BASE_DIR / ".env")
|
||||
_load_env_file(BASE_DIR / "radicale" / ".env")
|
||||
# Токен Telegram живёт в /opt/vesti/.env (проект-источник бота @dedinit_vesti);
|
||||
# опционально: если файл есть, берём VESTI_BOT_TOKEN/TELEGRAM_CHAT_ID оттуда.
|
||||
vesti_env = Path("/opt/vesti/.env")
|
||||
if vesti_env.exists():
|
||||
_load_env_file(vesti_env)
|
||||
|
||||
EMAIL_ROOT = Path(os.getenv("EMAIL_ROOT", "/opt/hermes/email"))
|
||||
|
||||
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
# Классификация новых писем + обработчики — запускается после mail-archive.
|
||||
# Цепочка: mail-archive (5 min) → classifier (лимит, дозированно) → handlers.
|
||||
set -euo pipefail
|
||||
|
||||
cd /opt/hermes/email-assistant
|
||||
|
||||
# Классификатор: до 10 новых писем за запуск (Qwen ~10-20с/письмо = ~3 мин)
|
||||
python3 scripts/email_classifier.py --limit 10 || echo "[classifier] ошибка (продолжаем)" >&2
|
||||
|
||||
# Обработчики: все письма с тегами, без handled_* (идемпотентно)
|
||||
python3 scripts/email_handlers.py || echo "[handlers] ошибка" >&2
|
||||
Reference in New Issue
Block a user