#!/bin/sh # SPDX-License-Identifier: GPL-2.0-only # # Copyright (C) 2022-2023 ImmortalWrt.org NAME="homeproxy" RESOURCES_DIR="/etc/$NAME/resources" mkdir -p "$RESOURCES_DIR" RUN_DIR="/var/run/$NAME" LOG_PATH="$RUN_DIR/$NAME.log" mkdir -p "$RUN_DIR" log() { echo -e "$(date "+%Y-%m-%d %H:%M:%S") $*" >> "$LOG_PATH" } set_lock() { local act="$1" local type="$2" local lock="$RUN_DIR/update_resources-$type.lock" if [ "$act" = "set" ]; then if [ -e "$lock" ]; then log "[$(to_upper "$type")] A task is already running." exit 2 else touch "$lock" fi elif [ "$act" = "remove" ]; then rm -f "$lock" fi } to_upper() { echo -e "$1" | tr "[a-z]" "[A-Z]" } check_list_update() { local listtype="$1" local listrepo="$2" local listref="$3" local listname="$4" local github_token="$(uci -q get homeproxy.config.github_token)" local wget="wget --timeout=10 -q" set_lock "set" "$listtype" [ -z "$github_token" ] || github_token="--header=Authorization: Bearer $github_token" local list_info="$($wget "${github_token:--q}" -O- "https://api.github.com/repos/$listrepo/commits?sha=$listref&path=$listname&per_page=1")" local list_sha="$(echo -e "$list_info" | jsonfilter -qe "@[0].sha")" local list_ver="$(echo -e "$list_info" | jsonfilter -qe "@[0].commit.message" | grep -Eo "[0-9-]+" | tr -d '-')" if [ -z "$list_sha" ] || [ -z "$list_ver" ]; then log "[$(to_upper "$listtype")] Failed to get the latest version, please retry later." set_lock "remove" "$listtype" return 1 fi local local_list_ver="$(cat "$RESOURCES_DIR/$listtype.ver" 2>"/dev/null" || echo "NOT FOUND")" if [ "$local_list_ver" = "$list_ver" ]; then log "[$(to_upper "$listtype")] Current version: $list_ver." log "[$(to_upper "$listtype")] You're already at the latest version." set_lock "remove" "$listtype" return 3 else log "[$(to_upper "$listtype")] Local version: $local_list_ver, latest version: $list_ver." fi if ! $wget "https://fastly.jsdelivr.net/gh/$listrepo@$list_sha/$listname" -O "$RUN_DIR/$listname" || [ ! -s "$RUN_DIR/$listname" ]; then rm -f "$RUN_DIR/$listname" log "[$(to_upper "$listtype")] Update failed." set_lock "remove" "$listtype" return 1 fi mv -f "$RUN_DIR/$listname" "$RESOURCES_DIR/$listtype.${listname##*.}" echo -e "$list_ver" > "$RESOURCES_DIR/$listtype.ver" log "[$(to_upper "$listtype")] Successfully updated." set_lock "remove" "$listtype" return 0 } case "$1" in "china_ip4") check_list_update "$1" "1715173329/IPCIDR-CHINA" "master" "ipv4.txt" ;; "china_ip6") check_list_update "$1" "1715173329/IPCIDR-CHINA" "master" "ipv6.txt" ;; "gfw_list") check_list_update "$1" "Loyalsoldier/v2ray-rules-dat" "release" "gfw.txt" ;; "china_list") check_list_update "$1" "Loyalsoldier/v2ray-rules-dat" "release" "direct-list.txt" && \ sed -i -e "s/full://g" -e "/:/d" "$RESOURCES_DIR/china_list.txt" ;; *) echo -e "Usage: $0 " exit 1 ;; esac