diff --git a/android/Dockerfile b/android/Dockerfile index ac119a9..bd7bfe3 100644 --- a/android/Dockerfile +++ b/android/Dockerfile @@ -1,11 +1,4 @@ -FROM runmymind/docker-android-sdk:ubuntu-standalone-20230511 - -ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/android-sdk-linux/cmdline-tools/latest/bin:/opt/android-sdk-linux/cmdline-tools/tools/bin:/opt/android-sdk-linux/tools/bin:/opt/android-sdk-linux/build-tools/32.0.0:/opt/android-sdk-linux/platform-tools:/opt/android-sdk-linux/emulator:/opt/android-sdk-linux/bin - -RUN sdkmanager "system-images;android-33;google_apis;x86_64" -RUN echo no | avdmanager create avd -n virtual_dev -b google_apis/x86_64 -k "system-images;android-33;google_apis;x86_64" - -RUN apt-get update && apt-get install -y iproute2 iputils-ping iptables redsocks npm git +FROM pre_android/ready EXPOSE 3000 diff --git a/android/conf/docker-entrypoint.sh b/android/conf/docker-entrypoint.sh index 1470691..ea68137 100644 --- a/android/conf/docker-entrypoint.sh +++ b/android/conf/docker-entrypoint.sh @@ -1,14 +1,8 @@ -hashed_name=`openssl x509 -inform PEM -subject_hash_old -in /ca-cert.cer | head -1` - -emulator -avd virtual_dev -writable-system -no-window -no-audio & +bash /conf/start_culebra.sh npm i -C /code -cp /ca-cert.cer /$hashed_name.0 -bash /conf/install_cert.sh $hashed_name.0 -bash /conf/install_culebra.sh bash /conf/iptables_conf.sh redsocks -c /conf/redsocks.conf & bash /conf/wait_for_sd.sh -#wait for cert to be installed before launching socket server node /code/index.js #tail -f /dev/null diff --git a/android/conf/start_culebra.sh b/android/conf/start_culebra.sh new file mode 100644 index 0000000..6ceeda8 --- /dev/null +++ b/android/conf/start_culebra.sh @@ -0,0 +1,15 @@ +rm -f /opt/android-sdk-linux/.android/avd/virtual_dev.avd/*.lock +adb start-server +emulator -avd virtual_dev -writable-system -no-window -no-audio & +adb wait-for-device +adb emu avd snapshot load configured +adb wait-for-device + +export PATH=$PATH:/root/culebraDependencies +cd /root/culebra +./culebratester2 start-server & + +#wait for the server to start +while ! curl http://localhost:9987/v2/uiDevice/screenshot > /dev/null 2> /dev/null; do + sleep 0.1 +done \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 100ac93..3481d48 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -20,7 +20,6 @@ services: - rent_gen_android volumes: - $PWD/android/conf:/conf - - $PWD/certificates/mitmproxy-ca-cert.cer:/ca-cert.cer - $PWD/android/code:/code http_server: build: ./http_server/ diff --git a/pre_android/Dockerfile b/pre_android/Dockerfile new file mode 100644 index 0000000..4789670 --- /dev/null +++ b/pre_android/Dockerfile @@ -0,0 +1,10 @@ +FROM runmymind/docker-android-sdk:ubuntu-standalone-20230511 + +ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/android-sdk-linux/cmdline-tools/latest/bin:/opt/android-sdk-linux/cmdline-tools/tools/bin:/opt/android-sdk-linux/tools/bin:/opt/android-sdk-linux/build-tools/32.0.0:/opt/android-sdk-linux/platform-tools:/opt/android-sdk-linux/emulator:/opt/android-sdk-linux/bin + +RUN sdkmanager "system-images;android-33;google_apis;x86_64" +RUN echo no | avdmanager create avd -n virtual_dev -b google_apis/x86_64 -k "system-images;android-33;google_apis;x86_64" + +RUN apt-get update && apt-get install -y iproute2 iputils-ping iptables redsocks npm git + +CMD bash /preconf/docker-entrypoint.sh diff --git a/pre_android/preconf/docker-entrypoint.sh b/pre_android/preconf/docker-entrypoint.sh new file mode 100644 index 0000000..6cfe71c --- /dev/null +++ b/pre_android/preconf/docker-entrypoint.sh @@ -0,0 +1,15 @@ +hashed_name=`openssl x509 -inform PEM -subject_hash_old -in /ca-cert.cer | head -1` + +adb start-server +emulator -avd virtual_dev -writable-system -no-window -no-audio & +cp /ca-cert.cer /$hashed_name.0 +bash /preconf/install_cert.sh $hashed_name.0 +bash /preconf/install_culebra.sh + +adb emu avd snapshot save configured + +adb emu kill +#to let the host know it finished installing +install -m 777 /dev/null /preconf/finished + +tail -f /dev/null \ No newline at end of file diff --git a/android/conf/install_cert.sh b/pre_android/preconf/install_cert.sh similarity index 100% rename from android/conf/install_cert.sh rename to pre_android/preconf/install_cert.sh diff --git a/android/conf/install_culebra.sh b/pre_android/preconf/install_culebra.sh similarity index 58% rename from android/conf/install_culebra.sh rename to pre_android/preconf/install_culebra.sh index 336d1a1..fde18d5 100644 --- a/android/conf/install_culebra.sh +++ b/pre_android/preconf/install_culebra.sh @@ -1,3 +1,4 @@ +adb wait-for-device cd /root git clone https://github.com/dtmilano/CulebraTester2-public culebra git clone https://gist.github.com/dtmilano/4537110 culebraDependencies @@ -6,10 +7,4 @@ export PATH=$PATH:/root/culebraDependencies cd culebra git checkout 4ce1987e7ec6ae627d8f33a1a3b59f684aff90c0 echo "/opt/android-sdk-linux" >> local.properties -./gradlew installDebug installDebugAndroidTest -./culebratester2 start-server & - -#wait for the server to start -while ! curl http://localhost:9987/v2/uiDevice/screenshot > /dev/null 2> /dev/null; do - sleep 0.1 -done \ No newline at end of file +./culebratester2 install \ No newline at end of file diff --git a/start.mjs b/start.mjs index c86e5e3..1e6ee3e 100644 --- a/start.mjs +++ b/start.mjs @@ -1,5 +1,9 @@ import { promises as fs } from "fs"; +async function sleep(time) { + return new Promise((resolve) => setTimeout(resolve, time)); +} + async function checkCertExistance() { return await Promise.all([ fs.access("./certificates/mitmproxy-ca-cert.cer", fs.constants.R_OK), @@ -34,7 +38,33 @@ async function generateCert() { } //kill docker container - await $`docker stop certGenerator`; + $`docker stop certGenerator`; +} + +async function generatePreAndroid() { + await $`docker build -t pre_android pre_android`; + $`docker run --rm -v $PWD/certificates/mitmproxy-ca-cert.cer:/ca-cert.cer -v $PWD/pre_android/preconf:/preconf --device=/dev/kvm --name pre_android_cont pre_android &`; + + console.log( + "installing tls certificate and culebra into the android pre-image" + ); + //the way of knowing when the culebra install is creating a file in the shared volume + let finished = false; + while (!finished) { + try { + await fs.access( + "./pre_android/preconf/finished", + fs.constants.R_OK + ), + $`rm -f ./pre_android/preconf/finished`; + finished = true; + } catch { + await sleep(100); + } + } + + await $`docker commit pre_android_cont pre_android/ready`; + $`docker stop pre_android_cont`; } if (process.argv.length !== 4) throw new Error("expected an argument"); @@ -44,9 +74,21 @@ else if (process.argv[3] === "up") { } catch { await generateCert(); } + + try { + await $`docker image inspect pre_android/ready > /dev/null 2> /dev/null`; + } catch { + await generatePreAndroid(); + } + await $`docker compose build`; await $`docker compose up`; } else if (process.argv[3] === "down") await $`docker compose down`; else if (process.argv[3] === "generateCert") { generateCert(); -} else throw new Error("expected [up | down | generateCert ] as argument"); +} else if (process.argv[3] === "generatePreAndroid") { + generatePreAndroid(); +} else + throw new Error( + "expected [up | down | generateCert | generatePreAndroid ] as argument" + );