pass
+class DDNSNetworkError(DDNSError):
+ pass
+
+
class DDNSAbuseError(DDNSError):
"""
Thrown when the server reports
pass
+class DDNSConnectionRefusedError(DDNSNetworkError):
+ """
+ Thrown when a connection is refused.
+ """
+ pass
+
+
+class DDNSConnectionTimeoutError(DDNSNetworkError):
+ """
+ Thrown when a connection to a server has timed out.
+ """
+ pass
+
+
class DDNSHostNotFoundError(DDNSError):
"""
Thrown when a configuration entry could
pass
+class DDNSNetworkUnreachableError(DDNSNetworkError):
+ """
+ Thrown when a network is not reachable.
+ """
+ pass
+
+
class DDNSRequestError(DDNSError):
"""
Thrown when a request could
pass
+class DDNSServiceUnavailableError(DDNSNetworkError):
+ """
+ Equivalent to HTTP error code 503.
+ """
+ pass
+
+
class DDNSUpdateError(DDNSError):
"""
Thrown when an update could not be
import urllib2
from __version__ import CLIENT_VERSION
+from .errors import *
from i18n import _
# Initialize the logger.
Sends a request to an external web server
to determine the current default IP address.
"""
- response = self.send_request("http://checkip6.dns.lightningwirelabs.com")
+ try:
+ response = self.send_request("http://checkip6.dns.lightningwirelabs.com", timeout=10)
+
+ # If the server could not be reached, we will return nothing.
+ except DDNSNetworkError:
+ return
if not response.code == 200:
return
XXX does not work for IPv6.
"""
- response = self.send_request("http://checkip4.dns.lightningwirelabs.com")
+ try:
+ response = self.send_request("http://checkip4.dns.lightningwirelabs.com", timeout=10)
+
+ # If the server could not be reached, we will return nothing.
+ except DDNSNetworkError:
+ return
if response.code == 200:
match = re.search(r"Your IP address is: (\d+.\d+.\d+.\d+)", response.read())
logger.debug(" %s: %s" % (k, v))
try:
- resp = urllib2.urlopen(req)
+ resp = urllib2.urlopen(req, timeout=timeout)
# Log response header.
logger.debug(_("Response header:"))
# Return the entire response object.
return resp
+ except urllib2.HTTPError, e:
+ # 503 - Service Unavailable
+ if e.code == 503:
+ raise DDNSServiceUnavailableError
+
+ # Raise all other unhandled exceptions.
+ raise
+
except urllib2.URLError, e:
+ if e.reason:
+ # Network Unreachable (e.g. no IPv6 access)
+ if e.reason.errno == 101:
+ raise DDNSNetworkUnreachableError
+ elif e.reason.errno == 111:
+ raise DDNSConnectionRefusedError
+
+ # Raise all other unhandled exceptions.
raise
+ except socket.timeout, e:
+ logger.debug(_("Connection timeout"))
+
+ raise DDNSConnectionTimeoutError
+
def _format_query_args(self, data):
args = []