use std::{ fs::{self, OpenOptions}, io::Write, path::{Path, PathBuf}, process::Command, }; use regex::Regex; use a2s::A2SClient;
/// 日志记录函数:终端 + logs/check.log fn log(msg: &str) { println!("{}", msg); let log_dir = "logs"; let log_path = format!("{}/check.log", log_dir); fs::create_dir_all(log_dir).ok();
if let Ok(mut file) = OpenOptions::new() .create(true) .append(true) .open(log_path) { let _ = writeln!(file, "{}", msg); } }
/// 提取配置字段,如 ip="..." / port="..." fn extract_field_from_config(path: &Path, field: &str) -> Option<String> { let content = fs::read_to_string(path).ok()?; let re = Regex::new(&format!(r#"{}="?([^"\r\n]+)"?"#, field)).ok()?; let caps = re.captures(&content)?; Some(caps.get(1)?.as_str().to_string()) }
/// 获取所有 csgoserver*.cfg 配置(含主服和编号服) fn detect_port_configs() -> Vec<(Option<u32>, PathBuf)> { let mut result = Vec::new(); let config_dir = Path::new("lgsm/config-lgsm/csgoserver");
if let Ok(entries) = fs::read_dir(config_dir) { for entry in entries.flatten() { let path = entry.path(); if let Some(file_name) = path.file_name().and_then(|n| n.to_str()) { if file_name == "csgoserver.cfg" { result.push((None, path)); // 主服 } else if let Some(cap) = Regex::new(r"^csgoserver-(\d+)\.cfg$") .unwrap() .captures(file_name) { if let Ok(id) = cap[1].parse::<u32>() { result.push((Some(id), path)); } } } } }