Skip to content

Instantly share code, notes, and snippets.

@Morketh
Forked from pklaus/rdns.py
Created December 15, 2015 07:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Morketh/8c839ec8512923531240 to your computer and use it in GitHub Desktop.
Save Morketh/8c839ec8512923531240 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]) )
@chezbut
Copy link

chezbut commented May 3, 2017

Did you ever get this working for ipv4?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment