Rex-Repositorio
view release on metacpan or search on metacpan
lib/Rex/Repositorio/Repository/Yum.pm view on Meta::CPAN
$primary_file = $primary_file->{location}->[0]->{href};
$url = $url . "/" . $primary_file;
my $xml = $self->get_xml( $self->download_gzip($url) );
my @packages;
my @xml_packages = $xml->getElementsByTagName('package');
for my $xml_package (@xml_packages) {
my ($name_node) = $xml_package->getChildrenByTagName("name");
my ($checksum_node) = $xml_package->getChildrenByTagName("checksum");
my ($size_node) = $xml_package->getChildrenByTagName("size");
my ($location_node) = $xml_package->getChildrenByTagName("location");
push @packages, {
location => $location_node->getAttribute("href"),
name => $name_node->textContent,
checksum => {
type => $checksum_node->getAttribute("type"),
data => $checksum_node->textContent,
},
size => $size_node->getAttribute('package'),
};
}
return ( \@packages, $repomd_ref );
}
sub init {
my $self = shift;
my $repo_dir = $self->app->get_repo_dir(repo => $self->repo->{name});
my $repodata_path = File::Spec->catdir($repo_dir, 'repodata');
$self->app->logger->debug("init: repodata_path: ${repodata_path}");
unless (-d $repodata_path) {
$self->app->logger->debug("init: make_path: ${repodata_path}");
my $make_path_error;
#my $dirs = File::Path->make_path($repodata_path, { error => \$make_path_error },);
#my $dirs = File::Path->make_path($repodata_path);
unless (make_path($repodata_path)) {
$self->app->logger->log_and_croak(level => 'error', message => "init: unable to create path: ${repodata_path}");
}
}
$self->_run_createrepo();
}
sub add_file {
my $self = shift;
my %option = validate(
@_,
{
file => {
type => SCALAR
},
}
);
my $dest = File::Spec->catfile($self->app->get_repo_dir(repo => $self->repo->{name}), basename( $option{file} ));
if ( exists $self->repo->{gpg} && $self->repo->{gpg}->{key} ) {
my $key_id = $self->repo->{gpg}->{key};
my $exp = Expect->spawn("/bin/rpmsign", "--addsign", "--key-id=$key_id", $option{file});
$exp->expect(60, [
qr/Enter pass phrase:/ => sub {
my $exp = shift;
$exp->send($self->repo->{gpg}->{password} . "\n");
exp_continue;
},
]);
$exp->soft_close();
}
$self->add_file_to_repo( source => $option{file}, dest => $dest );
$self->_run_createrepo();
}
sub remove_file {
my $self = shift;
my %option = validate(
@_,
{
file => {
type => SCALAR
},
}
);
my $file = File::Spec->catfile($self->app->get_repo_dir(repo => $self->repo->{name}), basename( $option{file} ));
$self->remove_file_from_repo( file => $file );
$self->_run_createrepo();
}
sub _run_createrepo {
my $self = shift;
my $repo_dir = $self->app->get_repo_dir(repo => $self->repo->{name});
if ( exists $self->repo->{gpg} && $self->repo->{gpg}->{key} ) {
unlink File::Spec->catfile($repo_dir, qw/ repodata repomd.xml.asc /);
}
system "cd $repo_dir ; createrepo .";
if ( $? != 0 ) {
confess "Error running createrepo.";
}
if ( exists $self->repo->{gpg} && $self->repo->{gpg}->{key} ) {
my $key = $self->repo->{gpg}->{key};
my $pass = $self->repo->{gpg}->{password};
if ( !$pass ) {
$pass = $self->read_password("GPG key passphrase: ");
}
my $cmd =
"cd $repo_dir ; gpg --default-key $key -a --batch --passphrase '"
. $pass
. "' --detach-sign repodata/repomd.xml";
system $cmd;
( run in 0.516 second using v1.01-cache-2.11-cpan-71847e10f99 )