Compare commits

...

54 Commits

Author SHA1 Message Date
remittor
08e6776a81 zapret: Add depends from luajit 2025-12-18 18:11:45 +03:00
remittor
509b834729 zapret: Makefile: Fix Package-install section 2025-12-18 17:43:49 +03:00
remittor
003160cb05 build: Fix compile packages 2025-12-18 17:22:18 +03:00
remittor
682d153742 zapret: Add depends from liblua 2025-12-18 17:02:33 +03:00
remittor
e2810bbe98 build: Fix detection tag-version 2025-12-18 16:49:04 +03:00
remittor
7aecaa4ab7 config: Add new options for AutoHostList 2025-12-18 16:42:41 +03:00
remittor
03e8513703 luci: Rename files: zapret -> zapret2 2025-12-18 16:38:57 +03:00
remittor
7a4825a708 Add support Zapret2
Sources: https://github.com/bol-van/zapret2
2025-12-18 16:35:13 +03:00
remittor
9298388a12 build: Fix build package for riscv64 arch 2025-12-18 13:34:24 +03:00
remittor
0972ce0889 Bump version to v72.20251218 2025-12-18 11:32:56 +03:00
remittor
40084f0762 luci: Show package version with release number (exclude r1) 2025-12-18 11:30:16 +03:00
remittor
a616c6fa4e updater: Added retcode file (pid-file deleted) 2025-12-18 10:46:29 +03:00
remittor
06f45e3fbb updater: Replace wget to curl and other fixes 2025-12-18 09:19:08 +03:00
remittor
252a7eab9d Bump version to v72.20251217 2025-12-17 11:38:50 +03:00
remittor
73104ca3ca zapret: Fix makefile for install new sh-files 2025-12-17 11:33:59 +03:00
remittor
a5156e0d0c Add support check and install updates from GitHub 2025-12-17 11:31:13 +03:00
remittor
565ef66299 luci: Fix getting CPU arch info 2025-12-17 10:10:18 +03:00
remittor
1364bcbf1a ipset: Update zapret-hosts-user-exclude.txt 2025-12-16 08:23:47 +03:00
remittor
57ba961b07 github: releases: Remove draft releases 2025-12-16 08:14:32 +03:00
remittor
3a37ec9172 build: Add release number to pkg version string 2025-12-16 08:02:18 +03:00
remittor
e0ecbf5145 github: releases: Fix auto run 2025-12-15 23:15:05 +03:00
remittor
cc7ae8a91c build: Fix creation draft release 2025-12-15 23:05:32 +03:00
remittor
50ce130e1c build: Create releases.yml and auto mark all releases as prereleases 2025-12-15 20:55:20 +03:00
remittor
ac97bfae89 luci: Add showing CPU arch 2025-12-15 12:19:35 +03:00
remittor
058b3af2b3 build: releases: Create directory for releases 2025-12-14 15:11:05 +03:00
remittor
029923bac7 build: releases: Create releases for each ARCH 2025-12-14 14:25:28 +03:00
remittor
6aa114e87f build: releases: Add support second branch 2025-12-14 13:09:18 +03:00
remittor
ebd13f65c3 build: Add releases.yml to gh-pages 2025-12-14 12:42:20 +03:00
remittor
a95c938c78 build: Add arch riscv64 2025-12-14 12:42:20 +03:00
remittor
98dcd66524 luci: settings: Rename checkbox DISABLE_CUSTOM 2025-12-14 12:41:32 +03:00
remittor
1e2a9f48a2 luci: Remove unused controls from service-page 2025-12-14 12:41:03 +03:00
remittor
f63ce9d1e2 Bump version to v72.20251213 2025-12-13 10:33:20 +03:00
remittor
3f17898289 luci: Show option MODE_FILTER as checkbox: hostlist/autohostlist 2025-12-13 10:31:44 +03:00
remittor
52bd72079c install: Fix copy fake-files into distributive 2025-12-13 10:08:53 +03:00
remittor
6627678827 custom.d: Mark files into custom.d as configs 2025-12-13 10:06:56 +03:00
remittor
5691882d5e config: Fix using autohostlist option into NFQWS_OPT 2025-12-13 10:04:08 +03:00
remittor
fee8b480b0 Bump version to v72.20251212 2025-12-12 13:23:21 +03:00
remittor
2fb3ac3cc1 build: Return arm_cortex-a7_neon-vfpv4 for SNAPSHOT 2025-12-12 13:23:03 +03:00
remittor
f443195a44 build: fix gpg import
PR: https://github.com/remittor/zapret-openwrt/pull/443
2025-12-12 12:56:31 +03:00
remittor
5b65e2078f luci: Improved display of logs
PR: https://github.com/remittor/zapret-openwrt/pull/526
2025-12-12 12:53:51 +03:00
remittor
18b9394679 config: Add new options to reset settings dialog (choice of NFQWS strategy) 2025-12-12 12:27:18 +03:00
remittor
6ea3432d0c config: set DISABLE_CUSTOM=1 by default 2025-12-12 09:24:55 +03:00
remittor
5b28626ac0 custom.d: Add Stun4ALL script (50-script.sh) 2025-12-12 09:24:55 +03:00
remittor
6cbf1e3c47 ipset: Add ability for restore default ipset configs 2025-12-12 09:24:54 +03:00
remittor
2b04a6f37a fake: Added new TLS HELLO fakes 2025-12-09 14:57:25 +03:00
remittor
8ed3a6e3ae ipset: Update zapret-hosts-user-exclude.txt 2025-12-09 14:55:42 +03:00
remittor
55daf2f006 Bump version to v72.20251122 2025-11-22 11:58:46 +03:00
remittor
c60b70a02f config: Update default configs (by StressOzz v2) 2025-11-22 11:58:26 +03:00
remittor
44ff0ec3e1 Bump version to v72.20251022 2025-10-22 15:15:29 +03:00
remittor
65d90d8ed3 luci: Open each link on new page 2025-10-22 15:11:39 +03:00
remittor
e8dfb187e3 Bump version to v72.20250924 2025-09-24 13:25:50 +03:00
remittor
1b2057f00f luci: Add examples for custom.d scripts 2025-09-23 12:09:18 +03:00
remittor
7941f12c63 Bump version to v71.20250918 2025-09-18 15:17:37 +03:00
remittor
81f4b493f6 Add FILTER_MARK support 2025-09-18 15:17:18 +03:00
35 changed files with 1861 additions and 533 deletions

View File

