Bootloader::Core::ZIPL(3)

NAME
Bootloader::Core::ZIPL - ZIPL library for bootloader configuration

PREFACE
This package is the ZIPL library of the bootloader configuration

SYNOPSIS
use Bootloader::Core::ZIPL;

"$obj_ref = Bootloader::Core::ZIPL->new ();"

"$files_ref = Bootloader::Core::ZIPL->ListFiles ();"

"$status = Bootloader::Core::ZIPL->ParseLines (\%files);"

"$files_ref = Bootloader::Core::ZIPL->CreateLines ();"

"$status = Bootloader::Core::ZIPL->UpdateBootloader ();"

"$status = Bootloader::Core::ZIPL->InitializeBootloader ();"

"$sectin_info_ref = Bootloader::Core::ZIPL->Section2Info (\@section_lines);"

"$lines_ref = Bootloader::Core::ZIPL->Info2Section (\%section_info);"

"$glob_info = $Bootloader::Core::ZIPL->Global2Info (\@glob_lines, \@section_names);"

"$lines_ref = Bootloader::Core::ZIPL->Info2Global (\%section_info, \@section_names);"

"Bootloader::Core::ZIPL->MangleSections (\@sections, \%global);"

DESCRIPTION

"$obj_ref = Bootloader::Core::ZIPL->new ();"
    Creates an instance of the Bootloader::Core::ZIPL class.

"$files_ref = Bootloader::Core::ZIPL->ListFiles ();"
    Returns the list of the configuration files of the bootloader Returns undef on fail

"$status = Bootloader::Core::ZIPL->ParseLines (\%files);"
    Parses the contents of all files and stores the settings in the internal structures. As argument, it takes a hash reference, where keys are file names and values are references to lists, each member is one line of the file. Returns undef on fail, defined nonzero value on success.

"$files_ref = Bootloader::Core::ZIPL->CreateLines ();"
    creates contents of all files from the internal structures. Returns a hash reference in the same format as argument of ParseLines on success, or undef on fail.

"$status = Bootloader::Core::ZIPL->UpdateBootloader ();"
    Updates the settings in the system. Backs original configuration files up and replaces them with the ones with the '.new' suffix. Also performs operations needed to make the change effect (run '/sbin/zipl'). Returns undef on fail, defined nonzero value on success.

"$status = Bootloader::Core::ZIPL->InitializeBootloader ();"
    Initializes the firmware to boot the bootloader. Returns undef on fail, defined nonzero value otherwise

"$lines_ref = Bootloader::Core::ZIPL->Info2Section (\%section_info);"
    Takes the info about the section and uses it to construct the list of lines. The info about the section also contains the original lines. As parameter, takes the section info (reference to a hash), returns the lines (a list of hashes). =cut

    # list<map<string,any>> Info2Section (map<string,string> info) sub Info2Section {
        my $self = shift;
        my %sectinfo = %{+shift};

        my @lines = @{$sectinfo{"__lines"} || []};
        my $type = $sectinfo{"type"} || "";

        @lines = map {
            my $line_ref = $_;
            my $key = $line_ref->{"key"};
            my $parameters = "";

            if ($key eq "label")
            {
                $line_ref = $self->UpdateSectionNameLine ($sectinfo{"name"}, $line_ref, $sectinfo{"original_name"});
                delete ($sectinfo{"name"});
    #           $line_ref->{"key"}="[".$line_ref->{"value"}."]";
    #           $line_ref->{"value"}="";
            }
            elsif ($key eq "image" || $key eq "ramdisk")
            {
                $key = "kernel" if ($key eq "image");
                $key = "initrd" if ($key eq "ramdisk");
                $line_ref->{"value"} = $sectinfo{$key};
                delete ($sectinfo{$key});
            }
            elsif ($key eq "parameters")
            {
                $line_ref->{"value"} = "root=".$sectinfo{"root"}." ".$sectinfo{"append"};
                delete ($sectinfo{"root"});
                delete ($sectinfo{"append"});
            }
            elsif ($key eq "dumpto" || $key eq "target")
            {
                $line_ref->{"value"} = $sectinfo{$key};
                delete ($sectinfo{$key});
            }
            elsif ($key eq "menuname")
            {
                $line_ref->{"key"}="menuname";
                $line_ref->{"value"}="";
            }

            $line_ref;
        } @lines;

        @lines = grep {
            defined $_;
        } @lines;

        my $parameters = "";
        while ((my $key, my $value) = each (%sectinfo))
        {
            if ($key eq "name")
            {
                my $line_ref = $self->UpdateSectionNameLine ($sectinfo{"name"}, {}, $sectinfo{"original_name"});
                $line_ref->{"key"} = "label";
    #           $line_ref->{"key"}="[".$line_ref->{"value"}."]";
    #           $line_ref->{"value"}="";
                push @lines, $line_ref;
            }
            elsif ($key eq "kernel" || $key eq "initrd" || $key eq "dumpto" || $key eq "target")
            {
                $key = "image" if ($key eq "kernel");
                $key = "ramdisk" if ($key eq "initrd");
                push @lines, {
                    "key" => $key,
                    "value" => $value,
                };
            }
            elsif ($key eq "root")
            {
                $parameters = "root=" . $value . " " . $parameters;
            }
            elsif ($key eq "append")
            {
                $parameters = $parameters . $value;
            }
        }
        if($parameters)
        {
            push @lines, {
                "key" => "parameters",
                "value" => "" . $parameters . ""
            };
        }

        my $ret = $self->FixSectionLineOrder (\@lines,
            ["label","menuname"]);

        return $ret;
    }

