#!/bin/bash
################################################################################
## Creates vmware and vbox (script creation for vbox is not implented yet)
## runscripts from xmlfiles.
## Use template file runvmware-v2 for executeables
##
##
## Structure:
## ${vmdir}/$image.xml configurationfile
## ${vmdir}/$image.vmdk vmware image file
## ${vmdir}/$image.vbox vbox image file
## ${vmdir}/runscripts/$pool/*.vmware vmware runscript
## ${vmdir}/runscripts/$pool/*.vbox virtualbox runscript
## ${vmdir}/xdialog-files/$pool/*.xdialog xdialog menu entrys
## ${vmdir}/xdmsession/$pool/*.desktop .desktop files for xdm,
## if xdm = true in xml
## ${vmdir}/templates/runvmware-v2 image exec template script
################################################################################
#TODO: check first if this xml file should be used, if not jump out of the
# while loop. reducee checks and resources
# Just needed if vmdir is somewhere else
vmdir="." && cd ${vmdir}
# were is vmdir, after we mountet this folder?
vmexecdir="/var/lib/vmware"
# template for runvmware
templatevmware="${vmdir}/templates/runvmware-v2"
# delete all priority files
rm -rf ${vmdir}/xdialog-files/${i}/[0-9]_*.vmware
# Take all xml files and work with them
for xml in *.xml;do
# converts the XML file to utf-8, whyever we need that
# inefficient here, because we don't need utf-8 for every xml file
# but most secure place. Else the structure gets screwed.
#TODO: perhaps we can kick out the whole UTF-8 shit, if the admins
# are not able to give us the correct format, we shouldnt fix it
iconv -c -f utf-8 -t utf-8 < ${xml} > ${xml}.utf
##############################################################################
## get needed information from xml file and check them if needed
##############################################################################
# get image name
image=$(grep -i "<image_name param=\"" ${xml} | awk -F "\"" '{ print $2 }')
# Test if correct defined
image_type=$(echo ${image}|sed 's%.*\.%%')
if [ "${image_type}" != "vmdk" -a "${image_type}" != "vdi" ]; then
# TODO: Test
echo "PANIC, image is not correct defined in ${xml}."
echo "Image has to end with vdi or vmdk!"
fi
# Test if image is available
if [ ! -f ../${image} ]; then
echo "PANIC, image defined in ${xml} not available"
fi
# get information if the current image should be used
# active when active=1 image, else disabled
active=$(grep -i "<active param=\"true\"" ${xml} | wc -l)
#TODO: perhaps we should force an active flag, too
# get list where the current image should be used
pools=$(grep -i "<pools param=\"" ${xml} | awk -F "\"" '{ print $2 }')
# we need the pool configuration
if ! [ "${pools}" ]; then
echo "PANIC, pools not correct defined in ${xml}"
fi
# Virtualmachine (vmware or virtualbox)?
vm=$(grep -i "<virtualmachine param=\"" ${xml} | awk -F "\"" '{ print $2 }')
# Test if correct defined
if [ "${vm}" != "vbox" -a "${vm}" != "vmware" ]; then
echo "PANIC, virtualmachine not correct defined in ${xml}"
fi
# Test if vbox and wrong image
if [ "${vm}" = "vbox" -a "${image_type}" != "vdi" ]; then
# TODO: Test
echo "PANIC, virtualmachine vbox cant use image type defined in ${xml}"
fi
# Test if vmware and wrong image
if [ "${vm}" = "vmware" -a "${image_type}" != "vmdk" ]; then
# TODO: Test
echo "PANIC, virtualmachine vmware cant use image type defined in ${xml}"
fi
# Connectiontype of vm (nat or bridged)?
network=$(grep -i "<network param=\"" ${xml} | awk -F "\"" '{ print $2 }')
# Test if correct defined
if [ "${network}" != "nat" -a "${network}" != "bridged" ]; then
# TODO: test
echo "PANIC, network connection not correct defined in ${xml}"
fi
# os running in vmware?
os=$(grep -i "<os param=\"" ${xml} | awk -F "\"" '{ print $2 }')
if [ "${os}" != "Linux" -a "${os}" != "winxppro" -a "${os}" != "Windows 2000" ]; then
# TODO: test
echo "PANIC, OS in virtual machine not correct defined in ${xml}"
fi
# get short image description
short_description=$(grep "short_description param=\"" ${xml}.utf |
sed -e "s%&.*;%; %g" | awk -F "\"" '{print $2}')
# if ${short_description} not defined use ${image}
short_description=${short_description:-"${image}"}
# Get the long image description
long_description=$(grep "long_description param=\"" ${xml}.utf |
sed -e "s%&.*;%; %g" | awk -F "\"" '{print $2}')
# Informations if we need for XDM
xdm=$(grep "xdm param=\"" ${xml} | awk -F "\"" '{print $2}')
# Test if correct defined
if [ "${xdm}" != "true" -a "${xdm}" != "false" ]; then
# TODO: test
echo "PANIC, XDM usage not correct defined in ${xml}"
fi
# Get priority, use it for important Images in Xdialog
priority=$(grep "priority param=\"" ${xml} | awk -F "\"" '{print $2}')
##############################################################################
## main part,
##############################################################################
# Main part, creates desktopentrys and image run scripts
# TODO: Perhaps its better if we put runscripts, xdmsessions and
# xdialog-files in one big folder with subfolder runscripts,
# xdmsessions, xdialog-files
# check if ${vmdir}/runscripts/ is available
if [ ! -d ${vmdir}/runscripts ]; then
mkdir ${vmdir}/runscripts
fi
# check if ${vmdir}/xdmsessions/ for .desktop files is available
if [ ! -d ${vmdir}/xdmsessions ]; then
mkdir ${vmdir}/xdmsessions
fi
# check if ${vmdir}/xdmsessions/ for .desktop files is available
if [ ! -d ${vmdir}/xdialog-files ]; then
mkdir ${vmdir}/xdialog-files
fi
# work with the different pools and...
for i in ${pools}; do
# ... make sure we have the different pool directorys, else create it
if [ ! -d ${vmdir}/runscripts/${i} ]; then
mkdir -p ${vmdir}/runscripts/${i}
fi
if [ ! -d ${vmdir}/xdmsessions/${i} ]; then
mkdir -p ${vmdir}/xdmsessions/${i}
fi
if [ ! -d ${vmdir}/xdialog-files/${i} ]; then
mkdir -p ${vmdir}/xdialog-files/${i}
fi
# ... remove startscript, xdmsessions and Xdialog files if it isn't active.
if [ ${active} -ne 1 ]; then
if [ -f ${vmdir}/runscripts/*/${image}.vmware \
-o -f runscripts/*/${image}.virtualbox ]; then
rm -rf ${vmdir}/runscripts/*/${image}.*
rm -rf ${vmdir}/xdmsessions/*/${image}.desktop
rm -rf ${vmdir}/xdialog-files/*/${image}.xdialog
fi
fi
# ... create desktopentry
if [ ${active} -eq 1 -a ${xdm} = "true" ]; then
# create desktopentry
#echo -e "\nCreating xdm entry for ${image} and pool ${i}\n"
# create the desktopentry
#TODO: change it with < EOF, >> isnt nice for so much lines
echo "Desktop entry for ${image}" \
>> ${vmdir}/xdmsessions/${i}/${image}.desktop
echo "[Desktop Entry]" > ${vmdir}/xdmsessions/${i}/${image}.desktop
echo "X-SuSE-translate=true" \
>> ${vmdir}/xdmsessions/${i}/${image}.desktop
echo "Encoding=UTF-8" >> ${vmdir}/xdmsessions/${i}/${image}.desktop
echo "Type=XSession" >> ${vmdir}/xdmsessions/${i}/${image}.desktop
#TODO: Fix path
if [ "${vm}" = "vmware" ];then
echo "Exec=${vmexecdir}/runscripts/${i}/${image}.vmware" \
>> ${vmdir}/xdmsessions/${i}/${image}.desktop
else # it will be virtualbox
echo "Exec=${vmexecdir}/runscripts/${i}/${image}.virtualbox" \
>> ${vmdir}/xdmsessions/${i}/${image}.desktop
fi
echo "Name=${short_description}" \
>> ${vmdir}/xdmsessions/${i}/${image}.desktop
echo "Comment=${comment}" >> ${vmdir}/xdmsessions/${i}/${image}.desktop
#TODO: I dont like SLXGrp as variable herein, why we need it here?
#echo "SLXGrp=${pools}" >> ${vmdir}/xdmsessions/${i}/${image}.desktop
#TODO: do we need XDM configuration? -> Chemie pool
#echo "XDM=${xdm}" >> ${vmdir}/xdmsessions/${i}/${image}.desktop
fi
# If we have vmware, build executeable from template and
# Xdialog menu entrys
if [ "${vm}" = "vmware" -a "${active}" -eq 1 ]; then
# virtualmachine executable form template
sed -e "s/imagename=\"CHANGEIT\"/imagename=\"${image}\"/" \
-e "s%displayname=\"CHANGEIT\"%displayname=\"${short_description}\"%" \
-e "s/vmostype=\"CHANGEIT\"/vmostype=\"${os}\"/" \
-e "s/network=\"CHANGEIT\"/network=\"${network}\"/" \
${templatevmware} \
> ${vmdir}/runscripts/${i}/${image}.vmware
chmod 755 ${vmdir}/runscripts/${i}/${image}.vmware
# Xdialog menu entrys
echo -e "\"${vmexecdir}/runscripts/${i}/${image}.vmware\" \\
\"${short_description}\" \\
\"${long_description}\" \\" \
> ${vmdir}/xdialog-files/${i}/${image}.xdialog
# If we have a priority defined we rename the file
if [ ${priority} ]; then
mv ${vmdir}/xdialog-files/${i}/${image}.xdialog \
${vmdir}/xdialog-files/${i}/${priority}_${image}.xdialog
fi
# if we have virtualbox, part here can only be vbox cause check above
# TODO: i dont like this construction, fix it later
else
if [ "${active}" -eq 0 ];then
echo "${image} isnt enabled"
else
echo "Currently Virtualbox isn't implented"
fi
fi
done
done
# test if we still have this xml file, else we can delete the old entry
for i in xdmsessions/*/*.desktop; do
# get the name, cut all the folder information and file prefix off
name=$(echo ${i} |sed 's/.*\///' | sed 's/.vmdk.desktop//' | sed 's/.vbox.desktop//' | sed 's/^[0-9]_//')
# if not available as xml delete it
if [ ! -f ${name}.xml ]; then
echo "delete file ./${i}, no matching xml found"
rm -rf ${i}
fi
done
# test if we still have this xml file, else we can delete the old entry
for i in xdialog-files/*/*.xdialog; do
# get the name, cut all the folder information and file prefix off
name=$(echo ${i} |sed 's/.*\///' | sed 's/.vmdk.xdialog//' | sed 's/.vbox.xdialog//' | sed 's/^[0-9]_//')
# if not available as xml delete it
if [ ! -f ${name}.xml ]; then
echo "delete file ./${i}, no matching xml found"
rm -rf ${i}
fi
done
# Building Xdialog executable for each pool
for i in ${vmdir}/xdialog-files/*; do
cp ${vmdir}/templates/xdialog.sh ${i}
cat ${i}/*.xdialog >> ${i}/xdialog.sh
#closing bracket as last line invoked with \
echo ")" >> ${i}/xdialog.sh
chmod 755 ${i}/xdialog.sh
done
# Delete all .utf files, we dont need them anymore
rm -f *.xml.utf