holger-cli/Cargo.toml
[package]
name = "holger-cli"
version = "3.1.1"
edition = "2021"
license = "AGPL-3.0-only"
repository = "https://git.gunnar.rs/nordisk/holger"
description = "holger-cli: the command-line tool of Holger. Every console action is a command (it dials only the server you name), plus the offline tools: the signed airgap bundle (prepare, approve, finalize, inspect, extract), the verifier and the courier (agent)."
# **THIN** (.nornir/SUITES.md, the `cli` variant): no local database, it talks gRPC to a
# server and nothing else. Its dependencies are exactly these, and
# `tests/thin_and_airgapped.rs` holds them: tonic's CLIENT half (no server, no router),
# the codec, the runtime, the argument parser and the code registry. No HTTP client
# beside tonic's channel, so the only connection it ever opens is to `--at`.
#
# Every crate here is already in holger's Cargo.lock: the client adds nothing to the tree.
[dependencies]
tonic = { version = "0.14", default-features = false, features = ["channel", "codegen", "tls-ring", "tls-webpki-roots"] }
tonic-prost = "0.14"
prost = "0.14"
tokio = { version = "1", features = ["rt-multi-thread", "macros", "io-std", "io-util", "fs", "sync", "time"] }
clap = { version = "4", features = ["derive", "env"] }
# The export's own digest is checked on the client (RA2-5): the summary's candidate_sha256
# against the core.json that arrived. ring's SHA-256: ring is already in this tree (rustls,
# under tonic's TLS), so the check adds no crate (every_shape_stays_slim: cli 84).
ring = "0.17"
# The FROZEN code registry (`holger-cli-1..4`). A zero-dependency leaf.
holger-errcode = { version = "3.1.1", path = "../errcode" }
# The offline tools (lane HOL-PRODUCTS): `bundle prepare|approve|finalize|inspect|extract`
# and `verify` (network-free), and `agent`, the courier (offline unless `online`).
holger-update-bundle = { version = "3.0.0", path = "../update-bundle" }
holger-agent-cli = { version = "3.1.1", path = "../agent/cli", default-features = false }
anyhow = "1"
[features]
# The default dials only `--at`, and only for a server command; the tools dial nothing.
default = []
# ── The named extras (the same four as `holger` and `holger-downstream`) ──
# No formats live in a client: `all-formats` adds nothing here.
all-formats = []
# `online`: the courier's crates.io/PyPI, Nexus, Artifactory and Holger routes.
online = ["holger-agent-cli/online"]
# `federation`: the courier's Nexus and Artifactory routes (they come with `online`).
federation = ["online"]
full = ["all-formats", "online", "federation"]
[dev-dependencies]
# The deadlines are tested on a paused clock (`conn`, RA2-4).
tokio = { version = "1", features = ["test-util"] }
# A REAL holger in the test process, for every command group (`tests/against_a_holger.rs`);
# `online` for the pull-through the dependency sets come from (`tests/dependency_sets_from_the_cli.rs`).
holger-server-lib = { path = "../server/lib", default-features = false, features = ["auth-bearer", "auth-passkey", "fmt-all", "jobs", "supply-chain", "admission", "sign", "sandbox-off", "online"] }
traits = { package = "holger-traits", path = "../traits", features = ["test-support"] }
# The intel import door (tests/against_a_holger.rs): the bundle signed as the box tests sign it.
rcgen = "0.14"
bench-scenarios = { package = "holger-bench-scenarios", path = "../bench-scenarios", features = ["secure-update"] }
nornir-auth-webauthn = { version = "0.2.0", features = ["test-support"] }
reqwest = { version = "0.13", default-features = false, features = ["rustls-no-provider", "json"] }
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }
serde_json = "1"
tempfile = "3"
toml = "1"
[[bin]]
name = "holger-cli"
path = "src/main.rs"