use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "essh", version, about = "Enhanced SSH Client")]
pub struct Cli {
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Connect {
target: String,
#[arg(short, long, default_value_t = 22)]
port: u16,
#[arg(short = 'i', long)]
identity: Option<PathBuf>,
#[arg(long)]
password: bool,
},
Hosts {
#[command(subcommand)]
action: HostsAction,
},
Keys {
#[command(subcommand)]
action: KeysAction,
},
Session {
#[command(subcommand)]
action: SessionAction,
},
Diag {
session_id: String,
},
Workspace {
#[command(subcommand)]
action: WorkspaceAction,
},
Bench,
Why {
target: String,
#[arg(short, long)]
port: Option<u16>,
#[arg(short, long, default_value_t = 5)]
timeout: u64,
},
Run {
group: String,
#[arg(last = true)]
command: Vec<String>,
},
Config {
#[command(subcommand)]
action: ConfigAction,
},
Audit {
#[command(subcommand)]
action: AuditAction,
},
}
#[derive(Subcommand, Debug)]
pub enum HostsAction {
List {
#[arg(long)]
tag: Option<String>,
},
Add {
hostname: String,
#[arg(short, long, default_value_t = 22)]
port: u16,
#[arg(short, long)]
name: Option<String>,
#[arg(short, long)]
user: Option<String>,
#[arg(long)]
tag: Vec<String>,
},
Remove {
hostname: String,
#[arg(short, long, default_value_t = 22)]
port: u16,
},
Import {
path: Option<PathBuf>,
},
Health {
#[arg(long)]
group: Option<String>,
},
}
#[derive(Subcommand, Debug)]
pub enum KeysAction {
List,
Add {
path: PathBuf,
#[arg(short, long)]
name: Option<String>,
},
Remove {
name: String,
},
}
#[derive(Subcommand, Debug)]
pub enum SessionAction {
List,
Replay {
id: String,
},
}
#[derive(Subcommand, Debug)]
pub enum ConfigAction {
Edit,
Show,
Init,
Ssh {
#[arg(short, long)]
path: Option<PathBuf>,
},
Resolve {
host: String,
#[arg(short, long)]
path: Option<PathBuf>,
},
}
#[derive(Subcommand, Debug)]
pub enum AuditAction {
Tail {
#[arg(short, long, default_value_t = 20)]
lines: usize,
},
}
#[derive(Subcommand, Debug)]
pub enum WorkspaceAction {
List,
Open {
name: String,
},
Save {
name: String,
#[arg(required = true)]
hosts: Vec<String>,
#[arg(long)]
on_connect: Option<String>,
},
Show {
name: String,
},
Remove {
name: String,
},
}