This commit is contained in:
2026-07-25 18:45:18 -05:00
parent 808546846c
commit 6bed7068c7
4 changed files with 428 additions and 38 deletions
+157 -29
View File
@@ -6,6 +6,7 @@
source /opt/idssys/defaults/default.inc
source /opt/idssys/ta-proxmenu/defaults.inc
source /opt/idssys/ta-proxmenu/inc/git-update.inc
source /opt/idssys/ta-proxmenu/inc/deploy-iso-nfs-lxc.sh
ACTION_REQUESTED=0
[[ -n "${action:-}" ]] && ACTION_REQUESTED=1
@@ -174,8 +175,9 @@ TAPM_AUTHORIZE() {
host_fingerprint="$(sha256sum /etc/machine-id | cut -d' ' -f1)"
exchange_response="$(
TAPM_CODE="$deploycode" TAPM_FINGERPRINT="$host_fingerprint" TAPM_HOSTNAME="$(hostname)" \
TAPM_LAN_IP="${RNIP:-}" \
TAPM_REQUESTED_ACTION="$required_action" TAPM_REQUESTED_PACKAGE="$required_package" \
python3 -c 'import json, os, sys; json.dump({"code": os.environ["TAPM_CODE"], "host_fingerprint": os.environ["TAPM_FINGERPRINT"], "hostname": os.environ["TAPM_HOSTNAME"], "requested_action": os.environ["TAPM_REQUESTED_ACTION"], "requested_package": os.environ["TAPM_REQUESTED_PACKAGE"]}, sys.stdout)' |
python3 -c 'import json, os, sys; json.dump({"code": os.environ["TAPM_CODE"], "host_fingerprint": os.environ["TAPM_FINGERPRINT"], "hostname": os.environ["TAPM_HOSTNAME"], "lan_ip": os.environ["TAPM_LAN_IP"], "requested_action": os.environ["TAPM_REQUESTED_ACTION"], "requested_package": os.environ["TAPM_REQUESTED_PACKAGE"]}, sys.stdout)' |
curl --fail --silent --show-error \
--header 'Content-Type: application/json' \
--data-binary @- "${TAPM_BROKER_URL}/api/v1/exchange"
@@ -783,6 +785,11 @@ VIRTIO_STABLE_CHECKED=0
VIRTIO_STABLE_STATUS='unknown'
VIRTIO_STABLE_FILE=''
VIRTIO_LAST_FILE=''
DLDIR=''
VIRTIO_SELECTED_STORAGE=''
declare -a VIRTIO_STORAGE_IDS=()
declare -a VIRTIO_STORAGE_TYPES=()
declare -a VIRTIO_STORAGE_DIRS=()
TAPM_VIRTIO_FILENAME_FROM_URL() {
local url="${1%%\?*}"
@@ -792,12 +799,103 @@ TAPM_VIRTIO_FILENAME_FROM_URL() {
printf '%s\n' "$filename"
}
TAPM_VIRTIO_LABELED_FILENAME() {
local source_filename="$1"
local label="$2"
local version=''
[[ "$label" =~ ^[a-z0-9-]+$ ]] || return 1
if [[ "$source_filename" =~ ^virtio-win-(0\.1\.[0-9]+)\.iso$ ]]; then
version="${BASH_REMATCH[1]}"
elif [[ "$source_filename" != 'virtio-win.iso' ]]; then
return 1
fi
printf 'virtio-win-%s%s.iso\n' "$label" "${version:+-${version}}"
}
TAPM_REFRESH_ISO_STORAGES() {
local storage
local type
local status
local probe_path
VIRTIO_STORAGE_IDS=()
VIRTIO_STORAGE_TYPES=()
VIRTIO_STORAGE_DIRS=()
command -v pvesm >/dev/null 2>&1 || return 1
while read -r storage type status _; do
[[ "$storage" != 'Name' && "$status" == 'active' ]] || continue
probe_path="$(
pvesm path "${storage}:iso/tapm-path-probe.iso" 2>/dev/null
)" || continue
[[ "$probe_path" == /*/* ]] || continue
VIRTIO_STORAGE_IDS+=("$storage")
VIRTIO_STORAGE_TYPES+=("$type")
VIRTIO_STORAGE_DIRS+=("${probe_path%/*}")
done < <(pvesm status --content iso --enabled 1 2>/dev/null)
(( ${#VIRTIO_STORAGE_IDS[@]} > 0 ))
}
TAPM_SELECT_ISO_STORAGE() {
local index
local -a labels=()
local -a values=()
if ! TAPM_REFRESH_ISO_STORAGES; then
echo -e "${idsCL[LightRed]}No active, enabled Proxmox storage supporting ISO images was found.${idsCL[Default]}"
ENTER2CONTINUE
return 1
fi
if (( ${#VIRTIO_STORAGE_IDS[@]} == 1 )); then
index=0
else
for index in "${!VIRTIO_STORAGE_IDS[@]}"; do
labels+=("${VIRTIO_STORAGE_IDS[$index]} (${VIRTIO_STORAGE_TYPES[$index]}) — ${VIRTIO_STORAGE_DIRS[$index]}")
values+=("storage:${index}")
done
SELECT_MENU "Select ISO Storage" labels values
case "$MENU_SELECTION" in
storage:*) index="${MENU_SELECTION#storage:}";;
quit) EXIT1; exit 0;;
*) return 1;;
esac
fi
VIRTIO_SELECTED_STORAGE="${VIRTIO_STORAGE_IDS[$index]}"
DLDIR="${VIRTIO_STORAGE_DIRS[$index]}"
echo -e "\n${idsCL[LightCyan]}ISO storage: ${VIRTIO_SELECTED_STORAGE} (${DLDIR})${idsCL[Default]}"
}
TAPM_VIRTIO_FILE_EXISTS() {
local filename="$1"
local directory
for directory in "${VIRTIO_STORAGE_DIRS[@]}"; do
[[ -f "${directory}/${filename}" ]] && return 0
done
return 1
}
TAPM_ANY_LOCAL_VIRTIO_ISOS() {
local directory
for directory in "${VIRTIO_STORAGE_DIRS[@]}"; do
compgen -G "${directory}/virtio-win*.iso" >/dev/null && return 0
done
return 1
}
TAPM_REFRESH_VIRTIO_LOCAL_STATUS() {
[[ -n "$VIRTIO_STABLE_FILE" ]] || return
if [[ -f "${DLDIR}/${VIRTIO_STABLE_FILE}" ]]; then
if TAPM_VIRTIO_FILE_EXISTS "$VIRTIO_STABLE_FILE"; then
VIRTIO_STABLE_STATUS='current'
elif compgen -G "${DLDIR}/virtio-win*.iso" >/dev/null; then
elif TAPM_ANY_LOCAL_VIRTIO_ISOS; then
VIRTIO_STABLE_STATUS='update'
else
VIRTIO_STABLE_STATUS='available'
@@ -807,6 +905,7 @@ TAPM_REFRESH_VIRTIO_LOCAL_STATUS() {
TAPM_CHECK_VIRTIO_STABLE() {
local force="${1:-0}"
local effective_url
local source_filename
if (( VIRTIO_STABLE_CHECKED == 1 && force == 0 )); then
return
@@ -823,7 +922,9 @@ TAPM_CHECK_VIRTIO_STABLE() {
--output /dev/null --write-out '%{url_effective}' \
"$VIRTIO_STABLE_URL" 2>/dev/null
)" || return 1
VIRTIO_STABLE_FILE="$(TAPM_VIRTIO_FILENAME_FROM_URL "$effective_url")" ||
source_filename="$(TAPM_VIRTIO_FILENAME_FROM_URL "$effective_url")" ||
return 1
VIRTIO_STABLE_FILE="$(TAPM_VIRTIO_LABELED_FILENAME "$source_filename" latest)" ||
return 1
TAPM_REFRESH_VIRTIO_LOCAL_STATUS
}
@@ -844,7 +945,8 @@ TAPM_VALID_VIRTIO_ISO() {
TAPM_DOWNLOAD_VIRTIO_ISO() {
local url="$1"
local expected_filename="${2:-}"
local description="${3:-VirtIO driver ISO}"
local filename_label="$3"
local description="${4:-VirtIO driver ISO}"
local effective_url
local filename
local final_file
@@ -896,6 +998,11 @@ TAPM_DOWNLOAD_VIRTIO_ISO() {
echo -e "${idsCL[LightRed]}The VirtIO archive returned ${filename}; expected ${expected_filename}.${idsCL[Default]}"
return 1
fi
filename="$(TAPM_VIRTIO_LABELED_FILENAME "$filename" "$filename_label")" || {
rm -f -- "$partial_file"
echo -e "${idsCL[LightRed]}Could not create a safe local filename for the VirtIO ISO.${idsCL[Default]}"
return 1
}
if ! TAPM_VALID_VIRTIO_ISO "$partial_file"; then
rm -f -- "$partial_file"
@@ -916,11 +1023,13 @@ TAPM_DOWNLOAD_VIRTIO_ISO() {
echo -e "\n${idsCL[Green]}VirtIO ISO downloaded and validated.${idsCL[Default]}"
printf ' File: %s\n' "$filename"
printf ' Size: %s\n' "$(numfmt --to=iec-i --suffix=B "$size")"
printf ' Storage: %s\n' "$VIRTIO_SELECTED_STORAGE"
printf ' Destination: %s\n' "$DLDIR"
}
DOWNLOAD_VIRTIO_STABLE() {
if ! TAPM_DOWNLOAD_VIRTIO_ISO "$VIRTIO_STABLE_URL" '' \
TAPM_SELECT_ISO_STORAGE || return
if ! TAPM_DOWNLOAD_VIRTIO_ISO "$VIRTIO_STABLE_URL" '' latest \
'current stable VirtIO drivers'; then
FINISH_FAILED_ACTION
return
@@ -934,11 +1043,13 @@ DOWNLOAD_VIRTIO_STABLE() {
DOWNLOAD_VIRTIO_ARCHIVE() {
local release="$1"
local description="$2"
local filename_label="${3:-archive}"
local iso_version="${release%-*}"
local filename="virtio-win-${iso_version}.iso"
local url="https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-${release}/${filename}"
if ! TAPM_DOWNLOAD_VIRTIO_ISO "$url" "$filename" "$description"; then
TAPM_SELECT_ISO_STORAGE || return
if ! TAPM_DOWNLOAD_VIRTIO_ISO "$url" "$filename" "$filename_label" "$description"; then
FINISH_FAILED_ACTION
return
fi
@@ -961,6 +1072,7 @@ DOWNLOAD_CUSTOM_VIRTIO_ARCHIVE() {
}
SHOW_LOCAL_VIRTIO_ISOS() {
local index
local file
local found=0
@@ -968,18 +1080,25 @@ SHOW_LOCAL_VIRTIO_ISOS() {
echo
echo -e " ${idsCL[LightCyan]}Downloaded VirtIO ISOs${idsCL[Default]}"
echo
echo " Destination: ${DLDIR}"
echo
while IFS= read -r -d '' file; do
found=1
printf ' %-34s %10s %s\n' \
"${file##*/}" \
"$(numfmt --to=iec-i --suffix=B "$(stat -c '%s' "$file")")" \
"$(date --date="@$(stat -c '%Y' "$file")" '+%F %R')"
done < <(
find "$DLDIR" -maxdepth 1 -type f -name 'virtio-win*.iso' \
-print0 2>/dev/null | sort -z
)
if TAPM_REFRESH_ISO_STORAGES; then
for index in "${!VIRTIO_STORAGE_IDS[@]}"; do
echo -e " ${idsCL[LightCyan]}${VIRTIO_STORAGE_IDS[$index]}${idsCL[Default]} (${VIRTIO_STORAGE_TYPES[$index]})"
echo " ${VIRTIO_STORAGE_DIRS[$index]}"
while IFS= read -r -d '' file; do
found=1
printf ' %-42s %10s %s\n' \
"${file##*/}" \
"$(numfmt --to=iec-i --suffix=B "$(stat -c '%s' "$file")")" \
"$(date --date="@$(stat -c '%Y' "$file")" '+%F %R')"
done < <(
find "${VIRTIO_STORAGE_DIRS[$index]}" -maxdepth 1 -type f \
-name 'virtio-win*.iso' -print0 2>/dev/null | sort -z
)
echo
done
else
echo -e " ${idsCL[LightRed]}No active ISO-capable storage was found.${idsCL[Default]}"
fi
(( found == 1 )) || echo " No VirtIO ISOs are currently downloaded."
echo
read -r -p " Press ENTER to return..." _
@@ -1000,10 +1119,12 @@ VIRTIO_MENU() {
)
echo -en "\n${idsCL[LightCyan]}Checking the current stable VirtIO release...${idsCL[Default]} "
TAPM_REFRESH_ISO_STORAGES || true
TAPM_CHECK_VIRTIO_STABLE 1 || true
echo
while true; do
TAPM_REFRESH_ISO_STORAGES || true
TAPM_REFRESH_VIRTIO_LOCAL_STATUS
case "$VIRTIO_STABLE_STATUS" in
current)
@@ -1030,13 +1151,13 @@ VIRTIO_MENU() {
"View downloaded VirtIO ISOs"
"Refresh stable-version check"
)
[[ -f "${DLDIR}/virtio-win-0.1.240.iso" ]] &&
TAPM_VIRTIO_FILE_EXISTS 'virtio-win-server-2016-0.1.240.iso' &&
labels[1]+=" (downloaded)"
[[ -f "${DLDIR}/virtio-win-0.1.189.iso" ]] &&
TAPM_VIRTIO_FILE_EXISTS 'virtio-win-server-2012r2-0.1.189.iso' &&
labels[2]+=" (downloaded)"
[[ -f "${DLDIR}/virtio-win-0.1.172.iso" ]] &&
TAPM_VIRTIO_FILE_EXISTS 'virtio-win-server-2008r2-0.1.172.iso' &&
labels[3]+=" (downloaded)"
[[ -f "${DLDIR}/virtio-win-0.1.141.iso" ]] &&
TAPM_VIRTIO_FILE_EXISTS 'virtio-win-server-2008-0.1.141.iso' &&
labels[4]+=" (downloaded)"
SELECT_MENU "VirtIO Driver Downloads" labels values
@@ -1044,19 +1165,19 @@ VIRTIO_MENU() {
stable) DOWNLOAD_VIRTIO_STABLE;;
server2016)
DOWNLOAD_VIRTIO_ARCHIVE 0.1.240-1 \
"Windows Server 2016 compatibility drivers"
"Windows Server 2016 compatibility drivers" server-2016
;;
server2012)
DOWNLOAD_VIRTIO_ARCHIVE 0.1.189-1 \
"Windows Server 2012/R2 compatibility drivers"
"Windows Server 2012/R2 compatibility drivers" server-2012r2
;;
server2008r2)
DOWNLOAD_VIRTIO_ARCHIVE 0.1.172-1 \
"Windows Server 2008 R2 compatibility drivers"
"Windows Server 2008 R2 compatibility drivers" server-2008r2
;;
server2008)
DOWNLOAD_VIRTIO_ARCHIVE 0.1.141-1 \
"Windows Server 2008 compatibility drivers"
"Windows Server 2008 compatibility drivers" server-2008
;;
archive) DOWNLOAD_CUSTOM_VIRTIO_ARCHIVE;;
local) SHOW_LOCAL_VIRTIO_ISOS;;
@@ -1736,7 +1857,8 @@ HOST_SETUP_MENU() {
labels+=("Detect CPU model for live migrations")
values+=("cpu")
if compgen -G "${DLDIR}/virtio-win*.iso" >/dev/null; then
TAPM_REFRESH_ISO_STORAGES >/dev/null 2>&1 || true
if TAPM_ANY_LOCAL_VIRTIO_ISOS; then
labels+=("VirtIO driver downloads (local ISOs available)")
else
labels+=("VirtIO driver downloads")
@@ -1810,7 +1932,7 @@ MONITORING_MENU() {
CLUSTER_MENU() {
local -a labels
local -a values=("maintenance" "services" "keepalived")
local -a values=("maintenance" "services" "keepalived" "iso_nfs")
while true; do
if ha-manager status | grep -F "$(hostname -s)" | grep -q "maintenance mode"; then
@@ -1823,12 +1945,17 @@ CLUSTER_MENU() {
dpkg-query -W -f='${Status}' keepalived 2>/dev/null | grep -q "install ok installed" &&
labels+=("Deploy/reconfigure Keepalived (installed locally)") ||
labels+=("Deploy Keepalived on all cluster hosts")
labels+=("Create shared ISO storage using an LXC NFS server")
SELECT_MENU "Cluster & Maintenance" labels values
case "$MENU_SELECTION" in
maintenance) MAINTENANCE_MODE;;
services) SERVICE_RECOVERY_MENU;;
keepalived) INSTALL_KEEPALIVE;;
iso_nfs)
TAPM_DEPLOY_ISO_NFS_LXC
FINISH_ACTION
;;
back) return;;
quit) EXIT1; exit 0;;
esac
@@ -2110,6 +2237,7 @@ if (( ACTION_REQUESTED == 1 )); then
cpu) DETECT_CPU;;
maintenance|mm) MAINTENANCE_MODE;;
keepalived) INSTALL_KEEPALIVE;;
iso-nfs|iso_nfs) TAPM_DEPLOY_ISO_NFS_LXC;;
*) MAIN_MENU;;
esac
else