diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-20 01:23:38 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-20 01:23:38 +0100 |
| commit | 5caf1f1db721d6dee2ddb5d0613e8c9914ccf879 (patch) | |
| tree | 7816c2a9e1a5222f8068ab2cf941df55743ba6d3 /server/src | |
| parent | 62984a7250c8998556e0258d67964e8e481b243c (diff) | |
| download | jellything-5caf1f1db721d6dee2ddb5d0613e8c9914ccf879.tar jellything-5caf1f1db721d6dee2ddb5d0613e8c9914ccf879.tar.bz2 jellything-5caf1f1db721d6dee2ddb5d0613e8c9914ccf879.tar.zst | |
admin log
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/logger.rs | 23 | ||||
| -rw-r--r-- | server/src/routes.rs | 5 | ||||
| -rw-r--r-- | server/src/ui/admin/log.rs | 62 | ||||
| -rw-r--r-- | server/src/ui/admin/mod.rs | 1 |
4 files changed, 43 insertions, 48 deletions
diff --git a/server/src/logger.rs b/server/src/logger.rs index e7419ba..8ba572f 100644 --- a/server/src/logger.rs +++ b/server/src/logger.rs @@ -4,9 +4,9 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ -use chrono::{DateTime, Utc}; +use chrono::Utc; +use jellycommon::internal::{LogLevel, LogLine}; use log::Level; -use serde::{Deserialize, Serialize}; use std::{ collections::VecDeque, sync::{Arc, LazyLock, RwLock}, @@ -14,7 +14,6 @@ use std::{ use tokio::sync::broadcast; const MAX_LOG_LEN: usize = 4096; - static LOGGER: LazyLock<Log> = LazyLock::new(Log::default); pub fn setup_logger() { @@ -22,22 +21,6 @@ pub fn setup_logger() { log::set_max_level(log::LevelFilter::Debug); } -pub struct LogLine { - pub time: DateTime<Utc>, - pub module: Option<&'static str>, - pub level: LogLevel, - pub message: String, -} - -#[derive(Serialize, Deserialize, Clone, Copy, PartialEq)] -pub enum LogLevel { - Trace, - Debug, - Info, - Warn, - Error, -} - type LogBuffer = VecDeque<Arc<LogLine>>; pub struct Log { @@ -92,7 +75,7 @@ impl Log { fn do_log(&self, record: &log::Record) { let time = Utc::now(); let line = Arc::new(LogLine { - time, + time: time.to_rfc3339(), module: record.module_path_static(), level: match record.level() { Level::Error => LogLevel::Error, diff --git a/server/src/routes.rs b/server/src/routes.rs index acf6ffd..4a875f4 100644 --- a/server/src/routes.rs +++ b/server/src/routes.rs @@ -15,6 +15,7 @@ use crate::{ account::{r_account_login, r_account_login_post, r_account_logout, r_account_logout_post}, admin::{ import::{r_admin_import, r_admin_import_post, r_admin_import_stream}, + log::{r_admin_log, r_admin_log_stream}, r_admin_dashboard, }, assets::r_image, @@ -84,8 +85,8 @@ pub(super) fn build_rocket(state: Arc<State>) -> Rocket<Build> { r_admin_import_post, r_admin_import_stream, // r_admin_invite, - // r_admin_log_stream, - // r_admin_log, + r_admin_log_stream, + r_admin_log, // r_admin_remove_invite, // r_admin_remove_user, // r_admin_update_search, diff --git a/server/src/ui/admin/log.rs b/server/src/ui/admin/log.rs index da70360..0965a25 100644 --- a/server/src/ui/admin/log.rs +++ b/server/src/ui/admin/log.rs @@ -3,50 +3,60 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2026 metamuffin <metamuffin.org> */ -use crate::{request_info::RequestInfo, ui::error::MyResult}; +use crate::{ + logger::{get_log_buffer, get_log_stream}, + request_info::RequestInfo, + ui::error::MyResult, +}; +use jellyui::{Scaffold, ServerLogPage, render_log_line}; use rocket::{get, response::content::RawHtml}; use rocket_ws::{Message, Stream, WebSocket}; use serde_json::json; #[get("/admin/log?<warnonly>", rank = 2)] pub fn r_admin_log(ri: RequestInfo, warnonly: bool) -> MyResult<RawHtml<String>> { - ri.session.assert_admin()?; + ri.require_admin()?; let messages = get_log_buffer(warnonly) .into_iter() .map(|l| render_log_line(&l)) .collect::<Vec<_>>(); - Ok(RawHtml(render_page( - &ServerLogPage { - messages: &messages, - warnonly, - }, - ri.render_info(), - ))) + + Ok(RawHtml( + Scaffold { + class: "theme-purple", + main: ServerLogPage { + messages: &messages, + warnonly, + }, + ri: &ri.render_info(), + title: "Admin Log", + } + .to_string(), + )) } #[get("/admin/log?stream&<warnonly>&<html>", rank = 1)] pub fn r_admin_log_stream( - session: A<Session>, + ri: RequestInfo, ws: WebSocket, warnonly: bool, html: bool, -) -> Stream!['static] { - // TODO type problems - let ok = session.0.assert_admin().is_ok(); +) -> MyResult<Stream!['static]> { + ri.require_admin()?; let mut stream = get_log_stream(warnonly); - Stream! { ws => - if !ok { - yield Message::Text("unauthorized".to_string()); - } else if html { - let _ = ws; - while let Ok(line) = stream.recv().await { - yield Message::Text(render_log_line(&line)); - } - } else { - let _ = ws; - while let Ok(line) = stream.recv().await { - yield Message::Text(json!(line).to_string()); + Ok({ + Stream! { ws => + if html { + let _ = ws; + while let Ok(line) = stream.recv().await { + yield Message::Text(render_log_line(&line)); + } + } else { + let _ = ws; + while let Ok(line) = stream.recv().await { + yield Message::Text(json!(line).to_string()); + } } } - } + }) } diff --git a/server/src/ui/admin/mod.rs b/server/src/ui/admin/mod.rs index 57f00db..8413ead 100644 --- a/server/src/ui/admin/mod.rs +++ b/server/src/ui/admin/mod.rs @@ -5,6 +5,7 @@ */ pub mod import; +pub mod log; use super::error::MyResult; use crate::{request_info::RequestInfo, ui_responder::UiResponse}; |