From b2117d4250c1db8a53d72c269bfbf13e0e983f5a Mon Sep 17 00:00:00 2001 From: Meliox Date: Mon, 24 Apr 2023 20:38:43 +0200 Subject: [PATCH] Add files via upload --- pve-mod-gui-temp.sh | 151 ++++++++++++++++++++++++++++++++++++++++++++ pve-mod-temp.png | Bin 0 -> 30452 bytes pve-mods.md | 9 +++ 3 files changed, 160 insertions(+) create mode 100644 pve-mod-gui-temp.sh create mode 100644 pve-mod-temp.png create mode 100644 pve-mods.md diff --git a/pve-mod-gui-temp.sh b/pve-mod-gui-temp.sh new file mode 100644 index 0000000..1c862bb --- /dev/null +++ b/pve-mod-gui-temp.sh @@ -0,0 +1,151 @@ +#!/bin/bash +#This bash script installs a modification to the Proxmox Virtual Environment (PVE) web user interface (UI) to display temperature information. + +# Filepaths +pvemanagerlib="/usr/share/pve-manager/js/pvemanagerlib.js" +nodespm="/usr/share/perl5/PVE/API2/Nodes.pm" +backuplocation="/root/backup" +timestamp=$(date '+%Y-%m-%d_%H-%M-%S') + + +################### code below ############# +echo "" + +# Function to display usage information +function usage { + echo "Usage: $0 [install | uninstall]" + echo "" + exit 1 +} + +# Function to install the modification +function install_mod { + # Create backup of original files + mkdir -p $backuplocation + + # Add new line to Nodes.pm file + if [[ -z $(cat $nodespm | grep -e "$res->{thermalstate}") ]]; then + # Create backup of original file + cp "$nodespm" "$backuplocation/Nodes.pm.$timestamp" + echo "Backup of $nodespm saved to $backuplocation/Nodes.pm.$timestamp" + + sed -i '/my $dinfo = df('\''\/'\'', 1);/i\'$'\t''$res->{thermalstate} = `sensors -j`;\n'$'\t''$res->{thermalstate2} = `sensors -j`;\n' "$nodespm" + echo "Added thermalstate to $nodespm" + else + echo "Thermalstate already added to $nodespm" + fi + + # Add new item to the items array in PVE.node.StatusView + if [[ -z $(cat "$pvemanagerlib" | grep -e "itemId: 'thermal'") ]]; then + # Create backup of original file + cp "$pvemanagerlib" "$backuplocation/pvemanagerlib.js.$timestamp" + echo "Backup of $pvemanagerlib saved to $backuplocation/pvemanagerlib.js.$timestamp" + + # Expand space in StatusView + sed -i "/Ext.define('PVE\.node\.StatusView'/,/\},/ { + s/\(bodyPadding:\) '[^']*'/\1 '20 15 20 15'/ + s/\(height:\) [0-9]\+/\1 360/}" "$pvemanagerlib" + + echo "Expanded space in $pvemanagerlib" + + sed -i "/^Ext.define('PVE.node.StatusView',/ { + :a; + /items:/!{N;ba;} + :b; + /swap.*},/!{N;bb;} + a\ + \\ + {\n\ + itemId: 'thermal',\n\ + colspan: 1,\n\ + printBar: false,\n\ + title: gettext('CPU Thermal State'),\n\ + iconCls: 'fa fa-fw fa-thermometer-half',\n\ + textField: 'thermalstate',\n\ + renderer: function(value){\n\ + let objValue = JSON.parse(value);\n\ + let core0 = objValue[\"coretemp-isa-0000\"][\"Core 0\"][\"temp2_input\"];\n\ + let core1 = objValue[\"coretemp-isa-0000\"][\"Core 1\"][\"temp3_input\"];\n\ + let core2 = objValue[\"coretemp-isa-0000\"][\"Core 2\"][\"temp4_input\"];\n\ + let core3 = objValue[\"coretemp-isa-0000\"][\"Core 3\"][\"temp5_input\"];\n\ + return \`Core 0: \$\{core0\} C | Core 1: \$\{core1\} C | Core 2: \$\{core2\} C | Core 3: \$\{core3\} C\`\n\ + }\n\ + },\n\ + {\n\ + itemId: 'thermal2',\n\ + colspan: 1,\n\ + printBar: false,\n\ + title: gettext('NVME Thermal State'),\n\ + iconCls: 'fa fa-fw fa-thermometer-half',\n\ + textField: 'thermalstate2',\n\ + renderer: function(value){\n\ + let objValue = JSON.parse(value);\n\ + let temp0 = objValue[\"nvme-pci-0100\"][\"Composite\"][\"temp1_input\"];\n\ + return \`NVME: \$\{temp0\} C\`\n\ + }\n\ + }, + }" $pvemanagerlib + echo "Added new item to the items array in $pvemanagerlib" + else + echo "New item already added to items array $pvemanagerlib" + fi + + # Restart pveproxy + systemctl restart pveproxy +} + +# Function to uninstall the modification +function uninstall_mod { + # Find the latest Nodes.pm file using the find command + latest_Nodes_pm=$(find "$backuplocation" -name "Nodes.pm.*" -type f -printf '%T+ %p\n' 2>/dev/null | sort -r | head -n 1 | awk '{print $2}') + + if [ -z "$latest_Nodes_pm" ]; then + echo "No Nodes.pm files found" + exit 1 + fi + + # Remove the latest Nodes.pm file + echo cp "$latest_Nodes_pm" "$nodespm" + echo "Copied latest backup to $nodespm" + + # Find the latest pvemanagerlib file using the find command + latest_pvemanagerlib_js=$(find "$backuplocation" -name "pvemanagerlib.js.*" -type f -printf '%T+ %p\n' 2>/dev/null | sort -r | head -n 1 | awk '{print $2}') + + if [ -z "$latest_pvemanagerlib_js" ]; then + echo "No latest_pvemanagerlib_js files found" + exit 1 + fi + + # Remove the latest Nodes.pm file + echo cp "$latest_pvemanagerlib_js" "$pvemanagerlib" + echo "Copied latest backup to $pvemanagerlib" + + # Restart pveproxy + systemctl restart pveproxy +} + +# If no arguments were provided or all arguments have been processed, print the usage message +if [[ $# -eq 0 ]]; then + usage +fi + +# Process the arguments using a while loop and a case statement +while [[ $# -gt 0 ]]; do + case "$1" in + install) + echo "Installing the mod..." + install_mod + ;; + uninstall) + echo "Uninstalling the mod..." + uninstall_mod + ;; + *) + usage + ;; + esac + shift +done + +echo "" +exit 0 \ No newline at end of file diff --git a/pve-mod-temp.png b/pve-mod-temp.png new file mode 100644 index 0000000000000000000000000000000000000000..caaee2c09450b0383b37176380b7621481384ab1 GIT binary patch literal 30452 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 literal 0 HcmV?d00001 diff --git a/pve-mods.md b/pve-mods.md new file mode 100644 index 0000000..b8ca8ea --- /dev/null +++ b/pve-mods.md @@ -0,0 +1,9 @@ +pve-mod-gui-temp + +This bash script installs a modification to the Proxmox Virtual Environment (PVE) web user interface (UI) to display temperature information. The modification includes three main steps: + +1. Create backups of the original files located at `/usr/share/pve-manager/js/pvemanagerlib.js` and `/usr/share/perl5/PVE/API2/Nodes.pm` in the `/root/backup` directory. +2. Add a new line to the `Nodes.pm` file that reads the thermal state information of the host using the `sensors` command. +3. Modify the `pvemanagerlib.js` file to expand the space in the StatusView and add a new item to the items array that displays the temperature information in Celsius for the CPU cores and the NVME drive. + +The script provides two options: `install` and `uninstall`. The `install` option installs the modification, while the `uninstall` option removes it by copying the backup files to their original location. The script also restarts the `pveproxy` service to apply the changes. \ No newline at end of file