#!/bin/bash
log() { echo "$(date "+[%Y-%m-%d %H:%M:%S]") $1" }
check_tool() { if ! command -v "$1" &> /dev/null; then log "错误:$1 未安装,请先安装 $1。" exit 1 fi }
log "检查依赖工具..." check_tool curl check_tool jq check_tool wget check_tool tar
DOWNLOAD_DIR="/opt/program" PROGRAM_DIR="$DOWNLOAD_DIR/AdGuardHome"
log "检查目录是否存在..." if [ ! -d "$DOWNLOAD_DIR" ]; then log "下载目录 $DOWNLOAD_DIR 不存在,正在创建..." mkdir -p "$DOWNLOAD_DIR" || { log "创建目录 $DOWNLOAD_DIR 失败!"; exit 1; } fi if [ ! -d "$PROGRAM_DIR" ]; then log "程序目录 $PROGRAM_DIR 不存在,正在创建..." mkdir -p "$PROGRAM_DIR" || { log "创建目录 $PROGRAM_DIR 失败!"; exit 1; } fi
log "获取 AdGuardHome 最新版本信息..." latest_version=$(curl -s https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest | jq -r .tag_name) if [ -z "$latest_version" ]; then log "无法获取最新版本信息,请检查网络或 GitHub API。" exit 1 fi
if [ -x "$PROGRAM_DIR/AdGuardHome" ]; then current_version=$("$PROGRAM_DIR/AdGuardHome" --version 2>/dev/null | grep -oP 'v\d+\.\d+\.\d+') if [ -z "$current_version" ]; then current_version="unknown" fi else current_version="unknown" fi
sorted_first=$(echo -e "$current_version\n$latest_version" | sort -V | head -n1) log "当前版本: $current_version,最新版本: $latest_version" if [ "$current_version" = "unknown" ] || { [ "$sorted_first" = "$current_version" ] && [ "$current_version" != "$latest_version" ]; }; then log "需要安装或更新至 $latest_version..." need_update=1 else log "当前已是最新版本 $current_version,无需更新。" need_update=0 fi
if [ $need_update -eq 1 ] || [ "$current_version" = "unknown" ]; then download_url=$(curl -s https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest | jq -r '.assets[] | select(.name | endswith("linux_amd64.tar.gz")) | .browser_download_url') if [ -z "$download_url" ]; then log "无法获取下载 URL,请检查 GitHub API。" exit 1 fi
log "正在从 $download_url 下载 AdGuardHome..." wget -q -O "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz" "$download_url" if [ $? -ne 0 ]; then log "下载失败,请检查网络。" rm -f "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz" exit 1 fi log "下载完成!"
log "解压安装包..." if tar -zxvf "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz" -C "$DOWNLOAD_DIR" > /dev/null; then log "解压成功,清理临时文件..." rm -f "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz" else log "解压失败!" rm -f "$DOWNLOAD_DIR/AdGuardHome_linux_amd64.tar.gz" exit 1 fi
if pgrep AdGuardHome > /dev/null; then log "停止正在运行的 AdGuardHome 进程..." pkill AdGuardHome || { log "停止进程失败!"; exit 1; } else log "没有正在运行的 AdGuardHome 进程。" fi
if [ -f /etc/systemd/system/AdGuardHome.service ]; then log "删除旧的服务文件..." rm -f /etc/systemd/system/AdGuardHome.service || { log "删除服务文件失败!"; exit 1; } fi
log "安装 AdGuardHome 服务..." echo " " "$PROGRAM_DIR/AdGuardHome" -s install || { log "服务安装失败!"; exit 1; } echo " " if systemctl is-active --quiet AdGuardHome; then log "AdGuardHome 已成功安装并启动!" else log "AdGuardHome 服务启动失败!" exit 1 fi else log "无需更新,脚本退出。" fi
log "脚本执行完毕。"
|