Files
2026-07-13 13:16:30 +08:00

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