diff --git a/package-lock.json b/package-lock.json index 3b303bf8c..8e2797c4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,6 @@ "@types/url-parse": "^1.4.11", "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", - "com.foxdebug.acode.rk.exec.proot": "file:src/plugins/proot", "com.foxdebug.acode.rk.exec.terminal": "file:src/plugins/terminal", "cordova-android": "^13.0.0", "cordova-clipboard": "^1.3.0", @@ -4083,10 +4082,6 @@ "dev": true, "license": "MIT" }, - "node_modules/com.foxdebug.acode.rk.exec.proot": { - "resolved": "src/plugins/proot", - "link": true - }, "node_modules/com.foxdebug.acode.rk.exec.terminal": { "resolved": "src/plugins/terminal", "link": true @@ -10910,7 +10905,7 @@ "src/plugins/proot": { "name": "com.foxdebug.acode.rk.exec.proot", "version": "1.0.0", - "dev": true, + "extraneous": true, "license": "MIT" }, "src/plugins/sdcard": { diff --git a/package.json b/package.json index b88b6fd04..3f77cacc4 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ }, "cordova-plugin-websocket": {}, "cordova-plugin-buildinfo": {}, - "com.foxdebug.acode.rk.exec.proot": {}, "cordova-plugin-system": {}, "com.foxdebug.acode.rk.exec.terminal": {} }, @@ -64,7 +63,6 @@ "@types/url-parse": "^1.4.11", "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", - "com.foxdebug.acode.rk.exec.proot": "file:src/plugins/proot", "com.foxdebug.acode.rk.exec.terminal": "file:src/plugins/terminal", "cordova-android": "^13.0.0", "cordova-clipboard": "^1.3.0", diff --git a/src/plugins/terminal/scripts/init-alpine.sh b/src/plugins/terminal/scripts/init-alpine.sh index 07e0828ec..f67be7489 100644 --- a/src/plugins/terminal/scripts/init-alpine.sh +++ b/src/plugins/terminal/scripts/init-alpine.sh @@ -33,6 +33,7 @@ fi ln -sf /bin/bash /bin/login if [ "$1" = "--installing" ]; then + mkdir -p $PREFIX/.configured echo "Installation completed." exit 0 fi diff --git a/src/plugins/terminal/scripts/init-sandbox.sh b/src/plugins/terminal/scripts/init-sandbox.sh index 538e02738..111dc2b0c 100644 --- a/src/plugins/terminal/scripts/init-sandbox.sh +++ b/src/plugins/terminal/scripts/init-sandbox.sh @@ -1,25 +1,35 @@ export LD_LIBRARY_PATH=$PREFIX export PROOT_TMP_DIR=$PREFIX/tmp +mkdir -p "$PREFIX/tmp" -if [ -f "$NATIVE_DIR/libproot.so" ]; then - export PROOT_LOADER="$NATIVE_DIR/libproot.so" -fi +if [ "$FDROID" = "true" ]; then -if [ -f "$NATIVE_DIR/libproot32.so" ]; then - export PROOT_LOADER32="$NATIVE_DIR/libproot32.so" -fi + if [ -f "$PREFIX/libproot.so" ]; then + export PROOT_LOADER="$PREFIX/libproot.so" + fi + + if [ -f "$PREFIX/libproot32.so" ]; then + export PROOT_LOADER32="$PREFIX/libproot32.so" + fi -mkdir -p "$PREFIX/tmp" -if [ "$FDROID" = "true" ]; then export PROOT="$PREFIX/libproot-xed.so" - chmod +x $PROOT - chmod +x $PREFIX/libtalloc.so.2 + chmod +x $PREFIX/* else + if [ -f "$NATIVE_DIR/libproot.so" ]; then + export PROOT_LOADER="$NATIVE_DIR/libproot.so" + fi + + if [ -f "$NATIVE_DIR/libproot32.so" ]; then + export PROOT_LOADER32="$NATIVE_DIR/libproot32.so" + fi + + if [ -e "$PREFIX/libtalloc.so.2" ] || [ -L "$PREFIX/libtalloc.so.2" ]; then rm "$PREFIX/libtalloc.so.2" fi + ln -s "$NATIVE_DIR/libtalloc.so" "$PREFIX/libtalloc.so.2" export PROOT="$NATIVE_DIR/libproot-xed.so" fi diff --git a/src/plugins/terminal/www/Terminal.js b/src/plugins/terminal/www/Terminal.js index c359d9c72..cf05ddb8b 100644 --- a/src/plugins/terminal/www/Terminal.js +++ b/src/plugins/terminal/www/Terminal.js @@ -91,9 +91,15 @@ const Terminal = { * @returns {Promise} - Returns true if installation completes with exit code 0 */ async install(logger = console.log, err_logger = console.error) { - if (await this.isInstalled()) return true; if (!(await this.isSupported())) return false; + try { + //cleanup before insatll + await this.uninstall(); + } catch (e) { + //supress error + } + const filesDir = await new Promise((resolve, reject) => { system.getFilesDir(resolve, reject); }); @@ -107,18 +113,25 @@ const Terminal = { let axsUrl; let prootUrl; let libTalloc; + let libproot = null; + let libproot32 = null; if (arch === "arm64-v8a") { + libproot = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/arm64/libproot.so"; + libproot32 = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/arm64/libproot32.so"; libTalloc = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/arm64/libtalloc.so"; prootUrl = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/arm64/libproot-xed.so"; axsUrl = `https://github.com/bajrangCoder/acodex_server/releases/latest/download/axs-musl-android-arm64`; alpineUrl = "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/aarch64/alpine-minirootfs-3.21.0-aarch64.tar.gz"; } else if (arch === "armeabi-v7a") { + libproot = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/arm32/libproot.so"; libTalloc = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/arm32/libtalloc.so"; prootUrl = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/arm32/libproot-xed.so"; axsUrl = `https://github.com/bajrangCoder/acodex_server/releases/latest/download/axs-musl-android-armv7`; alpineUrl = "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/armhf/alpine-minirootfs-3.21.0-armhf.tar.gz"; } else if (arch === "x86_64") { + libproot = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/x64/libproot.so"; + libproot32 = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/x64/libproot32.so"; libTalloc = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/x64/libtalloc.so"; prootUrl = "https://raw.githubusercontent.com/Acode-Foundation/Acode/main/src/plugins/proot/libs/x64/libproot-xed.so"; axsUrl = `https://github.com/bajrangCoder/acodex_server/releases/latest/download/axs-musl-android-x86_64`; @@ -166,6 +179,27 @@ const Terminal = { resolve, reject ); }); + + if (libproot != null) { + await new Promise((resolve, reject) => { + cordova.plugin.http.downloadFile( + libproot, {}, {}, + cordova.file.dataDirectory + "libproot.so", + resolve, reject + ); + }); + } + + if (libproot32 != null) { + await new Promise((resolve, reject) => { + cordova.plugin.http.downloadFile( + libproot32, {}, {}, + cordova.file.dataDirectory + "libproot32.so", + resolve, reject + ); + }); + } + } logger("✅ All downloads completed"); @@ -198,9 +232,9 @@ const Terminal = { return installResult; } catch (e) { - err_logger("Installation failed:", e); - console.error("Installation failed:", e); - return false; + err_logger("Installation failed:", e); + console.error("Installation failed:", e); + return false; } }, @@ -232,7 +266,13 @@ const Terminal = { }, reject); }); - resolve(alpineExists && downloaded && extracted); + const configured = alpineExists && await new Promise((resolve, reject) => { + system.fileExists(`${filesDir}/.configured`, false, (result) => { + resolve(result == 1); + }, reject); + }); + + resolve(alpineExists && downloaded && extracted && configured); }); }, @@ -358,10 +398,10 @@ const Terminal = { * console.error(`Uninstall failed: ${error}`); * } */ - uninstall(){ + uninstall() { return new Promise(async (resolve, reject) => { - if(await this.isAxsRunning()){ - await this.stopAxs() + if (await this.isAxsRunning()) { + await this.stopAxs(); } const cmd = ` @@ -378,13 +418,13 @@ const Terminal = { done echo "ok" - ` - const result = await Executor.execute(cmd) - if(result === "ok"){ - resolve(result) - }else{ - reject(result) - } + `; + const result = await Executor.execute(cmd); + if (result === "ok") { + resolve(result); + } else { + reject(result); + } }); } };