From 483ee8f999dc73e4c66f0a9dffa6a550e9e7e968 Mon Sep 17 00:00:00 2001 From: TooStrong Date: Fri, 20 Feb 2026 17:28:59 +0100 Subject: [PATCH] Update hetznercloud.py Cleaned hidden or bidirectional Unicode text --- .../ddclient/lib/account/hetznercloud.py | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/hetznercloud.py b/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/hetznercloud.py index b431a9bb3..59fcb5a0f 100644 --- a/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/hetznercloud.py +++ b/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/hetznercloud.py @@ -14,6 +14,7 @@ class HetznerCloudDNS(BaseAccount): _services = {"hetznercloud": "Hetzner Cloud DNS"} API_BASE = "https://api.hetzner.cloud/v1" + TIMEOUT = 20 @staticmethod def known_services(): @@ -32,12 +33,17 @@ class HetznerCloudDNS(BaseAccount): } def _zone_id(self, zone_name: str) -> str | None: - # Hetzner Community beschreibt: /zones?name= → zone.id :contentReference[oaicite:4]{index=4} url = f"{self.API_BASE}/zones?name={zone_name}" - r = requests.get(url, headers=self._headers(), timeout=20) + try: + r = requests.get(url, headers=self._headers(), timeout=self.TIMEOUT) + except requests.RequestException as e: + syslog.syslog(syslog.LOG_ERR, f"HetznerCloud: zones lookup failed (request error): {e}") + return None + if not (200 <= r.status_code < 300): syslog.syslog(syslog.LOG_ERR, f"HetznerCloud: zones lookup failed [{r.status_code}] {r.text}") return None + zones = (r.json() or {}).get("zones") or [] for z in zones: if z.get("name") == zone_name and z.get("id"): @@ -46,7 +52,6 @@ class HetznerCloudDNS(BaseAccount): @staticmethod def _split_hostnames(hostnames: str) -> list[str]: - # erlaubt: "a.example.com, b.example.com" oder "a.example.com b.example.com" raw = hostnames.replace(",", " ").split() return [h.strip().rstrip(".") for h in raw if h.strip()] @@ -58,18 +63,22 @@ class HetznerCloudDNS(BaseAccount): return "@" if fqdn.endswith("." + zone): return fqdn[: -(len(zone) + 1)] - # falls jemand "home" statt "home.example.com" einträgt: if "." not in fqdn: return fqdn return fqdn def _set_rrset(self, zone_id: str, rr_name: str, rr_type: str, value: str) -> bool: - # RRset ersetzen via set_records :contentReference[oaicite:5]{index=5} url = f"{self.API_BASE}/zones/{zone_id}/rrsets/{rr_name}/{rr_type}/actions/set_records" body = {"records": [{"value": value}]} - r = requests.post(url, headers=self._headers(), json=body, timeout=20) + try: + r = requests.post(url, headers=self._headers(), json=body, timeout=self.TIMEOUT) + except requests.RequestException as e: + syslog.syslog(syslog.LOG_ERR, f"HetznerCloud: set_records failed (request error): {e}") + return False + if 200 <= r.status_code < 300: return True + syslog.syslog(syslog.LOG_ERR, f"HetznerCloud: set_records failed [{r.status_code}] {r.text}") return False