add admin server uptime command

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-04-26 18:55:45 -07:00 committed by June
parent 781d4b7907
commit 4b6938e0f6
3 changed files with 26 additions and 3 deletions

View file

@ -5,13 +5,16 @@ use ruma::events::room::message::RoomMessageEventContent;
use self::server_commands::{ use self::server_commands::{
backup_database, clear_database_caches, clear_service_caches, list_backups, list_database_files, memory_usage, backup_database, clear_database_caches, clear_service_caches, list_backups, list_database_files, memory_usage,
show_config, show_config, uptime,
}; };
use crate::Result; use crate::Result;
#[cfg_attr(test, derive(Debug))] #[cfg_attr(test, derive(Debug))]
#[derive(Subcommand)] #[derive(Subcommand)]
pub(crate) enum ServerCommand { pub(crate) enum ServerCommand {
/// - Time elapsed since startup
Uptime,
/// - Show configuration values /// - Show configuration values
ShowConfig, ShowConfig,
@ -43,6 +46,7 @@ pub(crate) enum ServerCommand {
pub(crate) async fn process(command: ServerCommand, body: Vec<&str>) -> Result<RoomMessageEventContent> { pub(crate) async fn process(command: ServerCommand, body: Vec<&str>) -> Result<RoomMessageEventContent> {
Ok(match command { Ok(match command {
ServerCommand::Uptime => uptime(body).await?,
ServerCommand::ShowConfig => show_config(body).await?, ServerCommand::ShowConfig => show_config(body).await?,
ServerCommand::MemoryUsage => memory_usage(body).await?, ServerCommand::MemoryUsage => memory_usage(body).await?,
ServerCommand::ClearDatabaseCaches { ServerCommand::ClearDatabaseCaches {

View file

@ -2,6 +2,24 @@ use ruma::events::room::message::RoomMessageEventContent;
use crate::{services, Result}; use crate::{services, Result};
pub(crate) async fn uptime(_body: Vec<&str>) -> Result<RoomMessageEventContent> {
let seconds = services()
.globals
.started
.elapsed()
.expect("standard duration")
.as_secs();
let result = format!(
"up {} days, {} hours, {} minutes, {} seconds.",
seconds / 86400,
(seconds % 86400) / 60 / 60,
(seconds % 3600) / 60,
seconds % 60,
);
Ok(RoomMessageEventContent::notice_html(String::new(), result))
}
pub(crate) async fn show_config(_body: Vec<&str>) -> Result<RoomMessageEventContent> { pub(crate) async fn show_config(_body: Vec<&str>) -> Result<RoomMessageEventContent> {
// Construct and send the response // Construct and send the response
Ok(RoomMessageEventContent::text_plain(format!("{}", services().globals.config))) Ok(RoomMessageEventContent::text_plain(format!("{}", services().globals.config)))

View file

@ -7,7 +7,7 @@ use std::{
atomic::{self, AtomicBool}, atomic::{self, AtomicBool},
Arc, Arc,
}, },
time::Instant, time::{Instant, SystemTime},
}; };
use argon2::Argon2; use argon2::Argon2;
@ -63,7 +63,7 @@ pub(crate) struct Service<'a> {
pub(crate) roomid_federationhandletime: RwLock<HashMap<OwnedRoomId, (OwnedEventId, Instant)>>, pub(crate) roomid_federationhandletime: RwLock<HashMap<OwnedRoomId, (OwnedEventId, Instant)>>,
pub(crate) stateres_mutex: Arc<Mutex<()>>, pub(crate) stateres_mutex: Arc<Mutex<()>>,
pub(crate) rotate: RotationHandler, pub(crate) rotate: RotationHandler,
pub(crate) started: SystemTime,
pub(crate) shutdown: AtomicBool, pub(crate) shutdown: AtomicBool,
pub(crate) argon: Argon2<'a>, pub(crate) argon: Argon2<'a>,
} }
@ -165,6 +165,7 @@ impl Service<'_> {
stateres_mutex: Arc::new(Mutex::new(())), stateres_mutex: Arc::new(Mutex::new(())),
sync_receivers: RwLock::new(HashMap::new()), sync_receivers: RwLock::new(HashMap::new()),
rotate: RotationHandler::new(), rotate: RotationHandler::new(),
started: SystemTime::now(),
shutdown: AtomicBool::new(false), shutdown: AtomicBool::new(false),
argon, argon,
}; };