#!/bin/sh # SPDX-License-Identifier: GPL-2.0-only # # Copyright (C) 2022-2025 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" } 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 lock="$RUN_DIR/update_resources-$listtype.lock" local github_token="$(uci -q get homeproxy.config.github_token)" local wget="wget --timeout=10 -q" exec 200>"$lock" if ! flock -n 200 &> "/dev/null"; then log "[$(to_upper "$listtype")] A task is already running." return 2 fi local github_header_file="" if [ -n "$github_token" ]; then github_header_file="$RUN_DIR/.gh_header_${listtype}" ( umask 077; printf 'Authorization: Bearer %s\n' "$github_token" > "$github_header_file" ) trap "[ -n \"$github_header_file\" ] && rm -f \"$github_header_file\"" EXIT INT TERM fi local list_info="$($wget ${github_header_file:+--header-file=$github_header_file} -O- "https://api.github.com/repos/$listrepo/commits?sha=$listref&path=$listname&per_page=1")" local wget_exit=$? [ -n "$github_header_file" ] && rm -f "$github_header_file" trap - EXIT INT TERM if [ $wget_exit -ne 0 ]; then log "[$(to_upper "$listtype")] Failed to fetch version info (wget exit $wget_exit)." return 1 fi local list_sha="$(echo -e "$list_info" | jsonfilter -qe "@[0].sha")" local list_date="$(echo -e "$list_info" | jsonfilter -qe "@[0].commit.committer.date" | cut -d 'T' -f1)" if [ -z "$list_sha" ]; then log "[$(to_upper "$listtype")] Failed to get the latest version, please retry later." return 1 fi local list_ver="${list_date:+$list_date }$list_sha" local local_list_ver="$(cat "$RESOURCES_DIR/$listtype.ver" 2>"/dev/null" || echo "NOT_FOUND")" local local_list_sha="${local_list_ver##* }" local local_list_disp="${local_list_ver%% *}" if [ "$local_list_sha" = "$list_sha" ]; then [ "$local_list_ver" = "$local_list_sha" ] && [ -n "$list_date" ] && \ echo -e "$list_ver" > "$RESOURCES_DIR/$listtype.ver" log "[$(to_upper "$listtype")] Current version: ${list_ver%% *}." log "[$(to_upper "$listtype")] You're already at the latest version." return 3 else log "[$(to_upper "$listtype")] Local version: $local_list_disp, 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")] Download failed." return 1 fi if mv -f "$RUN_DIR/$listname" "$RESOURCES_DIR/$listtype.${listname##*.}"; then echo -e "$list_ver" > "$RESOURCES_DIR/$listtype.ver" log "[$(to_upper "$listtype")] Successfully updated." else rm -f "$RUN_DIR/$listname" log "[$(to_upper "$listtype")] Failed to install update (mv failed)." return 1 fi 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