mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	change the policy to update the tables
many variables are added git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@7389 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -74,45 +74,60 @@ GetOptions(
 | 
			
		||||
   'k=s' => \$kernelver,
 | 
			
		||||
   'permission=s' => \$permission
 | 
			
		||||
);
 | 
			
		||||
if (@ARGV > 0) {
 | 
			
		||||
    $imagename=$ARGV[0];
 | 
			
		||||
    if ($arch or $osver or $profile) {
 | 
			
		||||
	print "-o, -p and -a options are not allowed when a image name is specified.\n";
 | 
			
		||||
        exit 1;
 | 
			
		||||
    }
 | 
			
		||||
    #load the module in memory
 | 
			
		||||
    eval {require("$::XCATROOT/lib/perl/xCAT/Table.pm")};
 | 
			
		||||
    if ($@) {
 | 
			
		||||
        print $@;
 | 
			
		||||
        exit 1;
 | 
			
		||||
    }
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
# if "Table.pm" can be found here, the attributes in linuximage and osimage will be updated
 | 
			
		||||
my $needUpdateTable = 0;
 | 
			
		||||
my %keyhash = ();
 | 
			
		||||
my %updates = ();
 | 
			
		||||
 | 
			
		||||
my $osimagetab;
 | 
			
		||||
my $linuximagetab;
 | 
			
		||||
my $ref_linuximage_tab;
 | 
			
		||||
my $ref_osimage_tab;
 | 
			
		||||
 | 
			
		||||
# load the module in memory
 | 
			
		||||
eval { require("$::XCATROOT/lib/perl/xCAT/Table.pm") };
 | 
			
		||||
unless ($@) {
 | 
			
		||||
    # Table.pm is there, we can update the xCAT tables
 | 
			
		||||
    $needUpdateTable = 1;
 | 
			
		||||
 | 
			
		||||
    # get the info from the osimage and linux 
 | 
			
		||||
    my $osimagetab=xCAT::Table->new('osimage', -create=>1);
 | 
			
		||||
    if (!$osimagetab) {
 | 
			
		||||
    $osimagetab = xCAT::Table->new('osimage', -create=>1);
 | 
			
		||||
    unless ($osimagetab) {
 | 
			
		||||
        print "The osimage table cannot be opened.\n";
 | 
			
		||||
        exit 1;
 | 
			
		||||
    }
 | 
			
		||||
    my $linuximagetab=xCAT::Table->new('linuximage', -create=>1);
 | 
			
		||||
    if (!$linuximagetab) {
 | 
			
		||||
 | 
			
		||||
    $linuximagetab = xCAT::Table->new('linuximage', -create=>1);
 | 
			
		||||
    unless ($linuximagetab) {
 | 
			
		||||
        print "The linuximage table cannot be opened.\n";
 | 
			
		||||
        exit 1;
 | 
			
		||||
    }
 | 
			
		||||
    (my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod');
 | 
			
		||||
    if (!$ref) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (@ARGV > 0 and $needUpdateTable eq 1) {
 | 
			
		||||
    $imagename=$ARGV[0];
 | 
			
		||||
    if ($arch or $osver or $profile) {
 | 
			
		||||
        print "-o, -p and -a options are not allowed when a image name is specified.\n";
 | 
			
		||||
        exit 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ($ref_osimage_tab) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod');
 | 
			
		||||
    unless ($ref_osimage_tab) {
 | 
			
		||||
        print "Cannot find image \'$imagename\' from the osimage table.\n";
 | 
			
		||||
        exit 1;
 | 
			
		||||
    }
 | 
			
		||||
    (my $ref1) = $linuximagetab->getAttribs({imagename => $imagename}, 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir', 'postinstall', 'rootimgdir', 'nodebootif', 'otherifce', 'kernelver', 'netdrivers', 'permission');
 | 
			
		||||
    if (!$ref1) {
 | 
			
		||||
 | 
			
		||||
    ($ref_linuximage_tab) = $linuximagetab->getAttribs({imagename => $imagename}, 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir', 'postinstall', 'rootimgdir', 'nodebootif', 'otherifce', 'kernelver', 'netdrivers', 'permission');
 | 
			
		||||
    unless ($ref_linuximage_tab) {
 | 
			
		||||
        print "Cannot find $imagename from the linuximage table\n";
 | 
			
		||||
        exit 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $osver=$ref->{'osvers'};
 | 
			
		||||
    $arch=$ref->{'osarch'};
 | 
			
		||||
    $profile=$ref->{'profile'};
 | 
			
		||||
    my $provmethod=$ref->{'provmethod'}; # TODO: not necessary; and need to update both statelite and stateless modes
 | 
			
		||||
    $osver = $ref_osimage_tab->{'osvers'};
 | 
			
		||||
    $arch = $ref_osimage_tab->{'osarch'};
 | 
			
		||||
    $profile = $ref_osimage_tab->{'profile'};
 | 
			
		||||
    my $provmethod = $ref_osimage_tab->{'provmethod'}; # TODO: not necessary; and need to update both statelite and stateless modes
 | 
			
		||||
  
 | 
			
		||||
    unless ($osver and $arch and $profile and $provmethod) {
 | 
			
		||||
        print"osimage.osvers, osimage.osarch, osimage.profile and osimage.provmethod must be specified for the image $imagename in the database.\n";
 | 
			
		||||
@@ -124,78 +139,68 @@ if (@ARGV > 0) {
 | 
			
		||||
        exit 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    unless ( $ref1->{'pkglist'} ) {
 | 
			
		||||
    unless ( $ref_linuximage_tab->{'pkglist'} ) {
 | 
			
		||||
        print"A .pkglist file must be specified for image \'$imagename\' in the linuximage table.\n";
 | 
			
		||||
        exit 0;
 | 
			
		||||
    }
 | 
			
		||||
    $pkglist =$ref1->{'pkglist'};
 | 
			
		||||
    $pkglist = $ref_linuximage_tab->{'pkglist'};
 | 
			
		||||
 | 
			
		||||
    $srcdir=$ref1->{'pkgdir'};
 | 
			
		||||
    $srcdir_otherpkgs=$ref1->{'otherpkgdir'};
 | 
			
		||||
    $otherpkglist=$ref1->{'otherpkglist'};
 | 
			
		||||
    $postinstall_filename=$ref1->{'postinstall'};
 | 
			
		||||
    $destdir=$ref1->{'rootimgdir'};
 | 
			
		||||
    $srcdir= $ref_linuximage_tab->{'pkgdir'};
 | 
			
		||||
    $srcdir_otherpkgs = $ref_linuximage_tab->{'otherpkgdir'};
 | 
			
		||||
    $otherpkglist = $ref_linuximage_tab->{'otherpkglist'};
 | 
			
		||||
    $postinstall_filename = $ref_linuximage_tab->{'postinstall'};
 | 
			
		||||
    $destdir = $ref_linuximage_tab->{'rootimgdir'};
 | 
			
		||||
 | 
			
		||||
    # TODO: how can we do if the user specifies one wrong value to the following attributes?
 | 
			
		||||
    # currently, one message is output to indicate the users there will be some updates
 | 
			
		||||
    my %keyhash = ();
 | 
			
		||||
    $keyhash{'imagename'} = $imagename;
 | 
			
		||||
    my %updates = ();
 | 
			
		||||
    if ($prinic) {
 | 
			
		||||
        if ($prinic ne $ref1->{'nodebootif'}) {
 | 
			
		||||
            # update the prinic value to linuximage table
 | 
			
		||||
        if ($prinic ne $ref_linuximage_tab->{'nodebootif'}) {
 | 
			
		||||
            print "The primary nic is different from the value in linuximage table, will update it\n";
 | 
			
		||||
            $updates{'nodebootif'} = $prinic;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        $prinic = $ref1->{'nodebootif'};
 | 
			
		||||
        $prinic = $ref_linuximage_tab->{'nodebootif'};
 | 
			
		||||
    }
 | 
			
		||||
    if ($othernics) {
 | 
			
		||||
        if ($othernics ne $ref1->{'otherifce'}) {
 | 
			
		||||
            # update 
 | 
			
		||||
        if ($othernics ne $ref_linuximage_tab->{'otherifce'}) {
 | 
			
		||||
            print "The other ifces are different from  the value in linuximage table, will update it\n";
 | 
			
		||||
            $updates{'otherifce'} = $othernics;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        $othernics = $ref1->{'otherifce'};
 | 
			
		||||
        $othernics = $ref_linuximage_tab->{'otherifce'};
 | 
			
		||||
    }
 | 
			
		||||
    if ($kernelver) {
 | 
			
		||||
        if ($kernelver ne $ref1->{'kernelver'}) {
 | 
			
		||||
        if ($kernelver ne $ref_linuximage_tab->{'kernelver'}) {
 | 
			
		||||
            print "The kernelver is different from the value in linuximage table, will update it\n";
 | 
			
		||||
            $updates{'kernelver'} = $kernelver;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        $kernelver = $ref1->{'kernelver'};
 | 
			
		||||
        $kernelver = $ref_linuximage_tab->{'kernelver'};
 | 
			
		||||
    }
 | 
			
		||||
    if ($ndrivers) {
 | 
			
		||||
        if ($ndrivers ne $ref1->{'netdrivers'}) {
 | 
			
		||||
        if ($ndrivers ne $ref_linuximage_tab->{'netdrivers'}) {
 | 
			
		||||
            print "The netdrivers are different from the value in linuximage table, will update it\n";
 | 
			
		||||
            $updates{'netdrivers'} = $ndrivers;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        $ndrivers =  $ref1->{'netdrivers'};
 | 
			
		||||
        $ndrivers =  $ref_linuximage_tab->{'netdrivers'};
 | 
			
		||||
    }
 | 
			
		||||
    if ($permission) {
 | 
			
		||||
        if ($permission ne $ref1->{'permission'}) {
 | 
			
		||||
        if ($permission ne $ref_linuximage_tab->{'permission'}) {
 | 
			
		||||
            print "The permission value is different from the value in linuximage table, will update it\n";
 | 
			
		||||
            $updates{'permission'} = $permission;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        $permission = $ref1->{'permission'};
 | 
			
		||||
        $permission = $ref_linuximage_tab->{'permission'};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # update the Attributes
 | 
			
		||||
    $linuximagetab->setAttribs(\%keyhash, \%updates); 
 | 
			
		||||
    $linuximagetab->commit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# if "Table.pm" can be found here, the attributes in linuximage and osimage will be updated
 | 
			
		||||
eval { require("$::XCATROOT/lib/perl/xCAT/Table.pm") };
 | 
			
		||||
unless ($@) {
 | 
			
		||||
    # Table.pm is there, we can update the xCAT tables
 | 
			
		||||
    # TODO: update the Attributes, put it later
 | 
			
		||||
    #$linuximagetab->setAttribs(\%keyhash, \%updates); 
 | 
			
		||||
    #$linuximagetab->commit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$permission = "755" unless ($permission);
 | 
			
		||||
$updates{'permission'} = $permission if ( $needUpdateTable );
 | 
			
		||||
 | 
			
		||||
unless ($arch) {
 | 
			
		||||
    $arch = `uname -m`;
 | 
			
		||||
@@ -204,8 +209,14 @@ unless ($arch) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$srcdir="$installroot/$osver/$arch" unless ($srcdir);
 | 
			
		||||
$updates{'srcdir'} = $srcdir if ($needUpdateTable);
 | 
			
		||||
 | 
			
		||||
$srcdir_otherpkgs = "$installroot/post/otherpkgs/$osver/$arch" unless ($srcdir_otherpkgs);
 | 
			
		||||
$updates{'otherpkgdir'} = $srcdir_otherpkgs if ($needUpdateTable);
 | 
			
		||||
 | 
			
		||||
$destdir="$installroot/netboot/$osver/$arch/$profile" unless ($destdir);
 | 
			
		||||
$updates{'rootimgdir'} = $destdir if ($needUpdateTable);
 | 
			
		||||
 | 
			
		||||
$rootimg_dir="$destdir/rootimg";
 | 
			
		||||
 | 
			
		||||
# Get the subchannels of the given interface
 | 
			
		||||
@@ -255,10 +266,8 @@ foreach (split /,/,$netdriver) {
 | 
			
		||||
   unless (/\.ko$/) {
 | 
			
		||||
      s/$/.ko/;
 | 
			
		||||
   }
 | 
			
		||||
   if (/^$/) {
 | 
			
		||||
      next;
 | 
			
		||||
   }
 | 
			
		||||
   push @ndrivers,$_;
 | 
			
		||||
   next if (/^$/);
 | 
			
		||||
   push @ndrivers, $_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unless ($onlyinitrd) {
 | 
			
		||||
@@ -293,16 +302,18 @@ unless ($onlyinitrd) {
 | 
			
		||||
   $yumcmd .= "install ";
 | 
			
		||||
   mkpath("$rootimg_dir/var/lib/yum");
 | 
			
		||||
 | 
			
		||||
   if (!$imagename) {
 | 
			
		||||
   unless ($imagename) {
 | 
			
		||||
       $pkglist= imgutils::get_profile_def_filename($osver, $profile, $arch, $customdir, "pkglist");
 | 
			
		||||
       if (!$pkglist) {
 | 
			
		||||
	   $pkglist= imgutils::get_profile_def_filename($osver, $profile, $arch, $pathtofiles, "pkglist");
 | 
			
		||||
       unless ($pkglist) {
 | 
			
		||||
           $pkglist= imgutils::get_profile_def_filename($osver, $profile, $arch, $pathtofiles, "pkglist");
 | 
			
		||||
       }  
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (!$pkglist) {
 | 
			
		||||
      print "Unable to find package list for $profile!";
 | 
			
		||||
      exit 1;
 | 
			
		||||
   if ($pkglist) {
 | 
			
		||||
       $updates{'pkglist'} = $pkglist if ($needUpdateTable);
 | 
			
		||||
   } else {
 | 
			
		||||
       print "Unable to find package list for $profile!";
 | 
			
		||||
       exit 1;
 | 
			
		||||
   }
 | 
			
		||||
   
 | 
			
		||||
   my %pkg_hash=imgutils::get_package_names($pkglist);
 | 
			
		||||
@@ -326,12 +337,13 @@ unless ($onlyinitrd) {
 | 
			
		||||
 | 
			
		||||
   #Now let's handle extra packages
 | 
			
		||||
    unless ($imagename) {
 | 
			
		||||
        $otherpkglist=imgutils::get_profile_def_filename($osver, $profile, $arch, $customdir, "otherpkgs.pkglist");
 | 
			
		||||
        if (!$otherpkglist) { $otherpkglist=imgutils::get_profile_def_filename($osver, $profile, $arch, $pathtofiles, "otherpkgs.pkglist"); }
 | 
			
		||||
        $otherpkglist = imgutils::get_profile_def_filename($osver, $profile, $arch, $customdir, "otherpkgs.pkglist");
 | 
			
		||||
        unless ($otherpkglist) { $otherpkglist=imgutils::get_profile_def_filename($osver, $profile, $arch, $pathtofiles, "otherpkgs.pkglist"); }
 | 
			
		||||
    }
 | 
			
		||||
    my %extra_hash=();
 | 
			
		||||
    if ($otherpkglist) {
 | 
			
		||||
       %extra_hash=imgutils::get_package_names($otherpkglist);
 | 
			
		||||
        $updates{'otherpkglist'} = $otherpkglist if ($needUpdateTable);
 | 
			
		||||
        %extra_hash = imgutils::get_package_names($otherpkglist);
 | 
			
		||||
    }
 | 
			
		||||
    my %extrapkgnames; 
 | 
			
		||||
 | 
			
		||||
@@ -380,7 +392,7 @@ unless ($onlyinitrd) {
 | 
			
		||||
          $yumcmd =~ s/ $/\n/;
 | 
			
		||||
    
 | 
			
		||||
          # debug
 | 
			
		||||
          print "yumcmd=$yumcmd\n";
 | 
			
		||||
          #print "yumcmd=$yumcmd\n";
 | 
			
		||||
          #my $repo=`cat /tmp/genimage.$$.yum.conf`;
 | 
			
		||||
          #print "repo=$repo";
 | 
			
		||||
      
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user