Handle the case where grub refers to a kernel which doesn't exist by ignoring that kernel. --- lib/Sys/VirtV2V/GuestOS/RedHat.pm | 46 +++++++++++++++++------------------- 1 files changed, 22 insertions(+), 24 deletions(-) diff --git a/lib/Sys/VirtV2V/GuestOS/RedHat.pm b/lib/Sys/VirtV2V/GuestOS/RedHat.pm index 77d9332..10ff77d 100644 --- a/lib/Sys/VirtV2V/GuestOS/RedHat.pm +++ b/lib/Sys/VirtV2V/GuestOS/RedHat.pm @@ -350,39 +350,37 @@ sub get_default_kernel $default = $g->aug_get('/files/boot/grub/menu.lst/default'); }; + # Get the grub filesystem + my $grub = $self->{desc}->{boot}->{grub_fs}; + + # Look for a kernel, starting with the default + my @paths; + push(@paths, $g->aug_match("/files/boot/grub/menu.lst/". + "title[$default]/kernel")) if defined($default); + push(@paths, $g->aug_match('/files/boot/grub/menu.lst/title/kernel')); + my $kernel; - if(defined($default)) { - # Grub's default is zero-based, but augeas arrays are 1-based. - $default += 1; + foreach my $path (@paths) { + $kernel = $g->aug_get($path); - # Check it's got a kernel entry - eval { - $kernel = - $g->aug_get("/files/boot/grub/menu.lst/title[$default]/kernel"); - }; - } + # Prepend the grub filesystem to the kernel path + $kernel = "$grub$kernel" if(defined($grub)); - # If we didn't find a default, find the first listed kernel - if(!defined($kernel)) { - eval { - my @paths = $g->aug_match('/files/boot/grub/menu.lst/title/kernel'); + # Prepend the grub filesystem to the kernel path + $kernel = "$grub$kernel" if(defined($grub)); - $kernel = $g->aug_get($paths[0]) if(@paths > 0); - }; + # Check the kernel exists + last if($g->exists($kernel)); + + $kernel = undef; + print STDERR user_message(__x("WARNING: grub refers to ". + "{path}, which doesn't exist.")); } # If we got here, grub doesn't contain any kernels. Give up. die(user_message(__"Unable to find a default kernel")) unless(defined($kernel)); - my $desc = $self->{desc}; - - # Get the grub filesystem - my $grub = $desc->{boot}->{grub_fs}; - - # Prepend the grub filesystem to the kernel path to get an absolute path - $kernel = "$grub$kernel" if(defined($grub)); - # Work out it's version number my $kernel_desc = inspect_linux_kernel ($g, $kernel, 'rpm'); -- 1.6.6.1