Improve robustness by adding input validation and sanitization. Replace SIGINT/SIGTERM trap payloads with numeric exit codes (130 and 143). Sanitize hostname to allowed characters and notify the user if it was adjusted. Add validation loops and user messages for CPU cores and RAM (positive integers), MAC address format (XX:XX:XX:XX:XX:XX), VLAN (1-4094 or default), and MTU (576-65520 or default). Minor output ordering tweaks to ensure values are echoed after processing.
- Remove unused send_line_to_vm function (replaced by virt-customize)
- Quote $VMID and add guard in cleanup_vmid
- Guard cleanup() against unset TEMP_DIR and quote variable
- Remove unused CLOUDINIT_PASSWORD variable
- Separate local declaration from assignment in get_image_url()
- Add retry loop for apt-get install (matches apt-get update pattern)
- Fix timeout message to match actual loop duration (~5-6 min)
Bug fixes:
- Add ~20 missing fi statements throughout advanced_settings(), check_root(),
arch_check(), ssh_check(), select_os(), start_script(), etc.
- Fix pve_check() missing elif/else/fi structure
- Fix DISK_SIZE unbound variable, initialized before machine type dialog
- Fix error_handler() with ${VMID:-} guard to prevent unbound variable error
Architecture improvement:
- Migrate from send_line_to_vm serial console approach to virt-customize with
a first-boot systemd service, consistent with other VM scripts
- First-boot service handles: clock sync (NTP + HTTP fallback), package
installation, swap setup, and UniFi OS installer execution
New features:
- Root password prompt with confirmation
- SSH public key support
- SSH enabled by default
- Cloud-init password override with user-set password
- Port 11443 readiness check after VM boot
- Elapsed time counter during wait loops
Remove storage type detection and explicit pvesm alloc/qm set steps, and inline EFI/disk/CD configuration into the initial qm create call. Uses unified storage refs (efidisk0 ${STORAGE}:1,efitype=4m,pre-enrolled-keys=0 and scsi0 ${STORAGE}:${DISK_SIZE},${DISK_CACHE}${THIN%,}) and sets the ISO via -cdrom local:iso/${FILENAME}. Adds a success message and streamlines VM creation by eliminating per-storage branching and manual allocation logic.
Remove interactive ISO storage detection/selection and associated ISO_PATH logic. Default to a fixed cache directory (/var/lib/vz/template/iso) via CACHE_DIR and update CACHE_FILE and mkdir usage accordingly. Also update VM configuration to reference the local ISO store (local:iso/<file>) instead of the previously selectable storage. This simplifies ISO handling by avoiding pvesm/whiptail prompts; note this hardcodes the ISO location and removes support for alternate ISO storages.
Introduce an interactive script (vm/cachyos-vm.sh) to create and configure a CachyOS VM on Proxmox. The script validates Proxmox environment and architecture, offers default and advanced settings via whiptail, detects storage/ISO locations, downloads the CachyOS desktop ISO, allocates EFI and main disks, creates and configures the VM (network, CPU, memory, disks, boot order, OVMF), sets a rich VM description, and optionally starts the VM. Also add an ASCII header file (vm/headers/cachyos-vm) used by the script.
Make SSH key provisioning explicit and interactive for cloud-init VMs. Default CLOUDINIT_SSH_KEYS is now empty; new helper functions discover and extract public keys from common host files, count them, and present a whiptail menu (import all host keys, paste one key, specify a file, or none). configure_cloudinit_ssh_keys writes selected keys to a temp file and sets CLOUDINIT_SSH_KEYS accordingly (removing the temp file if empty). setup_cloud_init now only applies --sshkeys when CLOUDINIT_SSH_KEYS is explicitly provided and logs the source, and vm/docker-vm.sh invokes the key selection UI for cloud-init VMs.
Add informative status messages and improve image customization flow: install base packages and Docker during virt-customize, enable Docker service, and configure /etc/docker/daemon.json (sets DOCKER_PREINSTALLED on success). Add finalization messages while setting hostname and SSH config. For images without cloud-init, add systemd drop-ins to enable root autologin on serial-getty@ttyS0 and getty@tty1. Also add a trailing newline to nginx-ui.json.
Collapse duplicated qm set invocation into a single call when attaching the EFI and root disk, removing the duplicate conditional block. Also stop redirecting setup_cloud_init output (remove >/dev/null 2>&1) so Cloud-Init setup logs and errors are visible for debugging. Note: the previous conditional added a --scsi1 "${STORAGE}:cloudinit" only when USE_CLOUD_INIT=yes; that explicit scsi1 assignment is no longer present in this unified call.
Remove Portainer option and related install/helper functions. Add caching of downloaded OS images to /var/lib/vz/template/cache and use a temporary work qcow2 for customization. Try to preinstall qemu-guest-agent and Docker with virt-customize (marking DOCKER_PREINSTALLED on success) and provide a fallback first-boot install-docker.service script when customization fails. Replace import flow to detect qm disk import vs qm importdisk, import the prepared image into storage, resize the disk, attach EFI/root disks, and simplify VM creation steps. Include various UX/cleanup tweaks (spinner handling, storage import flags, status messages and Cloud-Init/SSH handling).