mirror of
https://github.com/Slava-Shchipunov/awg-openwrt.git
synced 2026-03-14 09:23:10 +00:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb008b93c8 | ||
|
|
1607241233 | ||
|
|
09256b1cc5 | ||
|
|
2c4fe317b3 | ||
|
|
676c821362 | ||
|
|
aa17c7a25c | ||
|
|
46f0cba90b | ||
|
|
ad4c3e27c0 | ||
|
|
d64ea7b53e | ||
|
|
e075dcb43f | ||
|
|
449988b8e6 | ||
|
|
9591ffdebe | ||
|
|
3498354348 | ||
|
|
f4c13f262d | ||
|
|
6164b8e8d3 | ||
|
|
c4e45cd3bc | ||
|
|
ce827121a1 | ||
|
|
1589abe9ec | ||
|
|
8b3f1c1e5d | ||
|
|
9a3f4520b3 | ||
|
|
c3264c3a99 | ||
|
|
aca98becff | ||
|
|
28c7463dd8 | ||
|
|
afcee2c1bd | ||
|
|
72112902be | ||
|
|
bad6a2005d | ||
|
|
d3372b1535 |
53
.github/workflows/build-module.yml
vendored
53
.github/workflows/build-module.yml
vendored
@@ -9,6 +9,21 @@ on:
|
||||
tag_name:
|
||||
required: true
|
||||
type: string
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: 'OpenWRT version (e.g., 24.10.5)'
|
||||
required: true
|
||||
type: string
|
||||
targets:
|
||||
description: 'Targets (comma-separated, optional)'
|
||||
required: false
|
||||
type: string
|
||||
subtargets:
|
||||
description: 'Subtargets (comma-separated, optional)'
|
||||
required: false
|
||||
type: string
|
||||
|
||||
|
||||
jobs:
|
||||
generate-config:
|
||||
@@ -24,12 +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_call" ]; 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
|
||||
fi
|
||||
|
||||
elif [ "${{ github.event_name }}" = "workflow_call" ]; then
|
||||
echo "VERSION=${{ inputs.tag_name }}" >> $GITHUB_ENV
|
||||
echo "VERSION=${VERSION#v}" >> $GITHUB_ENV
|
||||
|
||||
else
|
||||
echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV
|
||||
fi
|
||||
@@ -39,7 +64,7 @@ jobs:
|
||||
|
||||
- name: Generate Job Config
|
||||
id: generate-config
|
||||
run: node index.js ${{ env.VERSION }}
|
||||
run: node index.js ${{ env.VERSION }} "${{ env.TARGETS }}" "${{ env.SUBTARGETS }}"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -56,6 +81,11 @@ jobs:
|
||||
- name: Checkout AWG source code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Python dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python3-pyelftools
|
||||
|
||||
- name: Cache OpenWrt SDK
|
||||
id: cache-sdk
|
||||
uses: actions/cache@v4
|
||||
@@ -151,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: |
|
||||
@@ -162,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/
|
||||
@@ -173,4 +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 }}
|
||||
|
||||
187
.github/workflows/build-to-all-latest-snapshots.yml
vendored
187
.github/workflows/build-to-all-latest-snapshots.yml
vendored
@@ -1,187 +0,0 @@
|
||||
name: Build AmneziaWG for snapshot OpenWRT
|
||||
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "SNAPSHOT"
|
||||
# schedule:
|
||||
# - cron: '0 */4 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
generate-config:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
job-config: ${{ steps.generate-config.outputs.job-config }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20.16.0'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
|
||||
- name: Generate Job Config
|
||||
id: generate-config
|
||||
run: node index.js SNAPSHOT
|
||||
|
||||
build:
|
||||
name: "${{ matrix.build_env.tag }} - ${{ matrix.build_env.pkgarch}} :: ${{ matrix.build_env.target}}/${{ matrix.build_env.subtarget}} build"
|
||||
runs-on: ubuntu-latest
|
||||
needs: generate-config
|
||||
strategy:
|
||||
matrix:
|
||||
build_env: ${{ fromJson(needs.generate-config.outputs.job-config) }}
|
||||
fail-fast: false
|
||||
|
||||
steps:
|
||||
- name: Check if release file exists
|
||||
id: check_release
|
||||
run: |
|
||||
postfix="${{ matrix.build_env.tag }}_${{ matrix.build_env.vermagic }}_${{ matrix.build_env.pkgarch}}_${{ matrix.build_env.target}}_${{ matrix.build_env.subtarget}}"
|
||||
RELEASE_FILE="kmod-amneziawg_${postfix}.ipk"
|
||||
TAG=${{ matrix.build_env.tag }}
|
||||
|
||||
echo "Checking for release file: $RELEASE_FILE in release: $TAG"
|
||||
|
||||
# Используем GitHub CLI для проверки наличия файла в релизе
|
||||
if gh release view "$TAG" --repo Slava-Shchipunov/awg-openwrt --json assets --jq ".assets | .[].name" | grep -q "$RELEASE_FILE"; then
|
||||
echo "Release file $RELEASE_FILE already exists. Skipping job."
|
||||
echo "FILE_EXISTS=true" >> $GITHUB_ENV
|
||||
else
|
||||
echo "FILE_EXISTS=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
# Прерываем job'у, если файл уже существует
|
||||
- name: Skip job if release file exists
|
||||
if: env.FILE_EXISTS == 'true'
|
||||
run: |
|
||||
echo "Skipping job as release file already exists."
|
||||
exit 0
|
||||
|
||||
- name: Get snapshot commit SHA and device ARCH
|
||||
if: env.FILE_EXISTS == 'false'
|
||||
run: |
|
||||
PROFILE_URL="https://downloads.openwrt.org/snapshots/targets/${{ matrix.build_env.target}}/${{ matrix.build_env.subtarget}}/profiles.json"
|
||||
SNAPSHOT_COMMIT_SHA=$(wget -q $PROFILE_URL -O- | tr ',' '\n' | grep "version_code"| awk -F: '{print $2}' | tr -d '"' | awk -F- '{print $2}')
|
||||
echo "Snapshot commit sha: $SNAPSHOT_COMMIT_SHA"
|
||||
echo "SNAPSHOT_COMMIT_SHA=$SNAPSHOT_COMMIT_SHA" >> $GITHUB_ENV
|
||||
|
||||
DEVICE_ARCH=$(wget -q $PROFILE_URL -O- | tr ',' '\n' | grep "arch_packages"| awk -F: '{print $2}' | tr -d '"')
|
||||
echo "Device ARCH: $DEVICE_ARCH"
|
||||
echo "DEVICE_ARCH=$DEVICE_ARCH" >> $GITHUB_ENV
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
if: env.FILE_EXISTS == 'false'
|
||||
with:
|
||||
repository: openwrt/openwrt
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Checkout snapshot commit in openwrt repo
|
||||
if: env.FILE_EXISTS == 'false'
|
||||
run: git checkout ${{ env.SNAPSHOT_COMMIT_SHA}}
|
||||
|
||||
- name: Building kernel and tools
|
||||
if: env.FILE_EXISTS == 'false'
|
||||
run: |
|
||||
echo "pkgarch: ${{ matrix.build_env.pkgarch}}, target:${{ matrix.build_env.target}}, subtarget: ${{ matrix.build_env.subtarget}}"
|
||||
|
||||
# Setup & install feeds
|
||||
wget https://downloads.openwrt.org/snapshots/targets/${{ matrix.build_env.target}}/${{ matrix.build_env.subtarget}}/feeds.buildinfo -O feeds.conf
|
||||
echo "src-git awgopenwrt https://github.com/Slava-Shchipunov/awg-openwrt.git" >> ./feeds.conf
|
||||
./scripts/feeds update && ./scripts/feeds install -a
|
||||
|
||||
# Setup config with AWG and dependencies
|
||||
wget https://downloads.openwrt.org/snapshots/targets/${{ matrix.build_env.target}}/${{ matrix.build_env.subtarget}}/config.buildinfo -O .config
|
||||
echo "CONFIG_PACKAGE_kmod-amneziawg=m" >> .config
|
||||
echo "CONFIG_PACKAGE_amneziawg-tools=y" >> .config
|
||||
echo "CONFIG_PACKAGE_luci-app-amneziawg=y" >> .config
|
||||
echo "CONFIG_PACKAGE_kmod-crypto-lib-chacha20=m" >> .config
|
||||
echo "CONFIG_PACKAGE_kmod-crypto-lib-chacha20poly1305=m" >> .config
|
||||
echo "CONFIG_PACKAGE_kmod-crypto-chacha20poly1305=m" >> .config
|
||||
|
||||
make defconfig
|
||||
|
||||
echo " > make tools/install"
|
||||
make tools/install -i -j `nproc`
|
||||
|
||||
cat ./build_dir/target-*/linux-*/linux-*/.vermagic || true
|
||||
|
||||
echo " > make toolchain/install"
|
||||
make toolchain/install -i -j `nproc`
|
||||
|
||||
cat ./build_dir/target-*/linux-*/linux-*/.vermagic || true
|
||||
|
||||
# compile kernel module
|
||||
echo " > make target/linux/compile"
|
||||
make target/linux/compile -i -j `nproc` V=s
|
||||
|
||||
VERMAGIC=`cat ./build_dir/target-*/linux-*/linux-*/.vermagic`
|
||||
VERMAGIC_EXPECTED=${{ matrix.build_env.vermagic }}
|
||||
|
||||
if [ "$VERMAGIC" != "$VERMAGIC_EXPECTED" ]; then
|
||||
echo Vermagic mismatch: $VERMAGIC, expected $VERMAGIC_EXPECTED
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Build AmneziaWG
|
||||
if: env.FILE_EXISTS == 'false'
|
||||
run: |
|
||||
VERMAGIC=`cat ./build_dir/target-*/linux-*/linux-*/.vermagic`
|
||||
echo "Vermagic: $VERMAGIC"
|
||||
|
||||
VERMAGIC_EXPECTED=${{ matrix.build_env.vermagic }}
|
||||
|
||||
if [ "$VERMAGIC" != "$VERMAGIC_EXPECTED" ]; then
|
||||
echo Vermagic mismatch: $VERMAGIC, expected $VERMAGIC_EXPECTED
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Ignore kmod build for some targets, replace with the awg-go
|
||||
make package/kmod-amneziawg/{clean,download,prepare} V=s || true
|
||||
make package/kmod-amneziawg/compile V=s || true
|
||||
|
||||
make package/luci-app-amneziawg/{clean,download,prepare}
|
||||
make package/luci-app-amneziawg/compile V=s
|
||||
|
||||
make V=s package/amneziawg-tools/{clean,download,prepare}
|
||||
make V=s package/amneziawg-tools/compile
|
||||
|
||||
- name: Prepare artifacts
|
||||
if: env.FILE_EXISTS == 'false'
|
||||
run: |
|
||||
tag_name=${{ github.ref_name }}
|
||||
mkdir -p awgrelease
|
||||
postfix="${{ matrix.build_env.tag }}_${{ matrix.build_env.vermagic }}_${{ matrix.build_env.pkgarch}}_${{ matrix.build_env.target}}_${{ matrix.build_env.subtarget}}"
|
||||
cp bin/packages/${{ matrix.build_env.pkgarch }}/awgopenwrt/amneziawg-tools_*.ipk awgrelease/amneziawg-tools_${postfix}.ipk
|
||||
cp bin/packages/${{ matrix.build_env.pkgarch }}/awgopenwrt/luci-app-amneziawg_*.ipk awgrelease/luci-app-amneziawg_${postfix}.ipk
|
||||
cp bin/targets/${{ matrix.build_env.target}}/${{ matrix.build_env.subtarget}}/packages/kmod-amneziawg_*.ipk awgrelease/kmod-amneziawg_${postfix}.ipk
|
||||
|
||||
- name: Delete old release assets
|
||||
if: env.FILE_EXISTS == 'false'
|
||||
run: |
|
||||
postfix="${{ matrix.build_env.pkgarch }}_${{ matrix.build_env.target }}_${{ matrix.build_env.subtarget }}"
|
||||
echo "Looking for old release files ending with: ${postfix}"
|
||||
|
||||
# Получаем список всех артефактов релиза по имени
|
||||
assets=$(gh release view "${{ matrix.build_env.tag }}" --repo Slava-Shchipunov/awg-openwrt --json assets --jq ".assets | .[] | select(.name | endswith(\"$postfix.ipk\")) | .name")
|
||||
|
||||
# Удаляем найденные артефакты по имени
|
||||
for asset_name in $assets; do
|
||||
echo "Deleting asset with name: $asset_name"
|
||||
gh release delete-asset "${{ matrix.build_env.tag }}" "$asset_name" --repo Slava-Shchipunov/awg-openwrt
|
||||
done
|
||||
|
||||
- name: Release
|
||||
if: env.FILE_EXISTS == 'false'
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
files: awgrelease/*.ipk
|
||||
tag_name: ${{ matrix.build_env.tag }}
|
||||
66
.github/workflows/run-release.yml
vendored
66
.github/workflows/run-release.yml
vendored
@@ -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 }}
|
||||
91
README.md
91
README.md
@@ -1,13 +1,19 @@
|
||||
# Автоматическая настройка AmneziaWG для OpenWRT версии 23.05.0 и более новых
|
||||
Для автоматической настройки рекомендую использовать [скрипт](https://github.com/itdoginfo/domain-routing-openwrt) от пользователя itdog. Этот скрипт позволяет автоматически скачать нужные пакеты из собранных здесь и настроить [точечный обход блокировок по доменам](https://habr.com/ru/articles/767464/).
|
||||

|
||||
|
||||
Если же вам нужно только установить пакеты, я добавил скрипт amneziawg-install - он автоматически скачает пакеты из этого репозитория под ваше устройство (только для стабильной версии OpenWRT), а также предложит сразу настроить интерфейс с протоколом AmneziaWG. Если пользователь согласится, нужно будет ввести параметры конфига, которые запросит скрипт. При этом скрипт создаст интерфейс, настроит для него правила фаерволла, а также **включит перенаправление всего траффика через тунель AmneziaWG** (установит в настройках Peer галочку Route Allowed IPs).
|
||||
# Пакеты amneziawg для роутеров с прошивкой OpenWRT
|
||||
|
||||
## Автоматическая настройка AmneziaWG для OpenWRT версии 23.05.0 и более новых
|
||||
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, введите команду и следуйте инструкциям на экране:
|
||||
```
|
||||
sh <(wget -O - https://raw.githubusercontent.com/Slava-Shchipunov/awg-openwrt/refs/heads/master/amneziawg-install.sh)
|
||||
```
|
||||
|
||||
# Сборка пакетов для всех устройств, поддерживающих OpenWRT
|
||||
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 для всех устройств.
|
||||
На данный момент я собрал пакеты для всех устройств для OpenWRT версий:
|
||||
1) [23.05.0](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.0)
|
||||
@@ -16,19 +22,20 @@ sh <(wget -O - https://raw.githubusercontent.com/Slava-Shchipunov/awg-openwrt/re
|
||||
4) [23.05.3](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.3)
|
||||
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) [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)
|
||||
11) [24.10.3](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v24.10.3)
|
||||
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) ([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`, соответствующие вашему устройству.
|
||||
определить `target` и `subtarget` вашего устройства. Далее перейти на страницу релиза, соответствующего вашей версии OpenWRT, затем поиском по странице (Ctrl+F) найти 3 пакета, название которых оканчивается на `target_subtarget.ipk`, соответствующие вашему устройству. Для версии AWG 2.0 также доступен пакет русификации luci-i18n-amneziawg-ru
|
||||
|
||||
## Как запустить сборку для всех поддерживаемых устройств
|
||||
1) Создать форк этого репозитория
|
||||
@@ -39,21 +46,40 @@ sh <(wget -O - https://raw.githubusercontent.com/Slava-Shchipunov/awg-openwrt/re
|
||||
6) Ввести Release title
|
||||
7) Нажать внизу зеленую кнопку Publish release
|
||||
|
||||
Для публичных репозиториев Github предоставляет неограниченное по времени использование раннеров, у меня запускалось до 20 параллельных джоб. Каждая джоба выполняется около 2 часов, общее время на сборку около 10 часов.
|
||||
В случае возникновения ошибок в одной джобе, будут отменены все незавершенные - в этом случае на вкладке Actions можно выбрать неудавшийся запуск и нажать Re-run failed jobs
|
||||
Для публичных репозиториев Github предоставляет неограниченное по времени использование раннеров, у меня запускалось до 20 параллельных джоб. Каждая джоба выполняется около 10-15 минут, общее время на сборку около 60 минут.
|
||||
|
||||
## Сборка пакетов под определенную платформу
|
||||
Как запустить сборку пакетов для определенной платформы можно посмотреть в [инструкции на вики](https://github.com/itdoginfo/domain-routing-openwrt/wiki/Amnezia-WG-Build). Сборка под одно устройство займет около 2 часов.
|
||||
Как запустить сборку пакетов AWG 1.0 для определенной платформы можно посмотреть в [инструкции на вики](https://github.com/itdoginfo/domain-routing-openwrt/wiki/Amnezia-WG-Build). Сборка под одно устройство займет около 2 часов.
|
||||
|
||||
# Automatic configuration of AmneziaWG for OpenWRT version 23.05.0 and newer
|
||||
For automatic configuration, I recommend using the [script](https://github.com/itdoginfo/domain-routing-openwrt) from the user itdog. 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).
|
||||
AWG 2.0 можно собрать под определённую платформу следующим образом:
|
||||
1) Создать форк этого репозитория
|
||||
2) Переключиться на вкладку Actions и включить Github actions (по умолчанию для форков они выключены)
|
||||
3) Слева в списке экшенов выбрать экшен Create Release on Tag
|
||||
4) Справа нажать кнопку Run workflow
|
||||
5) В открывшемся списке указать версию Openwrt (например, 24.10.3), список target, разделенных запятыми (например, stm32,ramips), список subtarget, разделенных запятыми (например, stm32mp1,mt7621). Сборка будет произведена только для существующих пар target/subtarget
|
||||
6) Нажать зеленую кнопку Run workflow
|
||||
Сборка под одно устройство займет около 10-15 минут. При этом должен создаться релиз с указанной версией OpenWRT
|
||||
|
||||
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).
|
||||
## 🙏 Благодарности
|
||||
|
||||
Огромное спасибо за помощь в сборке пакетов AWG 2.0:
|
||||
|
||||
- [@kozhini](https://github.com/kozhini) и [@this-username-has-been-taken](https://github.com/this-username-has-been-taken) — ~~у которых я позаимствовал код Makefile-ов~~ чьим примером я вдохновлялся🙃
|
||||
- [@Kot-nikot](https://github.com/Kot-nikot) и [@Onotot](https://github.com/Onotot) — за полезные материалы и подсказки🤝
|
||||
- [@ygurov](https://github.com/ygurov) - за [имплементацию](https://github.com/amnezia-vpn/amneziawg-linux-kernel-module/pull/88) 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 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:
|
||||
```
|
||||
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 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.
|
||||
At the moment I have collected packages for all devices for OpenWRT versions:
|
||||
@@ -62,18 +88,23 @@ At the moment I have collected packages for all devices for OpenWRT versions:
|
||||
3) [23.05.2](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.2)
|
||||
4) [23.05.3](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.3)
|
||||
5) [23.05.4](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/v23.05.4)
|
||||
|
||||
And collected packages for popular devices for OpenWRT [SNAPSHOT](https://github.com/Slava-Shchipunov/awg-openwrt/releases/tag/SNAPSHOT)
|
||||
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) ([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.
|
||||
|
||||
## Selecting packages for your device
|
||||
In accordance with the paragraph [Specify variables for builds](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) (instructions in Russian) determine `target` and `subtarget` of your device. Then go to the release page corresponding to your OpenWRT version, then search the page (Ctrl+F) to find 3 packages whose names end in `target_subtarget.ipk` corresponding to your device.
|
||||
In accordance with the paragraph [Specify variables for builds](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) (instructions in Russian) determine `target` and `subtarget` of your device. Then go to the release page corresponding to your OpenWRT version, then search the page (Ctrl+F) to find 3 packages whose names end in `target_subtarget.ipk` corresponding to your device. For AWG 2.0 version, Russian localization package luci-i18n-amneziawg-ru is also available
|
||||
|
||||
## How to run a build for all supported devices
|
||||
1) Create a fork of this repository
|
||||
@@ -84,8 +115,16 @@ In accordance with the paragraph [Specify variables for builds](https://github.c
|
||||
6) Enter Release title
|
||||
7) Click the green Publish release button at the bottom
|
||||
|
||||
For public repositories, Github provides unlimited use of runners, I had up to 20 parallel jobs running. Each job takes about 2 hours, the total build time is about 10 hours.
|
||||
If errors occur in one job, all unfinished ones will be canceled - in this case, you can select the failed launch on the Actions tab and click Re-run failed jobs
|
||||
For public repositories, Github provides unlimited use of runners, I had up to 20 parallel jobs running. Each job takes about 10-15 minutes, the total build time is about 60 minutes.
|
||||
|
||||
## Building packages for a specific platform
|
||||
You can see how to start building packages for a specific platform in the [wiki instructions](https://github.com/itdoginfo/domain-routing-openwrt/wiki/Amnezia-WG-Build) (instructions in Russian). Building for one device will take about 2 hours.
|
||||
You can see how to start building AWG 1.0 packages for a specific platform in the [wiki instructions](https://github.com/itdoginfo/domain-routing-openwrt/wiki/Amnezia-WG-Build) (instructions in Russian). Building for one device will take about 2 hours.
|
||||
|
||||
AWG 2.0 can be built for a specific platform as follows:
|
||||
1) Create a fork of this repository
|
||||
2) Switch to the Actions tab and enable Github actions (they are disabled for forks by default)
|
||||
3) On the left in the list of actions, select the Create Release on Tag action
|
||||
4) On the right, click the Run workflow button
|
||||
5) In the opened list, specify the OpenWRT version (for example, 24.10.3), a list of targets separated by commas (for example, stm32,ramips), a list of subtargets separated by commas (for example, stm32mp1,mt7621). The build will be performed only for existing target/subtarget pairs
|
||||
6) Click the green Run workflow button
|
||||
Building for one device will take about 10-15 minutes. A release with the specified OpenWRT version should be created
|
||||
|
||||
@@ -2,40 +2,162 @@
|
||||
|
||||
#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)
|
||||
AWG_VERSION="1.0"
|
||||
MAJOR_VERSION=$(echo "$VERSION" | cut -d '.' -f 1)
|
||||
MINOR_VERSION=$(echo "$VERSION" | cut -d '.' -f 2)
|
||||
PATCH_VERSION=$(echo "$VERSION" | cut -d '.' -f 3)
|
||||
|
||||
if [ "$MAJOR_VERSION" -gt 24 ] || \
|
||||
[ "$MAJOR_VERSION" -eq 24 -a "$MINOR_VERSION" -gt 10 ] || \
|
||||
[ "$MAJOR_VERSION" -eq 24 -a "$MINOR_VERSION" -eq 10 -a "$PATCH_VERSION" -ge 3 ] || \
|
||||
[ "$MAJOR_VERSION" -eq 23 -a "$MINOR_VERSION" -eq 5 -a "$PATCH_VERSION" -ge 6 ]; then
|
||||
AWG_VERSION="2.0"
|
||||
LUCI_PACKAGE_NAME="luci-proto-amneziawg"
|
||||
else
|
||||
LUCI_PACKAGE_NAME="luci-app-amneziawg"
|
||||
fi
|
||||
|
||||
printf "\033[32;1mDetected AWG version: $AWG_VERSION\033[0m\n"
|
||||
|
||||
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
|
||||
echo "Error downloading kmod-amneziawg. Please, install kmod-amneziawg manually and run the script again"
|
||||
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"
|
||||
@@ -45,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
|
||||
@@ -59,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"
|
||||
@@ -68,58 +187,55 @@ install_awg_packages() {
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if opkg list-installed | grep -q luci-proto-amneziawg; then
|
||||
echo "luci-proto-amneziawg already installed"
|
||||
else
|
||||
LUCI_APP_AMNEZIAWG_FILENAME="luci-proto-amneziawg${PKGPOSTFIX}"
|
||||
DOWNLOAD_URL="${BASE_URL}v${VERSION}/${LUCI_APP_AMNEZIAWG_FILENAME}"
|
||||
wget -O "$AWG_DIR/$LUCI_APP_AMNEZIAWG_FILENAME" "$DOWNLOAD_URL"
|
||||
|
||||
# Проверяем оба возможных названия пакета
|
||||
if is_pkg_installed "luci-proto-amneziawg" || is_pkg_installed "luci-app-amneziawg"; then
|
||||
echo "$LUCI_PACKAGE_NAME already installed"
|
||||
else
|
||||
LUCI_AMNEZIAWG_FILENAME=$(download_package "$LUCI_PACKAGE_NAME" "$PKGPOSTFIX_BASE" "$AWG_DIR" "${BASE_URL}v${VERSION}/")
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "luci-proto-amneziawg file downloaded successfully"
|
||||
echo "$LUCI_PACKAGE_NAME file downloaded successfully"
|
||||
else
|
||||
echo "Error downloading luci-proto-amneziawg. Please, install luci-proto-amneziawg manually and run the script again"
|
||||
echo "Error downloading $LUCI_PACKAGE_NAME. Please, install $LUCI_PACKAGE_NAME manually and run the script again"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
opkg install "$AWG_DIR/$LUCI_APP_AMNEZIAWG_FILENAME"
|
||||
install_local_pkg "$AWG_DIR/$LUCI_AMNEZIAWG_FILENAME"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "luci-proto-amneziawg installed successfully"
|
||||
echo "$LUCI_PACKAGE_NAME installed successfully"
|
||||
else
|
||||
echo "Error installing luci-proto-amneziawg. Please, install luci-proto-amneziawg manually and run the script again"
|
||||
echo "Error installing $LUCI_PACKAGE_NAME. Please, install $LUCI_PACKAGE_NAME manually and run the script again"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Ask about Russian localization
|
||||
printf "\033[32;1mУстанавливаем пакет с русской локализацией? Install Russian language pack? (y/n) [n]: \033[0m\n"
|
||||
read INSTALL_RU_LANG
|
||||
INSTALL_RU_LANG=${INSTALL_RU_LANG:-n}
|
||||
# Устанавливаем русскую локализацию только для AWG 2.0
|
||||
if [ "$AWG_VERSION" = "2.0" ]; then
|
||||
printf "\033[32;1mУстанавливаем пакет с русской локализацией? Install Russian language pack? (y/n) [n]: \033[0m\n"
|
||||
read INSTALL_RU_LANG
|
||||
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
|
||||
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"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "luci-i18n-amneziawg-ru file downloaded successfully"
|
||||
opkg install "$AWG_DIR/$LUCI_I18N_AMNEZIAWG_RU_FILENAME"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "luci-i18n-amneziawg-ru installed successfully"
|
||||
else
|
||||
echo "Warning: Error installing luci-i18n-amneziawg-ru (non-critical)"
|
||||
fi
|
||||
if [ "$INSTALL_RU_LANG" = "y" ] || [ "$INSTALL_RU_LANG" = "Y" ]; then
|
||||
if is_pkg_installed "luci-i18n-amneziawg-ru"; then
|
||||
echo "luci-i18n-amneziawg-ru already installed"
|
||||
else
|
||||
echo "Warning: Russian localization not available for this version/platform (non-critical)"
|
||||
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"
|
||||
install_local_pkg "$AWG_DIR/$LUCI_I18N_AMNEZIAWG_RU_FILENAME"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "luci-i18n-amneziawg-ru installed successfully"
|
||||
else
|
||||
echo "Warning: Error installing luci-i18n-amneziawg-ru (non-critical)"
|
||||
fi
|
||||
else
|
||||
echo "Warning: Russian localization not available for this version/platform (non-critical)"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
printf "\033[32;1mSkipping Russian language pack installation.\033[0m\n"
|
||||
fi
|
||||
else
|
||||
printf "\033[32;1mSkipping Russian language pack installation.\033[0m\n"
|
||||
fi
|
||||
|
||||
rm -rf "$AWG_DIR"
|
||||
@@ -161,7 +277,18 @@ configure_amneziawg_interface() {
|
||||
read -r -p "Enter H2 value (from [Interface]):"$'\n' AWG_H2
|
||||
read -r -p "Enter H3 value (from [Interface]):"$'\n' AWG_H3
|
||||
read -r -p "Enter H4 value (from [Interface]):"$'\n' AWG_H4
|
||||
|
||||
|
||||
# AWG 2.0 новые параметры
|
||||
if [ "$AWG_VERSION" = "2.0" ]; then
|
||||
read -r -p "Enter S3 value (from [Interface]) [optional, leave blank to skip]:"$'\n' AWG_S3
|
||||
read -r -p "Enter S4 value (from [Interface]) [optional, leave blank to skip]:"$'\n' AWG_S4
|
||||
read -r -p "Enter I1 value (from [Interface]) [optional, leave blank to skip]:"$'\n' AWG_I1
|
||||
read -r -p "Enter I2 value (from [Interface]) [optional, leave blank to skip]:"$'\n' AWG_I2
|
||||
read -r -p "Enter I3 value (from [Interface]) [optional, leave blank to skip]:"$'\n' AWG_I3
|
||||
read -r -p "Enter I4 value (from [Interface]) [optional, leave blank to skip]:"$'\n' AWG_I4
|
||||
read -r -p "Enter I5 value (from [Interface]) [optional, leave blank to skip]:"$'\n' AWG_I5
|
||||
fi
|
||||
|
||||
uci set network.${INTERFACE_NAME}=interface
|
||||
uci set network.${INTERFACE_NAME}.proto=$PROTO
|
||||
uci set network.${INTERFACE_NAME}.private_key=$AWG_PRIVATE_KEY_INT
|
||||
@@ -178,6 +305,17 @@ configure_amneziawg_interface() {
|
||||
uci set network.${INTERFACE_NAME}.awg_h3=$AWG_H3
|
||||
uci set network.${INTERFACE_NAME}.awg_h4=$AWG_H4
|
||||
|
||||
# Устанавливаем новые параметры для AWG 2.0 (только если они заданы)
|
||||
if [ "$AWG_VERSION" = "2.0" ]; then
|
||||
[ -n "$AWG_S3" ] && uci set network.${INTERFACE_NAME}.awg_s3=$AWG_S3
|
||||
[ -n "$AWG_S4" ] && uci set network.${INTERFACE_NAME}.awg_s4=$AWG_S4
|
||||
[ -n "$AWG_I1" ] && uci set network.${INTERFACE_NAME}.awg_i1=$AWG_I1
|
||||
[ -n "$AWG_I2" ] && uci set network.${INTERFACE_NAME}.awg_i2=$AWG_I2
|
||||
[ -n "$AWG_I3" ] && uci set network.${INTERFACE_NAME}.awg_i3=$AWG_I3
|
||||
[ -n "$AWG_I4" ] && uci set network.${INTERFACE_NAME}.awg_i4=$AWG_I4
|
||||
[ -n "$AWG_I5" ] && uci set network.${INTERFACE_NAME}.awg_i5=$AWG_I5
|
||||
fi
|
||||
|
||||
if ! uci show network | grep -q ${CONFIG_NAME}; then
|
||||
uci add network ${CONFIG_NAME}
|
||||
fi
|
||||
@@ -218,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
|
||||
@@ -232,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
|
||||
|
||||
@@ -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
|
||||
|
||||
76
index.js
76
index.js
@@ -3,16 +3,19 @@ const cheerio = require('cheerio');
|
||||
const core = require('@actions/core');
|
||||
|
||||
const version = process.argv[2]; // Получение версии OpenWRT из аргумента командной строки
|
||||
const filterTargetsStr = process.argv[3] || ''; // Фильтр по targets (опционально, через запятую)
|
||||
const filterSubtargetsStr = process.argv[4] || ''; // Фильтр по subtargets (опционально, через запятую)
|
||||
|
||||
const SNAPSHOT_TARGETS_TO_BUILD = ['mediatek', 'ramips', 'x86', 'armsr'];
|
||||
const SNAPSHOT_SUBTARGETS_TO_BUILD = ['filogic', 'mt7622', 'mt7623', 'mt7629', 'mt7620', 'mt7621', 'mt76x8', '64', 'generic', 'armv8'];
|
||||
// Преобразуем строки с запятыми в массивы
|
||||
const filterTargets = filterTargetsStr ? filterTargetsStr.split(',').map(t => t.trim()).filter(t => t) : [];
|
||||
const filterSubtargets = filterSubtargetsStr ? filterSubtargetsStr.split(',').map(s => s.trim()).filter(s => s) : [];
|
||||
|
||||
if (!version) {
|
||||
core.setFailed('Version argument is required');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const url = version === 'SNAPSHOT' ? 'https://downloads.openwrt.org/snapshots/targets/' : `https://downloads.openwrt.org/releases/${version}/targets/`;
|
||||
const url = `https://downloads.openwrt.org/releases/${version}/targets/`;
|
||||
|
||||
async function fetchHTML(url) {
|
||||
try {
|
||||
@@ -49,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 = '';
|
||||
try {
|
||||
const { data } = await axios.get(indexUrl, { responseType: 'json' });
|
||||
pkgarch = data.architecture || '';
|
||||
} catch (e) {
|
||||
// keep pkgarch empty
|
||||
}
|
||||
|
||||
$('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];
|
||||
}
|
||||
// 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
|
||||
}
|
||||
});
|
||||
|
||||
@@ -74,19 +85,38 @@ async function main() {
|
||||
const jobConfig = [];
|
||||
|
||||
for (const target of targets) {
|
||||
// Пропускаем target, если указан массив фильтров и target не входит в него
|
||||
if (filterTargets.length > 0 && !filterTargets.includes(target)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const subtargets = await getSubtargets(target);
|
||||
for (const subtarget of subtargets) {
|
||||
// Пропускаем subtarget, если указан массив фильтров и subtarget не входит в него
|
||||
if (filterSubtargets.length > 0 && !filterSubtargets.includes(subtarget)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Добавляем в конфигурацию только если:
|
||||
// 1. Оба массива пустые (автоматическая сборка по тегу) - собираем всё
|
||||
// 2. Оба массива НЕ пустые (ручной запуск) - target И subtarget должны быть в своих массивах
|
||||
const isAutomatic = filterTargets.length === 0 && filterSubtargets.length === 0;
|
||||
const isManualMatch = filterTargets.length > 0 && filterSubtargets.length > 0 &&
|
||||
filterTargets.includes(target) && filterSubtargets.includes(subtarget);
|
||||
|
||||
if (!isAutomatic && !isManualMatch) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const { vermagic, pkgarch } = await getDetails(target, subtarget);
|
||||
|
||||
if (version !== 'SNAPSHOT' || (SNAPSHOT_SUBTARGETS_TO_BUILD.includes(subtarget) && SNAPSHOT_TARGETS_TO_BUILD.includes(target))) {
|
||||
jobConfig.push({
|
||||
tag: version,
|
||||
target,
|
||||
subtarget,
|
||||
vermagic,
|
||||
pkgarch,
|
||||
});
|
||||
}
|
||||
jobConfig.push({
|
||||
tag: version,
|
||||
target,
|
||||
subtarget,
|
||||
vermagic,
|
||||
pkgarch,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,13 +2,13 @@ include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=kmod-amneziawg
|
||||
PKG_VERSION:=1.0.20250924
|
||||
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 feature/awg2 branch as of 2025-09-24
|
||||
PKG_SOURCE_VERSION:=2a94fcc67c332bbb4b983fcebe03ac31057ead19
|
||||
# Version: latest stable release tag
|
||||
PKG_SOURCE_VERSION:=v$(PKG_VERSION)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
MAKE_PATH:=src
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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…') ])
|
||||
]),
|
||||
|
||||
Reference in New Issue
Block a user