delete agent flow
This commit is contained in:
1 parent
3053009a7e
commit
28dda76ee8
13 files changed
+295
-20
No files matched your search
@@ -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() {
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in new issue
Block a user