Merge pull request #1460 from YunoHost/fix-dns-suggest

[fix] Bad DNS conf suggestion
This commit is contained in:
Alexandre Aubin 2022-05-16 15:51:48 +02:00 committed by GitHub
commit 100cd2fdd4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 14 deletions

View file

@ -17,7 +17,11 @@ from yunohost.utils.dns import (
)
from yunohost.diagnosis import Diagnoser
from yunohost.domain import domain_list, _get_maindomain
from yunohost.dns import _build_dns_conf, _get_dns_zone_for_domain
from yunohost.dns import (
_build_dns_conf,
_get_dns_zone_for_domain,
_get_relative_name_for_dns_zone
)
logger = log.getActionLogger("yunohost.diagnosis")
@ -68,7 +72,7 @@ class MyDiagnoser(Diagnoser):
return
base_dns_zone = _get_dns_zone_for_domain(domain)
basename = domain.replace(base_dns_zone, "").rstrip(".") or "@"
basename = _get_relative_name_for_dns_zone(domain, base_dns_zone)
expected_configuration = _build_dns_conf(
domain, include_empty_AAAA_if_no_ipv6=True

View file

@ -183,8 +183,7 @@ def _build_dns_conf(base_domain, include_empty_AAAA_if_no_ipv6=False):
# foo.sub.domain.tld # domain.tld # foo.sub # .foo.sub #
# sub.domain.tld # sub.domain.tld # @ # #
# foo.sub.domain.tld # sub.domain.tld # foo # .foo #
basename = domain.replace(base_dns_zone, "").rstrip(".") or "@"
basename = _get_relative_name_for_dns_zone(domain, base_dns_zone)
suffix = f".{basename}" if basename != "@" else ""
# ttl = settings["ttl"]
@ -467,10 +466,17 @@ def _get_dns_zone_for_domain(domain):
# Until we find the first one that has a NS record
parent_list = [domain.split(".", i)[-1] for i, _ in enumerate(domain.split("."))]
for parent in parent_list:
# We don't wan't to do A NS request on the tld
for parent in parent_list[0:-1]:
# Check if there's a NS record for that domain
answer = dig(parent, rdtype="NS", full_answers=True, resolvers="force_external")
if answer[0] != "ok":
# Some domains have a SOA configured but NO NS record !!!
# See https://github.com/YunoHost/issues/issues/1980
answer = dig(parent, rdtype="SOA", full_answers=True, resolvers="force_external")
if answer[0] == "ok":
mkdir(cache_folder, parents=True, force=True)
write_to_file(cache_file, parent)
@ -482,11 +488,21 @@ def _get_dns_zone_for_domain(domain):
zone = parent_list[-1]
logger.warning(
f"Could not identify the dns zone for domain {domain}, returning {zone}"
f"Could not identify correctly the dns zone for domain {domain}, returning {zone}"
)
return zone
def _get_relative_name_for_dns_zone(domain, base_dns_zone):
# Strip the base dns zone name from a domain such that it's suitable for DNS manipulation relative to a defined zone
# For example, assuming base_dns_zone is "example.tld":
# example.tld -> @
# foo.example.tld -> foo
# .foo.example.tld -> foo
# bar.foo.example.tld -> bar.foo
return re.sub(r"\.?" + base_dns_zone.replace(".", r"\.") + "$", "", domain.strip(".")) or "@"
def _get_registrar_config_section(domain):
from lexicon.providers.auto import _relevant_provider_for_domain
@ -837,14 +853,10 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge=
for record in current:
changes["delete"].append(record)
def relative_name(name):
name = name.strip(".")
name = name.replace("." + base_dns_zone, "")
name = name.replace(base_dns_zone, "@")
return name
def human_readable_record(action, record):
name = relative_name(record["name"])
name = (record["name"])
name = _get_relative_name_for_dns_zone(record['name'], base_dns_zone)
name = name[:20]
t = record["type"]
@ -877,7 +889,7 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge=
if Moulinette.interface.type == "api":
for records in changes.values():
for record in records:
record["name"] = relative_name(record["name"])
record["name"] = _get_relative_name_for_dns_zone(record["name"], base_dns_zone)
return changes
else:
out = {"delete": [], "create": [], "update": [], "unchanged": []}
@ -926,7 +938,7 @@ def domain_dns_push(operation_logger, domain, dry_run=False, force=False, purge=
for record in changes[action]:
relative_name = record["name"].replace(base_dns_zone, "").rstrip(".") or "@"
relative_name = _get_relative_name_for_dns_zone(record['name'], base_dns_zone)
progress(
f"{action} {record['type']:^5} / {relative_name}"
) # FIXME: i18n but meh