From a7ca49617985b877312d36df16dbf9f3fa434a86 Mon Sep 17 00:00:00 2001 From: HJS72 Date: Mon, 4 May 2026 12:56:45 +0200 Subject: [PATCH 1/7] feat: add IP placeholder support for custom update URL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the Custom provider mode, the configured update URL now supports\nplaceholders that are replaced with the current IP at runtime:\n\n- {{ipv4}} → current public IPv4\n- {{ipv6}} → current public IPv6\n- {{ip}} → current IP (v4 in IPv4 update, v6 in IPv6 update)\n\nDocumented in README.md. --- README.md | 13 +++++++++++++ src/main.ts | 8 ++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 089cbbc..d5b9d93 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,19 @@ The following DynDNS providers are currently supported: When selecting `Custom`, it is possible to specify a direct update URL in order to integrate any provider that supports this. +The following placeholders can be used in the custom URL and will be replaced with the current IP address at runtime: + +| Placeholder | Description | +|---|---| +| `{{ipv4}}` | Current public IPv4 address | +| `{{ipv6}}` | Current public IPv6 address | +| `{{ip}}` | Current IP address (IPv4 in the IPv4 update, IPv6 in the IPv6 update) | + +**Example:** +``` +https://dynupdate.example.com/update?hostname=myhome.example.com&myip={{ipv4}}&token=abc123 +``` + --- ## Adapter configuration diff --git a/src/main.ts b/src/main.ts index d50391c..3d279f5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -179,7 +179,9 @@ class Dnscope extends utils.Adapter { username = this.config.noipUser; break; case 'custom': - url = this.config.customURL; + url = this.config.customURL + .replace(/\{\{ipv4\}\}/gi, currentIPv4 ?? '') + .replace(/\{\{ip\}\}/gi, currentIPv4 ?? ''); break; case 'dynv6': url = `https://ipv4.dynv6.com/api/update?ipv4=${currentIPv4}&token=${this.config.dynv6Token}`; @@ -222,7 +224,9 @@ class Dnscope extends utils.Adapter { username = this.config.noipUser; break; case 'custom': - url = this.config.customURL; + url = this.config.customURL + .replace(/\{\{ipv6\}\}/gi, currentIPv6 ?? '') + .replace(/\{\{ip\}\}/gi, currentIPv6 ?? ''); break; case 'dynv6': url = `https://ipv6.dynv6.com/api/update?ipv6=${currentIPv6}&token=${this.config.dynv6Token}`; From 7334b59cce51f09a22c25a75dec4d19dab2f185c Mon Sep 17 00:00:00 2001 From: HJS72 Date: Mon, 4 May 2026 13:00:37 +0200 Subject: [PATCH 2/7] chore: release v0.3.0 --- README.md | 3 +++ io-package.json | 15 ++++++++++++++- package.json | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d5b9d93..0458d1d 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,9 @@ If you have several domains that are to be updated, you need one instance per do --- ## Changelog +### 0.3.0 (2026-05-04) +* (HJS72) Add IP placeholder support for custom update URL (`{{ipv4}}`, `{{ipv6}}`, `{{ip}}`) + ### 0.2.9 (2026-04-26) * (simatec) dependencies updated * (simatec) Source code cleaned up diff --git a/io-package.json b/io-package.json index a63953c..0c8957a 100644 --- a/io-package.json +++ b/io-package.json @@ -1,8 +1,21 @@ { "common": { "name": "dnscope", - "version": "0.2.9", + "version": "0.3.0", "news": { + "0.3.0": { + "en": "Add IP placeholder support for custom update URL", + "de": "IP-Platzhalterunterstützung für benutzerdefinierte Update-URL hinzugefügt", + "ru": "Добавлена поддержка плейсхолдеров IP для пользовательского URL обновления", + "pt": "Suporte a placeholder de IP para URL de atualização personalizada", + "nl": "IP-placeholder ondersteuning toegevoegd voor aangepaste update-URL", + "fr": "Ajout du support des espaces réservés IP pour l'URL de mise à jour personnalisée", + "it": "Aggiunto supporto placeholder IP per URL di aggiornamento personalizzato", + "es": "Soporte de marcadores de posición de IP para URL de actualización personalizada", + "pl": "Dodano obsługę symboli zastępczych IP dla niestandardowego adresu URL aktualizacji", + "uk": "Додано підтримку заповнювачів IP для користувацької URL оновлення", + "zh-cn": "为自定义更新URL添加IP占位符支持" + }, "0.2.9": { "en": "dependencies updated\nSource code cleaned up", "de": "aktualisierte abhängigkeiten\nQuellcode aufgeräumt", diff --git a/package.json b/package.json index 667cda3..573e642 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.dnscope", - "version": "0.2.9", + "version": "0.3.0", "description": "DNScope is a Dynamic DNS Updater", "author": { "name": "simatec", From baab55b076e79e90a88cbe989c90f1bcf9a1e6e3 Mon Sep 17 00:00:00 2001 From: HJS72 Date: Mon, 4 May 2026 14:43:02 +0200 Subject: [PATCH 3/7] fix: skip DNS update when IP address could not be determined --- src/main.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main.ts b/src/main.ts index 3d279f5..992143d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -161,6 +161,10 @@ class Dnscope extends utils.Adapter { } private async updateDNSv4(currentIPv4: string | null): Promise { + if (!currentIPv4) { + this.log.warn('IPv4 address could not be determined, skipping update'); + return null; + } let url = '' as string; let username = null as null | string; let password = null as null | string; @@ -206,6 +210,10 @@ class Dnscope extends utils.Adapter { } private async updateDNSv6(currentIPv6: string | null): Promise { + if (!currentIPv6) { + this.log.warn('IPv6 address could not be determined, skipping update'); + return null; + } let url = ''; let username = null; let password = null; From 27396df6a86ca258ae9c10a77c499cb9931ccc89 Mon Sep 17 00:00:00 2001 From: HJS72 Date: Mon, 4 May 2026 14:45:04 +0200 Subject: [PATCH 4/7] fix: log update request URL in debug output --- src/main.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.ts b/src/main.ts index 992143d..d2be5eb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -200,6 +200,7 @@ class Dnscope extends utils.Adapter { auth: username && password ? { username, password } : undefined, }; + this.log.debug(`IPv4 update request URL: ${url}`); const response = await axios(config); this.log.debug(`DNS Update State for IPv4: ${JSON.stringify(response.data)}`); return 'OK'; @@ -249,6 +250,7 @@ class Dnscope extends utils.Adapter { auth: username && password ? { username, password } : undefined, }; + this.log.debug(`IPv6 update request URL: ${url}`); const response = await axios(config); this.log.debug(`DNS Update State for IPv6: ${JSON.stringify(response.data)}`); return 'OK'; From ff7300f791918152bf8b2ad7c570e8e43cfe93c2 Mon Sep 17 00:00:00 2001 From: HJS72 Date: Mon, 4 May 2026 14:46:27 +0200 Subject: [PATCH 5/7] chore: release v0.3.1 --- README.md | 4 ++++ io-package.json | 15 ++++++++++++++- package.json | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0458d1d..b0ce14b 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,10 @@ If you have several domains that are to be updated, you need one instance per do --- ## Changelog +### 0.3.1 (2026-05-04) +* (HJS72) Fix HTTP 400 error when IP address could not be determined (skip update instead) +* (HJS72) Add debug log output for the full update request URL + ### 0.3.0 (2026-05-04) * (HJS72) Add IP placeholder support for custom update URL (`{{ipv4}}`, `{{ipv6}}`, `{{ip}}`) diff --git a/io-package.json b/io-package.json index 0c8957a..e28b2cd 100644 --- a/io-package.json +++ b/io-package.json @@ -1,8 +1,21 @@ { "common": { "name": "dnscope", - "version": "0.3.0", + "version": "0.3.1", "news": { + "0.3.1": { + "en": "Fix status 400 error when IP is unavailable; add debug log for update URL", + "de": "Fehler 400 behoben wenn IP nicht verf\u00fcgbar; Debug-Log f\u00fcr Update-URL hinzugef\u00fcgt", + "ru": "\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 400 \u043f\u0440\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 IP; \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d Debug-\u041b\u043e\u0433 \u0434\u043b\u044f URL \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", + "pt": "Corrigido erro 400 quando IP indispon\u00edvel; log de debug para URL de atualiza\u00e7\u00e3o", + "nl": "Fout 400 opgelost bij onbeschikbaar IP; debug-log voor update-URL toegevoegd", + "fr": "Correction erreur 400 quand IP indisponible; log de d\u00e9bogage pour l'URL de mise \u00e0 jour", + "it": "Corretto errore 400 quando IP non disponibile; aggiunto log di debug per URL aggiornamento", + "es": "Corregido error 400 cuando IP no disponible; log de depuraci\u00f3n para URL de actualizaci\u00f3n", + "pl": "Naprawiono b\u0142\u0105d 400 gdy IP niedost\u0119pne; dodano log debugowania dla URL aktualizacji", + "uk": "\u0412\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u043c\u0438\u043b\u043a\u0443 400 \u043f\u0440\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0456 IP; \u0434\u043e\u0434\u0430\u043d\u043e debug-\u043b\u043e\u0433 \u0434\u043b\u044f URL \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f", + "zh-cn": "\u4fee\u590d\u4e86IP\u4e0d\u53ef\u7528\u65f6\u72b4\u9519\u8bef400\uff1b\u6dfb\u52a0\u4e86\u66f4\u65b0URL\u7684\u8c03\u8bd5\u65e5\u5fd7" + }, "0.3.0": { "en": "Add IP placeholder support for custom update URL", "de": "IP-Platzhalterunterstützung für benutzerdefinierte Update-URL hinzugefügt", diff --git a/package.json b/package.json index 573e642..4e00138 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.dnscope", - "version": "0.3.0", + "version": "0.3.1", "description": "DNScope is a Dynamic DNS Updater", "author": { "name": "simatec", From 59dc00c786a97c08a4124a18babb0da5180b725e Mon Sep 17 00:00:00 2001 From: HJS72 Date: Mon, 4 May 2026 14:53:55 +0200 Subject: [PATCH 6/7] chore: add detailed debug diagnostics for DNS update errors --- src/main.ts | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index d2be5eb..14031eb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -170,6 +170,8 @@ class Dnscope extends utils.Adapter { let password = null as null | string; const domain: string = this.config.domain; + this.log.debug(`IPv4 update provider: ${this.config.dyndnsServive}, domain: ${domain}, current IP: ${currentIPv4}`); + switch (this.config.dyndnsServive) { case 'duckdns': url = `https://www.duckdns.org/update?domains=${domain.split('.')[0]}&token=${this.config.duckdnsToken}&ip=${currentIPv4}`; @@ -201,11 +203,20 @@ class Dnscope extends utils.Adapter { }; this.log.debug(`IPv4 update request URL: ${url}`); + this.log.debug(`IPv4 request auth enabled: ${config.auth ? 'yes' : 'no'}, timeout: ${config.timeout}`); const response = await axios(config); this.log.debug(`DNS Update State for IPv4: ${JSON.stringify(response.data)}`); return 'OK'; } catch (error) { - this.log.error(`Error in the request for IPv4: ${error.message}`); + if (axios.isAxiosError(error)) { + this.log.error(`Error in the request for IPv4: ${error.message}`); + this.log.debug(`IPv4 response status: ${error.response?.status ?? 'unknown'}`); + this.log.debug(`IPv4 response status text: ${error.response?.statusText ?? 'unknown'}`); + this.log.debug(`IPv4 response body: ${JSON.stringify(error.response?.data ?? 'no response body')}`); + this.log.debug(`IPv4 response headers: ${JSON.stringify(error.response?.headers ?? 'no response headers')}`); + } else { + this.log.error(`Error in the request for IPv4: ${String(error)}`); + } return 'not OK'; } } @@ -220,6 +231,8 @@ class Dnscope extends utils.Adapter { let password = null; const domain = this.config.domain; + this.log.debug(`IPv6 update provider: ${this.config.dyndnsServive}, domain: ${domain}, current IP: ${currentIPv6}`); + switch (this.config.dyndnsServive) { case 'duckdns': url = `https://www.duckdns.org/update?domains=${domain.split('.')[0]}&token=${this.config.duckdnsToken}&ipv6=${currentIPv6}`; @@ -251,11 +264,20 @@ class Dnscope extends utils.Adapter { }; this.log.debug(`IPv6 update request URL: ${url}`); + this.log.debug(`IPv6 request auth enabled: ${config.auth ? 'yes' : 'no'}, timeout: ${config.timeout}`); const response = await axios(config); this.log.debug(`DNS Update State for IPv6: ${JSON.stringify(response.data)}`); return 'OK'; } catch (error) { - this.log.error(`Error in the request for IPv6: ${error.message}`); + if (axios.isAxiosError(error)) { + this.log.error(`Error in the request for IPv6: ${error.message}`); + this.log.debug(`IPv6 response status: ${error.response?.status ?? 'unknown'}`); + this.log.debug(`IPv6 response status text: ${error.response?.statusText ?? 'unknown'}`); + this.log.debug(`IPv6 response body: ${JSON.stringify(error.response?.data ?? 'no response body')}`); + this.log.debug(`IPv6 response headers: ${JSON.stringify(error.response?.headers ?? 'no response headers')}`); + } else { + this.log.error(`Error in the request for IPv6: ${String(error)}`); + } return 'not OK'; } } From 28cd98bd8e0f76c548233b3663b0a4d22c7695d4 Mon Sep 17 00:00:00 2001 From: HJS72 Date: Mon, 4 May 2026 15:01:08 +0200 Subject: [PATCH 7/7] chore: release v0.3.2 --- README.md | 4 ++++ build/main.js | 40 ++++++++++++++++++++++++++++++++++++---- build/main.js.map | 4 ++-- io-package.json | 15 ++++++++++++++- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 59 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b0ce14b..a76f615 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,10 @@ If you have several domains that are to be updated, you need one instance per do --- ## Changelog +### 0.3.2 (2026-05-04) +* (HJS72) Add detailed debug diagnostics for failed update requests (HTTP status, body, and headers) +* (HJS72) Ship compiled build output with the latest logging changes + ### 0.3.1 (2026-05-04) * (HJS72) Fix HTTP 400 error when IP address could not be determined (skip update instead) * (HJS72) Add debug log output for the full update request URL diff --git a/build/main.js b/build/main.js index 20fe90b..67f8abc 100644 --- a/build/main.js +++ b/build/main.js @@ -161,10 +161,16 @@ class Dnscope extends utils.Adapter { } } async updateDNSv4(currentIPv4) { + var _a, _b, _c, _d, _e, _f, _g, _h; + if (!currentIPv4) { + this.log.warn("IPv4 address could not be determined, skipping update"); + return null; + } let url = ""; let username = null; let password = null; const domain = this.config.domain; + this.log.debug(`IPv4 update provider: ${this.config.dyndnsServive}, domain: ${domain}, current IP: ${currentIPv4}`); switch (this.config.dyndnsServive) { case "duckdns": url = `https://www.duckdns.org/update?domains=${domain.split(".")[0]}&token=${this.config.duckdnsToken}&ip=${currentIPv4}`; @@ -178,7 +184,7 @@ class Dnscope extends utils.Adapter { username = this.config.noipUser; break; case "custom": - url = this.config.customURL; + url = this.config.customURL.replace(/\{\{ipv4\}\}/gi, currentIPv4 != null ? currentIPv4 : "").replace(/\{\{ip\}\}/gi, currentIPv4 != null ? currentIPv4 : ""); break; case "dynv6": url = `https://ipv4.dynv6.com/api/update?ipv4=${currentIPv4}&token=${this.config.dynv6Token}`; @@ -191,19 +197,35 @@ class Dnscope extends utils.Adapter { timeout: 1e4, auth: username && password ? { username, password } : void 0 }; + this.log.debug(`IPv4 update request URL: ${url}`); + this.log.debug(`IPv4 request auth enabled: ${config.auth ? "yes" : "no"}, timeout: ${config.timeout}`); const response = await (0, import_axios.default)(config); this.log.debug(`DNS Update State for IPv4: ${JSON.stringify(response.data)}`); return "OK"; } catch (error) { - this.log.error(`Error in the request for IPv4: ${error.message}`); + if (import_axios.default.isAxiosError(error)) { + this.log.error(`Error in the request for IPv4: ${error.message}`); + this.log.debug(`IPv4 response status: ${(_b = (_a = error.response) == null ? void 0 : _a.status) != null ? _b : "unknown"}`); + this.log.debug(`IPv4 response status text: ${(_d = (_c = error.response) == null ? void 0 : _c.statusText) != null ? _d : "unknown"}`); + this.log.debug(`IPv4 response body: ${JSON.stringify((_f = (_e = error.response) == null ? void 0 : _e.data) != null ? _f : "no response body")}`); + this.log.debug(`IPv4 response headers: ${JSON.stringify((_h = (_g = error.response) == null ? void 0 : _g.headers) != null ? _h : "no response headers")}`); + } else { + this.log.error(`Error in the request for IPv4: ${String(error)}`); + } return "not OK"; } } async updateDNSv6(currentIPv6) { + var _a, _b, _c, _d, _e, _f, _g, _h; + if (!currentIPv6) { + this.log.warn("IPv6 address could not be determined, skipping update"); + return null; + } let url = ""; let username = null; let password = null; const domain = this.config.domain; + this.log.debug(`IPv6 update provider: ${this.config.dyndnsServive}, domain: ${domain}, current IP: ${currentIPv6}`); switch (this.config.dyndnsServive) { case "duckdns": url = `https://www.duckdns.org/update?domains=${domain.split(".")[0]}&token=${this.config.duckdnsToken}&ipv6=${currentIPv6}`; @@ -217,7 +239,7 @@ class Dnscope extends utils.Adapter { username = this.config.noipUser; break; case "custom": - url = this.config.customURL; + url = this.config.customURL.replace(/\{\{ipv6\}\}/gi, currentIPv6 != null ? currentIPv6 : "").replace(/\{\{ip\}\}/gi, currentIPv6 != null ? currentIPv6 : ""); break; case "dynv6": url = `https://ipv6.dynv6.com/api/update?ipv6=${currentIPv6}&token=${this.config.dynv6Token}`; @@ -230,11 +252,21 @@ class Dnscope extends utils.Adapter { timeout: 1e4, auth: username && password ? { username, password } : void 0 }; + this.log.debug(`IPv6 update request URL: ${url}`); + this.log.debug(`IPv6 request auth enabled: ${config.auth ? "yes" : "no"}, timeout: ${config.timeout}`); const response = await (0, import_axios.default)(config); this.log.debug(`DNS Update State for IPv6: ${JSON.stringify(response.data)}`); return "OK"; } catch (error) { - this.log.error(`Error in the request for IPv6: ${error.message}`); + if (import_axios.default.isAxiosError(error)) { + this.log.error(`Error in the request for IPv6: ${error.message}`); + this.log.debug(`IPv6 response status: ${(_b = (_a = error.response) == null ? void 0 : _a.status) != null ? _b : "unknown"}`); + this.log.debug(`IPv6 response status text: ${(_d = (_c = error.response) == null ? void 0 : _c.statusText) != null ? _d : "unknown"}`); + this.log.debug(`IPv6 response body: ${JSON.stringify((_f = (_e = error.response) == null ? void 0 : _e.data) != null ? _f : "no response body")}`); + this.log.debug(`IPv6 response headers: ${JSON.stringify((_h = (_g = error.response) == null ? void 0 : _g.headers) != null ? _h : "no response headers")}`); + } else { + this.log.error(`Error in the request for IPv6: ${String(error)}`); + } return "not OK"; } } diff --git a/build/main.js.map b/build/main.js.map index a15ee52..7c427c7 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/main.ts"], - "sourcesContent": ["'use strict';\n\nimport * as utils from '@iobroker/adapter-core';\nimport axios, { type AxiosRequestConfig } from 'axios';\nimport { promises as dns } from 'node:dns';\n\nclass Dnscope extends utils.Adapter {\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: 'dnscope',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('unload', this.onUnload.bind(this));\n }\n\n private async onReady(): Promise {\n try {\n const instObj = await this.getForeignObjectAsync(`system.adapter.${this.namespace}`);\n if (instObj?.common.schedule && instObj.common.schedule === '*/10 * * * *') {\n instObj.common.schedule = `${Math.floor(Math.random() * 60)} */10 * * * *`;\n\n this.log.info(`Default schedule found and adjusted to spread calls better!`);\n await this.setForeignObject(`system.adapter.${this.namespace}`, instObj);\n\n this.terminate ? this.terminate() : process.exit(0);\n return;\n }\n } catch (err) {\n this.log.error(`Could not check or adjust the schedule: ${err.message}`);\n }\n\n if (this.config.ipv4) {\n const currentIP: string | null = await this.checkipv4();\n const lastIP: string | null = await this.resolveDNSv4(this.config.domain);\n if ((this.config.onlyChanges && currentIP !== lastIP) || !this.config.onlyChanges) {\n await this.updateDNSv4(currentIP);\n } else {\n this.log.debug('no changes for IPv4');\n }\n }\n\n if (this.config.ipv6) {\n const currentIP: string | null = await this.checkipv6();\n const lastIP: string | null = await this.resolveDNSv6(this.config.domain);\n if ((this.config.onlyChanges && currentIP !== lastIP) || !this.config.onlyChanges) {\n await this.updateDNSv6(currentIP);\n } else {\n this.log.debug('no changes for IPv6');\n }\n }\n\n await this.delay(10_000);\n this.terminate ? this.terminate() : process.exit(0);\n }\n\n private onUnload(callback: () => void): void {\n try {\n this.log.debug('cleaned everything up...');\n callback();\n } catch (e) {\n this.log.error(`Unload Error: ${e}`);\n callback();\n }\n }\n\n private async checkipv4(): Promise {\n const url = 'https://ipinfo.io/json';\n try {\n const dataRequest = await axios({\n method: 'get',\n url: url,\n timeout: 10000,\n responseType: 'json',\n });\n\n const data = dataRequest.data;\n\n await this.setObjectNotExistsAsync('data.currentIPv4', {\n type: 'state',\n common: {\n name: 'current IPv4',\n type: 'string',\n role: 'info.ip',\n read: true,\n write: false,\n },\n native: {},\n });\n const state = await this.getStateAsync('data.currentIPv4');\n\n if (data?.ip !== state?.val) {\n await this.setStateChangedAsync('data.currentIPv4', data?.ip ? data.ip : 'not available', true);\n }\n return data?.ip;\n\n this.log.debug(JSON.stringify(dataRequest.data));\n } catch (error) {\n this.log.warn(`ipinfo.io is not available: ${error.toString()}`);\n return null;\n }\n }\n\n private async checkipv6(): Promise {\n const url = 'https://v6.ipinfo.io/json';\n try {\n const dataRequest = await axios({\n method: 'get',\n url: url,\n timeout: 10000,\n responseType: 'json',\n });\n\n const data = dataRequest.data;\n\n await this.setObjectNotExistsAsync('data.currentIPv6', {\n type: 'state',\n common: {\n name: 'current IPv6',\n type: 'string',\n role: 'info.ip',\n read: true,\n write: false,\n },\n native: {},\n });\n const state = await this.getStateAsync('data.currentIPv6');\n\n if (data?.ip !== state?.val) {\n await this.setStateChangedAsync('data.currentIPv6', data?.ip ? data.ip : 'not available', true);\n }\n return data?.ip;\n\n this.log.debug(JSON.stringify(dataRequest.data));\n } catch (error) {\n this.log.warn(`ipinfo.io is not available: ${error.toString()}`);\n return null;\n }\n }\n\n private async resolveDNSv4(domain: string): Promise {\n try {\n const addresses: string | null = (await dns.resolve4(domain)).toString();\n this.log.debug(`IPv4 for ${domain}: ${addresses}`);\n return addresses;\n } catch (error) {\n this.log.warn(`Error during DNS resolution: ${error.toString()}`);\n return null;\n }\n }\n\n private async resolveDNSv6(domain: string): Promise {\n try {\n const addresses: string | null = (await dns.resolve6(domain)).toString();\n this.log.debug(`IPv6 for ${domain}: ${addresses}`);\n return addresses;\n } catch (error) {\n this.log.warn(`Error during DNS resolution: ${error.toString()}`);\n return null;\n }\n }\n\n private async updateDNSv4(currentIPv4: string | null): Promise {\n let url = '' as string;\n let username = null as null | string;\n let password = null as null | string;\n const domain: string = this.config.domain;\n\n switch (this.config.dyndnsServive) {\n case 'duckdns':\n url = `https://www.duckdns.org/update?domains=${domain.split('.')[0]}&token=${this.config.duckdnsToken}&ip=${currentIPv4}`;\n break;\n case 'ipv64':\n url = `https://ipv64.net/update.php?key=${this.config.ipv64Token}&domain=${domain}&ip=${currentIPv4}`;\n break;\n case 'noip':\n url = `https://dynupdate.no-ip.com/nic/update?hostname=${domain}&myip=${currentIPv4}`;\n password = this.config.noipPassword;\n username = this.config.noipUser;\n break;\n case 'custom':\n url = this.config.customURL;\n break;\n case 'dynv6':\n url = `https://ipv4.dynv6.com/api/update?ipv4=${currentIPv4}&token=${this.config.dynv6Token}`;\n break;\n }\n\n try {\n const config: AxiosRequestConfig = {\n method: 'get',\n url: url,\n timeout: 10_000,\n auth: username && password ? { username, password } : undefined,\n };\n\n const response = await axios(config);\n this.log.debug(`DNS Update State for IPv4: ${JSON.stringify(response.data)}`);\n return 'OK';\n } catch (error) {\n this.log.error(`Error in the request for IPv4: ${error.message}`);\n return 'not OK';\n }\n }\n\n private async updateDNSv6(currentIPv6: string | null): Promise {\n let url = '';\n let username = null;\n let password = null;\n const domain = this.config.domain;\n\n switch (this.config.dyndnsServive) {\n case 'duckdns':\n url = `https://www.duckdns.org/update?domains=${domain.split('.')[0]}&token=${this.config.duckdnsToken}&ipv6=${currentIPv6}`;\n break;\n case 'ipv64':\n url = `https://ipv64.net/nic/update?key=${this.config.ipv64Token}&domain=${domain}&ip6=${currentIPv6}`;\n break;\n case 'noip':\n url = `https://dynupdate.no-ip.com/nic/update?hostname=${domain}&myip=${currentIPv6}`;\n password = this.config.noipPassword;\n username = this.config.noipUser;\n break;\n case 'custom':\n url = this.config.customURL;\n break;\n case 'dynv6':\n url = `https://ipv6.dynv6.com/api/update?ipv6=${currentIPv6}&token=${this.config.dynv6Token}`;\n break;\n }\n\n try {\n const config: AxiosRequestConfig = {\n method: 'get',\n url: url,\n timeout: 10000,\n auth: username && password ? { username, password } : undefined,\n };\n\n const response = await axios(config);\n this.log.debug(`DNS Update State for IPv6: ${JSON.stringify(response.data)}`);\n return 'OK';\n } catch (error) {\n this.log.error(`Error in the request for IPv6: ${error.message}`);\n return 'not OK';\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial | undefined) => new Dnscope(options);\n} else {\n // otherwise start the instance directly\n (() => new Dnscope())();\n}\n"], - "mappings": "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", + "sourcesContent": ["'use strict';\n\nimport * as utils from '@iobroker/adapter-core';\nimport axios, { type AxiosRequestConfig } from 'axios';\nimport { promises as dns } from 'node:dns';\n\nclass Dnscope extends utils.Adapter {\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: 'dnscope',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('unload', this.onUnload.bind(this));\n }\n\n private async onReady(): Promise {\n try {\n const instObj = await this.getForeignObjectAsync(`system.adapter.${this.namespace}`);\n if (instObj?.common.schedule && instObj.common.schedule === '*/10 * * * *') {\n instObj.common.schedule = `${Math.floor(Math.random() * 60)} */10 * * * *`;\n\n this.log.info(`Default schedule found and adjusted to spread calls better!`);\n await this.setForeignObject(`system.adapter.${this.namespace}`, instObj);\n\n this.terminate ? this.terminate() : process.exit(0);\n return;\n }\n } catch (err) {\n this.log.error(`Could not check or adjust the schedule: ${err.message}`);\n }\n\n if (this.config.ipv4) {\n const currentIP: string | null = await this.checkipv4();\n const lastIP: string | null = await this.resolveDNSv4(this.config.domain);\n if ((this.config.onlyChanges && currentIP !== lastIP) || !this.config.onlyChanges) {\n await this.updateDNSv4(currentIP);\n } else {\n this.log.debug('no changes for IPv4');\n }\n }\n\n if (this.config.ipv6) {\n const currentIP: string | null = await this.checkipv6();\n const lastIP: string | null = await this.resolveDNSv6(this.config.domain);\n if ((this.config.onlyChanges && currentIP !== lastIP) || !this.config.onlyChanges) {\n await this.updateDNSv6(currentIP);\n } else {\n this.log.debug('no changes for IPv6');\n }\n }\n\n await this.delay(10_000);\n this.terminate ? this.terminate() : process.exit(0);\n }\n\n private onUnload(callback: () => void): void {\n try {\n this.log.debug('cleaned everything up...');\n callback();\n } catch (e) {\n this.log.error(`Unload Error: ${e}`);\n callback();\n }\n }\n\n private async checkipv4(): Promise {\n const url = 'https://ipinfo.io/json';\n try {\n const dataRequest = await axios({\n method: 'get',\n url: url,\n timeout: 10000,\n responseType: 'json',\n });\n\n const data = dataRequest.data;\n\n await this.setObjectNotExistsAsync('data.currentIPv4', {\n type: 'state',\n common: {\n name: 'current IPv4',\n type: 'string',\n role: 'info.ip',\n read: true,\n write: false,\n },\n native: {},\n });\n const state = await this.getStateAsync('data.currentIPv4');\n\n if (data?.ip !== state?.val) {\n await this.setStateChangedAsync('data.currentIPv4', data?.ip ? data.ip : 'not available', true);\n }\n return data?.ip;\n\n this.log.debug(JSON.stringify(dataRequest.data));\n } catch (error) {\n this.log.warn(`ipinfo.io is not available: ${error.toString()}`);\n return null;\n }\n }\n\n private async checkipv6(): Promise {\n const url = 'https://v6.ipinfo.io/json';\n try {\n const dataRequest = await axios({\n method: 'get',\n url: url,\n timeout: 10000,\n responseType: 'json',\n });\n\n const data = dataRequest.data;\n\n await this.setObjectNotExistsAsync('data.currentIPv6', {\n type: 'state',\n common: {\n name: 'current IPv6',\n type: 'string',\n role: 'info.ip',\n read: true,\n write: false,\n },\n native: {},\n });\n const state = await this.getStateAsync('data.currentIPv6');\n\n if (data?.ip !== state?.val) {\n await this.setStateChangedAsync('data.currentIPv6', data?.ip ? data.ip : 'not available', true);\n }\n return data?.ip;\n\n this.log.debug(JSON.stringify(dataRequest.data));\n } catch (error) {\n this.log.warn(`ipinfo.io is not available: ${error.toString()}`);\n return null;\n }\n }\n\n private async resolveDNSv4(domain: string): Promise {\n try {\n const addresses: string | null = (await dns.resolve4(domain)).toString();\n this.log.debug(`IPv4 for ${domain}: ${addresses}`);\n return addresses;\n } catch (error) {\n this.log.warn(`Error during DNS resolution: ${error.toString()}`);\n return null;\n }\n }\n\n private async resolveDNSv6(domain: string): Promise {\n try {\n const addresses: string | null = (await dns.resolve6(domain)).toString();\n this.log.debug(`IPv6 for ${domain}: ${addresses}`);\n return addresses;\n } catch (error) {\n this.log.warn(`Error during DNS resolution: ${error.toString()}`);\n return null;\n }\n }\n\n private async updateDNSv4(currentIPv4: string | null): Promise {\n if (!currentIPv4) {\n this.log.warn('IPv4 address could not be determined, skipping update');\n return null;\n }\n let url = '' as string;\n let username = null as null | string;\n let password = null as null | string;\n const domain: string = this.config.domain;\n\n this.log.debug(`IPv4 update provider: ${this.config.dyndnsServive}, domain: ${domain}, current IP: ${currentIPv4}`);\n\n switch (this.config.dyndnsServive) {\n case 'duckdns':\n url = `https://www.duckdns.org/update?domains=${domain.split('.')[0]}&token=${this.config.duckdnsToken}&ip=${currentIPv4}`;\n break;\n case 'ipv64':\n url = `https://ipv64.net/update.php?key=${this.config.ipv64Token}&domain=${domain}&ip=${currentIPv4}`;\n break;\n case 'noip':\n url = `https://dynupdate.no-ip.com/nic/update?hostname=${domain}&myip=${currentIPv4}`;\n password = this.config.noipPassword;\n username = this.config.noipUser;\n break;\n case 'custom':\n url = this.config.customURL\n .replace(/\\{\\{ipv4\\}\\}/gi, currentIPv4 ?? '')\n .replace(/\\{\\{ip\\}\\}/gi, currentIPv4 ?? '');\n break;\n case 'dynv6':\n url = `https://ipv4.dynv6.com/api/update?ipv4=${currentIPv4}&token=${this.config.dynv6Token}`;\n break;\n }\n\n try {\n const config: AxiosRequestConfig = {\n method: 'get',\n url: url,\n timeout: 10_000,\n auth: username && password ? { username, password } : undefined,\n };\n\n this.log.debug(`IPv4 update request URL: ${url}`);\n this.log.debug(`IPv4 request auth enabled: ${config.auth ? 'yes' : 'no'}, timeout: ${config.timeout}`);\n const response = await axios(config);\n this.log.debug(`DNS Update State for IPv4: ${JSON.stringify(response.data)}`);\n return 'OK';\n } catch (error) {\n if (axios.isAxiosError(error)) {\n this.log.error(`Error in the request for IPv4: ${error.message}`);\n this.log.debug(`IPv4 response status: ${error.response?.status ?? 'unknown'}`);\n this.log.debug(`IPv4 response status text: ${error.response?.statusText ?? 'unknown'}`);\n this.log.debug(`IPv4 response body: ${JSON.stringify(error.response?.data ?? 'no response body')}`);\n this.log.debug(`IPv4 response headers: ${JSON.stringify(error.response?.headers ?? 'no response headers')}`);\n } else {\n this.log.error(`Error in the request for IPv4: ${String(error)}`);\n }\n return 'not OK';\n }\n }\n\n private async updateDNSv6(currentIPv6: string | null): Promise {\n if (!currentIPv6) {\n this.log.warn('IPv6 address could not be determined, skipping update');\n return null;\n }\n let url = '';\n let username = null;\n let password = null;\n const domain = this.config.domain;\n\n this.log.debug(`IPv6 update provider: ${this.config.dyndnsServive}, domain: ${domain}, current IP: ${currentIPv6}`);\n\n switch (this.config.dyndnsServive) {\n case 'duckdns':\n url = `https://www.duckdns.org/update?domains=${domain.split('.')[0]}&token=${this.config.duckdnsToken}&ipv6=${currentIPv6}`;\n break;\n case 'ipv64':\n url = `https://ipv64.net/nic/update?key=${this.config.ipv64Token}&domain=${domain}&ip6=${currentIPv6}`;\n break;\n case 'noip':\n url = `https://dynupdate.no-ip.com/nic/update?hostname=${domain}&myip=${currentIPv6}`;\n password = this.config.noipPassword;\n username = this.config.noipUser;\n break;\n case 'custom':\n url = this.config.customURL\n .replace(/\\{\\{ipv6\\}\\}/gi, currentIPv6 ?? '')\n .replace(/\\{\\{ip\\}\\}/gi, currentIPv6 ?? '');\n break;\n case 'dynv6':\n url = `https://ipv6.dynv6.com/api/update?ipv6=${currentIPv6}&token=${this.config.dynv6Token}`;\n break;\n }\n\n try {\n const config: AxiosRequestConfig = {\n method: 'get',\n url: url,\n timeout: 10000,\n auth: username && password ? { username, password } : undefined,\n };\n\n this.log.debug(`IPv6 update request URL: ${url}`);\n this.log.debug(`IPv6 request auth enabled: ${config.auth ? 'yes' : 'no'}, timeout: ${config.timeout}`);\n const response = await axios(config);\n this.log.debug(`DNS Update State for IPv6: ${JSON.stringify(response.data)}`);\n return 'OK';\n } catch (error) {\n if (axios.isAxiosError(error)) {\n this.log.error(`Error in the request for IPv6: ${error.message}`);\n this.log.debug(`IPv6 response status: ${error.response?.status ?? 'unknown'}`);\n this.log.debug(`IPv6 response status text: ${error.response?.statusText ?? 'unknown'}`);\n this.log.debug(`IPv6 response body: ${JSON.stringify(error.response?.data ?? 'no response body')}`);\n this.log.debug(`IPv6 response headers: ${JSON.stringify(error.response?.headers ?? 'no response headers')}`);\n } else {\n this.log.error(`Error in the request for IPv6: ${String(error)}`);\n }\n return 'not OK';\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial | undefined) => new Dnscope(options);\n} else {\n // otherwise start the instance directly\n (() => new Dnscope())();\n}\n"], + "mappings": "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", "names": ["axios", "dns"] } diff --git a/io-package.json b/io-package.json index e28b2cd..6d5782f 100644 --- a/io-package.json +++ b/io-package.json @@ -1,8 +1,21 @@ { "common": { "name": "dnscope", - "version": "0.3.1", + "version": "0.3.2", "news": { + "0.3.2": { + "en": "Add detailed HTTP error diagnostics in debug logs and include compiled build output", + "de": "Detaillierte HTTP-Fehlerdiagnose im Debug-Log hinzugefügt und kompiliertes Build aktualisiert", + "ru": "Добавлена подробная диагностика HTTP-ошибок в debug-логи и обновлен скомпилированный build", + "pt": "Adicionados diagnósticos detalhados de erro HTTP no log de depuração e build compilado atualizado", + "nl": "Gedetailleerde HTTP-foutdiagnostiek toegevoegd in debug-log en gecompileerde build bijgewerkt", + "fr": "Ajout de diagnostics HTTP détaillés dans les logs de débogage et mise à jour du build compilé", + "it": "Aggiunta diagnostica dettagliata degli errori HTTP nei log di debug e aggiornato il build compilato", + "es": "Se añadieron diagnósticos detallados de errores HTTP en logs de depuración y se actualizó el build compilado", + "pl": "Dodano szczegółową diagnostykę błędów HTTP w logach debug i zaktualizowano skompilowany build", + "uk": "Додано детальну діагностику HTTP-помилок у debug-логах та оновлено скомпільований build", + "zh-cn": "在调试日志中添加了详细HTTP错误诊断,并更新了编译后的构建输出" + }, "0.3.1": { "en": "Fix status 400 error when IP is unavailable; add debug log for update URL", "de": "Fehler 400 behoben wenn IP nicht verf\u00fcgbar; Debug-Log f\u00fcr Update-URL hinzugef\u00fcgt", diff --git a/package-lock.json b/package-lock.json index 31cb8aa..be6208c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "iobroker.dnscope", - "version": "0.2.9", + "version": "0.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iobroker.dnscope", - "version": "0.2.9", + "version": "0.3.1", "license": "MIT", "dependencies": { "@iobroker/adapter-core": "^3.3.2", diff --git a/package.json b/package.json index 4e00138..133c075 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.dnscope", - "version": "0.3.1", + "version": "0.3.2", "description": "DNScope is a Dynamic DNS Updater", "author": { "name": "simatec",