From c73cd2f8c57536212d47c131070790435950493a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20K=C3=BCttel?= Date: Fri, 26 Jan 2024 01:26:50 +0100 Subject: [PATCH 1/4] extract sudo calls from script as as_root On some systems the user I want to run these scripts on are not in the sudoers group, but might be in the docker group. Additionally, this is useful to check whether all of these elevated commands are actually needed. Using this commit I'm testing this by calling the script setting the environment variable SUDO_CMD to an empty string. For example: SUDO_CMD= bin/build.sh --- bin/build.sh | 21 +++++++++++---------- bin/clean.sh | 5 +++-- bin/halt.sh | 3 ++- bin/purge.sh | 3 ++- bin/start.sh | 5 +++-- bin/util/commands.sh | 14 ++++++++++++++ 6 files changed, 35 insertions(+), 16 deletions(-) create mode 100755 bin/util/commands.sh diff --git a/bin/build.sh b/bin/build.sh index 52631ed..de6aacb 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -28,6 +28,7 @@ PROJECT_PATH=$( pwd ) # load helpers source "${PROJECT_PATH}"/bin/util/echos.sh source "${PROJECT_PATH}"/bin/util/helpers.sh +source "${PROJECT_PATH}"/bin/util/commands.sh # env vars I2P_LOGLEVEL=${I2P_LOGLEVEL:-none} @@ -80,7 +81,7 @@ cd "${PATH_DOMAIN}" if [[ -f ./diva.yml ]] then - sudo docker compose -f ./diva.yml down + as_root docker compose -f ./diva.yml down fi if [[ ${PURGE} -gt 0 ]] @@ -91,13 +92,13 @@ then if [[ -f ./diva.yml ]] then - sudo docker compose -f ./diva.yml down --volumes + as_root docker compose -f ./diva.yml down --volumes fi - sudo rm -rf "${PATH_DOMAIN}"/genesis/* - sudo rm -rf "${PATH_DOMAIN}"/keys/* - sudo rm -rf "${PATH_DOMAIN}"/state/* - sudo rm -rf "${PATH_DOMAIN}"/blockstore/* + as_root rm -rf "${PATH_DOMAIN}"/genesis/* + as_root rm -rf "${PATH_DOMAIN}"/keys/* + as_root rm -rf "${PATH_DOMAIN}"/state/* + as_root rm -rf "${PATH_DOMAIN}"/blockstore/* fi if [[ ! -f genesis/local.config ]] @@ -106,12 +107,12 @@ then if [[ -f ./genesis-i2p.yml ]] then - sudo SIZE_NETWORK=${SIZE_NETWORK} docker compose -f ./genesis-i2p.yml down --volumes + SIZE_NETWORK=${SIZE_NETWORK} as_root docker compose -f ./genesis-i2p.yml down --volumes fi cp "${PROJECT_PATH}"/build/genesis-i2p.yml ./genesis-i2p.yml - sudo SIZE_NETWORK=${SIZE_NETWORK} docker compose -f ./genesis-i2p.yml pull - sudo SIZE_NETWORK=${SIZE_NETWORK} docker compose -f ./genesis-i2p.yml up -d + SIZE_NETWORK=${SIZE_NETWORK} as_root docker compose -f ./genesis-i2p.yml pull + SIZE_NETWORK=${SIZE_NETWORK} as_root docker compose -f ./genesis-i2p.yml up -d running "Waiting for key generation" # wait until all keys are created @@ -121,7 +122,7 @@ then done # shut down the genesis container and clean up - sudo SIZE_NETWORK=${SIZE_NETWORK} docker compose -f ./genesis-i2p.yml down --volumes + SIZE_NETWORK=${SIZE_NETWORK} as_root docker compose -f ./genesis-i2p.yml down --volumes rm ./genesis-i2p.yml # handle joining diff --git a/bin/clean.sh b/bin/clean.sh index c3eab2a..04f1d8b 100755 --- a/bin/clean.sh +++ b/bin/clean.sh @@ -28,17 +28,18 @@ PROJECT_PATH=$( pwd ) # load helpers source "${PROJECT_PATH}"/bin/util/echos.sh source "${PROJECT_PATH}"/bin/util/helpers.sh +source "${PROJECT_PATH}"/bin/util/commands.sh BASE_DOMAIN=${BASE_DOMAIN:-} if [[ ${BASE_DOMAIN} = "*" ]] then info "Removing ${PROJECT_PATH}/build/domains/*" - sudo rm -rf "${PROJECT_PATH}"/build/domains/* + as_root rm -rf "${PROJECT_PATH}"/build/domains/* elif [[ -n ${BASE_DOMAIN} && -d ${PROJECT_PATH}/build/domains/${BASE_DOMAIN} ]] then info "Removing ${PROJECT_PATH}/build/domains/${BASE_DOMAIN}" - sudo rm -rf "${PROJECT_PATH}"/build/domains/"${BASE_DOMAIN}" + as_root rm -rf "${PROJECT_PATH}"/build/domains/"${BASE_DOMAIN}" else warn "Set BASE_DOMAIN to a existing directory name (see domains directory)" exit 1 diff --git a/bin/halt.sh b/bin/halt.sh index 53a3d05..fbbf351 100755 --- a/bin/halt.sh +++ b/bin/halt.sh @@ -28,6 +28,7 @@ PROJECT_PATH=$( pwd ) # load helpers source "${PROJECT_PATH}"/bin/util/echos.sh source "${PROJECT_PATH}"/bin/util/helpers.sh +source "${PROJECT_PATH}"/bin/util/commands.sh # env vars DIVA_TESTNET=${DIVA_TESTNET:-0} @@ -54,5 +55,5 @@ then fi running "Halting ${PATH_DOMAIN}" -sudo docker compose -f ./diva.yml down +as_root docker compose -f ./diva.yml down ok "Halted ${PATH_DOMAIN}" diff --git a/bin/purge.sh b/bin/purge.sh index b54f261..75e7043 100755 --- a/bin/purge.sh +++ b/bin/purge.sh @@ -28,6 +28,7 @@ PROJECT_PATH=$( pwd ) # load helpers source "${PROJECT_PATH}/bin/util/echos.sh" source "${PROJECT_PATH}/bin/util/helpers.sh" +source "${PROJECT_PATH}/bin/util/commands.sh" # env vars DIVA_TESTNET=${DIVA_TESTNET:-0} @@ -68,6 +69,6 @@ warn "If you want to keep the data, run a backup first." confirm "Do you want to DELETE all local diva data (y/N)?" || exit 5 running "Purging ${PATH_DOMAIN}" -sudo docker compose -f ./diva.yml down --volumes +as_root docker compose -f ./diva.yml down --volumes BASE_DOMAIN=${BASE_DOMAIN} "${PROJECT_PATH}"/bin/clean.sh ok "Purged ${PATH_DOMAIN}" diff --git a/bin/start.sh b/bin/start.sh index b934351..c25702e 100755 --- a/bin/start.sh +++ b/bin/start.sh @@ -28,6 +28,7 @@ PROJECT_PATH=$( pwd ) # load helpers source "${PROJECT_PATH}/bin/util/echos.sh" source "${PROJECT_PATH}/bin/util/helpers.sh" +source "${PROJECT_PATH}/bin/util/commands.sh" # env vars DIVA_TESTNET=${DIVA_TESTNET:-0} @@ -65,8 +66,8 @@ then fi running "Pulling ${PATH_DOMAIN}" -sudo docker compose -f ./diva.yml pull +as_root docker compose -f ./diva.yml pull running "Starting ${PATH_DOMAIN}" -sudo NO_BOOTSTRAPPING="${NO_BOOTSTRAPPING}" docker compose -f ./diva.yml up -d +NO_BOOTSTRAPPING="${NO_BOOTSTRAPPING}" as_root docker compose -f ./diva.yml up -d ok "Started ${PATH_DOMAIN}" diff --git a/bin/util/commands.sh b/bin/util/commands.sh new file mode 100755 index 0000000..3039d6e --- /dev/null +++ b/bin/util/commands.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +SUDO_CMD="${SUDO_CMD-sudo}" + +function as_root() { + echo "Running privileged command" + echo " $SUDO_CMD " "$@" + + if [[ -n "$SUDO_CMD" ]]; then + "$SUDO_CMD" "$@" + else + "$@" + fi +} + From 361002dba10217a15cc7561304e6cc597f1da007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20K=C3=BCttel?= Date: Fri, 26 Jan 2024 18:11:56 +0100 Subject: [PATCH 2/4] add bin/appimg.sh to build an app image out of i2p and divachain This script expects bin/build.sh to have been successfully run and copies the result from the docker build out of the images into the build/exchange.diva.divachain.AppDir/ which is the basis for the build using the appimagetool called at the end of the script. This is done because the same i2p and divachain build process should be used for the app image as well. So in this POC we just use the built binaries of the respecting containers. Because of this we need to resort to binary patching to adjust these binaries for them to be able to be run inside of an AppImage instead a docker container environment. The AppRun script is the entrypoint which gets executed when starting the resulting appimage. The idea is that this script setups up the required data directories required by i2p, starts the i2p daemon & starts divachain. When closing divachain the i2p daemon should be stopped as well. --- bin/appimg.sh | 112 ++++++++++++++++++ build/exchange.diva.divachain.AppDir/AppRun | 77 ++++++++++++ .../bin/.gitignore | 1 + .../exchange.diva.divachain.AppDir/divax.png | Bin 0 -> 6399 bytes .../exchange.diva.divachain.desktop | 12 ++ .../lib/.gitignore | 1 + .../lib/x86_64-linux-gnu/.gitignore | 1 + .../lib64/.gitignore | 1 + .../opt/i2pd/.gitignore | 1 + .../opt/i2pd/lib/.gitignore | 1 + .../opt/i2pd/usr/lib/.gitignore | 1 + .../usr/bin/.gitignore | 1 + .../usr/lib/.gitignore | 1 + .../usr/lib/x86_64-linux-gnu/.gitignore | 1 + .../exchange.diva.divachain.desktop | 1 + .../exchange.diva.divachain.appdata.xml | 33 ++++++ 16 files changed, 245 insertions(+) create mode 100755 bin/appimg.sh create mode 100755 build/exchange.diva.divachain.AppDir/AppRun create mode 100644 build/exchange.diva.divachain.AppDir/bin/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/divax.png create mode 100644 build/exchange.diva.divachain.AppDir/exchange.diva.divachain.desktop create mode 100644 build/exchange.diva.divachain.AppDir/lib/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/lib/x86_64-linux-gnu/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/lib64/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/opt/i2pd/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/opt/i2pd/lib/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/opt/i2pd/usr/lib/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/usr/bin/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/usr/lib/.gitignore create mode 100644 build/exchange.diva.divachain.AppDir/usr/lib/x86_64-linux-gnu/.gitignore create mode 120000 build/exchange.diva.divachain.AppDir/usr/share/applications/exchange.diva.divachain.desktop create mode 100644 build/exchange.diva.divachain.AppDir/usr/share/metainfo/exchange.diva.divachain.appdata.xml diff --git a/bin/appimg.sh b/bin/appimg.sh new file mode 100755 index 0000000..69c1e21 --- /dev/null +++ b/bin/appimg.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +# +# Copyright (C) 2021-2023 diva.exchange +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# Author/Maintainer: DIVA.EXCHANGE Association +# + +set -eu + +RDNS_NAME="exchange.diva.divachain" + +PROJECT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"/../ +cd "${PROJECT_PATH}" +PROJECT_PATH=$( pwd ) +APP_DIR="$PROJECT_PATH/build/$RDNS_NAME.AppDir" + +# load helpers +source "${PROJECT_PATH}"/bin/util/echos.sh +source "${PROJECT_PATH}"/bin/util/helpers.sh +source "${PROJECT_PATH}"/bin/util/commands.sh + +# DIVA_TESTNET=1 "$PROJECT_PATH"/bin/build.sh + +grab_i2pd_build() { + I2PD_LIBS=( + /usr/lib/libboost_filesystem.so.1.78.0 + /usr/lib/libboost_program_options.so.1.78.0 + /lib/libssl.so.1.1 + /lib/libcrypto.so.1.1 + /usr/lib/libminiupnpc.so.17 + /lib/libz.so.1 + /usr/lib/libstdc++.so.6 + /usr/lib/libgcc_s.so.1 + /lib/libc.musl-x86_64.so.1 + /lib/ld-musl-x86_64.so.1 + ) + + id=$(docker create divax/i2p:current) + docker cp -L $id:/home/i2pd "$APP_DIR/opt/" + docker cp -L $id:/bin/sh "$APP_DIR/bin/" + + + for lib in "${I2PD_LIBS[@]}"; do + docker cp -L "$id:$lib" "$APP_DIR/opt/i2pd/$lib" + done + docker rm -v "$id" + + for binary in "$APP_DIR/opt/i2pd/bin/i2pd" "$APP_DIR/bin/sh"; do + patchelf --debug --set-interpreter ./opt/i2pd/lib/ld-musl-x86_64.so.1 "$binary" + done +} + +grab_divachain_build() { + DIVACHAIN_LIBS=( + /lib/x86_64-linux-gnu/libdl.so.2 + /usr/lib/x86_64-linux-gnu/libstdc++.so.6 + /lib/x86_64-linux-gnu/libm.so.6 + /lib/x86_64-linux-gnu/libpthread.so.0 + /lib/x86_64-linux-gnu/libc.so.6 + /lib64/ld-linux-x86-64.so.2 + ) + + + id=$(docker create divax/divachain:latest) + docker cp -L "$id:/divachain" "$APP_DIR/usr/bin/divachain" + for f in bin etc genesis keys package.json; do + docker cp -L "$id:/$f" "$APP_DIR/" + done + + set -x + + for lib in "${DIVACHAIN_LIBS[@]}"; do + docker cp -L "$id:$lib" "$APP_DIR/$lib" + done + + + docker rm -v "$id" + + USED_BINARIES=( + "$APP_DIR"/lib/x86_64-linux-gnu/libc.so.6 + "$APP_DIR/bin/divachain" + ) + for binary in "${USED_BINARIES[@]}"; do + + ft="$(file "$binary")" + + if [[ "$ft" =~ ": ELF " ]]; then + patchelf --set-interpreter ./lib64/ld-linux-x86-64.so.2 "$binary" + else + echo "WARNING: $binary is not a binary and therefore cannot be patched" + fi + done +} + +grab_i2pd_build + +grab_divachain_build + +appimagetool "$APP_DIR" build/divachain.AppImage diff --git a/build/exchange.diva.divachain.AppDir/AppRun b/build/exchange.diva.divachain.AppDir/AppRun new file mode 100755 index 0000000..cad5e67 --- /dev/null +++ b/build/exchange.diva.divachain.AppDir/AppRun @@ -0,0 +1,77 @@ +#!/usr/bin/env sh +# +# Copyright (C) 2021-2023 diva.exchange +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# Author/Maintainer: DIVA.EXCHANGE Association +# + +set -eu + +cd $APPDIR + +echo "Running from APPDIR: $APPDIR" + + +# SELF=$(readlink -f "$0") +# HERE=${SELF%/*} +HERE=$APPDIR +if [ -z "${DIVAAPPIMG_RELAUNCHED:-}" ]; then + export PATH="${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}" + export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/::${HERE}/lib32/:${HERE}/lib64/:${HERE}/lib:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}" + export XDG_DATA_DIRS="${HERE}/usr/share/${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" + export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}" + export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}" + export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}" +# EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1) +# + + export DIVAAPPIMG_RELAUNCHED=1 + echo RELAUNCH with sh from within appimage + # RELAUNCH the script again with own sh, so that it certainly has the correct c library + echo exec "$APPDIR/bin/sh" "$0" "$@" + exec "$APPDIR/bin/sh" "$0" "$@" + exit 0 +fi + +echo beforeldd + + +# APPIMG_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +# cd "${APPIMG_PATH}" +# APPIMG_PATH=$( pwd ) + + +export DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share/divax}" + +if [ ! -d "$DATA_DIR" ]; then + mkdir -p "$DATA_DIR" + cp -R opt/i2pd/data/ "$DATA_DIR" +fi + +# cleanup() { +# # TODO: stop i2pd when done +# } +# +# trap cleanup EXIT + +# TODO: start i2pd +# exec opt/i2pd/bin/i2pd --datadir=$DATA_DIR/data --conf=etc/i2pd.conf + +# TODO: start divachain +exec ./divachain "$@" + + diff --git a/build/exchange.diva.divachain.AppDir/bin/.gitignore b/build/exchange.diva.divachain.AppDir/bin/.gitignore new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/build/exchange.diva.divachain.AppDir/bin/.gitignore @@ -0,0 +1 @@ +* diff --git a/build/exchange.diva.divachain.AppDir/divax.png b/build/exchange.diva.divachain.AppDir/divax.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e03997f9f01fce07fb161dcf97fe4cee104b74 GIT binary patch literal 6399 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 fuK7qvuCKvg + + + exchange.diva.divachain + CC0-1.0 + AGPL-1.0 + divax + Free Banking Technology For Everyone + +

