From df2ec69448ae2763349070abd5800c8ffb4773fe Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Wed, 25 Jun 2025 20:23:31 +0200 Subject: [PATCH] Create Iso.sh --- scripts/test/Iso.sh | 240 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 scripts/test/Iso.sh diff --git a/scripts/test/Iso.sh b/scripts/test/Iso.sh new file mode 100644 index 0000000..cbd5e43 --- /dev/null +++ b/scripts/test/Iso.sh @@ -0,0 +1,240 @@ +#!/usr/bin/env bash + +# ========================================================== +# ProxMenux - UUP Dump ISO Creator +# ========================================================== +# Author : MacRimi +# Copyright : (c) 2024 MacRimi +# License : MIT (https://raw.githubusercontent.com/MacRimi/ProxMenux/main/LICENSE) +# Version : 1.0 +# Last Updated: 07/05/2025 +# ========================================================== +# Description: +# This script is part of the ProxMenux tools for Proxmox VE. +# It allows downloading and converting official Windows ISO images +# from UUP Dump using a shared link (with ID, pack, and edition). +# +# Key features: +# - Automatically installs and verifies required dependencies (aria2c, cabextract, wimlib-imagex…) +# - Downloads the selected Windows edition from UUP Dump using aria2 +# - Converts the downloaded files into a bootable ISO +# - Stores the resulting ISO in the default template path (/var/lib/vz/template/iso) +# - Provides a graphical prompt via whiptail for user-friendly usage +# +# This tool simplifies the creation of official Windows ISOs +# for use in virtual machines within Proxmox VE. +# ========================================================== + +BASE_DIR="/usr/local/share/proxmenux" +UTILS_FILE="$BASE_DIR/utils.sh" +VENV_PATH="/opt/googletrans-env" + +if [[ -f "$UTILS_FILE" ]]; then + source "$UTILS_FILE" +fi + +load_language +initialize_cache + +clear +show_proxmenux_logo + +# ========================================================== + + +detect_iso_dir() { + for store in $(pvesm status -content iso | awk 'NR>1 {print $1}'); do + for ext in iso img; do + volid=$(pvesm list "$store" --content iso | awk -v ext="$ext" 'NR>1 && $2 ~ ext {print $1; exit}') + if [[ -n "$volid" ]]; then + path=$(pvesm path "$volid" 2>/dev/null) + dir=$(dirname "$path") + [[ -d "$dir" ]] && echo "$dir" && return 0 + fi + done + done + + if [[ -d /var/lib/vz/template/iso ]]; then + echo "/var/lib/vz/template/iso" + return 0 + fi + + return 1 +} + + +function run_uupdump_creator() { + + + local DEPS=(curl aria2 cabextract wimtools genisoimage chntpw) + local CMDS=(curl aria2c cabextract wimlib-imagex genisoimage chntpw) + local MISSING=() + local FAILED=() + + for i in "${!CMDS[@]}"; do + if ! command -v "${CMDS[$i]}" &>/dev/null; then + MISSING+=("${DEPS[$i]}") + fi + done + + if [[ ${#MISSING[@]} -gt 0 ]]; then + msg_info "$(translate "Installing dependencies: ${MISSING[*]}")" + apt-get update -qq >/dev/null 2>&1 + if ! apt-get install -y "${MISSING[@]}" >/dev/null 2>&1; then + msg_error "$(translate "Failed to install: ${MISSING[*]}")" + exit 1 + fi + fi + + for i in "${!CMDS[@]}"; do + if ! command -v "${CMDS[$i]}" &>/dev/null; then + FAILED+=("${CMDS[$i]}") + fi + done + + if [[ ${#FAILED[@]} -eq 0 ]]; then + msg_ok "$(translate "All dependencies installed and verified.")" + else + msg_error "$(translate "Missing commands after installation: ${FAILED[*]}")" + exit 1 + fi + + +ISO_DIR=$(detect_iso_dir) +if [[ -z "$ISO_DIR" ]]; then + msg_error "$(translate "Could not determine a valid ISO storage directory.")" + exit 1 +fi + + +mkdir -p "$ISO_DIR" + +TMP_DIR=$(dialog --inputbox "Enter temporary folder path (default: /root/uup-temp):" 10 60 "/root/uup-temp" 3>&1 1>&2 2>&3) +if [[ $? -ne 0 || -z "$TMP_DIR" ]]; then + TMP_DIR="/root/uup-temp" +fi + +OUT_DIR="$ISO_DIR" +CONVERTER="/root/uup-converter" + +mkdir -p "$TMP_DIR" "$OUT_DIR" +cd "$TMP_DIR" || exit 1 + + +UUP_URL=$(whiptail --inputbox "$(translate "Paste the UUP Dump URL here")" 10 90 3>&1 1>&2 2>&3) +if [[ $? -ne 0 || -z "$UUP_URL" ]]; then + msg_warn "$(translate "Cancelled by user or empty URL.")" + return 1 +fi + +if [[ ! "$UUP_URL" =~ id=.+\&pack=.+\&edition=.+ ]]; then + msg_error "$(translate "The URL does not contain the required parameters (id, pack, edition).")" + sleep 2 + return 1 +fi + + +BUILD_ID=$(echo "$UUP_URL" | grep -oP 'id=\K[^&]+') +LANG=$(echo "$UUP_URL" | grep -oP 'pack=\K[^&]+') +EDITION=$(echo "$UUP_URL" | grep -oP 'edition=\K[^&]+') +ARCH="amd64" + +echo -e "\n${BGN}=============== UUP Dump Creator ===============${CL}" +echo -e " ${BGN}🆔 ID:${CL} ${DGN}$BUILD_ID${CL}" +echo -e " ${BGN}🌐 Language:${CL} ${DGN}$LANG${CL}" +echo -e " ${BGN}💿 Edition:${CL} ${DGN}$EDITION${CL}" +echo -e " ${BGN}🖥️ Architecture:${CL} ${DGN}$ARCH${CL}" +echo -e "${BGN}===============================================${CL}\n" + + +if [[ ! -f "$CONVERTER/convert.sh" ]]; then + echo "📦 $(translate "Downloading UUP converter...")" + mkdir -p "$CONVERTER" + cd "$CONVERTER" || exit 1 + wget -q https://git.uupdump.net/uup-dump/converter/archive/refs/heads/master.tar.gz -O converter.tar.gz + tar -xzf converter.tar.gz --strip-components=1 + chmod +x convert.sh + cd "$TMP_DIR" || exit 1 +fi + + +cat > uup_download_linux.sh < files/converter_multi + +for prog in aria2c cabextract wimlib-imagex chntpw; do + which \$prog &>/dev/null || { echo "\$prog not found."; exit 1; } +done +which genisoimage &>/dev/null || which mkisofs &>/dev/null || { echo "genisoimage/mkisofs not found."; exit 1; } + +destDir="UUPs" +tempScript="aria2_script.\$RANDOM.txt" + +aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" \ + -x16 -s16 -j2 --allow-overwrite=true --auto-file-renaming=false -d"files" -i"files/converter_multi" || exit 1 + +aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" \ + -o"\$tempScript" --allow-overwrite=true --auto-file-renaming=false \ + "https://uupdump.net/get.php?id=$BUILD_ID&pack=$LANG&edition=$EDITION&aria2=2" || exit 1 + +grep '#UUPDUMP_ERROR:' "\$tempScript" && { echo "❌ Error generating UUP download list."; exit 1; } + +aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" \ + -x16 -s16 -j5 -c -R -d"\$destDir" -i"\$tempScript" || exit 1 +EOF + +chmod +x uup_download_linux.sh + + + +# ========================== +./uup_download_linux.sh +# ========================== + + + +UUP_FOLDER=$(find "$TMP_DIR" -type d -name "UUPs" | head -n1) +[[ -z "$UUP_FOLDER" ]] && msg_error "$(translate "No UUP folder found.")" && exit 1 + + +echo -e "\n${GN}=======================================${CL}" +echo -e " 💿 ${GN}Starting ISO conversion...${CL}" +echo -e "${GN}=======================================${CL}\n" + +"$CONVERTER/convert.sh" wim "$UUP_FOLDER" 1 + + +ISO_FILE=$(find "$TMP_DIR" "$CONVERTER" "$UUP_FOLDER" -maxdepth 1 -iname "*.iso" | head -n1) +if [[ -f "$ISO_FILE" ]]; then + mv "$ISO_FILE" "$OUT_DIR/" + msg_ok "$(translate "ISO created successfully:") $OUT_DIR/$(basename "$ISO_FILE")" + + + msg_ok "$(translate "Cleaning temporary files...")" + rm -rf "$TMP_DIR" "$CONVERTER" + + export OS_TYPE="windows" + export LANGUAGE=C + export LANG=C + export LC_ALL=C + load_language + initialize_cache + + msg_success "$(translate "Press Enter to return to menu...")" + read -r + +else + msg_warn "$(translate "No ISO was generated.")" + rm -rf "$TMP_DIR" "$CONVERTER" + export LANGUAGE=C + export LANG=C + export LC_ALL=C + load_language + initialize_cache + msg_success "$(translate "Press Enter to return to menu...")" + read -r + return 1 +fi + +}