#!/bin/sh # # Description: Script for preparing VMware environment Diskless # X Stations (v4) # # Author(s): Dirk von Suchodoletz , 18-03-2006 # Michael Janczyk , 06-04-2006 # Copyright: (c) 2003, 2006 - RZ Universitaet Freiburg # version=pre0.14; last_changes=06-04-06 ################################################################################ ### VERBOSE? ################################################################### # set verbose mode (set -x(v)) #set -xv ### 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 = \"TRUE\" ide0:0.fileName = \"${tmpdir}/disk\" ide1:0.present = \"${cdr_1}\" ide1:0.fileName = \"${cdr_1_name}\" ide1:0.deviceType = \"cdrom-raw\" ide1:1.present = \"${cdr_2}\" ide1:1.fileName = \"${cdr_2_name}\" ide1:1.deviceType = \"cdrom-raw\" ###### scsi-disks ############################################################ scsi0.present = \"FALSE\" ###### nics ################################################################## ethernet0.present = \"TRUE\" ethernet0.addressType = \"static\" ethernet0.connectionType = \"bridged\" ethernet0.address = \"00:50:56:0D:${mac}\" ###### sound ################################################################# sound.present = \"TRUE\" ###### usb ################################################################### usb.present = \"TRUE\" ###### floppies ############################################################## floppy0.present = \"${floppya}\" floppy0.fileName = \"/dev/fd0\" floppy1.present = \"${floppyb}\" floppy1.fileType = \"file\" floppy1.fileName = \"${filename}\" 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\" tools.syncTime = \"FALSE\" redoLogDir = \"${tmpdir}\" " \ >${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 ###### ###### ###### hints.hideAll = \"TRUE\" pref.exchangeSelections = \"TRUE\" pref.hotkey.shift = \"TRUE\" pref.tip.startup = \"FALSE\" pref.vmplayer.fullscreen.autohide = \"TRUE\" pref.vmplayer.webUpdateOnStartup = \"FALSE\" prefvmx.defaultVMPath = \"${vmhome}\" prefvmx.mru.config = \"${confile}:\" tmpDirectory = \"${tmpdir}\" webUpdate.checkPeriod = \"manual\" " \ >${vmhome}/preferences } ### VARIABLES SECTION ########################################################## # declaration of default variables # hardware variables # temporary disk space for logs, etc... export tmpdir=/tmp/${USER} mac= declare -i mem=0 declare -i memtest=0 memopt= memhost= memmeg= memgig= permem=66 # virtual devices cdr_1="FALSE" cdr_1_name="/dev/cdrom1" cdr_2="FALSE" cdr_2_name="/dev/cdrom2" floppya="FALSE" floppyb="FALSE" # place for the virtual floppy "B:" filename=`mount | grep -i "/tmp/${clientip}-fd0.img" | awk '{print $1}'` # 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 vmsessions="${vmdir}/vmsessions" # 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= spec= 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}/ostype) # 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 inter= comdef= args= ### 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 < start ostype, e.g. winxp, suse,... (first part of image name (winxp-pro.vmdk)) -s|--spec specify your image, e.g. pro, home,... (second part of image name (winxp-home.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 --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 --floppyb use /media/loop0 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 ${ostype}${spec:+", ${spec}"}...\c" 0 1 # ostype= osalias=$(grep -v "#.*" ${vmtempl}/alias | grep -w "${ostype}" \ | awk '{print $1}') [ -n "${osalias}" ] && ostype=${osalias} # spec= [ -n "${spec}" ] \ && specalias=$(grep -v "#.*" ${vmtempl}/alias | grep -w "${spec}" \ | awk '{print $1}') [ -n "${specalias}" ] && spec=${specalias} writelog "finished\nResult:" 0 1 writelog "\tOS=${ostype}${spec:+"\\\n\\\tSpec=$spec"}\n" 0 1 else writelog "NO alias file found: ${vmtempl}/alias" 0 1 writelog "Try without option \"-a\"" 0 1 exit 1 fi } x_dialog () { desktops=( `ls ${vmsessions} 2>/dev/null | sed -e "s,.desktop,,"` ) desktopsnr=$(echo "${#vmsessions[*]}") (( args=0 )) while [ "${desktopsnr}" -gt "${args}" ]; do execute=$(grep -m 1 -i "exec" ${vmsessions[${args}]} \ | awk -F "=" '{print $2}') executenam=$(grep -m 1 -i "name" ${vmsessions[${args}]} \ | awk -F "=" '{print $2}') executecom=$(grep -m 1 -i "comment" ${vmsessions[${args}]} \ | awk -F "=" '{print $2}') menu="${menu} ${execute} ${executenam:-${execute}} \ ${executecom:-${executenam:-${execute}}}" (( args=${args}+1 )) done # --stderr because of 1>/dev/null Xdialog --title "VMware Image Menu" \ --stderr \ --no-tags \ --ok-label "Run Image" \ --cancel-label "Abort Runvmware" \ --item-help \ --menubox "Please choose the image you would like to run:" 24 51 6 \ ${menu} 1>/dev/null } 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 writelog "Vmware Image Problem:\c" 0 1 writelog "\tThe image you've specified is a link.\n" 0 1 writelog "\tContinuing to start VMware, but it may cause problems!\n" 0 0 # take link target rightsfile=$(ls -lh ${diskfile} 2>&1 | awk -F "->" '{print $2}') 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}" ]; then # ${rightsfile} see above 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 } #### INTERPRET COMMAND LINE OPTIONS ############################################ # print help if no clo if [ $# = "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) inter="TRUE" ;; -o|--os) (( args=${args}+1 )) # needed for checking unknown options ostype=${lineopts[${args}]} ;; -s|--spec) (( args=${args}+1 )) spec=${lineopts[${args}]} ;; -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}]} ;; --run) (( args=${args}+1 )) vmrun=${lineopts[${args}]} ;; --debug) (( args=${args}+1 )) debug=${lineopts[${args}]} ;; --windowed) vmopt=$(echo ${vmopt} | sed -e "s,-X,-x,") ;; --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 ################################################################### # logo for console if [ -z ${silent} ]; then cat </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 # start logging, because now we have the directories created ;) writelog "##################################################" 1 99 writelog "#\n# File created by $0 (v.${version})\n# on `date`" 1 99 writelog "# LOGLEVEL=${debug}\n#" 1 99 writelog "##################################################\n" 1 99 # repeat only for logfile ;) writelog "Starting...`echo ${np} | sed -e \"s,i.*-,,g\" \ | tr [a-z] [A-Z]`-mode\n" 1 1 # log disksetup writelog "Directories:" 0 1 writelog "\tTmpdir=${tmpdir}\n\tVMhome=${vmhome}\n" 0 1 writelog "Tmpdir info:\n`mount | grep -i "/tmp "`\n" 0 1 # configuring MAC address: first four bytes are fixed (00:50:56:0D) the # last two bytes are taken from the local network adaptor writelog "Starting hardware / device detection...\c" 0 1 mac=$(/sbin/ifconfig eth0 | grep eth0 | sed -e "s, ,,g" \ | awk -F ":" '{print $(NF-1)":"$NF}') # get memory in MB memtest=$(expr $(grep -i "memtotal" /proc/meminfo | awk '{print $2}') / 1024) # check if command line option given and calculate memory for vmware if [ -n "${memopt}" ]; then # memory allocation for host or guest? memhost=`echo ${memopt} | grep -i "h"`\ && memopt=`echo ${memopt} | sed -e "s,[h,H],,"` # memory given in megabyte memmeg=`echo ${memopt} | grep -i "m"` # memory given in gigabyte memgig=`echo ${memopt} | grep -i "g"` # remove m or M [ -n "${memmeg}" ] && mem=$(echo ${memopt} | sed -e "s,[m,M],,") # remove g or G and convert to megabyte [ -n "${memgig}" ] && mem=$(echo ${memopt} | sed -e "s,[g,G],,") \ && mem=${mem}*1024 # if no m or g, then it is percent [ -z "${memmeg}" ] && [ -z "${memgig}" ] && mem=${memtest}/100*${memopt}/4*4 # memory allocation for host or guest? If host calculate for guest. [ -n "${memhost}" ] && mem=${memtest}-${mem} # else use ${permem} variable to calculate memory percentage for vmware else mem=${memtest}/100*${permem}/4*4 fi # check memory range memtest=${memtest}-128 if [ "${mem}" -lt "128" ] || [ "${mem}" -gt "${memtest}" ]; then writelog "\n\n\tYour memory is out of range: ${mem} MB.\n\ \tMin. 128 MB for host and guest!\n\tTry --mem option.\n" 0 1 exit 1 fi # look for cdrom,dvd and floppy and add them to the vm config file if [ -L /dev/cdrom1 ] ; then cdr_1="TRUE" fi if [ -L /dev/cdrom2 ] ; then cdr_2="TRUE" fi # floppy [ -d /sys/block/fd0 ] && floppya="TRUE" writelog "finished\nResults:\n\tMAC=00:50:56:0D:${mac}\n\tMem=${mem} MB" 0 1 writelog "\tCD-ROM_1=${cdr_1}\n\tCD-ROM_2=${cdr_2}\n" 0 1 ### SELECT VIRTUAL IMAGE ####################################################### # interactive mode if [ -n "${inter}" ]; then writelog "Starting interactive mode...\c" 0 0 menutest=$(ls ${vmsessions} 2>/dev/null | wc -l) # check for session files if [ "${menutest}" = "0" ]; then writelog "\rNo sessions found in ${vmsessions} for option -i" 0 99 writelog "Please use option -o/-s and check your configuration \n" 0 0 exit 1 fi # check for Xdialog if ! [ `which Xdialog 2>/dev/null` ]; then writelog "\rXdialog not found!\t\t" 0 99 writelog "Please install Xdialog for interactive mode, \c" 0 0 writelog "or use options -o/-s.\n" 0 0 exit 1 fi # create menu, etc... args_zen=$(x_dialog 2>&1 | sed -e "s,-, ,") # 2>&1, see function ostype=$(echo ${args_zen} | awk '{print $1}') spec=$(echo ${args_zen} | awk '{print $2}') if [ -z "${args_zen}" ]; then writelog "\rNo image selected, please retry or use option -o / -s\n" 0 0 writelog "No image was selected (opton -i); \c" 2 2 writelog "return value is: ${args_zen}\n" 2 2 exit 1 fi writelog "finished.\nResult:" 0 1 writelog "\tostype=${ostype}${spec:+\n\tspec=${spec}}\n" 0 1 fi # aliases [ -n "${alias}" ] && checkalias # image allocation writelog "Starting image detection...\c" 0 1 diskfile="${vmdir}/${ostype}${spec:+"-${spec}"}.vmdk" # check if ${vmostype} defined via command line if [ -z "${comdef}" ]; then vmostype=$(grep -v "#.*" ${vmtempl}/ostype | grep -w "${ostype}" \ | awk '{print $2}') # if ${ostype} not found use else statement vmostype=${vmostype:-"other"} fi # define name for VMware window displayname=$(grep -m 1 -i "name" \ ${vmsessions}/${ostype}${spec:+"-${spec}"}.desktop | awk -F "=" '{print $2}') writelog "finished\nResults:\n\tDiskfile=${diskfile}" 0 1 writelog "\tVMostype=${vmostype}\n\tDisplayname=${displayname}\n" 0 1 # link to windows image writelog "Linking \"ln -fs ${diskfile} ${tmpdir}/disk\"...\c" 0 1 ln -fs ${diskfile} ${tmpdir}/disk writelog "finished\nResult:\n`ls -l ${tmpdir}/disk`\n" 0 1 # check if image exists, etc... filecheck ### WRITE CONFIGURATION FILES ################################################## # create preferences preferencesheader # create VMware startup file runvmwareconfheader # include file which is given via command line . ${include} # copy VMware (-Player) bios cp ${vmtempl}/nvram.5.0 ${tmpdir}/nvram 2>&1 >/dev/null ### RUN VMWARE(-Player) ######################################################## # ...with the automatically written config file if [ `which vmplayer 2>/dev/null` ] && [ -z "${vmrun}" ] \ || [ "${vmrun}" = "vmplayer" ]; then 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 # 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 ################################################################################