#!/bin/sh set -e BASE_URL="https://enkoala.pages.dev" INSTALL_DIR="/usr/local/bin" TMP=$(mktemp /tmp/enkoala.XXXXXX) cleanup() { rm -f "$TMP"; } trap cleanup EXIT INT TERM printf '\033[32m\n' printf ' \xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\n' printf ' \xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x9d\xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\n' printf ' \xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x9d \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\n' printf ' \xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x95\x9a\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x90\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\n' printf ' \xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x95\x9a\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\xe2\x95\x9a\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x94\xe2\x95\x9d\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x95\x97\xe2\x96\x88\xe2\x96\x88\xe2\x95\x91 \xe2\x96\x88\xe2\x96\x88\xe2\x95\x91\n' printf ' \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x9d \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x9d \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x9d \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x9d \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x9d\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x9d \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x9d\n' printf '\033[0m\033[36m\n Installer\n\n\033[0m' command_exists() { command -v "$1" >/dev/null 2>&1; } if ! command_exists python3; then printf '\033[31m[!] python3 is required but not found.\033[0m\n' exit 1 fi PYTHON_OK=$(python3 -c "import sys; print(1 if sys.version_info >= (3,6) else 0)") if [ "$PYTHON_OK" != "1" ]; then printf '\033[31m[!] Python 3.6+ required.\033[0m\n' exit 1 fi printf '\033[36m[*] Fetching version info...\033[0m\n' if command_exists curl; then VERSION_JSON=$(curl -fsSL --proto '=https' --tlsv1.2 "$BASE_URL/version.json" 2>/dev/null) || { printf '\033[31m[!] Failed to fetch version info.\033[0m\n'; exit 1 } curl -fsSL --proto '=https' --tlsv1.2 "$BASE_URL/enkoala.py" -o "$TMP" 2>/dev/null || { printf '\033[31m[!] Download failed.\033[0m\n'; exit 1 } elif command_exists wget; then VERSION_JSON=$(wget -qO- "$BASE_URL/version.json" 2>/dev/null) || { printf '\033[31m[!] Failed to fetch version info.\033[0m\n'; exit 1 } wget -qO "$TMP" "$BASE_URL/enkoala.py" 2>/dev/null || { printf '\033[31m[!] Download failed.\033[0m\n'; exit 1 } else printf '\033[31m[!] curl or wget is required.\033[0m\n' exit 1 fi EXPECTED_SHA=$(printf '%s' "$VERSION_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('sha256',''))" 2>/dev/null) VERSION_NUM=$(printf '%s' "$VERSION_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('version','?'))" 2>/dev/null) if [ -n "$EXPECTED_SHA" ]; then printf '\033[36m[*] Verifying checksum...\033[0m\n' if command_exists sha256sum; then ACTUAL_SHA=$(sha256sum "$TMP" | awk '{print $1}') elif command_exists shasum; then ACTUAL_SHA=$(shasum -a 256 "$TMP" | awk '{print $1}') else ACTUAL_SHA=$(python3 -c "import hashlib; print(hashlib.sha256(open('$TMP','rb').read()).hexdigest())") fi if [ "$ACTUAL_SHA" != "$EXPECTED_SHA" ]; then printf '\033[31m[!] Checksum mismatch - file may be corrupted or tampered with. Aborting.\033[0m\n' printf ' Expected : %s\n' "$EXPECTED_SHA" printf ' Got : %s\n' "$ACTUAL_SHA" exit 1 fi printf '\033[32m[+] Checksum OK (SHA256 verified).\033[0m\n' else printf '\033[33m[~] Warning: no checksum available, skipping verification.\033[0m\n' fi if [ -w "$INSTALL_DIR" ]; then cp "$TMP" "$INSTALL_DIR/enkoala" chmod 755 "$INSTALL_DIR/enkoala" else sudo cp "$TMP" "$INSTALL_DIR/enkoala" sudo chmod 755 "$INSTALL_DIR/enkoala" fi printf '\033[32m[+] Installed enkoala v%s to %s/enkoala\033[0m\n' "$VERSION_NUM" "$INSTALL_DIR" printf '\033[32m[+] Run: enkoala --help\033[0m\n\n'