import re
import sys
def help():
print sys.argv[0]+" generates reverse DNS zonefiles for a given subnet."
print "Usage "+sys.argv[0]+" [ipblock]"
print "Example: "+sys.argv[0]+" 10.0.0.0/10"
if len(sys.argv) is not 2:
help()
sys.exit(1)
subnet = sys.argv[1]
subnet_checker = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d{1,2}')
n_grps = re.compile(r'\d{1,3}')
is_subnet = subnet_checker.match(subnet)
if not is_subnet:
help()
sys.exit(1)
groups = n_grps.findall(subnet)
hbits = int(groups[(len(groups) - 1)])
if hbits < 8:
help()
sys.exit(1)
elif hbits > 32:
help()
sys.exit(1)
def bit2dec(bit):
btable = {1:1, 2:2, 3:4, 4:8, 5:16, 6:32, 7:64, 8:128}
dec = 0
for x in range(bit):
dec += btable[x+1]
return int(dec)
if __name__ == "__main__":
bits = 32 - hbits
hbits16 = int(groups[(len(groups) - 1)])
if bits <= 8:
zonefile = open(groups[0]+'.'+groups[1]+'.'+groups[2]+'.db', 'w')
for x in range(int(groups[3]),(int(groups[3])+bit2dec(bits))):
rdns = str(x)+'.'+ groups[2]+'.'+groups[1]+'.'+groups[0]+'.'+'IN-ADDR.ARPA\n'
zonefile.write(rdns)
zonefile.close()
elif bits <= 16:
for x in range(int(groups[2]), bit2dec(bits - 8)):
zonefile = open(groups[0]+'.'+groups[1]+'.'+str(x)+'.db', 'w')
for y in range(1, 256):
rdns = str(y)+'.'+str(x)+'.'+groups[1]+'.'+groups[0]+'.'+'IN-ADDR.ARPA\n'
zonefile.write(rdns)
zonefile.close()
elif bits <= 24:
for x in range(int(groups[1]), bit2dec(bits - 16)):
for y in range(1, 256):
zonefile = open(groups[0]+'.'+str(x)+'.'+str(y)+'.db', 'w')
for z in range(1, 256):
rdns = str(z)+'.'+str(y)+'.'+str(x)+'.'+groups[0]+'.'+'IN-ADDR.ARPA\n'
zonefile.write(rdns)
zonefile.close()
Diff to Previous Revision
--- revision 1 2008-11-09 06:31:08
+++ revision 2 2010-04-13 14:04:46
@@ -1,5 +1,5 @@
+import re
import sys
-import re
def help():
print sys.argv[0]+" generates reverse DNS zonefiles for a given subnet."