diff --git a/src/netbox_plugin_bind_provisioner/management/commands/bind-transfer-endpoint.py b/src/netbox_plugin_bind_provisioner/management/commands/bind-transfer-endpoint.py index 3ae9c85..ced659a 100644 --- a/src/netbox_plugin_bind_provisioner/management/commands/bind-transfer-endpoint.py +++ b/src/netbox_plugin_bind_provisioner/management/commands/bind-transfer-endpoint.py @@ -1,4 +1,5 @@ import logging +import socket import socketserver import os import threading @@ -609,20 +610,52 @@ class TCPRequestHandler(DNSBaseRequestHandler): traceback.print_exc() -class TCPDNSServer(socketserver.TCPServer): +class DNSAddressMixin: + def _resolve_address(self, server_address, socktype, proto): + host, port = server_address + + infos = socket.getaddrinfo( + host, + port, + socket.AF_UNSPEC, + socktype, + proto, + socket.AI_PASSIVE + ) + + family, _, _, _, sockaddr = infos[0] + self.address_family = family + return sockaddr + + +class TCPDNSServer(DNSAddressMixin, socketserver.TCPServer): allow_reuse_address = True def __init__(self, server_address, handler_class, keyring, tsig_view_map): - super().__init__(server_address, handler_class) + sockaddr = self._resolve_address( + server_address, + socket.SOCK_STREAM, + socket.IPPROTO_TCP + ) + + super().__init__(sockaddr, handler_class) + self.keyring = keyring self.tsig_view_map = tsig_view_map -class UDPDNSServer(socketserver.UDPServer): +class UDPDNSServer(DNSAddressMixin, socketserver.UDPServer): allow_reuse_address = True def __init__(self, server_address, handler_class, keyring, tsig_view_map): - super().__init__(server_address, handler_class) + sockaddr = self._resolve_address( + server_address, + socket.SOCK_DGRAM, + socket.IPPROTO_UDP + ) + + super().__init__(sockaddr, handler_class) + self.keyring = keyring self.tsig_view_map = tsig_view_map