Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
This is a Python script that helps you create reverse DNS zone files for the Bind Name Server. See http://goo.gl/CJwly
#!/usr/bin/env python
"""
rdns.py
This is a Python script that helps you create
reverse DNS zone files for the Bind Name Server.
I published it together with this blog post: http://goo.gl/CJwly .
"""
import sys
try:
from ipaddress import IPv6Address, IPv6Network
except ImportError:
sys.stderr.write("This script needs the ipaddress module from Python3.3+. "
"If you run an older version of Python, you should also run an older version of this script.\n")
sys.exit(2)
# Monkey patching ipaddress.IPv6Network with a custom method
def combine_with(self, other):
"""
Function to monkey patch IPv6Network:
Can combine an IPv6 Network with a host specifier in the form of an IPv6 address.
n1 = IPv6Network('2003::/64')
d1 = ipaddress.IPv6Address('::1')
print(n1.combine_with(d1))
"""
first = self[0]
if ((int('1' * self.prefixlen, 2) << (128-self.prefixlen) ) & other._ip) > 0:
raise ValueError("Cannot combine an IPv6 address with this network. Some bits overlap.")
return IPv6Address(first._ip | other._ip)
setattr(IPv6Network, 'combine_with', combine_with)
# Monkey patching ipaddress.IPv6Address with reverse_pointer from Python 3.5+.
def reverse_pointer(self):
"""
Return the reverse DNS pointer name for the IPv6 address.
taken from http://hg.python.org/cpython/file/default/Lib/ipaddress.py
"""
reverse_chars = self.exploded[::-1].replace(':', '')
return '.'.join(reverse_chars) + '.ip6.arpa'
setattr(IPv6Address, 'reverse_pointer', property(reverse_pointer))
## configure your RDNS generation here:
host = "example.com."
first_name_server = "ns1.example.com."
administrative_contact = "admin.example.com."
subnet = IPv6Network("2001:db8::/32")
rdns_entries = []
# a list of RDNS entries which are of the form (IPv6Address, FQDN)
rdns_entries.append((subnet.combine_with(IPv6Address("::1")), "host1."+host))
rdns_entries.append((subnet.combine_with(IPv6Address("::2")), "host2."+host))
## should not need to modify:
record_ttl = "1h"
from datetime import datetime
zone_serial = datetime.now().strftime("%Y%m%d%H%M%S")
slave_refresh_interval = "1h"
slave_retry_interval = "15m"
slave_expiration_time = "1w"
nxdomain_cache_time = "1h"
### Begin of the output generation
print("; Zone file built with the Python Tool rdns.py:")
print("; " + __doc__.replace("\n","\n; ") )
print("$TTL %s ; Default TTL" % record_ttl )
print("@ IN SOA %s %s (" % (first_name_server, administrative_contact) )
print(" %s ; serial" % zone_serial)
print(" %s ; slave refresh interval" % slave_refresh_interval)
print(" %s ; slave retry interval" % slave_retry_interval)
print(" %s ; slave copy expire time" % slave_expiration_time)
print(" %s ; NXDOMAIN cache time" % nxdomain_cache_time)
print(" )")
print("; domain name servers")
print("@ IN NS %s" % first_name_server)
print("; IPv6 PTR entries")
for rdns_entry in rdns_entries:
print("%s IN PTR %s" % (rdns_entry[0].reverse_pointer, rdns_entry[1]) )
@felipe1982

This comment has been minimized.

Copy link

felipe1982 commented Jan 15, 2015

Cannot run this on RHEL5 (python2.4). What can I do?

@Morketh

This comment has been minimized.

Copy link

Morketh commented Dec 15, 2015

Would be nice if this was for IPv4 looks like a really useful script. im sure with a tad bit of tweaking i could get it to work IPv4 thank you for sharing

@edsonauth

This comment has been minimized.

Copy link

edsonauth commented Oct 19, 2016

Traceback (most recent call last):
File "", line 1, in
NameError: name 'rdns' is not defined

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.