delete agent flow

This commit is contained in:
lda committed 2026-04-14 05:34:56 +07:00
1 parent 3053009a7e
commit 28dda76ee8
13 files changed
+295 -20

No files matched your search

+42 -1
View File
@@ -4,7 +4,8 @@ use anyhow::{Context, Result};
use crate::api;
use crate::cli::{
IssueEnrollTokenArgs, ListEnrollTokensArgs, RevokeEnrollTokenArgs, StateStatsArgs,
IssueEnrollTokenArgs, ListEnrollTokensArgs, RevokeAgentArgs, RevokeEnrollTokenArgs,
StateStatsArgs,
};
use crate::config;
use crate::state;
@@ -174,6 +175,46 @@ pub async fn revoke_enroll_token(args: RevokeEnrollTokenArgs) -> Result<()> {
Ok(())
}
pub async fn revoke_agent(args: RevokeAgentArgs) -> Result<()> {
let settings = config::resolve_revoke_agent_settings(&args)?;
if let Some(base) = settings.public_url.as_deref() {
let url = format!("{}/api/v1/control/agents/{}", base, args.agent_id);
let client = reqwest::Client::new();
let response = client
.delete(&url)
.send()
.await
.with_context(|| format!("failed to call {url}"))?;
if !response.status().is_success() {
let status = response.status();
let body = response
.text()
.await
.unwrap_or_else(|_| "<unreadable error body>".to_string());
anyhow::bail!("live revoke-agent failed with {status}: {body}");
}
let body: api::RevokeAgentResponse = response
.json()
.await
.context("failed to decode revoke-agent response")?;
println!("agent_id={} revoked={}", body.agent_id, body.revoked);
return Ok(());
}
let store =
state::Store::load_or_init(&settings.state_file, Vec::new(), Duration::from_secs(1))
.await
.with_context(|| {
format!(
"failed to initialize store {}",
settings.state_file.display()
)
})?;
let removed = store.revoke_agent(&args.agent_id).await?;
println!("agent_id={} revoked={}", args.agent_id, removed);
Ok(())
}
pub async fn state_stats(args: StateStatsArgs) -> Result<()> {
let settings = config::resolve_state_stats_settings(&args)?;
if let Some(base) = settings.public_url.as_deref() {
+5
View File
@@ -26,6 +26,7 @@ use crate::ws;
mod admin;
mod process;
pub use admin::{issue_enroll_token, list_enroll_tokens, revoke_enroll_token, state_stats};
pub use admin::revoke_agent;
pub use process::reload_daemon;
use process::{remove_pid_file, write_pid_file};
@@ -85,6 +86,10 @@ fn control_api_routes() -> Router<AppState> {
.route("/api/v1/control/alerts/history", get(api::alert_history))
.route("/api/v1/control/alerts/ws", get(api::alerts_stream))
.route("/api/v1/control/agents", get(api::list_agents))
.route(
"/api/v1/control/agents/{agent_id}",
axum::routing::delete(api::revoke_agent),
)
.route(
"/api/v1/control/agents/{agent_id}/command",
post(api::run_command),