From cf1327cbeabd11576f0f1c6a03bc750239431782 Mon Sep 17 00:00:00 2001 From: Hyy2001X <1804430051@qq.com> Date: Fri, 30 Apr 2021 22:20:27 +0800 Subject: [PATCH] =?UTF-8?q?V5.7=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81,?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20FastGit=20=E9=95=9C=E5=83=8F=E5=8A=A0?= =?UTF-8?q?=E9=80=9F=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Scripts/AutoUpdate.sh | 244 +++++++++++++++++++++--------------------- 1 file changed, 123 insertions(+), 121 deletions(-) diff --git a/Scripts/AutoUpdate.sh b/Scripts/AutoUpdate.sh index 83b9163..452ce28 100755 --- a/Scripts/AutoUpdate.sh +++ b/Scripts/AutoUpdate.sh @@ -3,7 +3,7 @@ # AutoBuild Module by Hyy2001 # AutoUpdate for Openwrt -Version=V5.6 +Version=V5.7 Shell_Helper() { cat <...] [-l] [-d] 更新参数: - -q 更新固件,不打印备份信息日志 [保留配置] -n 更新固件 [不保留配置] - -f 强制更新固件,即跳过版本号验证,自动下载以及安装必要软件包 [保留配置] + -f | -force 强制更新固件,即跳过版本号验证,自动下载以及安装必要软件包 [保留配置] -u 适用于定时更新 LUCI 的参数 [保留配置] 设置参数: -c [额外参数:] 更换 Github 检查更新以及固件下载地址 - -b [额外参数:<引导方式 UEFI/Legacy>] 指定 x86 设备下载使用 UEFI/Legacy 引导的固件 [危险] + -b | -boot [额外参数:<引导方式 UEFI/Legacy>] 指定 x86 设备下载使用 UEFI/Legacy 引导的固件 [危险] 其他: - -l 列出所有信息 - -d 清除固件下载缓存 + -l | -list 列出所有信息 + -d | -del 清除固件下载缓存 -h | -help 打印帮助信息 EOF @@ -47,36 +46,35 @@ Github 地址: ${Github} 作者/仓库: ${Author}" 固件格式: ${Firmware_SFX} EOF - if [[ ${DEFAULT_Device} == "x86_64" ]];then - echo "EFI 引导: ${EFI_Boot}" - echo "固件压缩: ${Compressed_x86}" - fi + [[ ${DEFAULT_Device} == "x86_64" ]] && { + echo "EFI 引导: ${EFI_Mode}" + echo "固件压缩: ${Compressed_Firmware}" + } exit } Install_Pkg() { - PKG_NAME=${1} - grep "${PKG_NAME}" /tmp/Package_list > /dev/null 2>&1 - if [[ $? -ne 0 ]];then - if [[ "${Force_Update}" == "1" ]] || [[ "${AutoUpdate_Mode}" == "1" ]];then - Choose="Y" - else + PKG_NAME=$1 + if [[ ! "$(cat /tmp/Package_list)" =~ "${PKG_NAME}" ]];then + [[ "${Force_Update}" == "1" ]] || [[ "${AutoUpdate_Mode}" == "1" ]] && { + Choose=Y + } || { TIME && read -p "未安装[${PKG_NAME}],是否执行安装?[Y/n]:" Choose - fi + } if [[ "${Choose}" == Y ]] || [[ "${Choose}" == y ]];then TIME && echo -e "开始安装[${PKG_NAME}],请耐心等待...\n" opkg update > /dev/null 2>&1 opkg install ${PKG_NAME} - if [[ $? -ne 0 ]];then - TIME && echo "[${PKG_NAME}] 安装失败,请尝试手动安装!" - exit - else + [[ ! $? -ne 0 ]] && { TIME && echo "[${PKG_NAME}] 安装成功!" - fi + } || { + TIME && echo "[${PKG_NAME}] 安装失败,请尝试手动安装!" + exit 1 + } else TIME && echo "用户已取消安装,即将退出更新脚本..." sleep 2 - exit + exit 0 fi fi } @@ -85,8 +83,12 @@ TIME() { echo -ne "\n[$(date "+%H:%M:%S")] " } -Input_Option="$1" -Input_Other="$2" +[ ! -f /etc/openwrt_info ] && { + echo -e "\n未检测到 /etc/openwrt/info,无法运行更新程序!" + exit 1 +} +Input_Option=$1 +Input_Other=$2 opkg list | awk '{print $1}' > /tmp/Package_list CURRENT_Version="$(awk 'NR==1' /etc/openwrt_info)" Github="$(awk 'NR==2' /etc/openwrt_info)" @@ -101,39 +103,35 @@ Overlay_Available="$(df -h | grep ":/overlay" | awk '{print $4}' | awk 'NR==1')" Retry_Times=4 case ${DEFAULT_Device} in x86_64) - [[ -z ${Firmware_Type} ]] && Firmware_Type="img" - if [[ "${Firmware_Type}" == "img.gz" ]];then - Compressed_x86="1" - else - Compressed_x86="0" - fi - if [ -f /etc/openwrt_boot ];then + [[ -z "${Firmware_Type}" ]] && Firmware_Type=img + [[ "${Firmware_Type}" == img.gz ]] && { + Compressed_Firmware=1 + } || Compressed_Firmware=0 + [ -f /etc/openwrt_boot ] && { BOOT_Type="-$(cat /etc/openwrt_boot)" - else - if [ -d /sys/firmware/efi ];then + } || { + [ -d /sys/firmware/efi ] && { BOOT_Type="-UEFI" - else - BOOT_Type="-Legacy" - fi - fi - case "${BOOT_Type}" in + } || BOOT_Type="-Legacy" + } + case ${BOOT_Type} in -Legacy) - EFI_Boot=0 + EFI_Mode=0 ;; -UEFI) - EFI_Boot=1 + EFI_Mode=1 ;; esac Firmware_SFX="${BOOT_Type}.${Firmware_Type}" Detail_SFX="${BOOT_Type}.detail" - CURRENT_Device="x86_64" + CURRENT_Device=x86_64 Space_Req=480 ;; *) CURRENT_Device="$(jsonfilter -e '@.model.id' < /etc/board.json | tr ',' '_')" Firmware_SFX=".${Firmware_Type}" [[ -z ${Firmware_SFX} ]] && Firmware_SFX=".bin" - Detail_SFX=".detail" + Detail_SFX=.detail Space_Req=0 esac cd /etc @@ -142,13 +140,13 @@ if [[ -z "${Input_Option}" ]];then Upgrade_Options="-q" && TIME && echo "执行: 保留配置更新固件[静默模式]" else case ${Input_Option} in - -n | -f | -u) + -n | -f | -force | -u) case ${Input_Option} in -n) TIME && echo "执行: 更新固件(不保留配置)" Upgrade_Options="-n" ;; - -f) + -f | -force) Force_Update=1 Upgrade_Options="-q" TIME && echo "执行: 强制更新固件(保留配置)" @@ -160,28 +158,27 @@ else esac ;; -c) - if [[ ! -z "${Input_Other}" ]];then - sed -i "s?${Github}?${Input_Other}?g" /etc/openwrt_info > /dev/null 2>&1 + if [[ -n "${Input_Other}" ]];then + sed -i "s?${Github}?${Input_Other}?g" /etc/openwrt_info echo -e "\nGithub 地址已更换为: ${Input_Other}" unset Input_Other + exit 0 else Shell_Helper fi - exit 0 ;; - -l | -L) + -l | -list) List_Info ;; - -d) + -d | -del) rm -f /tmp/Downloads/* /tmp/Github_Tags TIME && echo "固件下载缓存清理完成!" - sleep 1 exit 0 ;; - -h | -H | --help) + -h | --help) Shell_Helper ;; - -b) + -b | -boot) [[ -z "${Input_Other}" ]] && Shell_Helper case "${Input_Other}" in UEFI | Legacy) @@ -203,74 +200,77 @@ else ;; esac fi -grep "curl" /tmp/Package_list > /dev/null 2>&1 -if [[ ! $? -ne 0 ]];then +if [[ "$(cat /tmp/Package_list)" =~ "curl" ]];then Google_Check=$(curl -I -s --connect-timeout 3 google.com -w %{http_code} | tail -n1) - if [ ! "$Google_Check" == 301 ];then + [[ ! "$Google_Check" == 301 ]] && { TIME && echo "Google 连接失败,尝试使用 [FastGit] 镜像加速!" PROXY_URL="${_PROXY_URL}" - fi + } else TIME && echo "无法确定网络环境,默认使用 [FastGit] 镜像加速!" PROXY_URL="${_PROXY_URL}" fi -if [[ "${TMP_Available}" -lt "${Space_Req}" ]];then +[[ "${TMP_Available}" -lt "${Space_Req}" ]] && { TIME && echo "/tmp 空间不足: [${Space_Req}M],无法执行更新!" - exit -fi + exit 1 +} Install_Pkg wget if [[ -z "${CURRENT_Version}" ]];then TIME && echo "警告: 当前固件版本获取失败!" - CURRENT_Version="未知" + CURRENT_Version="Unknown" fi if [[ -z "${CURRENT_Device}" ]];then - [[ "${Force_Update}" == "1" ]] && exit - TIME && echo "警告: 当前设备名称获取失败,使用预设名称: [$DEFAULT_Device]" - CURRENT_Device="${DEFAULT_Device}" + [[ -n "$DEFAULT_Device" ]] && { + TIME && echo "警告: 当前设备名称获取失败,使用预设名称: [$DEFAULT_Device]" + CURRENT_Device="${DEFAULT_Device}" + } || { + TIME && echo "未检测到设备名称!" + exit 1 + } fi TIME && echo "正在检查版本更新..." wget -q ${Github_Tags} -O - > /tmp/Github_Tags -if [[ ! "$?" == 0 ]];then +[[ ! $? == 0 ]] && { TIME && echo "检查更新失败,请稍后重试!" - exit -fi + exit 1 +} TIME && echo "正在获取云端固件版本..." -GET_Firmware=$(cat /tmp/Github_Tags | egrep -o "AutoBuild-${CURRENT_Device}-R[0-9].+-[0-9]+${Firmware_SFX}" | awk 'END {print}') -GET_Version=$(echo ${GET_Firmware} | egrep -o "R[0-9].+-[0-9]+") -if [[ -z "${GET_Firmware}" ]] || [[ -z "${GET_Version}" ]];then +CLOUD_Firmware=$(cat /tmp/Github_Tags | egrep -o "AutoBuild-${CURRENT_Device}-R[0-9].+-[0-9]+${Firmware_SFX}" | awk 'END {print}') +CLOUD_Version=$(echo ${CLOUD_Firmware} | egrep -o "R[0-9].+-[0-9]+") +[[ -z "${CLOUD_Version}" ]] && { TIME && echo "云端固件版本获取失败!" - exit -fi -Firmware_Info="$(echo ${GET_Firmware} | egrep -o "AutoBuild-${CURRENT_Device}-R[0-9].+-[0-9]+")" -Firmware="${GET_Firmware}" -Firmware_Detail="${Firmware_Info}${Detail_SFX}" + exit 1 +} +Firmware_Name="$(echo ${CLOUD_Firmware} | egrep -o "AutoBuild-${CURRENT_Device}-R[0-9].+-[0-9]+")" +Firmware="${CLOUD_Firmware}" +Firmware_Detail="${Firmware_Name}${Detail_SFX}" let X=$(grep -n "${Firmware}" /tmp/Github_Tags | tail -1 | cut -d : -f 1)-4 -let Cloud_Firmware_Size=$(sed -n "${X}p" /tmp/Github_Tags | egrep -o "[0-9]+" | awk '{print ($1)/1048576}' | awk -F. '{print $1}')+1 +let CLOUD_Firmware_Size=$(sed -n "${X}p" /tmp/Github_Tags | egrep -o "[0-9]+" | awk '{print ($1)/1048576}' | awk -F. '{print $1}')+1 echo -e "\n固件作者: ${Author%/*}" echo "设备名称: ${CURRENT_Device}" echo "固件格式: ${Firmware_SFX}" echo -e "\n当前固件版本: ${CURRENT_Version}" -echo "云端固件版本: ${GET_Version}" +echo "云端固件版本: ${CLOUD_Version}" echo "当前可用空间: ${TMP_Available}M" -echo "云端固件大小: ${Cloud_Firmware_Size}M" -if [[ ! ${Force_Update} == 1 ]];then - if [[ "${TMP_Available}" -lt "${Cloud_Firmware_Size}" ]];then - TIME && echo "/tmp 空间不足: [${Cloud_Firmware_Size}M],无法执行更新!" +echo "云端固件大小: ${CLOUD_Firmware_Size}M" +if [[ ! "${Force_Update}" == 1 ]];then + [[ "${TMP_Available}" -lt "${CLOUD_Firmware_Size}" ]] && { + TIME && echo "/tmp 空间不足: [${CLOUD_Firmware_Size}M],无法执行更新!" exit - fi - if [[ ${CURRENT_Version} == ${GET_Version} ]];then - [[ "${AutoUpdate_Mode}" == "1" ]] && exit + } + if [[ "${CURRENT_Version}" == "${CLOUD_Version}" ]];then + [[ "${AutoUpdate_Mode}" == 1 ]] && exit 0 TIME && read -p "已是最新版本,是否强制更新固件?[Y/n]:" Choose - if [[ "${Choose}" == Y ]] || [[ "${Choose}" == y ]];then + [[ "${Choose}" == Y ]] || [[ "${Choose}" == y ]] && { TIME && echo "开始强制更新固件..." - else + } || { TIME && echo "已取消强制更新,即将退出更新程序..." sleep 2 - exit - fi + exit 0 + } fi fi -[[ ! -z "${PROXY_URL}" ]] && Github_Download=${PROXY_URL}/${Author}/releases/download/AutoUpdate +[[ -n "${PROXY_URL}" ]] && Github_Download=${PROXY_URL}/${Author}/releases/download/AutoUpdate echo -e "\n云端固件名称: ${Firmware}" echo "固件下载地址: ${Github_Download}" echo "固件保存位置: /tmp/Downloads" @@ -278,18 +278,20 @@ echo "固件保存位置: /tmp/Downloads" rm -f /tmp/Downloads/* TIME && echo "正在下载固件,请耐心等待..." cd /tmp/Downloads -while [ ${Retry_Times} -ge 0 ]; +while [ "${Retry_Times}" -ge 0 ]; do - if [[ ${Retry_Times} == 3 ]];then - TIME && echo "下载失败,尝试使用 [FastGit] 镜像加速!" - Github_Download=${_PROXY_URL}/${Author}/releases/download/AutoUpdate + if [[ "${Retry_Times}" == 3 ]];then + [[ -z "${PROXY_URL}" ]] && { + TIME && echo "正在尝试使用 [FastGit] 镜像加速下载..." + Github_Download=${_PROXY_URL}/${Author}/releases/download/AutoUpdate + } fi - if [[ ${Retry_Times} == 0 ]];then + if [[ "${Retry_Times}" == 0 ]];then TIME && echo "固件下载失败,请检查网络后重试!" - exit + exit 1 else wget -q --tries 1 --timeout 5 "${Github_Download}/${Firmware}" -O ${Firmware} - [[ "$?" == 0 ]] && break + [[ $? == 0 ]] && break fi Retry_Times=$((${Retry_Times} - 1)) TIME && echo "下载失败,剩余尝试次数: [${Retry_Times}]" @@ -298,41 +300,41 @@ done TIME && echo "固件下载成功!" TIME && echo "正在获取云端固件MD5,请耐心等待..." wget -q ${Github_Download}/${Firmware_Detail} -O ${Firmware_Detail} -if [[ ! "$?" == 0 ]];then +[[ ! $? == 0 ]] && { TIME && echo "MD5 获取失败,请检查网络后重试!" - exit -fi -GET_MD5=$(awk -F '[ :]' '/MD5/ {print $2;exit}' ${Firmware_Detail}) + exit 1 +} +CLOUD_MD5=$(awk -F '[ :]' '/MD5/ {print $2;exit}' ${Firmware_Detail}) CURRENT_MD5=$(md5sum ${Firmware} | cut -d ' ' -f1) echo -e "\n本地固件MD5:${CURRENT_MD5}" -echo "云端固件MD5:${GET_MD5}" -if [[ -z "${GET_MD5}" ]] || [[ -z "${CURRENT_MD5}" ]];then +echo "云端固件MD5:${CLOUD_MD5}" +[[ -z "${CLOUD_MD5}" ]] || [[ -z "${CURRENT_MD5}" ]] && { TIME && echo "MD5 获取失败!" - exit -fi -if [[ ! "${GET_MD5}" == "${CURRENT_MD5}" ]];then - TIME && echo "MD5 对比失败,请检查网络后重试!" - exit -else + exit 1 +} +[[ "${CLOUD_MD5}" == "${CURRENT_MD5}" ]] && { TIME && echo "MD5 对比通过!" -fi -if [[ ${Compressed_x86} == 1 ]];then - TIME && echo "检测到固件为 [.gz] 压缩格式,开始解压固件..." +} || { + TIME && echo "MD5 对比失败,请检查网络后重试!" + exit 1 +} +if [[ "${Compressed_Firmware}" == 1 ]];then + TIME && echo "检测到固件为 [.gz] 格式,开始解压固件..." Install_Pkg gzip gzip -dk ${Firmware} > /dev/null 2>&1 - Firmware="${Firmware_Info}${BOOT_Type}.img" - if [ -f "${Firmware}" ];then + Firmware="${Firmware_Name}${BOOT_Type}.img" + [ -f "${Firmware}" ] && { TIME && echo "固件解压成功,名称: ${Firmware}" - else + } || { TIME && echo "固件解压失败!" - exit - fi + exit 1 + } fi -TIME && echo -e "一切准备就绪,3s 后开始更新固件..." +TIME && echo -e "固件准备就绪,3s 后开始更新..." sleep 3 TIME && echo "正在更新固件,期间请耐心等待..." sysupgrade ${Upgrade_Options} ${Firmware} -if [[ $? -ne 0 ]];then - TIME && echo "固件刷写失败,请尝试手动下载更新固件!" - exit -fi +[[ $? -ne 0 ]] && { + TIME && echo "固件刷写失败,请尝试手动更新固件!" + exit 1 +}