Files
bitchmin/bitchmin-api/app/models/dns.py
2020-11-12 19:44:52 +00:00

90 lines
2.8 KiB
Python

from dataclasses import dataclass
from datetime import datetime
from flask_serialize import FlaskSerializeMixin
from sqlalchemy import event
from sqlalchemy.orm import relationship, validates, MapperExtension
from sqlalchemy_utils import IPAddressType
from app import db
from app.models._basemodel import _BaseModelMixin
@dataclass
class DnsNameServer(db.Model, _BaseModelMixin, FlaskSerializeMixin):
__tablename__ = 'dns_nameservers'
host = db.Column(db.String(255), unique=True, nullable=False)
ip = db.Column(IPAddressType(255), nullable=False)
zone_id = db.Column(db.Integer, db.ForeignKey('dns_zones.id'))
zone = relationship("DnsZone", back_populates="nameservers")
def __init__(self, zone, host, ip):
self.zone = zone
self.host = host
self.ip = ip
@dataclass
class DnsZone(db.Model, _BaseModelMixin, FlaskSerializeMixin):
__tablename__ = 'dns_zones'
relationship_fields = ['nameservers', 'hosts']
def __init__(self, zone_name):
self.zone_name = zone_name
self.serial = self._create_serial()
def get_serial_increment(self):
return int(str(self.serial)[8:])
def _create_serial(self):
return datetime.today().strftime('%Y%m%d{:02d}'.format(0))
def increment_serial(self):
current = str(self.serial)
if current and len(current) == 10:
inc = self.get_serial_increment()
return datetime.today().strftime('%Y%m%d{:02d}'.format(inc + 1))
return self._create_serial()
id = db.Column(db.Integer, primary_key=True)
zone_name = db.Column(db.String(253), unique=True, nullable=False)
serial = db.Column(db.Integer, default=_create_serial)
hosts = relationship("DnsHost", back_populates="zone")
nameservers = relationship("DnsNameServer", back_populates="zone")
@dataclass
class DnsHost(db.Model, _BaseModelMixin, FlaskSerializeMixin):
__tablename__ = 'dns_hosts'
id = db.Column(db.Integer, primary_key=True)
zone_id = db.Column(db.Integer, db.ForeignKey('dns_zones.id'))
zone = relationship("DnsZone", back_populates="hosts")
host = db.Column(db.String(255), unique=True, nullable=False)
ip = db.Column(IPAddressType(255), nullable=False)
def __init__(self, zone, host, ip):
self.zone = zone
self.host = host
self.ip = ip
pass
def to_dict(self):
return dict(id=self.id, host=self.host, ip=self.ip)
# @event.listens_for(DnsZone.hosts, 'append')
# @event.listens_for(DnsZone.hosts, 'remove')
# def increment_zone_serial_handler(target, value, initiator):
# target.serial = target.increment_serial()
@event.listens_for(DnsHost.ip, 'set', active_history=True)
def increment_zone_serial_handler(target, value, old, initiator):
if target.zone:
target.zone.serial = target.zone.increment_serial()