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 )