1+ import argparse
12import iptools
23import socket
34import sys
@@ -20,44 +21,48 @@ def getIpv6ArpaDomainName(addr):
2021 domainName += hex (nibbles [31 - i ])[2 :] + "."
2122 return domainName + "ip6.arpa."
2223
23- def generateIpv4PtrRecord (addr , ttl = "" , hostname = "" ):
24+ def generateIpv4PtrRecord (addr , zone = "" , ttl = "" , hostname = "" ):
2425 if iptools .ipv4 .validate_ip (addr ):
25- arpaDomainName = getIpv4ArpaDomainName (addr )
26+ arpaDomainName = truncatedArpaDomainName = getIpv4ArpaDomainName (addr )
27+ if zone != "" :
28+ truncatedArpaDomainName = arpaDomainName .replace (".{}" .format (zone ), "" )
2629
2730 if hostname == "" :
28- return "{} {} IN PTR {}" .format (arpaDomainName , ttl , arpaDomainName )
31+ return "{} {} IN PTR {}" .format (truncatedArpaDomainName , ttl , arpaDomainName )
2932 else :
30- return "{} {} IN PTR {}" .format (arpaDomainName , ttl , hostname )
33+ return "{} {} IN PTR {}" .format (truncatedArpaDomainName , ttl , hostname )
3134 else :
3235 sys .exit ("Error: Invalid IPv4 address/range encountered ({})" .format (addr ))
3336
34- def generateIpv6PtrRecord (addr , ttl = "" , hostname = "" ):
37+ def generateIpv6PtrRecord (addr , zone = "" , ttl = "" , hostname = "" ):
3538 if iptools .ipv6 .validate_ip (addr ):
36- arpaDomainName = getIpv6ArpaDomainName (addr )
39+ arpaDomainName = truncatedArpaDomainName = getIpv6ArpaDomainName (addr )
40+ if zone != "" :
41+ truncatedArpaDomainName = arpaDomainName .replace (".{}" .format (zone ), "" )
3742
3843 if hostname == "" :
39- return "{} {} IN PTR {}" .format (arpaDomainName , ttl , arpaDomainName )
44+ return "{} {} IN PTR {}" .format (truncatedArpaDomainName , ttl , arpaDomainName )
4045 else :
41- return "{} {} IN PTR {}" .format (arpaDomainName , ttl , hostname )
46+ return "{} {} IN PTR {}" .format (truncatedArpaDomainName , ttl , hostname )
4247 else :
4348 sys .exit ("Error: Invalid IPv6 address/range encountered ({})" .format (addr ))
4449
4550def getIpsFromHostname (host ):
4651 return { str (i [4 ][0 ]) for i in socket .getaddrinfo (host , 80 ) }
4752
48- def printPtrRecords (query , ttl = "" ):
53+ def printPtrRecords (query , ipv4_zone = "" , ipv6_zone = "" , ttl = "" ):
4954 if iptools .ipv6 .validate_cidr (query ) == True :
5055 query = iptools .IpRangeList (query )
5156 for addr in query :
52- print (generateIpv6PtrRecord (addr , ttl ))
57+ print (generateIpv6PtrRecord (addr , zone = ipv6_zone , ttl = ttl ))
5358 elif iptools .ipv6 .validate_ip (query ) == True :
54- print (generateIpv6PtrRecord (query , ttl ))
59+ print (generateIpv6PtrRecord (query , zone = ipv6_zone , ttl = ttl ))
5560 elif iptools .ipv4 .validate_cidr (query ) == True :
5661 query = iptools .IpRangeList (query )
5762 for addr in query :
58- print (generateIpv4PtrRecord (addr , ttl ))
63+ print (generateIpv4PtrRecord (addr , zone = ipv4_zone , ttl = ttl ))
5964 elif iptools .ipv4 .validate_ip (query ) == True :
60- print (generateIpv4PtrRecord (query , ttl ))
65+ print (generateIpv4PtrRecord (query , zone = ipv4_zone , ttl = ttl ))
6166 else :
6267 try :
6368 ips = getIpsFromHostname (query )
@@ -66,19 +71,22 @@ def printPtrRecords(query, ttl=""):
6671
6772 for ip in ips :
6873 if iptools .ipv6 .validate_ip (ip ):
69- print (generateIpv6PtrRecord (ip , ttl , hostname = query ))
74+ print (generateIpv6PtrRecord (ip , zone = ipv6_zone , ttl = ttl , hostname = query ))
7075 elif iptools .ipv4 .validate_ip (ip ):
71- print (generateIpv4PtrRecord (ip , ttl , hostname = query ))
76+ print (generateIpv4PtrRecord (ip , zone = ipv4_zone , ttl = ttl , hostname = query ))
7277 else :
7378 sys .exit ("Error: Invalid IP address/range encountered ({})" .format (ip ))
7479 except :
7580 sys .exit ("Error: Invalid query" )
7681
77- if len (sys .argv ) < 2 :
78- sys .exit ("Error: Too few arguments" )
79- elif len (sys .argv ) == 2 :
80- printPtrRecords (sys .argv [1 ])
81- elif len (sys .argv ) == 3 :
82- printPtrRecords (sys .argv [1 ], ttl = sys .argv [2 ])
83- else :
84- sys .exit ("Error: Too many arguments" )
82+ if __name__ == "__main__" :
83+ parser = argparse .ArgumentParser (description = 'Generate PTR records for IP addresses' )
84+ parser .add_argument ('objects' , metavar = 'O' , type = str , nargs = '+' , help = 'IP address, subnet or domain name to create PTR record for' )
85+ parser .add_argument ('-z4' , type = str , nargs = 1 , default = ['' ], dest = 'ipv4_zone' , help = 'DNS zone for IPv4 addresses' )
86+ parser .add_argument ('-z6' , type = str , nargs = 1 , default = ['' ], dest = 'ipv6_zone' , help = 'DNS zone for IPv6 addresses' )
87+ parser .add_argument ('-ttl' , type = str , nargs = 1 , default = ['' ], dest = 'ttl' , help = 'TTL value for PTR records' )
88+
89+ args = parser .parse_args ()
90+
91+ for obj in args .objects :
92+ printPtrRecords (obj , ipv4_zone = args .ipv4_zone [0 ], ipv6_zone = args .ipv6_zone [0 ], ttl = args .ttl [0 ])
0 commit comments