140 Commits
5.0.0 ... main

Author SHA1 Message Date
CherretGit
b12b6e1bb2 Update update's.json and changelog 2025-12-08 16:41:32 +00:00
CherretGit
4cbda8bc52 edit customize.sh 2025-12-08 22:52:17 +07:00
egor-white
5ddea2675f Update hosts 2025-12-05 12:14:57 +03:00
white
6b35a0673a fix non-expected error in stop_service() 2025-12-04 16:25:16 +03:00
CherretGit
59e7970bf2 Update changelog.md 2025-11-17 21:49:28 +07:00
CherretGit
18e1ad9ebd Update changelog.md 2025-11-17 21:49:08 +07:00
CherretGit
85a3f9321c Update update's.json and changelog 2025-11-17 14:46:06 +00:00
CherretGit
f29ed9de63 change path 2025-11-17 21:32:48 +07:00
CherretGit
d58792fbfc fix set-autostart command 2025-11-17 21:27:52 +07:00
white
860dc21272 fix args joining 2025-11-11 19:13:47 +03:00
CherretGit
277f6756bd add args command and optimize binary 2025-11-11 20:48:21 +07:00
CherretGit
ac35be8e57 Update hosts file with new services and date
Updated the last modification date and added new entries for Linear.app and Windsurf services.
2025-11-11 13:00:18 +07:00
CherretGit
82de796d25 Update update's.json and changelog 2025-11-08 06:48:44 +00:00
CherretGit
4e5c3e3847 remove existing config.json 2025-11-08 13:39:07 +07:00
CherretGit
c500997d74 create json on zaprett start and fix module 2025-11-05 23:34:39 +07:00
egor-white
f94acaa830 Revise module versions and usage recommendations
Updated module versions and recommendations in README.
2025-11-04 11:20:25 +03:00
egor-white
b5fa8e0abf Update version and zip URL in update-tv.json 2025-11-04 11:18:31 +03:00
egor-white
85e3c5ce0f Update update's.json and changelog 2025-11-03 19:39:19 +00:00
egor-white
cf98c42995 Update workflow.yml 2025-11-03 22:30:52 +03:00
CherretGit
942578b5c5 optimize release binary 2025-11-03 23:47:45 +07:00
egor-white
6215a36eb6 Update customize.sh 2025-11-03 18:00:42 +03:00
CherretGit
5e64628d7f Update workflow.yml 2025-11-03 21:43:02 +07:00
CherretGit
8b0945352a Update workflow_without_post.yml 2025-11-03 21:41:47 +07:00
CherretGit
ca65e0c6f1 remove iptables crate, fix service_status 2025-11-03 21:16:14 +07:00
egor-white
234e9e5824 Merge pull request #7 from sqlerrorthing/refactor/rust/autostart
refactor: autostart
2025-11-03 16:28:23 +03:00
egor-white
aedf249712 Merge branch 'main' into refactor/rust/autostart 2025-11-03 16:28:13 +03:00
egor-white
526bf7ded2 Merge pull request #6 from sqlerrorthing/fix/right-library
fix: right library functions
2025-11-03 16:26:06 +03:00
sqlerrorthing
2c8721e42b right library api 2025-11-03 05:42:28 +08:00
sqlerrorthing
d59340a5c9 refactor autostart 2025-11-03 05:35:33 +08:00
egor-white
fc5cc814d6 edit workflow name 2025-11-03 00:31:35 +03:00
egor-white
924b6d20e8 fix workflow 2025-11-03 00:30:20 +03:00
egor-white
dedab3386a Update workflow_without_post.yml 2025-11-03 00:28:58 +03:00
egor-white
44deef4aef Merge pull request #5 from sqlerrorthing/fix/rust
fix: rust codebase
2025-11-03 00:27:08 +03:00
sqlerrorthing
eaf0e6c756 unnecessary dereference 2025-11-03 05:15:53 +08:00
sqlerrorthing
d1e56df7fc move module 2025-11-03 05:15:40 +08:00
sqlerrorthing
574bbbd8cc dereference in wrong place 2025-11-03 05:13:58 +08:00
sqlerrorthing
b5e37044e2 right use format macro 2025-11-03 05:13:34 +08:00
sqlerrorthing
aa1788386a fix shitcode 2025-11-03 05:10:52 +08:00
sqlerrorthing
8a1d336e4b good struct 2025-11-03 05:04:05 +08:00
sqlerrorthing
16ba9bedfc unnecessary .unwrap 2025-11-03 05:02:51 +08:00
white
6343e67cd9 change iptables lib to selfowned repo 2025-11-03 00:00:43 +03:00
white
2d9463e507 add service stop message 2025-11-02 23:54:51 +03:00
CherretGit
91d08d3df4 fix 2025-11-03 02:32:47 +07:00
egor-white
3e4f7bad3a Update customize.sh 2025-11-02 22:10:46 +03:00
egor-white
2c1594b13c Update workflow.yml 2025-11-02 22:05:30 +03:00
egor-white
ab7c49864c Update workflow.yml 2025-11-02 22:03:03 +03:00
egor-white
9dfb0b6d67 Update workflow_without_post.yml 2025-11-02 22:02:32 +03:00
CherretGit
46bff39782 fix stop service 2025-11-03 01:23:19 +07:00
CherretGit
0c932ff69c fix nfqws, add default json values 2025-11-03 01:03:47 +07:00
CherretGit
689488ba3f fix working dir 2025-11-01 23:01:44 +07:00
CherretGit
d63cb7c6e6 add saving logs from nfqws to files 2025-11-01 22:08:35 +07:00
CherretGit
90c7a55ab2 try to fix nfqws 2025-11-01 21:45:00 +07:00
CherretGit
dd80ffcd5f add --uid and --qnum to nfqws args 2025-11-01 21:08:10 +07:00
CherretGit
a581e02ccd Update workflow_without_post.yml 2025-11-01 20:20:01 +07:00
CherretGit
2e7b943712 fix customize.sh 2025-11-01 20:16:02 +07:00
CherretGit
4f6a80a8ee fix service status 2025-11-01 19:56:08 +07:00
CherretGit
8caa7ff696 fix 2025-11-01 18:51:57 +07:00
CherretGit
ef58166767 Update workflow_without_post.yml 2025-11-01 18:37:05 +07:00
CherretGit
89ecb5e7fe Update workflow_without_post.yml 2025-11-01 18:32:32 +07:00
CherretGit
26cb5ca046 Update update's.json and changelog 2025-11-01 10:57:14 +00:00
CherretGit
4370ff8867 Update workflow_without_post.yml 2025-11-01 17:51:14 +07:00
CherretGit
eafb226036 Delete src/system/bin directory 2025-11-01 17:40:45 +07:00
CherretGit
0316a4b004 Update file copy commands in workflow YAML 2025-11-01 17:39:43 +07:00
CherretGit
3d78a3d0a4 Update workflow_without_post.yml 2025-11-01 16:57:01 +07:00
CherretGit
d11eb93be6 change sh to bash 2025-11-01 16:43:40 +07:00
CherretGit
490c8fa685 Update workflow_without_post.yml 2025-11-01 16:27:08 +07:00
CherretGit
1128168924 create temp dir to save ndk 2025-11-01 16:25:00 +07:00
CherretGit
1b7448afa3 Test 2025-11-01 16:15:14 +07:00
CherretGit
636cd47ffa use println instead info 2025-11-01 15:51:11 +07:00
sqlerrorthing
ceb27e1ee8 refaktor 2025-11-01 13:00:19 +08:00
sqlerrorthing
fc431f8e88 refactor 2025-11-01 10:57:28 +08:00
sqlerrorthing
8a3df7b253 ... 2025-11-01 07:31:35 +08:00
sqlerrorthing
bb1fe1bc32 refactor 2025-11-01 07:27:14 +08:00
sqlerrorthing
f5cee6df60 build all 3 android targets 2025-11-01 07:27:04 +08:00
sqlerrorthing
930eaf48d2 remove useless 2025-11-01 03:39:48 +08:00
sqlerrorthing
515c946f13 fixess 2025-11-01 03:39:22 +08:00
sqlerrorthing
bf76e162ee fixes 2025-11-01 03:05:55 +08:00
sqlerrorthing
2790c8ed62 feat: build anrdoid (#1) 2025-11-01 02:55:42 +08:00
sqlerrorthing
2e9e08fb96 Merge branch 'rust' into feat/build-anrdoid 2025-11-01 02:54:44 +08:00
white
8542d33af2 create patch for workflow 2025-10-31 13:01:12 +03:00
white
1d9a8a641f removing procfs, adding iptables crate as submodule 2025-10-31 12:45:41 +03:00
sqlerrorthing
17d5e7a8f0 working 2025-10-31 17:38:31 +08:00
sqlerrorthing
aecde98d0d first working 2025-10-31 17:04:32 +08:00
sqlerrorthing
d5267997a3 code stolen from zapret 2025-10-31 16:13:01 +08:00
sqlerrorthing
57382991ad wtf 2025-10-31 15:25:14 +08:00
sqlerrorthing
12ceb7a7d1 build required libraries 2025-10-31 14:41:13 +08:00
sqlerrorthing
f37c14ef0a install android ndk 2025-10-31 12:47:47 +08:00
CherretGit
bfdd7a0a76 fix service status 2025-10-31 02:38:47 +07:00
CherretGit
47f314cd19 Add zapret binary version 2025-10-30 22:47:05 +07:00
white
10fdf4c227 remove bin-ver, add root checks on start and stop 2025-10-30 17:20:54 +03:00
CherretGit
784a248c11 stop_service command, fix 2025-10-30 18:41:47 +07:00
CherretGit
192d846a12 await 2025-10-30 04:09:37 +07:00
CherretGit
87a6b72aee move paths to constants (again) 2025-10-30 03:32:52 +07:00
sqlerrorthing
7ea4a516be daemonize 2025-10-29 23:12:53 +03:00
CherretGit
4b9e60336b Revert "move paths to constants"
This reverts commit 51af644b5f.
2025-10-30 03:08:03 +07:00
CherretGit
51af644b5f move paths to constants 2025-10-30 02:57:22 +07:00
sqlerrorthing
0f5492a29a move zapret from libs/ 2025-10-29 07:50:10 +08:00
sqlerrorthing
a16796a699 recode 2025-10-29 07:46:08 +08:00
sqlerrorthing
19a8ccd384 generate bindings 2025-10-29 07:26:32 +08:00
sqlerrorthing
58d0fdbab3 add rerun 2025-10-29 07:00:49 +08:00
sqlerrorthing
3c0488f629 working! 2025-10-29 06:58:55 +08:00
sqlerrorthing
3e009479c8 idk rename main 2025-10-29 06:08:28 +08:00
sqlerrorthing
3b66cc8136 suppress fucking C warnings 2025-10-29 05:26:09 +08:00
sqlerrorthing
db724d8667 Merge remote-tracking branch 'upstream/rust' into fix/shitcode
# Conflicts:
#	rust/src/main.rs
2025-10-29 05:20:04 +08:00
sqlerrorthing
a1a2961628 fire and forget 2025-10-29 05:05:44 +08:00
sqlerrorthing
e91cb00eec spawn blocking 2025-10-29 05:00:27 +08:00
sqlerrorthing
227db9b7fd right linking 2025-10-29 04:52:48 +08:00
white
c9b4a722c1 i give up 2025-10-28 23:25:34 +03:00
white
021fc6f53e trying to implement rust 2025-10-28 22:21:24 +03:00
egor-white
5f6663a067 Update README.md 2025-10-27 18:46:46 +03:00
egor-white
0e51fb14fd Update README.md 2025-10-27 17:56:10 +03:00
egor-white
31c2c08cf0 Update README.md 2025-10-27 17:54:43 +03:00
egor-white
bb389dff34 Update README.md 2025-10-27 16:47:25 +03:00
egor-white
3882924d60 Update README.md 2025-10-21 14:13:49 +03:00
egor-white
2f47b3c63d Update README.md 2025-10-21 14:13:31 +03:00
egor-white
2e4c484ffb Update README.md 2025-10-21 14:12:44 +03:00
CherretGit
55fd437762 Update changelog.md 2025-10-20 10:28:03 +07:00
CherretGit
d6bc7f17d7 Rename update_tv.json to update-tv.json 2025-10-20 10:26:27 +07:00
CherretGit
5136f3901b Rename update_hosts.json to update-hosts.json 2025-10-20 10:25:33 +07:00
CherretGit
ec072d4ae8 Update workflow.yml 2025-10-20 10:24:55 +07:00
CherretGit
e7b2075d1e Update update's.json and changelog 2025-10-20 03:18:25 +00:00
CherretGit
c7271b2825 update hosts 2025-10-19 14:47:19 +07:00
CherretGit
71e918bd13 Revert "Update service.sh"
This reverts commit 3a7c40f167.
2025-10-19 14:46:19 +07:00
egor-white
d3dbf4ddc5 Update update's.json and changelog 2025-10-16 13:28:26 +00:00
egor-white
0213c239fc Update workflow.yml 2025-10-16 16:27:40 +03:00
egor-white
2d90aea5ca Update workflow.yml 2025-10-16 16:25:56 +03:00
egor-white
e62336e253 Update workflow.yml 2025-10-16 16:22:15 +03:00
CherretGit
dd78b59a68 Update customize.sh 2025-10-12 14:16:55 +07:00
CherretGit
0a0c3fd80b Update customize.sh 2025-10-12 14:12:46 +07:00
CherretGit
3a7c40f167 Update service.sh 2025-10-12 14:10:05 +07:00
CherretGit
9ef7c70f78 ipsets 2025-09-30 22:27:19 +07:00
CherretGit
534f3a733a fix autostart 2025-09-30 22:24:49 +07:00
egor-white
ccaac37b52 Update README.md 2025-09-18 18:50:36 +03:00
egor-white
c2db7fbdac Update README.md 2025-09-18 18:49:37 +03:00
CherretGit
ea92b6cf6f Update workflow_without_post.yml 2025-08-21 17:52:15 +07:00
CherretGit
0fbcd24088 Update workflow.yml 2025-08-21 17:51:40 +07:00
CherretGit
45017d35b2 Update changelog.md 2025-08-21 17:47:01 +07:00
CherretGit
718ed43ef8 Update update's.json and changelog 2025-08-21 10:43:50 +00:00
CherretGit
6318977857 Add files via upload 2025-08-21 17:43:01 +07:00
CherretGit
e3effc3292 Update update's.json and changelog 2025-08-21 10:41:45 +00:00
32 changed files with 2510 additions and 341 deletions

View File

@@ -3,83 +3,77 @@ name: Build module
on:
workflow_dispatch:
inputs:
create_release:
description: 'Create GitHub release?'
required: false
default: 'false'
tag:
description: 'Tag for the release (x.x.x)'
description: "Tag for the release (x.x.x)"
required: true
type: string
zapret-version:
description: "Zapret version (x.x)"
required: true
type: string
version:
description: 'Module version (x.x)'
description: "Module version (x.x)"
required: true
type: string
version_code:
description: 'Module version code (xx)'
description: "Module version code (xx)"
required: true
type: string
release_name:
description: 'Release Name'
description: "Release Name"
required: true
type: string
release_changes:
description: 'Release Changes'
description: "Release Changes"
required: true
type: string
jobs:
build:
runs-on: ubuntu-latest
env:
ZAPRET_VERSION: ${{ inputs.zapret-version }}
steps:
- uses: actions/checkout@v4
- name: Setup Git submodules
run: git submodule update --init --recursive
- name: Install dependencies
run: sudo apt install build-essential pkg-config just unzip
- name: Build zaprett
run: just -f rust/justfile build-android --release
- name: Make build dirs
run: mkdir -p zaprett/system/bin zaprett-hosts/system/bin zaprett-tv/system/bin zaprett/system/etc/zaprett/lists zapret-latest out lists zapret-hosts/system/etc/zaprett/lists zapret-tv/system/etc/zaprett/lists
- name: Download latest zapret binaries
run: |
LATEST_RELEASE=$(curl -s https://api.github.com/repos/bol-van/zapret/releases/latest)
DOWNLOAD_URL=$(echo "$LATEST_RELEASE" | grep -o 'browser_download_url.*zapret-v.*\.zip"' | cut -d'"' -f3)
wget $DOWNLOAD_URL -O zapret-latest.zip
- name: Unzip zapret binaries
run: |
unzip -o zapret-latest.zip
ZAPRET_DIR=$(find . -maxdepth 1 -type d -name 'zapret-v*' | head -n 1)
if [ "$(ls -A "$ZAPRET_DIR")" ]; then
mv "$ZAPRET_DIR"/* zapret-latest/
else
echo "Warning: $ZAPRET_DIR is empty"
fi
rm -rf "${ZAPRET_DIR}"
rm zapret-latest.zip
run: mkdir -p zaprett/system/bin zaprett-hosts/system/bin zaprett/system/etc/zaprett/lists out lists zapret-hosts/system/etc/zaprett/lists
- name: Copy files to dirs
run: |
#copy nfqws and zaprett
cp zapret-latest/binaries/android-arm/nfqws zaprett/system/bin/nfqws_arm32
cp zapret-latest/binaries/android-arm64/nfqws zaprett/system/bin/nfqws_arm64
cp zapret-latest/binaries/android-x86/nfqws zaprett/system/bin/nfqws_x86
cp zapret-latest/binaries/android-x86_64/nfqws zaprett/system/bin/nfqws_x86_64
cp zapret-latest/binaries/linux-mips/nfqws zaprett/system/bin/nfqws_mips
cp zapret-latest/binaries/linux-mipsel/nfqws zaprett/system/bin/nfqws_mipsel
cp rust/target/armv7-linux-androideabi/release/zaprett zaprett/system/bin/zaprett-armv7
cp rust/target/aarch64-linux-android/release/zaprett zaprett/system/bin/zaprett-aarch64
cp rust/target/x86_64-linux-android/release/zaprett zaprett/system/bin/zaprett-x86_64
cp -a src/* zaprett/
#copy all files to another distributions
cp -r zaprett/* zaprett-hosts/
cp -r zaprett/* zaprett-tv/
- name: Download and copy actual lists
run: |
wget https://raw.githubusercontent.com/CherretGit/zaprett-hosts-repo/refs/heads/main/lists/list-youtube.txt -O lists/list-youtube.txt
wget https://raw.githubusercontent.com/CherretGit/zaprett-hosts-repo/refs/heads/main/lists/list-discord.txt -O lists/list-discord.txt
wget https://raw.githubusercontent.com/CherretGit/zaprett-repo/refs/heads/main/lists/include/list-youtube.txt -O lists/list-youtube.txt
wget https://raw.githubusercontent.com/CherretGit/zaprett-repo/refs/heads/main/lists/include/list-discord.txt -O lists/list-discord.txt
cp lists/list-youtube.txt zaprett/system/etc/zaprett/lists/
cp lists/list-youtube.txt zaprett-hosts/system/etc/zaprett/lists/
cp lists/list-youtube.txt zaprett-tv/system/etc/zaprett/lists/
cp lists/list-discord.txt zaprett/system/etc/zaprett/lists/
cp lists/list-discord.txt zaprett-hosts/system/etc/zaprett/lists/
cp hosts/hosts zaprett-hosts/system/etc
- name: Create module.prop
run: |
cat > zaprett/module.prop <<EOF
@@ -87,45 +81,31 @@ jobs:
name=zaprett
version=${{ inputs.version }}
versionCode=${{ inputs.version_code }}
author=egor-white, Huananzhi X99, Cherret
author=egor-white, Cherret
description=Ускорение CDN серверов Google. ТГК: https://t.me/zaprett_module
updateJson=https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/update.json
EOF
cat > zaprett-hosts/module.prop <<EOF
id=zaprett
name=zaprett-hosts
version=${{ inputs.version }}
versionCode=${{ inputs.version_code }}
author=egor-white, Huananzhi X99, Cherret
author=egor-white, Cherret
description=Ускорение CDN серверов Google. ТГК: https://t.me/zaprett_module
updateJson=https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/update-extended.json
updateJson=https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/update-hosts.json
EOF
cat > zaprett-tv/module.prop <<EOF
id=zaprett
name=zaprett-tv
version=${{ inputs.version }}
versionCode=${{ inputs.version_code }}
author=egor-white, Huananzhi X99, Cherret
description=Ускорение CDN серверов Google. ТГК: https://t.me/zaprett_module
updateJson=https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/update-tv.json
EOF
- name: Tree files
run: |
tree zaprett/ zaprett-hosts/ zaprett-tv/
- name: Create archives
run: |
cd zaprett && zip -r ../zaprett.zip ./* && cd ..
cd zaprett-hosts && zip -r ../zaprett-hosts.zip ./* && cd ..
cd zaprett-tv && zip -r ../zaprett-tv.zip ./* && cd ..
mv zaprett.zip out/
mv zaprett-hosts.zip out/
mv zaprett-tv.zip out/
- name: Create release
if: ${{ inputs.create_release == 'true' }}
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ inputs.tag }}
@@ -134,10 +114,20 @@ jobs:
files: out/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload artifact
if: ${{ inputs.create_release != 'true' }}
uses: actions/upload-artifact@v5.0.0
with:
name: zaprett
path: out/*
- name: Update changelog
run: echo "${{ inputs.release_changes}}" > changelog.md
if: ${{ inputs.create_release == 'true' }}
run: echo "${{ inputs.release_changes }}" > changelog.md
- name: Update update.json
if: ${{ inputs.create_release == 'true' }}
run: |
cat > update.json <<EOF
{
@@ -147,7 +137,7 @@ jobs:
"changelog": "https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/main/changelog.md"
}
EOF
cat > update_hosts.json <<EOF
cat > update-hosts.json <<EOF
{
"version": "${{ inputs.version }}",
"versionCode": ${{ inputs.version_code }},
@@ -155,20 +145,12 @@ jobs:
"changelog": "https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/main/changelog.md"
}
EOF
cat > update_tv.json <<EOF
{
"version": "${{ inputs.version }}",
"versionCode": ${{ inputs.version_code }},
"zipUrl": "https://github.com/${{ github.repository }}/releases/download/${{ inputs.tag }}/zaprett-tv.zip",
"changelog": "https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/main/changelog.md"
}
EOF
- name: Commit jsons and changelog
if: ${{ inputs.create_release == 'true' }}
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "Update update's.json and changelog"
file_pattern: 'update.json update_hosts.json update_tv.json changelog.md'
file_pattern: "update.json update-hosts.json changelog.md"
- name: Send bot post
env:
MESSAGE_TEXT: |
@@ -185,4 +167,3 @@ jobs:
-d parse_mode=HTML \
-d disable_web_page_preview=true \
--data-urlencode "text=$MESSAGE_TEXT"

View File

@@ -1,85 +1,80 @@
name: Build module (Without telegram post)
name: Build module (without post)
on:
workflow_dispatch:
inputs:
create_release:
description: 'Create GitHub release?'
required: false
default: 'false'
tag:
description: 'Tag for the release (x.x.x)'
description: "Tag for the release (x.x.x)"
required: true
type: string
zapret-version:
description: "Zapret version (x.x)"
required: true
type: string
version:
description: 'Module version (x.x)'
description: "Module version (x.x)"
required: true
type: string
version_code:
description: 'Module version code (xx)'
description: "Module version code (xx)"
required: true
type: string
release_name:
description: 'Release Name'
description: "Release Name"
required: true
type: string
release_changes:
description: 'Release Changes'
description: "Release Changes"
required: true
type: string
jobs:
build:
runs-on: ubuntu-latest
env:
ZAPRET_VERSION: ${{ inputs.zapret-version }}
steps:
- uses: actions/checkout@v4
- name: Setup Git submodules
run: git submodule update --init --recursive
- name: Install dependencies
run: sudo apt install build-essential pkg-config just unzip
- name: Build zaprett
run: just -f rust/justfile build-android --release
- name: Make build dirs
run: mkdir -p zaprett/system/bin zaprett-hosts/system/bin zaprett-tv/system/bin zaprett/system/etc/zaprett/lists zapret-latest out lists zapret-hosts/system/etc/zaprett/lists zapret-tv/system/etc/zaprett/lists
- name: Download latest zapret binaries
run: |
LATEST_RELEASE=$(curl -s https://api.github.com/repos/bol-van/zapret/releases/latest)
DOWNLOAD_URL=$(echo "$LATEST_RELEASE" | grep -o 'browser_download_url.*zapret-v.*\.zip"' | cut -d'"' -f3)
wget $DOWNLOAD_URL -O zapret-latest.zip
- name: Unzip zapret binaries
run: |
unzip -o zapret-latest.zip
ZAPRET_DIR=$(find . -maxdepth 1 -type d -name 'zapret-v*' | head -n 1)
if [ "$(ls -A "$ZAPRET_DIR")" ]; then
mv "$ZAPRET_DIR"/* zapret-latest/
else
echo "Warning: $ZAPRET_DIR is empty"
fi
rm -rf "${ZAPRET_DIR}"
rm zapret-latest.zip
run: mkdir -p zaprett/system/bin zaprett-hosts/system/bin zaprett/system/etc/zaprett/lists out lists zapret-hosts/system/etc/zaprett/lists
- name: Copy files to dirs
run: |
#copy nfqws and zaprett
cp zapret-latest/binaries/android-arm/nfqws zaprett/system/bin/nfqws_arm32
cp zapret-latest/binaries/android-arm64/nfqws zaprett/system/bin/nfqws_arm64
cp zapret-latest/binaries/android-x86/nfqws zaprett/system/bin/nfqws_x86
cp zapret-latest/binaries/android-x86_64/nfqws zaprett/system/bin/nfqws_x86_64
cp zapret-latest/binaries/linux-mips/nfqws zaprett/system/bin/nfqws_mips
cp zapret-latest/binaries/linux-mipsel/nfqws zaprett/system/bin/nfqws_mipsel
cp rust/target/armv7-linux-androideabi/release/zaprett zaprett/system/bin/zaprett-armv7
cp rust/target/aarch64-linux-android/release/zaprett zaprett/system/bin/zaprett-aarch64
cp rust/target/x86_64-linux-android/release/zaprett zaprett/system/bin/zaprett-x86_64
cp -a src/* zaprett/
#copy all files to another distributions
cp -r zaprett/* zaprett-hosts/
cp -r zaprett/* zaprett-tv/
- name: Download and copy actual lists
run: |
wget https://raw.githubusercontent.com/CherretGit/zaprett-hosts-repo/refs/heads/main/lists/list-youtube.txt -O lists/list-youtube.txt
wget https://raw.githubusercontent.com/CherretGit/zaprett-hosts-repo/refs/heads/main/lists/list-discord.txt -O lists/list-discord.txt
wget https://raw.githubusercontent.com/CherretGit/zaprett-repo/refs/heads/main/lists/include/list-youtube.txt -O lists/list-youtube.txt
wget https://raw.githubusercontent.com/CherretGit/zaprett-repo/refs/heads/main/lists/include/list-discord.txt -O lists/list-discord.txt
cp lists/list-youtube.txt zaprett/system/etc/zaprett/lists/
cp lists/list-youtube.txt zaprett-hosts/system/etc/zaprett/lists/
cp lists/list-youtube.txt zaprett-tv/system/etc/zaprett/lists/
cp lists/list-discord.txt zaprett/system/etc/zaprett/lists/
cp lists/list-discord.txt zaprett-hosts/system/etc/zaprett/lists/
cp hosts/hosts zaprett-hosts/system/etc
- name: Create module.prop
run: |
cat > zaprett/module.prop <<EOF
@@ -87,45 +82,31 @@ jobs:
name=zaprett
version=${{ inputs.version }}
versionCode=${{ inputs.version_code }}
author=egor-white, Huananzhi X99, Cherret
author=egor-white, Cherret
description=Ускорение CDN серверов Google. ТГК: https://t.me/zaprett_module
updateJson=https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/update.json
EOF
cat > zaprett-hosts/module.prop <<EOF
id=zaprett
name=zaprett-hosts
version=${{ inputs.version }}
versionCode=${{ inputs.version_code }}
author=egor-white, Huananzhi X99, Cherret
author=egor-white, Cherret
description=Ускорение CDN серверов Google. ТГК: https://t.me/zaprett_module
updateJson=https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/update-extended.json
updateJson=https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/update-hosts.json
EOF
cat > zaprett-tv/module.prop <<EOF
id=zaprett
name=zaprett-tv
version=${{ inputs.version }}
versionCode=${{ inputs.version_code }}
author=egor-white, Huananzhi X99, Cherret
description=Ускорение CDN серверов Google. ТГК: https://t.me/zaprett_module
updateJson=https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/update-tv.json
EOF
- name: Tree files
run: |
tree zaprett/ zaprett-hosts/ zaprett-tv/
- name: Create archives
run: |
cd zaprett && zip -r ../zaprett.zip ./* && cd ..
cd zaprett-hosts && zip -r ../zaprett-hosts.zip ./* && cd ..
cd zaprett-tv && zip -r ../zaprett-tv.zip ./* && cd ..
mv zaprett.zip out/
mv zaprett-hosts.zip out/
mv zaprett-tv.zip out/
- name: Create release
if: ${{ inputs.create_release == 'true' }}
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ inputs.tag }}
@@ -134,10 +115,20 @@ jobs:
files: out/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload artifact
if: ${{ inputs.create_release != 'true' }}
uses: actions/upload-artifact@v5.0.0
with:
name: zaprett
path: out/*
- name: Update changelog
run: echo "${{ inputs.release_changes}}" > changelog.md
if: ${{ inputs.create_release == 'true' }}
run: echo "${{ inputs.release_changes }}" > changelog.md
- name: Update update.json
if: ${{ inputs.create_release == 'true' }}
run: |
cat > update.json <<EOF
{
@@ -155,16 +146,11 @@ jobs:
"changelog": "https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/main/changelog.md"
}
EOF
cat > update_tv.json <<EOF
{
"version": "${{ inputs.version }}",
"versionCode": ${{ inputs.version_code }},
"zipUrl": "https://github.com/${{ github.repository }}/releases/download/${{ inputs.tag }}/zaprett-tv.zip",
"changelog": "https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/main/changelog.md"
}
EOF
- name: Commit jsons and changelog
if: ${{ inputs.create_release == 'true' }}
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "Update update's.json and changelog"
file_pattern: 'update.json update_hosts.json update_tv.json changelog.md'
file_pattern: "update.json update_hosts.json changelog.md"

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
target

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "rust/crates/libnfqws/zapret"]
path = rust/crates/libnfqws/zapret
url = https://github.com/bol-van/zapret.git

View File

@@ -1,18 +1,34 @@
# zaprett
### [Официальный Telegram-канал модуля](https://t.me/zaprett_module)
![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/egor-white/zaprett/total)
![GitHub Downloads (all assets, latest release)](https://img.shields.io/github/downloads/egor-white/zaprett/latest/total)
![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/egor-white/zaprett/workflow.yml)
### [📣 Официальный Telegram-канал модуля](https://t.me/zaprett_module)
## О модуле
Представляет собой портированную версию [zapret](https://github.com/bol-van/zapret/) от [bol-van](https://github.com/bol-van/) для Android устройств.
Требования:
* Magisk 24.1+
* Прямые руки
* Termux или другой эмулятор терминала **И/ИЛИ** [приложение zaprett](https://github.com/egor-white/zaprett-app) (не обновляется) **ИЛИ** [ремейк приложения zaprett от cherret](https://github.com/CherretGit/zaprett-app)
* Termux или другой эмулятор терминала **И/ИЛИ** [ремейк приложения zaprett от cherret](https://github.com/CherretGit/zaprett-app) ("оригинал" устарел и не обновляется, вместо этого мы вдвоём занимаемся версией на Kotlin!)
На данный момент модуль умеет:
+ Включать, выключать и перезапускать nfqws
+ Работать с листами и стратегиями
+ Работать с листами, айписетами, стратегиями
+ Предлагать обновления через Magisk/KSU/KSU Next/APatch
## Какую версию модуля выбрать?
Создано - [egor-white](https://t.me/cheesedroid), [Cherret](https://t.me/Cherret), [MT6833](https://t.me/MT6833).
В актуальных релизах есть 2 версии модуля, а именно:
- zaprett.zip
- zaprett-hosts.zip (с /etc/hosts)
## Что такое /etc/hosts?
Говоря грубо, это файл, который влияет на работу нейросетей и других недоступных сервисов, перенаправляя ваш траффик на сторонние сервера.
Если вы используете модули, которые подменяют этот файл (например, всевозможные блокировщики рекламы и разблокировщики нейросетей), выбирайте версию <big>**без hosts**</big>, иначе модули будут конфликтовать друг с другом.
⚠️ Сервера, используемые в качестве прокси и указанные в файле hosts нам неподконтрольны, мы не несём за них отвественность, используйте с осторожностью

View File

@@ -1 +1 @@
Небольшие изменения в customize.sh
Список изменений: 1. Использование команды restart 2. Исправление customize.sh 3. Обновление hosts-файла

View File

@@ -1,35 +1,398 @@
127.0.0.1 localhost
::1 ip6-localhost
89.108.98.20 chatgpt.com
134.0.118.88 ab.chatgpt.com
89.108.98.20 auth.openai.com
89.108.98.20 auth0.openai.com
89.108.98.20 platform.openai.com
89.108.98.20 cdn.oaistatic.com
89.108.98.20 files.oaiusercontent.com
89.108.98.20 cdn.auth0.com
89.108.98.20 tcr9i.chat.openai.com
89.108.98.20 webrtc.chatgpt.com
89.108.98.20 android.chat.openai.com
89.108.98.20 gemini.google.com
89.108.98.20 aistudio.google.com
89.108.98.20 ai.google
89.108.98.20 assistant-s3-pa.googleapis.com
89.108.98.20 generativelanguage.googleapis.com
89.108.98.20 alkalimakersuite-pa.clients6.google.com
64.233.162.188 mtalk.google.com
89.108.98.20 copilot.microsoft.com
89.108.98.20 sydney.bing.com
89.108.98.20 edgeservices.bing.com
89.108.98.20 claude.ai
89.108.98.20 aitestkitchen.withgoogle.com
89.108.98.20 aisandbox-pa.googleapis.com
89.108.98.20 o.pki.goog
89.108.98.20 labs.google
89.108.98.20 notebooklm.google
89.108.98.20 notebooklm.google.com
89.108.98.20 www.notion.so
89.108.98.20 www.googleapis.com
89.108.98.20 proactivebackend-pa.googleapis.com
89.108.98.20 grok.com
89.108.98.20 assets.grok.com
### dns.geohide.ru: hosts file
# На базе hosts от dns.malw.link
# Последнее обновление: 21 ноября 2025
# Дополнение к zapret
157.240.245.174 instagram.com
157.240.245.174 www.instagram.com
157.240.245.174 b.i.instagram.com
157.240.245.174 z-p42-chat-e2ee-ig.facebook.com
157.240.245.174 help.instagram.com
185.70.42.45 protonmail.com
185.70.42.45 mail.proton.me
52.223.13.41 tracker.openbittorrent.com
130.255.77.28 ntc.party
172.64.32.155 rutor.info
172.64.33.219 rutor.info
173.245.58.155 rutor.info
173.245.59.219 rutor.info
172.64.32.155 rutor.is
172.64.33.219 rutor.is
173.245.58.155 rutor.is
173.245.59.219 rutor.is
172.64.33.155 d.rutor.info
172.64.33.155 d.rutor.is
# ChatGPT & Sora (OpenAI)
95.182.120.241 ab.chatgpt.com
185.87.51.182 ab.chatgpt.com
95.182.120.241 android.chat.openai.com
185.87.51.182 android.chat.openai.com
95.182.120.241 api.openai.com
185.87.51.182 api.openai.com
95.182.120.241 auth.openai.com
185.87.51.182 auth.openai.com
95.182.120.241 auth0.openai.com
185.87.51.182 auth0.openai.com
95.182.120.241 cdn.auth0.com
185.87.51.182 cdn.auth0.com
95.182.120.241 cdn.oaistatic.com
185.87.51.182 cdn.oaistatic.com
95.182.120.241 chatgpt.com
185.87.51.182 chatgpt.com
95.182.120.241 files.oaiusercontent.com
185.87.51.182 files.oaiusercontent.com
95.182.120.241 ios.chat.openai.com
185.87.51.182 ios.chat.openai.com
95.182.120.241 operator.chatgpt.com
185.87.51.182 operator.chatgpt.com
95.182.120.241 platform.openai.com
185.87.51.182 platform.openai.com
95.182.120.241 sora.chatgpt.com
185.87.51.182 sora.chatgpt.com
95.182.120.241 sora.com
185.87.51.182 sora.com
95.182.120.241 tcr9i.chat.openai.com
185.87.51.182 tcr9i.chat.openai.com
95.182.120.241 videos.openai.com
185.87.51.182 videos.openai.com
95.182.120.241 webrtc.chatgpt.com
185.87.51.182 webrtc.chatgpt.com
# Claude
95.182.120.241 api.anthropic.com
185.87.51.182 api.anthropic.com
95.182.120.241 auth.anthropic.com
185.87.51.182 auth.anthropic.com
95.182.120.241 claude.ai
185.87.51.182 claude.ai
95.182.120.241 console.anthropic.com
185.87.51.182 console.anthropic.com
# DeepL
95.182.120.241 api-free.deepl.com
185.87.51.182 api-free.deepl.com
95.182.120.241 auth.deepl.com
185.87.51.182 auth.deepl.com
95.182.120.241 backend.deepl.com
185.87.51.182 backend.deepl.com
95.182.120.241 clearance.deepl.com
185.87.51.182 clearance.deepl.com
95.182.120.241 deepl.com
185.87.51.182 deepl.com
95.182.120.241 dict.deepl.com
185.87.51.182 dict.deepl.com
95.182.120.241 errortracking.deepl.com
185.87.51.182 errortracking.deepl.com
95.182.120.241 experimentation-grpc.deepl.com
185.87.51.182 experimentation-grpc.deepl.com
95.182.120.241 experimentation.deepl.com
185.87.51.182 experimentation.deepl.com
95.182.120.241 ita-free.app.deepl.com
185.87.51.182 ita-free.app.deepl.com
95.182.120.241 ita-free.www.deepl.com
185.87.51.182 ita-free.www.deepl.com
95.182.120.241 login-wall.deepl.com
185.87.51.182 login-wall.deepl.com
95.182.120.241 oneshot-free.www.deepl.com
185.87.51.182 oneshot-free.www.deepl.com
95.182.120.241 ott.deepl.com
185.87.51.182 ott.deepl.com
95.182.120.241 s.deepl.com
185.87.51.182 s.deepl.com
95.182.120.241 shield.deepl.com
185.87.51.182 shield.deepl.com
95.182.120.241 w.deepl.com
185.87.51.182 w.deepl.com
95.182.120.241 write-free.www.deepl.com
185.87.51.182 write-free.www.deepl.com
95.182.120.241 www.deepl.com
185.87.51.182 www.deepl.com
95.182.120.241 www2.deepl.com
185.87.51.182 www2.deepl.com
# Deezer
95.182.120.241 deezer.com
185.87.51.182 deezer.com
95.182.120.241 dzcdn.net
185.87.51.182 dzcdn.net
95.182.120.241 payment.deezer.com
185.87.51.182 payment.deezer.com
95.182.120.241 www.deezer.com
185.87.51.182 www.deezer.com
# ElevenLabs
95.182.120.241 api.elevenlabs.io
185.87.51.182 api.elevenlabs.io
95.182.120.241 api.us.elevenlabs.io
185.87.51.182 api.us.elevenlabs.io
95.182.120.241 elevenlabs.io
185.87.51.182 elevenlabs.io
95.182.120.241 elevenreader.io
185.87.51.182 elevenreader.io
95.182.120.241 help.elevenlabs.io
185.87.51.182 help.elevenlabs.io
# Fitbit
95.182.120.241 api.fitbit.com
185.87.51.182 api.fitbit.com
95.182.120.241 fitbit-pa.googleapis.com
185.87.51.182 fitbit-pa.googleapis.com
95.182.120.241 fitbit.google.com
185.87.51.182 fitbit.google.com
95.182.120.241 fitbitvestibuleshim-pa.googleapis.com
185.87.51.182 fitbitvestibuleshim-pa.googleapis.com
# Google AI
95.182.120.241 aisandbox-pa.googleapis.com
185.87.51.182 aisandbox-pa.googleapis.com
95.182.120.241 aistudio.google.com
185.87.51.182 aistudio.google.com
95.182.120.241 aitestkitchen.withgoogle.com
185.87.51.182 aitestkitchen.withgoogle.com
95.182.120.241 alkalimakersuite-pa.clients6.google.com
185.87.51.182 alkalimakersuite-pa.clients6.google.com
95.182.120.241 assistant-s3-pa.googleapis.com
185.87.51.182 assistant-s3-pa.googleapis.com
95.182.120.241 gemini.google.com
185.87.51.182 gemini.google.com
95.182.120.241 generativelanguage.googleapis.com
185.87.51.182 generativelanguage.googleapis.com
95.182.120.241 jules.google.com
185.87.51.182 jules.google.com
95.182.120.241 labs.google
185.87.51.182 labs.google
95.182.120.241 notebooklm.google
185.87.51.182 notebooklm.google
95.182.120.241 notebooklm.google.com
185.87.51.182 notebooklm.google.com
95.182.120.241 o.pki.goog
185.87.51.182 o.pki.goog
95.182.120.241 proactivebackend-pa.googleapis.com
185.87.51.182 proactivebackend-pa.googleapis.com
95.182.120.241 robinfrontend-pa.googleapis.com
185.87.51.182 robinfrontend-pa.googleapis.com
95.182.120.241 stitch.withgoogle.com
185.87.51.182 stitch.withgoogle.com
95.182.120.241 webchannel-alkalimakersuite-pa.clients6.google.com
185.87.51.182 webchannel-alkalimakersuite-pa.clients6.google.com
# Grok
95.182.120.241 accounts.x.ai
185.87.51.182 accounts.x.ai
95.182.120.241 assets.grok.com
185.87.51.182 assets.grok.com
95.182.120.241 grok.com
185.87.51.182 grok.com
# JetBrains
95.182.120.241 account.jetbrains.com
185.87.51.182 account.jetbrains.com
95.182.120.241 api.jetbrains.ai
185.87.51.182 api.jetbrains.ai
95.182.120.241 datalore.jetbrains.com
185.87.51.182 datalore.jetbrains.com
95.182.120.241 download.jetbrains.com
185.87.51.182 download.jetbrains.com
95.182.120.241 plugins.jetbrains.com
185.87.51.182 plugins.jetbrains.com
# Linear.app
95.182.120.241 client-api.linear.app
185.87.51.182 client-api.linear.app
95.182.120.241 constellation.linear.app
185.87.51.182 constellation.linear.app
95.182.120.241 linear.app
185.87.51.182 linear.app
95.182.120.241 public.linear.app
185.87.51.182 public.linear.app
95.182.120.241 s.linear.app
185.87.51.182 s.linear.app
95.182.120.241 static.linear.app
185.87.51.182 static.linear.app
95.182.120.241 uploads.linear.app
185.87.51.182 uploads.linear.app
# Microsoft Copilot & Xbox
95.182.120.241 copilot.microsoft.com
185.87.51.182 copilot.microsoft.com
95.182.120.241 edgeservices.bing.com
185.87.51.182 edgeservices.bing.com
95.182.120.241 rewards.bing.com
185.87.51.182 rewards.bing.com
95.182.120.241 sydney.bing.com
185.87.51.182 sydney.bing.com
95.182.120.241 xboxdesignlab.xbox.com
185.87.51.182 xboxdesignlab.xbox.com
95.182.120.241 xgpuweb.gssv-play-prod.xboxlive.com
185.87.51.182 xgpuweb.gssv-play-prod.xboxlive.com
95.182.120.241 xgpuwebf2p.gssv-play-prod.xboxlive.com
185.87.51.182 xgpuwebf2p.gssv-play-prod.xboxlive.com
95.182.120.241 xsts.auth.xboxlive.com
185.87.51.182 xsts.auth.xboxlive.com
# Spotify
95.182.120.241 accounts.spotify.com
185.87.51.182 accounts.spotify.com
95.182.120.241 aet.spotify.com
185.87.51.182 aet.spotify.com
95.182.120.241 ap-gew1.spotify.com
185.87.51.182 ap-gew1.spotify.com
95.182.120.241 api-partner.spotify.com
185.87.51.182 api-partner.spotify.com
95.182.120.241 api.spotify.com
185.87.51.182 api.spotify.com
95.182.120.241 appresolve.spotify.com
185.87.51.182 appresolve.spotify.com
95.182.120.241 encore.scdn.co
185.87.51.182 encore.scdn.co
95.182.120.241 gew1-spclient.spotify.com
185.87.51.182 gew1-spclient.spotify.com
95.182.120.241 login.app.spotify.com
185.87.51.182 login.app.spotify.com
95.182.120.241 login5.spotify.com
185.87.51.182 login5.spotify.com
95.182.120.241 open.spotify.com
185.87.51.182 open.spotify.com
95.182.120.241 spclient.wg.spotify.com
185.87.51.182 spclient.wg.spotify.com
95.182.120.241 www.spotify.com
185.87.51.182 www.spotify.com
95.182.120.241 xpui.app.spotify.com
185.87.51.182 xpui.app.spotify.com
# Supercell
45.95.233.23 accounts.supercell.com
185.246.223.127 cdn.id.supercell.com
185.246.223.127 clashofclans.inbox.supercell.com
141.95.97.120 game.brawlstarsgame.com
45.95.233.23 game.clashroyaleapp.com
45.95.233.23 game.mocogame.com
108.61.167.26 game.squadbustersgame.com
141.95.97.120 game-assets.brawlstarsgame.com
185.246.223.127 game-assets.clashofclans.com
185.246.223.127 game-assets.clashroyaleapp.com
64.188.98.242 gamea.clashofclans.com
185.246.223.127 security.id.supercell.com
185.246.223.127 store.supercell.com
# Trae.ai
95.182.120.241 api-sg-central.trae.ai
185.87.51.182 api-sg-central.trae.ai
95.182.120.241 api.trae.ai
185.87.51.182 api.trae.ai
95.182.120.241 api16-normal-alisg.mchost.guru
185.87.51.182 api16-normal-alisg.mchost.guru
95.182.120.241 trae-api-sg.mchost.guru
185.87.51.182 trae-api-sg.mchost.guru
# Twitch
95.182.120.241 gql.twitch.tv
185.87.51.182 gql.twitch.tv
95.182.120.241 usher.ttvnw.net
185.87.51.182 usher.ttvnw.net
# Weather.com
95.182.120.241 upsx.weather.com
185.87.51.182 upsx.weather.com
95.182.120.241 weather.com
185.87.51.182 weather.com
# Windsurf
95.182.120.241 codeium.com
185.87.51.182 codeium.com
95.182.120.241 codeiumdata.com
185.87.51.182 codeiumdata.com
95.182.120.241 inference.codeium.com
185.87.51.182 inference.codeium.com
95.182.120.241 marketplace.windsurf.com
185.87.51.182 marketplace.windsurf.com
95.182.120.241 server.codeium.com
185.87.51.182 server.codeium.com
95.182.120.241 unleash.codeium.com
185.87.51.182 unleash.codeium.com
95.182.120.241 web-backend.codeium.com
185.87.51.182 web-backend.codeium.com
95.182.120.241 windsurf-stable.codeium.com
185.87.51.182 windsurf-stable.codeium.com
95.182.120.241 windsurf-telemetry.codeium.com
185.87.51.182 windsurf-telemetry.codeium.com
95.182.120.241 windsurf.com
185.87.51.182 windsurf.com
# Остальное
95.182.120.241 api-global.squareup.com
185.87.51.182 api-global.squareup.com
95.182.120.241 api.cdnlibs.org
185.87.51.182 api.cdnlibs.org
95.182.120.241 api.imgur.com
185.87.51.182 api.imgur.com
95.182.120.241 api.manus.im
185.87.51.182 api.manus.im
95.182.120.241 api.squareup.com
185.87.51.182 api.squareup.com
95.182.120.241 builds.parsec.app
185.87.51.182 builds.parsec.app
95.182.120.241 controlplane.tailscale.com
185.87.51.182 controlplane.tailscale.com
95.182.120.241 developer.nvidia.com
185.87.51.182 developer.nvidia.com
95.182.120.241 eu.posthog.com
185.87.51.182 eu.posthog.com
95.182.120.241 framer.com
185.87.51.182 framer.com
95.182.120.241 geolocation.onetrust.com
185.87.51.182 geolocation.onetrust.com
95.182.120.241 guidedhacking.com
185.87.51.182 guidedhacking.com
95.182.120.241 profile.broadcom.com
185.87.51.182 profile.broadcom.com
95.182.120.241 tria.ge
185.87.51.182 tria.ge
95.182.120.241 web.archive.org
185.87.51.182 web.archive.org
95.182.120.241 www.canva.com
185.87.51.182 www.canva.com
95.182.120.241 www.dell.com
185.87.51.182 www.dell.com
95.182.120.241 www.dyson.com
185.87.51.182 www.dyson.com
95.182.120.241 www.dyson.de
185.87.51.182 www.dyson.de
95.182.120.241 www.dyson.se
185.87.51.182 www.dyson.se
95.182.120.241 www.intel.com
185.87.51.182 www.intel.com
95.182.120.241 www.notion.so
185.87.51.182 www.notion.so
95.182.120.241 www.qwant.com
185.87.51.182 www.qwant.com
# Блокировка реально плохих сайтов
0.0.0.0 only-fans.uk
0.0.0.0 only-fans.me
0.0.0.0 onlyfans.wtf
0.0.0.0 iplogger.org
0.0.0.0 wl.gl
0.0.0.0 ed.tc
0.0.0.0 bc.ax
0.0.0.0 maper.info
0.0.0.0 2no.co
0.0.0.0 yip.su
0.0.0.0 iplis.ru
0.0.0.0 ezstat.ru
0.0.0.0 iplog.co
0.0.0.0 grabify.org
0.0.0.0 log16-platform-ycru.tiktokv.com
0.0.0.0 adfox.yandex.ru
0.0.0.0 adfstat.yandex.ru
0.0.0.0 ads-api.tiktok.com
0.0.0.0 ads-api.twitter.com
0.0.0.0 ads-dev.pinterest.com
0.0.0.0 ads-sg.tiktok.com
0.0.0.0 an.yandex.ru
0.0.0.0 appmetrica.yandex.ru
0.0.0.0 mc.yandex.ru
0.0.0.0 amc.yandex.ru
0.0.0.0 tigr1234566.github.io
0.0.0.0 rezvorck.github.io
### dns.geohide.ru: end hosts file

1126
rust/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

33
rust/Cargo.toml Normal file
View File

@@ -0,0 +1,33 @@
[workspace.package]
version = "0.0.1"
edition = "2024"
repository = "https://github.com/egor-white/zaprett"
[workspace]
members = ["crates/*"]
resolver = "3"
[workspace.dependencies]
anyhow = "1.0.100"
clap = { version = "4.5.50", features = ["derive"] }
libc = "0.2.177"
regex = "1.12.2"
rust-ini = "0.21.3"
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.145"
sysctl = "0.7.1"
tokio = { version = "1.48.0", features = ["full"] }
once_cell = "1.21.3"
daemonize = "0.5.0"
log = "0.4.28"
pretty_env_logger = "0.5.0"
nix = { version = "0.30.1", features = ["signal"] }
getset = "0.1.6"
sysinfo = "0.37.2"
[profile.release]
panic = "abort"
opt-level = "z"
lto = true
strip = true
codegen-units = 1

View File

@@ -0,0 +1,11 @@
[package]
name = "libnfqws"
version.workspace = true
edition.workspace = true
repository.workspace = true
[build-dependencies]
cc = "1.2.43"
once_cell = "1.21.3"
glob = "0.3.3"
bindgen = "0.72.1"

View File

@@ -0,0 +1,68 @@
use once_cell::sync::Lazy;
use std::env;
use std::path::{Path, PathBuf};
macro_rules! rel_manifest_path {
($name:ident, $path:expr) => {
static $name: Lazy<PathBuf> = Lazy::new(|| {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
Path::new(&manifest_dir).join($path)
});
};
}
rel_manifest_path!(NFQ, "zapret/nfq");
rel_manifest_path!(NFQ_CRYPTO, "zapret/nfq/crypto");
fn main() {
cc::Build::new()
.files(
glob::glob(&format!("{}/*.c", NFQ.display()))
.unwrap()
.filter_map(Result::ok),
)
.files(
glob::glob(&format!("{}/*.c", NFQ_CRYPTO.display()))
.unwrap()
.filter_map(Result::ok),
)
.include(&*NFQ)
.include(&*NFQ_CRYPTO)
.flag("-w")
.define("main", "nfqws_main")
.compile("libnfqws.a");
println!("cargo:rustc-link-lib=z");
println!("cargo:rustc-link-lib=netfilter_queue");
println!("cargo:rustc-link-lib=nfnetlink");
println!("cargo:rustc-link-lib=mnl");
let _ = env::var("NETFILTER_LIBS")
.map(|libs| println!("cargo:rustc-link-search=native={libs}/lib"));
println!("cargo:rustc-link-lib=static=nfqws");
println!("cargo:rerun-if-changed={}", NFQ.display());
println!("cargo:rerun-if-changed={}", NFQ_CRYPTO.display());
println!("cargo:rerun-if-changed=build.rs");
let mut builder = bindgen::Builder::default();
for header in glob::glob(&format!("{}/*.h", NFQ.display()))
.unwrap()
.filter_map(Result::ok)
{
builder = builder.header(header.to_string_lossy());
}
builder = builder.clang_arg("-Dmain=nfqws_main");
let bindings = builder
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.generate()
.expect("Unable to generate libnfqws");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("libnfqws.rs"))
.expect("Couldn't write libnfqws");
}

View File

@@ -0,0 +1,2 @@
#![allow(warnings)]
include!(concat!(env!("OUT_DIR"), "/libnfqws.rs"));

View File

@@ -0,0 +1,23 @@
[package]
name = "zaprett"
version.workspace = true
edition.workspace = true
repository.workspace = true
[dependencies]
anyhow = { workspace = true }
clap = { workspace = true }
libc = { workspace = true }
regex = { workspace = true }
rust-ini = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
sysctl ={ workspace = true }
tokio = { workspace = true }
libnfqws = { path = "../libnfqws" }
daemonize = { workspace = true }
pretty_env_logger = { workspace = true }
log = { workspace = true }
nix = { workspace = true, features = ["user"] }
getset = { workspace = true }
sysinfo = { workspace = true }

View File

@@ -0,0 +1,5 @@
use std::env;
fn main() {
let zapret_version = env::var("ZAPRET_VERSION").unwrap_or("unknown".to_string());
println!("cargo:rustc-env=ZAPRET_VERSION={}", zapret_version);
}

View File

@@ -0,0 +1,21 @@
use crate::MODULE_PATH;
use tokio::fs;
use tokio::fs::File;
pub async fn set_autostart() -> Result<(), anyhow::Error> {
let autostart_path = MODULE_PATH.join("autostart");
if !get_autostart() {
File::create(autostart_path).await?;
} else {
fs::remove_file(autostart_path).await?;
}
println!("{}", get_autostart());
Ok(())
}
pub fn get_autostart() -> bool {
return MODULE_PATH.join("autostart").exists();
}

View File

@@ -0,0 +1,13 @@
pub mod commands;
use clap::Parser;
use commands::Command;
use getset::Getters;
#[derive(Parser, Getters)]
#[command(version)]
#[getset(get = "pub")]
pub struct CliApp {
#[command(subcommand)]
cmd: Option<Command>,
}

View File

@@ -0,0 +1,71 @@
use crate::autostart::{get_autostart, set_autostart};
use crate::service::{restart_service, service_status, start_service, stop_service};
use crate::{bin_version, module_version, run_nfqws};
use clap::Subcommand;
use log::error;
#[derive(Subcommand)]
pub enum Command {
/// Start the service
Start,
/// Stop the service
Stop,
/// Restart the service
Restart,
/// Show the current service status
Status,
/// Enable or disable automatic restart
SetAutostart,
/// Show whether autostart is enabled
GetAutostart,
/// Show the module version
ModuleVersion,
/// Show the nfqws binary version
BinaryVersion,
/// Run nfqws
Args {
#[arg(allow_hyphen_values=true, trailing_var_arg = true, num_args = 0..)]
args: Vec<String>,
},
}
impl Command {
pub async fn exec(&self) -> anyhow::Result<()> {
match self {
Command::Start => return start_service().await,
Command::Stop => {
let _ = stop_service().await;
}
Command::Restart => return restart_service().await,
Command::Status => {
println!(
"zaprett is {}",
if service_status().await? {
"working"
} else {
"stopped"
}
);
}
Command::SetAutostart => {
if let Err(err) = set_autostart().await {
error!("Failed to set auto start: {err}")
}
}
Command::GetAutostart => println!("{}", get_autostart()),
Command::ModuleVersion => println!("{}", module_version().await?),
Command::BinaryVersion => println!("{}", bin_version()),
Command::Args { args } => run_nfqws(&args.join(" "))?,
}
Ok(())
}
}

View File

@@ -0,0 +1,63 @@
use crate::{MODULE_PATH, merge_files};
use getset::Getters;
use serde::{Deserialize, Serialize};
#[derive(Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ListType {
#[default]
Whitelist,
Blacklist,
}
#[derive(Default, Serialize, Deserialize, Getters)]
#[getset(get = "pub")]
#[serde(default)]
pub struct Config {
active_lists: Vec<String>,
active_ipsets: Vec<String>,
active_exclude_lists: Vec<String>,
active_exclude_ipsets: Vec<String>,
list_type: ListType,
strategy: String,
app_list: String,
whitelist: Vec<String>,
blacklist: Vec<String>,
}
impl ListType {
/// # Returns
///
/// (hostlist arg, ipset arg)
pub async fn merge(&self, config: &Config) -> (String, String) {
let module_path_str = MODULE_PATH.to_str().unwrap();
let (host_files, ipset_files, host_suffix, ipset_suffix, exclude_flag) = match self {
ListType::Whitelist => (
&config.active_lists,
&config.active_ipsets,
"hostlist",
"ipset",
"",
),
ListType::Blacklist => (
&config.active_exclude_lists,
&config.active_exclude_ipsets,
"hostlist-exclude",
"ipset-exclude",
"-exclude",
),
};
let host_path = MODULE_PATH.join(format!("tmp/{host_suffix}"));
let ipset_path = MODULE_PATH.join(format!("tmp/{ipset_suffix}"));
merge_files(host_files, host_path).await.unwrap();
merge_files(ipset_files, ipset_path).await.unwrap();
(
format!("--hostlist{exclude_flag}={module_path_str}/tmp/{host_suffix}"),
format!("--ipset{exclude_flag}={module_path_str}/tmp/{ipset_suffix}"),
)
}
}

View File

@@ -0,0 +1,26 @@
use crate::{MODULE_PATH, run_nfqws};
use daemonize::Daemonize;
use log::{error, info};
use std::fs::File;
pub async fn daemonize_nfqws(args: &str) {
info!("Starting nfqws as a daemon");
let stdout = File::create(MODULE_PATH.join("tmp/nfqws.out")).unwrap();
let stderr = File::create(MODULE_PATH.join("tmp/nfqws.err")).unwrap();
let daemonize = Daemonize::new()
.pid_file(MODULE_PATH.join("tmp/pid.lock").as_path())
.working_directory(MODULE_PATH.join("tmp"))
.stdout(stdout)
.stderr(stderr)
.privileged_action(|| "Executed before drop privileges");
match daemonize.start() {
Ok(_) => {
info!("Success, daemonized");
run_nfqws(args).unwrap()
}
Err(e) => error!("Error while starting nfqws daemon: {e}"),
}
}

View File

@@ -0,0 +1,88 @@
use std::error;
use std::process::Command;
pub fn setup_iptables_rules() -> Result<(), Box<dyn error::Error>> {
Command::new("iptables")
.arg("-t")
.arg("mangle")
.arg("-I")
.arg("POSTROUTING")
.arg("-j")
.arg("NFQUEUE")
.arg("--queue-num")
.arg("200")
.arg("--queue-bypass")
.status()
.expect("failed to add iptables rules");
Command::new("iptables")
.arg("-t")
.arg("mangle")
.arg("-I")
.arg("PREROUTING")
.arg("-j")
.arg("NFQUEUE")
.arg("--queue-num")
.arg("200")
.arg("--queue-bypass")
.status()
.expect("failed to add iptables rules");
Command::new("iptables")
.arg("-t")
.arg("filter")
.arg("-A")
.arg("FORWARD")
.arg("-j")
.arg("NFQUEUE")
.arg("--queue-num")
.arg("200")
.arg("--queue-bypass")
.status()
.expect("failed to add iptables rules");
Ok(())
}
pub fn clear_iptables_rules() -> Result<(), Box<dyn error::Error>> {
Command::new("iptables")
.arg("-t")
.arg("mangle")
.arg("-D")
.arg("POSTROUTING")
.arg("-j")
.arg("NFQUEUE")
.arg("--queue-num")
.arg("200")
.arg("--queue-bypass")
.status()
.expect("failed to remove iptables rules");
Command::new("iptables")
.arg("-t")
.arg("mangle")
.arg("-D")
.arg("PREROUTING")
.arg("-j")
.arg("NFQUEUE")
.arg("--queue-num")
.arg("200")
.arg("--queue-bypass")
.status()
.expect("failed to remove iptables rules");
Command::new("iptables")
.arg("-t")
.arg("filter")
.arg("-D")
.arg("FORWARD")
.arg("-j")
.arg("NFQUEUE")
.arg("--queue-num")
.arg("200")
.arg("--queue-bypass")
.status()
.expect("failed to remove iptables rules");
Ok(())
}

View File

@@ -0,0 +1,103 @@
pub mod cli;
pub mod config;
mod daemon;
pub mod iptables_rust;
mod service;
mod autostart;
use ini::Ini;
use libnfqws::nfqws_main;
use std::error;
use std::ffi::CString;
use std::os::raw::c_char;
use std::path::Path;
use std::sync::LazyLock;
use anyhow::bail;
use tokio::fs::File;
use tokio::io::{copy, AsyncWriteExt};
use tokio::task::spawn_blocking;
pub static MODULE_PATH: LazyLock<&Path> =
LazyLock::new(|| Path::new("/data/adb/modules/zaprett"));
pub static ZAPRETT_DIR_PATH: LazyLock<&Path> =
LazyLock::new(|| Path::new("/storage/emulated/0/zaprett"));
pub static DEFAULT_START: &str = "
--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig,badsum $hostlist --new
--filter-tcp=443 $hostlist --dpi-desync=fake,split2 --dpi-desync-repeats=6 --dpi-desync-fooling=md5sig,badsum --dpi-desync-fake-tls=${zaprettdir}/bin/tls_clienthello_www_google_com.bin --new
--filter-tcp=80,443 --dpi-desync=fake,disorder2 --dpi-desync-repeats=6 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig,badsum $hostlist --new
--filter-udp=50000-50100 --dpi-desync=fake --dpi-desync-any-protocol --dpi-desync-fake-quic=0xC30000000108 --new
--filter-udp=443 $hostlist --dpi-desync=fake --dpi-desync-repeats=6 --dpi-desync-fake-quic=${zaprettdir}/bin/quic_initial_www_google_com.bin --new
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 $hostlist
";
async fn module_version() -> anyhow::Result<String> {
let prop = spawn_blocking(|| Ini::load_from_file(MODULE_PATH.join("module.prop")))
.await??;
if let Some(props) = prop.section::<String>(None)
&& let Some(version) = props.get("version")
{
return Ok(version.into());
}
bail!("Failed to get version, prop not found")
}
fn bin_version() -> &'static str {
env!("ZAPRET_VERSION")
}
pub async fn merge_files(
input_paths: &[impl AsRef<Path>],
output_path: impl AsRef<Path>,
) -> Result<(), Box<dyn error::Error>> {
let output_path = output_path.as_ref();
let mut output_file = File::create(output_path).await?;
for input in input_paths {
let input = input.as_ref();
let mut input_file = File::open(input)
.await
.map_err(|e| format!("Failed to open {}: {e}", input.display()))?;
copy(&mut input_file, &mut output_file).await.map_err(|e| {
format!(
"Failed to write contents of {}: {e}",
input.display()
)
})?;
}
output_file.flush().await?;
Ok(())
}
fn run_nfqws(args_str: &str) -> anyhow::Result<()> {
let mut args = vec![
"nfqws".to_string(),
"--uid=0:0".to_string(),
"--qnum=200".to_string(),
];
if args_str.trim().is_empty() {
args.push("-v".to_string());
} else {
args.extend(args_str.split_whitespace().map(String::from));
}
let c_args: Vec<CString> = args
.into_iter()
.map(|arg| CString::new(arg).unwrap())
.collect();
let mut ptrs: Vec<*const c_char> = c_args.iter().map(|arg| arg.as_ptr()).collect();
unsafe {
nfqws_main(c_args.len() as libc::c_int, ptrs.as_mut_ptr() as *mut _);
}
Ok(())
}

View File

@@ -0,0 +1,15 @@
use clap::Parser;
use zaprett::cli::CliApp;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
pretty_env_logger::init();
let cli = CliApp::parse();
match cli.cmd() {
Some(cmd) => cmd.exec().await?,
None => println!("zaprett installed. Join us: t.me/zaprett_module"),
}
Ok(())
}

View File

@@ -0,0 +1,138 @@
use crate::config::Config;
use crate::daemon::daemonize_nfqws;
use crate::iptables_rust::{clear_iptables_rules, setup_iptables_rules};
use crate::{DEFAULT_START, MODULE_PATH, ZAPRETT_DIR_PATH};
use anyhow::bail;
use log::info;
use nix::sys::signal::{Signal, kill};
use nix::unistd::{Pid, Uid};
use regex::Regex;
use std::borrow::Cow;
use std::io::ErrorKind;
use std::path::Path;
use sysctl::{Ctl, CtlValue, Sysctl};
use sysinfo::{Pid as SysPid, System};
use tokio::fs;
use tokio::io::AsyncReadExt;
pub async fn start_service() -> anyhow::Result<()> {
if !Uid::effective().is_root() {
bail!("Running not from root, exiting");
};
if service_status().await? {
bail!("zaprett already started")
}
println!("Starting zaprett service...");
let tmp_dir = MODULE_PATH.join("tmp");
if tmp_dir.exists() {
fs::remove_dir_all(&tmp_dir).await?;
fs::create_dir_all(&tmp_dir).await?;
}
let config_path = ZAPRETT_DIR_PATH.join("config.json");
let mut config_contents = String::new();
match fs::File::open(&config_path).await {
Ok(mut file) => {
file.read_to_string(&mut config_contents).await?;
}
Err(e) if e.kind() == ErrorKind::NotFound => {
let default_config = Config::default();
let json = serde_json::to_string_pretty(&default_config)?;
if let Some(parent) = config_path.parent() {
fs::create_dir_all(parent).await?;
}
fs::write(&config_path, &json).await?;
config_contents = json;
}
Err(e) => return Err(e.into()),
}
let config: Config = serde_json::from_str(&config_contents)?;
let start = fs::read_to_string(config.strategy())
.await
.map(Cow::Owned)
.unwrap_or(Cow::Borrowed(DEFAULT_START));
let regex_hostlist = Regex::new(r"\$hostlist")?;
let regex_ipsets = Regex::new(r"\$ipset")?;
let regex_zaprettdir = Regex::new(r"\$\{?zaprettdir}?")?;
let mut strat_modified;
let (hosts, ipsets) = config.list_type().merge(&config).await;
strat_modified = regex_hostlist.replace_all(&start, &hosts).into_owned();
strat_modified = regex_ipsets
.replace_all(&strat_modified, &ipsets)
.into_owned();
strat_modified = regex_zaprettdir
.replace_all(&strat_modified, ZAPRETT_DIR_PATH.to_str().unwrap())
.into_owned();
let ctl = Ctl::new("net.netfilter.nf_conntrack_tcp_be_liberal")?;
ctl.set_value(CtlValue::String("1".into()))?;
setup_iptables_rules().expect("setup iptables rules");
daemonize_nfqws(&strat_modified).await;
println!("zaprett service started!");
Ok(())
}
pub async fn stop_service() -> anyhow::Result<()> {
if !Uid::effective().is_root() {
bail!("Running not from root, exiting");
};
if !service_status().await? {
info!("zaprett service already stopped");
return Ok(())
}
clear_iptables_rules().expect("clear iptables rules");
let pid_str = fs::read_to_string(MODULE_PATH.join("tmp/pid.lock")).await?;
let pid = pid_str.trim().parse::<i32>()?;
kill(Pid::from_raw(pid), Signal::SIGKILL)?;
println!("zaprett service stopped");
Ok(())
}
pub async fn restart_service() -> anyhow::Result<()> {
if !Uid::effective().is_root() {
bail!("Running not from root, exiting");
};
stop_service().await?;
start_service().await?;
info!("zaprett service restarted!");
Ok(())
}
pub async fn service_status() -> anyhow::Result<bool> {
if !Uid::effective().is_root() {
bail!("Running not from root, exiting");
};
let pid_i32 = match fs::read_to_string(Path::new(*MODULE_PATH).join("tmp/pid.lock")).await {
Ok(s) => match s.trim().parse::<i32>() {
Ok(pid) => pid,
Err(_) => return Ok(false),
},
Err(_) => return Ok(false),
};
let pid = SysPid::from(pid_i32 as usize);
let system = System::new_all();
if let Some(process) = system.process(pid) {
if process.name() == "zaprett" {
return Ok(true);
}
}
Ok(false)
}

109
rust/justfile Normal file
View File

@@ -0,0 +1,109 @@
set shell := ["bash", "-eu", "-c"]
export ANDROID_API := "21"
export ANDROID_NDK_VERSION := "r27d-linux"
TARGET := `pwd` + "/target"
export NETFILTER_LIBS := TARGET + "/netfilter"
export NDK_HOME := TARGET + "/android-ndk-" + ANDROID_NDK_VERSION
_download_android_ndk:
#!/usr/bin/env bash
if [ ! -d "{{NDK_HOME}}" ]; then
echo "Downloading ndk {{ANDROID_NDK_VERSION}} to {{NDK_HOME}}"
TMPFILE="{{NDK_HOME}}.tmp"
TMPDIR="{{NDK_HOME}}.extracted.tmp"
mkdir -p "$(dirname "$TMPFILE")"
curl -L -C - -o "$TMPFILE" "https://dl.google.com/android/repository/android-ndk-{{ANDROID_NDK_VERSION}}.zip"
unzip "$TMPFILE" -d "$TMPDIR"
inner_folder=$(find "$TMPDIR" -mindepth 1 -maxdepth 1 -type d | head -n 1)
mv -T "$inner_folder" "$NDK_HOME"
rm -rf "$TMPFILE" "$TMPDIR"
echo "Android ndk {{ANDROID_NDK_VERSION}} successfully installed in {{NDK_HOME}}"
else
echo "Android ndk {{ANDROID_NDK_VERSION}} already installed in {{NDK_HOME}}"
fi
_build_netfilter_libs target_arch:
#!/usr/bin/env bash
if [ ! -d "{{NETFILTER_LIBS}}-{{target_arch}}" ]; then
export PATCH="$(pwd)/libnetfilter_queue-android.patch"
cd "{{TARGET}}"
export TOOLCHAIN=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64
export CC="$TOOLCHAIN/bin/clang --target={{target_arch}}$ANDROID_API"
export AR=$TOOLCHAIN/bin/llvm-ar
export AS=$CC
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
export PKG_CONFIG_PATH=$NETFILTER_LIBS-{{target_arch}}/lib/pkgconfig
if [ ! -d "libnfnetlink-1.0.2" ]; then
wget -O- https://www.netfilter.org/pub/libnfnetlink/libnfnetlink-1.0.2.tar.bz2 | tar -xj
fi
if [ ! -d "libmnl-1.0.5" ]; then
wget -O- https://www.netfilter.org/pub/libmnl/libmnl-1.0.5.tar.bz2 | tar -xj
fi
if [ ! -d "libnetfilter_queue-1.0.5" ]; then
wget -O- https://www.netfilter.org/pub/libnetfilter_queue/libnetfilter_queue-1.0.5.tar.bz2 | tar -xj
patch -p1 -d libnetfilter_queue-* -i $PATCH
fi
for i in libmnl libnfnetlink libnetfilter_queue ; do
(
cd $i-*
make clean
CFLAGS="-Os -flto=auto -Wno-implicit-function-declaration" \
./configure --prefix= --host={{target_arch}} --enable-static --disable-shared --disable-dependency-tracking
make -j$(nproc)
make install DESTDIR=$NETFILTER_LIBS-{{target_arch}}
)
sed -i "s|^prefix=.*|prefix=$NETFILTER_LIBS-{{target_arch}}|g" $NETFILTER_LIBS-{{target_arch}}/lib/pkgconfig/$i.pc
done
else
echo "Netfilter libs for {{target_arch}} already built"
fi
_instal_rust_target target:
#!/usr/bin/env bash
if ! rustup target list --installed | grep -q "{{target}}"; then
echo "Installing missing target: {{target}}"
rustup target add "{{target}}"
else
echo "Target already installed: {{target}}"
fi
prepare-android: _download_android_ndk
#!/usr/bin/env bash
cargo install cargo-ndk
build-android *args: prepare-android
#!/usr/bin/env bash
targets=("armv7-linux-androideabi" "aarch64-linux-android" "x86_64-linux-android")
for i in "${!targets[@]}"; do
t=${targets[$i]}
(
echo "Building target $t"
export CFLAGS="-I$NETFILTER_LIBS-$t/include"
export LDFLAGS="-L$NETFILTER_LIBS-$t/lib"
export CXXFLAGS="$CFLAGS"
just _build_netfilter_libs $t
just _instal_rust_target $t
NETFILTER_LIBS=$NETFILTER_LIBS-$t cargo ndk -t $t --platform $ANDROID_API build {{args}}
)
done

View File

@@ -0,0 +1,41 @@
--- a/src/extra/pktbuff.c
+++ b/src/extra/pktbuff.c
@@ -14,7 +14,7 @@
#include <string.h> /* for memcpy */
#include <stdbool.h>
-#include <netinet/if_ether.h>
+#include <linux/if_ether.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
--- a/src/nlmsg.c
+++ b/src/nlmsg.c
@@ -21,7 +21,7 @@
#include <linux/netfilter/nfnetlink_queue.h>
-#include <libnetfilter_queue/libnetfilter_queue.h>
+// #include <libnetfilter_queue/libnetfilter_queue.h>
#include "internal.h"
--- a/src/extra/tcp.c
+++ b/src/extra/tcp.c
@@ -139,12 +139,16 @@ void nfq_tcp_compute_checksum_ipv6(struc
* (union is compatible to any of its members)
* This means this part of the code is -fstrict-aliasing safe now.
*/
+#ifndef __ANDROID__
union tcp_word_hdr {
struct tcphdr hdr;
uint32_t words[5];
};
+#endif
+#ifndef tcp_flag_word
#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words[3])
+#endif
/**
* nfq_pkt_snprintf_tcp_hdr - print tcp header into one buffer in a humnan

View File

@@ -6,30 +6,14 @@ ui_print " / / (_| | |_) | | | __/ |_| |_ "
ui_print " /___\__,_| .__/|_| \\___|\__|\__|"
ui_print " | | "
ui_print " |_| "
ui_print "(!) To download app, use Telegram chat"
ui_print "Module by: egorwhite, Cherret, Huananzhi X99"
ui_print "Apps by: egorwhite, Cherret"
ui_print "(!) To download app, use Telegram channel"
ui_print "Module by: egor-white, Cherret"
ui_print "App by: egor-white, Cherret"
ui_print "####################"
ui_print "Unpacking archive..."
unzip -o "$ZIPFILE" -x 'META-INF/*' -d $MODPATH >&2
ui_print "Creating zaprett directory..."
mkdir /sdcard/zaprett; mkdir /sdcard/zaprett/lists; mkdir /sdcard/zaprett/bin; mkdir /sdcard/zaprett/strategies;
ui_print "Removing old config (config structure changed)..."
rm -f /sdcard/zaprett/config
ui_print "Filling configuration file if not exist..."
if [ ! -f "/sdcard/zaprett/config" ]; then
echo start_on_boot=true > /sdcard/zaprett/config
echo active_lists=/storage/emulated/0/zaprett/lists/list-youtube.txt >> /sdcard/zaprett/config
echo active_exclude_lists= >> /sdcard/zaprett/config
echo list_type=whitelist
echo zaprettdir=/sdcard/zaprett >> /sdcard/zaprett/config
echo strategy="" >> /sdcard/zaprett/config
fi
ui_print "Copying lists and binaries to /sdcard/zaprett..."
cp -r $MODPATH/system/etc/zaprett/. /sdcard/zaprett/
@@ -37,36 +21,24 @@ ui_print "Copying files to /bin"
arch=$(uname -m)
case "$arch" in
"x86_64")
nfqws="nfqws_x86_64"
;;
"i386"|"i686")
nfqws="nfqws_x86"
zaprett_bin="zaprett-x86_64"
;;
"armv7l"|"arm")
nfqws="nfqws_arm32"
zaprett_bin="zaprett-armv7"
;;
"aarch64"|"armv8l")
nfqws="nfqws_arm64"
;;
"mips")
nfqws="nfqws_mips"
;;
"mipsel")
nfqws="nfqws_mipsel"
zaprett_bin="zaprett-aarch64"
;;
*)
ui_print "Unknown arch: $arch"
abort
;;
esac
mv $MODPATH/system/bin/$nfqws $MODPATH/system/bin/nfqws
rm $MODPATH/system/bin/nfqws_*
mv $MODPATH/system/bin/$zaprett_bin $MODPATH/system/bin/zaprett
rm $MODPATH/system/bin/zaprett-*
mkdir $MODPATH/tmp
ui_print "Setting permissions..."
chmod 777 /sdcard/zaprett; chmod 777 $MODPATH/service.sh
ui_print "Cleaning temp files..."
rm -rf $MODPATH/system/etc/zaprett
ui_print "Installation done. Telegram chat: https://t.me/zaprett_module"
ui_print "Installation done. Join us in Telegram: https://t.me/zaprett_module"

View File

@@ -1,11 +1,9 @@
#!/system/bin/sh
while [ -z "$(getprop sys.boot_completed)" ]; do sleep 2; done
sleep 15
source /storage/emulated/0/zaprett/config
if [ "$autorestart" = "true" ]; then
if [ -f "/data/adb/modules/zaprett/autostart" ]; then
su -c "zaprett start"
while true; do
sleep 3600
su -c "zaprett restart"
done
done
fi

View File

@@ -1,108 +0,0 @@
#!/system/bin/sh
source /sdcard/zaprett/config
clear_iptables_rules() {
iptables -t mangle -D POSTROUTING -j NFQUEUE --queue-num 200 --queue-bypass 2>/dev/null
iptables -t mangle -D PREROUTING -j NFQUEUE --queue-num 200 --queue-bypass 2>/dev/null
iptables -t filter -D FORWARD -j NFQUEUE --queue-num 200 --queue-bypass 2>/dev/null
}
start_service() {
rm -f /data/adb/modules/zaprett/tmp/*
echo "Starting zaprett..."
hostlist=""
case "$list_type" in
whitelist)
lists="$active_lists"
opt="--hostlist"
;;
blacklist)
lists="$active_exclude_lists"
opt="--hostlist-exclude"
;;
*)
echo "Unknown list-type: $list_type" >&2
lists=""
opt=""
;;
esac
if [ -n "$lists" ] && [ -n "$opt" ]; then
for itm in $(echo "$lists" | tr ',' ' ' | sort -u); do
if [ -f "$itm" ]; then
dst="/data/adb/modules/zaprett/tmp/$(basename "$itm")"
cp "$itm" "$dst"
case "$hostlist" in
*"$opt=$dst"*) ;;
*) hostlist="$hostlist $opt=$dst" ;;
esac
fi
done
fi
config=""
if [[ -n "$strategy" && -f "$strategy" ]]; then
config="$(eval "echo \"$(<"$strategy")\"")"
fi
if [[ -z "$config" ]]; then
config="--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig,badsum $hostlist --new"
config="$config --filter-tcp=443 $hostlist --dpi-desync=fake,split2 --dpi-desync-repeats=6 --dpi-desync-fooling=md5sig,badsum --dpi-desync-fake-tls=${zaprettdir}/bin/tls_clienthello_www_google_com.bin --new"
config="$config --filter-tcp=80,443 --dpi-desync=fake,disorder2 --dpi-desync-repeats=6 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig,badsum $hostlist --new"
config="$config --filter-udp=50000-50100 --dpi-desync=fake --dpi-desync-any-protocol --dpi-desync-fake-quic=0xC30000000108 --new"
config="$config --filter-udp=443 $hostlist --dpi-desync=fake --dpi-desync-repeats=6 --dpi-desync-fake-quic=${zaprettdir}/bin/quic_initial_www_google_com.bin --new"
config="$config --filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 $hostlist"
fi
sysctl net.netfilter.nf_conntrack_tcp_be_liberal=1 > /dev/null
iptables -t mangle -I POSTROUTING -j NFQUEUE --queue-num 200 --queue-bypass
iptables -t mangle -I PREROUTING -j NFQUEUE --queue-num 200 --queue-bypass
iptables -t filter -A FORWARD -j NFQUEUE --queue-num 200 --queue-bypass
nfqws --uid=0:0 --qnum=200 $config > /dev/null &
echo "zaprett service started!"
}
stop_service() {
echo "Stopping zaprett..."
clear_iptables_rules
kill "$(pidof nfqws)" 2>/dev/null
rm -f /data/adb/modules/zaprett/tmp/*
echo "zaprett service stopped!"
}
if [ "$1" == "start" ]; then
start_service
fi
if [ "$1" == "stop" ]; then
stop_service
fi
if [ "$1" == "status" ]; then
pidof "nfqws" > /dev/null && echo "zaprett is working" || echo "zaprett is stopped"
fi
if [ "$1" == "restart" ]; then
stop_service
start_service
echo "zaprett service restarted!"
fi
if [ "$1" == "help" ]; then
echo -e "Помощь по модулю zaprett:\nzaprett start - запуск сервиса\nzaprett stop - остановка сервиса\nzaprett restart - перезапуск сервиса\nzaprett status - статус сервиса\nzaprett module-ver - версия модуля\nzaprett bin-ver - версия бинарных файлов"
fi
if [ "$1" == "module-ver" ]; then
grep 'version=' /data/adb/modules/zaprett/module.prop | sed 's/version=//'
fi
if [ "$1" == "bin-ver" ]; then
nfqws --version | grep -o 'version v[0-9.]*' | head -n1 | cut -d' ' -f2
fi
if [[ -z $1 ]]; then
echo "zaprett installed. Telegram: t.me/zaprett_module"
fi

View File

@@ -1,6 +1,6 @@
{
"version": "4.9",
"versionCode": 49,
"zipUrl": "https://github.com/egor-white/zaprett/releases/download/4.9.0/zaprett-hosts.zip",
"version": "6.3",
"versionCode": 63,
"zipUrl": "https://github.com/egor-white/zaprett/releases/download/6.3.0/zaprett-hosts.zip",
"changelog": "https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/changelog.md"
}

View File

@@ -1,6 +1,6 @@
{
"version": "4.9",
"versionCode": 49,
"zipUrl": "https://github.com/egor-white/zaprett/releases/download/4.9.0/zaprett-tv.zip",
"version": "6.0",
"versionCode": 60,
"zipUrl": "https://github.com/egor-white/zaprett/releases/download/6.0.0/zaprett.zip",
"changelog": "https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/changelog.md"
}

View File

@@ -1,6 +1,6 @@
{
"version": "4.9",
"versionCode": 49,
"zipUrl": "https://github.com/egor-white/zaprett/releases/download/4.9.0/zaprett.zip",
"version": "6.3",
"versionCode": 63,
"zipUrl": "https://github.com/egor-white/zaprett/releases/download/6.3.0/zaprett.zip",
"changelog": "https://raw.githubusercontent.com/egor-white/zaprett/refs/heads/main/changelog.md"
}