diff --git a/perl-xCAT-2.0/xCAT/Yum.pm b/perl-xCAT-2.0/xCAT/Yum.pm new file mode 100644 index 000000000..5752ac5e2 --- /dev/null +++ b/perl-xCAT-2.0/xCAT/Yum.pm @@ -0,0 +1,88 @@ +package xCAT::Yum; +use DBI; +use File::Find; +sub localize_yumrepo { + my $self = shift; + my $installroot = shift; + my $distname = shift; + my $arch = shift; + my $dosqlite = 0; + my $repomdfile; + my $primaryxml; + my @xmlines; + my $dirlocation = "$installroot/$distname/$arch/"; + find(\&check_tofix,$dirlocation); +} +sub check_tofix { + if (-d $File::Find::name and $File::Find::name =~ /\/repodata$/) { + fix_directory($File::Find::name); + } +} +sub fix_directory { + my $dirlocation = shift; + my $oldsha=`/usr/bin/sha1sum $dirlocation/primary.xml.gz`; + my $olddbsha; + $oldsha =~ s/\s.*//; + chomp($oldsha); + unlink("$dirlocation/primary.xml"); + system("/bin/gunzip $dirlocation/primary.xml.gz"); + my $oldopensha=`/usr/bin/sha1sum $dirlocation/primary.xml`; + $oldopensha =~ s/\s+.*//; + chomp($oldopensha); + open($primaryxml,"+<$dirlocation/primary.xml"); + while (<$primaryxml>) { + s!xml:base="media://[^"]*"!!g; + push @xmlines,$_; + } + seek($primaryxml,0,0); + print $primaryxml (@xmlines); + truncate($primaryxml,tell($primaryxml)); + @xmlines=(); + close($primaryxml); + my $newopensha=`/usr/bin/sha1sum $dirlocation/primary.xml`; + system("/bin/gzip $dirlocation/primary.xml"); + my $newsha=`/usr/bin/sha1sum $dirlocation/primary.xml.gz`; + $newopensha =~ s/\s.*//; + $newsha =~ s/\s.*//; + chomp($newopensha); + chomp($newsha); + my $newdbsha; + my $newdbopensha; + my $olddbopensha; + if (-r "$dirlocation/primary.sqlite.bz2") { + $olddbsha =`/usr/bin/sha1sum $dirlocation/primary.sqlite.bz2`; + $olddbsha =~ s/\s.*//; + chomp($olddbsha); + unlink("$dirlocation/primary.sqlite"); + system("/usr/bin/bunzip2 $dirlocation/primary.sqlite.bz2"); + $olddbopensha=`/usr/bin/sha1sum $dirlocation/primary.sqlite`; + $olddbopensha =~ s/\s+.*//; + chomp($olddbopensha); + my $pdbh = DBI->connect("dbi:SQLite:$dirlocation/primary.sqlite","","",{AutoCommit=>1}); + $pdbh->do('UPDATE "packages" SET "location_base" = NULL'); + $pdbh->disconnect; + $newdbopensha=`/usr/bin/sha1sum $dirlocation/primary.sqlite`; + system("/usr/bin/bzip2 $dirlocation/primary.sqlite"); + $newdbsha=`/usr/bin/sha1sum $dirlocation/primary.sqlite.bz2`; + $newdbopensha =~ s/\s.*//; + $newdbsha =~ s/\s.*//; + chomp($newdbopensha); + chomp($newdbsha); + } + open($primaryxml,"+<$dirlocation/repomd.xml"); + while (<$primaryxml>) { + s!xml:base="media://[^"]*"!!g; + s!$oldsha!$newsha!g; + s!$oldopensha!$newopensha!g; + if ($olddbsha) { s!$olddbsha!$newdbsha!g; } + if ($olddbsha) { s!$olddbopensha!$newdbopensha!g; } + push @xmlines,$_; + } + seek($primaryxml,0,0); + print $primaryxml (@xmlines); + truncate($primaryxml,tell($primaryxml)); + close($primaryxml); +} + + +1; diff --git a/xCAT-server-2.0/lib/xcat/plugins/centos.pm b/xCAT-server-2.0/lib/xcat/plugins/centos.pm index b4c30d2aa..a38adb7ff 100644 --- a/xCAT-server-2.0/lib/xcat/plugins/centos.pm +++ b/xCAT-server-2.0/lib/xcat/plugins/centos.pm @@ -325,6 +325,7 @@ sub copycd { umask $omask; my $rc = system("cd $path; find . | nice -n 20 cpio -dump $installroot/$distname/$arch"); chmod 0755,"$installroot/$distname/$arch"; + xCAT::Yum->localize_yumrepo($installroot,$distname,$arch); if ($rc != 0) { $callback->({error=>"Media copy operation failed, status $rc"}); } else { diff --git a/xCAT-server-2.0/lib/xcat/plugins/fedora.pm b/xCAT-server-2.0/lib/xcat/plugins/fedora.pm index 87034a050..e785d0b5a 100644 --- a/xCAT-server-2.0/lib/xcat/plugins/fedora.pm +++ b/xCAT-server-2.0/lib/xcat/plugins/fedora.pm @@ -3,6 +3,7 @@ package xCAT_plugin::fedora; use Storable qw(dclone); use Sys::Syslog; use DBI; +use xCAT::Yum; use xCAT::Table; use xCAT::Template; use xCAT::Postage; @@ -335,65 +336,7 @@ sub copycd { #my $rc = system("cd $path; find . | cpio -dump $installroot/$distname/$arch"); my $rc = system("cd $path;rsync -a . $installroot/$distname/$arch/"); chmod 0755,"$installroot/$distname/$arch"; - my $repomdfile; - my $primaryxml; - my @xmlines; - my $oldsha=`/usr/bin/sha1sum $installroot/$distname/$arch/repodata/primary.xml.gz`; - my $olddbsha=`/usr/bin/sha1sum $installroot/$distname/$arch/repodata/primary.sqlite.bz2`; - $oldsha =~ s/\s.*//; - chomp($oldsha); - $olddbsha =~ s/\s.*//; - chomp($olddbsha); - unlink("$installroot/$distname/$arch/repodata/primary.sqlite"); - unlink("$installroot/$distname/$arch/repodata/primary.xml"); - system("/usr/bin/bunzip2 $installroot/$distname/$arch/repodata/primary.sqlite.bz2"); - system("/bin/gunzip $installroot/$distname/$arch/repodata/primary.xml.gz"); - my $oldopensha=`/usr/bin/sha1sum $installroot/$distname/$arch/repodata/primary.xml`; - $oldopensha =~ s/\s+.*//; - chomp($oldopensha); - my $olddbopensha=`/usr/bin/sha1sum $installroot/$distname/$arch/repodata/primary.sqlite`; - $olddbopensha =~ s/\s+.*//; - chomp($olddbopensha); - my $pdbh = DBI->connect("dbi:SQLite:$installroot/$distname/$arch/repodata/primary.sqlite","","",{AutoCommit=>1}); - $pdbh->do('UPDATE "packages" SET "location_base" = NULL'); - $pdbh->disconnect; - open($primaryxml,"+<$installroot/$distname/$arch/repodata/primary.xml"); - while (<$primaryxml>) { - s!xml:base="media://[^"]*"!!g; - push @xmlines,$_; - } - seek($primaryxml,0,0); - print $primaryxml (@xmlines); - truncate($primaryxml,tell($primaryxml)); - @xmlines=(); - close($primaryxml); - my $newopensha=`/usr/bin/sha1sum $installroot/$distname/$arch/repodata/primary.xml`; - my $newdbopensha=`/usr/bin/sha1sum $installroot/$distname/$arch/repodata/primary.sqlite`; - system("/bin/gzip $installroot/$distname/$arch/repodata/primary.xml"); - system("/usr/bin/bzip2 $installroot/$distname/$arch/repodata/primary.sqlite"); - my $newsha=`/usr/bin/sha1sum $installroot/$distname/$arch/repodata/primary.xml.gz`; - my $newdbsha=`/usr/bin/sha1sum $installroot/$distname/$arch/repodata/primary.sqlite.bz2`; - $newopensha =~ s/\s.*//; - $newdbopensha =~ s/\s.*//; - $newsha =~ s/\s.*//; - $newdbsha =~ s/\s.*//; - chomp($newopensha); - chomp($newdbopensha); - chomp($newsha); - chomp($newdbsha); - open($primaryxml,"+<$installroot/$distname/$arch/repodata/repomd.xml"); - while (<$primaryxml>) { - s!xml:base="media://[^"]*"!!g; - s!$oldsha!$newsha!g; - s!$oldopensha!$newopensha!g; - s!$olddbsha!$newdbsha!g; - s!$olddbopensha!$newdbopensha!g; - push @xmlines,$_; - } - seek($primaryxml,0,0); - print $primaryxml (@xmlines); - truncate($primaryxml,tell($primaryxml)); - close($primaryxml); + xCAT::Yum->localize_yumrepo($installroot,$distname,$arch); if ($rc != 0) { $callback->({error=>"Media copy operation failed, status $rc"}); } else { diff --git a/xCAT-server-2.0/lib/xcat/plugins/rhel.pm b/xCAT-server-2.0/lib/xcat/plugins/rhel.pm index 3bc33b67b..6d56aeb17 100644 --- a/xCAT-server-2.0/lib/xcat/plugins/rhel.pm +++ b/xCAT-server-2.0/lib/xcat/plugins/rhel.pm @@ -342,6 +342,7 @@ sub copycd { umask $omask; my $rc = system("cd $path; find . | cpio -dump $installroot/$distname/$arch"); chmod 0755,"$installroot/$distname/$arch"; + xCAT::Yum->localize_yumrepo($installroot,$distname,$arch); if ($rc != 0) { $callback->({error=>"Media copy operation failed, status $rc"}); } else {