Skip to content

plugin-dbus

Placement runtime (out-of-process over gRPC)
Source github.com/opencharly/charly/candy/plugin-dbus
Version 2026.187.1200
Candy plugin-dbus

This plugin is not listed in charly/charly.yml’s compiled_plugins:. It is not part of the shipped binary: charly builds and loads it out-of-process over gRPC when a plan references one of its words (the coexist path).

The reserved words this plugin serves:

  • dbus — verb class

OUT-OF-TREE charly plugin serving the dbus live-container check verb — a standalone Go module (go.mod + main.go) that interacts with D-Bus services inside a running deployment (list, call, introspect, notify) over go-plugin gRPC via the charly plugin SDK (github.com/opencharly/sdk). charly’s loader fetches this candy’s repo, go-builds the provider binary on the HOST, and serves it OUT-OF-PROCESS via LocalTransport — so the D-Bus driver lives HERE, out of charly’s core check surface. STRUCTURAL externalization, NOT a dep-shed: godbus stays in charly’s core for the Secret Service / GPG secrets — the verb drives the venue’s session bus with gdbus, never godbus. The dbus-exclusive fields live in the plugin’s OWN #DbusInput (schema/dbus.cue): the verb method enum (the former core #DbusMethod) plus dest/path/member/arg/text — member is the D-Bus interface.Method a call invokes (renamed from the former shared method #Op modifier); the plugin decodes them from the step’s desugared plugin_input, and only the genuinely shared step modifiers (matchers, description) still ride core #Op. It dispatches through the provider registry exactly like a built-in (ResolveVerb → grpcProvider → invokeVerbProvider hands it the full #Op). EXEC-based (the second, after record): the host attaches its live DeployExecutor over the E3b reverse channel and this plugin dials back through the SDK (sdk.ExecutorFromInvoke) to RunCapture gdbus against the venue’s session bus — it owns no podman / SSH machinery and no godbus. The R10 consumer is a desktop pod bed whose check composes this plugin (the sway-browser-vnc bed’s dbus list probe).

The CUE schema below is the authoritative grammar for this plugin’s input. It is the same single source that generates the plugin’s Go parameter types and answers the runtime Describe RPC, so this page cannot disagree with either.

// This plugin's OWN CUE schema — the typed plugin_input for the `dbus`
// live-container check verb, served over the Describe channel. It is the SINGLE
// SOURCE for this plugin's params, used two ways (the same contract core `spec`
// and the reference plugin-http use):
//
// 1. GENERATE the Go param struct — `cue exp gengotypes` (driven by task cue:gen,
// which wraps this with `package params` + `@go(params)`) emits
// ../params/cue_types_gen.go, so the provider decodes plugin_input into a TYPED
// struct, never a hand-parsed map.
// 2. VALIDATE authored input AT RUNTIME — the host splices this source onto the
// base (base ++ plugin) and validates every authored `dbus` step's
// plugin_input against #DbusInput.
//
// Every dbus-EXCLUSIVE field lives here (they left core #Op in the
// schema-compaction cutover): the verb `method` enum (the former core #DbusMethod)
// plus dest/path/member/arg/text. `member` is the D-Bus MEMBER (the fully-qualified
// interface.Method name a `call` invokes) — RENAMED from the former shared `method`
// #Op modifier, so it cannot collide with the input's verb-method key. The step's
// shared modifiers stay on #Op, read off the marshalled step Op: the
// exit_status/stdout/stderr matchers (sdk.VerbVerdict) and `description` (the
// step's report label, doubling as the notify body).
//
// SELF-CONTAINED: it references NO base def, so it compiles standalone (gengotypes +
// the SDK's serve-side check) AND splices onto the base (base ++ plugin is a
// def-name collision check, not a base-reference resolver).
#DbusInput: {
// method — the dbus verb method (the former core #DbusMethod enum).
method: "list" | "call" | "introspect" | "notify"
// dest — the D-Bus destination (bus name), e.g. org.freedesktop.Notifications.
dest?: string
// path — the D-Bus object path, e.g. /org/freedesktop/Notifications.
path?: string
// member — the D-Bus member: the fully-qualified interface.Method a `call`
// invokes (e.g. org.freedesktop.Notifications.GetCapabilities). Formerly the
// shared `method` #Op modifier; renamed to proper D-Bus terminology.
member?: string
// arg — typed `type:value` call arguments (string/uint32/int32/int64/uint64/
// boolean/double), converted to GVariant text for gdbus.
arg?: [...string] @go(Args)
// text — the notification summary (title) for `notify`.
text?: string
}

See also the candy reference for this candy’s install surface.