Merge pull request #34 from Meliox/integration-eremem
Extend CPU temperature readings
This commit is contained in:
commit
6274322901
@ -85,6 +85,54 @@ function configure {
|
||||
err "Sensor output error.\n\nCommand output:\n${sensorsOutput}\n\nExiting...\n"
|
||||
fi
|
||||
|
||||
# Check if CPU is part of known list for autoconfiguration
|
||||
msg "\nDetecting support for CPU temperature sensors..."
|
||||
for item in "${KNOWN_CPU_SENSORS[@]}"; do
|
||||
if (echo "$sensorsOutput" | grep -q "$item"); then
|
||||
case "$item" in
|
||||
"coretemp-"*)
|
||||
CPU_ADDRESS_PREFIX=$item
|
||||
CPU_ITEM_PREFIX="Core "
|
||||
CPU_TEMP_CAPTION="Core"
|
||||
break
|
||||
;;
|
||||
"k10temp-"*)
|
||||
CPU_ADDRESS_PREFIX=$item
|
||||
CPU_ITEM_PREFIX="Tccd"
|
||||
CPU_TEMP_CAPTION="Temp"
|
||||
break
|
||||
;;
|
||||
*)
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$CPU_ADDRESS_PREFIX" ]; then
|
||||
msg "Detected sensor:\n$(echo "$sensorsOutput" | grep -o "\"${CPU_ADDRESS_PREFIX}[^\"]*\"" | sed 's/"//g')"
|
||||
fi
|
||||
|
||||
# If cpu is not known, ask the user for input
|
||||
if [ -z "$CPU_ADDRESS_PREFIX" ]; then
|
||||
warn "Could not automatically detect the CPU temperature sensor. Please configure it manually."
|
||||
# Ask user for CPU information
|
||||
# Inform the user and prompt them to press any key to continue
|
||||
read -rsp $'Sensor output will be presented. Press any key to continue...\n' -n1 key
|
||||
|
||||
# Print the output to the user
|
||||
msg "Sensor output:\n${sensorsOutput}"
|
||||
|
||||
# Prompt the user for adapter name and item name
|
||||
read -p "Enter the CPU sensor address prefix (e.g.: coretemp-isa- or k10temp-pci-): " CPU_ADDRESS_PREFIX
|
||||
read -p "Enter the CPU sensor input prefix (e.g.: Core or Tc): " CPU_ITEM_PREFIX
|
||||
read -p "Enter the CPU temperature caption (e.g.: Core or Temp): " CPU_TEMP_CAPTION
|
||||
fi
|
||||
|
||||
if [[ -z "$CPU_ADDRESS_PREFIX" || -z "$CPU_ITEM_PREFIX" ]]; then
|
||||
warn "The CPU configuration is not complete. Temperatures will not be available."
|
||||
fi
|
||||
|
||||
# Check if HDD/SSD data is installed
|
||||
msg "\nDetecting support for HDD/SDD temperature sensors..."
|
||||
if (lsmod | grep -wq "drivetemp"); then
|
||||
@ -110,61 +158,13 @@ function configure {
|
||||
enableNvmeTemp=false
|
||||
fi
|
||||
|
||||
# Check if CPU is part of known list for autoconfiguration
|
||||
msg "\nDetecting support for CPU temperature sensors..."
|
||||
for item in "${KNOWN_CPU_SENSORS[@]}"; do
|
||||
if (echo "$sensorsOutput" | grep -q "$item"); then
|
||||
case "$item" in
|
||||
"coretemp-"*)
|
||||
CPU_ADDRESS="$(echo "$sensorsOutput" | grep "$item" | sed 's/"//g;s/:{//;s/^\s*//')"
|
||||
CPU_ITEM_PREFIX="Core "
|
||||
CPU_TEMP_CAPTION="Core"
|
||||
break
|
||||
;;
|
||||
"k10temp-"*)
|
||||
CPU_ADDRESS="$(echo "$sensorsOutput" | grep "$item" | sed 's/"//g;s/:{//;s/^\s*//')"
|
||||
CPU_ITEM_PREFIX="Tccd"
|
||||
CPU_TEMP_CAPTION="Temp"
|
||||
break
|
||||
;;
|
||||
*)
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$CPU_ADDRESS" ]; then
|
||||
msg "Detected sensor:\n$CPU_ADDRESS"
|
||||
fi
|
||||
|
||||
# If cpu is not known, ask the user for input
|
||||
if [ -z "$CPU_ADDRESS" ]; then
|
||||
warn "Could not automatically detect the CPU temperature sensor. Please configure it manually."
|
||||
# Ask user for CPU information
|
||||
# Inform the user and prompt them to press any key to continue
|
||||
read -rsp $'Sensor output will be presented. Press any key to continue...\n' -n1 key
|
||||
|
||||
# Print the output to the user
|
||||
msg "Sensor output:\n${sensorsOutput}"
|
||||
|
||||
# Prompt the user for adapter name and item name
|
||||
read -p "Enter the CPU sensor address (e.g.: coretemp-isa-0000 or k10temp-pci-00c3): " CPU_ADDRESS
|
||||
read -p "Enter the CPU sensor input prefix (e.g.: Core or Tc): " CPU_ITEM_PREFIX
|
||||
read -p "Enter the CPU temperature caption (e.g.: Core or Temp): " CPU_TEMP_CAPTION
|
||||
fi
|
||||
|
||||
if [[ -z "$CPU_ADDRESS" || -z "$CPU_ITEM_PREFIX" ]]; then
|
||||
warn "The CPU configuration is not complete. Temperatures will not be available."
|
||||
fi
|
||||
|
||||
# Look for fan speeds
|
||||
msg "\nDetecting support for fan speeds..."
|
||||
msg "\nDetecting support for fan speed readings..."
|
||||
if (echo "$sensorsOutput" | grep -q "fan[0-9]*_input"); then
|
||||
msg "Fan speeds detected:\n$(echo "$sensorsOutput" | grep -o 'fan[0-9]*_input[^"]*')"
|
||||
msg "Detected fan speed sensors:\n$(echo "$sensorsOutput" | grep -o 'fan[0-9]*_input[^"]*')"
|
||||
enableFanSpeed=true
|
||||
else
|
||||
warn "No fan speeds found."
|
||||
warn "No fan speed sensors found."
|
||||
enableFanSpeed=false
|
||||
fi
|
||||
|
||||
@ -189,7 +189,7 @@ function install_mod {
|
||||
cp "$nodespm" "$BACKUP_DIR/Nodes.pm.$timestamp"
|
||||
msg "Backup of \"$nodespm\" saved to \"$BACKUP_DIR/Nodes.pm.$timestamp\"."
|
||||
|
||||
sed -i '/my $dinfo = df('\''\/'\'', 1);/i\'$'\t''$res->{sensorsOutput} = `sensors -j`;\n' "$nodespm"
|
||||
sed -i '/my $dinfo = df('\''\/'\'', 1);/i\'$'\t''$res->{sensorsOutput} = `sensors -j`;\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/,(.*[.\\n]*.+})/$1/g;\n' "$nodespm"
|
||||
msg "Sensors' output added to \"$nodespm\"."
|
||||
else
|
||||
warn "Sensors' output already integrated in in \"$nodespm\"."
|
||||
@ -225,17 +225,20 @@ function install_mod {
|
||||
textField: 'sensorsOutput',\n\
|
||||
renderer: function(value){\n\
|
||||
// sensors configuration\n\
|
||||
const cpuAddress = \"$CPU_ADDRESS\";\n\
|
||||
const addressPrefix = \"$CPU_ADDRESS_PREFIX\";\n\
|
||||
const cpuItemPrefix = \"$CPU_ITEM_PREFIX\";\n\
|
||||
const cpuTempCaption = \"$CPU_TEMP_CAPTION\";\n\
|
||||
// display configuration\n\
|
||||
const itemsPerRow = $CPU_ITEMS_PER_ROW;\n\
|
||||
// ---\n\
|
||||
const objValue = JSON.parse(value);\n\
|
||||
if (objValue.hasOwnProperty(cpuAddress)) {\n\
|
||||
const items = objValue[cpuAddress];\n\
|
||||
const itemKeys = Object.keys(items).filter(item => { return String(item).startsWith(cpuItemPrefix); });\n\
|
||||
const cpuKeys = Object.keys(objValue).filter(item => String(item).startsWith(addressPrefix)).sort();\n\
|
||||
const cpuCount = cpuKeys.length;\n\
|
||||
let temps = [];\n\
|
||||
cpuKeys.forEach((cpuKey, cpuIndex) => {\n\
|
||||
let cpuTemps = [];\n\
|
||||
const items = objValue[cpuKey];\n\
|
||||
const itemKeys = Object.keys(items).filter(item => { return String(item).startsWith(cpuItemPrefix); });\n\
|
||||
itemKeys.forEach((coreKey) => {\n\
|
||||
try {\n\
|
||||
let tempVal = NaN, tempMax = NaN, tempCrit = NaN;\n\
|
||||
@ -264,14 +267,22 @@ function install_mod {
|
||||
} else {\n\
|
||||
tempStr = \`\${cpuTempCaption}: \${tempVal}°C\`;\n\
|
||||
}\n\
|
||||
temps.push(tempStr);\n\
|
||||
cpuTemps.push(tempStr);\n\
|
||||
}\n\
|
||||
} catch (e) { /*_*/\n\
|
||||
} catch (e) { /*_*/ }\n\
|
||||
});\n\
|
||||
if(cpuTemps.length > 0) {\n\
|
||||
temps.push(cpuTemps);\n\
|
||||
}\n\
|
||||
});\n\
|
||||
const result = temps.map((strTemp, index, arr) => { return strTemp + (index + 1 < arr.length ? (itemsPerRow > 0 && (index + 1) % itemsPerRow === 0 ? '<br>' : ' | ') : ''); });\n\
|
||||
return '<div style=\"text-align: left; margin-left: 28px;\">' + (result.length > 0 ? result.join('') : 'N/A') + '</div>';\n\
|
||||
let result = '';\n\
|
||||
temps.forEach((cpuTemps, cpuIndex) => {\n\
|
||||
const strCoreTemps = cpuTemps.map((strTemp, index, arr) => { return strTemp + (index + 1 < arr.length ? (itemsPerRow > 0 && (index + 1) % itemsPerRow === 0 ? '<br>' : ' | ') : ''); })\n\
|
||||
if(strCoreTemps.length > 0) {\n\
|
||||
result += (cpuCount > 1 ? \`CPU \${cpuIndex+1}: \` : '') + strCoreTemps.join('') + (cpuIndex < cpuCount ? '<br>' : '');\n\
|
||||
}\n\
|
||||
});\n\
|
||||
return '<div style=\"text-align: left; margin-left: 28px;\">' + (result.length > 0 ? result : 'N/A') + '</div>';\n\
|
||||
}\n\
|
||||
},
|
||||
}" "$pvemanagerlibjs"
|
||||
|
||||
@ -12,7 +12,7 @@ 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 `backup` directory relative to the script location.
|
||||
2. Add a new line to the `Nodes.pm` file that enables host system sensor readings using the `sensors` command.
|
||||
3. Modify the `pvemanagerlib.js` file to expand the space in the host summary view, add new items that displays the temperature information in Celsius for CPU, NVMe drives, HDDs/SSDs and fan speeds (actual view depend on the available sensor readings). The view layout is also adjusted to no longer match the column number settings and always expands to the full width of the browser window. It is also possible to collapse the panel vertically.
|
||||
3. Modify the `pvemanagerlib.js` file to expand the space in the host summary view, add new items that displays the temperature information in Celsius for CPU, NVMe drives, HDDs/SSDs and fan speeds (the actual item list depends on the available sensor readings). The view layout is also adjusted to no longer match the column number settings and always expands to the full width of the browser window. It is also possible to collapse the panel vertically.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user