2025-01-14 11:42:26 +01:00
#!/bin/bash
2025-01-26 19:40:00 +01:00
# ProxMenu - A menu-driven script for Proxmox VE administration
# Copyright (c) 2024 ProxMenu
# Author: MacRimi
# License: MIT
# https://raw.githubusercontent.com/MacRimi/ProxMenux/main/LICENSE
# Source utility functions
source "/usr/local/share/proxmenux/utils.sh"
# Path where disk images are stored
2025-01-14 11:42:26 +01:00
IMAGES_DIR = "/var/lib/vz/template/images/"
2025-01-26 19:40:00 +01:00
# Check dependencies
check_dependencies qm whiptail jq
# Initial setup
2025-01-14 11:42:26 +01:00
if ! [ -d " $IMAGES_DIR " ] ; then
2025-01-26 19:40:00 +01:00
msg_info " $( translate 'Creating images directory...' ) "
2025-01-14 11:42:26 +01:00
mkdir -p " $IMAGES_DIR "
2025-01-26 19:40:00 +01:00
msg_ok " $( translate 'Images directory created' ) "
2025-01-14 11:42:26 +01:00
fi
2025-01-26 19:40:00 +01:00
# Display initial message
whiptail --title " $( translate 'Import Disk Image' ) " --msgbox " $( translate 'Please ensure that the disk images you want to import are located in:' ) \n\n $IMAGES_DIR \n\n $( translate 'Supported formats: .img, .qcow2, .vmdk.' ) " 12 60
2025-01-14 11:42:26 +01:00
2025-01-26 19:40:00 +01:00
# 1. Select VM
msg_info " $( translate 'Getting VM list...' ) "
2025-01-14 15:21:53 +01:00
VM_LIST = $( qm list | awk 'NR>1 {print $1, $2}' )
if [ -z " $VM_LIST " ] ; then
2025-01-26 19:40:00 +01:00
msg_error " $( translate 'No VMs available in the system' ) "
2025-01-14 11:42:26 +01:00
exit 1
fi
2025-01-26 19:40:00 +01:00
msg_ok " $( translate 'VM list retrieved' ) "
2025-01-14 11:42:26 +01:00
2025-01-26 19:40:00 +01:00
VMID = $( whiptail --title " $( translate 'Select VM' ) " --menu " $( translate 'Select the VM where you want to import the disk image:' ) " 15 60 8 $VM_LIST 3>& 1 1>& 2 2>& 3)
2025-01-14 11:42:26 +01:00
if [ -z " $VMID " ] ; then
2025-01-26 19:40:00 +01:00
msg_error " $( translate 'No VM selected' ) "
exit 1
fi
# 2. Select disk images
msg_info " $( translate 'Scanning for disk images...' ) "
IMAGES = $( ls " $IMAGES_DIR " | grep -E " \.(img|qcow2|vmdk) $" )
if [ -z " $IMAGES " ] ; then
msg_error " $( translate 'No compatible disk images found in' ) $IMAGES_DIR "
2025-01-14 11:42:26 +01:00
exit 1
fi
2025-01-26 19:40:00 +01:00
msg_ok " $( translate 'Disk images found' ) "
IMAGE_LIST = ""
for img in $IMAGES ; do
IMAGE_LIST = " $IMAGE_LIST $img OFF "
done
2025-01-14 11:42:26 +01:00
2025-01-26 19:40:00 +01:00
SELECTED_IMAGES = $( whiptail --title " $( translate 'Select Disk Images' ) " --checklist " $( translate 'Select the disk images to import:' ) " 20 60 10 $IMAGE_LIST 3>& 1 1>& 2 2>& 3)
2025-01-14 15:21:53 +01:00
2025-01-26 19:40:00 +01:00
if [ -z " $SELECTED_IMAGES " ] ; then
msg_error " $( translate 'No images selected' ) "
2025-01-14 15:21:53 +01:00
exit 1
fi
2025-01-26 19:40:00 +01:00
# 3. Import each selected image
for IMAGE in $SELECTED_IMAGES ; do
# Remove quotes from selected image
IMAGE = $( echo " $IMAGE " | tr -d '"' )
# 4. Select disk type for each image
INTERFACE = $( whiptail --title " $( translate 'Interface Type' ) " --menu " $( translate 'Select disk type for image:' ) $IMAGE " 15 40 4 \
"sata" " $( translate 'Add as SATA' ) " \
"scsi" " $( translate 'Add as SCSI' ) " \
"virtio" " $( translate 'Add as VirtIO' ) " \
"ide" " $( translate 'Add as IDE' ) " 3>& 1 1>& 2 2>& 3)
if [ -z " $INTERFACE " ] ; then
msg_error " $( translate 'No disk type selected for' ) $IMAGE "
continue
2025-01-14 11:42:26 +01:00
fi
2025-01-26 19:40:00 +01:00
FULL_PATH = " $IMAGES_DIR / $IMAGE "
2025-01-14 11:42:26 +01:00
2025-01-26 19:40:00 +01:00
# 5. Add image with automatic index
2025-01-14 15:21:53 +01:00
INDEX = 0
2025-01-26 19:40:00 +01:00
# Find available index
while qm config " $VMID " | grep -q " ${ INTERFACE } ${ INDEX } " ; do
2025-01-14 15:21:53 +01:00
( ( INDEX++) )
done
2025-01-26 19:40:00 +01:00
msg_info " $( translate 'Importing image:' ) $IMAGE $( translate 'as' ) ${ INTERFACE } ${ INDEX } ... "
(
if qm importdisk " $VMID " " $FULL_PATH " "local-lvm" --format " $INTERFACE " ; then
if qm set " $VMID " -${ INTERFACE } ${ INDEX } " $FULL_PATH " ; then
msg_ok " $( translate 'Successfully imported' ) $IMAGE $( translate 'as' ) ${ INTERFACE } ${ INDEX } "
else
msg_error " $( translate 'Failed to configure disk' ) ${ INTERFACE } ${ INDEX } $( translate 'for VM' ) $VMID "
fi
else
msg_error " $( translate 'Failed to import' ) $IMAGE "
fi
) &
spinner
wait
2025-01-14 11:42:26 +01:00
done
2025-01-26 19:40:00 +01:00
msg_ok " $( translate 'All selected images have been processed' ) "
2025-01-14 11:42:26 +01:00
exit 0