summaryrefslogblamecommitdiffstats
path: root/os-plugins/plugins/virtualbox/files/run-virt.include
blob: e3650ebdc0a29be1820a9aa5e2a692114fd42346 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12



                                                                               







                                                                         

                                                                               
                                                                             























                                                                                


                                                                     
                                       
                                                             


                                                              
                                   
                                                 


                            

                                                                  
    
                                                                          
        






























                                                                                
 








                                                                
 
                                                                             

                                                             




                                       
             
    





























                                                                                

  





                                        

  




                                                   
                     





                                                    
 
              
                      
 
                         
                                                              
                                                                  




                                                           

                                                    









                                                          




                                                                      














                                                              

                                             


                                   
                                   
                                                  

                                                                                
                                                       

                                                                                


                                                                                
 


                                                          
 

                                 
                                      


                                                                     
                                                  

  












                                                                       
  
 

                                                                       
 
                                                                                
                                   
                                                                                
 


















                                                                                 
 


                                                                           
 



                                                                                 
 


                                           
# run-virt.include
# -----------------------------------------------------------------------------
# Copyright (c) 2009..2010 - RZ Uni Freiburg
# Copyright (c) 2009..2010 - OpenSLX GmbH
#
# This program/file is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
# -----------------------------------------------------------------------------
# run-virt.include
#    - Include script for running the VirtualBox on an OpenSLX client via the
#      run-virt.sh or run-vmgrid.sh
################################################################################

################################################################################
### Include general configuration
################################################################################
if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then
  . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf
else 
  writelog "Problems reading config file of ${self} plugin"
  exit 1
fi

################################################################################
### Declaration of default variables
################################################################################

PLUGINCONFVIRTUALBOX="${PLUGINCONFROOT}/${self}"
# create TMPDIR for all users
mkdir -m 1777 /tmp/${self} 2>/dev/null
# dir for configs
confdir="/tmp/${self}/${USER}/${VM_ID}"
# use alternate configuration directory instead of $HOME/.VirtualBox
export VBOX_USER_HOME=${confdir}
# define dirs and files which can be removed after exit, be carefull!
RMDIRS="${snapshotdir} ${confdir} /tmp/.vbox-${USER}-ipc" 2>/dev/null
rm -rf ${RMDIRS} 2>/dev/null
machfolder="${VBOX_USER_HOME}/Machines"
# use vm_shortname for VM name since vm_name can be very long
machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml"
diskfolder="${VBOX_USER_HOME}/HardDisks"
snapshotdir=${machfolder}/${vm_shortname}/Snapshots
diskfile="${diskfolder}/${imgname}"
mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null
ln -sf ${vmpath} ${diskfile}

# check the file type
if echo ${imgname} | grep -iE "vdi|vmdk|vhd" >/dev/null 2>&1; then
  imgtype=$(echo ${imgname##*.} | tr [a-z] [A-Z])
else
  writelog "${imgname} is not a valid image type (vdi|vmdk|vhd), exiting!"
  exit 1
fi

# TODO: maybe rewrite, to reduce checks, merge it with network option,
# so we can have a "compatibility to vmware config" section
case "${vmostype}" in
  winxp*)
    vmostype="WindowsXP"
  ;;
  winvista*)
    vmostype="WindowsVista"
  ;;
  Windows7*)
    vmostype="Windows7"
  ;;
  linux*)
    vmostype="Linux26"
  ;;
esac

writelog "Directories:"
writelog "\tConfig dir:\t\t$confdir"
writelog "\tMachines dir:\t\t$machfolder"
writelog "\tMachine config:\t\t$machconfig"
writelog "\tHardDisks dir:\t\t$diskfolder"

################################################################################
### Hardware checks
################################################################################

# remove ':' from MAC addr for vbox
macaddr=$(echo ${macaddr} | sed 's/://g')

# machine UUID, MAC addr part of it
machineuuid="00000000-0000-0000-0000-${macaddr}"
# cosmetical, since UUID in lower case
machineuuid=$(echo ${machineuuid} | tr [A-Z] [a-z])
# get UUID of VBox image
diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} | grep UUID | \
  awk '{print $2}')
