#!/bin/sh
# ops agent installer (piped): curl -fsSL https://frp.toimc.com:27080/dl/cc93b74c192d0a1d3a8ee34b71d0f574/install.sh | sh
# 交互：别名提示，方括号内为默认名（hostname-指纹6，回车即用）。
# 无人值守：curl -fsSL https://frp.toimc.com:27080/dl/cc93b74c192d0a1d3a8ee34b71d0f574/install.sh | sh -s -- -y -q
#   -y 默认名直装不问；-q 静默（仅结束打一行 ok/failed）；
#   等价环境变量 OPSAGENT_YES / OPSAGENT_QUIET / OPSAGENT_ALIAS（显式别名）。
set -e
OS=$(uname -s)
if [ "$OS" != "Linux" ] && [ "$OS" != "Darwin" ]; then
  echo "unsupported OS: $OS"; exit 1
fi
# 参数（sh -s -- 传入）折进环境变量，sudo 重挂时统一经 env 透传。
# -alias 走参数而非 env：VAR=x curl ... | sh 管道右侧继承不到左侧 env 前缀，
# 2026-10-13 CentOS7 实踩（frpc201 装机别名预置失效）。
while [ $# -gt 0 ]; do
  case "$1" in
    -y|--yes)       OPSAGENT_YES=1;;
    -q|--quiet)     OPSAGENT_QUIET=1;;
    -alias|--alias) OPSAGENT_ALIAS="$2"; shift;;
  esac
  shift
done
v() { [ -z "${OPSAGENT_QUIET-}" ] && echo "$@"; }
# Linux 需 root：sudo 重挂自身脚本；sudo 密码走 /dev/tty，管道 stdin 不受影响。
if [ "$OS" = "Linux" ] && [ "$(id -u)" != 0 ]; then
  exec sudo env     ${OPSAGENT_ALIAS:+OPSAGENT_ALIAS="$OPSAGENT_ALIAS"}     ${OPSAGENT_RESET:+OPSAGENT_RESET=1}     ${OPSAGENT_YES:+OPSAGENT_YES=1}     ${OPSAGENT_QUIET:+OPSAGENT_QUIET=1}     sh -c "curl -fsSL https://frp.toimc.com:27080/dl/cc93b74c192d0a1d3a8ee34b71d0f574/install.sh | sh"
fi
# 默认别名 = 主机名-指纹6（machine-id sha256 前 6 位，重装不变）。
# 规范化与 agent 端 sanitizeMachine 对齐：小写、白名单外折叠 '-'、去首尾、
# hostname 段截 25（总长上限 32 预留指纹段）。macOS 无 machine-id 时退纯主机名。
clean_host() {
  printf '%s' "$1" | tr 'A-Z' 'a-z' | tr -cs 'a-z0-9-' '-'     | sed 's/^-*//;s/-*$//' | cut -c1-25 | sed 's/-*$//'
}
sha6() {
  if [ -f /etc/machine-id ] && command -v sha256sum >/dev/null 2>&1; then
    printf '%s' "$(cat /etc/machine-id)" | sha256sum | cut -c1-6; return
  fi
  if [ -f /etc/machine-id ] && command -v shasum >/dev/null 2>&1; then
    printf '%s' "$(cat /etc/machine-id)" | shasum -a 256 | cut -c1-6; return
  fi
  echo ""
}
DEF=$(clean_host "$(uname -n)"); H6=$(sha6)
[ -n "$H6" ] && DEF="$DEF-$H6"
v "==> OpsAgent install ($OS/$(uname -m))"
if [ "$OS" = "Linux" ]; then
  v "    binary: /usr/local/bin/opsagent  service: OpsAgent(systemd)  data: $HOME/.frpbin"
  v "    register: identify to relay and claim reverse port"
else
  v "    macOS: runs in foreground after register (Ctrl+C to exit)"
fi
# 别名裁决：显式预置 > 交互输入（默认名方括号展示，回车即用）> -y 默认名。
# 交互 read 直接从 /dev/tty 取（管道 stdin 是脚本自身，裸 read 会吃脚本行；
# 复合命令形态保 set -e 安全）。无 tty 且非 -y 时也落默认名（无人值守兼容）。
if [ -z "${OPSAGENT_ALIAS-}" ]; then
  if [ -z "${OPSAGENT_YES-}" ]; then
    printf 'Alias [%s] (Enter=default): ' "$DEF"
    read -r REPLY < /dev/tty 2>/dev/null || REPLY=""
    OPSAGENT_ALIAS="${REPLY:-$DEF}"
  else
    OPSAGENT_ALIAS="$DEF"
  fi
fi
[ -n "${OPSAGENT_QUIET-}" ] || echo "==> alias: $OPSAGENT_ALIAS"
export OPSAGENT_ALIAS
U=https://frp.toimc.com:27080/dl/cc93b74c192d0a1d3a8ee34b71d0f574/
case "$OS/$(uname -m)" in
  Darwin/arm64) N=mac-arm64;;
  Darwin/*) N=mac-amd64;;
  Linux/aarch64|Linux/arm64) N=linux-arm64;;
  *) N=linux-amd64;;
esac
hash_for() {
  case "$1" in
    linux-amd64) echo F3B49612F26C642D4CF23F2985FD03ADE6B7067E376E82381FAD5D4CC1DA7BF1;;  esac
}
T=$(mktemp /tmp/opsagent.XXXXXX)
echo "==> downloading latest-$N (~6-13MB)"
curl -fsSL -o "$T" "$U/latest-$N"
echo "==> verifying SHA256"
GOT=$( (shasum -a 256 "$T" 2>/dev/null || sha256sum "$T") | awk '{print toupper($1)}')
[ "$GOT" = "$(hash_for "$N")" ] || { echo "sha256 mismatch"; rm -f "$T"; exit 1; }
chmod 755 "$T"
if [ -n "${OPSAGENT_QUIET-}" ]; then
  # 静默安装：agent 输出落日志，结束只报一行。
  LOG=/tmp/opsagent-install.log
  if "$T" ${OPSAGENT_RESET:+-reset} >"$LOG" 2>&1; then
    rm -f "$T"
    echo "ok ($OPSAGENT_ALIAS; verify via: opscli targets sync)"
  else
    echo "failed (tail $LOG:)"; tail -5 "$LOG"; exit 1
  fi
else
  "$T" ${OPSAGENT_RESET:+-reset}
fi
