bssh 2.4.2

Parallel SSH command execution tool for cluster management
Documentation
[workspace]
members = [
    ".",
    "crates/bssh-russh-sftp",
]

[package]
name = "bssh"
version = "2.4.2"
authors = ["Jeongkyu Shin <inureyes@gmail.com>"]
description = "Parallel SSH command execution tool for cluster management"
license = "Apache-2.0"
repository = "https://github.com/lablup/bssh"
readme = "README.md"
keywords = ["cli", "rust"]
categories = ["command-line-utilities"]
edition = "2024"
# MSRV 1.96: aligned with the Launchpad PPA build toolchain (rustc-1.96 on
# jammy/noble, Ubuntu 26.04 archive on resolute). Hard floor is 1.89
# (`rustyline` 18 uses `File::lock`, stabilized in 1.89); `time` 0.3.47
# (RUSTSEC-2026-0009) requires >= 1.88. The declared value tracks the PPA
# build toolchain, not the hard floor.
rust-version = "1.96"

[dependencies]
bytes = "1.11.1"
tokio = { version = "1.52.3", features = ["full"] }
# Upstream russh: both fork patches are now upstreamed
# - handle-data high-frequency PTY output fix: upstream #731 (v0.62.0)
# - SHA-1 MAC exclusion from Preferred::DEFAULT: upstream #690 (v0.60.2)
russh = "0.62.1"
# Use our internal russh-sftp fork tracking upstream 2.3.0
# (adds pipelined File I/O; serde_bytes perf fix is now upstreamed)
russh-sftp = { package = "bssh-russh-sftp", version = "2.3.0", path = "crates/bssh-russh-sftp" }
clap = { version = "4.6.1", features = ["derive", "env"] }
anyhow = "1.0.102"
thiserror = "2.0.18"
tracing = "0.1.44"
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_yaml = "0.9"
futures = "0.3.32"
async-trait = "0.1.89"
indicatif = "0.18.4"
rpassword = "7.4.0"
dirs = "6.0"
chrono = { version = "0.4.44", features = ["serde"] }
glob = "0.3.3"
whoami = "2.1.1"
owo-colors = "4.3.0"
unicode-width = "0.2.2"
terminal_size = "0.4.4"
zeroize = { version = "1.8.2", features = ["derive"] }
secrecy = { version = "0.10.3", features = ["serde"] }
rustyline = "18.0.0"
crossterm = "0.29"
ratatui = "0.30"
regex = "1.12.3"
signal-hook = "0.4"
nix = { version = "0.31", features = ["fs", "poll", "process", "signal", "term"] }
smallvec = "1.15.1"
lru = "0.18.0"
uuid = { version = "1.23.1", features = ["v4"] }
tokio-util = "0.7.18"
socket2 = "0.6"
shell-words = "1.1.1"
libc = "0.2"
ipnetwork = "0.21"
bcrypt = "0.19"
argon2 = { version = "0.5", features = ["std"] }
rand = "0.10"
# Pinned to match russh's ssh-key (0.62.x uses =0.7.0-rc.11) so the workspace
# resolves a single ssh-key version instead of 0.6 + 0.7-rc side by side.
ssh-key = { version = "=0.7.0-rc.11", features = ["std"] }
async-compression = { version = "0.4", features = ["tokio", "gzip"] }
serde_json = "1.0"
opentelemetry = "0.32"
opentelemetry_sdk = { version = "0.32", features = ["rt-tokio", "logs"] }
opentelemetry-otlp = { version = "0.32", features = ["grpc-tonic", "logs"] }
url = "2.5"
tokio-rustls = "0.26"
rustls-native-certs = "0.8"

[target.'cfg(target_os = "macos")'.dependencies]
security-framework = "3.7.0"

[dev-dependencies]
tempfile = "3.27.0"
mockito = "1.7.2"
tokio-test = "0.4"
serial_test = "3.4"
insta = "1.47"
criterion = { version = "0.8", features = ["html_reports"] }
mockall = "0.14"

[[bench]]
name = "large_output_benchmark"
harness = false

[[bin]]
name = "bssh-server"
path = "src/bin/bssh_server.rs"

[[bin]]
name = "bssh-keygen"
path = "src/bin/bssh_keygen.rs"


# Tuned release profile (issue #187): fat LTO plus a single codegen unit let
# the compiler inline across the russh framing / cipher / SFTP hot path,
# which per-packet overhead makes worthwhile for bulk SFTP/SCP transfers.
# For an additional boost on known deployment hardware, build with a pinned
# target CPU, e.g.:
#   RUSTFLAGS="-C target-cpu=x86-64-v3" cargo build --release   # AVX2-class servers
#   RUSTFLAGS="-C target-cpu=native"    cargo build --release   # this machine only
[profile.release]
lto = "fat"
codegen-units = 1