31 Commits
Author SHA1 Message Date
sir_melonchenandClaude Opus 5.5 cb7f4c9f3d feat(license): gate features by entitlement and enforce maxAgents
ci / Go (lint, test, vuln) (push) Successful in 6m43s
ci / Protobuf (push) Successful in 7s
ci / End-to-end (server, agents, BIND, Kea) (push) Successful in 3m35s
install / Installation (debian:12) (push) Successful in 3m20s
ci / Web (lint, test, audit, build) (push) Successful in 12m41s
ci / Shell and licence headers (push) Successful in 14s
ci / Integration (real BIND and Kea) (push) Successful in 2m50s
ci / Development environment (compose) (push) Successful in 15s
install / Installation (rocky:9) (push) Successful in 4m1s
install / Installation (ubuntu:24.04) (push) Successful in 3m23s
ci / Release build (dry run) (push) Failing after 10m38s
install / Installation (debian:13) (push) Successful in 3m22s
install / Installation (ubuntu:22.04) (push) Successful in 3m33s
Clusters (DDI_CLUSTER), Kea HA pairs (DDI_KEA_HA), dynamic zones
(DDI_DYNAMIC_ZONES) and SSO (DDI_SSO) now need the matching Keygen
entitlement; the trial grants all of them. Only taking a feature into
use is blocked (403 license_feature): existing clusters, HA pairs,
dynamic zones and enabled SSO keep working and stay editable.

