From: Bernard Li <bl...@sy...> - 2006-01-17 06:06:26
|
Author: bli Date: 2006-01-17 04:16:58 -0600 (Tue, 17 Jan 2006) New Revision: 3406 Modified: branches/3.6.x/lib/SystemImager/UseYourOwnKernel.pm Log: New subroutine is_kernel() to determine if specified file is a kernel - original code from BEF - currently supports Red Hat, Fedora, Mandriva, SuSE kernels - when choosing kernel for UYOK, preference given to kernel = running version, otherwise first good kernel is used Modified: branches/3.6.x/lib/SystemImager/UseYourOwnKernel.pm =================================================================== --- branches/3.6.x/lib/SystemImager/UseYourOwnKernel.pm 2006-01-16 22:58:17 UTC (rev 3405) +++ branches/3.6.x/lib/SystemImager/UseYourOwnKernel.pm 2006-01-17 10:16:58 UTC (rev 3406) @@ -162,6 +162,8 @@ exit 1; } + print ">>> Using kernel from: $kernel_file\n" if( $verbose ); + my $new_kernel_file = $boot_dir . "/kernel"; copy($kernel_file, $new_kernel_file) or die("Couldn't copy $kernel_file to $new_kernel_file: $!"); run_cmd("ls -l $new_kernel_file", $verbose, 1) if($verbose); @@ -169,8 +171,30 @@ return 1; } +# +# Usage: my $is_this_file_a_kernel = is_kernel( $kernel ); +# +sub is_kernel { + my $file = shift; + if( ! -B $file ) { return undef; } + if( -d $file ) { return undef; } + + my $cmd = "file -b $file"; + open(INPUT,"$cmd|") or die("Couldn't run $cmd to get INPUT"); + my ($input) = (<INPUT>); + unless( + $input =~ m/boot sector/ # Red Hat, Fedora, Mandriva + || $input =~ m/Kernel, Setup Version/ # SuSE + ) { return undef; } + close(INPUT); + + # + # If we've made it down to here, then we consider it a kernel. -BEF- + return 1; +} + # # Usage: # my $kernel_file = _choose_kernel_file( $uname_r ); @@ -178,13 +202,14 @@ sub _choose_kernel_file($) { my $uname_r = shift; - my @dirs = ('/boot', '/'); + my @kernels; foreach my $dir (@dirs) { # - # Check each binary to see if it contains vmlinuz and the uname string + # Check each binary to see if it is a kernel file. Preference given to the file with + # the running kernel version, otherwise, the first available good kernel file is used. # opendir(DIR, $dir) || die("Can't opendir $dir: $!"); my @files = readdir(DIR); @@ -193,10 +218,20 @@ foreach (@files) { my $kernel = $_; my $file = "$dir/$kernel"; - next unless( (-B $file) and (! -d $file) ); - my $kernel_release = _get_kernel_release($file); - return $file if( defined($kernel_release) and ($kernel_release eq $uname_r) and ($kernel =~ /^vmlinuz/) ); + if ( is_kernel($file) ) { + my $kernel_release = _get_kernel_release($file); + if ( defined($kernel_release) and ($kernel_release eq $uname_r) ) { + return $file; + } else { + push(@kernels, $file); + } + } } + + # If cannot find kernel with name matching running version, return the first good one + if (@kernels) { + return pop(@kernels); + } } return undef; |