feat(#702): PrivRequest/PrivResponse wire types

This commit is contained in:
damocles 2026-06-01 16:34:01 +02:00 committed by mara
commit c8ea28b218

View file

@ -0,0 +1,69 @@
//! Wire types for the `hive-priv` privileged-helper socket.
//!
//! Both `hive-priv` (server) and `hive-c0re` (client via `priv_client`)
//! import these so the shapes stay in sync.
use std::path::PathBuf;
use serde::{Deserialize, Serialize};
/// Default socket path for the privileged helper.
pub const PRIV_SOCK: &str = "/run/hive/priv.sock";
/// A request to the privileged helper.
///
/// Wire format: one JSON object per line over `/run/hive/priv.sock`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "op", rename_all = "snake_case")]
pub enum PrivRequest {
/// Run `nixos-container <args>`.
///
/// The helper validates that the container argument (second positional
/// arg for verbs that take one) matches a hive-managed name
/// (`h-*`, the manager container, or a known sibling service container).
ContainerRun { args: Vec<String> },
/// Run `systemctl daemon-reload`.
DaemonReload,
/// Overwrite `/etc/nixos-containers/<container>.conf` with new content.
WriteNspawnConf { container: String, content: String },
/// Write a file into the drop-in dir for `container@<container>.service`.
///
/// Creates `/run/systemd/system/container@<container>.service.d/<filename>`.
WriteSystemdDropin {
container: String,
filename: String,
content: String,
},
/// Remove the drop-in dir for `container@<container>.service`, if present.
///
/// Removes `/run/systemd/system/container@<container>.service.d/`.
RemoveSystemdDropin { container: String },
/// `chown(2)` a path under a hive-managed prefix
/// (`/run/hive-agent/` or `/var/lib/hyperhive/`).
Chown { path: PathBuf, uid: u32, gid: u32 },
/// `chmod(2)` a path under a hive-managed prefix.
Chmod { path: PathBuf, mode: u32 },
/// Run a command inside a machine container via `systemd-run --machine`.
///
/// The machine name must be a hive-managed container.
SystemdRunMachine { machine: String, cmd: Vec<String> },
}
/// Response from the privileged helper.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PrivResponse {
pub ok: bool,
#[serde(default)]
pub stdout: String,
#[serde(default)]
pub stderr: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}