From 3d3d63fdf44549d8fe997906900f42fbf51ff0df Mon Sep 17 00:00:00 2001
From: Jason Volk <jason@zemos.net>
Date: Sun, 16 Jun 2024 01:44:41 +0000
Subject: [PATCH] admin commands for shutdown/reload

Signed-off-by: Jason Volk <jason@zemos.net>
---
 src/admin/mod.rs                    |  2 ++
 src/admin/server/mod.rs             | 15 +++++++++++----
 src/admin/server/server_commands.rs | 15 +++++++++++++++
 src/service/admin/console.rs        |  2 +-
 4 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/admin/mod.rs b/src/admin/mod.rs
index 1832cc9b2..33158b5cd 100644
--- a/src/admin/mod.rs
+++ b/src/admin/mod.rs
@@ -1,3 +1,5 @@
+#![allow(clippy::wildcard_imports)]
+
 pub(crate) mod appservice;
 pub(crate) mod debug;
 pub(crate) mod federation;
diff --git a/src/admin/server/mod.rs b/src/admin/server/mod.rs
index e591f7c5d..254735a36 100644
--- a/src/admin/server/mod.rs
+++ b/src/admin/server/mod.rs
@@ -3,10 +3,7 @@
 use clap::Subcommand;
 use ruma::events::room::message::RoomMessageEventContent;
 
-use self::server_commands::{
-	backup_database, clear_database_caches, clear_service_caches, list_backups, list_database_files, memory_usage,
-	show_config, uptime,
-};
+use self::server_commands::*;
 use crate::Result;
 
 #[cfg_attr(test, derive(Debug))]
@@ -42,6 +39,13 @@ pub(crate) enum ServerCommand {
 
 	/// - List database files
 	ListDatabaseFiles,
+
+	#[cfg(conduit_mods)]
+	/// - Hot-reload the server
+	Reload,
+
+	/// - Shutdown the server
+	Shutdown,
 }
 
 pub(crate) async fn process(command: ServerCommand, body: Vec<&str>) -> Result<RoomMessageEventContent> {
@@ -58,5 +62,8 @@ pub(crate) async fn process(command: ServerCommand, body: Vec<&str>) -> Result<R
 		ServerCommand::ListBackups => list_backups(body).await?,
 		ServerCommand::BackupDatabase => backup_database(body).await?,
 		ServerCommand::ListDatabaseFiles => list_database_files(body).await?,
+		#[cfg(conduit_mods)]
+		ServerCommand::Reload => reload(body).await?,
+		ServerCommand::Shutdown => shutdown(body).await?,
 	})
 }
diff --git a/src/admin/server/server_commands.rs b/src/admin/server/server_commands.rs
index d80cc3d7d..c9daedc4f 100644
--- a/src/admin/server/server_commands.rs
+++ b/src/admin/server/server_commands.rs
@@ -1,3 +1,4 @@
+use conduit::warn;
 use ruma::events::room::message::RoomMessageEventContent;
 
 use crate::{services, Result};
@@ -96,3 +97,17 @@ pub(crate) async fn list_database_files(_body: Vec<&str>) -> Result<RoomMessageE
 	let result = services().globals.db.file_list()?;
 	Ok(RoomMessageEventContent::notice_html(String::new(), result))
 }
+
+#[cfg(conduit_mods)]
+pub(crate) async fn reload(_body: Vec<&str>) -> Result<RoomMessageEventContent> {
+	services().server.reload()?;
+
+	Ok(RoomMessageEventContent::notice_plain(String::new()))
+}
+
+pub(crate) async fn shutdown(_body: Vec<&str>) -> Result<RoomMessageEventContent> {
+	warn!("shutdown command");
+	services().server.shutdown()?;
+
+	Ok(RoomMessageEventContent::notice_plain(String::new()))
+}
diff --git a/src/service/admin/console.rs b/src/service/admin/console.rs
index 66faf2c14..13cfdb274 100644
--- a/src/service/admin/console.rs
+++ b/src/service/admin/console.rs
@@ -73,7 +73,7 @@ pub async fn close(self: &Arc<Self>) {
 
 	#[tracing::instrument(skip_all, name = "console")]
 	async fn worker(self: Arc<Self>) {
-		loop {
+		while services().server.running() {
 			let mut input = self.input.lock().await;
 
 			let suppression = log::Suppress::new(&services().server);
-- 
GitLab