diff options
-rw-r--r-- | urpm.pm | 83 | ||||
-rwxr-xr-x | urpmi | 20 | ||||
-rwxr-xr-x | urpmi.addmedia | 16 | ||||
-rw-r--r-- | urpmi.spec | 7 | ||||
-rwxr-xr-x | urpmi.update | 16 | ||||
-rwxr-xr-x | urpmq | 18 |
6 files changed, 147 insertions, 13 deletions
@@ -121,6 +121,7 @@ sub new { depslist => [], sync => \&sync_webfetch, #- first argument is directory, others are url to fetch. + proxy => get_proxy(), fatal => sub { printf STDERR "%s\n", $_[1]; exit($_[0]) }, error => sub { printf STDERR "%s\n", $_[0] }, @@ -128,6 +129,57 @@ sub new { }, $class; } +sub get_proxy { + my $proxy = { + http_proxy => undef , + user => undef, + pwd => undef + }; + local (*F, $_); + # open F, "$ENV{HOME}/.wgetrc" or return; + open F, "/etc/urpmi/proxy.cfg" or return; + while (<F>) { + chomp; s/#.*$//; s/^\s*//; s/\s*$//; + /^http_proxy\s*=\s*(.*)$/ and $proxy->{http_proxy} = $1, next; + /^ftp_proxy\s*=\s*(.*)$/ and $proxy->{ftp_proxy} = $1, next; + /^proxy_user\s*=\s*(.*):(.*)$/ and do { + $proxy->{user} = $1; + $proxy->{pwd} = $2; + next; + }; + next; + } + close F; + $proxy; +} + +sub set_proxy { + my $proxy = shift @_; + my @res; + if (defined $proxy->{proxy}->{http_proxy} or defined $proxy->{proxy}->{ftp_proxy}) { + for ($proxy->{type}) { + /wget/ && do { + for ($proxy->{proxy}) { + $ENV{http_proxy} = $_->{http_proxy} if defined $_->{http_proxy}; + $ENV{ftp_proxy} = $_->{ftp_proxy} if defined $_->{ftp_proxy}; + @res = ("--proxy-user=$_->{user}", "--proxy-passwd=$_->{pwd}") if defined $_->{user} && defined $_->{pwd}; + } + last; + }; + /curl/ && do { + for ($proxy->{proxy}) { + push @res, "-x $_->{http_proxy}" if defined $_->{http_proxy}; + push @res, "-x $_->{ftp_proxy}" if defined $_->{ftp_proxy}; + push @res, "-U $_->{user}:$_->{pwd}" if defined $_->{user} && defined $_->{pwd}; + } + last; + }; + die _("Unknown webfetch `$proxy->{type}' !!!\n"); + } + } + return @res; +} + #- quoting/unquoting a string that may be containing space chars. sub quotespace { local $_ = $_[0]; s/(\s)/\\$1/g; $_ } sub unquotespace { local $_ = $_[0]; s/\\(\s)/$1/g; $_ } @@ -167,8 +219,10 @@ sub sync_webfetch { sub sync_wget { -x "/usr/bin/wget" or die _("wget is missing\n"); my $options = shift @_; - system "/usr/bin/wget", (ref $options && $options->{quiet} ? ("-q") : ()), "-NP", - (ref $options ? $options->{dir} : $options), @_; + system "/usr/bin/wget", + (ref $options && set_proxy({type => "wget", proxy => $options->{proxy}})), + (ref $options && $options->{quiet} ? ("-q") : ()), "-NP", + (ref $options ? $options->{dir} : $options), @_; $? == 0 or die _("wget failed: exited with %d or signal %d\n", $? >> 8, $? & 127); } sub sync_curl { @@ -187,7 +241,10 @@ sub sync_curl { #- prepare to get back size and time stamp of each file. local *CURL; - open CURL, "/usr/bin/curl -I " . join(" ", map { "'$_'" } @ftp_files) . " |"; + open CURL, "/usr/bin/curl" . + " " . (ref $options && set_proxy({type => "curl", proxy => $options->{proxy}})) . + " " . (ref $options && $options->{quiet} ? ("-s") : ()) . + " -I " . join(" ", map { "'$_'" } @ftp_files) . " |"; while (<CURL>) { if (/Content-Length:\s*(\d+)/) { !$cur_ftp_file || exists $ftp_files_info{$cur_ftp_file}{size} and $cur_ftp_file = shift @ftp_files; @@ -222,7 +279,10 @@ sub sync_curl { #- options for ftp files, -R (-O <file>)* #- options for http files, -R (-z file -O <file>)* if (my @all_files = ((map { ("-O", $_ ) } @ftp_files), (map { /\/([^\/]*)$/ ? ("-z", $1, "-O", $_) : () } @other_files))) { - system "/usr/bin/curl", (ref $options && $options->{quiet} ? ("-s") : ()), "-R", "-f", @all_files; + system "/usr/bin/curl", + (ref $options && set_proxy({type => "curl", proxy => $options->{proxy}})), + (ref $options && $options->{quiet} ? ("-s") : ()), "-R", "-f", + @all_files; $? == 0 or die _("curl failed: exited with %d or signal %d\n", $? >> 8, $? & 127); } } @@ -560,7 +620,8 @@ sub add_distrib_media { unlink "$urpm->{cachedir}/partial/hdlists"; eval { $urpm->{log}(_("retrieving hdlists file...")); - $urpm->{sync}("$urpm->{cachedir}/partial", reduce_pathname("$url/Mandrake/base/hdlists")); +# $urpm->{sync}({proxy => $urpm->{proxy}}, "$urpm->{cachedir}/partial", reduce_pathname("$url/Mandrake/base/hdlists")); + $urpm->{sync}({dir => "$urpm->{cachedir}/partial", quiet => 1, proxy => $urpm->{proxy}}, reduce_pathname("$url/Mandrake/base/hdlists")); $urpm->{log}(_("...retrieving done")); }; $@ and $urpm->{log}(_("...retrieving failed: %s", $@)); @@ -859,7 +920,7 @@ sub update_media { } eval { $urpm->{log}(_("retrieving description file of \"%s\"...", $medium->{name})); - $urpm->{sync}({ dir => "$urpm->{cachedir}/partial", quiet => 1 }, + $urpm->{sync}({ dir => "$urpm->{cachedir}/partial", quiet => 1, proxy => $urpm->{proxy} }, reduce_pathname("$medium->{url}/../descriptions")); $urpm->{log}(_("...retrieving done")); }; @@ -884,7 +945,7 @@ sub update_media { unlink "$urpm->{cachedir}/partial/$basename"; eval { - $urpm->{sync}({ dir => "$urpm->{cachedir}/partial", quiet => 1 }, reduce_pathname("$medium->{url}/$_")); + $urpm->{sync}({ dir => "$urpm->{cachedir}/partial", quiet => 1, proxy => $urpm->{proxy} }, reduce_pathname("$medium->{url}/$_")); }; if (!$@ && -s "$urpm->{cachedir}/partial/$basename" > 32) { $medium->{with_hdlist} = $_; @@ -905,7 +966,8 @@ sub update_media { system("cp", "-a", "$urpm->{statedir}/$medium->{hdlist}", "$urpm->{cachedir}/partial/$basename"); } eval { - $urpm->{sync}("$urpm->{cachedir}/partial", reduce_pathname("$medium->{url}/$medium->{with_hdlist}")); +# $urpm->{sync}({proxy => $urpm->{proxy}}, "$urpm->{cachedir}/partial", reduce_pathname("$medium->{url}/$medium->{with_hdlist}")); + $urpm->{sync}({ dir => "$urpm->{cachedir}/partial", quiet => 1, proxy => $urpm->{proxy}}, reduce_pathname("$medium->{url}/$medium->{with_hdlist}")); }; if ($@) { $urpm->{log}(_("...retrieving failed: %s", $@)); @@ -942,7 +1004,7 @@ sub update_media { unlink "$urpm->{cachedir}/partial/list"; my $local_list = $medium->{with_hdlist} =~ /hd(list.*)\.cz$/ ? $1 : 'list'; eval { - $urpm->{sync}({ dir => "$urpm->{cachedir}/partial", quiet => 1}, + $urpm->{sync}({ dir => "$urpm->{cachedir}/partial", quiet => 1, proxy => $urpm->{proxy}}, reduce_pathname("$medium->{url}/$local_list")); $local_list ne 'list' and rename("$urpm->{cachedir}/partial/$local_list", "$urpm->{cachedir}/partial/list"); @@ -1681,7 +1743,8 @@ sub download_source_packages { foreach (map { m|([^:]*://[^/:\@]*:)[^/:\@]*(\@.*)| ? "$1xxxx$2" : $_ } @distant_sources) { $urpm->{log}(" $_") ; } - $urpm->{sync}("$urpm->{cachedir}/rpms", @distant_sources); +# $urpm->{sync}({proxy => $urpm->{proxy}}, "$urpm->{cachedir}/rpms", @distant_sources); + $urpm->{sync}({dir => "$urpm->{cachedir}/rpms", quiet => 1, proxy => $urpm->{proxy}}, @distant_sources); $urpm->{log}(_("...retrieving done")); }; $@ and $urpm->{log}(_("...retrieving failed: %s", $@)); @@ -71,6 +71,10 @@ usage: ") . _(" --force - force invocation even if some packages do not exist. ") . _(" --wget - use wget to retrieve distant files. ") . _(" --curl - use curl to retrieve distant files. +") . _(" --proxy - use specified HTTP proxy, the port number is assumed + to be 1080 by default (format is <proxyhost[:port]>). +") . _(" --proxy-user - specify user and password to use for proxy + authentication (format is <user:password>). ") . _(" --bug - output a bug report in directory indicated by next arg. ") . _(" --env - use specific environment (typically a bug report). ") . _(" --X - use X interface. @@ -107,6 +111,18 @@ for (@ARGV) { else { $options = { dir => $options, prefer => 'wget' } } urpm::sync_webfetch($options, @_) }; next }; /^--curl$/ and do { $sync = \&urpm::sync_webfetch; next }; + /^--proxy$/ and do { + ($_ = shift @_) =~ m,^http://([^:]+)(:([\d]+)|[^:])$, or die $usage; + $_ .= ":1080" if /[^\d]/; + $urpm->{proxy}->{http_proxy} = $_; + next; + }; + /^--proxy-user$/ and do { + ($_ = shift @_) =~ /(.+):(.+)/, or die $usage; + $urpm->{proxy}->{user} = $1; + $urpm->{proxy}->{pwd} = $2; + next; + }; /^--bug$/ and do { push @nextargv, \$bug; next }; /^--env$/ and do { push @nextargv, \$env; next }; /^--X$/ and do { $X = 1; next }; @@ -460,7 +476,7 @@ if (%sources_install || %sources) { } else { my @l = $urpm->install($root, \%sources_install, \%sources); if (@l) { - message(_("Installation failed")); + message(_("Installation failed") . ":\n" . join("\n", @l)); m|^/| && !-e $_ and exit 2 foreach values %sources_install, values %sources; #- missing local file $auto and exit 1; #- if auto has been set, avoid asking user. @@ -472,7 +488,7 @@ if (%sources_install || %sources) { $urpm->{log}("starting installing packages without deps"); @l = $urpm->install($root, \%sources_install, \%sources, nodeps => 1); if (@l) { - message(_("Installation failed")); + message(_("Installation failed") . ":\n" . join("\n", @l)); message_input(_("Try installation even more strongly (--force)? (y/N) "), $force && $yesexpr) =~ /[$yesexpr]/ or exit 1; $urpm->{log}("starting force installing packages without deps"); diff --git a/urpmi.addmedia b/urpmi.addmedia index 3ef542e9..083b34f3 100755 --- a/urpmi.addmedia +++ b/urpmi.addmedia @@ -40,6 +40,10 @@ and [options] are from ") . _(" -f - force generation of hdlist files. ") . _(" --wget - use wget to retrieve distant files. ") . _(" --curl - use curl to retrieve distant files. +") . _(" --proxy - use specified HTTP proxy, the port number is assumed + to be 1080 by default (format is <proxyhost[:port]>). +") . _(" --proxy-user - specify user and password to use for proxy + authentication (format is <user:password>). ") . _(" --update - create an update medium. ") . _(" --distrib - automatically create all media from an installation medium. "); @@ -56,6 +60,18 @@ and [options] are from else { $options = { dir => $options, prefer => 'wget' } } urpm::sync_webfetch($options, @_) }, next; /^--curl/ and $urpm->{sync} = \&urpm::sync_webfetch, next; + /^--proxy$/ and do { + ($_ = shift @_) =~ m,^http://([^:]+)(:([\d]+)|[^:])$, or die $usage; + $_ .= ":1080" if /[^\d]/; + $urpm->{proxy}->{http_proxy} = $_; + next; + }; + /^--proxy-user$/ and do { + ($_ = shift @_) =~ /(.+):(.+)/, or die $usage; + $urpm->{proxy}->{user} = $1; + $urpm->{proxy}->{pwd} = $2; + next; + }; /^--distrib$/ and $options{distrib} = 1, next; /^--update$/ and $options{update} = 1, next; /^-/ and die $usage . _("\nunknown options '%s'\n", $_); @@ -2,7 +2,7 @@ Name: urpmi Version: 3.7 -Release: 2mdk +Release: 3mdk License: GPL Source0: %{name}.tar.bz2 Source1: %{name}.logrotate @@ -144,6 +144,11 @@ fi %changelog +* Thu Jul 11 2002 François Pons <fpons@mandrakesoft.com> 3.7-3mdk +- incorporated proxy patch of Andre Duclos <shirka@wanadoo.fr>. +- added tempory error message (before message and translation are + done). + * Tue Jul 9 2002 Pixel <pixel@mandrakesoft.com> 3.7-2mdk - rebuild for perl 5.8.0 diff --git a/urpmi.update b/urpmi.update index 1454d16a..7560bd9c 100755 --- a/urpmi.update +++ b/urpmi.update @@ -40,6 +40,18 @@ sub main { else { $options = { dir => $options, prefer => 'wget' } } urpm::sync_webfetch($options, @_) }, next; /^--curl/ and $urpm->{sync} = \&urpm::sync_webfetch, next; + /^--proxy$/ and do { + ($_ = shift @_) =~ m,^http://([^:]+)(:([\d]+)|[^:])$, or die $usage; + $_ .= ":1080" if /[^\d]/; + $urpm->{proxy}->{http_proxy} = $_; + next; + }; + /^--proxy-user$/ and do { + ($_ = shift @_) =~ /(.+):(.+)/, or die $usage; + $urpm->{proxy}->{user} = $1; + $urpm->{proxy}->{pwd} = $2; + next; + }; /^--?noa/ and next; #- default, keeped for compability. /^-/ and die _("usage: urpmi.update [options] <name> ... where <name> is a medium name to update. @@ -49,6 +61,10 @@ where <name> is a medium name to update. ") . _(" -f - force generation of hdlist files. ") . _(" --wget - use wget to retrieve distant files. ") . _(" --curl - use curl to retrieve distant files. +") . _(" --proxy - use specified HTTP proxy, the port number is assumed + to be 1080 by default (format is <proxyhost[:port]>). +") . _(" --proxy-user - specify user and password to use for proxy + authentication (format is <user:password>). ") . _("\nunknown options '%s'\n", $_); push @toupdates, $_; } @@ -58,6 +58,12 @@ usage: stdout (root only). ") . _(" --sources - give all source packages before downloading (root only). ") . _(" --force - force invocation even if some packages do not exist. +") . _(" --wget - use wget to retrieve distant files. +") . _(" --curl - use curl to retrieve distant files. +") . _(" --proxy - use specified HTTP proxy, the port number is assumed + to be 1080 by default (format is <proxyhost[:port]>). +") . _(" --proxy-user - specify user and password to use for proxy + authentication (format is <user:password>). ") . "\n" . _(" names or rpm files given on command line are queried. ", $urpm::VERSION); exit(0); @@ -86,6 +92,18 @@ for (@ARGV) { else { $options = { dir => $options, prefer => 'wget' } } urpm::sync_webfetch($options, @_) }; next }; /^--curl$/ and do { $urpm->{sync} = \&urpm::sync_webfetch; next }; + /^--proxy$/ and do { + ($_ = shift @_) =~ m,^http://([^:]+)(:([\d]+)|[^:])$, or usage; + $_ .= ":1080" if /[^\d]/; + $urpm->{proxy}->{http_proxy} = $_; + next; + }; + /^--proxy-user$/ and do { + ($_ = shift @_) =~ /(.+):(.+)/, or usage; + $urpm->{proxy}->{user} = $1; + $urpm->{proxy}->{pwd} = $2; + next; + }; /^-(.*)$/ and do { foreach (split //, $1) { /[\?h]/ and do { usage; next }; /d/ and do { $query->{deps} = 1; next }; |