|
2 | 2 |
|
3 | 3 | `InterNetX DynDNS` is a containerized PHP worker that keeps one explicitly configured DNS host in sync with the current public IP address of the machine or network running the container. |
4 | 4 |
|
5 | | -The worker uses the InterNetX/AutoDNS XML gateway. The default live XML API endpoint remains `https://gateway.autodns.com`, which is current provider API terminology. Runtime API calls use the documented XML `auth_session` flow: create a session, reuse its hash for this run, then close it. |
| 5 | +Current provider: InterNetX / AutoDNS / SchlundTech-related DNS. |
| 6 | +Current interface: InterNetX XML. |
| 7 | + |
| 8 | +The default live XML API endpoint remains `https://gateway.autodns.com`. Runtime API calls use the XML `auth_session` flow: create a session, reuse its hash for this run, then close it. |
| 9 | + |
| 10 | +The generic worker flow is separated from the DNS provider/interface implementation. Provider-specific details for the current InterNetX XML support are documented in [docs/providers/internetx-xml.md](docs/providers/internetx-xml.md). Future providers, or a future InterNetX interface such as JSON, can be added behind the provider layer without rewriting the worker core. |
6 | 11 |
|
7 | 12 | Source code is available on GitHub: [worryboy/internetx-dyndns](https://github.com/worryboy/internetx-dyndns) |
8 | 13 | Container image is available on Docker Hub: [worryboy/internetx-dyndns](https://hub.docker.com/r/worryboy/internetx-dyndns) |
@@ -188,9 +193,10 @@ Before running live updates, check the zone for every configured target: |
188 | 193 | | `HTTP_REQUEST_TIMEOUT` | optional runtime/debug | No | Total HTTP request timeout for IP and XML requests. | `20` | |
189 | 194 | | `LOG_TARGET` | optional runtime/debug | No | PHP stream or file path for logs. | `php://stdout` | |
190 | 195 |
|
191 | | -`INTERNETX_SYSTEM_NS` is not part of XML authentication and is not required for the normal update path. InterNetX documents `system_ns` on the Zone object as the first system-managed nameserver, and ZoneInfo examples may include it. If set, this worker sends it as `<system_ns>` in the read-only ZoneInfo request. Normal DynDNS users usually leave it unset. |
| 196 | +`INTERNETX_*` settings are provider-specific for the current InterNetX XML interface. `INTERNETX_SYSTEM_NS` is not part of XML authentication and is not required for the normal update path. InterNetX documents `system_ns` on the Zone object as the first system-managed nameserver, and ZoneInfo examples may include it. If set, this worker sends it as `<system_ns>` in the read-only ZoneInfo request. Normal DynDNS users usually leave it unset. |
192 | 197 |
|
193 | 198 | There are no optional advanced authentication settings in the current worker. Credentials are used for `AuthSessionCreate` and `AuthSessionDelete`; zone inquiry and update requests use `<auth_session><hash>...</hash></auth_session>`. |
| 199 | +See [docs/providers/internetx-xml.md](docs/providers/internetx-xml.md) for the provider-specific InterNetX XML configuration notes. |
194 | 200 |
|
195 | 201 | ## Safe Local Validation |
196 | 202 |
|
@@ -290,7 +296,7 @@ Example dry-run startup: |
290 | 296 | [2026-04-23T08:00:02+00:00] INFO IPv6 detection disabled by configuration attempted=false |
291 | 297 | [2026-04-23T08:00:02+00:00] SUCCESS Public IP detection completed with at least one usable address ipv4_detected=true ipv6_detected=false |
292 | 298 | [2026-04-23T08:00:03+00:00] DEBUG Runtime stage entered stage=authentication/session preflight dry_run=true mutation_allowed=false live_mutation_attempted=false |
293 | | -[2026-04-23T08:00:03+00:00] INFO Starting InterNetX authentication/session preflight auth_flow=auth_session session_create_task_code=1321001 mutation_allowed=false |
| 299 | +[2026-04-23T08:00:03+00:00] INFO Starting DNS provider authentication/session preflight provider=InterNetX provider_interface=XML auth_flow=auth_session mutation_allowed=false |
294 | 300 | [2026-04-23T08:00:03+00:00] DEBUG InterNetX XML request prepared operation=AuthSessionCreate task_code=1321001 api_call_type=auth_session_create stage=authentication/session preflight mutation=false dry_run=true auth_mode=session_create session_established=false payload=<request>...</request> |
295 | 301 | [2026-04-23T08:00:03+00:00] DEBUG InterNetX XML response received operation=AuthSessionCreate task_code=1321001 api_call_type=auth_session_create stage=authentication/session preflight mutation=false dry_run=true auth_mode=session_create session_established=false http_status=200 transport_success=true response_result_status_code=S1321001 response_result_status_type=success stid=20260423-app1 api_business_success=true payload=<response>...</response> |
296 | 302 | [2026-04-23T08:00:03+00:00] SUCCESS InterNetX session created auth_mode=auth_session session_hash=9b4b...73dd session_persisted=false |
@@ -325,6 +331,10 @@ The session hash is treated as a secret. It is kept only in memory, never persis |
325 | 331 |
|
326 | 332 | The updater does not create missing DNS records. If IPv4 is enabled and detected, the target `A` record must already exist. If IPv6 is enabled and detected, the target `AAAA` record must already exist too. |
327 | 333 |
|
| 334 | +## Verification Direction |
| 335 | + |
| 336 | +The current primary check is provider-side ZoneInfo before update decisions. A future verification pass should stay staged and optional: provider check first, configurable public resolver checks second, and local resolver checks only as a convenience. See [docs/design/verification.md](docs/design/verification.md). |
| 337 | + |
328 | 338 | ## Docker-Compatible Runtime |
329 | 339 |
|
330 | 340 | Build and run continuously: |
@@ -385,10 +395,14 @@ docker compose version |
385 | 395 | - [`VERSION`](VERSION) |
386 | 396 | - [`CHANGELOG.md`](CHANGELOG.md) |
387 | 397 | - [`README.Docker.md`](README.Docker.md) |
388 | | -- [`src/Config.php`](src/Config.php) |
389 | | -- [`src/XmlGatewayClient.php`](src/XmlGatewayClient.php) |
390 | | -- [`src/PublicIpResolver.php`](src/PublicIpResolver.php) |
391 | | -- [`src/DynDnsService.php`](src/DynDnsService.php) |
| 398 | +- [`src/Core/DynDnsService.php`](src/Core/DynDnsService.php) |
| 399 | +- [`src/Core/PublicIpResolver.php`](src/Core/PublicIpResolver.php) |
| 400 | +- [`src/Config/Config.php`](src/Config/Config.php) |
| 401 | +- [`src/Provider/DnsProvider.php`](src/Provider/DnsProvider.php) |
| 402 | +- [`src/Provider/InterNetX/InterNetXXmlProvider.php`](src/Provider/InterNetX/InterNetXXmlProvider.php) |
| 403 | +- [`src/Provider/InterNetX/InterNetXXmlGatewayClient.php`](src/Provider/InterNetX/InterNetXXmlGatewayClient.php) |
| 404 | +- [`docs/providers/internetx-xml.md`](docs/providers/internetx-xml.md) |
| 405 | +- [`docs/design/verification.md`](docs/design/verification.md) |
392 | 406 | - [`.env.example`](.env.example) |
393 | 407 | - [`docker-compose.yml`](docker-compose.yml) |
394 | 408 | - [`Dockerfile`](Dockerfile) |
|
0 commit comments