96 lines
3.8 KiB
Python
Executable File
96 lines
3.8 KiB
Python
Executable File
"""
|
|
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"<IP {self.ip} - {self.last_status} - {self.name or 'unnamed'}>"
|
|
|
|
|
|
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"<IPHistory {self.ip} - {self.timestamp} - {self.status}>"
|
|
|
|
|
|
# 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)
|