ipwatch
This commit is contained in:
95
backend/app/models/ip.py
Executable file
95
backend/app/models/ip.py
Executable file
@@ -0,0 +1,95 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user