You have your own private & secure banking technology. + A free software and network project based on blockchain and I2P technology.

+ +

The creators behind DIVA.EXCHANGE are convinced that digital values are becoming common means of payment and stores of value.

+ +

The free software project demonstrates how the storage, trade and payment transactions with digital values can be carried out without central service providers – securely and with rigorous privacy protection.

+ +

This brings us one step closer to the vision that every person can be his or her own bank in the future.

+
+ exchange.diva.divachain.desktop + https://www.diva.exchange + DIVA.EXCHANGE + + + + + + + + + exchange.diva.divachain.desktop + + +
From fcc52d43410722df99b64f175f5b0175d283caa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20K=C3=BCttel?= Date: Sat, 27 Jan 2024 15:36:31 +0100 Subject: [PATCH 3/4] appimg: fix some problems with shared library --- bin/appimg.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bin/appimg.sh b/bin/appimg.sh index 69c1e21..4c26613 100755 --- a/bin/appimg.sh +++ b/bin/appimg.sh @@ -58,19 +58,21 @@ grab_i2pd_build() { done docker rm -v "$id" - for binary in "$APP_DIR/opt/i2pd/bin/i2pd" "$APP_DIR/bin/sh"; do - patchelf --debug --set-interpreter ./opt/i2pd/lib/ld-musl-x86_64.so.1 "$binary" + for binary in $(printf "%s/%s\n" "$APP_DIR/opt/i2pd" "${I2PD_LIBS[@]}") "$APP_DIR/opt/i2pd/bin/i2pd" "$APP_DIR/bin/sh"; do + patchelf --debug --set-interpreter ./opt/i2pd/lib/ld-musl-x86_64.so.1 "$binary" || true done } grab_divachain_build() { DIVACHAIN_LIBS=( + /lib/x86_64-linux-gnu/ld-2.31.so /lib/x86_64-linux-gnu/libdl.so.2 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /lib/x86_64-linux-gnu/libm.so.6 /lib/x86_64-linux-gnu/libpthread.so.0 /lib/x86_64-linux-gnu/libc.so.6 - /lib64/ld-linux-x86-64.so.2 + /lib/x86_64-linux-gnu/libc-2.31.so + # /lib64/ld-linux-x86-64.so.2 ) From 4ffa768851b14294ab39ad991a624ccc92f1430a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20K=C3=BCttel?= Date: Sat, 27 Jan 2024 15:38:12 +0100 Subject: [PATCH 4/4] app image: fix launch script --- build/exchange.diva.divachain.AppDir/AppRun | 26 +++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/build/exchange.diva.divachain.AppDir/AppRun b/build/exchange.diva.divachain.AppDir/AppRun index cad5e67..9463e7f 100755 --- a/build/exchange.diva.divachain.AppDir/AppRun +++ b/build/exchange.diva.divachain.AppDir/AppRun @@ -29,8 +29,9 @@ echo "Running from APPDIR: $APPDIR" # HERE=${SELF%/*} HERE=$APPDIR if [ -z "${DIVAAPPIMG_RELAUNCHED:-}" ]; then + export ORIG_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" + export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/::${HERE}/lib32/:${HERE}/lib64/:${HERE}/lib:${ORIG_LD_LIBRARY_PATH:+:$ORIG_LD_LIBRARY_PATH}" export PATH="${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}" - export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/::${HERE}/lib32/:${HERE}/lib64/:${HERE}/lib:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}" export XDG_DATA_DIRS="${HERE}/usr/share/${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}" @@ -47,8 +48,6 @@ if [ -z "${DIVAAPPIMG_RELAUNCHED:-}" ]; then exit 0 fi -echo beforeldd - # APPIMG_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" # cd "${APPIMG_PATH}" @@ -62,16 +61,19 @@ if [ ! -d "$DATA_DIR" ]; then cp -R opt/i2pd/data/ "$DATA_DIR" fi -# cleanup() { -# # TODO: stop i2pd when done -# } -# -# trap cleanup EXIT -# TODO: start i2pd -# exec opt/i2pd/bin/i2pd --datadir=$DATA_DIR/data --conf=etc/i2pd.conf +# START I2P and kill it when the script is done +I2P_PID= +trap "kill \$I2P_PID" EXIT +export LD_LIBRARY_PATH="${HERE}/opt/i2pd/usr/lib/:${HERE}/opt/i2pd/lib:${ORIG_LD_LIBRARY_PATH:+:$ORIG_LD_LIBRARY_PATH}" +# ldd opt/i2pd/bin/i2pd +opt/i2pd/bin/i2pd --datadir="$DATA_DIR/data" --conf=etc/i2pd.conf & +I2P_PID=$! + +echo started i2pd in background -# TODO: start divachain -exec ./divachain "$@" +# cannot exec here, because of TRAP EXIT to kill i2p +# ldd ./divachain +./divachain "$@"