From 416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5 Mon Sep 17 00:00:00 2001 From: Sebastian Schmelzer Date: Thu, 2 Sep 2010 17:50:49 +0200 Subject: change dir structure --- .../plugins/vmchooser/OpenSLX/Distro/Base.pm | 64 ++++ .../plugins/vmchooser/OpenSLX/Distro/Debian.pm | 49 +++ .../plugins/vmchooser/OpenSLX/Distro/Suse.pm | 47 +++ .../plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm | 50 +++ .../vmchooser/OpenSLX/OSPlugin/vmchooser.pm | 143 ++++++++ src/os-plugins/plugins/vmchooser/README | 21 ++ src/os-plugins/plugins/vmchooser/XX_vmchooser.sh | 57 +++ .../plugins/vmchooser/files/default.desktop | 10 + src/os-plugins/plugins/vmchooser/files/mesgdisp | Bin 0 -> 222820 bytes src/os-plugins/plugins/vmchooser/files/mkdosfs | 1 + src/os-plugins/plugins/vmchooser/files/printer.sh | 10 + src/os-plugins/plugins/vmchooser/files/run-virt.sh | 402 +++++++++++++++++++++ src/os-plugins/plugins/vmchooser/files/scanner.sh | 4 + .../plugins/vmchooser/files/vm-template.xml | 60 +++ src/os-plugins/plugins/vmchooser/files/vmchooser | Bin 0 -> 1364048 bytes .../plugins/vmchooser/files/xmlfilter.sh | 50 +++ .../init-hooks/40-started-hw-config/run-virt.sh | 21 ++ .../init-hooks/80-after-plugins/virtualization.sh | 144 ++++++++ 18 files changed, 1133 insertions(+) create mode 100644 src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Base.pm create mode 100644 src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Debian.pm create mode 100644 src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Suse.pm create mode 100644 src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm create mode 100644 src/os-plugins/plugins/vmchooser/OpenSLX/OSPlugin/vmchooser.pm create mode 100644 src/os-plugins/plugins/vmchooser/README create mode 100644 src/os-plugins/plugins/vmchooser/XX_vmchooser.sh create mode 100644 src/os-plugins/plugins/vmchooser/files/default.desktop create mode 100755 src/os-plugins/plugins/vmchooser/files/mesgdisp create mode 120000 src/os-plugins/plugins/vmchooser/files/mkdosfs create mode 100755 src/os-plugins/plugins/vmchooser/files/printer.sh create mode 100644 src/os-plugins/plugins/vmchooser/files/run-virt.sh create mode 100755 src/os-plugins/plugins/vmchooser/files/scanner.sh create mode 100755 src/os-plugins/plugins/vmchooser/files/vm-template.xml create mode 100644 src/os-plugins/plugins/vmchooser/files/vmchooser create mode 100755 src/os-plugins/plugins/vmchooser/files/xmlfilter.sh create mode 100644 src/os-plugins/plugins/vmchooser/init-hooks/40-started-hw-config/run-virt.sh create mode 100644 src/os-plugins/plugins/vmchooser/init-hooks/80-after-plugins/virtualization.sh (limited to 'src/os-plugins/plugins/vmchooser') diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Base.pm new file mode 100644 index 00000000..43e4ea1f --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Base.pm @@ -0,0 +1,64 @@ +# Copyright (c) 2008 - 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/ +# ----------------------------------------------------------------------------- +# vmchooser/OpenSLX/Distro/Base.pm +# - provides base implementation of the Distro API for the vmchooser plugin. +# ----------------------------------------------------------------------------- +package vmchooser::OpenSLX::Distro::Base; + +use strict; +use warnings; + +our $VERSION = 1.01; # API-version . implementation-version + +use File::Basename; +use File::Path; +use Scalar::Util qw( weaken ); + +use OpenSLX::Basics; +use OpenSLX::Utils; + +################################################################################ +### interface methods +################################################################################ +sub new +{ + my $class = shift; + my $self = {}; + return bless $self, $class; +} + +sub initialize +{ + my $self = shift; + $self->{engine} = shift; + weaken($self->{engine}); + # avoid circular reference between plugin and its engine + + return 1; +} + + +sub copyDefaultSession +{ + my $self = shift; + my $pluginroot = shift; + + + # Take the default path of SuSE + # (as we have the most experience with it) + if( -f "/etc/X11/session/default.desktop") { + rename("/etc/X11/session/default.desktop", + "/etc/X11/session/default.desktop.back") + } + copyFile("$pluginroot/default.desktop","/etc/X11/session"); + + return 1; +} \ No newline at end of file diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Debian.pm new file mode 100644 index 00000000..173f249e --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Debian.pm @@ -0,0 +1,49 @@ +# Copyright (c) 2008 - 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/ +# ----------------------------------------------------------------------------- +# vmchooser/OpenSLX/Distro/Debian.pm +# - provides Debian implementation of the Distro API for the vmchooser plugin. +# ----------------------------------------------------------------------------- +package vmchooser::OpenSLX::Distro::Debian; + +use strict; +use warnings; + +our $VERSION = 1.01; # API-version . implementation-version + +use base qw(vmchooser::OpenSLX::Distro::Base); + +use File::Basename; +use File::Path; +use Scalar::Util qw( weaken ); + +use OpenSLX::Basics; +use OpenSLX::Utils; + +################################################################################ +### interface methods +################################################################################ + +sub copyDefaultSession +{ + my $self = shift; + my $pluginroot = shift; + + + # Take the default path of SuSE + # (as we have the most experience with it) + if( -f "/usr/share/xsessions/default.desktop") { + rename("/usr/share/xsessions/default.desktop", + "/usr/share/xsessions/default.desktop.back") + } + copyFile("$pluginroot/default.desktop","/usr/share/xsessions"); + + return 1; +} \ No newline at end of file diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Suse.pm new file mode 100644 index 00000000..c93a066b --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Suse.pm @@ -0,0 +1,47 @@ +# Copyright (c) 2008..2010 - 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/ +# ----------------------------------------------------------------------------- +# vmchooser/OpenSLX/Distro/Suse.pm +# - provides Suse implementation of the Distro API for the vmchooser plugin. +# ----------------------------------------------------------------------------- +package vmchooser::OpenSLX::Distro::Suse; + +use strict; +use warnings; + +our $VERSION = 1.01; # API-version . implementation-version + +use base qw(vmchooser::OpenSLX::Distro::Base); + +use File::Basename; +use File::Path; +use Scalar::Util qw( weaken ); + +use OpenSLX::Basics; +use OpenSLX::Utils; + +################################################################################ +### interface methods +################################################################################ + +sub copyDefaultSession +{ + my $self = shift; + my $pluginroot = shift; + + # Take the default path of SuSE + # (as we have the most experience with it) + if( -f "/etc/X11/session/default.desktop") { + rename("/etc/X11/session/default.desktop", + "/etc/X11/session/default.desktop.back") + } + copyFile("$pluginroot/default.desktop","/etc/X11/session"); + return 1; +} \ No newline at end of file diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm new file mode 100644 index 00000000..1677321f --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/OpenSLX/Distro/Ubuntu.pm @@ -0,0 +1,50 @@ +# Copyright (c) 2008 - 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/ +# ----------------------------------------------------------------------------- +# vmchooser/OpenSLX/Distro/Ubuntu.pm +# - provides Ubuntu implementation of the Distro API for the vmchooser plugin. +# ----------------------------------------------------------------------------- +package vmchooser::OpenSLX::Distro::Ubuntu; + +use strict; +use warnings; + +our $VERSION = 1.01; # API-version . implementation-version + +use base qw(vmchooser::OpenSLX::Distro::Base); + +use File::Basename; +use File::Path; +use Scalar::Util qw( weaken ); + +use OpenSLX::Basics; +use OpenSLX::Utils; + +################################################################################ +### interface methods +################################################################################ + + +sub copyDefaultSession +{ + my $self = shift; + my $pluginroot = shift; + + + # Take the default path of SuSE + # (as we have the most experience with it) + if( -f "/usr/share/xsessions/default.desktop") { + rename("/usr/share/xsessions/default.desktop", + "/usr/share/xsessions/default.desktop.back") + } + copyFile("$pluginroot/default.desktop","/usr/share/xsessions"); + + return 1; +} \ No newline at end of file diff --git a/src/os-plugins/plugins/vmchooser/OpenSLX/OSPlugin/vmchooser.pm b/src/os-plugins/plugins/vmchooser/OpenSLX/OSPlugin/vmchooser.pm new file mode 100644 index 00000000..71ce3637 --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/OpenSLX/OSPlugin/vmchooser.pm @@ -0,0 +1,143 @@ +# Copyright (c) 2008, 2009 - 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/ +# ----------------------------------------------------------------------------- +# vmchooser.pm +# - allows user to pick from a list of virtual machine images +# +# - serves as base for virtualizer plugins / and requires one of these +# ----------------------------------------------------------------------------- +package OpenSLX::OSPlugin::vmchooser; + +use strict; +use warnings; + +use base qw(OpenSLX::OSPlugin::Base); + +use OpenSLX::Basics; +use OpenSLX::Utils; + +sub new +{ + my $class = shift; + + my $self = { + name => 'vmchooser', + }; + + return bless $self, $class; +} + +sub getInfo +{ + my $self = shift; + + return { + description => unshiftHereDoc(<<' End-of-Here'), + allows user to pick from a list of different virtual machine images + based on xml-files, which tell about available images. One of the + virtualization tools like vmware*, virtualbox or qemu/kvm is + required. + End-of-Here + precedence => 50, + required => [ qw( desktop ) ], + }; +} + +sub getAttrInfo +{ + my $self = shift; + + return { + 'vmchooser::active' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + should the 'vmchooser'-plugin be executed during boot? + End-of-Here + content_regex => qr{^(0|1)$}, + content_descr => '1 means active - 0 means inactive', + default => '1', + }, + 'vmchooser::env' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + environment, seperates pools based on XML configuration + End-of-Here + #TODO: + #content_regex => qr{^(0|1)$}, + content_descr => 'name of environment', + default => 'default', + }, + 'vmchooser::xmlpath' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + location of XML configuration for virtual images + End-of-Here + #TODO: + #content_regex => qr{^(0|1)$}, + content_descr => 'path to xml files', + default => '/var/lib/virt', + }, + + }; +} + +sub installationPhase +{ + my $self = shift; + my $info = shift; + + my $pluginRepoPath = $info->{'plugin-repo-path'}; + my $openslxBasePath = $info->{'openslx-base-path'}; + + # copy all needed files now: + my $pluginName = $self->{'name'}; + my $pluginBasePath = "$openslxBasePath/lib/plugins/$pluginName/files"; + foreach my $file ( qw( vmchooser printer.sh scanner.sh xmlfilter.sh + default.desktop mesgdisp run-virt.sh ) ) { + copyFile("$pluginBasePath/$file", "$pluginRepoPath/"); + chmod 0755, "$pluginRepoPath/$file"; + } + + # set ditro-specific default session + $self->{distro}->copyDefaultSession($pluginRepoPath); + + return; +} + +sub removalPhase +{ + my $self = shift; + my $info = shift; + + return; +} + +sub copyRequiredFilesIntoInitramfs +{ + my $self = shift; + my $targetPath = shift; + my $attrs = shift; + my $makeInitRamFSEngine = shift; + my $pluginRepoPath = "$openslxConfig{'base-path'}/lib/plugins/vmchooser"; + + $makeInitRamFSEngine->addCMD( + "cp -a $pluginRepoPath/files/mkdosfs $targetPath/bin" + ); + + vlog(1, _tr("vmchooser-plugin: ...")); + + return; +} + +1; + diff --git a/src/os-plugins/plugins/vmchooser/README b/src/os-plugins/plugins/vmchooser/README new file mode 100644 index 00000000..29434bcc --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/README @@ -0,0 +1,21 @@ + +VirtualMachine Chooser - plugin +=============================== + +This Plugin uses an additionally provided program to display a list of virtual +machine sessions (vm's provided by other plugins), from which a user can choose. + +This Programm is included in binary format. You can look into the sources at +svn://svn.openslx.org/srv/svn/openslx/openslx-src-tools/os-plugins/plugins/vmchooser/ + +There you can change the program to your needs and compile it with the included +Makefile. + +Additionally the plugin provides a script to start a specific virtual machine +preconfigured. Parts of the configuration are taken from an xml file which +should be provided with each container file. You will find additional infor- +mation online at: http://lab.openslx.org/wiki/openslx/Vmchooser + +Use at your own risk! No warranty is given by the author of this software for +any purposes! + diff --git a/src/os-plugins/plugins/vmchooser/XX_vmchooser.sh b/src/os-plugins/plugins/vmchooser/XX_vmchooser.sh new file mode 100644 index 00000000..168bcda1 --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/XX_vmchooser.sh @@ -0,0 +1,57 @@ +# Copyright (c) 2008, 2009 - RZ Uni Freiburg +# Copyright (c) 2008..2010 - 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 +# +# script is included from init via the "." load function - thus it has all +# variables and functions available + +# include default directories +. /etc/openslx.conf + +CONFFILE="/initramfs/plugin-conf/vmchooser.conf" +PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser +BINDIR=/mnt/${OPENSLX_DEFAULT_BINDIR} +PLUGINDIR=${OPENSLX_DEFAULT_DIR}/plugin-repo/vmchooser +VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR} + +if [ -e $CONFFILE ]; then + . $CONFFILE + if [ $vmchooser_active -ne 0 ] ; then + [ $DEBUGLEVEL -gt 0 ] \ + && echo "vmchooser: copying stage3 configuration file ..." + testmkd ${PLUGINCONFDIR}/loopimg + testmkd ${PLUGINCONFDIR}/fd-loop 1777 + cp $CONFFILE ${PLUGINCONFDIR}/vmchooser.conf + ln -s ${PLUGINDIR}/run-virt.sh ${BINDIR}/run-virt.sh + ln -s ${PLUGINDIR}/vmchooser ${BINDIR}/vmchooser + + # setup all generic virtualization / starting stuff like the floppy image + # loop file for exchanging information between linux and vm guest + if modprobe ${MODPRV} loop; then + mdev -s + else + : #|| error "" nonfatal + fi + # 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 ${PLUGINCONFDIR}/loopimg + # create an empty floppy image of 1.4MByte size + dd if=/dev/zero of=${PLUGINCONFDIR}/loopimg/fd.img count=2880 bs=512 \ + 2>/dev/null + chmod 0777 ${PLUGINCONFDIR}/loopimg/fd.img + # use dos formatter copied into stage3 + mkdosfs ${PLUGINCONFDIR}/loopimg/fd.img >/dev/null 2>&1 #|| error + mount -n -t msdos -o loop,umask=000 ${PLUGINCONFDIR}/loopimg/fd.img \ + ${PLUGINCONFDIR}/fd-loop + + # finished ... + [ $DEBUGLEVEL -gt 0 ] && echo "done with 'vmchooser' os-plugin ..." + fi +fi diff --git a/src/os-plugins/plugins/vmchooser/files/default.desktop b/src/os-plugins/plugins/vmchooser/files/default.desktop new file mode 100644 index 00000000..91540228 --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/files/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/plugin-repo/vmchooser/vmchooser +TryExec=/opt/openslx/plugin-repo/vmchooser/vmchooser +Icon= +Type=Application diff --git a/src/os-plugins/plugins/vmchooser/files/mesgdisp b/src/os-plugins/plugins/vmchooser/files/mesgdisp new file mode 100755 index 00000000..41e3721c Binary files /dev/null and b/src/os-plugins/plugins/vmchooser/files/mesgdisp differ diff --git a/src/os-plugins/plugins/vmchooser/files/mkdosfs b/src/os-plugins/plugins/vmchooser/files/mkdosfs new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/files/mkdosfs @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/src/os-plugins/plugins/vmchooser/files/printer.sh b/src/os-plugins/plugins/vmchooser/files/printer.sh new file mode 100755 index 00000000..8f1d5ffa --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/files/printer.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +#echo " some pseudo printer " + +for(( i=0; $i<10; i=$i+1)); do + echo -e "printserver$i\tprinter$i\tPrinter Description $i" +done + +echo -e "printserver.ruf.uni-freiburg.de\treal-printer-name\tSome really long printer Description" + diff --git a/src/os-plugins/plugins/vmchooser/files/run-virt.sh b/src/os-plugins/plugins/vmchooser/files/run-virt.sh new file mode 100644 index 00000000..23f026c7 --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/files/run-virt.sh @@ -0,0 +1,402 @@ +#!/bin/bash +# ----------------------------------------------------------------------------- +# Copyright (c) 2007..2010 - RZ Uni FR +# Copyright (c) 2007..2010 - 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. +################################################################################ + +. /etc/opt/openslx/openslx.conf + +################################################################################ +### Define default dirs / get configs +################################################################################ + +PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins +PLUGINCONFDIR=${PLUGINCONFROOT}/vmchooser +# include general configuration from vmchooser +[ -f ${PLUGINCONFROOT}/vmchooser/vmchooser.conf ] && \ + . ${PLUGINCONFROOT}/vmchooser/vmchooser.conf +# load general virtualization information +[ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \ + . ${PLUGINCONFROOT}/virtualization/virtualization.conf + +################################################################################ +### Functions used throughout the script +################################################################################ + +# function to write to stdout and logfile +LOGFILE=${OPENSLX_DEFAULT_LOGDIR}/run-virt.${USER}.$$.log +writelog () { + # write to stdout + echo -e "$1" + # log into file + echo -e "$1" >> ${LOGFILE} +} + +# remove config dirs when exit +cleanexit () { + if echo "${RMDIRS}" 2>/dev/null | grep -q ${xmlvirt}; then + writelog "${xmlvirt} exited. Cleanning up... \c" + rm -rf ${RMDIRS} >/dev/null 2>&1 + writelog "done" + fi + + exit "$1" +} + +# 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 +################################################################################ + +# 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" + +################################################################################ +### Sanity checks +################################################################################ + +# test if the xml file is valid +if ! [ -r "${xmlfile}" ]; then + writelog "${xmlfile} not a readable XML file!" + exit 1 +fi + +# test if XML file +if ! grep '/dev/null 2>&1; then + writelog \ + "Submitted configuration file ${xmlfile} seems to have wrong XML format" + exit 1 +fi + +# Theck for running in graphical environment otherwise no much use here +[ -z "$DISPLAY" ] && echo -e "\n\tStart only within a graphical desktop!\n" \ + && exit 1 + +################################################################################ +### Logo for console +################################################################################ + +cat </dev/null | grep -q '^/' >/dev/null 2>&1; 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} 2>/dev/null | grep -q '^/tmp/' >/dev/null 2>&1; then + vmpath=$imgname + imgname=$(basename ${imgname}) +# else use same path as xml +else + imgpath=${xmlpath} + vmpath=${imgpath}/${imgname} +fi + +# check if virtual machine container file exists +if ! [ -e "${vmpath}" ]; then + writelog "Virtual machine image ${vmpath} not found!" + exit 1 +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}') + +# 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) + xmlvirt="virtualbox" + ;; + img|qcow*) + xmlvirt="qemukvm" + ;; + *) + xmlvirt="none" + ;; + esac + writelog "result:\t${xmlvirt}" +fi + +# definition of the client system +vmostype=$(grep -io '/dev/null| grep -ve "^$") +xres=$(echo "${hostres}" | awk '{print $3}') +yres=$(echo "${hostres}" | awk '{print $7}') + +# enable 3D +enable3d=$(grep -i "/dev/null | \ + awk -F '=' {'print $2'}) + +# add rw share +sharepath="${HOME}" +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 +################################################################################ + +# Adjust sound volume +writelog "Unmuting sound...\c " +amixer -q sset Master 80% unmute 2>/dev/null +amixer -q sset PCM 80% unmute 2>/dev/null +amixer -q sset CD 80% unmute 2>/dev/null +amixer -q sset Headphone 80% unmute 2>/dev/null +amixer -q sset Front 80% umute 2>/dev/null # in SUSE 11.0 it's headphone +amixer -q sset Speaker 0 mute 2>/dev/null # annoying built-in speaker +writelog "finished\n" + +# Copy guest configuration (with added information) config.xml to be accessed +# via virtual floppy +# fixme -> to be changed (vmchooser adapts the file content!?) +#TODO: wozu echo? +#echo "Please fix the config.xml generation" +cp ${xmlfile} ${PLUGINCONFDIR}/fd-loop/config.xml + +# Check if virtual machine container file exists +#filecheck + +# Get all virtual machine specific stuff from the respective include file +if [ -e ${PLUGINCONFROOT}/${xmlvirt}/run-virt.include ] ; then + self=${xmlvirt} + . ${PLUGINCONFROOT}/${xmlvirt}/run-virt.include + # start a windowmanager for easier handling + # (expect problems /w windows opening in background /w vmware without wm) + for dm in xfwm4 metacity openbox blackbox kwin 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 + ${VIRTCMD} ${VIRTCMDOPTS} + writelog "Bye." + cleanexit 0 +else + writelog "Failed because of missing ${xmlvirt} plugin." + cleanexit 1 +fi + +# postrun for scripts after virtualization finishes +if [ -n "${POSTRUN}" ]; then + eval ${POSTRUN} >/dev/null 2>&1 +fi + +cleanexit 0 +exit 0 diff --git a/src/os-plugins/plugins/vmchooser/files/scanner.sh b/src/os-plugins/plugins/vmchooser/files/scanner.sh new file mode 100755 index 00000000..dcb94c68 --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/files/scanner.sh @@ -0,0 +1,4 @@ +#!/bin/bash + + +echo -e "scanserver\tscanner1hp\tThis is a test Scanner" diff --git a/src/os-plugins/plugins/vmchooser/files/vm-template.xml b/src/os-plugins/plugins/vmchooser/files/vm-template.xml new file mode 100755 index 00000000..f6b59fea --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/files/vm-template.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + <!-- description shown when image is chosen --> + <description>Image for lectures with a lot of software: office, ... + </description> + <!-- if active="true" the image is selectable via vmchooser --> + <active param="true"/> + <!-- in which environment this image will be selectable via vmchooser --> + <environment param="default"/> + <!-- image locked with a password? --> + <locked param="false"/> + <creator param="Your Name"/> + <email param="your@e-mail.add"/> + <phone param="0123-12345678"/> + <!-- when should this image be deactivated automatically --> + <valid_until param="DD-MM-YY"/> + <!-- type of the OS: if you do not know use "other" --> + <!-- vmware refer to: http://sanbarrow.com/vmx/vmx-guestos.html --> + <os param="winxppro"/> + <!-- "nat", "bridge", "hostonly" --> + <network param="nat"/> + <!-- use a different virtual network card than default --> + <netcard param="e1000"/> + <!-- activate serial port: "ttyS0", "auto" (recommended) --> + <serialport param="false"/> + <!-- activate parallel port: "parport0" (recommended) --> + <parport param="false"/> + <!-- enable 3D support --> + <enable3d param="true"/> + <!-- which shared folders should be connected --> + <shared_folders param="true"> + <!-- name="Home" path="/home/$USER" for internal VMware sf --> + <shared_folder name="" path="" pass=""></shared_folder> + </shared_folders> + <!-- which printers should be connected --> + <printers> + <printer name="" path="">Human readable description</printer> + </printers> + <!-- which scanners should be connected --> + <scanners> + <scanner name="" path="">Description</scanner> + </scanners> + <!-- added automatically through vmchooser when started + <username param="user-id"/> + --> + <!-- obsolete, maybe for future implementations + <xdm param="false"> + </xdm> + --> + </entry> +</settings> diff --git a/src/os-plugins/plugins/vmchooser/files/vmchooser b/src/os-plugins/plugins/vmchooser/files/vmchooser new file mode 100644 index 00000000..fc12e0fe Binary files /dev/null and b/src/os-plugins/plugins/vmchooser/files/vmchooser differ diff --git a/src/os-plugins/plugins/vmchooser/files/xmlfilter.sh b/src/os-plugins/plugins/vmchooser/files/xmlfilter.sh new file mode 100755 index 00000000..5196992c --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/files/xmlfilter.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# ----------------------------------------------------------------------------- +# Copyright (c) 2007..2009 - RZ Uni FR +# Copyright (c) 2007..2009 - 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 +. /etc/opt/openslx/openslx.conf + +if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf ]; then + . ${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf +fi + +for FILE in $1/*.xml; do + # filter all xmls which aren't set active + if [ $(grep "<active param=.*true.*" ${FILE} | wc -l) -eq 1 ]; then + if [ -n ${vmchooser_env} ]; then + # filter all xmls with pool-param not equal to vmchooser::env + if [ $(grep "<pools param=\"${vmchooser_env}\"" ${FILE} | wc -l) -eq 1 ];\ + then + echo ${FILE}; + fi + else + # if there is no pool set, just take all available xmls + echo -e ${active} + fi + fi +done diff --git a/src/os-plugins/plugins/vmchooser/init-hooks/40-started-hw-config/run-virt.sh b/src/os-plugins/plugins/vmchooser/init-hooks/40-started-hw-config/run-virt.sh new file mode 100644 index 00000000..7f1ae20d --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/init-hooks/40-started-hw-config/run-virt.sh @@ -0,0 +1,21 @@ +# Copyright (c) 2009 - RZ Uni Freiburg +# Copyright (c) 2009 - 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 +# +# Stage3 part of 'vmchooser' plugin - this script detects additionally to the +# the standard hardware configuration the availability of optical and floppy +# drives for virtual machines. +# +# The script is included from init via the "." load function - thus it has all +# variables and functions available. + +waitfor /tmp/hwcfg +( hwinfo --cdrom | grep -i "Device File:" | awk {'print $3'} >/etc/hwinfo.cdrom ) & +( hwinfo --floppy | grep -i "Device File:" | awk {'print $3'} >/etc/hwinfo.floppy ) & diff --git a/src/os-plugins/plugins/vmchooser/init-hooks/80-after-plugins/virtualization.sh b/src/os-plugins/plugins/vmchooser/init-hooks/80-after-plugins/virtualization.sh new file mode 100644 index 00000000..73a65ac5 --- /dev/null +++ b/src/os-plugins/plugins/vmchooser/init-hooks/80-after-plugins/virtualization.sh @@ -0,0 +1,144 @@ +# Copyright (c) 2010 - RZ Uni Freiburg +# Copyright (c) 2010 - 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 +# +# script is included from init via the "." load function - thus it has all +# variables and functions available + +# virtual virtualization plugin +# make sure that this file is the same in vmgrid and vmchooser plugin! + +# include default directories +. /etc/openslx.conf + +CONFFILEVMCHOOSER="/initramfs/plugin-conf/vmchooser.conf" +CONFFILEVMGRID="/initramfs/plugin-conf/vmgrid.conf" +PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualization + +# check if plugins available +active=0 +[ -f ${CONFFILEVMCHOOSER} ] && . ${CONFFILEVMCHOOSER} +[ "x${vmchooser_active}" = "x1" ] && active=1 +[ -f ${CONFFILEVMGRID} ] && . ${CONFFILEVMGRID} +[ "x${vmgrid_active}" = "x1" ] && active=1 + +[ $DEBUGLEVEL -gt 0 ] \ + && echo -e "Executing the 'virtualization' plugin ... \c" + +if [ ${active} -ne 0 ] ; then + + # load general configuration + . /etc/initramfs-setup + # include functions + . /etc/functions + + testmkd ${PLUGINCONFDIR} + + # check if vmgrid active and change free mem + totalmem=$(expr $(grep -i "memtotal" /proc/meminfo \ + | awk '{print $2}') / 1024) + echo "totalmem=${totalmem}" >> ${PLUGINCONFDIR}/virtualization.conf + + if [ "x${vmgrid_active}" = "x1" ]; then + + totalmemtest=$(expr $(echo ${vmgrid_memratio} \ + | awk -F ',' '{print $1" + "$2" + "$3" + "$4" + "$5" + "$6}')) + + # not more than 100% memory assigned + if [ ${totalmemtest} -le 100 2>/dev/null ]; then + + # host mem + hostratio=$(echo ${vmgrid_memratio} | awk -F ',' '{print $6}') + hostmem=$(expr ${totalmem} \* ${hostratio} / 100 2>/dev/null) + if [ ${hostmem} -lt 256 2>/dev/null ]; then + # min. 256 MB for host + hostmem=256 + fi + + # main vm mem (vmchooser) + if [ "x${vmchooser_active}" = "x1" ]; then + mainvirtratio=$(echo ${vmgrid_memratio} | awk -F ',' '{print $5}') + mainvirtmem=$(expr ${totalmem} \* ${mainvirtratio} / 100 2>/dev/null) + if [ ${mainvirtmem} -lt 512 2>/dev/null ]; then + # min. 512 for vmchooser + mainvirtmem=512 + fi + else + mainvirtratio=0 + mainvirtmem=0 + fi + + cat << EOF >> ${PLUGINCONFDIR}/virtualization.conf +hostratio=${hostratio} +hostmem=${hostmem} +mainvirtratio=${mainvirtratio} +mainvirtmem=${mainvirtmem} +EOF + + fi + fi + + # cpu cores + CPU_CORES=$(grep 'processor.*:' /proc/cpuinfo | wc -l) + if [ "${CPU_CORES}" -gt "1" 2>/dev/null ]; then + echo "cpu_cores=${CPU_CORES}" \ + >> ${PLUGINCONFDIR}/virtualization.conf + else + echo 'cpu_cores=1' >> ${PLUGINCONFDIR}/virtualization.conf + fi + + # arch + echo "host_arch=$(uname -m)" >> ${PLUGINCONFDIR}/virtualization.conf + + # VT enabled cpu? + if grep -q ^flags.*\\\<vmx\\\> /proc/cpuinfo; then + echo "vtflag=1" >> ${PLUGINCONFDIR}/virtualization.conf + echo 'kvm_module="kvm_intel"' >> ${PLUGINCONFDIR}/virtualization.conf + elif grep -q ^flags.*\\\<svm\\\> /proc/cpuinfo; then + echo "vtflag=1" >> ${PLUGINCONFDIR}/virtualization.conf + echo 'kvm_module="kvm_amd"' >> ${PLUGINCONFDIR}/virtualization.conf + else + echo "vtflag=0" >> ${PLUGINCONFDIR}/virtualization.conf + fi + + # write mac + echo "hostmacaddr=${macaddr}" >> ${PLUGINCONFDIR}/virtualization.conf + # ip addr + echo "hostip=${clientip}" >> ${PLUGINCONFDIR}/virtualization.conf + # hostname + echo "hostname=${host_name}" >> ${PLUGINCONFDIR}/virtualization.conf + + # get further hw information + waitfor /etc/hwinfo.cdrom + j=0 + for i in $(cat /etc/hwinfo.cdrom); do + echo "cdrom_$j=$i" >> ${PLUGINCONFDIR}/virtualization.conf + j=$(expr $j + 1) + done + + waitfor /etc/hwinfo.floppy + j=0 + for i in $(cat /etc/hwinfo.floppy); do + echo "floppy_$j=$i" >> ${PLUGINCONFDIR}/virtualization.conf + j=$(expr $j + 1) + done + + # copy host information to rwshare of vmgrid plugin + if [ "x${vmgrid_active}" = "x1" ]; then + cp ${PLUGINCONFDIR}/virtualization.conf ${vmgrid_rwmnt}/host.conf + fi + + # finished ... + [ $DEBUGLEVEL -gt 0 ] \ + && echo "ok" +else + [ $DEBUGLEVEL -gt 0 ] \ + && echo "failed" +fi -- cgit v1.2.3-55-g7522