Update status when no zone is found
This commit is contained in:
parent
2bc5f9f204
commit
cbc99e76c1
|
@ -9,7 +9,7 @@ from django_rq import job
|
|||
from dns import rcode
|
||||
from netaddr import ip
|
||||
|
||||
from netbox_ddns.models import ACTION_CREATE, ACTION_DELETE, DNSStatus, ReverseZone, Zone
|
||||
from netbox_ddns.models import ACTION_CREATE, ACTION_DELETE, DNSStatus, RCODE_NO_ZONE, ReverseZone, Zone
|
||||
from netbox_ddns.utils import get_soa
|
||||
|
||||
logger = logging.getLogger('netbox_ddns')
|
||||
|
@ -29,11 +29,12 @@ def status_update(output: List[str], operation: str, response) -> None:
|
|||
|
||||
|
||||
def create_forward(dns_name: str, address: ip.IPAddress, status: Optional[DNSStatus], output: List[str]):
|
||||
if status:
|
||||
status.forward_action = ACTION_CREATE
|
||||
|
||||
zone = Zone.objects.find_for_dns_name(dns_name)
|
||||
if zone:
|
||||
logger.debug(f"Found zone {zone.name} for {dns_name}")
|
||||
if status:
|
||||
status.forward_action = ACTION_CREATE
|
||||
|
||||
# Check the SOA, we don't want to write to a parent zone if it has delegated authority
|
||||
soa = get_soa(dns_name)
|
||||
|
@ -57,14 +58,17 @@ def create_forward(dns_name: str, address: ip.IPAddress, status: Optional[DNSSta
|
|||
status.forward_rcode = rcode.NOTAUTH
|
||||
else:
|
||||
logger.debug(f"No zone found for {dns_name}")
|
||||
if status:
|
||||
status.forward_rcode = RCODE_NO_ZONE
|
||||
|
||||
|
||||
def delete_forward(dns_name: str, address: ip.IPAddress, status: Optional[DNSStatus], output: List[str]):
|
||||
if status:
|
||||
status.forward_action = ACTION_DELETE
|
||||
|
||||
zone = Zone.objects.find_for_dns_name(dns_name)
|
||||
if zone:
|
||||
logger.debug(f"Found zone {zone.name} for {dns_name}")
|
||||
if status:
|
||||
status.forward_action = ACTION_DELETE
|
||||
|
||||
# Check the SOA, we don't want to write to a parent zone if it has delegated authority
|
||||
soa = get_soa(dns_name)
|
||||
|
@ -87,16 +91,19 @@ def delete_forward(dns_name: str, address: ip.IPAddress, status: Optional[DNSSta
|
|||
status.forward_rcode = rcode.NOTAUTH
|
||||
else:
|
||||
logger.debug(f"No zone found for {dns_name}")
|
||||
if status:
|
||||
status.forward_rcode = RCODE_NO_ZONE
|
||||
|
||||
|
||||
def create_reverse(dns_name: str, address: ip.IPAddress, status: Optional[DNSStatus], output: List[str]):
|
||||
zone = ReverseZone.objects.find_for_address(address)
|
||||
if zone and dns_name:
|
||||
record_name = zone.record_name(address)
|
||||
logger.debug(f"Found zone {zone.name} for {record_name}")
|
||||
if status:
|
||||
status.reverse_action = ACTION_CREATE
|
||||
|
||||
zone = ReverseZone.objects.find_for_address(address)
|
||||
if zone:
|
||||
record_name = zone.record_name(address)
|
||||
logger.debug(f"Found zone {zone.name} for {record_name}")
|
||||
|
||||
# Check the SOA, we don't want to write to a parent zone if it has delegated authority
|
||||
soa = get_soa(record_name)
|
||||
if soa == zone.name:
|
||||
|
@ -118,16 +125,19 @@ def create_reverse(dns_name: str, address: ip.IPAddress, status: Optional[DNSSta
|
|||
status.reverse_rcode = rcode.NOTAUTH
|
||||
else:
|
||||
logger.debug(f"No zone found for {address}")
|
||||
if status:
|
||||
status.reverse_rcode = RCODE_NO_ZONE
|
||||
|
||||
|
||||
def delete_reverse(dns_name: str, address: ip.IPAddress, status: Optional[DNSStatus], output: List[str]):
|
||||
zone = ReverseZone.objects.find_for_address(address)
|
||||
if zone and dns_name:
|
||||
record_name = zone.record_name(address)
|
||||
logger.debug(f"Found zone {zone.name} for {record_name}")
|
||||
if status:
|
||||
status.reverse_action = ACTION_DELETE
|
||||
|
||||
zone = ReverseZone.objects.find_for_address(address)
|
||||
if zone:
|
||||
record_name = zone.record_name(address)
|
||||
logger.debug(f"Found zone {zone.name} for {record_name}")
|
||||
|
||||
# Check the SOA, we don't want to write to a parent zone if it has delegated authority
|
||||
soa = get_soa(record_name)
|
||||
if soa == zone.name:
|
||||
|
@ -148,6 +158,8 @@ def delete_reverse(dns_name: str, address: ip.IPAddress, status: Optional[DNSSta
|
|||
status.reverse_rcode = rcode.NOTAUTH
|
||||
else:
|
||||
logger.debug(f"No zone found for {address}")
|
||||
if status:
|
||||
status.reverse_rcode = RCODE_NO_ZONE
|
||||
|
||||
|
||||
@job
|
||||
|
|
|
@ -37,6 +37,9 @@ ACTION_CHOICES = (
|
|||
(ACTION_DELETE, 'Delete'),
|
||||
)
|
||||
|
||||
# Use a private rcode for internal errors
|
||||
RCODE_NO_ZONE = 4095
|
||||
|
||||
|
||||
def get_rcode_display(code):
|
||||
if code is None:
|
||||
|
@ -53,6 +56,8 @@ def get_rcode_display(code):
|
|||
return _('Refused')
|
||||
elif code == rcode.NOTAUTH:
|
||||
return _('Server not authoritative')
|
||||
elif code == RCODE_NO_ZONE:
|
||||
return _('No zone configured')
|
||||
else:
|
||||
return _('Unknown response: {}').format(code)
|
||||
|
||||
|
|
|
@ -67,9 +67,8 @@ class IPAddressDNSNameRecreateView(PermissionRequiredMixin, View):
|
|||
new_dns_name = normalize_fqdn(ip_address.dns_name)
|
||||
|
||||
updated_names = []
|
||||
zoneless_names = []
|
||||
|
||||
if new_dns_name and Zone.objects.find_for_dns_name(new_dns_name):
|
||||
if new_dns_name:
|
||||
status, created = DNSStatus.objects.get_or_create(ip_address=ip_address)
|
||||
|
||||
dns_create.delay(
|
||||
|
@ -79,14 +78,11 @@ class IPAddressDNSNameRecreateView(PermissionRequiredMixin, View):
|
|||
)
|
||||
|
||||
updated_names.append(new_dns_name)
|
||||
else:
|
||||
zoneless_names.append(new_dns_name)
|
||||
|
||||
for extra in ip_address.extradnsname_set.all():
|
||||
new_address = extra.ip_address.address.ip
|
||||
new_dns_name = extra.name
|
||||
|
||||
if Zone.objects.find_for_dns_name(new_dns_name):
|
||||
dns_create.delay(
|
||||
dns_name=new_dns_name,
|
||||
address=new_address,
|
||||
|
@ -95,12 +91,8 @@ class IPAddressDNSNameRecreateView(PermissionRequiredMixin, View):
|
|||
)
|
||||
|
||||
updated_names.append(new_dns_name)
|
||||
else:
|
||||
zoneless_names.append(new_dns_name)
|
||||
|
||||
if updated_names:
|
||||
messages.info(request, _("Updating DNS for {names}").format(names=', '.join(updated_names)))
|
||||
if zoneless_names:
|
||||
messages.warning(request, _("No DNS zone configured for {names}").format(names=', '.join(zoneless_names)))
|
||||
|
||||
return redirect('ipam:ipaddress', pk=ip_address.pk)
|
||||
|
|
Loading…
Reference in a new issue