Bootloader::Core::GRUB(3)

NAME
Bootlader::Core::GRUB - GRUB library for bootloader configuration

PREFACE
This package is the GRUB library of the bootloader configuration

SYNOPSIS
use Bootloader::Core::GRUB;

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

"$unquoted = Bootloader::Core::GRUB->Unquote ($text);"

"$quoted = Bootloader::Core::GRUB->Quote ($text, $when);"

"$unix_dev = Bootloader::Core::GRUB->GrubDev2UnixDev ($grub_dev);"

"$grub_dev = Bootloader::Core::GRUB->UnixDev2GrubDev ($unix_dev);"

"$unix_path = Bootloader::Core::GRUB->GrubPath2UnixPath ($grub_path, $grub_dev_prefix);"

"$grub_path = Bootloader::Core::GRUB->UnixPath2GrubPath ($unix_path, $grub_dev_prefix);"

"$grub_conf_line_ref = Bootloader::Core::GRUB->CreateGrubConfLine ($target, $discswitch);"

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

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

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

"$dev = Bootloader::Core::GRUB->GetCommonDevice (@paths);"

"$line = Bootloader::Core::GRUB->CreateKernelLine (\%sectingo, $grub_root);"

"$line = Bootloader::Core::GRUB->CreateChainloaderLine (\%sectinfo, $grb_root);"

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

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

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

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

"$settings_ref = Bootloader::Core::GRUB->GetSettings ();"

"$status = Bootloader::Core::GRUB->SetSettings (\%settings);"

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

"$opt_types_ref = BootGrub->GetOptTypes ();"

DESCRIPTION

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

"$unquoted = Bootloader::Core::GRUB->Unquote ($text);"
    Just override of Bootloader::Core->Unquote function, returning the first parameter.

"$quoted = Bootloader::Core::GRUB->Quote ($text, $when);"
    Just override of Bootloader::Core->Quote function, returning the first parameter.

"$unix_dev = Bootloader::Core::GRUB->GrubDev2UnixDev ($grub_dev);"
    Translates the GRUB device (eg. '(hd0,0)') to UNIX device (eg. '/dev/hda1'). As argument takes the GRUB device, returns the UNIX device (both strings).

"$grub_dev = Bootloader::Core::GRUB->UnixDev2GrubDev ($unix_dev);"
    Translates the UNIX device (eg. '/dev/hda1') to GRUB device (eg. '(hd0,0)'). As argument takes the UNIX device, returns the GRUB device (both strings).

"$unix_path = Bootloader::Core::GRUB->GrubPath2UnixPath ($grub_path, $grub_dev_prefix);"
    Translates the GRUB path (eg. '(hd0,0)/grub/device.map') to GRUB path (eg. '/boot/grub/device.map'). If the GRUB path doesn't contain the device, the one specified in the argument is used instead. As arguments, the function takes the GRUB path and the device to be used if not specified in the GRUB path, and returns the UNIX path (all strings).

"$grub_path = Bootloader::Core::GRUB->UnixPath2GrubPath ($unix_path, $grub_dev_prefix);"
    Translates the UNIX path (eg. '/boot/grub/device.map') to GRUB path (eg. '(hd0,0)/grub/device.map'). If the device (as specified in GRUB configuration files via the 'root' option) is the same as the device in the resulting path, the resulting path doesn't contain the device. As arguments, the function takes the UNIX path and the device as specified via 'root' option, and returns the GRUB path (all strings).

"$grub_conf_line_ref = Bootloader::Core::GRUB->CreateGrubConfLine ($target, $discswitch);"
    Creates a hash representing a line of /etc/grub.conf file. As arguments, it takes the device to install GRUB to, and the discswitch argument ('d' or ''). Returns a reference to a hash containing info about the 'install' line.

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

"$status = Bootloader::Core::GRUB->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::GRUB->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.

"$sectin_info_ref = Bootloader::Core::GRUB->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 = ();
        my $grub_root = "";

        foreach my $line_ref (@lines) {
            my $key = $line_ref->{"key"};
            my $val = $line_ref->{"value"};
            if ($key eq "root")
            {
                $grub_root = $val;
            }
            elsif ($key eq "title")
            {
                $ret{"name"} = $val;
                my $on = $self->Comment2OriginalName ($line_ref->{"comment_before"});
                $ret{"original_name"} = $on if ($on ne "");
            }
            elsif ($key eq "kernel")
            {
                if ($val =~ /^[ \t]*([^ \t]+)([ \t]+(.*))?$/)
                {
                    $ret{"kernel"} = $self->GrubPath2UnixPath ($1, $grub_root);
                    $val = $3;
                    $val = "" if (! defined ($val));
                }
                else
                {
                    $ret{"kernel"} = $self->GrubPath2UnixPath ($val, $grub_root);
                    $val = "";
                }
                if ($val =~ /^((.*)[ \t])?root=([^ \t]+)([ \t](.*))?$/)
                {
                    $ret{"root"} = $3 if ($3 ne "");
                    $val = $self->MergeIfDefined ($2, $5);
                }
                if ($val =~ /^((.*)[ \t])?vga=([^ \t]+)([ \t](.*))?$/)
                {
                    $ret{"vga"} = $3 if ($3 ne "");
                    $val = $self->MergeIfDefined ($2, $5);
                }
                if ($val ne "")
                {
                    $ret{"append"} = $val;
                }
                $ret{"type"} = "image";
            }
            elsif ($key eq "initrd")
            {
                $ret{$key} = $self->GrubPath2UnixPath ($val, $grub_root);
            }
            elsif ($key eq "chainloader" || $key eq "initrd")
            {
                if ($val =~ /^(.*)\+([0-9]+)/)
                {
                    $val = $1;
                    $ret{"sectors"} = $2;
                    if ($val eq "")
                    {
                        $val = $grub_root;
                    }
                    $val = $self->GrubDev2UnixDev ($val);
                }
                else
                {
                    $val = $self->GrubPath2UnixPath ($val, $grub_root);
                }
                $ret{$key} = $val;
                $ret{"type"} = "chainloader";
            }
        }
        $ret{"__lines"} = \@lines;
        return \%ret;
    }

