Index: client/tools/boottool |
diff --git a/client/tools/boottool b/client/tools/boottool |
index 4dafbab4d4561101e25656ef3349b80a9ecc0a12..728e4ef4ff4d29cbcddc7c37f912830d8c8ca166 100755 |
--- a/client/tools/boottool |
+++ b/client/tools/boottool |
@@ -791,6 +791,38 @@ sub detect_architecture { |
return $arch; |
} |
+=head3 detect_os_vendor() |
+ |
+Input: |
+Output: string |
+ |
+This function determines the OS vendor (linux distribution breed). |
+ |
+Return values: "Red Hat", "Fedora", "SUSE", "Ubuntu", "Debian", or |
+"Unknown" if none of the predefined patterns could be found on the |
+issue file. |
+ |
+=cut |
+ |
+sub detect_os_vendor { |
+ my $vendor = ""; |
+ my $issue_file = '/etc/issue'; |
+ if ( not system("egrep 'Red Hat' $issue_file") ){ |
+ $vendor = 'Red Hat'; |
+ } elsif ( not system("egrep 'Fedora' $issue_file") ){ |
+ $vendor = 'Fedora'; |
+ } elsif ( not system("egrep 'SUSE' $issue_file") ){ |
+ $vendor = 'SUSE'; |
+ } elsif ( not system("egrep 'Ubuntu' $issue_file") ){ |
+ $vendor = 'Ubuntu'; |
+ } elsif ( not system("egrep 'Debian' $issue_file") ){ |
+ $vendor = 'Debian'; |
+ } else { |
+ $vendor = 'Unknown'; |
+ } |
+ return $vendor; |
+} |
+ |
=head3 detect_bootloader(['device1', 'device2', ...]) |
Input: devices to detect against (optional) |
@@ -1595,20 +1627,31 @@ sub update_main_options{ |
sub boot_once { |
my $self=shift; |
my $entry_to_boot_once = shift; |
+ my $detected_os_vendor = Linux::Bootloader::Detect::detect_os_vendor(); |
unless ( $entry_to_boot_once ) { print "No kernel\n"; return undef;} |
$self->read(); |
my $default=$self->get_default(); |
- if ( $default == $self->_lookup($entry_to_boot_once)){ |
- warn "The default and once-boot kernels are the same. No action taken. \nSet default to something else, then re-try.\n"; |
- return undef; |
- } |
if ( $self->_get_bootloader_version() < 0.97 ){ |
warn "This function works for grub version 0.97 and up. No action taken. \nUpgrade, then re-try.\n"; |
return undef; |
} |
+ if ( $detected_os_vendor eq "Red Hat" or $detected_os_vendor eq "Fedora" ) { |
+ # if not a number, do title lookup |
+ if ( $entry_to_boot_once !~ /^\d+$/ ) { |
+ $entry_to_boot_once = $self->_lookup($entry_to_boot_once); |
+ return undef unless ( defined $entry_to_boot_once ); |
+ } |
+ |
+ return `echo "savedefault --default=$entry_to_boot_once" --once | grub --batch`; |
+ } else { |
+ if ( $default == $self->_lookup($entry_to_boot_once)){ |
+ warn "The default and once-boot kernels are the same. No action taken. \nSet default to something else, then re-try.\n"; |
+ return undef; |
+ } |
+ |
$self->set_default('saved'); |
if ( ! -f '/boot/grub/default' ){ |
open FH, '>/boot/grub/default'; |
@@ -1635,7 +1678,7 @@ sub boot_once { |
$self->update( 'update-kernel'=>"$entry_to_boot_once",'option'=>'','savedefault' => 'fallback' ); |
$self->update( 'update-kernel'=>"$default",'option'=>'', 'savedefault' => '' ); |
$self->write(); |
- |
+ } |
} |
sub _get_bootloader_version { |