diff --git a/src/modes/server/api/status.rs b/src/modes/server/api/status.rs index e69de29..c01bf75 100644 --- a/src/modes/server/api/status.rs +++ b/src/modes/server/api/status.rs @@ -0,0 +1,114 @@ +use axum::{ + extract::{ConnectInfo, State}, + http::{HeaderMap, StatusCode}, + response::Json, + http::header, +}; +use log::warn; +use serde_json::json; +use std::net::SocketAddr; +use std::collections::HashMap; + +use crate::compression_engine::CompressionType; +use crate::meta_plugin::MetaPluginType; +use crate::modes::server::common::{AppState, ApiResponse, check_auth}; + +pub async fn handle_status( + State(state): State, + headers: HeaderMap, + ConnectInfo(addr): ConnectInfo, +) -> Result>>, StatusCode> { + if !check_auth(&headers, &state.password) { + warn!("Unauthorized request to /api/status from {}", addr); + return Err(StatusCode::UNAUTHORIZED); + } + + let mut status_info = HashMap::new(); + + // Add version info + status_info.insert( + "version".to_string(), + json!(env!("CARGO_PKG_VERSION")) + ); + + // Add database path + status_info.insert( + "database_path".to_string(), + json!(state.db.lock().await.path().unwrap_or("unknown")) + ); + + // Add data directory + status_info.insert( + "data_directory".to_string(), + json!(state.data_dir.to_string_lossy()) + ); + + // Add compression engines + let compression_engines: Vec = [ + CompressionType::GZip, + CompressionType::Lz4, + CompressionType::None, + CompressionType::Program("test".to_string()) + ] + .iter() + .map(|ct| ct.to_string()) + .filter(|ct| { + if let Ok(engine) = crate::compression_engine::get_compression_engine( + ct.parse().unwrap_or(CompressionType::None) + ) { + engine.is_supported() + } else { + false + } + }) + .collect(); + + status_info.insert( + "compression_engines".to_string(), + json!(compression_engines) + ); + + // Add meta plugins + let meta_plugins: Vec = [ + MetaPluginType::FileMagic, + MetaPluginType::FileMime, + MetaPluginType::FileEncoding, + MetaPluginType::LineCount, + MetaPluginType::WordCount, + MetaPluginType::Cwd, + MetaPluginType::Binary, + MetaPluginType::Uid, + MetaPluginType::User, + MetaPluginType::Gid, + MetaPluginType::Shell, + MetaPluginType::ShellPid, + MetaPluginType::KeepPid, + MetaPluginType::Hostname, + MetaPluginType::FullHostname, + MetaPluginType::Sha256, + MetaPluginType::ReadTime, + MetaPluginType::ReadRate, + ] + .iter() + .map(|mpt| mpt.to_string()) + .filter(|mpt| { + let plugin = crate::meta_plugin::get_meta_plugin( + mpt.parse().unwrap_or(MetaPluginType::FileMagic) + ); + plugin.is_supported() + }) + .collect(); + + status_info.insert( + "meta_plugins".to_string(), + json!(meta_plugins) + ); + + let response = ApiResponse { + success: true, + data: Some(status_info), + error: None, + }; + + Ok(Json(response)) +}