Multiple changes

This commit is contained in:
Meliox 2025-09-09 20:49:20 +02:00
parent 147cebc70d
commit 155655cda5

View File

@ -101,8 +101,8 @@ function install_packages {
;; ;;
[nN]) [nN])
# If the user chooses not to install lm-sensors, exit the script with a zero status code # If the user chooses not to install lm-sensors, exit the script with a zero status code
msg "Decided to not install lm-sensors. The mod cannot run without it. Exiting..." msgb "Decided to not install lm-sensors. The mod cannot run without it. Exiting..."
exit 0 err "lm-sensors is required. Exiting..."
;; ;;
*) *)
# If the user enters an invalid input, print an error message and exit the script with a non-zero status code # If the user enters an invalid input, print an error message and exit the script with a non-zero status code
@ -110,21 +110,29 @@ function install_packages {
;; ;;
esac esac
fi fi
# Check if lm-sensors is installed correctly and exit if not
if (! command -v sensors &>/dev/null); then
err "lm-sensors installation failed or 'sensors' command is not available. Please install lm-sensors manually and re-run the script."
fi
} }
function configure { function configure {
SENSORS_DETECTED=false SENSORS_DETECTED=false
local sensorsOutput local sensorsOutput
# Load sensor data # Collect lm-sensors output
if [ "$DEBUG_REMOTE" = true ]; then if [ "$DEBUG_REMOTE" = true ]; then
warn "Remote debugging is used. Sensor readings from dump file $DEBUG_JSON_FILE will be used." warn "Remote debugging is used. Sensor readings from dump file $DEBUG_JSON_FILE will be used."
warn "Remote debugging is used. UPS readings from dump file $DEBUG_UPS_FILE will be used." warn "Remote debugging is used. UPS readings from dump file $DEBUG_UPS_FILE will be used."
sensorsOutput=$(cat "$DEBUG_JSON_FILE") sensorsOutput=$(cat "$DEBUG_JSON_FILE")
else else
sensorsOutput=$(sensors -j 2>/dev/null | python3 -m json.tool) sensorsOutput=$(sensors -j 2>/dev/null)
fi fi
# Apply lm-sensors sanitization
sensorsOutput=$(sanitize_sensors_output "$sensorsOutput")
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
err "Sensor output error.\n\nCommand output:\n${sensorsOutput}\n\nExiting..." err "Sensor output error.\n\nCommand output:\n${sensorsOutput}\n\nExiting..."
fi fi
@ -132,16 +140,29 @@ function configure {
#### CPU #### #### CPU ####
msgb "\n=== Detecting CPU temperature sensors ===" msgb "\n=== Detecting CPU temperature sensors ==="
ENABLE_CPU=false ENABLE_CPU=false
local cpuList=() local cpuList=""
for item in "${KNOWN_CPU_SENSORS[@]}"; do local cpuCount=0
if echo "$sensorsOutput" | grep -q "$item"; then
cpuList+=("$item") # Find all CPU sensors that match known patterns
for pattern in "${KNOWN_CPU_SENSORS[@]}"; do
found_sensors=$(echo "$sensorsOutput" | grep -o "\"${pattern}[^\"]*\"" | sed 's/"//g')
if [ -n "$found_sensors" ]; then
while read -r sensor; do
if [ -n "$sensor" ]; then
cpuCount=$((cpuCount + 1))
if [ -z "$cpuList" ]; then
cpuList="$sensor"
else
cpuList="$cpuList,$sensor"
fi
ENABLE_CPU=true ENABLE_CPU=true
fi fi
done <<< "$found_sensors"
fi
done done
if [ "$ENABLE_CPU" = true ]; then if [ "$ENABLE_CPU" = true ]; then
info "Detected CPU sensors (${#cpuList[@]}): $(IFS=,; echo "${cpuList[*]}")" info "Detected CPU sensors ($cpuCount): $cpuList"
SENSORS_DETECTED=true SENSORS_DETECTED=true
while true; do while true; do
local choice=$(ask "Display temperatures for all cores [C] or average per CPU [a] (some newer AMD variants support per die)? (C/a)") local choice=$(ask "Display temperatures for all cores [C] or average per CPU [a] (some newer AMD variants support per die)? (C/a)")
@ -167,9 +188,16 @@ function configure {
#### RAM #### #### RAM ####
msgb "\n=== Detecting RAM temperature sensors ===" msgb "\n=== Detecting RAM temperature sensors ==="
local ramList=($(echo "$sensorsOutput" | grep -o '"SODIMM[^"]*"' | sed 's/"//g')) local ramList=$(echo "$sensorsOutput" | grep -o '"SODIMM[^"]*"' | sed 's/"//g' | paste -sd, -)
if [ ${#ramList[@]} -gt 0 ]; then local ramCount=$(echo "$ramList" | tr ',' '\n' | wc -l)
info "Detected RAM sensors (${#ramList[@]}): $(IFS=,; echo "${ramList[*]}")"
# Clean up if no RAM found
if [ -z "$ramList" ]; then
ramCount=0
fi
if [ "$ramCount" -gt 0 ]; then
info "Detected RAM sensors ($ramCount): $ramList"
ENABLE_RAM_TEMP=true ENABLE_RAM_TEMP=true
SENSORS_DETECTED=true SENSORS_DETECTED=true
else else
@ -203,14 +231,21 @@ function configure {
#### Fans #### #### Fans ####
msgb "\n=== Detecting fan speed sensors ===" msgb "\n=== Detecting fan speed sensors ==="
local fanList=$(echo "$sensorsOutput" | grep -B 1 '"fan[0-9]*_input"' | grep -Po '"[^"]*":\s*\{$' | sed 's/"//g' | sed 's/: {//' | paste -sd ',' -)
local fanCount=$(echo "$sensorsOutput" | grep -c '"fan[0-9]*_input"') local fanList=""
if [ ${#fanList[@]} -gt 0 ]; then local fanCount=0
# Find all fan names that have fan*_input entries
fanList=$(echo "$sensorsOutput" | grep -B2 '"fan[0-9]\+_input"' | grep '".*": {' | sed 's/.*"\([^"]*\)": {.*/\1/' | sort -u | paste -sd, -)
fanCount=$(echo "$fanList" | tr ',' '\n' | wc -l)
if [ "$fanCount" -gt 0 ]; then
info "Detected fan speed sensors ($fanCount): $fanList" info "Detected fan speed sensors ($fanCount): $fanList"
ENABLE_FAN_SPEED=true ENABLE_FAN_SPEED=true
SENSORS_DETECTED=true SENSORS_DETECTED=true
local choice=$(ask "Display fans reporting zero speed? (Y/n)") local choice
choice=$(ask "Display fans reporting zero speed? (Y/n)")
case "$choice" in case "$choice" in
[yY]|"") [yY]|"")
DISPLAY_ZERO_SPEED_FANS=true DISPLAY_ZERO_SPEED_FANS=true
@ -377,6 +412,29 @@ function install_mod {
ask "Clear the browser cache to ensure all changes are visualized. (any key to continue)" ask "Clear the browser cache to ensure all changes are visualized. (any key to continue)"
} }
# Sanitize sensors output to handle common lm-sensors parsing issues
sanitize_sensors_output() {
local input="$1"
echo "$input" | perl -pe '
# Replace ERROR lines with placeholder values
s/ERROR:.+\s(\w+):\s(.+)/"$1": 0.000,/g;
s/ERROR:.+\s(\w+)!/"$1": 0.000,/g;
# Remove trailing commas before closing braces
s/,\s*(\})/$1/g;
# Replace NaN values with null
s/\bNaN\b/null/g;
# Fix duplicate SODIMM keys
s/"SODIMM":\{"temp(\d+)_input"/"SODIMM $1":\{"temp$1_input"/g;
# Fix duplicate fan keys
s/"([^"]+)":\{"fan(\d+)_input"/"$1 $2":\{"fan$2_input"/g;
' | python3 -m json.tool 2>/dev/null || echo "$input"
}
#region node info insertion #region node info insertion
# Main insertion routine # Main insertion routine
insert_node_info() { insert_node_info() {
@ -402,8 +460,10 @@ collect_sensors_output() {
sensorsCmd="cat \"$DEBUG_JSON_FILE\"" sensorsCmd="cat \"$DEBUG_JSON_FILE\""
else else
# Note: sensors -f (Fahrenheit) breaks fan speeds # Note: sensors -f (Fahrenheit) breaks fan speeds
sensorsCmd="sensors -j 2>/dev/null | python3 -m json.tool" sensorsCmd="sensors -j 2>/dev/null"
fi fi
# Remember to reflect this in sanitize_sensors_output()
#region sensors heredoc #region sensors heredoc
sed -i '/my \$dinfo = df('\''\/'\'', 1);/i\ sed -i '/my \$dinfo = df('\''\/'\'', 1);/i\
# Collect sensor data from lm-sensors\ # Collect sensor data from lm-sensors\
@ -421,13 +481,17 @@ collect_sensors_output() {
$res->{sensorsOutput} =~ s/\\bNaN\\b/null/g;\ $res->{sensorsOutput} =~ s/\\bNaN\\b/null/g;\
\ \
# Fix duplicate SODIMM keys by appending temperature sensor number\ # Fix duplicate SODIMM keys by appending temperature sensor number\
# This prevents JSON key overwrites when multiple SODIMM sensors exist\ # Example: "SODIMM":{"temp3_input":34.0} becomes "SODIMM 3":{"temp3_input":34.0}\
# Example: "SODIMM":{"temp3_input":34.0} becomes "SODIMM3":{"temp3_input":34.0}\ $res->{sensorsOutput} =~ s/\\"SODIMM\":\\{\\"temp(\\d+)_input\\"/\\"SODIMM $1\\":\{\\"temp$1_input\\"/g;\
$res->{sensorsOutput} =~ s/\\"SODIMM\\":\\{\\"temp(\\d+)_input\\"/\\"SODIMM$1\\":\\{\\"temp$1_input\\"/g;\
\ \
# Fix duplicate fans keys by appending fan number\ # Fix duplicate fans keys by appending fan number with a space\
# Example: "Processor Fan":{"fan2_input":1000,...} → "Processor Fan 2":{"fan2_input":1000,...}\ # Example: "Processor Fan":{"fan2_input":1000,...} → "Processor Fan 2":{"fan2_input":1000,...}\
$res->{sensorsOutput} =~ s/\\"([^"]+)\\":\\{\\"fan(\\d+)_input\\"/\\"$1 $2\\":\{\\"fan$2_input\\"/g;\ $res->{sensorsOutput} =~ s/\\"([^"]+)\\":\\{\\"fan(\\d+)_input\\"/\\"$1 $2\\":\{\\"fan$2_input\\"/g;\
# Format JSON output properly (workaround for lm-sensors >3.6.0 issues)\
$res->{sensorsOutput} =~ /^(.*)$/s;\
$res->{sensorsOutput} = `echo \\Q$1\\E | python3 -m json.tool 2>/dev/null || echo \\Q$1\E`;\
' "$NODES_PM_FILE" ' "$NODES_PM_FILE"
#endregion sensors heredoc #endregion sensors heredoc
info "Sensors' retriever added to \"$output_file\"." info "Sensors' retriever added to \"$output_file\"."