mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-05-31 01:56:39 +00:00
195 lines
5.1 KiB
Perl
195 lines
5.1 KiB
Perl
package xCAT::Yum;
|
|
use DBI;
|
|
use File::Find;
|
|
use File::Spec;
|
|
use File::Path;
|
|
|
|
my $yumrepofile;
|
|
my $distname;
|
|
my $arch;
|
|
my $installpfx;
|
|
|
|
sub localize_yumrepo {
|
|
my $self = shift;
|
|
my $pkgdir = shift;
|
|
$distname=shift;
|
|
$arch=shift;
|
|
open($yumrepofile, ">", "$pkgdir/local-repository.tmpl");
|
|
my %options = (
|
|
wanted => \&check_tofix,
|
|
follow_fast => 1
|
|
);
|
|
find(\%options, $pkgdir);
|
|
close($yumrepofile);
|
|
}
|
|
|
|
|
|
sub remove_yumrepo {
|
|
my $self = shift;
|
|
my $pkgdir = shift;
|
|
rmtree("$pkgdir/local-repository.tmpl");
|
|
}
|
|
|
|
sub check_tofix {
|
|
if (-d $File::Find::name and $File::Find::name =~ /\/repodata$/) {
|
|
if ($distname =~ /rhels5/)
|
|
{
|
|
fix_directory($File::Find::name);
|
|
}
|
|
generate_repo($File::Find::name);
|
|
}
|
|
elsif ($File::Find::name =~ /\/RPM-GPG-KEY/) {
|
|
qx(rpm --import $File::Find::name);
|
|
}
|
|
}
|
|
|
|
|
|
sub generate_repo
|
|
{
|
|
#write local-repository.tmpl
|
|
my $dirlocation = shift;
|
|
my @dircomps = File::Spec->splitdir($dirlocation);
|
|
pop(@dircomps);
|
|
my $yumurl = File::Spec->catdir(@dircomps);
|
|
my $reponame = $dircomps[$#dircomps];
|
|
print $yumrepofile "[local-$distname-$arch-$reponame]\n";
|
|
print $yumrepofile "name=xCAT configured yum repository for $yumurl\n";
|
|
print $yumrepofile "baseurl=$yumurl\n";
|
|
print $yumrepofile "enabled=1\n";
|
|
print $yumrepofile "gpgcheck=0\n\n";
|
|
}
|
|
|
|
sub fix_directory {
|
|
|
|
my @xmlines = ();
|
|
my $primaryxml;
|
|
|
|
$grep_result = system("grep sha256 $dirlocation/repomd.xml|grep \\<checksum");
|
|
if ($grep_result == 0)
|
|
{
|
|
$sha_command = "sha256sum";
|
|
}
|
|
else
|
|
{
|
|
$sha_command = "sha1sum";
|
|
}
|
|
|
|
#-----------------------------------------------------------------------
|
|
my $oldsha;
|
|
my $newsha;
|
|
my $oldopensha;
|
|
my $newopensha;
|
|
|
|
if (-r "$dirlocation/primary.xml.gz")
|
|
{
|
|
$oldsha = `/usr/bin/$sha_command $dirlocation/primary.xml.gz`;
|
|
$oldsha =~ s/\s.*//;
|
|
chomp($oldsha);
|
|
|
|
#update primary.xml.gz & primary.xml
|
|
if (-r "$dirlocation/primary.xml")
|
|
{
|
|
unlink("$dirlocation/primary.xml");
|
|
}
|
|
system("/bin/gunzip $dirlocation/primary.xml.gz");
|
|
|
|
$oldopensha = `/usr/bin/$sha_command $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);
|
|
|
|
$newopensha = `/usr/bin/$sha_command $dirlocation/primary.xml`;
|
|
$newopensha =~ s/\s.*//;
|
|
chomp($newopensha);
|
|
|
|
system("/bin/gzip $dirlocation/primary.xml");
|
|
$newsha = `/usr/bin/$sha_command $dirlocation/primary.xml.gz`;
|
|
$newsha =~ s/\s.*//;
|
|
chomp($newsha);
|
|
}
|
|
|
|
#-----------------------------------------------------------------------
|
|
|
|
my $newdbsha;
|
|
my $olddbsha;
|
|
my $newdbopensha;
|
|
my $olddbopensha;
|
|
|
|
if (-r "$dirlocation/primary.sqlite.bz2") {
|
|
|
|
$olddbsha = `/usr/bin/$sha_command $dirlocation/primary.sqlite.bz2`;
|
|
$olddbsha =~ s/\s.*//;
|
|
chomp($olddbsha);
|
|
|
|
#update primary.sqlite.bz2 & primary.sqlite
|
|
if (-r "$dirlocation/primary.sqlite")
|
|
{
|
|
unlink("$dirlocation/primary.sqlite");
|
|
}
|
|
|
|
system("/usr/bin/bunzip2 $dirlocation/primary.sqlite.bz2");
|
|
$olddbopensha = `/usr/bin/$sha_command $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/$sha_command $dirlocation/primary.sqlite`;
|
|
$newdbopensha =~ s/\s.*//;
|
|
chomp($newdbopensha);
|
|
|
|
system("/usr/bin/bzip2 $dirlocation/primary.sqlite");
|
|
$newdbsha = `/usr/bin/$sha_command $dirlocation/primary.sqlite.bz2`;
|
|
$newdbsha =~ s/\s.*//;
|
|
chomp($newdbsha);
|
|
}
|
|
|
|
#-----------------------------------------------------------------------
|
|
|
|
#update repomd.xml
|
|
open($primaryxml, "+<$dirlocation/repomd.xml");
|
|
while (<$primaryxml>) {
|
|
if ($_ =~ m/\<size\>/)
|
|
{
|
|
next;
|
|
}
|
|
if ($_ =~ m/\<open-size\>/)
|
|
{
|
|
next;
|
|
}
|
|
s!xml:base="media://[^"]*"!!g;
|
|
if (defined($oldsha)) {
|
|
s!$oldsha!$newsha!g;
|
|
}
|
|
if (defined($oldopensha)) {
|
|
s!$oldopensha!$newopensha!g;
|
|
}
|
|
if (defined($olddbsha)) {
|
|
s!$olddbsha!$newdbsha!g;
|
|
}
|
|
if (defined($olddbopensha)) {
|
|
s!$olddbopensha!$newdbopensha!g;
|
|
}
|
|
push @xmlines, $_;
|
|
}
|
|
seek($primaryxml, 0, 0);
|
|
print $primaryxml (@xmlines);
|
|
truncate($primaryxml, tell($primaryxml));
|
|
close($primaryxml);
|
|
@xmlines = ();
|
|
}
|
|
|
|
|
|
1;
|