Skip to content

Commit ca7c70f

Browse files
author
Shumon Huque
committed
Updated miscellaneous python example programs.
1 parent f1b48e8 commit ca7c70f

File tree

8 files changed

+199
-47
lines changed

8 files changed

+199
-47
lines changed

examples/get-ip-many.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

examples/get-ip-only-secure.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

examples/get-ip.py

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,66 @@
11
#!/usr/bin/env python
2+
#
23

3-
import getdns, sys
4+
"""
5+
get-ip.py: resolve given DNS names into IP addresses. The -s switch
6+
constains answers to only ones secured by DNSSEC. The -4 switch only
7+
returns IPv4 addresses, the -6 switch only IPv6 addresses.
48
5-
hostname = sys.argv[1]
9+
An example run:
610
7-
ctx = getdns.Context()
8-
extensions = { "return_both_v4_and_v6" : getdns.GETDNS_EXTENSION_TRUE }
9-
results = ctx.address(name=hostname, extensions=extensions)
11+
$ get-ip.py -s www.huque.com www.google.com
12+
www.huque.com: IPv4 50.116.63.23
13+
www.huque.com: IPv6 2600:3c03:e000:81::a
14+
www.google.com: No DNSSEC secured responses found
15+
16+
"""
17+
18+
import getdns, sys, getopt
19+
20+
def usage():
21+
print """\
22+
Usage: get-ip.py [-s] [-4|-6] <domain1> <domain2> ...
23+
24+
-s: only return DNSSEC secured answers
25+
-4: only return IPv4 address answers
26+
-6: only return IPv6 address answers
27+
28+
-4 and -6 are mutually exclusive. If both are specified, IPv6 wins.
29+
"""
30+
sys.exit(1)
1031

11-
if results["status"] == getdns.GETDNS_RESPSTATUS_GOOD:
12-
for addr in results["just_address_answers"]:
13-
print addr["IPSTRING"]
32+
try:
33+
(options, args) = getopt.getopt(sys.argv[1:], 's46')
34+
except getopt.GetoptError:
35+
usage()
1436
else:
15-
print "getdns.address() returned an error: %d" % results["status"]
37+
if not args:
38+
usage()
39+
40+
extensions = { "return_both_v4_and_v6" : getdns.GETDNS_EXTENSION_TRUE }
41+
desired_addr_type = None
42+
43+
for (opt, optval) in options:
44+
if opt == "-s":
45+
extensions["dnssec_return_only_secure"] = getdns.GETDNS_EXTENSION_TRUE
46+
elif opt == "-4":
47+
desired_addr_type = "IPv4"
48+
elif opt == "-6":
49+
desired_addr_type = "IPv6"
50+
51+
ctx = getdns.Context()
52+
53+
for hostname in args:
54+
results = ctx.address(name=hostname, extensions=extensions)
55+
status = results['status']
56+
if status == getdns.GETDNS_RESPSTATUS_GOOD:
57+
for addr in results['just_address_answers']:
58+
addr_type = addr['address_type']
59+
addr_data = addr['address_data']
60+
if (desired_addr_type == None) or (addr_type == desired_addr_type):
61+
print "%s: %s %s" % (hostname, addr_type, addr_data)
62+
elif status == getdns.GETDNS_RESPSTATUS_NO_SECURE_ANSWERS:
63+
print "%s: No DNSSEC secured responses found" % hostname
64+
else:
65+
print "%s: getdns.address() returned error: %d" % (hostname, status)
1666

examples/get-mx-ip.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ def get_ip(ctx, qname):
1515
iplist = []
1616
results = ctx.address(name=qname, extensions=extensions)
1717
if results['status'] == getdns.GETDNS_RESPSTATUS_GOOD:
18-
for addr in results["just_address_answers"]:
19-
iplist.append(addr['IPSTRING'])
18+
for addr in results['just_address_answers']:
19+
iplist.append(addr['address_data'])
2020
else:
2121
print "getdns.address() returned an error: %d" % results['status']
2222
return iplist

