mirror of
https://github.com/nix-community/nix-on-droid.git
synced 2025-11-08 11:36:07 +01:00
tests: increase robustness of fakedroid.sh
This commit is contained in:
parent
274bb4babd
commit
7cea00a1c7
1 changed files with 64 additions and 58 deletions
|
|
@ -8,73 +8,78 @@
|
|||
|
||||
set -ueo pipefail
|
||||
|
||||
QEMU_URL=https://github.com/multiarch/qemu-user-static/releases/download/v6.1.0-8/qemu-aarch64-static
|
||||
QEMU=.fakedroid/inj/qemu-aarch64
|
||||
INSTALLATION_DIR=/data/data/com.termux.nix/files/usr
|
||||
TARGET_HOME=/data/data/com.termux.nix/files/home
|
||||
REPO_DIR="$(dirname "$(dirname "$(readlink -f "$0")")")"
|
||||
INJ_DIR="$REPO_DIR/.fakedroid/inj"
|
||||
ENV_DIR="$REPO_DIR/.fakedroid/env"
|
||||
|
||||
mkdir -p .fakedroid/inj
|
||||
mkdir -p .fakedroid/env/{$INSTALLATION_DIR,$TARGET_HOME,n-o-d}
|
||||
QEMU_URL="https://github.com/multiarch/qemu-user-static/releases/download/v6.1.0-8/qemu-aarch64-static"
|
||||
QEMU="$INJ_DIR/qemu-aarch64"
|
||||
|
||||
export PROOT_TMP_DIR=.fakedroid/env/$INSTALLATION_DIR/proot/tmp
|
||||
export PROOT_L2S_DIR=.fakedroid/env/$INSTALLATION_DIR/proot/l2s
|
||||
mkdir -p $PROOT_TMP_DIR
|
||||
mkdir -p $PROOT_L2S_DIR
|
||||
INSTALLATION_DIR="/data/data/com.termux.nix/files/usr"
|
||||
TARGET_HOME="/data/data/com.termux.nix/files/home"
|
||||
|
||||
PASSTHROUGH_VARS=''
|
||||
PASSTHROUGH_VARS+=" PROOT_TMP_DIR=$PROOT_TMP_DIR"
|
||||
PASSTHROUGH_VARS+=" PROOT_L2S_DIR=$PROOT_L2S_DIR"
|
||||
PASSTHROUGH_VARS+=" TERM=$TERM"
|
||||
PASSTHROUGH_VARS+=" HOME=$TARGET_HOME"
|
||||
PASSTHROUGH_VARS+=" USER=$USER"
|
||||
set +u
|
||||
[[ -n "$CACHIX_SIGNING_KEY" ]] && \
|
||||
PASSTHROUGH_VARS+=" CACHIX_SIGNING_KEY=$CACHIX_SIGNING_KEY"
|
||||
set -u
|
||||
mkdir -p "$INJ_DIR"
|
||||
mkdir -p "$ENV_DIR/"{"$INSTALLATION_DIR","$TARGET_HOME",n-o-d}
|
||||
|
||||
PROOT_ARGS=''
|
||||
PROOT_ARGS+=' -r .fakedroid/env'
|
||||
PROOT_ARGS+=" -q $QEMU"
|
||||
PROOT_ARGS+=" -w $TARGET_HOME"
|
||||
PROOT_ARGS+=" -b .fakedroid/env/$INSTALLATION_DIR/nix:/nix"
|
||||
PROOT_ARGS+=" -b .fakedroid/env/$INSTALLATION_DIR/bin:/bin"
|
||||
PROOT_ARGS+=" -b .fakedroid/env/$INSTALLATION_DIR/etc:/etc"
|
||||
PROOT_ARGS+=" -b .fakedroid/env/$INSTALLATION_DIR/tmp:/tmp"
|
||||
PROOT_ARGS+=" -b .fakedroid/env/$INSTALLATION_DIR/usr:/usr"
|
||||
PROOT_ARGS+=' -b /dev'
|
||||
PROOT_ARGS+=' -b /proc'
|
||||
PROOT_ARGS+=' -b /sys'
|
||||
PROOT_ARGS+=' --link2symlink'
|
||||
export PROOT_TMP_DIR="$ENV_DIR/$INSTALLATION_DIR/proot/tmp"
|
||||
export PROOT_L2S_DIR="$ENV_DIR/$INSTALLATION_DIR/proot/l2s"
|
||||
mkdir -p "$PROOT_TMP_DIR" "$PROOT_L2S_DIR"
|
||||
|
||||
PASSTHROUGH_VARS=(
|
||||
"PROOT_TMP_DIR=$PROOT_TMP_DIR"
|
||||
"PROOT_L2S_DIR=$PROOT_L2S_DIR"
|
||||
"TERM=$TERM"
|
||||
"HOME=$TARGET_HOME"
|
||||
"USER=$USER"
|
||||
)
|
||||
|
||||
[[ -n "${CACHIX_SIGNING_KEY:-}" ]] && \
|
||||
PASSTHROUGH_VARS+=("CACHIX_SIGNING_KEY=$CACHIX_SIGNING_KEY")
|
||||
|
||||
PROOT_ARGS=(
|
||||
"-r" "$ENV_DIR"
|
||||
"-q" "$QEMU"
|
||||
"-w" "$TARGET_HOME"
|
||||
"-b" "$ENV_DIR/$INSTALLATION_DIR/nix:/nix"
|
||||
"-b" "$ENV_DIR/$INSTALLATION_DIR/bin:/bin"
|
||||
"-b" "$ENV_DIR/$INSTALLATION_DIR/etc:/etc"
|
||||
"-b" "$ENV_DIR/$INSTALLATION_DIR/tmp:/tmp"
|
||||
"-b" "$ENV_DIR/$INSTALLATION_DIR/usr:/usr"
|
||||
"-b" "/dev"
|
||||
"-b" "/proc"
|
||||
"-b" "/sys"
|
||||
"--link2symlink"
|
||||
)
|
||||
|
||||
|
||||
# Procure a static QEMU for user emulation and a proot with our patches:
|
||||
|
||||
[[ -e .fakedroid/inj/qemu-aarch64 ]] || wget $QEMU_URL -O $QEMU
|
||||
chmod +x $QEMU
|
||||
[[ -e "$QEMU" ]] || wget "$QEMU_URL" -O "$QEMU"
|
||||
chmod +x "$QEMU"
|
||||
|
||||
PROOT=$(nix-build --no-out-link tests/proot-test.nix)/bin/proot
|
||||
PROOT="$(nix-build --no-out-link tests/proot-test.nix)/bin/proot"
|
||||
|
||||
|
||||
# Do the first install if not installed yet:
|
||||
|
||||
if [[ ! -e .fakedroid/env/$INSTALLATION_DIR/etc ||
|
||||
-e .fakedroid/env/$INSTALLATION_DIR/etc/UNINITIALIZED ]]; then
|
||||
if [[ ! -e "$ENV_DIR/$INSTALLATION_DIR/etc" ||
|
||||
-e "$ENV_DIR/$INSTALLATION_DIR/etc/UNINITIALIZED" ]]; then
|
||||
# Build a zipball:
|
||||
nix build --show-trace -f pkgs \
|
||||
--argstr arch aarch64 \
|
||||
--argstr nixOnDroidChannelURL file:///n-o-d/archive.tar.gz \
|
||||
bootstrapZip -o .fakedroid/inj/nix-on-droid-aarch64
|
||||
ZIPBALL=$(realpath .fakedroid/inj/nix-on-droid-aarch64/bootstrap-aarch64.zip)
|
||||
bootstrapZip -o "$INJ_DIR/nix-on-droid-aarch64"
|
||||
ZIPBALL="$(realpath "$INJ_DIR/nix-on-droid-aarch64/bootstrap-aarch64.zip")"
|
||||
# Unpack the zipball the way the Android app does it:
|
||||
pushd .fakedroid/env/$INSTALLATION_DIR
|
||||
pushd "$ENV_DIR/$INSTALLATION_DIR"
|
||||
unzip "$ZIPBALL"
|
||||
chmod -R u+rw . # unzip results in -r-xr-xr-x files and directories
|
||||
while read e; do
|
||||
SYM_TGT=${e%%←*}
|
||||
SYM_SRC=${e##*←}
|
||||
while read -r e; do
|
||||
SYM_TGT="${e%%←*}"
|
||||
SYM_SRC="${e##*←}"
|
||||
ln -sf "$SYM_TGT" "$SYM_SRC"
|
||||
done < SYMLINKS.txt
|
||||
while read e; do
|
||||
while read -r e; do
|
||||
chmod +x "$e"
|
||||
done < EXECUTABLES.txt
|
||||
rm SYMLINKS.txt EXECUTABLES.txt
|
||||
|
|
@ -86,30 +91,31 @@ fi
|
|||
# Uncommitted chages won't be picked up, just HEAD.
|
||||
# /n-o-d/archive.tar.gz is used as a channel, /n-o-d/unpacked --- as a flake.
|
||||
|
||||
rm -rf .fakedroid/env/n-o-d; mkdir -p .fakedroid/env/n-o-d/unpacked
|
||||
git archive --format=tar --prefix n-o-d/ HEAD \
|
||||
> .fakedroid/env/n-o-d/archive.tar
|
||||
rm -rf "$ENV_DIR/n-o-d"
|
||||
mkdir -p "$ENV_DIR/n-o-d/unpacked"
|
||||
git -C "$REPO_DIR" archive --format=tar --prefix n-o-d/ HEAD \
|
||||
> "$ENV_DIR/n-o-d/archive.tar"
|
||||
tar --strip-components=1 -xf \
|
||||
.fakedroid/env/n-o-d/archive.tar -C .fakedroid/env/n-o-d/unpacked
|
||||
gzip .fakedroid/env/n-o-d/archive.tar
|
||||
"$ENV_DIR/n-o-d/archive.tar" -C "$ENV_DIR/n-o-d/unpacked"
|
||||
gzip "$ENV_DIR/n-o-d/archive.tar"
|
||||
|
||||
|
||||
# The 'first boot' proot invocation:
|
||||
|
||||
SH=$(readlink .fakedroid/env/$INSTALLATION_DIR/bin/sh)
|
||||
SH="$(readlink "$ENV_DIR/$INSTALLATION_DIR/bin/sh")"
|
||||
|
||||
# 'first boot' execs interactive bash unconditionally;
|
||||
# makes sense on device, requires us to work around it here though
|
||||
env -i $PASSTHROUGH_VARS $PROOT $PROOT_ARGS \
|
||||
$INSTALLATION_DIR/$SH ${INSTALLATION_DIR}/usr/lib/login-inner <<<'echo OK'
|
||||
env -i "${PASSTHROUGH_VARS[@]}" "$PROOT" "${PROOT_ARGS[@]}" \
|
||||
"$INSTALLATION_DIR/$SH" "${INSTALLATION_DIR}/usr/lib/login-inner" <<<'echo OK'
|
||||
|
||||
# this is usually done by login on 'first reboot'
|
||||
[[ -e .fakedroid/env/${INSTALLATION_DIR}/usr/lib/.login-inner.new ]] &&
|
||||
mv .fakedroid/env/${INSTALLATION_DIR}/usr/lib/.login-inner.new \
|
||||
.fakedroid/env/${INSTALLATION_DIR}/usr/lib/login-inner
|
||||
[[ -e "$ENV_DIR/$INSTALLATION_DIR/usr/lib/.login-inner.new" ]] &&
|
||||
mv "$ENV_DIR/$INSTALLATION_DIR/usr/lib/.login-inner.new" \
|
||||
"$ENV_DIR/${INSTALLATION_DIR}/usr/lib/login-inner"
|
||||
|
||||
|
||||
# Actually execute something inside that fakedroid environment:
|
||||
|
||||
exec env -i $PASSTHROUGH_VARS $PROOT $PROOT_ARGS \
|
||||
$INSTALLATION_DIR/$SH ${INSTALLATION_DIR}/usr/lib/login-inner "$@"
|
||||
env -i "${PASSTHROUGH_VARS[@]}" "$PROOT" "${PROOT_ARGS[@]}" \
|
||||
"$INSTALLATION_DIR/$SH" "$INSTALLATION_DIR/usr/lib/login-inner" "$@"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue