# grub-lib.pl # Functions for parsing and editing a grub menu file BEGIN { push(@INC, ".."); }; use WebminCore; &init_config(); %title_order = ( 'lock', 10, 'root', 5, 'kernel', 4, 'chainloader', -1, 'initrd', 2, 'boot', 1 ); # get_menu_config() # Parses the config file into a list of title structures sub get_menu_config { local $lnum = 0; local (@rv, $title); open(CONF, "<".$config{'menu_file'}); while(<CONF>) { s/#.*$//; s/\r|\n//g; if (/^\s*(\S+)\s*=\s*(.*)/ || /^\s*(\S+)\s*(.*)/) { if ($title && $1 ne 'title') { # directive in an existing section if (defined($title->{$1})) { # Multiple values! $title->{$1} .= "\0".$2; } else { $title->{$1} = $2; } $title->{'eline'} = $lnum; } else { # top-level title or option local $d = { 'name' => $1, 'value' => $2, 'line' => $lnum, 'eline' => $lnum, 'index' => scalar(@rv) }; push(@rv, $d); $title = $d if ($1 eq 'title'); } } $lnum++; } close(CONF); return \@rv; } # save_directive(&config, &old|name, &new) sub save_directive { local $old; if (!$_[1] || ref($_[1])) { $old = $_[1]; } else { $old = &find($_[1], $_[0]); } local @lines; if (defined($_[2])) { @lines = ( "$_[2]->{'name'} $_[2]->{'value'}" ); foreach $k (sort { $title_order{$b} <=> $title_order{$a} } keys %{$_[2]}) { if ($k !~ /^(name|value|line|eline|index)$/) { if ($_[2]->{$k} eq '') { push(@lines, $k); } else { foreach my $v (split(/\0/, $_[2]->{$k})) { push(@lines, $k." ".$v); } } } } } local $lref = &read_file_lines($config{'menu_file'}); if ($old) { # Replace one entry in the file splice(@$lref, $old->{'line'}, $old->{'eline'} - $old->{'line'} + 1, @lines); } elsif ($_[2]->{'name'} eq 'title') { # Append to file push(@$lref, "", @lines); } else { # Insert before titles local $t = &find("title", $_[0]); if ($t) { splice(@$lref, $t->{'line'}, 0, @lines); } else { push(@$lref, "", @lines); } } } # swap_directives(&dir1, &dir2) # Swaps two blocks in the config file sub swap_directives { my ($dir1, $dir2) = @_; local $lref = &read_file_lines($config{'menu_file'}); if ($dir1->{'line'} > $dir2->{'line'}) { ($dir1, $dir2) = ($dir2, $dir1); } my @lines1 = @$lref[$dir1->{'line'} .. $dir1->{'eline'}]; my @lines2 = @$lref[$dir2->{'line'} .. $dir2->{'eline'}]; my $len1 = $dir1->{'eline'} - $dir1->{'line'} + 1; my $len2 = $dir2->{'eline'} - $dir2->{'line'} + 1; splice(@$lref, $dir2->{'line'}, $len2, @lines1); splice(@$lref, $dir1->{'line'}, $len1, @lines2); } # find(name, &config) sub find { local @rv; foreach $c (@{$_[1]}) { push(@rv, $c) if ($c->{'name'} eq $_[0]); } return wantarray ? @rv : $rv[0]; } # find_value(name, &config) sub find_value { local @rv = &find($_[0], $_[1]); return !@rv ? undef : wantarray ? map { $_->{'value'} } @rv : $rv[0]->{'value'}; } # linux_to_bios(device) # Converts a Linux device file like /dev/hda into a GRUB bios disk like (hd0) sub linux_to_bios { if ($_[0] =~ /^(\/dev\/[hs]d[a-z])(\d+)$/ || $_[0] =~ /^(\/dev\S+\/)part(\d+)$/ || $_[0] =~ /^(\/dev\S+c\d+d\d+)p(\d+)$/) { # A partition on a disk .. get the disk's device, and then add the part local ($dev, $part) = ($1, $2-1); $dev .= "disc" if ($dev =~ /\/$/); local $dsk = &linux_to_bios($dev); $dsk =~ /^\(([a-z]+\d+)\)$/ || return undef; return "($1,$part)"; } local @map = &get_device_map(); local @st = stat($_[0]); if (@map) { foreach $m (@map) { local @mst = stat($m->[1]); if ($m->[1] eq $_[0] || @mst && @st && $mst[0] == $st[0] && $mst[1] == $st[1]) { return $m->[0]; } } } # Have to guess based on the device name :( return $_[0] =~ /\/dev\/hd([a-d])$/ ? "(hd".(ord($1)-97).")" : $_[0] =~ /\/dev\/fd([0-4])$/ ? "(fd$1)" : undef; } # bios_to_linux(device) # Converts a GRUB bios disk like (hd0) to a Linux device file like /dev/hda sub bios_to_linux { if ($_[0] =~ /^\(([a-z]+\d+),(\d+)\)$/) { # A partition on a BIOS disk .. get the disk device, and add the part local ($dev, $part) = ($1, $2+1); local $dsk = &bios_to_linux("($dev)"); if ($dsk =~ /^(\/dev\/[hs]d[a-z])$/) { return $dsk.$part; } elsif ($dsk =~ /^(\/dev\S+\/)disc$/) { return $1."part".$part; } elsif ($dsk =~ /^(\/dev\S+c\d+d\d+)$/) { return $dsk.$part; } else { return undef; } } local @map = &get_device_map(); if (@map) { foreach $m (@map) { if ($m->[0] eq $_[0]) { return $m->[1]; } } } # Have to guess from BIOS name :( return $_[0] =~ /^\(hd(\d+)\)$/ ? "/dev/hd".chr($1+97) : $_[0] =~ /^\(fd([0-4])\)$/ ? "/dev/fd$1" : undef; } # get_device_map() # Returns the device.map file contents, or an empty list if there is none sub get_device_map { local ($dm, $temp, @rv); if (!$config{'device_map'} || !-r $config{'device_map'}) { # Run GRUB to build the map now $dm = $temp = &transname(); open(GRUB, "|$config{'grub_path'} --batch --device-map=$temp >/dev/null 2>&1"); print GRUB "quit\n"; close(GRUB); } else { # Just use the existing file $dm = $config{'device_map'}; } open(MAP, "<".$dm); while(<MAP>) { s/\r|\n//g; s/#.*$//; if (/^(\S+)\s+(\S+)/) { push(@rv, [ $1, $2 ]); } } close(MAP); unlink($temp) if ($temp); return @rv; }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
images | Folder | 0755 |
|
|
lang | Folder | 0755 |
|
|
CHANGELOG | File | 449 B | 0644 |
|
backup_config.pl | File | 601 B | 0755 |
|
cgi_args.pl | File | 229 B | 0755 |
|
config | File | 69 B | 0644 |
|
config-coherent-linux | File | 99 B | 0644 |
|
config-debian-linux | File | 59 B | 0644 |
|
config-gentoo-linux | File | 65 B | 0644 |
|
config-mandrake-linux | File | 65 B | 0644 |
|
config-openmamba-linux | File | 103 B | 0644 |
|
config-pardus-linux | File | 65 B | 0644 |
|
config-redhat-linux-7.2-7.4 | File | 66 B | 0644 |
|
config-redhat-linux-8.0-ALL | File | 99 B | 0644 |
|
config-solaris | File | 74 B | 0644 |
|
config-syno-linux | File | 69 B | 0644 |
|
config-trustix-linux | File | 99 B | 0644 |
|
config.info | File | 235 B | 0644 |
|
config.info.bg | File | 417 B | 0644 |
|
config.info.ca | File | 276 B | 0644 |
|
config.info.cs | File | 255 B | 0644 |
|
config.info.de | File | 284 B | 0644 |
|
config.info.es | File | 278 B | 0644 |
|
config.info.fr | File | 258 B | 0644 |
|
config.info.it | File | 284 B | 0644 |
|
config.info.ja | File | 290 B | 0644 |
|
config.info.ms | File | 244 B | 0644 |
|
config.info.nl | File | 250 B | 0644 |
|
config.info.no | File | 247 B | 0644 |
|
config.info.pl | File | 136 B | 0644 |
|
config.info.ru | File | 279 B | 0644 |
|
config.info.uk | File | 296 B | 0644 |
|
config.info.zh_TW | File | 188 B | 0644 |
|
down.cgi | File | 364 B | 0755 |
|
edit_global.cgi | File | 1.87 KB | 0755 |
|
edit_title.cgi | File | 2.92 KB | 0755 |
|
grub-lib.pl | File | 5.12 KB | 0755 |
|
index.cgi | File | 2.2 KB | 0755 |
|
install.cgi | File | 1.65 KB | 0755 |
|
install_check.pl | File | 368 B | 0755 |
|
log_parser.pl | File | 453 B | 0755 |
|
module.info | File | 246 B | 0644 |
|
module.info.af | File | 0 B | 0644 |
|
module.info.af.auto | File | 171 B | 0644 |
|
module.info.ar | File | 0 B | 0644 |
|
module.info.ar.auto | File | 218 B | 0644 |
|
module.info.be | File | 0 B | 0644 |
|
module.info.be.auto | File | 255 B | 0644 |
|
module.info.bg | File | 0 B | 0644 |
|
module.info.bg.auto | File | 282 B | 0644 |
|
module.info.ca | File | 173 B | 0644 |
|
module.info.ca.auto | File | 13 B | 0644 |
|
module.info.cs | File | 32 B | 0644 |
|
module.info.cs.auto | File | 161 B | 0644 |
|
module.info.da | File | 0 B | 0644 |
|
module.info.da.auto | File | 168 B | 0644 |
|
module.info.de | File | 176 B | 0644 |
|
module.info.de.auto | File | 14 B | 0644 |
|
module.info.el | File | 0 B | 0644 |
|
module.info.el.auto | File | 307 B | 0644 |
|
module.info.es | File | 34 B | 0644 |
|
module.info.es.auto | File | 169 B | 0644 |
|
module.info.eu | File | 0 B | 0644 |
|
module.info.eu.auto | File | 156 B | 0644 |
|
module.info.fa | File | 0 B | 0644 |
|
module.info.fa.auto | File | 259 B | 0644 |
|
module.info.fi | File | 0 B | 0644 |
|
module.info.fi.auto | File | 189 B | 0644 |
|
module.info.fr | File | 42 B | 0644 |
|
module.info.fr.auto | File | 161 B | 0644 |
|
module.info.he | File | 0 B | 0644 |
|
module.info.he.auto | File | 237 B | 0644 |
|
module.info.hr | File | 0 B | 0644 |
|
module.info.hr.auto | File | 188 B | 0644 |
|
module.info.hu | File | 0 B | 0644 |
|
module.info.hu.auto | File | 217 B | 0644 |
|
module.info.it | File | 25 B | 0644 |
|
module.info.it.auto | File | 137 B | 0644 |
|
module.info.ja | File | 33 B | 0644 |
|
module.info.ja.auto | File | 195 B | 0644 |
|
module.info.ko | File | 29 B | 0644 |
|
module.info.ko.auto | File | 150 B | 0644 |
|
module.info.lt | File | 0 B | 0644 |
|
module.info.lt.auto | File | 201 B | 0644 |
|
module.info.lv | File | 0 B | 0644 |
|
module.info.lv.auto | File | 194 B | 0644 |
|
module.info.ms | File | 155 B | 0644 |
|
module.info.ms.auto | File | 13 B | 0644 |
|
module.info.mt | File | 0 B | 0644 |
|
module.info.mt.auto | File | 168 B | 0644 |
|
module.info.nl | File | 24 B | 0644 |
|
module.info.nl.auto | File | 162 B | 0644 |
|
module.info.no | File | 29 B | 0644 |
|
module.info.no.auto | File | 145 B | 0644 |
|
module.info.pl | File | 31 B | 0644 |
|
module.info.pl.auto | File | 157 B | 0644 |
|
module.info.pt | File | 0 B | 0644 |
|
module.info.pt.auto | File | 224 B | 0644 |
|
module.info.pt_BR | File | 0 B | 0644 |
|
module.info.pt_BR.auto | File | 233 B | 0644 |
|
module.info.ro | File | 0 B | 0644 |
|
module.info.ro.auto | File | 196 B | 0644 |
|
module.info.ru | File | 40 B | 0644 |
|
module.info.ru.auto | File | 219 B | 0644 |
|
module.info.sk | File | 0 B | 0644 |
|
module.info.sk.auto | File | 172 B | 0644 |
|
module.info.sl | File | 0 B | 0644 |
|
module.info.sl.auto | File | 167 B | 0644 |
|
module.info.sv | File | 0 B | 0644 |
|
module.info.sv.auto | File | 157 B | 0644 |
|
module.info.th | File | 0 B | 0644 |
|
module.info.th.auto | File | 298 B | 0644 |
|
module.info.tr | File | 0 B | 0644 |
|
module.info.tr.auto | File | 212 B | 0644 |
|
module.info.uk | File | 0 B | 0644 |
|
module.info.uk.auto | File | 265 B | 0644 |
|
module.info.ur | File | 0 B | 0644 |
|
module.info.ur.auto | File | 240 B | 0644 |
|
module.info.vi | File | 0 B | 0644 |
|
module.info.vi.auto | File | 224 B | 0644 |
|
module.info.zh | File | 0 B | 0644 |
|
module.info.zh.auto | File | 150 B | 0644 |
|
module.info.zh_TW | File | 29 B | 0644 |
|
module.info.zh_TW.auto | File | 131 B | 0644 |
|
save_global.cgi | File | 1.78 KB | 0755 |
|
save_title.cgi | File | 2.17 KB | 0755 |
|
up.cgi | File | 360 B | 0755 |
|