diff options
author | Oliver Tappe | 2006-09-08 21:47:01 +0200 |
---|---|---|
committer | Oliver Tappe | 2006-09-08 21:47:01 +0200 |
commit | 9bbf0e70c039889418f562db1fdcd1312f216df2 (patch) | |
tree | 4d5ba3b602ea8855fd9c7258a18641aa066d300d /config-db | |
parent | * renamed 'descr' to 'comment' (diff) | |
download | core-9bbf0e70c039889418f562db1fdcd1312f216df2.tar.gz core-9bbf0e70c039889418f562db1fdcd1312f216df2.tar.xz core-9bbf0e70c039889418f562db1fdcd1312f216df2.zip |
* changed configurable paths to be more flexible
* added automatic generation of initialramfs (via slxmkramfs).
git-svn-id: http://svn.openslx.org/svn/openslx/trunk@368 95ad53e4-c205-0410-b2fa-d234c58c8868
Diffstat (limited to 'config-db')
-rw-r--r-- | config-db/OpenSLX/Basics.pm | 34 | ||||
-rw-r--r-- | config-db/OpenSLX/ConfigDB.pm | 82 | ||||
-rwxr-xr-x | config-db/config-demuxer.pl | 110 |
3 files changed, 137 insertions, 89 deletions
diff --git a/config-db/OpenSLX/Basics.pm b/config-db/OpenSLX/Basics.pm index ea519458..9fecd10a 100644 --- a/config-db/OpenSLX/Basics.pm +++ b/config-db/OpenSLX/Basics.pm @@ -32,12 +32,15 @@ my $loadedTranslationModule; 'db-type' => 'CSV', 'locale' => $ENV{LANG}, # TODO: may need to be improved in order to be portable - 'private-basepath' => '/var/lib/openslx', - 'public-basepath' => '/srv/openslx', - 'shared-basepath' => '/usr/share/openslx', + 'config-path' => '/etc/opt/openslx', + 'openslx-basepath' => '/opt/openslx', + 'private-path' => '/var/opt/openslx', + 'public-path' => '/srv/openslx', 'temp-basepath' => '/tmp', ); -$openslxConfig{'db-basepath'} = "$openslxConfig{'private-basepath'}/db", +$openslxConfig{'db-basepath'} = "$openslxConfig{'private-path'}/db", +$openslxConfig{'bin-path'} = "$openslxConfig{'openslx-basepath'}/bin", +$openslxConfig{'share-path'} = "$openslxConfig{'openslx-basepath'}/share", # specification of cmdline arguments that are shared by all openslx-scripts: my %openslxCmdlineArgs = ( @@ -57,14 +60,21 @@ my %openslxCmdlineArgs = ( # locale to use for translations 'logfile=s' => \$openslxConfig{'locale'}, # file to write logging output to, defaults to STDERR - 'private-basepath=s' => \$openslxConfig{'private-basepath'}, - # basic path to private data (which is accessible for clients and + 'bin-path=s' => \$openslxConfig{'bin-path'}, + # path to binaries and scripts + 'config-path=s' => \$openslxConfig{'config-path'}, + # path to configuration files + 'openslx-basepath=s' => \$openslxConfig{'openslx-basepath'}, + # basic path to project files (binaries, functionality templates and + # distro-specs) + 'private-path=s' => \$openslxConfig{'private-path'}, + # path to private data (which is accessible for clients and # contains all data required for booting the clients) - 'public-basepath=s' => \$openslxConfig{'public-basepath'}, - # basic path to public data (which contains database, vendorOSes + 'public-path=s' => \$openslxConfig{'public-path'}, + # path to public data (which contains database, vendorOSes # and all local extensions [system specific scripts]) - 'shared-basepath=s' => \$openslxConfig{'shared-basepath'}, - # basic path to shared data (functionality templates and distro-specs) + 'share-path=s' => \$openslxConfig{'share-path'}, + # path to sharable data (functionality templates and distro-specs) 'temp-basepath=s' => \$openslxConfig{'temp-basepath'}, # basic path to temporary data (used during demuxing) 'verbose-level=i' => \$openslxConfig{'verbose-level'}, @@ -86,8 +96,8 @@ sub vlog sub openslxInit { # try to read and evaluate config files: - foreach my $f ("/etc/openslx/settings.default", - "/etc/openslx/settings.local", + foreach my $f ("$openslxConfig{'config-path'}/settings.default", + "$openslxConfig{'config-path'}/settings.local", "$ENV{HOME}/.openslx/settings") { next unless open(CONFIG, "<$f"); while(<CONFIG>) { diff --git a/config-db/OpenSLX/ConfigDB.pm b/config-db/OpenSLX/ConfigDB.pm index b9e69d77..3db779e2 100644 --- a/config-db/OpenSLX/ConfigDB.pm +++ b/config-db/OpenSLX/ConfigDB.pm @@ -52,7 +52,7 @@ my @aggregationExports = qw( mergeDefaultAttributesIntoSystem mergeDefaultAndGroupAttributesIntoClient aggregatedSystemIDsOfClient aggregatedClientIDsOfSystem - aggregatedKernelFilesOfSystem aggregatedInitramFilesOfSystem + aggregatedSystemFileInfosOfSystem ); my @supportExports = qw( @@ -146,6 +146,14 @@ sub _unique return grep { !$seenIDs{$_}++; } @_; } +sub _uniqueByKey +{ # return given array filtered to unique key elements + my $key = shift; + + my %seenIDs; + return grep { !$seenIDs{$_->{$key}}++; } @_; +} + ################################################################################ ### data access interface ################################################################################ @@ -418,8 +426,7 @@ sub setClientIDsOfSystem my $systemID = shift; my $clientIDs = _aref(shift); - my %seen; - my @uniqueClientIDs = grep { !$seen{$_}++ } @$clientIDs; + my @uniqueClientIDs = _unique(@$clientIDs); return $confDB->{'meta-db'}->setClientIDsOfSystem($systemID, \@uniqueClientIDs); } @@ -455,8 +462,7 @@ sub setGroupIDsOfSystem my $systemID = shift; my $groupIDs = _aref(shift); - my %seen; - my @uniqueGroupIDs = grep { !$seen{$_}++ } @$groupIDs; + my @uniqueGroupIDs = _unique(@$groupIDs); return $confDB->{'meta-db'}->setGroupIDsOfSystem($systemID, \@uniqueGroupIDs); } @@ -542,8 +548,7 @@ sub setSystemIDsOfClient my $clientID = shift; my $systemIDs = _aref(shift); - my %seen; - my @uniqueSystemIDs = grep { !$seen{$_}++ } @$systemIDs; + my @uniqueSystemIDs = _unique(@$systemIDs); return $confDB->{'meta-db'}->setSystemIDsOfClient($clientID, \@uniqueSystemIDs); } @@ -579,8 +584,7 @@ sub setGroupIDsOfClient my $clientID = shift; my $groupIDs = _aref(shift); - my %seen; - my @uniqueGroupIDs = grep { !$seen{$_}++ } @$groupIDs; + my @uniqueGroupIDs = _unique(@$groupIDs); return $confDB->{'meta-db'}->setGroupIDsOfClient($clientID, \@uniqueGroupIDs); } @@ -641,8 +645,7 @@ sub setClientIDsOfGroup my $groupID = shift; my $clientIDs = _aref(shift); - my %seen; - my @uniqueClientIDs = grep { !$seen{$_}++ } @$clientIDs; + my @uniqueClientIDs = _unique(@$clientIDs); return $confDB->{'meta-db'}->setClientIDsOfGroup($groupID, \@uniqueClientIDs); } @@ -678,8 +681,7 @@ sub setSystemIDsOfGroup my $groupID = shift; my $systemIDs = _aref(shift); - my %seen; - my @uniqueSystemIDs = grep { !$seen{$_}++ } @$systemIDs; + my @uniqueSystemIDs = _unique(@$systemIDs); return $confDB->{'meta-db'}->setSystemIDsOfGroup($groupID, \@uniqueSystemIDs); } @@ -766,9 +768,7 @@ sub aggregatedSystemIDsOfClient # add all systems inherited from default client push @systemIDs, fetchSystemIDsOfClient($confDB, 0); - my %seenIDs; - return grep { !$seenIDs{$_}++; } @systemIDs; - # return unique list + return _unique(@systemIDs); } sub aggregatedClientIDsOfSystem @@ -791,49 +791,37 @@ sub aggregatedClientIDsOfSystem # add all clients inherited from default system push @clientIDs, fetchClientIDsOfSystem($confDB, 0); - my %seenIDs; - return grep { !$seenIDs{$_}++; } @clientIDs; - # return unique list + return _unique(@clientIDs); } -sub aggregatedKernelFilesOfSystem -{ # return aggregated list of kernel-files this system is using - # (as indicated by itself and system's variants) +sub aggregatedSystemFileInfosOfSystem +{ # return aggregated list of hash-refs that contain information about + # the kernel- and initialramfs-files this system is using + # (as indicated by itself and the system's variants) my $confDB = shift; my $system = shift; my $vendorOS = fetchVendorOSesByID($confDB, $system->{vendor_os_id}); return () if !$vendorOS || !length($vendorOS->{path}); my $kernelPath - = "$openslxConfig{'private-basepath'}/stage1/$vendorOS->{path}"; + = "$openslxConfig{'private-path'}/stage1/$vendorOS->{path}"; my @variantIDs = fetchSystemVariantIDsOfSystem($confDB, $system->{id}); my @variants = fetchSystemVariantsByID($confDB, \@variantIDs); - my @kernelFiles = map { "$kernelPath/$_->{kernel}" } - grep { length($_->{kernel}) > 0 } - ($system, @variants); - return _unique(@kernelFiles); -} - -sub aggregatedInitramSetupsOfSystem -{ # return aggregated list of initialramfs-setups this system is using - # (as indicated by itself and system's variants) - my $confDB = shift; - my $system = shift; - - my $vendorOS = fetchVendorOSesByID($confDB, $system->{vendor_os_id}); - return () if !$vendorOS || !length($vendorOS->{path}); - my $kernelPath - = "$openslxConfig{'private-basepath'}/stage1/$vendorOS->{path}"; - - my @variantIDs = fetchSystemVariantIDsOfSystem($confDB, $system->{id}); - my @variants = fetchSystemVariantsByID($confDB, \@variantIDs); - - my @initramFiles = map { "$kernelPath/$_->{initramfs}" } - grep { length($_->{initramfs}) > 0 } - ($system, @variants); - return _unique(@initramFiles); + my @infos; + foreach my $sys ($system, @variants) { + next if !length($sys->{kernel}); + my %info = %$sys; + $info{'kernel-file'} = "$kernelPath/$sys->{kernel}"; + if (!defined $info{'name'}) { + # compose full name and label for system-variant: + $info{'name'} = "$system->{name}-$info{name_addition}"; + $info{'label'} = "$system->{label} $info{label_addition}"; + } + push @infos, \%info; + } + return _uniqueByKey('name', @infos); } ################################################################################ diff --git a/config-db/config-demuxer.pl b/config-db/config-demuxer.pl index dccbea7b..9c16abc1 100755 --- a/config-db/config-demuxer.pl +++ b/config-db/config-demuxer.pl @@ -14,7 +14,7 @@ use OpenSLX::ConfigDB qw(:access :aggregation :support); my $pxeConfigDefaultTemplate = q[# generated by openslx NOESCAPE 0 PROMPT 0 -TIMEOUT 100 +TIMEOUT 10 DEFAULT menu.c32 IMPLICIT 1 ALLOWOPTIONS 1 @@ -41,9 +41,9 @@ openslxInit(); my $openslxDB = connectConfigDB(); -my $configPath = "$openslxConfig{'private-basepath'}/config"; -if (!-d $configPath) { - die _tr("Unable to access config-path '%s'!", $configPath); +my $clientConfigPath = "$openslxConfig{'private-path'}/config"; +if (!-d $clientConfigPath) { + die _tr("Unable to access client-config-path '%s'!", $clientConfigPath); } my $tempPath = "$openslxConfig{'temp-basepath'}/oslx-demuxer"; if (!$dryRun) { @@ -52,7 +52,7 @@ if (!$dryRun) { die _tr("Unable to create or access temp-path '%s'!", $tempPath); } } -my $exportPath = "$openslxConfig{'public-basepath'}/tftpboot"; +my $exportPath = "$openslxConfig{'public-path'}/tftpboot"; if (!$dryRun) { system("rm -rf $exportPath/client-conf/* $exportPath/pxe/*"); system("mkdir -p $exportPath/client-conf $exportPath/pxe/pxelinux.cfg"); @@ -141,12 +141,12 @@ sub copyExternalSystemConfig mkdir $targetPath; # first copy default files... - my $defaultConfigPath = "$configPath/default"; + my $defaultConfigPath = "$clientConfigPath/default"; if (-d $defaultConfigPath) { system("cp -r $defaultConfigPath/* $targetPath"); } # now pour system-specific configuration on top (if any): - my $systemConfigPath = "$configPath/$systemName"; + my $systemConfigPath = "$clientConfigPath/$systemName"; if (-d $systemConfigPath) { system("cp -r $systemConfigPath/* $targetPath"); } @@ -174,56 +174,106 @@ sub createTarOfPath ################################################################################ sub writePXEMenus { - my $pxePath = "$exportPath/pxe/pxelinux.cfg"; + my $pxePath = "$exportPath/pxe"; + my $pxeConfigPath = "$exportPath/pxe/pxelinux.cfg"; - if (!-e "$exportPath/pxe/pxelinux.0") { + if (!-e "$pxePath/pxelinux.0") { my $pxelinux0Path - = "$openslxConfig{'shared-basepath'}/tftpboot/pxelinux.0"; - system(qq[cp -a "$pxelinux0Path" $exportPath/pxe/]); + = "$openslxConfig{'share-path'}/tftpboot/pxelinux.0"; + system(qq[cp -a "$pxelinux0Path" $pxePath/]); } - if (!-e "$exportPath/pxe/menu.c32") { + if (!-e "$pxePath/menu.c32") { my $menuc32Path - = "$openslxConfig{'shared-basepath'}/tftpboot/menu.c32"; - system(qq[cp -a "$menuc32Path" $exportPath/pxe/]); + = "$openslxConfig{'share-path'}/tftpboot/menu.c32"; + system(qq[cp -a "$menuc32Path" $pxePath/]); } my @clients = fetchClientsByFilter($openslxDB); foreach my $client (@clients) { my $externalClientID = externalIDForClient($client); - my $pxeFile = "$pxePath/$externalClientID"; + my $pxeFile = "$pxeConfigPath/$externalClientID"; + my $clientAppend = $client->{kernel_params}; vlog 1, _tr("writing PXE-file %s", $pxeFile); open(PXE, "> $pxeFile") or die "unable to write to $pxeFile"; print PXE $pxeConfigDefaultTemplate; my @systemIDs = aggregatedSystemIDsOfClient($openslxDB, $client); my @systems = fetchSystemsByID($openslxDB, \@systemIDs); foreach my $system (@systems) { - print PXE "LABEL openslx-$system->{name}\n"; -# print PXE "\tMENU DEFAULT\n"; - print PXE "\tMENU LABEL ^$system->{label}\n"; - my $kernel = basename($system->{kernel}); - print PXE "\tKERNEL $kernel\n"; - print PXE "\tAPPEND $system->{kernel_params}\n"; - print PXE "\tIPAPPEND 1\n"; + my @infos = aggregatedSystemFileInfosOfSystem($openslxDB, $system); + foreach my $info (@infos) { + my $extSysID = externalIDForSystem($info); + my $append = $system->{kernel_params}; + $append .= " initrd=$extSysID/initialramfs"; + $append .= " $clientAppend"; + $append .= " rootfs=nfs:///srv/openslx/nfsroot/suse-10.0"; + print PXE "LABEL openslx-$extSysID\n"; +# print PXE "\tMENU DEFAULT\n"; + print PXE "\tMENU LABEL ^$info->{label}\n"; + print PXE "\tKERNEL $extSysID/kernel\n"; + print PXE "\tAPPEND $append\n"; + print PXE "\tIPAPPEND 1\n"; + } } close(PXE); } } +sub generateInitalRamFS +{ + my $setup = shift; + my $vendorOS = shift; + my $pxeSysPath = shift; + + vlog 1, _tr('generating initialramfs %s/initialramfs', $pxeSysPath); + my $cmd = "$openslxConfig{'bin-path'}/slxmkramfs "; + if ($setup->{ramfs_use_glibc}) { + $cmd .= '-g '; + } + if ($setup->{ramfs_use_busybox}) { + $cmd .= '-b '; + } + my $debugLevel = $setup->{ramfs_debug_level}; + if ($debugLevel) { + $cmd .= qq[-d $debugLevel ]; + } + if (length($setup->{ramfs_nicmods}) > 0) { + $cmd .= qq[-n "$setup->{ramfs_nicmods}" ]; + } + if (length($setup->{ramfs_fsmods}) > 0) { + $cmd .= qq[-f "$setup->{ramfs_fsmods}" ]; + } + my $rootPath + = "$openslxConfig{'private-path'}/stage1/$vendorOS->{path}"; + $cmd .= "-i $pxeSysPath/initialramfs -r $rootPath"; + + $ENV{'SLX_PRIVATE_PATH'} = $openslxConfig{'private-path'}; + $ENV{'SLX_PUBLIC_PATH'} = $openslxConfig{'public-path'}; + $ENV{'SLX_SHARE_PATH'} = $openslxConfig{'share-path'}; + vlog 2, _tr('executing %s', $cmd); + system($cmd) unless $dryRun; +} + sub writeSystemPXEFiles { my $system = shift; my $pxePath = "$exportPath/pxe"; - my @kernelFiles = aggregatedKernelFilesOfSystem($openslxDB, $system); - foreach my $kernelFile (@kernelFiles) { - vlog 1, _tr('copying kernel %s to %s/', $kernelFile, $pxePath); - system(qq[cp -a "$kernelFile" $pxePath/]) unless $dryRun; + my $vendorOS = fetchVendorOSesByID($openslxDB, $system->{vendor_os_id}); + my @infos = aggregatedSystemFileInfosOfSystem($openslxDB, $system); + foreach my $info (@infos) { + my $kernelFile = $info->{'kernel-file'}; + my $extSysID = externalIDForSystem($info); + my $pxeSysPath = "$pxePath/$extSysID"; + if (-e $pxeSysPath) { + die _tr('PXE-system %s already exists!', $pxeSysPath); + } + mkdir $pxeSysPath; + vlog 1, _tr('copying kernel %s to %s/kernel', $kernelFile, $pxeSysPath); + system(qq[cp -a "$kernelFile" $pxeSysPath/kernel]) unless $dryRun; + + generateInitalRamFS($info, $vendorOS, $pxeSysPath); } -# foreach my $initramFile (aggregatedInitramFilesOfSystem($openslxDB, $system)) { -# vlog 1, _tr('copying initramfs %s to %s/', $initramFile, $pxePath); -# system(qq[cp -a "$initramFile" $pxePath/]) unless $dryRun; -# } } sub writeClientConfigurationsForSystem |