#!/bin/bash # PT System Checking 一键更新脚本 # 从 Gitea 下载最新版本并更新服务 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 配置变量 GITEA_REPO="https://gitea.service.jazzwhom.top/Passthem/pt-disk-report" SERVICE_NAME="pt_system_checking" INSTALL_DIR="/opt/${SERVICE_NAME}" SYSTEMD_SERVICE="/etc/systemd/system/${SERVICE_NAME}.service" # 打印信息函数 print_info() { echo -e "${GREEN}[INFO]${NC} $1" } print_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查是否以 root 运行 check_root() { if [ "$EUID" -ne 0 ]; then print_error "请使用 root 权限运行此脚本" echo "使用方法: sudo bash update.sh" exit 1 fi } # 检查服务是否已安装 check_installed() { if [ ! -f "${INSTALL_DIR}/${SERVICE_NAME}" ]; then print_error "服务未安装,请先运行 install.sh 进行安装" exit 1 fi if [ ! -f "${SYSTEMD_SERVICE}" ]; then print_error "systemd 服务文件不存在,请先运行 install.sh 进行安装" exit 1 fi } # 检测系统架构 detect_arch() { local arch=$(uname -m) case $arch in x86_64) echo "amd64" ;; aarch64|arm64) echo "arm64" ;; *) print_error "不支持的架构: $arch" exit 1 ;; esac } # 获取当前版本 get_current_version() { if [ -f "${INSTALL_DIR}/${SERVICE_NAME}" ]; then local version=$("${INSTALL_DIR}/${SERVICE_NAME}" --version 2>/dev/null | grep -oP 'v\K[0-9.]+' || echo "未知") echo "$version" else echo "未安装" fi } # 获取最新版本 get_latest_version() { local version=$(curl -s "${GITEA_REPO}/releases" | grep -oP 'releases/tag/v\K[0-9.]+' | head -1) if [ -z "$version" ]; then version="0.1.0" print_warn "无法自动获取版本,使用默认版本 ${version}" >&2 fi echo "$version" } # 下载二进制文件 download_binary() { local arch=$1 local version=$2 local binary_name="${SERVICE_NAME}-${arch}" local download_url="${GITEA_REPO}/releases/download/v${version}/${binary_name}" print_info "下载 ${arch} 架构的二进制文件..." print_info "下载地址: ${download_url}" if ! curl -L -f -o "/tmp/${binary_name}" "${download_url}"; then print_error "下载失败,请检查版本号和网络连接" print_info "尝试的 URL: ${download_url}" exit 1 fi chmod +x "/tmp/${binary_name}" print_info "下载完成" } # 备份当前版本 backup_current() { local backup_file="${INSTALL_DIR}/${SERVICE_NAME}.backup" if [ -f "${INSTALL_DIR}/${SERVICE_NAME}" ]; then print_info "备份当前版本..." cp "${INSTALL_DIR}/${SERVICE_NAME}" "${backup_file}" print_info "备份保存至: ${backup_file}" fi } # 恢复备份 restore_backup() { local backup_file="${INSTALL_DIR}/${SERVICE_NAME}.backup" if [ -f "${backup_file}" ]; then print_warn "恢复备份版本..." cp "${backup_file}" "${INSTALL_DIR}/${SERVICE_NAME}" chmod +x "${INSTALL_DIR}/${SERVICE_NAME}" print_info "已恢复到备份版本" fi } # 更新服务 update_service() { local arch=$1 local binary_name="${SERVICE_NAME}-${arch}" print_info "更新服务..." # 停止服务 if systemctl is-active --quiet "${SERVICE_NAME}"; then print_info "停止服务..." systemctl stop "${SERVICE_NAME}" fi # 替换二进制文件 cp "/tmp/${binary_name}" "${INSTALL_DIR}/${SERVICE_NAME}" chmod +x "${INSTALL_DIR}/${SERVICE_NAME}" print_info "服务更新完成" } # 启动服务 start_service() { print_info "启动服务..." systemctl start "${SERVICE_NAME}" sleep 2 if systemctl is-active --quiet "${SERVICE_NAME}"; then print_info "服务启动成功!" echo "" print_info "常用命令:" echo " 查看状态: systemctl status ${SERVICE_NAME}" echo " 查看日志: journalctl -u ${SERVICE_NAME} -f" echo " 停止服务: systemctl stop ${SERVICE_NAME}" echo " 重启服务: systemctl restart ${SERVICE_NAME}" else print_error "服务启动失败,正在恢复备份..." restore_backup systemctl start "${SERVICE_NAME}" if systemctl is-active --quiet "${SERVICE_NAME}"; then print_info "已恢复到备份版本" else print_error "恢复失败,请查看日志:" echo " journalctl -u ${SERVICE_NAME} -n 50" fi exit 1 fi } # 主函数 main() { echo "" print_info "=== PT System Checking 一键更新脚本 ===" echo "" check_root check_installed # 检测架构 ARCH=$(detect_arch) print_info "检测到系统架构: ${ARCH}" # 获取版本信息 CURRENT_VERSION=$(get_current_version) print_info "当前版本: ${CURRENT_VERSION}" print_info "获取最新版本信息..." LATEST_VERSION=$(get_latest_version) print_info "最新版本: v${LATEST_VERSION}" # 版本比较 if [ "$CURRENT_VERSION" == "$LATEST_VERSION" ]; then print_info "已是最新版本,无需更新" exit 0 fi echo "" print_warn "即将从 v${CURRENT_VERSION} 更新到 v${LATEST_VERSION}" # 检查是否为非交互模式 if [ -t 0 ]; then read -p "是否继续?(y/n): " confirm if [[ ! $confirm =~ ^[Yy]$ ]]; then print_warn "取消更新" exit 0 fi else print_info "检测到非交互模式,自动继续更新" fi echo "" # 备份当前版本 backup_current # 下载新版本 download_binary "${ARCH}" "${LATEST_VERSION}" # 更新服务 update_service "${ARCH}" # 启动服务 start_service # 清理临时文件 rm -f "/tmp/${SERVICE_NAME}-${ARCH}" echo "" print_info "更新完成!版本: v${LATEST_VERSION}" } # 运行主函数 main "$@"