From fa43ac211010bf0c7d41e559f9abab92af11aac3 Mon Sep 17 00:00:00 2001 From: William Brown Date: Thu, 7 May 2020 14:08:06 +1000 Subject: [PATCH] 216 - add initial /status endpoint --- kanidm_unix_int/src/daemon.rs | 12 +++++++----- kanidmd/src/lib/core/mod.rs | 17 +++++++++++++++++ kanidmd/src/lib/lib.rs | 1 + kanidmd/src/lib/status.rs | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 kanidmd/src/lib/status.rs diff --git a/kanidm_unix_int/src/daemon.rs b/kanidm_unix_int/src/daemon.rs index b80d3e570..493f44cf2 100644 --- a/kanidm_unix_int/src/daemon.rs +++ b/kanidm_unix_int/src/daemon.rs @@ -241,11 +241,13 @@ async fn main() { match socket_res { Ok(socket) => { let cachelayer_ref = cachelayer.clone(); - tokio::spawn(async move { - if let Err(e) = handle_client(socket, cachelayer_ref.clone()).await { - error!("an error occured; error = {:?}", e); - } - }); + tokio::spawn( + async move { + if let Err(e) = handle_client(socket, cachelayer_ref.clone()).await { + error!("an error occured; error = {:?}", e); + } + }, + ); } Err(err) => { error!("Accept error -> {:?}", err); diff --git a/kanidmd/src/lib/core/mod.rs b/kanidmd/src/lib/core/mod.rs index 915e40620..3db3a1641 100644 --- a/kanidmd/src/lib/core/mod.rs +++ b/kanidmd/src/lib/core/mod.rs @@ -35,6 +35,7 @@ use crate::interval::IntervalActor; use crate::schema::Schema; use crate::schema::SchemaTransaction; use crate::server::QueryServer; +use crate::status::{StatusActor, StatusRequestEvent}; use crate::utils::duration_from_epoch_now; use crate::value::PartialValue; @@ -50,6 +51,7 @@ use uuid::Uuid; struct AppState { qe_r: Addr, qe_w: Addr, + status: Addr, } fn get_current_user(session: &Session) -> Option { @@ -1024,6 +1026,16 @@ async fn idm_account_set_password( ) } +// == Status + +async fn status((_session, state): (Session, Data)) -> HttpResponse { + let r = state.status.send(StatusRequestEvent {}).await; + match r { + Ok(true) => HttpResponse::Ok().json(true), + _ => HttpResponse::InternalServerError().json(false), + } +} + // === internal setup helpers fn setup_backend(config: &Configuration) -> Result { @@ -1366,6 +1378,9 @@ pub fn create_server_core(config: Configuration) { // asynchronously. let log_addr = async_log::start(); + // Start the status tracking thread + let status_addr = StatusActor::start(log_addr.clone()); + // Setup TLS (if any) let opt_tls_params = match setup_tls(&config) { Ok(opt_tls_params) => opt_tls_params, @@ -1457,6 +1472,7 @@ pub fn create_server_core(config: Configuration) { .data(AppState { qe_r: server_read_addr.clone(), qe_w: server_write_addr.clone(), + status: status_addr.clone(), }) .wrap(middleware::Logger::default()) .wrap( @@ -1489,6 +1505,7 @@ pub fn create_server_core(config: Configuration) { .into() }), ) + .service(web::scope("/status").route("", web::get().to(status))) .service( web::scope("/v1/raw") .route("/create", web::post().to(create)) diff --git a/kanidmd/src/lib/lib.rs b/kanidmd/src/lib/lib.rs index 5c85b0d20..aba3d71ec 100644 --- a/kanidmd/src/lib/lib.rs +++ b/kanidmd/src/lib/lib.rs @@ -35,6 +35,7 @@ mod idm; mod repl; mod schema; mod server; +mod status; pub mod config; pub mod core; diff --git a/kanidmd/src/lib/status.rs b/kanidmd/src/lib/status.rs new file mode 100644 index 000000000..285e1ee99 --- /dev/null +++ b/kanidmd/src/lib/status.rs @@ -0,0 +1,35 @@ +use crate::async_log::{EventLog, LogEvent}; +use actix::prelude::*; + +pub struct StatusActor { + log_addr: actix::Addr, +} + +impl StatusActor { + pub fn start(log_addr: actix::Addr) -> actix::Addr { + SyncArbiter::start(1, move || StatusActor { + log_addr: log_addr.clone(), + }) + } +} + +impl Actor for StatusActor { + type Context = SyncContext; +} + +pub struct StatusRequestEvent {} + +impl Message for StatusRequestEvent { + type Result = bool; +} + +impl Handler for StatusActor { + type Result = bool; + + fn handle(&mut self, _event: StatusRequestEvent, _ctx: &mut SyncContext) -> Self::Result { + self.log_addr.do_send(LogEvent { + msg: "status request event: ok".to_string(), + }); + true + } +}