Skip to content
Snippets Groups Projects
vm-start 12.42 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.5.8"
AUTHOR="DiSIT"

# source folder
SRC_DIR="$(dirname $(readlink -f $0))"

#include common code
. "${SRC_DIR}/settings/common"


###############################################################################
# Title
##############
title () {
    echo -e "$APP_NAME by $AUTHOR"
    echo "v.$VERSION"
    echo
}
###############################################################################



###############################################################################
# Debug info
##################
debug() {
    if [[ ${DEBUG} == 1 ]]; then
        echo "Debug info:"
        echo -e "\tvm_id = $VM_ID"
        echo -e "\tfullscreen = $FULLSCREEN"
        echo -e "\tno-init = $NO_INIT"
        echo -e "\tno-run = $NO_RUN"
        echo -e "\tdiscard-state = $DISCARD_STATE"
	echo -e "\thd-autoreset = $HD_AUTORESET"
        echo
    fi
}
###############################################################################



###############################################################################
# Usage
#######
usage () {
    if [[ "$@" != "" ]]; then
        echo >&2 "$@"
        echo
    fi
    echo "Usage: $0 <vm_id | vm_name> [--gui | --fullscreen] [--no-init] [--no-run] [--discard-state] [--debug] [--hd-autoreset=on|off]"
    echo
    print_vm_list
    echo
    exit 1
}
###############################################################################



###############################################################################
# vbox_remove_media
###################
vbox_remove_media () {
    if [[ "${DISK_IMAGE_1}" != "" ]]; then
        echo "Removing disk 1..."
        vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 1 --device 0 --medium none
        sleep 1
        TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
        if [ "${TMP_DIFF}" != "" ]; then
            vboxmanage closemedium disk "${TMP_DIFF}" --delete
        fi
        vboxmanage closemedium disk "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}"
    fi
    if [[ "${DISK_IMAGE_2}" != "" ]]; then
        echo "Removing disk 2..."
        vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 2 --device 0 --medium none
        vboxmanage closemedium disk "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_2}"
    fi
    if [[ "${DISK_IMAGE_3}" != "" ]]; then
        echo "Removing disk 3..."
        vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 3 --device 0 --medium none
        vboxmanage closemedium disk "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_3}"
    fi
    if [[ "${DISK_IMAGE_4}" != "" ]]; then
        echo "Removing disk 4..."
        vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 4 --device 0 --medium none
        vboxmanage closemedium disk "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}"
    fi
}
###############################################################################



###############################################################################
# vbox_attach_media
###################
vbox_attach_media () {
    if [[ "${DISK_IMAGE_1}" != "" ]]; then
        echo "Attaching disk 1..."
        VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}" --type immutable
        vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 1 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}"
    fi
    if [[ "${DISK_IMAGE_2}" != "" ]]; then
        echo "Attaching disk 2..."
        vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 2 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_2}"
    fi
    if [[ "${DISK_IMAGE_3}" != "" ]]; then
        echo "Attaching disk 3..."
        vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 3 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_3}"
    fi
    if [[ "${DISK_IMAGE_4}" != "" ]]; then
        echo "Attaching disk 4..."
        vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 4 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}"
    fi
}
###############################################################################



###############################################################################
# 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
        if [ "${DISK_IMAGE_1}" != "" ]; then
            TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
	    if [ "${TMP_DIFF}" != "" ]; then
                echo "Setting differential disk ${TMP_DIFF}: autoreset=${HD_AUTORESET}"
                VBoxManage modifyhd ${TMP_DIFF} --autoreset ${HD_AUTORESET}
	    fi
        fi
        if [ "${DISK_IMAGE_2}" != "" ]; then
            TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_2}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
            if [ "${TMP_DIFF}" != "" ]; then
                echo "Setting differential disk ${TMP_DIFF}: autoreset=${HD_AUTORESET}"
                VBoxManage modifyhd ${TMP_DIFF} --autoreset ${HD_AUTORESET}
            fi
        fi
        if [ "${DISK_IMAGE_3}" != "" ]; then
            TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_3}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
            if [ "${TMP_DIFF}" != "" ]; then
                echo "Setting differential disk ${TMP_DIFF}: autoreset=${HD_AUTORESET}"
                VBoxManage modifyhd ${TMP_DIFF} --autoreset ${HD_AUTORESET}
            fi
        fi
        if [ "${DISK_IMAGE_4}" != "" ]; then
            TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
            if [ "${TMP_DIFF}" != "" ]; then
                echo "Setting differential disk ${TMP_DIFF}: autoreset=${HD_AUTORESET}"
                VBoxManage modifyhd ${TMP_DIFF} --autoreset ${HD_AUTORESET}
            fi
        fi
    else
        #if [ "${HD_AUTORESET}" == "on" ]; then
            vbox_remove_media
            vbox_attach_media
        #fi
    fi

    if [ "${LAST_HD_UUID}" != "" ]; then
        TMP_DIFF=`vboxmanage showhdinfo "${LAST_HD_UUID}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
        if [ "${TMP_DIFF}" != "" ]; then
            if [ "${AUTORESET}" -eq 0 ]; then
                echo "Differential disk ${TMP_DIFF}: autoreset=off"
                VBoxManage modifyhd ${TMP_DIFF} --autoreset off
            else
                echo "Differential disk ${TMP_DIFF}: autoreset=on"
            fi
        fi
    fi

    if [ "${LAST_HD2_UUID}" != "" ]; then
        TMP_DIFF=`vboxmanage showhdinfo "${LAST_HD2_UUID}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
        if [ "${TMP_DIFF}" != "" ]; then
            if [ "${AUTORESET}" -eq 0 ]; then
                echo "Differential disk ${TMP_DIFF}: autoreset=off"
                VBoxManage modifyhd ${TMP_DIFF} --autoreset off
            else
                echo "Differential disk ${TMP_DIFF}: autoreset=on"
            fi
        fi
    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: one argument required ($# provided)."

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
	    shift
	    ;;
        *)
            if [[ "${VM_ID}" == "" ]]; then
                VM_ID=${PARAM}
                shift
            else
                usage "ERROR: unknown argument \"${PARAM}\"."
                exit 1
            fi
            ;;
    esac
done
###############################################################################


# include global settings
. "${SRC_DIR}/settings/settings"

# VM_ID lookup in settings files by ID or NAME
if [ ! -f "$SRC_DIR/settings/${VM_ID}.settings" ]; then
    result=`get_vm_id_by_name "${VM_ID}"`
    VM_ID=$result
    if [ ! -f "$SRC_DIR/settings/${VM_ID}.settings" ]; then
        usage "ERROR: wrong vm_id or name."
    fi
fi

# include VM settings
. "${SRC_DIR}/settings/${VM_ID}.settings"


# override VM fullscreen setting if set on command line
if [[ ${FULLSCREEN_CL} != -1 ]]; then
    FULLSCREEN=${FULLSCREEN_CL}
fi

# print debug info if needed
debug


# check if VM exists
VBoxManage showvminfo "${VM_NAME}" &> /dev/null
[ "$?" -eq 0 ] || die "ERROR: VM not configured. Run 'vm-setup ${VM_ID}' and try again."

# 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