aboutsummaryrefslogtreecommitdiff
path: root/src/cli/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/server.rs')
-rw-r--r--src/cli/server.rs83
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)]