#!/usr/bin/perl # $Id$ #- Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 MandrakeSoft SA #- Copyright (C) 2005, 2006 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 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:/usr/X11R6/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}) { 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}, virtual => $options{virtual}, only_updates => $options{update}, probe_with => $options{probe_with}, nolock => $options{nolock}, ask_media => $add_media_callback, '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}, 'with-dir' => $with_dir, virtual => $options{virtual}, 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