223 lines
6.9 KiB
Bash
223 lines
6.9 KiB
Bash
#!/bin/sh
|
|
|
|
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
|
update_mode=$1
|
|
binpath=$(uci get AdGuardHome.AdGuardHome.binpath)
|
|
if [ -z "$binpath" ]; then
|
|
uci set AdGuardHome.AdGuardHome.binpath="/tmp/AdGuardHome/AdGuardHome"
|
|
binpath="/tmp/AdGuardHome/AdGuardHome"
|
|
fi
|
|
[[ ! -d ${binpath%/*} ]] && mkdir -p ${binpath%/*}
|
|
upxflag=$(uci get AdGuardHome.AdGuardHome.upxflag 2>/dev/null)
|
|
|
|
[[ -z ${upxflag} ]] && upxflag=off
|
|
enabled=$(uci get AdGuardHome.AdGuardHome.enabled 2>/dev/null)
|
|
core_version=$(uci get AdGuardHome.AdGuardHome.core_version 2>/dev/null)
|
|
case "${core_version}" in
|
|
beta)
|
|
core_api_url=https://api.github.com/repos/AdguardTeam/AdGuardHome/releases
|
|
;;
|
|
*)
|
|
core_api_url=https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest
|
|
;;
|
|
esac
|
|
|
|
Check_Task(){
|
|
running_tasks="$(ps -efww | grep -v grep | grep "AdGuardHome" | grep "update_core" | awk '{print $1}' | wc -l)"
|
|
case $1 in
|
|
force)
|
|
echo -e "执行: 强制更新核心"
|
|
echo -e "清除 ${running_tasks} 个进程 ..."
|
|
ps -efww | grep -v grep | grep -v $$ | grep "AdGuardHome" | grep "update_core" | awk '{print $1}' | xargs kill -9 2> /dev/null
|
|
;;
|
|
*)
|
|
[[ ${running_tasks} -gt 2 ]] && echo -e "已经有 ${running_tasks} 个任务正在运行, 请等待其执行结束或将其强行停止!" && EXIT 2
|
|
;;
|
|
esac
|
|
}
|
|
|
|
Check_Downloader(){
|
|
which curl > /dev/null 2>&1 && PKG="curl" && return
|
|
echo -e "\n未安装 curl"
|
|
which wget-ssl > /dev/null 2>&1 && PKG="wget-ssl" && return
|
|
echo "未安装 curl 和 wget, 无法检测更新!" && EXIT 1
|
|
}
|
|
|
|
Check_Updates(){
|
|
Check_Downloader
|
|
case "${PKG}" in
|
|
curl)
|
|
Downloader="curl -L -k -o"
|
|
_Downloader="curl -s"
|
|
;;
|
|
wget-ssl)
|
|
Downloader="wget-ssl --no-check-certificate -T 5 -O"
|
|
_Downloader="wget-ssl -q -O -"
|
|
;;
|
|
esac
|
|
echo "[${PKG}] 开始检查更新, 请耐心等待 ..."
|
|
Cloud_Version="$(${_Downloader} ${core_api_url} 2>/dev/null | grep 'tag_name' | grep -Eo "v[0-9].+[0-9.]" | awk 'NR==1')"
|
|
[[ -z ${Cloud_Version} ]] && echo -e "\n检查更新失败, 请检查网络或稍后重试!" && EXIT 1
|
|
if [[ -f ${binpath} ]]; then
|
|
Current_Version="$(${binpath} --version 2>/dev/null | grep -Eo "v[0-9].+[0-9]" | sed -r 's/(.*), c(.*)/\1/')"
|
|
else
|
|
Current_Version="未知"
|
|
fi
|
|
[[ -z ${Current_Version} ]] && Current_Version="未知"
|
|
echo -e "\n执行文件: ${binpath}\n正在检查更新, 请耐心等待 ..."
|
|
echo -e "\n当前 AdGuardHome 版本: ${Current_Version}\n云端 AdGuardHome 版本: ${Cloud_Version}"
|
|
if [[ ! "${Cloud_Version}" == "${Current_Version}" || "$1" == force ]]; then
|
|
Update_Core
|
|
else
|
|
echo -e "\n已是最新版本, 无需更新!"
|
|
EXIT 0
|
|
fi
|
|
EXIT 0
|
|
}
|
|
|
|
UPX_Compress(){
|
|
Arch_upx=$(GET_Arch )
|
|
# https://github.com/upx/upx/releases/download/v5.0.0/upx-5.0.0-amd64_linux.tar.xz
|
|
upx_latest_ver="$(${_Downloader} https://api.github.com/repos/upx/upx/releases/latest 2>/dev/null | grep -E 'tag_name' | grep -E '[0-9.]+' -o 2>/dev/null)"
|
|
upx_name="upx-${upx_latest_ver}-${Arch_upx}_linux.tar.xz"
|
|
echo -e "开始下载 ${upx_name} ...\n"
|
|
$Downloader /tmp/upx-${upx_latest_ver}-${Arch_upx}_linux.tar.xz "https://github.com/upx/upx/releases/download/v${upx_latest_ver}/${upx_name}"
|
|
if [[ ! -e /tmp/upx-${upx_latest_ver}-${Arch_upx}_linux.tar.xz ]]; then
|
|
echo -e "\n${upx_name} 下载失败!\n"
|
|
EXIT 1
|
|
else
|
|
echo -e "\n${upx_name} 下载成功!\n"
|
|
fi
|
|
which xz > /dev/null 2>&1 || (opkg list | grep ^xz || opkg update > /dev/null 2>&1 && opkg install xz --force-depends) || (echo "软件包 xz 安装失败!" && EXIT 1)
|
|
mkdir -p /tmp/upx-${upx_latest_ver}-${Arch_upx}_linux
|
|
echo -e "正在解压 ${upx_name} ...\n"
|
|
xz -d -c /tmp/upx-${upx_latest_ver}-${Arch_upx}_linux.tar.xz | tar -x -C "/tmp"
|
|
[[ ! -f /tmp/upx-${upx_latest_ver}-${Arch_upx}_linux/upx ]] && echo -e "\n${upx_name} 解压失败!" && EXIT 1
|
|
}
|
|
|
|
Update_Core(){
|
|
rm -r /tmp/AdGuardHome_Update > /dev/null 2>&1
|
|
mkdir -p "/tmp/AdGuardHome_Update"
|
|
|
|
Arch=$(GET_Arch )
|
|
eval link=$(uci get AdGuardHome.AdGuardHome.update_url 2>/dev/null)
|
|
echo -e "下载链接:${link}"
|
|
echo -e "文件名称:${link##*/}"
|
|
echo -e "\n开始下载 AdGuardHome 核心文件 ...\n"
|
|
$Downloader /tmp/AdGuardHome_Update/${link##*/} ${link}
|
|
if [[ $? != 0 ]];then
|
|
echo -e "\nAdGuardHome 核心下载失败 ..."
|
|
rm -r /tmp/AdGuardHome_Update
|
|
EXIT 1
|
|
fi
|
|
if [[ ${link##*.} == gz ]]; then
|
|
echo -e "\n正在解压 AdGuardHome ..."
|
|
tar -zxf "/tmp/AdGuardHome_Update/${link##*/}" -C "/tmp/AdGuardHome_Update/"
|
|
if [[ ! -e /tmp/AdGuardHome_Update/AdGuardHome ]]
|
|
then
|
|
echo "AdGuardHome 核心解压失败!"
|
|
rm -rf "/tmp/AdGuardHome_Update" > /dev/null 2>&1
|
|
EXIT 1
|
|
fi
|
|
downloadbin="/tmp/AdGuardHome_Update/AdGuardHome/AdGuardHome"
|
|
else
|
|
downloadbin="/tmp/AdGuardHome_Update/${link##*/}"
|
|
fi
|
|
chmod +x ${downloadbin}
|
|
echo -e "\nAdGuardHome 核心体积: $(awk 'BEGIN{printf "%.2fMB\n",'$((`ls -l $downloadbin | awk '{print $5}'`))'/1000000}')"
|
|
if [[ ${upxflag} != off ]]; then
|
|
UPX_Compress
|
|
echo -e "使用 UPX 压缩可能会花很长时间, 期间请耐心等待!\n正在压缩 $downloadbin ..."
|
|
/tmp/upx-${upx_latest_ver}-${Arch_upx}_linux/upx $upxflag $downloadbin > /dev/null 2>&1
|
|
echo -e "\n压缩后的核心体积: $(awk 'BEGIN{printf "%.2fMB\n",'$((`ls -l $downloadbin | awk '{print $5}'`))'/1000000}')"
|
|
else
|
|
echo "未启用 UPX 压缩, 跳过操作..."
|
|
fi
|
|
/etc/init.d/AdGuardHome stop > /dev/null 2>&1
|
|
echo -e "\n移动 AdGuardHome 核心文件到 ${binpath%/*} ..."
|
|
mv -f ${downloadbin} ${binpath} > /dev/null 2>&1
|
|
if [[ ! -s ${binpath} && $? != 0 ]]; then
|
|
echo -e "AdGuardHome 核心移动失败!\n可能是设备空间不足导致, 请尝试开启 UPX 压缩, 或更改 [执行文件路径] 为 /tmp/AdGuardHome"
|
|
EXIT 1
|
|
fi
|
|
rm -f /tmp/upx*.tar.xz
|
|
rm -rf /tmp/upx*
|
|
rm -rf /tmp/AdGuardHome_Update
|
|
chmod +x ${binpath}
|
|
if [[ ${enabled} == 1 ]]; then
|
|
echo -e "\n正在重启 AdGuardHome 服务..."
|
|
/etc/init.d/AdGuardHome restart
|
|
fi
|
|
echo -e "\nAdGuardHome 核心更新成功!"
|
|
}
|
|
|
|
GET_Arch() {
|
|
Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')"
|
|
case "${Archt}" in
|
|
"i386")
|
|
Arch="386"
|
|
;;
|
|
"i686")
|
|
Arch="386"
|
|
;;
|
|
"x86")
|
|
Arch="amd64"
|
|
;;
|
|
"mipsel")
|
|
Arch="mipsle"
|
|
;;
|
|
"mips64el")
|
|
Arch="mips64le"
|
|
Arch="mipsle"
|
|
echo -e "mips64el use $Arch may have bug"
|
|
;;
|
|
"mips")
|
|
Arch="mips"
|
|
;;
|
|
"mips64")
|
|
Arch="mips64"
|
|
Arch="mips"
|
|
echo -e "mips64 use $Arch may have bug"
|
|
;;
|
|
"arm")
|
|
Arch="arm"
|
|
;;
|
|
"aarch64")
|
|
Arch="arm64"
|
|
;;
|
|
"powerpc")
|
|
Arch="ppc"
|
|
echo -e "error not support $Archt"
|
|
EXIT 1
|
|
;;
|
|
"powerpc64")
|
|
Arch="ppc64"
|
|
echo -e "error not support $Archt"
|
|
EXIT 1
|
|
;;
|
|
|
|
*)
|
|
echo -e "error not support $Archt if you can use offical release please issue a bug"
|
|
EXIT 1
|
|
;;
|
|
esac
|
|
echo "$Arch"
|
|
}
|
|
|
|
EXIT(){
|
|
rm -rf /var/run/update_core $LOCKU 2>/dev/null
|
|
[[ $1 != 0 ]] && touch /var/run/update_core_error
|
|
exit $1
|
|
}
|
|
|
|
main(){
|
|
Check_Task ${update_mode}
|
|
Check_Updates ${update_mode}
|
|
}
|
|
|
|
trap "EXIT 1" SIGTERM SIGINT
|
|
touch /var/run/update_core
|
|
rm - rf /var/run/update_core_error 2>/dev/null
|
|
|
|
main
|