#!/bin/bash # # Description: Script for preparing VMware environment Diskless # X Stations and interactive session chooser (v4) # # Author(s): see project authors file # letzte Ă„nderung Dirk, 15.10. # Copyright: (c) 2003, 2006 - RZ Universitaet Freiburg # # Version: 0.16.611 # ################################################################################ ################################################################################ ## ## Put $HOME to another location ## ################################################################################ # We need to change $HOME so it saves everything to /tmp #export HOME="/tmp/${USER}" # following mkdir we have now twice in this script... but better twice # as not seperated. Now its no problem to delete this # "Put $HOME to another location" section later #mkdir /tmp/${USER} #ln -s /home/${USER}/.Xauthority /tmp/${USER}/.Xauthority ### VARIABLES SECTION ########################################################## ## ## declaration of default variables ## ################################################################################ ## "static" variables only changed within the script # The PATH... export PATH="${PATH}:/var/X11R6/bin:/usr/X11R6/bin" # Last two values for MAC address mac= # memory information. permem is value to calculate needed memory mem= totalmem= permem=66 # virtual fd/cd/dvd and drive devices, floppy b: for configuration #floppya is always false, if we have a floppy device or not isn't #important. floppya="FALSE" floppyb="TRUE" floppybname="/etc/vmware/loopimg/fd.img" cdr_1="FALSE" cdr_2="FALSE" # ide is expected default, test for the virtual disk image type should # be done while creating the runscripts ... ide="TRUE" scsi="FALSE" hddrv="lsilogic" # Displayresolution needed for vmware.config hostres=$(xvidtune -show 2>/dev/null| grep -ve "^$") xres=$(echo "${hostres}" | awk '{print $3}') yres=$(echo "${hostres}" | awk '{print $7}') # VMplayer buildversion vmbuild= # VMware start options #-X = fullscreen vmopt="-X" # temporary disk space for logs, etc... # use /tmp/vmware/${USER} if /tmp sits on NFS import export tmpdir=/tmp/${USER} # configfile confile="${tmpdir}/runvmware.conf" # users vmware config folder vmhome="${HOME}/.vmware" #vmhome="/tmp/${USER}/.vmware" # unknow variables needed vor vmwplayer configuration confver=8 hver=4 # set hostname: using original hostname and adding string "-vm" # variable isn't used anywhere in this script. but still works (however) # TODO: Test it commented out hostname="VM-${HOST}" # Folder of VirtualMachine Images vmdir="/var/lib/vmware" # special Variables, persistence vmware? #TODO: do we really need it? Should be everywhere nonpersistent np="independent-nonpersistent" ######## ## TODO: everything clean till here ######## # File if its a link. Stupid crap #TODO: perhaps we don't need it rightsfile= #TODO: don't know what it is for. check later noimage=0 # image checking variable filecheck= ## Image depending variables. This values will be changed by the script # vmware image file imagename="CHANGEIT" diskfile="${vmdir}/${imagename}" #TODO: check for a faster way, perhaps we should put this into XML # oh - yeah!! Why not do it on the SERVER??? It has enough power and has # to do it once and not during every start on a client :) #grepping every file could take much (network) resources. And if its #an IDE Image, but has somewhere the string ddb.adapterType stuff can #become screwed # NOOOOOOO - We do not check on every start on every client!!! # check if IDE or SCSI #hddrv=$(grep -m 1 -ia "ddb.adapterType" ${diskfile} | awk -F "\"" '{print $2}') #if [ "${hddrv}" = "ide" ]; then # ide="TRUE" # scsi="FALSE" #elif [ "${hddrv}" = "lsilogic" ]; then # ide="FALSE" # scsi="TRUE" #elif [ "${hddrv}" = "buslogic" ]; then # ide="FALSE" # scsi="TRUE" #fi # define name for VMware window displayname="CHANGEIT" # Definition of the client system vmostype="CHANGEIT" # Definition of the client system network="CHANGEIT" # command line variables # start with this this default commmand line options + extra # TODO: defaults laut datei --include /var/lib/vmware/tmpl/winconfig # --include include code right before program start # Should we debug? Hell yes, we should always debug! debug=0 #TODO: Bad done... we should do this another way later 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}') ############# ## TODO: End of uncleaned area ############# ### FUNCTION SECTION ########################################################### ## ## In this script used functions ## ################################################################################ ### write runvmware.conf ####################################################### #TODO: only not yet checked function filecheck () { filecheck=$(LANG=us ls -lh ${diskfile} 2>&1) writelog "Filecheck:\n${filecheck}\n" #TODO: don't understand the sence in it noimage=$(echo ${filecheck} | grep -i "no such file or directory" | wc -l) rightsfile=${diskfile} # check if link # TODO: mistake with 2nd rightsfile if its in another directory? 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" writelog "\tThe image you've specified doesn't exist." writelog "Filecheck says:\c" writelog "\t\t${diskfile}:\n\t\t\tNo such file or directory" writelog "Hint:\c" writelog "\t\t\tCompare spelling of the image with your options.\n" exit 1 fi # readable? if ! [ -r "${diskfile}" >/dev/null 2>&1 \ -o -r "${diskfile}" >/dev/null 2>&1 ]; then writelog "Vmware Image Problem:\c" writelog "\tThe image you've specified has wrong rights." writelog "Filecheck says:\t\t$(echo ${filecheck} \ | awk '{print $1" "$3" "$4}') ${rightsfile}" writelog "Hint:\t\t\tChange rights with: chmod a+r ${rightsfile}\n" 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" writelog "\tThe image you've specified has wrong rights." writelog "Filecheck says:\t\t$(echo ${filecheck} \ | awk '{print $1" "$3" "$4}') ${rightsfile}" writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n" exit 1 fi } ### 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 = \"lsilogic\" scsi0:0.mode = \"${np}\" scsi0:0.present = \"${scsi}\" scsi0:0.fileName = \"${diskfile}\" ###### nics ################################################################## ethernet0.present = \"TRUE\" ethernet0.addressType = \"static\" ethernet0.connectionType = \"${network}\" 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\" # we need floppy b: this for our windows client configuration 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 = \"TRUE\" snapshot.disabled = \"TRUE\" tools.syncTime = \"TRUE\" # use redoLogDir = \"/dev/shm\" if sitting on NFS import 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 } ### creates user configurationfile in ${vmhome} ################################ 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 } ### log function ############################################################### # function to write to stdout and logfile writelog () { # write to stdout echo -e "$1" # log in file echo -e "$1" >>${tmpdir}/runvmware.${USER}.log } ### MAIN SECTION ############################################################### ## ## Main part of the script... ## ################################################################################ # Delete the LOCK file. its unsecure, but ... rm -f ${tmpdir}/*LOCK >/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 # logo for console cat < /etc/vmware/fd-loop/config.xml echo "" > /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml # if we have a scanner, then copy scannerinformation to this xml sanelines="$(wc -l /etc/sane.d/net.conf|awk '{ print $1 };')" if [ -f /etc/sane.d/net.conf ] && [ "${sanelines}" -eq 1 ]; then echo "" \ >> /etc/vmware/fd-loop/config.xml echo "" >> /etc/vmware/fd-loop/config.xml fi echo " " >> /etc/vmware/fd-loop/config.xml echo "" >> /etc/vmware/fd-loop/config.xml # sync is needed to ensure that data is really written to virtual disk sync # own nvram. We need it for floppy drive b, default nvram has just drive a cp /var/lib/vmware/templates/nvram.5.0 ${tmpdir}/nvram # adjust volume writelog "Unmuting sound...\c" amixer -q sset Master 28 unmute amixer -q sset PCM 28 unmute writelog "finished\n" ### run vmplayer ############################################################### # ...with the automatically written config file if [ $(which vmplayer 2>/dev/null) ]; then writelog "\nStarting VMplayer..." # run VMplayer writelog "... vmplayer ${vmopt} ${confile}...\n" vmplayer ${vmopt} ${confile} 2>&1 >/dev/null else writelog "\nNo VMware/VMPlayer found!\n" exit 1 fi writelog "\nBye.\n" exit 0