#!/bin/sh # # Description: Script for preparing VMware environment Diskless # X Stations and interactive session chooser (v4) # # Author(s): Dirk von Suchodoletz , 18-03-2006 # Michael Janczyk , 27-03-2007 # Copyright: (c) 2003, 2006 - RZ Universitaet Freiburg # # Version: 0.17.831 # ################################################################################ ### VERBOSE?/PATH ############################################################## # set verbose mode (set -x(v)) #set -xv export PATH="${PATH}:/var/X11R6/bin:/usr/X11R6/bin" ### HEADER SECTION ############################################################# # write runvmware.conf runvmwareconfheader () { echo " ############################################################################## ###### This configuration file was generated by 'runvmware', ###### ###### dont use it for your own configurations - it will be overwritten ###### ###### ###### ###### identity ############################################################## displayName = \"${displayname}\" guestOS = \"${vmostype}\" config.version = \"${confver}\" virtualHW.version = \"${hver}\" memsize = \"${mem}\" numvcpus = \"1\" ###### ide-disks ############################################################# ide0:0.mode = \"${np}\" ide0:0.present = \"${ide}\" ide0:0.fileName = \"${diskfile}\" ide1:0.present = \"${cdr_1}\" ide1:0.autodetect = \"TRUE\" ide1:0.fileName = \"auto detect\" ide1:0.deviceType = \"cdrom-raw\" ide1:1.present = \"${cdr_2}\" ide1:1.autodetect = \"TRUE\" ide1:1.fileName = \"auto detect\" ide1:1.deviceType = \"cdrom-raw\" ###### scsi-disks ############################################################ scsi0.present = \"${scsi}\" scsi0.virtualDev = \"${hddrv}\" scsi0:0.mode = \"${np}\" scsi0:0.present = \"${scsi}\" scsi0:0.fileName = \"${diskfile}\" ###### nics ################################################################## ethernet0.present = \"TRUE\" ethernet0.addressType = \"static\" ethernet0.connectionType = \"bridged\" ethernet0.address = \"00:50:56:0D:${mac}\" ###### sound ################################################################# sound.present = \"TRUE\" sound.virtualDev = \"es1371\" ###### usb ################################################################### usb.present = \"TRUE\" usb.generic.autoconnect = \"TRUE\" ###### floppies ############################################################## floppy0.present = \"${floppya}\" floppy0.fileName = \"auto detect\" floppy1.present = \"${floppyb}\" floppy1.fileType = \"file\" floppy1.fileName = \"${floppybname}\" floppy1.startConnected = \"TRUE\" ###### ports ################################################################# parallel0.present = \"FALSE\" serial0.present = \"FALSE\" ###### shared folders ######################################################## sharedFolder0.present = \"TRUE\" sharedFolder0.enabled = \"TRUE\" sharedFolder0.expiration = \"never\" sharedFolder0.guestName = \"Home\" sharedFolder0.hostPath = \"${HOME}\" sharedFolder0.readAccess = \"TRUE\" sharedFolder0.writeAccess = \"TRUE\" sharedFolder.maxNum = \"1\" ###### misc ################################################################## tmpDirectory = \"${tmpdir}\" mainMem.useNamedFile = \"FALSE\" snapshot.disabled = \"TRUE\" tools.syncTime = \"TRUE\" redoLogDir = \"${tmpdir}\" hints.hideAll = \"TRUE\" logging = \"FALSE\" isolation.tools.hgfs.disable = \"FALSE\" isolation.tools.dnd.disable = \"TRUE\" isolation.tools.copy.enable = \"TRUE\" isolation.tools.paste.enabled = \"TRUE\" gui.restricted = \"TRUE\" pref.hotkey.shift = \"TRUE\" pref.hotkey.control = \"TRUE\" pref.hotkey.alt = \"TRUE\" svga.maxWidth = \"${xres}\" svga.maxHeight = \"${yres}\" " \ >${confile} # set the appropriate permissions for the vmware config file chmod u+rwx ${confile} >/dev/null 2>&1 } preferencesheader () { echo " ############################################################################## ###### This configuration file was generated by 'runvmware', ###### ###### dont use it for your own configurations - it will be overwritten ###### ###### ###### ################################## Wichtig! ################################## ###### *.vmem wird immer angelegt und frisst soviel Speicher, wie fuer ###### ###### den Gast vorgesehen. Sollte nicht im tempfs liegen. NFS OK, da ###### ###### IO nur einmal beim Start erheblich. Wird gesteuert ueber ###### ###### tmpDirectory = /nfs-viel-platz und darin wird dann vmware-\$user ###### ###### angelegt. ###### hints.hideAll = \"TRUE\" pref.exchangeSelections = \"TRUE\" pref.hotkey.shift = \"TRUE\" pref.tip.startup = \"FALSE\" pref.vmplayer.exit.vmAction = \"poweroff\" pref.vmplayer.fullscreen.autohide = \"TRUE\" pref.vmplayer.webUpdateOnStartup = \"FALSE\" prefvmx.defaultVMPath = \"${vmhome}\" prefvmx.mru.config = \"${confile}:\" tmpDirectory = \"${tmpdir}\" webUpdate.checkPeriod = \"manual\" pref.eula.size = \"2\" pref.eula.0.appName = \"VMware Player\" pref.eula.0.buildNumber = \"${vmbuild}\" pref.eula.1.appName = \"VMware Workstation\" pref.eula.1.buildNumber = \"${vmbuild}\" " \ >${vmhome}/preferences } ### VARIABLES SECTION ########################################################## # declaration of default variables # script variables last_changes=$(head -n 15 $0 | grep "@" | awk -F ", " '{print $2}' \ | awk -F "-" '{print $3" "$2" "$1}' | sort -bfnr \ | awk '{print $3"-"$2"-"$1}' | grep -m 1 [0-9]) version=$(head -n 15 $0 | grep "# Version: " | awk '{print $3}') # hardware variables # temporary disk space for logs, etc... preftmpdir=/tmp/${USER} # there are two different kinds of tmp needed: # user config -> preferences for all *.vmx (especially that hidden ram image) # and per vmx config (written to runvmware.conf) if cat /proc/mounts|grep -e " /tmp" 2>/dev/null| grep -e "nfs" &>/dev/null then export tmpdir=/dev/shm/vmware else export tmpdir=$preftmpdir fi mac= declare -i mem=0 declare -i memtest=0 memopt= memhost= memmeg= memgig= permem=66 # virtual devices ide="TRUE" scsi="FALSE" hddrv="lsilogic" cdr_1="FALSE" cdr_2="FALSE" floppya="FALSE" floppyb="FALSE" # place for the virtual floppy "B:" floppybname="/etc/vmware/loopimg/fd.img" # resolution hostres=$(xvidtune -show 2>/dev/null| grep -ve "^$") xres=$(echo "${hostres}" | awk '{print $3}') yres=$(echo "${hostres}" | awk '{print $7}') guestres= g_xres= g_yres= # VMware variables # VMware start options vmopt="-X -q" # configfile confile="${tmpdir}/runvmware.conf" vmhome="${HOME}/.vmware" vmdir="/var/lib/vmware" # templates dir vmtempl="${vmdir}/templ" # .desktop files directory xsessions="/usr/share/xsessions" vmsessions="/etc/X11/sessions/runvmware" themesdir="/var/lib/openslx/themes" desktops=( `ls ${vmsessions}/*.desktop 2>/dev/null` ) desktopsnr=$(echo "${#desktops[*]}") dialogtitle='--title "VMware Image Menu"' execute=() menu= # special Variables confver=8 hver=4 np="independent-nonpersistent" # set hostname: using original hostname and adding string "-vm" hostname="VM-${HOST}" # set samba workgroup workgroup="VMware-Workgroup" comment="Diskless X Station VMware Image" # image variables alias= diskfile= rightsfile= noimage=0 ostype= vmostype= displayname="Diskless X Station VMware Image" # image checking variable filecheck= # command line variables # start with this this default commmand line options + extra defaults=$(grep -v "#.*" ${vmtempl}/defaults) # add command line opts to defaults # defaults will be overwritten by command line options lineopts=( `echo ${defaults} $@` ) nofclopt=$(expr $# + $(echo ${defaults} | wc -w)) silent= include= debug=0 istart= xdm= comdef= ### FUNCTIONS SECTION ########################################################## # function to write to stdout/logfile # logs labeled with $2=0 write to stdout, if debug set, write to logfile writelog () { # write to stdout [ -z ${silent} ] && [ "$2" = "0" ] && echo -e "$1" # check if range given e.g. 0 0 if [ -z "$2" ] || [ -z "$3" ];then echo -e "\n\nNO RANGE IN WRITELOG STATEMENT:\n$1\n\tPlease correct!\n" exit 1 fi # log if level greater than 1 and log only from level $2 to level $3 [ "${debug}" -ge "1" ] && [ "${debug}" -ge "$2" ] && [ "${debug}" -le "$3" ] \ && echo -e "$1" >>${tmpdir}/runvmware.${debug}.log } help () { cat < all lists xdm sessions and VMware images, vm lists only VMware images, use only w/ xdm -s|--start start image /\${vmdir}/.vmdk -a|--alias use aliases --silent no stdout from runvmware --mem override autoallocation of memory, in percent m,M megabyte, g,G gigabyte, h,H reserve f. host --res Maximum resolution of the guest os, e.g. 800x600 --delay delay the start of the script n seconds --image specify image directory --persistent use persistent mode --vmostype define VMware ostype --include include code right before program start --displayaliases aliases you can use with option -a --floppya enable floppy disk --floppyb use /etc/vmware/fd-loop as floppy B, needed for exchanging files w/ VMware VMware options: --run specify programm, e.g. vmware, vmplayer, ... --windowed start in windowed mode --edit only open config file in vmware (only VMware) --donotquit do not quit after image stopped (only VMware) runvmware options: -h|--help this help --version --debug level 1 -> print stdout to file Dirk von Suchodoletz, Michael Janczyk , EOH # print version , remove path echo -e "$0: LAST CHANGES $last_changes | VERSION $version\n" \ | awk -F "/" '{print "\t\t"$NF}' exit 0 } checkalias () { if [ -r "${vmtempl}/alias" ]; then writelog "Checking alias for ${startvm}...\c" 0 1 vmalias=$(grep -v "#.*" ${vmtempl}/alias | grep -w "${startvm}" \ | awk '{print $1}') [ -n "${vmalias}" ] && startvm=${vmalias} writelog "finished\nResult:\n\tVMimage name:\t${startvm}\n" 0 1 else writelog "NO alias file found: ${vmtempl}/alias" 0 1 writelog "Try without option \"-a\"" 0 1 exit 1 fi } xdm_mode () { # Xdailog test xdialog=$(which Xdialog) [ -z "${xdialog}" ] && \ xterm -e 'echo -e "\n\n\n\n\n\n\t\t\tNo Xdialog installed!!!\ \n\n\t\t\tClosing in 3 seconds."; sleep 3' && exit 1 # set X background res=$(xvidtune -show | grep -wo "\".*\"" | sed "s/\"//g") if ! [ -f ${themesdir}/bootsplash/images/silent-${res}.jpg ]; then img=$(ls ${themesdir}/bootsplash/images/ | grep -m 1 "silent") display -window root ${themesdir}/bootsplash/images/${img} else display -window root ${themesdir}/bootsplash/images/silent-${res}.jpg fi dialogtitle='--rc-file ${themesdir}/Xdialog/gtkrc \ --title "VMware Image Menu"' if [ "${xdm}" = "all" ]; then desktops=( `ls ${xsessions}/*.desktop 2>/dev/null \ | grep -v "default.*" | sort -bf; \ ls ${vmsessions}/*.desktop 2>/dev/null | sort -bf` ) desktopsnr=$(echo "${#desktops[*]}") dialogtitle='--rc-file ${themesdir}/Xdialog/gtkrc \ --title "Desktop / VMware-Image Menu"' fi } x_dialog () { (( args=0 )) declare -i i=0 while [ "${desktopsnr}" -gt "${args}" ]; do # exec in .desktop execute[${i}]=$(grep -m 1 -i "exec" ${desktops[${args}]} \ | awk -F "=" '{print $2}') menu="$menu \"\${execute[${i}]}\"" i=${i}+1 # name in .desktop execute[${i}]=$(grep -m 1 -i "name" ${desktops[${args}]} \ | awk -F "=" '{print $2}') execute[${i}]=${execute[${i}]:-`echo ${execute[${i}-1]} | sed -e "s,-, ,g"`} menu="$menu \"\${execute[${i}]}\"" i=${i}+1 # comment in .desktop execute[${i}]=$(grep -m 1 -i "comment" ${desktops[${args}]} \ | awk -F "=" '{print $2}') execute[${i}]=${execute[${i}]:-"No comment"} menu="$menu \"\${execute[${i}]}\"" i=${i}+1 (( args=${args}+1 )) done # test if menu not empty? if [ -z "${menu}" ]; then Xdialog --infobox "No items found to display!!! For Vmware images add .desktop files to ${vmsessions}" 10 50 6000 exit 1 fi # echoing to file because Xdialog sux when used w/ quotes echo -e "Xdialog ${dialogtitle} \ --screen-center \ --fill \ --no-wrap \ --stdout \ --no-tags \ --ok-label \"START\" \ --item-help \ --menubox \"Please choose the image you would like to run:\" 35 80 0 \ $menu 2>/dev/null" \ > ${tmpdir}/Xdialog . ${tmpdir}/Xdialog rm -f ${tmpdir}/Xdialog } x_dialog_check () { if ! [ `which Xdialog 2>/dev/null` ]; then writelog "\rXdialog not found! " 0 99 writelog "Please install Xdialog for interactive mode, \c" 0 0 writelog "or use option -s.\n" 0 0 # for non-console starts xterm -e 'echo -e "\n\n\n\n\n\n\t\t\tNo Xdialog installed!!!\ \n\n\t\t\tClosing in 3 seconds."; sleep 3' exit 1 fi } filecheck () { filecheck=$(LANG=us ls -lh ${diskfile} 2>&1) writelog "Filecheck:\n${filecheck}\n" 0 1 noimage=$(echo ${filecheck} | grep -i "no such file or directory" | wc -l) rightsfile=${diskfile} # check if link if [ -L "${diskfile}" ]; then # take link target rightsfile=$(ls -lh ${diskfile} 2>&1 | awk -F "-> *" '{print $2}') rightsfile=${vmdir}/${rightsfile} filecheck=$(LANG=us ls -lh ${rightsfile} 2>&1) fi # does file exist if [ "${noimage}" -ge "1" ]; then writelog "Vmware Image Problem:\c" 0 0 writelog "\tThe image you've specified doesn't exist." 0 0 writelog "Filecheck says:\c" 0 1 writelog "\t\t${diskfile}:\n\t\t\tNo such file or directory" 0 1 writelog "Hint:\c" 0 0 writelog "\t\t\tCompare spelling of the image with your options.\n" 0 0 exit 1 fi # readable? if ! [ -r "${diskfile}" >/dev/null 2>&1 \ -o -r "${diskfile}" >/dev/null 2>&1 ]; then writelog "Vmware Image Problem:\c" 0 1 writelog "\tThe image you've specified has wrong rights." 0 1 writelog "Filecheck says:\t\t`echo ${filecheck} \ | awk '{print $1" "$3" "$4}'` ${rightsfile}" 0 1 writelog "Hint:\t\t\tChange rights with: chmod a+r ${rightsfile}\n" 0 0 exit 1 fi # writable (for persistent-mode)? if ! [ -w "${diskfile}" >/dev/null 2>&1 \ -o -w "${diskfile}" >/dev/null 2>&1 ] \ && [ "${np}" = "independent-persistent" ]; then writelog "Vmware Image Problem:\c" 0 1 writelog "\tThe image you've specified has wrong rights." 0 1 writelog "Filecheck says:\t\t`echo ${filecheck} \ | awk '{print $1" "$3" "$4}'` ${rightsfile}" 0 1 writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n" 0 0 exit 1 fi } #### INTERPRET COMMAND LINE OPTIONS ############################################ # print help if no clo if [ ${nofclopt} = "0" ]; then help exit 0 fi # interpretation of command line arguments (( args=0 )) while [ ${nofclopt} -gt "${args}" ]; do case "${lineopts[${args}]}" in -h|--help) help ;; --version) echo -e "\n$0: LAST CHANGES ${last_changes} | VERSION ${version}\n" \ | awk -F "/" '{print "\t"$NF}' exit 0 ;; -i|--interactive) istart="TRUE" ;; --xdm) (( args=${args}+1 )) xdm=${lineopts[${args}]} xdmstart="TRUE" ;; -s|--start) (( args=${args}+1 )) startvm=${lineopts[${args}]} sstart="TRUE" ;; -a|--alias) alias="TRUE" ;; --silent) silent="TRUE" ;; --displayaliases) cat ${vmtempl}/alias; exit 0 ;; --delay) (( args=${args}+1 )) sleep ${lineopts[${args}]} ;; --image) (( args=${args}+1 )) vmdir=${lineopts[${args}]} ;; --persistent) np="independent-persistent" ;; --include) (( args=${args}+1 )) include=${lineopts[${args}]} ;; --vmostype) (( args=${args}+1 )) vmostype=${lineopts[${args}]} comdef="TRUE" ;; --mem) (( args=${args}+1 )) memopt=${lineopts[${args}]} ;; --res) (( args=${args}+1 )) guestres=${lineopts[${args}]} ;; --run) (( args=${args}+1 )) vmrun=${lineopts[${args}]} ;; --debug) (( args=${args}+1 )) debug=${lineopts[${args}]} ;; --windowed) vmopt=$(echo ${vmopt} | sed -e "s,-X,-x,") ;; --floppya) floppya="TRUE" ;; --floppyb) floppyb="TRUE" ;; --edit) vmopt="" ;; --donotquit) vmopt=$(echo ${vmopt} | sed -e "s,-q,,") ;; *) echo -e "\n\tOption\"${lineopts[${args}]}\" not found, please correct.\n" sleep 1 help ;; esac (( args=${args}+1 )) done ### STARTING ################################################################### # create environment # remove leftover locks from former runs, # problems may occure if you run more then one vmware with this script rm -f ${tmpdir}/*LOCK >/dev/null 2>&1 rm -f ${tmpdir}/*.${debug}.log >/dev/null 2>&1 # create vmware directories mkdir -p ${tmpdir} >/dev/null 2>&1 mkdir -p ${vmhome} >/dev/null 2>&1 # NO X-server no runvmware ;) [ -z "$DISPLAY" ] && echo -e "\n\tStart only within a desktop!\n" && exit 1 # if --xdm set don't go further, only used for xdm starts if [ "${xdm}" = "all" -o "${xdm}" = "vm" ]; then x_dialog_check xdm_mode args_dial=$(x_dialog) exec ${args_dial} exit 0 elif [ -n "${xdmstart}" -a -z "${xdm}" ]; then xterm -e 'echo -e "\n\n\n\n\n\n\t\t\tWrong --xdm option! \ \n\t\t\tOnly all or vm possible.\ \n\n\t\t\tClosing in 3 seconds."; sleep 3' && exit 1 fi # if not interactive mode or image spezified via command line stop if [ -z "${istart}" -a -z "${sstart}" ]; then writelog "\n\tSpecify image to start /w -s or run interactive mode -i!\n" 0 0 exit 1 fi # logo for console if [ -z ${silent} ]; then cat <&1 >/dev/null # adjust volume writelog "Unmuting sound...\c" 0 0 amixer -q sset Master 28 unmute amixer -q sset PCM 28 unmute writelog "finished\n" 0 0 if [ `which vmplayer 2>/dev/null` ] && [ -z "${vmrun}" ] \ || [ "${vmrun}" = "vmplayer" ]; then # VMware build vmbuild=$(vmplayer -v | awk -F "-" '{print $2}') # create preferences preferencesheader # create VMware startup file runvmwareconfheader writelog "\nStarting VMplayer..." 0 0 vmopt=$(echo ${vmopt} | sed -e "s,-q,," -e "s,-x,,") # remove unsupported opts # run VMplayer vmplayer ${vmopt} ${confile} 2>&1 >/dev/null elif [ `which vmware 2>/dev/null` ] && [ -z "${vmrun}" ] \ || [ "${vmrun}" = "vmware" ]; then # VMware build vmbuild=$(vmware -v | awk -F "-" '{print $2}') # create preferences preferencesheader # create VMware startup file runvmwareconfheader # copy licence file to VMware directory cp /var/lib/vmware/templ/license.ws.5.0 ${vmhome} 2>&1 >/dev/null writelog "\nStarting VMware..." 0 0 # run VMware vmware ${vmopt} ${confile} 2>&1 >/dev/null else writelog "\nNo VMware/VMPlayer found!\n" 0 99 exit 1 fi writelog "\nBye. \n" 0 0 exit 0 ################################################################################