summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Tappe2006-09-08 21:47:01 +0200
committerOliver Tappe2006-09-08 21:47:01 +0200
commit9bbf0e70c039889418f562db1fdcd1312f216df2 (patch)
tree4d5ba3b602ea8855fd9c7258a18641aa066d300d
parent* renamed 'descr' to 'comment' (diff)
downloadcore-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
-rw-r--r--config-db/OpenSLX/Basics.pm34
-rw-r--r--config-db/OpenSLX/ConfigDB.pm82
-rwxr-xr-xconfig-db/config-demuxer.pl110
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