#!/usr/bin/perl # $Id: grub,v 1.3 2003/12/04 12:33:15 at Exp $ #-------------------------------------------------------------------- # Copyright (C) 2000, 2001, 2002 by MandrakeSoft. # Chmouel Boudjnah . # # Redistribution of this file is permitted under the terms of the GNU # Public License (GPL) #-------------------------------------------------------------------- # Copyright (C) 2003 by ALT Linux Team, # Alexey Tourbin . #-------------------------------------------------------------------- # description: Add/remove entry for grub bootloader. use strict; use bootloader_utils qw(mnt2dev getroot); use Getopt::Long qw(GetOptions); GetOptions "r|remove" => \my $remove, "m|memtest" => \my $memtest and (my $version = shift) and (@ARGV == 0) or die "usage: $0 [-r|--remove] [-m|--memtest] version\n"; sub dev2grub { my $dev = shift; my ($disk, $part) = $dev =~ /([^\d\s]+)(\d+)/ or return; # Sample device.map entry: # (hd0) /dev/hda # Sample convertion: # /dev/hda5 => (hd0,4) $part--; my $map = $ENV{GRUB_DEVICE_MAP} || "/boot/grub/device.map"; open my $fh, $map or return; my $grub_part; while (<$fh>) { if (/\((\w+d\d+)\)\s+\Q$disk\E$/) { $grub_part = "($1,$part)"; last; } } return $grub_part; } my $boot = mnt2dev("/boot") ? "" : "/boot"; my $grub_part = dev2grub(getroot()); die "Can't convert grub_partition\n" unless $grub_part; sub add_memtest { local $_ = shift; /\/memtest-\Q$version\E\b/ or $_ .= < @sections; } sub add_kernel { local $_ = shift; /\/vmlinuz-\Q$version\E\b/ or $_ .= < @sections; } { # open menu.lst for update my $menu_lst = $ENV{GRUB_MENU_LST} || "/boot/grub/menu.lst"; open my $fh, "+<", $menu_lst or die "Cannot open $menu_lst\n"; local $/ = undef; my $content = <$fh>; # modify the content if ($memtest && $remove) { $content = remove_memtest($content); } elsif ($memtest) { $content = add_memtest($content); } elsif ($remove) { $content = remove_kernel($content); } else { $content = add_kernel($content); } # debug print $content; exit 0; # do the update seek $fh, 0, 0; print $fh $content; truncate $fh, tell $fh; # autoclosed }