summaryrefslogblamecommitdiffstats
path: root/boot-env/OpenSLX/BootEnvironment/Preboot/CD.pm
blob: a6c36cd7541e8eced04bc566846beffc3b42c1a5 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                                        








                                                                               

                                                                              
                                                                               
                                              



             
                                                     
 



                    

                   
               



                       
 







                                                                   
                                                                             

                                                  
 
                      








                                                                            



                                                           
                                                        


                                  
                                                
                                                                

                                   











































                                                                          

                                                                       




                                                                    
                                                                             


                                                                             
                       





                                                                         
               
                                                      







                                                                     

                                                                                                         














                                                                       
# 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;