#!/bin/bash
# Easytier 更新脚本 (适配 Debian / Alpine)
# 使用方法: sudo bash update_easytier.sh

set -euo pipefail

# ---------- 可配置项 ----------
DOWNLOAD_BASE="http://ybnas.top:100/easytier/v2.6.4"
FILES=("easytier-cli" "easytier-core" "easytier-web" "easytier-web-embed")
TARGET_DIR="/opt/easytier"
SERVICE_NAME="easytier"
# -----------------------------

TEMP_DIR=$(mktemp -d)
cleanup() { rm -rf "$TEMP_DIR"; }
trap cleanup EXIT

# 权限检查
if [ "$(id -u)" -ne 0 ]; then
    echo "请使用 root 权限运行: sudo $0" >&2
    exit 1
fi

# 检测服务管理器: systemctl 或 rc-service
if command -v systemctl &>/dev/null; then
    SVC_MGR="systemctl"
elif command -v rc-service &>/dev/null; then
    SVC_MGR="rc-service"
else
    echo "错误: 未找到 systemctl 或 rc-service，脚本仅支持 Debian 或 Alpine。" >&2
    exit 1
fi

# 检测下载工具
if command -v wget &> /dev/null; then
    DOWNLOADER="wget -q -O"
elif command -v curl &> /dev/null; then
    DOWNLOADER="curl -s -L -o"
else
    echo "错误: 需要 wget 或 curl，请先安装: apt install wget  或  apk add wget" >&2
    exit 1
fi

# ---------- 服务控制函数 ----------
stop_svc() {
    echo ">>> 停止服务 ${SERVICE_NAME} ..."
    case "$SVC_MGR" in
        systemctl) systemctl stop "${SERVICE_NAME}" || echo "    警告: 停止失败，继续更新。" ;;
        rc-service) rc-service "${SERVICE_NAME}" stop || echo "    警告: 停止失败，继续更新。" ;;
    esac
}

start_svc() {
    echo ">>> 启动服务 ${SERVICE_NAME} ..."
    case "$SVC_MGR" in
        systemctl) systemctl start "${SERVICE_NAME}" ;;
        rc-service) rc-service "${SERVICE_NAME}" start ;;
    esac
}

show_status() {
    echo ">>> 服务状态:"
    case "$SVC_MGR" in
        systemctl) systemctl status "${SERVICE_NAME}" --no-pager -l 2>/dev/null || true ;;
        rc-service) rc-service "${SERVICE_NAME}" status || true ;;
    esac
}

# ---------- 主流程 ----------
stop_svc

echo ">>> 下载文件 ..."
for file in "${FILES[@]}"; do
    url="${DOWNLOAD_BASE}/${file}"
    echo "    ${url}"
    $DOWNLOADER "${TEMP_DIR}/${file}" "${url}" || {
        echo "错误: 下载 ${file} 失败，尝试恢复服务..." >&2
        start_svc || true
        exit 1
    }
    if [ ! -s "${TEMP_DIR}/${file}" ]; then
        echo "错误: 文件 ${file} 为空，下载可能不完整，尝试恢复服务..." >&2
        start_svc || true
        exit 1
    fi
done

# 备份旧文件
BACKUP_DIR="${TARGET_DIR}/backup_$(date +%Y%m%d%H%M%S)"
echo ">>> 备份旧文件到 ${BACKUP_DIR}"
mkdir -p "${BACKUP_DIR}"
for file in "${FILES[@]}"; do
    [ -f "${TARGET_DIR}/${file}" ] && cp -a "${TARGET_DIR}/${file}" "${BACKUP_DIR}/"
done

# 覆盖安装
echo ">>> 安装新文件到 ${TARGET_DIR} ..."
for file in "${FILES[@]}"; do
    mv "${TEMP_DIR}/${file}" "${TARGET_DIR}/${file}"
    chmod +x "${TARGET_DIR}/${file}"
done

# 可选：修正文件所有者（需要时取消注释并调整）
# chown root:root "${TARGET_DIR}"/easytier-*

start_svc
show_status

echo ">>> 更新完成。旧文件已备份至: ${BACKUP_DIR}"