-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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]) ) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Did you ever get this working for ipv4?