add --extract-hook

This commit is contained in:
Johannes 'josch' Schauer 2020-03-22 14:08:21 +01:00
parent 446d66ea06
commit 02ed5e33f8
Signed by untrusted user: josch
GPG key ID: F2CBA5C78FBD83E1
2 changed files with 24 additions and 7 deletions

View file

@ -2581,21 +2581,28 @@ cat << END > shared/test.sh
set -eu set -eu
export LC_ALL=C.UTF-8 export LC_ALL=C.UTF-8
pkgs=base-files,base-passwd,busybox,debianutils,dpkg,libc-bin,mawk,tar pkgs=base-files,base-passwd,busybox,debianutils,dpkg,libc-bin,mawk,tar
# busybox --install -s will install symbolic links into the rootfs, leaving
# existing files untouched. It has to run after extraction (otherwise there is
# no busybox binary) and before first configuration
$CMD --mode=root --variant=custom \ $CMD --mode=root --variant=custom \
--include=\$pkgs \ --include=\$pkgs \
--setup-hook='mkdir -p "\$1/bin"' \ --setup-hook='mkdir -p "\$1/bin"' \
--setup-hook='for p in awk cat chmod chown cp diff echo env grep less ln mkdir mount rm rmdir sed sh sleep sort touch uname; do ln -s busybox "\$1/bin/\$p"; done' \
--setup-hook='echo root:x:0:0:root:/root:/bin/sh > "\$1/etc/passwd"' \ --setup-hook='echo root:x:0:0:root:/root:/bin/sh > "\$1/etc/passwd"' \
--setup-hook='printf "root:x:0:\nmail:x:8:\nutmp:x:43:\n" > "\$1/etc/group"' \ --setup-hook='printf "root:x:0:\nmail:x:8:\nutmp:x:43:\n" > "\$1/etc/group"' \
--extract-hook='chroot "\$1" busybox --install -s' \
$DEFAULT_DIST /tmp/debian-chroot $mirror $DEFAULT_DIST /tmp/debian-chroot $mirror
echo "\$pkgs" | tr ',' '\n' > /tmp/expected echo "\$pkgs" | tr ',' '\n' > /tmp/expected
chroot /tmp/debian-chroot dpkg-query -f '\${binary:Package}\n' -W \ chroot /tmp/debian-chroot dpkg-query -f '\${binary:Package}\n' -W \
| comm -12 - /tmp/expected \ | comm -12 - /tmp/expected \
| diff -u - /tmp/expected | diff -u - /tmp/expected
rm /tmp/expected rm /tmp/expected
for cmd in echo cat sort sed grep; do for cmd in echo cat sed grep; do
test -L /tmp/debian-chroot/bin/\$cmd test -L /tmp/debian-chroot/bin/\$cmd
test "\$(readlink /tmp/debian-chroot/bin/\$cmd)" = "busybox" test "\$(readlink /tmp/debian-chroot/bin/\$cmd)" = "/bin/busybox"
done
for cmd in sort; do
test -L /tmp/debian-chroot/usr/bin/\$cmd
test "\$(readlink /tmp/debian-chroot/usr/bin/\$cmd)" = "/bin/busybox"
done done
chroot /tmp/debian-chroot echo foobar \ chroot /tmp/debian-chroot echo foobar \
| chroot /tmp/debian-chroot cat \ | chroot /tmp/debian-chroot cat \

View file

@ -1868,6 +1868,8 @@ sub setup {
print_progress "done"; print_progress "done";
} }
run_hooks('extract', $options);
if ($options->{mode} eq 'chrootless') { if ($options->{mode} eq 'chrootless') {
if ($options->{dryrun}) { if ($options->{dryrun}) {
info "simulate installing packages..."; info "simulate installing packages...";
@ -2481,7 +2483,7 @@ sub hookhelper {
# owned by the root user. # owned by the root user.
push @tarcmd, '--owner=0', '--group=0'; push @tarcmd, '--owner=0', '--group=0';
} }
} elsif (any { $_ eq $hook } ('essential', 'customize')) { } elsif (any { $_ eq $hook } ('extract', 'essential', 'customize')) {
if ($mode eq 'fakechroot') { if ($mode eq 'fakechroot') {
# Fakechroot requires tar to run inside the chroot or # Fakechroot requires tar to run inside the chroot or
# otherwise absolute symlinks will include the path to the # otherwise absolute symlinks will include the path to the
@ -2517,7 +2519,10 @@ sub hookhelper {
my $directory; my $directory;
if ($hook eq 'setup') { if ($hook eq 'setup') {
$directory = "$root/$outpath"; $directory = "$root/$outpath";
} elsif (any { $_ eq $hook } ('essential', 'customize')) { } elsif (
any { $_ eq $hook }
('extract', 'essential', 'customize')
) {
$directory = $outpath; $directory = $outpath;
} else { } else {
error "unknown hook: $hook"; error "unknown hook: $hook";
@ -2636,7 +2641,10 @@ sub hookhelper {
my $directory; my $directory;
if ($hook eq 'setup') { if ($hook eq 'setup') {
$directory = "$root/$ARGV[$i]"; $directory = "$root/$ARGV[$i]";
} elsif (any { $_ eq $hook } ('essential', 'customize')) { } elsif (
any { $_ eq $hook }
('extract', 'essential', 'customize')
) {
$directory = $ARGV[$i]; $directory = $ARGV[$i];
} else { } else {
error "unknown hook: $hook"; error "unknown hook: $hook";
@ -2818,6 +2826,7 @@ sub main() {
apttrustedparts => $apttrustedparts, apttrustedparts => $apttrustedparts,
noop => [], noop => [],
setup_hook => [], setup_hook => [],
extract_hook => [],
essential_hook => [], essential_hook => [],
customize_hook => [], customize_hook => [],
dryrun => 0, dryrun => 0,
@ -2872,6 +2881,7 @@ sub main() {
sub { push @{ $options->{noop} }, 'force-check-gpg'; }, sub { push @{ $options->{noop} }, 'force-check-gpg'; },
# hook options are hidden until I'm happy with them # hook options are hidden until I'm happy with them
'setup-hook=s@' => \$options->{setup_hook}, 'setup-hook=s@' => \$options->{setup_hook},
'extract-hook=s@' => \$options->{extract_hook},
'essential-hook=s@' => \$options->{essential_hook}, 'essential-hook=s@' => \$options->{essential_hook},
'customize-hook=s@' => \$options->{customize_hook}, 'customize-hook=s@' => \$options->{customize_hook},
# Sometimes --simulate fails even though non-simulate succeeds because # Sometimes --simulate fails even though non-simulate succeeds because
@ -2897,7 +2907,7 @@ sub main() {
} }
if ($options->{dryrun}) { if ($options->{dryrun}) {
foreach my $hook ('setup', 'essential', 'customize') { foreach my $hook ('setup', 'extract', 'essential', 'customize') {
if (scalar @{ $options->{"${hook}_hook"} } > 0) { if (scalar @{ $options->{"${hook}_hook"} } > 0) {
warning "In dry-run mode, --$hook-hook options have no effect"; warning "In dry-run mode, --$hook-hook options have no effect";
} }