""" Modèles de données pour les adresses IP et leur historique Basé sur modele-donnees.md """ from sqlalchemy import Column, String, Boolean, DateTime, Integer, ForeignKey, Index, JSON from sqlalchemy.orm import relationship from datetime import datetime from backend.app.core.database import Base class IP(Base): """ Table principale des adresses IP Stocke les informations actuelles et les métadonnées de chaque IP """ __tablename__ = "ip" # Clé primaire ip = Column(String, primary_key=True, index=True) # Métadonnées name = Column(String, nullable=True) # Nom donné à l'IP known = Column(Boolean, default=False, index=True) # IP connue ou inconnue tracked = Column(Boolean, default=False, index=True) # IP suivie pour monitoring vm = Column(Boolean, default=False, index=True) # Machine virtuelle network_device = Column(Boolean, default=False, index=True) # Équipement réseau (switch, routeur, borne WiFi) hardware_bench = Column(Boolean, default=False, index=True) # Lien hardware bench disponible location = Column(String, nullable=True) # Localisation (ex: "Bureau", "Serveur") host = Column(String, nullable=True) # Type d'hôte (ex: "PC", "Imprimante") ip_parent = Column(String, nullable=True) # IP parent liée (relation logique) ip_enfant = Column(JSON, default=list) # Liste d'IPs enfants (JSON) # Timestamps first_seen = Column(DateTime, default=datetime.now) # Première détection last_seen = Column(DateTime, default=datetime.now, onupdate=datetime.now) # Dernière vue # État réseau last_status = Column(String, index=True) # "online", "offline", "unknown" # Informations réseau mac = Column(String, nullable=True) # Adresse MAC vendor = Column(String, nullable=True) # Fabricant (lookup MAC) hostname = Column(String, nullable=True) # Nom d'hôte réseau link = Column(String, nullable=True) # Lien personnalisé (URL) mac_changed = Column(Boolean, default=False) # MAC address différente de celle attendue icon_filename = Column(String, nullable=True) # Icône associée (fichier dans /data/icons) icon_url = Column(String, nullable=True) # Lien associé à l'icône # Ports ouverts (stocké en JSON) open_ports = Column(JSON, default=list) # Liste des ports ouverts # Synchronisation DHCP OPNsense dhcp_synced = Column(Boolean, default=False) # Réservation DHCP créée dans Kea # Relation avec l'historique history = relationship("IPHistory", back_populates="ip_ref", cascade="all, delete-orphan") def __repr__(self): return f"" class IPHistory(Base): """ Table d'historique des états d'IP Stocke l'évolution dans le temps (24h par défaut) """ __tablename__ = "ip_history" # Clé primaire auto-incrémentée id = Column(Integer, primary_key=True, autoincrement=True) # Foreign key vers la table IP ip = Column(String, ForeignKey("ip.ip", ondelete="CASCADE"), nullable=False, index=True) # Timestamp de l'enregistrement timestamp = Column(DateTime, default=datetime.now, index=True, nullable=False) # État à ce moment status = Column(String, nullable=False) # "online", "offline" # Ports ouverts à ce moment (JSON) open_ports = Column(JSON, default=list) # Relation inverse vers IP ip_ref = relationship("IP", back_populates="history") def __repr__(self): return f"" # Index recommandés (déjà définis dans les colonnes avec index=True) # Index supplémentaires si nécessaire Index('idx_ip_last_status', IP.last_status) Index('idx_ip_history_timestamp', IPHistory.timestamp) Index('idx_ip_history_ip', IPHistory.ip)