mirror of
https://github.com/Slava-Shchipunov/awg-openwrt.git
synced 2026-03-14 09:23:10 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb008b93c8 | ||
|
|
1607241233 | ||
|
|
09256b1cc5 | ||
|
|
2c4fe317b3 | ||
|
|
676c821362 |
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 }}
|
||||
@@ -29,11 +29,10 @@ sh <(wget -O - https://raw.githubusercontent.com/Slava-Shchipunov/awg-openwrt/re
|
||||
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
|
||||
@@ -97,11 +96,10 @@ At the moment I have collected packages for all devices for OpenWRT versions:
|
||||
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.
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -23,7 +130,7 @@ install_awg_packages() {
|
||||
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 ] || \
|
||||
@@ -38,22 +145,19 @@ 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
|
||||
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"
|
||||
@@ -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"
|
||||
@@ -86,15 +187,12 @@ install_awg_packages() {
|
||||
exit 1
|
||||
fi
|
||||
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
|
||||
@@ -182,7 +277,7 @@ 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
|
||||
@@ -193,7 +288,7 @@ configure_amneziawg_interface() {
|
||||
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
|
||||
@@ -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
|
||||
|
||||
30
index.js
30
index.js
@@ -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 = '';
|
||||
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
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user