diff options
author | Sebastian Schmelzer | 2010-09-02 17:50:49 +0200 |
---|---|---|
committer | Sebastian Schmelzer | 2010-09-02 17:50:49 +0200 |
commit | 416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5 (patch) | |
tree | 4715f7d742fec50931017f38fe6ff0a89d4ceccc /boot-env/OpenSLX/BootEnvironment | |
parent | Fix for the problem reported on the list (sed filter forgotten for the (diff) | |
download | core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.tar.gz core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.tar.xz core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.zip |
change dir structure
Diffstat (limited to 'boot-env/OpenSLX/BootEnvironment')
-rw-r--r-- | boot-env/OpenSLX/BootEnvironment/Base.pm | 160 | ||||
-rw-r--r-- | boot-env/OpenSLX/BootEnvironment/PBS.pm | 247 | ||||
-rw-r--r-- | boot-env/OpenSLX/BootEnvironment/PXE.pm | 336 | ||||
-rw-r--r-- | boot-env/OpenSLX/BootEnvironment/Preboot.pm | 209 | ||||
-rw-r--r-- | boot-env/OpenSLX/BootEnvironment/Preboot/Base.pm | 111 | ||||
-rw-r--r-- | boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm | 155 |
6 files changed, 0 insertions, 1218 deletions
diff --git a/boot-env/OpenSLX/BootEnvironment/Base.pm b/boot-env/OpenSLX/BootEnvironment/Base.pm deleted file mode 100644 index aa4cbe5b..00000000 --- a/boot-env/OpenSLX/BootEnvironment/Base.pm +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright (c) 2008 - OpenSLX GmbH -# -# This program is free software distributed under the GPL version 2. -# See http://openslx.org/COPYING -# -# If you have any feedback please consult http://openslx.org/feedback and -# send your suggestions, praise, or complaints to feedback@openslx.org -# -# General information about OpenSLX can be found at http://openslx.org/ -# ----------------------------------------------------------------------------- -# BootEnvironment::Base.pm -# - provides empty base of the BootEnvironment API. -# ----------------------------------------------------------------------------- -package OpenSLX::BootEnvironment::Base; - -use strict; -use warnings; - -our $VERSION = 1.01; # API-version . implementation-version - -use Clone qw(clone); -use File::Basename; -use File::Path; - -use OpenSLX::Basics; -use OpenSLX::ConfigDB; -use OpenSLX::MakeInitRamFS::Engine::SlxBoot; -use OpenSLX::Utils; - -our %initramfsMap; - -sub new -{ - my $class = shift; - - my $self = {}; - - return bless $self, $class; -} - -sub initialize -{ - my $self = shift; - my $params = shift; - - $self->{'dry-run'} = $params->{'dry-run'}; - - return 1; -} - -sub finalize -{ - my $self = shift; - my $delete = shift; - - return 1 if $self->{'dry-run'}; - - my $rsyncDeleteClause = $delete ? '--delete' : ''; - my $rsyncCmd - = "rsync -a $rsyncDeleteClause --delay-updates $self->{'target-path'}/ $self->{'original-path'}/"; - slxsystem($rsyncCmd) == 0 - or die _tr( - "unable to rsync files from '%s' to '%s'! (%s)", - $self->{'target-path'}, $self->{'original-path'}, $! - ); - rmtree([$self->{'target-path'}]); - - return 1; -} - -sub requiresDefaultClientConfig -{ - my $self = shift; - - return $self->{'requires-default-client-config'}; -} - -sub writeBootloaderMenuFor -{ - my $self = shift; - my $client = shift; - my $externalClientID = shift; - my $systemInfos = shift; - - return; -} - -sub writeFilesRequiredForBooting -{ - my $self = shift; - my $info = shift; - my $buildPath = shift; - - my $kernelFile = $info->{'kernel-file'}; - my $kernelName = basename($kernelFile); - - my $vendorOSPath = "$self->{'target-path'}/$info->{'vendor-os'}->{name}"; - mkpath $vendorOSPath unless -e $vendorOSPath || $self->{'dry-run'}; - - my $targetKernel = "$vendorOSPath/$kernelName"; - if (!-e $targetKernel) { - vlog(1, _tr('copying kernel %s to %s', $kernelFile, $targetKernel)); - slxsystem(qq[cp -p "$kernelFile" "$targetKernel"]) - unless $self->{'dry-run'}; - } - - # create initramfs: - my $initramfsName = "$vendorOSPath/$info->{'initramfs-name'}"; - vlog(1, _tr('generating initialramfs %s', $initramfsName)); - $self->_makeInitRamFS($info, $initramfsName); - return 1; -} - -sub _makeInitRamFS -{ - my $self = shift; - my $info = shift; - my $initramfs = shift; - - my $vendorOS = $info->{'vendor-os'}; - my $kernelFile = basename(followLink($info->{'kernel-file'})); - - my $attrs = clone($info->{attrs} || {}); - - chomp(my $slxVersion = qx{slxversion}); - - my $params = { - 'attrs' => $attrs, - 'export-name' => $info->{export}->{name}, - 'export-uri' => $info->{'export-uri'}, - 'initramfs' => $initramfs, - 'kernel-params' - => [ split ' ', ($info->{attrs}->{kernel_params} || '') ], - 'kernel-version' => $kernelFile =~ m[-(.+)$] ? $1 : '', - 'plugins' => $info->{'active-plugins'}, - 'root-path' - => "$openslxConfig{'private-path'}/stage1/$vendorOS->{name}", - 'slx-version' => $slxVersion, - 'system-name' => $info->{name}, - }; - - # TODO: make debug-level an explicit attribute, it's used in many places! - my $kernelParams = $info->{attrs}->{kernel_params} || ''; - if ($kernelParams =~ m{debug(?:=(\d+))?}) { - my $debugLevel = defined $1 ? $1 : '1'; - $params->{'debug-level'} = $debugLevel; - } - - my $makeInitRamFSEngine - = OpenSLX::MakeInitRamFS::Engine::SlxBoot->new($params); - $makeInitRamFSEngine->execute($self->{'dry-run'}); - - # copy back kernel-params, as they might have been changed (by plugins) - $info->{attrs}->{kernel_params} - = join ' ', $makeInitRamFSEngine->kernelParams(); - - return; -} - -1; diff --git a/boot-env/OpenSLX/BootEnvironment/PBS.pm b/boot-env/OpenSLX/BootEnvironment/PBS.pm deleted file mode 100644 index 2072884b..00000000 --- a/boot-env/OpenSLX/BootEnvironment/PBS.pm +++ /dev/null @@ -1,247 +0,0 @@ -# Copyright (c) 2008 - OpenSLX GmbH -# -# This program is free software distributed under the GPL version 2. -# See http://openslx.org/COPYING -# -# If you have any feedback please consult http://openslx.org/feedback and -# send your suggestions, praise, or complaints to feedback@openslx.org -# -# General information about OpenSLX can be found at http://openslx.org/ -# ----------------------------------------------------------------------------- -# BootEnvironment::Preboot.pm -# - provides general preboot implementation of the BootEnvironment API. -# ----------------------------------------------------------------------------- -package OpenSLX::BootEnvironment::PBS; - -use strict; -use warnings; - -use base qw(OpenSLX::BootEnvironment::Base); - -use OpenSLX::MakeInitRamFS::Engine::PBS; - -use Clone qw(clone); -use File::Basename; -use File::Path; - -use Data::Dumper; - -use JSON; -use HTTP::Request::Common; -use LWP::UserAgent; - -use OpenSLX::Basics; -use OpenSLX::ConfigDB qw(:support); -use OpenSLX::Utils; - -sub initialize -{ - my $self = shift; - my $params = shift; - - return if !$self->SUPER::initialize($params); - - $self->{'original-path'} = "$openslxConfig{'public-path'}/pbs"; - $self->{'target-path'} = "$openslxConfig{'public-path'}/pbs.new"; - - $self->{'requires-default-client-config'} = 0; - # we do not need a default.tgz since there's always an explicit client - - - if (!$self->{'dry-run'}) { - mkpath([$self->{'original-path'}]); - rmtree($self->{'target-path'}); - mkpath("$self->{'target-path'}/client-config"); - } - - return 1; -} - -sub writeBootloaderMenuFor -{ - my $self = shift; - my $client = shift; - my $externalClientID = shift; - my $systemInfos = shift || []; - - my $prebootSystemInfo - = clone($self->_pickSystemWithNewestKernel($systemInfos)); - - vlog( - 0, - _tr( - "\nsend preboot information for client '%s' to pbs (%s)\n". - " (image templates provided based of %s) ...", - $client->{name}, $client->{attrs}->{preboot_server}, $prebootSystemInfo->{name} - ) - ); - - $self->_createPrebootStuff($client, $prebootSystemInfo); - - my $kernel = "$self->{'target-path'}/imagebase/vmlinuz"; - my $initramfs = "$self->{'target-path'}/imagebase/initramfs"; - - my $kernel_md5 = qx/md5sum $kernel | awk '{print \$1}'/; - my $initramfs_md5 = qx/md5sum $initramfs | awk '{print \$1}'/; - - my $data_json = to_json({ - 'slxinfo' => qx/slxversion/, - 'kernel' => basename($prebootSystemInfo->{'kernel-file'}), - 'kernel_md5' => trim($kernel_md5), - 'initramfs_md5' => trim($initramfs_md5), - 'systems' => $systemInfos - }); - my $ua = LWP::UserAgent->new; - my $res = $ua->request(POST 'http://pbs.experimental.openslx.org/backend/system/sync', [data => $data_json]); - - if ($res->is_success) { - my $resData = from_json($res->content); - if ($resData->{'getKernel'} eq 'fresh') { - $res = $ua->request(POST 'http://pbs.experimental.openslx.org/backend/system/addkernel', - ['kernel' => basename($prebootSystemInfo->{'kernel-file'}), - 'kernelFile' => ["$self->{'target-path'}/imagebase/vmlinuz"], - 'initramfsFile' => ["$self->{'target-path'}/imagebase/initramfs"], - ], - 'Content_Type' => 'form-data' - ); - - print Dumper($res->content); - - } else { - if ($resData->{'getKernel'} eq 'update') { - $res = $ua->request(POST 'http://pbs.experimental.openslx.org/backend/system/updatekernel', - ['kernel' => basename($prebootSystemInfo->{'kernel-file'}), - 'kernelFile' => ["$self->{'target-path'}/imagebase/vmlinuz"], - ], - 'Content_Type' => 'form-data' - ); - - print Dumper($res->content); - } else { - # do nothing - } - if ($resData->{'getInitramfs'} eq 'update') { - $res = $ua->request(POST 'http://pbs.experimental.openslx.org/backend/system/updateinitramfs', - ['kernel' => basename($prebootSystemInfo->{'kernel-file'}), - 'initramfsFile' => ["$self->{'target-path'}/imagebase/initramfs"], - ], - 'Content_Type' => 'form-data' - ); - - print Dumper($res->content); - } else { - # do nothing - } - } - } else { - vlog(0, 'communication with pbs failed.. please check and rerun..'); - } - - return 1; -} - -sub _createPrebootStuff -{ - my $self = shift; - my $client = shift; - my $info = shift; - - my $prebootClass = instantiateClass( - "OpenSLX::BootEnvironment::Preboot::Base" - ); - - my $imagebase = "$self->{'target-path'}/imagebase"; - - $prebootClass->initialize($self); - $client->{attrs}->{boot_uri} = $client->{attrs}->{preboot_server}; - mkpath("$imagebase"); - $self->_makePBSInitRamFS($info, "$imagebase/initramfs", $client); - - my $kernelFile = $info->{'kernel-file'}; - my $kernelName = basename($kernelFile); - slxsystem(qq{cp -p "$kernelFile" "$imagebase/vmlinuz"}) - unless $self->{'dry-run'}; - - return 1; -} - -sub _pickSystemWithNewestKernel -{ - my $self = shift; - my $systemInfos = shift; - - my $systemWithNewestKernel; - my $newestKernelFileSortKey = ''; - foreach my $system (@$systemInfos) { - next unless $system->{'kernel-file'} =~ m{ - (?:vmlinuz|x86)-(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?-(\d+(?:\.\d+)?) - }x; - my $sortKey - = sprintf("%02d.%02d.%02d.%02d-%2.1f", $1, $2, $3, $4||0, $5); - if ($newestKernelFileSortKey lt $sortKey) { - $systemWithNewestKernel = $system; - $newestKernelFileSortKey = $sortKey; - } - } - - if (!defined $systemWithNewestKernel) { - die _tr("unable to pick a system to be used for preboot!"); - } - return $systemWithNewestKernel; -} - -sub _makePBSInitRamFS -{ - my $self = shift; - my $info = shift; - my $initramfs = shift; - my $client = shift; - - my $vendorOS = $info->{'vendor-os'}; - my $kernelFile = basename(followLink($info->{'kernel-file'})); - - my $attrs = clone($info->{attrs} || {}); - - my $bootURI = $client->{attrs}->{boot_uri}; - if (!$bootURI) { - die _tr("client $client->{name} needs an URI in attribute 'boot_uri' to be used for preboot!"); - } - - chomp(my $slxVersion = qx{slxversion}); - - my $params = { - 'attrs' => $attrs, - 'export-name' => undef, - 'export-uri' => undef, - 'initramfs' => $initramfs, - 'kernel-params' - => [ split ' ', ($info->{attrs}->{kernel_params} || '') ], - 'kernel-version' => $kernelFile =~ m[-(.+)$] ? $1 : '', - 'plugins' => '', - 'root-path' - => "$openslxConfig{'private-path'}/stage1/$vendorOS->{name}", - 'slx-version' => $slxVersion, - 'system-name' => $info->{name}, - 'preboot-id' => $client->{name}, - 'boot-uri' => $bootURI, - }; - - # TODO: make debug-level an explicit attribute, it's used in many places! - my $kernelParams = $info->{attrs}->{kernel_params} || ''; - if ($kernelParams =~ m{debug(?:=(\d+))?}) { - my $debugLevel = defined $1 ? $1 : '1'; - $params->{'debug-level'} = $debugLevel; - } - - my $makeInitRamFSEngine - = OpenSLX::MakeInitRamFS::Engine::PBS->new($params); - $makeInitRamFSEngine->execute($self->{'dry-run'}); - - # copy back kernel-params, as they might have been changed (by plugins) - $info->{attrs}->{kernel_params} - = join ' ', $makeInitRamFSEngine->kernelParams(); - - return; -} - -1; diff --git a/boot-env/OpenSLX/BootEnvironment/PXE.pm b/boot-env/OpenSLX/BootEnvironment/PXE.pm deleted file mode 100644 index d46786d0..00000000 --- a/boot-env/OpenSLX/BootEnvironment/PXE.pm +++ /dev/null @@ -1,336 +0,0 @@ -# Copyright (c) 2008..2009 - OpenSLX GmbH -# -# This program is free software distributed under the GPL version 2. -# See http://openslx.org/COPYING -# -# If you have any feedback please consult http://openslx.org/feedback and -# send your suggestions, praise, or complaints to feedback@openslx.org -# -# General information about OpenSLX can be found at http://openslx.org/ -# ----------------------------------------------------------------------------- -# BootEnvironment::PXE.pm -# - provides PXE-specific implementation of the BootEnvironment API. -# ----------------------------------------------------------------------------- -package OpenSLX::BootEnvironment::PXE; - -use strict; -use warnings; - -use base qw(OpenSLX::BootEnvironment::Base); - -use File::Basename; -use File::Path; -# for sha1 passwd encryption -use Digest::SHA1; -use MIME::Base64; - -use OpenSLX::Basics; -use OpenSLX::Utils; - -sub initialize -{ - my $self = shift; - my $params = shift; - - return if !$self->SUPER::initialize($params); - - $self->{'original-path'} = "$openslxConfig{'public-path'}/tftpboot"; - $self->{'target-path'} = "$openslxConfig{'public-path'}/tftpboot.new"; - - $self->{'requires-default-client-config'} = 1; - - if (!$self->{'dry-run'}) { - mkpath([$self->{'original-path'}]); - rmtree($self->{'target-path'}); - mkpath("$self->{'target-path'}/client-config"); - } - - return 1; -} - -sub writeBootloaderMenuFor -{ - my $self = shift; - my $client = shift; - my $externalClientID = shift; - my $systemInfos = shift; - - $self->_prepareBootloaderConfigFolder() - unless $self->{preparedBootloaderConfigFolder}; - - my $pxePath = $self->{'target-path'}; - my $pxeConfigPath = "$pxePath/pxelinux.cfg"; - - my $pxeConfig = $self->_getTemplate(); - my $pxeFile = "$pxeConfigPath/$externalClientID"; - my $clientAppend = $client->{attrs}->{kernel_params_client} || ''; - my $bootURI = $client->{attrs}->{boot_uri} || ''; - vlog(1, _tr("writing PXE-file %s", $pxeFile)); - - # set label for each system - foreach my $info (@$systemInfos) { - my $label = $info->{label} || ''; - if (!length($label) || $label eq $info->{name}) { - if ($info->{name} =~ m{^(.+)::(.+)$}) { - my $system = $1; - my $exportType = $2; - $label = $system . ' ' x (40-length($system)) . $exportType; - } else { - $label = $info->{name}; - } - } - $info->{menuLabel} = $label; - } -# if kernel=*xen* then run sub _xenLabel from xen.pm - my $slxLabels = ''; - foreach my $info (sort { $a->{label} cmp $b->{label} } @$systemInfos) { - my $vendorOSName = $info->{'vendor-os'}->{name}; - my $kernelName = basename($info->{'kernel-file'}); - my $append = $info->{attrs}->{kernel_params}; - my $pxeLabel = $info->{'external-id'}; - $pxeLabel =~ s/::/-/g; - my $pxePrefix = ''; - my $tftpPrefix = ''; - $info->{'pxe_prefix_ip'} ||= ''; - - # pxe_prefix_ip set and looks like a ip - if ($info->{'pxe_prefix_ip'} =~ m/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) { - $pxePrefix = "$info->{'pxe_prefix_ip'}::"; - $tftpPrefix = "tftp://$info->{'pxe_prefix_ip'}" - if ! length($bootURI); - } - - # set default menu entry - my $pxeDefault = ""; - if (defined $openslxConfig{'pxe-default-menu-entry'}) { - if ($openslxConfig{'pxe-default-menu-entry'} eq - $info->{'external-id'}) - { - $pxeDefault = "\tMENU DEFAULT\n"; - } - } - $append .= " initrd=$pxePrefix$vendorOSName/$info->{'initramfs-name'}"; - $append .= " file=$bootURI" if length($bootURI); - $append .= " file=$tftpPrefix" if length($tftpPrefix); - $append .= " $clientAppend"; - $slxLabels .= "LABEL openslx-$pxeLabel\n"; - $slxLabels .= $pxeDefault; - $slxLabels .= "\tMENU LABEL ^$info->{menuLabel}\n"; - $slxLabels .= "\tKERNEL $pxePrefix$vendorOSName/$kernelName\n"; - $slxLabels .= "\tAPPEND $append\n"; - $slxLabels .= "\tIPAPPEND 3\n"; -# if kernel=*xen* then run sub _xenBootEntry from xen.pm -# if (!defined $xenKernel) {...} - my $helpText = $info->{description} || ''; - if (length($helpText)) { - # make sure that text matches the given margin - my $menuMargin; - while ($pxeConfig =~ m{^\s*MENU MARGIN (\S+?)\s*$}gims) { - chomp($menuMargin = $1); - } - my $margin - = defined $menuMargin - ? "$menuMargin" - : "0"; - my $marginAsText = ' ' x $margin; - - my $menuWidth; - while ($pxeConfig =~ m{^\s*MENU WIDTH (\S+?)\s*$}gims) { - chomp($menuWidth = $1); - } - my $width - = defined $menuWidth - ? "$menuWidth" - : "80"; - $width = $width - 2* $margin + 2; - - my @atomicHelpText = split(/ /, $helpText); - my $lineCounter = 0; - - $helpText = ""; - - foreach my $word (@atomicHelpText){ - if ($lineCounter + length($word) + 1 < $width) { - $helpText .= "$word "; - $lineCounter += length($word) + 1; - } else { - my $nobreak = 1; - while ($nobreak == 1) { - my $pos = index($word,"-"); - $nobreak = 0; - if ($pos != -1) { - if ($lineCounter + $pos + 1 < $width) { - $helpText .= substr($word, 0, $pos+1); - $word = substr($word, $pos + 1, length($word)); - $nobreak = 1; - } - } - } - $helpText .= "\n$word "; - $lineCounter = length($word); - } - } - - $helpText =~ s{^}{$marginAsText}gms; - $slxLabels .= "\tTEXT HELP\n"; - $slxLabels .= "$helpText\n"; - $slxLabels .= "\tENDTEXT\n"; - } - } - # now add the slx-labels (inline or appended) and write the config file - if (!($pxeConfig =~ s{\@\@\@SLX_LABELS\@\@\@}{$slxLabels})) { - $pxeConfig .= $slxLabels; - # fetch PXE-bottom iclude, if exists (overwrite existing definitions) - my $pxeBottomFile - = "$openslxConfig{'config-path'}/boot-env/syslinux/pxemenu-bottom"; - if (-e $pxeBottomFile) { - $pxeConfig .= "\n# configuration from include $pxeBottomFile\n"; - $pxeConfig .= slurpFile($pxeBottomFile); - } - } - - # PXE uses 'cp850' (codepage 850) but our string is in utf-8, we have - # to convert in order to avoid showing gibberish on the client side... - spitFile($pxeFile, $pxeConfig, { 'io-layer' => 'encoding(cp850)' } ) - unless $self->{'dry-run'}; - - return 1; -} - -sub _getTemplate -{ - my $self = shift; - - return $self->{'pxe-template'} if $self->{'pxe-template'}; - - my $basePath = $openslxConfig{'base-path'}; - my $configPath = $openslxConfig{'config-path'}; - my $pxeTheme = $openslxConfig{'syslinux-theme'}; - - my ($sec, $min, $hour, $day, $mon, $year) = (localtime); - $mon++; - $year += 1900; - my $callDate = sprintf('%04d-%02d-%02d', $year, $mon, $day); - my $callTime = sprintf('%02d:%02d:%02d', $hour, $min, $sec); - - # generate PXE-Menu - my $pxeTemplate = - "# generated by slxconfig-demuxer (on $callDate at $callTime)\n"; - $pxeTemplate .= "\nDEFAULT vesamenu.c32\n"; - # include static defaults - $pxeTemplate .= "\n# static configuration (override with include file)\n"; - $pxeTemplate .= "NOESCAPE 0\n"; - $pxeTemplate .= "PROMPT 0\n"; - - # first check for theme - # let user stuff in config path win over our stuff in base path - my $pxeThemePath; - my $pxeThemeInConfig - = "$configPath/boot-env/syslinux/themes/${pxeTheme}"; - my $pxeThemeInBase - = "$basePath/share/boot-env/syslinux/themes/${pxeTheme}"; - if (-e "$pxeThemeInConfig/theme.conf") { - $pxeThemePath = $pxeThemeInConfig; - } - else { - if (-e "$pxeThemeInBase/theme.conf") { - $pxeThemePath = $pxeThemeInBase; - } - } - # include theme specific stuff - if (defined $pxeThemePath) { - $pxeTemplate .= "\n# theme specific configuration from $pxeThemePath\n"; - $pxeTemplate .= slurpFile("$pxeThemePath/theme.conf"); - } - - # copy background picture if exists - my $pic; - if (defined $pxeTheme) { - while ($pxeTemplate =~ m{^\s*MENU BACKGROUND (\S+?)\s*$}gims) { - chomp($pic = $1); - } - } - if (defined $pic) { - my $pxeBackground = "$pxeThemePath/$pic"; - if (-e $pxeBackground && !$self->{'dry-run'}) { - slxsystem(qq[cp "$pxeBackground" $self->{'target-path'}/]); - } - } - - # include slxsettings - $pxeTemplate .= "\n# slxsettings configuration\n"; - $pxeTemplate .= "TIMEOUT $openslxConfig{'pxe-timeout'}\n" || ""; - $pxeTemplate .= "TOTALTIMEOUT $openslxConfig{'pxe-totaltimeout'}\n" || ""; - my $sha1pass = $self->_sha1pass($openslxConfig{'pxe-passwd'}); - $pxeTemplate .= "MENU MASTER PASSWD $sha1pass\n" || ""; - $pxeTemplate .= "MENU TITLE $openslxConfig{'pxe-title'}\n" || ""; - - # fetch PXE-include, if exists (overwrite existing definitions) - my $pxeIncludeFile - = "$openslxConfig{'config-path'}/boot-env/syslinux/pxemenu-include"; - if (-e $pxeIncludeFile) { - $pxeTemplate .= "\n# configuration from include $pxeIncludeFile\n"; - $pxeTemplate .= slurpFile($pxeIncludeFile); - } - - $pxeTemplate .= "\n# slxsystems:\n"; - $self->{'pxe-template'} = $pxeTemplate; - - return $pxeTemplate; -} - -sub _prepareBootloaderConfigFolder -{ - my $self = shift; - - my $basePath = $openslxConfig{'base-path'}; - my $pxePath = $self->{'target-path'}; - my $pxeConfigPath = "$pxePath/pxelinux.cfg"; - - if (!$self->{'dry-run'}) { - rmtree($pxeConfigPath); - mkpath($pxeConfigPath); - - for my $file ('pxelinux.0', 'pxechain.com', 'vesamenu.c32', - 'mboot.c32', 'kernel-shutdown', 'initramfs-shutdown') { - if (!-e "$pxePath/$file") { - slxsystem( - qq[cp -p "$basePath/share/boot-env/syslinux/$file" $pxePath/] - ); - } - } - } - - $self->{preparedBootloaderConfigFolder} = 1; - - return 1; -} - -# from syslinux 3.73: http://syslinux.zytor.com -sub _random_bytes -{ - my $self = shift; - my $n = shift; - my($v, $i); - - # using perl rand because of problems with encoding(cp850) and 'bytes' - srand($$ ^ time); - $v = ''; - for ( $i = 0 ; $i < $n ; $i++ ) { - $v .= ord(int(rand() * 256)); - } - - return $v; -} - -sub _sha1pass -{ - my $self = shift; - my $pass = shift; - my $salt = shift || MIME::Base64::encode($self->_random_bytes(6), ''); - $pass = Digest::SHA1::sha1_base64($salt, $pass); - - return sprintf('$4$%s$%s$', $salt, $pass); -} - -1; diff --git a/boot-env/OpenSLX/BootEnvironment/Preboot.pm b/boot-env/OpenSLX/BootEnvironment/Preboot.pm deleted file mode 100644 index b06de7d2..00000000 --- a/boot-env/OpenSLX/BootEnvironment/Preboot.pm +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright (c) 2008 - OpenSLX GmbH -# -# This program is free software distributed under the GPL version 2. -# See http://openslx.org/COPYING -# -# If you have any feedback please consult http://openslx.org/feedback and -# send your suggestions, praise, or complaints to feedback@openslx.org -# -# General information about OpenSLX can be found at http://openslx.org/ -# ----------------------------------------------------------------------------- -# BootEnvironment::Preboot.pm -# - provides general preboot implementation of the BootEnvironment API. -# ----------------------------------------------------------------------------- -package OpenSLX::BootEnvironment::Preboot; - -use strict; -use warnings; - -use base qw(OpenSLX::BootEnvironment::Base); - -use Clone qw(clone); -use File::Basename; -use File::Path; - -use OpenSLX::Basics; -use OpenSLX::ConfigDB qw(:support); -use OpenSLX::Utils; - -sub initialize -{ - my $self = shift; - my $params = shift; - - return if !$self->SUPER::initialize($params); - - $self->{'original-path'} = "$openslxConfig{'public-path'}/preboot"; - $self->{'target-path'} = "$openslxConfig{'public-path'}/preboot.new"; - - $self->{'requires-default-client-config'} = 0; - # we do not need a default.tgz since there's always an explicit client - - if (!$self->{'dry-run'}) { - mkpath([$self->{'original-path'}]); - rmtree($self->{'target-path'}); - mkpath("$self->{'target-path'}/client-config"); - } - - return 1; -} - -sub writeBootloaderMenuFor -{ - my $self = shift; - my $client = shift; - my $externalClientID = shift; - my $systemInfos = shift || []; - - $self->_prepareBootloaderConfigFolder() - unless $self->{preparedBootloaderConfigFolder}; - - my $prebootSystemInfo - = clone($self->_pickSystemWithNewestKernel($systemInfos)); - - $self->_createImages($client, $prebootSystemInfo); - - my $externalClientName = externalConfigNameForClient($client); - my $bootloaderPath = "$self->{'target-path'}/bootloader"; - my $bootloaderConfigPath = "$bootloaderPath/$externalClientName"; - mkpath($bootloaderConfigPath) unless $self->{'dry-run'}; - my $menuFile = "$bootloaderConfigPath/bootmenu.dialog"; - - my $clientAppend = $client->{attrs}->{kernel_params_client} || ''; - vlog(1, _tr("writing bootmenu %s", $menuFile)); - - # set label for each system - foreach my $info (@$systemInfos) { - my $label = $info->{label} || ''; - if (!length($label) || $label eq $info->{name}) { - $label = $info->{name}; - } - $info->{label} = $label; - } - my $bootmenuEntries = ''; - my $entryState = 'on'; - my $counter = 1; - foreach my $info (sort { $a->{label} cmp $b->{label} } @$systemInfos) { - my $vendorOSName = $info->{'vendor-os'}->{name}; - my $kernelName = basename($info->{'kernel-file'}); - my $append = $info->{attrs}->{kernel_params} || ''; - $append .= " $clientAppend"; - $bootmenuEntries .= qq{ "$counter" "$info->{label}" }; - $entryState = 'off'; - - # create a file containing the boot-configuration for this system - my $systemDescr = unshiftHereDoc(<<" End-of-Here"); - label="$info->{label}" - kernel="$vendorOSName/$kernelName" - initramfs="$vendorOSName/$info->{'initramfs-name'}" - append="$append" - End-of-Here - my $systemFile = "$bootloaderConfigPath/$info->{name}"; - spitFile( - $systemFile, $systemDescr, { 'io-layer' => 'encoding(iso8859-1)' } - ) unless $self->{'dry-run'}; - slxsystem(qq{ln -sf $info->{name} $bootloaderConfigPath/$counter}); - $counter++; - } - - my $entryCount = @$systemInfos; - my $bootmenu = unshiftHereDoc(<<" End-of-Here"); - --no-cancel --menu "OpenSLX Boot Menu" 20 65 $entryCount $bootmenuEntries - End-of-Here - - if (!$self->{'dry-run'}) { - # default to iso encoding, let's see how uclibc copes with it ... - spitFile($menuFile, $bootmenu, { 'io-layer' => 'encoding(iso8859-1)' }); - - # copy the preboot script into the folder to be tared - my $prebootBasePath - = "$openslxConfig{'base-path'}/share/boot-env/preboot"; - slxsystem(qq{cp $prebootBasePath/preboot.sh $bootloaderConfigPath/}); - slxsystem(qq{cp -r $prebootBasePath/preboot-scripts $bootloaderConfigPath/}); - slxsystem(qq{chmod a+x $bootloaderConfigPath/preboot.sh}); - - # create a tar which can/will be downloaded by prebooting clients - my $tarCMD - = qq{cd $bootloaderConfigPath; tar -czf "${bootloaderConfigPath}.env" *}; - slxsystem($tarCMD); - rmtree($bootloaderConfigPath); - } - - return 1; -} - -sub _createImages -{ - my $self = shift; - my $client = shift; - my $info = shift; - - my %mediaMap = ( - 'cd' => 'CD', - ); - my $prebootMedia = $client->{attrs}->{preboot_media} || ''; - if (!$prebootMedia) { - warn _tr( - "no preboot-media defined for client %s, no images will be generated!", - $client->{name} - ); - return 0; - } - foreach my $mediumName (split m{, }, $prebootMedia) { - my $moduleName = $mediaMap{$mediumName} - or die _tr( - "'%s' is not one of the supported preboot-medias (cd)", - $mediumName - ); - - my $prebootMedium = instantiateClass( - "OpenSLX::BootEnvironment::Preboot::$moduleName" - ); - $prebootMedium->initialize($self); - $prebootMedium->createImage($client, $info); - } - - return 1; -} - -sub _prepareBootloaderConfigFolder -{ - my $self = shift; - - my $bootloaderPath = "$self->{'target-path'}/bootloader"; - if (!$self->{'dry-run'}) { - rmtree($bootloaderPath); - mkpath($bootloaderPath); - } - - $self->{preparedBootloaderConfigFolder} = 1; - - return 1; -} - -sub _pickSystemWithNewestKernel -{ - my $self = shift; - my $systemInfos = shift; - - my $systemWithNewestKernel; - my $newestKernelFileSortKey = ''; - foreach my $system (@$systemInfos) { - next unless $system->{'kernel-file'} =~ m{ - (?:vmlinuz|x86)-(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?-(\d+(?:\.\d+)?) - }x; - my $sortKey - = sprintf("%02d.%02d.%02d.%02d-%2.1f", $1, $2, $3, $4||0, $5); - if ($newestKernelFileSortKey lt $sortKey) { - $systemWithNewestKernel = $system; - $newestKernelFileSortKey = $sortKey; - } - } - - if (!defined $systemWithNewestKernel) { - die _tr("unable to pick a system to be used for preboot!"); - } - return $systemWithNewestKernel; -} - -1; diff --git a/boot-env/OpenSLX/BootEnvironment/Preboot/Base.pm b/boot-env/OpenSLX/BootEnvironment/Preboot/Base.pm deleted file mode 100644 index 89f0e07e..00000000 --- a/boot-env/OpenSLX/BootEnvironment/Preboot/Base.pm +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (c) 2008-2009 - OpenSLX GmbH -# -# This program is free software distributed under the GPL version 2. -# See http://openslx.org/COPYING -# -# If you have any feedback please consult http://openslx.org/feedback and -# send your suggestions, praise, or complaints to feedback@openslx.org -# -# General information about OpenSLX can be found at http://openslx.org/ -# ----------------------------------------------------------------------------- -# BootEnvironment::Preboot::Base.pm -# - base of the Preboot-BootEnvironment API. -# ----------------------------------------------------------------------------- -package OpenSLX::BootEnvironment::Preboot::Base; - -use strict; -use warnings; - -use File::Basename; - -use Clone qw(clone); - -use OpenSLX::Basics; -use OpenSLX::MakeInitRamFS::Engine::Preboot; -use OpenSLX::Utils; - -sub new -{ - my $class = shift; - - my $self = {}; - - return bless $self, $class; -} - -sub initialize -{ - my $self = shift; - my $params = shift; - - $self->{'dry-run'} = $params->{'dry-run'}; - - return 1; -} - -sub makePrebootInitRamFS -{ - my $self = shift; - my $info = shift; - my $initramfs = shift; - my $client = shift; - - my $vendorOS = $info->{'vendor-os'}; - my $kernelFile = basename(followLink($info->{'kernel-file'})); - - my $attrs = clone($info->{attrs} || {}); - - my $bootURI = $client->{attrs}->{boot_uri}; - if (!$bootURI) { - die _tr("client $client->{name} needs an URI in attribute 'boot_uri' to be used for preboot!"); - } - - chomp(my $slxVersion = qx{slxversion}); - - my $params = { - 'attrs' => $attrs, - 'export-name' => undef, - 'export-uri' => undef, - 'initramfs' => $initramfs, - 'kernel-params' - => [ split ' ', ($info->{attrs}->{kernel_params} || '') ], - 'kernel-version' => $kernelFile =~ m[-(.+)$] ? $1 : '', - 'plugins' => '', - 'root-path' - => "$openslxConfig{'private-path'}/stage1/$vendorOS->{name}", - 'slx-version' => $slxVersion, - 'system-name' => $info->{name}, - 'preboot-id' => $client->{name}, - 'boot-uri' => $bootURI, - }; - - # TODO: make debug-level an explicit attribute, it's used in many places! - my $kernelParams = $info->{attrs}->{kernel_params} || ''; - if ($kernelParams =~ m{debug(?:=(\d+))?}) { - my $debugLevel = defined $1 ? $1 : '1'; - $params->{'debug-level'} = $debugLevel; - } - - my $makeInitRamFSEngine - = OpenSLX::MakeInitRamFS::Engine::Preboot->new($params); - $makeInitRamFSEngine->execute($self->{'dry-run'}); - - # copy back kernel-params, as they might have been changed (by plugins) - $info->{attrs}->{kernel_params} - = join ' ', $makeInitRamFSEngine->kernelParams(); - - return; -} - -sub createImage -{ - my $self = shift; - my $client = shift; - my $info = shift; - - # override in subclasses! - - return 1; -} - -1; diff --git a/boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm b/boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm deleted file mode 100644 index a6c36cd7..00000000 --- a/boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm +++ /dev/null @@ -1,155 +0,0 @@ -# Copyright (c) 2008-2009 - OpenSLX GmbH -# -# This program is free software distributed under the GPL version 2. -# See http://openslx.org/COPYING -# -# If you have any feedback please consult http://openslx.org/feedback and -# send your suggestions, praise, or complaints to feedback@openslx.org -# -# General information about OpenSLX can be found at http://openslx.org/ -# ----------------------------------------------------------------------------- -# BootEnvironment::Preboot::CD.pm -# - provides CD-specific implementation of the Preboot-BootEnvironment API. -# ----------------------------------------------------------------------------- -package OpenSLX::BootEnvironment::Preboot::CD; - -use strict; -use warnings; - -use base qw(OpenSLX::BootEnvironment::Preboot::Base); - -use File::Basename; -use File::Path; - -use OpenSLX::Basics; -use OpenSLX::Utils; - -sub createImage -{ - my $self = shift; - my $client = shift; - my $info = shift; - - vlog( - 0, - _tr( - "\ncreating CD-image for client %s (based on %s) ...", - $client->{name}, $info->{name} - ) - ); - - my $imageDir = "$openslxConfig{'public-path'}/images/$client->{name}/cd"; - my $isoDir = "$imageDir/iso/isolinux"; - mkpath($isoDir) unless $self->{'dry-run'}; - - # copy static data - my $dataDir = "$openslxConfig{'base-path'}/share/boot-env/syslinux"; - for my $file ('LICENSE', 'README.iso', 'vesamenu.c32', 'isolinux.bin') { - if (!-e "$isoDir/$file") { - slxsystem( - qq[cp -p "$dataDir/$file" "$isoDir/"] - ) - unless $self->{'dry-run'}; - } - } - - # copy kernel (take the one from the given system info) - my $kernelFile = $info->{'kernel-file'}; - my $kernelName = basename($kernelFile); - slxsystem(qq{cp -p "$kernelFile" "$isoDir/vmlinuz"}) - unless $self->{'dry-run'}; - - # create initramfs - my $initramfsName = qq{"$isoDir/initramfs"}; - $self->makePrebootInitRamFS($info, $initramfsName, $client); - - # write trivial isolinux config - # include static defaults - my $isolinuxConfig = "DEFAULT vesamenu.c32\n"; - $isolinuxConfig .= "PROMPT 0\n"; - $isolinuxConfig .= "TIMEOUT 100\n"; - - # theme stuff - my $basePath = $openslxConfig{'base-path'}; - my $configPath = $openslxConfig{'config-path'}; - my $isoTheme = $openslxConfig{'syslinux-theme'}; - - my $isoThemePath; - my $isoThemeInConfig - = "$configPath/boot-env/syslinux/themes/${isoTheme}"; - my $isoThemeInBase - = "$basePath/share/boot-env/syslinux/themes/${isoTheme}"; - if (-e "$isoThemeInConfig/theme.conf") { - $isoThemePath = $isoThemeInConfig; - } - else { - if (-e "$isoThemeInBase/theme.conf") { - $isoThemePath = $isoThemeInBase; - } - } - # include theme specific stuff - if (defined $isoThemePath) { - $isolinuxConfig .= slurpFile("$isoThemePath/theme.conf"); - } - - # copy background picture if exists - my $pic; - if (defined $isoTheme) { - while ($isolinuxConfig =~ m{^\s*MENU BACKGROUND (\S+?)\s*$}gims) { - chomp($pic = $1); - } - } - if (defined $pic) { - my $isoBackground = "$isoThemePath/$pic"; - if (-e $isoBackground && !$self->{'dry-run'}) { - slxsystem(qq[cp "$isoBackground" "$isoDir/"]); - } - } - - # write trivial isolinux config - $isolinuxConfig .= unshiftHereDoc(<<" End-of-Here"); - MENU TITLE Welcome to OpenSLX PreBoot ISO/CD (Mini Linux/Kexec) - LABEL SLXSTDBOOT - MENU LABEL OpenSLX PreBoot - Stateless Netboot Linux ... - MENU DEFAULT - KERNEL vmlinuz - APPEND initrd=initramfs vga=0x317 - TEXT HELP - Use this (default) entry if you have configured your client. - You have chance to edit the kernel commandline by hitting - the TAB key (e.g. for adding debug=3 to it for bug hunting). - ENDTEXT - LABEL LOCALBOOT - MENU LABEL Boot locally (skip OpenSLX PreBoot) ... - LOCALBOOT -1 - TEXT HELP - Gets you out of here by booting from next device in BIOS - boot order. - ENDTEXT - End-of-Here - spitFile("$isoDir/isolinux.cfg", $isolinuxConfig); - - my $mkisoCmd = unshiftHereDoc(<<" End-of-Here"); - mkisofs - -o "$imageDir/../$client->{name}.iso" - -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 - -r -J -l -boot-info-table -joliet-long - -publisher "OpenSLX Project - http://www.openslx.org" - -p "OpenSLX Project - openslx-devel\@openslx.org" - -V "OpenSLX BootISO" - -volset "OpenSLX Project - PreBoot ISO/CD for non PXE/TFTP start of a Linux Stateless Client" - -c isolinux/boot.cat "$imageDir/iso" - End-of-Here - $mkisoCmd =~ s{\n\s*}{ }gms; - my $logFile = "$imageDir/../$client->{name}.iso.log"; - if (slxsystem(qq{$mkisoCmd 2>"$logFile"})) { - my $log = slurpFile($logFile); - die _tr("unable to create ISO-image - log follows:\n%s", $log); - } - - rmtree($imageDir); - - return 1; -} - -1; |