84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
"""
|
|
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
|
|
location = Column(String, nullable=True) # Localisation (ex: "Bureau", "Serveur")
|
|
host = Column(String, nullable=True) # Type d'hôte (ex: "PC", "Imprimante")
|
|
|
|
# Timestamps
|
|
first_seen = Column(DateTime, default=datetime.utcnow) # Première détection
|
|
last_seen = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 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)
|
|
|
|
# Ports ouverts (stocké en JSON)
|
|
open_ports = Column(JSON, default=list) # Liste des ports ouverts
|
|
|
|
# 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.utcnow, 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)
|