From 742a41b032a9cf2681df8b70bff17dceac6f533c Mon Sep 17 00:00:00 2001 From: Oliver Tappe Date: Wed, 25 Jul 2007 16:59:50 +0000 Subject: * fixed bug in check for required kernel modules for distros that do not provide a vmlinuz-link (reported by Detlef Schulz) * filled void requirements check for NFS git-svn-id: http://svn.openslx.org/svn/openslx/trunk@1274 95ad53e4-c205-0410-b2fa-d234c58c8868 --- installer/OpenSLX/OSExport/FileSystem/Base.pm | 58 +++++++++++++++++++++++ installer/OpenSLX/OSExport/FileSystem/NFS.pm | 25 ++++++++++ installer/OpenSLX/OSExport/FileSystem/SquashFS.pm | 50 ++----------------- 3 files changed, 87 insertions(+), 46 deletions(-) (limited to 'installer') diff --git a/installer/OpenSLX/OSExport/FileSystem/Base.pm b/installer/OpenSLX/OSExport/FileSystem/Base.pm index 9ae263f9..009ec87d 100644 --- a/installer/OpenSLX/OSExport/FileSystem/Base.pm +++ b/installer/OpenSLX/OSExport/FileSystem/Base.pm @@ -18,7 +18,10 @@ use warnings; our $VERSION = 1.01; # API-version . implementation-version +use File::Basename; + use OpenSLX::Basics; +use OpenSLX::Utils; ################################################################################ ### interface methods @@ -66,6 +69,61 @@ sub showExportConfigInfo { } +################################################################################ +### implementation methods +################################################################################ +sub _pickKernelVersion +{ + my $self = shift; + my $vendorOSPath = shift; + + my $kernel = followLink("$vendorOSPath/boot/vmlinuz"); + if (!-e $kernel) { + # 'vmlinuz'-link doesn't exist, so we have to pick the kernel manually + my $osSetupEngine = instantiateClass("OpenSLX::OSSetup::Engine"); + $osSetupEngine->initialize($self->{engine}->{'vendor-os-name'}, 'none'); + $kernel = $osSetupEngine->pickKernelFile("$vendorOSPath/boot"); + } + my $kernelName = basename($kernel); + if ($kernelName !~ m[-(.+)$]) { + die _tr("unable to determine version of kernel '%s'!", $kernelName); + } + return $1; +} + +sub _locateKernelModule +{ + my $self = shift; + my $vendorOSPath = shift; + my $moduleName = shift; + my $defaultPaths = shift; + + vlog(1, _tr("locating kernel-module '%s'", $moduleName)); + # check default paths first: + foreach my $defPath (@$defaultPaths) { + vlog(2, "trying $defPath/$moduleName"); + my $target = followLink("$defPath/$moduleName", $vendorOSPath); + return $target unless !-e $target; + } + # use brute force to search for the newest incarnation of the module: + use File::Find; + my $location; + my $locationAge = 9999999; + vlog(2, "searching in $vendorOSPath/lib/modules"); + find sub { + return unless $_ eq $moduleName; + if (-M _ < $locationAge) { + $locationAge = -M _; + $location = $File::Find::name; + vlog(2, "located at $location (age=$locationAge days)"); + } + }, "$vendorOSPath/lib/modules"; + if (defined $location) { + return followLink($location, $vendorOSPath); + } + return; +} + 1; ################################################################################ diff --git a/installer/OpenSLX/OSExport/FileSystem/NFS.pm b/installer/OpenSLX/OSExport/FileSystem/NFS.pm index 878b956b..3233b10c 100644 --- a/installer/OpenSLX/OSExport/FileSystem/NFS.pm +++ b/installer/OpenSLX/OSExport/FileSystem/NFS.pm @@ -68,6 +68,31 @@ sub purgeExport return 1; } +sub checkRequirements +{ + my $self = shift; + my $vendorOSPath = shift; + + # determine most appropriate kernel version ... + my $kernelVer = $self->_pickKernelVersion($vendorOSPath); + + # ... and check if that kernel-version provides all the required modules + my $nfsMod = $self->_locateKernelModule( + $vendorOSPath, + 'nfs.ko', + [ + "$vendorOSPath/lib/modules/$kernelVer/kernel/fs/nfs", + "$vendorOSPath/lib/modules/$kernelVer/kernel/fs" + ] + ); + if (!defined $nfsMod) { + warn _tr("unable to find nfs-module for kernel version '%s'.", + $kernelVer); + return; + } + return 1; +} + sub generateExportURI { my $self = shift; diff --git a/installer/OpenSLX/OSExport/FileSystem/SquashFS.pm b/installer/OpenSLX/OSExport/FileSystem/SquashFS.pm index 82c4fdda..196a9206 100644 --- a/installer/OpenSLX/OSExport/FileSystem/SquashFS.pm +++ b/installer/OpenSLX/OSExport/FileSystem/SquashFS.pm @@ -97,15 +97,11 @@ sub checkRequirements { my $self = shift; my $vendorOSPath = shift; - my $kernel = shift || 'vmlinuz'; - my $info = shift; - $kernel = basename(followLink("$vendorOSPath/boot/$kernel")); - if ($kernel !~ m[-(.+)$]) { - die _tr("unable to determine version of kernel '%s'!", $kernel); - } - my $kernelVer = $1; - my @blockMods; + # determine most appropriate kernel version ... + my $kernelVer = $self->_pickKernelVersion($vendorOSPath); + + # ... and check if that kernel-version provides all the required modules my @blockModNames = $self->{'block-device'}->requiredBlockDeviceModules(); foreach my $blockModName (@blockModNames) { my $blockMod = @@ -118,7 +114,6 @@ sub checkRequirements ); return; } - push @blockMods, $blockMod; } my $squashfsMod = $self->_locateKernelModule( $vendorOSPath, @@ -133,10 +128,6 @@ sub checkRequirements $kernelVer); return; } - push @blockMods, $squashfsMod; - if (defined $info) { - $info->{'kernel-mods'} = \@blockMods; - } return 1; } @@ -280,39 +271,6 @@ sub _mapRsyncFilter2Regex ); } -sub _locateKernelModule -{ - my $self = shift; - my $vendorOSPath = shift; - my $moduleName = shift; - my $defaultPaths = shift; - - vlog(1, _tr("locating kernel-module '%s'", $moduleName)); - # check default paths first: - foreach my $defPath (@$defaultPaths) { - vlog(2, "trying $defPath/$moduleName"); - my $target = followLink("$defPath/$moduleName", $vendorOSPath); - return $target unless !-e $target; - } - # use brute force to search for the newest incarnation of the module: - use File::Find; - my $location; - my $locationAge = 9999999; - vlog(2, "searching in $vendorOSPath/lib/modules"); - find sub { - return unless $_ eq $moduleName; - if (-M _ < $locationAge) { - $locationAge = -M _; - $location = $File::Find::name; - vlog(2, "located at $location (age=$locationAge days)"); - } - }, "$vendorOSPath/lib/modules"; - if (defined $location) { - return followLink($location, $vendorOSPath); - } - return; -} - sub _addBlockDeviceTagToExport { my $self = shift; -- cgit v1.2.3-55-g7522