From 4d75cb8b89aaf6a7285dc9d600a6fd64e603c333 Mon Sep 17 00:00:00 2001 From: Johannes 'josch' Schauer Date: Sun, 23 Sep 2018 19:43:14 +0200 Subject: [PATCH] Write certain apt options to a common config file inside the chroot so that apt inside and outside adhere to it while its settings can still be overwritten --- mmdebstrap | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/mmdebstrap b/mmdebstrap index 6344011..b19b35d 100755 --- a/mmdebstrap +++ b/mmdebstrap @@ -409,13 +409,11 @@ sub setup { print $conf "Dir::Etc \"$options->{root}/etc/apt\";\n"; print $conf "Dir::State \"$options->{root}/var/lib/apt\";\n"; print $conf "Dir::Cache \"$options->{root}/var/cache/apt\";\n"; - print $conf "Apt::Install-Recommends false;\n"; # for retrieving the essential packages set, only download print $conf "Apt::Get::Download-Only true;\n"; # for authentication, use the keyrings from the host print $conf "Dir::Etc::Trusted \"/etc/apt/trusted.gpg\";\n"; print $conf "Dir::Etc::TrustedParts \"/etc/apt/trusted.gpg.d\";\n"; - print $conf "Acquire::Languages \"none\";\n"; close $conf; foreach my $dir ('/etc/apt/apt.conf.d', '/etc/apt/sources.list.d', @@ -425,6 +423,18 @@ sub setup { make_path("$options->{root}/$dir") or die "failed to create $dir: $!"; } + # We put certain configuration items in their own configuration file + # because they have to be valid for apt invocation from outside as well as + # from inside the chroot. + # The config filename is chosen such that any settings in it will be + # overridden by what the user specified with --aptopt. + { + open my $fh, '>', "$options->{root}/etc/apt/apt.conf.d/00mmdebstrap" or die "cannot open /etc/apt/apt.conf.d/00mmdebstrap: $!"; + print $fh "Apt::Install-Recommends false;\n"; + print $fh "Acquire::Languages \"none\";\n"; + close $fh; + } + { open my $fh, '>', "$options->{root}/var/lib/dpkg/status" or die "failed to open(): $!"; close $fh; @@ -440,7 +450,7 @@ sub setup { } if (scalar @{$options->{aptopts}} > 0) { - open my $fh, '>', "$options->{root}/etc/apt/apt.conf.d/00mmdebstrap" or die "cannot open /etc/apt/apt.conf.d/00mmdebstrap: $!"; + open my $fh, '>', "$options->{root}/etc/apt/apt.conf.d/99mmdebstrap" or die "cannot open /etc/apt/apt.conf.d/99mmdebstrap: $!"; foreach my $opt (@{$options->{aptopts}}) { if (-r $opt) { copy $opt, $fh or die "cannot copy $opt: $!"; @@ -458,7 +468,7 @@ sub setup { } if (scalar @{$options->{dpkgopts}} > 0) { - open my $fh, '>', "$options->{root}/etc/dpkg/dpkg.cfg.d/00mmdebstrap" or die "cannot open /etc/dpkg/dpkg.cfg.d/00mmdebstrap: $!"; + open my $fh, '>', "$options->{root}/etc/dpkg/dpkg.cfg.d/99mmdebstrap" or die "cannot open /etc/dpkg/dpkg.cfg.d/99mmdebstrap: $!"; foreach my $opt (@{$options->{dpkgopts}}) { if (-r $opt) { copy $opt, $fh or die "cannot copy $opt: $!"; @@ -792,8 +802,8 @@ sub setup { # if the path-excluded option was added to the dpkg config, reinstall all # packages - if (-e "$options->{root}/etc/dpkg/dpkg.cfg.d/00mmdebstrap") { - open(my $fh, '<', "$options->{root}/etc/dpkg/dpkg.cfg.d/00mmdebstrap") or die "cannot open /etc/dpkg/dpkg.cfg.d/00mmdebstrap: $!"; + if (-e "$options->{root}/etc/dpkg/dpkg.cfg.d/99mmdebstrap") { + open(my $fh, '<', "$options->{root}/etc/dpkg/dpkg.cfg.d/99mmdebstrap") or die "cannot open /etc/dpkg/dpkg.cfg.d/99mmdebstrap: $!"; my $num_matches = grep /^path-exclude=/, <$fh>; close $fh; if ($num_matches > 0) { @@ -960,6 +970,9 @@ sub setup { } } + # clean up temporary configuration file + unlink "$options->{root}/etc/apt/apt.conf.d/00mmdebstrap" or die "failed to unlink /etc/apt/apt.conf.d/00mmdebstrap: $!"; + # if there is no apt inside the chroot, clean it from the outside if ($options->{variant} eq 'essential') { $ENV{"APT_CONFIG"} = "$tmpfile"; @@ -1489,24 +1502,25 @@ default mode is B. See the section B for more information. =item B<--aptopt> Pass arbitrary options to apt. Will be added to -/etc/apt/apt.conf.d/00mmdebstrap inside the chroot. Can be specified multiple -times. Each option with be appended to 00mmdebstrap. A semicolon will be added +/etc/apt/apt.conf.d/99mmdebstrap inside the chroot. Can be specified multiple +times. Each option with be appended to 99mmdebstrap. A semicolon will be added at the end of the option if necessary. If the command line argument is an -existing file, the content of the file will be appended to 00mmdebstrap +existing file, the content of the file will be appended to 99mmdebstrap verbatim. Examples: --aptopt="Acquire::Check-Valid-Until false" + --aptopt="Acquire::Languages { \"environment\"; \"en\"; }" --aptopt="Apt::Install-Recommends true" =item B<--dpkgopt> Pass arbitrary options to dpkg. Will be added to -/etc/dpkg/dpkg.cfg.d/00mmdebstrap inside the chroot. Can be specified multiple -times. Each option will be appended to 00mmdebstrap. If the command line +/etc/dpkg/dpkg.cfg.d/99mmdebstrap inside the chroot. Can be specified multiple +times. Each option will be appended to 99mmdebstrap. If the command line argument is an existing file, the content of the file will be appended to -00mmdebstrap verbatim. +99mmdebstrap verbatim. Example: --dpkgopt="path-exclude=/usr/share/man/*"