60 lines
1.6 KiB
Bash
60 lines
1.6 KiB
Bash
#!/bin/sh
|
|
# Bootstrap script for ollie-remote SSH deployment.
|
|
# Checks for cached binary 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"
|
|
#
|
|
if [ -x "$CACHE_BIN" ] && [ -f "$CACHE_HASH" ] && [ "$(cat "$CACHE_HASH")" = "@@HASH@@" ]; then
|
|
echo "OLLIE_LOADER_START {\"need_download\":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\":true}" >&2
|
|
#
|
|
# Read download size, then binary data
|
|
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: binary transfer failed" >&2
|
|
exit 1
|
|
fi
|
|
chmod +x "$CACHE_TMP"
|
|
mv "$CACHE_TMP" "$CACHE_BIN"
|
|
echo "@@HASH@@" > "$CACHE_HASH"
|
|
echo "OLLIE_LOADER_READY" >&2
|
|
fi
|
|
#
|
|
exec "$CACHE_BIN" serve --cwd @@CWD@@
|
|
exit 1
|
|
}
|
|
main "$@"; exit 2
|