diff --git a/src/service/admin/mod.rs b/src/service/admin/mod.rs index 2719c142..21ded34d 100644 --- a/src/service/admin/mod.rs +++ b/src/service/admin/mod.rs @@ -1,6 +1,7 @@ pub mod console; mod create; mod grant; +mod startup; use std::{ future::Future, @@ -9,7 +10,7 @@ use std::{ }; use async_trait::async_trait; -use conduit::{debug, error, error::default_log, info, pdu::PduBuilder, Err, Error, PduEvent, Result, Server}; +use conduit::{debug, error, error::default_log, pdu::PduBuilder, Err, Error, PduEvent, Result, Server}; pub use create::create_admin_room; use loole::{Receiver, Sender}; use ruma::{ @@ -20,10 +21,7 @@ use ruma::{ OwnedEventId, OwnedRoomId, RoomId, UserId, }; use serde_json::value::to_raw_value; -use tokio::{ - sync::{Mutex, RwLock}, - time::{sleep, Duration}, -}; +use tokio::sync::{Mutex, RwLock}; use crate::{globals, rooms, rooms::state::RoomMutexGuard, Dep}; @@ -361,53 +359,6 @@ impl Service { } } - /// Execute admin commands after startup - async fn startup_execute(&self) { - sleep(Duration::from_millis(500)).await; //TODO: remove this after run-states are broadcast - for (i, command) in self.services.server.config.admin_execute.iter().enumerate() { - self.startup_execute_command(i, command.clone()).await; - tokio::task::yield_now().await; - } - } - - /// Execute one admin command after startup - async fn startup_execute_command(&self, i: usize, command: String) { - debug!("Startup command #{i}: executing {command:?}"); - - match self.command_in_place(command, None).await { - Err(e) => error!("Startup command #{i} failed: {e:?}"), - Ok(None) => info!("Startup command #{i} completed (no output)."), - Ok(Some(output)) => Self::startup_command_output(i, &output), - } - } - - #[cfg(feature = "console")] - fn startup_command_output(i: usize, content: &RoomMessageEventContent) { - info!("Startup command #{i} completed:"); - console::print(content.body()); - } - - #[cfg(not(feature = "console"))] - fn startup_command_output(i: usize, content: &RoomMessageEventContent) { - info!("Startup command #{i} completed:\n{:#?}", content.body()); - } - - /// Possibly spawn the terminal console at startup if configured. - async fn console_auto_start(&self) { - #[cfg(feature = "console")] - if self.services.server.config.admin_console_automatic { - // Allow more of the startup sequence to execute before spawning - tokio::task::yield_now().await; - self.console.start().await; - } - } - - /// Shutdown the console when the admin worker terminates. - async fn console_auto_stop(&self) { - #[cfg(feature = "console")] - self.console.close().await; - } - /// Sets the self-reference to crate::Services which will provide context to /// the admin commands. pub(super) fn set_services(&self, services: &Option>) { diff --git a/src/service/admin/startup.rs b/src/service/admin/startup.rs new file mode 100644 index 00000000..79dc70d0 --- /dev/null +++ b/src/service/admin/startup.rs @@ -0,0 +1,61 @@ + +use conduit::{ + debug, error, implement, info, +}; +use ruma::events::room::message::RoomMessageEventContent; +use tokio::time::{sleep, Duration}; + +use super::console; + +/// Possibly spawn the terminal console at startup if configured. +#[implement(super::Service)] +pub(super) async fn console_auto_start(&self) { + #[cfg(feature = "console")] + if self.services.server.config.admin_console_automatic { + // Allow more of the startup sequence to execute before spawning + tokio::task::yield_now().await; + self.console.start().await; + } +} + +/// Shutdown the console when the admin worker terminates. +#[implement(super::Service)] +pub(super) async fn console_auto_stop(&self) { + #[cfg(feature = "console")] + self.console.close().await; +} + +/// Execute admin commands after startup +#[implement(super::Service)] +pub(super) async fn startup_execute(&self) { + sleep(Duration::from_millis(500)).await; //TODO: remove this after run-states are broadcast + for (i, command) in self.services.server.config.admin_execute.iter().enumerate() { + self.startup_execute_command(i, command.clone()).await; + tokio::task::yield_now().await; + } +} + +/// Execute one admin command after startup +#[implement(super::Service)] +async fn startup_execute_command(&self, i: usize, command: String) { + debug!("Startup command #{i}: executing {command:?}"); + + match self.command_in_place(command, None).await { + Err(e) => error!("Startup command #{i} failed: {e:?}"), + Ok(None) => info!("Startup command #{i} completed (no output)."), + Ok(Some(output)) => Self::startup_command_output(i, &output), + } +} + +#[cfg(feature = "console")] +#[implement(super::Service)] +fn startup_command_output(i: usize, content: &RoomMessageEventContent) { + info!("Startup command #{i} completed:"); + console::print(content.body()); +} + +#[cfg(not(feature = "console"))] +#[implement(super::Service)] +fn startup_command_output(i: usize, content: &RoomMessageEventContent) { + info!("Startup command #{i} completed:\n{:#?}", content.body()); +}