214 lines
10 KiB
Bash
214 lines
10 KiB
Bash
#!/bin/bash
|
|
. /usr/share/openclash/log.sh
|
|
|
|
set_lock() {
|
|
exec 878>"/tmp/lock/openclash_update.lock" 2>/dev/null
|
|
flock -x 878 2>/dev/null
|
|
}
|
|
|
|
del_lock() {
|
|
flock -u 878 2>/dev/null
|
|
rm -rf "/tmp/lock/openclash_update.lock"
|
|
}
|
|
|
|
if [ -n "$1" ] && [ "$1" != "one_key_update" ]; then
|
|
[ ! -f "/tmp/openclash_last_version" ] && /usr/share/openclash/openclash_version.sh "$1" 2>/dev/null
|
|
elif [ -n "$2" ]; then
|
|
[ ! -f "/tmp/openclash_last_version" ] && /usr/share/openclash/openclash_version.sh "$2" 2>/dev/null
|
|
else
|
|
[ ! -f "/tmp/openclash_last_version" ] && /usr/share/openclash/openclash_version.sh 2>/dev/null
|
|
fi
|
|
|
|
if [ ! -f "/tmp/openclash_last_version" ]; then
|
|
LOG_OUT "Error: Failed to Get Version Information, Please Try Again Later..."
|
|
SLOG_CLEAN
|
|
exit 0
|
|
fi
|
|
|
|
LAST_OPVER="/tmp/openclash_last_version"
|
|
LAST_VER=$(sed -n 1p "$LAST_OPVER" 2>/dev/null |sed "s/^v//g" |tr -d "\n")
|
|
if [ -x "/bin/opkg" ]; then
|
|
OP_CV=$(rm -f /var/lock/opkg.lock && opkg status luci-app-openclash 2>/dev/null |grep 'Version' |awk -F 'Version: ' '{print $2}' |awk -F '.' '{print $2$3}' 2>/dev/null)
|
|
elif [ -x "/usr/bin/apk" ]; then
|
|
OP_CV=$(apk list luci-app-openclash 2>/dev/null |grep 'installed' | grep -oE '\d+(\.\d+)*' | head -1 |awk -F '.' '{print $2$3}' 2>/dev/null)
|
|
fi
|
|
OP_LV=$(sed -n 1p "$LAST_OPVER" 2>/dev/null |awk -F 'v' '{print $2}' |awk -F '.' '{print $2$3}' 2>/dev/null)
|
|
RELEASE_BRANCH=$(uci -q get openclash.config.release_branch || echo "master")
|
|
LOG_FILE="/tmp/openclash.log"
|
|
github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0)
|
|
|
|
#一键更新
|
|
if [ "$1" = "one_key_update" ]; then
|
|
uci -q set openclash.config.enable=1
|
|
uci -q commit openclash
|
|
if [ "$github_address_mod" = "0" ] && [ -z "$2" ]; then
|
|
LOG_OUT "Tip: If the download fails, try setting the CDN in Overwrite Settings - General Settings - Github Address Modify Options"
|
|
fi
|
|
if [ -n "$2" ]; then
|
|
/usr/share/openclash/openclash_core.sh "Meta" "$1" "$2" >/dev/null 2>&1 &
|
|
github_address_mod="$2"
|
|
else
|
|
/usr/share/openclash/openclash_core.sh "Meta" "$1" >/dev/null 2>&1 &
|
|
fi
|
|
|
|
wait
|
|
else
|
|
if [ "$github_address_mod" = "0" ]; then
|
|
LOG_OUT "Tip: If the download fails, try setting the CDN in Overwrite Settings - General Settings - Github Address Modify Options"
|
|
fi
|
|
fi
|
|
|
|
set_lock
|
|
|
|
if [ -n "$OP_CV" ] && [ -n "$OP_LV" ] && [ "$(expr "$OP_LV" \> "$OP_CV")" -eq 1 ] && [ -f "$LAST_OPVER" ]; then
|
|
LOG_OUT "Start Downloading【OpenClash - v$LAST_VER】..."
|
|
if [ "$github_address_mod" != "0" ]; then
|
|
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
|
if [ -x "/bin/opkg" ]; then
|
|
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@package/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 |sed ':a;N;$!ba; s/\n/ /g' | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
|
elif [ -x "/usr/bin/apk" ]; then
|
|
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@package/"$RELEASE_BRANCH"/luci-app-openclash-"$LAST_VER".apk -o /tmp/openclash.apk 2>&1 |sed ':a;N;$!ba; s/\n/ /g' | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.apk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
|
fi
|
|
else
|
|
if [ -x "/bin/opkg" ]; then
|
|
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/package/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 |sed ':a;N;$!ba; s/\n/ /g' | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
|
elif [ -x "/usr/bin/apk" ]; then
|
|
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/package/"$RELEASE_BRANCH"/luci-app-openclash-"$LAST_VER".apk -o /tmp/openclash.apk 2>&1 |sed ':a;N;$!ba; s/\n/ /g' | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.apk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
|
fi
|
|
fi
|
|
else
|
|
if [ -x "/bin/opkg" ]; then
|
|
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/package/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 |sed ':a;N;$!ba; s/\n/ /g' | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
|
elif [ -x "/usr/bin/apk" ]; then
|
|
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/package/"$RELEASE_BRANCH"/luci-app-openclash-"$LAST_VER".apk -o /tmp/openclash.apk 2>&1 |sed ':a;N;$!ba; s/\n/ /g' | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.apk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
|
fi
|
|
fi
|
|
|
|
if [ "${PIPESTATUS[0]}" -eq 0 ]; then
|
|
LOG_OUT "【OpenClash - v$LAST_VER】Download Successful, Start Pre Update Test..."
|
|
if [ -x "/bin/opkg" ]; then
|
|
if [ -s "/tmp/openclash.ipk" ]; then
|
|
if [ -z "$(opkg install /tmp/openclash.ipk --noaction 2>/dev/null |grep 'Upgrading luci-app-openclash on root' 2>/dev/null)" ]; then
|
|
LOG_OUT "【OpenClash - v$LAST_VER】Pre Update Test Failed, The File is Saved in /tmp/openclash.ipk, Please Try to Update Manually!"
|
|
if [ "$(uci -q get openclash.config.config_reload)" -eq 1 ]; then
|
|
uci -q set openclash.config.config_reload=0
|
|
uci -q commit openclash
|
|
/etc/init.d/openclash restart >/dev/null 2>&1 &
|
|
else
|
|
SLOG_CLEAN
|
|
fi
|
|
del_lock
|
|
exit 0
|
|
fi
|
|
fi
|
|
elif [ -x "/usr/bin/apk" ]; then
|
|
if [ -s "/tmp/openclash.apk" ]; then
|
|
apk add -s -q --clean-protected --allow-untrusted /tmp/openclash.apk >/dev/null 2>&1
|
|
if [ "$?" != "0" ]; then
|
|
LOG_OUT "【OpenClash - v$LAST_VER】Pre Update Test Failed, The File is Saved in /tmp/openclash.apk, Please Try to Update Manually!"
|
|
if [ "$(uci -q get openclash.config.config_reload)" -eq 1 ]; then
|
|
uci -q set openclash.config.config_reload=0
|
|
uci -q commit openclash
|
|
/etc/init.d/openclash restart >/dev/null 2>&1 &
|
|
else
|
|
SLOG_CLEAN
|
|
fi
|
|
del_lock
|
|
exit 0
|
|
fi
|
|
fi
|
|
fi
|
|
LOG_OUT "【OpenClash - v$LAST_VER】Pre Update Test Passed, Ready to Update and Please Do not Refresh The Page and Other Operations..."
|
|
cat > /tmp/openclash_update.sh <<"EOF"
|
|
#!/bin/sh
|
|
START_LOG="/tmp/openclash_start.log"
|
|
LOG_FILE="/tmp/openclash.log"
|
|
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
|
|
|
|
LOG_OUT()
|
|
{
|
|
if [ -n "${1}" ]; then
|
|
echo -e "${1}" > $START_LOG
|
|
echo -e "${LOGTIME} ${1}" >> $LOG_FILE
|
|
fi
|
|
}
|
|
|
|
SLOG_CLEAN()
|
|
{
|
|
echo "" > $START_LOG
|
|
}
|
|
|
|
uci -q set openclash.config.enable=0
|
|
uci -q commit openclash
|
|
if [ -x "/bin/opkg" ]; then
|
|
LOG_OUT "Uninstalling The Old Version, Please Do not Refresh The Page or Do Other Operations..."
|
|
opkg remove --force-depends --force-remove luci-app-openclash
|
|
fi
|
|
LOG_OUT "Installing The New Version, Please Do Not Refresh The Page or Do Other Operations..."
|
|
if [ -x "/bin/opkg" ]; then
|
|
opkg install /tmp/openclash.ipk
|
|
elif [ -x "/usr/bin/apk" ]; then
|
|
apk add -q --clean-protected --allow-untrusted /tmp/openclash.apk
|
|
fi
|
|
if [ -x "/bin/opkg" ]; then
|
|
if [ "$?" != "0" ] || [ -z "$(opkg info *openclash |grep Installed-Time)" ]; then
|
|
opkg install /tmp/openclash.ipk
|
|
fi
|
|
if [ "$?" == "0" ] && [ -n "$(opkg info *openclash |grep Installed-Time)" ]; then
|
|
rm -rf /tmp/openclash.ipk >/dev/null 2>&1
|
|
LOG_OUT "OpenClash Update Successful, About To Restart!"
|
|
uci -q set openclash.config.enable=1
|
|
uci -q commit openclash
|
|
/etc/init.d/openclash restart 2>/dev/null
|
|
else
|
|
LOG_OUT "OpenClash Update Failed, The File is Saved in /tmp/openclash.ipk, Please Try to Update Manually!"
|
|
SLOG_CLEAN
|
|
fi
|
|
elif [ -x "/usr/bin/apk" ]; then
|
|
if [ "$?" != "0" ] || [ -z "$(apk list luci-app-openclash 2>/dev/null |grep 'installed')" ]; then
|
|
apk add -q --clean-protected --allow-untrusted /tmp/openclash.apk
|
|
fi
|
|
if [ "$?" != "0" ] || [ -z "$(apk list luci-app-openclash 2>/dev/null |grep 'installed')" ]; then
|
|
rm -rf /tmp/openclash.apk >/dev/null 2>&1
|
|
LOG_OUT "OpenClash Update Successful, About To Restart!"
|
|
uci -q set openclash.config.enable=1
|
|
uci -q commit openclash
|
|
/etc/init.d/openclash restart 2>/dev/null
|
|
else
|
|
LOG_OUT "OpenClash Update Failed, The File is Saved in /tmp/openclash.apk, Please Try to Update Manually!"
|
|
SLOG_CLEAN
|
|
fi
|
|
fi
|
|
EOF
|
|
chmod 4755 /tmp/openclash_update.sh
|
|
nohup /tmp/openclash_update.sh &
|
|
wait
|
|
rm -rf /tmp/openclash_update.sh
|
|
else
|
|
LOG_OUT "【OpenClash - v$LAST_VER】Download Failed, Please Check The Network or Try Again Later!"
|
|
rm -rf /tmp/openclash.ipk >/dev/null 2>&1
|
|
rm -rf /tmp/openclash.apk >/dev/null 2>&1
|
|
if [ "$(uci -q get openclash.config.config_reload)" -eq 1 ]; then
|
|
uci -q set openclash.config.config_reload=0
|
|
uci -q commit openclash
|
|
/etc/init.d/openclash restart >/dev/null 2>&1 &
|
|
else
|
|
SLOG_CLEAN
|
|
fi
|
|
fi
|
|
else
|
|
if [ ! -f "$LAST_OPVER" ] || [ -z "$OP_CV" ] || [ -z "$OP_LV" ]; then
|
|
LOG_OUT "Error: Failed to Get Version Information, Please Try Again Later..."
|
|
else
|
|
LOG_OUT "OpenClash Has not Been Updated, Stop Continuing!"
|
|
fi
|
|
if [ "$(uci -q get openclash.config.config_reload)" -eq 1 ]; then
|
|
uci -q set openclash.config.config_reload=0
|
|
uci -q commit openclash
|
|
/etc/init.d/openclash restart >/dev/null 2>&1 &
|
|
else
|
|
SLOG_CLEAN
|
|
fi
|
|
fi
|
|
del_lock
|