From 7dad37ed04ec7e85b0a64ee22629528e892628e7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 18 Jan 2021 19:57:31 +0100 Subject: [PATCH 1/4] Make dyndns update more resilient to ns0.yunohost.org being down --- src/yunohost/dyndns.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index fe2a1bc9b..98d59721a 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -34,7 +34,7 @@ from moulinette import m18n from moulinette.core import MoulinetteError from moulinette.utils.log import getActionLogger from moulinette.utils.filesystem import write_to_file, read_file -from moulinette.utils.network import download_json +from moulinette.utils.network import download_json, dig from moulinette.utils.process import check_output from yunohost.utils.error import YunohostError @@ -216,8 +216,30 @@ def dyndns_update(operation_logger, dyn_host="dyndns.yunohost.org", domain=None, 'zone %s' % host, ] - old_ipv4 = check_output("dig @%s +short %s" % (dyn_host, domain)) or None - old_ipv6 = check_output("dig @%s +short aaaa %s" % (dyn_host, domain)) or None + + def resolve_domain(domain, rdtype): + + ok, result = dig(domain, rdtype, resolvers=[dyn_host]) + if ok == "ok": + return result[0] if len(result) else None + elif result[0] == "Timeout": + logger.debug("Timed-out while trying to resolve %s record for %s using %s" % (rdtype, domain, dyn_host)) + else: + return None + + logger.debug("Falling back to external resolvers") + ok, result = dig(domain, rdtype, resolvers="force_external") + if ok == "ok": + return result[0] if len(result) else None + elif result[0] == "Timeout": + logger.debug("Timed-out while trying to resolve %s record for %s using external resolvers : %s" % (rdtype, domain, result)) + else: + return None + + raise YunohostError("Failed to resolve %s for %s" % (rdtype, domain), raw_msg=True) + + old_ipv4 = resolve_domain(domain, "A") + old_ipv6 = resolve_domain(domain, "AAAA") # Get current IPv4 and IPv6 ipv4_ = get_public_ip() From d5403e5f5f3158fb51f741d6a49b13c3a9641ddc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 18 Jan 2021 20:25:36 +0100 Subject: [PATCH 2/4] Typo --- src/yunohost/dyndns.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 98d59721a..eb03b056e 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -34,12 +34,12 @@ from moulinette import m18n from moulinette.core import MoulinetteError from moulinette.utils.log import getActionLogger from moulinette.utils.filesystem import write_to_file, read_file -from moulinette.utils.network import download_json, dig +from moulinette.utils.network import download_json from moulinette.utils.process import check_output from yunohost.utils.error import YunohostError from yunohost.domain import _get_maindomain, _build_dns_conf -from yunohost.utils.network import get_public_ip +from yunohost.utils.network import get_public_ip, dig from yunohost.log import is_unit_operation logger = getActionLogger('yunohost.dyndns') From e7300859704c9f815d79f7b1ac63cb813d52120b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 18 Jan 2021 20:53:38 +0100 Subject: [PATCH 3/4] Linter is angry about unused import --- src/yunohost/dyndns.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index eb03b056e..84b55d40e 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -35,7 +35,6 @@ from moulinette.core import MoulinetteError from moulinette.utils.log import getActionLogger from moulinette.utils.filesystem import write_to_file, read_file from moulinette.utils.network import download_json -from moulinette.utils.process import check_output from yunohost.utils.error import YunohostError from yunohost.domain import _get_maindomain, _build_dns_conf From 8b05248ad45bfe05ae9205e976798a4e722eaee9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 19 Jan 2021 02:34:28 +0100 Subject: [PATCH 4/4] Turns out we need to feed the IP of the resolver and can't use the doman name :/ --- src/yunohost/dyndns.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 84b55d40e..9904d3955 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -218,7 +218,13 @@ def dyndns_update(operation_logger, dyn_host="dyndns.yunohost.org", domain=None, def resolve_domain(domain, rdtype): - ok, result = dig(domain, rdtype, resolvers=[dyn_host]) + # FIXME make this work for IPv6-only hosts too.. + ok, result = dig(dyn_host, "A") + dyn_host_ip = result[0] if ok == "ok" and len(result) else None + if not dyn_host_ip: + raise YunohostError("Failed to resolve %s" % dyn_host) + + ok, result = dig(domain, rdtype, resolvers=[dyn_host_ip]) if ok == "ok": return result[0] if len(result) else None elif result[0] == "Timeout":