aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ManaTools/Module
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ManaTools/Module')
-rw-r--r--lib/ManaTools/Module/PkgDownloader.pm207
1 files changed, 207 insertions, 0 deletions
diff --git a/lib/ManaTools/Module/PkgDownloader.pm b/lib/ManaTools/Module/PkgDownloader.pm
new file mode 100644
index 00000000..e78c9eb4
--- /dev/null
+++ b/lib/ManaTools/Module/PkgDownloader.pm
@@ -0,0 +1,207 @@
+#!/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 <http://www.gnu.org/licenses/>.
+#
+# Copyright: 2012 - 2016 by Matteo Pasotti <matteo.pasotti@gmail.com>
+
+package ManaTools::Module::PkgDownloader;
+
+use strict;
+use warnings;
+# use diagnostics;
+use Term::ANSIColor qw(:constants);
+# use Getopt::Long qw(:config permute);
+# use urpmex::Urpmex;
+use Moose;
+use Moose::Autobox;
+use ManaTools::Shared::urpmi_backend::DB;
+
+
+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,
+);
+
+has 'packages' => (
+ is => 'rw',
+ isa => 'ArrayRef',
+ default => sub { [] },
+);
+
+sub process_args {
+ my ($self, $pkglist) = @_;
+ for(split(/\s/,$pkglist)){
+ push @{$self->packages()}, $_;
+ }
+}
+
+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;$i<scalar(@a)-4;$i++)
+ {
+ $newurl .= $a[$i]."/";
+ }
+ $newurl."SRPMS/".$a[scalar(@a)-2]."/".$a[scalar(@a)-1];
+ }
+ } $rpmbackend->get_active_media($urpm,$self->srpm());
+
+ $self->process_args($self->packagelist());
+
+
+ if(scalar(@media_urls) lt 1)
+ {
+ print BOLD, RED, "==", RESET, " 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;$i<scalar(@lista_srpms)-1;$i++){
+ shift @lista_srpms;
+ #print "@lista_srpms\n";
+ }
+ }
+ for my $srpm(@lista_srpms){
+ $srpm =~s/^\s+//g;
+ chomp $srpm;
+ $srpm = $srpm.".rpm" if(!$self->srpm());
+ print BOLD, WHITE, "== Processing $srpm\n", RESET;
+ for my $url(@media_urls){
+ chomp $url;
+ my @protocol = split(':',$url);
+ if($protocol[0] eq "http"){
+ print BOLD, WHITE, "== ", RESET, "protocol in use: ", BOLD, WHITE, $protocol[0], RESET, "\n";
+ print BOLD, WHITE, "== ", RESET, "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, "== ", "protocol in use: ", BOLD, WHITE, $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, "== ", "protocol in use: ", BOLD, WHITE, $protocol[0], RESET, "\n";
+ }
+ }
+ print BOLD, WHITE, "== $srpm", RESET, " downloaded successfully\n";
+ }
+ }
+ return 0;
+ }else{
+ print BOLD, RED, "== no packages passed as argument\n", RESET;
+ return 2;
+ }
+}
+
+1;