From 11447649e1e72929fa09cefc0e8ce5be5ead2a4c Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Mon, 15 Jun 2026 01:36:00 +0000 Subject: [PATCH] feat: remowt user identity --- --- a/Cargo.lock +++ b/Cargo.lock @@ -308,9 +308,9 @@ [[package]] name = "bifrostlink" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fb01af731c11dd31b23783a83a36a29f644cc1972481f6fa4f4fabc709079eb" +checksum = "0c8ce9dc1425ee2aaffd3324548f114acccd456b9b1ffb33fe9eb9a7be6475a8" dependencies = [ "async-trait", "async_fn_traits", @@ -322,14 +322,13 @@ "serde_json", "tokio", "tracing", - "uuid", ] [[package]] name = "bifrostlink-macros" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4b7a5fb38b36bd81910c17ebf369f9296e508d92b1277a768a63c8a2254fdb" +checksum = "a7d071add2d3b90486fe141edb2e811f7735155d320aee3936ebd67e535d6ac1" dependencies = [ "proc-macro2", "quote", @@ -338,9 +337,9 @@ [[package]] name = "bifrostlink-ports" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977acfcb8ed3c24ab7c2f76fb3eeebff1533c72708733ce6020f2501980b7cf2" +checksum = "ccf6ba32d0ff83b27a242f9d2fca124ad215ddd9bf99144d66b7ca44a885de50" dependencies = [ "bifrostlink", "bytes", @@ -1777,7 +1776,7 @@ [[package]] name = "polkit-backend" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "clap", @@ -1951,7 +1950,7 @@ [[package]] name = "remowt-agent" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "bifrostlink", @@ -1976,7 +1975,7 @@ [[package]] name = "remowt-client" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "bifrostlink", @@ -1998,7 +1997,7 @@ [[package]] name = "remowt-endpoints" -version = "0.1.7" +version = "0.1.8" dependencies = [ "bifrostlink", "camino", @@ -2013,7 +2012,7 @@ [[package]] name = "remowt-link-shared" -version = "0.1.7" +version = "0.1.8" dependencies = [ "bifrostlink", "bytes", @@ -2027,7 +2026,7 @@ [[package]] name = "remowt-plugin" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "bifrostlink", @@ -2040,7 +2039,7 @@ [[package]] name = "remowt-polkit-shared" -version = "0.1.7" +version = "0.1.8" dependencies = [ "nix", "serde", @@ -2049,7 +2048,7 @@ [[package]] name = "remowt-ssh" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "clap", @@ -2064,7 +2063,7 @@ [[package]] name = "remowt-ui-prompt" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "bifrostlink", --- a/Cargo.toml +++ b/Cargo.toml @@ -3,18 +3,18 @@ resolver = "2" [workspace.package] -version = "0.1.7" +version = "0.1.8" license = "MIT" edition = "2021" repository = "https://git.delta.rocks/r/remowt" [workspace.dependencies] -remowt-client = { version = "0.1.7", path = "crates/remowt-client" } -remowt-polkit-shared = { version = "0.1.7", path = "crates/polkit-shared" } -remowt-link-shared = { version = "0.1.7", path = "crates/remowt-link-shared" } -remowt-plugin = { version = "0.1.7", path = "crates/remowt-plugin" } -remowt-ui-prompt = { version = "0.1.7", path = "crates/remowt-ui-prompt" } -remowt-endpoints = { version = "0.1.7", path = "crates/remowt-endpoints" } +remowt-client = { version = "0.1.8", path = "crates/remowt-client" } +remowt-polkit-shared = { version = "0.1.8", path = "crates/polkit-shared" } +remowt-link-shared = { version = "0.1.8", path = "crates/remowt-link-shared" } +remowt-plugin = { version = "0.1.8", path = "crates/remowt-plugin" } +remowt-ui-prompt = { version = "0.1.8", path = "crates/remowt-ui-prompt" } +remowt-endpoints = { version = "0.1.8", path = "crates/remowt-endpoints" } bifrostlink = "0.2.0" bifrostlink-macros = "0.2.0" --- a/cmds/remowt-ssh/src/main.rs +++ b/cmds/remowt-ssh/src/main.rs @@ -53,8 +53,14 @@ let bundle = AgentBundle::from_dir(agents_dir()?)?; let (conn, escalate) = match &opts { - Opts::Ssh { host, escalate } => (Remowt::connect(host, &bundle).await?, *escalate), - Opts::Local { escalate } => (Remowt::connect_local(&bundle).await?, *escalate), + Opts::Ssh { host, escalate } => ( + Remowt::connect(host, &bundle, "remowt-ssh".to_owned()).await?, + *escalate, + ), + Opts::Local { escalate } => ( + Remowt::connect_local(&bundle, "remowt-ssh".to_owned()).await?, + *escalate, + ), }; let mut rpc = conn.rpc(); --- a/crates/remowt-client/src/lib.rs +++ b/crates/remowt-client/src/lib.rs @@ -249,6 +249,7 @@ #[allow(dead_code)] children: Mutex>, _runtime_tmp: Option, + user: String, } #[derive(Clone)] @@ -259,7 +260,7 @@ impl Remowt { /// Connect to the remote host over ssh, detect the architecture and deploy the required /// agent binary. - pub async fn connect(host: &str, bundle: &AgentBundle) -> Result { + pub async fn connect(host: &str, bundle: &AgentBundle, remowt_user: String) -> Result { let conf = russh_config::parse_home(host)?; let port = conf.host_config.port.or(conf.port).unwrap_or(22); let hostname = conf @@ -337,11 +338,12 @@ elevated: tokio::sync::OnceCell::new(), children: Mutex::new(Vec::new()), _runtime_tmp: None, + user: remowt_user, }))) } /// "Connect" to the local machine's agent, by starting the agent binary locally. - pub async fn connect_local(bundle: &AgentBundle) -> Result { + pub async fn connect_local(bundle: &AgentBundle, user: String) -> Result { let agent_path = bundle.local_binary()?; let mut child = tokio::process::Command::new(&agent_path) .arg("real-agent") @@ -368,6 +370,7 @@ elevated: tokio::sync::OnceCell::new(), children: Mutex::new(vec![child]), _runtime_tmp: runtime_tmp, + user, }))) } @@ -431,6 +434,14 @@ args.push("-w".to_owned()); args.push(tool.to_owned()); args.extend(flags.iter().copied().map(str::to_owned)); + if tool == "run0" { + args.push(format!( + "--unit={}-{}-{}.scope", + self.0.user, + std::process::id(), + Uuid::new_v4() + )); + } args.push(agent_path); args.push("real-agent".to_owned()); args.push("--privileged".to_owned()); --- a/crates/remowt-endpoints/Cargo.toml +++ b/crates/remowt-endpoints/Cargo.toml @@ -11,7 +11,13 @@ serde = { workspace = true } tempfile.workspace = true thiserror.workspace = true -tokio = { workspace = true, features = ["net", "io-util", "rt", "process"] } +tokio = { workspace = true, features = [ + "net", + "io-util", + "rt", + "process", + "io-std", +] } tracing.workspace = true nix = { workspace = true, features = ["process", "signal", "term"] } zbus.workspace = true -- gitstuff