Silently fall back to the guess the IP address with a remote server
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 12 Aug 2015 00:06:43 +0000 (01:06 +0100)
committerStefan Schantl <stefan.schantl@ipfire.org>
Mon, 2 May 2016 19:44:30 +0000 (21:44 +0200)
For most OSes we do not implement a way to read the current IP
address from the local configuration. In that case ddns used to
throw an exception and stop. This patch changes that in the way
that ddns will fall back to guess the IP address with help
of a remote server.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
src/ddns/system.py

index 0d90ce6..c268ba5 100644 (file)
@@ -66,6 +66,13 @@ class DDNSSystem(object):
                return proxy
 
        def get_local_ip_address(self, proto):
                return proxy
 
        def get_local_ip_address(self, proto):
+               ip_address = self._get_local_ip_address(proto)
+
+               # Check if the IP address is usable and only return it then
+               if self._is_usable_ip_address(proto, ip_address):
+                       return ip_address
+
+       def _get_local_ip_address(self, proto):
                # Legacy code for IPFire 2.
                if self.distro == "ipfire-2" and proto == "ipv4":
                        try:
                # Legacy code for IPFire 2.
                if self.distro == "ipfire-2" and proto == "ipv4":
                        try:
@@ -281,16 +288,18 @@ class DDNSSystem(object):
                guess_ip = self.core.settings.get("guess_external_ip", "true")
                guess_ip = guess_ip in ("true", "yes", "1")
 
                guess_ip = self.core.settings.get("guess_external_ip", "true")
                guess_ip = guess_ip in ("true", "yes", "1")
 
-               # If the external IP address should be used, we just do that.
-               if guess_ip:
-                       return self.guess_external_ip_address(proto)
-
                # Get the local IP address.
                # Get the local IP address.
-               local_ip_address = self.get_local_ip_address(proto)
+               local_ip_address = None
+
+               if not guess_ip:
+                       try:
+                               local_ip_address = self.get_local_ip_address(proto)
+                       except NotImplementedError:
+                               logger.warning(_("Falling back to check the IP address with help of a public server"))
 
 
-               # If the local IP address is not usable, we must guess
-               # the correct IP address...
-               if not self._is_usable_ip_address(proto, local_ip_address):
+               # If no local IP address could be determined, we will fall back to the guess
+               # it with help of an external server...
+               if not local_ip_address:
                        local_ip_address = self.guess_external_ip_address(proto)
 
                return local_ip_address
                        local_ip_address = self.guess_external_ip_address(proto)
 
                return local_ip_address