diff options
author | Oliver Tappe | 2007-06-20 20:04:19 +0200 |
---|---|---|
committer | Oliver Tappe | 2007-06-20 20:04:19 +0200 |
commit | 898eca2232289d3f64431bc3763da4b65bb3ae61 (patch) | |
tree | 2a213ff0429b76037a6cc0f2fbf9f99ec025ed2a /installer/OpenSLX/OSExport/Engine.pm | |
parent | * added support for invoking a chrooted shell for any installed vendor-OS, (diff) | |
download | core-898eca2232289d3f64431bc3763da4b65bb3ae61.tar.gz core-898eca2232289d3f64431bc3763da4b65bb3ae61.tar.xz core-898eca2232289d3f64431bc3763da4b65bb3ae61.zip |
* split export type into filesystem and (optional) blockdevice, closing
ticket#139
* code-reformatting with perltidy
git-svn-id: http://svn.openslx.org/svn/openslx/trunk@1176 95ad53e4-c205-0410-b2fa-d234c58c8868
Diffstat (limited to 'installer/OpenSLX/OSExport/Engine.pm')
-rw-r--r-- | installer/OpenSLX/OSExport/Engine.pm | 242 |
1 files changed, 142 insertions, 100 deletions
diff --git a/installer/OpenSLX/OSExport/Engine.pm b/installer/OpenSLX/OSExport/Engine.pm index 6668416a..5d08c177 100644 --- a/installer/OpenSLX/OSExport/Engine.pm +++ b/installer/OpenSLX/OSExport/Engine.pm @@ -14,13 +14,14 @@ package OpenSLX::OSExport::Engine; use vars qw(@ISA @EXPORT $VERSION); -$VERSION = 1.01; # API-version . implementation-version +$VERSION = 1.01; # API-version . implementation-version use Exporter; @ISA = qw(Exporter); @EXPORT = qw( - %supportedExportTypes %supportedDistros + %supportedExportFileSystems %supportedExportBlockDevices + @supportedExportTypes %supportedDistros ); use strict; @@ -30,28 +31,27 @@ use File::Basename; use OpenSLX::Basics; use OpenSLX::Utils; -use vars qw(%supportedExportTypes %supportedDistros); +use vars qw( + %supportedExportFileSystems %supportedExportBlockDevices + @supportedExportTypes %supportedDistros +); -%supportedExportTypes = ( - 'nfs' - => { module => 'NFS' }, - 'nbd' - => { module => 'NBD_Squash' }, +%supportedExportFileSystems = ( + 'nfs' => 'NFS', + 'sqfs' => 'SquashFS', ); +%supportedExportBlockDevices = ('nbd' => 'NBD', 'aoe' => 'AoE'); + +@supportedExportTypes = ('nfs', 'sqfs-aoe', 'sqfs-nbd'); + %supportedDistros = ( - '<any>' - => { module => 'Any' }, - 'debian' - => { module => 'Debian' }, - 'fedora' - => { module => 'Fedora' }, - 'gentoo' - => { module => 'Gentoo' }, - 'suse' - => { module => 'SUSE' }, - 'ubuntu' - => { module => 'Ubuntu' }, + '<any>' => {module => 'Any'}, + 'debian' => {module => 'Debian'}, + 'fedora' => {module => 'Fedora'}, + 'gentoo' => {module => 'Gentoo'}, + 'suse' => {module => 'SUSE'}, + 'ubuntu' => {module => 'Ubuntu'}, ); ################################################################################ @@ -61,55 +61,52 @@ sub new { my $class = shift; - my $self = { - }; + my $self = {}; return bless $self, $class; } sub initializeFromExisting { - my $self = shift; + my $self = shift; my $exportName = shift; my $openslxDB = instantiateClass("OpenSLX::ConfigDB"); $openslxDB->connect(); - my $export - = $openslxDB->fetchExportByFilter({'name' => $exportName}); + my $export = $openslxDB->fetchExportByFilter({'name' => $exportName}); if (!defined $export) { die _tr("Export '%s' not found in DB, giving up!", $exportName); } - my $vendorOS - = $openslxDB->fetchVendorOSByFilter({ 'id' => $export->{vendor_os_id} }); + my $vendorOS = + $openslxDB->fetchVendorOSByFilter({'id' => $export->{vendor_os_id}}); $openslxDB->disconnect(); - $self->_initialize($vendorOS->{name}, $vendorOS->{id}, - $export->{name}, $export->{type}); + $self->_initialize($vendorOS->{name}, $vendorOS->{id}, $export->{name}, + $export->{type}); } sub initializeForNew { - my $self = shift; + my $self = shift; my $vendorOSName = shift; - my $exportType = lc(shift); + my $exportType = lc(shift); my $openslxDB = instantiateClass("OpenSLX::ConfigDB"); $openslxDB->connect(); - my $vendorOS - = $openslxDB->fetchVendorOSByFilter({ 'name' => $vendorOSName }); + my $vendorOS = $openslxDB->fetchVendorOSByFilter({'name' => $vendorOSName}); if (!defined $vendorOS) { die _tr("vendor-OS '%s' not found in DB, giving up!", $vendorOSName); } - my $exportName = "$vendorOSName-$exportType"; + my $exportName = "$vendorOSName:$exportType"; $openslxDB->disconnect(); - $self->_initialize($vendorOS->{name}, $vendorOS->{id}, - $exportName, $exportType); + $self->_initialize($vendorOS->{name}, $vendorOS->{id}, $exportName, + $exportType); } sub exportVendorOS @@ -117,27 +114,37 @@ sub exportVendorOS my $self = shift; if (!$self->{'exporter'}->checkRequirements($self->{'vendor-os-path'})) { - die _tr("clients wouldn't be able to access the exported root-fs!\nplease install the missing module(s) or use another export-type."); + die _tr( + "clients wouldn't be able to access the exported root-fs!\nplease " + . "install the missing module(s) or use another export-type."); } - $self->{'exporter'}->exportVendorOS( - $self->{'vendor-os-path'}, - $self->{'export-path'} + $self->{'exporter'}->exportVendorOS($self->{'vendor-os-path'},); + vlog( + 0, + _tr( + "vendor-OS '%s' successfully exported to '%s'!", + $self->{'vendor-os-path'}, + $self->{exporter}->{'export-path'} + ) ); - vlog 0, _tr("vendor-OS '%s' successfully exported to '%s'!", - $self->{'vendor-os-path'}, $self->{'export-path'}); - $self->addExportToConfigDB(); + $self->_addExportToConfigDB(); } sub purgeExport { my $self = shift; - if ($self->{'exporter'}->purgeExport($self->{'export-path'})) { - vlog 0, _tr("export '%s' successfully removed!", - $self->{'export-path'}); - } - $self->removeExportFromConfigDB(); + if ($self->{'exporter'}->purgeExport()) { + vlog( + 0, + _tr( + "export '%s' successfully removed!", + $self->{exporter}->{'export-path'} + ) + ); + } + $self->_removeExportFromConfigDB(); } sub generateExportURI @@ -159,23 +166,28 @@ sub requiredFSMods ################################################################################ sub _initialize { - my $self = shift; + my $self = shift; my $vendorOSName = shift; - my $vendorOSId = shift; - my $exportName = shift; - my $exportType = lc(shift); - - if (!exists $supportedExportTypes{lc($exportType)}) { - print _tr("Sorry, export type '%s' is unsupported.\n", $exportType); - print _tr("List of supported export types:\n\t"); - print join("\n\t", sort keys %supportedExportTypes)."\n"; + my $vendorOSId = shift; + my $exportName = shift; + my $exportType = lc(shift); + + if (!grep { $_ eq $exportType } @supportedExportTypes) { + vlog(0, + _tr("Sorry, export type '%s' is unsupported.\n", $exportType) + . _tr("List of supported export types:\n\t") + . join("\n\t", sort @supportedExportTypes)); exit 1; } + $exportType =~ m[^(\w+)(?:-(\w+))?$]; + my $exportFS = lc($1); + my $exportBD = lc($2); + vlog(2, "export-fs='$exportFS' export-bd='$exportBD'"); $self->{'vendor-os-name'} = $vendorOSName; - $self->{'vendor-os-id'} = $vendorOSId; - $self->{'export-name'} = $exportName; - $self->{'export-type'} = $exportType; + $self->{'vendor-os-id'} = $vendorOSId; + $self->{'export-name'} = $exportName; + $self->{'export-type'} = $exportType; $vendorOSName =~ m[^(.+?\-[^-]+)]; my $distroName = $1; $self->{'distro-name'} = $distroName; @@ -194,55 +206,78 @@ sub _initialize } } my $distroModuleName = $supportedDistros{lc($distroName)}->{module}; - my $distro - = instantiateClass("OpenSLX::OSExport::Distro::$distroModuleName"); + my $distro = + instantiateClass("OpenSLX::OSExport::Distro::$distroModuleName"); $distro->initialize($self); $self->{distro} = $distro; # load module for the requested export type: - my $typeModuleName = $supportedExportTypes{lc($exportType)}->{module}; - my $exporter - = instantiateClass("OpenSLX::OSExport::ExportType::$typeModuleName"); - $exporter->initialize($self); + my $fsModuleName = $supportedExportFileSystems{$exportFS}; + my $exporter = + instantiateClass("OpenSLX::OSExport::FileSystem::$fsModuleName"); + if (length($exportBD)) { + my $blockModuleName = $supportedExportBlockDevices{$exportBD}; + my $blockDevice = + instantiateClass("OpenSLX::OSExport::BlockDevice::$blockModuleName"); + $blockDevice->initialize($self, $exporter); + $exporter->initialize($self, $blockDevice); + } else { + $exporter->initialize($self); + } $self->{'exporter'} = $exporter; # setup source and target paths: - $self->{'vendor-os-path'} - = "$openslxConfig{'private-path'}/stage1/$vendorOSName"; - my $exportBasePath = "$openslxConfig{'public-path'}/export"; - $self->{'export-path'} = "$exportBasePath/$exportType/$vendorOSName"; - vlog 1, _tr("vendor-OS from '%s' will be exported to '%s'", - $self->{'vendor-os-path'}, $self->{'export-path'}); + $self->{'vendor-os-path'} = + "$openslxConfig{'private-path'}/stage1/$vendorOSName"; + vlog( + 1, + _tr( + "vendor-OS from '%s' will be exported to '%s'", + $self->{'vendor-os-path'}, + $exporter->{'export-path'} + ) + ); } -sub addExportToConfigDB +sub _addExportToConfigDB { my $self = shift; my $openslxDB = instantiateClass("OpenSLX::ConfigDB"); $openslxDB->connect(); - my $export - = $openslxDB->fetchExportByFilter({ - 'name' => $self->{'export-name'}, + my $export = $openslxDB->fetchExportByFilter( + { + 'name' => $self->{'export-name'}, 'vendor_os_id' => $self->{'vendor-os-id'}, - }); + } + ); if (defined $export) { - vlog 0, _tr("No need to change export '%s' in OpenSLX-database.\n", - $self->{'export-name'}); + vlog( + 0, + _tr( + "No need to change export '%s' in OpenSLX-database.\n", + $self->{'export-name'} + ) + ); $self->{exporter}->showExportConfigInfo($export); } else { $export = { 'vendor_os_id' => $self->{'vendor-os-id'}, - 'name' => $self->{'export-name'}, - 'type' => $self->{'export-type'}, + 'name' => $self->{'export-name'}, + 'type' => $self->{'export-type'}, }; - + my $id = $self->{exporter}->addExportToConfigDB($export, $openslxDB); - vlog 0, _tr("Export '%s' has been added to DB (ID=%s)...\n", - $self->{'export-name'}, $id); + vlog( + 0, + _tr( + "Export '%s' has been added to DB (ID=%s)...\n", + $self->{'export-name'}, $id + ) + ); - $self->{exporter}->showExportConfigInfo($export) if $id; + $self->{exporter}->showExportConfigInfo($export) if $id; # now create a default system for that export, using the standard kernel: system("slxconfig add-system $self->{'export-name'}"); @@ -251,7 +286,7 @@ sub addExportToConfigDB $openslxDB->disconnect(); } -sub removeExportFromConfigDB +sub _removeExportFromConfigDB { my $self = shift; @@ -260,26 +295,32 @@ sub removeExportFromConfigDB # remove export from DB: my $exportName = $self->{'export-name'}; - my $export - = $openslxDB->fetchExportByFilter({ - 'name' => $exportName, - }); + my $export = $openslxDB->fetchExportByFilter({'name' => $exportName,}); if (!defined $export) { - vlog 0, _tr("Export '%s' doesn't exist in OpenSLX-database.\n", - $exportName); + vlog( + 0, + _tr( + "Export '%s' doesn't exist in OpenSLX-database.\n", $exportName + ) + ); } else { # remove all systems using this export and then remove the # export itself: - my @systemIDs - = map { $_->{id} } - $openslxDB->fetchSystemByFilter( - { 'export_id' => $export->{id} }, 'id' - ); - vlog 1, _tr("removing systems '%s' from DB, since they belong to the export being deleted.\n", - join ',', @systemIDs); + my @systemIDs = + map { $_->{id} } + $openslxDB->fetchSystemByFilter({'export_id' => $export->{id}}, 'id'); + vlog( + 1, + _tr( + "removing systems '%s' from DB, since they belong to the export" + . " being deleted.\n", + join ',', + @systemIDs + ) + ); $openslxDB->removeSystem(\@systemIDs); $openslxDB->removeExport($export->{id}); - vlog 0, _tr("Export '%s' has been removed from DB.\n", $exportName); + vlog(0, _tr("Export '%s' has been removed from DB.\n", $exportName)); } $openslxDB->disconnect(); @@ -301,3 +342,4 @@ OpenSLX::OSExport::Engine - ... =cut + |