#!/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; sub usage { my $m = shift; my $usage = #-PO: The URI types strings 'file:', 'ftp:', 'http:', and 'removable:' must not be translated! #-PO: neither the ``with''. Only what is between can be translated. N("usage: urpmi.addmedia [options] where is one of [file:/]/ ftp://:\@/ ftp:/// http:/// removable:// 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(" --limit-rate - limit the download speed. ") . N(" --proxy - use specified HTTP proxy, the port number is assumed to be 1080 by default (format is ). ") . N(" --proxy-user - specify user and password to use for proxy authentication (format is ). ") . N(" --update - create an update medium. ") . N(" --probe-synthesis - use synthesis file. ") . N(" --probe-hdlist - use hdlist file. ") . N(" --probe-rpms - use rpm files (instead of synthesis/hdlist). ") . N(" --no-probe - do not try to find any synthesis or hdlist 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(" --from - use specified url for list of mirrors, the default is %s ", $urpm::cfg::mirrors) . N(" --virtual - create virtual media wich are always up-to-date, only file:// protocol is allowed. ") . 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(" -c - clean headers cache directory. ") . N(" -q - quiet mode. ") . N(" -v - verbose mode. "); print($m ? "$usage\n$m" : $usage); exit 0; } #- remove quietly the failing media. sub remove_failed { my ($urpm, @media) = @_; if (@media) { print STDERR join("\n", map { N("unable to update medium \"%s\"\n", $_->{name}) } @media); local $urpm->{log} = sub {}; urpm::media::remove_selected_media($urpm); urpm::media::update_media($urpm, %options, quiet => 1); exit(1); } } $ENV{PATH} = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"; delete @ENV{qw(ENV BASH_ENV IFS CDPATH)}; #- parse /etc/urpmi/mirror.config if present, or use default mdk mirror. #- the --from option overrides this setting. if ($options{mirrors_url}) { $urpm::cfg::mirrors = $options{mirrors_url}; } else { urpm::cfg::mirrors_cfg(); } $options{force} = 0; $options{noclean} = 1; my $urpm = new urpm; urpm::args::parse_cmdline(urpm => $urpm) or usage(); our ($name, $url, $with, $relative_hdlist) = our @cmdline; $options{quiet} = 1 if $options{verbose} < 0; $url or ($url, $name) = ($name, ''); $url =~ m,^(([^:]*):/)?/, or die N("bad (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'); urpm::media::read_config($urpm); if ($options{distrib}) { $with || $relative_hdlist and usage N("no need to give 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) ")), undef, boolean => 1, ); return $answer ? $answer =~ /[$yesexpr]/ : $add_by_default; } : $options{allmedia} ? sub { 1; } : undef; urpm::media::add_distrib_media($urpm, $name, $url, virtual => $options{virtual}, update => $options{update}, probe_with => $options{probe_with}, nolock => $options{nolock}, ask_media => $add_media_callback, ); local $SIG{INT} = sub { remove_failed($urpm, grep { $_->{modified} } @{$urpm->{media}}); exit(1); }; urpm::media::update_media($urpm, %options, quiet => $options{verbose} < 0, callback => \&urpm::download::sync_logger); remove_failed($urpm, grep { $_->{modified} } @{$urpm->{media}}); } else { $name or usage(); if ($with eq "with") { $relative_hdlist or usage N(" missing\n"); } if ($options{probe_with} && $options{probe_with} eq 'rpms' && !urpm::file_from_local_url($url)) { die N("Can't use %s with remote medium", "--probe-rpms"); } urpm::media::add_medium($urpm, $name, $url, $relative_hdlist, virtual => $options{virtual}, update => $options{update}, ignore => $options{raw}, nolock => $options{nolock}, ); urpm::download::copy_cmd_line_proxy($name); if ($options{raw}) { urpm::media::write_config($urpm); } else { local $SIG{INT} = sub { my $medium = urpm::media::name2medium($urpm, $name); remove_failed($urpm, $medium) if $medium && $medium->{modified}; exit(1); }; urpm::media::update_media($urpm, %options, quiet => $options{verbose} < 0, callback => \&urpm::download::sync_logger); #- check creation of media my $medium = urpm::media::name2medium($urpm, $name) or die N("unable to create medium \"%s\"\n", $name); remove_failed($urpm, $medium) if $medium->{modified}; } } #- try to umount removable devices which may have been mounted. urpm::removable::try_umounting_removables($urpm); # vim:ts=8:sts=4:sw=4