examples/get-ns-ip.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#!/usr/bin/env python
2+
#
3+
4+
"""
5+
Lookup an NS record and printout all the hostnames and associated IP
6+
addresses of the listed nameservers.
7+
"""
8+
9+
import getdns, pprint, sys
10+
11+
extensions = { "return_both_v4_and_v6" : getdns.GETDNS_EXTENSION_TRUE }
12+
13+
14+
def usage():
15+
print """Usage: get-ns-ip.py <zone>
16+
17+
where <zone> is a DNS zone (domain).
18+
"""
19+
sys.exit(1)
20+
21+
22+
def get_ip(ctx, qname):
23+
iplist = []
24+
results = ctx.address(name=qname, extensions=extensions)
25+
if results['status'] == getdns.GETDNS_RESPSTATUS_GOOD:
26+
for addr in results['just_address_answers']:
27+
iplist.append(addr['address_data'])
28+
else:
29+
print "getdns.address() returned an error: %d" % results['status']
30+
return iplist
31+
32+
33+
if __name__ == '__main__':
34+
35+
if len(sys.argv) != 2:
36+
usage()
37+
38+
qname = sys.argv[1]
39+
40+
ctx = getdns.Context()
41+
results = ctx.general(name=qname, request_type=getdns.GETDNS_RRTYPE_NS)
42+
status = results['status']
43+
44+
hostlist = []
45+
if status == getdns.GETDNS_RESPSTATUS_GOOD:
46+
for reply in results['replies_tree']:
47+
answers = reply['answer']
48+
for answer in answers:
49+
if answer['type'] == getdns.GETDNS_RRTYPE_NS:
50+
iplist = get_ip(ctx, answer['rdata']['nsdname'])
51+
for ip in iplist:
52+
hostlist.append( (answer['rdata']['nsdname'], ip) )
53+
elif status == getdns.GETDNS_RESPSTATUS_NO_NAME:
54+
print "%s: no such DNS zone" % qname
55+
elif status == getdns.GETDNS_RESPSTATUS_ALL_TIMEOUT:
56+
print "%s, NS: query timed out" % qname
57+
else:
58+
print "%s, %s: unknown return code: %d" % results["status"]
59+
60+
# Print out each NS server name and IP address
61+
for (nsdname, addr) in sorted(hostlist):
62+
print nsdname, addr

examples/query-gdns.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env python
2+
#
3+
# Use stub mode with google public DNS as recursive resolvers
4+
# to query addresses associated with a host.
5+
#
6+
7+
import getdns, sys, pprint
8+
9+
google_public_dns = [
10+
{'address_data': '8.8.8.8', 'address_type': 'IPv4'},
11+
{'address_data': '8.8.4.4', 'address_type': 'IPv4'},
12+
{'address_data': '2001:4860:4860::8888', 'address_type': 'IPv6'},
13+
{'address_data': '2001:4860:4860::8844', 'address_type': 'IPv6'},
14+
]
15+
16+
hostname = sys.argv[1]
17+
18+
ctx = getdns.Context()
19+
ctx.resolution_type = getdns.GETDNS_RESOLUTION_STUB
20+
ctx.upstream_recursive_servers = google_public_dns
21+
22+
extensions = { "return_both_v4_and_v6" : getdns.GETDNS_EXTENSION_TRUE }
23+
24+
results = ctx.address(name=hostname, extensions=extensions)
25+
26+
if results["status"] == getdns.GETDNS_RESPSTATUS_GOOD:
27+
for addr in results["just_address_answers"]:
28+
print addr["address_data"]
29+
else:
30+
print "getdns.address() returned an error: %d" % results["status"]
31+

examples/query-stubmode.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/usr/bin/env python
2+
3+
import getdns, sys
4+
5+
hostname = sys.argv[1]
6+
7+
ctx = getdns.Context()
8+
ctx.resolution_type = getdns.GETDNS_RESOLUTION_STUB
9+
10+
extensions = { "return_both_v4_and_v6" : getdns.GETDNS_EXTENSION_TRUE }
11+
ctx.resolver_type = getdns.GETDNS_RESOLUTION_STUB
12+
13+
results = ctx.address(name=hostname, extensions=extensions)
14+
15+
if results["status"] == getdns.GETDNS_RESPSTATUS_GOOD:
16+
for addr in results["just_address_answers"]:
17+
print addr["address_data"]
18+
else:
19+
print "getdns.address() returned an error: %d" % results["status"]
20+

examples/simple.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/usr/bin/env python
2+
#
3+
4+
"""
5+
simply.py
6+
7+
A simple example to query a domain name and print out addresses
8+
associated with it.
9+
"""
10+
11+
import sys, getdns
12+
13+
hostname = sys.argv[1]
14+
15+
ctx = getdns.Context()
16+
extensions = { "return_both_v4_and_v6" : getdns.GETDNS_EXTENSION_TRUE }
17+
18+
results = ctx.address(name=hostname, extensions=extensions)
19+
status = results['status']
20+
21+
if status == getdns.GETDNS_RESPSTATUS_GOOD:
22+
for addr in results['just_address_answers']:
23+
print addr['address_data']
24+
else:
25+
print "%s: getdns.address() returned error: %d" % (hostname, status)

0 commit comments

Comments
 (0)