don't use default mirror if no mirror was specified but data was given on standard input
This commit is contained in:
parent
d25e939363
commit
c073d0b446
1 changed files with 79 additions and 45 deletions
124
mmdebstrap
124
mmdebstrap
|
@ -667,38 +667,10 @@ sub setup {
|
||||||
chmod 0644, "$options->{root}/etc/fstab" or die "cannot chmod fstab: $!";
|
chmod 0644, "$options->{root}/etc/fstab" or die "cannot chmod fstab: $!";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# write /etc/apt/sources.list
|
||||||
{
|
{
|
||||||
my $archopt = '';
|
|
||||||
if (scalar @{$options->{foreignarchs}} > 0) {
|
|
||||||
$archopt = " [arch=$options->{nativearch}]";
|
|
||||||
}
|
|
||||||
open my $fh, '>', "$options->{root}/etc/apt/sources.list" or die "cannot open /etc/apt/sources.list: $!";
|
open my $fh, '>', "$options->{root}/etc/apt/sources.list" or die "cannot open /etc/apt/sources.list: $!";
|
||||||
if (scalar(@{$options->{mirrors}}) > 0) {
|
print $fh $options->{sourceslist};
|
||||||
if((grep /^-$/, @{$options->{mirrors}}) > 1 ) {
|
|
||||||
die "can only read from stdin once";
|
|
||||||
}
|
|
||||||
for my $arg (@{$options->{mirrors}}) {
|
|
||||||
if ($arg eq '-') {
|
|
||||||
# read from stdin
|
|
||||||
print STDERR "I: Reading sources.list from standard input...\n";
|
|
||||||
copy *STDIN, $fh or die "cannot copy stdin: $!";
|
|
||||||
} elsif ($arg =~ /^deb(-src)? /) {
|
|
||||||
print $fh "$arg\n";
|
|
||||||
} elsif ($arg =~ /:\/\//) {
|
|
||||||
print $fh "deb$archopt $arg $options->{suite} $options->{components}\n";
|
|
||||||
} elsif (-f $arg) {
|
|
||||||
copy($arg, $fh) or die "cannot copy $arg: $!";
|
|
||||||
} else {
|
|
||||||
die "invalid mirror: $arg";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print $fh "deb$archopt http://deb.debian.org/debian $options->{suite} $options->{components}\n";
|
|
||||||
if (any { $_ eq $options->{suite} } ('stable', 'oldstable', 'stretch') ) {
|
|
||||||
print $fh "deb$archopt http://deb.debian.org/debian $options->{suite}-updates $options->{components}\n";
|
|
||||||
print $fh "deb$archopt http://security.debian.org/debian-security $options->{suite}/updates $options->{components}\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close $fh;
|
close $fh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1308,19 +1280,77 @@ sub main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scalar @ARGV > 0) {
|
{
|
||||||
$options->{suite} = shift @ARGV;
|
my $suite;
|
||||||
if (scalar @ARGV > 0) {
|
if (scalar @ARGV > 0) {
|
||||||
$options->{target} = shift @ARGV;
|
$suite = shift @ARGV;
|
||||||
|
if (scalar @ARGV > 0) {
|
||||||
|
$options->{target} = shift @ARGV;
|
||||||
|
} else {
|
||||||
|
$options->{target} = '-';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
print STDERR "I: No SUITE specified, expecting sources.list on standard input\n";
|
||||||
$options->{target} = '-';
|
$options->{target} = '-';
|
||||||
}
|
}
|
||||||
$options->{mirrors} = [@ARGV];
|
|
||||||
} else {
|
my $sourceslist = '';
|
||||||
print STDERR "I: No SUITE specified, expecting sources.list on standard input\n";
|
my $stdindata = '';
|
||||||
$options->{suite} = 'UNDEFINED';
|
# make sure that we only attempt to read from STDIN if it's *not*
|
||||||
$options->{target} = '-';
|
# connected to the terminal (because we don't expect the user to type
|
||||||
$options->{mirrors} = ['-'];
|
# the sources.list file
|
||||||
|
if (! -t STDIN) {
|
||||||
|
print STDERR "I: Reading sources.list from standard input...\n";
|
||||||
|
$stdindata = do { local $/; <STDIN> };
|
||||||
|
}
|
||||||
|
if (! defined $suite) {
|
||||||
|
# If no suite was specified, then the whole sources.list has to
|
||||||
|
# come from standard input
|
||||||
|
$sourceslist .= $stdindata;
|
||||||
|
} else {
|
||||||
|
my $archopt = '';
|
||||||
|
if (scalar @{$options->{foreignarchs}} > 0) {
|
||||||
|
$archopt = " [arch=$options->{nativearch}]";
|
||||||
|
}
|
||||||
|
if (scalar @ARGV > 0) {
|
||||||
|
for my $arg (@ARGV) {
|
||||||
|
if ($arg eq '-') {
|
||||||
|
$sourceslist .= $stdindata;
|
||||||
|
} elsif ($arg =~ /^deb(-src)? /) {
|
||||||
|
$sourceslist .= "$arg\n";
|
||||||
|
} elsif ($arg =~ /:\/\//) {
|
||||||
|
$sourceslist .= "deb$archopt $arg $suite $options->{components}\n";
|
||||||
|
} elsif (-f $arg) {
|
||||||
|
open my $fh, '<', $arg or die "cannot open $arg: $!";
|
||||||
|
while (my $line = <$fh>) {
|
||||||
|
$sourceslist .= $line;
|
||||||
|
}
|
||||||
|
close $fh;
|
||||||
|
} else {
|
||||||
|
die "invalid mirror: $arg";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# if there was no explicit '-' mirror listed and something was
|
||||||
|
# read on standard input, then just append it to the end
|
||||||
|
if (none { $_ eq '-' } @ARGV) {
|
||||||
|
# if nothing was read on standard input then nothing will
|
||||||
|
# be appended
|
||||||
|
$sourceslist .= $stdindata;
|
||||||
|
}
|
||||||
|
} elsif ($stdindata ne '') {
|
||||||
|
$sourceslist .= $stdindata;
|
||||||
|
} else {
|
||||||
|
$sourceslist .= "deb$archopt http://deb.debian.org/debian $suite $options->{components}\n";
|
||||||
|
if (any { $_ eq $suite } ('stable', 'oldstable', 'stretch') ) {
|
||||||
|
$sourceslist .= "deb$archopt http://deb.debian.org/debian $suite-updates $options->{components}\n";
|
||||||
|
$sourceslist .= "deb$archopt http://security.debian.org/debian-security $suite/updates $options->{components}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($sourceslist eq '') {
|
||||||
|
die "empty apt sources.list";
|
||||||
|
}
|
||||||
|
$options->{sourceslist} = $sourceslist;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($options->{target} ne '-') {
|
if ($options->{target} ne '-') {
|
||||||
|
@ -1656,7 +1686,9 @@ section B<DEBOOTSTRAP>). In contrast to debootstrap it uses apt to resolve
|
||||||
dependencies and is thus able to use more than one mirror and resolve more
|
dependencies and is thus able to use more than one mirror and resolve more
|
||||||
complex dependencies.
|
complex dependencies.
|
||||||
|
|
||||||
If no I<MIRROR> option is provided, http://deb.debian.org/debian is used. If
|
If no I<MIRROR> option is provided, http://deb.debian.org/debian is used,
|
||||||
|
except if data was given on standard input in which case the lines read from
|
||||||
|
there are used as the content of the chroot's sources.list file. If
|
||||||
I<SUITE> is a stable release name, then mirrors for updates and security are
|
I<SUITE> is a stable release name, then mirrors for updates and security are
|
||||||
automatically added. If a I<MIRROR> option starts with "deb " or "deb-src "
|
automatically added. If a I<MIRROR> option starts with "deb " or "deb-src "
|
||||||
then it is used as a one-line-style format entry for apt's sources.list inside
|
then it is used as a one-line-style format entry for apt's sources.list inside
|
||||||
|
@ -1665,11 +1697,13 @@ a mirror URI and the apt line inside the chroot is assembled as "deb [arch=A]
|
||||||
B C D" where A is the host's native architecture, B is the I<MIRROR>, C is the
|
B C D" where A is the host's native architecture, B is the I<MIRROR>, C is the
|
||||||
given I<SUITE> and D is the components given via --components (defaults to
|
given I<SUITE> and D is the components given via --components (defaults to
|
||||||
"main"). If a I<MIRROR> option happens to be an existing file, then its
|
"main"). If a I<MIRROR> option happens to be an existing file, then its
|
||||||
contents are pasted into the chroot's sources.list. This can be used to supply
|
contents are pasted into the chroot's sources.list. This can be used to
|
||||||
a deb822 style sources.list. If I<MIRROR> is C<-> then standard input is
|
supply a deb822 style sources.list. If I<MIRROR> is C<-> then standard input
|
||||||
pasted into the chroot's sources.list. More than one mirror can be specified
|
is pasted into the chroot's sources.list. If there was data on standard input
|
||||||
and are appended to the chroot's sources.list in the given order. If any
|
but no C<-> mirror was listed, the lines read from standard input will be
|
||||||
mirror contains a https URI, then the packages apt-transport-https and
|
appended to the end of the chroot's sources.list. More than one mirror can be
|
||||||
|
specified and are appended to the chroot's sources.list in the given order. If
|
||||||
|
any mirror contains a https URI, then the packages apt-transport-https and
|
||||||
ca-certificates will be installed inside the chroot.
|
ca-certificates will be installed inside the chroot.
|
||||||
|
|
||||||
The I<TARGET> argument can either be a directory or a tarball filename. If
|
The I<TARGET> argument can either be a directory or a tarball filename. If
|
||||||
|
|
Loading…
Reference in a new issue