#!/bin/sh
#
# Description: Script for preparing VMware environment Diskless
# X Stations (v4)
#
# Author(s): Dirk von Suchodoletz <dirk@goe.net>, 18-03-2006
# Michael Janczyk <mj0@uni-freiburg.de>, 23-08-2006
# Copyright: (c) 2003, 2006 - RZ Universitaet Freiburg
#
# Version: 0.14.324
#
################################################################################
### 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\"
sound.virtualDev = \"es1371\"
###### usb ###################################################################
usb.present = \"TRUE\"
usb.generic.autoconnect = \"TRUE\"
###### floppies ##############################################################
floppy0.present = \"${floppya}\"
floppy0.fileName = \"/dev/fd0\"
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 ######
###### ######
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
# first read variables from machine-setup
. /etc/machine-setup
# 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...
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/cdrom"
cdr_2="FALSE"
cdr_2_name="/dev/cdrom1"
floppya="FALSE"
floppyb="FALSE"
# place for the virtual floppy "B:"
floppybname="/etc/vmware/loopimg/fd1.img"
# resolution
hostres=$(xvidtune -show | grep -ve "^$")
xres=$(echo "${hostres}" | awk '{print $3}')
yres=$(echo "${hostres}" | awk '{print $7}')
guestres=
g_xres=
g_yres=
# VMware variables
# VMware build
vmbuild=$(vmware -v | awk -F "-" '{print $2}')
# 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"
desktops=
desktopsnr=
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
inter=
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 <<EOH
USAGE: $0 [--options]
Image options:
-i|--interactive interactive mode with image selection
-s|--start <image-name> start image /\${vmdir}/<image-name>.vmdk
-a|--alias use aliases
--silent no stdout from runvmware
--mem <n(M(h)),n(G(h))> override autoallocation of memory, in percent
m,M megabyte, g,G gigabyte, h,H reserve f. host
--res <X_intxY_int> Maximum resolution of the guest os, e.g. 800x600
--delay <n seconds> delay the start of the script n seconds
--image <directory> specify image directory
--persistent use persistent mode
--vmostype <vmwareos> define VMware ostype
--include <includefile> 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 <program> 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> level 1 -> print stdout to file
Dirk von Suchodoletz, Michael Janczyk
<dirk@goe.net>, <mj0@uni-freiburg.de>
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
}
x_dialog () {
desktops=( `ls ${vmsessions}/*.desktop 2>/dev/null` )
desktopsnr=$(echo "${#desktops[*]}")
(( 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
# --stderr because of 1>/dev/null
# echoing to file because Xdialog sux when used w/ quotes
echo -e "Xdialog --title \"VMware Image Menu\" \
--screen-center \
--fill \
--no-wrap \
--stderr \
--no-tags \
--ok-label \"START\" \
--item-help \
--menubox \"Please choose the image you would like to run:\" 35 80 0 \
$menu 1>/dev/null" \
> ${tmpdir}/Xdialog
. ${tmpdir}/Xdialog
rm -f ${tmpdir}/Xdialog
}
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)
inter="TRUE"
;;
-s|--start)
(( args=${args}+1 ))
startvm=${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}]}
;;
--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 ###################################################################
# logo for console
if [ -z ${silent} ]; then
cat <<EOL
.----.--.--.-----.--.--.--------.--.--.--.---.-.----.-----.
| _| | | | | | | | | | _ | _| -__|
|__| |_____|__|__|\___/|__|__|__|________|___._|__| |_____|
Script for preparing VMware environment...(v${version})
EOL
writelog "Starting...`echo ${np} | sed -e \"s,i.*-,,g\" \
| tr [a-z] [A-Z]`-mode\n" 0 0
fi
### CHECK MACHINE SETUP ########################################################
# 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
# 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:
\tTmpdir:\t\t${tmpdir}\n\tVMhome:\t\t${vmhome}\n\tTmpdir info:\
\t`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.
\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/cdrom ] ; then
cdr_1="TRUE"
fi
if [ -L /dev/cdrom1 ] ; then
cdr_2="TRUE"
fi
# check for floppy controller
test ! -d /sys/block/fd0 && floppya="FALSE"
# guest resolution
if [ -n "${guestres}" ]; then
g_xres=$(echo "${guestres}" | awk -F "x" '{print $1}')
g_yres=$(echo "${guestres}" | awk -F "x" '{print $2}')
if [ "${g_xres}" -ge "640" -a "${g_xres}" -le "${xres}" \
-a "${g_yres}" -ge "480" -a "${g_yres}" -le "${yres}" ]; then
xres=${g_xres}
yres=${g_yres}
else
writelog "\n\n\tSpecified resolution is not in range!
\tRange: 640x480 - ${xres}x${yres}
\tJumping back to resolution of Host.\n"
fi
fi
writelog "finished\nResults:\n\tMAC:\t\t00:50:56:0D:${mac}\n\tMem:\t\t${mem} MB
\tMax. res.:\t${xres}x${yres}\n\tFloppy_A:\t${floppya}\n\tFloppy_B:\
\t${floppyb}\n\tCD-ROM_1:\t${cdr_1}\n\tCD-ROM_2:\t${cdr_2}\n" 0 1
### SELECT VIRTUAL IMAGE #######################################################
# interactive mode
if [ -n "${inter}" ]; then
writelog "Starting interactive mode...\c" 0 0
menutest=$(ls ${vmsessions} | grep -x ".*desktop" 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 -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! " 0 99
writelog "Please install Xdialog for interactive mode, \c" 0 0
writelog "or use option -s.\n" 0 0
exit 1
fi
# create menu, etc...
startvm=$(x_dialog 2>&1) # 2>&1, see function
if [ -z "${startvm}" ]; then
writelog "\rNo image selected, please retry or use option -s\n" 0 0
writelog "No image was selected (option -i); \c" 2 2
writelog "return value is: ${startvm}\n" 2 2
exit 1
fi
writelog "finished.\nResult:\n\tVMimage:\t${startvm}\n" 0 1
fi
# aliases
[ -n "${alias}" ] && checkalias
# image allocation
writelog "Starting image detection...\c" 0 1
diskfile="${vmdir}/${startvm}.vmdk"
# check if ${vmostype} defined via command line
if [ -z "${comdef}" ]; then
ostype=$(echo ${startvm} | awk -F "-" '{print $1}')
vmostype=$(grep -v "#.*" ${vmtempl}/ostype | grep -w "${ostype}" \
| awk '{print $1}')
# if ${ostype} not found use else statement
vmostype=${vmostype:-"other"}
fi
# define name for VMware window
displayname=$(grep -m 1 -i "name" \
${vmsessions}/*${startvm}.desktop | awk -F "=" '{print $2}')
# if variable not set
displayname=${displayname:-"VMware Image"}
writelog "finished\nResults:\n\tDiskfile:\t${diskfile}
\tVMostype:\t${vmostype}\n\tDisplayname:\t${displayname}\n" 0 1
# link to windows image
writelog "Linking \"ln -fs ${diskfile}
\t${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
[ -n "${include}" ] && . ${include}
# copy VMware (-Player) bios
cp ${vmtempl}/nvram.5.0 ${tmpdir}/nvram 2>&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
### 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
################################################################################