fork: инструменты сборки и локальные дополнения (швы, синхронизация с автором)

This commit is contained in:
2026-10-12 15:16:32 +03:00
parent 47cdfd34a5
commit 45b8d1c783
5 changed files with 485 additions and 0 deletions
+93
View File
@@ -0,0 +1,93 @@
#!/usr/bin/env bash
# 3X-UI_KIT (форк hacker07) — локальные дополнения.
#
# Этот файл наш: автор его не знает и не правит, поэтому обновления автора его не ломают.
# kit подключает его одной строкой из kit.sh (шов в tools/fork_apply.py) и передаёт сюда
# аргументы командной строки. Всё, что мы дописываем к kit, живёт ЗДЕСЬ.
#
# Команды: kit local <команда> (справка: kit local help)
#
# Правила работы с файлом: только функции и никакого кода на верхнем уровне (он выполняется
# при каждом запуске kit). Всё, что нужно от автора, читается лениво — сам kit на момент
# подключения ещё не объявил свои функции.
kit_local_help() {
cat <<'EOF'
3X-UI KIT — дополнения форка (hacker07):
kit local help эта справка
kit local version версия kit, источник обновлений и номер нашего патч-уровня
kit local channel откуда берутся обновления и чем проверяется подпись
kit local seams какие места форк правит в файлах автора (метки в /usr/local/bin/kit)
kit local masking состояние маскировки: REALITY (свой домен) и прочие входы
Файл дополнений: /usr/local/lib/kit/kit-local.sh (ставится установщиком и обновляется
вместе с релизом форка). Правки автора этот файл не перезаписывают.
EOF
}
kit_local_version() {
printf 'kit: %s (форк hacker07)\n' "${KIT_VERSION:-?}"
printf 'источник: %s\n' "${KIT_RAW:-?}"
local lib=${KIT_LOCAL_LIB:-/usr/local/lib/kit/kit-local.sh}
printf 'наш файл: %s\n' "$lib"
[[ -r $lib ]] && printf 'собран: %s\n' "$(date -r "$lib" '+%Y-%m-%d %H:%M' 2>/dev/null || echo '?')"
local latest
latest=$(cat /etc/kit/latest-version 2>/dev/null || true)
[[ -n $latest ]] && printf 'последняя: %s\n' "$latest"
return 0
}
kit_local_channel() {
printf 'файлы релиза: %s\n' "${KIT_RAW:-?}"
printf 'подпись: id=%s namespace=%s\n' "${KIT_SIG_ID:-?}" "${KIT_SIG_NS:-?}"
local n=0 k
for k in "${KIT_SIGNERS[@]:-}"; do [[ -n $k ]] && n=$((n + 1)); done
printf 'ключей в KIT_SIGNERS: %d (должен быть только ключ форка)\n' "$n"
if [[ $n -eq 0 ]]; then
printf 'ВНИМАНИЕ: список ключей пуст — обновление не пройдёт проверку подписи.\n'
fi
return 0
}
kit_local_seams() {
local bin=/usr/local/bin/kit
[[ -r $bin ]] || { printf 'нет %s\n' "$bin"; return 1; }
grep -n '3X-UI_KIT (форк hacker07)' "$bin" 2>/dev/null \
|| printf 'метки форка в %s не найдены — сборка не наша?\n' "$bin"
return 0
}
# Короткая сводка по маскировке: у REALITY должно быть «свой домен», у остальных — сосед.
kit_local_masking() {
command -v kit >/dev/null 2>&1 || { printf 'нет команды kit\n'; return 1; }
kit net site 2>/dev/null || printf 'посмотреть: kit net site (в этой версии — kit sni rotate)\n'
return 0
}
kit_local_cmd() {
case ${1:-help} in
help | -h | --help) kit_local_help ;;
version | -v) kit_local_version ;;
channel) kit_local_channel ;;
seams) kit_local_seams ;;
masking | mask) kit_local_masking ;;
*)
printf 'Неизвестная команда форка: %s\n' "$1" >&2
kit_local_help >&2
return 2
;;
esac
}
# Точка входа: вызывается из kit.sh с аргументами командной строки.
# Если команда не наша — возвращаем 0, и kit работает ровно как раньше.
kit_local_dispatch() {
case ${1:-} in
local)
shift
kit_local_cmd "$@"
exit $?
;;
*) return 0 ;;
esac
}