Merge branch 'main' into add-supoort-for-ups
This commit is contained in:
commit
d3d8b95bea
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user