Files
2026-07-23 09:12:00 +09:00

192 lines
4.6 KiB
Bash
Executable File

#!/usr/bin/env sh
set -eu
INSTALL_DIR="${PLATFORM_AGENT_DIR:-/opt/platform-agent}"
SERVICE_NAME="${PLATFORM_AGENT_SERVICE:-platform-agent}"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
log() {
printf '%s\n' "$*"
}
need_cmd() {
command -v "$1" >/dev/null 2>&1
}
as_root() {
if [ "$(id -u)" -eq 0 ]; then
"$@"
elif need_cmd sudo; then
sudo "$@"
else
log "Root privileges are required: $*"
exit 1
fi
}
prompt_yes_no() {
label="$1"
default="${2:-no}"
suffix="[y/N]"
[ "$default" = "yes" ] && suffix="[Y/n]"
printf '%s %s ' "$label" "$suffix"
IFS= read -r answer || answer=""
answer="$(printf '%s' "$answer" | tr '[:upper:]' '[:lower:]')"
if [ -z "$answer" ]; then
[ "$default" = "yes" ]
return
fi
[ "$answer" = "y" ] || [ "$answer" = "yes" ]
}
read_config_value() {
key_path="$1"
config_path="${INSTALL_DIR}/agent.config.json"
if [ ! -f "$config_path" ] || ! need_cmd python3; then
return
fi
python3 - "$config_path" "$key_path" <<'PY'
import json
import sys
with open(sys.argv[1], "r", encoding="utf-8") as fp:
data = json.load(fp)
value = data
for key in sys.argv[2].split("."):
if not isinstance(value, dict):
value = None
break
value = value.get(key)
if isinstance(value, str):
print(value)
PY
}
expand_path_for_user() {
path="$1"
run_user="$2"
case "$path" in
"~")
if [ "$run_user" = "root" ]; then
printf '/root'
else
printf '/home/%s' "$run_user"
fi
;;
"~/"*)
if [ "$run_user" = "root" ]; then
printf '/root/%s' "${path#~/}"
else
printf '/home/%s/%s' "$run_user" "${path#~/}"
fi
;;
*)
printf '%s' "$path"
;;
esac
}
service_user() {
if [ -f "$SERVICE_FILE" ]; then
user_line="$(sed -n 's/^User=//p' "$SERVICE_FILE" | head -n 1)"
[ -n "$user_line" ] && {
printf '%s' "$user_line"
return
}
fi
id -un
}
remove_packages() {
packages="$1"
if [ -z "$packages" ]; then
return
fi
if need_cmd apt-get; then
as_root apt-get remove -y $packages || true
as_root apt-get autoremove -y || true
elif need_cmd dnf; then
as_root dnf remove -y $packages || true
elif need_cmd yum; then
as_root yum remove -y $packages || true
elif need_cmd pacman; then
as_root pacman -Rns --noconfirm $packages || true
elif need_cmd zypper; then
as_root zypper --non-interactive remove $packages || true
else
log "No supported package manager found. Skipping package removal."
fi
}
clear
log "Autonomy Studio Platform Agent Uninstall"
log "========================================"
log "Service : ${SERVICE_NAME}"
log "Install dir : ${INSTALL_DIR}"
log ""
RUN_USER="$(service_user)"
WORKSPACE_ROOT="$(read_config_value workspace.root || true)"
[ -n "${WORKSPACE_ROOT:-}" ] || WORKSPACE_ROOT="~/autonomy-studio/workspaces"
WORKSPACE_PATH="$(expand_path_for_user "$WORKSPACE_ROOT" "$RUN_USER")"
log "Detected user : ${RUN_USER}"
log "Workspace root : ${WORKSPACE_ROOT}"
log "Resolved workspace : ${WORKSPACE_PATH}"
log ""
if ! prompt_yes_no "Uninstall the platform agent now?" "no"; then
log "Canceled."
exit 0
fi
if need_cmd systemctl; then
log "Stopping systemd service."
as_root systemctl stop "$SERVICE_NAME" 2>/dev/null || true
as_root systemctl disable "$SERVICE_NAME" 2>/dev/null || true
if [ -f "$SERVICE_FILE" ]; then
as_root rm -f "$SERVICE_FILE"
as_root systemctl daemon-reload
fi
elif need_cmd service; then
as_root service "$SERVICE_NAME" stop 2>/dev/null || true
fi
if prompt_yes_no "Remove install directory ${INSTALL_DIR}?" "yes"; then
case "$INSTALL_DIR" in
"/"|"/root"|"/home"|"/usr"|"/opt"|"/var"|"/etc")
log "Refusing to remove broad system directory: ${INSTALL_DIR}"
;;
*)
as_root rm -rf "$INSTALL_DIR"
;;
esac
fi
if prompt_yes_no "Delete workspace ${WORKSPACE_PATH}? This removes cloned modules and user files." "no"; then
case "$WORKSPACE_PATH" in
"/home/$RUN_USER"|"/home/$RUN_USER/")
log "Refusing to remove user home directory: ${WORKSPACE_PATH}"
;;
"/"|"/root"|"/home"|"/usr"|"/opt"|"/var"|"/etc"|"/home/"*)
as_root rm -rf "$WORKSPACE_PATH"
;;
*)
as_root rm -rf "$WORKSPACE_PATH"
;;
esac
fi
if need_cmd tailscale && prompt_yes_no "Logout this device from Tailscale/Headscale?" "no"; then
as_root tailscale logout || true
fi
if prompt_yes_no "Remove packages installed by install.sh if present? (tailscale openssh-server git)" "no"; then
remove_packages "tailscale openssh-server git"
fi
log ""
log "Uninstall complete."