249 lines
6.8 KiB
Bash
249 lines
6.8 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
PROJECT_DIR="$HOME/.openclaw-android"
|
|
|
|
if [ -f "$HOME/.openclaw-android/scripts/lib.sh" ]; then
|
|
# shellcheck source=/dev/null
|
|
source "$HOME/.openclaw-android/scripts/lib.sh"
|
|
# shellcheck source=/dev/null
|
|
if [ -f "$HOME/.openclaw-android/scripts/backup.sh" ]; then
|
|
source "$HOME/.openclaw-android/scripts/backup.sh"
|
|
fi
|
|
else
|
|
OA_VERSION="1.0.27"
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BOLD='\033[1m'
|
|
NC='\033[0m'
|
|
REPO_BASE_ORIGIN="https://raw.githubusercontent.com/AidanPark/openclaw-android/main"
|
|
REPO_BASE="$REPO_BASE_ORIGIN"
|
|
PLATFORM_MARKER="$PROJECT_DIR/.platform"
|
|
|
|
detect_platform() {
|
|
if [ -f "$PLATFORM_MARKER" ]; then
|
|
cat "$PLATFORM_MARKER"
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
resolve_repo_base() {
|
|
if curl -sI --connect-timeout 3 "$REPO_BASE_ORIGIN/oa.sh" >/dev/null 2>&1; then
|
|
REPO_BASE="$REPO_BASE_ORIGIN"; return 0
|
|
fi
|
|
local mirrors=(
|
|
"https://ghfast.top/$REPO_BASE_ORIGIN"
|
|
"https://ghproxy.net/$REPO_BASE_ORIGIN"
|
|
"https://mirror.ghproxy.com/$REPO_BASE_ORIGIN"
|
|
)
|
|
for m in "${mirrors[@]}"; do
|
|
if curl -sI --connect-timeout 3 "$m/oa.sh" >/dev/null 2>&1; then
|
|
echo -e " ${YELLOW}[MIRROR]${NC} Using mirror for GitHub downloads"
|
|
REPO_BASE="$m"; return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
fi
|
|
|
|
show_help() {
|
|
echo ""
|
|
echo -e "${BOLD}oa${NC} — OpenClaw on Android CLI v${OA_VERSION}"
|
|
echo ""
|
|
echo "Usage: oa [option]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --update Update OpenClaw and Android patches"
|
|
echo " --install Install optional tools (tmux, code-server, AI CLIs, etc.)"
|
|
echo " --uninstall Remove OpenClaw on Android"
|
|
echo " --backup Create a full backup of OpenClaw data"
|
|
echo " --restore Restore from a backup"
|
|
echo " --status Show installation status and all components"
|
|
echo " --version, -v Show version"
|
|
echo " --help, -h Show this help message"
|
|
echo ""
|
|
}
|
|
|
|
show_version() {
|
|
echo "oa v${OA_VERSION} (OpenClaw on Android)"
|
|
|
|
local latest
|
|
latest=$(curl -sfL --max-time 3 "$REPO_BASE/scripts/lib.sh" 2>/dev/null \
|
|
| grep -m1 '^OA_VERSION=' | cut -d'"' -f2) || true
|
|
|
|
if [ -n "${latest:-}" ]; then
|
|
if [ "$latest" = "$OA_VERSION" ]; then
|
|
echo -e " ${GREEN}Up to date${NC}"
|
|
else
|
|
echo -e " ${YELLOW}v${latest} available${NC} - run: oa --update"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
cmd_update() {
|
|
if ! command -v curl &>/dev/null; then
|
|
echo -e "${RED}[FAIL]${NC} curl not found. Install it with: pkg install curl"
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$PROJECT_DIR"
|
|
local LOGFILE="$PROJECT_DIR/update.log"
|
|
|
|
local TMPFILE
|
|
TMPFILE=$(mktemp "${TMPDIR:-${PREFIX:-/tmp}/tmp}/update-core.XXXXXX.sh" 2>/dev/null) \
|
|
|| TMPFILE=$(mktemp "/tmp/update-core.XXXXXX.sh")
|
|
|
|
if ! curl -sfL "$REPO_BASE/update-core.sh" -o "$TMPFILE"; then
|
|
rm -f "$TMPFILE"
|
|
echo -e "${RED}[FAIL]${NC} Failed to download update-core.sh"
|
|
exit 1
|
|
fi
|
|
|
|
bash "$TMPFILE" 2>&1 | tee "$LOGFILE"
|
|
rm -f "$TMPFILE"
|
|
|
|
echo ""
|
|
echo -e "${YELLOW}Log saved to $LOGFILE${NC}"
|
|
exit 0
|
|
}
|
|
|
|
cmd_uninstall() {
|
|
local UNINSTALL_SCRIPT="$PROJECT_DIR/uninstall.sh"
|
|
|
|
if [ ! -f "$UNINSTALL_SCRIPT" ]; then
|
|
echo -e "${RED}[FAIL]${NC} Uninstall script not found at $UNINSTALL_SCRIPT"
|
|
echo ""
|
|
echo "You can download it manually:"
|
|
echo " curl -sL $REPO_BASE/uninstall.sh -o $UNINSTALL_SCRIPT && chmod +x $UNINSTALL_SCRIPT"
|
|
exit 1
|
|
fi
|
|
|
|
bash "$UNINSTALL_SCRIPT"
|
|
}
|
|
|
|
cmd_status() {
|
|
echo ""
|
|
echo -e "${BOLD}========================================${NC}"
|
|
echo -e "${BOLD} OpenClaw on Android — Status${NC}"
|
|
echo -e "${BOLD}========================================${NC}"
|
|
|
|
echo ""
|
|
echo -e "${BOLD}Version${NC}"
|
|
echo " oa: v${OA_VERSION}"
|
|
|
|
local PLATFORM
|
|
PLATFORM=$(detect_platform 2>/dev/null) || PLATFORM=""
|
|
if [ -n "$PLATFORM" ]; then
|
|
echo " Platform: $PLATFORM"
|
|
else
|
|
echo -e " Platform: ${RED}not detected${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BOLD}Environment${NC}"
|
|
echo " PREFIX: ${PREFIX:-not set}"
|
|
echo " TMPDIR: ${TMPDIR:-not set}"
|
|
|
|
echo ""
|
|
echo -e "${BOLD}Paths${NC}"
|
|
local CHECK_DIRS=("$PROJECT_DIR" "${PREFIX:-}/tmp")
|
|
for dir in "${CHECK_DIRS[@]}"; do
|
|
if [ -d "$dir" ]; then
|
|
echo -e " ${GREEN}[OK]${NC} $dir"
|
|
else
|
|
echo -e " ${RED}[MISS]${NC} $dir"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo -e "${BOLD}Configuration${NC}"
|
|
if grep -qF "OpenClaw on Android" "$HOME/.bashrc" 2>/dev/null; then
|
|
echo -e " ${GREEN}[OK]${NC} .bashrc environment block present"
|
|
else
|
|
echo -e " ${RED}[MISS]${NC} .bashrc environment block not found"
|
|
fi
|
|
|
|
local STATUS_SCRIPT="$PROJECT_DIR/platforms/$PLATFORM/status.sh"
|
|
if [ -n "$PLATFORM" ] && [ -f "$STATUS_SCRIPT" ]; then
|
|
bash "$STATUS_SCRIPT"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
cmd_install() {
|
|
if ! command -v curl &>/dev/null; then
|
|
echo -e "${RED}[FAIL]${NC} curl not found. Install it with: pkg install curl"
|
|
exit 1
|
|
fi
|
|
|
|
local TMPFILE
|
|
TMPFILE=$(mktemp "${TMPDIR:-${PREFIX:-/tmp}/tmp}/install-tools.XXXXXX.sh" 2>/dev/null) \
|
|
|| TMPFILE=$(mktemp "/tmp/install-tools.XXXXXX.sh")
|
|
|
|
if ! curl -sfL "$REPO_BASE/install-tools.sh" -o "$TMPFILE"; then
|
|
rm -f "$TMPFILE"
|
|
echo -e "${RED}[FAIL]${NC} Failed to download install-tools.sh"
|
|
exit 1
|
|
fi
|
|
|
|
bash "$TMPFILE"
|
|
rm -f "$TMPFILE"
|
|
}
|
|
|
|
# Resolve mirror before any network operation
|
|
case "${1:-}" in
|
|
--update|--install)
|
|
resolve_repo_base || true
|
|
command -v resolve_npm_registry >/dev/null 2>&1 && resolve_npm_registry || true
|
|
;;
|
|
--version|-v|--uninstall)
|
|
resolve_repo_base || true
|
|
;;
|
|
esac
|
|
|
|
case "${1:-}" in
|
|
--update)
|
|
cmd_update
|
|
;;
|
|
--install)
|
|
cmd_install
|
|
;;
|
|
--uninstall)
|
|
cmd_uninstall
|
|
;;
|
|
--backup)
|
|
if declare -f cmd_backup > /dev/null 2>&1; then
|
|
cmd_backup "${2:-}"
|
|
else
|
|
echo -e "${RED}[FAIL]${NC} backup.sh not found. Run: oa --update"
|
|
exit 1
|
|
fi
|
|
;;
|
|
--restore)
|
|
if declare -f cmd_restore > /dev/null 2>&1; then
|
|
cmd_restore
|
|
else
|
|
echo -e "${RED}[FAIL]${NC} backup.sh not found. Run: oa --update"
|
|
exit 1
|
|
fi
|
|
;;
|
|
--status)
|
|
cmd_status
|
|
;;
|
|
--version|-v)
|
|
show_version
|
|
;;
|
|
--help|-h|"")
|
|
show_help
|
|
;;
|
|
*)
|
|
echo -e "${RED}Unknown option: $1${NC}"
|
|
echo ""
|
|
show_help
|
|
exit 1
|
|
;;
|
|
esac
|