maxAgents is checked when creating an enrollment token and, under an
advisory lock, at enrollment; revoked agents do not count. GET /license
reports available_features and the agent usage. The UI shows the
features on the license page and disables locked controls, and
keygen-setup.sh creates the entitlements and assigns them to licenses
(ADR 0027).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:51:55 +02:00
sir_melonchenandClaude Opus 5.5 cab0b351e9 feat(web): system TSIG key, texts for managed records in dynamic zones
install / Installation (debian:13) (push) Successful in 3m33s
install / Installation (ubuntu:22.04) (push) Successful in 3m49s
install / Installation (rocky:9) (push) Successful in 4m9s
install / Installation (ubuntu:24.04) (push) Successful in 3m43s
ci / Protobuf (push) Successful in 14s
ci / Shell and licence headers (push) Successful in 15s
ci / Web (lint, test, audit, build) (push) Successful in 2m50s
ci / Release build (dry run) (push) Successful in 3m14s
ci / Go (lint, test, vuln) (push) Successful in 6m24s
ci / End-to-end (server, agents, BIND, Kea) (push) Successful in 3m24s
ci / Integration (real BIND and Kea) (push) Failing after 2m50s
ci / Development environment (compose) (push) Successful in 14s
install / Installation (debian:12) (push) Successful in 3m22s
The DNS agent now maintains DDI's records in dynamic zones (ADR 0026):
updated zone and record hints, the system key is marked and cannot be
deleted (key_system), API types regenerated. Project log updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 06:16:28 +02:00
sir_melonchenandClaude Opus 5.5 2555028956 fix: agents enrolled by hand run as systemd services
ci / Protobuf (push) Successful in 12s
ci / Web (lint, test, audit, build) (push) Successful in 2m44s
ci / Shell and licence headers (push) Successful in 21s
ci / Go (lint, test, vuln) (push) Successful in 6m22s
ci / Release build (dry run) (push) Successful in 3m51s
ci / Integration (real BIND and Kea) (push) Successful in 2m33s
ci / Development environment (compose) (push) Successful in 17s
ci / End-to-end (server, agents, BIND, Kea) (push) Successful in 4m14s
install / Installation (debian:12) (push) Successful in 4m54s
install / Installation (debian:13) (push) Successful in 5m6s
install / Installation (ubuntu:22.04) (push) Successful in 5m16s
install / Installation (rocky:9) (push) Successful in 7m28s
install / Installation (ubuntu:24.04) (push) Successful in 8m58s
release / release (push) Successful in 4m11s
An agent installed without token and enrolled with the command of the web
interface never ran as a service: the installer left the unit disabled and
the root-run enrollment left an identity the service user could not read.
The installer now always enables the agent unit (it waits for the
identity via ConditionPathExists), enroll as root hands the state over to
the service user and enables and starts the unit, and rerunning or
upgrading the installer repairs agents enrolled by hand. The web interface
shows the matching installer command next to the enroll command.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 02:44:03 +02:00
sir_melonchenandClaude Opus 5.5 346d24cb34 fix: address check pings with a raw socket and asks the DNS agents
ci / Protobuf (push) Successful in 16s
ci / Web (lint, test, audit, build) (push) Successful in 2m53s
ci / Shell and licence headers (push) Successful in 23s
ci / Release build (dry run) (push) Successful in 3m46s
ci / Integration (real BIND and Kea) (push) Successful in 2m47s
ci / Development environment (compose) (push) Successful in 18s
install / Installation (debian:13) (push) Successful in 6m59s
ci / Go (lint, test, vuln) (push) Successful in 6m4s
ci / End-to-end (server, agents, BIND, Kea) (push) Successful in 3m50s
install / Installation (debian:12) (push) Successful in 6m17s
install / Installation (ubuntu:22.04) (push) Successful in 6m31s
install / Installation (rocky:9) (push) Successful in 9m53s
install / Installation (ubuntu:24.04) (push) Successful in 6m38s
release / release (push) Successful in 4m15s
On the user's server the check reported "socket: permission denied" for
ping and asked only the server's own resolver. Ping now falls back to a
raw ICMP socket (the server unit gets CAP_NET_RAW, like /bin/ping); DNS
asks the DNS agents outside clusters when no name server addresses are
configured, gives every server its own timeout, and explains missing
records (dynamic zone, system resolver, not deployed yet).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 01:06:55 +02:00
sir_melonchenandClaude Opus 5.5 1a98ba659d test(web): IP view paging, range selection, range/bulk dry runs, checks
Covers expanding a network and paging its IPs, Shift-click and from/to
selection, range assignment and freeing with dry run, bulk dry run and
apply with per-address problems, the check dialog, adopting the lease
host name, the random host name hint, the network form without pools and
live reloads of the IP list. Test calls expose their query string.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 23:30:17 +02:00
sir_melonchenandClaude Opus 5.5 aa9966251b style(web): narrower address table, truncated descriptions, taller IP list
Lease name moves into the lease column, long descriptions are cut with a
tooltip, row actions get some air and the IP list on the network page
uses the available height.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 23:18:23 +02:00
sir_melonchenandClaude Opus 5.5 f4d7b2261f feat(web): translate the ADR 0025 server codes and summarized bulk effects
New problems dynamic_is_gateway, dynamic_ipv6_unsupported and check_size;
range and type errors with their parameters; pool problems that no longer
exist removed. Bulk dry runs report effects per code with a count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 23:13:28 +02:00
sir_melonchenandClaude Opus 5.5 6cb0f86398 feat(web): network IP view, range assignment, bulk changes and checks
Networks expand inline (and on the detail page) to every host address from
GET /networks/{id}/ips with paging, checkbox and Shift-click selection and
from/to ranges. Selections can be assigned as dynamic, static or reserved
or freed via POST /networks/{id}/range after a dry run, changed in bulk
(dry run, then apply) and checked with POST /addresses/check. The pool
editor is gone; DHCP ranges are shown as derived. Dynamic entries hint at
the random host name and offer to adopt the lease host name. Live events
also refresh the IP lists. API types regenerated (ADR 0025).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 23:08:57 +02:00
sir_melonchenandClaude Opus 5.5 5a5b09ae8b style(web): sober admin layout with grouped sidebar and dense tables
Left sidebar navigation in groups, slim license/pending strips, page
headers with counts and one primary action, help texts behind a small
"?" instead of paragraphs, compact tables and panels, restrained palette
with small radii in light and dark mode, terse texts in both locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 23:08:57 +02:00
sir_melonchenandClaude Opus 5.5 34e8342e8c feat: require the HA password file name in the generator settings
ci / Protobuf (push) Successful in 18s
ci / Web (lint, test, audit, build) (push) Successful in 1m36s
ci / Shell and licence headers (push) Successful in 21s
ci / Release build (dry run) (push) Successful in 2m13s
ci / Go (lint, test, vuln) (push) Successful in 5m29s
ci / Integration (real BIND and Kea) (push) Successful in 2m1s
ci / End-to-end (server, agents, BIND, Kea) (push) Successful in 3m8s
ci / Development environment (compose) (push) Successful in 13s
The DHCP agent writes the HA credentials only as ddi-suite-ha-password and
ddi-suite-ha-user; other names are now rejected when the settings are
saved instead of when a revision is generated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:32:48 +02:00
sir_melonchenandClaude Opus 5.5 643a625d1d feat(web): translate further M5 error codes, refresh addresses on lease adoption
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:35:58 +02:00
sir_melonchenandClaude Opus 5.5 8b1d66d57a feat: mark secret files in diffs explicitly
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:55:15 +02:00
sir_melonchenandClaude Opus 5.5 18b6fff909 test(web): cover cluster, TSIG, zone, record and target views
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:51:26 +02:00
sir_melonchenandClaude Opus 5.5 15bdb03c14 feat(web): clusters, TSIG keys, zones and records (M5)
- Clusters page: DNS/DHCP clusters with members, transfer key, DNS
  options and Kea HA settings; member picking limited to free agents of
  the role, client-side checks of the membership rules.
