fix: use exact DirectAdmin DNS record deletion

This commit is contained in:
Eddy de Vink 2026-08-31 15:41:20 +02:00
commit 04f31306b5
2 changed files with 18 additions and 2 deletions

View file

@ -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` 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 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=<recordnaam>&value=<oude-ip>` 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. 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. 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=<urlencoded name=<recordnaam>&value=<oude-ip>>
```
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 ## Files
``` ```

View file

@ -104,7 +104,7 @@ async function getDnsRecords() {
} }
async function deleteDnsRecord(name, ip) { 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)}`; const endpoint = `/CMD_API_DNS_CONTROL?domain=${encodeURIComponent(CONFIG.daDomain)}&action=select&arecs0=${encodeURIComponent(recordValue)}`;
await daRequest(endpoint); await daRequest(endpoint);
} }