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 --- .../virtualbox/OpenSLX/OSPlugin/virtualbox.pm | 284 +++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm (limited to 'src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm') diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm new file mode 100644 index 00000000..07ec9dc0 --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm @@ -0,0 +1,284 @@ +# Copyright (c) 2009..2010 - RZ Uni Freiburg +# Copyright (c) 2009..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/ +# ----------------------------------------------------------------------------- +# virtualbox.pm +# - declares necessary information for the virtualbox plugin +# ----------------------------------------------------------------------------- +package OpenSLX::OSPlugin::virtualbox; + +use strict; +use warnings; + +use base qw(OpenSLX::OSPlugin::Base); + +use File::Basename; +use File::Path; + +use OpenSLX::Basics; +use OpenSLX::Utils; +use OpenSLX::DistroUtils; + +sub new +{ + my $class = shift; + my $self = { + name => 'virtualbox', + }; + + return bless $self, $class; +} + +sub getInfo +{ + my $self = shift; + + return { + description => unshiftHereDoc(<<' End-of-Here'), + Module for enabling services for the VirtualBox on an OpenSLX + stateless client. + End-of-Here + precedence => 70, + # headless mode does not require a desktop! + #required => [ qw( desktop ) ], + }; +} + +sub getAttrInfo +{ + # Returns a hash-ref with information about all attributes supported + # by this specific plugin + my $self = shift; + + # This default configuration will be added as attributes to the default + # system, such that it can be overruled for any specific system by means + # of slxconfig. + return { + # attribute 'active' is mandatory for all plugins + 'virtualbox::active' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + should the 'virtualbox'-plugin be executed during boot? + End-of-Here + content_regex => qr{^(0|1)$}, + content_descr => '1 for active, 0 for inactive', + default => '1', + }, + # attribute 'imagesrc' defines where we can find virtualbox images + 'virtualbox::imagesrc' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Where do we store our virtualbox images? NFS? Filesystem? + End-of-Here + content_regex => qr{^(/|nfs://)}, + content_descr => 'local path or URI or "-" (unset)', + default => undef, + }, + # attribute 'bridge' defines if bridged network mode should be + # switched on + # TODO: change to net -> nat, bridge, hostonly? + # TODO: since we use def in XML maybe use to override + 'virtualbox::bridge' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Should the bridging (direct access of the virtualbox clients + to the ethernet the host is connected to) be enabled + End-of-Here + content_regex => qr{^(0|1)$}, + content_descr => '0 or 1', + default => '1', + }, + # attribute 'mem' defines if memory should be forced + 'virtualbox::mem' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Do you want to force a ralative amount of RAM? + (Not implemented right now!) + End-of-Here + content_regex => qr{^(\d\d??)$}, + content_descr => 'Between 0 - 99', + default => undef, + }, + # attribute 'kvm' defines if KVM modules should be forced + 'virtualbox::kvm' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Do you want to force the usage of KVM modules where applicable? + (Not implemented right now!) + End-of-Here + content_regex => qr{^(0|1)$}, + content_descr => '0 or 1', + default => undef, + }, + # attribute 'tftpdir' defines TFTP dir for network boots /w NAT + 'virtualbox::tftpdir' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Do you want to define a stage 4 TFTP dir for netwoork boots when + using NAT? + Hint: Mount your TFTP ro via NFS to a local dir + End-of-Here + content_regex => qr{^(/)}, + content_descr => 'local path or "-" (unset)', + default => '/var/lib/virt/virtualbox', + }, + }; +} + +sub installationPhase +{ + my $self = shift; + my $info = shift; + + $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'}; + $self->{pluginTempPath} = $info->{'plugin-temp-path'}; + $self->{openslxBasePath} = $info->{'openslx-base-path'}; + $self->{openslxConfigPath} = $info->{'openslx-config-path'}; + $self->{attrs} = $info->{'plugin-attrs'}; + + my $engine = $self->{'os-plugin-engine'}; + + # Different names of the tool (should be unified somehow!?) + if (!isInPath('VirtualBox')) { + # todo: fix this + $self->{distro}->installVbox(); + } + if (!isInPath('VirtualBox')) { + print + "VirtualBox is not installed. VirtualBox Plugin won't be installed!\n" + ; + #exit + } + + $self->_writeRunlevelScript(); + + # Copy run-virt.include and template files to the appropriate place for + # inclusion in stage4 + my $pluginName = $self->{'name'}; + my $pluginBasePath = + "$self->{openslxBasePath}/lib/plugins/$pluginName/files"; + foreach my $file ( qw( run-virt.include virtualbox.include machine.include + empty-diff.vdi.gz rwimg.vdi.gz ) ) { + copyFile("$pluginBasePath/$file", "$self->{pluginRepositoryPath}/"); + chmod 0644, "$self->{pluginRepositoryPath}/$file"; + } + + return; +} + +sub removalPhase +{ + my $self = shift; + my $info = shift; + + return; +} + +sub checkStage3AttrValues +{ + my $self = shift; + my $stage3Attrs = shift; + my $vendorOSAttrs = shift; + #my @problems; + + #my $vmimg = $stage3Attrs->{'virtualbox::imagesrc'} || ''; + + return; +} + +# Write the runlevelscript +sub _writeRunlevelScript +{ + my $self = shift; + my $initfile = newInitFile(); + my $script = ""; + + $initfile->setName("vbox-slx"); + $initfile->setDesc("Setup environment for virtualbox. Part of OpenSLX virtualbox plugin."); + + # todo: Function need to be formated proper... not important right now + $initfile->addFunction( + 'running', + 'lsmod | grep -q "$1[^_-]"' + ); + # + $script = unshiftHereDoc(<<' End-of-Here'); + if running vboxdrv; then + if running vboxnetflt; then + echo "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded." + else + echo "VirtualBox kernel module is loaded." + fi + #TODO: check it: ignore user check. handling our own way: + for i in /tmp/.vbox-*-ipc; do + echo "Running: " + $(VBoxManage -q list runningvms | sed -e 's/^".*"//' 2>/dev/null) + done + else + echo "VirtualBox kernel module(s) are not loaded." + fi + End-of-Here + $initfile->addFunction( + "vmstatus", + "$script" + ); + $initfile->addFunction( + 'start', + ' modprobe -qa vboxdrv vboxnetflt vboxnetadp', + ); + $initfile->addFunction( + 'stop', + ' rmmod vboxnetadp vboxnetflt vboxdrv', + ); + $initfile->addToCase( + 'start', + 'start' + ); + $initfile->addToCase( + 'stop', + 'stop' + ); + $initfile->addToCase( + 'status', + 'vmstatus' + ); + $initfile->addToCase( + 'restart', + 'stop && start' + ); + + # get distro version + my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0]; + my $runlevelscript = getInitFileForDistro($initfile, $distro); + + spitFile("$self->{'pluginRepositoryPath'}/vbox-slx", $runlevelscript); +} + +# The bridge configuration needs the bridge module to be present in early +# stage3 +sub suggestAdditionalKernelModules +{ + my $self = shift; + my $makeInitRamFSEngine = shift; + + my @suggestedModules; + + push @suggestedModules, qw( bridge ); + + return @suggestedModules; +} + +1; -- cgit v1.2.3-55-g7522