/
Befun
/
FamalyControlle
Обзор
Документация
Войти
/
Befun
/
FamalyControlle
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
141 строка
5 KB
BeFun
Init project
07 май 2026, 10:43
07 май 2026, 10:43
7e96900
Код
Авторство
О чём код?
""" Family PC Control — точка входа. Запускает сервер, агента и/или бота раздельно или вместе. Использование: python main.py # Всё (сервер + агент + бот) python main.py --server # Только API-сервер python main.py --agent # Только десктоп-агент python main.py --bot # Только бот Макс python main.py --debug # С отладочным логом """ import argparse import logging import multiprocessing import sys from pathlib import Path # Гарантируем, что корень проекта в sys.path PROJECT_ROOT = Path(__file__).resolve().parent if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) from core.config import Config logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(name)s] %(levelname)s: %(message)s", ) logger = logging.getLogger("main") def start_server(): """Запуск API-сервера в текущем процессе.""" from server.app import run_server run_server() def start_agent(): """Запуск десктоп-агента в текущем процессе.""" from agent.monitor import run_agent run_agent() def start_bot(): """Запуск бота Макс в текущем процессе.""" from bot.max_bot import run_bot run_bot() def main(): parser = argparse.ArgumentParser( description="Family PC Control — система семейного контроля ПК", ) parser.add_argument( "--server", action="store_true", help="Запустить только API-сервер (FastAPI + SQLite)", ) parser.add_argument( "--agent", action="store_true", help="Запустить только десктоп-агент (мониторинг процессов)", ) parser.add_argument( "--bot", action="store_true", help="Запустить только бота мессенджера Макс", ) parser.add_argument( "--debug", action="store_true", help="Включить отладочный лог (DEBUG-уровень)", ) args = parser.parse_args() # Настройка уровня логирования if args.debug: logging.getLogger().setLevel(logging.DEBUG) logger.debug("Отладочный режим включён") # Загрузка конфигурации Config.load() logger.info("Конфигурация загружена") logger.info("Сервер: %s:%d", Config.server_host, Config.server_port) # Определяем, какие компоненты запускать run_server_flag = args.server or not (args.agent or args.bot) run_agent_flag = args.agent or not (args.server or args.bot) run_bot_flag = args.bot or not (args.server or args.agent) # Если не указан ни один флаг — запускаем всё if not args.server and not args.agent and not args.bot: run_server_flag = True run_agent_flag = True run_bot_flag = True processes: list[multiprocessing.Process] = [] try: # Запускаем сервер первым (агент и бот зависят от него) if run_server_flag: logger.info("Запуск API-сервера...") p = multiprocessing.Process(target=start_server, name="server", daemon=True) p.start() processes.append(p) import time time.sleep(2) # Даём серверу время на старт if run_agent_flag: logger.info("Запуск десктоп-агента...") p = multiprocessing.Process(target=start_agent, name="agent", daemon=True) p.start() processes.append(p) if run_bot_flag: logger.info("Запуск бота Макс...") p = multiprocessing.Process(target=start_bot, name="bot", daemon=True) p.start() processes.append(p) # Ожидаем завершения if processes: logger.info( "Компоненты запущены: %s. Нажмите Ctrl+C для остановки.", ", ".join(p.name for p in processes), ) # Блокируем основной поток for p in processes: p.join() else: parser.print_help() except KeyboardInterrupt: logger.info("Остановка по запросу пользователя...") for p in processes: p.terminate() for p in processes: p.join(timeout=5) logger.info("Все компоненты остановлены.") if __name__ == "__main__": main()