55# Copyright (c) 2013 Pablo O Vieira (povieira)
66# See README.rst and LICENSE for details.
77
8+ try :
9+ from StringIO import StringIO
10+ except ImportError :
11+ from io import StringIO
12+
813import socket
914
15+ import dns .resolver
1016import requests
1117
1218HTTPBIN_URL = "https://httpbin.org/ip"
1319
20+ IP4ONLY_URL = "http://ip4only.me/api"
21+ IP6ONLY_URL = "http://ip6only.me/api"
22+
23+ COMMON_DNS = "8.8.8.8"
24+
1425try :
1526 input = raw_input
1627except NameError :
@@ -22,19 +33,57 @@ def read_input(message):
2233
2334
2435def get_ip ():
25- """Return machine's origin IP address.
36+ """Return machine's origin IP address(es) .
2637 """
38+ lst = []
39+ try :
40+ r = requests .get (IP4ONLY_URL )
41+ if r .status_code == 200 :
42+ lst .append (r .text .split (',' )[1 ])
43+ except requests .exceptions .ConnectionError :
44+ pass
2745 try :
28- r = requests .get (HTTPBIN_URL )
29- return r .json ()['origin' ] if r .status_code == 200 else None
46+ r = requests .get (IP6ONLY_URL )
47+ if r .status_code == 200 :
48+ lst .append (r .text .split (',' )[1 ])
3049 except requests .exceptions .ConnectionError :
50+ pass
51+ if not lst :
52+ try :
53+ r = requests .get (HTTPBIN_URL )
54+ if r .status_code == 200 :
55+ lst .append (r .json ()['origin' ])
56+ except requests .exceptions .ConnectionError :
57+ pass
58+ if not lst :
3159 return None
60+ return ',' .join (lst )
3261
3362
3463def get_dns_ip (dnsname ):
35- """Return machine's current IP address in DNS.
64+ """Return machine's current IP address(es) in DNS.
3665 """
66+ resolver = dns .resolver .Resolver (StringIO ("nameserver %s" % COMMON_DNS ))
67+
68+ try :
69+ resolve = resolver .resolve
70+ except AttributeError :
71+ resolve = resolver .query
72+
73+ lst = []
74+ try :
75+ lst += [a .address for a in resolve (dnsname , 'A' )]
76+ except dns .exception .DNSException :
77+ pass
3778 try :
38- return socket .gethostbyname (dnsname )
39- except socket .error :
79+ lst += [a .address for a in resolve (dnsname , 'AAAA' )]
80+ except dns .exception .DNSException :
81+ pass
82+ if not lst :
83+ try :
84+ lst .append (socket .gethostbyname (dnsname ))
85+ except socket .error :
86+ pass
87+ if not lst :
4088 return None
89+ return ',' .join (lst )
0 commit comments