summaryrefslogtreecommitdiffstats
path: root/rebootin
diff options
context:
space:
mode:
Diffstat (limited to 'rebootin')
-rw-r--r--rebootin104
1 files changed, 104 insertions, 0 deletions
diff --git a/rebootin b/rebootin
new file mode 100644
index 0000000..ae9a9fd
--- /dev/null
+++ b/rebootin
@@ -0,0 +1,104 @@
+#!/usr/bin/perl
+#--------------------------------------------------------------------
+# Copyright (C) 2000, 2001, 2002 by Mandriva,
+# Pixel <pixel@mandriva.com>,
+# Chmouel Boudjnah <chmouel@mandriva.com>,
+# Redistribution of this file is permitted under the terms of the GNU
+# Public License (GPL)
+#--------------------------------------------------------------------
+# $Id: rebootin 109033 2007-01-15 09:40:20Z pixel $
+#--------------------------------------------------------------------
+## description:
+# Reboot once on a specified image for grub or lilo
+
+use strict;
+
+my $lilo_conf = "/etc/lilo.conf";
+
+my $grub_menu = "/boot/grub/menu.lst";
+my ($fastboot, $noreboot, $list);
+
+while ($ARGV[0] =~ /^-/) {
+ local $_ = shift;
+ if (/^-f/) {
+ $fastboot++;
+ } elsif (/^-l/) {
+ $list++;
+ } elsif (/^-n/) {
+ $noreboot++;
+ } else {
+ die "Unknown switch $_\n";
+ }
+}
+
+$list || @ARGV == 1 && $ARGV[0] or usage();
+my ($wanted_entry) = @ARGV;
+
+my $bootloader = `/usr/sbin/detectloader -q` or die "Can't detect your bootloader\n";chomp $bootloader;
+
+my @entries;
+if ($bootloader =~ /GRUB/) {
+ grub_conf();
+} elsif ($bootloader =~ /LILO/) {
+ lilo_conf();
+} elsif ($bootloader =~ /YABOOT/) {
+ die "Sorry, can't do this with yaboot...\n";
+} else {
+ die "Can't detect your bootloader\n";
+}
+exec "reboot" unless $noreboot;
+
+
+sub list_entries { print "$_\n" foreach @entries; exit(0) }
+
+sub lilo_conf {
+ open(my $F, $lilo_conf) or die "lilo is not installed ($lilo_conf is missing)\n";
+ @entries = map { /="?([^"\n]+)/ } grep { /\s*label=\S*/ } <$F>;
+ list_entries() if $list;
+ @entries > 0 or die "Bad lilo.conf (no entry found)\n";
+ grep { $_ eq $wanted_entry } @entries or usage();
+ write_fast_boot() if $fastboot;
+ system("lilo -R $wanted_entry"); die "error while wanting to reboot on $wanted_entry\n" if $?;
+}
+
+sub grub_conf {
+ open(my $F, $grub_menu) or die "grub is not installed ($grub_menu is missing)\n";
+ my @short_entries;
+ foreach (<$F>) {
+ if (/^title\s+(.*)/) {
+ push @entries, $1;
+ } elsif (/BOOT_IMAGE=(\S+)/) {
+ $short_entries[$#entries] = $1;
+ }
+ }
+ list_entries() if $list;
+ @entries > 0 or die "bad menu.lst (no entry found)\n";
+
+ for (my $i = 0; $i < @entries; $i++) {
+ if ($wanted_entry eq $entries[$i] || $wanted_entry eq $short_entries[$i]) {
+ set_grub($i);
+ return;
+ }
+ }
+
+ print STDERR "$wanted_entry not found\n";
+ usage(); # not found
+}
+
+sub set_grub {
+ open(my $F, "| grub --device-map=/boot/grub/device.map --batch");
+ print $F "savedefault --default=$_[0] --once\nquit\n";
+ write_fast_boot() if $fastboot;
+}
+
+sub usage {
+ my $entries = @entries ? " where <label> is one of " . join(", ", @entries) . "\n" : '';
+ die <<'EOF' . $entries;
+usage: rebootin -l
+ rebootin [-n] [-f] <label>
+EOF
+}
+
+sub write_fast_boot {
+ open(my $_F, ">/fastboot");
+}