Cuong Manh Le
a193ec2ce0
feat(cli): keep serving DNS through Control D API maintenance
...
A hard maintenance window took DNS down on endpoints that already had a
working configuration: the bootstrap preflight read the maintenance answer
as a failed fetch and exited, turning a temporary API outage into an
endpoint outage.
Startup now falls back to the configuration on disk, which keeps resolving
until the API returns. Eligibility is not file presence: a start with no
configuration writes the seeded freedns default before the API is ever
reached, so a marker records that the API produced the file, bound to both
the identity and the file's contents - an identity-only marker outlives the
file it vouched for, and would certify the default regenerated in its
place. Because that binding follows the contents, every managed write
refreshes it, or one API-driven config change would leave the host
ineligible for the fallback its own configuration is meant to provide.
Generated defaults, NextDNS configurations and failed writes certify
nothing. Without a matching marker ctrld still stops, now with
API_MAINTENANCE (exit 37) and a message naming what cannot be done rather
than reporting a fetch failure that reads as broken connectivity.
Also:
- Maintenance is never a permanent rejection or a deleted device, so it
cannot stop the service for good or trigger a self-uninstall.
- A run that started on disk retries every 5-7 minutes until it has an
answer. refetch_time is untouched, and the jitter keeps hosts that fell
back together from returning as one burst.
- Recovery is acknowledged where the configuration takes effect, not where
the fetch returns or the reload is triggered: the receiver fetches again
and can fail. Until then the run stays pending and its answers keep
reaching the apply path, instead of comparing equal to a response that
was stored but never applied.
- Such a run never asked about the deactivation PIN, and the value meaning
"no PIN" is the one it starts with, so deactivation is refused with 503
while the PIN cannot be verified.
2026-10-20 17:17:54 +07:00
..
2024-02-07 14:40:18 +07:00
2026-10-20 17:17:54 +07:00
2025-01-24 14:54:20 +07:00
2025-12-18 17:10:39 +07:00
2025-12-18 17:10:39 +07:00
2026-10-20 17:17:54 +07:00
2026-10-20 17:17:54 +07:00
2026-10-20 17:17:54 +07:00
2026-09-28 16:49:42 +07:00
2025-02-18 20:25:13 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-07-28 16:11:37 +07:00
2026-08-21 14:49:30 +07:00
2026-09-28 16:44:51 +07:00
2024-08-07 15:51:11 +07:00
2026-10-20 17:17:54 +07:00
2026-09-28 16:47:40 +07:00
2026-09-28 16:44:51 +07:00
2026-09-28 16:44:51 +07:00
2026-09-28 16:44:51 +07:00
2026-09-28 16:47:40 +07:00
2023-08-15 18:22:38 +07:00
2026-09-28 16:47:40 +07:00
2026-09-28 16:47:40 +07:00
2026-09-28 16:47:40 +07:00
2026-10-20 17:17:54 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:56:04 +07:00
2026-08-21 14:45:56 +07:00
2026-09-28 16:45:45 +07:00
2026-08-21 14:46:44 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:42 +07:00
2026-10-06 14:52:42 +07:00
2026-09-28 16:45:03 +07:00
2026-10-20 17:17:54 +07:00
2026-09-28 16:50:50 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:52:27 +07:00
2026-09-28 16:52:27 +07:00
2026-09-01 11:08:13 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:27 +07:00
2026-09-28 16:55:27 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:27 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:27 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:55:27 +07:00
2026-09-28 16:55:42 +07:00
2026-09-28 16:56:04 +07:00
2026-09-01 11:08:13 +07:00
2026-09-28 16:55:27 +07:00
2026-09-01 11:08:13 +07:00
2023-08-15 18:22:38 +07:00
2026-09-28 16:49:42 +07:00
2026-09-28 16:44:51 +07:00
2026-09-28 16:44:51 +07:00
2026-09-01 11:03:13 +07:00
2026-08-21 14:46:44 +07:00
2026-09-28 16:49:05 +07:00
2026-10-06 14:53:19 +07:00
2026-10-06 14:53:19 +07:00
2026-10-06 14:53:19 +07:00
2026-10-06 14:53:19 +07:00
2026-09-28 16:52:10 +07:00
2026-08-21 14:49:58 +07:00
2026-08-21 14:49:58 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:56:04 +07:00
2026-08-22 01:34:48 +07:00
2026-09-28 16:49:42 +07:00
2026-10-06 14:52:42 +07:00
2026-09-28 16:47:40 +07:00
2026-09-28 16:47:40 +07:00
2026-10-06 14:52:42 +07:00
2026-10-06 14:52:42 +07:00
2026-09-28 16:49:05 +07:00
2026-10-06 14:52:42 +07:00
2026-09-28 16:51:55 +07:00
2026-09-28 16:51:55 +07:00
2026-09-28 16:47:40 +07:00
2026-09-28 16:47:40 +07:00
2026-10-06 14:52:42 +07:00
2026-09-28 16:47:40 +07:00
2026-09-28 16:51:55 +07:00
2026-09-28 16:47:40 +07:00
2026-03-25 13:58:44 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:47:40 +07:00
2026-10-06 14:52:42 +07:00
2023-12-13 14:53:29 +07:00
2026-09-28 16:52:51 +07:00
2026-08-21 15:12:32 +07:00
2026-09-28 16:47:40 +07:00
2026-08-21 14:48:20 +07:00
2026-09-28 16:51:55 +07:00
2026-09-28 16:55:42 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-10-06 14:52:42 +07:00
2026-09-28 16:49:05 +07:00
2023-09-22 18:42:21 +07:00
2023-08-15 18:22:38 +07:00
2026-09-28 16:49:42 +07:00
2026-09-28 16:55:42 +07:00
2026-09-28 16:55:42 +07:00
2026-09-28 16:49:42 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-10-06 14:52:42 +07:00
2026-10-06 14:52:42 +07:00
2026-09-28 16:45:33 +07:00
2026-09-28 16:51:55 +07:00
2026-09-28 16:45:33 +07:00
2026-09-28 16:45:33 +07:00
2026-09-28 16:45:33 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:51:55 +07:00
2023-11-16 20:55:39 +07:00
2025-02-18 20:25:13 +07:00
2026-08-21 14:46:44 +07:00
2026-08-21 14:46:44 +07:00
2026-08-21 14:46:44 +07:00
2026-09-28 16:45:45 +07:00
2026-07-14 01:12:37 +07:00
2026-07-14 01:12:37 +07:00
2025-05-15 17:00:59 +07:00
2025-05-15 17:00:59 +07:00
2023-08-15 18:22:38 +07:00
2025-11-12 15:14:40 +07:00
2023-08-15 18:22:38 +07:00
2024-12-19 21:34:37 +07:00
2026-03-03 14:29:09 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:55:15 +07:00
2026-09-28 16:45:33 +07:00
2026-09-28 16:45:33 +07:00
2026-08-21 14:45:56 +07:00
2026-08-21 14:45:56 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2023-08-15 18:22:38 +07:00
2023-08-15 18:22:38 +07:00
2026-09-28 16:44:51 +07:00
2024-05-09 18:39:30 +07:00
2026-08-05 00:39:42 +07:00
2025-02-26 00:44:13 +07:00
2026-07-14 01:12:34 +07:00
2025-02-26 00:44:13 +07:00
2026-10-20 17:17:54 +07:00
2024-08-07 15:51:11 +07:00
2026-09-28 16:44:51 +07:00
2026-09-28 16:44:51 +07:00
2026-10-20 17:17:54 +07:00
2026-10-20 17:17:54 +07:00
2026-09-28 16:44:51 +07:00
2026-09-28 16:51:55 +07:00
2026-09-28 16:51:55 +07:00
2026-10-06 14:53:19 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-10-06 14:53:19 +07:00
2026-10-06 14:53:33 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:42 +07:00
2026-09-28 16:49:42 +07:00
2026-09-28 16:49:42 +07:00
2024-08-07 15:54:20 +07:00
2025-06-04 18:36:51 +07:00
2024-02-22 18:15:36 +07:00
2025-02-10 18:55:36 +07:00
2026-09-28 16:49:42 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2025-05-15 17:00:59 +07:00
2025-05-15 17:00:59 +07:00
2024-08-07 15:51:11 +07:00
2024-08-07 15:51:11 +07:00
2024-08-16 13:50:11 +07:00
2025-03-26 23:18:36 +07:00
2025-03-26 23:18:36 +07:00
2025-03-26 23:18:36 +07:00
2023-08-15 18:22:38 +07:00
2026-09-01 11:03:13 +07:00
2026-08-21 15:12:32 +07:00
2026-08-21 15:12:32 +07:00
2026-08-21 15:12:32 +07:00
2026-09-01 11:03:13 +07:00
2026-08-21 14:50:27 +07:00
2026-08-21 14:50:27 +07:00
2026-08-21 14:50:27 +07:00
2026-08-21 14:50:27 +07:00
2026-09-28 16:47:40 +07:00
2026-08-21 14:50:27 +07:00
2026-08-21 14:50:27 +07:00
2026-08-21 14:52:02 +07:00
2024-12-19 21:34:21 +07:00
2026-03-25 13:58:24 +07:00
2026-09-01 11:03:13 +07:00
2026-09-28 16:49:42 +07:00
2026-09-28 16:40:49 +07:00
2026-09-28 16:40:49 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:49:05 +07:00
2026-07-28 16:12:36 +07:00
2026-08-21 14:50:11 +07:00
2026-08-21 14:50:11 +07:00
2026-10-06 14:53:19 +07:00
2026-09-28 16:51:55 +07:00
2026-09-28 16:53:02 +07:00
2026-09-28 16:49:42 +07:00
2026-09-28 16:56:04 +07:00
2026-09-28 16:49:05 +07:00
2026-09-28 16:56:04 +07:00
2024-02-07 14:40:18 +07:00