*   "$dev = Bootloader::Core::GRUB->GetCommonDevice (@paths);"

    Checks all paths given as arguments if they are on the same device. If so, returns the common device, otherwise returns empty string.

*   "$line = Bootloader::Core::GRUB->CreateKernelLine (\%sectingo, $grub_root);"

    Creates a line with the kernel command for GRUB's menu.lst. As arguments. it takes a hash containing information about the section and the root device specified by the GRUB's root command. Returns the line to be written to menu.lst (without the leading kernel keyword).

*   "$line = Bootloader::Core::GRUB->CreateChainloaderLine (\%sectinfo, $grb_root);"

    Creates a line with the chainloader command for GRUB's menu.lst. As arguments. it takes a hash containing information about the section and the root device specified by the GRUB's root command. Returns the line to be written to menu.lst (without the leading chainloader keyword).

"$lines_ref = Bootloader::Core::GRUB->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"} || "";

        # allow to keep the section unchanged
        if (! ($sectinfo{"__modified"} || 0))
        {
            return $self->FixSectionLineOrder (
                \@lines,
                ["title"]);
        }

        #if section type is not known, don't touch it.
        if ($type ne "image" && $type ne "chainloader")
        {
            return \@lines;
        }
        my $grub_root = "";
        if (defined ($sectinfo{"kernel"}) && defined ($sectinfo{"initrd"}))
        {
            $grub_root = $self->GetCommonDevice ($sectinfo{"kernel"}, $sectinfo{"initrd"});
            $grub_root = $self->UnixDev2GrubDev ($grub_root);
            @lines = grep {
                $_->{"key"} ne "root";
            } @lines;
            if ($grub_root ne "")
            {
                unshift @lines, {
                    "key" => "root",
                    "value" => $grub_root,
                };
            }
        }

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

            if ($key eq "root")
            {
                $grub_root = $line_ref->{"value"};
            }
            elsif ($key eq "title")
            {
                $line_ref = $self->UpdateSectionNameLine ($sectinfo{"name"}, $line_ref, $sectinfo{"original_name"});
                delete ($sectinfo{"name"});
            }
            elsif ($key eq "kernel")
            {
                $line_ref->{"value"} = $self->CreateKernelLine (\%sectinfo, $grub_root);
                delete ($sectinfo{"root"});
                delete ($sectinfo{"vga"});
                delete ($sectinfo{"append"});
                delete ($sectinfo{"kernel"});
            }
            elsif ($key eq "initrd")
            {
                if ($type eq "chainloader" || ! defined ($sectinfo{$key}))
                {
                    $line_ref = undef;
                }
                $line_ref->{"value"} = $self->UnixPath2GrubPath ($sectinfo{$key}, $grub_root);
                delete ($sectinfo{$key});
            }
            elsif ($key eq "chainloader")
            {
                if ($type eq "image" || ! defined ($sectinfo{$key}))
                {
                    $line_ref = undef;
                }
                else
                {
                    $line_ref->{"value"} = $self->CreateChainloaderLine (\%sectinfo, $grub_root);
                    delete ($sectinfo{$key});
                    delete ($sectinfo{"sectors"});
                }
            }
            $line_ref;
        } @lines;

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

        while ((my $key, my $value) = each (%sectinfo))
        {
            if ($key eq "name")
            {
                my $line_ref = $self->UpdateSectionNameLine ($value, {}, $sectinfo{"original_name"});
                $line_ref->{"key"} = "title";
                push @lines, $line_ref;
            }
            elsif ($key eq "kernel")
            {
                my $val = $self->CreateKernelLine (\%sectinfo, $grub_root);
                push @lines, {
                    "key" => "kernel",
                    "value" => $val,
                };
            }
            elsif ($key eq "initrd")
            {
                push @lines, {
                    "key" => "initrd",
                    "value" => $self->UnixPath2GrubPath ($value, $grub_root),
                };
            }
            elsif ($key eq "chainloader")
            {
                my $line = $self->CreateChainloaderLine (\%sectinfo, $grub_root);
                push @lines, {
                    "key" => "chainloader",
                    "value" => $line,
                };
            }
        }
        my $ret = $self->FixSectionLineOrder (\@lines,
            ["title"]);
        return $ret;
    }

"$glob_info = $Bootloader::Core::GRUB->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::GRUB->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).

"$settings_ref = Bootloader::Core::GRUB->GetSettings ();"
    returns the complete settings in a hash. Doesn't read the settings from the system, but returns internal structures.

"$status = Bootloader::Core::GRUB->SetSettings (\%settings);"
    Stores the settings in the given parameter to the internal structures. Doesn't touch the system. Returns undef on fail, defined nonzero value on success.

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