#!/bin/bash #set -x # clones a vbox vm with settings # # (c) randy@circular.de, 20081001 # # 20081001, randy: inital version 0.1 # # #DEBUG="echo"; USAGE="usage: $0 "; VBOXMNG="/usr/bin/VBoxManage"; if [ -z $1 ] || [ -z $2 ]; then echo $USAGE; exit 1; fi; VM_NAME=$( $VBOXMNG list vms | grep ^Name: | head -1 | awk '{print $2}' | grep $1); if [ "$1" != "$VM_NAME" ]; then echo "ERROR: vm '$1' does not exist?"; exit 1; fi; SHOWINFO="/tmp/VBoxManage_showinfo.$$"; ${VBOXMNG} showvminfo $1 > $SHOWINFO; ${VBOXMNG} list systemproperties >> $SHOWINFO; VM_OLDUUID=$( grep "^UUID:" $SHOWINFO | awk '{ print $2 }'); DISKFILE_PM=$( grep "^Primary master:" $SHOWINFO | awk '{ print $3 }'); DISKFILE_PS=$( grep "^Primary slave:" $SHOWINFO | awk '{ print $3 }'); DISKFILE_SM=$( grep "^Secondary master:" $SHOWINFO | awk '{ print $3 }'); DISKFILE_SS=$( grep "^Secondary slave:" $SHOWINFO | awk '{ print $3 }'); VDI_FOLDER=$( grep "^Default VDI f.lder:" $SHOWINFO | awk '{ print $4 }'); VM_FOLDER=$( grep "^Default machine folder:" $SHOWINFO | awk '{ print $4 }'); echo "VDI_FOLDER: '$VDI_FOLDER'"; echo "VM_FOLDER: '$VM_FOLDER'"; if [ ! -d $VDI_FOLDER/$2 ] then mkdir -p $VDI_FOLDER/$2; if [ ! $? == 0 ] then echo "ERROR: mkdir '$VDI_FOLDER/$2' failed." exit 1; fi fi if [ "$DISKFILE_PM" ] then echo "Cloning Primary master: '$DISKFILE_PM'"; $DEBUG ${VBOXMNG} clonevdi "${DISKFILE_PM}" "${VDI_FOLDER}/${2}/${2}-0.vdi" $DEBUG ${VBOXMNG} registerimage disk "${VDI_FOLDER}/${2}/${2}-0.vdi" >> /dev/null DISKUUID_PM=$( ${VBOXMNG} showvdiinfo "${VDI_FOLDER}/${2}/${2}-0.vdi" | grep UUID: | awk '{ print $2 }'); fi if [ "$DISKFILE_PS" ] then echo "Cloning Primary slave: '$DISKFILE_PS'"; $DEBUG ${VBOXMNG} clonevdi "${DISKFILE_PS}" "${VDI_FOLDER}/${2}/${2}-1.vdi" $DEBUG ${VBOXMNG} registerimage disk "${VDI_FOLDER}/${2}/${2}-1.vdi" >> /dev/null DISKUUID_PS=$( ${VBOXMNG} showvdiinfo "${VDI_FOLDER}/${2}/${2}-1.vdi" | grep UUID: | awk '{ print $2 }'); fi if [ "$DISKFILE_SM" ] then echo "Cloning Secondary master: '$DISKFILE_SM'"; $DEBUG ${VBOXMNG} clonevdi "${DISKFILE_SM}" "${VDI_FOLDER}/${2}/${2}-2.vdi" $DEBUG ${VBOXMNG} registerimage disk "${VDI_FOLDER}/${2}/${2}-2.vdi" >> /dev/null DISKUUID_SM=$( ${VBOXMNG} showvdiinfo "${VDI_FOLDER}/${2}/${2}-2.vdi" | grep UUID: | awk '{ print $2 }'); fi if [ "$DISKFILE_SS" ] then echo "Cloning Secondary slave: '$DISKFILE_SS'"; $DEBUG ${VBOXMNG} clonevdi "${DISKFILE_SS}" "${VDI_FOLDER}/${2}/${2}-3.vdi" $DEBUG ${VBOXMNG} registerimage disk "${VDI_FOLDER}/${2}/${2}-3.vdi" >> /dev/null DISKUUID_SS=$( ${VBOXMNG} showvdiinfo "${VDI_FOLDER}/${2}/${2}-3.vdi" | grep UUID: | awk '{ print $2 }'); fi if [ ! -e ${VDI_FOLDER}/${2}/${2}.xml ] then echo "Creating VM '${2}'..."; OUTPUT=$( $DEBUG ${VBOXMNG} createvm -name "$2" ); if [ ! $? == 0 ] then echo "ERROR: ${VBOXMNG} createvm -name "$2" failed: \n'$OUTPUT'\n" exit 1; fi fi VM_NEWUUID=$( /bin/cat ${VDI_FOLDER}/${2}/${2}.xml | grep "uuid=\"{.*}\"" | sed -e "s/\(.*\) uuid=\"{\(.*\)}\" \(.*\)/\2/" ); /bin/mv ${VDI_FOLDER}/${2}/${2}.xml ${VDI_FOLDER}/${2}/${2}.xml.orig; /bin/cp ${VDI_FOLDER}/${1}/${1}.xml ${VDI_FOLDER}/${2}/${2}.xml.source; DATE_XML=$( date +%FT%R:%SZ ); SED_1_OLD=""; SED_4_OLD=""; SED_1_NEW=""; SED_4_NEW=""; /bin/cat ${VDI_FOLDER}/${2}/${2}.xml.source | \ sed -e "s/${SED_1_OLD}/${SED_1_NEW}/" \ -e "s/${SED_2_OLD}/${SED_2_NEW}/" \ -e "s/${SED_3_OLD}/${SED_3_NEW}/" \ -e "s/${SED_4_OLD}/${SED_4_NEW}/" > /${VDI_FOLDER}/${2}/${2}.xml OUTPUT=$( ${VBOXMNG} registervm ${VDI_FOLDER}/${2}/${2}.xml ); if [ ! $? == 0 ] then echo -en "ERROR: ${VBOXMNG} registervm '$2' failed: \n'$OUTPUT'\n" exit 1; fi ${VBOXMNG} modifyvm ${2} -macaddress1 auto >>/dev/null; ${VBOXMNG} modifyvm ${2} -macaddress2 auto >>/dev/null; ${VBOXMNG} modifyvm ${2} -macaddress3 auto >>/dev/null; ${VBOXMNG} modifyvm ${2} -macaddress4 auto >>/dev/null; if [ ! -z $DISKUUID_PM ] then echo "Adding hda '${VDI_FOLDER}/${2}/${2}-0.vdi' ('$DISKUUID_PM')"; OUTPUT=$( ${VBOXMNG} modifyvm ${2} -hda $DISKUUID_PM ); if [ ! $? == 0 ] then echo -en "ERROR: ${VBOXMNG} modifyvm ${2} failed: \n'$OUTPUT'\n" exit 1; fi fi; if [ ! -z $DISKUUID_PS ] then echo "Adding hdb '${VDI_FOLDER}/${2}/${2}-1.vdi' ('$DISKUUID_PS')"; OUTPUT=$( ${VBOXMNG} modifyvm ${2} -hdb $DISKUUID_PS ); if [ ! $? == 0 ] then echo -en "ERROR: ${VBOXMNG} modifyvm ${2} failed: \n'$OUTPUT'\n" exit 1; fi fi; if [ ! -z $DISKUUID_SM ] then echo "Adding hdc '${VDI_FOLDER}/${2}/${2}-2.vdi' ('$DISKUUID_SM')"; OUTPUT=$( ${VBOXMNG} modifyvm ${2} -hdc $DISKUUID_SM ); if [ ! $? == 0 ] then echo -en "ERROR: ${VBOXMNG} modifyvm ${2} failed: \n'$OUTPUT'\n" exit 1; fi fi; if [ ! -z $DISKUUID_SS ] then echo "Adding hdd '${VDI_FOLDER}/${2}/${2}-3.vdi' ('$DISKUUID_SS')"; OUTPUT=$( ${VBOXMNG} modifyvm ${2} -hdd $DISKUUID_SS ); if [ ! $? == 0 ] then echo -en "ERROR: ${VBOXMNG} modifyvm ${2} failed: \n'$OUTPUT'\n" exit 1; fi fi; rm $SHOWINFO; exit