mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-06-14 20:36:59 +00:00
update 1.2.2.2 beta
This commit is contained in:
@@ -1793,6 +1793,21 @@ _rs_run_complete_guided() {
|
|||||||
plan_body="\Zb$(translate "Smart restore plan — hardware compatibility check")\ZB"$'\n\n'
|
plan_body="\Zb$(translate "Smart restore plan — hardware compatibility check")\ZB"$'\n\n'
|
||||||
plan_body+="$(translate "The backup metadata was compared against this host. The following items will be SKIPPED to keep the boot safe:")"$'\n\n'
|
plan_body+="$(translate "The backup metadata was compared against this host. The following items will be SKIPPED to keep the boot safe:")"$'\n\n'
|
||||||
|
|
||||||
|
# Identifier-based skips (ZFS pool GUID, boot EFI UUID, fstab
|
||||||
|
# UUID) ALWAYS fire on a cross-host restore — those identifiers
|
||||||
|
# are unique per disk/pool. Showing them in the dialog is noise
|
||||||
|
# the operator can't act on. We still apply the skips (that's
|
||||||
|
# what protects against, e.g., restoring zpool.cache pointing at
|
||||||
|
# a ghost pool), just without the dialog when only this noise
|
||||||
|
# would be shown. The signal-bearing skips (component drift —
|
||||||
|
# NVIDIA in backup, no NVIDIA card here) still trigger the dialog
|
||||||
|
# so the operator can decide.
|
||||||
|
local -A _IDENTIFIER_PATHS=(
|
||||||
|
["/etc/zfs/zpool.cache"]=1
|
||||||
|
["/etc/kernel/proxmox-boot-uuids"]=1
|
||||||
|
["/etc/fstab"]=1
|
||||||
|
)
|
||||||
|
local dialog_signal=0
|
||||||
local line key action reason
|
local line key action reason
|
||||||
for line in "${drift_lines[@]}"; do
|
for line in "${drift_lines[@]}"; do
|
||||||
IFS=$'\t' read -r key action reason <<<"$line"
|
IFS=$'\t' read -r key action reason <<<"$line"
|
||||||
@@ -1802,20 +1817,32 @@ _rs_run_complete_guided() {
|
|||||||
skip_components+="${cname} "
|
skip_components+="${cname} "
|
||||||
plan_body+=" \Z1•\Zn $(translate "Component:") \Zb${cname}\ZB"$'\n'
|
plan_body+=" \Z1•\Zn $(translate "Component:") \Zb${cname}\ZB"$'\n'
|
||||||
plan_body+=" ${reason}"$'\n\n'
|
plan_body+=" ${reason}"$'\n\n'
|
||||||
|
dialog_signal=1
|
||||||
else
|
else
|
||||||
skip_paths+="${key}"$'\n'
|
skip_paths+="${key}"$'\n'
|
||||||
|
# Identifier-based paths on cross-host: skip silently
|
||||||
|
# (the path goes into RS_SKIP_PATHS but stays out of
|
||||||
|
# the dialog body, and dialog_signal stays 0 if every
|
||||||
|
# skip is of this kind).
|
||||||
|
if [[ "${HB_COMPAT_SAME_HOST:-1}" == "0" ]] \
|
||||||
|
&& [[ -n "${_IDENTIFIER_PATHS[$key]:-}" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
plan_body+=" \Z1•\Zn $(translate "Path:") \Zb${key}\ZB"$'\n'
|
plan_body+=" \Z1•\Zn $(translate "Path:") \Zb${key}\ZB"$'\n'
|
||||||
plan_body+=" ${reason}"$'\n\n'
|
plan_body+=" ${reason}"$'\n\n'
|
||||||
|
dialog_signal=1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
plan_body+="$(translate "PVE will regenerate these files automatically for the current hardware. The rest of the backup will be applied normally.")"$'\n\n'
|
if (( dialog_signal == 1 )); then
|
||||||
plan_body+="\Zb$(translate "Continue with safe restore?")\ZB"
|
plan_body+="$(translate "PVE will regenerate these files automatically for the current hardware. The rest of the backup will be applied normally.")"$'\n\n'
|
||||||
|
plan_body+="\Zb$(translate "Continue with safe restore?")\ZB"
|
||||||
|
|
||||||
if ! dialog --backtitle "ProxMenux" --colors \
|
if ! dialog --backtitle "ProxMenux" --colors \
|
||||||
--title "$(translate "Restore plan — compatibility check")" \
|
--title "$(translate "Restore plan — compatibility check")" \
|
||||||
--yesno "$plan_body" 24 90; then
|
--yesno "$plan_body" 24 90; then
|
||||||
return 1
|
return 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Persist for _rs_apply / _rs_collect_pending_paths to honor.
|
# Persist for _rs_apply / _rs_collect_pending_paths to honor.
|
||||||
@@ -2286,7 +2313,6 @@ _rs_run_complete_extras() {
|
|||||||
fi
|
fi
|
||||||
if (( ${#unknown[@]} > 0 )); then
|
if (( ${#unknown[@]} > 0 )); then
|
||||||
msg_warn "$(translate "Skipped, not in apt cache:") ${unknown[*]:0:6}$([[ ${#unknown[@]} -gt 6 ]] && echo " … (+ $((${#unknown[@]} - 6)) more)")"
|
msg_warn "$(translate "Skipped, not in apt cache:") ${unknown[*]:0:6}$([[ ${#unknown[@]} -gt 6 ]] && echo " … (+ $((${#unknown[@]} - 6)) more)")"
|
||||||
echo -e "${TAB}${BL}$(translate "These were marked manual on the source host but apt-cache cannot resolve them now (typo, removed pkg, third-party repo not configured yet).")${CL}"
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1150,12 +1150,28 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
apply_nvidia_patch_if_needed() {
|
apply_nvidia_patch_if_needed() {
|
||||||
if ! hybrid_whiptail_yesno "$(translate 'NVIDIA Patch')" \
|
# NVIDIA_PATCH_AUTO lets non-interactive callers (the post-restore
|
||||||
"\n$(translate 'Do you want to apply the optional NVIDIA patch to remove some GPU limitations?')"; then
|
# auto-reinstall path in particular) skip the yes/no:
|
||||||
msg_info2 "$(translate 'NVIDIA patch not applied.')"
|
# yes → apply the patch silently (the operator decided "true" was
|
||||||
update_component_status "nvidia_driver" "installed" "$CURRENT_DRIVER_VERSION" "gpu" '{"patched":false}'
|
# the recorded state in the backup we just restored from)
|
||||||
return 0
|
# no → don't apply, mark as not patched (recorded state was false)
|
||||||
fi
|
# unset → ask, as before (interactive use from the menu)
|
||||||
|
case "${NVIDIA_PATCH_AUTO:-}" in
|
||||||
|
yes) : ;;
|
||||||
|
no)
|
||||||
|
msg_info2 "$(translate 'NVIDIA patch not applied.')"
|
||||||
|
update_component_status "nvidia_driver" "installed" "$CURRENT_DRIVER_VERSION" "gpu" '{"patched":false}'
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if ! hybrid_whiptail_yesno "$(translate 'NVIDIA Patch')" \
|
||||||
|
"\n$(translate 'Do you want to apply the optional NVIDIA patch to remove some GPU limitations?')"; then
|
||||||
|
msg_info2 "$(translate 'NVIDIA patch not applied.')"
|
||||||
|
update_component_status "nvidia_driver" "installed" "$CURRENT_DRIVER_VERSION" "gpu" '{"patched":false}'
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
msg_info "$(translate 'Cloning and applying NVIDIA patch (keylase/nvidia-patch)...')"
|
msg_info "$(translate 'Cloning and applying NVIDIA patch (keylase/nvidia-patch)...')"
|
||||||
ensure_workdir
|
ensure_workdir
|
||||||
@@ -1593,9 +1609,10 @@ auto_reinstall_from_state() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local recorded_status recorded_version
|
local recorded_status recorded_version recorded_patched
|
||||||
recorded_status=$(jq -r '.nvidia_driver.status // ""' "$COMPONENTS_STATUS_FILE" 2>/dev/null)
|
recorded_status=$(jq -r '.nvidia_driver.status // ""' "$COMPONENTS_STATUS_FILE" 2>/dev/null)
|
||||||
recorded_version=$(jq -r '.nvidia_driver.version // ""' "$COMPONENTS_STATUS_FILE" 2>/dev/null)
|
recorded_version=$(jq -r '.nvidia_driver.version // ""' "$COMPONENTS_STATUS_FILE" 2>/dev/null)
|
||||||
|
recorded_patched=$(jq -r '.nvidia_driver.patched // false' "$COMPONENTS_STATUS_FILE" 2>/dev/null)
|
||||||
|
|
||||||
if [[ "$recorded_status" != "installed" ]]; then
|
if [[ "$recorded_status" != "installed" ]]; then
|
||||||
echo "nvidia_driver not marked installed in state ($recorded_status) — nothing to do" | tee -a "$LOG_FILE"
|
echo "nvidia_driver not marked installed in state ($recorded_status) — nothing to do" | tee -a "$LOG_FILE"
|
||||||
@@ -1605,7 +1622,7 @@ auto_reinstall_from_state() {
|
|||||||
echo "nvidia_driver marked installed but no version recorded — aborting" | tee -a "$LOG_FILE"
|
echo "nvidia_driver marked installed but no version recorded — aborting" | tee -a "$LOG_FILE"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
echo "Recorded driver: $recorded_version" >>"$LOG_FILE"
|
echo "Recorded driver: $recorded_version (patched=$recorded_patched)" >>"$LOG_FILE"
|
||||||
|
|
||||||
detect_nvidia_gpus
|
detect_nvidia_gpus
|
||||||
if ! $NVIDIA_GPU_PRESENT; then
|
if ! $NVIDIA_GPU_PRESENT; then
|
||||||
@@ -1646,10 +1663,21 @@ auto_reinstall_from_state() {
|
|||||||
fi
|
fi
|
||||||
install_udev_rules_and_persistenced >>"$LOG_FILE" 2>&1
|
install_udev_rules_and_persistenced >>"$LOG_FILE" 2>&1
|
||||||
|
|
||||||
# Record success — overwrites whatever the restore put there
|
# If the backup said the driver was patched, re-apply the keylase
|
||||||
# (same version key, fresh timestamp).
|
# patch in non-interactive mode (NVIDIA_PATCH_AUTO=yes bypasses the
|
||||||
if declare -F update_component_status >/dev/null 2>&1; then
|
# yes/no prompt and goes straight to clone+apply). The patch helper
|
||||||
update_component_status "nvidia_driver" "installed" "$DRIVER_VERSION" "gpu" '{"patched":false}' >>"$LOG_FILE" 2>&1
|
# writes its own update_component_status with {"patched":true} on
|
||||||
|
# success, so we don't overwrite it below. If the backup said the
|
||||||
|
# driver was NOT patched, write {"patched":false} explicitly so the
|
||||||
|
# operator's recorded preference doesn't silently flip.
|
||||||
|
CURRENT_DRIVER_VERSION="$DRIVER_VERSION"
|
||||||
|
if [[ "$recorded_patched" == "true" ]]; then
|
||||||
|
echo "Recorded state had patched=true — re-applying NVIDIA patch..." | tee -a "$LOG_FILE"
|
||||||
|
NVIDIA_PATCH_AUTO=yes apply_nvidia_patch_if_needed >>"$LOG_FILE" 2>&1 || true
|
||||||
|
else
|
||||||
|
if declare -F update_component_status >/dev/null 2>&1; then
|
||||||
|
update_component_status "nvidia_driver" "installed" "$DRIVER_VERSION" "gpu" '{"patched":false}' >>"$LOG_FILE" 2>&1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "✓ NVIDIA driver $DRIVER_VERSION reinstalled" | tee -a "$LOG_FILE"
|
echo "✓ NVIDIA driver $DRIVER_VERSION reinstalled" | tee -a "$LOG_FILE"
|
||||||
|
|||||||
Reference in New Issue
Block a user