# snapshot UUID is static
snapshotuuid="88bc8b6d-f248-468a-95fe-318084904f8b"

# TODO: MEM muss noch angepasst werden. Maschine crasht wenn nehr als 50% MEM
# memory part equal to vmware plugin
# percentage of memory to use for virtualbox in standard case
if [ -n "${forcemem}" ]; then
  mem="${forcemem}"
else
  permem=30
  if [ "${totalmem}" -ge "1600" ]; then
    permem=40
  fi
  # check if /tmp is on harddisk
  if grep -qe "/dev/.* /tmp " /proc/mounts ; then
    permem=60
    id44="1"
    # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
    # (40% vmware | 40% confdir(vmem...) | 20% host
    # VMplayer 2+ issue
    # TODO: makes this sense for vbox?
    #if [ "${totalmem}" -ge "2500" ]; then
      #permem=40
      #rmdir ${snapshotdir}
      #snapshotdirold=${snapshotdir}
      #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
      #mkdir -p ${snapshotdir}
      #ln -sf ${snapshotdir} ${snapshotdirold}
    #fi
  fi
  mem=$(expr ${totalmem} / 100 \* ${permem})
  if [ "${id44}" = "1" ]; then
    memhost=$(expr ${totalmem} - ${mem})
  else
    memhost=$(expr ${totalmem} - ${mem} - ${mem})
  fi
  #permem=40
  #mem=$(expr ${totalmem} * ${permem})
  if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then
    writelog "Memory out of range: ${mem} MB (guest) / ${memhost} MB (host)!"
    writelog "Min. 256 MB for host and guest!"
    exit 1
  fi
fi

# translate network cards
if [ "${network_card}" = "e1000" ]; then
  vb_network_card="82540EM"
else
  network_card="pcnet"
  vb_network_card="Am79C973"
fi

# translate network kinds (nat, bridged, host-only)
case "${network_kind}" in
  bridged)
    network_kind='BridgedInterface name="br0"'
  ;;
  hostonly|host-only)
    network_kind='HostOnlyInterface name="vboxnet0"'
  ;;
  *)
    network_kind="NAT"
  ;;
esac

# external GUI
vrdpport="590${VM_ID}"

# TODO: nur bei vmchooser
# TODO: most of the following does not make much sense yet ...
# virtual fd/cd/dvd and drive devices, floppy b: for configuration
# if $floppy_0 from run-virt.include set then fdtest="TRUE"
fdtest=
fdtest=${floppy_0:+"TRUE"}
# if $fdtest not set floppy0="FALSE", else "TRUE"
floppy0=${fdtest:-"FALSE"}
floppy1="TRUE"
floppy1name="/var/lib/virt/vmchooser/loopimg/fd.img"
# if $cdrom_0 from run-virt.include set then cdtest="TRUE"
cdtest=
cdtest=${cdrom_0:+"TRUE"}
# if $cdtest not set cdrom0="FALSE", else "TRUE"
cdrom0=${cdtest:-"FALSE"}
# if $cdrom_1 from run-virt.include set then cdtest="TRUE"
cdtest=
cdtest=${cdrom_1:+"TRUE"}
# if $cdtest not set cdrom1="FALSE", else "TRUE"
cdrom1=${cdtest:-"FALSE"}
# ide is expected default, test for the virtual disk image type should
# be done while creating the runscripts ...
ide="TRUE"
hddrv="ide"