@@ -137,14 +137,15 @@ jobs:
- mipsel_24kc_24kf - mipsel_24kc_24kf
- mipsel_74kc - mipsel_74kc
- mipsel_mips32 - mipsel_mips32
- riscv64_generic
- x86_64 - x86_64
isTestOrFake: isTestOrFake:
- ${{ needs.check.outputs.test_build == 'true' || needs.check.outputs.fake_build == 'true' }} - ${{ needs.check.outputs.test_build == 'true' || needs.check.outputs.fake_build == 'true' }}
exclude: exclude:
- branch: openwrt-24.10
arch: riscv64_generic
- branch: SNAPSHOT - branch: SNAPSHOT
arch: arm_cortex-a9_vfpv3-d16 arch: arm_cortex-a9_vfpv3-d16
- branch: SNAPSHOT
arch: arm_cortex-a7_neon-vfpv4
- { isTestOrFake: true } - { isTestOrFake: true }
include: include:
- branch: openwrt-24.10 - branch: openwrt-24.10
@@ -172,7 +173,8 @@ jobs:
shell: bash shell: bash
run: | run: |
# gpg --verbose --recv-keys 0x1D53D1877742E911 # gpg --verbose --recv-keys 0x1D53D1877742E911
gpg --verbose --import <(wget -qO- 'https://git.openwrt.org/?p=keyring.git;a=blob_plain;f=gpg/0x1D53D1877742E911.asc') # gpg --verbose --import <(wget -qO- 'https://git.openwrt.org/?p=keyring.git;a=blob_plain;f=gpg/0x1D53D1877742E911.asc')
gpg --verbose --import <(wget -qO- 'https://raw.githubusercontent.com/openwrt/keyring/refs/heads/master/gpg/0x1D53D1877742E911.asc')
# disable check signatures # disable check signatures
sed -i 's/gpg --/#gpg --/g' setup.sh sed -i 's/gpg --/#gpg --/g' setup.sh
# disable cleanup keys # disable cleanup keys
@@ -208,6 +210,8 @@ jobs:
PKGDIR=$GITHUB_WORKSPACE/zapret-openwrt PKGDIR=$GITHUB_WORKSPACE/zapret-openwrt
MKFN=$PKGDIR/luci-app-zapret/Makefile MKFN=$PKGDIR/luci-app-zapret/Makefile
PKGVER=$( grep -s '^PKG_VERSION:=.*' $MKFN | cut -d'=' -f2 ) PKGVER=$( grep -s '^PKG_VERSION:=.*' $MKFN | cut -d'=' -f2 )
PKGREL=$( grep -s '^PKG_RELEASE:=.*' $MKFN | cut -d'=' -f2 )
[ "$PKGREL" != "1" ] && PKGVER=$PKGVER-r$PKGREL
echo "PKG_VERSION = $PKGVER" echo "PKG_VERSION = $PKGVER"
cp -vr $PKGDIR ./package/zapret-openwrt/ cp -vr $PKGDIR ./package/zapret-openwrt/
@@ -248,9 +252,9 @@ jobs:
cat .config cat .config
echo "------------- .config END -------------------" echo "------------- .config END -------------------"
if [ "$ARCH" = "$LUCI_ARCH" ]; then if [ "$ARCH" = "$LUCI_ARCH" ]; then
PKGLIST=`echo package/zapret-openwrt/{zapret,zapret-tpws,zapret-mdig,zapret-ip2net,luci-app-zapret}/compile` PKGLIST=`echo package/zapret-openwrt/{zapret,zapret-mdig,zapret-ip2net,luci-app-zapret}/compile`
else else
PKGLIST=`echo package/zapret-openwrt/{zapret,zapret-tpws,zapret-mdig,zapret-ip2net}/compile` PKGLIST=`echo package/zapret-openwrt/{zapret,zapret-mdig,zapret-ip2net}/compile`
fi fi
if [ "$MAX_SPEED" = "false" ]; then if [ "$MAX_SPEED" = "false" ]; then
make $PKGLIST V=s CONFIG_CCACHE=1 BUILD_LOG=1 make $PKGLIST V=s CONFIG_CCACHE=1 BUILD_LOG=1
@@ -260,11 +264,11 @@ jobs:
else else
OUT_DIR=./bin/packages/dev_x/base OUT_DIR=./bin/packages/dev_x/base
mkdir -p $OUT_DIR mkdir -p $OUT_DIR
touch $OUT_DIR/zapret_$PKGVER-$ARCH.$PKGTYPE touch $OUT_DIR/zapret2_$PKGVER-$ARCH.$PKGTYPE
touch $OUT_DIR/luci-app-zapret_$PKGVER-all.$PKGTYPE touch $OUT_DIR/luci-app-zapret2_$PKGVER-all.$PKGTYPE
fi fi
find ./bin/packages/*/base -type f ! -regex ".*\(zapret\).*\.[ai]pk$" -delete find ./bin/packages/*/base -type f ! -regex ".*\(zapret2\).*\.[ai]pk$" -delete
#echo ">>>>>>> build a repository index to make the output directory usable as local OPKG source" #echo ">>>>>>> build a repository index to make the output directory usable as local OPKG source"
#ln -s `which usign` staging_dir/host/bin/usign #ln -s `which usign` staging_dir/host/bin/usign
@@ -335,18 +339,19 @@ jobs:
find ./sorted -mindepth 1 -maxdepth 1 -type d -exec cp -f "$LUCI_IPK" "{}/" \; find ./sorted -mindepth 1 -maxdepth 1 -type d -exec cp -f "$LUCI_IPK" "{}/" \;
find ./sorted -mindepth 2 -maxdepth 2 -type d -name "apk" -exec cp -f "$LUCI_APK" "{}/" \; find ./sorted -mindepth 2 -maxdepth 2 -type d -name "apk" -exec cp -f "$LUCI_APK" "{}/" \;
mkdir -p public mkdir -p public
find ./sorted -mindepth 1 -maxdepth 1 -type d -exec sh -c '7z a ./public/zapret_v${PKGVER}_$(basename "{}" | cut -d, -f3).zip {}/*' \; find ./sorted -mindepth 1 -maxdepth 1 -type d -exec sh -c '7z a ./public/zapret2_v${PKGVER}_$(basename "{}" | cut -d, -f3).zip {}/*' \;
ls -lh ./public/*.zip ls -lh ./public/*.zip
- name: Upload assets - name: Upload assets
uses: andelf/nightly-release@main uses: softprops/action-gh-release@v2
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ needs.check.outputs.tag }} TAG: ${{ needs.check.outputs.tag }}
with: with:
prerelease: ${{ env.TEST_BUILD == 'true' || env.FAKE_BUILD == 'true' }} draft: ${{ env.TEST_BUILD == 'true' || env.FAKE_BUILD == 'true' }}
prerelease: true
tag_name: v${{ needs.build.outputs.pkgver }}${{ env.TAG_SUFFIX }} tag_name: v${{ needs.build.outputs.pkgver }}${{ env.TAG_SUFFIX }}
name: zapret v${{ needs.build.outputs.pkgver }} name: zapret2 v${{ needs.build.outputs.pkgver }}
body: | body: |
zapret v${{ needs.build.outputs.pkgver }} for OpenWrt zapret2 v${{ needs.build.outputs.pkgver }} for OpenWrt
files: ./public/*.zip files: ./public/*.zip

140
.github/workflows/releases.yml vendored Normal file
View File

@@ -0,0 +1,140 @@
name: Update releases.json
on:
workflow_run:
workflows: ["build"]
types: [completed]
release:
types: [published, created, edited]
permissions:
contents: write
jobs:
update-json:
if: |
github.event_name != 'workflow_run' ||
github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- name: Checkout gh-pages
uses: actions/checkout@v4
with:
ref: gh-pages
continue-on-error: true
- name: Save FULL releases.json
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OWNER: ${{ github.repository_owner }}
REPO: ${{ github.event.repository.name }}
run: |
curl -s \
-H "Authorization: Bearer $GH_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/repos/$OWNER/$REPO/releases \
> releases.json
- name: Generate releases_BRANCH.json
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OWNER: ${{ github.repository_owner }}
REPO: ${{ github.event.repository.name }}
run: |
curl -s \
-H "Authorization: Bearer $GH_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/repos/$OWNER/$REPO/releases \
| jq '
def normalize_release:
{
id: .id,
version: (.tag_name | sub("^v"; "")),
tag: .tag_name,
name: .name,
draft: .draft,
prerelease: .prerelease,
created_at: .created_at,
published_at: .published_at,
url: .html_url,
assets: (
.assets | map({
id: .id,
name: .name,
size: .size,
content_type: .content_type,
browser_download_url: .browser_download_url
})
)
};
sort_by(.created_at) | reverse
| {
zap1: (
map(select(.draft == false))
| map(select(.name | startswith("zapret ")))
| .[0:20]
| {
generated_at: (now | todate),
releases: map(normalize_release)
}
),
zap2: (
map(select(.draft == false))
| map(select(.name | startswith("zapret2 ")))
| .[0:20]
| {
generated_at: (now | todate),
releases: map(normalize_release)
}
)
}
' \
| tee \
>(jq '.zap1' > releases_zap1.json) \
>(jq '.zap2' > releases_zap2.json)
- name: Generate releases_BRANCH_ARCH.json
run: |
BRANCHES=("zap1" "zap2")
for ARCH in $(jq -r '.[] | .assets[].name | capture("^[^_]+_[^_]+_(?<arch>.+)\\.zip$").arch' releases.json | sort -u); do
for BRANCH in "${BRANCHES[@]}"; do
if [ "$BRANCH" == "zap1" ]; then
PREFIX="zapret "
else
PREFIX="zapret2 "
fi
jq --arg prefix "$PREFIX" --arg arch "$ARCH" '
sort_by(.created_at) | reverse
| map(select(.draft == false))
| map(select(.name | startswith($prefix)))
| .[0:20]
| map(
. as $release
| {
tag: $release.tag_name,
name: $release.name,
prerelease: $release.prerelease,
created_at: $release.created_at,
updated_at: $release.updated_at,
published_at: $release.published_at,
url: $release.html_url,
assets: ($release.assets | map(select(.name | test("_\($arch)\\.zip$"))))
}
)
| { generated_at: (now | todate), releases: . }
' releases.json > "releases_${BRANCH}_${ARCH}.json"
done
done
- name: Commit and push ALL releases.json
run: |
mkdir -p releases
mv releases*.json releases/
git config user.name "github-actions"
git config user.email "github-actions@github.com"
git checkout -B gh-pages
git add releases/*
git commit -m "Update releases" || exit 0
git push origin gh-pages

View File

@@ -6,7 +6,7 @@
[![Donations Page](https://github.com/andry81-cache/gh-content-static-cache/raw/master/common/badges/donate/donate.svg)](https://github.com/remittor/donate) [![Donations Page](https://github.com/andry81-cache/gh-content-static-cache/raw/master/common/badges/donate/donate.svg)](https://github.com/remittor/donate)
# zapret-openwrt # zapret-openwrt
Zapret is not a VPN! Zapret is an Anti-DPI utility! Zapret2 is not a VPN! Zapret2 is an Anti-DPI utility!
[Instructions for installing](https://github.com/remittor/zapret-openwrt/wiki/Installing-zapretopenwrt-package) [Instructions for installing](https://github.com/remittor/zapret-openwrt/wiki/Installing-zapretopenwrt-package)

View File

@@ -4,13 +4,14 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-zapret PKG_NAME:=luci-app-zapret2
PKG_VERSION:=71.20250708 PKG_VERSION:=0.7.20251218
PKG_RELEASE:=1
PKG_LICENSE:=MIT PKG_LICENSE:=MIT
PKG_MAINTAINER:=remittor <https://github.com/remittor> PKG_MAINTAINER:=remittor <https://github.com/remittor>
LUCI_TITLE:=LuCI support for zapret LUCI_TITLE:=LuCI support for zapret2
LUCI_DEPENDS:=+zapret LUCI_DEPENDS:=+zapret2
LUCI_PKGARCH:=all LUCI_PKGARCH:=all
define Package/$(PKG_NAME)/postinst define Package/$(PKG_NAME)/postinst

View File

@@ -11,7 +11,7 @@ return view.extend({
retrieveLog: async function() { retrieveLog: async function() {
return Promise.all([ return Promise.all([
L.resolveDefault(fs.stat('/bin/cat'), null), L.resolveDefault(fs.stat('/bin/cat'), null),
fs.exec('/usr/bin/find', [ '/tmp', '-maxdepth', '1', '-type', 'f', '-name', 'zapret+*.log' ]), fs.exec('/usr/bin/find', [ '/tmp', '-maxdepth', '1', '-type', 'f', '-name', 'zapret2+*.log' ]),
uci.load(tools.appName), uci.load(tools.appName),
]).then(function(status_array) { ]).then(function(status_array) {
var filereader = status_array[0] ? status_array[0].path : null; var filereader = status_array[0] ? status_array[0].path : null;
@@ -130,7 +130,7 @@ return view.extend({
return; return;
} }
var h2 = E('div', {'class' : 'cbi-title-section'}, [ var h2 = E('div', {'class' : 'cbi-title-section'}, [
E('h2', {'class': 'cbi-title-field'}, [ _('Zapret') + ' - ' + _('Log Viewer') ]), E('h2', {'class': 'cbi-title-field'}, [ _('Zapret2') + ' - ' + _('Log Viewer') ]),
]); ]);
var tabs = E('div', {}, E('div')); var tabs = E('div', {}, E('div'));
@@ -140,7 +140,7 @@ return view.extend({
var logfn = logdata[log_num].filename; var logfn = logdata[log_num].filename;
let filename = logfn.replace(/.*\//, ''); let filename = logfn.replace(/.*\//, '');
let fname = filename.split('.')[0]; let fname = filename.split('.')[0];
fname = fname.replace(/^(zapret\+)/, ''); fname = fname.replace(/^(zapret2\+)/, '');
let fn = fname.split('+'); let fn = fname.split('+');
let tabNameText = fname.replace(/\+/g, ' '); let tabNameText = fname.replace(/\+/g, ' ');
@@ -173,16 +173,16 @@ return view.extend({
let tab = E('div', { 'data-tab': tabname, 'data-tab-title': tabNameText }, [ let tab = E('div', { 'data-tab': tabname, 'data-tab-title': tabNameText }, [
E('div', { 'id': 'content_dmnlog_' + log_num }, [ E('div', { 'id': 'content_dmnlog_' + log_num }, [
E('div', {'style': 'padding-bottom: 20px'}, [ scrollDownButton ]), E('div', {'style': 'margin-bottom: 20px; '}, [ scrollDownButton ]),
E('textarea', { E('textarea', {
'id': log_id, 'id': log_id,
'name': log_name, 'name': log_name,
'style': 'font-size:12px', 'style': 'font-size:12px; width: 100%; max-height: 50vh;',
'readonly': 'readonly', 'readonly': 'readonly',
'wrap': 'off', 'wrap': 'off',
'rows': logdata[log_num].rows, 'rows': logdata[log_num].rows,
}, [ log_text ]), }, [ log_text ]),
E('div', {'style': 'padding-bottom: 20px'}, [ scrollUpButton ]), E('div', {'style': 'margin-top: 20px'}, [ scrollUpButton ]),
]), ]),
]); ]);

View File

@@ -4,7 +4,8 @@
'require uci'; 'require uci';
'require ui'; 'require ui';
'require view'; 'require view';
'require view.zapret.tools as tools'; 'require view.zapret2.tools as tools';
'require view.zapret2.updater as updater';
const btn_style_neutral = 'btn'; const btn_style_neutral = 'btn';
const btn_style_action = 'btn cbi-button-action'; const btn_style_action = 'btn cbi-button-action';
@@ -21,8 +22,8 @@ return view.extend({
start : elems.btn_start || document.getElementById('btn_start'), start : elems.btn_start || document.getElementById('btn_start'),
restart : elems.btn_restart || document.getElementById('btn_restart'), restart : elems.btn_restart || document.getElementById('btn_restart'),
stop : elems.btn_stop || document.getElementById('btn_stop'), stop : elems.btn_stop || document.getElementById('btn_stop'),
reset : elems.btn_reset || document.getElementById('btn_reset'),
update : elems.btn_update || document.getElementById('btn_update'), update : elems.btn_update || document.getElementById('btn_update'),
reset : elems.btn_update || document.getElementById('btn_reset'),
}; };
}, },
@@ -37,8 +38,8 @@ return view.extend({
btn.start.disabled = flag; btn.start.disabled = flag;
btn.restart.disabled = flag; btn.restart.disabled = flag;
btn.stop.disabled = flag; btn.stop.disabled = flag;
btn.update.disabled = true; // TODO
btn.reset.disabled = (error_code == 0) ? flag : false; btn.reset.disabled = (error_code == 0) ? flag : false;
btn.update.disabled = (error_code == 0) ? flag : false;
}, },
getAppStatus: function() { getAppStatus: function() {
@@ -48,11 +49,13 @@ return view.extend({
tools.getSvcInfo(), // svc_info tools.getSvcInfo(), // svc_info
fs.exec('/bin/busybox', [ 'ps' ]), // process list fs.exec('/bin/busybox', [ 'ps' ]), // process list
fs.exec(tools.packager.path, tools.packager.args), // installed packages fs.exec(tools.packager.path, tools.packager.args), // installed packages
tools.getStratList(), // nfqws strategy list
fs.exec('/bin/cat', [ '/etc/openwrt_release' ]), // CPU arch
uci.load(tools.appName), // config uci.load(tools.appName), // config
]).catch(e => { ]).catch(e => {
ui.addNotification(null, E('p', _('Unable to execute or read contents') ui.addNotification(null, E('p', _('Unable to execute or read contents')
+ ': %s [ %s | %s | %s ]'.format( + ': %s [ %s | %s | %s ]'.format(
e.message, tools.execPath, 'tools.getInitState', 'uci.zapret' e.message, tools.execPath, 'tools.getInitState', 'uci.zapret2'
))); )));
}); });
}, },
@@ -61,7 +64,7 @@ return view.extend({
let cfg = uci.get(tools.appName, 'config'); let cfg = uci.get(tools.appName, 'config');
if (!status_array || cfg == null || typeof(cfg) !== 'object') { if (!status_array || cfg == null || typeof(cfg) !== 'object') {
let elem_status = elems.status || document.getElementById("status"); let elem_status = elems.status || document.getElementById("status");
elem_status.innerHTML = tools.makeStatusString(null); elem_status.innerHTML = tools.makeStatusString(null, '', '');
ui.addNotification(null, E('p', _('Unable to read the contents') + ': setAppStatus()')); ui.addNotification(null, E('p', _('Unable to read the contents') + ': setAppStatus()'));
this.disableButtons(true, -1, elems); this.disableButtons(true, -1, elems);
return; return;
@@ -71,6 +74,11 @@ return view.extend({
let svc_info = status_array[2]; // stdout: JSON as text let svc_info = status_array[2]; // stdout: JSON as text
let proc_list = status_array[3]; // stdout: multiline text let proc_list = status_array[3]; // stdout: multiline text
let pkg_list = status_array[4]; // stdout: installed packages let pkg_list = status_array[4]; // stdout: installed packages
let stratlist = status_array[5]; // array of strat names
let sys_info = status_array[6]; // stdout: openwrt distrib info
this.nfqws_strat_list = stratlist;
this.pkg_arch = tools.getConfigPar(sys_info.stdout, 'DISTRIB_ARCH', 'unknown');
//console.log('svc_en: ' + svc_en.code); //console.log('svc_en: ' + svc_en.code);
svc_en = (svc_en.code == 0) ? true : false; svc_en = (svc_en.code == 0) ? true : false;
@@ -97,8 +105,8 @@ return view.extend({
svcinfo = tools.decode_svc_info(svc_en, svc_info, proc_list, cfg); svcinfo = tools.decode_svc_info(svc_en, svc_info, proc_list, cfg);
} }
let btn = this.get_svc_buttons(elems); let btn = this.get_svc_buttons(elems);
btn.update.disabled = true; // TODO
btn.reset.disabled = false; btn.reset.disabled = false;
btn.update.disabled = false;
if (Number.isInteger(svcinfo)) { if (Number.isInteger(svcinfo)) {
ui.addNotification(null, E('p', _('Error') ui.addNotification(null, E('p', _('Error')
@@ -118,7 +126,7 @@ return view.extend({
} }
} }
let elem_status = elems.status || document.getElementById("status"); let elem_status = elems.status || document.getElementById("status");
elem_status.innerHTML = tools.makeStatusString(svcinfo, cfg.FWTYPE, 'user_only'); elem_status.innerHTML = tools.makeStatusString(svcinfo, this.pkg_arch, '');
if (!poll.active()) { if (!poll.active()) {
poll.start(); poll.start();
@@ -147,7 +155,7 @@ return view.extend({
}); });
}, },
serviceActionEx: function(action, button, hide_modal = false) { serviceActionEx: function(action, button, args = [ ], hide_modal = false) {
if (button) { if (button) {
let elem = document.getElementById(button); let elem = document.getElementById(button);
this.disableButtons(true, elem); this.disableButtons(true, elem);
@@ -164,7 +172,7 @@ return view.extend({
} }
else if (action == 'reset') { else if (action == 'reset') {
exec_cmd = tools.defaultCfgPath; exec_cmd = tools.defaultCfgPath;
exec_arg = [ 'sync' ]; // restore config + sync configs exec_arg = args; // (reset_ipset)(sync) ==> restore all configs + sync config
errmsg = _('Unable to run restore-def-cfg.sh script.'); errmsg = _('Unable to run restore-def-cfg.sh script.');
action = null; action = null;
} else { } else {
@@ -199,17 +207,7 @@ return view.extend({
let elem = document.getElementById(button); let elem = document.getElementById(button);
this.disableButtons(true, elem); this.disableButtons(true, elem);
} }
poll.stop(); poll.stop();
if (action === 'update') {
this.getAppStatus().then(
(status_array) => {
this.setAppStatus(status_array, [], 4);
}
);
}
return fs.exec_direct(tools.execPath, [ action ]).then(res => { return fs.exec_direct(tools.execPath, [ action ]).then(res => {
return this.getAppStatus().then( return this.getAppStatus().then(
(status_array) => { (status_array) => {
@@ -228,6 +226,33 @@ return view.extend({
dialogResetCfg: function(ev) { dialogResetCfg: function(ev) {
ev.target.blur(); ev.target.blur();
let reset_base = E('label', [
E('input', { type: 'checkbox', id: 'cfg_reset_base', checked: true }),
' ', _('Restore all base settings')
]);
let reset_ipset = E('label', [
E('input', { type: 'checkbox', id: 'cfg_reset_ipset', checked: true }),
' ', _('Restore ipset configs')
]);
let set_autohostlist = E('label', [
E('input', { type: 'checkbox', id: 'cfg_autohostlist', checked: true }),
' ', _('Set AutoHostList mode')
]);
let strat_list = [ ];
strat_list.push( E('option', { value: 'strat__skip__' }, [ '-' ] ) );
for (let id = 0; id < this.nfqws_strat_list.length; id++) {
let strat = '' + this.nfqws_strat_list[id];
strat_list.push( E('option', { value: 'strat_' + id }, [ strat ] ) );
}
let nfqws_strat = E('label', [
_('NFQWS2_OPT strategy: '),
E('select', { id: 'cfg_nfqws2_strat' }, strat_list)
]);
let cancel_button = E('button', { let cancel_button = E('button', {
'class': btn_style_neutral, 'class': btn_style_neutral,
'click': ui.hideModal, 'click': ui.hideModal,
@@ -238,12 +263,35 @@ return view.extend({
}, _('Reset settings')); }, _('Reset settings'));
resetcfg_btn.onclick = ui.createHandlerFn(this, () => { resetcfg_btn.onclick = ui.createHandlerFn(this, () => {
//cancel_button.disabled = true; //cancel_button.disabled = true;
return this.serviceActionEx('reset', resetcfg_btn, true); let opt_flags = '';
if (document.getElementById('cfg_reset_base').checked == false) {
opt_flags += '(skip_base)';
};
if (document.getElementById('cfg_reset_ipset').checked) {
opt_flags += '(reset_ipset)';
};
if (document.getElementById('cfg_autohostlist').checked) {
opt_flags += '(set_mode_autohostlist)';
};
//console.log('RESET: opt_flags = ' + opt_flags);
let sel_strat = document.getElementById('cfg_nfqws2_strat');
let opt_strat = sel_strat.options[sel_strat.selectedIndex].text;
//console.log('RESET: strat = ' + opt_strat);
opt_flags += '(sync)';
let args = [ opt_flags, opt_strat ];
return this.serviceActionEx('reset', resetcfg_btn, args, true);
}); });
ui.showModal(_('Reset settings to default'), [ ui.showModal(_('Reset settings to default'), [
E('div', { 'class': 'cbi-section' }, [ E('div', { 'class': 'cbi-section' }, [
E('p', _('All settings will be reset to default. Continue?')), reset_base,
E('br'), E('br'),
reset_ipset,
E('br'), E('br'),
set_autohostlist,
E('br'), E('br'),
nfqws_strat,
E('br'), E('br')
]), ]),
E('div', { 'class': 'right' }, [ E('div', { 'class': 'right' }, [
cancel_button, cancel_button,
@@ -329,14 +377,14 @@ return view.extend({
btn_stop.onclick = ui.createHandlerFn(this, this.serviceAction, 'stop', 'btn_stop'); btn_stop.onclick = ui.createHandlerFn(this, this.serviceAction, 'stop', 'btn_stop');
layout_append(_('Service daemons control'), null, [ btn_start, btn_restart, btn_stop ] ); layout_append(_('Service daemons control'), null, [ btn_start, btn_restart, btn_stop ] );
let btn_update = create_btn('btn_update', btn_style_action, _('Update'));
btn_update.onclick = ui.createHandlerFn(this, () => { this.appAction('update', 'btn_update') });
layout_append(_('Update HostLists'), null, [ btn_update ] );
let btn_reset = create_btn('btn_reset', btn_style_action, _('Reset settings')); let btn_reset = create_btn('btn_reset', btn_style_action, _('Reset settings'));
btn_reset.onclick = L.bind(this.dialogResetCfg, this); btn_reset.onclick = L.bind(this.dialogResetCfg, this);
layout_append(_('Reset settings to default'), null, [ btn_reset ] ); layout_append(_('Reset settings to default'), null, [ btn_reset ] );
let btn_update = create_btn('btn_update', btn_style_action, _('Update'));
btn_update.onclick = ui.createHandlerFn(this, () => { updater.openUpdateDialog(this.pkg_arch) });
layout_append(_('Update package'), null, [ btn_update ] );
let elems = { let elems = {
"status": status_string, "status": status_string,
"btn_enable": btn_enable, "btn_enable": btn_enable,
@@ -344,30 +392,30 @@ return view.extend({
"btn_start": btn_start, "btn_start": btn_start,
"btn_restart": btn_restart, "btn_restart": btn_restart,
"btn_stop": btn_stop, "btn_stop": btn_stop,
"btn_update": btn_update,
"btn_reset": btn_reset, "btn_reset": btn_reset,
"btn_update": btn_update,
}; };
this.setAppStatus(status_array, elems); this.setAppStatus(status_array, elems);
poll.add(L.bind(this.statusPoll, this)); poll.add(L.bind(this.statusPoll, this));
let page_title = _('Zapret'); let page_title = _('Zapret2');
let pkgdict = tools.decode_pkg_list(pkg_list.stdout); let pkgdict = tools.decode_pkg_list(pkg_list.stdout, false);
page_title += ' &nbsp '; page_title += ' &nbsp ';
if (pkgdict['zapret'] === undefined || pkgdict['zapret'] == '') { if (pkgdict['zapret2'] === undefined || pkgdict['zapret2'] == '') {
page_title += 'unknown version'; page_title += 'unknown version';
} else { } else {
page_title += 'v' + pkgdict['zapret']; page_title += 'v' + pkgdict['zapret2'];
} }
let aux1 = E('em'); let aux1 = E('em');
let aux2 = E('em'); let aux2 = E('em');
if (pkgdict['zapret'] != pkgdict['luci-app-zapret']) { if (pkgdict['zapret2'] != pkgdict['luci-app-zapret2']) {
let errtxt = 'LuCI APP v' + pkgdict['luci-app-zapret'] + ' [ incorrect version! ]'; let errtxt = 'LuCI APP v' + pkgdict['luci-app-zapret2'] + ' [ incorrect version! ]';
aux1 = E('div', { 'class': 'label-status error' }, errtxt); aux1 = E('div', { 'class': 'label-status error' }, errtxt);
aux2 = E('div', { }, '&nbsp'); aux2 = E('div', { }, '&nbsp');
} }
let url1 = 'https://github.com/bol-van/zapret'; let url1 = 'https://github.com/bol-van/zapret2';
let url2 = 'https://github.com/remittor/zapret-openwrt'; let url2 = 'https://github.com/remittor/zapret-openwrt';
return E([ return E([

View File

@@ -5,7 +5,7 @@
'require uci'; 'require uci';
'require ui'; 'require ui';
'require view'; 'require view';
'require view.zapret.tools as tools'; 'require view.zapret2.tools as tools';
return view.extend({ return view.extend({
parsers: { }, parsers: { },
@@ -48,7 +48,7 @@ return view.extend({
let m, s, o, tabname; let m, s, o, tabname;
m = new form.Map(tools.appName, _('Zapret') + ' - ' + _('Settings')); m = new form.Map(tools.appName, _('Zapret2') + ' - ' + _('Settings'));
s = m.section(form.NamedSection, 'config'); s = m.section(form.NamedSection, 'config');
s.anonymous = true; s.anonymous = true;
@@ -90,11 +90,11 @@ return view.extend({
o.rmempty = false; o.rmempty = false;
o.default = 1; o.default = 1;
o = s.taboption(tabname, form.ListValue, 'MODE_FILTER', _('MODE_FILTER')); //o = s.taboption(tabname, form.ListValue, 'MODE_FILTER', _('MODE_FILTER'));
//o.value('none', 'none'); //o.value('none', 'none');
//o.value('ipset', 'ipset'); //o.value('ipset', 'ipset');
o.value('hostlist', 'hostlist'); //o.value('hostlist', 'hostlist');
o.value('autohostlist', 'autohostlist'); //o.value('autohostlist', 'autohostlist');
o = s.taboption(tabname, form.Value, 'WS_USER', _('WS_USER')); o = s.taboption(tabname, form.Value, 'WS_USER', _('WS_USER'));
o.rmempty = false; o.rmempty = false;
@@ -106,15 +106,15 @@ return view.extend({
/* NFQWS_OPT_DESYNC tab */ /* NFQWS_OPT_DESYNC tab */
tabname = 'nfqws_params'; tabname = 'nfqws2_params';
s.tab(tabname, _('NFQWS options')); s.tab(tabname, _('NFQWS2 options'));
let add_delim = function(sec, url = null) { let add_delim = function(sec, url = null) {
let o = sec.taboption(tabname, form.DummyValue, '_hr'); let o = sec.taboption(tabname, form.DummyValue, '_hr');
o.rawhtml = true; o.rawhtml = true;
o.default = '<hr style="width: 620px; height: 1px; margin: 1px 0 1px; border-top: 1px solid;">'; o.default = '<hr style="width: 620px; height: 1px; margin: 1px 0 1px; border-top: 1px solid;">';
if (url) { if (url) {
o.default += '<br/>' + _('Help') + ': <a href=%s>%s</a>'.format(url); o.default += '<br/>' + _('Help') + ': <a target=_blank href=%s>%s</a>'.format(url);
} }
}; };
@@ -149,12 +149,12 @@ return view.extend({
}; };
let desc = locname; let desc = locname;
if (multiline == 2) { if (multiline == 2) {
desc += '<br/>' + _('Example') + ': <a href=%s>%s</a>'.format(tools.nfqws_opt_url); desc += '<br/>' + _('Example') + ': <a target=_blank href=%s>%s</a>'.format(tools.nfqws_opt_url);
} }
btn.onclick = () => new tools.longstrEditDialog('config', param, param, desc, rows, multiline).show(); btn.onclick = () => new tools.longstrEditDialog('config', param, param, desc, rows, multiline).show();
}; };
o = s.taboption(tabname, form.Flag, 'NFQWS_ENABLE', _('NFQWS_ENABLE')); o = s.taboption(tabname, form.Flag, 'NFQWS2_ENABLE', _('NFQWS2_ENABLE'));
o.rmempty = false; o.rmempty = false;
o.default = 1; o.default = 1;
@@ -168,31 +168,36 @@ return view.extend({
o.rmempty = false; o.rmempty = false;
o.datatype = 'string'; o.datatype = 'string';
o = s.taboption(tabname, form.Value, 'NFQWS_PORTS_TCP', _('NFQWS_PORTS_TCP')); o = s.taboption(tabname, form.Value, 'FILTER_MARK', _('FILTER_MARK'));
o.rmempty = false;
o.validate = function(section_id, value) { return true; };
o.write = function(section_id, value) { return form.Value.prototype.write.call(this, section_id, (value == null || value.trim() == '') ? "\t" : value.trim()); };
o = s.taboption(tabname, form.Value, 'NFQWS2_PORTS_TCP', _('NFQWS2_PORTS_TCP'));
o.rmempty = false; o.rmempty = false;
o.datatype = 'string'; o.datatype = 'string';
o = s.taboption(tabname, form.Value, 'NFQWS_PORTS_UDP', _('NFQWS_PORTS_UDP')); o = s.taboption(tabname, form.Value, 'NFQWS2_PORTS_UDP', _('NFQWS2_PORTS_UDP'));
o.rmempty = false; o.rmempty = false;
o.datatype = 'string'; o.datatype = 'string';
o = s.taboption(tabname, form.Value, 'NFQWS_TCP_PKT_OUT', _('NFQWS_TCP_PKT_OUT')); o = s.taboption(tabname, form.Value, 'NFQWS2_TCP_PKT_OUT', _('NFQWS2_TCP_PKT_OUT'));
o.rmempty = false; o.rmempty = false;
o.datatype = 'string'; o.datatype = 'string';
o = s.taboption(tabname, form.Value, 'NFQWS_TCP_PKT_IN', _('NFQWS_TCP_PKT_IN')); o = s.taboption(tabname, form.Value, 'NFQWS2_TCP_PKT_IN', _('NFQWS2_TCP_PKT_IN'));
o.rmempty = false; o.rmempty = false;
o.datatype = 'string'; o.datatype = 'string';
o = s.taboption(tabname, form.Value, 'NFQWS_UDP_PKT_OUT', _('NFQWS_UDP_PKT_OUT')); o = s.taboption(tabname, form.Value, 'NFQWS2_UDP_PKT_OUT', _('NFQWS2_UDP_PKT_OUT'));
o.rmempty = false; o.rmempty = false;
o.datatype = 'string'; o.datatype = 'string';
o = s.taboption(tabname, form.Value, 'NFQWS_UDP_PKT_IN', _('NFQWS_UDP_PKT_IN')); o = s.taboption(tabname, form.Value, 'NFQWS2_UDP_PKT_IN', _('NFQWS2_UDP_PKT_IN'));
o.rmempty = false; o.rmempty = false;
o.datatype = 'string'; o.datatype = 'string';
o = s.taboption(tabname, form.Value, 'NFQWS_PORTS_TCP_KEEPALIVE', _('NFQWS_PORTS_TCP_KEEPALIVE')); o = s.taboption(tabname, form.Value, 'NFQWS2_PORTS_TCP_KEEPALIVE', _('NFQWS2_PORTS_TCP_KEEPALIVE'));
o.rmempty = false; o.rmempty = false;
o.datatype = 'uinteger'; o.datatype = 'uinteger';
@@ -201,13 +206,35 @@ return view.extend({
o.datatype = 'uinteger'; o.datatype = 'uinteger';
add_delim(s, tools.nfqws_opt_url); add_delim(s, tools.nfqws_opt_url);
add_param(s, 'NFQWS_OPT', null, 21, 2); add_param(s, 'NFQWS2_OPT', null, 21, 2);
/* AutoHostList settings */ /* AutoHostList settings */
tabname = 'autohostlist_tab'; tabname = 'autohostlist_tab';
s.tab(tabname, _('AutoHostList')); s.tab(tabname, _('AutoHostList'));
o = s.taboption(tabname, form.Flag, 'MODE_FILTER', _('Use AutoHostList mode'));
o.rmempty = false;
o.default = '0';
o.validate = function(section_id, value) { return true; };
o.load = function(section_id) {
return uci.load(tools.appName).then(L.bind(function() {
var v = uci.get(tools.appName, section_id, 'MODE_FILTER');
return (v === 'autohostlist') ? '1' : '0';
}, this));
};
o.write = function(section_id, value) {
return uci.set(tools.appName, section_id, 'MODE_FILTER', value === '1' ? 'autohostlist' : 'hostlist');
};
o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_INCOMING_MAXSEQ', _('INCOMING_MAXSEQ'));
o.rmempty = false;
o.datatype = 'uinteger';
o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_RETRANS_MAXSEQ', _('RETRANS_MAXSEQ'));
o.rmempty = false;
o.datatype = 'uinteger';
o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_RETRANS_THRESHOLD', _('RETRANS_THRESHOLD')); o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_RETRANS_THRESHOLD', _('RETRANS_THRESHOLD'));
o.rmempty = false; o.rmempty = false;
o.datatype = 'uinteger'; o.datatype = 'uinteger';
@@ -220,6 +247,14 @@ return view.extend({
o.rmempty = false; o.rmempty = false;
o.datatype = 'uinteger'; o.datatype = 'uinteger';
o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_UDP_IN', _('UDP_IN'));
o.rmempty = false;
o.datatype = 'uinteger';
o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_UDP_OUT', _('UDP_OUT'));
o.rmempty = false;
o.datatype = 'uinteger';
o = s.taboption(tabname, form.Button, '_auto_host_btn', _('Auto host list entries')); o = s.taboption(tabname, form.Button, '_auto_host_btn', _('Auto host list entries'));
o.inputtitle = _('Edit'); o.inputtitle = _('Edit');
o.inputstyle = 'edit btn'; o.inputstyle = 'edit btn';
@@ -344,9 +379,19 @@ return view.extend({
tabname = 'custom_d_tab'; tabname = 'custom_d_tab';
s.tab(tabname, 'custom.d'); s.tab(tabname, 'custom.d');
o = s.taboption(tabname, form.Flag, 'DISABLE_CUSTOM', _('DISABLE_CUSTOM')); o = s.taboption(tabname, form.Flag, 'DISABLE_CUSTOM', _('Use custom.d scripts'));
o.rmempty = false; o.rmempty = false;
o.default = 0; o.default = '0';
o.validate = function(section_id, value) { return true; };
o.load = function(section_id) {
return uci.load(tools.appName).then(L.bind(function() {
var v = uci.get(tools.appName, section_id, 'DISABLE_CUSTOM');
return (v === '1') ? '0' : '1';
}, this));
};
o.write = function(section_id, value) {
return uci.set(tools.appName, section_id, 'DISABLE_CUSTOM', value === '1' ? '0' : '1');
};
add_delim(s); add_delim(s);
@@ -358,7 +403,16 @@ return view.extend({
o.inputtitle = _('Edit'); o.inputtitle = _('Edit');
o.inputstyle = 'edit btn'; o.inputstyle = 'edit btn';
o.description = fn; o.description = fn;
let desc = (num == tools.discord_num) ? _('Example') + ': <a href=%s>%s</a>'.format(tools.discord_url) : ''; let desc = '';
if (num == tools.discord_num) {
desc = _('Example') + ': ';
for (let k = 0; k < tools.discord_url.length; k++) {
let url = tools.discord_url[k];
if (k > 0) desc += ' <br> ';
const filename = url.substring(url.lastIndexOf("/") + 1).split("?")[0];
desc += '<a target=_blank href=' + url + '>' + filename + '</a>';
}
}
o.onclick = () => new tools.fileEditDialog(fn, name, desc, '', 15).show(); o.onclick = () => new tools.fileEditDialog(fn, name, desc, '', 15).show();
} }

View File

@@ -36,27 +36,31 @@ document.head.append(E('style', {'type': 'text/css'},
return baseclass.extend({ return baseclass.extend({
packager : null, packager : null,
appName : 'zapret', appName : 'zapret2',
execPath : '/etc/init.d/zapret', execPath : '/etc/init.d/zapret2',
syncCfgPath : '/opt/zapret/sync_config.sh', syncCfgPath : '/opt/zapret2/sync_config.sh',
defaultCfgPath : '/opt/zapret/restore-def-cfg.sh', defCfgPath : '/opt/zapret2/def-cfg.sh',
defaultCfgPath : '/opt/zapret2/restore-def-cfg.sh',
hostsGoogleFN : '/opt/zapret/ipset/zapret-hosts-google.txt', hostsGoogleFN : '/opt/zapret2/ipset/zapret-hosts-google.txt',
hostsUserFN : '/opt/zapret/ipset/zapret-hosts-user.txt', hostsUserFN : '/opt/zapret2/ipset/zapret-hosts-user.txt',
hostsUserExcludeFN: '/opt/zapret/ipset/zapret-hosts-user-exclude.txt', hostsUserExcludeFN: '/opt/zapret2/ipset/zapret-hosts-user-exclude.txt',
iplstExcludeFN : '/opt/zapret/ipset/zapret-ip-exclude.txt', iplstExcludeFN : '/opt/zapret2/ipset/zapret-ip-exclude.txt',
iplstUserFN : '/opt/zapret/ipset/zapret-ip-user.txt', iplstUserFN : '/opt/zapret2/ipset/zapret-ip-user.txt',
iplstUserExcludeFN: '/opt/zapret/ipset/zapret-ip-user-exclude.txt', iplstUserExcludeFN: '/opt/zapret2/ipset/zapret-ip-user-exclude.txt',
custFileMax : 4, custFileMax : 4,
custFileTemplate : '/opt/zapret/ipset/cust%s.txt', custFileTemplate : '/opt/zapret2/ipset/cust%s.txt',
customdPrefixList : [ 10, 20, 50, 60, 90 ] , customdPrefixList : [ 10, 20, 50, 60, 90 ] ,
customdFileFormat : '/opt/zapret/init.d/openwrt/custom.d/%s-script.sh', customdFileFormat : '/opt/zapret2/init.d/openwrt/custom.d/%s-script.sh',
discord_num : 50, discord_num : 50,
discord_url : 'https://github.com/bol-van/zapret/blob/4e8e3a9ed9dbeb1156db68dfaa7b353051c13797/init.d/custom.d.examples.linux/50-discord', discord_url : [ 'https://github.com/bol-van/zapret2/blob/master/init.d/custom.d.examples.linux/50-discord-media',
nfqws_opt_url : 'https://github.com/remittor/zapret-openwrt/discussions/168', 'https://github.com/bol-van/zapret2/blob/master/init.d/custom.d.examples.linux/50-stun4all',
'https://github.com/bol-van/zapret2/tree/master/init.d/custom.d.examples.linux'
],
nfqws_opt_url : 'https://github.com/remittor/zapret-openwrt/discussions/',
autoHostListFN : '/opt/zapret/ipset/zapret-hosts-auto.txt', autoHostListFN : '/opt/zapret2/ipset/zapret-hosts-auto.txt',
autoHostListDbgFN : '/opt/zapret/ipset/zapret-hosts-auto-debug.log', autoHostListDbgFN : '/opt/zapret2/ipset/zapret-hosts-auto-debug.log',
infoLabelRunning : '<span class="label-status running">' + _('Running') + '</span>', infoLabelRunning : '<span class="label-status running">' + _('Running') + '</span>',
infoLabelStarting : '<span class="label-status starting">' + _('Starting') + '</span>', infoLabelStarting : '<span class="label-status starting">' + _('Starting') + '</span>',
@@ -101,11 +105,11 @@ return baseclass.extend({
if (L.hasSystemFeature('apk')) { if (L.hasSystemFeature('apk')) {
this.packager.name = 'apk'; this.packager.name = 'apk';
this.packager.path = '/usr/bin/apk'; this.packager.path = '/usr/bin/apk';
this.packager.args = [ 'list', '-I', '*zapret*' ]; this.packager.args = [ 'list', '-I', '*zapret2*' ];
} else { } else {
this.packager.name = 'opkg'; this.packager.name = 'opkg';
this.packager.path = '/bin/opkg'; this.packager.path = '/bin/opkg';
this.packager.args = [ 'list-installed', '*zapret*' ]; this.packager.args = [ 'list-installed', '*zapret2*' ];
} }
//console.log('PACKAGER: ' + this.packager.name); //console.log('PACKAGER: ' + this.packager.name);
} }
@@ -135,6 +139,20 @@ return baseclass.extend({
}); });
}, },
getStratList: function() {
this.init_consts();
let exec_cmd = '/bin/busybox';
let exec_arg = [ 'awk', '-F', '"', '/if \\[ "\\$strat" = "/ {print $4}', this.defCfgPath ];
return fs.exec(exec_cmd, exec_arg).then(res => {
if (res.code == 0) {
return this.getWordsArray(res.stdout);
}
return [ ];
}).catch(e => {
ui.addNotification(null, E('p', _('Failed to get strat list: %s').format(e)));
});
},
handleServiceAction: function(name, action) { handleServiceAction: function(name, action) {
return this.callInitAction(name, action).then(success => { return this.callInitAction(name, action).then(success => {
if (!success) { if (!success) {
@@ -150,40 +168,61 @@ return baseclass.extend({
return (v && typeof(v) === 'string') ? v.trim().replace(/\r?\n/g, '') : v; return (v && typeof(v) === 'string') ? v.trim().replace(/\r?\n/g, '') : v;
}, },
decode_pkg_list: function(pkg_list) { getWordsArray: function (text, { trim = true, removeEmpty = true } = {}) {
const rawLines = text.split(/\n/);
const processed = trim ? rawLines.map(line => line.trim()) : rawLines.slice();
return removeEmpty ? processed.filter(line => line.length > 0) : processed;
},
getConfigPar: function(txt, key, defval = null) {
const re = new RegExp(`^${key}\\s*=\\s*(['"])(.*?)\\1`, 'm');
const m = txt.match(re);
return m ? m[2] : defval;
},
decode_pkg_list: function(pkg_list, with_suffix_r1 = true) {
let pkg_dict = { }; let pkg_dict = { };
if (!pkg_list) {
return pkg_dict;
}
let lines = pkg_list.trim().split('\n'); let lines = pkg_list.trim().split('\n');
for (let i = 0; i < lines.length; i++) { for (let i = 0; i < lines.length; i++) {
let line = lines[i].trim(); let line = lines[i].trim();
let name; let name;
let ver; let ver;
let rev = -1;
if (this.packager.name == 'apk') { if (this.packager.name == 'apk') {
let fullname = line.split(' ')[0]; let fullname = line.split(' ')[0];
let mpos = fullname.lastIndexOf("-"); let match = fullname.match(/^(.*)-r(\d+)$/);
if (mpos <= 0) if (match) {
continue; fullname = match[1];
if (fullname.substring(mpos+1, mpos+2) == 'r') { rev = parseInt(match[2], 10);
// release number
fullname = fullname.substring(0, mpos);
} }
mpos = fullname.lastIndexOf("-"); let mpos = fullname.lastIndexOf('-');
if (mpos <= 0) if (mpos <= 0)
continue; continue; // incorrect format
name = fullname.substring(0, mpos).trim(); name = fullname.slice(0, mpos).trim();
ver = fullname.substring(mpos+1).trim(); ver = fullname.slice(mpos + 1).trim();
} else { } else {
if (!line.includes(' - ')) if (!line.includes(' - '))
continue; continue; // incorrect format
name = line.split(' - ')[0].trim(); name = line.split(' - ')[0].trim();
ver = line.split(' - ')[1].trim(); ver = line.split(' - ')[1].trim();
let spos = ver.indexOf(" "); let spos = ver.indexOf(" ");
if (spos > 0) { if (spos > 0) {
ver = ver.substring(0, spos); ver = ver.substring(0, spos);
} }
let mpos = ver.lastIndexOf("-"); let match = ver.match(/^(.*)-r(\d+)$/);
if (mpos > 0 && ver.substring(mpos+1, mpos+2) == 'r') { if (match) {
// release number ver = match[1];
ver = ver.substring(0, mpos); rev = parseInt(match[2], 10);
}
}
if (rev >= 0) {
if (rev == 1 && !with_suffix_r1) {
// nothing
} else {
ver += '-r' + rev;
} }
} }
pkg_dict[name] = ver; pkg_dict[name] = ver;
@@ -231,9 +270,9 @@ return baseclass.extend({
return -4; return -4;
} }
let jdata = svc_info; let jdata = svc_info;
if (typeof(jdata.zapret) == 'object') { if (typeof(jdata.zapret2) == 'object') {
result.dmn.inited = true; result.dmn.inited = true;
let dmn_list = jdata.zapret.instances; let dmn_list = jdata.zapret2.instances;
if (typeof(dmn_list) == 'object') { if (typeof(dmn_list) == 'object') {
for (const [dmn_name, daemon] of Object.entries(dmn_list)) { for (const [dmn_name, daemon] of Object.entries(dmn_list)) {
result.dmn.total += 1; result.dmn.total += 1;
@@ -257,7 +296,7 @@ return baseclass.extend({
return result; return result;
}, },
makeStatusString: function(svcinfo, fwtype, bllist_preset) { makeStatusString: function(svcinfo, pkg_arch, bllist_preset) {
let svc_autorun = _('Unknown'); let svc_autorun = _('Unknown');
let svc_daemons = _('Unknown'); let svc_daemons = _('Unknown');
@@ -270,12 +309,18 @@ return baseclass.extend({
svc_daemons += ' [' + svcinfo.dmn.working + '/' + svcinfo.dmn.total + ']'; svc_daemons += ' [' + svcinfo.dmn.working + '/' + svcinfo.dmn.total + ']';
} }
} }
let update_mode = _('user entries only');
let td_name_width = 40; let td_name_width = 40;
let td_name_style = `style="width: ${td_name_width}%; min-width:${td_name_width}%; max-width:${td_name_width}%;"`; let td_name_style = `style="width: ${td_name_width}%; min-width:${td_name_width}%; max-width:${td_name_width}%;"`;
let out = ` let out = `
<table class="table"> <table class="table">
<tr class="tr">
<td class="td left" ${td_name_style}>
${_('CPU architecture')}:
</td>
<td class="td left">
${pkg_arch}
</td>
</tr>
<tr class="tr"> <tr class="tr">
<td class="td left" ${td_name_style}> <td class="td left" ${td_name_style}>
${_('Service autorun status')}: ${_('Service autorun status')}:
@@ -292,22 +337,6 @@ return baseclass.extend({
${svc_daemons} ${svc_daemons}
</td> </td>
</tr> </tr>
<tr class="tr">
<td class="td left" ${td_name_style}>
${_('FW type')}:
</td>
<td class="td left">
${fwtype}
</td>
</tr>
<tr class="tr">
<td class="td left" ${td_name_style}>
${_('HostLists update mode')}:
</td>
<td class="td left">
${update_mode}
</td>
</tr>
<tr class="tr"> <tr class="tr">
<td class="td left" ${td_name_style}> <td class="td left" ${td_name_style}>
</td> </td>
@@ -440,13 +469,16 @@ return baseclass.extend({
}, },
load: function() { load: function() {
let value = uci.get('zapret', this.cfgsec, this.cfgparam); let value = uci.get('zapret2', this.cfgsec, this.cfgparam);
if (typeof(value) === 'string') { if (typeof(value) === 'string') {
value = value.trim(); value = value.trim();
if (this.multiline == 2) { if (this.multiline == 2) {
value = value.replace(/\n\t\t\t--/g, "\n--"); value = value.replace(/\n\t/g, "\n");
value = value.replace(/\n\t\t--/g, "\n--"); value = value.replace(/\n\t/g, "\n");
value = value.replace(/\n\t--/g, "\n--"); value = value.replace(/\n\t/g, "\n");
value = value.replace(/\n\t/g, "\n");
value = value.replace(/\n\t/g, "\n");
value = value.replace(/\n\t/g, "\n");
value = value.replace(/\n --/g, "\n--"); value = value.replace(/\n --/g, "\n--");
value = value.replace(/\n --/g, "\n--"); value = value.replace(/\n --/g, "\n--");
value = value.replace(/ --/g, "\n--"); value = value.replace(/ --/g, "\n--");
@@ -511,7 +543,7 @@ return baseclass.extend({
} }
value = value.replace(/˂/g, '<'); value = value.replace(/˂/g, '<');
value = value.replace(/˃/g, '>'); value = value.replace(/˃/g, '>');
uci.set('zapret', this.cfgsec, this.cfgparam, value); uci.set('zapret2', this.cfgsec, this.cfgparam, value);
uci.save(); uci.save();
let elem = document.getElementById("cbi-zapret-" + this.cfgsec + "-_" + this.cfgparam); let elem = document.getElementById("cbi-zapret-" + this.cfgsec + "-_" + this.cfgparam);
if (elem) { if (elem) {

View File

@@ -0,0 +1,238 @@
'use strict';
'require baseclass';
'require fs';
'require poll';
'require uci';
'require ui';
'require view';
'require view.zapret2.tools as tools';
const btn_style_neutral = 'btn';
const btn_style_action = 'btn cbi-button-action';
const btn_style_positive = 'btn cbi-button-save important';
const btn_style_negative = 'btn cbi-button-reset important';
const btn_style_warning = 'btn cbi-button-negative';
const btn_style_success = 'btn cbi-button-success important';
const fn_update_pkg_sh = '/opt/zapret2/update-pkg.sh';
return baseclass.extend({
releasesUrlPrefix : 'https://raw.githubusercontent.com/remittor/zapret-openwrt/gh-pages/releases/',
appendLog: function(msg, end = '\n') {
this.logArea.value += msg + end;
this.logArea.scrollTop = this.logArea.scrollHeight;
},
setBtnMode: function(enable) {
this.btn_cancel.disabled = enable ? false : true;
this.btn_action.disabled = (enable == 2) ? false : true;
},
setStage: function(stage, btn_flag = true) {
if (stage == 0) {
this.btn_action.textContent = _('Check for updates');
this.btn_action.classList.remove('hidden');
} else
if (stage == 1) {
this.btn_action.textContent = _('Update packages');
this.btn_action.classList.remove('hidden');
} else {
this.btn_action.classList.add('hidden');
}
if (stage > 1 && typeof(this.btn_action) == 'object') {
this.setBtnMode(1);
}
this.stage = stage;
},
checkUpdates: function() {
this.setStage(0);
this.setBtnMode(0);
this.pkg_url = null;
this.appendLog(_('Checking for updates...'));
let opt_list = [ '-c' ]; // check for updates
if (document.getElementById('cfg_exclude_prereleases').checked == false) {
opt_list.push('-p'); // include prereleases ZIP-files
}
let forced_reinstall = document.getElementById('cfg_forced_reinstall').checked;
let rpc_opt = { timeout: 20*1000 }
//rpc_opt.uid = 0; // run under root
let res = fs.exec(fn_update_pkg_sh, opt_list, null, rpc_opt).then(res => {
let log = res.stdout.trim();
this.appendLog(log);
let code = log.match(/^RESULT:\s*\(([^)]+)\)\s+.+$/m);
let pkg_url = log.match(/^ZAP_PKG_URL\s*=\s*(.+)$/m);
if (res.code == 0 && code && pkg_url) {
this.pkg_url = pkg_url[1];
code = code[1];
if (code == 'E' && !forced_reinstall) {
this.setStage(999);
return 0;
}
this.setStage(1);
this.setBtnMode(2); // enable all buttons
} else {
if (res.code != 0) {
this.appendLog('ERROR: Check for updates failed with error ' + res.code);
}
this.setStage(999);
}
return res.code;
}).catch(e => {
this.appendLog('ERROR: ' + _('Updates checking failed'));
this.appendLog('ERROR: ' + e);
this.setStage(999);
return 1;
}).finally(() => {
this.appendLog('=========================================================');
});
},
installUpdates: async function() {
this.setStage(1);
this.setBtnMode(0);
if (!this.pkg_url || this.pkg_url.length < 10) {
this.appendLog('ERROR: pkg_url = null');
this.setStage(999);
return 1;
}
this.appendLog(_('Install updates...'));
let opt_list = [ '-u', this.pkg_url ]; // update packages
if (document.getElementById('cfg_forced_reinstall').checked == true) {
opt_list.push('-f'); // forced reinstall if same version
}
let rpc_opt = { timeout: 5*1000 }
//rpc_opt.uid = 0; // run under root
const logFile = '/tmp/zapret2_pkg_install.log';
const rcFile = logFile + '.rc';
try {
await fs.exec('/bin/busybox', [ 'rm', '-f', logFile + '*' ], null, rpc_opt);
this.appendLog('Install log cleared.');
} catch (e) {
this.appendLog('ERROR: Failed to clear log file');
this.setStage(999);
return 1;
}
try {
let opt = [ logFile, fn_update_pkg_sh ];
//opt.push('-t'); opt.push('0'); // only for testing
opt.push(...opt_list);
let res = await fs.exec('/opt/zapret2/script-exec.sh', opt, null, rpc_opt);
if (res.code == 0) {
this.appendLog('Process started...');
} else {
this.appendLog('ERROR: cannot run ' + fn_update_pkg_sh + ' script! (error = ' + res.code + ')');
throw new Error('cannot run script');
}
} catch (e) {
this.appendLog('ERROR: Failed to start process: ' + e.message);
this.setStage(999);
return 1;
}
let lastLen = 0;
let retCode = -1;
let timer = setInterval(async () => {
try {
let res = await fs.exec('/bin/cat', [ logFile ], null, rpc_opt);
if (res.stdout && res.stdout.length > lastLen) {
let log = res.stdout.slice(lastLen);
log = log.replace(/^ \* resolve_conffiles.*(?:\r?\n|$)/gm, '');
this.appendLog(log, '');
lastLen = res.stdout.length;
}
if (retCode < 0) {
let rc = await fs.exec('/bin/cat', [ rcFile ], null, rpc_opt);
if (rc.code != 0) {
throw new Error('cannot read file "' + rcFile + '"');
}
if (rc.stdout) {
retCode = parseInt(rc.stdout.trim(), 10);
}
}
if (retCode >= 0) {
clearInterval(timer);
this.appendLog('\n' + 'Process finished.');
if (res.stdout) {
let code = res.stdout.match(/^RESULT:\s*\(([^)]+)\)\s+.+$/m);
if (retCode == 0 && code && code[1] == '+') {
this.stage = 999;
this.btn_action.textContent = _('OK');
this.btn_action.disabled = false;
this.btn_cancel.disabled = true;
return 0;
}
}
this.appendLog('ERROR: Install updates failed with error ' + retCode);
this.setStage(999);
}
} catch (e) {
clearInterval(timer);
this.appendLog('ERROR: installUpdates: ' + e.message);
this.setStage(999);
}
}, 500);
},
openUpdateDialog: function(pkg_arch) {
this.stage = 0;
this.pkg_arch = pkg_arch;
this.pkg_url = null;
let exclude_prereleases = E('label', [
E('input', { type: 'checkbox', id: 'cfg_exclude_prereleases', checked: true }),
' ', _('Exclude PreReleases')
]);
let forced_reinstall = E('label', [
E('input', { type: 'checkbox', id: 'cfg_forced_reinstall'}),
' ', _('Forced reinstall packages')
]);
this.logArea = E('textarea', {
'readonly': true,
'style': 'width:100%; height:400px; font-family: monospace;'
});
this.btn_cancel = E('button', {
'id': 'btn_cancel',
'name': 'btn_cancel',
'class': btn_style_warning,
}, _('Cancel'));
this.btn_cancel.onclick = ui.hideModal;
this.btn_action = E('button', {
'id': 'btn_action',
'name': 'btn_action',
'class': btn_style_action,
}, 'BUTTON_ACTION');
this.btn_action.onclick = ui.createHandlerFn(this, () => {
if (this.stage == 0) {
return this.checkUpdates();
}
if (this.stage == 1) {
return this.installUpdates();
}
return ui.hideModal();
});
this.setStage(0);
this.setBtnMode(2);
ui.showModal(_('Package update'), [
E('div', { 'class': 'cbi-section' }, [
exclude_prereleases,
E('br'), E('br'),
forced_reinstall,
E('br'), E('br'),
E('hr'),
this.logArea,
]),
E('div', { 'class': 'right' }, [
this.btn_cancel,
' ',
this.btn_action,
])
]);
}
});

View File

@@ -1,46 +0,0 @@
{
"admin/services/zapret": {
"title": "Zapret",
"order": 61,
"action": {
"type": "alias",
"path": "admin/services/zapret/service"
},
"depends": {
"acl": [ "luci-app-zapret" ],
"fs": {
"/opt/zapret/sync_config.sh": "executable",
"/opt/zapret/restore-def-cfg.sh": "executable",
"/etc/init.d/zapret": "executable"
},
"uci": { "zapret": true }
}
},
"admin/services/zapret/service": {
"title": "Service",
"order": 10,
"action": {
"type": "view",
"path": "zapret/service"
}
},
"admin/services/zapret/settings": {
"title": "Settings",
"order": 20,
"action": {
"type": "view",
"path": "zapret/settings"
}
},
"admin/services/zapret/dmnlog": {
"title": "Log Viewer",
"order": 30,
"action": {
"type": "view",
"path": "zapret/dmnlog"
}
}
}

View File

@@ -0,0 +1,48 @@
{
"admin/services/zapret2": {
"title": "Zapret2",
"order": 62,
"action": {
"type": "alias",
"path": "admin/services/zapret2/service"
},
"depends": {
"acl": [ "luci-app-zapret2" ],
"fs": {
"/opt/zapret2/sync_config.sh": "executable",
"/opt/zapret2/restore-def-cfg.sh": "executable",
"/opt/zapret2/script-exec.sh": "executable",
"/opt/zapret2/update-pkg.sh.sh": "executable",
"/etc/init.d/zapret2": "executable"
},
"uci": { "zapret2": true }
}
},
"admin/services/zapret2/service": {
"title": "Service",
"order": 10,
"action": {
"type": "view",
"path": "zapret2/service"
}
},
"admin/services/zapret2/settings": {
"title": "Settings",
"order": 20,
"action": {
"type": "view",
"path": "zapret2/settings"
}
},
"admin/services/zapret2/dmnlog": {
"title": "Log Viewer",
"order": 30,
"action": {
"type": "view",
"path": "zapret2/dmnlog"
}
}
}

View File

@@ -1,38 +0,0 @@
{
"luci-app-zapret": {
"description": "Grant access to zapret procedures",
"read": {
"cgi-io": [ "exec" ],
"file": {
"/opt/zapret/config": [ "read" ],
"/opt/zapret/ipset/*": [ "read" ],
"/opt/zapret/init.d/openwrt/custom.d/*": [ "read" ],
"/etc/crontabs/root": [ "read" ],
"/tmp/zapret*": [ "read" ],
"/etc/init.d/zapret*": [ "exec" ],
"/bin/ps*": [ "exec" ],
"/bin/cat*": [ "exec" ],
"/bin/busybox*": [ "exec" ],
"/bin/opkg*": [ "exec" ],
"/usr/bin/apk*": [ "exec" ],
"/usr/bin/find*": [ "exec" ],
"/opt/zapret/restore-def-cfg.sh*": [ "exec" ],
"/opt/zapret/sync_config.sh*": [ "exec" ]
},
"uci": [ "zapret", "network" ],
"ubus": {
"luci": [ "getInitList", "setInitAction" ],
"service": [ "list" ]
}
},
"write": {
"file": {
"/opt/zapret/config": [ "write" ],
"/opt/zapret/ipset/*": [ "write" ],
"/opt/zapret/init.d/openwrt/custom.d/*": [ "write" ],
"/etc/crontabs/root": [ "write" ]
},
"uci": [ "zapret" ]
}
}
}

View File

@@ -0,0 +1,40 @@
{
"luci-app-zapret2": {
"description": "Grant access to zapret2 procedures",
"read": {
"cgi-io": [ "exec" ],
"file": {
"/opt/zapret2/config": [ "read" ],
"/opt/zapret2/ipset/*": [ "read" ],
"/opt/zapret2/init.d/openwrt/custom.d/*": [ "read" ],
"/etc/crontabs/root": [ "read" ],
"/tmp/zapret*": [ "read" ],
"/etc/init.d/zapret2*": [ "exec" ],
"/bin/ps*": [ "exec" ],
"/bin/cat*": [ "exec" ],
"/bin/busybox*": [ "exec" ],
"/bin/opkg*": [ "exec" ],
"/usr/bin/apk*": [ "exec" ],
"/usr/bin/find*": [ "exec" ],
"/opt/zapret2/restore-def-cfg.sh*": [ "exec" ],
"/opt/zapret2/script-exec.sh*": [ "exec" ],
"/opt/zapret2/update-pkg.sh*": [ "exec" ],
"/opt/zapret2/sync_config.sh*": [ "exec" ]
},
"uci": [ "zapret2", "network" ],
"ubus": {
"luci": [ "getInitList", "setInitAction" ],
"service": [ "list" ]
}
},
"write": {
"file": {
"/opt/zapret2/config": [ "write" ],
"/opt/zapret2/ipset/*": [ "write" ],
"/opt/zapret2/init.d/openwrt/custom.d/*": [ "write" ],
"/etc/crontabs/root": [ "write" ]
},
"uci": [ "zapret2" ]
}
}
}

View File

@@ -1,19 +1,20 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=zapret-ip2net PKG_NAME:=zapret2-ip2net
PKG_VERSION:=71.20250708 PKG_VERSION:=0.7.20251218
PKG_RELEASE:=1
PKG_MAINTAINER:=bol-van PKG_MAINTAINER:=bol-van
PKG_LICENSE:=MIT PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=docs/LICENSE.txt PKG_LICENSE_FILES:=docs/LICENSE.txt
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git PKG_SOURCE_URL:=https://github.com/bol-van/zapret2.git
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=c60f9c9027a6db533c84f90ebbad40c058b424e7 PKG_SOURCE_VERSION:=6d249528e4aea7a8f6edc0b69dddb95e35116601
PKG_SOURCE_DATE:=2025-07-08 PKG_SOURCE_DATE:=2025-12-18
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz #PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz? #PKG_SOURCE_URL:=https://github.com/bol-van/zapret2/archive/refs/tags/v$(PKG_VERSION).tar.gz?
#PKG_HASH:=skip #PKG_HASH:=skip
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
@@ -27,8 +28,8 @@ define Package/$(PKG_NAME)
SECTION:=net SECTION:=net
CATEGORY:=Network CATEGORY:=Network
TITLE:=ip2net TITLE:=ip2net
SUBMENU:=Zapret SUBMENU:=Zapret2
DEPENDS:=+zlib +zapret DEPENDS:=+zlib +zapret2
endef endef
define Build/Prepare define Build/Prepare
@@ -37,8 +38,8 @@ define Build/Prepare
endef endef
define Package/$(PKG_NAME)/install define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/opt/zapret/ip2net $(INSTALL_DIR) $(1)/opt/zapret2/ip2net
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/ip2net $(1)/opt/zapret/ip2net/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/ip2net $(1)/opt/zapret2/ip2net/
endef endef
$(eval $(call BuildPackage,$(PKG_NAME))) $(eval $(call BuildPackage,$(PKG_NAME)))

View File

@@ -1,19 +1,20 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=zapret-mdig PKG_NAME:=zapret2-mdig
PKG_VERSION:=71.20250708 PKG_VERSION:=0.7.20251218
PKG_RELEASE:=1
PKG_MAINTAINER:=bol-van PKG_MAINTAINER:=bol-van
PKG_LICENSE:=MIT PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=docs/LICENSE.txt PKG_LICENSE_FILES:=docs/LICENSE.txt
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git PKG_SOURCE_URL:=https://github.com/bol-van/zapret2.git
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=c60f9c9027a6db533c84f90ebbad40c058b424e7 PKG_SOURCE_VERSION:=6d249528e4aea7a8f6edc0b69dddb95e35116601
PKG_SOURCE_DATE:=2025-07-08 PKG_SOURCE_DATE:=2025-12-18
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz #PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz? #PKG_SOURCE_URL:=https://github.com/bol-van/zapret2/archive/refs/tags/v$(PKG_VERSION).tar.gz?
#PKG_HASH:=skip #PKG_HASH:=skip
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
@@ -27,8 +28,8 @@ define Package/$(PKG_NAME)
SECTION:=net SECTION:=net
CATEGORY:=Network CATEGORY:=Network
TITLE:=mdig TITLE:=mdig
SUBMENU:=Zapret SUBMENU:=Zapret2
DEPENDS:=+zlib +zapret DEPENDS:=+zlib +zapret2
endef endef
define Build/Prepare define Build/Prepare
@@ -37,8 +38,8 @@ define Build/Prepare
endef endef
define Package/$(PKG_NAME)/install define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/opt/zapret/mdig $(INSTALL_DIR) $(1)/opt/zapret2/mdig
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/mdig $(1)/opt/zapret/mdig/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/mdig $(1)/opt/zapret2/mdig/
endef endef
$(eval $(call BuildPackage,$(PKG_NAME))) $(eval $(call BuildPackage,$(PKG_NAME)))

View File

@@ -1,44 +0,0 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=zapret-tpws
PKG_VERSION:=71.20250708
PKG_MAINTAINER:=bol-van
PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=docs/LICENSE.txt
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=c60f9c9027a6db533c84f90ebbad40c058b424e7
PKG_SOURCE_DATE:=2025-07-08
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
#PKG_HASH:=skip
include $(INCLUDE_DIR)/package.mk
#TAR_OPTIONS:=--strip-components 1 $(TAR_OPTIONS)
#TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS)
MAKE_PATH:=tpws
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
TITLE:=tpws
SUBMENU:=Zapret
DEPENDS:=+zlib +libcap +zapret
endef
define Build/Prepare
$(Build/Prepare/Default)
rm -f $(PKG_BUILD_DIR)/$(MAKE_PATH)/tpws
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/opt/zapret/tpws
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/tpws $(1)/opt/zapret/tpws/
endef
$(eval $(call BuildPackage,$(PKG_NAME)))

View File

@@ -1,23 +1,24 @@
# #
# Copyright (c) 2024 remittor # Copyright (c) 2025 remittor
# #
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=zapret PKG_NAME:=zapret2
PKG_VERSION:=71.20250708 PKG_VERSION:=0.7.20251218
PKG_RELEASE:=1
PKG_MAINTAINER:=bol-van PKG_MAINTAINER:=bol-van
PKG_LICENSE:=MIT PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=docs/LICENSE.txt PKG_LICENSE_FILES:=docs/LICENSE.txt
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git PKG_SOURCE_URL:=https://github.com/bol-van/zapret2.git
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=c60f9c9027a6db533c84f90ebbad40c058b424e7 PKG_SOURCE_VERSION:=6d249528e4aea7a8f6edc0b69dddb95e35116601
PKG_SOURCE_DATE:=2025-07-08 PKG_SOURCE_DATE:=2025-12-18
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz #PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz? #PKG_SOURCE_URL:=https://github.com/bol-van/zapret2/archive/refs/tags/v$(PKG_VERSION).tar.gz?
#PKG_HASH:=skip #PKG_HASH:=skip
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
@@ -25,15 +26,15 @@ include $(INCLUDE_DIR)/package.mk
#TAR_OPTIONS:=--strip-components 1 $(TAR_OPTIONS) #TAR_OPTIONS:=--strip-components 1 $(TAR_OPTIONS)
#TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS) #TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS)
MAKE_PATH:=nfq MAKE_PATH:=nfq2
define Package/$(PKG_NAME) define Package/$(PKG_NAME)
SECTION:=net SECTION:=net
CATEGORY:=Network CATEGORY:=Network
TITLE:=$(PKG_NAME) TITLE:=$(PKG_NAME)
SUBMENU:=Zapret SUBMENU:=Zapret2
URL:=https://github.com/bol-van/zapret URL:=https://github.com/bol-van/zapret2
DEPENDS:= +nftables +curl +gzip DEPENDS:= +nftables +curl +gzip +liblua +luajit
DEPENDS+= +coreutils +coreutils-sort +coreutils-sleep DEPENDS+= +coreutils +coreutils-sort +coreutils-sleep
DEPENDS+= +kmod-nft-nat +kmod-nft-offload +kmod-nft-queue DEPENDS+= +kmod-nft-nat +kmod-nft-offload +kmod-nft-queue
DEPENDS+= +libnetfilter-queue +libcap +zlib DEPENDS+= +libnetfilter-queue +libcap +zlib
@@ -41,7 +42,7 @@ endef
define Build/Prepare define Build/Prepare
$(Build/Prepare/Default) $(Build/Prepare/Default)
rm -f $(PKG_BUILD_DIR)/$(MAKE_PATH)/nfqws rm -f $(PKG_BUILD_DIR)/$(MAKE_PATH)/nfqws2
endef endef
#define Build/Configure #define Build/Configure
@@ -51,73 +52,85 @@ endef
#endef #endef
define Package/$(PKG_NAME)/conffiles define Package/$(PKG_NAME)/conffiles
/etc/config/zapret /etc/config/zapret2
/opt/zapret/config /opt/zapret2/config
/opt/zapret/ipset/ /opt/zapret2/ipset/
/opt/zapret2/init.d/openwrt/custom.d/
endef endef
define Package/$(PKG_NAME)/install define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/opt/zapret $(INSTALL_DIR) $(1)/opt/zapret2
$(INSTALL_DIR) $(1)/opt/zapret/$(MAKE_PATH) $(INSTALL_DIR) $(1)/opt/zapret2/$(MAKE_PATH)
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/nfqws $(1)/opt/zapret/$(MAKE_PATH)/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/nfqws2 $(1)/opt/zapret2/$(MAKE_PATH)/
$(INSTALL_DIR) $(1)/opt/zapret/common $(INSTALL_DIR) $(1)/opt/zapret2/common
$(CP) $(PKG_BUILD_DIR)/common/* $(1)/opt/zapret/common/ $(CP) $(PKG_BUILD_DIR)/common/* $(1)/opt/zapret2/common/
#$(INSTALL_DIR) $(1)/opt/zapret/docs $(INSTALL_DIR) $(1)/opt/zapret2/lua
#$(CP) $(PKG_BUILD_DIR)/docs/* $(1)/opt/zapret/docs/ $(CP) $(PKG_BUILD_DIR)/lua/* $(1)/opt/zapret2/lua/
$(INSTALL_DIR) $(1)/opt/zapret/files #$(INSTALL_DIR) $(1)/opt/zapret2/docs
$(CP) $(PKG_BUILD_DIR)/files/* $(1)/opt/zapret/files/ #$(CP) $(PKG_BUILD_DIR)/docs/* $(1)/opt/zapret2/docs/
$(INSTALL_DIR) $(1)/opt/zapret/ipset $(INSTALL_DIR) $(1)/opt/zapret2/files
$(CP) $(PKG_BUILD_DIR)/ipset/* $(1)/opt/zapret/ipset/ $(CP) $(PKG_BUILD_DIR)/files/* $(1)/opt/zapret2/files/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/blockcheck.sh $(1)/opt/zapret/blockcheck.sh $(CP) ./files/* $(1)/opt/zapret2/files/
#$(INSTALL_DATA) $(PKG_BUILD_DIR)/config.default $(1)/opt/zapret/config.default $(INSTALL_DIR) $(1)/opt/zapret2/ipset
$(INSTALL_DIR) $(1)/opt/zapret/tmp $(CP) $(PKG_BUILD_DIR)/ipset/* $(1)/opt/zapret2/ipset/
$(INSTALL_DIR) $(1)/opt/zapret/init.d/openwrt $(INSTALL_DIR) $(1)/opt/zapret2/blockcheck2.d
$(CP) $(PKG_BUILD_DIR)/init.d/openwrt/* $(1)/opt/zapret/init.d/openwrt/ $(CP) $(PKG_BUILD_DIR)/blockcheck2.d/* $(1)/opt/zapret2/blockcheck2.d/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/blockcheck2.sh $(1)/opt/zapret2/blockcheck2.sh
#$(INSTALL_DATA) $(PKG_BUILD_DIR)/config.default $(1)/opt/zapret2/config.default
$(INSTALL_DIR) $(1)/opt/zapret2/tmp
$(INSTALL_DIR) $(1)/opt/zapret2/init.d/openwrt
$(CP) $(PKG_BUILD_DIR)/init.d/openwrt/* $(1)/opt/zapret2/init.d/openwrt/
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
$(INSTALL_BIN) $(PKG_BUILD_DIR)/init.d/openwrt/90-zapret $(1)/etc/hotplug.d/iface/90-zapret $(INSTALL_BIN) $(PKG_BUILD_DIR)/init.d/openwrt/90-zapret2 $(1)/etc/hotplug.d/iface/90-zapret2
$(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./init.d.sh $(1)/etc/init.d/zapret $(INSTALL_BIN) ./init.d.sh $(1)/etc/init.d/zapret2
$(INSTALL_DATA) ./config.default $(1)/opt/zapret/config.default $(INSTALL_DATA) ./config.default $(1)/opt/zapret2/config.default
$(INSTALL_DATA) ./ipset/zapret-hosts-google.txt $(1)/opt/zapret/ipset/zapret-hosts-google.txt $(INSTALL_DATA) ./ipset/zapret-hosts-google.txt $(1)/opt/zapret2/ipset/zapret-hosts-google.txt
$(INSTALL_DATA) ./ipset/zapret-hosts-user-exclude.txt $(1)/opt/zapret/ipset/zapret-hosts-user-exclude.txt $(INSTALL_DATA) ./ipset/zapret-hosts-user.txt $(1)/opt/zapret2/ipset/zapret-hosts-user.txt
$(INSTALL_DATA) ./ipset/zapret-ip-exclude.txt $(1)/opt/zapret/ipset/zapret-ip-exclude.txt $(INSTALL_DATA) ./ipset/zapret-hosts-user-exclude.txt $(1)/opt/zapret2/ipset/zapret-hosts-user-exclude.txt
$(INSTALL_DATA) ./ipset/zapret-ip-exclude.txt $(1)/opt/zapret2/ipset/zapret-ip-exclude.txt
$(INSTALL_DIR) $(1)/opt/zapret2/ipset_def
$(INSTALL_DATA) ./ipset/zapret-hosts-google.txt $(1)/opt/zapret2/ipset_def/zapret-hosts-google.txt
$(INSTALL_DATA) ./ipset/zapret-hosts-user.txt $(1)/opt/zapret2/ipset_def/zapret-hosts-user.txt
$(INSTALL_DATA) ./ipset/zapret-hosts-user-exclude.txt $(1)/opt/zapret2/ipset_def/zapret-hosts-user-exclude.txt
$(INSTALL_DATA) ./ipset/zapret-ip-exclude.txt $(1)/opt/zapret2/ipset_def/zapret-ip-exclude.txt
$(INSTALL_DIR) $(1)/opt/zapret2/init.d
$(INSTALL_DIR) $(1)/opt/zapret2/init.d/openwrt
$(INSTALL_DIR) $(1)/opt/zapret2/init.d/openwrt/custom.d
$(CP) ./custom.d/* $(1)/opt/zapret2/init.d/openwrt/custom.d/
$(INSTALL_DIR) $(1)/etc/uci-defaults $(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_BIN) ./uci-def-cfg.sh $(1)/etc/uci-defaults/zapret-uci-def-cfg.sh $(INSTALL_BIN) ./uci-def-cfg.sh $(1)/etc/uci-defaults/zapret2-uci-def-cfg.sh
$(INSTALL_BIN) ./uci-def-cfg.sh $(1)/opt/zapret/uci-def-cfg.sh $(INSTALL_BIN) ./uci-def-cfg.sh $(1)/opt/zapret2/uci-def-cfg.sh
$(INSTALL_BIN) ./comfunc.sh $(1)/opt/zapret/comfunc.sh $(INSTALL_BIN) ./comfunc.sh $(1)/opt/zapret2/comfunc.sh
$(INSTALL_BIN) ./def-cfg.sh $(1)/opt/zapret/def-cfg.sh $(INSTALL_BIN) ./def-cfg.sh $(1)/opt/zapret2/def-cfg.sh
$(INSTALL_BIN) ./renew-cfg.sh $(1)/opt/zapret/renew-cfg.sh $(INSTALL_BIN) ./renew-cfg.sh $(1)/opt/zapret2/renew-cfg.sh
$(INSTALL_BIN) ./restore-def-cfg.sh $(1)/opt/zapret/restore-def-cfg.sh $(INSTALL_BIN) ./restore-def-cfg.sh $(1)/opt/zapret2/restore-def-cfg.sh
$(INSTALL_BIN) ./sync_config.sh $(1)/opt/zapret/sync_config.sh $(INSTALL_BIN) ./sync_config.sh $(1)/opt/zapret2/sync_config.sh
$(INSTALL_BIN) ./script-exec.sh $(1)/opt/zapret2/script-exec.sh
$(INSTALL_BIN) ./update-pkg.sh $(1)/opt/zapret2/update-pkg.sh
# Fix permisions # Fix permisions
chmod 644 $(1)/opt/zapret/ipset/*.txt chmod 644 $(1)/opt/zapret2/ipset/*.txt
chmod 644 $(1)/opt/zapret/config.default chmod 644 $(1)/opt/zapret2/ipset_def/*.txt
chmod 755 $(1)/opt/zapret/*.sh chmod 644 $(1)/opt/zapret2/init.d/openwrt/custom.d/*.sh
chmod 644 $(1)/opt/zapret2/config.default
chmod 755 $(1)/opt/zapret2/*.sh
endef endef
define Package/$(PKG_NAME)/preinst define Package/$(PKG_NAME)/preinst
#!/bin/sh #!/bin/sh
# check if we are on real system # check if we are on real system
if [ -z "$${IPKG_INSTROOT}" ]; then if [ -z "$${IPKG_INSTROOT}" ]; then
if [ -f "/etc/init.d/zapret" ]; then if [ -f "/etc/init.d/zapret2" ]; then
SCRIPT=$$( readlink /etc/init.d/zapret ) SCRIPT=$$( readlink /etc/init.d/zapret2 )
if [ -n "$${SCRIPT}" ]; then if [ -n "$${SCRIPT}" ]; then
echo "Please uninstall original zapret utility!" echo "Please uninstall original zapret2 utility!"
exit 44 exit 44
fi fi
fi fi
if [ "$${PKG_UPGRADE}" = "1" ]; then if [ "$${PKG_UPGRADE}" = "1" ]; then
# stop service if PKG_UPGRADE # stop service if PKG_UPGRADE
if [ -x "/etc/init.d/zapret" ]; then if [ -x "/etc/init.d/zapret2" ]; then
/etc/init.d/zapret running && /etc/init.d/zapret stop >/dev/null 2>&1 /etc/init.d/zapret2 running && /etc/init.d/zapret2 stop >/dev/null 2>&1
fi
fi
if [ ! -f "/opt/zapret/ipset/zapret-hosts-google.txt" ]; then
if [ -f "/opt/zapret/ipset/zapret-hosts-user.txt" ]; then
CFGLISTHASH=$$( md5sum "/opt/zapret/ipset/zapret-hosts-user.txt" | awk '{print $$1;}' )
if [ "$${CFGLISTHASH}" = "79e35df62b0d1ae455d0a7e04c4cecac" ]; then
rm -f "/opt/zapret/ipset/zapret-hosts-user.txt"
fi
fi fi
fi fi
fi fi
@@ -128,40 +141,32 @@ define Package/$(PKG_NAME)/postinst
#!/bin/sh #!/bin/sh
# check if we are on real system # check if we are on real system
if [ -z "$${IPKG_INSTROOT}" ]; then if [ -z "$${IPKG_INSTROOT}" ]; then
ZAPRET_CONFIG=/opt/zapret/config ZAPRET_CONFIG=/opt/zapret2/config
ZAPRET_CONFIG_DEF="/opt/zapret/config.default" ZAPRET_CONFIG_DEF="/opt/zapret2/config.default"
# creating main config if its not exists # creating main config if its not exists
if [ ! -f "$${ZAPRET_CONFIG}" ]; then if [ ! -f "$${ZAPRET_CONFIG}" ]; then
cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}" cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}"
fi fi
# check obsolete format for main config
if grep -qE "^NFQWS_OPT_DESYNC=|^MODE_HTTP=|^MODE_HTTPS=|^MODE_QUIC=|^MODE=" "$${ZAPRET_CONFIG}" ; then
echo "Detect obsolute format for main config!"
ZAPRET_CONFIG_BACKUP="$${ZAPRET_CONFIG}.backup"
cp -f "$${ZAPRET_CONFIG}" "$${ZAPRET_CONFIG_BACKUP}"
echo "Current file $${ZAPRET_CONFIG} backuped to $${ZAPRET_CONFIG_BACKUP}"
cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}"
fi
# check existing uci-config # check existing uci-config
[ -f "/etc/config/zapret" ] && ZAPRET_CFG_EXISTS=1 || ZAPRET_CFG_EXISTS=0 [ -f "/etc/config/zapret2" ] && ZAPRET_CFG_EXISTS=1 || ZAPRET_CFG_EXISTS=0
# create or merge uci-config # create or merge uci-config
/opt/zapret/uci-def-cfg.sh /opt/zapret2/uci-def-cfg.sh
[ "$${ZAPRET_CFG_EXISTS}" = "1" ] && echo "Config /etc/config/zapret merged with default uci-config" [ "$${ZAPRET_CFG_EXISTS}" = "1" ] && echo "Config /etc/config/zapret2 merged with default uci-config"
# remove uci-default script from system dir (used into /etc/init.d/boot) # remove uci-default script from system dir (used into /etc/init.d/boot)
rm -f /etc/uci-defaults/zapret-uci-def-cfg.sh rm -f /etc/uci-defaults/zapret2-uci-def-cfg.sh
# copy (sync) all params from uci-config to main config # copy (sync) all params from uci-config to main config
/opt/zapret/sync_config.sh /opt/zapret2/sync_config.sh
# check main config # check main config
sh -n "$${ZAPRET_CONFIG}" 2>/dev/null || cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}" sh -n "$${ZAPRET_CONFIG}" 2>/dev/null || cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}"
sh -n "$${ZAPRET_CONFIG}" 2>/dev/null || exit 58 sh -n "$${ZAPRET_CONFIG}" 2>/dev/null || exit 58
# enable main service # enable main service
/etc/init.d/zapret enable /etc/init.d/zapret2 enable
# stop all # stop all
/etc/init.d/zapret stop_fw /etc/init.d/zapret2 stop_fw
/etc/init.d/zapret stop_daemons /etc/init.d/zapret2 stop_daemons
ps w | grep '/opt/zapret/nfq/nfqws' | grep -v grep | awk '{print $$1}' | xargs -r kill -9 ps w | grep '/opt/zapret2/nfq2/nfqws2' | grep -v grep | awk '{print $$1}' | xargs -r kill -9
# start main service # start main service
/etc/init.d/zapret start /etc/init.d/zapret2 start
# restart firewall # restart firewall
[ -x /sbin/fw4 ] && fw4 -q restart || fw3 -q restart [ -x /sbin/fw4 ] && fw4 -q restart || fw3 -q restart
fi fi
@@ -172,15 +177,15 @@ define Package/$(PKG_NAME)/prerm
#!/bin/sh #!/bin/sh
# check if we are on real system # check if we are on real system
if [ -z "$${IPKG_INSTROOT}" ]; then if [ -z "$${IPKG_INSTROOT}" ]; then
EXEDIR=/opt/zapret EXEDIR=/opt/zapret2
ZAPRET_BASE=/opt/zapret ZAPRET_BASE=/opt/zapret2
ZAPRET_CONFIG=/opt/zapret/config ZAPRET_CONFIG=/opt/zapret2/config
ZAPRET_CONFIG_DEF="/opt/zapret/config.default" ZAPRET_CONFIG_DEF="/opt/zapret2/config.default"
OPENWRT_FW_INCLUDE=/etc/firewall.zapret OPENWRT_FW_INCLUDE=/etc/firewall.zapret2
# check main config # check main config
sh -n "$${ZAPRET_CONFIG}" 2>/dev/null || cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}" sh -n "$${ZAPRET_CONFIG}" 2>/dev/null || cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}"
if ! sh -n "$${ZAPRET_CONFIG}" 2>/dev/null ; then if ! sh -n "$${ZAPRET_CONFIG}" 2>/dev/null ; then
ps w | grep '/opt/zapret/nfq/nfqws' | grep -v grep | awk '{print $$1}' | xargs -r kill -9 ps w | grep '/opt/zapret2/nfq2/nfqws2' | grep -v grep | awk '{print $$1}' | xargs -r kill -9
exit 0 exit 0
fi fi
. "$${ZAPRET_CONFIG}" . "$${ZAPRET_CONFIG}"
@@ -188,9 +193,9 @@ if [ -z "$${IPKG_INSTROOT}" ]; then
. "$${ZAPRET_BASE}/common/fwtype.sh" . "$${ZAPRET_BASE}/common/fwtype.sh"
. "$${ZAPRET_BASE}/common/nft.sh" . "$${ZAPRET_BASE}/common/nft.sh"
. "$${ZAPRET_BASE}/common/installer.sh" . "$${ZAPRET_BASE}/common/installer.sh"
/etc/init.d/zapret running && /etc/init.d/zapret stop /etc/init.d/zapret2 running && /etc/init.d/zapret2 stop
/etc/init.d/zapret disable /etc/init.d/zapret2 disable
ps w | grep '/opt/zapret/nfq/nfqws' | grep -v grep | awk '{print $$1}' | xargs -r kill -9 ps w | grep '/opt/zapret2/nfq2/nfqws2' | grep -v grep | awk '{print $$1}' | xargs -r kill -9
remove_openwrt_firewall remove_openwrt_firewall
nft_del_table nft_del_table
restart_openwrt_firewall restart_openwrt_firewall
@@ -202,10 +207,10 @@ define Package/$(PKG_NAME)/postrm
#!/bin/sh #!/bin/sh
# check if we are on real system # check if we are on real system
if [ -z "$${IPKG_INSTROOT}" ]; then if [ -z "$${IPKG_INSTROOT}" ]; then
[ -f "/etc/config/zapret-opkg" ] && rm -f "/etc/config/zapret-opkg" [ -f "/etc/config/zapret2-opkg" ] && rm -f "/etc/config/zapret2-opkg"
[ -f "/opt/zapret/config" ] && cp -f /opt/zapret/config "/opt/zapret/config.backup" [ -f "/opt/zapret2/config" ] && cp -f /opt/zapret2/config "/opt/zapret2/config.backup"
#rm -rf /opt/zapret #rm -rf /opt/zapret2
#echo "Directory /opt/zapret removed!" #echo "Directory /opt/zapret2 removed!"
fi fi
exit 0 exit 0
endef endef

View File

@@ -1,18 +1,18 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2024 remittor # Copyright (c) 2024 remittor
EXEDIR=/opt/zapret EXEDIR=/opt/zapret2
ZAPRET_BASE=/opt/zapret ZAPRET_BASE=/opt/zapret2
ZAPRET_INITD=/etc/init.d/zapret ZAPRET_INITD=/etc/init.d/zapret2
ZAPRET_ORIG_INITD="$ZAPRET_BASE/init.d/openwrt/zapret" ZAPRET_ORIG_INITD="$ZAPRET_BASE/init.d/openwrt/zapret2"
ZAPRET_CONFIG="$ZAPRET_BASE/config" ZAPRET_CONFIG="$ZAPRET_BASE/config"
ZAPRET_CONFIG_NEW="$ZAPRET_BASE/config.new" ZAPRET_CONFIG_NEW="$ZAPRET_BASE/config.new"
ZAPRET_CONFIG_DEF="$ZAPRET_BASE/config.default" ZAPRET_CONFIG_DEF="$ZAPRET_BASE/config.default"
ZAPRET_CFG=/etc/config/zapret ZAPRET_CFG=/etc/config/zapret2
ZAPRET_CFG_NAME=zapret ZAPRET_CFG_NAME=zapret2
ZAPRET_CFG_SEC_NAME="$( uci -q get $ZAPRET_CFG_NAME.config )" ZAPRET_CFG_SEC_NAME="$( uci -q get $ZAPRET_CFG_NAME.config )"
. $ZAPRET_BASE/def-cfg.sh . $ZAPRET_BASE/def-cfg.sh
@@ -90,14 +90,56 @@ function get_run_on_boot_option
fi fi
} }
function get_distrib_param
{
local parname=$1
local value="__unknown__"
if [ -f /etc/openwrt_release ]; then
while IFS='=' read -r key val; do
val="${val#\'}"
val="${val%\'}"
val="${val#\"}"
val="${val%\"}"
if [ "$key" = "$parname" ]; then
value="$val"
break
fi
done < /etc/openwrt_release
fi
printf '%s' "$value"
}
function get_cpu_arch
{
get_distrib_param DISTRIB_ARCH
}
function restore_ipset_txt
{
local cfgname=$1
if [ -f "$ZAPRET_BASE/ipset_def/$cfgname" ]; then
cp -f "$ZAPRET_BASE/ipset_def/$cfgname" "$ZAPRET_BASE/ipset/$cfgname"
fi
}
function restore_all_ipset_cfg
{
restore_ipset_txt zapret-hosts-google.txt
restore_ipset_txt zapret-hosts-user.txt
restore_ipset_txt zapret-hosts-user-exclude.txt
restore_ipset_txt zapret-ip-exclude.txt.txt
}
function create_default_cfg function create_default_cfg
{ {
local cfgname=${1:-$ZAPRET_CFG_NAME} local opt_flags=${1:--}
local opt_strat=$2
local cfgname=${3:-$ZAPRET_CFG_NAME}
local cfgfile=/etc/config/$cfgname local cfgfile=/etc/config/$cfgname
rm -f $cfgfile rm -f $cfgfile
touch $cfgfile touch $cfgfile
uci set $cfgname.config=main uci set $cfgname.config=main
set_cfg_default_values $cfgname set_cfg_default_values "$opt_flags" "$opt_strat" $cfgname
return 0 return 0
} }
@@ -106,13 +148,13 @@ function merge_cfg_with_def_values
local cfgname=${1:-$ZAPRET_CFG_NAME} local cfgname=${1:-$ZAPRET_CFG_NAME}
local force=$2 local force=$2
local cfgfile=/etc/config/$cfgname local cfgfile=/etc/config/$cfgname
local NEWCFGNAME="zapret-default" local NEWCFGNAME="zapret2-default"
local NEWCFGFILE="/etc/config/$NEWCFGNAME" local NEWCFGFILE="/etc/config/$NEWCFGNAME"
local cfg_sec_name="$( uci -q get $ZAPRET_CFG_NAME.config )" local cfg_sec_name="$( uci -q get $ZAPRET_CFG_NAME.config )"
[ -z "$cfg_sec_name" ] && create_default_cfg [ -z "$cfg_sec_name" ] && create_default_cfg
create_default_cfg "$NEWCFGNAME" create_default_cfg "-" "" "$NEWCFGNAME"
[ ! -f "$NEWCFGFILE" ] && return 1 [ ! -f "$NEWCFGFILE" ] && return 1
uci -m -f $cfgfile import "$NEWCFGNAME" uci -m -f $cfgfile import "$NEWCFGNAME"
@@ -126,7 +168,7 @@ function merge_cfg_with_def_values
function remove_cron_task_logs function remove_cron_task_logs
{ {
if [ -f "$CRONTAB_FILE" ]; then if [ -f "$CRONTAB_FILE" ]; then
sed -i "/-name 'zapret\*.log' -size +/d" "$CRONTAB_FILE" sed -i "/-name 'zapret2\*.log' -size +/d" "$CRONTAB_FILE"
fi fi
} }
@@ -134,8 +176,8 @@ function insert_cron_task_logs
{ {
[ ! -f "$CRONTAB_FILE" ] && touch "$CRONTAB_FILE" [ ! -f "$CRONTAB_FILE" ] && touch "$CRONTAB_FILE"
[ ! -f "$CRONTAB_FILE" ] && return 1 [ ! -f "$CRONTAB_FILE" ] && return 1
if ! grep -q -e "-name 'zapret\*\.log' -size \+" "$CRONTAB_FILE"; then if ! grep -q -e "-name 'zapret2\*\.log' -size \+" "$CRONTAB_FILE"; then
echo "*/2 * * * * /usr/bin/find /tmp -maxdepth 1 -type f -name 'zapret*.log' -size +2600k -exec rm -f {} \;" >> "$CRONTAB_FILE" echo "*/2 * * * * /usr/bin/find /tmp -maxdepth 1 -type f -name 'zapret2*.log' -size +2600k -exec rm -f {} \;" >> "$CRONTAB_FILE"
/etc/init.d/cron restart 2> /dev/null /etc/init.d/cron restart 2> /dev/null
fi fi
return 0 return 0
@@ -148,7 +190,7 @@ function init_before_start
[ ! -f "$HOSTLIST_FN" ] && touch "$HOSTLIST_FN" [ ! -f "$HOSTLIST_FN" ] && touch "$HOSTLIST_FN"
chmod 644 $ZAPRET_BASE/ipset/*.txt chmod 644 $ZAPRET_BASE/ipset/*.txt
chmod 666 $ZAPRET_BASE/ipset/*.log chmod 666 $ZAPRET_BASE/ipset/*.log
rm -f /tmp/zapret*.log rm -f /tmp/zapret2*.log
#*/ #*/
if [ "$DAEMON_LOG_ENABLE" = "1" ]; then if [ "$DAEMON_LOG_ENABLE" = "1" ]; then
insert_cron_task_logs insert_cron_task_logs

View File

@@ -30,9 +30,15 @@ IP2NET_OPT4="--prefix-length=22-30 --v4-threshold=3/4"
IP2NET_OPT6="--prefix-length=56-64 --v6-threshold=5" IP2NET_OPT6="--prefix-length=56-64 --v6-threshold=5"
# options for auto hostlist # options for auto hostlist
# NOTE : in order for these adjustment to work it's required to redirect enough starting packets
# NOTE : set PKT_IN, PKT_OUT variables appropriately
AUTOHOSTLIST_INCOMING_MAXSEQ=4096
AUTOHOSTLIST_RETRANS_MAXSEQ=32768
AUTOHOSTLIST_RETRANS_THRESHOLD=3 AUTOHOSTLIST_RETRANS_THRESHOLD=3
AUTOHOSTLIST_FAIL_THRESHOLD=3 AUTOHOSTLIST_FAIL_THRESHOLD=3
AUTOHOSTLIST_FAIL_TIME=60 AUTOHOSTLIST_FAIL_TIME=60
AUTOHOSTLIST_UDP_IN=1
AUTOHOSTLIST_UDP_OUT=4
# 1 = debug autohostlist positives to ipset/zapret-hosts-auto-debug.log # 1 = debug autohostlist positives to ipset/zapret-hosts-auto-debug.log
AUTOHOSTLIST_DEBUGLOG=0 AUTOHOSTLIST_DEBUGLOG=0
@@ -56,50 +62,41 @@ DESYNC_MARK=0x40000000
DESYNC_MARK_POSTNAT=0x20000000 DESYNC_MARK_POSTNAT=0x20000000
TPWS_SOCKS_ENABLE=0 # do not pass outgoing traffic to tpws/nfqws not marked with this bit
# tpws socks listens on this port on localhost and LAN interfaces # this setting allows to write your own rules to limit traffic that should be fooled
TPPORT_SOCKS=987 # for example based on source IP or incoming interface name
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir # no filter if not defined
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy FILTER_MARK=""
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
TPWS_SOCKS_OPT="--filter-tcp=80 --methodeol <HOSTLIST> --new --filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>"
TPWS_ENABLE=0
TPWS_PORTS="80,443"
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
TPWS_OPT="--filter-tcp=80 --methodeol <HOSTLIST> --new --filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>"
NFQWS_ENABLE=1 NFQWS2_ENABLE=1
# redirect outgoing traffic with connbytes limiter applied in both directions. # redirect outgoing traffic with connbytes limiter applied in both directions.
NFQWS_PORTS_TCP="80,443" NFQWS2_PORTS_TCP="80,443"
NFQWS_PORTS_UDP="443" NFQWS2_PORTS_UDP="443"
# PKT_OUT means connbytes dir original # PKT_OUT means connbytes dir original
# PKT_IN means connbytes dir reply # PKT_IN means connbytes dir reply
# this is --dpi-desync-cutoff=nX kernel mode implementation for linux. it saves a lot of CPU. # this is --dpi-desync-cutoff=nX kernel mode implementation for linux. it saves a lot of CPU.
NFQWS_TCP_PKT_OUT="9" NFQWS2_TCP_PKT_OUT="9"
NFQWS_TCP_PKT_IN="3" NFQWS2_TCP_PKT_IN="3"
NFQWS_UDP_PKT_OUT="9" NFQWS2_UDP_PKT_OUT="9"
NFQWS_UDP_PKT_IN="0" NFQWS2_UDP_PKT_IN="0"
# redirect outgoing traffic without connbytes limiter and incoming with connbytes limiter # redirect outgoing traffic without connbytes limiter and incoming with connbytes limiter
# normally it's needed only for stateless DPI that matches every packet in a single TCP session # normally it's needed only for stateless DPI that matches every packet in a single TCP session
# typical example are plain HTTP keep alives # typical example are plain HTTP keep alives
# this mode can be very CPU consuming. enable with care ! # this mode can be very CPU consuming. enable with care !
NFQWS_PORTS_TCP_KEEPALIVE="" NFQWS2_PORTS_TCP_KEEPALIVE=""
NFQWS_PORTS_UDP_KEEPALIVE="" NFQWS2_PORTS_UDP_KEEPALIVE=""
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir # use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy # hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list # <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
NFQWS_OPT="--filter-tcp=80 <HOSTLIST> --dpi-desync=fake,fakedsplit --dpi-desync-autottl=2 --dpi-desync-fooling=badsum --new --filter-tcp=443 --hostlist=/opt/zapret/ipset/zapret-hosts-google.txt --dpi-desync=fake,multidisorder --dpi-desync-split-pos=1,midsld --dpi-desync-repeats=11 --dpi-desync-fooling=badsum --dpi-desync-fake-tls-mod=rnd,dupsid,sni=www.google.com --new --filter-udp=443 --hostlist=/opt/zapret/ipset/zapret-hosts-google.txt --dpi-desync=fake --dpi-desync-repeats=11 --dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin --new --filter-udp=443 <HOSTLIST_NOAUTO> --dpi-desync=fake --dpi-desync-repeats=11 --new --filter-tcp=443 <HOSTLIST> --dpi-desync=multidisorder --dpi-desync-split-pos=1,sniext+1,host+1,midsld-2,midsld,midsld+2,endhost-1" NFQWS2_OPT="--filter-tcp=80 --filter-l7=http <HOSTLIST> --payload=http_req --lua-desync=fake:blob=fake_default_http:tcp_md5 --lua-desync=multisplit:pos=method+2 --new --filter-tcp=443 --filter-l7=tls <HOSTLIST> --payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls:tcp_md5:tcp_seq=-10000 --lua-desync=multidisorder:pos=1,midsld --new --filter-udp=443 --filter-l7=quic <HOSTLIST_NOAUTO> --payload=quic_initial --lua-desync=fake:blob=fake_default_quic:repeats=6"
DISABLE_CUSTOM=0 DISABLE_CUSTOM=1
# FlowOffload mode : donttouch,none,software,hardware # FlowOffload mode : donttouch,none,software,hardware
FLOWOFFLOAD=none FLOWOFFLOAD=none
@@ -114,9 +111,8 @@ FLOWOFFLOAD=none
# for routers based on desktop linux and macos. has no effect in openwrt. # for routers based on desktop linux and macos. has no effect in openwrt.
# CHOOSE LAN and optinally WAN/WAN6 NETWORK INTERFACES # CHOOSE LAN and optinally WAN/WAN6 NETWORK INTERFACES
# or leave them commented if its not router # or leave them commented if its not router
# it's possible to specify multiple interfaces like this : IFACE_LAN="eth0 eth1 eth2" # it's possible to specify multiple interfaces like this : IFACE_WAN="eth0 eth1 eth2"
# if IFACE_WAN6 is not defined it take the value of IFACE_WAN # if IFACE_WAN6 is not defined it take the value of IFACE_WAN
#IFACE_LAN=eth0
#IFACE_WAN=eth1 #IFACE_WAN=eth1
#IFACE_WAN6="ipsec0 wireguard0 he_net" #IFACE_WAN6="ipsec0 wireguard0 he_net"
@@ -125,10 +121,10 @@ FLOWOFFLOAD=none
INIT_APPLY_FW=1 INIT_APPLY_FW=1
# firewall apply hooks # firewall apply hooks
#INIT_FW_PRE_UP_HOOK="/etc/firewall.zapret.hook.pre_up" #INIT_FW_PRE_UP_HOOK="/etc/firewall.zapret2.hook.pre_up"
#INIT_FW_POST_UP_HOOK="/etc/firewall.zapret.hook.post_up" #INIT_FW_POST_UP_HOOK="/etc/firewall.zapret2.hook.post_up"
#INIT_FW_PRE_DOWN_HOOK="/etc/firewall.zapret.hook.pre_down" #INIT_FW_PRE_DOWN_HOOK="/etc/firewall.zapret2.hook.pre_down"
#INIT_FW_POST_DOWN_HOOK="/etc/firewall.zapret.hook.post_down" #INIT_FW_POST_DOWN_HOOK="/etc/firewall.zapret2.hook.post_down"
# do not work with ipv4 # do not work with ipv4
DISABLE_IPV4=0 DISABLE_IPV4=0
@@ -149,4 +145,4 @@ FILTER_TTL_EXPIRED_ICMP=1
DAEMON_LOG_ENABLE=0 DAEMON_LOG_ENABLE=0
DAEMON_LOG_FILE="/tmp/zapret+<DAEMON_NAME>+<DAEMON_IDNUM>+<DAEMON_CFGNAME>.log" DAEMON_LOG_FILE="/tmp/zapret2+<DAEMON_NAME>+<DAEMON_IDNUM>+<DAEMON_CFGNAME>.log"

View File

@@ -0,0 +1,31 @@
# Stun4ALL (discord audio, discord video, telegram call, etc)
# this custom script runs desync to all stun packets
# NOTE: @ih requires nft 1.0.1+ and updated kernel version. it's confirmed to work on 5.15 (openwrt 23) and not work on 5.10 (openwrt 22)
# can override in config :
NFQWS_OPT_DESYNC_STUN="${NFQWS_OPT_DESYNC_STUN:---payload stun --lua-desync=fake:blob=0x00000000000000000000000000000000:repeats=2}"
alloc_dnum DNUM_STUN4ALL
alloc_qnum QNUM_STUN4ALL
zapret_custom_daemons()
{
# $1 - 1 - add, 0 - stop
local opt="--qnum=$QNUM_STUN4ALL $NFQWS_OPT_DESYNC_STUN"
do_nfqws $1 $DNUM_STUN4ALL "$opt"
}
zapret_custom_firewall()
{
# $1 - 1 - run, 0 - stop
local f='-p udp -m u32 --u32'
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=28:65535&&0>>22&0x3C@12=0x2112A442&&0>>22&0x3C@8&0xC0000003=0" "$f 44>>16=28:65535&&52=0x2112A442&&48&0xC0000003=0" $QNUM_STUN4ALL
}
zapret_custom_firewall_nft()
{
# stop logic is not required
local f="udp length >= 28 @ih,32,32 0x2112A442 @ih,0,2 0 @ih,30,2 0"
nft_fw_nfqws_post "$f" "$f" $QNUM_STUN4ALL
}

View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2024 remittor # Copyright (c) 2025 remittor
function set_cfg_default_values function set_cfg_reset_values
{ {
local cfgname=${1:-$ZAPRET_CFG_NAME} local cfgname=${1:-$ZAPRET_CFG_NAME}
local TAB="$( echo -n -e '\t' )" local TAB="$( echo -n -e '\t' )"
@@ -16,55 +16,113 @@ function set_cfg_default_values
set $cfgname.config.DISABLE_IPV6='1' set $cfgname.config.DISABLE_IPV6='1'
set $cfgname.config.FILTER_TTL_EXPIRED_ICMP='1' set $cfgname.config.FILTER_TTL_EXPIRED_ICMP='1'
set $cfgname.config.MODE_FILTER='hostlist' set $cfgname.config.MODE_FILTER='hostlist'
set $cfgname.config.DISABLE_CUSTOM='0' set $cfgname.config.DISABLE_CUSTOM='1'
set $cfgname.config.WS_USER='daemon' set $cfgname.config.WS_USER='daemon'
set $cfgname.config.DAEMON_LOG_ENABLE='0' set $cfgname.config.DAEMON_LOG_ENABLE='0'
set $cfgname.config.DAEMON_LOG_FILE='/tmp/zapret+<DAEMON_NAME>+<DAEMON_IDNUM>+<DAEMON_CFGNAME>.log' set $cfgname.config.DAEMON_LOG_FILE='/tmp/zapret+<DAEMON_NAME>+<DAEMON_IDNUM>+<DAEMON_CFGNAME>.log'
# autohostlist options # autohostlist options
set $cfgname.config.AUTOHOSTLIST_INCOMING_MAXSEQ='4096'
set $cfgname.config.AUTOHOSTLIST_RETRANS_MAXSEQ='32768'
set $cfgname.config.AUTOHOSTLIST_RETRANS_THRESHOLD='3' set $cfgname.config.AUTOHOSTLIST_RETRANS_THRESHOLD='3'
set $cfgname.config.AUTOHOSTLIST_FAIL_THRESHOLD='3' set $cfgname.config.AUTOHOSTLIST_FAIL_THRESHOLD='3'
set $cfgname.config.AUTOHOSTLIST_FAIL_TIME='60' set $cfgname.config.AUTOHOSTLIST_FAIL_TIME='60'
set $cfgname.config.AUTOHOSTLIST_UDP_IN='1'
set $cfgname.config.AUTOHOSTLIST_UDP_OUT='4'
set $cfgname.config.AUTOHOSTLIST_DEBUGLOG='0' set $cfgname.config.AUTOHOSTLIST_DEBUGLOG='0'
# nfqws options # nfqws options
set $cfgname.config.NFQWS_ENABLE='1' set $cfgname.config.NFQWS2_ENABLE='1'
set $cfgname.config.DESYNC_MARK='0x40000000' set $cfgname.config.DESYNC_MARK='0x40000000'
set $cfgname.config.DESYNC_MARK_POSTNAT='0x20000000' set $cfgname.config.DESYNC_MARK_POSTNAT='0x20000000'
set $cfgname.config.NFQWS_PORTS_TCP='80,443' set $cfgname.config.FILTER_MARK='$TAB'
set $cfgname.config.NFQWS_PORTS_UDP='443' set $cfgname.config.NFQWS2_PORTS_TCP='80,443'
set $cfgname.config.NFQWS_TCP_PKT_OUT='9' set $cfgname.config.NFQWS2_PORTS_UDP='443'
set $cfgname.config.NFQWS_TCP_PKT_IN='3' set $cfgname.config.NFQWS2_TCP_PKT_OUT='9'
set $cfgname.config.NFQWS_UDP_PKT_OUT='9' set $cfgname.config.NFQWS2_TCP_PKT_IN='3'
set $cfgname.config.NFQWS_UDP_PKT_IN='0' set $cfgname.config.NFQWS2_UDP_PKT_OUT='9'
set $cfgname.config.NFQWS_PORTS_TCP_KEEPALIVE='0' set $cfgname.config.NFQWS2_UDP_PKT_IN='0'
set $cfgname.config.NFQWS_PORTS_UDP_KEEPALIVE='0' set $cfgname.config.NFQWS2_PORTS_TCP_KEEPALIVE='0'
set $cfgname.config.NFQWS_OPT=" set $cfgname.config.NFQWS2_PORTS_UDP_KEEPALIVE='0'
--filter-tcp=80 <HOSTLIST>
--dpi-desync=fake,fakedsplit
--dpi-desync-autottl=2
--dpi-desync-fooling=badsum
--new
--filter-tcp=443 --hostlist=/opt/zapret/ipset/zapret-hosts-google.txt
--dpi-desync=fake,multidisorder
--dpi-desync-split-pos=1,midsld
--dpi-desync-repeats=11
--dpi-desync-fooling=badsum
--dpi-desync-fake-tls-mod=rnd,dupsid,sni=www.google.com
--new
--filter-udp=443 --hostlist=/opt/zapret/ipset/zapret-hosts-google.txt
--dpi-desync=fake
--dpi-desync-repeats=11
--dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin
--new
--filter-udp=443 <HOSTLIST_NOAUTO>
--dpi-desync=fake
--dpi-desync-repeats=11
--new
--filter-tcp=443 <HOSTLIST>
--dpi-desync=multidisorder
--dpi-desync-split-pos=1,sniext+1,host+1,midsld-2,midsld,midsld+2,endhost-1
"
# save changes # save changes
commit $cfgname commit $cfgname
EOF EOF
return 0 return 0
} }
function clear_nfqws_strat
{
local cfgname=${1:-$ZAPRET_CFG_NAME}
local TAB="$( echo -n -e '\t' )"
uci batch <<-EOF
set $cfgname.config.MODE_FILTER='hostlist'
set $cfgname.config.NFQWS2_PORTS_TCP='80,443'
set $cfgname.config.NFQWS2_PORTS_UDP='443'
set $cfgname.config.NFQWS2_OPT='$TAB'
commit $cfgname
EOF
}
function set_cfg_nfqws_strat
{
local strat=${1:--}
local cfgname=${2:-$ZAPRET_CFG_NAME}
local TAB="$( echo -n -e '\t' )"
uci batch <<-EOF
set $cfgname.config.MODE_FILTER='hostlist'
commit $cfgname
EOF
if [ "$strat" = "empty" ]; then
clear_nfqws_strat $cfgname
fi
if [ "$strat" = "default" ]; then
uci batch <<-EOF
set $cfgname.config.NFQWS2_PORTS_TCP='80,443'
set $cfgname.config.NFQWS2_PORTS_UDP='443'
set $cfgname.config.NFQWS2_OPT="
# Strategy $strat
--filter-tcp=80
--filter-l7=http <HOSTLIST>
--payload=http_req
--lua-desync=fake:blob=fake_default_http:tcp_md5
--lua-desync=multisplit:pos=method+2
--new
--filter-tcp=443
--filter-l7=tls <HOSTLIST>
--payload=tls_client_hello
--lua-desync=fake:blob=fake_default_tls:tcp_md5:tcp_seq=-10000
--lua-desync=multidisorder:pos=1,midsld
--new
--filter-udp=443
--filter-l7=quic <HOSTLIST_NOAUTO>
--payload=quic_initial
--lua-desync=fake:blob=fake_default_quic:repeats=6
"
commit $cfgname
EOF
fi
return 0
}
function set_cfg_default_values
{
local opt_flags=${1:--}
local opt_strat=${2:-default}
local cfgname=${3:-$ZAPRET_CFG_NAME}
if ! echo "$opt_flags" | grep -q "(skip_base)"; then
set_cfg_reset_values $cfgname
fi
if [ "$opt_strat" != "-" ]; then
set_cfg_nfqws_strat "$opt_strat" $cfgname
fi
if echo "$opt_flags" | grep -q "(set_mode_autohostlist)"; then
uci batch <<-EOF
set $cfgname.config.MODE_FILTER='autohostlist'
commit $cfgname
EOF
fi
return 0
}

BIN
zapret/files/fake/4pda.bin Normal file

Binary file not shown.

BIN
zapret/files/fake/max.bin Normal file

Binary file not shown.

BIN
zapret/files/fake/t2.bin Normal file

Binary file not shown.

View File

@@ -7,17 +7,17 @@ START=21
SCRIPT_FILENAME=$1 SCRIPT_FILENAME=$1
. /opt/zapret/comfunc.sh . /opt/zapret2/comfunc.sh
if ! is_valid_config ; then if ! is_valid_config ; then
logger -p err -t ZAPRET "Wrong main config: $ZAPRET_CONFIG" logger -p err -t ZAPRET2 "Wrong main config: $ZAPRET_CONFIG"
exit 91 exit 91
fi fi
. $ZAPRET_ORIG_INITD . $ZAPRET_ORIG_INITD
EXEDIR=/opt/zapret EXEDIR=/opt/zapret2
ZAPRET_BASE=/opt/zapret ZAPRET_BASE=/opt/zapret2
is_run_on_boot && IS_RUN_ON_BOOT=1 || IS_RUN_ON_BOOT=0 is_run_on_boot && IS_RUN_ON_BOOT=1 || IS_RUN_ON_BOOT=0
@@ -30,7 +30,7 @@ function enable
if [ -n "$ZAPRET_CFG_SEC_NAME" ]; then if [ -n "$ZAPRET_CFG_SEC_NAME" ]; then
run_on_boot=$( get_run_on_boot_option ) run_on_boot=$( get_run_on_boot_option )
if [ $run_on_boot != 1 ]; then if [ $run_on_boot != 1 ]; then
logger -p notice -t ZAPRET "Attempt to enable service, but service blocked!" logger -p notice -t ZAPRET2 "Attempt to enable service, but service blocked!"
return 61 return 61
fi fi
fi fi
@@ -49,7 +49,7 @@ function enabled
run_on_boot=$( get_run_on_boot_option ) run_on_boot=$( get_run_on_boot_option )
if [ $run_on_boot != 1 ]; then if [ $run_on_boot != 1 ]; then
if [ "$IS_RUN_ON_BOOT" = "1" ]; then if [ "$IS_RUN_ON_BOOT" = "1" ]; then
logger -p notice -t ZAPRET "Service is blocked!" logger -p notice -t ZAPRET2 "Service is blocked!"
fi fi
return 61 return 61
fi fi
@@ -65,7 +65,7 @@ function boot
if [ -n "$ZAPRET_CFG_SEC_NAME" ]; then if [ -n "$ZAPRET_CFG_SEC_NAME" ]; then
run_on_boot=$( get_run_on_boot_option ) run_on_boot=$( get_run_on_boot_option )
if [ $run_on_boot != 1 ]; then if [ $run_on_boot != 1 ]; then
logger -p notice -t ZAPRET "Attempt to run service on boot! Service is blocked!" logger -p notice -t ZAPRET2 "Attempt to run service on boot! Service is blocked!"
return 61 return 61
fi fi
fi fi

View File

@@ -1,25 +1,45 @@
cdn.youtube.com
fonts.googleapis.com
fonts.gstatic.com
ggpht.com
googleapis.com
googleusercontent.com
googlevideo.com googlevideo.com
youtubei.googleapis.com i.ytimg.com
ytimg.com i9.ytimg.com
yt3.ggpht.com
yt4.ggpht.com
youtube.com
youtubeembeddedplayer.googleapis.com
ytimg.l.google.com
jnn-pa.googleapis.com jnn-pa.googleapis.com
youtube-nocookie.com kids.youtube.com
youtube-ui.l.google.com m.youtube.com
yt-video-upload.l.google.com manifest.googlevideo.com
music.youtube.com
nhacmp3youtube.com
returnyoutubedislikeapi.com
s.ytimg.com
signaler-pa.youtube.com
studio.youtube.com
tv.youtube.com
wide-youtube.l.google.com wide-youtube.l.google.com
youtu.be
youtube.googleapis.com
yt.be
withyoutube.com withyoutube.com
youtu.be
youtube.com
youtube.googleapis.com
youtubeeducation.com youtubeeducation.com
youtubeembeddedplayer.googleapis.com
youtubefanfest.com youtubefanfest.com
youtubegaming.com youtubegaming.com
youtubei.googleapis.com
youtubekids.com youtubekids.com
youtubemobilesupport.com youtubemobilesupport.com
youtube-nocookie.com
youtube-ui.l.google.com
yt.be
yt3.ggpht.com
yt3.googleusercontent.com
yt4.ggpht.com
ytimg.com
ytimg.l.google.com
yting.com
yt-video-upload.l.google.com
youtube.ae youtube.ae
youtube.al youtube.al
youtube.am youtube.am

View File

@@ -3,18 +3,254 @@
172.16.0.0/12 172.16.0.0/12
192.168.0.0/16 192.168.0.0/16
169.254.0.0/16 169.254.0.0/16
100.64.0.0/10
::1 ::1
fc00::/7 fc00::/7
fe80::/10 fe80::/10
play.google.com ####################################
android.com nalog.ru
google-analytics.com
googleusercontent.com
gstatic.com gstatic.com
gvt1.com gosuslugi.ru
ggpht.com mos-gorsud.ru
dl.google.com gov.ru
dl-ssl.google.com sudrf.ru
android.clients.google.com ipstream.one
gvt2.com #################################### Epicgames
gvt3.com easy.ac
fab.com
quixel.se
quixel.com
eac-cdn.com
paragon.com
spyjinx.com
3lateral.com
fortnite.com
epicgames.com
epicgames.dev
hyprsense.com
sketchfab.com
artstation.com
roborecall.com
twinmotion.com
cubicmotion.com
playparagon.com
realityscan.com
epicgamescdn.com
et.epicgames.com
ol.epicgames.com
radgametools.com
unrealengine.com
api.epicgames.dev
easyanticheat.net
shadowcomplex.com
battlebreakers.com
store.epicgames.com
capturingreality.com
unrealtournament.com
cdn1.unrealengine.com
cdn2.unrealengine.com
accounts.epicgames.com
download.epicgames.com
tracking.epicgames.com
download2.epicgames.com
download3.epicgames.com
download4.epicgames.com
metrics.ol.epicgames.com
datarouter.ol.epicgames.com
fastly-download.epicgames.com
store-content.ak.epicgames.com
static-assets-prod.epicgames.com
epicgames-download1.akamaized.net
launcher-website-prod07.ol.epicgames.com
ut-public-service-prod10.ol.epicgames.com
store-site-backend-static.ak.epicgames.com
library-service.live.use1a.on.epicgames.com
accountportal-website-prod07.ol.epicgames.com
account-public-service-prod03.ol.epicgames.com
catalog-public-service-prod06.ol.epicgames.com
friends-public-service-prod06.ol.epicgames.com
launcher-public-service-prod06.ol.epicgames.com
entitlement-public-service-prod08.ol.epicgames.com
lightswitch-public-service-prod06.ol.epicgames.com
orderprocessor-public-service-ecomprod01.ol.epicgames.com
launcherwaitingroom-public-service-prod06.ol.epicgames.com
datastorage-public-service-liveegs.live.use1a.on.epicgames.com
#################################### Steam
s.team
steam.tv
valve.net
steamcdn.com
steamcdn.net
steamstat.us
valvecdn.com
steam-api.com
steamchat.com
steamdeck.com
steam-chat.com
steamgames.com
steamgames.net
underlords.com
steamserver.net
steamstatic.com
playartifact.com
steam.cdn.on.net
steamcontent.com
steampowered.com
valvecontent.com
valvesoftware.com
valvesoftware.net
steam.cdn.webra.ru
steambroadcast.com
steamcommunity.com
cdn.steamstatic.com
cs.steampowered.com
dl.steam.clngaa.com
steam.ru.qtlglb.com
api.steampowered.com
steam.eca.qtlglb.com
steamusercontent.com
help.steampowered.com
steam.apac.qtlglb.com
steam.naeu.qtlglb.com
cdn.steamcommunity.com
gstore.val.manlaxy.com
login.steampowered.com
media.steampowered.com
partner.steamgames.com
shared.steamstatic.com
steam.cdn.orcon.net.nz
store.steampowered.com
steamcdn-a.akamaihd.net
steampipe.akamaized.net
partner.steampowered.com
steamcdn-a.akamaized.net
steamdeckusercontent.com
support.steampowered.com
checkout.steampowered.com
community.steamstatic.com
steam.cdn.slingshot.co.nz
steammobile.akamaized.net
steamstatic.akamaized.net
steamstore-a.akamaihd.net
steamvideo-a.akamaihd.net
workshop.steampowered.com
cdn.akamai.steamstatic.com
cdn.fastly.steamstatic.com
client-update.queniuqe.com
community.steampowered.com
steamdeckcdn.akamaized.net
steampipe-kr.akamaized.net
clan.fastly.steamstatic.com
steamcontent-a.akamaihd.net
steambroadcast.akamaized.net
steamcommunity.akamaized.net
store.akamai.steamstatic.com
store.fastly.steamstatic.com
scontent.steamusercontent.com
shared.fastly.steamstatic.com
steamcommunity-a.akamaihd.net
avatars.fastly.steamstatic.com
cdn.cloudflare.steamstatic.com
edge.steam-dns.top.comcast.net
steamcommunity-a.akamaized.net
steamuserimages-a.akamaihd.net
steampipe-partner.akamaized.net
steamusercontent-a.akamaihd.net
client-download.steampowered.com
community.fastly.steamstatic.com
store.cloudflare.steamstatic.com
community.cloudflare.steamstatic.com
steamcdn-a.akamaihd.net.edgesuite.net
steamcloudsweden.blob.core.windows.net
steamcommunity.cloudflare.steamstatic.com
steamcommunity-a.akamaihd.net.edgesuite.net
#################################### OpenWRT
github.com
openwrt.org
gh.openwrt.org
cdn.openwrt.org
dev.openwrt.org
git.openwrt.org
lede-project.org
wiki.openwrt.org
forum.openwrt.org
lists.openwrt.org
openwrt.gitlab.io
archive.openwrt.org
downloads.openwrt.org
fwdownloads.openwrt.org
mirror-01.infra.openwrt.org
mirror-02.infra.openwrt.org
mirror-03.infra.openwrt.org
mirror-04.infra.openwrt.org
#################################### UbisoftConnect
ubi.com
ubisoft.com
store.ubi.com
ubisoftconnect.com
connect.ubisoft.com
drops-register.ubi.com
public-ubiservices.ubi.com
ubisoftconnect.cdn.ubi.com
uplaypc-s-ubisoft.cdn.ubi.com
uplaypc-s-ubisoft-ww.cdn.ubi.com
ubisoft-orbit-savegames.s3.amazonaws.com
ubisoft-uplay-savegames.s3.amazonaws.com
#################################### Aliexpress
ae.com
ae-rus.net
alicdn.com
aestatic.net
aliexpress.ru
aliexpress.us
aliexpress.com
aliexpress-media.com
#################################### PSN
scea.com
np.scea.com
ps5update.com
psdownload.com
playstation.net
playstation.com
account.sony.com
psremoteplay.com
ps4.playstation.com
ps5.playstation.com
playstationcloud.com
psapi.playstation.net
store.playstation.com
media.playstation.com
auth.np.ac.playstation.net
sonyentertainmentnetwork.com
np.community.playstation.net
id.sonyentertainmentnetwork.com
#################################### Twitch
twitch.tv
ttvnw.net
jtvnw.net
twimg.com
m.twitch.tv
id.twitch.tv
www.twitch.tv
twitchcdn.net
ext-twitch.tv
twitchsvc.net
api.twitch.tv
gql.twitch.tv
dev.twitch.tv
live-video.net
twitch.a2z.com
chat.twitch.tv
help.twitch.tv
assets.twitch.tv
twitch-shadow.net
passport.twitch.tv
irc.chat.twitch.tv
vod-metro.twitch.tv
twitchcdn-shadow.net
static.twitchcdn.net
vod-secure.twitch.tv
irc-ws.chat.twitch.tv
pubsub-edge.twitch.tv
vod-pop-secure.twitch.tv
####################################

View File

@@ -1 +1,23 @@
abra-cadabra.com dis.gd
discord-attachments-uploads-prd.storage.googleapis.com
discord.app
discord.co
discord.com
discord.design
discord.dev
discord.gift
discord.gifts
discord.gg
discord.media
discord.new
discord.store
discord.status
discord-activities.com
discordactivities.com
discordapp.com
discordapp.net
discordcdn.com
discordmerch.com
discordpartygames.com
discordsays.com
discordsez.com

View File

@@ -25,10 +25,10 @@ index 0af19c0..41c0967 100644
done done
} }
} }
diff --git a/init.d/openwrt/zapret b/init.d/openwrt/zapret diff --git a/init.d/openwrt/zapret b/init.d/openwrt/zapret2
index 8d6d3a9..fcb1e91 100755 index 8d6d3a9..fcb1e91 100755
--- a/init.d/openwrt/zapret --- a/init.d/openwrt/zapret2
+++ b/init.d/openwrt/zapret +++ b/init.d/openwrt/zapret2
@@ -58,12 +58,29 @@ run_daemon() @@ -58,12 +58,29 @@ run_daemon()
# use $PIDDIR/$DAEMONBASE$1.pid as pidfile # use $PIDDIR/$DAEMONBASE$1.pid as pidfile
local DAEMONBASE="$(basename "$2")" local DAEMONBASE="$(basename "$2")"
@@ -51,15 +51,15 @@ index 8d6d3a9..fcb1e91 100755
procd_open_instance procd_open_instance
- procd_set_param command $2 $3 - procd_set_param command $2 $3
+ procd_set_param command $DAEMON_PATH $DAEMON_ARGS + procd_set_param command $DAEMON_PATH $DAEMON_ARGS
procd_set_param pidfile $PIDDIR/$DAEMONBASE$1.pid procd_set_param pidfile $PIDDIR/${DAEMONBASE}_$1.pid
procd_close_instance procd_close_instance
} }
+DAEMON_CFGNAME="main" +DAEMON_CFGNAME="main"
+ +
run_tpws() run_nfqws()
{ {
[ "$DISABLE_IPV4" = "1" ] && [ "$DISABLE_IPV6" = "1" ] && return 0 run_daemon $1 "$NFQWS2" "$NFQWS2_OPT_BASE $2"
-- --
2.41.0.windows.3 2.41.0.windows.3

View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2024 remittor # Copyright (c) 2024 remittor
. /opt/zapret/comfunc.sh . /opt/zapret2/comfunc.sh
merge_cfg_with_def_values merge_cfg_with_def_values
@@ -12,5 +12,5 @@ CONFIGS_SYNC=0
if [ "$CONFIGS_SYNC" = "1" ]; then if [ "$CONFIGS_SYNC" = "1" ]; then
# renew main config # renew main config
/opt/zapret/sync_config.sh /opt/zapret2/sync_config.sh
fi fi

View File

@@ -1,18 +1,33 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2024 remittor # Copyright (c) 2024 remittor
. /opt/zapret/comfunc.sh . /opt/zapret2/comfunc.sh
cfg_run_on_boot="$( uci -q get zapret.config.run_on_boot )" cfg_run_on_boot="$( uci -q get $ZAPRET_CFG_NAME.config.run_on_boot )"
create_default_cfg opt_flags=${1:--}
opt_strat=$2
if echo "$opt_flags" | grep -q "(reset_ipset)"; then
restore_all_ipset_cfg
fi
create_default_cfg "$opt_flags" "$opt_strat"
if [ "$cfg_run_on_boot" = "1" ]; then if [ "$cfg_run_on_boot" = "1" ]; then
uci set zapret.config.run_on_boot=1 uci set $ZAPRET_CFG_NAME.config.run_on_boot=1
uci commit uci commit
fi fi
if [ "$1" = "sync" ]; then ZAPRET_SYNC_CONFIG=0
# renew main config if [ "$opt_flags" = "sync" ]; then
/opt/zapret/sync_config.sh ZAPRET_SYNC_CONFIG=1
fi
if echo "$opt_flags" | grep -q "(sync)"; then
ZAPRET_SYNC_CONFIG=1
fi
if [ "$ZAPRET_SYNC_CONFIG" = "1" ]; then
# renew main config
/opt/zapret2/sync_config.sh
fi fi

15
zapret/script-exec.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/sh
# Copyright (c) 2024 remittor
LOG_FILE=$1
RC_FILE=$1.rc
shift 1
: > $LOG_FILE
: > $RC_FILE
(
exec </dev/null >/dev/null 2>&1
"$@" >> $LOG_FILE 2>&1
RETCODE=$?
sleep 1
echo $RETCODE > $RC_FILE
) &
exit 0

View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2024 remittor # Copyright (c) 2024 remittor
. /opt/zapret/comfunc.sh . /opt/zapret2/comfunc.sh
function uncomment_param function uncomment_param
{ {
@@ -41,17 +41,17 @@ function sync_param
{ {
local param=$1 local param=$1
local vtype=$2 local vtype=$2
local value="$( uci -q get zapret.config.$param )" local value="$( uci -q get zapret2.config.$param )"
uncomment_param $param uncomment_param $param
append_param $param append_param $param
local TAB="$( echo -n -e '\t' )" local TAB="$( echo -n -e '\t' )"
if [ "$value" = "$TAB" ]; then if [ "$value" = "$TAB" ]; then
value="" value=""
fi fi
if [ "$param" = "NFQWS_PORTS_TCP_KEEPALIVE" -o "$param" = "NFQWS_PORTS_UDP_KEEPALIVE" ]; then if [ "$param" = "NFQWS2_PORTS_TCP_KEEPALIVE" -o "$param" = "NFQWS2_PORTS_UDP_KEEPALIVE" ]; then
[ "$value" = "0" ] && value="" [ "$value" = "0" ] && value=""
fi fi
if [ "$param" = "NFQWS_OPT" -a "$value" != "" ]; then if [ "$param" = "NFQWS2_OPT" -a "$value" != "" ]; then
value=$( echo -n "$value" | sed '/^#/d' ) value=$( echo -n "$value" | sed '/^#/d' )
fi fi
if [ "$vtype" = "str" ]; then if [ "$vtype" = "str" ]; then
@@ -92,18 +92,19 @@ sync_param AUTOHOSTLIST_FAIL_THRESHOLD
sync_param AUTOHOSTLIST_FAIL_TIME sync_param AUTOHOSTLIST_FAIL_TIME
sync_param AUTOHOSTLIST_DEBUGLOG sync_param AUTOHOSTLIST_DEBUGLOG
sync_param NFQWS_ENABLE sync_param NFQWS2_ENABLE
sync_param DESYNC_MARK sync_param DESYNC_MARK
sync_param DESYNC_MARK_POSTNAT sync_param DESYNC_MARK_POSTNAT
sync_param NFQWS_PORTS_TCP str sync_param FILTER_MARK str
sync_param NFQWS_PORTS_UDP str sync_param NFQWS2_PORTS_TCP str
sync_param NFQWS_TCP_PKT_OUT str sync_param NFQWS2_PORTS_UDP str
sync_param NFQWS_TCP_PKT_IN str sync_param NFQWS2_TCP_PKT_OUT str
sync_param NFQWS_UDP_PKT_OUT str sync_param NFQWS2_TCP_PKT_IN str
sync_param NFQWS_UDP_PKT_IN str sync_param NFQWS2_UDP_PKT_OUT str
sync_param NFQWS_PORTS_TCP_KEEPALIVE str sync_param NFQWS2_UDP_PKT_IN str
sync_param NFQWS_PORTS_UDP_KEEPALIVE str sync_param NFQWS2_PORTS_TCP_KEEPALIVE str
sync_param NFQWS_OPT str sync_param NFQWS2_PORTS_UDP_KEEPALIVE str
sync_param NFQWS2_OPT str
ZAPRET_CONFIG="$ZAPRET_CONFIG__SAVED" ZAPRET_CONFIG="$ZAPRET_CONFIG__SAVED"

View File

@@ -1,17 +1,17 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2024 remittor # Copyright (c) 2024 remittor
. /opt/zapret/comfunc.sh . /opt/zapret2/comfunc.sh
# create empty txt files into ipset directory # create empty txt files into ipset directory
[ ! -f "/opt/zapret/ipset/zapret-hosts-google.txt" ] && touch "/opt/zapret/ipset/zapret-hosts-google.txt" [ ! -f "/opt/zapret2/ipset/zapret-hosts-google.txt" ] && touch "/opt/zapret2/ipset/zapret-hosts-google.txt"
#[ ! -f "/opt/zapret/ipset/zapret-hosts-auto.txt" ] && touch "/opt/zapret/ipset/zapret-hosts-auto.txt" #[ ! -f "/opt/zapret2/ipset/zapret-hosts-auto.txt" ] && touch "/opt/zapret2/ipset/zapret-hosts-auto.txt"
[ ! -f "/opt/zapret/ipset/zapret-hosts-user.txt" ] && touch "/opt/zapret/ipset/zapret-hosts-user.txt" [ ! -f "/opt/zapret2/ipset/zapret-hosts-user.txt" ] && touch "/opt/zapret2/ipset/zapret-hosts-user.txt"
[ ! -f "/opt/zapret/ipset/zapret-hosts-user-ipban.txt" ] && touch "/opt/zapret/ipset/zapret-hosts-user-ipban.txt" [ ! -f "/opt/zapret2/ipset/zapret-hosts-user-ipban.txt" ] && touch "/opt/zapret2/ipset/zapret-hosts-user-ipban.txt"
#[ ! -f "/opt/zapret/ipset/zapret-ip.txt" ] && touch "/opt/zapret/ipset/zapret-ip.txt" #[ ! -f "/opt/zapret2/ipset/zapret-ip.txt" ] && touch "/opt/zapret2/ipset/zapret-ip.txt"
[ ! -f "/opt/zapret/ipset/zapret-ip-user.txt" ] && touch "/opt/zapret/ipset/zapret-ip-user.txt" [ ! -f "/opt/zapret2/ipset/zapret-ip-user.txt" ] && touch "/opt/zapret2/ipset/zapret-ip-user.txt"
[ ! -f "/opt/zapret/ipset/zapret-ip-user-exclude.txt" ] && touch "/opt/zapret/ipset/zapret-ip-user-exclude.txt" [ ! -f "/opt/zapret2/ipset/zapret-ip-user-exclude.txt" ] && touch "/opt/zapret2/ipset/zapret-ip-user-exclude.txt"
[ ! -f "/opt/zapret/ipset/zapret-ip-user-ipban.txt" ] && touch "/opt/zapret/ipset/zapret-ip-user-ipban.txt" [ ! -f "/opt/zapret2/ipset/zapret-ip-user-ipban.txt" ] && touch "/opt/zapret2/ipset/zapret-ip-user-ipban.txt"
# create or merge uci-config # create or merge uci-config
$ZAPRET_BASE/renew-cfg.sh $ZAPRET_BASE/renew-cfg.sh

407
zapret/update-pkg.sh Executable file
View File

@@ -0,0 +1,407 @@
#!/bin/sh
# Copyright (c) 2025 remittor
. /opt/zapret2/comfunc.sh
. /usr/share/libubox/jshn.sh
. /etc/openwrt_release
opt_check=
opt_prerelease=
opt_update=
opt_forced=
opt_test=
while getopts "cu:pft:" opt; do
case $opt in
c) opt_check=true;;
p) opt_prerelease=true;;
u) opt_update="$OPTARG";;
f) opt_forced=true;;
t) opt_test="$OPTARG";;
esac
done
ZAP_PKG_DIR=/tmp/zapret2_pkg
if [ "$opt_test" != "" ]; then
echo 1; sleep 2;
echo 2; sleep 2;
echo 3; sleep 2;
echo ' * resolve_conffiles 123456'; sleep 1;
echo 4; sleep 2;
echo END
return "$opt_test"
fi
ZAP_CPU_ARCH=$(get_cpu_arch)
ZAP_REL_URL="https://raw.githubusercontent.com/remittor/zapret-openwrt/gh-pages/releases/releases_zap2_$ZAP_CPU_ARCH.json"
CURL_TIMEOUT=5
CURL_HEADER1="Accept: application/json"
CURL_HEADER2="Cache-Control: no-cache"
REL_JSON=
REL_ACTUAL_TAG=
REL_ACTUAL_PRE=
REL_ACTUAL_URL=
ZAP_OUT=
ZAP_ERR=
ZAP_PKG_URL=
if command -v apk >/dev/null; then
PKG_MGR=apk
ZAP_PKG_EXT=apk
elif command -v opkg >/dev/null; then
PKG_MGR=opkg
ZAP_PKG_EXT=ipk
else
echo "ERROR: No package manager found"
return 1
fi
# -------------------------------------------------------------------------------------------------------
function download_json
{
local url="$1"
curl -s -L --max-time $CURL_TIMEOUT -H "$CURL_HEADER1" -H "$CURL_HEADER2" "$url" 2>/dev/null
return $?
}
function get_pkg_version
{
local pkg_name="$1"
local ver line pkg_prefix
if [ "$PKG_MGR" = opkg ]; then
ver=$( opkg list-installed "$pkg_name" 2>/dev/null | awk -F' - ' '{print $2}' | tr -d '\r' )
if [ -n "$ver" ]; then
echo -n "$ver"
return 0
fi
fi
if [ "$PKG_MGR" = apk ]; then
line=$( apk info -e "$pkg_name" 2>/dev/null || true )
if [ -n "$line" ]; then
pkg_prefix="${pkg_name}-"
case "$line" in
"$pkg_prefix"*)
ver=${line#"$pkg_prefix"}
;;
*)
ver=${line##*-}
;;
esac
echo -n "$ver"
return 0
fi
fi
echo ""
return 1
}
function normalize_version
{
local ver="$1"
local base
local major minor rel
case "$ver" in
*-r*)
rel="${ver##*-r}"
base="${ver%-r*}"
;;
*)
rel=1
base="$ver"
;;
esac
major="${base%%.*}"
minor="${base#*.}"
[ -z "$minor" ] && minor=0
[ -z "$rel" ] && rel=1
echo "$major.$minor.$rel"
}
function pkg_version_cmp
{
local ver1=$( normalize_version "$1" )
local ver2=$( normalize_version "$2" )
local x1 x2
# major
x1=$( echo "$ver1" | cut -d. -f1 )
x2=$( echo "$ver2" | cut -d. -f1 )
[ "$x1" -gt "$x2" ] && { echo -n "G"; return 0; }
[ "$x1" -lt "$x2" ] && { echo -n "L"; return 0; }
# minor
x1=$( echo "$ver1" | cut -d. -f2 )
x2=$( echo "$ver2" | cut -d. -f2 )
[ "$x1" -gt "$x2" ] && { echo -n "G"; return 0; }
[ "$x1" -lt "$x2" ] && { echo -n "L"; return 0; }
# release
x1=$( echo "$ver1" | cut -d. -f3 )
x2=$( echo "$ver2" | cut -d. -f3 )
[ "$x1" -gt "$x2" ] && { echo -n "G"; return 0; }
[ "$x1" -lt "$x2" ] && { echo -n "L"; return 0; }
echo -n "E"
}
function download_releases_info
{
local txt txtlen txtlines generated_at
REL_JSON=
echo "Download releases info..."
txt=$(download_json $ZAP_REL_URL)
txtlen=${#txt}
txtlines=$(printf '%s\n' "$txt" | wc -l)
if [[ $txtlen -lt 64 ]]; then
echo "ERROR: Cannot download releases info!"
return 104
fi
echo "Releases info downloaded! Size = $txtlen, Lines = $txtlines"
generated_at=$(printf '%s\n' "$txt" | grep -m1 -o '"generated_at"[[:space:]]*:[[:space:]]*".*"' | cut -d'"' -f4)
if [[ "$generated_at" = "" ]]; then
echo "ERROR: Cannot download releases info! (incorrect generated_at)"
return 105
fi
echo "Releases info generated_at = $generated_at"
REL_JSON="$txt"
return 0
}
function get_actual_release
{
local tag url pre idx_list
REL_ACTUAL_TAG=
REL_ACTUAL_PRE=
REL_ACTUAL_URL=
json_load "$(printf '%s' "$REL_JSON")"
if [ $? -ne 0 ]; then
echo "ERROR: incorrect format of ${ZAP_REL_URL##*/}"
json_cleanup
return 151
fi
json_select releases
if [ $? -ne 0 ]; then
echo "ERROR: incorrect format of ${ZAP_REL_URL##*/}"
json_cleanup
return 157
fi
json_get_keys idx_list
# array already sorted by created_at => take first elem
for rel_id in $idx_list; do
json_select "$rel_id" # enter into releases[rel_id]
json_get_var tag tag
json_get_var pre prerelease
#echo "rel_id = $rel_id opt_prerelease = $opt_prerelease pre = $pre"
if [ "$opt_prerelease" != "true" ] && [ "$pre" = "1" ]; then
json_select .. # exit from releases[rel_id]
continue
fi
json_select assets
if [ $? -ne 0 ]; then
echo "ERROR: release[$rel_id] has not include 'assets'"
json_cleanup
return 160
fi
json_select 0 > /dev/null
if [ $? -ne 0 ]; then
json_select 1 > /dev/null
if [ $? -ne 0 ]; then
echo "ERROR: release[$rel_id] include incorrect 'assets'"
json_cleanup
return 162
fi
fi
json_get_var url browser_download_url
json_select .. .. .. # assets-elem -> assets -> releases[rel_id] -> releases
json_cleanup
REL_ACTUAL_TAG="$tag"
REL_ACTUAL_PRE="$pre"
REL_ACTUAL_URL="$url"
return 0
done
json_cleanup
echo "ERROR: latest release for arch \"$ZAP_CPU_ARCH\" not founded!"
return 1 # release not founded
}
# -------------------------------------------------------------------------------------------------------
if [ "$opt_check" != "true" -a "$opt_update" = "" ]; then
echo 'ERROR: Incorrect arguments'
return 4
fi
if [ "$opt_update" = "@" ]; then
opt_check="true"
fi
#echo "DISTRIB_ID: $DISTRIB_ID"
echo "DISTRIB_RELEASE: $DISTRIB_RELEASE"
echo "DISTRIB_DESCRIPTION:" $(get_distrib_param DISTRIB_DESCRIPTION)
echo "DISTRIB_ARCH:" $(get_distrib_param DISTRIB_ARCH)
if ! command -v curl >/dev/null 2>&1; then
echo "ERROR: package \"curl\" not installed!"
return 10
fi
CURL_INFO=$( curl -V )
if ! echo "$CURL_INFO" | grep -q 'https'; then
echo "------- package curl"
echo "$CURL_INFO"
echo "-------"
echo "ERROR: package \"curl\" not supported HTTPS protocol!"
echo "NOTE: Please install package \"curl-ssl\""
return 11
fi
if [ "$opt_check" = "true" ]; then
download_releases_info
ZAP_ERR=$?
if [ $ZAP_ERR -ne 0 ]; then
echo "ERROR: Func download_releases_info return error code: $ZAP_ERR"
return $ZAP_ERR
fi
get_actual_release
ZAP_ERR=$?
if [ $ZAP_ERR -ne 0 ]; then
echo "ERROR: Func get_actual_release return error code: $ZAP_ERR"
return $ZAP_ERR
fi
echo "Latest package version: $REL_ACTUAL_TAG"
echo "Latest package url: $REL_ACTUAL_URL"
fi
ZAP_PKG_SIZE=
ZAP_PKG_SZ=
ZAP_PKG_ZIP_NAME=
ZAP_PKG_FN=
ZAP_PKG_BASE_FN=
ZAP_PKG_LUCI_FN=
ZAP_CUR_PKG_VER=$( get_pkg_version zapret2 )
echo "Current installed version: $ZAP_CUR_PKG_VER"
if [ "$opt_update" = "" ]; then
ZAP_PKG_URL="$REL_ACTUAL_URL"
if [ "$ZAP_PKG_URL" = "" ]; then
echo "ERROR: actual release not founded!"
return 199
fi
else
ZAP_PKG_URL="$opt_update"
if [ "$opt_update" = "@" ]; then
ZAP_PKG_URL="$REL_ACTUAL_URL"
fi
if [ "$opt_update" = "@" -a "$ZAP_PKG_URL" = "" ]; then
echo "ERROR: actual release not founded!"
return 199
fi
fi
ZAP_PKG_ZIP_NAME=${ZAP_PKG_URL##*/}
ZAP_PKG_ZIP_VER=${ZAP_PKG_ZIP_NAME#*_v}
ZAP_PKG_ZIP_VER=${ZAP_PKG_ZIP_VER%%_*}
if [ "$opt_update" != "" ]; then
if [ "$opt_update" = "@" ]; then
echo "Latest available version: $ZAP_PKG_ZIP_VER"
else
echo "Target requested version: $ZAP_PKG_ZIP_VER"
fi
fi
echo "ZAP_PKG_URL = $ZAP_PKG_URL"
ZAP_VER_CMP=$( pkg_version_cmp "$ZAP_CUR_PKG_VER" "$ZAP_PKG_ZIP_VER" )
if [ "$opt_update" = "" ]; then
if [ "$ZAP_VER_CMP" = "E" ]; then
echo "RESULT: (E) No update required for this package!"
elif [ "$ZAP_VER_CMP" = "G" ]; then
echo "RESULT: (G) You have a newer version installed than the one on GitHub!"
elif [ "$ZAP_VER_CMP" = "L" ]; then
echo "RESULT: (L) You have an older version installed than the one on GitHub!"
else
echo "ERROR: ZAP_PKG_ZIP_VER='$ZAP_PKG_ZIP_VER' ZAP_VER_CMP='$ZAP_VER_CMP'"
return 199
fi
return 0
fi
if [ "$opt_update" != "" ]; then
if [ "$opt_forced" != "true" ]; then
if [ "$ZAP_VER_CMP" = "E" ]; then
echo "RESULT: (E) No update required for this package!"
return 0
fi
fi
ZAP_PKG_DIR=/tmp/zapret2_pkg
rm -rf $ZAP_PKG_DIR
ZAP_PKG_HDRS=$( curl -s -I -L --max-time $CURL_TIMEOUT -H "$CURL_HEADER2" "$ZAP_PKG_URL" )
ZAP_PKG_SIZE=$( echo "$ZAP_PKG_HDRS" | grep -i 'content-length: ' | tail -n1 | awk '{print $2}' | tr -d '\r' )
echo "Downloded ZIP-file size = $ZAP_PKG_SIZE bytes"
[ "$ZAP_PKG_SIZE" = "" ] || [[ $ZAP_PKG_SIZE -lt 256 ]] && {
echo "ERROR: incorrect package size!"
return 210
}
mkdir $ZAP_PKG_DIR
ZAP_PKG_FN="$ZAP_PKG_DIR/${ZAP_PKG_URL##*/}"
echo "Download ZIP-file..."
curl -s -L --max-time 15 -H "$CURL_HEADER2" "$ZAP_PKG_URL" -o "$ZAP_PKG_FN"
if [ $? -ne 0 ]; then
echo "ERROR: cannot download package!"
return 215
fi
ZAP_PKG_SZ=$( wc -c < "$ZAP_PKG_FN" )
if [ "$ZAP_PKG_SZ" != "$ZAP_PKG_SIZE" ]; then
echo "ERROR: downloaded package is incorrect! (size = $ZAP_PKG_SZ)"
return 216
fi
unzip -q "$ZAP_PKG_FN" -d $ZAP_PKG_DIR
rm -f "$ZAP_PKG_FN"
if [ "$PKG_MGR" = "apk" ]; then
if [ ! -d "$ZAP_PKG_DIR/apk" ]; then
echo "ERROR: APK-files not founded"
return 221
fi
rm -f "$ZAP_PKG_DIR/*.ipk"
mv "$ZAP_PKG_DIR/apk/*" "$ZAP_PKG_DIR/"
else
rm -rf "$ZAP_PKG_DIR/apk"
fi
ZAP_PKG_LIST=$( ls -1 "$ZAP_PKG_DIR" )
echo "------ Downloaded packages:"
echo "$ZAP_PKG_LIST"
echo "------"
ZAP_PKG_BASE_FN=$( find "$ZAP_PKG_DIR" -maxdepth 1 -type f -name "zapret2_*.${ZAP_PKG_EXT}" | head -n 1 )
ZAP_PKG_LUCI_FN=$( find "$ZAP_PKG_DIR" -maxdepth 1 -type f -name "luci-app-*.${ZAP_PKG_EXT}" | head -n 1 )
if [ ! -f "$ZAP_PKG_BASE_FN" ]; then
echo "ERROR: File \"zapret2_*.${ZAP_PKG_EXT}\" not found!"
return 231
fi
echo "ZAP_PKG_BASE_FN = $ZAP_PKG_BASE_FN"
if [ ! -f "$ZAP_PKG_LUCI_FN" ]; then
echo "ERROR: File \"luci-app-*.${ZAP_PKG_EXT}\" not found!"
return 232
fi
echo "ZAP_PKG_LUCI_FN = $ZAP_PKG_LUCI_FN"
echo "Install downloaded packages..."
if [ "$PKG_MGR" != "apk" ]; then
opkg install --force-reinstall "$ZAP_PKG_BASE_FN"
else
apk add --allow-untrusted --upgrade "$ZAP_PKG_BASE_FN"
fi
if [ $? -ne 0 ]; then
echo "ERROR: Failed to install package $ZAP_PKG_BASE_FN"
return 245
fi
if [ "$PKG_MGR" != "apk" ]; then
opkg install --force-reinstall "$ZAP_PKG_LUCI_FN"
else
apk add --allow-untrusted --upgrade "$ZAP_PKG_LUCI_FN"
fi
if [ $? -ne 0 ]; then
echo "ERROR: Failed to install package $ZAP_PKG_LUCI_FN"
return 247
fi
echo "RESULT: (+) Packages from $ZAP_PKG_ZIP_NAME successfully installed!"
fi