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/PXE.pm | |
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/PXE.pm')
-rw-r--r-- | boot-env/OpenSLX/BootEnvironment/PXE.pm | 336 |
1 files changed, 0 insertions, 336 deletions
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; |