Page MenuHomePhabricator
Paste P12197

Netbox: set DNS name if not set for non-servers
ActivePublic

Authored by Volans on Aug 7 2020, 11:15 AM.
Tags
None
Referenced Files
F31984332: raw.txt
Aug 7 2020, 11:44 AM
F31984320: raw.txt
Aug 7 2020, 11:35 AM
F31984302: raw.txt
Aug 7 2020, 11:15 AM
Subscribers
None
import ipaddress
from time import sleep
from dns import resolver
ips = IPAddress.objects.filter(status='active', dns_name='')
print(f'Found {len(ips)} active IPs without a DNS name')
aggregates = Aggregate.objects.all()
dns_resolver = resolver.Resolver()
def resolve_ptr(ip):
targets = []
try:
rr = dns_resolver.query(ipaddress.ip_interface(ip).ip.reverse_pointer, 'PTR')
except resolver.NXDOMAIN:
print(f'No records for {ip}, skipping')
return []
except resolver.NoNameservers:
print(f'No reply for {ip}, not in our space?')
return []
for rdata in rr:
target = rdata.target.to_text()
if target[-1] != '.':
print(f'Skipping relative name {target}')
continue
targets.append(target[:-1])
if len(targets) != 1:
print(f'ERROR: Found {len(targets)} names for {ip}, skipping: {targets}')
return []
return targets
for ip in ips:
if ip.device.device_role.slug == 'server':
print(f'Skipping ip {ip}, belong to a server')
continue
if not [aggr for aggr in aggregates if ip.address in aggr.prefix]:
print(f'Skipping ip {ip}, not in our ranges')
continue
targets = resolve_ptr(ip)
if targets:
#ip.dns_name = targets[0]
#ip.save()
print(f'Set DNS name for {ip} to {targets[0]}')
sleep(0.2)