This commit is contained in:
Meliox 2026-06-11 19:56:42 +02:00
parent 8330c452fb
commit a145ddcc0e
10 changed files with 214 additions and 69 deletions

View File

@ -43,7 +43,12 @@ jobs:
run: | run: |
perl -i -pe 'BEGIN { $v = $ENV{BUILD_VERSION} } perl -i -pe 'BEGIN { $v = $ENV{BUILD_VERSION} }
s/(our \$VERSION\s*=\s*'"'"')[^'"'"']*'"'"';/$1'"'"'$v'"'"';/ s/(our \$VERSION\s*=\s*'"'"')[^'"'"']*'"'"';/$1'"'"'$v'"'"';/
' src/PVENodeInfo/PVEMod_Config.pm ' src/node_info/files/PVEMod_Config.pm
- name: Generate dynamic debian rules
run: |
bash src/gen-rules.sh >> debian/rules
bash src/gen-rules.sh conffiles >> debian/pve-mod.conffiles
- name: Build deb package - name: Build deb package
run: | run: |

View File

@ -36,13 +36,18 @@ jobs:
export BUILD_VERSION="${{ steps.version.outputs.build_version }}" export BUILD_VERSION="${{ steps.version.outputs.build_version }}"
perl -i -pe 'BEGIN { $v = $ENV{BUILD_VERSION} } perl -i -pe 'BEGIN { $v = $ENV{BUILD_VERSION} }
s/(our \$VERSION\s*=\s*'"'"')[^'"'"']*'"'"';/$1'"'"'$v'"'"';/ s/(our \$VERSION\s*=\s*'"'"')[^'"'"']*'"'"';/$1'"'"'$v'"'"';/
' src/PVENodeInfo/PVEMod_Config.pm ' src/node_info/files/PVEMod_Config.pm
- name: Set package version in changelog - name: Set package version in changelog
run: | run: |
BUILD_VERSION="${{ steps.version.outputs.build_version }}" BUILD_VERSION="${{ steps.version.outputs.build_version }}"
sed -i -E "0,/\(([^)]*)\)/s//(${BUILD_VERSION})/" debian/changelog sed -i -E "0,/\(([^)]*)\)/s//(${BUILD_VERSION})/" debian/changelog
- name: Generate dynamic debian rules
run: |
bash src/gen-rules.sh >> debian/rules
bash src/gen-rules.sh conffiles >> debian/pve-mod.conffiles
- name: Build package - name: Build package
run: dpkg-buildpackage -us -uc -b run: dpkg-buildpackage -us -uc -b

View File

@ -56,7 +56,12 @@ jobs:
export BUILD_VERSION="${VERSION}-test-${SHORT_SHA}" export BUILD_VERSION="${VERSION}-test-${SHORT_SHA}"
perl -i -pe 'BEGIN { $v = $ENV{BUILD_VERSION} } perl -i -pe 'BEGIN { $v = $ENV{BUILD_VERSION} }
s/(our \$VERSION\s*=\s*'"'"')[^'"'"']*'"'"';/$1'"'"'$v'"'"';/ s/(our \$VERSION\s*=\s*'"'"')[^'"'"']*'"'"';/$1'"'"'$v'"'"';/
' src/PVENodeInfo/PVEMod_Config.pm ' src/node_info/files/PVEMod_Config.pm
- name: Generate dynamic debian rules
run: |
bash src/gen-rules.sh >> debian/rules
bash src/gen-rules.sh conffiles >> debian/pve-mod.conffiles
- name: Build package - name: Build package
run: dpkg-buildpackage -us -uc -b run: dpkg-buildpackage -us -uc -b

View File

@ -1,3 +1 @@
/etc/pve-mod/pve-mod.conf /etc/pve-mod/pve-mod.conf
/etc/pve-mod/conf.d/node_info.conf
/etc/pve-mod/conf.d/nag_screen.conf

View File

@ -4,12 +4,21 @@ set -e
DEFAULT_DIR="/usr/share/pve-mod" DEFAULT_DIR="/usr/share/pve-mod"
CONF_DIR="/etc/pve-mod" CONF_DIR="/etc/pve-mod"
# Config file pairs to compare on upgrade: "<default-file>|<user-file>" # Build the list of config file pairs to compare on upgrade, one per line as
CONF_PAIRS=" # "<default-file>|<user-file>". The main config pair is fixed; per-module pairs
${DEFAULT_DIR}/pve-mod.conf.default|${CONF_DIR}/pve-mod.conf # are auto-discovered from the reference copies under conf.d so adding a module
${DEFAULT_DIR}/conf.d/node_info.conf.default|${CONF_DIR}/conf.d/node_info.conf # needs no edit here.
${DEFAULT_DIR}/conf.d/nag_screen.conf.default|${CONF_DIR}/conf.d/nag_screen.conf _build_conf_pairs() {
" echo "${DEFAULT_DIR}/pve-mod.conf.default|${CONF_DIR}/pve-mod.conf"
local default_conf base
for default_conf in "${DEFAULT_DIR}"/conf.d/*.default; do
[ -f "$default_conf" ] || continue
base="${default_conf##*/}" # <mod>.conf.default
base="${base%.default}" # <mod>.conf
echo "${default_conf}|${CONF_DIR}/conf.d/${base}"
done
}
CONF_PAIRS="$(_build_conf_pairs)"
# Extracts "section.key" pairs from an INI file, one per line. # Extracts "section.key" pairs from an INI file, one per line.
_extract_conf_keys() { _extract_conf_keys() {

68
debian/rules vendored
View File

@ -3,74 +3,26 @@
dh $@ dh $@
override_dh_install: override_dh_install:
# PVE API2 facade # ── Static section ─────────────────────────────────────────────────────
install -Dm644 src/PVENodeInfo/PveMod_SensorInfo.pm \ # Generic, mod-independent files that never change when mods are added.
debian/pve-mod/usr/share/perl5/PVE/API2/PVEMod_SensorInfo.pm # Everything mod-specific (module files, patches, per-mod configs) is
# PVEMod core modules (strip PVEMod_ prefix) # generated and appended below by src/gen-rules.sh at build time and is
install -Dm644 src/PVENodeInfo/PVEMod_Config.pm \ # NOT committed to the repository.
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Config.pm #
install -Dm644 src/PVENodeInfo/PVEMod_Utils.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Utils.pm
install -Dm644 src/PVENodeInfo/PVEMod_Store.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Store.pm
install -Dm644 src/PVENodeInfo/PVEMod_ProcessManager.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/ProcessManager.pm
# Collector plugins
install -Dm644 src/PVENodeInfo/PVEMod_Collectors/Intel.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Collector/Intel.pm
install -Dm644 src/PVENodeInfo/PVEMod_Collectors/Nvidia.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Collector/Nvidia.pm
install -Dm644 src/PVENodeInfo/PVEMod_Collectors/Amd.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Collector/Amd.pm
install -Dm644 src/PVENodeInfo/PVEMod_Collectors/LmSensors.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Collector/LmSensors.pm
install -Dm644 src/PVENodeInfo/PVEMod_Collectors/Ups.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Collector/Ups.pm
install -Dm644 src/PVENodeInfo/PVEMod_Collectors/systemInformation.pm \
debian/pve-mod/usr/share/perl5/PVE/PVEMod/Collector/SystemInformation.pm
# JS module (rename to match loader reference)
install -Dm644 src/PVENodeInfo/PveMod_pvemanagerlib.js \
debian/pve-mod/usr/share/pve-manager/js/PveMod_PveNodeStatusView.js
# Patch helpers (generic, manifest-driven) # Patch helpers (generic, manifest-driven)
install -Dm755 src/Scripts/apply-patches.sh \ install -Dm755 src/Scripts/apply-patches.sh \
debian/pve-mod/usr/lib/pve-mod/apply-patches.sh debian/pve-mod/usr/lib/pve-mod/apply-patches.sh
install -Dm755 src/Scripts/revert-patches.sh \ install -Dm755 src/Scripts/revert-patches.sh \
debian/pve-mod/usr/lib/pve-mod/revert-patches.sh debian/pve-mod/usr/lib/pve-mod/revert-patches.sh
# node_info mod patches + manifest + hooks
install -Dm644 src/PVENodeInfo/patches/patches.list \
debian/pve-mod/usr/lib/pve-mod/patches/node_info/patches.list
install -Dm644 src/PVENodeInfo/patches/01-nodes-pm-sensors.patch \
debian/pve-mod/usr/lib/pve-mod/patches/node_info/01-nodes-pm-sensors.patch
install -Dm644 src/PVENodeInfo/patches/02-nodes-pm-GPU-RRD-history.patch \
debian/pve-mod/usr/lib/pve-mod/patches/node_info/02-nodes-pm-GPU-RRD-history.patch
install -Dm644 src/PVENodeInfo/patches/03-pvemanager-js-sensors.patch \
debian/pve-mod/usr/lib/pve-mod/patches/node_info/03-pvemanager-js-sensors.patch
install -Dm755 src/PVENodeInfo/patches/post-apply.sh \
debian/pve-mod/usr/lib/pve-mod/patches/node_info/post-apply.sh
# nag_screen mod patches + manifest + hooks
install -Dm644 src/NagScreen/patches/patches.list \
debian/pve-mod/usr/lib/pve-mod/patches/nag_screen/patches.list
install -Dm644 src/NagScreen/patches/01-proxmoxlib-js-nagscreen.patch \
debian/pve-mod/usr/lib/pve-mod/patches/nag_screen/01-proxmoxlib-js-nagscreen.patch
install -Dm755 src/NagScreen/patches/post-apply.sh \
debian/pve-mod/usr/lib/pve-mod/patches/nag_screen/post-apply.sh
install -Dm755 src/NagScreen/patches/post-revert.sh \
debian/pve-mod/usr/lib/pve-mod/patches/nag_screen/post-revert.sh
# Configure tool # Configure tool
install -Dm755 src/Scripts/pve-mod-configure \ install -Dm755 src/Scripts/pve-mod-configure \
debian/pve-mod/usr/sbin/pve-mod-configure debian/pve-mod/usr/sbin/pve-mod-configure
# Main config (conffile for user edits) # Main config (conffile for user edits)
install -Dm644 src/pve-mod.conf \ install -Dm644 src/pve-mod.conf \
debian/pve-mod/etc/pve-mod/pve-mod.conf debian/pve-mod/etc/pve-mod/pve-mod.conf
# Per-mod configs under conf.d (conffiles for user edits) # Main config reference copy for upgrade key-diff (not a conffile)
install -Dm644 src/PVENodeInfo/node_info.conf \
debian/pve-mod/etc/pve-mod/conf.d/node_info.conf
install -Dm644 src/NagScreen/nag_screen.conf \
debian/pve-mod/etc/pve-mod/conf.d/nag_screen.conf
# Reference copies for upgrade key-diff (not conffiles — always updated)
install -Dm644 src/pve-mod.conf \ install -Dm644 src/pve-mod.conf \
debian/pve-mod/usr/share/pve-mod/pve-mod.conf.default debian/pve-mod/usr/share/pve-mod/pve-mod.conf.default
install -Dm644 src/PVENodeInfo/node_info.conf \ # ── Dynamic section ────────────────────────────────────────────────────
debian/pve-mod/usr/share/pve-mod/conf.d/node_info.conf.default # `bash src/gen-rules.sh >> debian/rules` appends per-module install lines
install -Dm644 src/NagScreen/nag_screen.conf \ # here during CI, just before dpkg-buildpackage. Do not commit them.
debian/pve-mod/usr/share/pve-mod/conf.d/nag_screen.conf.default

134
src/gen-rules.sh Normal file
View File

@ -0,0 +1,134 @@
#!/usr/bin/env bash
# src/gen-rules.sh
#
# Generates the per-module portion of the Debian build configuration from each
# module's metadata, so adding or changing a module never requires touching
# debian/rules by hand.
#
# A module is any directory under src/ that contains a files/ and/or patches/
# subdirectory (so src/Scripts/, which has neither, is ignored). The module's
# directory name is its canonical mod key (matches the [modules] keys in
# pve-mod.conf and the install path usr/lib/pve-mod/patches/<mod>/).
#
# Usage:
# gen-rules.sh Emit dpkg install lines (tab-indented, no header).
# Append to debian/rules' override_dh_install recipe:
# bash src/gen-rules.sh >> debian/rules
# gen-rules.sh conffiles Emit per-module conffile paths (one per line).
# Append to debian/pve-mod.conffiles:
# bash src/gen-rules.sh conffiles >> debian/pve-mod.conffiles
#
# For each module it emits, in order:
# 1. files/files.list -> install each mapped file at its destination.
# Format: <source> <destination> [permission]
# (permission defaults to 644; source is relative to
# the module's files/ directory).
# 2. patches/* -> every file under patches/ recursively, including
# patches.list and hook scripts. Shell scripts (.sh)
# get mode 755, everything else 644. Installed under
# usr/lib/pve-mod/patches/<mod>/<relative-path>.
# 3. <mod>.conf -> if present in the module root, installed as a
# conffile at etc/pve-mod/conf.d/<mod>.conf (644) plus
# a reference copy at
# usr/share/pve-mod/conf.d/<mod>.conf.default (644).
set -euo pipefail
# Resolve repository root from this script's location so paths are stable
# regardless of the caller's working directory.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
SRC_DIR="$REPO_ROOT/src"
PKG_DIR="debian/pve-mod"
MODE="${1:-install}"
# Print the list of module directory names (basenames), sorted, that contain a
# files/ or patches/ subdirectory.
list_modules() {
local d name
for d in "$SRC_DIR"/*/; do
[[ -d "$d" ]] || continue
name="$(basename "$d")"
if [[ -d "$d/files" || -d "$d/patches" ]]; then
echo "$name"
fi
done | sort
}
# Emit a single tab-indented `install -D` line.
# Args: <mode> <relative-source> <relative-destination>
emit_install() {
printf '\tinstall -Dm%s %s %s/%s\n' "$1" "$2" "$PKG_DIR" "$3"
}
emit_install_rules() {
local mod="$1"
local mod_dir="$SRC_DIR/$mod"
local rel_mod="src/$mod"
# 1. Mapped files from files/files.list.
local manifest="$mod_dir/files/files.list"
if [[ -f "$manifest" ]]; then
local src dest perm
while read -r src dest perm; do
# Tolerate CRLF line endings.
src="${src%$'\r'}"; dest="${dest%$'\r'}"; perm="${perm%$'\r'}"
# Skip comments and blank lines.
[[ -z "${src:-}" || "$src" == \#* ]] && continue
perm="${perm:-644}"
emit_install "$perm" "$rel_mod/files/$src" "$dest"
done < "$manifest"
fi
# 2. Everything under patches/ (recursive): .sh -> 755, else 644.
local patches_dir="$mod_dir/patches"
if [[ -d "$patches_dir" ]]; then
local f rel perm
while IFS= read -r f; do
rel="${f#"$patches_dir"/}"
if [[ "$rel" == *.sh ]]; then
perm=755
else
perm=644
fi
emit_install "$perm" "$rel_mod/patches/$rel" "usr/lib/pve-mod/patches/$mod/$rel"
done < <(find "$patches_dir" -type f | sort)
fi
# 3. Per-module config: conffile + reference default copy.
local conf="$mod_dir/$mod.conf"
if [[ -f "$conf" ]]; then
emit_install 644 "$rel_mod/$mod.conf" "etc/pve-mod/conf.d/$mod.conf"
emit_install 644 "$rel_mod/$mod.conf" "usr/share/pve-mod/conf.d/$mod.conf.default"
fi
}
emit_conffiles() {
local mod="$1"
if [[ -f "$SRC_DIR/$mod/$mod.conf" ]]; then
echo "/etc/pve-mod/conf.d/$mod.conf"
fi
}
main() {
local mod
case "$MODE" in
install)
for mod in $(list_modules); do
emit_install_rules "$mod"
done
;;
conffiles)
for mod in $(list_modules); do
emit_conffiles "$mod"
done
;;
*)
echo "Usage: $0 [install|conffiles]" >&2
exit 2
;;
esac
}
main

View File

@ -0,0 +1,10 @@
# pve-mod :: nag_screen file manifest
# Maps files in this directory to their installation destinations.
# Format: <source> <destination> [permission]
# source - path relative to this files/ directory
# destination - path relative to the package root (no leading slash)
# permission - octal mode, optional (defaults to 644)
# Read by src/gen-rules.sh to generate the per-module debian install rules.
#
# The nag_screen mod ships no new files - it only patches existing Proxmox
# files - so this manifest is intentionally empty.

View File

@ -0,0 +1,27 @@
# pve-mod :: node_info file manifest
# Maps files in this directory to their installation destinations.
# Format: <source> <destination> [permission]
# source - path relative to this files/ directory
# destination - path relative to the package root (no leading slash)
# permission - octal mode, optional (defaults to 644)
# Read by src/gen-rules.sh to generate the per-module debian install rules.
# PVE API2 facade
PveMod_SensorInfo.pm usr/share/perl5/PVE/API2/PVEMod_SensorInfo.pm
# PVEMod core modules (strip PVEMod_ prefix)
PVEMod_Config.pm usr/share/perl5/PVE/PVEMod/Config.pm
PVEMod_Utils.pm usr/share/perl5/PVE/PVEMod/Utils.pm
PVEMod_Store.pm usr/share/perl5/PVE/PVEMod/Store.pm
PVEMod_ProcessManager.pm usr/share/perl5/PVE/PVEMod/ProcessManager.pm
# Collector plugins
PVEMod_Collectors/Intel.pm usr/share/perl5/PVE/PVEMod/Collector/Intel.pm
PVEMod_Collectors/Nvidia.pm usr/share/perl5/PVE/PVEMod/Collector/Nvidia.pm
PVEMod_Collectors/Amd.pm usr/share/perl5/PVE/PVEMod/Collector/Amd.pm
PVEMod_Collectors/LmSensors.pm usr/share/perl5/PVE/PVEMod/Collector/LmSensors.pm
PVEMod_Collectors/Ups.pm usr/share/perl5/PVE/PVEMod/Collector/Ups.pm
PVEMod_Collectors/systemInformation.pm usr/share/perl5/PVE/PVEMod/Collector/SystemInformation.pm
# JS module (rename to match loader reference)
PveMod_pvemanagerlib.js usr/share/pve-manager/js/PveMod_PveNodeStatusView.js