From edb4912e45d8249dc8ddaa4c00237dfafec5149d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 28 Oct 2026 19:48:41 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=B4=20Sync=202026-10-28=2019:48:41?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autocore/Makefile | 2 +- autocore/files/cpuinfo | 12 ++++- luci-app-netstat/Makefile | 2 +- .../usr/lib/lua/luci/controller/netstat.lua | 41 +++++++++++++-- luci-mod-status/Makefile | 2 +- .../usr/lib/lua/luci/controller/netstat.lua | 41 +++++++++++++-- my-default-settings/Makefile | 2 +- .../files/etc/profile.d/30-sysinfo.sh | 51 +++++++++---------- 8 files changed, 116 insertions(+), 37 deletions(-) diff --git a/autocore/Makefile b/autocore/Makefile index 62458fa99..191233094 100644 --- a/autocore/Makefile +++ b/autocore/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=autocore PKG_FLAGS:=nonshared -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_CONFIG_DEPENDS:= \ CONFIG_TARGET_bcm27xx \ diff --git a/autocore/files/cpuinfo b/autocore/files/cpuinfo index 0db545d77..2663c03c6 100755 --- a/autocore/files/cpuinfo +++ b/autocore/files/cpuinfo @@ -11,7 +11,17 @@ cpu_arch="$(awk -F ': ' '/model name/ {print $2}' "$CPUINFO_PATH" | head -n1)" case "$DISTRIB_TARGET" in "x86"/*) - cpu_cores="$(grep "core id" "$CPUINFO_PATH" | sort -u | wc -l)C $(grep -c "processor" "$CPUINFO_PATH")T" ;; + procs="$(grep -c "processor" "$CPUINFO_PATH")" + sibs="$(awk -F ': *' '/^siblings/ {print $2; exit}' "$CPUINFO_PATH")" + case "$sibs" in ''|*[!0-9]*) sibs="" ;; esac + if [ -n "$sibs" ] && [ "$procs" -lt "$sibs" ]; then + # Partial CPU view (e.g. LXC container): host core ids leak + # through /proc/cpuinfo and can repeat - count the assigned + # CPUs as cores/threads + cpu_cores="${procs}C ${procs}T" + else + cpu_cores="$(grep "core id" "$CPUINFO_PATH" | sort -u | wc -l)C ${procs}T" + fi ;; *) cpu_cores="$(grep -c "processor" "$CPUINFO_PATH")" ;; esac diff --git a/luci-app-netstat/Makefile b/luci-app-netstat/Makefile index 2d68c1fa8..f97ce8e65 100644 --- a/luci-app-netstat/Makefile +++ b/luci-app-netstat/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-netstat PKG_VERSION:=1.1.5 -PKG_RELEASE:=4 +PKG_RELEASE:=5 PKG_MAINTAINER:=NoobLK PKG_LICENSE:=GPL-3.0 diff --git a/luci-app-netstat/files/usr/lib/lua/luci/controller/netstat.lua b/luci-app-netstat/files/usr/lib/lua/luci/controller/netstat.lua index 6f87315d8..3112fde75 100644 --- a/luci-app-netstat/files/usr/lib/lua/luci/controller/netstat.lua +++ b/luci-app-netstat/files/usr/lib/lua/luci/controller/netstat.lua @@ -199,7 +199,9 @@ function getNetdevStats() -- ── Disk space (root filesystem) ────────────────────────────────────────── local disk_pct, disk_used_mb, disk_total_mb = 0, 0, 0 - local df = read_cmd("df -k / 2>/dev/null | awk 'NR==2{print $2,$3}'") + -- Use POSIX output (-P): busybox df wraps long device names onto a second + -- line without it, which breaks the NR==2 parse (e.g. LXC root device). + local df = read_cmd("df -kP / 2>/dev/null | awk 'NR==2{print $2,$3}'") if df then local dtotal, dused = df:match("^(%d+)%s+(%d+)$") dtotal = tonumber(dtotal) or 0 @@ -213,9 +215,42 @@ function getNetdevStats() -- ── CPU temperature ─────────────────────────────────────────────────────── local cpu_temp = nil - -- Scan all available thermal zones and pick the highest valid reading - -- (avoids hardcoded zone numbers which vary per device) + + -- Preferred source: CPU-specific hwmon sensors (k10temp/coretemp/zenpower/ + -- ...). ACPI thermal zones can be absent or bogus (e.g. inside LXC + -- containers the host ACPI zone is not the CPU sensor), while hwmon + -- reports the real package temperature on x86. + local cpu_hwmon = { k10temp = true, coretemp = true, zenpower = true, cpu_thermal = true, soc_thermal = true } + if nixio.fs.access("/sys/class/hwmon") then + for h in nixio.fs.dir("/sys/class/hwmon") do + local base = "/sys/class/hwmon/" .. h + local nf = io.open(base .. "/name", "r") + local name = nf and nf:read("*l") or nil + if nf then nf:close() end + if name and cpu_hwmon[name] then + for entry in nixio.fs.dir(base) do + if entry:match("^temp%d+_input$") then + local sf = io.open(base .. "/" .. entry, "r") + local val = sf and sf:read("*l") or nil + if sf then sf:close() end + local t = tonumber(val) + if t and t > 0 then + if t > 1000 then t = t / 1000 end + t = math.floor(t + 0.5) + if cpu_temp == nil or t > cpu_temp then + cpu_temp = t + end + end + end + end + end + end + end + + -- Fallback: scan all available thermal zones and pick the highest valid + -- reading (avoids hardcoded zone numbers which vary per device) for zone = 0, 9 do + if cpu_temp ~= nil then break end local path = "/sys/class/thermal/thermal_zone" .. zone .. "/temp" local tf = io.open(path, "r") if tf then diff --git a/luci-mod-status/Makefile b/luci-mod-status/Makefile index db8174615..649c442b6 100644 --- a/luci-mod-status/Makefile +++ b/luci-mod-status/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Status Pages LUCI_DEPENDS:=+luci-base +luci-app-oui +luci-mod-dashboard +libiwinfo +rpcd-mod-iwinfo +rpcd-mod-rrdns +ucode +ucode-mod-fs +ucode-mod-ubus +ucode-mod-socket -PKG_RELEASE:=36 +PKG_RELEASE:=37 PKG_BUILD_DEPENDS:=iwinfo PKG_LICENSE:=Apache-2.0 diff --git a/luci-mod-status/root/usr/lib/lua/luci/controller/netstat.lua b/luci-mod-status/root/usr/lib/lua/luci/controller/netstat.lua index 6beb60110..78ce96d51 100644 --- a/luci-mod-status/root/usr/lib/lua/luci/controller/netstat.lua +++ b/luci-mod-status/root/usr/lib/lua/luci/controller/netstat.lua @@ -196,7 +196,9 @@ function getNetdevStats() -- ── Disk space (root filesystem) ────────────────────────────────────────── local disk_pct, disk_used_mb, disk_total_mb = 0, 0, 0 - local df = read_cmd("df -k / 2>/dev/null | awk 'NR==2{print $2,$3}'") + -- Use POSIX output (-P): busybox df wraps long device names onto a second + -- line without it, which breaks the NR==2 parse (e.g. LXC root device). + local df = read_cmd("df -kP / 2>/dev/null | awk 'NR==2{print $2,$3}'") if df then local dtotal, dused = df:match("^(%d+)%s+(%d+)$") dtotal = tonumber(dtotal) or 0 @@ -210,9 +212,42 @@ function getNetdevStats() -- ── CPU temperature ─────────────────────────────────────────────────────── local cpu_temp = nil - -- Scan all available thermal zones and pick the highest valid reading - -- (avoids hardcoded zone numbers which vary per device) + + -- Preferred source: CPU-specific hwmon sensors (k10temp/coretemp/zenpower/ + -- ...). ACPI thermal zones can be absent or bogus (e.g. inside LXC + -- containers the host ACPI zone is not the CPU sensor), while hwmon + -- reports the real package temperature on x86. + local cpu_hwmon = { k10temp = true, coretemp = true, zenpower = true, cpu_thermal = true, soc_thermal = true } + if nixio.fs.access("/sys/class/hwmon") then + for h in nixio.fs.dir("/sys/class/hwmon") do + local base = "/sys/class/hwmon/" .. h + local nf = io.open(base .. "/name", "r") + local name = nf and nf:read("*l") or nil + if nf then nf:close() end + if name and cpu_hwmon[name] then + for entry in nixio.fs.dir(base) do + if entry:match("^temp%d+_input$") then + local sf = io.open(base .. "/" .. entry, "r") + local val = sf and sf:read("*l") or nil + if sf then sf:close() end + local t = tonumber(val) + if t and t > 0 then + if t > 1000 then t = t / 1000 end + t = math.floor(t + 0.5) + if cpu_temp == nil or t > cpu_temp then + cpu_temp = t + end + end + end + end + end + end + end + + -- Fallback: scan all available thermal zones and pick the highest valid + -- reading (avoids hardcoded zone numbers which vary per device) for zone = 0, 9 do + if cpu_temp ~= nil then break end local path = "/sys/class/thermal/thermal_zone" .. zone .. "/temp" local tf = io.open(path, "r") if tf then diff --git a/my-default-settings/Makefile b/my-default-settings/Makefile index 1bf477431..938e1365b 100644 --- a/my-default-settings/Makefile +++ b/my-default-settings/Makefile @@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=my-default-settings PKG_VERSION:=2 -PKG_RELEASE:=37 +PKG_RELEASE:=38 include $(INCLUDE_DIR)/package.mk diff --git a/my-default-settings/files/etc/profile.d/30-sysinfo.sh b/my-default-settings/files/etc/profile.d/30-sysinfo.sh index c9384c111..8de163b82 100644 --- a/my-default-settings/files/etc/profile.d/30-sysinfo.sh +++ b/my-default-settings/files/etc/profile.d/30-sysinfo.sh @@ -57,7 +57,7 @@ function get_ip_addresses() function storage_info() { # storage info - RootInfo=$(df -h /) + RootInfo=$(df -P -h /) root_usage=$(awk '/\// {print $(NF-1)}' <<<${RootInfo} | sed 's/%//g') root_total=$(awk '/\// {print $(NF-4)}' <<<${RootInfo}) } # storage_info @@ -68,32 +68,31 @@ function storage_info() storage_info critical_load=$(( 1 + $(grep -c processor /proc/cpuinfo) / 2 )) -# get uptime, logged in users and load in one take -UptimeString=$(uptime | tr -d ',') -time=$(awk -F" " '{print $3" "$4}' <<<"${UptimeString}") -load="$(awk -F"average: " '{print $2}'<<<"${UptimeString}")" -case ${time} in - 1:*) # 1-2 hours - time=$(awk -F" " '{print $3" 小时"}' <<<"${UptimeString}") - ;; - *:*) # 2-24 hours - time=$(awk -F" " '{print $3" 小时"}' <<<"${UptimeString}") - ;; - *day) # days - days=$(awk -F" " '{print $3"天"}' <<<"${UptimeString}") - time=$(awk -F" " '{print $5}' <<<"${UptimeString}") - time="$days "$(awk -F":" '{print $1"小时 "$2"分钟"}' <<<"${time}") - ;; -esac +# uptime and load: read /proc directly - in LXC/LXCFS containers the +# uptime/free commands are syscall-based and would show the host values. +_secs=$(cut -d. -f1 /proc/uptime 2>/dev/null) +case "$_secs" in *[!0-9]*|"") _secs=0 ;; esac +_ud=$(( _secs / 86400 )); _uh=$(( _secs % 86400 / 3600 )); _um=$(( _secs % 3600 / 60 )) +if [ "$_ud" -gt 0 ]; then + time="${_ud}天 $(printf '%02d:%02d' "$_uh" "$_um")" +else + time="$(printf '%02d:%02d' "$_uh" "$_um")" +fi +load="$(awk '{print $1" "$2" "$3}' /proc/loadavg 2>/dev/null)" +[ -n "$load" ] || load="0.00 0.00 0.00" -# memory and swap -mem_info=$(LC_ALL=C free -w 2>/dev/null | grep "^Mem" || LC_ALL=C free | grep "^Mem") -memory_usage=$(awk '{printf("%.0f",(($2-($4+$6))/$2) * 100)}' <<<${mem_info}) -memory_total=$(awk '{printf("%d",$2/1024)}' <<<${mem_info}) -swap_info=$(LC_ALL=C free -m | grep "^Swap") -swap_usage=$( (awk '/Swap/ { printf("%3.0f", $3/$2*100) }' <<<${swap_info} 2>/dev/null || echo 0) | tr -c -d '[:digit:]') -swap_total=$(awk '{print $(2)}' <<<${swap_info}) +# memory and swap: read /proc/meminfo directly (same reason as above) +_mt=$(awk '/^MemTotal:/{print $2}' /proc/meminfo) +_mf=$(awk '/^MemFree:/{print $2}' /proc/meminfo) +_mb=$(awk '/^Buffers:/{print $2}' /proc/meminfo) +_mc=$(awk '/^Cached:/{print $2}' /proc/meminfo) +_st=$(awk '/^SwapTotal:/{print $2}' /proc/meminfo) +_sf=$(awk '/^SwapFree:/{print $2}' /proc/meminfo) +memory_usage=$(awk -v t="${_mt:-0}" -v f="${_mf:-0}" -v b="${_mb:-0}" -v c="${_mc:-0}" 'BEGIN{ if (t>0) printf "%.0f", (t-f-b-c)/t*100; else print 0 }') +memory_total=$(( ${_mt:-0} / 1024 )) +swap_usage=$(awk -v t="${_st:-0}" -v f="${_sf:-0}" 'BEGIN{ if (t>0) printf "%.0f", (t-f)/t*100; else print 0 }') +swap_total=$(( ${_st:-0} / 1024 )) c=0 while [ ! -n "$(get_ip_addresses)" ];do @@ -115,7 +114,7 @@ echo "" # fixed newline display "系统存储" "$root_usage" "90" "1" "%" " of $root_total" if [ -x /sbin/cpuinfo ]; then -printf "CPU 信息: \x1B[92m%s\x1B[0m\t" "$(echo `/sbin/cpuinfo | cut -d ' ' -f -4`)" +printf "CPU 信息: \x1B[92m%s\x1B[0m\t" "$(echo `/sbin/cpuinfo | cut -d ' ' -f 1-7`)" fi echo "" echo ""