diff options
Diffstat (limited to 'src/cli/server.rs')
| -rw-r--r-- | src/cli/server.rs | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/cli/server.rs b/src/cli/server.rs index 0102b2d4..f6cf7e54 100644 --- a/src/cli/server.rs +++ b/src/cli/server.rs @@ -10,6 +10,8 @@ pub(super) fn run_server_command(args: &[String]) -> std::io::Result<Option<i32> "live-handoff" => server_live_handoff(&args[1..]).map(Some), "--handoff-import" => Ok(None), "reload-config" => server_reload_config(&args[1..]).map(Some), + "agent-manifests" => server_agent_manifests(&args[1..]).map(Some), + "reload-agent-manifests" => server_reload_agent_manifests(&args[1..]).map(Some), "help" | "--help" | "-h" => { print_server_help(); Ok(Some(0)) @@ -42,6 +44,85 @@ fn server_reload_config(args: &[String]) -> std::io::Result<i32> { })?) } +fn server_agent_manifests(args: &[String]) -> std::io::Result<i32> { + let json = match args { + [] => false, + [flag] if flag == "--json" => true, + _ => { + eprintln!("usage: herdr server agent-manifests [--json]"); + return Ok(2); + } + }; + + let response = super::send_request(&Request { + id: "cli:server:agent-manifests".into(), + method: Method::ServerAgentManifests(EmptyParams::default()), + })?; + if json || response.get("error").is_some() { + return super::print_response(&response); + } + + print_agent_manifest_status(&response); + Ok(0) +} + +fn server_reload_agent_manifests(args: &[String]) -> std::io::Result<i32> { + if !args.is_empty() { + eprintln!("usage: herdr server reload-agent-manifests"); + return Ok(2); + } + + super::print_response(&super::send_request(&Request { + id: "cli:server:reload-agent-manifests".into(), + method: Method::ServerReloadAgentManifests(EmptyParams::default()), + })?) +} + +fn print_agent_manifest_status(response: &serde_json::Value) { + let result = &response["result"]; + let last_check = result["last_check_unix"] + .as_u64() + .map(|value| value.to_string()) + .unwrap_or_else(|| "never".to_string()); + let last_result = result["last_result"].as_str().unwrap_or("not checked"); + println!("last check: {last_check}"); + println!("result: {last_result}"); + println!(); + + let Some(manifests) = result["manifests"].as_array() else { + return; + }; + for manifest in manifests { + let agent = manifest["agent"].as_str().unwrap_or("-"); + let source = manifest["source_kind"].as_str().unwrap_or("-"); + let active_version = manifest["active_version"].as_str().unwrap_or("-"); + let remote_version = manifest["cached_remote_version"].as_str().unwrap_or("-"); + let remote_result = manifest["remote_update_result"] + .as_str() + .unwrap_or("not checked"); + let local_override_shadowing_remote = manifest["local_override_shadowing_remote"] + .as_bool() + .unwrap_or(false); + let marker = if local_override_shadowing_remote { + "!" + } else if manifest["remote_update_error"].as_str().is_some() { + "x" + } else { + " " + }; + println!( + "{marker} {agent:<9} {source:<14} active {active_version:<14} remote {remote_version:<14} {remote_result}" + ); + if let Some(error) = manifest["remote_update_error"].as_str() { + println!(" {error}"); + } else if local_override_shadowing_remote { + println!(" local override shadows cached remote rules"); + } else if let Some(warning) = manifest["warning"].as_str() { + println!(" {warning}"); + } + } +} + fn server_live_handoff(args: &[String]) -> std::io::Result<i32> { let Some(params) = parse_live_handoff_params(args) else { eprintln!( @@ -105,6 +186,8 @@ fn print_server_help() { eprintln!(" herdr server stop stop the running server via the API socket"); eprintln!(" herdr server live-handoff hand off live panes to a new local server"); eprintln!(" herdr server reload-config reload config.toml in the running server"); + eprintln!(" herdr server agent-manifests [--json] show agent detection manifest status"); + eprintln!(" herdr server reload-agent-manifests reload agent detection manifests in the running server"); } #[cfg(test)] |
