# Engine.pm - provides driver engine for the OSExport API. # # (c) 2006 - OpenSLX.com # # Oliver Tappe # package OpenSLX::OSExport::Engine; use vars qw(@ISA @EXPORT $VERSION); $VERSION = 1.01; # API-version . implementation-version use Exporter; @ISA = qw(Exporter); @EXPORT = qw( %supportedExportTypes %supportedDistros ); use strict; use Carp; use File::Basename; use OpenSLX::Basics; use vars qw(%supportedExportTypes %supportedDistros); %supportedExportTypes = ( 'nfs' => { module => 'NFS' }, 'nbd-squashfs' => { module => 'NBD_Squash' }, ); %supportedDistros = ( 'debian-3.1' => { module => 'Debian_3_1' }, 'debian-4.0' => { module => 'Debian_4_0' }, 'fedora-6' => { module => 'Fedora_6' }, 'fedora-6-x86_64' => { module => 'Fedora_6_x86_64' }, 'gentoo-2005.1' => { module => 'Gentoo_2005_1' }, 'gentoo-2006.1' => { module => 'Gentoo_2006_1' }, 'mandriva-2007.0' => { module => 'Mandriva_2007_0' }, 'suse-9.3' => { module => 'SUSE_9_3' }, 'suse-10.0' => { module => 'SUSE_10_0' }, 'suse-10.0-x86_64' => { module => 'SUSE_10_0_x86_64' }, 'suse-10.1' => { module => 'SUSE_10_1' }, 'suse-10.1-x86_64' => { module => 'SUSE_10_1_x86_64' }, 'suse-10.2' => { module => 'SUSE_10_2' }, 'suse-10.2-x86_64' => { module => 'SUSE_10_2_x86_64' }, 'ubuntu-6.06' => { module => 'Ubuntu_6_06' }, 'ubuntu-6.10' => { module => 'Ubuntu_6_10' }, ); ################################################################################ ### interface methods ################################################################################ sub new { my $class = shift; my $self = { }; return bless $self, $class; } sub initialize { my $self = shift; my $vendorOSName = shift; my $exportType = 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"; exit 1; } $self->{'vendor-os-name'} = $vendorOSName; $vendorOSName =~ m[^(.+?\-[^-]+)]; my $distroName = $1; $self->{'distro-name'} = $distroName; # load module for the requested distro: my $distroModule = "OpenSLX::OSExport::Distro::" .$supportedDistros{lc($distroName)}->{module}; unless (eval "require $distroModule") { if ($! == 2) { die _tr("Distro-module <%s> not found!\n", $distroModule); } else { die _tr("Unable to load distro-module <%s> (%s)\n", $distroModule, $@); } } my $modVersion = $distroModule->VERSION; if ($modVersion < 1.01) { die _tr('Could not load module <%s> (Version <%s> required, but <%s> found)', $distroModule, 1.01, $modVersion); } $distroModule->import; my $distro = $distroModule->new; $distro->initialize($self); $self->{distro} = $distro; # load module for the requested export type: my $exportTypeModule = "OpenSLX::OSExport::ExportType::" .$supportedExportTypes{lc($exportType)}->{module}; unless (eval "require $exportTypeModule") { if ($! == 2) { die _tr("Export-type-module <%s> not found!\n", $exportTypeModule); } else { die _tr("Unable to load export-type-module <%s> (%s)\n", $exportTypeModule, $@); } } my $modVersion = $exportTypeModule->VERSION; if ($modVersion < 1.01) { die _tr('Could not load module <%s> (Version <%s> required, but <%s> found)', $exportTypeModule, 1.01, $modVersion); } $exportTypeModule->import; my $exporter = $exportTypeModule->new; $exporter->initialize($self); $self->{'exporter'} = $exporter; # setup source and target paths: $self->{'vendor-os-path'} = "$openslxConfig{'stage1-path'}/$vendorOSName"; $self->{'export-path'} = "$openslxConfig{'export-path'}/$exportType/$vendorOSName"; vlog 1, _tr("vendor-OS from '%s' will be exported to '%s'", $self->{'vendor-os-path'}, $self->{'export-path'}); } sub exportVendorOS { my $self = shift; $self->{'exporter'}->exportVendorOS( $self->{'vendor-os-path'}, $self->{'export-path'} ); $self->addExportToConfigDB(); } ################################################################################ ### implementation methods ################################################################################ sub addExportToConfigDB { my $self = shift; print "adding the export to the config-DB is not implemented yet, sorry!\n"; return; my $configDBModule = "OpenSLX::ConfigDB"; unless (eval "require $configDBModule") { if ($! == 2) { vlog 1, _tr("ConfigDB-module not found, unable to access OpenSLX-database.\n"); } else { die _tr("Unable to load ConfigDB-module <%s> (%s)\n", $configDBModule, $@); } } else { my $modVersion = $configDBModule->VERSION; if ($modVersion < 1.01) { die _tr('Could not load module <%s> (Version <%s> required, but <%s> found)', $configDBModule, 1.01, $modVersion); } $configDBModule->import(qw(:access :manipulation)); my $openslxDB = connectConfigDB(); # insert new export if it doesn't already exist in DB: my $exportName = $self->{'vendor-os-name'}; my $export = fetchExportsByFilter( $openslxDB, { 'name' => $exportName }, 'id' ); if (defined $export) { changeExport( $openslxDB, { 'name' => $exportName, 'path' => $self->{'vendor-os-name'}, } ); vlog 0, _tr("Export <%s> has been updated in DB.\n", $exportName); } else { my $id = addExport( $openslxDB, { 'name' => $exportName, 'path' => $self->{'vendor-os-name'}, } ); vlog 0, _tr("Export <%s> has been added to DB (ID=%s).\n", $exportName, $id); } disconnectConfigDB($openslxDB); } } 1; ################################################################################ =pod =head1 NAME OpenSLX::OSExport::Engine - =head1 SYNOPSIS =head1 DESCRIPTION ... =cut