#!/usr/bin/perl -w
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# Copyright: 2012 - 2016 by Matteo Pasotti
package ManaTools::Module::PkgDownloader;
use strict;
use warnings;
use diagnostics;
use Modern::Perl '2011';
use English;
use Term::ANSIColor qw(:constants);
# use Getopt::Long qw(:config permute);
use Moose;
use Moose::Autobox;
use ManaTools::Shared::urpmi_backend::DB;
use ManaTools::Shared qw(trim);
with 'MooseX::Getopt';
# extends qw( ManaTools::Module );
my $PKG_QUERYMAKER = "urpmq";
my $QUERY_LISTMEDIA_PARM = "--list-media";
my $QUERY_LISTURL_PARM = "--list-url";
my $QUERY_LOOKFORSRPM_PARM = "--sourcerpm";
my $QUERY_PKG_FULL = "-f";
my $DLDER = "--wget";
has 'use_wget' => (
is => 'rw',
isa => 'Bool',
default => sub { return 0; },
);
has 'use_axel' => (
is => 'rw',
isa => 'Bool',
default => sub { return 0; },
);
has 'srpm' => (
is => 'rw',
isa => 'Bool',
default => sub { return 0; },
);
has 'use_major' => (
is => 'rw',
isa => 'Bool',
default => sub { return 0; },
);
has 'packagelist' => (
is => 'rw',
isa => 'Str',
required => 1,
default => sub { return ""; },
);
has 'packages' => (
is => 'rw',
isa => 'ArrayRef',
default => sub { [] },
);
sub process_args {
my ($self, $pkglist) = @_;
return 0 if(ManaTools::Shared::trim($pkglist)=~m/^$/g);
my @items = split(/\s/,$pkglist);
if(scalar(@items)>0){
for(@items){
push @{$self->packages()}, $_;
}
return 1;
}
}
sub download {
my $self = shift();
my $url = shift();
my $rpm = shift();
if($self->use_wget()){
`wget "$url/$rpm" -O $rpm`;
}elsif($self->use_axel()){
`axel -a "$url/$rpm" -o $rpm`;
}else{
`curl -s "$url/$rpm" -o $rpm`;
}
}
# IMPORTANT!
# THOSE TWO ROUTINES MUST BE PORTED TO THE URPMI_BACKEND FROM MANATOOLS:
# * retrieve_brpm_pkgname
# * retrieve_srpm_pkgname
# ----------------------------------------------------------------------
# retrieve the binary rpm's pkg name - array
# ----------------------------------------------------------------------
sub retrieve_brpm_pkgname {
my $pkg = shift();
my @lista_brpms = `$PKG_QUERYMAKER -a $QUERY_PKG_FULL $pkg | grep "^$pkg" | sort -u`;
return @lista_brpms;
}
# ----------------------------------------------------------------------
# retrieve the srpm's pkg name - array
# ----------------------------------------------------------------------
sub retrieve_srpm_pkgname {
my $pkg = shift();
my @lista_srpms = `$PKG_QUERYMAKER $QUERY_LOOKFORSRPM_PARM $pkg | sort -u | grep "$pkg:" | awk -F':' '{print \$2}'`;
return @lista_srpms;
}
sub start {
my $self = shift;
my $pkg = "";
my $rpmbackend = ManaTools::Shared::urpmi_backend::DB->new();
my $urpm = $rpmbackend->fast_open_urpmi_db();
my @media_urls=map { if(!$self->srpm()) {
$_->{url}
}else{
my @a = split(/\//,$_->{url});
my $newurl = "";
my $i = 0;
for($i=0;$iget_active_media($urpm,$self->srpm());
if(!$self->process_args($self->packagelist()))
{
return 4;
}
if(scalar(@media_urls) lt 1)
{
print BOLD, WHITE, "== ", RESET, RED, $self->loc->N("no active media found\n");
return 3;
}
if(scalar(@{$self->packages()}) gt 0){
for $pkg(@{$self->packages()}){
my @lista_srpms;
if($self->srpm()){
@lista_srpms = retrieve_srpm_pkgname($pkg);
}else{
@lista_srpms = retrieve_brpm_pkgname($pkg);
}
#print "@lista_srpms\n";
if($self->use_major()){
#print "Using only major version\n";
for(my $i=0;$isrpm());
print BOLD, WHITE, $self->loc->N("== Processing ")."$srpm\n", RESET;
for my $url(@media_urls){
chomp $url;
my @protocol = split(':',$url);
if($protocol[0] eq "http"){
print BOLD, WHITE, "== ", RESET, $self->loc->N("protocol in use: "), BOLD, GREEN, $protocol[0], RESET, "\n";
print BOLD, WHITE, "== ", RESET, $self->loc->N("trying with ")."$url/$srpm\n";
my $check = `curl -s --head "$url/$srpm" | head -n 1 | grep "200 OK" > /dev/null ; echo \$?`;
chomp $check;
if($check eq "0"){
$self->download($url,$srpm);
last;
}
}elsif($protocol[0] eq "ftp"){
print BOLD, WHITE, "== ", $self->loc->N("protocol in use: "), BOLD, GREEN, $protocol[0], RESET, "\n";
my $check = `curl -s --head "$url/$srpm"`;
$check =~s/\n/ /g;
$check =~s/^\s+//g;
$check =~s/\s+$//g;
if($check ne ""){
$self->download($url,$srpm);
last;
}
}elsif($protocol[0] eq "rsync"){
print BOLD, WHITE, "== ", $self->loc->N("protocol in use: "), BOLD, GREEN, $protocol[0], RESET, "\n";
}
}
print BOLD, WHITE, "== ", GREEN, "$srpm", RESET, $self->loc->N(" downloaded successfully\n");
}
}
return 0;
}else{
print BOLD, WHITE, "== ", RED, $self->loc->N("no packages passed as argument\n"), RESET;
return 2;
}
}
1;