diff options
author | Simon Rettberg | 2014-05-04 13:38:28 +0200 |
---|---|---|
committer | Simon Rettberg | 2014-05-04 13:38:28 +0200 |
commit | e20da74f86f668bd5c247545d2a10d7dd17c3ccb (patch) | |
tree | 27a2859759031b1e3c35e17e5277c8fa50d26a6d /remote/modules/vmchooser2/data | |
parent | [vmchooser-openslx] Remove pointless config module... (diff) | |
download | tm-scripts-e20da74f86f668bd5c247545d2a10d7dd17c3ccb.tar.gz tm-scripts-e20da74f86f668bd5c247545d2a10d7dd17c3ccb.tar.xz tm-scripts-e20da74f86f668bd5c247545d2a10d7dd17c3ccb.zip |
[vmchooser2] !
Diffstat (limited to 'remote/modules/vmchooser2/data')
26 files changed, 1821 insertions, 0 deletions
diff --git a/remote/modules/vmchooser2/data/etc/systemd/system/graphical.target.wants/vmchooser.service b/remote/modules/vmchooser2/data/etc/systemd/system/graphical.target.wants/vmchooser.service new file mode 120000 index 00000000..ad1590e8 --- /dev/null +++ b/remote/modules/vmchooser2/data/etc/systemd/system/graphical.target.wants/vmchooser.service @@ -0,0 +1 @@ +../vmchooser.service
\ No newline at end of file diff --git a/remote/modules/vmchooser2/data/etc/systemd/system/mount-vm-store.service b/remote/modules/vmchooser2/data/etc/systemd/system/mount-vm-store.service new file mode 100644 index 00000000..ff801963 --- /dev/null +++ b/remote/modules/vmchooser2/data/etc/systemd/system/mount-vm-store.service @@ -0,0 +1,10 @@ +[Unit] +Description=Mount VM store per NFS +After=network.target +Requires=network.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/opt/openslx/scripts/systemd-mount_vm_store +RemainAfterExit=yes diff --git a/remote/modules/vmchooser2/data/etc/systemd/system/network.target.wants/mount-vm-store.service b/remote/modules/vmchooser2/data/etc/systemd/system/network.target.wants/mount-vm-store.service new file mode 120000 index 00000000..d6a88c27 --- /dev/null +++ b/remote/modules/vmchooser2/data/etc/systemd/system/network.target.wants/mount-vm-store.service @@ -0,0 +1 @@ +../mount-vm-store.service
\ No newline at end of file diff --git a/remote/modules/vmchooser2/data/etc/systemd/system/vmchooser.service b/remote/modules/vmchooser2/data/etc/systemd/system/vmchooser.service new file mode 100644 index 00000000..1a5a980a --- /dev/null +++ b/remote/modules/vmchooser2/data/etc/systemd/system/vmchooser.service @@ -0,0 +1,9 @@ +[Unit] +Description=Sets up the vmchooser environment +Wants=graphical.target +Before=graphical.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/opt/openslx/scripts/systemd-vmchooser_env diff --git a/remote/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf b/remote/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf new file mode 100644 index 00000000..3b2219d1 --- /dev/null +++ b/remote/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf @@ -0,0 +1,2 @@ +d /tmp/vmchooser2 0777 root root +d /tmp/vmchooser2/icons 0777 root root diff --git a/remote/modules/vmchooser2/data/opt/openslx/bin/clc.bash b/remote/modules/vmchooser2/data/opt/openslx/bin/clc.bash new file mode 100755 index 00000000..ee198c51 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/bin/clc.bash @@ -0,0 +1,307 @@ +#!/bin/bash +# Needs full bash + +# region header + +# Copyright Torben Sickert 16.12.2012 + +# License +# This library written by Torben Sickert stand under a creative commons +# naming 3.0 unported license. +# see http://creativecommons.org/licenses/by/3.0/deed.de + +# vim: set tabstop=4 shiftwidth=4 expandtab: +# vim: foldmethod=marker foldmarker=region,endregion: + +# Dependencies: + +# vmware or virtualbox + +# Notes: + +# USE "sudo bin/vmware-vmx --new-sn JJ237-G52E2-08X0C-C3306-0WCQ1" +# To activate wmware workstation! + +# Abbreviation for "createLinkedClone". +__NAME__='clc' + +# endregion + +# Provides the main module scope. +function clc() { + +# region configuration + + # region private properties + + # region command line arguments + + local _VERBOSE='no' + local _SUPPORTED_HYPERVISOR=('VMware' 'virtualBox') + # NOTE: This value will be determined automatically. If no hypervisor + # could be detected this value will be used as default. + # The first value from supported Machines is taken as default. + local _HYPERVISOR="$_SUPPORTED_HYPERVISOR" + local _PERSISTENT_SHORT_DESCRIPTION_SUFFIX=' --persistent--' + + # endregion + + local _STANDARD_OUTPUT=/dev/null + local _ERROR_OUTPUT=/dev/null + local _BASIC_IMAGE_CONFIGURATION_FILE_PATH='' + local _TARGET_PATH='' + local _CREATE_PERSISTENT_CONFIG='no' + + # endregion + +# endregion + +# region functions + + # region command line interface + + # Prints a description about how to use this program. + function clcPrintUsageMessage() { + cat << EOF + $__NAME__ Generates a linked clone from given machine description file in + given target location. +EOF + return $? + } + + # Prints a description about how to use this program by providing examples. + function clcPrintUsageExamples() { + cat << EOF + # Getting a help message. + >>> $0 --help + + # Creating a linked clone. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ + + # Creating a linked clone in verbose mode. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose + + # Creating a linked clone in verbose mode with debugging output. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose --debug + + # Creating a linked clone in verbose mode with debugging output. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -v -d +EOF + return $? + } + + # Prints descriptions about each available command line option. + function clcPrintCommandLineOptionDescriptions() { + # NOTE; All letters are used for short options. + cat << EOF + -h --help Shows this help message. + + -v --verbose Tells you what is going on (default: "$_VERBOSE"). + + -d --debug Gives you any output from all tools which are used + (default: "$_DEBUG"). + + -c --create-persistent-config If set an xml file for persistent openslx + boot will be created (default: "$_CREATE_PERSISTENT_CONFIG"). +EOF + return $? + } + + # Provides a help message for this module. + function clcPrintHelpMessage() { + echo -e \ + "\nUsage: $0 BASIC_IMAGE_CONFIGURATION_FILE_PATH TARGET_PATH [options]\n" && \ + clcPrintUsageMessage "$@" && \ + echo -e '\nExamples:\n' && \ + clcPrintUsageExamples "$@" && \ + echo -e '\nOption descriptions:\n' && \ + clcPrintCommandLineOptionDescriptions "$@" && \ + echo && \ + return $? + } + + # Provides the command line interface and interactive questions. + function clcCommandLineInterface() { + while true; do + case "$1" in + -h|--help) + shift + clcPrintHelpMessage "$0" + exit 0 + ;; + -v|--verbose) + shift + _VERBOSE='yes' + ;; + -d|--debug) + shift + _DEBUG='yes' + _STANDARD_OUTPUT=/dev/stdout + _ERROR_OUTPUT=/dev/stderr + ;; + -c|--create-persistent-config) + shift + _CREATE_PERSISTENT_CONFIG='yes' + ;; + + '') + shift + break 2 + ;; + *) + if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]]; then + _BASIC_IMAGE_CONFIGURATION_FILE_PATH="$1" + elif [[ ! "$_TARGET_PATH" ]]; then + _TARGET_PATH="$1" + else + clcLog 'critical' \ + "Given argument: \"$1\" is not available." '\n' + clcPrintHelpMessage "$0" + return 1 + fi + shift + ;; + esac + done + if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]] || \ + [[ ! "$_TARGET_PATH" ]]; then + clcLog 'critical' \ + "You have to provide a basic image configuration file and a destination path." + clcPrintHelpMessage "$0" + return 1 + fi + local supportedVirtualMachine + for supportedVirtualMachine in ${_SUPPORTED_HYPERVISOR[*]}; do + if [[ "$(clcGetXMLValue 'virtualMachine' | \ + grep --ignore-case "$supportedVirtualMachine")" ]]; then + _HYPERVISOR="$supportedVirtualMachine" + clcLog 'debug' "Detected \"$_HYPERVISOR\" as hypervisor." + break + fi + done + clcLog 'info' "Using \"$_HYPERVISOR\" as hypervisor." && \ + return $? + } + + # Grabs a value from currently loaded xml file. + function clcGetXMLValue() { + grep --ignore-case --only-matching "<$1 param=.*" \ + "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" | awk -F '"' '{ print $2 }' + return $? + } + + # Handles logging messages. Returns non zero and exit on log level error to + # support chaining the message into toolchain. + function clcLog() { + local loggingType='info' + local message="$1" + if [ "$2" ]; then + loggingType="$1" + message="$2" + fi + if [ "$_VERBOSE" == 'yes' ] || [ "$loggingType" == 'error' ] || \ + [ "$loggingType" == 'critical' ]; then + if [ "$3" ]; then + echo -e -n "$3" + fi + echo -e "${loggingType}: $message" + fi + if [ "$loggingType" == 'error' ]; then + exit 1 + fi + } + + # endregion + + # region tools + + # Returns the minimal vmx vmware configuration file content to create a + # snapshot. + function clcGetTemporaryVMXContent() { + cat << EOF +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "7" +ide0:0.present = "TRUE" +ide0:0.fileName = "$1" +displayName = "" +EOF + return $? + } + + # Creates a snapshot from VMware generated virtual machine. + function clcCreateVMwareSnapshot() { + local temporaryConfigurationPath="$(mktemp --directory)/" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + local temporaryConfigurationFilePath="$(mktemp --suffix '.vmx')" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcGetTemporaryVMXContent "/var/lib/virt/vmware/$(clcGetXMLValue 'image_name')" \ + 1>"$temporaryConfigurationFilePath" 2>"$_ERROR_OUTPUT" && \ + mv "$temporaryConfigurationFilePath" "$temporaryConfigurationPath" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog "Needed files generated in \"$temporaryConfigurationPath\" generated." && \ + vmrun snapshot "$temporaryConfigurationPath"*.vmx \ + persistentUserSnapshot 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ + mv "$temporaryConfigurationPath"*.vmdk "$_TARGET_PATH" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" + local result=$? + if [[ "$_DEBUG" == 'no' ]]; then + rm --recursive "$temporaryConfigurationPath" 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" + fi + return $result + } + + # Creates a snapshot from virtualBox generated virtual machine. + function clcCreateVirtualBoxSnapshot() { + local temporaryConfigurationPath="$(mktemp --directory)" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + VBoxManage clonevm TODO ->(VMNAME) --snapshot base --options link \\ + --basefolder "$temporaryConfigurationPath" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + mv "${temporaryConfigurationPath}/Snapshots/"*.vmdk "$_TARGET_PATH" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + rm --recursive "$temporaryConfigurationPath" 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ + return $? + } + + # Creates a persistent version of given config file. + function clcCreatePersistentConfig() { + cp "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" "$_TARGET_PATH" && \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + sed --in-place --regexp-extended \ + "s/(< *short_description[^>]*param=\"[^\"]*)(\")/\\1$_PERSISTENT_SHORT_DESCRIPTION_SUFFIX\\2/g" \ + "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" + return $? + } + + # endregion + +# endregion + +# region controller + + clcCommandLineInterface "$@" || return $? + if [[ "$_CREATE_PERSISTENT_CONFIG" == 'yes' ]]; then + clcCreatePersistentConfig || \ + clcLog 'error' 'Creating persitent config failed.' + else + "clcCreate${_HYPERVISOR}Snapshot" || \ + clcLog 'error' 'Creating Linked Clone failed.' + fi + clcLog 'Program has successfully finished.' && \ + return $? + +# endregion + +} + +# region footer + +if [[ "$0" == *"${__NAME__}.bash" ]]; then + "$__NAME__" "$@" +fi + +# endregion diff --git a/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser b/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser new file mode 100755 index 00000000..7f53d202 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/bin/vmchooser @@ -0,0 +1,23 @@ +#!/bin/ash + +# This script launches the real vmchooser (vmchooser.real) +# It's here to pass the XML URL, coming from +# /opt/openslx/config, as well as the pool filter (if any) + +. /opt/openslx/config + +if [ -n "$SLX_VMCHOOSER_BASE_URL" ]; then + URL="$SLX_VMCHOOSER_BASE_URL" +elif [ -n "$SLX_PXE_SERVER_IP" ]; then + URL="http://$SLX_PXE_SERVER_IP/vmchooser/" +else + slxlog "virt-vmchooser" "vmchooser: Could not determine URL to fetch VM list from! (need SLX_VMCHOOSER_BASE_URL)" + # TODO: Tell user +fi + +if [ -n "$SLX_VM_POOL_FILTER" ]; then + vmchooser.real --url "$URL" --pool "$SLX_VM_POOL_FILTER" +else + vmchooser.real --url "$URL" +fi + diff --git a/remote/modules/vmchooser2/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading b/remote/modules/vmchooser2/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading new file mode 100755 index 00000000..b0909760 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading @@ -0,0 +1,3 @@ +#!/bin/ash + +iptables -t nat -A POSTROUTING -o br0 -s 192.168.101.0/24 -j MASQUERADE diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-mount_vm_store b/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-mount_vm_store new file mode 100755 index 00000000..831e25d8 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-mount_vm_store @@ -0,0 +1,6 @@ +#!/bin/ash + +. /opt/openslx/config || exit 1 + +mkdir -p /mnt/vmstore +mount -t nfs -o ro,async,nolock "$SLX_VM_NFS" /mnt/vmstore diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-vmchooser_env b/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-vmchooser_env new file mode 100755 index 00000000..04ea4b0d --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/systemd-vmchooser_env @@ -0,0 +1,182 @@ +#!/bin/ash +# ----------------------------------------------------------------------------- +# Copyright (c) 2007..2013 - RZ Uni FR +# Copyright (c) 2007..2013 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# systemd-vmchooser_env +# - This is the preparation script for the configuration of the virtuali- +# zation tools used later on. +################################################################################ + +################################################################################ +### Define default dirs / get configs +################################################################################ + +export PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin:/opt/openslx/usr/bin:/opt/openslx/usr/sbin + +# source config file with vars (e.g. ipaddr, macaddr, hostname) +. /opt/openslx/config + +# from plugins/vmchooser/XX_vmchooser.sh +VMCHOOSER_DIR="/opt/openslx/vmchooser" +VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config" + +mkdir -p "${VMCHOOSER_DIR}/data/loopimg" +mkdir -p "${VMCHOOSER_DIR}/fd-loop" -m 1777 + +# mount a clean tempfs (bug in UnionFS prevents loopmount to work) +grep -qE "unionfs |aufs " /proc/mounts && \ + mount -n -o size=1500k -t tmpfs vm-loopimg "${VMCHOOSER_DIR}/data/loopimg" + +# create an empty floppy image of 1.44 MByte size +dd "if=/dev/zero" "of=${VMCHOOSER_DIR}/data/loopimg/fd.img" count=2880 bs=512 2>/dev/null +chmod 0777 "${VMCHOOSER_DIR}/data/loopimg/fd.img" + +# use dos formatter copied into stage3 +mkdosfs "${VMCHOOSER_DIR}/data/loopimg/fd.img" +mount -n -t msdos -o loop,umask=000 "${VMCHOOSER_DIR}/data/loopimg/fd.img" "${VMCHOOSER_DIR}/fd-loop" + +#pvs integration +#if [ $vmchooser_pvs -ne 0 ]; then +# sed -i /usr/share/xsessions/default.desktop \ +# -e "s,vmchooser$,vmchooser --pvs," +#fi + +# setup more scratch space for virtual machines, if configured +mkdir -p /tmp/virt /var/log/samba /run/samba + +# enable normal users to setup the extended virtual machine redo file space +# and image source via network block device (NBD only at the moment) +# allow to start/stop samba on virtual devices (latter one ignores multiple +# independent daemons) + +#cat >> /mnt/etc/sudoers << EOF +# allow to start and stop the special /tmp redo file space (RAM + NBD/NFS server RAID) +#ALL ALL=NOPASSWD: /sbin/losetup /dev/loop* +#ALL ALL=NOPASSWD: /sbin/mdadm -C /dev/md0 -l linear --raid-devices=2 /dev/loop* /dev/* +#ALL ALL=NOPASSWD: /opt/openslx/rootfs/usr/sbin/nbd-client * * /dev/nbd* +# allow to configure and start/stop samba services +#ALL ALL=NOPASSWD: /opt/openslx/rootfs/bin/sed -i /etc/*/smb.conf -e * +#ALL ALL=NOPASSWD: /usr/sbin/nmbd -s /etc/*/smb.conf +#ALL ALL=NOPASSWD: /usr/sbin/smbd -s /etc/*/smb.conf +#ALL ALL=NOPASSWD: /opt/openslx/rootfs/usr/bin/killall nmbd smbd +#EOF + +################################################################################ +### Determine hardware configuration +################################################################################ + +# estimate free mem +mem_free=$(grep -i "^memfree:" /proc/meminfo | awk '{print $2}') +mem_cached=$(grep -i "^cached:" /proc/meminfo | awk '{print $2}') +mem_swapcached=$(grep -i "^swapcached:" /proc/meminfo | awk '{print $2}') +[ -z "$mem_free" ] && mem_free="2048000" +[ -z "$mem_cached" ] && mem_cached="0" +[ -z "$mem_swapcached" ] && mem_swapcached="0" +totalmem="$(expr $(expr $mem_free + $mem_cached + $mem_swapcached) / 1024)" +echo "totalmem=${totalmem}" > "${VMCHOOSER_CONF_DIR}/virtualization.conf" + +# determine number of cpu cores +CPU_CORES=$(grep '^processor.*:' /proc/cpuinfo | wc -l) +if [ "${CPU_CORES}" -gt "1" 2>/dev/null ]; then + echo "cpu_cores=${CPU_CORES}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" +else + echo 'cpu_cores=1' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" +fi + +# general machine architecture (32/64bit) +echo "host_arch=$(uname -m)" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" + +# check for VT enabled CPU +if grep -q '^flags.*\<vmx\>' "/proc/cpuinfo"; then + echo "vtflag=1" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" + echo 'kvm_module="kvm_intel"' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" + elif grep -q '^flags.*\<svm\>' "/proc/cpuinfo"; then + echo "vtflag=1" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" + echo 'kvm_module="kvm_amd"' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" + else + echo "vtflag=0" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" +fi + +# write mac +if [ -n "$SLX_PXE_MAC" ]; then + echo "hostmacaddr=${SLX_PXE_MAC}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" +else ## Fallback: + echo "hostmacaddr=$(ip a | grep ether | grep -o -E -i '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -n 1)" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" +fi +# read in ip address +echo "hostip=${SLX_PXE_CLIENT_IP}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" +# hostname +echo "hostname=\"$(hostname -s)\"" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" + +# get further hw information and check for traces of available optical and floppy drives +j=0 +for cdrom in $(dmesg|grep -i "Attached scsi CD-ROM sr" | sed "s,.*Attached scsi CD-ROM ,,"); do + echo "cdrom_$j=/dev/${cdrom}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" + j=$(expr $j + 1) +done + +j=0 +for floppy in $(dmesg|grep -i "Floppy drive"|sed "s,.*(s): ,,;s, is .*,,"); do + echo "floppy_$j=/dev/${floppy}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf" + j=$(expr $j + 1) +done + +################################################################################ +### Setup VM networking +################################################################################ + +# there will be three types of network interfaces for virtual machines available +# all will be configured for every type of virtualization tool +# a) br0 is the direct host bridge into the local LAN (br0 already exists) +# vmnet0 for VMware +# vboxnet0 for VirtualBox +# kvmnet0* for Qemu/KVM +# b) nat1 is an internal bridge which "NATes" into the local LAN (with DHCP) +# vmnet1 for VMware +# vboxnet1 for VirtualBox +# kvmnet1* for Qemu/KVM +# c) vsw2 is an internal host bridge to connect software defined LANs to +# vmnet2 for VMware +# vboxnet2 for VirtualBox +# kvmnet2* for Qemu/KVM + +# creating and configuring nat0 +# 192.168.101.0/24 is vm nat. If you ever change this there are a couple of other files +# where you'd need to make changes, so think twice before doing so. ;) +brctl addbr nat1 +ip link set dev nat1 up +ip addr add 192.168.101.1/24 dev nat1 +echo "1" >/proc/sys/net/ipv4/conf/nat1/forwarding +echo "1" >/proc/sys/net/ipv4/conf/br0/forwarding 2>/dev/null +# iptables masquerade rule is now inserted by /opt/openslx/iptables/rules.d/50-virt-nat1-masquerading +### iptables -t nat -A POSTROUTING -o br0 -s 192.168.0.0/16 -j MASQUERADE + +for wait in 1 1 2 2 3 end; do + grep '^SLX_DNS' "/opt/openslx/config" > /dev/null && break + [ "$wait" == "end" ] && echo "No DNS config found, using google dns" && break + echo "Waiting for DNS config.." + sleep "$wait" +done + +# read the DNS configuration and configure the udhcpd +[ -z "${SLX_DNS}" ] && SLX_DNS="8.8.8.8" +sed -i "s,DNSSERVER,${SLX_DNS},;s,DOMAIN,${SLX_NET_DOMAIN}," \ + /opt/openslx/vmchooser/config/udhcpd-nat1.conf + +mkdir -p /var/lib/udhcpd +udhcpd -S /opt/openslx/vmchooser/config/udhcpd-nat1.conf + +# creating and configuring vsw2 +brctl addbr vsw2 +ip link set dev vsw2 up +echo "1" >/proc/sys/net/ipv4/conf/vsw2/forwarding + diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-clc b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-clc new file mode 100755 index 00000000..337dee44 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-clc @@ -0,0 +1,475 @@ +#!/bin/bash + +# region header + +# vim: set tabstop=4 shiftwidth=4 expandtab: +# vim: foldmethod=marker foldmarker=region,endregion: + + # region dependencies: + +# VMware Player - Runs a virtual machine. +# VMware Workstation - Runs, edits, creates virtual machines for business +# usage. +# VirtualBox ver. 4+ - Plays, creates, edits virtual machines. +# bash ver. 4+ - A sh-compatible command line interpreter. +# cat - Concatenate and prints file contents. +# echo - Prints chars. +# grep - Prints lines which matches a given regular expression +# pattern. +# sed - Stream-editor for filtering and transformation text. +# mktemp - Creates temporary files and folders. +# dirname - Extracts the last element from a given file path. +# mv - moves and renames file objects. +# rm - Removes files and folders. +# cp - Copies files and folders. +# sleep - Delays program calls. +# readlink - Print resolved symbolic links or canonical file names. + + # endregion + +# Abbreviation for "createLinkedClone". +__NAME__='vmchooser-clc' + +# endregion + +# Provides the main module scope. +function vmchooser-clc() { + +# region configuration + + # region private properties + + # region command line arguments + + local _VERBOSE='no' + # NOTE: You should write upper case first letters to support valid + # camel case method names to handle given hypervisor. + local _SUPPORTED_HYPERVISOR=('VMware' 'VirtualBox') + # NOTE: This value will be determined automatically. If no hypervisor + # could be detected this value will be used as default. + # The first value from supported Machines is taken as default. + local _HYPERVISOR="$_SUPPORTED_HYPERVISOR" + local _PERSISTENT_SHORT_DESCRIPTION_SUFFIX=' --persistent--' + local _PERSISTENT_CONFIG_TARGET='' + local _BASIC_IMAGE_CONFIGURATION_FILE_PATH='' + local _TARGET_PATH='' + local _VIRTUAL_BOX_SNAPSHOT_NAME='persistentUserSnapshot' + + # endregion + + local _STANDARD_OUTPUT=/dev/null + local _ERROR_OUTPUT=/dev/null + local _VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH='/tmp/clcVirtualBoxSnapshotUUID' + + # endregion + +# endregion + +# region functions + + # region command line interface + + # Prints a description about how to use this program. + function clcPrintUsageMessage() { + cat << EOF + $__NAME__ Generates a linked clone from given machine description file in + given target location. +EOF + return $? + } + + # Prints a description about how to use this program by providing examples. + function clcPrintUsageExamples() { + cat << EOF + # Getting a help message. + >>> $0 --help + + # Creating a linked clone. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ + + # Creating a linked clone configuration file. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -c + + # Creating a linked clone in verbose mode. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose + + # Creating a linked clone in verbose mode with debugging output. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose --debug + + # Creating a linked clone in verbose mode with debugging output. + >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -v -d +EOF + return $? + } + + # Prints descriptions about each available command line option. + function clcPrintCommandLineOptionDescriptions() { + # NOTE; All letters are used for short options. + cat << EOF + -h --help Shows this help message. + + -v --verbose Tells you what is going on (default: "$_VERBOSE"). + + -d --debug Gives you any output from all tools which are used + (default: "$_DEBUG"). + + -c --create-persistent-config PERSISTENT_IMAGE_FILE_PATH If set an xml file + for persistent openslx boot will be created referencing to given + persistent image path (default: "$_PERSISTENT_CONFIG_TARGET"). + + -v --virtualbox-snapshot-name NAME Provide a name for newly created + snapshots. (default: "$_VIRTUAL_BOX_SNAPSHOT_NAME"). + + -u --virtualbox-snapshot-uuid-file-path PATH Provide a file path where to + save the newly generated snapshot uuid (default: \ + "$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH"). +EOF + return $? + } + + # Provides a help message for this module. + function clcPrintHelpMessage() { + echo -e \ + "\nUsage: $0 BASIC_IMAGE_CONFIGURATION_FILE_PATH TARGET_PATH [options]\n" && \ + clcPrintUsageMessage "$@" && \ + echo -e '\nExamples:\n' && \ + clcPrintUsageExamples "$@" && \ + echo -e '\nOption descriptions:\n' && \ + clcPrintCommandLineOptionDescriptions "$@" && \ + echo && \ + return $? + } + + # Provides the command line interface and interactive questions. + function clcCommandLineInterface() { + while true; do + case "$1" in + -h|--help) + shift + clcPrintHelpMessage "$0" + exit 0 + ;; + -v|--verbose) + shift + _VERBOSE='yes' + ;; + -d|--debug) + shift + _DEBUG='yes' + _STANDARD_OUTPUT=/dev/stdout + _ERROR_OUTPUT=/dev/stderr + ;; + -c|--create-persistent-config) + shift + _PERSISTENT_CONFIG_TARGET="$1" + shift + ;; + -v|--virtualbox-snapshot-name) + shift + _VIRTUAL_BOX_SNAPSHOT_NAME="$1" + shift + ;; + -u|--virtualbox-snapshot-uuid-file-path) + shift + _VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH="$1" + shift + ;; + + '') + shift + break 2 + ;; + *) + if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]]; then + _BASIC_IMAGE_CONFIGURATION_FILE_PATH="$1" + elif [[ ! "$_TARGET_PATH" ]]; then + _TARGET_PATH="$1" + else + clcLog 'critical' \ + "Given argument: \"$1\" is not available." '\n' + clcPrintHelpMessage "$0" + return 1 + fi + shift + ;; + esac + done + if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]] || \ + [[ ! "$_TARGET_PATH" ]]; then + clcLog 'critical' \ + "You have to provide a basic image configuration file and a destination path." + clcPrintHelpMessage "$0" + return 1 + fi + local supportedVirtualMachine + for supportedVirtualMachine in ${_SUPPORTED_HYPERVISOR[*]}; do + if [[ "$(clcGetXMLValue 'virtualMachine' | \ + grep --ignore-case "$supportedVirtualMachine")" ]]; then + _HYPERVISOR="$supportedVirtualMachine" + clcLog 'debug' "Detected \"$_HYPERVISOR\" as hypervisor." + break + fi + done + clcLog 'info' "Using \"$_HYPERVISOR\" as hypervisor." && \ + return $? + } + + # Grabs a value from currently loaded xml file. + function clcGetXMLValue() { + grep --ignore-case --only-matching "<$1 param=.*" \ + "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" | awk -F '"' '{ print $2 }' + return $? + } + + # Handles logging messages. Returns non zero and exit on log level error to + # support chaining the message into toolchain. + function clcLog() { + local loggingType='info' + local message="$1" + if [ "$2" ]; then + loggingType="$1" + message="$2" + fi + if [ "$_VERBOSE" == 'yes' ] || [ "$loggingType" == 'error' ] || \ + [ "$loggingType" == 'critical' ]; then + if [ "$3" ]; then + echo -e -n "$3" + fi + echo -e "${loggingType}: $message" + fi + if [ "$loggingType" == 'error' ]; then + exit 1 + fi + } + + # endregion + + # region tools + + # Returns the minimal vmx vmware configuration file content to create a + # snapshot. + function clcGetTemporaryVMXContent() { + cat << EOF +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "7" +ide0:0.present = "TRUE" +ide0:0.fileName = "$1" +displayName = "" +EOF + return $? + } + + # This functions escapes every special meaning character for a sed + # replacement. + # + # Examples: + # + # >>> sed "s/myInputString/$(clcValidateSEDReplacement '\hans/peter&klaus')/g" + function clcValidateSEDReplacement() { +## bash +## sed --expression 's/\\/\\\\/g' --expression 's/\//\\\//g' \ +## --expression 's/&/\\\&/g' <<< "$1" + sed -e 's/\\/\\\\/g' -e 's/\//\\\//g' -e 's/&/\\\&/g' <<< "$1" +## + return $? + } + + # endregion + + # region main tasks + + # Creates a snapshot from VMware generated virtual machine. + function clcCreateVMwareSnapshot() { + local temporaryConfigurationPath="$(mktemp --directory)/" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + local temporaryConfigurationFilePath="$(mktemp --suffix '.vmx')" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog "Generate a temporary virtual machine configuration file \"$temporaryConfigurationFilePath\"." && \ + clcGetTemporaryVMXContent "$(dirname \ + "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \ + 'image_name')" 1>"$temporaryConfigurationFilePath" \ + 2>"$_ERROR_OUTPUT" && \ + mv "$temporaryConfigurationFilePath" "$temporaryConfigurationPath" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog "Needed temporary files generated in \"$temporaryConfigurationPath\" generated." && \ + vmrun snapshot "$temporaryConfigurationPath"*.vmx \ + persistentUserSnapshot 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ + mv "$temporaryConfigurationPath"*.vmdk "$_TARGET_PATH" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" + local result=$? + if [[ "$_DEBUG" == 'no' ]]; then +## bash rm --recursive "$temporaryConfigurationPath" \ + rm -r "$temporaryConfigurationPath" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" + fi + return $result + } + + # Creates a snapshot from virtualBox generated virtual machine. + function clcCreateVirtualBoxSnapshot() { + local temporaryConfigurationPath="$(mktemp --directory)/" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ +## bash +## (cp --recursive ~/.VirtualBox/ \ +## "${temporaryConfigurationPath}virtualBoxBackup" \ +## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \ +## mkdir --parents \ +## "${temporaryConfigurationPath}virtualBoxBackup" \ +## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT") && \ + (cp -r ~/.VirtualBox/ \ + "${temporaryConfigurationPath}virtualBoxBackup" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \ + mkdir -p "${temporaryConfigurationPath}virtualBoxBackup" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT") && \ +## + # VBoxManage version to create snapshots. + clcLog 'Create a temporary virtual machine.' && \ + # NOTE: Virtualbox needs 5 at leas 5 seconds to register that it has + # a new configuration directory. + sleep 5 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + VBoxManage createvm --name tmp --basefolder \ + "$temporaryConfigurationPath" --register 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ + clcLog 'Create a temporary virtual ide controller.' && \ + VBoxManage storagectl tmp --name tmp --add ide 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ + clcLog 'Attach given virtual disk image to temporary virtual machine.' && \ + VBoxManage storageattach tmp --storagectl tmp --port 0 --device 0 \ + --type hdd --medium "$(dirname \ + "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \ + 'image_name')" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog "Needed temporary files generated in \"$temporaryConfigurationPath\" generated." && \ + clcLog "Take a snapshot with name or uuid \"$_VIRTUAL_BOX_SNAPSHOT_NAME\"." && \ + VBoxManage snapshot tmp take "$_VIRTUAL_BOX_SNAPSHOT_NAME" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ +## bash +## local virtualBoxSnapshotUUID="$(basename \ +## "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi | sed \ +## --regexp-extended 's/\{(.+)\}\..+/\1/g')" \ +## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + local virtualBoxSnapshotUUID="$(basename \ + "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi | sed \ + -r 's/\{(.+)\}\..+/\1/g')" 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ +## + echo "$virtualBoxSnapshotUUID" \ + 1>"$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH" 2>"$_ERROR_OUTPUT" && \ + clcLog "Created snapshot uuid is \"$virtualBoxSnapshotUUID\" (uuid saved to \"$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH\")." && \ + clcLog "Copy result to given target path \"$_TARGET_PATH\"." && \ + cp "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi "$_TARGET_PATH" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + # NOTE: Isn't possible because virtualbox tries to consolidate with + # readonly basic image. + #VBoxManage snapshot tmp delete "$_VIRTUAL_BOX_SNAPSHOT_NAME" \ + # 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + # NOTE: Isn't possible because virtual box has child images registered. + #VBoxManage closemedium disk "$(dirname \ + # "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \ + # 'image_name')" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog 'Detach given virtual disk image from temporary created virtual machine.' && \ + VBoxManage storageattach tmp --storagectl tmp --port 0 --device 0 \ + --medium none 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog 'Remove virtual dummy harddisk.' && \ + VBoxManage storagectl tmp --name tmp --remove \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog 'Unregister temporary created virtual machine.' && \ + VBoxManage unregistervm tmp 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ + clcLog 'Restore virtualbox home directory.' && \ +## bash +## rm --recursive --force ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" \ +## 2>"$_ERROR_OUTPUT" && \ +## cp --recursive "${temporaryConfigurationPath}virtualBoxBackup/" \ +## ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ +## rm --recursive --force "$temporaryConfigurationPath" && \ +## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + rm -rf ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ + cp -r "${temporaryConfigurationPath}virtualBoxBackup/" \ + ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + rm -rf "$temporaryConfigurationPath" && \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ +## + # NOTE: Virtualbox needs at least 5 seconds to register that it has + # a new configuration directory. + sleep 5 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" + local result=$? + if [[ "$_DEBUG" == 'no' ]]; then +## bash rm --recursive "$temporaryConfigurationPath" \ + rm -r "$temporaryConfigurationPath" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \ + return $? + fi + return $result + } + + # Creates a persistent version of given configuration file. + function clcCreatePersistentConfig() { + clcLog "Create a persistent configuration file version from \"$_BASIC_IMAGE_CONFIGURATION_FILE_PATH\" in \"$_TARGET_PATH\"." && \ + cp "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" "$_TARGET_PATH" && \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog 'Edit short description.' && \ +## bash sed --in-place --regexp-extended \ + sed -i -r \ + "s/(< *short_description[^>]*param=\"[^\"]*)(\")/\\1$_PERSISTENT_SHORT_DESCRIPTION_SUFFIX\\2/g" \ + "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog 'Append "original_xml_file_path" tag.' && \ +## bash +## sed --in-place --regexp-extended \ +## "s/^([ \\t]*)(< *persistent[^>]+param=\"[^\"]+\"[^>]*>)/\\1\\2\\n\\1<original_xml_file_path param=\"$(clcValidateSEDReplacement \ +## "$(readlink --canonicalize \ +## "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")")\"\/>/g" \ +## "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + sed -i -r \ + "s/^([ \\t]*)(< *persistent[^>]+param=\"[^\"]+\"[^>]*>)/\\1\\2\\n\\1<original_xml_file_path param=\"$(clcValidateSEDReplacement \ + "$(readlink -f \ + "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")")\"\/>/g" \ + "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ +## + clcLog 'Edit image file path.' && \ +## bash sed --in-place --regexp-extended \ + sed -i -r \ + "s/(< *image_name[^>]*param=\")[^\"]*(\")/\\1$(clcValidateSEDReplacement \ + "$_PERSISTENT_CONFIG_TARGET")\\2/g" "$_TARGET_PATH" \ + 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + clcLog 'Convert configuration file from windows style line endings to unix line endings.' && \ +## bash +## sed --in-place --regexp-extended 's/\r//g' "$_TARGET_PATH" \ +## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \ + sed -i -r 's/\r//g' "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" \ + 2>"$_ERROR_OUTPUT" && \ +## + return $? + } + + # endregion + +# endregion + +# region controller + + clcCommandLineInterface "$@" || return $? + if [[ "$_PERSISTENT_CONFIG_TARGET" ]]; then + clcCreatePersistentConfig || \ + clcLog 'error' 'Creating persistent configuration file failed.' + else + "clcCreate${_HYPERVISOR}Snapshot" || \ + clcLog 'error' 'Creating Linked Clone failed.' + fi + clcLog 'Program has successfully finished.' && \ + return $? + +# endregion + +} + +# region footer + +if [[ "$0" == *"${__NAME__}" ]]; then + "$__NAME__" "$@" +fi + +# endregion diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-run_virt b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-run_virt new file mode 100755 index 00000000..59cddfed --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-run_virt @@ -0,0 +1,602 @@ +#!/bin/bash +# Full bash required +# ----------------------------------------------------------------------------- +# Copyright (c) 2007..2010 - RZ Uni FR +# Copyright (c) 2007..2013 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# run-virt.sh +# - This is the generic wrapper for the several virtualization solutions. +# The idea is to setup a set of variables used by at least two different +# tools and then include the specific plugin which configures the speci- +# fied virtualization tool. +################################################################################ + +################################################################################ +### Define default dirs / get configs +################################################################################ + +VMCHOOSER_DIR="/opt/openslx/vmchooser" +VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config" + +# include general configuration from vmchooser +[ -f "$VMCHOOSER_CONF_DIR/vmchooser.conf" ] && . "$VMCHOOSER_CONF_DIR/vmchooser.conf" +# load general virtualization information +[ -f "$VMCHOOSER_CONF_DIR/virtualization.conf" ] && . "$VMCHOOSER_CONF_DIR/virtualization.conf" +# Load general openslx config +[ -f "/opt/openslx/config" ] && . "/opt/openslx/config" + +################################################################################ +### Functions used throughout the script +################################################################################ + +# function to write to stdout and logfile +LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log" +writelog () { + # write to stdout + echo -e "$1" + # log into file + echo -e "$1" >> "${LOGFILE}" +} + +# Clean exit will be called at the end of this script +cleanexit () { + sleep 1 + # remove config dirs when exit + if echo "${RMDIRS}" 2>/dev/null | grep -q "${xmlvirt}"; then + writelog "${xmlvirt} exited. Cleaning up... \c" + rm -rf -- ${RMDIRS} >/dev/null 2>&1 + writelog "done" + fi + # Disconnect dnbd3 device + if [ -n "$dnbd3" ]; then + for timeout in 1 1 2; do + dnbd3-client -d "$dnbd3" -c -d "$dnbd3" -c && break + writelog "dnbd3 still busy...." + sleep "$timeout" + done + fi + # Kill LPD + kill "$PID_LPD" + # Remove spool directory for printjobs from VM + [ -n "${SPOOLDIR}" ] && rm -rf -- "${SPOOLDIR}" + + [ $# -gt 0 ] && exit "$1" + exit 129 # No exit code was given :/ +} + +function rv_clean_string () +{ + if [ "$#" -ge 1 ]; then + echo "$@" | tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9]' + else + tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9]' + fi +} + +trap cleanexit SIGINT SIGTERM + +# check for important files used +filecheck () +{ + filecheck=$(LANG=us ls -lh ${diskfile} 2>&1) + writelog "Filecheck:\n${filecheck}\n" + 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 "Virtual Machine 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 by calling user + 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 have 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 +} + +################################################################################ +### Get XML file and dir +################################################################################ + +## Added for persistent support. +diskmode='nonpersistent' +if [[ "$(grep --extended-regexp \ + '< *short_description *param=".+ --persistent--"' "$1")" ]]; then + diskmode='persistent' + imageFilePath="$(grep -io '<image_path param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" + [ -z "$imageFilePath" ] && imageFilePath="$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" + originalXMLFilePath="$(grep -io '<original_xml_file_path param=.*"' "$1" \ + | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')" + originalImageFileName="$(grep -io '<image_name param=.*"' \ + "$originalXMLFilePath" | sed -e "s/&.*;/; /g" | awk -F '"' \ + '{ print $2 }')" + originalVMDKFilePath="$(dirname \ + "$originalXMLFilePath")/${originalImageFileName}" + # Added to workaround path prefix coming from temporary generated xml file + # by vmchooser. + if [[ "$(grep --extended-regexp '^/tmp/tmp\.[^\/]+/' <<< \ + "$imageFilePath")" ]]; then + imageFilePath=$(sed -r 's/^\/?tmp\/[^\/]+\///g' \ + <<< "$imageFilePath") + sed -ir \ + "s/(<image_name param=\")[^\"]*(\")/\\1$(sed -e \ + 's/\\/\\\\/g' -e 's/\//\\\//g' -e \ + 's/&/\\\&/g' <<< "$imageFilePath")\\2/g" "$1" + fi + # Create linked clone if not exists. + if [ ! -f "$imageFilePath" ]; then + mkdir -p "$(dirname "$imageFilePath")" && \ + bash "$(dirname "$0")/vmchooser-clc" "$originalXMLFilePath" \ + "$imageFilePath" --debug --verbose &>"${LOGFILE}" + fi +fi +## + +# absolute or relative path? +xmlfile=$1 +if ls "${xmlfile}" 2>/dev/null | grep '/' >/dev/null 2>&1; then + xmlpath=$(dirname "${xmlfile}") + xmlfile=$(basename "${xmlfile}") +else + xmlpath=${vmchooser_xmlpath} +fi +# full path +xmlfile="${xmlpath}/${xmlfile%.xml}.xml" + +DO_PROFILE="$(grep -c -E -i '<\s*profile\s*param="?(true|yes)"?' "$xmlfile")" + +################################################################################ +### Sanity checks +################################################################################ + +# test if the xml file is valid +if ! [ -r "${xmlfile}" ]; then + writelog "${xmlfile} not a readable XML file!" + slxlog "virt-nonreadable-xml" "XML file not readable: $xmlfile" + exit 1 +fi + +# test if XML file +if ! grep -q '<?xml' "${xmlfile}"; then + writelog "Submitted configuration file ${xmlfile} seems to have wrong XML format" + slxlog "virt-invalid-xml" "Malformed XML file: $xmlfile" "$xmlfile" + exit 1 +fi + +# check for running in graphical environment otherwise no much use here +if [ -z "$DISPLAY" ]; then + echo -e "\n\tStart only within a graphical desktop!\n" + exit 1 +fi + +################################################################################ +### Logo for console +################################################################################ + +cat <<EOL + __ __ + .----.--.--.-----.___.--.--.|__|.----.| |_ + | _| | | |___| | || || _|| _| + |__| |_____|__|__| \___/ |__||__| |____| + OpenSLX virtual machine environment preparation script ... + +EOL + +################################################################################ +### Read needed variables from XML file +################################################################################ + +writelog "Starting configuration..." +writelog "\tLogfile:\t\t${LOGFILE}" +writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c" +writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')" +writelog "\tVM XML dir:\t\t$(dirname "${xmlfile}")" +writelog "\tXML file:\t\t${xmlfile}" +writelog "Enable 3D:\t\t${enable3d}" +writelog "VM config:" + +# Name of the virt image +imgname=$(grep -io '<image_path param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') +imgrelpath=$(grep -io '<image_name param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') +[ -z "$imgname" ] && imgname="${imgrelpath}" + +## Added for persistent support. +if [[ "$userBranchFilePath" ]]; then + imgname="$userBranchFilePath" +fi +## + +# Imagename w/ full path +if echo "${imgname}" | grep -q '^/'; then + imgpath="$(dirname "${imgname}")" + imgname="$(basename "${imgname}")" + vmpath="${imgpath}/${imgname}" + # If old vmchooser binary stuff + # We do not need folder name as it is already included by vmchooser +elif echo "${xmlfile}" | grep -q '^/tmp/'; then + vmpath="$imgname" + imgname="$(basename "${imgname}")" +## Added for persistent support. +elif [[ "$userBranchFilePath" ]]; then + vmpath="$userBranchFilePath" +## + # Else use same path as xml +else + imgpath="${xmlpath}" + vmpath="${imgpath}/${imgname}" +fi + + +# Name of the virt machine, sed because of Windows formatting +vm_name=$(grep -o 'short_description param=.*"' "${xmlfile}" \ +| sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}') +# If ${vm_name} not defined use ${xmlfile} +vm_name="${vm_name:-${xmlfile%.xml}}" + +# Define vm_shortname since vm_name can be very long +vm_shortname="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")" + +# vm_name = displayname, define for old scripts +displayname="${vm_name}" + +# image is for the following virtual machine +xmlvirt=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \ +| sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}') + +# choose the proper virtualization/emulator plugin +[ "x${xmlvirt}" != "x" -a "x${xmlvirt}" != "xqemukvm" -a "x${xmlvirt}" != "xvirtualbox" -a "x${xmlvirt}" != "xvmware" ] && xmlvirt="emufe" + +# make a guess from the filename extension if ${xmlvirt} is empty +# (not set within the XML file) +# TODO: implement possibility to submit own configuration files +if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then + writelog "No virtual machine parameter defined in ${xmlfile}" + writelog "Trying to guess VM...\c" + case "$(cat ${additional_config} | tr \"[A-Z]\" \"[a-z]\")" in + *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*) + xmlvirt="vmware" + ;; + *innotek*|*virtualbox*) + xmlvirt="virtualbox" + ;; + *qemu*|*kvm*) + xmlvirt="qemukvm" + ;; + *) + xmlvirt="none" + ;; + esac + elif [ -z "${xmlvirt}" ]; then + case "$(echo ${imgname##*.} | tr \"[A-Z]\" \"[a-z]\")" in + vmdk) + xmlvirt="vmware" + ;; + vbox|vdi) + xmlvirt="virtualbox" + ;; + qcow*) + xmlvirt="qemukvm" + ;; + *) + xmlvirt="emufe" + ;; + esac + writelog "result:\t${xmlvirt}" +fi + +# Definition of the client system +vmostype=$(grep -io '<os param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }' | tr "[A-Z]" "[a-z]") + +# Definition of the networking the client system is connected to +network_kind=$(grep -io '<network param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }' | tr "[A-Z]" "[a-z]") +network_card=$(grep -io '<netcard param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]") +override_hddtype=$(grep -io '<hddtype param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]") + +# Set redirects to 0, see vmgrid if you want to define some +redirects=0 + +# Serial/parallel ports defined (e.g. "ttyS0" or "autodetect") +serial=$(grep -io '<serialport param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }') +parallel=$(grep -io '<parport param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }') + +writelog "\tVirtualization:\t\t$xmlvirt" +writelog "\tVM name:\t\t$vm_name" +writelog "\tVM short name:\t\t$vm_shortname" + +############################################################################### +### Declaration of default variables +############################################################################### + +# take last two digits of current pid... +VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2) + +# Make sure cpu_cores is not empty +cpu_cores=${cpu_cores:-"1"} + +# Amount of memory for the VM. Be generous if diff is written to HDD +if mount | grep -q '^/dev/sd.*on.*/tmp'; then + reserve=20 + min=768 + max=1536 +else + reserve=65 + min=768 + max=8192 +fi + +# Calculate absulute amount of RAM that should stay available to the host +reserve="$[ ( $totalmem * $reserve ) / 100 ]" +# Respect some upper and lower bounds for the host amount +[ "$reserve" -lt "$min" ] && reserve="$min" +[ "$reserve" -gt "$max" ] && reserve="$max" + +# Get a result which can be divided by 4 +mem="$[ ( ( $totalmem - $reserve ) / 4 ) * 4 ]" +if [ -n "$mainvirtmem" ]; then + forcemem="$[ "$mainvirtmem" / 4 * 4 ]" + mem="$forcemem" +fi +hostmem="$[ $totalmem - $mem ]" + +# TODO: We should only generate the suffix here (last 3 octets) as the first 3 are +# dependant on the virtualizer/emulator. Check if any run-virt.include still relies on +# $macguestpart/$macaddr. If so, fix it to use its specific first 3 bytes +# and append $macaddrssuffix +macguestpart="00:50:56:${VM_ID}" +machostpart=$(echo "${hostmacaddr}" | awk -F ":" '{print $(NF-1)":"$NF}') +macaddr=$(echo "${macguestpart}:${machostpart}" | tr "[a-z]" "[A-Z]") +macaddrsuffix=$(echo "${VM_ID}:${machostpart}" | tr "[a-z]" "[A-Z]") + +if ! echo "$macaddrsuffix" | grep -q -E '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$'; then + slxlog "virt-mac" "Could not properly generate mac address suffix (got $macaddrsuffix)" +fi + +# Virtual fd/cd/dvd and drive devices, floppy b: for configuration +# if $floppy_0 from virtualization.conf set then fdtest="TRUE" +fdtest=${floppy_0:+"TRUE"} +# if $fdtest not set floppy0="FALSE", else "TRUE" +floppy0=${fdtest:-"FALSE"} +floppy1="TRUE" +floppy1name="$VMCHOOSER_DIR/data/loopimg/fd.img" +# if $cdrom_0 from virtualization.conf set then cdtest="TRUE" +cdtest=${cdrom_0:+"TRUE"} +# if $cdtest not set cdrom0="FALSE", else "TRUE" +cdrom0=${cdtest:-"FALSE"} +# if $cdrom_1 from virtualization.conf set then cdtest="TRUE" +cdtest=${cdrom_1:+"TRUE"} +# if $cdtest not set cdrom1="FALSE", else "TRUE" +cdrom1=${cdtest:-"FALSE"} +# IDE is expected default, test for the virtual disk image type should +# be done while creating the runscripts ... +# TODO enable SCSI support instead of just disabling it. +ide="TRUE" +scsi="FALSE" +hddrv="ide" +audio="true" +remotedesktopport="590${VM_ID}" + + +# Enable 3D +enable3d=$(grep -i -o "<enable3d param=.*" "${xmlfile}" | awk -F '"' '{print $2}' | rv_clean_string) + +# Add rw share +sharepath="${HOME}/PERSISTENT" +sharename="home" + +# Set hostname: using original hostname and adding string +hostname="virt-$(hostname)" + +writelog "\tVM Hostname:\t\t$hostname" + +################################################################################ +### Setup the rest of the environment and run the configured vm +################################################################################ +# 8086:1e20 +if lspci -n | grep -E -i '8086:1e20( |$)'; then + VOL="100%" # bwPC 4: Speaker too quiet :-( +else + VOL="80%" +fi +# Adjust sound volume +amixer -q sset Master "$VOL" unmute 2>/dev/null +amixer -q sset PCM "$VOL" unmute 2>/dev/null +amixer -q sset CD "$VOL" unmute 2>/dev/null +amixer -q sset Headphone "$VOL" unmute 2>/dev/null +amixer -q sset Front "$VOL" unmute 2>/dev/null +amixer -q sset Speaker "$VOL" unmute 2>/dev/null # annoying built-in speaker +amixer -q sset 'Front Mic' "$VOL" unmute 2>/dev/null # to be checked if Mic is actually activated +amixer -q sset 'Rear Mic' "$VOL" unmute 2>/dev/null # =""= +amixer -q -c pcsp sset Master "0%" mute 2>/dev/null # fix random static noise when starting vmplayer when module snd_pcsp (not pcspkr) is loaded + +# Start printer daemon +QUEUE="STANDARD" # This has to match the queue you configured in your VM +USER="$(whoami)" +SPOOLDIR= +### Disabled: 100megs is not enough, some jobs are HUGE, try to use temp which should be on disk +## Try using user's tmpfs home first, as it gets wiped on logout +#if [ -n "${HOME}" ] && [ -w "${HOME}" ]; then +# SPOOLDIR="${HOME}/.spool" +# mkdir -p "${SPOOLDIR}/${QUEUE}" +#fi +# If failed, try to fall back to /tmp +if [ -z "${SPOOLDIR}" ] || [ ! -w "${SPOOLDIR}/${QUEUE}" ]; then + SPOOLDIR="/tmp/printergui-${USER}-$$-${RANDOM}" + rm -rf -- "${SPOOLDIR}" + if ! mkdir -p "${SPOOLDIR}/${QUEUE}"; then + slxlog "virt-spooldir" "Could not create spool directory ($SPOOLDIR) for $USER - printing will not work!" + # TODO: Warn user + fi + chmod 0700 "${SPOOLDIR}/${QUEUE}" +fi + +# Start the lpdaemon listening on the given port +# TODO: externalize with something like runtvirt.d (other parts might benefit from that too) +tcpsvd -E 192.168.101.1 5515 \ + lpd "$SPOOLDIR" \ + ash -c "/opt/openslx/cups/printergui '${USER}' \"${SPOOLDIR}/${QUEUE}/\$DATAFILE\"" & + +# PID to kill the process +PID_LPD="$!" + +# Copy guest configuration (with added information) config.xml to be accessed +# via virtual floppy +cp "$xmlfile" "$VMCHOOSER_DIR/fd-loop/config.xml" +# Add another file with resolution information +xrandr | grep -o -E 'connected\s*[0-9]+x[0-9]+\+0\+0' | grep -o -E '[0-9]+x[0-9]+' | head -n 1 > "$VMCHOOSER_DIR/fd-loop/hostres.txt" +# Add our magic openslx binary that sets the correct guest resolution +cp "$VMCHOOSER_DIR/data/openslx.exe" "$VMCHOOSER_DIR/fd-loop/" + +# Try to use dnbd3 to access the image +unset vm_diskfile +unset vm_revision +unset dnbd3 +unset dnbd3error +if [ -n "$SLX_DNBD3_SERVERS" -o -n "$SLX_DNBD3_PRIO_SERVERS" ] && [ "x$SLX_VM_DNBD3" = "xyes" ]; then + if [ -e "/dev/dnbd0" -a -e "/var/run/dnbd3.socket" ]; then + # Shuffle server list + [ -n "$SLX_DNBD3_SERVERS" ] && TMP_SERVERS=$(for SRV in $SLX_DNBD3_SERVERS; do echo "$RANDOM $SRV"; done | sort -u | sed -r 's/^[0-9]+ //') + for SRV in $SLX_DNBD3_PRIO_SERVERS $TMP_SERVERS; do + dnbd3=$(dnbd3-client -h "$SRV" -i "${imgrelpath}" -r 0) + RET=$? + if [ "$RET" = "0" ]; then + vm_revision=$(cat "/sys/block/${dnbd3#/dev/}/net/rid") + writelog "DNBD3: $vm_diskfile on $dnbd3 with rid $vm_revision" + vm_diskfile="$dnbd3" + vmpath="$vm_diskfile" + break + fi + dnbd3error="$dnbd3error ($RET/$dnbd3)" + usleep 200000 + done + if [ -z "$vm_diskfile" ]; then + slxlog "virt-dnbd3" "No dnbd3 server for ${imgrelpath} found ($SLX_DNBD3_PRIO_SERVERS $TMP_SERVERS $dnbd3error), trying NFS/CIFS..." + writelog "No working dnbd3 server found :-(" + fi + else + writelog "Won't use dnbd3 as it's not loaded, or the daemon is not running..." + fi +else + writelog "Won't use dnbd3 as no servers are given in config" +fi + +# $vm_diskfile will be empty if dnbd3 is not used or failed. Let's try to fall back to NFS/CIFS via file system +if [ -z "$vm_diskfile" ]; then + new_vmpath=$(ls "${vmpath}.r"* | grep -E -o '\.r[0-9]+$' | grep -o -E '[0-9]+' | sort -n | tail -1) + [ -n "$new_vmpath" ] && vmpath="${vmpath}.r${new_vmpath}" + vm_diskfile="$vmpath" +fi + +# Check if virtual machine container file exists +if ! [ -e "${vmpath}" ]; then + slxlog "virt-image-missing" "VM image $vmpath not found!" + writelog "Virtual machine image ${vmpath} not found!" + cleanexit 1 +fi + +writelog "Used diskfile: $vm_diskfile" + +# Get all virtual machine specific stuff from the respective include file +if [ ! -e "$VMCHOOSER_DIR/$xmlvirt/run-virt.include" ] ; then + # TODO: Tell user + slxlog "virt-plugin-missing" "Could not find run-virt.include for $xmlvirt ($VMCHOOSER_DIR/$xmlvirt/run-virt.include)" + writelog "Failed because of missing ${xmlvirt} plugin." + cleanexit 1 +fi + +self="${xmlvirt}" +if ! . "$VMCHOOSER_DIR/$xmlvirt/run-virt.include"; then + slxlog "virt-plugin-error" "run-virt.include for $xmlvirt could not be sourced (contains syntax errors?)" "$xmlvirt" + writelog "Erroneous run-virt.include for $xmlvirt" +fi + +# start a windowmanager for easier handling +# (expect problems w/ windows opening in background w/ vmware without wm) +for dm in openbox kwin xfwm4 metacity blackbox twm fvwm2 ; do + if which $dm >/dev/null 2>&1 ; then + if [ "$dm" = "fvwm2" ] ; then + echo "EdgeScroll 0 0" > ${redodir}/fvwm + fvwm2 -f ${redodir}/fvwm >/dev/null 2>&1 & + else + $dm >/dev/null 2>&1 & + fi + break + fi +done + +# Start poolvideoswitch if we find the autostarter file +#if [ -e /etc/xdg/autostart/pvsgui.desktop ]; then +# /usr/local/bin/pvsgui -p 2 -b >/dev/null 2>&1 & +#fi + +if [[ "$DO_PROFILE" -ge "1" ]]; then + wget "http://132.230.8.113/profile/do.php?action=start" & +fi + +# Check if tcpsvd is running. Do this down here so we do not check immediately after trying to spawn it, +# as this could result in success even if it's not really working +if ! kill -0 "$PID_LPD"; then + slxlog "virt-lpd" "Could not start tcpsvd/lpd for virtual machine session" +fi + +# Configure and start samba service to provide user's home directory +#if [ -f /usr/sbin/smbd ] ; then +# sudo /opt/openslx/bin/sed -i /opt/openslx/vmchooser/smb.conf -e "s,USER,$USER," +# sudo /usr/sbin/nmbd -s /opt/openslx/vmchooser/config/smb.conf +# sudo /usr/sbin/smbd -s /opt/openslx/vmchooser/config/smb.conf +#fi + +# This will start the VM +writelog "VM command: eval ${VIRTCMD} ${VIRTCMDOPTS}" +eval ${VIRTCMD} ${VIRTCMDOPTS} +# +writelog "Bye." + +# Postrun for commands after virtualization finishes +if [ -n "${POSTRUN}" ]; then + eval ${POSTRUN} >/dev/null 2>&1 +fi + + +cleanexit 0 + + diff --git a/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-xml_filter b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-xml_filter new file mode 100755 index 00000000..5fd8acc5 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/scripts/vmchooser-xml_filter @@ -0,0 +1,74 @@ +#!/bin/bash +# Probably needs bash somewhere +# ----------------------------------------------------------------------------- +# Copyright (c) 2007..2009 - RZ Uni FR +# Copyright (c) 2007..2011 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# xmlfilter.sh +# - This script is invoked by the vmchooser tool. It simply filters xml- +# files (taking the path to these files in $1). You might modify it in any +# way to match your needs, e.g. ask some database instead. You can re- +# implement it in any other programming language too. You simply have to +# return a list of proper xml files to be interpreted by the vmchooser +# binary). Please check for vmchooser.sh too ... +# ----------------------------------------------------------------------------- + +# This script . +# +# currently: +# - filter for slxgrp (which comes from /etc/machine-setup) +# + +# include default directories +. /opt/openslx/config + +if [ -f "${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf" ]; then + . "${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf" +fi + +function handlePersistentVM() { + if grep --extended-regexp -q "<persistent param=\"(|.+:)$USER(|:.+)\"" "$1"; then + # If this virtual machine is useable as persistent version for current + # user we provide an additional persistent version. + # TODO: This evil black magic needs to be rewritten some day (by someone who understands it) + local originalImagePath=$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') + local imageName=$(basename "$originalImagePath") + eval export SLX_VM_PERSISTENT_PATH="${SLX_VM_PERSISTENT_PATH}" && \ + local imagePath="${SLX_VM_PERSISTENT_PATH}${imageName}" + local persistentConfigVersionFilePath="$(mktemp --directory)/$(basename "$1")" + local vmchooserFilePath="$(dirname "$0")/vmchooser-clc" + if [ ! -f "$vmchooserFilePath" ]; then + vmchooserFilePath='/opt/openslx/scripts/vmchooser-clc' + fi + "$vmchooserFilePath" "$1" "$persistentConfigVersionFilePath" \ + --create-persistent-config "$imagePath" && \ + echo "$persistentConfigVersionFilePath" + fi +} + +for FILE in $(find -L "$1" -iname "*.xml"); do + # filter all xmls which aren't set active + grep -i -q "<active param=.*true.*" "$FILE" || continue + # HACK: filter all virtualbox images, as vbox is not ready yet + grep -i -q "<virtualmachine param=.*virtualbox.*" "$FILE" && continue + if [ -n "${SLX_VM_POOL_FILTER}" ]; then + # filter all xmls with pool-param not equal to vmchooser::env + if [ $(grep "<pools param=\"${SLX_VM_POOL_FILTER}\"" "$FILE" | wc -l) -eq 1 ]; then + handlePersistentVM "$FILE" + echo "$FILE" + fi + else + handlePersistentVM "$FILE" + # if there is no pool set, just take all available xmls + echo "$FILE" + fi +done + diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/smb.conf b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/smb.conf new file mode 100644 index 00000000..d8966f71 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/smb.conf @@ -0,0 +1,38 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2009..2013 - OpenSLX GmbH +# +# This program/file is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your feedback to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org +# ----------------------------------------------------------------------------- +# smb.conf +# - basic samba configuration file for OpenSLX host-internal networking +################################################################################ +[global] + workgroup = OPENSLX + netbios name = HOMESERVER + security = SHARE + server string = Home and Print Provider + bind interfaces only = Yes + interfaces = nat1 + pid directory = /run/samba + +[userhome] + comment = Home Directory of USER + path = /home/USER/PERSISTENT + create mask = 0700 + guest ok = No + read only = No + +[scratch] + comment = Host System Temp Folder + path = /tmp + create mask = 0700 + guest ok = Yes + read only = No + browseable = Yes + diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf new file mode 100644 index 00000000..bca1397c --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf @@ -0,0 +1,54 @@ +# Copyright (c) 2013 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# udhcpd.conf +# - This is the udhcpd configuration file servicing the nat1 interface for +# the various virtualization services. DNSSERVER and DOMAIN are replaced +# before deamon start in systemd script. +################################################################################ + +# start and end of the IP lease block +start 192.168.101.20 +end 192.168.101.100 +max_leases 80 + +# interface that udhcpd will use +interface nat1 + +# how long an offered address is reserved (leased) in seconds +offer_time 6000 + +# location of the leases file +lease_file /var/lib/udhcpd/udhcpd-nat1.leases + +# location of the pid file +pidfile /var/run/udhcpd-nat1.pid + +option dns DNSSERVER +option subnet 255.255.255.0 +option router 192.168.101.1 +option wins 192.168.101.10 +option domain DOMAIN virtual.site +option lprsrv 192.168.101.1 +#option ntpsrv NTPSERVER + +# additional options known to udhcpd not used in OpenSLX at the moment +#subnet #timezone +#router #timesvr +#namesvr #dns +#logsvr #cookiesvr +#lprsvr #bootsize +#domain #swapsvr +#rootpath #ipttl +#mtu #broadcast +#wins #lease +#ntpsrv #tftp +#bootfile #wpad + diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/vmchooser.conf b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/vmchooser.conf new file mode 100644 index 00000000..b4355880 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/config/vmchooser.conf @@ -0,0 +1,4 @@ +theme=bwlehrpool +pvs=0 +base=/mnt/vmstore + diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/bootpgm.exe b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/bootpgm.exe Binary files differnew file mode 100644 index 00000000..88f89418 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/bootpgm.exe diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/openslx.exe b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/openslx.exe Binary files differnew file mode 100755 index 00000000..8b320003 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/data/openslx.exe diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart new file mode 100755 index 00000000..86511458 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart @@ -0,0 +1,12 @@ +#!/bin/ash + +SOURCEPATH="/opt/openslx/vmchooser/sessionstart.d" + +if [ -d "$SOURCEPATH" ]; then + for file in $SOURCEPATH/*; do + . "$file" || slxlog "vmchooser-sessionstart" "Could not source $file at session start!" "$file" + done +fi + +exit 0 + diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png Binary files differnew file mode 100644 index 00000000..c9d8ab0d --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png Binary files differnew file mode 100644 index 00000000..8ca9347b --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini new file mode 100644 index 00000000..90d00617 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini @@ -0,0 +1,4 @@ +background-color=#ffffff +image-right=bwlehrpool-right.png +image-left=bwlehrpool-left.png + diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png Binary files differnew file mode 100644 index 00000000..900dd867 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png Binary files differnew file mode 100644 index 00000000..8ca9347b --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png diff --git a/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx.ini b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx.ini new file mode 100644 index 00000000..57a22821 --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/vmchooser/themes/openslx/openslx.ini @@ -0,0 +1,4 @@ +background-color=#ffffff +image-right=openslx-right.png +image-left=openslx-left.png + diff --git a/remote/modules/vmchooser2/data/opt/openslx/xsessions/default.desktop b/remote/modules/vmchooser2/data/opt/openslx/xsessions/default.desktop new file mode 100755 index 00000000..9d3a472d --- /dev/null +++ b/remote/modules/vmchooser2/data/opt/openslx/xsessions/default.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=virtual machine chooser (default) +Name[de]=Virtuelle Maschine auswählen +Comment=This session starts the vm session chooser +Comment[de]=Diese Sitzung startet das Auswahlmenü für die vorhandenen Sitzungen +Exec=/opt/openslx/bin/vmchooser -c /opt/openslx/vmchooser/config/vmchooser.conf +TryExec=/opt/openslx/bin/vmchooser +Icon= +Type=Application |