20 Commits

Author SHA1 Message Date
Slava-Shchipunov
fb008b93c8 chore: remove .github/workflows/run-release.yml 2026-03-11 01:29:03 +07:00
Slava-Shchipunov
1607241233 docs: update README
Added information about the new AWG-2.0 release and automated builds.
2026-03-11 01:26:53 +07:00
Copilot
09256b1cc5 Simplify grep pattern in is_pkg_installed() for safer opkg matching (#117)
* Fix is_pkg_installed() opkg detection: use list-installed + exact grep match

opkg status always returns exit code 0 regardless of whether the package
is installed, making the previous check unreliable. Replace with
opkg list-installed piped through grep -q with an anchored pattern to
ensure exact package name matching without partial matches.

Co-authored-by: Slava-Shchipunov <92646230+Slava-Shchipunov@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Slava-Shchipunov <92646230+Slava-Shchipunov@users.noreply.github.com>
2026-03-07 22:35:40 +07:00
Slava-Shchipunov
2c4fe317b3 Feat/update awg install (#114)
* feat: update awg install

* refactor: fix network restart

---------

Co-authored-by: Svyatoslav Shchipunov <s.shchipunov@tinkoff.ru>
2026-03-05 13:06:20 +07:00
mr. brown
676c821362 fix index.js to obtain pkgarch value from index.json instead of package name (#113) 2026-03-04 19:57:18 +07:00
CthulhuVRN
aa17c7a25c Build support for apk packages (#110)
* Update build-module.yml

Add support of *.apk packages used since 25.12.0

* Update build-module.yml

* Update build-module.yml
2026-03-04 16:01:51 +07:00
Slava-Shchipunov
46f0cba90b Feat/update versions of packages (#111)
* feat: up awg tools version

* feat: up awg kernel module version

---------

Co-authored-by: Svyatoslav Shchipunov <s.shchipunov@tinkoff.ru>
2026-03-04 15:59:34 +07:00
Slava-Shchipunov
ad4c3e27c0 docs: add fork references to AWG-2.0 release links
Updated release links for AWG-2.0 versions to include fork references.
2026-02-27 00:42:21 +07:00
Slava-Shchipunov
d64ea7b53e docs: add link to README
Added a note about the AWG-2.0 fork for version 24.10.0.
2026-02-27 00:38:05 +07:00
Slava-Shchipunov
e075dcb43f feat: update versions of packages (#109)
* feat: up awg tools version

* feat: up awg kernel module version

---------

Co-authored-by: Svyatoslav Shchipunov <s.shchipunov@tinkoff.ru>
2026-02-27 00:34:28 +07:00
borisovmsw
449988b8e6 fix: fix QR code generation
* Update amneziawg.js

The QR code doesn't fit/isn't fully visible and can't be scanned.

* pixel size QR-code

Reduced the pixel size 3 so that the QR code is displayed fully on the smartphone browser.
2026-01-13 17:45:47 +07:00
Slava-Shchipunov
9591ffdebe fix: fix issue 78 (#80)
* fix: add patch to fix stats
2025-12-24 11:24:12 +07:00
Slava-Shchipunov
3498354348 feat: add manual run for all platforms (#79)
Co-authored-by: Svyatoslav Shchipunov <s.shchipunov@tinkoff.ru>
2025-12-23 12:16:34 +07:00
Slava-Shchipunov
f4c13f262d docs: fix shield 2025-12-22 14:15:15 +07:00
Slava-Shchipunov
6164b8e8d3 docs: add downloads counter to README.md 2025-12-22 14:14:06 +07:00
Slava-Shchipunov
c4e45cd3bc docs: update README.md 2025-12-22 12:51:20 +07:00
Slava-Shchipunov
ce827121a1 refactor: use tag for source version 2025-12-22 12:11:53 +07:00
Slava-Shchipunov
1589abe9ec feat: update source version in kmod Makefile 2025-12-22 12:09:42 +07:00
Slava-Shchipunov
8b3f1c1e5d docs: update README.md 2025-10-29 09:18:03 +07:00
Slava-Shchipunov
9a3f4520b3 feat: add PKGARCH to luci package 2025-10-23 22:16:20 +07:00
9 changed files with 202 additions and 152 deletions

View File

@@ -12,18 +12,19 @@ on:
workflow_dispatch:
inputs:
version:
description: 'OpenWRT version (e.g., 24.10.3)'
description: 'OpenWRT version (e.g., 24.10.5)'
required: true
type: string
targets:
description: 'Targets (comma-separated, e.g., "stm32,ramips")'
required: true
description: 'Targets (comma-separated, optional)'
required: false
type: string
subtargets:
description: 'Subtargets (comma-separated, e.g., "stm32mp1,mt7621")'
required: true
description: 'Subtargets (comma-separated, optional)'
required: false
type: string
jobs:
generate-config:
runs-on: ubuntu-latest
@@ -38,16 +39,22 @@ jobs:
with:
node-version: '20.16.0'
- name: Get OpenWRT version from tag
id: get_version
- name: Get OpenWRT version from inputs or tag
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "VERSION=${{ inputs.version }}" >> $GITHUB_ENV
if [ -n "${{ inputs.targets }}" ]; then
echo "TARGETS=${{ inputs.targets }}" >> $GITHUB_ENV
fi
if [ -n "${{ inputs.subtargets }}" ]; then
echo "SUBTARGETS=${{ inputs.subtargets }}" >> $GITHUB_ENV
elif [ "${{ github.event_name }}" == "workflow_call" ]; then
VERSION="${{ inputs.tag_name }}"
echo "VERSION=${VERSION#v}" >> $GITHUB_ENV
fi
elif [ "${{ github.event_name }}" = "workflow_call" ]; then
echo "VERSION=${{ inputs.tag_name }}" >> $GITHUB_ENV
else
echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV
fi
@@ -174,7 +181,7 @@ jobs:
make package/amneziawg-tools/compile V=s
echo "Build completed. Checking for built packages..."
find bin/ -name "*.ipk" | grep -E "(amneziawg|luci-proto-amneziawg|luci-i18n-amneziawg)" | head -10
find bin/ -name "*.?pk" | grep -E "(amneziawg|luci-proto-amneziawg|luci-i18n-amneziawg)" | head -10
- name: Prepare artifacts
run: |
@@ -185,10 +192,10 @@ jobs:
postfix="v${{ matrix.build_env.tag }}_${{ matrix.build_env.pkgarch}}_${{ matrix.build_env.target}}_${{ matrix.build_env.subtarget}}"
# Copy built packages
find "$SDK_DIR/bin/packages" -name "amneziawg-tools_*.ipk" -exec cp {} awgrelease/amneziawg-tools_${postfix}.ipk \; || echo "amneziawg-tools package not found"
find "$SDK_DIR/bin/packages" -name "luci-proto-amneziawg_*.ipk" -exec cp {} awgrelease/luci-proto-amneziawg_${postfix}.ipk \; || echo "luci-proto-amneziawg package not found"
find "$SDK_DIR/bin/packages" -name "luci-i18n-amneziawg-ru_*.ipk" -exec cp {} awgrelease/luci-i18n-amneziawg-ru_${postfix}.ipk \; || echo "luci-i18n-amneziawg-ru package not found"
find "$SDK_DIR/bin/targets" -name "kmod-amneziawg_*.ipk" -exec cp {} awgrelease/kmod-amneziawg_${postfix}.ipk \; || echo "kmod-amneziawg package not found"
find "$SDK_DIR/bin/packages" -name "amneziawg-tools*.?pk" -exec sh -c 'file="$1"; postfix="$2"; ext="${file##*.}"; cp "$file" "awgrelease/amneziawg-tools_${postfix}.${ext}"' _ {} "${postfix}" \; || echo "amneziawg-tools package not found"
find "$SDK_DIR/bin/packages" -name "luci-proto-amneziawg*.?pk" -exec sh -c 'file="$1"; postfix="$2"; ext="${file##*.}"; cp "$file" "awgrelease/luci-proto-amneziawg_${postfix}.${ext}"' _ {} "${postfix}" \; || echo "luci-proto-amneziawg package not found"
find "$SDK_DIR/bin/packages" -name "luci-i18n-amneziawg-ru*.?pk" -exec sh -c 'file="$1"; postfix="$2"; ext="${file##*.}"; cp "$file" "awgrelease/luci-i18n-amneziawg-ru_${postfix}.${ext}"' _ {} "${postfix}" \; || echo "luci-i18n-amneziawg-ru package not found"
find "$SDK_DIR/bin/targets" -name "kmod-amneziawg*.?pk" -exec sh -c 'file="$1"; postfix="$2"; ext="${file##*.}"; cp "$file" "awgrelease/kmod-amneziawg_${postfix}.${ext}"' _ {} "${postfix}" \; || echo "kmod-amneziawg package not found"
echo "Built packages:"
ls -la awgrelease/
@@ -196,5 +203,5 @@ jobs:
- name: Release
uses: softprops/action-gh-release@v1
with:
files: awgrelease/*.ipk
files: awgrelease/*.?pk
tag_name: v${{ matrix.build_env.tag }}

View File

@@ -1,66 +0,0 @@
name: Sync OpenWRT Releases
on:
# schedule:
# - cron: '0 0 */3 * *' # Проверка новых релизов раз в три дня
# workflow_dispatch: # Возможность вручную запустить Action
jobs:
sync-releases:
runs-on: ubuntu-latest
outputs:
release_exists: ${{ steps.check_release.outputs.release_exists }}
release_tag: ${{ steps.get_release.outputs.release_tag }}
steps:
- name: Checkout your repo
uses: actions/checkout@v4
- name: Get the latest release from OpenWRT
id: get_release
run: |
curl -s https://api.github.com/repos/openwrt/openwrt/releases/latest > latest_release.json
RELEASE_TAG=$(jq -r .tag_name latest_release.json)
RELEASE_NAME=$(jq -r .name latest_release.json)
echo "::set-output name=release_tag::$RELEASE_TAG"
echo "::set-output name=release_name::$RELEASE_NAME"
- name: Check if release exists in your repo
id: check_release
run: |
RELEASE_EXISTS=$(curl -s https://api.github.com/repos/Slava-Shchipunov/awg-openwrt/releases/tags/${{ steps.get_release.outputs.release_tag }} | jq -r .tag_name)
if [ "$RELEASE_EXISTS" == "null" ]; then
echo "::set-output name=release_exists::false"
else
echo "::set-output name=release_exists::true"
fi
- name: Create release in your repo
if: steps.check_release.outputs.release_exists == 'false'
run: |
ART="
\`\`\`
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| A M N E Z I A W I R E G U A R D
-----------------------------------------------------
OpenWrt ${{ steps.get_release.outputs.release_tag }}
-----------------------------------------------------
\`\`\`"
curl -X POST https://api.github.com/repos/Slava-Shchipunov/awg-openwrt/releases \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg tag "${{ steps.get_release.outputs.release_tag }}" \
--arg name "Build amnezia wg for all devices with openwrt ${{ steps.get_release.outputs.release_tag }}" \
--arg body "$ART" \
'{ tag_name: $tag, name: $name, body: $body }')"
run-build:
runs-on: ubuntu-latest
needs: sync-releases
if: needs.sync-releases.outputs.release_exists == 'false'
uses: Slava-Shchipunov/awg-openwrt/.github/workflows/build-module.yml@master
with:
tag_name: ${{ needs.sync-releases.outputs.release_tag }}

View File

@@ -1,7 +1,9 @@
![Downloads](https://img.shields.io/github/downloads/Slava-Shchipunov/awg-openwrt/total)
# Пакеты amneziawg для роутеров с прошивкой OpenWRT
## Автоматическая настройка AmneziaWG для OpenWRT версии 23.05.0 и более новых
1) Если ваш роутер обладает достаточным объмом доступной RAM, рекомендую воспользоваться скриптом, описанным ниже, только для установки нужных пакетов, а для точечной маршрутизации траффика в туннель использовать podkop от пользователя [@itdoginfo](https://github.com/itdoginfo) - тут в [документации](https://podkop.net/docs/tunnels/awg_settings/) описан процесс настройки
1) Если ваш роутер обладает достаточным объмом доступной ROM, рекомендую воспользоваться скриптом, описанным ниже, только для установки нужных пакетов, а для точечной маршрутизации траффика в туннель использовать podkop от пользователя [@itdoginfo](https://github.com/itdoginfo) - тут в [документации](https://podkop.net/docs/tunnels/awg_settings/) описан процесс настройки
2) Если вам нужно только установить пакеты, я добавил скрипт amneziawg-install - он автоматически скачает пакеты из этого репозитория под ваше устройство (только для стабильной версии OpenWRT), а также предложит сразу настроить интерфейс с протоколом AmneziaWG. Если пользователь согласится, нужно будет ввести параметры конфига, которые запросит скрипт. При этом скрипт создаст интерфейс, настроит для него правила фаерволла, а также **включит перенаправление всего траффика через тунель AmneziaWG** (установит в настройках Peer галочку Route Allowed IPs).
Для запуска скрипта подключитесь к роутеру по SSH, введите команду и следуйте инструкциям на экране:
@@ -9,7 +11,7 @@
sh <(wget -O - https://raw.githubusercontent.com/Slava-Shchipunov/awg-openwrt/refs/heads/master/amneziawg-install.sh)
```
3) Кроме того для автоматической настройки также можно использовать [скрипт](https://github.com/itdoginfo/domain-routing-openwrt) от пользователя [@itdoginfo](https://github.com/itdoginfo). Этот скрипт позволяет автоматически скачать нужные пакеты из собранных здесь и настроить [точечный обход блокировок по доменам](https://habr.com/ru/articles/767464/). Подойдёт, если у вас слабый роутер с недостаточным объёмом RAM для установки podkop-a и зависимостей
3) Кроме того для автоматической настройки также можно использовать [скрипт](https://github.com/itdoginfo/domain-routing-openwrt) от пользователя [@itdoginfo](https://github.com/itdoginfo). Этот скрипт позволяет автоматически скачать нужные пакеты из собранных здесь и настроить [точечный обход блокировок по доменам](https://habr.com/ru/articles/767464/). Подойдёт, если у вас слабый роутер с недостаточным объёмом ROM для установки podkop-a и зависимостей
## Сборка пакетов для всех устройств, поддерживающих OpenWRT
В репозиторий добавлен скрипт, который парсит данные о поддерживаемых платформах со страницы OpenWRT и автоматически запускает сборку пакетов AmneziaWG для всех устройств.
@@ -21,15 +23,16 @@ sh <(wget -O - https://raw.githubusercontent.com/Slava-Shchipunov/awg-openwrt/re
5) [23.05.4](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.4)
6) [23.05.5](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.5)
7) AWG-2.0 [23.05.6](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.6)
8) [24.10.0](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.0)
9) [24.10.1](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.1)
10) [24.10.2](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.2)
8) [24.10.0](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.0) ([AWG-2.0 для 24.10.0](https://github.com/yanjore/awg-openwrt/releases/tag/v24.10.0) из форка, если кому-то понадобится)
9) [24.10.1](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.1) ([AWG-2.0 для 24.10.1](https://github.com/yanjore/awg-openwrt/releases/tag/v24.10.1) из форка)
10) [24.10.2](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.2) ([AWG-2.0 для 24.10.2](https://github.com/yanjore/awg-openwrt/releases/tag/v24.10.2) из форка)
11) AWG-2.0 [24.10.3](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.3)
12) AWG-2.0 [24.10.4](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.4)
13) AWG-2.0 [24.10.5](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.5)
14) AWG-2.0 [25.12.0](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v25.12.0)
Также запускал сборку для версии [22.03.7](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v22.03.7), но там для двух платформ сборка завершилась ошибкой. Так как это достаточно старая версия OpenWRT, я не стал разбираться, в чем проблема.
В дальнейшем при выходе новых релизов OpenWRT будут автоматически создаваться релизы с пакетами AmneziaWG и запускаться сборка пакетов под все устройства, поддерживаемые новой версией. Github action для проверки появления нового релиза запускается автоматически раз в 3 дня, а также может быть запущен вручную.
## Выбор пакетов для своего устройства
В соответствии с пунктом [Указываем переменные для сборки](https://github.com/itdoginfo/domain-routing-openwrt/wiki/Amnezia-WG-Build#%D1%83%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B4%D0%BB%D1%8F-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8)
определить `target` и `subtarget` вашего устройства. Далее перейти на страницу релиза, соответствующего вашей версии OpenWRT, затем поиском по странице (Ctrl+F) найти 3 пакета, название которых оканчивается на `target_subtarget.ipk`, соответствующие вашему устройству. Для версии AWG 2.0 также доступен пакет русификации luci-i18n-amneziawg-ru
@@ -67,7 +70,7 @@ AWG 2.0 можно собрать под определённую платфор
- А также всем, кто приносил полезные примеры в личку и в [ишью](https://github.com/Slava-Shchipunov/awg-openwrt/issues/39), отписывались в комменты к PR с имплементацией о возникших багах и проблемах ❤️
## Automatic configuration of AmneziaWG for OpenWRT version 23.05.0 and newer
1) If your router has enough available RAM, I recommend using the script described below only to install the necessary packages, and use podkop from user [@itdoginfo](https://github.com/itdoginfo) for selective traffic routing into the tunnel - the setup process is described in the [documentation](https://podkop.net/docs/tunnels/awg_settings/)
1) If your router has enough available ROM, I recommend using the script described below only to install the necessary packages, and use podkop from user [@itdoginfo](https://github.com/itdoginfo) for selective traffic routing into the tunnel - the setup process is described in the [documentation](https://podkop.net/docs/tunnels/awg_settings/)
2) If you only need to install packages, I added the amneziawg-install script - it will automatically download packages from this repository for your device (only for the stable version of OpenWRT), and also offer to immediately configure the interface with the AmneziaWG protocol. If the user agrees, you will need to enter the config parameters that the script will request. The script will create an interface, configure firewall rules for it, and also **enable redirection of all traffic through the AmneziaWG tunnel** (check the Route Allowed IPs box in the Peer settings).
To run the script, connect to the router via SSH, enter the command and follow the instructions on the screen:
@@ -75,7 +78,7 @@ To run the script, connect to the router via SSH, enter the command and follow t
sh <(wget -O - https://raw.githubusercontent.com/Slava-Shchipunov/awg-openwrt/refs/heads/master/amneziawg-install.sh)
```
3) In addition, for automatic configuration you can also use the [script](https://github.com/itdoginfo/domain-routing-openwrt) from user [@itdoginfo](https://github.com/itdoginfo). This script allows you to automatically download the necessary packages from those collected here and configure [point-by-point bypass of blocking by domains](https://habr.com/ru/articles/767464/) (instructions in Russian). Suitable if you have a weak router with insufficient RAM to install podkop and its dependencies
3) In addition, for automatic configuration you can also use the [script](https://github.com/itdoginfo/domain-routing-openwrt) from user [@itdoginfo](https://github.com/itdoginfo). This script allows you to automatically download the necessary packages from those collected here and configure [point-by-point bypass of blocking by domains](https://habr.com/ru/articles/767464/) (instructions in Russian). Suitable if you have a weak router with insufficient ROM to install podkop and its dependencies
# Building packages for all devices that support OpenWRT
A script has been added to the repository that parses data on supported platforms from the OpenWRT page and automatically starts building AmneziaWG packages for all devices.
@@ -87,15 +90,16 @@ At the moment I have collected packages for all devices for OpenWRT versions:
5) [23.05.4](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.4)
6) [23.05.5](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.5)
7) AWG-2.0 [23.05.6](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.6)
8) [24.10.0](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.0)
9) [24.10.1](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.1)
10) [24.10.2](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.2)
8) [24.10.0](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.0) ([AWG-2.0 for 24.10.0](https://github.com/yanjore/awg-openwrt/releases/tag/v24.10.0) from fork)
9) [24.10.1](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.1) ([AWG-2.0 for 24.10.1](https://github.com/yanjore/awg-openwrt/releases/tag/v24.10.1) from fork)
10) [24.10.2](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.2) ([AWG-2.0 for 24.10.2](https://github.com/yanjore/awg-openwrt/releases/tag/v24.10.2) from fork)
11) AWG-2.0 [24.10.3](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.3)
12) AWG-2.0 [24.10.4](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.4)
13) AWG-2.0 [24.10.5](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.5)
14) AWG-2.0 [25.12.0](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v25.12.0)
I also ran the build for version [22.03.7](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v22.03.7), but the build ended with an error for two platforms. Since this is a fairly old version of OpenWRT, I did not bother to figure out what the problem was.
In the future, when new OpenWRT releases are released, releases with AmneziaWG packages will be automatically created and the package build will be launched for all devices supported by the new version. Github action for checking for a new release is launched automatically every 3 days, and can also be launched manually.
## Automatic package build for SNAPSHOT version
A github action is configured in the repository, which runs every 4 hours and checks the [snapshots page](https://downloads.openwrt.org/snapshots/targets/) of the OpenWRT website. At the same time, if a snapshot with a newer kernel version is found for some platform, the package build for this platform is launched, and the new files replace the old ones. In order to save resources and speed up the build process, packages are built only for popular platforms, which are specified in the `SNAPSHOT_SUBTARGETS_TO_BUILD` array in the index.js file.

View File

@@ -2,20 +2,127 @@
#set -x
PKG_MANAGER=""
PKG_EXT=""
detect_package_manager() {
if command -v apk >/dev/null 2>&1; then
PKG_MANAGER="apk"
PKG_EXT="apk"
elif command -v opkg >/dev/null 2>&1; then
PKG_MANAGER="opkg"
PKG_EXT="ipk"
else
printf "\033[32;1mNo supported package manager found (apk/opkg).\033[0m\n"
exit 1
fi
}
pkg_update() {
if [ "$PKG_MANAGER" = "apk" ]; then
apk update
else
opkg update
fi
}
is_pkg_installed() {
pkg_name="$1"
if [ "$PKG_MANAGER" = "apk" ]; then
apk info -e "$pkg_name" >/dev/null 2>&1
else
opkg list-installed 2>/dev/null | grep -q "^${pkg_name} "
fi
}
install_local_pkg() {
pkg_file="$1"
if [ "$PKG_MANAGER" = "apk" ]; then
apk add --allow-untrusted "$pkg_file"
else
opkg install "$pkg_file"
fi
}
get_pkgarch() {
PKGARCH_UBUS=$(ubus call system board 2>/dev/null | jsonfilter -e '@.release.arch' 2>/dev/null)
if [ -n "$PKGARCH_UBUS" ]; then
echo "$PKGARCH_UBUS"
return
fi
if command -v opkg >/dev/null 2>&1; then
opkg print-architecture | awk 'BEGIN {max=0} {if ($3 > max) {max = $3; arch = $2}} END {print arch}'
return
fi
if [ -f /etc/openwrt_release ]; then
PKGARCH_RELEASE=$(grep "^DISTRIB_ARCH='" /etc/openwrt_release | cut -d"'" -f2)
if [ -n "$PKGARCH_RELEASE" ]; then
echo "$PKGARCH_RELEASE"
return
fi
fi
if command -v apk >/dev/null 2>&1; then
apk --print-arch
return
fi
uname -m
}
download_package() {
pkg_base_name="$1"
pkg_postfix_base="$2"
awg_dir="$3"
base_url="$4"
preferred_file="${pkg_base_name}${pkg_postfix_base}.${PKG_EXT}"
preferred_url="${base_url}${preferred_file}"
if wget -q -O "$awg_dir/$preferred_file" "$preferred_url" && [ -s "$awg_dir/$preferred_file" ]; then
echo "$preferred_file"
return 0
fi
rm -f "$awg_dir/$preferred_file"
if [ "$PKG_EXT" = "apk" ]; then
fallback_ext="ipk"
else
fallback_ext="apk"
fi
fallback_file="${pkg_base_name}${pkg_postfix_base}.${fallback_ext}"
fallback_url="${base_url}${fallback_file}"
if wget -q -O "$awg_dir/$fallback_file" "$fallback_url" && [ -s "$awg_dir/$fallback_file" ]; then
echo "$fallback_file"
return 0
fi
rm -f "$awg_dir/$fallback_file"
return 1
}
#Репозиторий OpenWRT должен быть доступен для установки зависимостей пакета kmod-amneziawg
check_repo() {
printf "\033[32;1mChecking OpenWrt repo availability...\033[0m\n"
opkg update | grep -q "Failed to download" && printf "\033[32;1mopkg failed. Check internet or date. Command for force ntp sync: ntpd -p ptbtime1.ptb.de\033[0m\n" && exit 1
if [ "$PKG_MANAGER" = "apk" ]; then
pkg_update >/dev/null 2>&1 || \
{ printf "\033[32;1mapk failed. Check internet or date. Command for force ntp sync: ntpd -p ptbtime1.ptb.de\033[0m\n"; exit 1; }
else
pkg_update | grep -q "Failed to download" && \
printf "\033[32;1mopkg failed. Check internet or date. Command for force ntp sync: ntpd -p ptbtime1.ptb.de\033[0m\n" && exit 1
fi
}
install_awg_packages() {
# Получение pkgarch с наибольшим приоритетом
PKGARCH=$(opkg print-architecture | awk 'BEGIN {max=0} {if ($3 > max) {max = $3; arch = $2}} END {print arch}')
PKGARCH=$(get_pkgarch)
TARGET=$(ubus call system board | jsonfilter -e '@.release.target' | cut -d '/' -f 1)
SUBTARGET=$(ubus call system board | jsonfilter -e '@.release.target' | cut -d '/' -f 2)
VERSION=$(ubus call system board | jsonfilter -e '@.release.version')
PKGPOSTFIX="_v${VERSION}_${PKGARCH}_${TARGET}_${SUBTARGET}.ipk"
PKGPOSTFIX_BASE="_v${VERSION}_${PKGARCH}_${TARGET}_${SUBTARGET}"
BASE_URL="https://github.com/Slava-Shchipunov/awg-openwrt/releases/download/"
# Определяем версию AWG протокола (2.0 для OpenWRT >= 23.05.6 и >= 24.10.3)
@@ -39,13 +146,10 @@ install_awg_packages() {
AWG_DIR="/tmp/amneziawg"
mkdir -p "$AWG_DIR"
if opkg list-installed | grep -q kmod-amneziawg; then
if is_pkg_installed "kmod-amneziawg"; then
echo "kmod-amneziawg already installed"
else
KMOD_AMNEZIAWG_FILENAME="kmod-amneziawg${PKGPOSTFIX}"
DOWNLOAD_URL="${BASE_URL}v${VERSION}/${KMOD_AMNEZIAWG_FILENAME}"
wget -O "$AWG_DIR/$KMOD_AMNEZIAWG_FILENAME" "$DOWNLOAD_URL"
KMOD_AMNEZIAWG_FILENAME=$(download_package "kmod-amneziawg" "$PKGPOSTFIX_BASE" "$AWG_DIR" "${BASE_URL}v${VERSION}/")
if [ $? -eq 0 ]; then
echo "kmod-amneziawg file downloaded successfully"
else
@@ -53,7 +157,7 @@ install_awg_packages() {
exit 1
fi
opkg install "$AWG_DIR/$KMOD_AMNEZIAWG_FILENAME"
install_local_pkg "$AWG_DIR/$KMOD_AMNEZIAWG_FILENAME"
if [ $? -eq 0 ]; then
echo "kmod-amneziawg installed successfully"
@@ -63,13 +167,10 @@ install_awg_packages() {
fi
fi
if opkg list-installed | grep -q amneziawg-tools; then
if is_pkg_installed "amneziawg-tools"; then
echo "amneziawg-tools already installed"
else
AMNEZIAWG_TOOLS_FILENAME="amneziawg-tools${PKGPOSTFIX}"
DOWNLOAD_URL="${BASE_URL}v${VERSION}/${AMNEZIAWG_TOOLS_FILENAME}"
wget -O "$AWG_DIR/$AMNEZIAWG_TOOLS_FILENAME" "$DOWNLOAD_URL"
AMNEZIAWG_TOOLS_FILENAME=$(download_package "amneziawg-tools" "$PKGPOSTFIX_BASE" "$AWG_DIR" "${BASE_URL}v${VERSION}/")
if [ $? -eq 0 ]; then
echo "amneziawg-tools file downloaded successfully"
else
@@ -77,7 +178,7 @@ install_awg_packages() {
exit 1
fi
opkg install "$AWG_DIR/$AMNEZIAWG_TOOLS_FILENAME"
install_local_pkg "$AWG_DIR/$AMNEZIAWG_TOOLS_FILENAME"
if [ $? -eq 0 ]; then
echo "amneziawg-tools installed successfully"
@@ -88,13 +189,10 @@ install_awg_packages() {
fi
# Проверяем оба возможных названия пакета
if opkg list-installed | grep -q "luci-proto-amneziawg\|luci-app-amneziawg"; then
if is_pkg_installed "luci-proto-amneziawg" || is_pkg_installed "luci-app-amneziawg"; then
echo "$LUCI_PACKAGE_NAME already installed"
else
LUCI_AMNEZIAWG_FILENAME="${LUCI_PACKAGE_NAME}${PKGPOSTFIX}"
DOWNLOAD_URL="${BASE_URL}v${VERSION}/${LUCI_AMNEZIAWG_FILENAME}"
wget -O "$AWG_DIR/$LUCI_AMNEZIAWG_FILENAME" "$DOWNLOAD_URL"
LUCI_AMNEZIAWG_FILENAME=$(download_package "$LUCI_PACKAGE_NAME" "$PKGPOSTFIX_BASE" "$AWG_DIR" "${BASE_URL}v${VERSION}/")
if [ $? -eq 0 ]; then
echo "$LUCI_PACKAGE_NAME file downloaded successfully"
else
@@ -102,7 +200,7 @@ install_awg_packages() {
exit 1
fi
opkg install "$AWG_DIR/$LUCI_AMNEZIAWG_FILENAME"
install_local_pkg "$AWG_DIR/$LUCI_AMNEZIAWG_FILENAME"
if [ $? -eq 0 ]; then
echo "$LUCI_PACKAGE_NAME installed successfully"
@@ -119,16 +217,13 @@ install_awg_packages() {
INSTALL_RU_LANG=${INSTALL_RU_LANG:-n}
if [ "$INSTALL_RU_LANG" = "y" ] || [ "$INSTALL_RU_LANG" = "Y" ]; then
if opkg list-installed | grep -q luci-i18n-amneziawg-ru; then
if is_pkg_installed "luci-i18n-amneziawg-ru"; then
echo "luci-i18n-amneziawg-ru already installed"
else
LUCI_I18N_AMNEZIAWG_RU_FILENAME="luci-i18n-amneziawg-ru${PKGPOSTFIX}"
DOWNLOAD_URL="${BASE_URL}v${VERSION}/${LUCI_I18N_AMNEZIAWG_RU_FILENAME}"
wget -O "$AWG_DIR/$LUCI_I18N_AMNEZIAWG_RU_FILENAME" "$DOWNLOAD_URL"
LUCI_I18N_AMNEZIAWG_RU_FILENAME=$(download_package "luci-i18n-amneziawg-ru" "$PKGPOSTFIX_BASE" "$AWG_DIR" "${BASE_URL}v${VERSION}/")
if [ $? -eq 0 ]; then
echo "luci-i18n-amneziawg-ru file downloaded successfully"
opkg install "$AWG_DIR/$LUCI_I18N_AMNEZIAWG_RU_FILENAME"
install_local_pkg "$AWG_DIR/$LUCI_I18N_AMNEZIAWG_RU_FILENAME"
if [ $? -eq 0 ]; then
echo "luci-i18n-amneziawg-ru installed successfully"
else
@@ -261,8 +356,11 @@ configure_amneziawg_interface() {
uci set firewall.@forwarding[-1].family='ipv4'
uci commit firewall
fi
service network restart
}
detect_package_manager
check_repo
install_awg_packages
@@ -275,5 +373,3 @@ if [ "$IS_SHOULD_CONFIGURE_AWG_INTERFACE" = "y" ] || [ "$IS_SHOULD_CONFIGURE_AWG
else
printf "\033[32;1mSkipping amneziawg interface configuration.\033[0m\n"
fi
service network restart

View File

@@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=amneziawg-tools
PKG_VERSION:=1.0.20250903
PKG_VERSION:=1.0.20260223
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git

View File

@@ -52,19 +52,27 @@ async function getSubtargets(target) {
}
async function getDetails(target, subtarget) {
const packagesUrl = `${url}${target}/${subtarget}/packages/`;
const $ = await fetchHTML(packagesUrl);
let vermagic = '';
// pkgarch from packages/index.json
// for apk-based is required change (should work also for ipk-based)
const indexUrl = `${url}${target}/${subtarget}/packages/index.json`;
let pkgarch = '';
$('a').each((index, element) => {
const name = $(element).attr('href');
if (name && name.startsWith('kernel_')) {
const vermagicMatch = name.match(/kernel_\d+\.\d+\.\d+(?:-\d+)?[-~]([a-f0-9]+)(?:-r\d+)?_([a-zA-Z0-9_-]+)\.ipk$/);
if (vermagicMatch) {
vermagic = vermagicMatch[1];
pkgarch = vermagicMatch[2];
try {
const { data } = await axios.get(indexUrl, { responseType: 'json' });
pkgarch = data.architecture || '';
} catch (e) {
// keep pkgarch empty
}
// vermagic from kmods directory name (more reliable than parsing kernel filename)
const kmodsUrl = `${url}${target}/${subtarget}/kmods/`;
const $ = await fetchHTML(kmodsUrl);
let vermagic = '';
$('table tr td.n a').each((_, el) => {
const name = $(el).attr('href');
if (name && name.endsWith('/')) {
vermagic = name.slice(0, -1);
return false; // break
}
});

View File

@@ -2,13 +2,13 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=kmod-amneziawg
PKG_VERSION:=1.0.20251005
PKG_VERSION:=1.0.20260210
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git
# Latest commit from master branch as of 2025-10-05
PKG_SOURCE_VERSION:=876bf7571e47e349d0e86b70c244330b470d9642
# Version: latest stable release tag
PKG_SOURCE_VERSION:=v$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
MAKE_PATH:=src

View File

@@ -5,6 +5,7 @@ LUCI_DESCRIPTION:=Provides support and Web UI for AmneziaWG VPN
PKG_VERSION:=2.0.4
LUCI_DEPENDS:=+amneziawg-tools +ucode +luci-lib-uqr +resolveip
LUCI_PKGARCH:=all
PKGARCH:=all
PKG_LICENSE:=Apache-2.0

View File

@@ -66,9 +66,9 @@ function generateDescription(name, texts) {
}
function buildSVGQRCode(data, code) {
// pixel size larger than 4 clips right and bottom edges of complex configs
// pixel size 3 for mobile browser
const options = {
pixelSize: 4,
pixelSize: 3,
whiteColor: 'white',
blackColor: 'black'
};
@@ -934,7 +934,7 @@ return network.registerProtocol('amneziawg', {
}, [
E('div', {
'class': 'qr-code',
'style': 'width:320px;flex:0 1 320px;text-align:center'
'style': 'text-align:center'
}, [
E('em', { 'class': 'spinning' }, [ _('Generating QR code…') ])
]),