From 6c0f5af254eca9e3b093052e1cae898e3b1a7c38 Mon Sep 17 00:00:00 2001 From: Oliver Tappe Date: Sun, 31 Aug 2008 15:41:30 +0000 Subject: * refactored slxconfig-demuxer and boot environment implementations such that demuxing to more than a single boot environment is supported now * renamed boot environment CD to PREBOOT_CD git-svn-id: http://svn.openslx.org/svn/openslx/openslx/trunk@2160 95ad53e4-c205-0410-b2fa-d234c58c8868 --- config-db/slxconfig-demuxer | 129 +++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 67 deletions(-) (limited to 'config-db/slxconfig-demuxer') diff --git a/config-db/slxconfig-demuxer b/config-db/slxconfig-demuxer index accd64e7..75b4a03c 100755 --- a/config-db/slxconfig-demuxer +++ b/config-db/slxconfig-demuxer @@ -162,14 +162,7 @@ if (!$option{dryRun}) { } } -my $tftpbootPath = "$openslxConfig{'public-path'}/tftpboot"; -my $tftpbuildPath = "$openslxConfig{'public-path'}/tftpboot.new"; -if (!$option{dryRun}) { - mkpath([$tftpbootPath]); - mkpath("$tftpbuildPath/client-config"); -} - -my $rsyncDeleteClause; +my $deleteInFinalize = 0; my @demuxableSystems = grep { $_->{name} ne '<<>>' } $openslxDB->fetchSystemByFilter(); @@ -191,13 +184,11 @@ if (@ARGV) { } push @targetSystems, $system; } - $rsyncDeleteClause = ''; } else { # create initramfs for all systems @targetSystems = @demuxableSystems; - # let rsync delete old files - $rsyncDeleteClause = '--delete'; + $deleteInFinalize = 1; } writeConfigurations(); @@ -207,22 +198,18 @@ my $errCount = $systemErrCount ? $systemErrCount : 'no'; my $statusString = $systemErrCount ? "$errCount system(s) had errors" : 'all systems ok'; print "\n", unshiftHereDoc(<<"End-of-Here"); - $wr $systemConfCount system- and $clientSystemConfCount client-specific configurations to $tftpbootPath/client-config + $wr $systemConfCount system-specific and $clientSystemConfCount client-specific configurations $initramfsCount initramfs were created $statusString End-of-Here $openslxDB->disconnect(); -if (!$option{dryRun}) { - rmtree([$tempPath]); - my $rsyncCmd = "rsync -a $rsyncDeleteClause --delay-updates $tftpbuildPath/ $tftpbootPath/"; - slxsystem($rsyncCmd) == 0 - or die _tr( - "unable to rsync files from '%s' to '%s'! (%s)", - $tftpbuildPath, $tftpbootPath, $! - ); - rmtree([$tftpbuildPath]); +rmtree([$tempPath]); + +# allow all boot-environments to clean up and active the new configuration +foreach my $bootEnv (values %bootEnvMap) { + $bootEnv->finalize($deleteInFinalize); } exit; @@ -317,7 +304,7 @@ sub copyExternalSystemConfig my $targetPath = shift; my $clientName = shift; # optional - if ($targetPath !~ m[$tempPath]) { + if ($targetPath !~ m[^$tempPath]) { # bail if target-path isn't within temp folder, as we do not dare # executing 'rm -rf' in that case! die _tr("system-error: illegal target-path <%s>!", $targetPath); @@ -370,13 +357,14 @@ sub createTarOfPath sub bootEnvironmentForType { - my $bootType = uc(shift || 'pxe'); + my $bootType = shift || 'pxe'; + + $bootType =~ tr{[a-z]\-}{[A-Z]_}; if (!$bootEnvMap{$bootType}) { my $bootEnv = instantiateClass("OpenSLX::BootEnvironment::$bootType"); $bootEnv->initialize( { - 'target-path' => $tftpbuildPath, - 'dry-run' => $option{dryRun}, + 'dry-run' => $option{dryRun}, } ); $bootEnvMap{$bootType} = $bootEnv; } @@ -410,32 +398,6 @@ sub writeBootloaderMenus return; } -sub writeBootEnvironmentForSystem -{ - my $info = shift; - my $buildPath = shift; - my $clients = shift || []; - - # handle all different kinds of "preboot-" environments (PXE, CD, grub, ...) - my %bootTypes; - foreach my $client (@$clients) { - my $type = $client->{boot_type} || 'pxe'; - $bootTypes{$type}++; - } - foreach my $bootType (sort keys %bootTypes) { - vlog(0, _tr("copying kernel and creating initramfs for $bootType boot")); - - my $bootEnv = bootEnvironmentForType($bootType); - $bootEnv->writeFilesRequiredForBooting( - $info, $buildPath, $slxVersion - ); - - $initramfsCount++; - } - - return; -} - sub writeDhcpConfig { vlog(0, _tr("sorry, exporting dhcp data is not implemented yet!")); @@ -456,12 +418,13 @@ sub writeClientConfigurationsForSystem my $buildPath = shift; my $attrFile = shift; my $clients = shift || []; + my $bootEnvs = shift || []; foreach my $client (@$clients) { next if $client->{name} eq '<<>>'; # skip default client, as it doesn't need any config-tgz - my $externalSystemID = externalIDForSystem($info); + my $externalSystemID = $info->{'external-id'}; my $externalClientName = externalConfigNameForClient($client); my $clientConfigPath = "$clientConfigPath/$externalSystemID/$externalClientName"; @@ -493,12 +456,14 @@ sub writeClientConfigurationsForSystem ); $clientSystemConfCount++; - # merge default, system and client configuration files into - # the system configuration for the current client: + # merge default, system and client configuration folders into + # a configuration folder specific to the current client: copyExternalSystemConfig( $externalSystemID, $buildPath, $externalClientName ); + # check attributes against illegal values and write them into + # a file if they're ok: my $attrProblems = OpenSLX::AttributeRoster->findProblematicValues( $client->{attrs}, $info->{'vendor-os'}->{name}, $info->{'installed-plugins'} @@ -508,19 +473,20 @@ sub writeClientConfigurationsForSystem $complaint =~ s{^}{client $client->{name}: }gms; warn $complaint; } - writeAttributesToFile($client, $attrFile); - # create tar containing external system configuration + # create a tar containing the external configuration folder # and client attribute file, this time referring to the client # via its external ID (the PXE-style MAC), as the TGZ needs to # be accessed from the client-PC, which doesn't know about the # name it is referred to in the openslx-config-DB: my $externalClientID = externalIDForClient($client); - createTarOfPath( - $buildPath, "${externalClientID}.tgz", - "$tftpbuildPath/client-config/$info->{'external-id'}" - ); + foreach my $bootEnv (@$bootEnvs) { + createTarOfPath( + $buildPath, "${externalClientID}.tgz", + "$bootEnv->{'target-path'}/client-config/$externalSystemID" + ); + } } } return; @@ -591,6 +557,40 @@ sub writePluginConfigurationsForSystem return; } +sub createBootEnvironmentsForSystem +{ + my $info = shift; + my $buildPath = shift; + my $attrFile = shift; + my $clients = shift || []; + + my %bootTypes; + foreach my $client (@$clients) { + my $type = $client->{boot_type} || 'pxe'; + $bootTypes{$type}++; + } + my @bootEnvs; + foreach my $bootType (sort keys %bootTypes) { + vlog(0, _tr("creating boot environment for $bootType")); + + my $bootEnv = bootEnvironmentForType($bootType); + push @bootEnvs, $bootEnv; + $bootEnv->writeFilesRequiredForBooting( + $info, $buildPath, $slxVersion + ); + $initramfsCount++; + + my $systemPath + = "$bootEnv->{'target-path'}/client-config/$info->{'external-id'}"; + createTarOfPath($buildPath, "default.tgz", $systemPath); + } + writeClientConfigurationsForSystem( + $info, $buildPath, $attrFile, $clients, \@bootEnvs + ); + + return; +} + sub writeSystemConfiguration { my $info = shift; @@ -636,15 +636,10 @@ sub writeSystemConfiguration writePluginConfigurationsForSystem($info, $buildPath); - my $systemPath = "$tftpbuildPath/client-config/$info->{'external-id'}"; - createTarOfPath($buildPath, "default.tgz", $systemPath); - + # create all required (pre-)boot-environments (PXE, CD, ...) my @clientIDs = $openslxDB->aggregatedClientIDsOfSystem($info); my @clients = $openslxDB->fetchClientByID(\@clientIDs); - - writeBootEnvironmentForSystem($info, $buildPath, \@clients); - - writeClientConfigurationsForSystem($info, $buildPath, $attrFile, \@clients); + createBootEnvironmentsForSystem($info, $buildPath, $attrFile, \@clients); slxsystem("rm -rf $buildPath") unless $option{dryRun}; -- cgit v1.2.3-55-g7522