diff --git a/README.md b/README.md index 5ac14f2..fb91c8b 100644 --- a/README.md +++ b/README.md @@ -110,10 +110,26 @@ wan-ip-guard.service: Failed to spawn 'start' task: Permission denied 1. **IP detectie:** Haalt het WAN IP op via `ifconfig.me` met fallback naar `api.ipify.org` en `icanhazip.com` 2. **State vergelijking:** Vergelijkt met het laatst opgeslagen IP in de state file -3. **DNS update:** Voor elke record: verwijder oud A-record + voeg nieuw A-record toe via DirectAdmin API. Per-record foutafhandeling — één falende record blokkeert de rest niet. +3. **DNS update:** Voor elke record worden eerst alle bestaande A-records met de exacte oude waarde verwijderd en daarna één nieuw A-record toegevoegd via DirectAdmin API. De delete-aanroep gebruikt `action=select` en een URL-gecodeerde waarde `name=&value=` in parameter `arecs0`. De waarde moet dus niet `recordnaam=ip` zijn. 4. **State persist:** Het nieuwe IP wordt pas opgeslagen als **alle** DNS-updates gelukt zijn. Bij gedeeltelijke mislukking retried de volgende timer-run. 5. **Notificatie:** Stuurt WhatsApp bericht met oud/nieuw IP en status per record. +### DirectAdmin A-record verwijderen + +De bewezen API-vorm voor één exact A-record is: + +```text +CMD_API_DNS_CONTROL?domain=eddydevink.nl&action=select&arecs0=&value=> +``` + +Voorbeeld vóór URL-encoding: + +```text +name=changeme&value=94.157.123.170 +``` + +Encodeer het volledige `name=...&value=...`-paar. Controleer na de API-call de zone opnieuw; een API-antwoord `Records verwijderd` is onvoldoende bewijs wanneer het oude record nog in de zone staat. + ## Files ``` diff --git a/index.js b/index.js index 4d676fe..d49ec98 100755 --- a/index.js +++ b/index.js @@ -104,7 +104,7 @@ async function getDnsRecords() { } async function deleteDnsRecord(name, ip) { - const recordValue = `${name}=${ip}`; + const recordValue = `name=${name}&value=${ip}`; const endpoint = `/CMD_API_DNS_CONTROL?domain=${encodeURIComponent(CONFIG.daDomain)}&action=select&arecs0=${encodeURIComponent(recordValue)}`; await daRequest(endpoint); }