- TSIG keys page: create, edit, rotate, delete; secrets only after an
  explicit, audited retrieval and shown once.
- Zones page with derived zones ("take over") and zone detail with
  type-specific record forms and hints for dynamic zones and AD.
- Networks, agents and generator settings show/assign clusters; files,
  diffs and pending changes are grouped by target, secret files are
  never shown.
- Pages are lazy-loaded per route (main bundle 600 KB -> 480 KB).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:51:26 +02:00
sir_melonchenandClaude Opus 5.5 d26153c2cc chore(web): regenerate API types for the M5 contracts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:25:38 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 d1f4eb999f feat: translate M4 problem codes, record implementation details in ADR 0022
ci / Protobuf (push) Successful in 7s
ci / Web (lint, test, audit, build) (push) Successful in 1m7s
ci / Shell and licence headers (push) Successful in 7s
ci / Go (lint, test, vuln) (push) Successful in 3m17s
ci / Release build (dry run) (push) Successful in 2m29s
ci / End-to-end (server, agents, BIND, Kea) (push) Failing after 2m2s
ci / Development environment (compose) (push) Successful in 12s
ci / Integration (real BIND and Kea) (push) Successful in 3m52s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:26:52 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 3879c27f35 fix(web): do not preselect agents that already run a newer revision
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:16:23 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 70884c9653 test(web): pending changes, diffs, deploy, rollback, mode and live events
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:12:52 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 751fecddd9 feat(web): diff view, pending changes, deploy now and rollback
Revisions page lists the pending audit entries and file diffs above
"Neue Revision". The revision page compares with the previous revision
(or another one, or empty), pushes the revision to selected agents with
a per-agent delivery result, and rolls back by creating a new revision
with the old content.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:12:52 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 2fa3f4db21 feat(web): live updates, pending-changes notice, agent mode switch
Server-sent events from /api/v1/events invalidate the affected queries
(agents, deployments, revisions, pending changes) and reconnect with
backoff; while connected, polling drops to a 60 s fallback. The footer
shows the live status, the header notes how many changes wait to be
deployed. Agents get a mode switch (auto_pull/manual) with their target
revision; deployments show the pending and superseded outcomes and who
requested a push. Translations for all M4 texts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:12:51 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 d5511b3286 feat: M4 contracts for push deployments, diff, rollback and live events
ADR 0022, OpenAPI additions (agent mode, deploy, rollback, diff, pending
changes, server-sent events), deployment_id in GetDesiredStateResponse
for pushes picked up by polling, and the textdiff package (Myers,
unified format).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:53:21 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 56347ec5ff test: end-to-end test of the agent path, fix first CI findings
ci / Web (lint, test, audit, build) (push) Successful in 1m1s
ci / Shell and licence headers (push) Successful in 7s
ci / Go (lint, test, vuln) (push) Failing after 2m40s
ci / Protobuf (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 2m27s
ci / End-to-end (server, agents, BIND, Kea) (push) Failing after 1m26s
ci / Development environment (compose) (push) Successful in 13s
ci / Integration (real BIND and Kea) (push) Failing after 1m58s
test/e2e runs server, PostgreSQL, BIND and Kea with both agents in
containers (make test-e2e, CI job End-to-end): enrollment with the
command from the API, revision 1 and 2 applied and served by BIND and
Kea, unchanged data creates no revision, revoking disconnects the agent
while BIND keeps serving.

Fixes from the first CI run: quote a spec description containing a
comma, exempt the agent lock-out routes in the route protection test,
whole-second certificate lifetimes, a push replacing queued pulls, the
truncation marker containing the letter checked, and curl|grep -q under
pipefail in the server smoke test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:29:58 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 56892631be feat: wire BIND and Kea roles into the agents, allow revoking agents in read-only mode
ci / Protobuf (push) Successful in 2m18s
ci / Go (lint, test, vuln) (push) Failing after 3m11s
ci / Shell and licence headers (push) Successful in 8s
ci / Web (lint, test, audit, build) (push) Successful in 1m14s
ci / Integration (real BIND and Kea) (push) Successful in 1m42s
ci / Release build (dry run) (push) Failing after 2m24s
ci / Development environment (compose) (push) Successful in 38s
Revoking or deleting an agent and deleting enrollment tokens lock agents
out, a security function that must stay available when the license is
read-only. Translations for the new problem codes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:19:31 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 6c1f7249b0 feat(web): agents, enrollment tokens, revisions, deployments and leases
Agent overview with connection, health and revision state (polled every
five seconds until the live stream of M4), agent details with checks and
deployment history, enrollment token dialog showing the ready-to-run
command, revision list and creation, revision details with deployments
and files, and a lease list with network, state and text filters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 15:05:01 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 e843502cbf feat: M3 contracts for agents, revisions and bundles
Shared Apache-2.0 packages for the signed bundle format and the agent
certificate conventions, the agent role interface, REST API spec for
agents, enrollment tokens, revisions, deployments and leases, and ADR
0021. Generator settings now hold the target paths on the managed hosts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:54:30 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 0a74d4b3ba feat: generator settings and configuration preview (API and UI)
ci / Go (lint, test, vuln) (push) Failing after 3m31s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 57s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m59s
ci / Integration (real BIND and Kea) (push) Failing after 43s
ci / Development environment (compose) (push) Successful in 13s
- stable Kea subnet IDs per network (migration 00002)
- generator settings (SOA, name servers, TTLs, recursion, DHCP defaults)
- GET /config/preview renders the configuration for the current data
- UI: configuration preview page and DNS/DHCP settings page

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:19:26 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 63d6dac0f5 feat(web): management UI for M1
ci / Go (lint, test, vuln) (push) Successful in 3m27s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 54s
ci / Shell and licence headers (push) Successful in 6s
ci / Development environment (compose) (push) Canceled after 0s
ci / Release build (dry run) (push) Canceled after 33s
- login with TOTP step and SSO button, forced password change, account
  page with password change and TOTP setup (QR code)
- layout with permission-based navigation, license banner, theme/language
- networks: list with utilization, create/edit with pool editor, detail
  page with address map
- addresses: server-side filtered/sorted, virtualized table, inline type
  switch with DNS/DHCP preview, bulk actions, saved filters, CSV import
  (dry run first) and export
- license, users, audit log and OIDC settings pages
- typed API client from the OpenAPI spec; errors translated by code
- German default, English second language

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:34:45 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 1aefed471c feat(server): wire database, licensing, API and metrics into ddi-server
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Shell and licence headers (push) Successful in 5s
ci / Release build (dry run) (push) Successful in 1m43s
ci / Development environment (compose) (push) Canceled after 5s
ci / Go (lint, test, vuln) (push) Failing after 3m7s
ci / Protobuf (push) Successful in 6s
- commands: serve, migrate, bootstrap-admin, gen-master-key
- /metrics with route-pattern labels and license gauge, /readyz checks DB
- fix OpenAPI flow mappings with commas; generate TypeScript API types
  (openapi-typescript) and check them in CI

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:08:59 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 7819158009 fix(web): show build notice instead of 404 when index.html is missing
ci / Go (lint, test, vuln) (push) Successful in 1m58s
ci / Development environment (compose) (push) Failing after 14s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m12s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 19:35:37 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 14f26a7b30 feat(web): scaffold React/TypeScript/Vite frontend
German default with English as second language (i18next), light/dark/system
theme, server health indicator. ESLint (strict type-checked), Prettier,
Vitest. Product name injected at build time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 19:09:29 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 14dde4bfe4 feat: add server, agent and shared code foundation
- internal/brand: central product, binary and path names (ldflags-overridable)
- internal/buildinfo, internal/logging (slog, secret redaction)
- server: env config, HTTP server with /healthz, /readyz, request IDs,
  access log, panic recovery, security headers, graceful shutdown
- web: embedded SPA handler with fallback page when UI is not built
- agent: ddi-agent-dns and ddi-agent-dhcp binaries on a shared core CLI

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:59:11 +02:00