from app.core.extensions import db import json from datetime import datetime import ipaddress from werkzeug.security import generate_password_hash, check_password_hash from flask_login import UserMixin # User model has been moved to app.core.auth # Import it from there instead if needed: from app.core.auth import User class Port(db.Model): __tablename__ = "ports" id = db.Column(db.Integer, primary_key=True) app_id = db.Column( db.Integer, db.ForeignKey("apps.id", ondelete="CASCADE"), nullable=False ) port_number = db.Column(db.Integer, nullable=False) protocol = db.Column(db.String(10), default="TCP") # TCP, UDP, etc. description = db.Column(db.String(200)) # Relationship app = db.relationship("App", back_populates="ports") def __repr__(self): return f"" class Server(db.Model): __tablename__ = "servers" id = db.Column(db.Integer, primary_key=True) hostname = db.Column(db.String(64), nullable=False) ip_address = db.Column(db.String(39), nullable=False) # IPv4 or IPv6 subnet_id = db.Column(db.Integer, db.ForeignKey("subnets.id"), nullable=False) documentation = db.Column(db.Text) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column( db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow ) # Relationships subnet = db.relationship("Subnet", back_populates="servers") apps = db.relationship("App", back_populates="server", cascade="all, delete-orphan") def __repr__(self): return f"" class Subnet(db.Model): __tablename__ = "subnets" id = db.Column(db.Integer, primary_key=True) cidr = db.Column(db.String(18), unique=True, nullable=False) # e.g., 192.168.1.0/24 location = db.Column(db.String(64)) active_hosts = db.Column(db.Text) # Store as JSON string last_scanned = db.Column(db.DateTime) auto_scan = db.Column(db.Boolean, default=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column( db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow ) # Relationships servers = db.relationship("Server", back_populates="subnet") def __repr__(self): return f"" @property def used_ips(self): """Number of IPs used in this subnet (servers)""" return len(self.servers) # Getter and setter for active_hosts as JSON @property def active_hosts_list(self): if not self.active_hosts: return [] return json.loads(self.active_hosts) @active_hosts_list.setter def active_hosts_list(self, hosts): self.active_hosts = json.dumps(hosts) class App(db.Model): __tablename__ = "apps" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), nullable=False) server_id = db.Column(db.Integer, db.ForeignKey("servers.id"), nullable=False) documentation = db.Column(db.Text) url = db.Column(db.String(255), nullable=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column( db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow ) # Relationships server = db.relationship("Server", back_populates="apps") ports = db.relationship("Port", back_populates="app", cascade="all, delete-orphan") def __repr__(self): return f""