""" Scheduler APScheduler pour les scans réseau périodiques """ from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger from datetime import datetime, timedelta from typing import Optional, Callable import asyncio class ScanScheduler: """Gestionnaire de tâches planifiées pour les scans""" def __init__(self): """Initialise le scheduler""" self.scheduler = AsyncIOScheduler() self.is_running = False def start(self): """Démarre le scheduler""" if not self.is_running: self.scheduler.start() self.is_running = True print(f"[{datetime.now()}] Scheduler démarré") def stop(self): """Arrête le scheduler""" if self.is_running: self.scheduler.shutdown() self.is_running = False print(f"[{datetime.now()}] Scheduler arrêté") def add_ping_scan_job(self, scan_function: Callable, interval_seconds: int = 60): """ Ajoute une tâche de scan ping périodique Args: scan_function: Fonction async à exécuter interval_seconds: Intervalle en secondes """ self.scheduler.add_job( scan_function, trigger=IntervalTrigger(seconds=interval_seconds), id='ping_scan', name='Scan Ping périodique', replace_existing=True ) print(f"Tâche ping_scan configurée: toutes les {interval_seconds}s") def add_port_scan_job(self, scan_function: Callable, interval_seconds: int = 300): """ Ajoute une tâche de scan de ports périodique Args: scan_function: Fonction async à exécuter interval_seconds: Intervalle en secondes """ self.scheduler.add_job( scan_function, trigger=IntervalTrigger(seconds=interval_seconds), id='port_scan', name='Scan ports périodique', replace_existing=True ) print(f"Tâche port_scan configurée: toutes les {interval_seconds}s") def add_cleanup_job(self, cleanup_function: Callable, interval_hours: int = 1): """ Ajoute une tâche de nettoyage de l'historique Args: cleanup_function: Fonction async de nettoyage interval_hours: Intervalle en heures """ self.scheduler.add_job( cleanup_function, trigger=IntervalTrigger(hours=interval_hours), id='history_cleanup', name='Nettoyage historique', replace_existing=True ) print(f"Tâche cleanup configurée: toutes les {interval_hours}h") def remove_job(self, job_id: str): """ Supprime une tâche planifiée Args: job_id: ID de la tâche """ try: self.scheduler.remove_job(job_id) print(f"Tâche {job_id} supprimée") except Exception as e: print(f"Erreur suppression tâche {job_id}: {e}") def get_jobs(self): """Retourne la liste des tâches planifiées""" return self.scheduler.get_jobs() # Instance globale du scheduler scan_scheduler = ScanScheduler()