Merge branch 'main' into add-supoort-for-ups

This commit is contained in:
Meliox 2025-09-06 14:31:41 +02:00 committed by GitHub
commit d3d8b95bea
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 111 additions and 65 deletions

View File

@ -16,19 +16,8 @@ HDD_ITEMS_PER_ROW=0
# Should new ones be added, also update logic in configure() function. # Should new ones be added, also update logic in configure() function.
KNOWN_CPU_SENSORS=("coretemp-isa-" "k10temp-pci-") KNOWN_CPU_SENSORS=("coretemp-isa-" "k10temp-pci-")
# This script's working directory # Overwrite default backup location
SCRIPT_CWD="$(dirname "$(readlink -f "$0")")" BACKUP_DIR=""
# Files backup location
BACKUP_DIR="$SCRIPT_CWD/backup"
# File paths
PVE_MANAGER_LIB_JS_FILE="/usr/share/pve-manager/js/pvemanagerlib.js"
NODES_PM_FILE="/usr/share/perl5/PVE/API2/Nodes.pm"
# Debug location
DEBUG_SAVE_PATH="$SCRIPT_CWD"
DEBUG_SAVE_FILENAME="sensorsdata.json"
##################### DO NOT EDIT BELOW ####################### ##################### DO NOT EDIT BELOW #######################
# Only to be used to debug on other systems. Save the "sensor -j" output into a json file. # Only to be used to debug on other systems. Save the "sensor -j" output into a json file.
@ -40,6 +29,17 @@ DEBUG_REMOTE=false
DEBUG_JSON_FILE="/tmp/sensordata.json" DEBUG_JSON_FILE="/tmp/sensordata.json"
DEBUG_UPS_FILE="/tmp/upsc.txt" DEBUG_UPS_FILE="/tmp/upsc.txt"
# This script's working directory
SCRIPT_CWD="$(dirname "$(readlink -f "$0")")"
# Debug location
JSON_EXPORT_DIRECTORY="$SCRIPT_CWD"
JSON_EXPORT_FILENAME="sensorsdata.json"
# File paths
PVE_MANAGER_LIB_JS_FILE="/usr/share/pve-manager/js/pvemanagerlib.js"
NODES_PM_FILE="/usr/share/perl5/PVE/API2/Nodes.pm"
# Helper functions # Helper functions
function msg { function msg {
echo -e "\e[0m$1\e[0m" echo -e "\e[0m$1\e[0m"
@ -323,51 +323,11 @@ function install_mod {
if [[ -n $(cat $NODES_PM_FILE | grep -e "$res->{sensorsOutput}") ]] && [[ -n $(cat $NODES_PM_FILE | grep -e "$res->{systemInfo}") ]]; then if [[ -n $(cat $NODES_PM_FILE | grep -e "$res->{sensorsOutput}") ]] && [[ -n $(cat $NODES_PM_FILE | grep -e "$res->{systemInfo}") ]]; then
err "Mod is already installed. Uninstall existing before installing." err "Mod is already installed. Uninstall existing before installing."
exit
fi fi
msg "\nPreparing mod installation..." msg "\nPreparing mod installation..."
# Provide sensor configuration
configure configure
perform_backup
# Create backup of original files
mkdir -p "$BACKUP_DIR"
local timestamp=$(date '+%Y-%m-%d_%H-%M-%S')
# Perform backup
# Create backup of original file
cp "$NODES_PM_FILE" "$BACKUP_DIR/Nodes.pm.$timestamp"
# Verify backup file was created and is identical
if [ -f "$BACKUP_DIR/Nodes.pm.$timestamp" ]; then
if cmp -s "$NODES_PM_FILE" "$BACKUP_DIR/Nodes.pm.$timestamp"; then
msg "Backup of \"$NODES_PM_FILE\" saved to \"$BACKUP_DIR/Nodes.pm.$timestamp\" and verified."
else
msg "WARNING: Backup file \"$BACKUP_DIR/Nodes.pm.$timestamp\" differs from original. Exiting..."
exit 1
fi
else
msg "ERROR: Failed to create backup \"$BACKUP_DIR/Nodes.pm.$timestamp\". Exiting..."
exit 1
fi
# Create backup of original file
cp "$PVE_MANAGER_LIB_JS_FILE" "$BACKUP_DIR/pvemanagerlib.js.$timestamp"
# Verify backup file was created and is identical
if [ -f "$BACKUP_DIR/pvemanagerlib.js.$timestamp" ]; then
if cmp -s "$PVE_MANAGER_LIB_JS_FILE" "$BACKUP_DIR/pvemanagerlib.js.$timestamp"; then
msg "Backup of \"$PVE_MANAGER_LIB_JS_FILE\" saved to \"$BACKUP_DIR/pvemanagerlib.js.$timestamp\" and verified."
else
msg "WARNING: Backup file \"$BACKUP_DIR/pvemanagerlib.js.$timestamp\" differs from original. Exiting..."
exit 1
fi
else
msg "ERROR: Failed to create backup \"$BACKUP_DIR/pvemanagerlib.js.$timestamp\". Exiting..."
exit 1
fi
if [ $SENSORS_DETECTED = true ]; then if [ $SENSORS_DETECTED = true ]; then
local sensorsCmd local sensorsCmd
@ -378,7 +338,28 @@ function install_mod {
#local sensorsCmd=$([[ "$TEMP_UNIT" = "F" ]] && echo "sensors -j -f" || echo "sensors -j") #local sensorsCmd=$([[ "$TEMP_UNIT" = "F" ]] && echo "sensors -j -f" || echo "sensors -j")
sensorsCmd="sensors -j 2>/dev/null | python3 -m json.tool" sensorsCmd="sensors -j 2>/dev/null | python3 -m json.tool"
fi fi
sed -i '/my \$dinfo = df('\''\/'\'', 1);/i\'$'\t''$res->{sensorsOutput} = `'"$sensorsCmd"'`;\n\t# sanitize JSON output\n\t$res->{sensorsOutput} =~ s/ERROR:.+\\s(\\w+):\\s(.+)/\\"$1\\": 0.000,/g;\n\t$res->{sensorsOutput} =~ s/ERROR:.+\\s(\\w+)!/\\"$1\\": 0.000,/g;\n\t$res->{sensorsOutput} =~ s/,\\s*(\})/$1/g;\n\t$res->{sensorsOutput} =~ s/\\bNaN\\b/null/g;\n' "$NODES_PM_FILE" # Insert sensor data collection and JSON sanitization before the disk info line
sed -i '/my \$dinfo = df('\''\/'\'', 1);/i\
\
# Collect sensor data from lm-sensors\
$res->{sensorsOutput} = `'"$sensorsCmd"'`;\
\
# Sanitize JSON output to handle common lm-sensors parsing issues\
# Replace ERROR lines with placeholder values\
$res->{sensorsOutput} =~ s/ERROR:.+\\s(\\w+):\\s(.+)/\\"$1\\": 0.000,/g;\
$res->{sensorsOutput} =~ s/ERROR:.+\\s(\\w+)!/\\"$1\\": 0.000,/g;\
\
# Remove trailing commas before closing braces\
$res->{sensorsOutput} =~ s/,\\s*(\})/$1/g;\
\
# Replace NaN values with null for valid JSON\
$res->{sensorsOutput} =~ s/\\bNaN\\b/null/g;\
\
# 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 "SODIMM3":{"temp3_input":34.0}\
$res->{sensorsOutput} =~ s/\\"SODIMM\\":\\{\\"temp(\\d+)_input\\"/\\"SODIMM$1\\":\\{\\"temp$1_input\\"/g;\
' "$NODES_PM_FILE"
msg "Sensors' output added to \"$NODES_PM_FILE\"." msg "Sensors' output added to \"$NODES_PM_FILE\"."
fi fi
@ -402,7 +383,7 @@ function install_mod {
if [ $ENABLE_SYSTEM_INFO = true ]; then if [ $ENABLE_SYSTEM_INFO = true ]; then
local systemInfoCmd=$(dmidecode -t ${SYSTEM_INFO_TYPE} | awk -F': ' '/Manufacturer|Product Name|Serial Number/ {print $1": "$2}' | awk '{$1=$1};1' | sed 's/$/ |/' | paste -sd " " - | sed 's/ |$//') local systemInfoCmd=$(dmidecode -t ${SYSTEM_INFO_TYPE} | awk -F': ' '/Manufacturer|Product Name|Serial Number/ {print $1": "$2}' | awk '{$1=$1};1' | sed 's/$/ |/' | paste -sd " " - | sed 's/ |$//')
sed -i "/my \$dinfo = df('\/', 1);/i\\\t\$res->{systemInfo} = \"$(echo "$systemInfoCmd")\";\n" "$NODES_PM_FILE" sed -i "/my \$dinfo = df('\/', 1);/i\\\t\t\$res->{systemInfo} = \"$(echo "$systemInfoCmd")\";\n" "$NODES_PM_FILE"
msg "System information output added to \"$NODES_PM_FILE\"." msg "System information output added to \"$NODES_PM_FILE\"."
fi fi
@ -1266,16 +1247,22 @@ EOF
function uninstall_mod { function uninstall_mod {
check_root_privileges check_root_privileges
if [[ -z $(grep -e "$res->{sensorsOutput}" "$NODES_PM_FILE") ]] && [[ -z $(grep -e "$res->{systemInfo}" "$NODES_PM_FILE") ]]; then
err "Mod is not installed."
fi
set_backup_directory
msg "\nRestoring modified files..." msg "\nRestoring modified files..."
# Find the latest Nodes.pm file using the find command # Find the latest Nodes.pm file using the find command
local latest_nodes_pm=$(find "$BACKUP_DIR" -name "Nodes.pm.*" -type f -printf '%T+ %p\n' 2>/dev/null | sort -r | head -n 1 | awk '{print $2}') local latest_nodes_pm=$(find "$BACKUP_DIR" -name "Nodes.pm.*" -type f -printf '%T+ %p\n' 2>/dev/null | sort -r | head -n 1 | awk '{print $2}')
if [ -n "$latest_nodes_pm" ]; then if [ -n "$latest_nodes_pm" ]; then
# Remove the latest Nodes.pm file # Remove the latest Nodes.pm file
cp "$latest_nodes_pm" "$NODES_PM_FILE" cp "$latest_nodes_pm" "$NODES_PM_FILE"
msg "Copied latest backup to $NODES_PM_FILE." msg "Restoring latest Nodes.pm from backup: $latest_nodes_pm to \"$NODES_PM_FILE\"."
else else
warn "No Nodes.pm files found." warn "No Nodes.pm backup files found."
fi fi
# Find the latest pvemanagerlib.js file using the find command # Find the latest pvemanagerlib.js file using the find command
@ -1284,9 +1271,9 @@ function uninstall_mod {
if [ -n "$latest_pvemanagerlibjs" ]; then if [ -n "$latest_pvemanagerlibjs" ]; then
# Remove the latest pvemanagerlib.js file # Remove the latest pvemanagerlib.js file
cp "$latest_pvemanagerlibjs" "$PVE_MANAGER_LIB_JS_FILE" cp "$latest_pvemanagerlibjs" "$PVE_MANAGER_LIB_JS_FILE"
msg "Copied latest backup to \"$PVE_MANAGER_LIB_JS_FILE\"." msg "Restoring latest pvemanagerlib.js from backup: $latest_pvemanagerlibjs to \"$PVE_MANAGER_LIB_JS_FILE\"."
else else
warn "No pvemanagerlib.js files found." warn "No pvemanagerlib.js backup files found."
fi fi
if [ -n "$latest_nodes_pm" ] || [ -n "$latest_pvemanagerlibjs" ]; then if [ -n "$latest_nodes_pm" ] || [ -n "$latest_pvemanagerlibjs" ]; then
@ -1302,16 +1289,16 @@ function restart_proxy {
} }
function save_sensors_data { function save_sensors_data {
# Check if DEBUG_SAVE_PATH exists and is writable # Check if JSON_EXPORT_DIRECTORY exists and is writable
if [[ ! -d "$DEBUG_SAVE_PATH" || ! -w "$DEBUG_SAVE_PATH" ]]; then if [[ ! -d "$JSON_EXPORT_DIRECTORY" || ! -w "$JSON_EXPORT_DIRECTORY" ]]; then
err "Directory $DEBUG_SAVE_PATH does not exist or is not writable. No file could be saved." err "Directory $JSON_EXPORT_DIRECTORY does not exist or is not writable. No file could be saved."
return return
fi fi
# Check if command exists # Check if command exists
if (command -v sensors &>/dev/null); then if (command -v sensors &>/dev/null); then
# Save sensors output # Save sensors output
local filepath="${DEBUG_SAVE_PATH}/${DEBUG_SAVE_FILENAME}" local filepath="${JSON_EXPORT_DIRECTORY}/${DEBUG_SAVE_FILENAME}"
msg "Sensors data will be saved in $filepath" msg "Sensors data will be saved in $filepath"
# Prompt user for confirmation # Prompt user for confirmation
@ -1330,6 +1317,65 @@ function save_sensors_data {
fi fi
} }
function set_backup_directory {
# Check if the BACKUP_DIR variable is set, if not, use the default backup
if [[ -z "$BACKUP_DIR" ]]; then
# If not set, use the default backup directory, which is based on the home directory and PVE-MODS
BACKUP_DIR="$HOME/PVE-MODS"
msg "Using default backup directory: $BACKUP_DIR"
else
# If set, ensure it is a valid directory
if [[ ! -d "$BACKUP_DIR" ]]; then
err "The specified backup directory does not exist: $BACKUP_DIR"
fi
msg "Using custom backup directory: $BACKUP_DIR"
fi
}
function create_backup_directory {
set_backup_directory
# Create the backup directory if it does not exist
if [[ ! -d "$BACKUP_DIR" ]]; then
mkdir -p "$BACKUP_DIR" 2>/dev/null || {
err "Failed to create backup directory: $BACKUP_DIR. Please check permissions."
}
msg "Created backup directory: $BACKUP_DIR"
else
msg "Backup directory already exists: $BACKUP_DIR"
fi
}
function create_file_backup() {
local source_file="$1"
local timestamp="$2"
local filename
filename=$(basename "$source_file")
local backup_file="$BACKUP_DIR/${filename}.$timestamp"
[[ -f "$source_file" ]] || err "Source file does not exist: $source_file"
[[ -r "$source_file" ]] || err "Cannot read source file: $source_file"
cp "$source_file" "$backup_file" || err "Failed to create backup: $backup_file"
# Verify backup integrity
if ! cmp -s "$source_file" "$backup_file"; then
err "Backup verification failed for: $backup_file"
fi
msg "Created backup: $backup_file"
}
function perform_backup {
local timestamp
timestamp=$(date +%Y%m%d_%H%M%S)
create_backup_directory
create_file_backup "$NODES_PM_FILE" "$timestamp"
create_file_backup "$PVE_MANAGER_LIB_JS_FILE" "$timestamp"
}
# Process the arguments using a while loop and a case statement # Process the arguments using a while loop and a case statement
executed=0 executed=0
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do

View File

@ -24,7 +24,7 @@ The modification involves the following steps:
- Expand the node status view to full browser width. - Expand the node status view to full browser width.
- Add reading (depending on & selections). - Add reading (depending on & selections).
- Allow collapsing the panel vertically. - Allow collapsing the panel vertically.
4. Restart the `pveproxy` service to apply changes. 4. Restart the `pveproxy` service to apply changes.
The script provides three options: The script provides three options:
| **Option** | **Description** | | **Option** | **Description** |