Skip to main content

yggdrasil/api/settings/
system.rs

1// 与 posts 模块一致:Leptos `#[server]` 宏触发 deprecated/unit/too_many_arguments
2// 提示,按项目惯例放行(限流/运行器等配置项天然参数多)。
3#![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// ============================================================================
13// 系统启动配置(只读展示)
14// ============================================================================
15
16/// 读取系统启动配置的只读快照(面板展示用)。
17///
18/// 这些值在进程启动时读取,不可运行时修改。密钥类仅展示是否已设置。
19#[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        // 脱敏 DATABASE_URL:隐藏密码,仅保留 scheme://host:port/dbname。
26        let database_url_masked = {
27            let url = std::env::var("DATABASE_URL").unwrap_or_default();
28            // 简单脱敏:如果含 @(即含密码),截取 @ 之后的部分 + scheme 前缀。
29            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}