diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-09-10 23:33:27 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-10 23:33:27 +0300 |
| commit | 043b804c44665b07bd503fdad896bbe0a29311a0 (patch) | |
| tree | 79bae0b64ba1c0e22328b0401196587633399c60 /src/main.rs | |
| parent | 425c86179791cd32e2d4ce0ae7f269940b4b0663 (diff) | |
feat: route cli commands to saved ssh machines (#3918)
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 40 |
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", |
