Skip to content

Commit b71d132

Browse files
Add DNS zone truncation
Also redo terminal argument parsing
1 parent 169e76a commit b71d132

File tree

1 file changed

+31
-23
lines changed

1 file changed

+31
-23
lines changed

ptrgen.py

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import argparse
12
import iptools
23
import socket
34
import 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

4550
def 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

Comments
 (0)