From fa263fb95e398f9f3eb12e9c449c8ea14fec1b2b Mon Sep 17 00:00:00 2001 From: "Kenneth Benzie (Benie)" Date: Sat, 1 Oct 2022 13:21:12 +0100 Subject: [PATCH] Use powershell for system-info CPU temp on WSL Replace the query of CPU temp from the OpenHardwareMonitor's JSON served via the network on the Windows host with a call to powershell to instead read the WMI objects that OpenHardwareMonitor also emits. This is more robust since powershell.exe is always available and does not require Windows Defender firewall rules to allow connections from WSL2's VM to the Windows host. --- system-info/system-info-WSL.sh | 38 ++++++++++++---------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/system-info/system-info-WSL.sh b/system-info/system-info-WSL.sh index f6a901a..7a2d247 100755 --- a/system-info/system-info-WSL.sh +++ b/system-info/system-info-WSL.sh @@ -8,37 +8,25 @@ if [ ! -d $cache_dir ]; then mkdir -p $cache_dir fi -while true; do - # Assumes OpenHardwareMonitor is has the Remote Web Server enabled on port - # 8085 of the Windows host. In WSL2 the Windows host IP is accessible using - # $(homename).local, use this to grab sensor data but this depends on WSL2 - # being allowed to make connections to the Windows host: - # - # ```powershell - # New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow - # ``` - # - # However this setting must be applied each boot, there's probably a sticky - # setting but not sure what it is. - cpu_json=`curl --silent $(hostname).local:8085/data.json | jq \ -".Children[] | select(.Text | test(\"$(hostname | awk '{print toupper($0)}')\"))"\ -'.Children[] | select(.ImageURL | test("images_icon/cpu.png"))'` +if cat /proc/cpuinfo | grep -i intel > /dev/null; then + cpu_temp_sensor="/intelcpu/0/temperature/0" +elif cat /proc/cpuinfo | grep -i amd > /dev/null; then + cpu_temp_sensor="/amdcpu/0/temperature/0" +else + return 1 +fi - # cpu_load=`echo $cpu_json | jq --raw-output \ - # '.Children[] | select(.Text | test("Load"))'\ - # '.Children[] | select(.Text | test("CPU Core #[0-9]+")).Value'` - # echo cpu load: $cpu_load +while true; do + # Assumes OpenHardwareMonitor is running and emitting data to WMI so we can + # access it via the Windows hosts powershell.exe. + raw_cpu_temp=$(powershell.exe -NoProfile "(Get-WmiObject -Namespace \"root/OpenHardwareMonitor\" -Query 'select Value from Sensor WHERE Identifier LIKE \"$cpu_temp_sensor\"').Value" | sed 's/\r//') + cpu_temp=$(printf "%.1f°C" "$raw_cpu_temp") cpu_load=`mpstat -P ALL -n 1 -u 1 -o JSON | \ jq '.sysstat.hosts[0].statistics[0]["cpu-load"][1:]|.[].idle' | \ awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 11), 1) }'` - cpu_temp=`echo $cpu_json | jq --raw-output \ -'.Children[] | select(.Text | test("Temperatures"))'\ -'.Children[] | select(.Text | test("CPU Package")).Value' | \ - awk '{gsub(/ /,""); print}'` - echo "$cpu_temp $cpu_load" > $cache_file # echo -e "HTTP/1.1 200 OK\n\n$cpu_temp $cpu_load" | nc -l -k -p 8080 -q 1; - sleep 1 + sleep 2 done