/
runemal
/
Restricted_Statistical_Reporting_Multyagent
Обзор
Документация
Войти
/
runemal
/
Restricted_Statistical_Reporting_Multyagent
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/interactive_bot.sh
198 строк
5 KB
Dmitry V. Dunaev
init
22 июл 2026, 19:22
22 июл 2026, 19:22
64a7262
Код
Авторство
О чём код?
#!/usr/bin/env bash set -Eeuo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" SCRIPT_PATH="${SCRIPT_DIR}/interactive_bot.sh" ENV_FILE="${ENV_FILE:-${PROJECT_DIR}/.env}" CONFIG_PATH="${CONFIG_PATH:-${PROJECT_DIR}/configs/interactive_bot.yaml}" QUERIES_PATH="${QUERIES_PATH:-${PROJECT_DIR}/queries/report.sql}" PYTHON_BIN="${PYTHON_BIN:-${PROJECT_DIR}/.venv/bin/python}" LOG_PATH="${LOG_PATH:-${PROJECT_DIR}/out/logs/interactive_bot.log}" PID_FILE="${PID_FILE:-${PROJECT_DIR}/out/run/interactive_bot.pid}" usage() { cat <<'TEXT' Usage: scripts/interactive_bot.sh <command> Commands: check Validate local config and credentials. start Start the bot in background. stop Stop the background bot. restart Restart the background bot. status Show bot status. foreground Run the bot in foreground. logs Follow the bot log. Defaults: credentials ./.env config ./configs/interactive_bot.yaml queries ./queries/report.sql To use an external credentials file explicitly: ENV_FILE=/secure/path/bot.env scripts/interactive_bot.sh start TEXT } require_file() { local path="$1" local description="$2" if [[ ! -f "${path}" ]]; then echo "${description} not found: ${path}" >&2 exit 1 fi } load_credentials() { require_file "${ENV_FILE}" "Credentials file" set -a # shellcheck source=/dev/null source "${ENV_FILE}" set +a if [[ -z "${TELEGRAM_ALLOWED_USER_IDS:-}" && -z "${TELEGRAM_ALLOWED_CHAT_IDS:-}" ]]; then if [[ -z "${TELEGRAM_CHAT_ID:-}" ]]; then echo "Set TELEGRAM_ALLOWED_USER_IDS, TELEGRAM_ALLOWED_CHAT_IDS, or TELEGRAM_CHAT_ID." >&2 exit 1 fi export TELEGRAM_ALLOWED_CHAT_IDS="${TELEGRAM_CHAT_ID}" fi export TELEGRAM_BOT_ENABLED=true export INTERACTIVE_CUSTOM_SQL_ENABLED="${INTERACTIVE_CUSTOM_SQL_ENABLED:-false}" export PYTHONPATH="${PROJECT_DIR}/src:${PYTHONPATH:-}" export CREWAI_TRACING_ENABLED=false export CREWAI_DISABLE_TELEMETRY=true export CREWAI_DISABLE_TRACKING=true export OTEL_SDK_DISABLED=true } check() { require_file "${CONFIG_PATH}" "Bot config" require_file "${QUERIES_PATH}" "Queries file" if [[ ! -x "${PYTHON_BIN}" ]]; then echo "Python executable not found: ${PYTHON_BIN}" >&2 exit 1 fi load_credentials if [[ -z "${TELEGRAM_BOT_TOKEN:-}" ]]; then echo "TELEGRAM_BOT_TOKEN is not set in ${ENV_FILE}." >&2 exit 1 fi echo "Bot configuration is valid." echo "Credentials: ${ENV_FILE}" echo "Config: ${CONFIG_PATH}" echo "Queries: ${QUERIES_PATH}" echo "Allowed users set: $([[ -n "${TELEGRAM_ALLOWED_USER_IDS:-}" ]] && echo yes || echo no)" echo "Allowed chats set: $([[ -n "${TELEGRAM_ALLOWED_CHAT_IDS:-}" ]] && echo yes || echo no)" echo "Custom SQL enabled: ${INTERACTIVE_CUSTOM_SQL_ENABLED}" } is_running() { [[ -f "${PID_FILE}" ]] || return 1 local pid pid="$(<"${PID_FILE}")" [[ -n "${pid}" ]] && kill -0 "${pid}" 2>/dev/null } start() { check if is_running; then echo "Interactive bot is already running with PID $(<"${PID_FILE}")." return 0 fi mkdir -p "$(dirname "${LOG_PATH}")" "$(dirname "${PID_FILE}")" echo "Starting interactive bot in background..." nohup "${SCRIPT_PATH}" foreground >> "${LOG_PATH}" 2>&1 & echo "$!" > "${PID_FILE}" sleep 1 if is_running; then echo "Interactive bot started with PID $(<"${PID_FILE}")." echo "Log: ${LOG_PATH}" else echo "Interactive bot failed to start. Last log lines:" >&2 tail -n 80 "${LOG_PATH}" >&2 || true rm -f "${PID_FILE}" exit 1 fi } stop() { if [[ ! -f "${PID_FILE}" ]]; then echo "Interactive bot is not running." return 0 fi local pid pid="$(<"${PID_FILE}")" if [[ -z "${pid}" ]] || ! kill -0 "${pid}" 2>/dev/null; then echo "Interactive bot is not running; removing stale PID file." rm -f "${PID_FILE}" return 0 fi echo "Stopping interactive bot PID ${pid}..." kill "${pid}" for _ in {1..20}; do if ! kill -0 "${pid}" 2>/dev/null; then rm -f "${PID_FILE}" echo "Interactive bot stopped." return 0 fi sleep 1 done echo "Process did not stop gracefully; sending SIGKILL." >&2 kill -9 "${pid}" 2>/dev/null || true rm -f "${PID_FILE}" } status() { if is_running; then echo "Interactive bot is running with PID $(<"${PID_FILE}")." echo "Log: ${LOG_PATH}" else echo "Interactive bot is not running." [[ -f "${PID_FILE}" ]] && echo "Stale PID file: ${PID_FILE}" return 1 fi } foreground() { check mkdir -p "$(dirname "${LOG_PATH}")" cd "${PROJECT_DIR}" exec env PYTHONUNBUFFERED=1 "${PYTHON_BIN}" \ -m multyagent_etl.bot_cli \ --config "${CONFIG_PATH}" \ --queries "${QUERIES_PATH}" } logs() { mkdir -p "$(dirname "${LOG_PATH}")" touch "${LOG_PATH}" tail -n 120 -f "${LOG_PATH}" } main() { local command="${1:-}" case "${command}" in check) check ;; start) start ;; stop) stop ;; restart) stop; start ;; status) status ;; foreground) foreground ;; logs) logs ;; -h|--help|help|"") usage ;; *) echo "Unknown command: ${command}" >&2; usage >&2; exit 2 ;; esac } main "$@"