Update pve-privilege-converter.sh

This commit is contained in:
CanbiZ 2025-06-02 09:27:34 +02:00
parent dc568b7947
commit 68034a1c59

View File

@ -1,10 +1,5 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk
# Adapted from onethree7 (https://github.com/onethree7/proxmox-lxc-privilege-converter)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
if ! command -v curl >/dev/null 2>&1; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1
@ -22,7 +17,7 @@ header_info "$APP"
check_root() {
if [[ $EUID -ne 0 ]]; then
msg_error "Script must be run as root"
echo "[ERROR] Script must be run as root"
exit 1
fi
}
@ -36,7 +31,7 @@ select_container() {
done
if [[ ${#lxc_list[@]} -eq 0 ]]; then
msg_error "No containers found"
echo "[ERROR] No containers found"
exit 1
fi
@ -45,6 +40,7 @@ select_container() {
if [[ -n "$opt" ]]; then
read -r CONTAINER_ID CONTAINER_NAME <<<"$opt"
CONTAINER_NAME="${CONTAINER_NAME:-}"
echo "[DEBUG] Selected container: ID=$CONTAINER_ID NAME=$CONTAINER_NAME"
break
else
echo "Invalid selection. Try again."
@ -55,11 +51,13 @@ select_container() {
select_backup_storage() {
echo -e "Select backup storage (temporary vzdump location):"
mapfile -t backup_storages < <(pvesm status --content backup | awk 'NR > 1 {print $1}')
echo "[DEBUG] Found backup storages: ${backup_storages[*]}"
local PS3="Enter number of backup storage: "
select opt in "${backup_storages[@]}"; do
if [[ -n "$opt" ]]; then
BACKUP_STORAGE="$opt"
echo "[DEBUG] Selected backup storage: $BACKUP_STORAGE"
break
else
echo "Invalid selection. Try again."
@ -68,27 +66,36 @@ select_backup_storage() {
}
backup_container() {
msg_custom "Backing up container $CONTAINER_ID"
echo "[INFO] Backing up container $CONTAINER_ID to $BACKUP_STORAGE"
vzdump_output=$(mktemp)
echo "[DEBUG] Using temp file for vzdump output: $vzdump_output"
vzdump "$CONTAINER_ID" --compress zstd --storage "$BACKUP_STORAGE" --mode snapshot | tee "$vzdump_output"
echo "[DEBUG] vzdump completed. Parsing backup path …"
BACKUP_PATH=$(awk '/tar.zst/ {print $NF}' "$vzdump_output" | tr -d "'")
echo "[DEBUG] Parsed backup path: $BACKUP_PATH"
if [ -z "$BACKUP_PATH" ] || ! grep -q "Backup job finished successfully" "$vzdump_output"; then
rm "$vzdump_output"
msg_error "Backup failed"
echo "[ERROR] Backup failed"
exit 1
fi
rm "$vzdump_output"
msg_ok "Backup complete: $BACKUP_PATH"
echo "[OK] Backup complete: $BACKUP_PATH"
}
select_target_storage() {
echo -e "\nSelect target storage for new container:\n"
mapfile -t target_storages < <(pvesm status --content images | awk 'NR > 1 {print $1}')
echo "[DEBUG] Found target storages: ${target_storages[*]}"
PS3="Enter number of target storage: "
select opt in "${target_storages[@]}"; do
if [[ -n "$opt" ]]; then
TARGET_STORAGE="$opt"
echo "[DEBUG] Selected target storage: $TARGET_STORAGE"
break
else
echo "Invalid selection. Try again."
@ -103,6 +110,7 @@ select_container_id() {
read -rp "Enter new container ID (default: $next_free_id): " NEW_CONTAINER_ID
NEW_CONTAINER_ID=${NEW_CONTAINER_ID:-$next_free_id}
if [[ "$NEW_CONTAINER_ID" =~ ^[0-9]+$ ]] && [[ ! " ${USED_IDS[*]} " =~ " ${NEW_CONTAINER_ID} " ]]; then
echo "[DEBUG] Selected new container ID: $NEW_CONTAINER_ID"
break
else
echo "ID invalid or in use. Try again."
@ -117,18 +125,22 @@ perform_conversion() {
UNPRIVILEGED=false
fi
msg_custom "Restoring as $(if $UNPRIVILEGED; then echo privileged; else echo unprivileged; fi) container"
echo "[INFO] Restoring as $(if $UNPRIVILEGED; then echo privileged; else echo unprivileged; fi) container"
echo "[DEBUG] Backup path: $BACKUP_PATH"
echo "[DEBUG] Target storage: $TARGET_STORAGE"
restore_opts=("$NEW_CONTAINER_ID" "$BACKUP_PATH" --storage "$TARGET_STORAGE")
if $UNPRIVILEGED; then
restore_opts+=(--unprivileged false)
else
restore_opts+=(--unprivileged)
fi
echo "[DEBUG] Running: pct restore ${restore_opts[*]} -ignore-unpack-errors 1"
if pct restore "${restore_opts[@]}" -ignore-unpack-errors 1; then
msg_ok "Conversion successful"
echo "[OK] Conversion successful"
else
msg_error "Conversion failed"
echo "[ERROR] Conversion failed"
exit 1
fi
}
@ -149,18 +161,18 @@ manage_states() {
fi
fi
pct start "$NEW_CONTAINER_ID"
msg_ok "New container started"
echo "[OK] New container started"
else
msg_custom "Skipped container state change"
echo "[INFO] Skipped container state change"
fi
}
cleanup_files() {
read -rp "Delete backup archive? [$BACKUP_PATH] [Y/n]: " cleanup
if [[ ${cleanup:-Y} =~ ^[Yy] ]]; then
rm -f "$BACKUP_PATH" && msg_ok "Removed backup archive"
rm -f "$BACKUP_PATH" && echo "[OK] Removed backup archive"
else
msg_custom "Retained backup archive"
echo "[INFO] Retained backup archive"
fi
}
@ -171,8 +183,13 @@ summary() {
echo "Target Storage: $TARGET_STORAGE"
echo "Backup Path: $BACKUP_PATH"
echo "New Container ID: $NEW_CONTAINER_ID"
echo "Privilege Conversion: $(if $UNPRIVILEGED; then echo Unprivileged - >Privileged; else echo Privileged - >Unprivileged; fi)"
echo "==========================\n"
echo -n "Privilege Conversion: "
if $UNPRIVILEGED; then
echo "Unprivileged -> Privileged"
else
echo "Privileged -> Unprivileged"
fi
echo "=========================="
}
main() {