from .extensions import db import json from datetime import datetime import ipaddress class Subnet(db.Model): id = db.Column(db.Integer, primary_key=True) cidr = db.Column(db.String(18), unique=True) # Format: "192.168.1.0/24" location = db.Column(db.String(80)) auto_scan = db.Column(db.Boolean, default=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) @property def network(self): return ipaddress.ip_network(self.cidr) @property def num_addresses(self): return self.network.num_addresses @property def used_ips(self): # Count servers in this subnet return Server.query.filter_by(subnet_id=self.id).count() def __repr__(self): return f'' class Server(db.Model): id = db.Column(db.Integer, primary_key=True) hostname = db.Column(db.String(80), unique=True) ip_address = db.Column(db.String(15), unique=True) subnet_id = db.Column(db.Integer, db.ForeignKey('subnet.id')) subnet = db.relationship('Subnet', backref=db.backref('servers', lazy=True)) documentation = db.Column(db.Text) created_at = db.Column(db.DateTime, default=datetime.utcnow) # Store ports as JSON in the database _ports = db.Column(db.Text, default='[]') @property def ports(self): return json.loads(self._ports) if self._ports else [] @ports.setter def ports(self, value): self._ports = json.dumps(value) if value else '[]' def get_open_ports(self): return self.ports def __repr__(self): return f'' class App(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80)) server_id = db.Column(db.Integer, db.ForeignKey('server.id')) server = db.relationship('Server', backref=db.backref('apps', lazy=True)) documentation = db.Column(db.Text) created_at = db.Column(db.DateTime, default=datetime.utcnow) # Store ports as JSON in the database _ports = db.Column(db.Text, default='[]') @property def ports(self): return json.loads(self._ports) if self._ports else [] @ports.setter def ports(self, value): self._ports = json.dumps(value) if value else '[]' def __repr__(self): return f''