fix: Don't panic when running startup admin commands

This commit is contained in:
Ginger 2026-02-15 17:28:55 -05:00
parent 7b21c3fd9f
commit 4e1dac32a5
No known key found for this signature in database
4 changed files with 14 additions and 11 deletions

View file

@ -39,7 +39,15 @@ pub(crate) async fn run(services: Arc<Services>) -> Result<()> {
.runtime() .runtime()
.spawn(serve::serve(services.clone(), handle.clone(), tx.subscribe())); .spawn(serve::serve(services.clone(), handle.clone(), tx.subscribe()));
// Focal point // Run startup admin commands.
// This has to be done after the admin service is initialized otherwise it
// panics.
services.admin.startup_execute().await?;
// Print first-run banner if necessary. This needs to be done after the startup
// admin commands are run in case one of them created the first user.
services.firstrun.print_first_run_banner();
debug!("Running"); debug!("Running");
let res = tokio::select! { let res = tokio::select! {
res = &mut listener => res.map_err(Error::from).unwrap_or_else(Err), res = &mut listener => res.map_err(Error::from).unwrap_or_else(Err),

View file

@ -26,7 +26,7 @@ pub(super) async fn console_auto_stop(&self) {
/// Execute admin commands after startup /// Execute admin commands after startup
#[implement(super::Service)] #[implement(super::Service)]
pub(crate) async fn startup_execute(&self) -> Result { pub async fn startup_execute(&self) -> Result {
// List of commands to execute // List of commands to execute
let commands = &self.services.server.config.admin_execute; let commands = &self.services.server.config.admin_execute;

View file

@ -5,7 +5,7 @@ use std::{
use askama::Template; use askama::Template;
use async_trait::async_trait; use async_trait::async_trait;
use conduwuit::{Result, utils::ReadyExt}; use conduwuit::{Result, info, utils::ReadyExt};
use futures::StreamExt; use futures::StreamExt;
use ruma::{UserId, events::room::message::RoomMessageEventContent}; use ruma::{UserId, events::room::message::RoomMessageEventContent};
@ -146,6 +146,8 @@ impl Service {
.send_loud_message(RoomMessageEventContent::text_markdown(welcome_message)) .send_loud_message(RoomMessageEventContent::text_markdown(welcome_message))
.await?; .await?;
info!("{user} has been invited to the admin room as the first user.");
Ok(true) Ok(true)
} }
@ -162,7 +164,7 @@ impl Service {
} }
} }
pub(crate) fn print_first_run_banner(&self) { pub fn print_first_run_banner(&self) {
use yansi::Paint; use yansi::Paint;
// This function is specially called by the core after all other // This function is specially called by the core after all other
// services have started. It runs last to ensure that the banner it // services have started. It runs last to ensure that the banner it

View file

@ -149,13 +149,6 @@ impl Services {
debug_info!("Services startup complete."); debug_info!("Services startup complete.");
// Run startup admin commands
self.admin.startup_execute().await?;
// Prin first-run banner if necessary. This needs to be done after the startup
// admin commands are run in case one of them created the first user.
self.firstrun.print_first_run_banner();
Ok(Arc::clone(self)) Ok(Arc::clone(self))
} }