Files
can_sniffer/can_sniffer/src/main.py

83 lines
2.8 KiB
Python

"""
Главный модуль CAN Sniffer приложения.
Только код запуска приложения. Вся логика обработки сообщений
автоматически применяется в модуле socket_can.
"""
import signal
import sys
import time
from config import config
from logger import get_logger
from socket_can import CANSniffer
# Инициализация логгера
logger = get_logger(__name__)
# Глобальная переменная для graceful shutdown
sniffer: CANSniffer = None
def signal_handler(sig, frame):
"""Обработчик сигналов для graceful shutdown."""
logger.info("Received shutdown signal, stopping gracefully...")
if sniffer:
try:
sniffer.stop()
except Exception as e:
logger.error(f"Error during shutdown: {e}", exc_info=True)
# Даем время на завершение потоков перед выходом
import time
time.sleep(0.5)
sys.exit(0)
def main():
"""Главная функция приложения - только запуск."""
global sniffer
# Регистрируем обработчики сигналов для graceful shutdown
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
logger.info("CAN Sniffer application starting", extra={
"interfaces": config.can.interfaces,
"bitrate": config.can.bitrate,
"listen_only": config.can.listen_only
})
logger.info("Configuration loaded", extra={
"postgresql_enabled": config.postgresql.enabled,
"postgresql_host": config.postgresql.host if config.postgresql.enabled else None,
"storage_path": config.storage.database_path
})
try:
# Создаем и запускаем CAN Sniffer
# MessageProcessor автоматически инициализируется и используется внутри CANSniffer
sniffer = CANSniffer()
sniffer.start()
logger.info("Application initialized successfully. Reading CAN messages...")
logger.info("Press Ctrl+C to stop")
# Основной цикл - периодически выводим статистику
while True:
time.sleep(10) # Выводим статистику каждые 10 секунд
stats = sniffer.get_stats()
logger.info("Statistics", extra=stats)
except KeyboardInterrupt:
logger.info("Keyboard interrupt received")
except Exception as e:
logger.error(f"Unexpected error: {e}", exc_info=True)
finally:
if sniffer:
sniffer.stop()
logger.info("Application stopped")
if __name__ == '__main__':
main()