Compare commits
3 commits
395ee60a7f
...
5055b1b44c
Author | SHA1 | Date | |
---|---|---|---|
5055b1b44c | |||
c82fc7e261 | |||
eca6cb314c |
108 changed files with 1950 additions and 1821 deletions
19
coverage.py
19
coverage.py
|
@ -362,6 +362,21 @@ def main():
|
||||||
check=False,
|
check=False,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
).stdout.decode()
|
).stdout.decode()
|
||||||
|
shfmt = subprocess.run(
|
||||||
|
[
|
||||||
|
"shfmt",
|
||||||
|
"--posix",
|
||||||
|
"--binary-next-line",
|
||||||
|
"--case-indent",
|
||||||
|
"--indent",
|
||||||
|
"2",
|
||||||
|
"--simplify",
|
||||||
|
"-d",
|
||||||
|
"shared/test.sh",
|
||||||
|
],
|
||||||
|
check=False,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
).stdout.decode()
|
||||||
argv = None
|
argv = None
|
||||||
match test:
|
match test:
|
||||||
case "qemu":
|
case "qemu":
|
||||||
|
@ -411,9 +426,11 @@ def main():
|
||||||
acc_time_per_test[name].append(walltime)
|
acc_time_per_test[name].append(walltime)
|
||||||
print(separator, file=sys.stderr)
|
print(separator, file=sys.stderr)
|
||||||
print(f"duration: {walltime}", file=sys.stderr)
|
print(f"duration: {walltime}", file=sys.stderr)
|
||||||
if proc.returncode != 0 or shellcheck != "":
|
if proc.returncode != 0 or shellcheck != "" or shfmt != "":
|
||||||
if shellcheck != "":
|
if shellcheck != "":
|
||||||
print(shellcheck)
|
print(shellcheck)
|
||||||
|
if shfmt != "":
|
||||||
|
print(shfmt)
|
||||||
failed.append(formated_test_name)
|
failed.append(formated_test_name)
|
||||||
print("result: FAILURE", file=sys.stderr)
|
print("result: FAILURE", file=sys.stderr)
|
||||||
else:
|
else:
|
||||||
|
|
15
coverage.sh
15
coverage.sh
|
@ -7,14 +7,15 @@ set -eu
|
||||||
: "${CMD:=perl -MDevel::Cover=-silent,-nogcov ./mmdebstrap}"
|
: "${CMD:=perl -MDevel::Cover=-silent,-nogcov ./mmdebstrap}"
|
||||||
|
|
||||||
case "$CMD" in
|
case "$CMD" in
|
||||||
"mmdebstrap "*|mmdebstrap|*" mmdebstrap"|*" mmdebstrap "*)
|
"mmdebstrap "* | mmdebstrap | *" mmdebstrap" | *" mmdebstrap "*)
|
||||||
MMSCRIPT="$(command -v mmdebstrap 2>/dev/null)";;
|
MMSCRIPT="$(command -v mmdebstrap 2>/dev/null)"
|
||||||
*) MMSCRIPT=./mmdebstrap;;
|
;;
|
||||||
|
*) MMSCRIPT=./mmdebstrap ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ -e "$MMSCRIPT" ]; then
|
if [ -e "$MMSCRIPT" ]; then
|
||||||
TMPFILE=$(mktemp)
|
TMPFILE=$(mktemp)
|
||||||
perltidy < "$MMSCRIPT" > "$TMPFILE"
|
perltidy <"$MMSCRIPT" >"$TMPFILE"
|
||||||
ret=0
|
ret=0
|
||||||
diff -u "$MMSCRIPT" "$TMPFILE" || ret=$?
|
diff -u "$MMSCRIPT" "$TMPFILE" || ret=$?
|
||||||
if [ "$ret" -ne 0 ]; then
|
if [ "$ret" -ne 0 ]; then
|
||||||
|
@ -41,6 +42,8 @@ done
|
||||||
|
|
||||||
shellcheck --exclude=SC2016 coverage.sh make_mirror.sh run_null.sh run_qemu.sh gpgvnoexpkeysig mmdebstrap-autopkgtest-build-qemu hooks/*/*.sh
|
shellcheck --exclude=SC2016 coverage.sh make_mirror.sh run_null.sh run_qemu.sh gpgvnoexpkeysig mmdebstrap-autopkgtest-build-qemu hooks/*/*.sh
|
||||||
|
|
||||||
|
shfmt --binary-next-line --case-indent --indent 2 --simplify -d coverage.sh make_mirror.sh run_null.sh run_qemu.sh mmdebstrap-autopkgtest-build-qemu gpgvnoexpkeysig
|
||||||
|
|
||||||
mirrordir="./shared/cache/debian"
|
mirrordir="./shared/cache/debian"
|
||||||
|
|
||||||
if [ ! -e "$mirrordir" ]; then
|
if [ ! -e "$mirrordir" ]; then
|
||||||
|
@ -85,7 +88,7 @@ if [ -e shared/cover_db.img ]; then
|
||||||
# produce report inside the VM to make sure that the versions match or
|
# produce report inside the VM to make sure that the versions match or
|
||||||
# otherwise we might get:
|
# otherwise we might get:
|
||||||
# Can't read shared/cover_db/runs/1598213854.252.64287/cover.14 with Sereal: Sereal: Error: Bad Sereal header: Not a valid Sereal document. at offset 1 of input at srl_decoder.c line 600 at /usr/lib/x86_64-linux-gnu/perl5/5.30/Devel/Cover/DB/IO/Sereal.pm line 34, <$fh> chunk 1.
|
# Can't read shared/cover_db/runs/1598213854.252.64287/cover.14 with Sereal: Sereal: Error: Bad Sereal header: Not a valid Sereal document. at offset 1 of input at srl_decoder.c line 600 at /usr/lib/x86_64-linux-gnu/perl5/5.30/Devel/Cover/DB/IO/Sereal.pm line 34, <$fh> chunk 1.
|
||||||
cat << END > shared/test.sh
|
cat <<END >shared/test.sh
|
||||||
cover -nogcov -report html_basic cover_db >&2
|
cover -nogcov -report html_basic cover_db >&2
|
||||||
mkdir -p report
|
mkdir -p report
|
||||||
for f in common.js coverage.html cover.css css.js mmdebstrap--branch.html mmdebstrap--condition.html mmdebstrap.html mmdebstrap--subroutine.html standardista-table-sorting.js; do
|
for f in common.js coverage.html cover.css css.js mmdebstrap--branch.html mmdebstrap--condition.html mmdebstrap.html mmdebstrap--subroutine.html standardista-table-sorting.js; do
|
||||||
|
@ -105,7 +108,7 @@ END
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# check if the wiki has to be updated with pod2markdown output
|
# check if the wiki has to be updated with pod2markdown output
|
||||||
if [ "${DEBEMAIL:-}" = "josch@debian.org" ]; then
|
if [ "${DEBEMAIL-}" = "josch@debian.org" ]; then
|
||||||
bash -exc "diff -u <(curl --silent https://gitlab.mister-muffin.de/josch/mmdebstrap/wiki/raw/Home | dos2unix; echo) <(pod2markdown < mmdebstrap)" || :
|
bash -exc "diff -u <(curl --silent https://gitlab.mister-muffin.de/josch/mmdebstrap/wiki/raw/Home | dos2unix; echo) <(pod2markdown < mmdebstrap)" || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ find_gpgv_status_fd() {
|
||||||
GPGSTATUSFD="$(find_gpgv_status_fd "$@")"
|
GPGSTATUSFD="$(find_gpgv_status_fd "$@")"
|
||||||
|
|
||||||
case $GPGSTATUSFD in
|
case $GPGSTATUSFD in
|
||||||
''|*[!0-9]*)
|
'' | *[!0-9]*)
|
||||||
echo "invalid --status-fd argument" >&2
|
echo "invalid --status-fd argument" >&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -11,7 +11,7 @@ set -eu
|
||||||
|
|
||||||
deletecache() {
|
deletecache() {
|
||||||
dir="$1"
|
dir="$1"
|
||||||
echo "running deletecache $dir">&2
|
echo "running deletecache $dir" >&2
|
||||||
if [ ! -e "$dir" ]; then
|
if [ ! -e "$dir" ]; then
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
@ -48,7 +48,7 @@ deletecache() {
|
||||||
else
|
else
|
||||||
echo "does not exist: $dir/debian/dists/$dist" >&2
|
echo "does not exist: $dir/debian/dists/$dist" >&2
|
||||||
fi
|
fi
|
||||||
case "$dist" in oldstable|stable)
|
case "$dist" in oldstable | stable)
|
||||||
if [ -e "$dir/debian/dists/$dist-updates" ]; then
|
if [ -e "$dir/debian/dists/$dist-updates" ]; then
|
||||||
rm --one-file-system --recursive "$dir/debian/dists/$dist-updates"
|
rm --one-file-system --recursive "$dir/debian/dists/$dist-updates"
|
||||||
else
|
else
|
||||||
|
@ -56,7 +56,7 @@ deletecache() {
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
case "$dist" in oldstable|stable)
|
case "$dist" in oldstable | stable)
|
||||||
if [ -e "$dir/debian-security/dists/$dist-security" ]; then
|
if [ -e "$dir/debian-security/dists/$dist-security" ]; then
|
||||||
rm --one-file-system --recursive "$dir/debian-security/dists/$dist-security"
|
rm --one-file-system --recursive "$dir/debian-security/dists/$dist-security"
|
||||||
else
|
else
|
||||||
|
@ -161,9 +161,9 @@ update_cache() (
|
||||||
done
|
done
|
||||||
|
|
||||||
# read sources.list content from stdin
|
# read sources.list content from stdin
|
||||||
cat > "$rootdir/etc/apt/sources.list"
|
cat >"$rootdir/etc/apt/sources.list"
|
||||||
|
|
||||||
cat << END > "$rootdir/etc/apt/apt.conf"
|
cat <<END >"$rootdir/etc/apt/apt.conf"
|
||||||
Apt::Architecture "$nativearch";
|
Apt::Architecture "$nativearch";
|
||||||
Apt::Architectures "$nativearch";
|
Apt::Architectures "$nativearch";
|
||||||
Dir::Etc "$rootdir/etc/apt";
|
Dir::Etc "$rootdir/etc/apt";
|
||||||
|
@ -177,14 +177,14 @@ Dir::Etc::TrustedParts "/etc/apt/trusted.gpg.d";
|
||||||
Acquire::http::Proxy "http://127.0.0.1:8080/";
|
Acquire::http::Proxy "http://127.0.0.1:8080/";
|
||||||
END
|
END
|
||||||
|
|
||||||
: > "$rootdir/var/lib/dpkg/status"
|
: >"$rootdir/var/lib/dpkg/status"
|
||||||
|
|
||||||
if [ "$dist" = "$DEFAULT_DIST" ] && [ "$nativearch" = "$HOSTARCH" ] && [ "$USE_HOST_APT_CONFIG" = "yes" ]; then
|
if [ "$dist" = "$DEFAULT_DIST" ] && [ "$nativearch" = "$HOSTARCH" ] && [ "$USE_HOST_APT_CONFIG" = "yes" ]; then
|
||||||
# we append sources and settings instead of overwriting after
|
# we append sources and settings instead of overwriting after
|
||||||
# an empty line
|
# an empty line
|
||||||
for f in /etc/apt/sources.list /etc/apt/sources.list.d/*; do
|
for f in /etc/apt/sources.list /etc/apt/sources.list.d/*; do
|
||||||
[ -e "$f" ] || continue
|
[ -e "$f" ] || continue
|
||||||
[ -e "$rootdir/$f" ] && echo >> "$rootdir/$f"
|
[ -e "$rootdir/$f" ] && echo >>"$rootdir/$f"
|
||||||
# Filter out file:// repositories as they are added
|
# Filter out file:// repositories as they are added
|
||||||
# to each mmdebstrap call verbatim by
|
# to each mmdebstrap call verbatim by
|
||||||
# debian/tests/copy_host_apt_config
|
# debian/tests/copy_host_apt_config
|
||||||
|
@ -195,17 +195,17 @@ END
|
||||||
if [ "$dist" = unstable ]; then
|
if [ "$dist" = unstable ]; then
|
||||||
grep -v ' file://' "$f" \
|
grep -v ' file://' "$f" \
|
||||||
| grep -E " (unstable|experimental) " \
|
| grep -E " (unstable|experimental) " \
|
||||||
>> "$rootdir/$f" || :
|
>>"$rootdir/$f" || :
|
||||||
else
|
else
|
||||||
grep -v ' file://' "$f" \
|
grep -v ' file://' "$f" \
|
||||||
| grep " $DEFAULT_DIST " \
|
| grep " $DEFAULT_DIST " \
|
||||||
>> "$rootdir/$f" || :
|
>>"$rootdir/$f" || :
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
for f in /etc/apt/preferences.d/*; do
|
for f in /etc/apt/preferences.d/*; do
|
||||||
[ -e "$f" ] || continue
|
[ -e "$f" ] || continue
|
||||||
[ -e "$rootdir/$f" ] && echo >> "$rootdir/$f"
|
[ -e "$rootdir/$f" ] && echo >>"$rootdir/$f"
|
||||||
cat "$f" >> "$rootdir/$f"
|
cat "$f" >>"$rootdir/$f"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -322,8 +322,14 @@ if [ "$FORCE_UPDATE" != "yes" ] && [ -e "$oldmirrordir/dists/$DEFAULT_DIST/InRel
|
||||||
http_code=$(curl --output /dev/null --silent --location --head --time-cond "$oldmirrordir/dists/$DEFAULT_DIST/InRelease" --write-out '%{http_code}' "$mirror/dists/$DEFAULT_DIST/InRelease")
|
http_code=$(curl --output /dev/null --silent --location --head --time-cond "$oldmirrordir/dists/$DEFAULT_DIST/InRelease" --write-out '%{http_code}' "$mirror/dists/$DEFAULT_DIST/InRelease")
|
||||||
case "$http_code" in
|
case "$http_code" in
|
||||||
200) ;; # need update
|
200) ;; # need update
|
||||||
304) echo up-to-date; exit 0;;
|
304)
|
||||||
*) echo "unexpected status: $http_code"; exit 1;;
|
echo up-to-date
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "unexpected status: $http_code"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -377,8 +383,8 @@ for dist in oldstable stable testing unstable; do
|
||||||
echo "deb [arch=$nativearch] $mirror $dist $components" | update_cache "$dist" "$nativearch"
|
echo "deb [arch=$nativearch] $mirror $dist $components" | update_cache "$dist" "$nativearch"
|
||||||
# we need to include the base mirror again or otherwise
|
# we need to include the base mirror again or otherwise
|
||||||
# packages like build-essential will be missing
|
# packages like build-essential will be missing
|
||||||
case "$dist" in oldstable|stable)
|
case "$dist" in oldstable | stable)
|
||||||
cat << END | update_cache "$dist" "$nativearch"
|
cat <<END | update_cache "$dist" "$nativearch"
|
||||||
deb [arch=$nativearch] $mirror $dist $components
|
deb [arch=$nativearch] $mirror $dist $components
|
||||||
deb [arch=$nativearch] $mirror $dist-updates main
|
deb [arch=$nativearch] $mirror $dist-updates main
|
||||||
deb [arch=$nativearch] $security_mirror $dist-security main
|
deb [arch=$nativearch] $security_mirror $dist-security main
|
||||||
|
@ -386,7 +392,7 @@ END
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
codename=$(awk '/^Codename: / { print $2; }' < "$newmirrordir/dists/$dist/InRelease")
|
codename=$(awk '/^Codename: / { print $2; }' <"$newmirrordir/dists/$dist/InRelease")
|
||||||
ln -s "$dist" "$newmirrordir/dists/$codename"
|
ln -s "$dist" "$newmirrordir/dists/$codename"
|
||||||
|
|
||||||
# split the InRelease file into Release and Release.gpg not because apt
|
# split the InRelease file into Release and Release.gpg not because apt
|
||||||
|
@ -471,7 +477,7 @@ if [ "$HAVE_QEMU" = "yes" ]; then
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat << END > "$tmpdir/mmdebstrap.service"
|
cat <<END >"$tmpdir/mmdebstrap.service"
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=mmdebstrap worker script
|
Description=mmdebstrap worker script
|
||||||
|
|
||||||
|
@ -490,7 +496,7 @@ END
|
||||||
# filesystem that doesn't support ownership information at all and a umask that
|
# filesystem that doesn't support ownership information at all and a umask that
|
||||||
# gives read/write access to everybody.
|
# gives read/write access to everybody.
|
||||||
# https://github.com/pjcj/Devel--Cover/issues/223
|
# https://github.com/pjcj/Devel--Cover/issues/223
|
||||||
cat << 'END' > "$tmpdir/worker.sh"
|
cat <<'END' >"$tmpdir/worker.sh"
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
echo 'root:root' | chpasswd
|
echo 'root:root' | chpasswd
|
||||||
mount -t 9p -o trans=virtio,access=any,msize=128k mmdebstrap /mnt
|
mount -t 9p -o trans=virtio,access=any,msize=128k mmdebstrap /mnt
|
||||||
|
|
|
@ -202,14 +202,14 @@ positional_7() {
|
||||||
|
|
||||||
while test "$#" -gt 0; do
|
while test "$#" -gt 0; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--architecture=*|--arch=*|--boot=*|--keyring=*|--mirror=*|--script=*|--size=*)
|
--architecture=* | --arch=* | --boot=* | --keyring=* | --mirror=* | --script=* | --size=*)
|
||||||
optname="${1%%=*}"
|
optname="${1%%=*}"
|
||||||
"opt_${optname#--}" "${1#*=}"
|
"opt_${optname#--}" "${1#*=}"
|
||||||
;;
|
;;
|
||||||
--apt-proxy=*)
|
--apt-proxy=*)
|
||||||
opt_apt_proxy "${1#*=}"
|
opt_apt_proxy "${1#*=}"
|
||||||
;;
|
;;
|
||||||
--architecture|--arch|--boot|--keyring|--mirror|--script|--size)
|
--architecture | --arch | --boot | --keyring | --mirror | --script | --size)
|
||||||
test "$#" -ge 2 || usage_error "missing argument for $1"
|
test "$#" -ge 2 || usage_error "missing argument for $1"
|
||||||
"opt_${1#--}" "$2"
|
"opt_${1#--}" "$2"
|
||||||
shift
|
shift
|
||||||
|
@ -234,8 +234,8 @@ while test "$#" -gt 0; do
|
||||||
done
|
done
|
||||||
|
|
||||||
test -z "$RELEASE" -o -z "$IMAGE" && usage_error "missing positional arguments"
|
test -z "$RELEASE" -o -z "$IMAGE" && usage_error "missing positional arguments"
|
||||||
test "$BOOT" = efi ||
|
test "$BOOT" = efi \
|
||||||
die "this tool does not support boot modes other than efi"
|
|| die "this tool does not support boot modes other than efi"
|
||||||
|
|
||||||
case "$ARCHITECTURE" in
|
case "$ARCHITECTURE" in
|
||||||
amd64)
|
amd64)
|
||||||
|
@ -289,11 +289,11 @@ case $arches in
|
||||||
*) die "enable $ARCHITECTURE by running: sudo dpkg --add-architecture $ARCHITECTURE && sudo apt update" ;;
|
*) die "enable $ARCHITECTURE by running: sudo dpkg --add-architecture $ARCHITECTURE && sudo apt update" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
test "$(dpkg-query -f '${db:Status-Status}' -W "dpkg-dev")" = installed ||
|
test "$(dpkg-query -f '${db:Status-Status}' -W "dpkg-dev")" = installed \
|
||||||
die "please install dpkg-dev"
|
|| die "please install dpkg-dev"
|
||||||
|
|
||||||
dpkg-checkbuilddeps -d "autopkgtest, dosfstools, e2fsprogs, fdisk, mount, mtools, passwd, uidmap, libarchive13, systemd-boot-efi:$ARCHITECTURE $BINUTILS" /dev/null ||
|
dpkg-checkbuilddeps -d "autopkgtest, dosfstools, e2fsprogs, fdisk, mount, mtools, passwd, uidmap, libarchive13, systemd-boot-efi:$ARCHITECTURE $BINUTILS" /dev/null \
|
||||||
die "please install the required packages listed above"
|
|| die "please install the required packages listed above"
|
||||||
|
|
||||||
BOOTSTUB="/usr/lib/systemd/boot/efi/linux${EFIIMG#boot}.stub"
|
BOOTSTUB="/usr/lib/systemd/boot/efi/linux${EFIIMG#boot}.stub"
|
||||||
|
|
||||||
|
@ -307,8 +307,8 @@ trap cleanup EXIT INT TERM QUIT
|
||||||
|
|
||||||
WORKDIR=$(mktemp -d)
|
WORKDIR=$(mktemp -d)
|
||||||
|
|
||||||
FAT_OFFSET_SECTORS=$((1024*2))
|
FAT_OFFSET_SECTORS=$((1024 * 2))
|
||||||
FAT_SIZE_SECTORS=$((1024*254))
|
FAT_SIZE_SECTORS=$((1024 * 254))
|
||||||
|
|
||||||
# The image is raw and not in qcow2 format because:
|
# The image is raw and not in qcow2 format because:
|
||||||
# - faster run-time as the "qemu-image convert" step is not needed
|
# - faster run-time as the "qemu-image convert" step is not needed
|
||||||
|
@ -326,8 +326,9 @@ set -- \
|
||||||
--variant=important \
|
--variant=important \
|
||||||
--architecture="$ARCHITECTURE"
|
--architecture="$ARCHITECTURE"
|
||||||
|
|
||||||
case $MIRROR in http://snapshot.debian.org/archive/*|https://snapshot.debian.org/archive/*)
|
case $MIRROR in http://snapshot.debian.org/archive/* | https://snapshot.debian.org/archive/*)
|
||||||
set -- "$@" --aptopt='Acquire::Check-Valid-Until "false"';;
|
set -- "$@" --aptopt='Acquire::Check-Valid-Until "false"'
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
EXT_FEATURES=
|
EXT_FEATURES=
|
||||||
|
@ -372,8 +373,8 @@ mmdebstrap "$@" | {
|
||||||
if test -n "$EXT_FEATURES"; then
|
if test -n "$EXT_FEATURES"; then
|
||||||
set -- "$@" -O "$EXT_FEATURES"
|
set -- "$@" -O "$EXT_FEATURES"
|
||||||
fi
|
fi
|
||||||
EXTOPTS="offset=$(( (FAT_OFFSET_SECTORS + FAT_SIZE_SECTORS) * 512))"
|
EXTOPTS="offset=$(((FAT_OFFSET_SECTORS + FAT_SIZE_SECTORS) * 512))"
|
||||||
if test -n "${SOURCE_DATE_EPOCH:-}"; then
|
if test -n "${SOURCE_DATE_EPOCH-}"; then
|
||||||
uuid="$(uuidgen --sha1 --namespace="$(uuidgen --sha1 --namespace='@dns' --name mister-muffin.de)" --name "$SOURCE_DATE_EPOCH")"
|
uuid="$(uuidgen --sha1 --namespace="$(uuidgen --sha1 --namespace='@dns' --name mister-muffin.de)" --name "$SOURCE_DATE_EPOCH")"
|
||||||
set -- "$@" -U "$uuid"
|
set -- "$@" -U "$uuid"
|
||||||
EXTOPTS="$EXTOPTS,hash_seed=$uuid"
|
EXTOPTS="$EXTOPTS,hash_seed=$uuid"
|
||||||
|
@ -383,26 +384,25 @@ mmdebstrap "$@" | {
|
||||||
/sbin/mke2fs "$@"
|
/sbin/mke2fs "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
echo "root=LABEL=autopkgtestvm rw console=ttyS0" >"$WORKDIR/cmdline"
|
||||||
echo "root=LABEL=autopkgtestvm rw console=ttyS0" > "$WORKDIR/cmdline"
|
|
||||||
|
|
||||||
align_size() {
|
align_size() {
|
||||||
echo "$(( ($1) + ($2) - 1 - (($1) + ($2) - 1) % ($2) ))"
|
echo "$((($1) + ($2) - 1 - (($1) + ($2) - 1) % ($2)))"
|
||||||
}
|
}
|
||||||
|
|
||||||
alignment=$("${GNU_PREFIX}objdump" -p "$BOOTSTUB" | sed 's/^SectionAlignment\s\+\([0-9]\)/0x/;t;d')
|
alignment=$("${GNU_PREFIX}objdump" -p "$BOOTSTUB" | sed 's/^SectionAlignment\s\+\([0-9]\)/0x/;t;d')
|
||||||
test -z "$alignment" && die "failed to discover the alignment of the efi stub"
|
test -z "$alignment" && die "failed to discover the alignment of the efi stub"
|
||||||
echo "determined efi vma alignment as $alignment"
|
echo "determined efi vma alignment as $alignment"
|
||||||
test "$RELEASE" = jessie -a "$((alignment))" -lt "$((1024*1024))" && {
|
test "$RELEASE" = jessie -a "$((alignment))" -lt "$((1024 * 1024))" && {
|
||||||
echo "increasing efi vma alignment for jessie"
|
echo "increasing efi vma alignment for jessie"
|
||||||
alignment=$((1024*1024))
|
alignment=$((1024 * 1024))
|
||||||
}
|
}
|
||||||
lastoffset=0
|
lastoffset=0
|
||||||
# shellcheck disable=SC2034 # unused variables serve documentation
|
# shellcheck disable=SC2034 # unused variables serve documentation
|
||||||
lastoffset="$("${GNU_PREFIX}objdump" -h "$BOOTSTUB" |
|
lastoffset="$("${GNU_PREFIX}objdump" -h "$BOOTSTUB" \
|
||||||
while read -r idx name size vma lma fileoff algn behind; do
|
| while read -r idx name size vma lma fileoff algn behind; do
|
||||||
test -z "$behind" -a "${algn#"2**"}" != "$algn" || continue
|
test -z "$behind" -a "${algn#"2**"}" != "$algn" || continue
|
||||||
offset=$(( 0x$vma + 0x$size ))
|
offset=$((0x$vma + 0x$size))
|
||||||
test "$offset" -gt "$lastoffset" || continue
|
test "$offset" -gt "$lastoffset" || continue
|
||||||
lastoffset="$offset"
|
lastoffset="$offset"
|
||||||
echo "$lastoffset"
|
echo "$lastoffset"
|
||||||
|
@ -438,7 +438,7 @@ mcopy -i "$WORKDIR/fat" "$WORKDIR/efiimg" "::EFI/BOOT/$EFIIMG"
|
||||||
|
|
||||||
rm -f "$WORKDIR/efiimg"
|
rm -f "$WORKDIR/efiimg"
|
||||||
|
|
||||||
truncate --size="+$((34*512))" "$IMAGE"
|
truncate --size="+$((34 * 512))" "$IMAGE"
|
||||||
/sbin/sfdisk "$IMAGE" <<EOF
|
/sbin/sfdisk "$IMAGE" <<EOF
|
||||||
label: gpt
|
label: gpt
|
||||||
unit: sectors
|
unit: sectors
|
||||||
|
|
23
run_null.sh
23
run_null.sh
|
@ -26,13 +26,22 @@ done
|
||||||
# - Read fd 3 and let the group exit with that value
|
# - Read fd 3 and let the group exit with that value
|
||||||
# - Redirect fd 4 to stdout
|
# - Redirect fd 4 to stdout
|
||||||
ret=0
|
ret=0
|
||||||
{ { { {
|
{
|
||||||
ret=0;
|
{
|
||||||
( exec 3>&- 4>&-; env --chdir=./shared $SUDO sh -x ./test.sh 2>&1) || ret=$?;
|
{
|
||||||
echo $ret >&3;
|
{
|
||||||
} | tee shared/output.txt >&4;
|
ret=0
|
||||||
} 3>&1;
|
(
|
||||||
} | { read -r xs; exit "$xs"; }
|
exec 3>&- 4>&-
|
||||||
|
env --chdir=./shared $SUDO sh -x ./test.sh 2>&1
|
||||||
|
) || ret=$?
|
||||||
|
echo $ret >&3
|
||||||
|
} | tee shared/output.txt >&4
|
||||||
|
} 3>&1
|
||||||
|
} | {
|
||||||
|
read -r xs
|
||||||
|
exit "$xs"
|
||||||
|
}
|
||||||
} 4>&1 || ret=$?
|
} 4>&1 || ret=$?
|
||||||
if [ "$ret" -ne 0 ]; then
|
if [ "$ret" -ne 0 ]; then
|
||||||
echo "test.sh failed"
|
echo "test.sh failed"
|
||||||
|
|
|
@ -23,7 +23,7 @@ cleanup() {
|
||||||
|
|
||||||
trap cleanup INT TERM EXIT
|
trap cleanup INT TERM EXIT
|
||||||
|
|
||||||
echo 1 > shared/exitstatus.txt
|
echo 1 >shared/exitstatus.txt
|
||||||
if [ -e shared/output.txt ]; then
|
if [ -e shared/output.txt ]; then
|
||||||
rm shared/output.txt
|
rm shared/output.txt
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -6,4 +6,7 @@ trap "rm -f /tmp/debian-chroot.tar" EXIT INT TERM
|
||||||
--include '?narrow(?archive(^{{ DIST }}$),?essential)' \
|
--include '?narrow(?archive(^{{ DIST }}$),?essential)' \
|
||||||
--include apt \
|
--include apt \
|
||||||
{{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
{{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
{ tar -tf /tmp/debian-chroot.tar; echo ./var/lib/apt/extended_states; } | sort | diff -u tar1.txt -
|
{
|
||||||
|
tar -tf /tmp/debian-chroot.tar
|
||||||
|
echo ./var/lib/apt/extended_states
|
||||||
|
} | sort | diff -u tar1.txt -
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/config" EXIT INT TERM
|
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/config" EXIT INT TERM
|
||||||
echo 'Acquire::Languages "none";' > /tmp/config
|
echo 'Acquire::Languages "none";' >/tmp/config
|
||||||
{{ CMD }} --mode=root --variant=apt --aptopt='Acquire::Check-Valid-Until "false"' --aptopt=/tmp/config {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
{{ CMD }} --mode=root --variant=apt --aptopt='Acquire::Check-Valid-Until "false"' --aptopt=/tmp/config {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
||||||
printf 'Acquire::Check-Valid-Until "false";\nAcquire::Languages "none";\n' | cmp /tmp/debian-chroot/etc/apt/apt.conf.d/99mmdebstrap -
|
printf 'Acquire::Check-Valid-Until "false";\nAcquire::Languages "none";\n' | cmp /tmp/debian-chroot/etc/apt/apt.conf.d/99mmdebstrap -
|
||||||
rm /tmp/debian-chroot/etc/apt/apt.conf.d/99mmdebstrap
|
rm /tmp/debian-chroot/etc/apt/apt.conf.d/99mmdebstrap
|
||||||
|
|
|
@ -31,7 +31,7 @@ AUTOPROXY=
|
||||||
eval "$(apt-config shell AUTOPROXY Acquire::http::Proxy-Auto-Detect)"
|
eval "$(apt-config shell AUTOPROXY Acquire::http::Proxy-Auto-Detect)"
|
||||||
if [ -n "$AUTOPROXY" ] && [ -x "$AUTOPROXY" ] && [ -e /tmp/.auto-apt-proxy-0 ]; then
|
if [ -n "$AUTOPROXY" ] && [ -x "$AUTOPROXY" ] && [ -e /tmp/.auto-apt-proxy-0 ]; then
|
||||||
TMP_APT_CONFIG=$(mktemp)
|
TMP_APT_CONFIG=$(mktemp)
|
||||||
echo "Dir \"/dev/null\";" > "$TMP_APT_CONFIG"
|
echo 'Dir "/dev/null";' >"$TMP_APT_CONFIG"
|
||||||
chmod 644 "$TMP_APT_CONFIG"
|
chmod 644 "$TMP_APT_CONFIG"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -90,8 +90,8 @@ for f in shadow shadow-; do
|
||||||
fi
|
fi
|
||||||
if ! cmp /tmp/debian-debootstrap/etc/$f /tmp/debian-mm/etc/$f >&2; then
|
if ! cmp /tmp/debian-debootstrap/etc/$f /tmp/debian-mm/etc/$f >&2; then
|
||||||
echo patching /etc/$f >&2
|
echo patching /etc/$f >&2
|
||||||
awk -v FS=: -v OFS=: -v SDE={{ SOURCE_DATE_EPOCH }} '{ print $1,$2,int(SDE/60/60/24),$4,$5,$6,$7,$8,$9 }' < /tmp/debian-mm/etc/$f > /tmp/debian-mm/etc/$f.bak
|
awk -v FS=: -v OFS=: -v SDE={{ SOURCE_DATE_EPOCH }} '{ print $1,$2,int(SDE/60/60/24),$4,$5,$6,$7,$8,$9 }' </tmp/debian-mm/etc/$f >/tmp/debian-mm/etc/$f.bak
|
||||||
cat /tmp/debian-mm/etc/$f.bak > /tmp/debian-mm/etc/$f
|
cat /tmp/debian-mm/etc/$f.bak >/tmp/debian-mm/etc/$f
|
||||||
rm /tmp/debian-mm/etc/$f.bak
|
rm /tmp/debian-mm/etc/$f.bak
|
||||||
else
|
else
|
||||||
echo no difference for /etc/$f >&2
|
echo no difference for /etc/$f >&2
|
||||||
|
@ -102,7 +102,7 @@ done
|
||||||
# unshared wrapper. The responsible postinst snippet was automatically added
|
# unshared wrapper. The responsible postinst snippet was automatically added
|
||||||
# by dh_apparmor since isc-dhcp-client 4.4.3-P1-1.1
|
# by dh_apparmor since isc-dhcp-client 4.4.3-P1-1.1
|
||||||
if [ -e /tmp/debian-debootstrap/etc/apparmor.d/local/sbin.dhclient ] && [ ! -s /tmp/debian-debootstrap/etc/apparmor.d/local/sbin.dhclient ]; then
|
if [ -e /tmp/debian-debootstrap/etc/apparmor.d/local/sbin.dhclient ] && [ ! -s /tmp/debian-debootstrap/etc/apparmor.d/local/sbin.dhclient ]; then
|
||||||
echo /sbin/setcap > /tmp/debian-debootstrap/etc/apparmor.d/local/sbin.dhclient
|
echo /sbin/setcap >/tmp/debian-debootstrap/etc/apparmor.d/local/sbin.dhclient
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# check if the file content differs
|
# check if the file content differs
|
||||||
|
@ -120,8 +120,8 @@ for d in ./var/lib/apt/lists/partial ./var/cache/apt/archives/partial; do
|
||||||
done
|
done
|
||||||
tar -C /tmp/debian-debootstrap --numeric-owner --xattrs --xattrs-include='*' --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/root1.tar .
|
tar -C /tmp/debian-debootstrap --numeric-owner --xattrs --xattrs-include='*' --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/root1.tar .
|
||||||
tar -C /tmp/debian-mm --numeric-owner --xattrs --xattrs-include='*' --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/root2.tar .
|
tar -C /tmp/debian-mm --numeric-owner --xattrs --xattrs-include='*' --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/root2.tar .
|
||||||
tar --full-time --verbose -tf /tmp/root1.tar > /tmp/root1.tar.list
|
tar --full-time --verbose -tf /tmp/root1.tar >/tmp/root1.tar.list
|
||||||
tar --full-time --verbose -tf /tmp/root2.tar > /tmp/root2.tar.list
|
tar --full-time --verbose -tf /tmp/root2.tar >/tmp/root2.tar.list
|
||||||
# despite SOURCE_DATE_EPOCH and --clamp-mtime, the timestamps in the tarball
|
# despite SOURCE_DATE_EPOCH and --clamp-mtime, the timestamps in the tarball
|
||||||
# will slightly differ from each other in the sub-second precision (last
|
# will slightly differ from each other in the sub-second precision (last
|
||||||
# decimals) so the tarballs will not be identical, so we use diff to compare
|
# decimals) so the tarballs will not be identical, so we use diff to compare
|
||||||
|
|
|
@ -3,9 +3,12 @@ set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm -f /tmp/debian-chroot.tar" EXIT INT TERM
|
trap "rm -f /tmp/debian-chroot.tar" EXIT INT TERM
|
||||||
{{ CMD }} --mode={{ MODE }} --variant=custom \
|
{{ CMD }} --mode={{ MODE }} --variant=custom \
|
||||||
--include "$(tr '\n' ',' < pkglist.txt)" \
|
--include "$(tr '\n' ',' <pkglist.txt)" \
|
||||||
--aptopt='APT::Solver "aspcud"' \
|
--aptopt='APT::Solver "aspcud"' \
|
||||||
{{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
{{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
{ tar -tf /tmp/debian-chroot.tar; echo ./var/lib/apt/extended_states; } | sort \
|
{
|
||||||
|
tar -tf /tmp/debian-chroot.tar
|
||||||
|
echo ./var/lib/apt/extended_states
|
||||||
|
} | sort \
|
||||||
| grep -v '^./etc/apt/apt.conf.d/99mmdebstrap$' \
|
| grep -v '^./etc/apt/apt.conf.d/99mmdebstrap$' \
|
||||||
| diff -u tar1.txt -
|
| diff -u tar1.txt -
|
||||||
|
|
|
@ -5,7 +5,7 @@ if [ ! -e /mmdebstrap-testenv ]; then
|
||||||
echo "this test modifies the system and should only be run inside a container" >&2
|
echo "this test modifies the system and should only be run inside a container" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
cat << HOSTS >> /etc/hosts
|
cat <<HOSTS >>/etc/hosts
|
||||||
127.0.0.1 deb.debian.org
|
127.0.0.1 deb.debian.org
|
||||||
127.0.0.1 security.debian.org
|
127.0.0.1 security.debian.org
|
||||||
HOSTS
|
HOSTS
|
||||||
|
|
|
@ -13,7 +13,7 @@ echo "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH"
|
||||||
{{ CMD }} --variant={{ VARIANT }} --mode={{ MODE }} \
|
{{ CMD }} --variant={{ VARIANT }} --mode={{ MODE }} \
|
||||||
--essential-hook='[ {{ DIST }} = oldstable ] && [ {{ VARIANT }} = - ] && echo _apt:*:100:65534::/nonexistent:/usr/sbin/nologin >> "$1"/etc/passwd || :' \
|
--essential-hook='[ {{ DIST }} = oldstable ] && [ {{ VARIANT }} = - ] && echo _apt:*:100:65534::/nonexistent:/usr/sbin/nologin >> "$1"/etc/passwd || :' \
|
||||||
"$(if [ {{ DIST }} = oldstable ]; then echo --merged-usr; else echo --hook-dir=./hooks/merged-usr; fi)" \
|
"$(if [ {{ DIST }} = oldstable ]; then echo --merged-usr; else echo --hook-dir=./hooks/merged-usr; fi)" \
|
||||||
"$(case {{ DIST }} in oldstable) echo --include=e2fsprogs,mount,tzdata,gcc-9-base;; stable) echo --include=e2fsprogs,mount,tzdata;; *) echo --include=base-files ;; esac )" \
|
"$(case {{ DIST }} in oldstable) echo --include=e2fsprogs,mount,tzdata,gcc-9-base ;; stable) echo --include=e2fsprogs,mount,tzdata ;; *) echo --include=base-files ;; esac)" \
|
||||||
{{ DIST }} /tmp/debian-{{ DIST }}-mm.tar {{ MIRROR }}
|
{{ DIST }} /tmp/debian-{{ DIST }}-mm.tar {{ MIRROR }}
|
||||||
|
|
||||||
mkdir /tmp/debian-{{ DIST }}-mm
|
mkdir /tmp/debian-{{ DIST }}-mm
|
||||||
|
@ -79,12 +79,12 @@ rm /tmp/debian-{{ DIST }}-debootstrap/var/lib/dpkg/cmethopt
|
||||||
rm /tmp/debian-{{ DIST }}-mm/var/lib/dpkg/arch
|
rm /tmp/debian-{{ DIST }}-mm/var/lib/dpkg/arch
|
||||||
# since we installed packages directly from the .deb files, Priorities differ
|
# since we installed packages directly from the .deb files, Priorities differ
|
||||||
# thus we first check for equality and then remove the files
|
# thus we first check for equality and then remove the files
|
||||||
chroot /tmp/debian-{{ DIST }}-debootstrap dpkg --list > /tmp/dpkg1
|
chroot /tmp/debian-{{ DIST }}-debootstrap dpkg --list >/tmp/dpkg1
|
||||||
chroot /tmp/debian-{{ DIST }}-mm dpkg --list > /tmp/dpkg2
|
chroot /tmp/debian-{{ DIST }}-mm dpkg --list >/tmp/dpkg2
|
||||||
diff -u /tmp/dpkg1 /tmp/dpkg2 >&2
|
diff -u /tmp/dpkg1 /tmp/dpkg2 >&2
|
||||||
rm /tmp/dpkg1 /tmp/dpkg2
|
rm /tmp/dpkg1 /tmp/dpkg2
|
||||||
grep -v '^Priority: ' /tmp/debian-{{ DIST }}-debootstrap/var/lib/dpkg/status > /tmp/status1
|
grep -v '^Priority: ' /tmp/debian-{{ DIST }}-debootstrap/var/lib/dpkg/status >/tmp/status1
|
||||||
grep -v '^Priority: ' /tmp/debian-{{ DIST }}-mm/var/lib/dpkg/status > /tmp/status2
|
grep -v '^Priority: ' /tmp/debian-{{ DIST }}-mm/var/lib/dpkg/status >/tmp/status2
|
||||||
diff -u /tmp/status1 /tmp/status2 >&2
|
diff -u /tmp/status1 /tmp/status2 >&2
|
||||||
rm /tmp/status1 /tmp/status2
|
rm /tmp/status1 /tmp/status2
|
||||||
rm /tmp/debian-{{ DIST }}-debootstrap/var/lib/dpkg/status /tmp/debian-{{ DIST }}-mm/var/lib/dpkg/status
|
rm /tmp/debian-{{ DIST }}-debootstrap/var/lib/dpkg/status /tmp/debian-{{ DIST }}-mm/var/lib/dpkg/status
|
||||||
|
@ -109,6 +109,7 @@ if [ "{{ VARIANT }}" = "-" ]; then
|
||||||
rm /tmp/debian-{{ DIST }}-debootstrap/var/lib/systemd/catalog/database
|
rm /tmp/debian-{{ DIST }}-debootstrap/var/lib/systemd/catalog/database
|
||||||
rm /tmp/debian-{{ DIST }}-mm/var/lib/systemd/catalog/database
|
rm /tmp/debian-{{ DIST }}-mm/var/lib/systemd/catalog/database
|
||||||
|
|
||||||
|
case {{ DIST }} in oldstable | stable | testing)
|
||||||
cap=$(chroot /tmp/debian-{{ DIST }}-debootstrap /sbin/getcap /bin/ping)
|
cap=$(chroot /tmp/debian-{{ DIST }}-debootstrap /sbin/getcap /bin/ping)
|
||||||
expected="/bin/ping cap_net_raw=ep"
|
expected="/bin/ping cap_net_raw=ep"
|
||||||
if [ "$cap" != "$expected" ]; then
|
if [ "$cap" != "$expected" ]; then
|
||||||
|
@ -122,7 +123,10 @@ if [ "{{ VARIANT }}" = "-" ]; then
|
||||||
echo "but mmdebstrap produced: $cap" >&2
|
echo "but mmdebstrap produced: $cap" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm /tmp/debian-{{ DIST }}-mm/var/cache/apt/archives/lock
|
rm /tmp/debian-{{ DIST }}-mm/var/cache/apt/archives/lock
|
||||||
rm /tmp/debian-{{ DIST }}-mm/var/lib/apt/extended_states
|
rm /tmp/debian-{{ DIST }}-mm/var/lib/apt/extended_states
|
||||||
rm /tmp/debian-{{ DIST }}-mm/var/lib/apt/lists/lock
|
rm /tmp/debian-{{ DIST }}-mm/var/lib/apt/lists/lock
|
||||||
|
@ -163,7 +167,7 @@ for log in faillog lastlog; do
|
||||||
if [ ! -e "$f1" ] && [ ! -e "$f2" ]; then
|
if [ ! -e "$f1" ] && [ ! -e "$f2" ]; then
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
if ! cmp "$f1" "$f2" >&2;then
|
if ! cmp "$f1" "$f2" >&2; then
|
||||||
# if the files differ, make sure they are all zeroes
|
# if the files differ, make sure they are all zeroes
|
||||||
cmp -n "$(stat -c %s "$f1")" "$f1" /dev/zero >&2
|
cmp -n "$(stat -c %s "$f1")" "$f1" /dev/zero >&2
|
||||||
cmp -n "$(stat -c %s "$f2")" "$f2" /dev/zero >&2
|
cmp -n "$(stat -c %s "$f2")" "$f2" /dev/zero >&2
|
||||||
|
@ -177,7 +181,7 @@ if [ "{{ VARIANT }}" = "-" ]; then
|
||||||
# of lines in /etc/group and /etc/gshadow differs
|
# of lines in /etc/group and /etc/gshadow differs
|
||||||
for f in group group- gshadow gshadow-; do
|
for f in group group- gshadow gshadow-; do
|
||||||
for d in mm debootstrap; do
|
for d in mm debootstrap; do
|
||||||
sort /tmp/debian-{{ DIST }}-$d/etc/$f > /tmp/debian-{{ DIST }}-$d/etc/$f.bak
|
sort /tmp/debian-{{ DIST }}-$d/etc/$f >/tmp/debian-{{ DIST }}-$d/etc/$f.bak
|
||||||
mv /tmp/debian-{{ DIST }}-$d/etc/$f.bak /tmp/debian-{{ DIST }}-$d/etc/$f
|
mv /tmp/debian-{{ DIST }}-$d/etc/$f.bak /tmp/debian-{{ DIST }}-$d/etc/$f
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
@ -185,7 +189,7 @@ if [ "{{ VARIANT }}" = "-" ]; then
|
||||||
# the order of lines in /etc/shadow and /etc/shadow- differs
|
# the order of lines in /etc/shadow and /etc/shadow- differs
|
||||||
for f in shadow shadow-; do
|
for f in shadow shadow-; do
|
||||||
for d in mm debootstrap; do
|
for d in mm debootstrap; do
|
||||||
sort /tmp/debian-{{ DIST }}-$d/etc/$f > /tmp/debian-{{ DIST }}-$d/etc/$f.bak
|
sort /tmp/debian-{{ DIST }}-$d/etc/$f >/tmp/debian-{{ DIST }}-$d/etc/$f.bak
|
||||||
mv /tmp/debian-{{ DIST }}-$d/etc/$f.bak /tmp/debian-{{ DIST }}-$d/etc/$f
|
mv /tmp/debian-{{ DIST }}-$d/etc/$f.bak /tmp/debian-{{ DIST }}-$d/etc/$f
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
@ -207,7 +211,7 @@ fi
|
||||||
# starting with systemd 255 upstream dropped splitusr support and depending on
|
# starting with systemd 255 upstream dropped splitusr support and depending on
|
||||||
# the installation order, symlink targets are prefixed with /usr or not
|
# the installation order, symlink targets are prefixed with /usr or not
|
||||||
# See #1060000 and #1054137
|
# See #1060000 and #1054137
|
||||||
case {{ DIST }} in testing|unstable)
|
case {{ DIST }} in testing | unstable)
|
||||||
for f in multi-user.target.wants/e2scrub_reap.service timers.target.wants/apt-daily-upgrade.timer timers.target.wants/apt-daily.timer timers.target.wants/e2scrub_all.timer; do
|
for f in multi-user.target.wants/e2scrub_reap.service timers.target.wants/apt-daily-upgrade.timer timers.target.wants/apt-daily.timer timers.target.wants/e2scrub_all.timer; do
|
||||||
for d in mm debootstrap; do
|
for d in mm debootstrap; do
|
||||||
[ -L "/tmp/debian-{{ DIST }}-$d/etc/systemd/system/$f" ] || continue
|
[ -L "/tmp/debian-{{ DIST }}-$d/etc/systemd/system/$f" ] || continue
|
||||||
|
@ -215,7 +219,10 @@ case {{ DIST }} in testing|unstable)
|
||||||
case $oldlink in
|
case $oldlink in
|
||||||
/usr/*) : ;;
|
/usr/*) : ;;
|
||||||
/*) oldlink="/usr$oldlink" ;;
|
/*) oldlink="/usr$oldlink" ;;
|
||||||
*) echo unexpected >&2; exit 1 ;;
|
*)
|
||||||
|
echo unexpected >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
ln -sf "$oldlink" "/tmp/debian-{{ DIST }}-$d/etc/systemd/system/$f"
|
ln -sf "$oldlink" "/tmp/debian-{{ DIST }}-$d/etc/systemd/system/$f"
|
||||||
done
|
done
|
||||||
|
@ -237,8 +244,8 @@ for d in ./var/lib/apt/lists/partial ./var/cache/apt/archives/partial; do
|
||||||
done
|
done
|
||||||
tar -C /tmp/debian-{{ DIST }}-debootstrap --numeric-owner --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/root1.tar .
|
tar -C /tmp/debian-{{ DIST }}-debootstrap --numeric-owner --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/root1.tar .
|
||||||
tar -C /tmp/debian-{{ DIST }}-mm --numeric-owner --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/root2.tar .
|
tar -C /tmp/debian-{{ DIST }}-mm --numeric-owner --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/root2.tar .
|
||||||
tar --full-time --verbose -tf /tmp/root1.tar > /tmp/root1.tar.list
|
tar --full-time --verbose -tf /tmp/root1.tar >/tmp/root1.tar.list
|
||||||
tar --full-time --verbose -tf /tmp/root2.tar > /tmp/root2.tar.list
|
tar --full-time --verbose -tf /tmp/root2.tar >/tmp/root2.tar.list
|
||||||
diff -u /tmp/root1.tar.list /tmp/root2.tar.list >&2
|
diff -u /tmp/root1.tar.list /tmp/root2.tar.list >&2
|
||||||
rm /tmp/root1.tar /tmp/root2.tar /tmp/root1.tar.list /tmp/root2.tar.list
|
rm /tmp/root1.tar /tmp/root2.tar /tmp/root1.tar.list /tmp/root2.tar.list
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ export SOURCE_DATE_EPOCH={{ SOURCE_DATE_EPOCH }}
|
||||||
|
|
||||||
trap "rm -f /tmp/debian-chroot-{{ MODE }}.{{ FORMAT }}" EXIT INT TERM
|
trap "rm -f /tmp/debian-chroot-{{ MODE }}.{{ FORMAT }}" EXIT INT TERM
|
||||||
|
|
||||||
case {{ MODE }} in unshare|fakechroot) : ;; *) exit 1;; esac
|
case {{ MODE }} in unshare | fakechroot) : ;; *) exit 1 ;; esac
|
||||||
|
|
||||||
prefix=
|
prefix=
|
||||||
if [ "$(id -u)" -eq 0 ] && [ "{{ MODE }}" != "root" ] && [ "{{ MODE }}" != "auto" ]; then
|
if [ "$(id -u)" -eq 0 ] && [ "{{ MODE }}" != "root" ] && [ "{{ MODE }}" != "auto" ]; then
|
||||||
|
|
|
@ -37,7 +37,7 @@ for INCLUDE in '' 'apt' 'apt,build-essential' 'systemd-sysv'; do
|
||||||
${INCLUDE:+--include="$INCLUDE"} \
|
${INCLUDE:+--include="$INCLUDE"} \
|
||||||
{{ DIST }} - {{ MIRROR }} \
|
{{ DIST }} - {{ MIRROR }} \
|
||||||
| "$MMTARFILTER" --path-exclude="/var/log/journal" --path-exclude="/etc/credstore*" \
|
| "$MMTARFILTER" --path-exclude="/var/log/journal" --path-exclude="/etc/credstore*" \
|
||||||
> /tmp/chrootless.tar
|
>/tmp/chrootless.tar
|
||||||
cmp /tmp/root.tar /tmp/chrootless.tar || diffoscope /tmp/root.tar /tmp/chrootless.tar
|
cmp /tmp/root.tar /tmp/chrootless.tar || diffoscope /tmp/root.tar /tmp/chrootless.tar
|
||||||
rm /tmp/chrootless.tar /tmp/root.tar
|
rm /tmp/chrootless.tar /tmp/root.tar
|
||||||
done
|
done
|
||||||
|
|
|
@ -10,11 +10,11 @@ fi
|
||||||
|
|
||||||
deb2qemu() {
|
deb2qemu() {
|
||||||
case "$1" in
|
case "$1" in
|
||||||
amd64) echo x86_64;;
|
amd64) echo x86_64 ;;
|
||||||
arm64) echo aarch64;;
|
arm64) echo aarch64 ;;
|
||||||
armel|armhf) echo arm;;
|
armel | armhf) echo arm ;;
|
||||||
ppc64el) echo ppc64le;;
|
ppc64el) echo ppc64le ;;
|
||||||
*) echo "$1";;
|
*) echo "$1" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
if [ "$(dpkg --print-architecture)" = "arm64" ]; then
|
if [ "$(dpkg --print-architecture)" = "arm64" ]; then
|
||||||
|
@ -26,7 +26,6 @@ fi
|
||||||
[ "$(id -u)" -eq 0 ]
|
[ "$(id -u)" -eq 0 ]
|
||||||
[ -e "/proc/sys/fs/binfmt_misc/qemu-$(deb2qemu "$arch")" ]
|
[ -e "/proc/sys/fs/binfmt_misc/qemu-$(deb2qemu "$arch")" ]
|
||||||
|
|
||||||
|
|
||||||
# we need --hook-dir=./hooks/merged-usr because usrmerge does not understand
|
# we need --hook-dir=./hooks/merged-usr because usrmerge does not understand
|
||||||
# DPKG_ROOT
|
# DPKG_ROOT
|
||||||
#
|
#
|
||||||
|
@ -36,12 +35,12 @@ fi
|
||||||
# its own architecture as the native architecture, see #825385 and #1020533
|
# its own architecture as the native architecture, see #825385 and #1020533
|
||||||
# So we are not testing the installation of apt,build-essential here.
|
# So we are not testing the installation of apt,build-essential here.
|
||||||
for INCLUDE in '' 'apt' 'systemd-sysv'; do
|
for INCLUDE in '' 'apt' 'systemd-sysv'; do
|
||||||
echo 1 > "/proc/sys/fs/binfmt_misc/qemu-$(deb2qemu "$arch")"
|
echo 1 >"/proc/sys/fs/binfmt_misc/qemu-$(deb2qemu "$arch")"
|
||||||
arch-test "$arch"
|
arch-test "$arch"
|
||||||
{{ CMD }} --mode=root --architecture="$arch" --variant={{ VARIANT }} \
|
{{ CMD }} --mode=root --architecture="$arch" --variant={{ VARIANT }} \
|
||||||
--hook-dir=./hooks/merged-usr ${INCLUDE:+--include="$INCLUDE"} \
|
--hook-dir=./hooks/merged-usr ${INCLUDE:+--include="$INCLUDE"} \
|
||||||
{{ DIST }} "/tmp/root.tar" {{ MIRROR }}
|
{{ DIST }} "/tmp/root.tar" {{ MIRROR }}
|
||||||
echo 0 > "/proc/sys/fs/binfmt_misc/qemu-$(deb2qemu "$arch")"
|
echo 0 >"/proc/sys/fs/binfmt_misc/qemu-$(deb2qemu "$arch")"
|
||||||
arch-test "$arch" && exit 1
|
arch-test "$arch" && exit 1
|
||||||
{{ CMD }} --mode=chrootless --architecture="$arch" --variant={{ VARIANT }} \
|
{{ CMD }} --mode=chrootless --architecture="$arch" --variant={{ VARIANT }} \
|
||||||
--hook-dir=./hooks/merged-usr ${INCLUDE:+--include="$INCLUDE"} \
|
--hook-dir=./hooks/merged-usr ${INCLUDE:+--include="$INCLUDE"} \
|
||||||
|
@ -53,14 +52,13 @@ for INCLUDE in '' 'apt' 'systemd-sysv'; do
|
||||||
# * /var/lib/dpkg/triggers -- #990712
|
# * /var/lib/dpkg/triggers -- #990712
|
||||||
# * /var/cache/debconf/*.dat-old -- needs investigation
|
# * /var/cache/debconf/*.dat-old -- needs investigation
|
||||||
for tar in root chrootless; do
|
for tar in root chrootless; do
|
||||||
<"/tmp/$tar.tar" \
|
./tarfilter <"/tmp/$tar.tar" \
|
||||||
./tarfilter \
|
|
||||||
--path-exclude=/var/cache/debconf/config.dat-old \
|
--path-exclude=/var/cache/debconf/config.dat-old \
|
||||||
--path-exclude=/var/cache/debconf/templates.dat-old \
|
--path-exclude=/var/cache/debconf/templates.dat-old \
|
||||||
--path-exclude=/etc/ld.so.cache \
|
--path-exclude=/etc/ld.so.cache \
|
||||||
--path-exclude=/var/lib/dpkg/triggers/File \
|
--path-exclude=/var/lib/dpkg/triggers/File \
|
||||||
--path-exclude=/var/lib/dpkg/triggers/ldconfig \
|
--path-exclude=/var/lib/dpkg/triggers/ldconfig \
|
||||||
> "/tmp/$tar.tar.tmp"
|
>"/tmp/$tar.tar.tmp"
|
||||||
mv "/tmp/$tar.tar.tmp" "/tmp/$tar.tar"
|
mv "/tmp/$tar.tar.tmp" "/tmp/$tar.tar"
|
||||||
done
|
done
|
||||||
cmp /tmp/root.tar /tmp/chrootless.tar || diffoscope /tmp/root.tar /tmp/chrootless.tar
|
cmp /tmp/root.tar /tmp/chrootless.tar || diffoscope /tmp/root.tar /tmp/chrootless.tar
|
||||||
|
|
|
@ -21,7 +21,7 @@ fi
|
||||||
--setup-hook='mkdir -p "$1"/var/cache/apt/archives/partial' \
|
--setup-hook='mkdir -p "$1"/var/cache/apt/archives/partial' \
|
||||||
--setup-hook='touch "$1"/var/cache/apt/archives/lock' \
|
--setup-hook='touch "$1"/var/cache/apt/archives/lock' \
|
||||||
--setup-hook='chmod 0640 "$1"/var/cache/apt/archives/lock' \
|
--setup-hook='chmod 0640 "$1"/var/cache/apt/archives/lock' \
|
||||||
{{ DIST }} - {{ MIRROR }} > /tmp/orig.tar
|
{{ DIST }} - {{ MIRROR }} >/tmp/orig.tar
|
||||||
# somehow, when trying to create a tarball from the 9p mount, tar throws the
|
# somehow, when trying to create a tarball from the 9p mount, tar throws the
|
||||||
# following error: tar: ./doc-debian_6.4_all.deb: File shrank by 132942 bytes; padding with zeros
|
# following error: tar: ./doc-debian_6.4_all.deb: File shrank by 132942 bytes; padding with zeros
|
||||||
# to reproduce, try: tar --directory /mnt/cache/debian/pool/main/d/doc-debian/ --create --file - . | tar --directory /tmp/ --extract --file -
|
# to reproduce, try: tar --directory /mnt/cache/debian/pool/main/d/doc-debian/ --create --file - . | tar --directory /tmp/ --extract --file -
|
||||||
|
@ -32,7 +32,7 @@ cp /mnt/cache/debian/pool/main/b/busybox/busybox_*"_{{ HOSTARCH }}.deb" /mnt/cac
|
||||||
{{ CMD }} $include --mode={{ MODE }} --variant={{ VARIANT }} \
|
{{ CMD }} $include --mode={{ MODE }} --variant={{ VARIANT }} \
|
||||||
--setup-hook='mkdir -p "$1"/var/cache/apt/archives/partial' \
|
--setup-hook='mkdir -p "$1"/var/cache/apt/archives/partial' \
|
||||||
--setup-hook='sync-in "'"$tmpdir"'" /var/cache/apt/archives/partial' \
|
--setup-hook='sync-in "'"$tmpdir"'" /var/cache/apt/archives/partial' \
|
||||||
{{ DIST }} - {{ MIRROR }} > /tmp/test1.tar
|
{{ DIST }} - {{ MIRROR }} >/tmp/test1.tar
|
||||||
cmp /tmp/orig.tar /tmp/test1.tar
|
cmp /tmp/orig.tar /tmp/test1.tar
|
||||||
{{ CMD }} $include --mode={{ MODE }} --variant={{ VARIANT }} \
|
{{ CMD }} $include --mode={{ MODE }} --variant={{ VARIANT }} \
|
||||||
--customize-hook='touch "$1"/var/cache/apt/archives/partial' \
|
--customize-hook='touch "$1"/var/cache/apt/archives/partial' \
|
||||||
|
@ -40,5 +40,5 @@ cmp /tmp/orig.tar /tmp/test1.tar
|
||||||
--setup-hook='sync-in "'"$tmpdir"'" /var/cache/apt/archives/' \
|
--setup-hook='sync-in "'"$tmpdir"'" /var/cache/apt/archives/' \
|
||||||
--setup-hook='chmod 0755 "$1"/var/cache/apt/archives/' \
|
--setup-hook='chmod 0755 "$1"/var/cache/apt/archives/' \
|
||||||
--customize-hook='find "'"$tmpdir"'" -type f -exec md5sum "{}" \; | sed "s|"'"$tmpdir"'"|$1/var/cache/apt/archives|" | md5sum --check' \
|
--customize-hook='find "'"$tmpdir"'" -type f -exec md5sum "{}" \; | sed "s|"'"$tmpdir"'"|$1/var/cache/apt/archives|" | md5sum --check' \
|
||||||
{{ DIST }} - {{ MIRROR }} > /tmp/test2.tar
|
{{ DIST }} - {{ MIRROR }} >/tmp/test2.tar
|
||||||
cmp /tmp/orig.tar /tmp/test2.tar
|
cmp /tmp/orig.tar /tmp/test2.tar
|
||||||
|
|
|
@ -5,5 +5,5 @@ export LC_ALL=C.UTF-8
|
||||||
trap "rm -rf /tmp/debian-chroot" EXIT INT TERM
|
trap "rm -rf /tmp/debian-chroot" EXIT INT TERM
|
||||||
|
|
||||||
{{ CMD }} --mode=root --variant=apt {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
{{ CMD }} --mode=root --variant=apt {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
||||||
chroot /tmp/debian-chroot dpkg-query --showformat '${binary:Package}\n' --show > pkglist.txt
|
chroot /tmp/debian-chroot dpkg-query --showformat '${binary:Package}\n' --show >pkglist.txt
|
||||||
tar -C /tmp/debian-chroot --one-file-system -c . | tar -t | sort > tar1.txt
|
tar -C /tmp/debian-chroot --one-file-system -c . | tar -t | sort >tar1.txt
|
||||||
|
|
|
@ -38,7 +38,8 @@ $prefix {{ CMD }} --mode={{ MODE }} --variant=apt --architectures="$foreign_arch
|
||||||
{{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
{{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
# we ignore differences between architectures by ignoring some files
|
# we ignore differences between architectures by ignoring some files
|
||||||
# and renaming others
|
# and renaming others
|
||||||
{ tar -tf /tmp/debian-chroot.tar \
|
{
|
||||||
|
tar -tf /tmp/debian-chroot.tar \
|
||||||
| grep -v '^\./usr/bin/i386$' \
|
| grep -v '^\./usr/bin/i386$' \
|
||||||
| grep -v '^\./usr/bin/x86_64$' \
|
| grep -v '^\./usr/bin/x86_64$' \
|
||||||
| grep -v '^\./lib64$' \
|
| grep -v '^\./lib64$' \
|
||||||
|
@ -53,10 +54,10 @@ $prefix {{ CMD }} --mode={{ MODE }} --variant=apt --architectures="$foreign_arch
|
||||||
| grep -v '^\./usr/share/man/man8/i386\.8\.gz$' \
|
| grep -v '^\./usr/share/man/man8/i386\.8\.gz$' \
|
||||||
| grep -v '^\./usr/share/man/man8/x86_64\.8\.gz$' \
|
| grep -v '^\./usr/share/man/man8/x86_64\.8\.gz$' \
|
||||||
| sed "s/$foreign_gnu/$native_gnu/" \
|
| sed "s/$foreign_gnu/$native_gnu/" \
|
||||||
| sed "s/$foreign_arch/$native_arch/";
|
| sed "s/$foreign_arch/$native_arch/"
|
||||||
} | sort > /tmp/tar2.txt
|
} | sort >/tmp/tar2.txt
|
||||||
{ < tar1.txt \
|
{
|
||||||
grep -v '^\./usr/bin/i386$' \
|
grep <tar1.txt -v '^\./usr/bin/i386$' \
|
||||||
| grep -v '^\./usr/bin/x86_64$' \
|
| grep -v '^\./usr/bin/x86_64$' \
|
||||||
| grep -v '^\./lib32$' \
|
| grep -v '^\./lib32$' \
|
||||||
| grep -v '^\./lib64$' \
|
| grep -v '^\./lib64$' \
|
||||||
|
@ -72,6 +73,6 @@ $prefix {{ CMD }} --mode={{ MODE }} --variant=apt --architectures="$foreign_arch
|
||||||
| grep -v "^\\./usr/lib/$native_gnu/perl/5\\.[0-9][.0-9]\\+/.*\\.ph$" \
|
| grep -v "^\\./usr/lib/$native_gnu/perl/5\\.[0-9][.0-9]\\+/.*\\.ph$" \
|
||||||
| grep -v "^\\./usr/share/doc/[^/]\\+/changelog\\(\\.Debian\\)\\?\\.$native_arch\\.gz$" \
|
| grep -v "^\\./usr/share/doc/[^/]\\+/changelog\\(\\.Debian\\)\\?\\.$native_arch\\.gz$" \
|
||||||
| grep -v '^\./usr/share/man/man8/i386\.8\.gz$' \
|
| grep -v '^\./usr/share/man/man8/i386\.8\.gz$' \
|
||||||
| grep -v '^\./usr/share/man/man8/x86_64\.8\.gz$';
|
| grep -v '^\./usr/share/man/man8/x86_64\.8\.gz$'
|
||||||
} | sort | diff -u - /tmp/tar2.txt >&2
|
} | sort | diff -u - /tmp/tar2.txt >&2
|
||||||
rm /tmp/debian-chroot.tar /tmp/tar2.txt
|
rm /tmp/debian-chroot.tar /tmp/tar2.txt
|
||||||
|
|
|
@ -17,7 +17,7 @@ if [ "$(id -u)" -eq 0 ] && [ "{{ MODE }}" != root ] && [ "{{ MODE }}" != auto ];
|
||||||
fi
|
fi
|
||||||
prefix="runuser -u ${SUDO_USER:-user} --"
|
prefix="runuser -u ${SUDO_USER:-user} --"
|
||||||
if [ "{{ VARIANT }}" = extract ] || [ "{{ VARIANT }}" = custom ]; then
|
if [ "{{ VARIANT }}" = extract ] || [ "{{ VARIANT }}" = custom ]; then
|
||||||
include="$(tr '\n' ',' < pkglist.txt)"
|
include="$(tr '\n' ',' <pkglist.txt)"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
$prefix {{ CMD }} --mode={{ MODE }} --include="$include" --dry-run --variant={{ VARIANT }} {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
$prefix {{ CMD }} --mode={{ MODE }} --include="$include" --dry-run --variant={{ VARIANT }} {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
|
|
|
@ -15,10 +15,10 @@ fi
|
||||||
prefix="runuser -u ${SUDO_USER:-user} --"
|
prefix="runuser -u ${SUDO_USER:-user} --"
|
||||||
|
|
||||||
# https://www.etalabs.net/sh_tricks.html
|
# https://www.etalabs.net/sh_tricks.html
|
||||||
quote () { printf %s\\n "$1" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/" ; }
|
quote() { printf %s\\n "$1" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/"; }
|
||||||
homedir=$($prefix sh -c 'cd && pwd')
|
homedir=$($prefix sh -c 'cd && pwd')
|
||||||
# apt:test/integration/test-apt-key
|
# apt:test/integration/test-apt-key
|
||||||
TMPDIR_ADD="This is fü\$\$ing cràzy, \$(apt -v)\$!"
|
TMPDIR_ADD='This is fü$$ing cràzy, $(apt -v)$!'
|
||||||
$prefix mkdir "$homedir/$TMPDIR_ADD"
|
$prefix mkdir "$homedir/$TMPDIR_ADD"
|
||||||
# make sure the unshared user can traverse into the TMPDIR
|
# make sure the unshared user can traverse into the TMPDIR
|
||||||
chmod 711 "$homedir"
|
chmod 711 "$homedir"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/customize.sh" EXIT INT TERM
|
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/customize.sh" EXIT INT TERM
|
||||||
cat << 'SCRIPT' > /tmp/customize.sh
|
cat <<'SCRIPT' >/tmp/customize.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
chroot "$1" whoami > "$1/output2"
|
chroot "$1" whoami > "$1/output2"
|
||||||
chroot "$1" pwd >> "$1/output2"
|
chroot "$1" pwd >> "$1/output2"
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/sources.list /tmp/deb822.sources" EXIT INT TERM
|
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/sources.list /tmp/deb822.sources" EXIT INT TERM
|
||||||
cat << SOURCES > /tmp/deb822.sources
|
cat <<SOURCES >/tmp/deb822.sources
|
||||||
Types: deb
|
Types: deb
|
||||||
URIs: {{ MIRROR }}1
|
URIs: {{ MIRROR }}1
|
||||||
Suites: {{ DIST }}
|
Suites: {{ DIST }}
|
||||||
Components: main
|
Components: main
|
||||||
SOURCES
|
SOURCES
|
||||||
echo "deb {{ MIRROR }}2 {{ DIST }} main" > /tmp/sources.list
|
echo "deb {{ MIRROR }}2 {{ DIST }} main" >/tmp/sources.list
|
||||||
echo "deb {{ MIRROR }}3 {{ DIST }} main" \
|
echo "deb {{ MIRROR }}3 {{ DIST }} main" \
|
||||||
| {{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} \
|
| {{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} \
|
||||||
/tmp/debian-chroot \
|
/tmp/debian-chroot \
|
||||||
|
@ -19,13 +19,13 @@ echo "deb {{ MIRROR }}3 {{ DIST }} main" \
|
||||||
{{ MIRROR }}6 \
|
{{ MIRROR }}6 \
|
||||||
/tmp/sources.list
|
/tmp/sources.list
|
||||||
test ! -e /tmp/debian-chroot/etc/apt/sources.list
|
test ! -e /tmp/debian-chroot/etc/apt/sources.list
|
||||||
cat << SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list.d/0000deb822.sources -
|
cat <<SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list.d/0000deb822.sources -
|
||||||
Types: deb
|
Types: deb
|
||||||
URIs: {{ MIRROR }}1
|
URIs: {{ MIRROR }}1
|
||||||
Suites: {{ DIST }}
|
Suites: {{ DIST }}
|
||||||
Components: main
|
Components: main
|
||||||
SOURCES
|
SOURCES
|
||||||
cat << SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list.d/0001main.list -
|
cat <<SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list.d/0001main.list -
|
||||||
deb {{ MIRROR }}4 {{ DIST }} main
|
deb {{ MIRROR }}4 {{ DIST }} main
|
||||||
|
|
||||||
deb {{ MIRROR }}3 {{ DIST }} main
|
deb {{ MIRROR }}3 {{ DIST }} main
|
||||||
|
@ -40,6 +40,6 @@ tar -C /tmp/debian-chroot --one-file-system -c . \
|
||||||
tar -t \
|
tar -t \
|
||||||
| grep -v "^./etc/apt/sources.list.d/0000deb822.sources$" \
|
| grep -v "^./etc/apt/sources.list.d/0000deb822.sources$" \
|
||||||
| grep -v "^./etc/apt/sources.list.d/0001main.list$" \
|
| grep -v "^./etc/apt/sources.list.d/0001main.list$" \
|
||||||
| grep -v "^./etc/apt/sources.list.d/0002sources.list";
|
| grep -v "^./etc/apt/sources.list.d/0002sources.list"
|
||||||
printf "./etc/apt/sources.list\n";
|
printf "./etc/apt/sources.list\n"
|
||||||
} | sort | diff -u tar1.txt -
|
} | sort | diff -u tar1.txt -
|
||||||
|
|
|
@ -2,14 +2,14 @@
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/sources /tmp/deb822" EXIT INT TERM
|
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/sources /tmp/deb822" EXIT INT TERM
|
||||||
cat << SOURCES > /tmp/deb822
|
cat <<SOURCES >/tmp/deb822
|
||||||
Types: deb
|
Types: deb
|
||||||
URIs: {{ MIRROR }}1
|
URIs: {{ MIRROR }}1
|
||||||
Suites: {{ DIST }}
|
Suites: {{ DIST }}
|
||||||
Components: main
|
Components: main
|
||||||
SOURCES
|
SOURCES
|
||||||
echo "deb {{ MIRROR }}2 {{ DIST }} main" > /tmp/sources
|
echo "deb {{ MIRROR }}2 {{ DIST }} main" >/tmp/sources
|
||||||
cat << SOURCES | {{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} \
|
cat <<SOURCES | {{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} \
|
||||||
/tmp/debian-chroot \
|
/tmp/debian-chroot \
|
||||||
/tmp/deb822 \
|
/tmp/deb822 \
|
||||||
- \
|
- \
|
||||||
|
@ -21,13 +21,13 @@ Components: main
|
||||||
SOURCES
|
SOURCES
|
||||||
test ! -e /tmp/debian-chroot/etc/apt/sources.list
|
test ! -e /tmp/debian-chroot/etc/apt/sources.list
|
||||||
ls -lha /tmp/debian-chroot/etc/apt/sources.list.d/
|
ls -lha /tmp/debian-chroot/etc/apt/sources.list.d/
|
||||||
cat << SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list.d/0000deb822.sources -
|
cat <<SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list.d/0000deb822.sources -
|
||||||
Types: deb
|
Types: deb
|
||||||
URIs: {{ MIRROR }}1
|
URIs: {{ MIRROR }}1
|
||||||
Suites: {{ DIST }}
|
Suites: {{ DIST }}
|
||||||
Components: main
|
Components: main
|
||||||
SOURCES
|
SOURCES
|
||||||
cat << SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list.d/0001main.sources -
|
cat <<SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list.d/0001main.sources -
|
||||||
Types: deb
|
Types: deb
|
||||||
URIs: {{ MIRROR }}3
|
URIs: {{ MIRROR }}3
|
||||||
Suites: {{ DIST }}
|
Suites: {{ DIST }}
|
||||||
|
@ -39,6 +39,6 @@ tar -C /tmp/debian-chroot --one-file-system -c . \
|
||||||
tar -t \
|
tar -t \
|
||||||
| grep -v "^./etc/apt/sources.list.d/0000deb822.sources$" \
|
| grep -v "^./etc/apt/sources.list.d/0000deb822.sources$" \
|
||||||
| grep -v "^./etc/apt/sources.list.d/0001main.sources$" \
|
| grep -v "^./etc/apt/sources.list.d/0001main.sources$" \
|
||||||
| grep -v "^./etc/apt/sources.list.d/0002sources.list$";
|
| grep -v "^./etc/apt/sources.list.d/0002sources.list$"
|
||||||
printf "./etc/apt/sources.list\n";
|
printf "./etc/apt/sources.list\n"
|
||||||
} | sort | diff -u tar1.txt -
|
} | sort | diff -u tar1.txt -
|
||||||
|
|
|
@ -12,5 +12,5 @@ if [ "$ret" -ne 0 ]; then
|
||||||
cat "$tmpdir/debootstrap/debootstrap.log"
|
cat "$tmpdir/debootstrap/debootstrap.log"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
tar --sort=name --mtime=@$SOURCE_DATE_EPOCH --clamp-mtime --numeric-owner --one-file-system --xattrs -C "$tmpdir" -c . > "./cache/debian-{{ DIST }}-{{ VARIANT }}.tar"
|
tar --sort=name --mtime=@$SOURCE_DATE_EPOCH --clamp-mtime --numeric-owner --one-file-system --xattrs -C "$tmpdir" -c . >"./cache/debian-{{ DIST }}-{{ VARIANT }}.tar"
|
||||||
rm -r "$tmpdir"
|
rm -r "$tmpdir"
|
||||||
|
|
|
@ -7,7 +7,7 @@ trap "rm -f /tmp/debian-chroot.tar" EXIT INT TERM
|
||||||
|
|
||||||
# we use variant standard in verbose mode to see the maximum number of packages
|
# we use variant standard in verbose mode to see the maximum number of packages
|
||||||
# that was chosen in case of USE_HOST_APT_CONFIG=yes
|
# that was chosen in case of USE_HOST_APT_CONFIG=yes
|
||||||
case {{ VARIANT }} in standard) : ;; *) exit 1;; esac
|
case {{ VARIANT }} in standard) : ;; *) exit 1 ;; esac
|
||||||
|
|
||||||
{{ CMD }} --variant={{ VARIANT }} --debug {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
{{ CMD }} --variant={{ VARIANT }} --debug {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ if [ "$(id -u)" -eq 0 ] && [ "{{ MODE }}" != "root" ] && [ "{{ MODE }}" != "auto
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# this mimics what apt does in apt-pkg/deb/dpkgpm.cc/pkgDPkgPM::StartPtyMagic()
|
# this mimics what apt does in apt-pkg/deb/dpkgpm.cc/pkgDPkgPM::StartPtyMagic()
|
||||||
cat > /tmp/test.c << 'END'
|
cat >/tmp/test.c <<'END'
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
|
@ -8,6 +8,6 @@ trap "rm -f InRelease; rm -rf /tmp/debian-chroot.tar /tmp/expected" EXIT INT TER
|
||||||
/usr/lib/apt/apt-helper download-file "{{ MIRROR }}/dists/{{ DIST }}/InRelease" InRelease
|
/usr/lib/apt/apt-helper download-file "{{ MIRROR }}/dists/{{ DIST }}/InRelease" InRelease
|
||||||
codename=$(awk '/^Codename: / { print $2; }' InRelease)
|
codename=$(awk '/^Codename: / { print $2; }' InRelease)
|
||||||
{{ CMD }} --mode={{ MODE }} --variant=apt "$codename" /tmp/debian-chroot.tar {{ MIRROR }}
|
{{ CMD }} --mode={{ MODE }} --variant=apt "$codename" /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
echo "deb {{ MIRROR }} $codename main" > /tmp/expected
|
echo "deb {{ MIRROR }} $codename main" >/tmp/expected
|
||||||
tar --to-stdout --extract --file /tmp/debian-chroot.tar ./etc/apt/sources.list \
|
tar --to-stdout --extract --file /tmp/debian-chroot.tar ./etc/apt/sources.list \
|
||||||
| diff -u /tmp/expected -
|
| diff -u /tmp/expected -
|
||||||
|
|
|
@ -2,9 +2,13 @@
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/config" EXIT INT TERM
|
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/config" EXIT INT TERM
|
||||||
echo no-pager > /tmp/config
|
echo no-pager >/tmp/config
|
||||||
{{ CMD }} --mode=root --variant=apt --dpkgopt="path-exclude=/usr/share/doc/*" --dpkgopt=/tmp/config --dpkgopt="path-include=/usr/share/doc/dpkg/copyright" {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
{{ CMD }} --mode=root --variant=apt --dpkgopt="path-exclude=/usr/share/doc/*" --dpkgopt=/tmp/config --dpkgopt="path-include=/usr/share/doc/dpkg/copyright" {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
||||||
printf 'path-exclude=/usr/share/doc/*\nno-pager\npath-include=/usr/share/doc/dpkg/copyright\n' | cmp /tmp/debian-chroot/etc/dpkg/dpkg.cfg.d/99mmdebstrap -
|
printf 'path-exclude=/usr/share/doc/*\nno-pager\npath-include=/usr/share/doc/dpkg/copyright\n' | cmp /tmp/debian-chroot/etc/dpkg/dpkg.cfg.d/99mmdebstrap -
|
||||||
rm /tmp/debian-chroot/etc/dpkg/dpkg.cfg.d/99mmdebstrap
|
rm /tmp/debian-chroot/etc/dpkg/dpkg.cfg.d/99mmdebstrap
|
||||||
tar -C /tmp/debian-chroot --one-file-system -c . | tar -t | sort > tar2.txt
|
tar -C /tmp/debian-chroot --one-file-system -c . | tar -t | sort >tar2.txt
|
||||||
{ grep -v '^./usr/share/doc/.' tar1.txt; echo ./usr/share/doc/dpkg/; echo ./usr/share/doc/dpkg/copyright; } | sort | diff -u - tar2.txt
|
{
|
||||||
|
grep -v '^./usr/share/doc/.' tar1.txt
|
||||||
|
echo ./usr/share/doc/dpkg/
|
||||||
|
echo ./usr/share/doc/dpkg/copyright
|
||||||
|
} | sort | diff -u - tar2.txt
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
cat << SCRIPT > /tmp/checkeatmydata.sh
|
cat <<SCRIPT >/tmp/checkeatmydata.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -exu
|
set -exu
|
||||||
cat << EOF | diff - "\$1"/usr/bin/dpkg
|
cat << EOF | diff - "\$1"/usr/bin/dpkg
|
||||||
|
@ -12,18 +12,24 @@ EOF
|
||||||
SCRIPT
|
SCRIPT
|
||||||
chmod +x /tmp/checkeatmydata.sh
|
chmod +x /tmp/checkeatmydata.sh
|
||||||
# first four bytes: magic
|
# first four bytes: magic
|
||||||
elfheader="\\177ELF"
|
elfheader='\177ELF'
|
||||||
# fifth byte: bits
|
# fifth byte: bits
|
||||||
case "$(dpkg-architecture -qDEB_HOST_ARCH_BITS)" in
|
case "$(dpkg-architecture -qDEB_HOST_ARCH_BITS)" in
|
||||||
32) elfheader="$elfheader\\001";;
|
32) elfheader="$elfheader\\001" ;;
|
||||||
64) elfheader="$elfheader\\002";;
|
64) elfheader="$elfheader\\002" ;;
|
||||||
*) echo "bits not supported"; exit 1;;
|
*)
|
||||||
|
echo "bits not supported"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
# sixth byte: endian
|
# sixth byte: endian
|
||||||
case "$(dpkg-architecture -qDEB_HOST_ARCH_ENDIAN)" in
|
case "$(dpkg-architecture -qDEB_HOST_ARCH_ENDIAN)" in
|
||||||
little) elfheader="$elfheader\\001";;
|
little) elfheader="$elfheader\\001" ;;
|
||||||
big) elfheader="$elfheader\\002";;
|
big) elfheader="$elfheader\\002" ;;
|
||||||
*) echo "endian not supported"; exit 1;;
|
*)
|
||||||
|
echo "endian not supported"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
# seventh and eigth byte: elf version (1) and abi (unset)
|
# seventh and eigth byte: elf version (1) and abi (unset)
|
||||||
elfheader="$elfheader\\001\\000"
|
elfheader="$elfheader\\001\\000"
|
||||||
|
@ -34,7 +40,7 @@ elfheader="$elfheader\\001\\000"
|
||||||
--hook-dir=./hooks/eatmydata \
|
--hook-dir=./hooks/eatmydata \
|
||||||
--customize-hook='printf "'"$elfheader"'" | cmp --bytes=8 - "$1"/usr/bin/dpkg' \
|
--customize-hook='printf "'"$elfheader"'" | cmp --bytes=8 - "$1"/usr/bin/dpkg' \
|
||||||
{{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
{{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
||||||
tar -C /tmp/debian-chroot --one-file-system -c . \
|
tar -C /tmp/debian-chroot --one-file-system -c . \
|
||||||
| tar -t \
|
| tar -t \
|
||||||
| sort \
|
| sort \
|
||||||
| diff -u tar1.txt -
|
| diff -u tar1.txt -
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/essential.sh" EXIT INT TERM
|
trap "rm -rf /tmp/debian-chroot; rm -f /tmp/essential.sh" EXIT INT TERM
|
||||||
cat << 'SCRIPT' > /tmp/essential.sh
|
cat <<'SCRIPT' >/tmp/essential.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
echo tzdata tzdata/Zones/Europe select Berlin | chroot "$1" debconf-set-selections
|
echo tzdata tzdata/Zones/Europe select Berlin | chroot "$1" debconf-set-selections
|
||||||
SCRIPT
|
SCRIPT
|
||||||
|
|
|
@ -6,7 +6,7 @@ if [ ! -e /mmdebstrap-testenv ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
useradd --home-dir /home/user --create-home user
|
useradd --home-dir /home/user --create-home user
|
||||||
awk -F: '$1!="user"' /etc/subuid > /etc/subuid.tmp
|
awk -F: '$1!="user"' /etc/subuid >/etc/subuid.tmp
|
||||||
mv /etc/subuid.tmp /etc/subuid
|
mv /etc/subuid.tmp /etc/subuid
|
||||||
ret=0
|
ret=0
|
||||||
runuser -u user -- {{ CMD }} --mode=unshare --variant=apt {{ DIST }} /tmp/debian-chroot {{ MIRROR }} || ret=$?
|
runuser -u user -- {{ CMD }} --mode=unshare --variant=apt {{ DIST }} /tmp/debian-chroot {{ MIRROR }} || ret=$?
|
||||||
|
|
|
@ -5,7 +5,7 @@ if [ ! -e /mmdebstrap-testenv ]; then
|
||||||
echo "this test requires the cache directory to be mounted on /mnt and should only be run inside a container" >&2
|
echo "this test requires the cache directory to be mounted on /mnt and should only be run inside a container" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [ "$(id -u)" -eq 0 ] && ! id -u user > /dev/null 2>&1; then
|
if [ "$(id -u)" -eq 0 ] && ! id -u user >/dev/null 2>&1; then
|
||||||
useradd --home-dir /home/user --create-home user
|
useradd --home-dir /home/user --create-home user
|
||||||
fi
|
fi
|
||||||
prefix=
|
prefix=
|
||||||
|
|
|
@ -4,12 +4,12 @@ export LC_ALL=C.UTF-8
|
||||||
for h in hookA hookB; do
|
for h in hookA hookB; do
|
||||||
mkdir /tmp/$h
|
mkdir /tmp/$h
|
||||||
for s in setup extract essential customize; do
|
for s in setup extract essential customize; do
|
||||||
cat << SCRIPT > /tmp/$h/${s}00.sh
|
cat <<SCRIPT >/tmp/$h/${s}00.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
echo $h/${s}00 >> "\$1/$s"
|
echo $h/${s}00 >> "\$1/$s"
|
||||||
SCRIPT
|
SCRIPT
|
||||||
chmod +x /tmp/$h/${s}00.sh
|
chmod +x /tmp/$h/${s}00.sh
|
||||||
cat << SCRIPT > /tmp/$h/${s}01.sh
|
cat <<SCRIPT >/tmp/$h/${s}01.sh
|
||||||
echo $h/${s}01 >> "\$1/$s"
|
echo $h/${s}01 >> "\$1/$s"
|
||||||
SCRIPT
|
SCRIPT
|
||||||
chmod +x /tmp/$h/${s}01.sh
|
chmod +x /tmp/$h/${s}01.sh
|
||||||
|
|
|
@ -10,7 +10,8 @@ apt-get remove --yes qemu-user-binfmt binfmt-support qemu-user
|
||||||
{{ CMD }} --mode={{ MODE }} --variant=apt --architectures=i386 {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
{{ CMD }} --mode={{ MODE }} --variant=apt --architectures=i386 {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
# we ignore differences between architectures by ignoring some files
|
# we ignore differences between architectures by ignoring some files
|
||||||
# and renaming others
|
# and renaming others
|
||||||
{ tar -tf /tmp/debian-chroot.tar \
|
{
|
||||||
|
tar -tf /tmp/debian-chroot.tar \
|
||||||
| grep -v '^\./usr/bin/i386$' \
|
| grep -v '^\./usr/bin/i386$' \
|
||||||
| grep -v '^\./usr/lib/ld-linux\.so\.2$' \
|
| grep -v '^\./usr/lib/ld-linux\.so\.2$' \
|
||||||
| grep -v '^\./usr/lib/i386-linux-gnu/ld-linux\.so\.2$' \
|
| grep -v '^\./usr/lib/i386-linux-gnu/ld-linux\.so\.2$' \
|
||||||
|
@ -20,10 +21,10 @@ apt-get remove --yes qemu-user-binfmt binfmt-support qemu-user
|
||||||
| grep -v '^\./usr/share/doc/[^/]\+/changelog\(\.Debian\)\?\.i386\.gz$' \
|
| grep -v '^\./usr/share/doc/[^/]\+/changelog\(\.Debian\)\?\.i386\.gz$' \
|
||||||
| sed 's/i386-linux-gnu/x86_64-linux-gnu/' \
|
| sed 's/i386-linux-gnu/x86_64-linux-gnu/' \
|
||||||
| sed 's/i386/amd64/' \
|
| sed 's/i386/amd64/' \
|
||||||
| sed 's/\/stubs-32.ph$/\/stubs-64.ph/';
|
| sed 's/\/stubs-32.ph$/\/stubs-64.ph/'
|
||||||
} | sort > tar2.txt
|
} | sort >tar2.txt
|
||||||
{ < tar1.txt \
|
{
|
||||||
grep -v '^\./usr/bin/i386$' \
|
grep <tar1.txt -v '^\./usr/bin/i386$' \
|
||||||
| grep -v '^\./usr/bin/x86_64$' \
|
| grep -v '^\./usr/bin/x86_64$' \
|
||||||
| grep -v '^\./usr/lib32/$' \
|
| grep -v '^\./usr/lib32/$' \
|
||||||
| grep -v '^\./lib32$' \
|
| grep -v '^\./lib32$' \
|
||||||
|
@ -36,6 +37,6 @@ apt-get remove --yes qemu-user-binfmt binfmt-support qemu-user
|
||||||
| grep -v '^\./usr/lib/x86_64-linux-gnu/libmvec\.so\.1$' \
|
| grep -v '^\./usr/lib/x86_64-linux-gnu/libmvec\.so\.1$' \
|
||||||
| grep -v '^\./usr/share/doc/[^/]\+/changelog\(\.Debian\)\?\.amd64\.gz$' \
|
| grep -v '^\./usr/share/doc/[^/]\+/changelog\(\.Debian\)\?\.amd64\.gz$' \
|
||||||
| grep -v '^\./usr/share/man/man8/i386\.8\.gz$' \
|
| grep -v '^\./usr/share/man/man8/i386\.8\.gz$' \
|
||||||
| grep -v '^\./usr/share/man/man8/x86_64\.8\.gz$';
|
| grep -v '^\./usr/share/man/man8/x86_64\.8\.gz$'
|
||||||
} | sort | diff -u - tar2.txt >&2
|
} | sort | diff -u - tar2.txt >&2
|
||||||
rm /tmp/debian-chroot.tar
|
rm /tmp/debian-chroot.tar
|
||||||
|
|
|
@ -21,7 +21,7 @@ fi
|
||||||
# otherwise apt might decide to download the package with the same name and
|
# otherwise apt might decide to download the package with the same name and
|
||||||
# version from the cache instead of using the local .deb
|
# version from the cache instead of using the local .deb
|
||||||
mkdir -p /tmp/dummypkg/DEBIAN
|
mkdir -p /tmp/dummypkg/DEBIAN
|
||||||
cat << END > "/tmp/dummypkg/DEBIAN/control"
|
cat <<END >"/tmp/dummypkg/DEBIAN/control"
|
||||||
Package: dummypkg
|
Package: dummypkg
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Section: oldlibs
|
Section: oldlibs
|
||||||
|
|
|
@ -27,7 +27,10 @@ export LC_ALL=C.UTF-8
|
||||||
--architectures="$native_arch,$foreign_arch" \
|
--architectures="$native_arch,$foreign_arch" \
|
||||||
--include="libmagic-mgc:$foreign_arch" \
|
--include="libmagic-mgc:$foreign_arch" \
|
||||||
{{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
{{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
||||||
{ echo "$native_arch"; echo "$foreign_arch"; } | cmp /tmp/debian-chroot/var/lib/dpkg/arch -
|
{
|
||||||
|
echo "$native_arch"
|
||||||
|
echo "$foreign_arch"
|
||||||
|
} | cmp /tmp/debian-chroot/var/lib/dpkg/arch -
|
||||||
rm /tmp/debian-chroot/usr/lib/file/magic.mgc
|
rm /tmp/debian-chroot/usr/lib/file/magic.mgc
|
||||||
rm /tmp/debian-chroot/usr/share/doc/libmagic-mgc/README.Debian
|
rm /tmp/debian-chroot/usr/share/doc/libmagic-mgc/README.Debian
|
||||||
rm -f /tmp/debian-chroot/usr/share/doc/libmagic-mgc/"changelog.Debian.$foreign_arch.gz"
|
rm -f /tmp/debian-chroot/usr/share/doc/libmagic-mgc/"changelog.Debian.$foreign_arch.gz"
|
||||||
|
|
|
@ -28,7 +28,10 @@ export LC_ALL=C.UTF-8
|
||||||
--architectures="$foreign_arch" \
|
--architectures="$foreign_arch" \
|
||||||
--include="libmagic-mgc:$foreign_arch" \
|
--include="libmagic-mgc:$foreign_arch" \
|
||||||
{{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
{{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
||||||
{ echo "$native_arch"; echo "$foreign_arch"; } | cmp /tmp/debian-chroot/var/lib/dpkg/arch -
|
{
|
||||||
|
echo "$native_arch"
|
||||||
|
echo "$foreign_arch"
|
||||||
|
} | cmp /tmp/debian-chroot/var/lib/dpkg/arch -
|
||||||
rm /tmp/debian-chroot/usr/lib/file/magic.mgc
|
rm /tmp/debian-chroot/usr/lib/file/magic.mgc
|
||||||
rm /tmp/debian-chroot/usr/share/doc/libmagic-mgc/README.Debian
|
rm /tmp/debian-chroot/usr/share/doc/libmagic-mgc/README.Debian
|
||||||
rm -f /tmp/debian-chroot/usr/share/doc/libmagic-mgc/"changelog.Debian.$foreign_arch.gz"
|
rm -f /tmp/debian-chroot/usr/share/doc/libmagic-mgc/"changelog.Debian.$foreign_arch.gz"
|
||||||
|
|
|
@ -15,7 +15,7 @@ pkgs=base-files,base-passwd,busybox,debianutils,dpkg,libc-bin,mawk,tar
|
||||||
--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' \
|
--extract-hook='chroot "$1" busybox --install -s' \
|
||||||
{{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
{{ 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
|
||||||
|
|
|
@ -21,7 +21,7 @@ fi
|
||||||
|
|
||||||
$prefix {{ CMD }} --mode={{ MODE }} --variant={{ VARIANT }} --include=doc-debian {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
$prefix {{ CMD }} --mode={{ MODE }} --variant={{ VARIANT }} --include=doc-debian {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
||||||
tar -C /tmp/debian-chroot --owner=0 --group=0 --numeric-owner --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/debian-chroot.tar .
|
tar -C /tmp/debian-chroot --owner=0 --group=0 --numeric-owner --sort=name --clamp-mtime --mtime="$(date --utc --date=@{{ SOURCE_DATE_EPOCH }} --iso-8601=seconds)" -cf /tmp/debian-chroot.tar .
|
||||||
tar tvf /tmp/debian-chroot.tar > doc-debian.tar.list
|
tar tvf /tmp/debian-chroot.tar >doc-debian.tar.list
|
||||||
rm /tmp/debian-chroot.tar
|
rm /tmp/debian-chroot.tar
|
||||||
# delete contents of doc-debian
|
# delete contents of doc-debian
|
||||||
rm /tmp/debian-chroot/usr/share/doc-base/doc-debian.debian-*
|
rm /tmp/debian-chroot/usr/share/doc-base/doc-debian.debian-*
|
||||||
|
|
|
@ -37,7 +37,7 @@ filter() {
|
||||||
}
|
}
|
||||||
|
|
||||||
# base for comparison without jessie-or-older hook
|
# base for comparison without jessie-or-older hook
|
||||||
{{ CMD }} --mode=root --variant={{ VARIANT }} {{ DIST }} - {{ MIRROR }} > /tmp/debian-chroot-root-normal.tar
|
{{ CMD }} --mode=root --variant={{ VARIANT }} {{ DIST }} - {{ MIRROR }} >/tmp/debian-chroot-root-normal.tar
|
||||||
|
|
||||||
$prefix {{ CMD }} --mode={{ MODE }} --variant={{ VARIANT }} --hook-dir=./hooks/jessie-or-older {{ DIST }} - {{ MIRROR }} | filter > /tmp/debian-chroot-{{ MODE }}.tar
|
$prefix {{ CMD }} --mode={{ MODE }} --variant={{ VARIANT }} --hook-dir=./hooks/jessie-or-older {{ DIST }} - {{ MIRROR }} | filter >/tmp/debian-chroot-{{ MODE }}.tar
|
||||||
filter < /tmp/debian-chroot-root-normal.tar | cmp - /tmp/debian-chroot-{{ MODE }}.tar
|
filter </tmp/debian-chroot-root-normal.tar | cmp - /tmp/debian-chroot-{{ MODE }}.tar
|
||||||
|
|
|
@ -7,8 +7,8 @@ trap "rm -rf /tmp/debian-chroot /tmp/log /tmp/trimmed" EXIT INT TERM
|
||||||
# we check the full log to also prevent debug printfs to accidentally make it into a commit
|
# we check the full log to also prevent debug printfs to accidentally make it into a commit
|
||||||
{{ CMD }} --mode=root --variant=apt --logfile=/tmp/log {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
{{ CMD }} --mode=root --variant=apt --logfile=/tmp/log {{ DIST }} /tmp/debian-chroot {{ MIRROR }}
|
||||||
# omit the last line which should contain the runtime
|
# omit the last line which should contain the runtime
|
||||||
head --lines=-1 /tmp/log > /tmp/trimmed
|
head --lines=-1 /tmp/log >/tmp/trimmed
|
||||||
cat << LOG | diff -u - /tmp/trimmed
|
cat <<LOG | diff -u - /tmp/trimmed
|
||||||
I: chroot architecture {{ HOSTARCH }} is equal to the host's architecture
|
I: chroot architecture {{ HOSTARCH }} is equal to the host's architecture
|
||||||
I: finding correct signed-by value...
|
I: finding correct signed-by value...
|
||||||
I: automatically chosen format: directory
|
I: automatically chosen format: directory
|
||||||
|
|
|
@ -9,7 +9,7 @@ export SOURCE_DATE_EPOCH={{ SOURCE_DATE_EPOCH }}
|
||||||
trap "rm -f /tmp/chroot-fakechroot.tar /tmp/chroot-root.tar" EXIT INT TERM
|
trap "rm -f /tmp/chroot-fakechroot.tar /tmp/chroot-root.tar" EXIT INT TERM
|
||||||
[ "$(whoami)" = "root" ]
|
[ "$(whoami)" = "root" ]
|
||||||
{{ CMD }} --mode=root --variant=apt --hook-dir=./hooks/merged-usr {{ DIST }} /tmp/chroot-root.tar {{ MIRROR }}
|
{{ CMD }} --mode=root --variant=apt --hook-dir=./hooks/merged-usr {{ DIST }} /tmp/chroot-root.tar {{ MIRROR }}
|
||||||
cat << 'SCRIPT' > script.sh
|
cat <<'SCRIPT' >script.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -exu
|
set -exu
|
||||||
rootfs="$1"
|
rootfs="$1"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm -f /tmp/debian-chroot.tar /tmp/sources.list" EXIT INT TERM
|
trap "rm -f /tmp/debian-chroot.tar /tmp/sources.list" EXIT INT TERM
|
||||||
echo "deb {{ MIRROR }} {{ DIST }} main" > /tmp/sources.list
|
echo "deb {{ MIRROR }} {{ DIST }} main" >/tmp/sources.list
|
||||||
{{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} /tmp/debian-chroot.tar /tmp/sources.list
|
{{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} /tmp/debian-chroot.tar /tmp/sources.list
|
||||||
tar -tf /tmp/debian-chroot.tar \
|
tar -tf /tmp/debian-chroot.tar \
|
||||||
| sed 's#^./etc/apt/sources.list.d/0000sources.list$#./etc/apt/sources.list#' \
|
| sed 's#^./etc/apt/sources.list.d/0000sources.list$#./etc/apt/sources.list#' \
|
||||||
|
|
|
@ -5,7 +5,7 @@ export SOURCE_DATE_EPOCH={{ SOURCE_DATE_EPOCH }}
|
||||||
|
|
||||||
[ "$(id -u)" -eq 0 ]
|
[ "$(id -u)" -eq 0 ]
|
||||||
[ {{ MODE }} = "root" ]
|
[ {{ MODE }} = "root" ]
|
||||||
case {{ FORMAT }} in tar|squashfs|ext2|ext4) : ;; *) exit 1;; esac
|
case {{ FORMAT }} in tar | squashfs | ext2 | ext4) : ;; *) exit 1 ;; esac
|
||||||
|
|
||||||
{{ CMD }} --mode={{ MODE }} --variant={{ VARIANT }} {{ DIST }} /tmp/mmdebstrap-{{ DIST }}-{{ VARIANT }}.{{ FORMAT }} {{ MIRROR }}
|
{{ CMD }} --mode={{ MODE }} --variant={{ VARIANT }} {{ DIST }} /tmp/mmdebstrap-{{ DIST }}-{{ VARIANT }}.{{ FORMAT }} {{ MIRROR }}
|
||||||
# creating an ext4 image on a 9p filesystem produces different results compared
|
# creating an ext4 image on a 9p filesystem produces different results compared
|
||||||
|
|
|
@ -5,10 +5,10 @@ if [ ! -e /mmdebstrap-testenv ]; then
|
||||||
echo "this test modifies the system and should only be run inside a container" >&2
|
echo "this test modifies the system and should only be run inside a container" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
cat << HOSTS >> /etc/hosts
|
cat <<HOSTS >>/etc/hosts
|
||||||
127.0.0.1 deb.debian.org
|
127.0.0.1 deb.debian.org
|
||||||
127.0.0.1 security.debian.org
|
127.0.0.1 security.debian.org
|
||||||
HOSTS
|
HOSTS
|
||||||
{{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} > /tmp/debian-chroot.tar
|
{{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} >/tmp/debian-chroot.tar
|
||||||
tar -tf /tmp/debian-chroot.tar | sort | diff -u tar1.txt -
|
tar -tf /tmp/debian-chroot.tar | sort | diff -u tar1.txt -
|
||||||
rm /tmp/debian-chroot.tar
|
rm /tmp/debian-chroot.tar
|
||||||
|
|
|
@ -7,7 +7,7 @@ if [ ! -e /mmdebstrap-testenv ]; then
|
||||||
fi
|
fi
|
||||||
for f in /etc/resolv.conf /etc/hostname; do
|
for f in /etc/resolv.conf /etc/hostname; do
|
||||||
# preserve original content
|
# preserve original content
|
||||||
cat "$f" > "$f.bak"
|
cat "$f" >"$f.bak"
|
||||||
# in case $f is a symlink, we replace it by a real file
|
# in case $f is a symlink, we replace it by a real file
|
||||||
if [ -L "$f" ]; then
|
if [ -L "$f" ]; then
|
||||||
rm "$f"
|
rm "$f"
|
||||||
|
|
|
@ -2,5 +2,5 @@
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
trap "rm /tmp/debian-chroot.tar" EXIT INT TERM
|
trap "rm /tmp/debian-chroot.tar" EXIT INT TERM
|
||||||
echo "deb {{ MIRROR }} {{ DIST }} main" | {{ CMD }} --mode={{ MODE }} --variant=apt > /tmp/debian-chroot.tar
|
echo "deb {{ MIRROR }} {{ DIST }} main" | {{ CMD }} --mode={{ MODE }} --variant=apt >/tmp/debian-chroot.tar
|
||||||
tar -tf /tmp/debian-chroot.tar | sort | diff -u tar1.txt -
|
tar -tf /tmp/debian-chroot.tar | sort | diff -u tar1.txt -
|
||||||
|
|
|
@ -9,7 +9,7 @@ export LC_ALL=C.UTF-8
|
||||||
|
|
||||||
trap "rm -f /tmp/debian-chroot.tar script.sh" EXIT INT TERM
|
trap "rm -f /tmp/debian-chroot.tar script.sh" EXIT INT TERM
|
||||||
|
|
||||||
cat << 'SCRIPT' > script.sh
|
cat <<'SCRIPT' >script.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -exu
|
set -exu
|
||||||
rootfs="$1"
|
rootfs="$1"
|
||||||
|
|
|
@ -20,7 +20,7 @@ if [ "$(id -u)" -eq 0 ] && [ "{{ MODE }}" != "root" ] && [ "{{ MODE }}" != "auto
|
||||||
prefix="runuser -u ${SUDO_USER:-user} --"
|
prefix="runuser -u ${SUDO_USER:-user} --"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat << 'SCRIPT' > /tmp/script.sh
|
cat <<'SCRIPT' >/tmp/script.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -eu
|
set -eu
|
||||||
rootfs="$1"
|
rootfs="$1"
|
||||||
|
|
|
@ -6,7 +6,7 @@ pid=$!
|
||||||
while sleep 1; do [ -e hookstarted ] && break; done
|
while sleep 1; do [ -e hookstarted ] && break; done
|
||||||
rm hookstarted
|
rm hookstarted
|
||||||
# negative PID values choose the whole process group
|
# negative PID values choose the whole process group
|
||||||
pgid=$((-1*$(ps -p "$pid" -o pgid=)))
|
pgid=$((-1 * $(ps -p "$pid" -o pgid=)))
|
||||||
/bin/kill --signal INT -- "$pgid"
|
/bin/kill --signal INT -- "$pgid"
|
||||||
ret=0
|
ret=0
|
||||||
wait $pid || ret=$?
|
wait $pid || ret=$?
|
||||||
|
|
|
@ -17,19 +17,19 @@ fi
|
||||||
# test this for both unshare and root mode because the code paths creating
|
# test this for both unshare and root mode because the code paths creating
|
||||||
# entries in /dev are different depending on whether mknod is available or not
|
# entries in /dev are different depending on whether mknod is available or not
|
||||||
$prefix {{ CMD }} --mode={{ MODE }} --variant=apt --skip=output/dev {{ DIST }} - {{ MIRROR }} | {
|
$prefix {{ CMD }} --mode={{ MODE }} --variant=apt --skip=output/dev {{ DIST }} - {{ MIRROR }} | {
|
||||||
tar -t;
|
tar -t
|
||||||
echo ./dev/console;
|
echo ./dev/console
|
||||||
echo ./dev/fd;
|
echo ./dev/fd
|
||||||
echo ./dev/full;
|
echo ./dev/full
|
||||||
echo ./dev/null;
|
echo ./dev/null
|
||||||
echo ./dev/ptmx;
|
echo ./dev/ptmx
|
||||||
echo ./dev/pts/;
|
echo ./dev/pts/
|
||||||
echo ./dev/random;
|
echo ./dev/random
|
||||||
echo ./dev/shm/;
|
echo ./dev/shm/
|
||||||
echo ./dev/stderr;
|
echo ./dev/stderr
|
||||||
echo ./dev/stdin;
|
echo ./dev/stdin
|
||||||
echo ./dev/stdout;
|
echo ./dev/stdout
|
||||||
echo ./dev/tty;
|
echo ./dev/tty
|
||||||
echo ./dev/urandom;
|
echo ./dev/urandom
|
||||||
echo ./dev/zero;
|
echo ./dev/zero
|
||||||
} | sort | diff -u tar1.txt -
|
} | sort | diff -u tar1.txt -
|
||||||
|
|
|
@ -18,13 +18,13 @@ fi
|
||||||
# entries in /dev are different depending on whether mknod is available or not
|
# entries in /dev are different depending on whether mknod is available or not
|
||||||
$prefix {{ CMD }} --mode={{ MODE }} --variant=apt --skip=output/mknod \
|
$prefix {{ CMD }} --mode={{ MODE }} --variant=apt --skip=output/mknod \
|
||||||
{{ DIST }} - {{ MIRROR }} | {
|
{{ DIST }} - {{ MIRROR }} | {
|
||||||
tar -t;
|
tar -t
|
||||||
echo ./dev/console;
|
echo ./dev/console
|
||||||
echo ./dev/full;
|
echo ./dev/full
|
||||||
echo ./dev/null;
|
echo ./dev/null
|
||||||
echo ./dev/ptmx;
|
echo ./dev/ptmx
|
||||||
echo ./dev/random;
|
echo ./dev/random
|
||||||
echo ./dev/tty;
|
echo ./dev/tty
|
||||||
echo ./dev/urandom;
|
echo ./dev/urandom
|
||||||
echo ./dev/zero;
|
echo ./dev/zero
|
||||||
} | sort | diff -u tar1.txt -
|
} | sort | diff -u tar1.txt -
|
||||||
|
|
|
@ -6,11 +6,23 @@ mkdir /tmp/root
|
||||||
ln -s /real /tmp/root/link
|
ln -s /real /tmp/root/link
|
||||||
mkdir /tmp/root/real
|
mkdir /tmp/root/real
|
||||||
run_testA() {
|
run_testA() {
|
||||||
echo content > /tmp/foo
|
echo content >/tmp/foo
|
||||||
# shellcheck disable=SC2094
|
# shellcheck disable=SC2094
|
||||||
{ { { {{ CMD }} --hook-helper /tmp/root root setup '' 1 upload /tmp/foo "$1" < /tmp/myfifo 3>&-; echo $? >&3; printf "\\000\\000adios";
|
{
|
||||||
} | {{ CMD }} --hook-listener 1 3>&- >/tmp/myfifo; echo $?; } 3>&1;
|
{
|
||||||
} | { read -r xs1; [ "$xs1" -eq 0 ]; read -r xs2; [ "$xs2" -eq 0 ]; }
|
{
|
||||||
|
{{ CMD }} --hook-helper /tmp/root root setup '' 1 upload /tmp/foo "$1" </tmp/myfifo 3>&-
|
||||||
|
echo $? >&3
|
||||||
|
printf '\000\000adios'
|
||||||
|
} | {{ CMD }} --hook-listener 1 3>&- >/tmp/myfifo
|
||||||
|
echo $?
|
||||||
|
} 3>&1
|
||||||
|
} | {
|
||||||
|
read -r xs1
|
||||||
|
[ "$xs1" -eq 0 ]
|
||||||
|
read -r xs2
|
||||||
|
[ "$xs2" -eq 0 ]
|
||||||
|
}
|
||||||
echo content | diff -u - /tmp/root/real/foo
|
echo content | diff -u - /tmp/root/real/foo
|
||||||
rm /tmp/foo
|
rm /tmp/foo
|
||||||
rm /tmp/root/real/foo
|
rm /tmp/root/real/foo
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
cat << 'SCRIPT' > /tmp/script.sh
|
cat <<'SCRIPT' >/tmp/script.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -eu
|
set -eu
|
||||||
echo "MMDEBSTRAP_APT_CONFIG $MMDEBSTRAP_APT_CONFIG"
|
echo "MMDEBSTRAP_APT_CONFIG $MMDEBSTRAP_APT_CONFIG"
|
||||||
|
|
|
@ -17,27 +17,27 @@ fi
|
||||||
[ "{{ MODE }}" = "fakechroot" ] && prefix="$prefix fakechroot fakeroot"
|
[ "{{ MODE }}" = "fakechroot" ] && prefix="$prefix fakechroot fakeroot"
|
||||||
symlinktarget=/real
|
symlinktarget=/real
|
||||||
[ "{{ MODE }}" = "fakechroot" ] && symlinktarget='$1/real'
|
[ "{{ MODE }}" = "fakechroot" ] && symlinktarget='$1/real'
|
||||||
echo copy-in-setup > /tmp/copy-in-setup
|
echo copy-in-setup >/tmp/copy-in-setup
|
||||||
echo copy-in-essential > /tmp/copy-in-essential
|
echo copy-in-essential >/tmp/copy-in-essential
|
||||||
echo copy-in-customize > /tmp/copy-in-customize
|
echo copy-in-customize >/tmp/copy-in-customize
|
||||||
echo tar-in-setup > /tmp/tar-in-setup
|
echo tar-in-setup >/tmp/tar-in-setup
|
||||||
echo tar-in-essential > /tmp/tar-in-essential
|
echo tar-in-essential >/tmp/tar-in-essential
|
||||||
echo tar-in-customize > /tmp/tar-in-customize
|
echo tar-in-customize >/tmp/tar-in-customize
|
||||||
tar --numeric-owner --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime -C /tmp -cf /tmp/tar-in-setup.tar tar-in-setup
|
tar --numeric-owner --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime -C /tmp -cf /tmp/tar-in-setup.tar tar-in-setup
|
||||||
tar --numeric-owner --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime -C /tmp -cf /tmp/tar-in-essential.tar tar-in-essential
|
tar --numeric-owner --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime -C /tmp -cf /tmp/tar-in-essential.tar tar-in-essential
|
||||||
tar --numeric-owner --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime -C /tmp -cf /tmp/tar-in-customize.tar tar-in-customize
|
tar --numeric-owner --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime -C /tmp -cf /tmp/tar-in-customize.tar tar-in-customize
|
||||||
rm /tmp/tar-in-setup
|
rm /tmp/tar-in-setup
|
||||||
rm /tmp/tar-in-essential
|
rm /tmp/tar-in-essential
|
||||||
rm /tmp/tar-in-customize
|
rm /tmp/tar-in-customize
|
||||||
echo upload-setup > /tmp/upload-setup
|
echo upload-setup >/tmp/upload-setup
|
||||||
echo upload-essential > /tmp/upload-essential
|
echo upload-essential >/tmp/upload-essential
|
||||||
echo upload-customize > /tmp/upload-customize
|
echo upload-customize >/tmp/upload-customize
|
||||||
mkdir /tmp/sync-in-setup
|
mkdir /tmp/sync-in-setup
|
||||||
mkdir /tmp/sync-in-essential
|
mkdir /tmp/sync-in-essential
|
||||||
mkdir /tmp/sync-in-customize
|
mkdir /tmp/sync-in-customize
|
||||||
echo sync-in-setup > /tmp/sync-in-setup/file
|
echo sync-in-setup >/tmp/sync-in-setup/file
|
||||||
echo sync-in-essential > /tmp/sync-in-essential/file
|
echo sync-in-essential >/tmp/sync-in-essential/file
|
||||||
echo sync-in-customize > /tmp/sync-in-customize/file
|
echo sync-in-customize >/tmp/sync-in-customize/file
|
||||||
$prefix {{ CMD }} --mode={{ MODE }} --variant=apt \
|
$prefix {{ CMD }} --mode={{ MODE }} --variant=apt \
|
||||||
--setup-hook='mkdir "$1/real"' \
|
--setup-hook='mkdir "$1/real"' \
|
||||||
--setup-hook='copy-in /tmp/copy-in-setup /real' \
|
--setup-hook='copy-in /tmp/copy-in-setup /real' \
|
||||||
|
|
|
@ -5,14 +5,14 @@ if [ ! -e /mmdebstrap-testenv ]; then
|
||||||
echo "this test modifies the system and should only be run inside a container" >&2
|
echo "this test modifies the system and should only be run inside a container" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
cat << HOSTS >> /etc/hosts
|
cat <<HOSTS >>/etc/hosts
|
||||||
127.0.0.1 deb.debian.org
|
127.0.0.1 deb.debian.org
|
||||||
127.0.0.1 security.debian.org
|
127.0.0.1 security.debian.org
|
||||||
HOSTS
|
HOSTS
|
||||||
apt-cache policy
|
apt-cache policy
|
||||||
cat /etc/apt/sources.list
|
cat /etc/apt/sources.list
|
||||||
{{ CMD }} --mode=root --variant=apt stable /tmp/debian-chroot
|
{{ CMD }} --mode=root --variant=apt stable /tmp/debian-chroot
|
||||||
cat << SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list
|
cat <<SOURCES | cmp /tmp/debian-chroot/etc/apt/sources.list
|
||||||
deb http://deb.debian.org/debian stable main
|
deb http://deb.debian.org/debian stable main
|
||||||
deb http://deb.debian.org/debian stable-updates main
|
deb http://deb.debian.org/debian stable-updates main
|
||||||
deb http://security.debian.org/debian-security stable-security main
|
deb http://security.debian.org/debian-security stable-security main
|
||||||
|
|
|
@ -1,58 +1,111 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -eu
|
set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
if [ ! -e /mmdebstrap-testenv ]; then
|
|
||||||
echo "this test modifies the system and should only be run inside a container" >&2
|
trap "rm -f /tmp/mkpaxtar.pl /tmp/orig.tar /tmp/file /tmp/expected /tmp/filtered.tar" EXIT INT TERM
|
||||||
exit 1
|
|
||||||
fi
|
cat <<'END' >/tmp/mkpaxtar.pl
|
||||||
trap "rm -f /tmp/debian-chroot.tar /tmp/debian-chroot-shifted.tar /tmp/debian-chroot.txt /tmp/debian-chroot-shiftedback.tar /tmp/expected; rm -rf /tmp/debian-chroot" EXIT INT TERM
|
#!/usr/bin/env perl
|
||||||
useradd --home-dir /home/user --create-home user
|
|
||||||
echo user:100000:65536 | cmp /etc/subuid -
|
use strict;
|
||||||
echo user:100000:65536 | cmp /etc/subgid -
|
use warnings;
|
||||||
# include iputils-ping so that we can verify that tarfilter does not remove
|
|
||||||
# extended attributes
|
my @entries = (
|
||||||
# run through tarshift no-op to create a tarball that should be bit-by-bit
|
# filename mode type content
|
||||||
# identical to a round trip through "tarfilter --idshift X" and "tarfilter --idshift -X"
|
['./PaxHeaders/file', oct(644), 'x', "57 SCHILY.xattr.security.capability=\x01\0\0\x02\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0a"],
|
||||||
runuser -u user -- {{ CMD }} --mode=unshare --variant=apt --include=iputils-ping {{ DIST }} - {{ MIRROR }} \
|
['./file', oct(644), 0, 'test'],
|
||||||
| ./tarfilter --idshift 0 > /tmp/debian-chroot.tar
|
);
|
||||||
|
|
||||||
|
my $num_entries = 0;
|
||||||
|
|
||||||
|
foreach my $file (@entries) {
|
||||||
|
my ($fname, $mode, $type, $content) = @{$file};
|
||||||
|
my $entry = pack(
|
||||||
|
'a100 a8 a8 a8 a12 a12 A8 a1 a100 a6 a2 a32 a32 a8 a8 a155 x12',
|
||||||
|
$fname,
|
||||||
|
sprintf('%07o', $mode),
|
||||||
|
sprintf('%07o', 0), # uid
|
||||||
|
sprintf('%07o', 0), # gid
|
||||||
|
sprintf('%011o', length $content), # size
|
||||||
|
sprintf('%011o', 0), # mtime
|
||||||
|
'', # checksum
|
||||||
|
$type,
|
||||||
|
'', # linkname
|
||||||
|
"ustar", # magic
|
||||||
|
"00", # version
|
||||||
|
'', # username
|
||||||
|
'', # groupname
|
||||||
|
'', # dev major
|
||||||
|
'', # dev minor
|
||||||
|
'', # prefix
|
||||||
|
);
|
||||||
|
|
||||||
|
# compute and insert checksum
|
||||||
|
substr($entry, 148, 7)
|
||||||
|
= sprintf("%06o\0", unpack("%16C*", $entry));
|
||||||
|
print $entry;
|
||||||
|
$num_entries += 1;
|
||||||
|
|
||||||
|
if (length $content) {
|
||||||
|
print(pack 'a512', $content);
|
||||||
|
$num_entries += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# https://www.gnu.org/software/tar/manual/html_node/Standard.html
|
||||||
|
#
|
||||||
|
# Physically, an archive consists of a series of file entries terminated by an
|
||||||
|
# end-of-archive entry, which consists of two 512 blocks of zero bytes. At the
|
||||||
|
# end of the archive file there are two 512-byte blocks filled with binary
|
||||||
|
# zeros as an end-of-file marker.
|
||||||
|
|
||||||
|
print(pack 'a512', '');
|
||||||
|
print(pack 'a512', '');
|
||||||
|
$num_entries += 2;
|
||||||
|
|
||||||
|
# https://www.gnu.org/software/tar/manual/html_section/tar_76.html
|
||||||
|
#
|
||||||
|
# Some devices requires that all write operations be a multiple of a certain
|
||||||
|
# size, and so, tar pads the archive out to the next record boundary.
|
||||||
|
#
|
||||||
|
# The default blocking factor is 20. With a block size of 512 bytes, we get a
|
||||||
|
# record size of 10240.
|
||||||
|
|
||||||
|
for (my $i = $num_entries ; $i < 20 ; $i++) {
|
||||||
|
print(pack 'a512', '');
|
||||||
|
}
|
||||||
|
END
|
||||||
|
|
||||||
|
MMTARFILTER=
|
||||||
|
[ -x /usr/bin/mmtarfilter ] && MMTARFILTER=/usr/bin/mmtarfilter
|
||||||
|
[ -x ./tarfilter ] && MMTARFILTER=./tarfilter
|
||||||
|
|
||||||
|
perl /tmp/mkpaxtar.pl | "$MMTARFILTER" >/tmp/orig.tar
|
||||||
# make sure that xattrs are set in the original tarball
|
# make sure that xattrs are set in the original tarball
|
||||||
mkdir /tmp/debian-chroot
|
tar --xattrs --xattrs-include='*' --directory /tmp/ -xf /tmp/orig.tar ./file
|
||||||
tar --xattrs --xattrs-include='*' --directory /tmp/debian-chroot -xf /tmp/debian-chroot.tar ./usr/bin/ping
|
echo "/tmp/file cap_net_raw=ep" >/tmp/expected
|
||||||
echo "/tmp/debian-chroot/usr/bin/ping cap_net_raw=ep" > /tmp/expected
|
getcap /tmp/file | diff -u /tmp/expected - >&2
|
||||||
getcap /tmp/debian-chroot/usr/bin/ping | diff -u /tmp/expected - >&2
|
# make sure that the file content is as expected
|
||||||
rm /tmp/debian-chroot/usr/bin/ping
|
printf test | diff -u /tmp/file - >&2
|
||||||
rmdir /tmp/debian-chroot/usr/bin
|
# make sure that uid/gid are as expected in the original tarball
|
||||||
rmdir /tmp/debian-chroot/usr
|
echo "0 0 644" >/tmp/expected
|
||||||
rmdir /tmp/debian-chroot
|
stat --format="%u %g %a" /tmp/file | diff -u /tmp/expected - >&2
|
||||||
# shift the uid/gid forward by 100000 and backward by 100000
|
rm /tmp/file
|
||||||
./tarfilter --idshift 100000 < /tmp/debian-chroot.tar > /tmp/debian-chroot-shifted.tar
|
# tarball must be bit by-bit-identical after round-trip
|
||||||
./tarfilter --idshift -100000 < /tmp/debian-chroot-shifted.tar > /tmp/debian-chroot-shiftedback.tar
|
"$MMTARFILTER" --idshift 0 </tmp/orig.tar >/tmp/filtered.tar
|
||||||
# the tarball before and after the roundtrip through tarfilter should be bit
|
cmp /tmp/orig.tar /tmp/filtered.tar
|
||||||
# by bit identical
|
|
||||||
cmp /tmp/debian-chroot.tar /tmp/debian-chroot-shiftedback.tar
|
# now shift uid/gid
|
||||||
# manually adjust uid/gid and compare "tar -t" output
|
"$MMTARFILTER" --idshift 100000 </tmp/orig.tar >/tmp/filtered.tar
|
||||||
tar --numeric-owner -tvf /tmp/debian-chroot.tar \
|
# make sure that uid/gid are as expected in the filtered tarball
|
||||||
| sed 's# 42/0 # 100042/100000 #' \
|
tar --xattrs --xattrs-include='*' --directory /tmp/ -xf /tmp/filtered.tar ./file
|
||||||
| sed 's# 0/0 # 100000/100000 #' \
|
echo "100000 100000 644" >/tmp/expected
|
||||||
| sed 's# 0/5 # 100000/100005 #' \
|
stat --format="%u %g %a" /tmp/file | diff -u /tmp/expected - >&2
|
||||||
| sed 's# 0/8 # 100000/100008 #' \
|
rm /tmp/file
|
||||||
| sed 's# 0/42 # 100000/100042 #' \
|
|
||||||
| sed 's# 0/43 # 100000/100043 #' \
|
# now shift uid/gid back to create a round-trip
|
||||||
| sed 's# 0/50 # 100000/100050 #' \
|
"$MMTARFILTER" --idshift -100000 </tmp/filtered.tar >/tmp/filtered2.tar
|
||||||
| sed 's/ \+/ /g' \
|
|
||||||
> /tmp/debian-chroot.txt
|
# the result must be identical to the original and will thus also include the
|
||||||
tar --numeric-owner -tvf /tmp/debian-chroot-shifted.tar \
|
# correct xattr information
|
||||||
| sed 's/ \+/ /g' \
|
cmp /tmp/orig.tar /tmp/filtered2.tar
|
||||||
| diff -u /tmp/debian-chroot.txt - >&2
|
|
||||||
mkdir /tmp/debian-chroot
|
|
||||||
tar --xattrs --xattrs-include='*' --directory /tmp/debian-chroot -xf /tmp/debian-chroot-shifted.tar
|
|
||||||
echo "100000 100000" > /tmp/expected
|
|
||||||
stat --format="%u %g" /tmp/debian-chroot/usr/bin/ping | diff -u /tmp/expected - >&2
|
|
||||||
echo "/tmp/debian-chroot/usr/bin/ping cap_net_raw=ep" > /tmp/expected
|
|
||||||
getcap /tmp/debian-chroot/usr/bin/ping | diff -u /tmp/expected - >&2
|
|
||||||
echo "0 0" > /tmp/expected
|
|
||||||
runuser -u user -- {{ CMD }} --unshare-helper /usr/sbin/chroot /tmp/debian-chroot stat --format="%u %g" /usr/bin/ping \
|
|
||||||
| diff -u /tmp/expected - >&2
|
|
||||||
echo "/usr/bin/ping cap_net_raw=ep" > /tmp/expected
|
|
||||||
runuser -u user -- {{ CMD }} --unshare-helper /usr/sbin/chroot /tmp/debian-chroot getcap /usr/bin/ping \
|
|
||||||
| diff -u /tmp/expected - >&2
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ set -eu
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
[ "$(whoami)" = "root" ]
|
[ "$(whoami)" = "root" ]
|
||||||
trap "rm -f /tmp/debian-chroot.tar script.sh" EXIT INT TERM
|
trap "rm -f /tmp/debian-chroot.tar script.sh" EXIT INT TERM
|
||||||
cat << 'SCRIPT' > script.sh
|
cat <<'SCRIPT' >script.sh
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -eu
|
set -eu
|
||||||
rootfs="$1"
|
rootfs="$1"
|
||||||
|
|
|
@ -23,7 +23,7 @@ fi
|
||||||
# otherwise apt might decide to download the package with the same name and
|
# otherwise apt might decide to download the package with the same name and
|
||||||
# version from the cache instead of using the local .deb
|
# version from the cache instead of using the local .deb
|
||||||
mkdir -p /tmp/dummypkg/DEBIAN
|
mkdir -p /tmp/dummypkg/DEBIAN
|
||||||
cat << END > "/tmp/dummypkg/DEBIAN/control"
|
cat <<END >"/tmp/dummypkg/DEBIAN/control"
|
||||||
Package: dummypkg
|
Package: dummypkg
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Section: oldlibs
|
Section: oldlibs
|
||||||
|
|
|
@ -7,7 +7,7 @@ trap "rm -f /tmp/debian-chroot.tar" EXIT INT TERM
|
||||||
|
|
||||||
# we use variant standard in verbose mode to see the maximum number of packages
|
# we use variant standard in verbose mode to see the maximum number of packages
|
||||||
# that was chosen in case of USE_HOST_APT_CONFIG=yes
|
# that was chosen in case of USE_HOST_APT_CONFIG=yes
|
||||||
case {{ VARIANT }} in standard) : ;; *) exit 1;; esac
|
case {{ VARIANT }} in standard) : ;; *) exit 1 ;; esac
|
||||||
|
|
||||||
{{ CMD }} --variant={{ VARIANT }} --verbose {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
{{ CMD }} --variant={{ VARIANT }} --verbose {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,8 @@ fi
|
||||||
trap "rm -f /tmp/debian-chroot.tar" EXIT INT TERM
|
trap "rm -f /tmp/debian-chroot.tar" EXIT INT TERM
|
||||||
rm /etc/resolv.conf /etc/hostname
|
rm /etc/resolv.conf /etc/hostname
|
||||||
{{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
{{ CMD }} --mode={{ MODE }} --variant=apt {{ DIST }} /tmp/debian-chroot.tar {{ MIRROR }}
|
||||||
{ tar -tf /tmp/debian-chroot.tar;
|
{
|
||||||
printf "./etc/hostname\n";
|
tar -tf /tmp/debian-chroot.tar
|
||||||
printf "./etc/resolv.conf\n";
|
printf "./etc/hostname\n"
|
||||||
|
printf "./etc/resolv.conf\n"
|
||||||
} | sort | diff -u tar1.txt -
|
} | sort | diff -u tar1.txt -
|
||||||
|
|
|
@ -28,11 +28,10 @@ $prefix {{ CMD }} --mode={{ MODE }} --variant=apt \
|
||||||
--customize-hook='chroot "$1" sh -c "sleep 1m > /dev/null" &' \
|
--customize-hook='chroot "$1" sh -c "sleep 1m > /dev/null" &' \
|
||||||
{{ DIST }} - {{ MIRROR }} \
|
{{ DIST }} - {{ MIRROR }} \
|
||||||
| "$MMTARFILTER" --path-exclude="/dev" \
|
| "$MMTARFILTER" --path-exclude="/dev" \
|
||||||
> /tmp/debian-chroot.tar
|
>/tmp/debian-chroot.tar
|
||||||
|
|
||||||
origfilter() {
|
origfilter() {
|
||||||
< ./cache/mmdebstrap-{{ DIST }}-apt.tar \
|
"$MMTARFILTER" <./cache/mmdebstrap-{{ DIST }}-apt.tar --path-exclude="/dev/*" --path-exclude="/dev"
|
||||||
"$MMTARFILTER" --path-exclude="/dev/*" --path-exclude="/dev"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
origfilter | cmp - /tmp/debian-chroot.tar \
|
origfilter | cmp - /tmp/debian-chroot.tar \
|
||||||
|
|
Loading…
Reference in a new issue