From f94121080ff37acb7bea356e45d2da49c989c770 Mon Sep 17 00:00:00 2001 From: molanp <104612722+molanp@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:42:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(check):=20=E4=BF=AE=E5=A4=8D=E8=87=AA?= =?UTF-8?q?=E6=A3=80=E6=8F=92=E4=BB=B6=E5=9C=A8ARM=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=B8=8B=E7=9A=84CPU=E9=A2=91=E7=8E=87=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E9=80=BB=E8=BE=91=20(#2057)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将插件版本从0.1更新至0.2 - 新增安全获取ARM设备CPU频率的函数get_arm_cpu_freq_safe - 优化CPU信息采集逻辑,提高在ARM架构下的兼容性 --- zhenxun/builtin_plugins/check/__init__.py | 2 +- zhenxun/builtin_plugins/check/data_source.py | 80 +++++++++++--------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/zhenxun/builtin_plugins/check/__init__.py b/zhenxun/builtin_plugins/check/__init__.py index 67feba1c..e5da1bc2 100644 --- a/zhenxun/builtin_plugins/check/__init__.py +++ b/zhenxun/builtin_plugins/check/__init__.py @@ -26,7 +26,7 @@ __plugin_meta__ = PluginMetadata( """.strip(), extra=PluginExtraData( author="HibiKier", - version="0.1", + version="0.2", plugin_type=PluginType.SUPERUSER, configs=[ RegisterConfig( diff --git a/zhenxun/builtin_plugins/check/data_source.py b/zhenxun/builtin_plugins/check/data_source.py index 368500c7..3cc03d51 100644 --- a/zhenxun/builtin_plugins/check/data_source.py +++ b/zhenxun/builtin_plugins/check/data_source.py @@ -1,3 +1,4 @@ +import contextlib from dataclasses import dataclass import os from pathlib import Path @@ -18,7 +19,47 @@ BAIDU_URL = "https://www.baidu.com/" GOOGLE_URL = "https://www.google.com/" VERSION_FILE = Path() / "__version__" -ARM_KEY = "aarch64" + + +def get_arm_cpu_freq_safe(): + """获取ARM设备CPU频率""" + # 方法1: 优先从系统频率文件读取 + freq_files = [ + "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq", + "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", + "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq", + "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", + ] + + for freq_file in freq_files: + try: + with open(freq_file) as f: + frequency = int(f.read().strip()) + return round(frequency / 1000000, 2) # 转换为GHz + except (OSError, ValueError): + continue + + # 方法2: 解析/proc/cpuinfo + with contextlib.suppress(OSError, FileNotFoundError, ValueError, PermissionError): + with open("/proc/cpuinfo") as f: + for line in f: + if "CPU MHz" in line: + freq = float(line.split(":")[1].strip()) + return round(freq / 1000, 2) # 转换为GHz + # 方法3: 使用lscpu命令 + with contextlib.suppress(OSError, subprocess.SubprocessError, ValueError): + env = os.environ.copy() + env["LC_ALL"] = "C" + result = subprocess.run( + ["lscpu"], capture_output=True, text=True, env=env, timeout=10 + ) + + if result.returncode == 0: + for line in result.stdout.split("\n"): + if "CPU max MHz" in line or "CPU MHz" in line: + freq = float(line.split(":")[1].strip()) + return round(freq / 1000, 2) # 转换为GHz + return 0 # 如果所有方法都失败,返回0 @dataclass @@ -37,7 +78,7 @@ class CPUInfo: if _cpu_freq := psutil.cpu_freq(): cpu_freq = round(_cpu_freq.current / 1000, 2) else: - cpu_freq = 0 + cpu_freq = get_arm_cpu_freq_safe() return CPUInfo(core=cpu_core, usage=cpu_usage, freq=cpu_freq) @@ -160,44 +201,13 @@ def __get_version() -> str | None: return None -def __get_arm_cpu(): - env = os.environ.copy() - env["LC_ALL"] = "en_US.UTF-8" - cpu_info = subprocess.check_output(["lscpu"], env=env).decode() - model_name = "" - cpu_freq = 0 - for line in cpu_info.splitlines(): - if "Model name" in line: - model_name = line.split(":")[1].strip() - if "CPU MHz" in line: - cpu_freq = float(line.split(":")[1].strip()) - return model_name, cpu_freq - - -def __get_arm_oracle_cpu_freq(): - cpu_freq = subprocess.check_output( - ["dmidecode", "-s", "processor-frequency"] - ).decode() - return round(float(cpu_freq.split()[0]) / 1000, 2) - - async def get_status_info() -> dict: """获取信息""" data = await __build_status() system = platform.uname() - if system.machine == ARM_KEY and not ( - cpuinfo.get_cpu_info().get("brand_raw") and data.cpu.freq - ): - model_name, cpu_freq = __get_arm_cpu() - if not data.cpu.freq: - data.cpu.freq = cpu_freq or __get_arm_oracle_cpu_freq() - data = data.get_system_info() - data["brand_raw"] = model_name - else: - data = data.get_system_info() - data["brand_raw"] = cpuinfo.get_cpu_info().get("brand_raw", "Unknown") - + data = data.get_system_info() + data["brand_raw"] = cpuinfo.get_cpu_info().get("brand_raw", "Unknown") baidu, google = await __get_network_info() data["baidu"] = "#8CC265" if baidu else "red" data["google"] = "#8CC265" if google else "red"