yggdrasil/api/settings/
system.rs1#![allow(clippy::unused_unit, deprecated, clippy::too_many_arguments)]
4
5use crate::api::error::ApiError;
6use leptos::prelude::*;
7
8#[cfg(feature = "server")]
9use crate::api::auth::get_current_admin_user;
10use crate::models::settings::SystemInfo;
11
12#[server(GetSystemInfo, endpoint = "get_system_info", input = leptos::server_fn::codec::Json)]
20pub async fn get_system_info() -> Result<SystemInfo, ApiError> {
21 let _user = get_current_admin_user().await?;
22
23 #[cfg(feature = "server")]
24 {
25 let database_url_masked = {
27 let url = std::env::var("DATABASE_URL").unwrap_or_default();
28 if let Some(at_pos) = url.find('@') {
30 let scheme_end = url.find("://").unwrap_or(0);
31 let after = &url[at_pos + 1..];
32 format!("{}://{}", &url[..scheme_end], after)
33 } else {
34 url
35 }
36 };
37
38 Ok(SystemInfo {
39 database_url_masked,
40 rust_log: std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_string()),
41 db_pool_size: std::env::var("DB_POOL_SIZE")
42 .ok()
43 .and_then(|s| s.parse().ok())
44 .unwrap_or(20),
45 statement_timeout_secs: std::env::var("STATEMENT_TIMEOUT_SECS")
46 .ok()
47 .and_then(|s| s.parse().ok())
48 .unwrap_or(30),
49 ssr_cache_secs: crate::utils::server::parse_ssr_cache_secs(),
50 compression_algorithms: std::env::var("COMPRESSION_ALGORITHMS").unwrap_or_default(),
51 expose_version_headers: crate::utils::server::parse_env_bool(
52 "EXPOSE_VERSION_HEADERS",
53 true,
54 ),
55 docker_socket_path: std::env::var("DOCKER_SOCKET_PATH")
56 .unwrap_or_else(|_| "/var/run/docker.sock".to_string()),
57 mcp_token_enc_key_set: std::env::var("MCP_TOKEN_ENC_KEY")
58 .map(|v| !v.is_empty())
59 .unwrap_or(false),
60 migrate_startup_timeout_secs: std::env::var("MIGRATE_STARTUP_TIMEOUT_SECS")
61 .ok()
62 .and_then(|s| s.parse().ok())
63 .unwrap_or(30),
64 sysinfo_sample_secs: std::env::var("SYSINFO_SAMPLE_SECS")
65 .ok()
66 .and_then(|s| s.parse().ok())
67 .unwrap_or(0.5),
68 log_viewer_level: std::env::var("LOG_VIEWER_LEVEL")
69 .ok()
70 .filter(|v| !v.trim().is_empty())
71 .unwrap_or_else(|| "info".to_string()),
72 backup_import_max_mb: crate::api::database::backup::import_max_bytes() / (1024 * 1024),
73 previous_public_dir: std::env::var("YGG_PREVIOUS_PUBLIC_DIR").unwrap_or_default(),
74 })
75 }
76
77 #[cfg(not(feature = "server"))]
78 {
79 Ok(SystemInfo {
80 database_url_masked: String::new(),
81 rust_log: String::new(),
82 db_pool_size: 0,
83 statement_timeout_secs: 0,
84 ssr_cache_secs: 0,
85 compression_algorithms: String::new(),
86 expose_version_headers: false,
87 docker_socket_path: String::new(),
88 mcp_token_enc_key_set: false,
89 migrate_startup_timeout_secs: 0,
90 sysinfo_sample_secs: 0.0,
91 log_viewer_level: String::new(),
92 backup_import_max_mb: 0,
93 previous_public_dir: String::new(),
94 })
95 }
96}