modified: README.md
modified: netbox_dns_bridge/notify_handler.py modified: netbox_dns_bridge/request_handler.py modified: netbox_dns_bridge/signals/netbox_dns_zones.py Disable NOTIFY feature by default and add setting to enable it.
This commit is contained in:
1 parent
cb4886f032
commit
73544a4335
4 files changed
+70
-53
No files matched your search
@@ -12,6 +12,7 @@ from .logger import get_logger
|
||||
from .models import SeenTransferClients
|
||||
|
||||
logger = get_logger(__name__)
|
||||
SETTINGS = settings.PLUGINS_CONFIG["netbox_dns_bridge"]
|
||||
|
||||
|
||||
class SendDNSNotify(JobRunner):
|
||||
@@ -19,7 +20,7 @@ class SendDNSNotify(JobRunner):
|
||||
name = "Send DNS NOTIFY"
|
||||
|
||||
def _load_tsig_key(self, view_name: str) -> dns.tsig.Key:
|
||||
tsig_keys = settings.PLUGINS_CONFIG["netbox_dns_bridge"].get("tsig_keys", {})
|
||||
tsig_keys = SETTINGS.get("tsig_keys", {})
|
||||
if view_name not in tsig_keys:
|
||||
raise RuntimeError(f"No TSIG key configured for view '{view_name}'")
|
||||
|
||||
@@ -50,7 +51,8 @@ class SendDNSNotify(JobRunner):
|
||||
view = View.objects.get(name=view_name)
|
||||
tsig_key = self._load_tsig_key(view_name)
|
||||
|
||||
seen_cutoff = timezone.now() - timezone.timedelta(hours=1)
|
||||
cutoff_hours = SETTINGS.get("notify_client_dead_after_hours", 24)
|
||||
seen_cutoff = timezone.now() - timezone.timedelta(hours=cutoff_hours)
|
||||
clients = SeenTransferClients.objects.filter(
|
||||
view=view, last_seen__gte=seen_cutoff
|
||||
)
|
||||
|
||||
@@ -12,7 +12,7 @@ import dns.exception
|
||||
import dns.renderer
|
||||
from .logger import get_logger
|
||||
from django.utils import timezone
|
||||
from netbox_dns.models import Zone, Record
|
||||
from netbox_dns.models import Zone, Record, View
|
||||
from netbox_dns_bridge import catalog_zone_manager as catzm
|
||||
from .models import SeenTransferClients
|
||||
|
||||
@@ -103,7 +103,8 @@ class DNSBaseRequestHandler(socketserver.BaseRequestHandler):
|
||||
# Ensure rdataset has the same rdclass as the zone
|
||||
if rdataset.rdclass != zone.rdclass:
|
||||
raise ValueError(
|
||||
f"rdataset rdclass {rdataset.rdclass} does not match zone rdclass {zone.rdclass}"
|
||||
f"rdataset rdclass {rdataset.rdclass} does not match "
|
||||
f"zone rdclass {zone.rdclass}"
|
||||
)
|
||||
|
||||
# Check if the rdataset has any rdata before creating an RRset
|
||||
@@ -143,6 +144,13 @@ class DNSBaseRequestHandler(socketserver.BaseRequestHandler):
|
||||
wire = response.to_wire(multi=False)
|
||||
self._send_response(wire)
|
||||
|
||||
def _track_seen_client(source_ip: str, view: View) -> None:
|
||||
SeenTransferClients.objects.update_or_create(
|
||||
source_ip=source_ip,
|
||||
view=view,
|
||||
defaults={"last_seen": timezone.now()},
|
||||
)
|
||||
|
||||
def _handle_soa_request(self, query, soa_rrset, zone, peer, nb_view, dname) -> None:
|
||||
# We assume that the SOA rdataset has at least one record (it usually does).
|
||||
soa_rdata = soa_rrset[0] # Get the first SOA record
|
||||
@@ -274,13 +282,6 @@ class DNSBaseRequestHandler(socketserver.BaseRequestHandler):
|
||||
)
|
||||
wire = r.get_wire()
|
||||
self._send_response(wire)
|
||||
|
||||
SeenTransferClients.objects.update_or_create(
|
||||
source_ip=peer,
|
||||
view=nb_view,
|
||||
defaults={"last_seen": timezone.now()},
|
||||
)
|
||||
|
||||
logger.info(f"{peer} AXFR {nb_view.name}/{dname}")
|
||||
|
||||
def _handle_dns_query(self, wire) -> None:
|
||||
@@ -361,8 +362,10 @@ class DNSBaseRequestHandler(socketserver.BaseRequestHandler):
|
||||
|
||||
if qtype == dns.rdatatype.SOA:
|
||||
self._handle_soa_request(query, soa_rrset, zone, peer, nb_view, dname)
|
||||
self._track_seen_client(peer, nb_view)
|
||||
elif qtype == dns.rdatatype.AXFR:
|
||||
self._handle_axfr_request(query, zone, peer, nb_view, dname)
|
||||
self._track_seen_client(peer, nb_view)
|
||||
|
||||
|
||||
class UDPRequestHandler(DNSBaseRequestHandler):
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
from django.db.models.signals import pre_save, post_save
|
||||
from django.dispatch import receiver
|
||||
from django.db import transaction
|
||||
from django.conf import settings
|
||||
from netbox.context import current_request
|
||||
from netbox_dns.models import Zone
|
||||
from netbox_dns_bridge import catalog_zone_manager as catzm
|
||||
from netbox_dns_bridge import notify_handler
|
||||
|
||||
SETTINGS = settings.PLUGINS_CONFIG["netbox_dns_bridge"]
|
||||
|
||||
|
||||
@receiver(pre_save, sender=Zone)
|
||||
def zone_pre_save(sender, instance, **kwargs):
|
||||
@@ -31,7 +34,9 @@ def zone_post_save(sender, instance, created, **kwargs):
|
||||
|
||||
def _on_commit():
|
||||
catzm.increment_soa_serial()
|
||||
notify_handler.schedule(zone)
|
||||
|
||||
if SETTINGS.get("notify_clients", False):
|
||||
notify_handler.schedule(zone)
|
||||
|
||||
transaction.on_commit(_on_commit)
|
||||
|
||||
|
||||
Reference in new issue
Block a user