dyndns: handle too many requests in availability testing

This commit is contained in:
axolotle 2023-09-24 17:13:33 +02:00
parent 5110cd0800
commit cbb85f8c3b
2 changed files with 14 additions and 4 deletions

View file

@ -396,6 +396,7 @@
"downloading": "Downloading...", "downloading": "Downloading...",
"dpkg_is_broken": "You cannot do this right now because dpkg/APT (the system package managers) seems to be in a broken state... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a` and/or `sudo dpkg --audit`.", "dpkg_is_broken": "You cannot do this right now because dpkg/APT (the system package managers) seems to be in a broken state... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a` and/or `sudo dpkg --audit`.",
"dpkg_lock_not_available": "This command can't be run right now because another program seems to be using the lock of dpkg (the system package manager)", "dpkg_lock_not_available": "This command can't be run right now because another program seems to be using the lock of dpkg (the system package manager)",
"dyndns_availability_too_many_requests": "YunoHost's free domain service received too many requests from you, wait 1 minute or so before trying again.",
"dyndns_could_not_check_available": "Could not check if {domain} is available on {provider}.", "dyndns_could_not_check_available": "Could not check if {domain} is available on {provider}.",
"dyndns_domain_not_provided": "DynDNS provider {provider} cannot provide domain {domain}.", "dyndns_domain_not_provided": "DynDNS provider {provider} cannot provide domain {domain}.",
"dyndns_ip_update_failed": "Could not update IP address to DynDNS", "dyndns_ip_update_failed": "Could not update IP address to DynDNS",

View file

@ -63,19 +63,28 @@ def _dyndns_available(domain):
Returns: Returns:
True if the domain is available, False otherwise. True if the domain is available, False otherwise.
""" """
import requests # lazy loading this module for performance reasons
logger.debug(f"Checking if domain {domain} is available on {DYNDNS_PROVIDER} ...") logger.debug(f"Checking if domain {domain} is available on {DYNDNS_PROVIDER} ...")
try: try:
r = download_json( r = requests.get(f"https://{DYNDNS_PROVIDER}/test/{domain}", timeout=30)
f"https://{DYNDNS_PROVIDER}/test/{domain}", expected_status_code=None
)
except MoulinetteError as e: except MoulinetteError as e:
logger.error(str(e)) logger.error(str(e))
raise YunohostError( raise YunohostError(
"dyndns_could_not_check_available", domain=domain, provider=DYNDNS_PROVIDER "dyndns_could_not_check_available", domain=domain, provider=DYNDNS_PROVIDER
) )
return r == f"Domain {domain} is available" if r.status_code == 200:
return r == f"Domain {domain} is available"
elif r.status_code == 409:
return False
elif r.status_code == 429:
raise YunohostValidationError("dyndns_availability_too_many_requests")
else:
raise YunohostError(
"dyndns_could_not_check_available", domain=domain, provider=DYNDNS_PROVIDER
)
@is_unit_operation(exclude=["recovery_password"]) @is_unit_operation(exclude=["recovery_password"])