Merge remote-tracking branch 'upstream/master'

Conflicts:
	apt-mirror
pull/31/head
eiflera 9 years ago
commit c91c77b3e3
  1. 3
      .gitignore
  2. 2
      .perltidyrc
  3. 17
      CHANGELOG
  4. 31
      Makefile
  5. 256
      apt-mirror
  6. 26
      install.sh
  7. 18
      postmirror.sh

3
.gitignore vendored

@ -1 +1,2 @@
*.bak
*.bak
*.tar.*

@ -1,4 +1,4 @@
-bl
-bl
-l=500
-i=4
-pt=1

@ -1,10 +1,15 @@
0.5.0 - UNRELEASED
* Removed restrictions when parsing deb-$arch
0.5.0 (2014-02-22)
* Removed restrictions when parsing deb-$arch (Launchpad bug #913837)
new arch's no longer need to be manually added
via an apt-mirror source change.
* Code cleaned up with perltidy and a .perltidyrc added
* Changed to warn() instead of die() when sources go missing
so mirroring of other sources continues.
* Download all provided translation files instead of trying to download
translation files based on a hard-coded language list. (Debian bug #725762)
* Fix typos (e.g. Debian bug #736904 and Launchpad bug #1211097).
* Mirror Contents-*.gz for each component. (Debian bug #647301)
* Mirror InRelease files (fixes #3).
0.4.9
* Added support for downloading of i18n files.
@ -29,7 +34,7 @@
0.4.7
* Lots of typos fixed
* apt-mirror will now try to create needed directorys if they do not exist
* apt-mirror will now try to create needed directories if they do not exist
* applied patch for closedir() errors
* added mirroring examples of multiple architectures to the debian mirror.list
* fixed manpage description of mirror.list
@ -41,12 +46,12 @@
allow user:pass@host ( http and ftp authenticated )
and port numbers in the url host:8080 etc
* Added ability to run a shell script after apt-mirror completes the
mirroring confg values "run_postmirror" 0/1
mirroring configuration values "run_postmirror" 0/1
and "postmirror_script" /path/to/script.sh
* added rate_limit option ( closes sf.net bug #1729402 )
a value of 25 is equal to 25 Bytes/Second
a value of 25k is equal to 25 KiloBytes/Second
a value of 25m is equal to 25 MegaBytes/Second
a value of 25k is equal to 25 Kilobytes/Second
a value of 25m is equal to 25 Megabyte/Second
0.4.5

@ -0,0 +1,31 @@
VERSION := 0.5.0
DIST := apt-mirror CHANGELOG LICENSE Makefile mirror.list postmirror.sh README.md .perltidyrc
BASE_PATH := /var/spool/apt-mirror
PREFIX ?= /usr/local
all:
dist: apt-mirror-$(VERSION).tar.xz
install:
install -m 755 -D apt-mirror $(DESTDIR)$(PREFIX)/bin/apt-mirror
mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1/
pod2man apt-mirror > $(DESTDIR)$(PREFIX)/share/man/man1/apt-mirror.1
if test ! -f $(DESTDIR)/etc/apt/mirror.list; then install -m 644 -D mirror.list $(DESTDIR)/etc/apt/mirror.list; fi
mkdir -p $(DESTDIR)$(BASE_PATH)/mirror
mkdir -p $(DESTDIR)$(BASE_PATH)/skel
mkdir -p $(DESTDIR)$(BASE_PATH)/var
%.tar.bz2: $(DIST)
tar -c --exclude-vcs --transform="s@^@$*/@" $^ | bzip2 -cz9 > $@
%.tar.gz: $(DIST)
tar -c --exclude-vcs --transform="s@^@$*/@" $^ | gzip -cn9 > $@
%.tar.xz: $(DIST)
tar -c --exclude-vcs --transform="s@^@$*/@" $^ | xz -cz9 > $@
clean:
rm -f *.tar.*
.PHONY: all clean dist install

@ -1,4 +1,4 @@
#!/usr/bin/perl -w
#!/usr/bin/perl
=pod
@ -16,14 +16,14 @@ A small and efficient tool that lets you mirror a part of or
the whole Debian GNU/Linux distribution or any other apt sources.
Main features:
* It uses a config similar to apts F<sources.list>
* It's fully pool comply
* It uses a config similar to APT's F<sources.list>
* It's fully pool compliant
* It supports multithreaded downloading
* It supports multiple architectures at the same time
* It can automatically remove unneeded files
* It works well on overloaded channel to internet
* It works well on an overloaded Internet connection
* It never produces an inconsistent mirror including while mirroring
* It works on all POSIX compliant systems with perl and wget
* It works on all POSIX compliant systems with Perl and wget
=head1 COMMENTS
@ -35,7 +35,7 @@ After you setup the configuration file you may run as root:
# su - apt-mirror -c apt-mirror
Or uncomment line in F</etc/cron.d/apt-mirror> to enable daily mirror updates.
Or uncomment the line in F</etc/cron.d/apt-mirror> to enable daily mirror updates.
=head1 FILES
@ -52,17 +52,17 @@ F</var/spool/apt-mirror/skel>
Place for temporarily downloaded indexes
F</var/spool/apt-mirror/var>
Log files placed here. URLs and MD5 summs also here.
Log files placed here. URLs and MD5 checksums also here.
=head1 CONFIGURATION EXAMPLES
The mirror.list configuration supports many options, the file is well commented explinging each option.
here are some sample mirror configuration lines showing the various supported ways :
The mirror.list configuration supports many options, the file is well commented explaining each option.
Here are some sample mirror configuration lines showing the various supported ways:
Normal:
deb http://example.com/debian stable main contrib non-free
Arch Specific: ( many other arch's are supported )
Arch Specific: (many other architectures are supported)
deb-powerpc http://example.com/debian stable main contrib non-free
HTTP and FTP Auth or non-standard port:
@ -87,8 +87,10 @@ Brandon Holtsclaw E<lt>me@brandonholtsclaw.comE<gt>
=cut
use warnings;
use strict;
use File::Copy;
use File::Compare;
use File::Path;
use File::Basename;
use Fcntl qw(:flock);
@ -111,9 +113,7 @@ my %config_variables = (
"auth_no_challenge" => 0,
"no_check_certificate" => 0,
"unlink" => 0,
"postmirror_script" => '$var_path/postmirror.sh',
"proxy_user" => '',
"proxy_password" => ''
"postmirror_script" => '$var_path/postmirror.sh'
);
my @config_binaries = ();
@ -174,6 +174,7 @@ sub format_bytes
$size_name = 'GiB';
}
}
$bytes_out = round_number($bytes_out);
}
else
{
@ -181,7 +182,6 @@ sub format_bytes
$size_name = 'bytes';
}
$bytes_out = round_number($bytes_out);
return "$bytes_out $size_name";
}
@ -228,13 +228,7 @@ sub download_urls
if ( get_variable("auth_no_challenge") == 1 ) { push( @args, "--auth-no-challenge" ); }
if ( get_variable("no_check_certificate") == 1 ) { push( @args, "--no-check-certificate" ); }
if ( get_variable("unlink") == 1 ) { push( @args, "--unlink" ); }
if ( length ( get_variable("use_proxy") ) && ( get_variable("use_proxy") eq 'yes' || get_variable("use_proxy") eq 'on' ) )
{
if ( length ( get_variable("http_proxy") ) ) { push( @args, "-e use_proxy=yes"); push( @args, "-e http_proxy=" . get_variable( "http_proxy" ) ); }
if ( length ( get_variable("proxy_user") ) ) { push( @args, "-e proxy_user=" . get_variable( "proxy_user" ) ); }
if ( length ( get_variable("proxy_password") ) ) { push( @args, "-e proxy_password=" . get_variable( "proxy_password" ) ); }
}
print "Downloading " . scalar(@urls) . " $stage files using $nthreads threads...\n";
while ( scalar @urls )
@ -299,7 +293,7 @@ while (<CONFIG>)
next;
}
if($config_line =~ /deb-([\w\-]+)/)
if ( $config_line =~ /deb-([\w\-]+)/ )
{
push @config_binaries, [ $1, @config_line ];
next;
@ -374,6 +368,7 @@ foreach (@config_sources)
{
$url = $uri . "/dists/" . $distribution . "/";
add_url_to_download( $url . "InRelease" );
add_url_to_download( $url . "Release" );
add_url_to_download( $url . "Release.gpg" );
foreach (@components)
@ -400,6 +395,7 @@ foreach (@config_binaries)
{
$url = $uri . "/dists/" . $distribution . "/";
add_url_to_download( $url . "InRelease" );
add_url_to_download( $url . "Release" );
add_url_to_download( $url . "Release.gpg" );
if ( get_variable("_contents") )
@ -409,17 +405,15 @@ foreach (@config_binaries)
}
foreach (@components)
{
if ( get_variable("_contents") )
{
add_url_to_download( $url . $_ . "/Contents-" . $arch . ".gz" );
add_url_to_download( $url . $_ . "/Contents-" . $arch . ".bz2" );
}
add_url_to_download( $url . $_ . "/binary-" . $arch . "/Release" );
add_url_to_download( $url . $_ . "/binary-" . $arch . "/Packages.gz" );
add_url_to_download( $url . $_ . "/binary-" . $arch . "/Packages.bz2" );
my $lang;
foreach $lang ( "ad", "ae", "af", "ag", "ai", "al", "am", "ao", "aq", "ar", "ar_AE", "ar_BH", "ar_DZ", "ar_EG", "ar_IQ", "ar_JO", "ar_KW", "ar_LB", "ar_LY", "ar_MA", "ar_OM", "ar_QA", "ar_SA", "ar_SD", "ar_SY", "ar_TN", "ar_YE", "as", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "be_BY", "bf", "bg", "bg_BG", "bh", "bi", "bj", "bl", "bm", "bn", "bo", "bq", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "ca_ES", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cs", "cs_CZ", "cu", "cv", "cw", "cx", "cy", "cz", "da", "da_DK", "de", "de_AT", "de_CH", "de_DE", "de_LU", "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "el", "el_CY", "el_GR", "en", "en_AU", "en_CA", "en_GB", "en_IE", "en_IN", "en_MT", "en_NZ", "en_PH", "en_SG", "en_US", "en_ZA", "er", "es", "es_AR", "es_BO", "es_CL", "es_CO", "es_CR", "es_DO", "es_EC", "es_ES", "es_GT", "es_HN", "es_MX", "es_NI", "es_PA", "es_PE", "es_PR", "es_PY", "es_SV", "es_US", "es_UY", "es_VE", "et", "et_EE", "fi", "fi_FI", "fj", "fk", "fm", "fo", "fr", "fr_BE", "fr_CA", "fr_CH", "fr_FR", "fr_LU", "ga", "ga_IE", "gb", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq", "gr", "gs", "gt", "gu", "gw", "gy", "hi_IN", "hk", "hm", "hn", "hr", "hr_HR", "ht", "hu", "hu_HU", "id", "ie", "il", "im", "in", "in_ID", "io", "iq", "ir", "is", "is_IS", "it", "it_CH", "it_IT", "iw", "iw_IL", "ja", "ja_JP", "ja_JP_JP", "je", "jm", "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "ko", "ko_KR", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lt_LT", "lu", "lv", "lv_LV", "ly", "ma", "mc", "md", "me", "mf", "mg", "mh", "mk", "mk_MK", "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "ms_MY", "mt", "mt_MT", "mu", "mv", "mw", "mx", "my", "mz", "na", "nb", "nb_NO", "nc", "ne", "nf", "ng", "ni", "nl", "nl_BE", "nl_NL", "no", "no_NO", "no_NO_NY", "np", "nr", "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pl_PL", "pm", "pn", "pr", "ps", "pt", "pt_BR", "pt_PT", "pw", "py", "qa", "re", "ro", "ro_RO", "rs", "ru", "ru_RU", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sk_SK", "sl", "sl_SI", "sm", "sn", "so", "sq", "sq_AL", "sr", "sr_BA", "sr_CS", "sr_ME", "sr_RS", "ss", "st", "sv", "sv_SE", "sx", "sy", "sz", "tc", "td", "tf", "tg", "th", "th_TH", "th_TH_TH", "tj", "tk", "tl", "tm", "tn", "to", "tr", "tr_TR", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "uk_UA", "um", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vi_VN", "vn", "vu", "wf", "ws", "ye", "yt", "za", "zh", "zh_CN", "zh_HK", "zh_SG", "zh_TW", "zm", "zw" )
{
add_url_to_download( $url . $_ . "/i18n/Translation-" . $lang );
add_url_to_download( $url . $_ . "/i18n/Translation-" . $lang . ".gz" );
add_url_to_download( $url . $_ . "/i18n/Translation-" . $lang . ".bz2" );
}
add_url_to_download( $url . $_ . "/i18n/Index" );
add_url_to_download( $url . $_ . "/i18n/Index" );
}
}
else
@ -445,7 +439,162 @@ foreach ( keys %urls_to_download )
}
######################################################################################
## Main download prepair
## Translation index download
%urls_to_download = ();
sub sanitise_uri
{
my $uri = shift;
$uri =~ s[^(\w+)://][];
$uri =~ s/^([^@]+)?@?// if $uri =~ /@/;
$uri =~ s&:\d+/&/&; # and port information
$uri =~ s/~/\%7E/g if get_variable("_tilde");
return $uri;
}
sub find_translation_files_in_release
{
# Look in the dists/$DIST/Release file for the translation files that belong
# to the given component.
my $dist_uri = shift;
my $component = shift;
my ( $release_uri, $release_path, $line ) = '';
$release_uri = $dist_uri . "Release";
$release_path = get_variable("mirror_path") . "/" . sanitise_uri($release_uri);
unless ( open STREAM, "<$release_path" )
{
warn( "Failed to open Release file from " . $release_uri );
return;
}
my $checksums = 0;
while ( $line = <STREAM> )
{
chomp $line;
if ($checksums)
{
if ( $line =~ /^ +(.*)$/ )
{
my @parts = split( / +/, $1 );
if ( @parts == 3 )
{
my ( $sha1, $size, $filename ) = @parts;
if ( $filename =~ m{^$component/i18n/Translation-[^./]*\.bz2$} )
{
add_url_to_download( $dist_uri . $filename, $size );
}
}
else
{
warn("Malformed checksum line \"$1\" in $release_uri");
}
}
else
{
$checksums = 0;
}
}
if ( not $checksums )
{
if ( $line eq "SHA256:" )
{
$checksums = 1;
}
}
}
}
sub process_translation_index
{
# Extract all translation files from the dists/$DIST/$COMPONENT/i18n/Index
# file. Fall back to parsing dists/$DIST/Release if i18n/Index is not found.
my $dist_uri = remove_double_slashes(shift);
my $component = shift;
my ( $base_uri, $index_uri, $index_path, $line ) = '';
$base_uri = $dist_uri . $component . "/i18n/";
$index_uri = $base_uri . "Index";
$index_path = get_variable("mirror_path") . "/" . sanitise_uri($index_uri);
unless ( open STREAM, "<$index_path" )
{
find_translation_files_in_release( $dist_uri, $component );
return;
}
my $checksums = 0;
while ( $line = <STREAM> )
{
chomp $line;
if ($checksums)
{
if ( $line =~ /^ +(.*)$/ )
{
my @parts = split( / +/, $1 );
if ( @parts == 3 )
{
my ( $sha1, $size, $filename ) = @parts;
add_url_to_download( $base_uri . $filename, $size );
}
else
{
warn("Malformed checksum line \"$1\" in $index_uri");
}
}
else
{
$checksums = 0;
}
}
if ( not $checksums )
{
if ( $line eq "SHA256:" or $line eq "SHA1:" or $line eq "MD5Sum:" )
{
$checksums = 1;
}
}
}
close STREAM;
}
print "Processing tranlation indexes: [";
foreach (@config_binaries)
{
my ( $arch, $uri, $distribution, @components ) = @{$_};
print "T";
if (@components)
{
$url = $uri . "/dists/" . $distribution . "/";
my $component;
foreach $component (@components)
{
process_translation_index( $url, $component );
}
}
}
print "]\n\n";
push( @index_urls, sort keys %urls_to_download );
download_urls( "translation", sort keys %urls_to_download );
foreach ( keys %urls_to_download )
{
s[^(\w+)://][];
s[~][%7E]g if get_variable("_tilde");
$skipclean{$_} = 1;
}
######################################################################################
## Main download preparations
%urls_to_download = ();
@ -493,17 +642,7 @@ sub remove_spaces($)
}
}
sub sanitise_uri
{
my $uri = shift;
$uri =~ s[^(\w+)://][];
$uri =~ s/^([^@]+)?@?// if $uri =~ /@/;
$uri =~ s&:\d+/&/&; # and port information
$uri =~ s/~/\%7E/g if get_variable("_tilde");
return $uri;
}
sub proceed_index_gz
sub process_index_gz
{
my $uri = shift;
my $index = shift;
@ -518,7 +657,11 @@ sub proceed_index_gz
system("gunzip < $path/$index.gz > $path/$index");
}
open STREAM, "<$path/$index" or warn("apt-mirror: can't open index in proceed_index_gz");
unless ( open STREAM, "<$path/$index" )
{
warn("apt-mirror: can't open index in process_index_gz");
return;
}
while ( $package = <STREAM> )
{
@ -563,7 +706,7 @@ sub proceed_index_gz
close STREAM;
}
print "Proceed indexes: [";
print "Processing indexes: [";
foreach (@config_sources)
{
@ -574,12 +717,12 @@ foreach (@config_sources)
my $component;
foreach $component (@components)
{
proceed_index_gz( $uri, "/dists/$distribution/$component/source/Sources.gz" );
process_index_gz( $uri, "/dists/$distribution/$component/source/Sources.gz" );
}
}
else
{
proceed_index_gz( $uri, "/$distribution/Sources.gz" );
process_index_gz( $uri, "/$distribution/Sources.gz" );
}
}
@ -592,12 +735,12 @@ foreach (@config_binaries)
my $component;
foreach $component (@components)
{
proceed_index_gz( $uri, "/dists/$distribution/$component/binary-$arch/Packages.gz" );
process_index_gz( $uri, "/dists/$distribution/$component/binary-$arch/Packages.gz" );
}
}
else
{
proceed_index_gz( $uri, "/$distribution/Packages.gz" );
process_index_gz( $uri, "/$distribution/Packages.gz" );
}
}
@ -635,6 +778,10 @@ sub copy_file
my $dir = dirname($to);
return unless -f $from;
mkpath($dir) unless -d $dir;
if ( get_variable("unlink") == 1 )
{
if ( compare( $from, $to ) != 0 ) { unlink($to); }
}
unless ( copy( $from, $to ) )
{
warn("apt-mirror: can't copy $from to $to");
@ -722,9 +869,10 @@ else
print "$size_output in $total files and " . scalar(@rm_dirs) . " directories can be freed.\n";
print "Run " . get_variable("cleanscript") . " for this purpose.\n\n";
print CLEAN "#!/bin/sh\n\n";
print CLEAN "cd " . get_variable("mirror_path") . " || exit 1\n\n";
print CLEAN "echo 'Removing $total unnecessary files [$unnecessary_bytes bytes]...'\n";
print CLEAN "#!/bin/sh\n";
print CLEAN "set -e\n\n";
print CLEAN "cd " . get_variable("mirror_path") . "\n\n";
print CLEAN "echo 'Removing $total unnecessary files [$size_output]...'\n";
foreach (@rm_files)
{
print CLEAN "rm -f '$_'\n";
@ -740,7 +888,7 @@ else
print CLEAN "echo 'Removing $total unnecessary directories...'\n";
foreach (@rm_dirs)
{
print CLEAN "rmdir '$_'\n";
print CLEAN "if test -d '$_'; then rmdir '$_'; fi\n";
print CLEAN "echo -n '[" . int( 100 * $i / $total ) . "\%]'\n" unless $i % 50;
print CLEAN "echo -n .\n";
$i++;
@ -752,6 +900,10 @@ else
}
# Make clean script executable
my $perm = ( stat get_variable("cleanscript") )[2] & 07777;
chmod( $perm | 0111, get_variable("cleanscript") );
if ( get_variable("run_postmirror") )
{
print "Running the Post Mirror script ...\n";

@ -1,26 +0,0 @@
#!/bin/sh
BASE_PATH="/var/spool/apt-mirror"
echo "Installing apt-mirror command ...";
sudo cp apt-mirror /usr/local/bin/;
sudo chmod +x /usr/local/bin/apt-mirror;
echo "Installing apt-mirror configuration ...";
sudo mkdir -p /etc/apt/;
sudo cp mirror.list /etc/apt/;
echo "Installing apt-mirror manual ...";
sudo mkdir -p /usr/share/man/man1/
sudo pod2man apt-mirror > apt-mirror.1;
sudo mv apt-mirror.1 /usr/share/man/man1/;
echo "Creating base mirror structure ...";
sudo mkdir -p ${BASE_PATH}
sudo mkdir -p ${BASE_PATH}/mirror
sudo mkdir -p ${BASE_PATH}/skel
sudo mkdir -p ${BASE_PATH}/var
echo "Installing postmirror script example ...";
sudo cp postmirror.sh ${BASE_PATH}/var/

@ -1,13 +1,13 @@
#!/bin/sh -e
## anything in this file gets run AFTER the mirror has been run
## put your custom post mirror operations in here ( like rsyncing the installer files and running clean.sh automaticly )
## Anything in this file gets run AFTER the mirror has been run.
## Put your custom post mirror operations in here (like rsyncing the installer
## files and running clean.sh automatically)!
## Example of grabbing the extra translations and installer files from ubuntu ( note rsync needs to be installed
## and in the path for this example to work correctly )
## Example of grabbing the extra installer files from Ubuntu (Note: rsync needs
## to be installed and in the path for this example to work correctly)
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/lucid/main/debian-installer /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/lucid/main/
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/lucid/main/dist-upgrader-all/ /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/lucid/main/
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/lucid/main/i18n/ /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/lucid/main/
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/lucid/main/installer-amd64/ /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/lucid/main/
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/lucid/main/installer-i386/ /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/lucid/main/
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/trusty/main/debian-installer /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/trusty/main/
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/trusty/main/dist-upgrader-all/ /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/trusty/main/
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/trusty/main/installer-amd64/ /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/trusty/main/
#rsync --recursive --times --links --hard-links --delete --delete-after rsync://mirror.anl.gov/ubuntu/dists/trusty/main/installer-i386/ /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu/dists/trusty/main/

Loading…
Cancel
Save