ek-ui 0.9.21

ek 生态常驻主界面(egui/eframe):插件即界面——观测页 + 日志页,车头与 UI 同插件
Documentation
//! 一次性运维小工具:打印/灌入某档案段的密库值(0.9.10 T5 实连注入 + 毁档修复用)。
//!
//! 判据/演示脚本要把密码喂进 `EK_CTP_PASSWORD` 一类环境变量,密码唯一存放 =
//! 密库段。取值形态走 `ek_cfg::secret::get` 出明文到 stdout,**由调用方捕获**:
//! 调用面(pwsh)把它赋给环境变量,**不得回显**。灌值形态 `--set <ns> <key>`
//! 从 stdin 读一行入密库(口令只过管道,不打打印);两形态都不写任何文件。

fn main() {
    let args: Vec<String> = std::env::args().skip(1).collect();
    let (set_mode, rest) = match args.first().map(|s| s.as_str()) {
        Some("--set") => (true, &args[1..]),
        _ => (false, &args[..]),
    };
    let (Some(ns), Some(key)) = (rest.first(), rest.get(1)) else {
        eprintln!("用法: secret_get [--set] <ns> <key>(--set 从 stdin 读一行)");
        std::process::exit(2);
    };
    if set_mode {
        use std::io::Read;
        let mut raw = String::new();
        std::io::stdin().read_to_string(&mut raw).expect("stdin 读");
        let v = raw.trim_end_matches(['\r', '\n']).to_string();
        if v.is_empty() {
            eprintln!("stdin 空,拒绝灌入");
            std::process::exit(2);
        }
        ek_cfg::secret::register(ns, key, ek_cfg::SecretValue::from_bytes(v))
            .expect("密库灌入");
        eprintln!("已灌入 {ns}/{key}");
        return;
    }
    match ek_cfg::secret::get(ns, key) {
        Some(v) => {
            let s = String::from_utf8_lossy(v.as_bytes()).to_string();
            print!("{s}");
        }
        None => {
            eprintln!("密库无 {ns}/{key}");
            std::process::exit(1);
        }
    }
}