writelog "\tSnapshots dir:\t\t$snapshotdir"
writelog "Diskimage:"
writelog "\tDisk type:\t\t$imgtype"
writelog "\tDisk file:\t\t$diskfile"
writelog "\tVMostype:\t\t$vmostype"
writelog "\tMachine UUID:\t\t$machineuuid"
writelog "\tDisk UUID:\t\t$diskuuid"
writelog "\tSnapshot UUID:\t\t$snapshotuuid"
writelog "Virtual Hardware:"
writelog "\tGuest RAM:\t\t${mem} MB"
# echo nur wenn memhost gesetzt
[ -n "${memhost}" ] && writelog "\tHost RAM:\t\t${memhost} MB"
writelog "\tMAC address:\t\t$macaddr"
writelog "\tNetwork card:\t\t${vb_network_card}"
writelog "\tNetwork kind:\t\t${network_kind}"
# TODO: server start activate via xml, etc...
#writelog "\tGuest VRDP port:\t${vrdpport}"
#writelog "\tCD-ROM1:\t${cdrom0}"
#writelog "\tCD-ROM2:\t${cdrom1}"
#writelog "\tFloppy_A:\t${floppy0}"
#writelog "\tFloppy_B:\t${floppy1}"
writelog "\tShared Folders 'home':\t/home/${USER}"

################################################################################
### Pepare and configure virtual machine and disk image
################################################################################

# TODO: date wichtig?
#date="$(date +%Y-%m-%dT%H:%M:%SZ)"
. ${PLUGINCONFVIRTUALBOX}/virtualbox.include >"${VBOX_USER_HOME}/VirtualBox.xml"

# shortened date YYYY-MM-DD
#date=${date%T*}
. ${PLUGINCONFVIRTUALBOX}/machine.include >"${machconfig}"

# add rw share to vm, if existing
if [ -n "${rwshare}" ]; then
  sharedf='<SharedFolder name="share"'
  sharedf="${sharedf} hostPath=\"${rwshare}\" writable=\"true\"/>"
  sed -i "s,</SharedFolders>,  ${sharedf}\n      </SharedFolders>," \
    "${machconfig}"
  writelog "\tShared Folders 'share':\t${rwshare}"
fi

# add ssh port if linux and NAT
if [ "${vmostype}" = "Linux26" ] && [ "${network_kind}" = "NAT" ]; then
  vmsshport="220${VM_ID}"
  extradataitem='<ExtraDataItem name="VBoxInternal/Devices' \
  extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config/ssh/"
  extradataguestport='GuestPort" value="22"/>'
  extradatahostport="HostPort\" value=\"${vmsshport}\"/>"
  extradataprotocol='Protocol" value="TCP"/>'
  sed -i "s,</ExtraData>,  ${extradataitem}${extradataguestport}\n\
      ${extradataitem}${extradatahostport}\n\
      ${extradataitem}${extradataprotocol}\n\
    </ExtraData>," "${machconfig}"
  writelog "\tGuest SSH port:\t\t${vmsshport}"
fi

cat ${OPENSLX_DEFAULT_DIR}/plugin-repo/virtualbox/empty-diff.vdi.gz | \
  gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi"

################################################################################
### finally set env for run-virt.sh
################################################################################

# wait for a certain command to settle
# get the PID of the right process
# TODO: not very good! But seems to work
# TODO: not needed? KILL!!!
VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\
  | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/")
for i in $(echo ${VBMANPID}); do
  kill -9 ${VBMANPID} >/dev/null 2>&1
done
# TODO: OLD Version, NOW: KILL process
#VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\
#  | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/" | tail -n 1)
#for i in {0..999}; do
#  ps aux | grep -v grep | grep VBoxXPCOMIPCD | grep -q " ${VBMANPID} " || break
#  if [ $i -eq 999 ]; then
#    kill -9 ${VBMANPID} >/dev/null 2>&1
#    writelog "Process ID ${VBMANPID} did not finish, killing!"
#  fi
#done

# set the variables appropriately (several interfaces with different names)
VIRTCMD=$(which VirtualBox 2>/dev/null)
VIRTCMDOPTS="--startvm ${machineuuid} --start-running"

# SDL tests
#VIRTCMDSDL=$(which VBoxSDL 2>/dev/null)
#VIRTCMDOPTSSDL="--startvm ${machineuuid} --fullscreen --hwvirtex --memory 1024 \
#  --fixedmode 1680 1050 24 --hostkey 302 0"

# set headless mode
VIRTCMDHL=$(which VBoxHeadless 2>/dev/null)
VIRTCMDOPTSHL="-s ${machineuuid}"