homedocs/app/core/models.py
2025-04-03 16:58:01 +02:00

128 lines
4.7 KiB
Python

from app.core.extensions import db
import json
from datetime import datetime
import ipaddress
from flask_login import UserMixin
# Import User from auth instead of defining it here
from app.core.auth import User
class Location(db.Model):
__tablename__ = "locations"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), nullable=False)
description = db.Column(db.Text, nullable=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
subnets = db.relationship("Subnet", backref="location_ref", lazy=True, cascade="all, delete-orphan")
standalone_servers = db.relationship(
"Server",
primaryjoin="and_(Server.location_id==Location.id, Server.subnet_id==None)",
backref="location_ref",
lazy=True
)
def __repr__(self):
return f"<Location {self.name}>"
class Subnet(db.Model):
__tablename__ = "subnets"
id = db.Column(db.Integer, primary_key=True)
cidr = db.Column(db.String(45), nullable=False)
location_id = db.Column(db.Integer, db.ForeignKey("locations.id"), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
auto_scan = db.Column(db.Boolean, default=False)
active_hosts = db.Column(db.Text, default='[]')
last_scanned = db.Column(db.DateTime, nullable=True)
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", backref="subnet", lazy=True)
def __repr__(self):
return f"<Subnet {self.cidr}>"
@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 Server(db.Model):
__tablename__ = "servers"
id = db.Column(db.Integer, primary_key=True)
hostname = db.Column(db.String(255), nullable=False)
ip_address = db.Column(db.String(45), nullable=False)
subnet_id = db.Column(db.Integer, db.ForeignKey("subnets.id"), nullable=True)
location_id = db.Column(db.Integer, db.ForeignKey("locations.id"), nullable=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
description = db.Column(db.Text, nullable=True)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
apps = db.relationship("App", back_populates="server", lazy=True, cascade="all, delete-orphan")
def __repr__(self):
return f"<Server {self.hostname}>"
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)
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
documentation = db.Column(db.Text, nullable=True)
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", lazy=True, cascade="all, delete-orphan")
def __repr__(self):
return f"<App {self.name}>"
class Port(db.Model):
__tablename__ = "ports"
id = db.Column(db.Integer, primary_key=True)
app_id = db.Column(db.Integer, db.ForeignKey("apps.id"), nullable=False)
port_number = db.Column(db.Integer, nullable=False)
protocol = db.Column(db.String(10), nullable=False, default="TCP")
description = 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
app = db.relationship("App", back_populates="ports")
__table_args__ = (
db.UniqueConstraint('app_id', 'port_number', 'protocol', name='unique_port_per_app_protocol'),
)
def __repr__(self):
return f"<Port {self.port_number}/{self.protocol}>"