-
Alberto LIVIO BECCARIA authoredAlberto LIVIO BECCARIA authored
vm-start 10.50 KiB
#!/bin/bash
#############################################
# VirtualBox VM Scripts - vm-start
# by ulisse aka A. Livio Beccaria
#
# vm-start starts a VM :)
#############################################
APP_NAME="vm-start - VirtualBox VM Scripts"
VERSION="18.6.1"
AUTHOR="DiSIT"
# get source folder
SRC_DIR="$(dirname $(readlink -f $0))"
# include global settings
source "${SRC_DIR}/settings/settings"
# include common code
source "${SRC_DIR}/settings/common"
###############################################################################
# Title
##############
title () {
echo -e "$APP_NAME by $AUTHOR"
echo "v.$VERSION"
echo
}
###############################################################################
###############################################################################
# Debug info
##################
debug () {
if [[ ${DEBUG} == 1 ]]; then
cat << EOF
Debug info:
vm_id = $VM_ID
fullscreen = $FULLSCREEN
no-init = $NO_INIT
no-run = $NO_RUN
discard-state = $DISCARD_STATE
hd-autoreset = $HD_AUTORESET
EOF
fi
}
###############################################################################
###############################################################################
# Usage
#######
usage () {
if [[ "$@" != "" ]]; then
echo >&2 "$@"
echo
fi
cat << EOF
Usage: ${BOLD}$0${NORMAL} <vm_id | vm_name> [OPTION]...
Options:
${BOLD}-g, --gui${NORMAL}
launch VirtualBox in GUI mode (in a window with menus)
${BOLD}-f, --fullscreen${NORMAL}
launch VirtualBox in fullscreen mode
${BOLD}-i, --no-init${NORMAL}
don't reset VM (NIC MAC address, HDs and snapshot, if any)
${BOLD}-r, --no-run${NORMAL}
the VM will not get started, just resetted (if --no-init is not set)
${BOLD}-s, --discard-state${NORMAL}
discard VM's saved state, if any
${BOLD}-a, --hd-autoreset${NORMAL}
set HD images autoreset flag
${BOLD}-d, --debug${NORMAL}
print some debug info
${BOLD}-h, --help${NORMAL}
print this help info
EOF
print_vm_list
echo
exit 1
}
###############################################################################
###############################################################################
# vbox_remove_medium (disk_img, port_num)
###################
vbox_remove_medium () {
local disk_img=$1
local port_num=$2
echo "Removing disk ${port_num}..."
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port ${port_num} --device 0 --medium none
sleep 1
vboxmanage showvminfo "${VM_NAME}" | grep -m1 -Po ".*\.vdi.*\(UUID: \K(.*)" | while read -r line ; do
# remove last ')'
TMP_DIFF=${line::-1}
if [ "${TMP_DIFF}" != "" ]; then
vboxmanage closemedium disk "${TMP_DIFF}" --delete
fi
done
}
###############################################################################
# vbox_remove_media
###################
vbox_remove_media () {
if [[ "${DISK_IMAGE_1}" != "" ]]; then
vbox_remove_medium ${DISK_IMAGE_1} 1
fi
if [[ "${DISK_IMAGE_2}" != "" ]]; then
vbox_remove_medium ${DISK_IMAGE_2} 2
fi
if [[ "${DISK_IMAGE_3}" != "" ]]; then
vbox_remove_medium ${DISK_IMAGE_3} 3
fi
if [[ "${DISK_IMAGE_4}" != "" ]]; then
vbox_remove_medium ${DISK_IMAGE_4} 4
fi
}
###############################################################################
###############################################################################
# vbox_attach_medium (disk_img, port_num, disk_type)
###################
vbox_attach_medium () {
local disk_img=$1
local port_num=$2
local disk_type=$3
echo "Attaching disk ${port_num}..."
VBoxManage modifyhd "${disk_img}" --type ${disk_type}
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port ${port_num} --device 0 --type hdd --medium "${disk_img}"
}
###############################################################################
# vbox_attach_media
###################
vbox_attach_media () {
if [[ "${DISK_IMAGE_1}" != "" ]]; then
vbox_attach_medium "${DISK_IMAGE_1}" 1 ${STORAGE_TYPE}
fi
if [[ "${DISK_IMAGE_2}" != "" ]]; then
vbox_attach_medium "${DISK_IMAGE_2}" 2 ${STORAGE_TYPE}
fi
if [[ "${DISK_IMAGE_3}" != "" ]]; then
vbox_attach_medium "${DISK_IMAGE_3}" 3 ${STORAGE_TYPE}
fi
if [[ "${DISK_IMAGE_4}" != "" ]]; then
vbox_attach_medium "${DISK_IMAGE_4}" 4 ${STORAGE_TYPE}
fi
}
###############################################################################
###############################################################################
# vbox_set_hd_autoreset (hd_autoreset)
###################
vbox_set_hd_autoreset () {
local hd_autoreset=$1
# iterate on all attached disks (they should be all differencing disks)
vboxmanage showvminfo "${VM_NAME}" | grep -m1 -Po ".*\.vdi.*\(UUID: \K(.*)" | while read -r line ; do
# remove last ')'
TMP_DIFF=${line::-1}
if [ "${TMP_DIFF}" != "" ]; then
echo "Setting differential disk ${TMP_DIFF}: autoreset=${hd_autoreset}"
VBoxManage modifyhd ${TMP_DIFF} --autoreset ${hd_autoreset}
fi
done
}
###############################################################################
# vm_start_init
###############
vm_start_init () {
# create temporary folder
if [ ! -d $USER_TMP_DIR ]; then
mkdir $USER_TMP_DIR
fi
# remove files older than 12 hours
#find ${USER_TMP_DIR} -name "*" -type f -mmin +720 -delete
# copy diff file (if needed)
if [ "${DIFF_DISK_FILE}" != "" ]; then
echo -n "Setting up differential disk... "
cp "${TEMPLATE_DIR}/${DIFF_DISK_FILE}" "${USER_TMP_DIR}"
chmod 755 "${USER_TMP_DIR}/${DIFF_DISK_FILE}"
echo "OK"
fi
echo -n "Setting up media folder... "
# create local media folder and symlink if not existing
if [ ! -d "${SF_MEDIA_TARGET}" ]; then
mkdir -p "${SF_MEDIA_TARGET}"
fi
if [ ! -e "${SF_MEDIA_TARGET}/${USER}" ]; then
if [ ! -h "${SF_MEDIA_TARGET}/${USER}" ]; then
ln -s "${SYSTEM_MEDIA_FOLDER}" "${SF_MEDIA_TARGET}/${USER}"
fi
fi
echo "OK"
# create network interface
echo -n "Removing network interface: "
VBoxManage hostonlyif remove vboxnet0
echo -n "Creating network interface: "
VBoxManage hostonlyif create
# >/dev/null 2>&1
# restore snapshot if needed
if [ "${SNAPSHOT_NAME}" != "" ]; then
VBoxManage snapshot "${VM_NAME}" restore "${SNAPSHOT_NAME}"
fi
if [ "${HD_AUTORESET}" == "off" ]; then
vbox_set_hd_autoreset ${HD_AUTORESET}
else
vbox_remove_media
vbox_attach_media
fi
}
###############################################################################
###############################################################################
# discard_state
###############
vm_discard_state() {
echo -n "Discard state... "
VBoxManage discardstate "${VM_NAME}"
echo "OK."
}
###############################################################################
###############################################################################
# vm_start_run
##############
vm_start_run() {
# --fullscreen?
if [[ ${FULLSCREEN} == 1 ]]; then
# VBoxManage has no option for fullscreen mode, use VBoxSDL (no menu available in fullscreen)
# VBoxSDL --startvm "${VM_NAME}" --fullscreen
# options below could be useful in setting the fullscreen resolution, when known
# --fullscreenresize --fixedmode 1152 864 32
#
# the following command can also be used to start the VM in fullscreen (GUI mode)
/usr/bin/VirtualBox --startvm "${VM_NAME}" --fullscreen
else
VBoxManage startvm "${VM_NAME}"
fi
}
###############################################################################
# print title
title
###############################################################################
# Parse arguments
#################
[[ "$#" -ge 1 ]] || usage "${ERROR}ERROR: one argument required ($# provided).${NORMAL}"
VM_ID=""
DEBUG=0
FULLSCREEN_CL=-1
FULLSCREEN=0
NO_RUN=0
NO_INIT=0
DISCARD_STATE=0
HD_AUTORESET=on
while [ "$1" != "" ]; do
PARAM=`echo $1 | awk -F= '{print $1}'`
VALUE=`echo $1 | awk -F= '{print $2}'`
case ${PARAM} in
-h | --help)
usage ""
exit 0
;;
-g | --gui)
FULLSCREEN_CL=0
shift
;;
-f | --fullscreen)
FULLSCREEN_CL=1
shift
;;
-i |--no-init)
NO_INIT=1
shift
;;
-r |--no-run)
NO_RUN=1
shift
;;
-s | --discard-state)
DISCARD_STATE=1
shift
;;
-d | --debug)
DEBUG=1
shift
;;
-a | --hd-autoreset)
HD_AUTORESET=$VALUE
shift
;;
*)
if [[ "${VM_ID}" == "" ]]; then
VM_ID=${PARAM}
shift
else
usage "${ERROR}ERROR: unknown argument ${BOLD}${PARAM}.${NORMAL}"
exit 1
fi
;;
esac
done
###############################################################################
# print debug info if needed
debug
# import VM settings by id or name
vm_settings=`get_vm_settings "${VM_ID}"`
if [ "$vm_settings" == "" ]; then
usage "${ERROR}ERROR: wrong vm_id.${NORMAL}"
fi
echo "Applying settings $vm_settings"
echo
source "$vm_settings"
# override VM fullscreen setting if set on command line
if [[ ${FULLSCREEN_CL} != -1 ]]; then
FULLSCREEN=${FULLSCREEN_CL}
fi
# check if VM exists
VBoxManage showvminfo "${VM_NAME}" &> /dev/null
[ "$?" -eq 0 ] || die "${ERROR}ERROR: VM not configured. Run ${BOLD}'vm-setup ${VM_ID}'${NORMAL}${ERROR} and try again.${NORMAL}"
# check if snapstot folder is the one defined by us
current_snapshot_folder=`VBoxManage showvminfo "${VM_NAME}" | grep -m1 "Snapshot folder" | awk '{print $3}'`
if [ "$current_snapshot_folder" != "${USER_TMP_DIR}" ]; then
# non si può cambiare al volo se ci sono degli snapshot...
#VBoxManage modifyvm "${VM_NAME}" --snapshotfolder "${USER_TMP_DIR}"
echo "Configurazione obsoleta. Per favore riesegui:"
echo "${SRC_DIR}/vm-setup ${VM_ID}"
exit 1
fi
# --no-init?
if [[ ${NO_INIT} == 0 ]]; then
vm_start_init
fi
# --discard-state?
if [[ ${DISCARD_STATE} == 1 ]]; then
vm_discard_state
fi
# --no-run?
if [[ ${NO_RUN} == 0 ]]; then
vm_start_run
fi
exit 0