build 2026-09-20 03:18 UTC (6cd10434a3)

This commit is contained in:
gitea-actions
2026-09-20 03:18:25 +00:00
commit 117a97ba9e
54 changed files with 1524 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
#!/bin/sh
# Обновляет локальный ipcheck.dat из ветки release. Рассчитан на запуск по cron.
#
# Скачивает файл, только если его sha256 отличается от локального, проверяет
# контрольную сумму до подмены и перезапускает сервис только когда файл реально
# изменился. Молчит, если обновлять нечего, — cron не будет слать письма впустую.
#
# ./update-geosite.sh
# BASE_URL=https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release \
# DEST=/usr/local/x-ui/bin/ipcheck.dat RESTART_CMD='x-ui restart' ./update-geosite.sh
#
# Коды возврата: 0 — обновлено или уже актуально, 1 — ошибка.
set -eu
BASE_URL="${BASE_URL:-https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release}"
DEST="${DEST:-/usr/local/x-ui/bin/ipcheck.dat}"
NAME="${NAME:-$(basename "$DEST")}"
RESTART_CMD="${RESTART_CMD:-}"
TIMEOUT="${TIMEOUT:-30}"
log() { printf '%s update-geosite: %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$*"; }
die() { log "ОШИБКА: $*" >&2; exit 1; }
command -v curl >/dev/null 2>&1 || die "нужен curl"
if command -v sha256sum >/dev/null 2>&1; then
hash_of() { sha256sum "$1" | cut -d' ' -f1; }
elif command -v shasum >/dev/null 2>&1; then
hash_of() { shasum -a 256 "$1" | cut -d' ' -f1; }
else
die "нужен sha256sum или shasum"
fi
fetch() { curl -fsSL --retry 3 --retry-delay 2 --max-time "$TIMEOUT" "$1"; }
# Без промежуточной переменной статус вернул бы cut, а не curl.
remote_line=$(fetch "$BASE_URL/$NAME.sha256sum") ||
die "не удалось скачать $BASE_URL/$NAME.sha256sum"
remote_sum=$(printf '%s' "$remote_line" | cut -d' ' -f1)
case "$remote_sum" in
[0-9a-f][0-9a-f]*) [ "${#remote_sum}" -eq 64 ] || die "битая контрольная сумма: $remote_sum" ;;
*) die "битая контрольная сумма: $remote_sum" ;;
esac
if [ -f "$DEST" ] && [ "$(hash_of "$DEST")" = "$remote_sum" ]; then
exit 0 # уже актуально — тишина
fi
tmp=$(mktemp "${TMPDIR:-/tmp}/ipcheck.XXXXXX") || die "не удалось создать временный файл"
trap 'rm -f "$tmp"' EXIT INT TERM
fetch "$BASE_URL/$NAME" > "$tmp" || die "не удалось скачать $BASE_URL/$NAME"
got=$(hash_of "$tmp")
[ "$got" = "$remote_sum" ] || die "контрольная сумма не совпала: ожидалось $remote_sum, получено $got"
[ -s "$tmp" ] || die "скачан пустой файл"
mkdir -p "$(dirname "$DEST")"
if [ -f "$DEST" ]; then
cp -p "$DEST" "$DEST.bak" || die "не удалось сохранить резервную копию"
fi
# mv в пределах одного каталога атомарен: Xray никогда не увидит половину файла.
cat "$tmp" > "$DEST.new" && mv -f "$DEST.new" "$DEST" || die "не удалось записать $DEST"
log "обновлён $DEST (sha256 $remote_sum)"
if [ -n "$RESTART_CMD" ]; then
if sh -c "$RESTART_CMD"; then
log "выполнено: $RESTART_CMD"
else
die "перезапуск не удался: $RESTART_CMD"
fi
fi