server: reject unknown startup flags
This commit is contained in:
parent
1bc1eaf0ef
commit
23ba1126d8
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -1652,7 +1652,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.22.39"
|
version = "0.22.40"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1686,7 +1686,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.22.39"
|
version = "0.22.40"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
@ -1698,7 +1698,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.22.39"
|
version = "0.22.40"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@ -4,7 +4,7 @@ path = "src/main.rs"
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.22.39"
|
version = "0.22.40"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.22.39"
|
version = "0.22.40"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ bench = false
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.22.39"
|
version = "0.22.40"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
autobins = false
|
autobins = false
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,37 @@
|
|||||||
/*──────────────── main ───────────────────────*/
|
/*──────────────── main ───────────────────────*/
|
||||||
fn print_version_and_exit_requested() -> bool {
|
fn usage_line() -> &'static str {
|
||||||
if std::env::args()
|
"Usage: lesavka-server [--version|-V] [--help|-h]"
|
||||||
.skip(1)
|
}
|
||||||
.any(|arg| arg == "--version" || arg == "-V")
|
|
||||||
{
|
fn handle_startup_args() -> anyhow::Result<bool> {
|
||||||
println!("{} {}", PKG_NAME, lesavka_server::VERSION);
|
let args = std::env::args().skip(1).collect::<Vec<_>>();
|
||||||
return true;
|
match args.as_slice() {
|
||||||
|
[] => Ok(false),
|
||||||
|
[arg] if arg == "--version" || arg == "-V" => {
|
||||||
|
println!("{} {}", PKG_NAME, lesavka_server::VERSION);
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
[arg] if arg == "--help" || arg == "-h" => {
|
||||||
|
println!("{}", usage_line());
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
[arg] if arg.starts_with('-') => {
|
||||||
|
let suggestion = if "--version".starts_with(arg.as_str()) {
|
||||||
|
"; did you mean --version?"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
|
anyhow::bail!("unknown option {arg:?}{suggestion}; {}", usage_line())
|
||||||
|
}
|
||||||
|
[arg] => anyhow::bail!("unexpected positional argument {arg:?}; {}", usage_line()),
|
||||||
|
_ => anyhow::bail!("too many arguments; {}", usage_line()),
|
||||||
}
|
}
|
||||||
false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(coverage))]
|
#[cfg(not(coverage))]
|
||||||
#[tokio::main(worker_threads = 4)]
|
#[tokio::main(worker_threads = 4)]
|
||||||
async fn main() -> anyhow::Result<()> {
|
async fn main() -> anyhow::Result<()> {
|
||||||
if print_version_and_exit_requested() {
|
if handle_startup_args()? {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,7 +76,7 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
#[cfg(coverage)]
|
#[cfg(coverage)]
|
||||||
#[tokio::main(worker_threads = 2)]
|
#[tokio::main(worker_threads = 2)]
|
||||||
async fn main() -> anyhow::Result<()> {
|
async fn main() -> anyhow::Result<()> {
|
||||||
if print_version_and_exit_requested() {
|
if handle_startup_args()? {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -134,6 +134,33 @@ fn server_binary_reports_version_without_starting_relay() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[serial]
|
||||||
|
fn server_binary_rejects_truncated_version_flag_without_starting_relay() {
|
||||||
|
let Some(bin) = find_binary("lesavka-server") else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let output = Command::new(bin)
|
||||||
|
.arg("--versio")
|
||||||
|
.output()
|
||||||
|
.expect("run lesavka-server --versio");
|
||||||
|
assert!(
|
||||||
|
!output.status.success(),
|
||||||
|
"truncated flag should fail instead of starting a second relay"
|
||||||
|
);
|
||||||
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||||
|
assert!(
|
||||||
|
stderr.contains("unknown option")
|
||||||
|
&& stderr.contains("did you mean --version")
|
||||||
|
&& stderr.contains("Usage: lesavka-server"),
|
||||||
|
"truncated flag should produce a helpful CLI error; stderr was:\n{stderr}"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
!stderr.contains("Address already in use") && !stderr.contains("open singleton lock"),
|
||||||
|
"argument validation should happen before relay, log, or UVC startup; stderr was:\n{stderr}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[serial]
|
#[serial]
|
||||||
fn server_binary_stays_up_with_missing_hid_nodes_and_current_version() {
|
fn server_binary_stays_up_with_missing_hid_nodes_and_current_version() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user