#!/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}/xdmsession/$pool/*.desktop .desktop files for xdm,
## can't avoid masses of them
## ${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}
# File for dektopentrys
#TODO: where to put? temporary test file, we should delete it or move it
# later, else there isnt a valid entryfile till this script is finished
desktopentry="${vmdir}/desktopentrys"
# template for runvmware
templatevmware="${vmdir}/templates/runvmware-v2"
# 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!"
exit 0
fi
# Test if image is available
if [ ! -f ${image} ]; then
echo "PANIC, image defined in ${xml} not available"
exit 0
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)
# get list where the current image should be used
pools=$(grep -i "<pools param=\"" ${xml} | awk -F "\"" '{ print $2 }')
# 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
# TODO: Test
echo "PANIC, virtualmachine not correct defined in ${xml}"
exit 0
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}"
exit 0
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}"
exit 0
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}"
exit 0
fi
# os running in vmware?
os=$(grep -i "<os param=\"" ${xml} | awk -F "\"" '{ print $2 }')
if [ "${os}" != "Linux" -a "${os}" != "Windows XP" ]; then
# TODO: test
echo "PANIC, OS in virtual machine not correct defined in ${xml}"
exit 0
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}"
exit 0
fi
##############################################################################
## main part,
##############################################################################
# Main part, creates desktopentrys and image run scripts
# 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
# 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
# ... remove startscript and xdmsessions if it isn't active.
if [ ${active} -ne 1 ]; then
if [ -f ${vmdir}/runscripts/${i}/${image}.vmware -o runscripts/${i}/${image}.virtualbox ]; then
rm -rf ${vmdir}/runscripts/${i}/${image}.*
rm -rf ${vmdir}/xdmsessions/${i}/${image}.desktop
fi
fi
# ... create desktopentry
if [ ${active} -eq 1 ]; then
# create desktopentry
echo -e "\nCreating runfiles 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
echo "Exec=/path/to/the/execfile/${image}" >> ${vmdir}/xdmsessions/${i}/${image}.desktop
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 execute from template
if [ "${vm}" = "vmware" ]; then
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}.runvmware
# if we have virtualbox, part here can only be vbox cause check above
else
echo "Currently Virtualbox isn't implented"
exit 0
fi
done
done
# Delete all .utf files, we dont need them anymore
rm -f "*.xml.utf"