Skip to content

[BUG] A headless host has no supported way to add a monitored server: no CLI verb, and the web surface excludes the write tools #2256

Description

@erikdarlingdata

Field report #2252. Operator runs the Darling service on Windows Server 2012, which cannot run the Viewer. They have the web viewer and a Viewer on a remote PC. There is no supported way for them to add a second server.

The three doors are all shut

path why it fails
darling.json seeds config_monitored_servers only when that table is empty; after the first start the store is authoritative and file edits are a silent no-op (#2254)
web viewer add_servers / remove_server are in DarlingWebEndpoints.ExcludedToolNames, deliberately kept off /api/read/* because they write the registry
CLI no verb exists. The full list: --backfill-rollups --collapse-legacy-slices --config --configure-firewall --configure-network --disable-mcp --disable-web --dry-run --enable-mcp --enable-web --encrypt-password --export-viewer-config --help --no-vacuum-full --print-viewer-connection --recompress-plan-dim --test-connection --vacuum-full --validate-config --version

What remains is a GUI on another machine (which then hits the DPAPI credential problem in #2255) or standing up an MCP client. Neither is a reasonable answer for a headless Windows host, and the operator reached the end of the documented surface before asking.

Why "just INSERT the row" is not the workaround

server_id is ServerIdHelper.GetDeterministicHashCode(StorageName) where the storage name is built from host + database + read-only intent. A hand-written INSERT with any other value leaves the collectors writing history under the identity they compute while the registry points elsewhere — the split-history class in #2158. So the identity computation is exactly the part an operator cannot safely do by hand, and exactly what add_servers already does correctly.

Fix shape

An --add-server CLI verb that delegates to the same code path as the add_servers MCP tool — identity computation, per-entry validation, and the in-process connection probe included, so it cannot diverge from the tool. It should also bump config_service.config_version, since the service hot-swaps on that beacon each sweep and therefore needs no restart.

Worth deciding alongside:

Credential handling is the one wrinkle: --encrypt-password already exists, so a verb taking an already-encrypted blob (or integrated auth, which stores nothing) needs no new secret handling.

Activity

  1. added a commit that references this issue on Aug 14, 2026
  2. erikdarlingdata commented on Aug 14, 2026

    @erikdarlingdata
    OwnerAuthor

    Fixed on dev in #2259.

    --add-server (also --add-servers) reads a JSON array from stdin — the same shape add_servers takes — and delegates to that exact code path, so validation, dedupe, the in-process probe, encryption and the server_id computation are shared rather than reimplemented. That last part is why a hand-written INSERT was never the workaround: the identity is a hash of the storage name, and getting it wrong splits history (#2158).

    Stdin rather than argv so a password never reaches the process list or shell history; empty stdin prints the JSON shape and two copy-paste pipelines to STDOUT rather than hanging. Exit 0 requires that something landed and nothing failed, so it works as a deployment gate — pure duplicates exit 0 since re-running a file is idempotent, and a batch where nothing landed exits 1. Windows is needed only for a managed (DPAPI) store credential, checked in that branch, so a Linux host with bring-your-own Postgres can use it.

    Review caught three things worth naming: my block stole BackfillRollupsAsync's [SupportedOSPlatform] attribute AND then its doc comment (two variants of the same insertion-boundary trap), and a real store failure was being reported as a parse failure because AddServersAsync's catch-all returns plain text rather than JSON. All fixed.

    @000al000 — this is what you needed for the Windows Server 2012 host. Ships with the next release; until then the Viewer's Add Server dialog from another machine or the MCP tool remain the paths.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions