Skip to content

Instantly share code, notes, and snippets.

@pklaus
Created March 11, 2012 12:32
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save pklaus/2016269 to your computer and use it in GitHub Desktop.
Save pklaus/2016269 to your computer and use it in GitHub Desktop.
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
Copy link

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

@Morketh
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
Copy link

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