aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-10 23:33:27 +0300
committerGitHub <noreply@github.com>2026-09-10 23:33:27 +0300
commit043b804c44665b07bd503fdad896bbe0a29311a0 (patch)
tree79bae0b64ba1c0e22328b0401196587633399c60 /src/main.rs
parent425c86179791cd32e2d4ce0ae7f269940b4b0663 (diff)
feat: route cli commands to saved ssh machines (#3918)
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs40
1 files changed, 27 insertions, 13 deletions
diff --git a/src/main.rs b/src/main.rs
index cf7cf5b4..87f3ce0a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -482,6 +482,23 @@ where
.collect()
}
+fn finish_cli(outcome: io::Result<cli::CommandOutcome>) -> io::Result<()> {
+ match outcome {
+ Ok(cli::CommandOutcome::Handled(code)) => std::process::exit(code),
+ Ok(cli::CommandOutcome::NotCli) => Ok(()),
+ Err(err) if cli::protocol_mismatch_was_reported(&err) => std::process::exit(1),
+ Err(err) if cli::server_not_running_was_reported(&err) => {
+ if let Some(response) = cli::server_not_running_reported_response(&err) {
+ if let Ok(json) = serde_json::to_string(response) {
+ eprintln!("{json}");
+ }
+ }
+ std::process::exit(1);
+ }
+ Err(err) => Err(err),
+ }
+}
+
fn main() -> io::Result<()> {
let raw_args: Vec<String> = match args_as_utf8(std::env::args_os()) {
Ok(args) => args,
@@ -491,6 +508,9 @@ fn main() -> io::Result<()> {
std::process::exit(2);
}
};
+ if let Some(outcome) = cli::maybe_run_machine(&raw_args) {
+ return finish_cli(outcome);
+ }
let args = match session::configure_from_args(&raw_args) {
Ok(args) => args,
Err(err) => {
@@ -522,19 +542,10 @@ fn main() -> io::Result<()> {
std::process::exit(2);
}
- match cli::maybe_run(&args) {
- Ok(cli::CommandOutcome::Handled(code)) => std::process::exit(code),
- Ok(cli::CommandOutcome::NotCli) => {}
- Err(err) if cli::protocol_mismatch_was_reported(&err) => std::process::exit(1),
- Err(err) if cli::server_not_running_was_reported(&err) => {
- if let Some(response) = cli::server_not_running_reported_response(&err) {
- if let Ok(json) = serde_json::to_string(response) {
- eprintln!("{json}");
- }
- }
- std::process::exit(1);
- }
- Err(err) => return Err(err),
+ finish_cli(cli::maybe_run(&args))?;
+
+ if args.get(1).map(String::as_str) == Some("remote-api-bridge") {
+ return remote::run_remote_api_bridge(&args[2..]);
}
// Subcommands and flags (no TUI, no logging needed)
@@ -585,6 +596,7 @@ fn main() -> io::Result<()> {
println!();
println!("Usage: herdr [options]");
println!(" herdr --session <name> [options]");
+ println!(" herdr --machine <label-or-id> <command>");
println!(" herdr --remote <ssh-target> [--session <name>]");
println!(" herdr session attach <name>");
println!(" herdr completion zsh");
@@ -678,6 +690,7 @@ fn main() -> io::Result<()> {
println!();
println!("Options:");
println!(" --session <name> Use or create a named persistent session");
+ println!(" --machine <label-or-id> Run an API command on a saved SSH machine");
println!(" --remote <target> Attach through SSH to a remote Herdr server");
println!(" --remote-keybindings <local|server>");
println!(" Keybindings for --remote app attach (default: local)");
@@ -717,6 +730,7 @@ fn main() -> io::Result<()> {
// Reject unknown flags
let known_flags = [
"--session",
+ "--machine",
"--remote",
"--remote-keybindings",
"--version",