Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ec3d2e984 | ||
|
|
46eb923f41 | ||
|
|
8e03599e0b | ||
|
|
10865d1bdd | ||
|
|
7ea6df96a2 | ||
|
|
ed5f5b02f7 | ||
|
|
f188c5b1e0 | ||
|
|
f040c7fdca | ||
|
|
fb17d39526 | ||
|
|
e62f98cf53 |
No files matched your search
@@ -0,0 +1,6 @@
|
|||||||
|
*.sh text eol=lf
|
||||||
|
*.py text eol=lf
|
||||||
|
*.md text eol=lf
|
||||||
|
*.json text eol=lf
|
||||||
|
*.ko binary
|
||||||
|
*.gz binary
|
||||||
@@ -1,3 +1,55 @@
|
|||||||
|
## 4.68 — 27.10.2026
|
||||||
|
|
||||||
|
### 🦊 Forkozz
|
||||||
|
- ➕ «Совместимость REALITY» в «Дополнительно» у подключения: «Отпечаток» и «Ключ X25519MLKEM768» (Авто, Включён, Выключен)
|
||||||
|
- ➕ Серверы REALITY на Xray 26.9.8 и новее снова подключаются — им нужен ключ X25519MLKEM768
|
||||||
|
- ⚡ Ключ «Авто»: панель сама проверяет каждый сервер с ключом и без и запоминает рабочий вариант — после «Применить» и раз в 6 часов для новых серверов
|
||||||
|
- ➕ Свой отпечаток и ключ для отдельного сервера: «Серверы» → «Совместимость REALITY»; выбор не сбрасывается при обновлении подписки
|
||||||
|
- ➕ Сервер REALITY «порт открыт, не пускает» — кнопка «Подобрать ключ»
|
||||||
|
- ⚡ Если sing-box не умеет отправлять ключ, панель подскажет поставить расширенный sing-box 2.7.2+ или использовать Steer
|
||||||
|
- 🐞 Новая подписка больше не наследует формат прежней (Happ): при смене ссылки формат определяется заново, застрявшие подписки исправляются сами
|
||||||
|
- 🐞 Для новой подписки больше не показываются название, трафик и срок прежней
|
||||||
|
- 🐞 Zapret и Forkozz вместе: сайты из «Исключений», адреса которых входят в выбранные сервисы (например, discord.gg и Cloudflare), снова открываются со стратегиями zapret с fake. Пакеты, которые отправляет сам zapret, больше не уходят в Forkozz и не ломают соединение
|
||||||
|
- ⚡ Исправление ставится само, без перезапуска; учитывается метка zapret и zapret2 из их настроек (DESYNC_MARK)
|
||||||
|
- ⚡ С «Блокировкой утечек» такие пакеты тоже пропускаются
|
||||||
|
|
||||||
|
### 🔄 Поиск новых версий
|
||||||
|
- ➕ Проверка каждые 2, 6, 12 или 24 часа и своё время первой проверки
|
||||||
|
- ➕ «Ставить найденное»: ночью или сразу после проверки
|
||||||
|
- ⚡ Пропущенная из-за выключенного роутера проверка проходит сразу после включения
|
||||||
|
|
||||||
|
### 🧰 Система
|
||||||
|
- ⚡ Поправки для Flow Offloading ставятся и предупреждают только при включённом Flow Offloading
|
||||||
|
- ⚡ «Поправка для Zapret» ставится сама с Zapret/Zapret2 и снимается при их удалении; отключённая вручную больше не возвращается
|
||||||
|
|
||||||
|
### 🩺 Системная информация
|
||||||
|
- ➕ Серверы REALITY: сколько их, у скольких включён или подобран ключ, умеет ли sing-box его отправлять
|
||||||
|
- ⚡ Отключённые вручную поправки Flow Offloading отмечены «(отключена вручную)»
|
||||||
|
- ➕ Строка «Пакеты Zapret мимо Forkozz»
|
||||||
|
|
||||||
|
## 4.62 — 26.10.2026
|
||||||
|
|
||||||
|
### 📊 Дашборд
|
||||||
|
- ➕ «Компоненты»: блок «Система» с цветными плашками — блокировка QUIC, IPv6 в Zapret, Flow Offloading, поправки для Zapret и Steer, зеркало OpenWrt
|
||||||
|
- ⚡ Красная плашка, если Flow Offloading включён, а поправки нет; жёлтая — если зеркало выбрано автоматически
|
||||||
|
- ⚡ Нажатие на плашку открывает «Систему», при наведении видна подсказка
|
||||||
|
- 🐞 Убрана карточка «Настройки системы» — она повторяла плитки из «Системы»
|
||||||
|
- ⚡ Зеркало показывается только в блоке «Система», без повтора в карточке роутера
|
||||||
|
|
||||||
|
### 🧰 Система
|
||||||
|
- ⚡ Автовыбор зеркала (когда основной репозиторий отвечает с ошибками) работает как «Подобрать зеркало»: пинг, проверка всех репозиториев, подробный ход. Пробует 4 самых быстрых зеркала
|
||||||
|
- 🐞 Сменить зеркало вручную нельзя, пока идёт другая операция (установка, обновление, подбор зеркала): панель говорит, какая
|
||||||
|
- ⚡ Правильные окончания: «все 4 репозитория», «все 6 репозиториев»
|
||||||
|
|
||||||
|
### 🛡 Zapret
|
||||||
|
- 🐞 Удаление Zapret больше не оставляет журнал автоподбора стратегии, сохранённые результаты тестов и задание «Автообновление списка исключений»
|
||||||
|
|
||||||
|
### 🧭 Steer
|
||||||
|
- 🐞 После удаления и повторной установки Steer поправка Flow Offloading снова ставится сама, даже если раньше её отключали вручную
|
||||||
|
|
||||||
|
### 🦊 Forkozz
|
||||||
|
- ⚡ Если панель сама включает «Скачивать списки сервисов через VPN», журнал сообщает, что через подключение теперь обновляется и подписка, а если VPN не ответит — подписка скачается напрямую
|
||||||
|
|
||||||
## 4.61 — 25.10.2026
|
## 4.61 — 25.10.2026
|
||||||
|
|
||||||
### 🧰 Система
|
### 🧰 Система
|
||||||
|
|||||||
+2690
-756
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,51 @@
|
|||||||
|
# AmneziaWG 3.1 на NanoPi R3S с FriendlyWrt
|
||||||
|
|
||||||
|
Эта адаптация основана на [StressOzz/Zapret-Manager](https://github.com/StressOzz/Zapret-Manager), commit `46eb923f414f5ac2b5bba1f79519696ea57f3b9a`, версия панели 4.68. Версия адаптации — 4.68.1. Изменена установка AWG в LuCI/Web; остальные компоненты продолжают использовать прежние источники.
|
||||||
|
|
||||||
|
## Поддерживаемый образ
|
||||||
|
|
||||||
|
- NanoPi R3S / R3S LTS, архитектура `aarch64_generic`, цель `rockchip/armv8`.
|
||||||
|
- `R3S-Series-FriendlyWrt-25.12.img.gz` из выпуска производителя `FriendlyWrt-2026-10-13`.
|
||||||
|
- Пользовательская часть OpenWrt 25.12.5, реально работающее ядро **6.1.141**.
|
||||||
|
- SHA256 образа: `3cf37e2b91f80f51dd54d601efc3af8c9f2c69256488b874f9324aa54c34e74a`.
|
||||||
|
|
||||||
|
Пакет `kernel` в базе APK этой прошивки сообщает версию 6.12.94. Официальный `kmod-amneziawg` под 6.12.94 на работающем ядре 6.1.141 не загружается. Адаптация проверяет `uname -r`, модель и SHA256 штатных `configs.ko` и `udp_tunnel.ko`.
|
||||||
|
|
||||||
|
## Установка панели
|
||||||
|
|
||||||
|
Сначала сохранить настройки панели её штатной кнопкой резервного копирования. Затем выполнить по SSH:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -fL -o /tmp/ZapretManager_LuCI.sh https://gitea.bvrdo.online/wenil/Zapret-Manager/raw/branch/main/ZapretManager_LuCI.sh &&
|
||||||
|
sh /tmp/ZapretManager_LuCI.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
После обновления открыть вкладку **AmneziaWG** и нажать установку или переустановку.
|
||||||
|
|
||||||
|
Панель скачает только ядровой модуль из фиксированного тега на Gitea и проверит встроенный SHA256. Утилиты `amneziawg-tools`, протокол LuCI, импорт конфигурации и настройка сети проходят через существующий установщик. Зависимость APK удовлетворяется тем же механизмом виртуального `kmod-amneziawg`, который уже был предусмотрен автором панели для вручную установленного модуля.
|
||||||
|
|
||||||
|
При ошибке загрузки, несовпадении SHA256 или отпечатков прошивки установка прекращается. Перехода к модулю официального ядра 6.12.94 для этого профиля нет. Действующая сборка модуля закреплена: обновление утилит через панель не заменяет её случайным новым kmod.
|
||||||
|
|
||||||
|
## Автозагрузка, удаление и обновление
|
||||||
|
|
||||||
|
Создаётся `/etc/init.d/zm-awg-r3s`, который до запуска сети проверяет ядро и отпечатки файлов, затем загружает штатные зависимости и AWG. Он не меняет маршруты, ключи и firewall. Признак ручной установки хранится в существующем `/etc/zm-awg/kmod-manual`.
|
||||||
|
|
||||||
|
Удаление AmneziaWG через панель удаляет также этот init-скрипт. При неудачной записи файлов или регистрации виртуального пакета прежние файлы восстанавливаются. Штатная резервная копия панели сохраняет настройки, а не всю прошивку или бинарный модуль; при восстановлении установщик должен заново получить подходящий модуль.
|
||||||
|
|
||||||
|
Обновления самой панели и команда `zmw` получают адаптированную версию с Gitea, чтобы не потерять эту поддержку при обычном обновлении. Автоматическая синхронизация с GitHub автора не настроена: новые версии автора нужно переносить с сохранением изменений AWG. Старый SSH-менеджер `zms` остаётся исходной версией автора; эта адаптация относится к LuCI/Web.
|
||||||
|
|
||||||
|
После смены прошивки нужна новая проверка совместимости. Установщик не выбирает модуль только по номеру ядра.
|
||||||
|
|
||||||
|
## Проверки и ограничения
|
||||||
|
|
||||||
|
Модуль AWG `3.1.20260906` собран из официального тега с поправкой совместимости `timer_delete` для vendor-ядра. Совпали vermagic и CRC всех 198 импортируемых символов; конфигурация извлечена из точного образа. Исходники для пересборки, конфигурация, таблица CRC и подробности находятся в `vendor/awg/r3s-fw20261013/`.
|
||||||
|
|
||||||
|
На настоящем R3S загрузка, handshake, скорость и температура пока не проверены. Использован GCC 13.3 вместо GCC 11.3 производителя; точное совпадение commit исходников ядра с commit сборки производителя не подтверждено. Проверки CRC не заменяют испытание на устройстве. Первый тест проводить с возможностью локального восстановления роутера.
|
||||||
|
|
||||||
|
Тесты установщика выполняются без роутера и не загружают ядровые модули:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python3 tests/check_friendlywrt_awg.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Они проверяют установку, повторное обновление закреплённого модуля, удаление, порядок загрузки зависимостей, отказ при повреждённой загрузке или другой прошивке, откат при ошибке APK и сохранение обычного пути для официального OpenWrt. Также проверяется синтаксис сгенерированного backend.
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
> **Адаптация FriendlyWrt для NanoPi R3S / R3S LTS:** установка AWG 3.1 под родное ядро 6.1.141 через штатную вкладку LuCI/Web. [Поддерживаемый образ, установка и ограничения](docs/friendlywrt-awg.md). Автор исходного Zapret Manager — [StressOzz](https://github.com/StressOzz/Zapret-Manager). Модуль пока не испытан на настоящем устройстве.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# Zapret Manager
|
# Zapret Manager
|
||||||
|
|||||||
@@ -0,0 +1,156 @@
|
|||||||
|
"""Run the real AWG installer functions against a disposable filesystem and fake commands."""
|
||||||
|
from pathlib import Path
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
repo = Path(__file__).resolve().parents[1]
|
||||||
|
source = (repo / 'ZapretManager_LuCI.sh').read_text(encoding='utf-8')
|
||||||
|
functions = source[source.index('_st_awg_loaded()'):source.index('_st_warp_field()')]
|
||||||
|
bash = os.environ.get('TEST_SHELL', 'bash')
|
||||||
|
|
||||||
|
def posix(path):
|
||||||
|
value = path.as_posix()
|
||||||
|
return '/' + value[0].lower() + value[2:] if len(value) > 1 and value[1] == ':' else value
|
||||||
|
|
||||||
|
mocks = r'''
|
||||||
|
uname() { echo "${TEST_KERNEL:-6.1.141}"; }
|
||||||
|
_awg_board() { echo "${TEST_BOARD:-friendlyelec,nanopi-r3s}"; }
|
||||||
|
_awg_rel_ver() { echo "${TEST_RELEASE:-25.12.5}"; }
|
||||||
|
_awg_rel_arch() { echo aarch64_generic; }
|
||||||
|
_awg_rel_target() { echo rockchip/armv8; }
|
||||||
|
sha256sum() {
|
||||||
|
local expected path actual
|
||||||
|
if [ "$1 $2" != '-c -' ]; then command sha256sum "$@"; return; fi
|
||||||
|
while read -r expected path; do
|
||||||
|
case "$path" in */configs.ko|*/udp_tunnel.ko) [ "${TEST_FIRMWARE:-ok}" = ok ] || return 1 ;;
|
||||||
|
*) actual=$(command sha256sum "$path") || return 1; [ "${actual%% *}" = "$expected" ] || return 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
_rb_say() { echo "$*"; }
|
||||||
|
_rb_warn() { echo "$*"; }
|
||||||
|
_rb_fetch_pkg() {
|
||||||
|
echo "vendor $1" >> "$TEST_ROOT/downloads"
|
||||||
|
[ "${TEST_DOWNLOAD:-ok}" != failed ] || return 1
|
||||||
|
if [ "${TEST_DOWNLOAD:-ok}" = corrupt ]; then echo invalid > "$2"; else cp "$TEST_MODULE" "$2"; fi
|
||||||
|
}
|
||||||
|
_pkg_is_installed() { [ -f "$TEST_ROOT/pkg/$1" ]; }
|
||||||
|
_awg_pkg_ver() { [ ! -s "$AWG_KMOD_MANUAL" ] || awk '{print $1; exit}' "$AWG_KMOD_MANUAL"; }
|
||||||
|
_awg_fetch() { echo "stock $2" >> "$TEST_ROOT/downloads"; echo package > "$ST_RUN/$2.apk"; echo "$ST_RUN/$2.apk"; }
|
||||||
|
_awg_legacy_feeds() { :; }
|
||||||
|
_awg_kmod_pin_bad() { return 1; }
|
||||||
|
_awg_proto_ok() { return 0; }
|
||||||
|
_rb_rpcd_ensure() { :; }
|
||||||
|
_st_own() { echo "$*" >> "$TEST_ROOT/owned"; }
|
||||||
|
test_update() { :; }
|
||||||
|
test_install() {
|
||||||
|
local name
|
||||||
|
name=${1##*/}; name=${name%.apk}
|
||||||
|
touch "$TEST_ROOT/pkg/$name"
|
||||||
|
}
|
||||||
|
test_delete() { rm -f "$TEST_ROOT/pkg/$1"; }
|
||||||
|
_zm_run() { shift; "$@"; }
|
||||||
|
apk() {
|
||||||
|
[ "${TEST_APK:-ok}" = ok ] || return 1
|
||||||
|
touch "$TEST_ROOT/pkg/kmod-amneziawg"
|
||||||
|
}
|
||||||
|
modprobe() { mkdir -p "$TEST_ROOT/sys/module/amneziawg"; }
|
||||||
|
insmod() {
|
||||||
|
[ -f "$1" ] || return 1
|
||||||
|
echo "${1##*/}" >> "$TEST_ROOT/loads"
|
||||||
|
[ "${1##*/}" != amneziawg.ko ] || mkdir -p "$TEST_ROOT/sys/module/amneziawg"
|
||||||
|
}
|
||||||
|
rmmod() { return 1; }
|
||||||
|
awg() { :; }
|
||||||
|
_test_init() {
|
||||||
|
case "$1" in
|
||||||
|
enabled) [ -f "$TEST_ROOT/enabled" ] ;;
|
||||||
|
enable) touch "$TEST_ROOT/enabled" ;;
|
||||||
|
disable) rm -f "$TEST_ROOT/enabled" ;;
|
||||||
|
start) ( . "$AWG_VENDOR_INIT"; start ) ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
PKG=apk; INSTALL=test_install; DELETE=test_delete; UPDATE=test_update; RAZ=apk
|
||||||
|
ST_RUN="$TEST_ROOT/run"; ST_AWG_MIRRORS=https://stock.invalid; ST_AWG_MIRROR_FLAT=https://stock.invalid
|
||||||
|
'''
|
||||||
|
|
||||||
|
def run_case(name, body, **overrides):
|
||||||
|
temporary = repo.parent / 'zm-awg-tests'
|
||||||
|
temporary.mkdir(exist_ok=True)
|
||||||
|
with tempfile.TemporaryDirectory(prefix='case-', dir=temporary) as folder:
|
||||||
|
root = Path(folder)
|
||||||
|
for directory in ['pkg', 'run', 'etc/init.d', 'etc/rc.d', 'etc/zm-awg', 'sys/module', 'proc', 'lib/modules/6.1.141']:
|
||||||
|
(root / directory).mkdir(parents=True, exist_ok=True)
|
||||||
|
(root / 'proc/modules').touch()
|
||||||
|
for filename in ['configs', 'udp_tunnel', 'poly1305-neon', 'libcurve25519-generic', 'ip6_udp_tunnel', 'libchacha20poly1305']:
|
||||||
|
(root / f'lib/modules/6.1.141/{filename}.ko').touch()
|
||||||
|
mapped = functions
|
||||||
|
for prefix in ['/etc/', '/lib/', '/sys/', '/proc/']:
|
||||||
|
mapped = mapped.replace(prefix, posix(root) + prefix)
|
||||||
|
mapped = mapped.replace('"$AWG_VENDOR_INIT" enable', '_test_init enable').replace('"$AWG_VENDOR_INIT" enabled', '_test_init enabled')
|
||||||
|
mapped = mapped.replace('"$AWG_VENDOR_INIT" disable', '_test_init disable').replace('"$AWG_VENDOR_INIT" start', '_test_init start')
|
||||||
|
env = dict(os.environ, TEST_ROOT=posix(root), TEST_MODULE=posix(repo / 'vendor/awg/r3s-fw20261013/amneziawg.ko'), **overrides)
|
||||||
|
script = mapped + '\n' + mocks + '\nset -e\n' + body
|
||||||
|
result = subprocess.run([bash, '-s'], input=script.encode('utf-8'), env=env, capture_output=True)
|
||||||
|
assert result.returncode == 0, f'{name}:\n{result.stdout.decode("utf-8", errors="replace")}\n{result.stderr.decode("utf-8", errors="replace")}'
|
||||||
|
print(f'PASS {name}')
|
||||||
|
|
||||||
|
run_case('native install, reboot loader and pinned reinstall', r'''
|
||||||
|
_st_install_awg install
|
||||||
|
_awg_vendor_current
|
||||||
|
[ "$(cat "$TEST_ROOT/loads" | tr '\n' ' ')" = 'poly1305-neon.ko libcurve25519-generic.ko udp_tunnel.ko ip6_udp_tunnel.ko libchacha20poly1305.ko amneziawg.ko ' ]
|
||||||
|
[ "$(grep -c '^stock kmod' "$TEST_ROOT/downloads")" = 0 ]
|
||||||
|
[ -f "$TEST_ROOT/pkg/amneziawg-tools" ] && [ -f "$TEST_ROOT/pkg/luci-proto-amneziawg" ]
|
||||||
|
_st_install_awg update
|
||||||
|
_awg_vendor_current
|
||||||
|
[ "$(grep -c '^vendor ' "$TEST_ROOT/downloads")" = 2 ]
|
||||||
|
before=$(wc -l < "$TEST_ROOT/loads")
|
||||||
|
TEST_KERNEL=6.12.94
|
||||||
|
if _test_init start; then exit 1; fi
|
||||||
|
[ "$(wc -l < "$TEST_ROOT/loads")" = "$before" ]
|
||||||
|
TEST_KERNEL=6.1.141
|
||||||
|
_awg_kmod_manual_rm
|
||||||
|
[ ! -f "$AWG_KMOD_MANUAL" ] && [ ! -e "$AWG_VENDOR_INIT" ] && [ ! -f "$TEST_ROOT/enabled" ]
|
||||||
|
''')
|
||||||
|
|
||||||
|
for state in ['failed', 'corrupt']:
|
||||||
|
run_case(f'{state} download fails without stock fallback', r'''
|
||||||
|
if _st_install_awg install; then exit 1; fi
|
||||||
|
[ ! -f "$TEST_ROOT/lib/modules/6.1.141/amneziawg.ko" ]
|
||||||
|
[ ! -f "$AWG_KMOD_MANUAL" ] && [ ! -e "$AWG_VENDOR_INIT" ]
|
||||||
|
[ "$(grep -c '^stock ' "$TEST_ROOT/downloads")" = 0 ]
|
||||||
|
''', TEST_DOWNLOAD=state)
|
||||||
|
|
||||||
|
run_case('different firmware rejected before download', r'''
|
||||||
|
if _st_install_awg install; then exit 1; fi
|
||||||
|
[ ! -f "$TEST_ROOT/downloads" ]
|
||||||
|
''', TEST_FIRMWARE='changed')
|
||||||
|
|
||||||
|
run_case('APK failure restores old module and metadata', r'''
|
||||||
|
echo previous > "$TEST_ROOT/lib/modules/6.1.141/amneziawg.ko"
|
||||||
|
echo old-marker > "$AWG_KMOD_MANUAL"
|
||||||
|
printf '#!/bin/sh\n# old-init\n' > "$AWG_VENDOR_INIT"; chmod +x "$AWG_VENDOR_INIT"; touch "$TEST_ROOT/enabled"
|
||||||
|
if _awg_vendor_install; then exit 1; fi
|
||||||
|
[ "$(cat "$TEST_ROOT/lib/modules/6.1.141/amneziawg.ko")" = previous ]
|
||||||
|
[ "$(cat "$AWG_KMOD_MANUAL")" = old-marker ]
|
||||||
|
[ "$(tail -n 1 "$AWG_VENDOR_INIT")" = '# old-init' ] && [ -f "$TEST_ROOT/enabled" ]
|
||||||
|
''', TEST_APK='failed')
|
||||||
|
|
||||||
|
run_case('official firmware keeps upstream package path', r'''
|
||||||
|
_st_install_awg install
|
||||||
|
[ "$(grep -c '^vendor ' "$TEST_ROOT/downloads")" = 0 ]
|
||||||
|
[ "$(grep -c '^stock kmod-amneziawg' "$TEST_ROOT/downloads")" = 1 ]
|
||||||
|
[ ! -e "$AWG_VENDOR_INIT" ]
|
||||||
|
''', TEST_KERNEL='6.12.94')
|
||||||
|
|
||||||
|
backend = source.split("<< 'ZM_INSTALLER_EOF'\n", 1)[1].split('\nZM_INSTALLER_EOF\n', 1)[0]
|
||||||
|
with tempfile.NamedTemporaryFile(suffix='.sh', mode='w', encoding='utf-8', delete=False, dir=repo.parent / 'zm-awg-tests') as stream:
|
||||||
|
stream.write(backend)
|
||||||
|
script_path = Path(stream.name)
|
||||||
|
try:
|
||||||
|
subprocess.run([bash, '-n', str(script_path)], check=True)
|
||||||
|
finally:
|
||||||
|
script_path.unlink()
|
||||||
|
print('PASS generated backend shell syntax')
|
||||||
BIN
Binary file not shown.
+27
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"firmware": "FriendlyWrt-2026-10-13 / R3S-Series-FriendlyWrt-25.12.img.gz",
|
||||||
|
"firmware_sha256": "3cf37e2b91f80f51dd54d601efc3af8c9f2c69256488b874f9324aa54c34e74a",
|
||||||
|
"kernel": "6.1.141",
|
||||||
|
"kernel_source_commit": "30d3e1c2470a7282f37b96fdd4354314dda69aa3",
|
||||||
|
"awg_source_tag": "v3.1.20260906",
|
||||||
|
"awg_source_commit": "4569c4c67f3a57414969260cafbbd04694fbaae0",
|
||||||
|
"module_version": "3.1.20260906",
|
||||||
|
"vermagic": "6.1.141 SMP mod_unload modversions aarch64",
|
||||||
|
"dependencies": [
|
||||||
|
"libcurve25519_generic",
|
||||||
|
"udp_tunnel",
|
||||||
|
"ip6_udp_tunnel",
|
||||||
|
"libchacha20poly1305"
|
||||||
|
],
|
||||||
|
"dependency_files": {
|
||||||
|
"libcurve25519_generic": "libcurve25519-generic.ko",
|
||||||
|
"udp_tunnel": "udp_tunnel.ko",
|
||||||
|
"ip6_udp_tunnel": "ip6_udp_tunnel.ko",
|
||||||
|
"libchacha20poly1305": "libchacha20poly1305.ko"
|
||||||
|
},
|
||||||
|
"matched_imported_symbol_crcs": 198,
|
||||||
|
"runtime_tested": false,
|
||||||
|
"build_compiler": "aarch64-linux-gnu-gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0",
|
||||||
|
"firmware_compiler": "aarch64-linux-gnu-gcc (ctng-1.25.0-119g-FA) 11.3.0",
|
||||||
|
"limitation": "Config and symbol CRCs come from the exact firmware. Kernel sources use the vendor branch commit; its identity with the firmware build commit is not proven. Loading and VPN operation must be tested on the device."
|
||||||
|
}
|
||||||
BIN
Binary file not shown.
Reference in new issue
Block a user