"$sectin_info_ref = Bootloader::Core::ZIPL->Section2Info (\@section_lines);"
    Gets the information about the section. As argument, takes a reference to the list of lines building the section, returns a reference to a hash containing information about the section. =cut

    # map<string,string> Section2Info (list<map<string,any>> section) sub Section2Info {
        my $self = shift;
        my @lines = @{+shift};

        my %ret = ();

        foreach my $line_ref (@lines) {
            my $key = $line_ref->{"key"};
            if ($key eq "label")
            {
                $ret{"name"} = $line_ref->{"value"};
                my $on = $self->Comment2OriginalName ($line_ref->{"comment_before"});
                $ret{"original_name"} = $on if ($on ne "");
            }
            elsif ($key eq "image")
            {
                $ret{"kernel"} = $line_ref->{"value"};
                $ret{"type"} = "image";
            }
            elsif ($key eq "ramdisk" || $key eq "dumpto" || $key eq "default" ||
                   $key eq "prompt" || $key eq "timeout" || $key eq "target")
            {
                $key = "initrd" if $key eq "ramdisk";
                $ret{"type"} = "dump" if $key eq "dumpto";
                $ret{$key} = $line_ref->{"value"};
            }
            elsif ($key eq "parameters")
            {
                # split off root device from other kernel parameters
                ($ret{"append"} = $line_ref->{"value"}) =~ s/root=[^[:space:]]+[[:space:]]+//g;
                ($ret{"root"} = $line_ref->{"value"}) =~ s/^.*root=([^[:space:]]+)[[:space:]]+.*$/$1/g;
                #print "params: ".$ret{"append"}."/".$ret{"root"}."\n";
            }
            elsif ($key eq "menuname")
            {
                $ret{"menuname"} = $line_ref->{"value"};
                $ret{"type"} = "menu";
                $ret{"target"} = "/boot/zipl" unless $ret{"target"};
                $ret{"menuname"} = "menu" unless $ret{"menuname"};
                $ret{"prompt"} = "1" unless $ret{"prompt"};
                $ret{"timeout"} = "10" unless $ret{"timeout"};
            }
        }
        $ret{"__lines"} = \@lines;
        return \%ret;
    }

"$glob_info = $Bootloader::Core::ZIPL->Global2Info (\@glob_lines, \@section_names);"
    Gets the general information from the global section of the menu file. This information usually means the default section, graphical menu, timeout etc. As argument it takes a reference to the list of hashes representing lines of the section, returns a reference to a hash containing the important information.

"$lines_ref = Bootloader::Core::ZIPL->Info2Global (\%section_info, \@section_names);"
    Takes the info about the global options and uses it to construct the list of lines. The info about global option also contains the original lines. As parameter, takes the section info (reference to a hash) and a list of sectino names, returns the lines (a list of hashes).

*   "Bootloader::Core::ZIPL->MangleSections (\@sections, \%global);"

    Modifies the section and global data so that the data which is de-facto global, but in zipl.conf is in sections (defaultboot, menu) is moved to the global section. Modifies the data which it gets via references directly!!!