ollie/toolsrv/bootstrap.sh

89 lines
2.6 KiB
Bash

#!/bin/sh
# Bootstrap script for ollie-remote SSH deployment.
# Checks for cached binaries by hash, downloads if needed, then execs.
main() {
set -e
#
CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/ollie/bin"
CACHE_BIN="$CACHE_DIR/ollie-remote"
CACHE_HASH="$CACHE_DIR/ollie-remote.hash"
CACHE_LANDRUN="$CACHE_DIR/landrun"
CACHE_LANDRUN_HASH="$CACHE_DIR/landrun.hash"
#
NEED_DOWNLOAD=false
NEED_LANDRUN=false
#
if ! [ -x "$CACHE_BIN" ] || ! [ -f "$CACHE_HASH" ] || [ "$(cat "$CACHE_HASH")" != "@@HASH@@" ]; then
NEED_DOWNLOAD=true
fi
if ! [ -x "$CACHE_LANDRUN" ] || ! [ -f "$CACHE_LANDRUN_HASH" ] || [ "$(cat "$CACHE_LANDRUN_HASH")" != "@@LANDRUN_HASH@@" ]; then
NEED_LANDRUN=true
fi
#
if [ "$NEED_DOWNLOAD" = "false" ] && [ "$NEED_LANDRUN" = "false" ]; then
echo "OLLIE_LOADER_START {\"need_download\":false,\"need_landrun\":false}" >&2
else
# Find base64 decoder
if command -v base64 >/dev/null 2>&1; then
BASE64_CMD="base64 -d"
if ! echo "dGVzdA==" | base64 -d >/dev/null 2>&1; then
BASE64_CMD="base64 -D"
fi
elif command -v openssl >/dev/null 2>&1; then
BASE64_CMD="openssl base64 -d"
else
echo "ERROR: no base64 decoder found" >&2
exit 1
fi
#
if ! command -v gunzip >/dev/null 2>&1 && ! command -v gzip >/dev/null 2>&1; then
echo "ERROR: no gunzip found" >&2
exit 1
fi
GUNZIP_CMD="gunzip"
command -v gunzip >/dev/null 2>&1 || GUNZIP_CMD="gzip -d"
#
mkdir -p "$CACHE_DIR"
echo "OLLIE_LOADER_START {\"need_download\":$NEED_DOWNLOAD,\"need_landrun\":$NEED_LANDRUN}" >&2
#
if [ "$NEED_DOWNLOAD" = "true" ]; then
while IFS= read -r line; do
case "$line" in
OLLIE_DOWNLOAD\ *) BINARY_LENGTH="${line#OLLIE_DOWNLOAD }"; break ;;
esac
done
CACHE_TMP="$CACHE_BIN.tmp.$$"
if ! head -c "$BINARY_LENGTH" | $BASE64_CMD | $GUNZIP_CMD > "$CACHE_TMP"; then
rm -f "$CACHE_TMP"
echo "ERROR: ollie-remote transfer failed" >&2
exit 1
fi
chmod +x "$CACHE_TMP"
mv "$CACHE_TMP" "$CACHE_BIN"
echo "@@HASH@@" > "$CACHE_HASH"
fi
#
if [ "$NEED_LANDRUN" = "true" ]; then
while IFS= read -r line; do
case "$line" in
OLLIE_DOWNLOAD\ *) BINARY_LENGTH="${line#OLLIE_DOWNLOAD }"; break ;;
esac
done
CACHE_TMP="$CACHE_LANDRUN.tmp.$$"
if ! head -c "$BINARY_LENGTH" | $BASE64_CMD | $GUNZIP_CMD > "$CACHE_TMP"; then
rm -f "$CACHE_TMP"
echo "ERROR: landrun transfer failed" >&2
exit 1
fi
chmod +x "$CACHE_TMP"
mv "$CACHE_TMP" "$CACHE_LANDRUN"
echo "@@LANDRUN_HASH@@" > "$CACHE_LANDRUN_HASH"
fi
echo "OLLIE_LOADER_READY" >&2
fi
#
exec "$CACHE_BIN" serve --cwd @@CWD@@
exit 1
}
main "$@"; exit 2