Code drop for new requirement: Add a new flag --ignorekernelchk for nodeset, geninitrd and genimage commands to skip the kernel version checking when injecting drivers from osimage.driverupdatesrc
This commit is contained in:
		@@ -42,6 +42,7 @@ my $mode;
 | 
			
		||||
my $interactive;
 | 
			
		||||
my $onlyinitrd;
 | 
			
		||||
my $dryrun;
 | 
			
		||||
my $ignorekernelchk;
 | 
			
		||||
#-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
=head3 print_usage   - usage message
 | 
			
		||||
@@ -88,6 +89,7 @@ if (!GetOptions(
 | 
			
		||||
         'interactive' => \$interactive,  
 | 
			
		||||
         'onlyinitrd' => \$onlyinitrd, 
 | 
			
		||||
         'dryrun' => \$dryrun,
 | 
			
		||||
	 'ignorekernelchk' => \$ignorekernelchk,
 | 
			
		||||
	 'h|help' => \$help,
 | 
			
		||||
	 'v|version' => \$version,
 | 
			
		||||
)) {
 | 
			
		||||
@@ -404,6 +406,10 @@ if ($dryrun) {
 | 
			
		||||
    push @arg, "--dryrun";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ($ignorekernelchk) {
 | 
			
		||||
    push @arg, "--ignorekernelchk";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $cmdref;
 | 
			
		||||
push (@{$cmdref->{arg}}, @arg);
 | 
			
		||||
$cmdref->{command}->[0] = "genimage";   
 | 
			
		||||
 
 | 
			
		||||
@@ -174,6 +174,7 @@ sub mknetboot
 | 
			
		||||
    my @args     = @{$req->{arg}} if(exists($req->{arg}));
 | 
			
		||||
    my @nodes    = @{$req->{node}};
 | 
			
		||||
    my $noupdateinitrd = $req->{'noupdateinitrd'};
 | 
			
		||||
    my $ignorekernelchk = $req->{'ignorekernelchk'};
 | 
			
		||||
    my $ostab    = xCAT::Table->new('nodetype');
 | 
			
		||||
    #my $sitetab  = xCAT::Table->new('site');
 | 
			
		||||
    my $linuximagetab;
 | 
			
		||||
@@ -940,6 +941,7 @@ sub mkinstall
 | 
			
		||||
    my $doreq    = shift;
 | 
			
		||||
    my @nodes    = @{$request->{node}};
 | 
			
		||||
    my $noupdateinitrd = $request->{'noupdateinitrd'};
 | 
			
		||||
    my $ignorekernelchk = $request->{'ignorekernelchk'};
 | 
			
		||||
    #my $sitetab  = xCAT::Table->new('site');
 | 
			
		||||
    my $linuximagetab;
 | 
			
		||||
    my $osimagetab;
 | 
			
		||||
@@ -1352,7 +1354,7 @@ sub mkinstall
 | 
			
		||||
                    unless ($noupdateinitrd) {
 | 
			
		||||
                        copy($kernpath,"$tftppath");
 | 
			
		||||
                        copy($initrdpath,"$tftppath/initrd.img");
 | 
			
		||||
                        &insert_dd($callback, $os, $arch, "$tftppath/initrd.img", "$tftppath/vmlinuz", $driverupdatesrc, $netdrivers, $osupdir);
 | 
			
		||||
                        &insert_dd($callback, $os, $arch, "$tftppath/initrd.img", "$tftppath/vmlinuz", $driverupdatesrc, $netdrivers, $osupdir, $ignorekernelchk);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -2428,6 +2430,7 @@ sub insert_dd {
 | 
			
		||||
    my $driverupdatesrc = shift;
 | 
			
		||||
    my $drivers = shift;
 | 
			
		||||
    my $osupdirlist = shift;
 | 
			
		||||
    my $ignorekernelchk = shift;
 | 
			
		||||
 | 
			
		||||
    my $install_dir = xCAT::TableUtils->getInstallDir();
 | 
			
		||||
 | 
			
		||||
@@ -2438,6 +2441,7 @@ sub insert_dd {
 | 
			
		||||
    
 | 
			
		||||
    my @dd_list;
 | 
			
		||||
    my @rpm_list;
 | 
			
		||||
    my @vendor_rpm; # the rpms from driverupdatesrc attribute
 | 
			
		||||
    my @driver_list;
 | 
			
		||||
    my $Injectalldriver;
 | 
			
		||||
    my $updatealldriver;
 | 
			
		||||
@@ -2467,8 +2471,10 @@ sub insert_dd {
 | 
			
		||||
                push @dd_list, $1;
 | 
			
		||||
            } elsif ($src =~ /rpm:(.*)/i) {
 | 
			
		||||
                push @rpm_list, $1;
 | 
			
		||||
                push @vendor_rpm, $1;
 | 
			
		||||
            } else {
 | 
			
		||||
                push @rpm_list, $src;
 | 
			
		||||
                push @vendor_rpm, $src;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -2497,6 +2503,7 @@ sub insert_dd {
 | 
			
		||||
 | 
			
		||||
    chomp(@dd_list);
 | 
			
		||||
    chomp(@rpm_list);
 | 
			
		||||
    chomp(@vendor_rpm);
 | 
			
		||||
    
 | 
			
		||||
    unless (@dd_list || (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list))) {
 | 
			
		||||
        return ();
 | 
			
		||||
@@ -2605,24 +2612,48 @@ sub insert_dd {
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                # To skip the conflict of files that some rpm uses the xxx.ko.new as the name of the driver
 | 
			
		||||
                # Change it back to xxx.ko here
 | 
			
		||||
                $driver_name = "\*ko.new";
 | 
			
		||||
                @all_real_path = ();
 | 
			
		||||
                find(\&get_all_path, <$dd_dir/rpm/*>);
 | 
			
		||||
                foreach my $file (@all_real_path) {
 | 
			
		||||
                    my $newname = $file;
 | 
			
		||||
                    $newname =~ s/\.new$//;
 | 
			
		||||
                    $cmd = "/bin/mv -f $file $newname";
 | 
			
		||||
                    xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                    if ($::RUNCMD_RC != 0) {
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            # Extract files from vendor rpm when $ignorekernelchk is specified
 | 
			
		||||
            if ($ignorekernelchk) {
 | 
			
		||||
                mkpath "$dd_dir/vendor_rpm";
 | 
			
		||||
                foreach my $rpm (@vendor_rpm) {
 | 
			
		||||
                    if (-r $rpm) {
 | 
			
		||||
                        $cmd = "cd $dd_dir/vendor_rpm; rpm2cpio $rpm | cpio -idum";
 | 
			
		||||
                        xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                        if ($::RUNCMD_RC != 0) {
 | 
			
		||||
                            my $rsp;
 | 
			
		||||
                            push @{$rsp->{data}}, "Handle the driver update failed. Could not extract files from the rpm $rpm.";
 | 
			
		||||
                            xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        my $rsp;
 | 
			
		||||
                        push @{$rsp->{data}}, "Handle the driver update failed. Could not move $file.";
 | 
			
		||||
                        push @{$rsp->{data}}, "Handle the driver update failed. Could not read the rpm $rpm.";
 | 
			
		||||
                        xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            # To skip the conflict of files that some rpm uses the xxx.ko.new as the name of the driver
 | 
			
		||||
            # Change it back to xxx.ko here
 | 
			
		||||
            $driver_name = "\*ko.new";
 | 
			
		||||
            @all_real_path = ();
 | 
			
		||||
            my @rpmfiles = <$dd_dir/rpm/*>;
 | 
			
		||||
            if ($ignorekernelchk) {
 | 
			
		||||
                push @rpmfiles, <$dd_dir/vendor_rpm/*>;
 | 
			
		||||
            }
 | 
			
		||||
            find(\&get_all_path, @rpmfiles);
 | 
			
		||||
            foreach my $file (@all_real_path) {
 | 
			
		||||
                my $newname = $file;
 | 
			
		||||
                $newname =~ s/\.new$//;
 | 
			
		||||
                $cmd = "/bin/mv -f $file $newname";
 | 
			
		||||
                xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                if ($::RUNCMD_RC != 0) {
 | 
			
		||||
                    my $rsp;
 | 
			
		||||
                    push @{$rsp->{data}}, "Handle the driver update failed. Could not move $file.";
 | 
			
		||||
                    xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        # The rh6 has different initrd format with old version (rh 5.x)
 | 
			
		||||
@@ -2683,9 +2714,27 @@ sub insert_dd {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                foreach my $kernelver (@kernelvers) {
 | 
			
		||||
                  # if $ignorekernelchk is specified, copy all files from vendor_rpm dir to target kernel dir
 | 
			
		||||
                  if ($ignorekernelchk) {
 | 
			
		||||
                      my @kernelpath4vrpm = <$dd_dir/vendor_rpm/lib/modules/*>;
 | 
			
		||||
                      foreach my $path (@kernelpath4vrpm) {
 | 
			
		||||
                          unless (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                              mkpath "$dd_dir/rpm/lib/modules/$kernelver";
 | 
			
		||||
                          }
 | 
			
		||||
                          $cmd = "/bin/cp -rf $path/* $dd_dir/rpm/lib/modules/$kernelver";
 | 
			
		||||
                          xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                          if ($::RUNCMD_RC != 0) {
 | 
			
		||||
                              my $rsp;
 | 
			
		||||
                              push @{$rsp->{data}}, "Handle the driver update failed. Could not copy driver $path from vendor rpm.";
 | 
			
		||||
                              xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                          }
 | 
			
		||||
                      }
 | 
			
		||||
                  }
 | 
			
		||||
                  
 | 
			
		||||
                  unless (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                      next;
 | 
			
		||||
                  }
 | 
			
		||||
 | 
			
		||||
                  if (@driver_list) {
 | 
			
		||||
                    foreach my $driver (@driver_list) {
 | 
			
		||||
                      $driver =~ s/\.gz$//;
 | 
			
		||||
@@ -2902,9 +2951,27 @@ sub insert_dd {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
               foreach my $kernelver (@kernelvers) {
 | 
			
		||||
                  # if $ignorekernelchk is specified, copy all files from vendor_rpm dir to target kernel dir
 | 
			
		||||
                  if ($ignorekernelchk) {
 | 
			
		||||
                      my @kernelpath4vrpm = <$dd_dir/vendor_rpm/lib/modules/*>;
 | 
			
		||||
                      foreach my $path (@kernelpath4vrpm) {
 | 
			
		||||
                          unless (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                              mkpath "$dd_dir/rpm/lib/modules/$kernelver";
 | 
			
		||||
                          }
 | 
			
		||||
                          $cmd = "/bin/cp -rf $path/* $dd_dir/rpm/lib/modules/$kernelver";
 | 
			
		||||
                          xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                          if ($::RUNCMD_RC != 0) {
 | 
			
		||||
                              my $rsp;
 | 
			
		||||
                              push @{$rsp->{data}}, "Handle the driver update failed. Could not copy driver $path from vendor rpm.";
 | 
			
		||||
                              xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                          }
 | 
			
		||||
                      }
 | 
			
		||||
                  }
 | 
			
		||||
                  
 | 
			
		||||
                  unless (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                      next;
 | 
			
		||||
                  }
 | 
			
		||||
 | 
			
		||||
                  # create path for the new kernel in the modules package
 | 
			
		||||
                  unless (-d "$dd_dir/modules/$kernelver") {
 | 
			
		||||
                      mkpath ("$dd_dir/modules/$kernelver/$arch/");
 | 
			
		||||
@@ -3155,7 +3222,7 @@ sub insert_dd {
 | 
			
		||||
        if (@rpm_drivers) {
 | 
			
		||||
            push @{$rsp->{data}}, "The drivers:".join(',', sort(@rpm_drivers))." from ".join(',', sort(@rpm_list))." have been injected to initrd.";
 | 
			
		||||
        } elsif ($Injectalldriver) {
 | 
			
		||||
            push @{$rsp->{data}}, "All the drivers from :".join(',', sort(@rpm_list))." have been injected to initrd.";
 | 
			
		||||
            push @{$rsp->{data}}, "All the drivers from: ".join(',', sort(@rpm_list))." have been injected to initrd.";
 | 
			
		||||
        } else {
 | 
			
		||||
            push @{$rsp->{data}}, "No driver was injected to initrd.";
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -93,7 +93,9 @@ sub setdestiny {
 | 
			
		||||
 | 
			
		||||
    @ARGV = @{$req->{arg}};
 | 
			
		||||
    my $noupdateinitrd;
 | 
			
		||||
    GetOptions('noupdateinitrd' => \$noupdateinitrd,);
 | 
			
		||||
    my $ignorekernelchk;
 | 
			
		||||
    GetOptions('noupdateinitrd' => \$noupdateinitrd,
 | 
			
		||||
               'ignorekernelchk' => \$ignorekernelchk,);
 | 
			
		||||
    
 | 
			
		||||
    my $state = $ARGV[0];
 | 
			
		||||
    my $reststates;
 | 
			
		||||
@@ -304,7 +306,8 @@ sub setdestiny {
 | 
			
		||||
	    $errored=0;
 | 
			
		||||
	    $subreq->({command=>["mk$tempstate"],
 | 
			
		||||
		       node=>$samestatenodes, 
 | 
			
		||||
		       noupdateinitrd=>$noupdateinitrd}, \&relay_response);
 | 
			
		||||
		       noupdateinitrd=>$noupdateinitrd,
 | 
			
		||||
                       ignorekernelchk=>$ignorekernelchk,}, \&relay_response);
 | 
			
		||||
	    if ($errored) { 
 | 
			
		||||
		$callback->({error=>"Some nodes failed to set up $state resources, aborting"});
 | 
			
		||||
		return; 
 | 
			
		||||
 
 | 
			
		||||
@@ -69,6 +69,7 @@ sub process_request {
 | 
			
		||||
   my $onlyinitrd;
 | 
			
		||||
   my $tempfile;
 | 
			
		||||
   my $dryrun;
 | 
			
		||||
   my $ignorekernelchk;
 | 
			
		||||
 | 
			
		||||
   GetOptions(
 | 
			
		||||
       'a=s' => \$arch,
 | 
			
		||||
@@ -88,6 +89,7 @@ sub process_request {
 | 
			
		||||
       'onlyinitrd' => \$onlyinitrd,
 | 
			
		||||
       'tempfile=s' => \$tempfile,
 | 
			
		||||
       'dryrun' => \$dryrun, 
 | 
			
		||||
       'ignorekernelchk' => \$ignorekernelchk,
 | 
			
		||||
       );
 | 
			
		||||
 | 
			
		||||
   my $osimagetab;
 | 
			
		||||
@@ -298,6 +300,7 @@ sub process_request {
 | 
			
		||||
       if (!$dryrun) { $cmd .= " --tempfile $tempfile"; } 
 | 
			
		||||
   }
 | 
			
		||||
   if ($driverupdatesrc) { $cmd .= " --driverupdatesrc $driverupdatesrc"; }
 | 
			
		||||
   if ($ignorekernelchk) { $cmd .= " --ignorekernelchk $ignorekernelchk"; }
 | 
			
		||||
 | 
			
		||||
   if($osfamily eq "sles") {
 | 
			
		||||
       my @entries =  xCAT::TableUtils->get_site_attribute("timezone");
 | 
			
		||||
 
 | 
			
		||||
@@ -28,15 +28,20 @@ sub preprocess_request
 | 
			
		||||
 | 
			
		||||
    my $usage = sub {
 | 
			
		||||
        my $callback = shift;
 | 
			
		||||
        xCAT::MsgUtils->message("I", {data=>["Usage: geninitrd <imagename> [-h | --help]"]}, $callback);
 | 
			
		||||
        xCAT::MsgUtils->message("I", {data=>["Usage: geninitrd <imagename> [--ignorekernelchk] [-h | --help]"]}, $callback);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    my $osimage;
 | 
			
		||||
    my $ignorekernelchk;
 | 
			
		||||
    if (defined ($req->{arg})) {
 | 
			
		||||
        foreach (@{$req->{arg}}) {
 | 
			
		||||
            if (/^-/) {
 | 
			
		||||
                $usage->($callback);
 | 
			
		||||
                return;
 | 
			
		||||
                if (/--ignorekernelchk/) {
 | 
			
		||||
                    $ignorekernelchk = 1;
 | 
			
		||||
                } else {
 | 
			
		||||
                    $usage->($callback);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }else {
 | 
			
		||||
                $osimage = $_;
 | 
			
		||||
            }
 | 
			
		||||
@@ -51,11 +56,13 @@ sub preprocess_request
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
    $req->{'ignorekernelchk'} = [$ignorekernelchk];
 | 
			
		||||
 | 
			
		||||
    #if tftpshared is not set, dispatch this command to all the service nodes
 | 
			
		||||
    my @entries =  xCAT::TableUtils->get_site_attribute("sharedtftp");
 | 
			
		||||
    my $t_entry = $entries[0];
 | 
			
		||||
    if ( defined($t_entry) and ($t_entry == 0 or $t_entry =~ /no/i)) {
 | 
			
		||||
        $req->{'_disparatetftp'}=[1];
 | 
			
		||||
        $req->{'_disparatetftp'} = [1];
 | 
			
		||||
        return xCAT::Scope->get_broadcast_scope($req,@_);
 | 
			
		||||
    }
 | 
			
		||||
   return [$req];
 | 
			
		||||
@@ -81,6 +88,10 @@ sub geninitrd {
 | 
			
		||||
    my $doreq = shift;
 | 
			
		||||
 | 
			
		||||
    my $osimage = $req->{arg}->[0];
 | 
			
		||||
    my $ignorekernelchk;
 | 
			
		||||
    if (defined ($req->{'ignorekernelchk'}) && $req->{'ignorekernelchk'}->[0]) {
 | 
			
		||||
        $ignorekernelchk = $req->{'ignorekernelchk'}->[0];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my ($osvers, $arch, $pkgdir, $driverupdatesrc, $netdrivers, $osdisupdir);
 | 
			
		||||
 | 
			
		||||
@@ -218,10 +229,10 @@ sub geninitrd {
 | 
			
		||||
    # 2. Inject the drivers to initrd in /tftpboot base on the new kernel ver
 | 
			
		||||
    if ($osvers =~ /(^ol[0-9].*)|(centos.*)|(rh.*)|(fedora.*)|(SL.*)/) {
 | 
			
		||||
        require  xCAT_plugin::anaconda;
 | 
			
		||||
        xCAT_plugin::anaconda->insert_dd($callback, $osvers, $arch, $initrdpath, $kernelpath, $driverupdatesrc, $netdrivers, $osdisupdir);
 | 
			
		||||
        xCAT_plugin::anaconda->insert_dd($callback, $osvers, $arch, $initrdpath, $kernelpath, $driverupdatesrc, $netdrivers, $osdisupdir, $ignorekernelchk);
 | 
			
		||||
    } elsif ($osvers =~ /(sles.*)|(suse.*)/) {
 | 
			
		||||
        require  xCAT_plugin::sles;
 | 
			
		||||
        xCAT_plugin::sles->insert_dd($callback, $osvers, $arch, $initrdpath, $kernelpath, $driverupdatesrc, $netdrivers, $osdisupdir);
 | 
			
		||||
        xCAT_plugin::sles->insert_dd($callback, $osvers, $arch, $initrdpath, $kernelpath, $driverupdatesrc, $netdrivers, $osdisupdir, $ignorekernelchk);
 | 
			
		||||
    } 
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,7 @@ sub mknetboot
 | 
			
		||||
    my $nodes    = @{$req->{node}};
 | 
			
		||||
    my @nodes    = @{$req->{node}};
 | 
			
		||||
    my $noupdateinitrd = $req->{'noupdateinitrd'};
 | 
			
		||||
    my $ignorekernelchk = $req->{'ignorekernelchk'};
 | 
			
		||||
    my $ostab    = xCAT::Table->new('nodetype');
 | 
			
		||||
    #my $sitetab  = xCAT::Table->new('site');
 | 
			
		||||
    my $linuximagetab;
 | 
			
		||||
@@ -710,6 +711,7 @@ sub mkinstall
 | 
			
		||||
    my $globaltftpdir = xCAT::TableUtils->getTftpDir();
 | 
			
		||||
 | 
			
		||||
    my $noupdateinitrd = $request->{'noupdateinitrd'};
 | 
			
		||||
    my $ignorekernelchk = $request->{'ignorekernelchk'};
 | 
			
		||||
    my @nodes    = @{$request->{node}};
 | 
			
		||||
    my $node;
 | 
			
		||||
    my $ostab = xCAT::Table->new('nodetype');
 | 
			
		||||
@@ -1038,20 +1040,20 @@ sub mkinstall
 | 
			
		||||
                    unless ($noupdateinitrd) {
 | 
			
		||||
                        copy("$pkgdir/1/boot/$arch/loader/linux", "$tftppath");
 | 
			
		||||
                        copy("$pkgdir/1/boot/$arch/loader/initrd", "$tftppath");
 | 
			
		||||
                        @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/initrd", "$tftppath/linux", $driverupdatesrc, $netdrivers, $osupdir);
 | 
			
		||||
                        @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/initrd", "$tftppath/linux", $driverupdatesrc, $netdrivers, $osupdir, $ignorekernelchk);
 | 
			
		||||
                    }
 | 
			
		||||
                } elsif ($arch =~ /x86/) {
 | 
			
		||||
                    unless ($noupdateinitrd) {
 | 
			
		||||
                        copy("$pkgdir/1/boot/i386/loader/linux", "$tftppath");
 | 
			
		||||
                        copy("$pkgdir/1/boot/i386/loader/initrd", "$tftppath");
 | 
			
		||||
                        @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/initrd", "$tftppath/linux", $driverupdatesrc, $netdrivers, $osupdir);
 | 
			
		||||
                        @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/initrd", "$tftppath/linux", $driverupdatesrc, $netdrivers, $osupdir, $ignorekernelchk);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                elsif ($arch =~ /ppc/)
 | 
			
		||||
                {
 | 
			
		||||
                    unless ($noupdateinitrd) {
 | 
			
		||||
                        copy("$pkgdir/1/suseboot/inst64", "$tftppath");
 | 
			
		||||
                        @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/inst64", undef, $driverupdatesrc, $netdrivers, $osupdir);
 | 
			
		||||
                        @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/inst64", undef, $driverupdatesrc, $netdrivers, $osupdir, $ignorekernelchk);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -1948,6 +1950,7 @@ sub insert_dd () {
 | 
			
		||||
    my $driverupdatesrc = shift;
 | 
			
		||||
    my $drivers = shift;
 | 
			
		||||
    my $osupdirlist = shift;
 | 
			
		||||
    my $ignorekernelchk = shift;
 | 
			
		||||
 | 
			
		||||
    my $install_dir = xCAT::TableUtils->getInstallDir();
 | 
			
		||||
 | 
			
		||||
@@ -1955,6 +1958,7 @@ sub insert_dd () {
 | 
			
		||||
    
 | 
			
		||||
    my @dd_list;
 | 
			
		||||
    my @rpm_list;
 | 
			
		||||
    my @vendor_rpm; # the rpms from driverupdatesrc attribute
 | 
			
		||||
    my @driver_list;
 | 
			
		||||
    my $Injectalldriver;
 | 
			
		||||
    my $updatealldriver;
 | 
			
		||||
@@ -1985,8 +1989,10 @@ sub insert_dd () {
 | 
			
		||||
                push @dd_list, $1;
 | 
			
		||||
            } elsif ($src =~ /rpm:(.*)/i) {
 | 
			
		||||
                push @rpm_list, $1;
 | 
			
		||||
                push @vendor_rpm, $1;
 | 
			
		||||
            } else {
 | 
			
		||||
                push @rpm_list, $src;
 | 
			
		||||
                push @vendor_rpm, $src;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -2015,6 +2021,7 @@ sub insert_dd () {
 | 
			
		||||
 | 
			
		||||
    chomp(@dd_list);
 | 
			
		||||
    chomp(@rpm_list);
 | 
			
		||||
    chomp(@vendor_rpm);
 | 
			
		||||
    
 | 
			
		||||
    unless (@dd_list || (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list))) {
 | 
			
		||||
        return ();
 | 
			
		||||
@@ -2086,26 +2093,50 @@ sub insert_dd () {
 | 
			
		||||
                            xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                } 
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
                # To skip the conflict of files that some rpm uses the xxx.ko.new as the name of the driver
 | 
			
		||||
                # Change it back to xxx.ko here
 | 
			
		||||
                $driver_name = "\*ko.new";
 | 
			
		||||
                @all_real_path = ();
 | 
			
		||||
                find(\&get_all_path, <$dd_dir/rpm/*>);
 | 
			
		||||
                foreach my $file (@all_real_path) {
 | 
			
		||||
                    my $newname = $file;
 | 
			
		||||
                    $newname =~ s/\.new$//;
 | 
			
		||||
                    $cmd = "mv -f $file $newname";
 | 
			
		||||
                    xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                    if ($::RUNCMD_RC != 0) {
 | 
			
		||||
            # Extract files from vendor rpm when $ignorekernelchk is specified
 | 
			
		||||
            if ($ignorekernelchk) {
 | 
			
		||||
                mkpath "$dd_dir/vendor_rpm";
 | 
			
		||||
                foreach my $rpm (@vendor_rpm) {
 | 
			
		||||
                    if (-r $rpm) {
 | 
			
		||||
                        $cmd = "cd $dd_dir/vendor_rpm; rpm2cpio $rpm | cpio -idum";
 | 
			
		||||
                        xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                        if ($::RUNCMD_RC != 0) {
 | 
			
		||||
                            my $rsp;
 | 
			
		||||
                            push @{$rsp->{data}}, "Handle the driver update failed. Could not extract files from the rpm $rpm.";
 | 
			
		||||
                            xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        my $rsp;
 | 
			
		||||
                        push @{$rsp->{data}}, "Handle the driver update failed. Could not rename $file.";
 | 
			
		||||
                        push @{$rsp->{data}}, "Handle the driver update failed. Could not read the rpm $rpm.";
 | 
			
		||||
                        xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            # To skip the conflict of files that some rpm uses the xxx.ko.new as the name of the driver
 | 
			
		||||
            # Change it back to xxx.ko here
 | 
			
		||||
            $driver_name = "\*ko.new";
 | 
			
		||||
            @all_real_path = ();
 | 
			
		||||
            my @rpmfiles = <$dd_dir/rpm/*>;
 | 
			
		||||
            if ($ignorekernelchk) {
 | 
			
		||||
                push @rpmfiles, <$dd_dir/vendor_rpm/*>;
 | 
			
		||||
            }
 | 
			
		||||
            find(\&get_all_path, @rpmfiles);
 | 
			
		||||
            foreach my $file (@all_real_path) {
 | 
			
		||||
                my $newname = $file;
 | 
			
		||||
                $newname =~ s/\.new$//;
 | 
			
		||||
                $cmd = "mv -f $file $newname";
 | 
			
		||||
                xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                if ($::RUNCMD_RC != 0) {
 | 
			
		||||
                    my $rsp;
 | 
			
		||||
                    push @{$rsp->{data}}, "Handle the driver update failed. Could not rename $file.";
 | 
			
		||||
                    xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            # Copy the firmware to the rootimage
 | 
			
		||||
            if (-d "$dd_dir/rpm/lib/firmware") {
 | 
			
		||||
                if (! -d "$dd_dir/initrd_img/lib") {
 | 
			
		||||
@@ -2165,9 +2196,27 @@ sub insert_dd () {
 | 
			
		||||
            }
 | 
			
		||||
                    
 | 
			
		||||
            foreach my $kernelver (@kernelvers) {
 | 
			
		||||
              # if $ignorekernelchk is specified, copy all files from vendor_rpm dir to target kernel dir
 | 
			
		||||
              if ($ignorekernelchk) {
 | 
			
		||||
                  my @kernelpath4vrpm = <$dd_dir/vendor_rpm/lib/modules/*>;
 | 
			
		||||
                  foreach my $path (@kernelpath4vrpm) {
 | 
			
		||||
                      unless (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                          mkpath "$dd_dir/rpm/lib/modules/$kernelver";
 | 
			
		||||
                      }
 | 
			
		||||
                      $cmd = "/bin/cp -rf $path/* $dd_dir/rpm/lib/modules/$kernelver";
 | 
			
		||||
                      xCAT::Utils->runcmd($cmd, -1);
 | 
			
		||||
                      if ($::RUNCMD_RC != 0) {
 | 
			
		||||
                          my $rsp;
 | 
			
		||||
                          push @{$rsp->{data}}, "Handle the driver update failed. Could not copy driver $path from vendor rpm.";
 | 
			
		||||
                          xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
			
		||||
                      }
 | 
			
		||||
                  }
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              unless (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                  next;
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              if (@driver_list) {
 | 
			
		||||
                # copy the specific drivers to initrd
 | 
			
		||||
                foreach my $driver (@driver_list) {
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,7 @@ my $rootimg_dir;
 | 
			
		||||
my $permission; # the permission works only for statelite mode currently
 | 
			
		||||
my $tempfile;
 | 
			
		||||
my $prompt;
 | 
			
		||||
my $ignorekernelchk;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub xdie {
 | 
			
		||||
@@ -108,6 +109,7 @@ GetOptions(
 | 
			
		||||
   'driverupdatesrc=s' => \$driverupdatesrc, #internal flag
 | 
			
		||||
   'interactive' =>\$prompt, 
 | 
			
		||||
   'onlyinitrd' =>\$onlyinitrd, 
 | 
			
		||||
   'ignorekernelchk' => \$ignorekernelchk,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
if (@ARGV > 0) {
 | 
			
		||||
@@ -1925,6 +1927,22 @@ sub load_dd ()
 | 
			
		||||
        if (-d "$dd_dir/rpm/lib/firmware") {
 | 
			
		||||
            system ("cp -rf $dd_dir/rpm/lib/firmware $rootimg_dir/lib");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # if $ignorekernelchk is specified, copy all driver files to target kernel dir
 | 
			
		||||
        if ($ignorekernelchk) {
 | 
			
		||||
            my @kernelpath4vrpm = <$dd_dir/rpm/lib/modules/*>;
 | 
			
		||||
            foreach my $path (@kernelpath4vrpm) {
 | 
			
		||||
                if ($path eq "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                    next;
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                unless (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                    mkpath "$dd_dir/rpm/lib/modules/$kernelver";
 | 
			
		||||
                }
 | 
			
		||||
                system ("/bin/cp -rf $path/* $dd_dir/rpm/lib/modules/$kernelver");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Copy the drivers to the rootimage
 | 
			
		||||
        if (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
          if (@driver_list) {
 | 
			
		||||
@@ -1953,6 +1971,8 @@ sub load_dd ()
 | 
			
		||||
            }
 | 
			
		||||
          } elsif ($Injectalldriver) {
 | 
			
		||||
            # copy all the drviers to the rootimage
 | 
			
		||||
            $driver_name = "\*\.ko";
 | 
			
		||||
            @all_real_path = ();
 | 
			
		||||
            find(\&get_all_path, <$dd_dir/rpm/lib/modules/$kernelver/*>);
 | 
			
		||||
            my @all_drivers = @all_real_path;
 | 
			
		||||
            foreach my $new_driver (@all_drivers) {
 | 
			
		||||
 
 | 
			
		||||
@@ -60,6 +60,7 @@ my $krpmver;
 | 
			
		||||
my $tempfile;
 | 
			
		||||
my $prompt;
 | 
			
		||||
my $timezone; #the TIMEZONE of the stateless and statelite node
 | 
			
		||||
my $ignorekernelchk;
 | 
			
		||||
 | 
			
		||||
sub xdie {
 | 
			
		||||
   system("rm -rf /tmp/xcatinitrd.$$");
 | 
			
		||||
@@ -106,6 +107,7 @@ GetOptions(
 | 
			
		||||
   'driverupdatesrc=s' => \$driverupdatesrc, #internal flag
 | 
			
		||||
   'interactive' =>\$prompt, 
 | 
			
		||||
   'onlyinitrd' =>\$onlyinitrd,
 | 
			
		||||
   'ignorekernelchk' => \$ignorekernelchk,
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
if (@ARGV > 0) {
 | 
			
		||||
@@ -2003,6 +2005,22 @@ sub load_dd()
 | 
			
		||||
        if (-d "$dd_dir/rpm/lib/firmware") {
 | 
			
		||||
            system ("cp -rf $dd_dir/rpm/lib/firmware $rootimg_dir/lib");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # if $ignorekernelchk is specified, copy all driver files to target kernel dir
 | 
			
		||||
        if ($ignorekernelchk) {
 | 
			
		||||
            my @kernelpath4vrpm = <$dd_dir/rpm/lib/modules/*>;
 | 
			
		||||
            foreach my $path (@kernelpath4vrpm) {
 | 
			
		||||
                if ($path eq "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                    next;
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                unless (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
                    mkpath "$dd_dir/rpm/lib/modules/$kernelver";
 | 
			
		||||
                }
 | 
			
		||||
                system ("/bin/cp -rf $path/* $dd_dir/rpm/lib/modules/$kernelver");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        # Copy the drivers to the rootimage
 | 
			
		||||
        if (-d "$dd_dir/rpm/lib/modules/$kernelver") {
 | 
			
		||||
          #mkpath "$rootimg_dir/lib/modules/$kernelver/updates/";
 | 
			
		||||
@@ -2032,6 +2050,8 @@ sub load_dd()
 | 
			
		||||
            }
 | 
			
		||||
          } elsif ($Injectalldriver) {
 | 
			
		||||
            # copy all the drviers to the rootimage
 | 
			
		||||
            $driver_name = "\*\.ko";
 | 
			
		||||
            @all_real_path = ();
 | 
			
		||||
            find(\&get_all_path, <$dd_dir/rpm/lib/modules/$kernelver/*>);
 | 
			
		||||
            my @all_drivers = @all_real_path;
 | 
			
		||||
            foreach my $new_driver (@all_drivers) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user