#!/usr/bin/perl
# $Id: urpmi.addmedia 271299 2010-11-21 15:54:30Z peroyvind $
#- Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 MandrakeSoft SA
#- Copyright (C) 2005-2010 Mandriva SA
#-
#- 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 2, 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, write to the Free Software
#- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
use strict;
use urpm;
use urpm::args;
use urpm::msg;
use urpm::download ();
use urpm::cfg;
use urpm::media;
use urpm::util 'member';
sub usage {
my $m = shift;
my $usage =
#-PO: The URI types strings 'file:', 'ftp:', 'http:', and 'cdrom:' must not be translated!
#-PO: neither the ``with''. Only what is between <brackets> can be translated.
N("usage: urpmi.addmedia [options] <name> <url>
where <url> is one of
[file:/]/<path>
ftp://<login>:<password>\@<host>/<path>
ftp://<host>/<path>
http://<host>/<path>
cdrom://<path>
usage: urpmi.addmedia [options] --distrib --mirrorlist <url>
usage: urpmi.addmedia [options] --mirrorlist <url> <name> <relative path>
examples:
urpmi.addmedia --distrib --mirrorlist '\$MIRRORLIST'
urpmi.addmedia --mirrorlist '\$MIRRORLIST' backports media/main/backports
urpmi.addmedia --distrib --zeroconf
and [options] are from
") . N(" --help - print this help message.
") . N(" --wget - use wget to retrieve distant files.
") . N(" --curl - use curl to retrieve distant files.
") . N(" --prozilla - use prozilla to retrieve distant files.
") . N(" --aria2 - use aria2 to retrieve distant files.
") . N(" --metalink - generate and use a local metalink.
") . N(" --limit-rate - limit the download speed.
") . N(" --proxy - use specified HTTP proxy, the port number is assumed
to be 1080 by default (format is <proxyhost[:port]>).
") . N(" --proxy-user - specify user and password to use for proxy
authentication (format is <user:password>).
") . N(" --update - create an update medium,
or discard non-update media (when used with --distrib)
") . N(" --xml-info - use the specific policy for downloading xml info files
one of: never, on-demand, update-only, always. cf urpmi.cfg(5)
") . N(" --probe-synthesis - use synthesis file.
") . N(" --probe-rpms - use rpm files (instead of synthesis).
") . N(" --no-probe - do not try to find any synthesis file.
") . N(" --urpmi-root - use another root for urpmi db & rpm installation.
") . N(" --distrib - automatically create all media from an installation
medium.
") . N(" --interactive - with --distrib, ask confirmation for each media
") . N(" --all-media - with --distrib, add every listed media
") . N(" --virtual - create virtual media wich are always up-to-date.
") . N(" --no-md5sum - disable MD5SUM file checking.
") . N(" --nopubkey - don't import pubkey of added media
") . N(" --raw - add the media in config, but don't update it.
") . N(" -q - quiet mode.
") . N(" -v - verbose mode.
");
print($m ? "$usage\n$m" : $usage);
exit 1;
}
$ENV{PATH} = "/sbin:/usr/sbin:/bin:/usr/bin";
delete @ENV{qw(ENV BASH_ENV IFS CDPATH)};
$options{force} = 0;
my $urpm = urpm->new_parse_cmdline or usage();
if ($options{'xml-info'}) {
member($options{'xml-info'}, urpm::xml_info_policies()) or die N("known xml-info policies are %s", join(', ', urpm::xml_info_policies())) . "\n";
}
our ($name, $url, $with, $relative_synthesis) = our @cmdline;
my $with_dir;
$options{quiet} = 1 if $options{verbose} < 0;
$url or ($url, $name) = ($name, '');
if ($options{mirrorlist} || $options{zeroconf}) {
if ($options{distrib}) {
$url and die N("no argument needed for --distrib --mirrorlist <url>") . "\n";
} else {
($with_dir, $url) = ($url, undef);
}
} else {
$url =~ m,^(([^:]*):/)?/, or die N("bad <url> (for local directory, the path must be absolute)") . "\n";
}
if ($< != 0) {
$urpm->{fatal}(1, N("Only superuser is allowed to add media"));
}
if (!-e $urpm->{config}) {
$urpm->{log}(N("creating config file [%s]", $urpm->{config}));
open my $_f, '>', $urpm->{config} or $urpm->{fatal}(6, N("Can't create config file [%s]", $urpm->{config}));
}
my $_urpmi_lock = urpm::lock::urpmi_db($urpm, 'exclusive', wait => $options{wait_lock});
urpm::media::read_config($urpm, 'nocheck');
my $ok = 1;
if ($options{distrib}) {
$with || $relative_synthesis
and usage N("no need to give <relative path of synthesis> with --distrib");
my $add_media_callback = $options{interactive} ?
sub {
my ($medianame, $add_by_default) = @_;
my $yesexpr = N("Yy");
$add_by_default = 1 if $options{allmedia};
my $answer = message_input(
N("\nDo you want to add media '%s'?", $medianame) . ($add_by_default ? N(" (Y/n) ") : N(" (y/N) ")),
boolean => 1,
);
return $answer ? $answer =~ /[$yesexpr]/ : $add_by_default;
} : $options{allmedia} ? sub {
1;
} : undef;
urpm::media::add_distrib_media($urpm,
$name,
$url,
mirrorlist => $options{mirrorlist},
zeroconf => $options{zeroconf},
virtual => $options{virtual},
only_updates => $options{update},
probe_with => $options{probe_with},
nolock => $options{nolock},
ask_media => $add_media_callback,
'verify-rpm' => $options{'verify-rpm'},
'xml-info' => $options{'xml-info'},
) or $urpm->{fatal}(10, N("unable to add medium"));
$ok = urpm::media::update_media($urpm, %options,
quiet => $options{verbose} < 0,
callback => \&urpm::download::sync_logger);
} else {
$name && $name !~ m!/! or usage();
if ($with eq "with") {
$relative_synthesis or usage N("<relative path of synthesis> missing\n");
}
if ($options{probe_with} && $options{probe_with} eq 'rpms' && !urpm::is_local_url($url)) {
die N("Can't use %s with remote medium", "--probe-rpms");
}
urpm::media::add_medium($urpm,
$name, $url, $relative_synthesis,
mirrorlist => $options{mirrorlist},
zeroconf => $options{zeroconf},
'with-dir' => $with_dir,
virtual => $options{virtual},
'verify-rpm' => $options{'verify-rpm'},
update => $options{update},
ignore => $options{raw},
nolock => $options{nolock},
'xml-info' => $options{'xml-info'},
) or $urpm->{fatal}(10, N("unable to add medium"));
urpm::download::copy_cmd_line_proxy($name);
if ($options{raw}) {
urpm::media::write_config($urpm);
} else {
$ok = urpm::media::update_media($urpm, %options,
quiet => $options{verbose} < 0,
callback => \&urpm::download::sync_logger);
}
}
#- try to umount removable devices which may have been mounted.
urpm::removable::try_umounting_removables($urpm);
exit($ok ? 0 : 1);
# vim:ts=8:sts=4:sw=4