update:
+ delete template for Clash + add dashboard files + add readme_en.md + modified iptables script with some improvements + improve box_service.sh, and customize.sh + fix: update kernel + optimize BFM script
This commit is contained in:
0
.github/workflows/del.yml
vendored
Normal file → Executable file
0
.github/workflows/del.yml
vendored
Normal file → Executable file
@@ -1,8 +1,9 @@
|
||||
# Box for Magisk
|
||||
|
||||
[README ID](index_id.md) || [README EN](index_en.md)
|
||||
[README ID](index_id.md) || [README EN](index_en.md) || [README CN](index_cn.md)
|
||||
|
||||
[]()
|
||||
[](https://github.com/taamarin/box_for_magisk/releases)
|
||||
|
||||
A fork of [CHIZI-0618/box4magisk](https://github.com/CHIZI-0618/box4magisk)
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,10 +1,14 @@
|
||||
#!/system/bin/sh
|
||||
|
||||
(
|
||||
until [ $(getprop init.svc.bootanim) = "stopped" ] ; do
|
||||
sleep 3
|
||||
done
|
||||
until [ $(getprop init.svc.bootanim) = "stopped" ]; do
|
||||
sleep 3
|
||||
done
|
||||
|
||||
chmod 755 /data/adb/box/scripts/start.sh
|
||||
/data/adb/box/scripts/start.sh
|
||||
if [ -f "/data/adb/box/scripts/start.sh" ]; then
|
||||
chmod 755 /data/adb/box/scripts/*
|
||||
/data/adb/box/scripts/start.sh
|
||||
else
|
||||
echo "File '/data/adb/box/scripts/start.sh' not found"
|
||||
fi
|
||||
)&
|
||||
2
build.sh
2
build.sh
@@ -1,3 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
zip -r -o -X -ll box_for_magisk-$(cat module.prop | grep 'version=' | awk -F '=' '{print $2}').zip ./ -x '.git/*' -x 'index_id.md' -x 'CHANGELOG.md' -x 'update.json' -x 'build.sh' -x '.github/*'
|
||||
zip -r -o -X -ll box_for_magisk-$(cat module.prop | grep 'version=' | awk -F '=' '{print $2}').zip ./ -x '.git/*' -x 'index_id.md' -x 'index_en.md' -x 'CHANGELOG.md' -x 'update.json' -x 'build.sh' -x '.github/*'
|
||||
188
customize.sh
188
customize.sh
@@ -27,21 +27,25 @@ else
|
||||
ui_print "- Device sdk: $API"
|
||||
fi
|
||||
|
||||
# check architecture
|
||||
if [ "$ARCH" != "arm" ] && [ "$ARCH" != "arm64" ] && [ "$ARCH" != "x86" ] && [ "$ARCH" != "x64" ]; then
|
||||
abort "! Unsupported platform: $ARCH"
|
||||
else
|
||||
ui_print "- Device platform: $ARCH"
|
||||
fi
|
||||
ui_print "- check architecture"
|
||||
case $ARCH in
|
||||
arm|arm64|x86|x64)
|
||||
ui_print "- Device platform: $ARCH"
|
||||
;;
|
||||
*)
|
||||
abort "! Unsupported platform: $ARCH"
|
||||
;;
|
||||
esac
|
||||
|
||||
ui_print "- Installing Box for Magisk"
|
||||
|
||||
if [ -d "/data/adb/box" ] ; then
|
||||
ui_print "- Backup box"
|
||||
mkdir -p /data/adb/box/${latest}
|
||||
mv /data/adb/box/* /data/adb/box/${latest}/
|
||||
mkdir -p "/data/adb/box/${latest}"
|
||||
mv /data/adb/box/* "/data/adb/box/${latest}/"
|
||||
fi
|
||||
|
||||
ui_print "- Set architecture ${ARCH}"
|
||||
case "${ARCH}" in
|
||||
arm)
|
||||
architecture="armv7"
|
||||
@@ -55,71 +59,133 @@ case "${ARCH}" in
|
||||
x64)
|
||||
architecture="amd64"
|
||||
;;
|
||||
*)
|
||||
abort "Error: Unsupported architecture ${ARCH}"
|
||||
;;
|
||||
esac
|
||||
|
||||
ui_print "- Mkdir BFM folder"
|
||||
mkdir -p ${MODPATH}/system/bin
|
||||
mkdir -p ${MODPATH}/system/etc/security/cacerts
|
||||
mkdir -p /data/adb/box
|
||||
mkdir -p /data/adb/box/bin
|
||||
mkdir -p /data/adb/box/dashboard
|
||||
mkdir -p /data/adb/box/run
|
||||
mkdir -p /data/adb/box/scripts
|
||||
mkdir -p /data/adb/box/xray
|
||||
mkdir -p /data/adb/box/v2fly
|
||||
mkdir -p /data/adb/box/sing-box
|
||||
mkdir -p /data/adb/box/clash
|
||||
ui_print "- Create directories"
|
||||
mkdir -p "${MODPATH}/system/bin"
|
||||
mkdir -p "${MODPATH}/system/etc/security/cacerts"
|
||||
mkdir -p "/data/adb/box"
|
||||
mkdir -p "/data/adb/box/bin"
|
||||
mkdir -p "/data/adb/box/run"
|
||||
mkdir -p "/data/adb/box/scripts"
|
||||
mkdir -p "/data/adb/box/xray"
|
||||
mkdir -p "/data/adb/box/v2fly"
|
||||
mkdir -p "/data/adb/box/sing-box"
|
||||
mkdir -p "/data/adb/box/clash"
|
||||
mkdir -p "/data/adb/box/dashboard"
|
||||
mkdir -p "/data/adb/box/clash/dashboard"
|
||||
mkdir -p "/data/adb/box/sing-box/dashboard"
|
||||
|
||||
ui_print "- Extracting BFM files"
|
||||
unzip -o "${ZIPFILE}" -x 'META-INF/*' -d ${MODPATH} >&2
|
||||
unzip -j -o "${ZIPFILE}" 'uninstall.sh' -d ${MODPATH} >&2
|
||||
ui_print "- Extract the ZIP file and skip the META-INF folder into the ${MODPATH} folder"
|
||||
unzip -o "${ZIPFILE}" -x 'META-INF/*' -d "${MODPATH}" >&2
|
||||
|
||||
ui_print "- Extract the files uninstall.sh and box_service.sh into the ${MODPATH} folder and /data/adb/service.d"
|
||||
unzip -j -o "${ZIPFILE}" 'uninstall.sh' -d "${MODPATH}" >&2
|
||||
unzip -j -o "${ZIPFILE}" 'box_service.sh' -d /data/adb/service.d >&2
|
||||
tar -xjf ${MODPATH}/binary/${ARCH}.tar.bz2 -C ${MODPATH}/system/bin >&2
|
||||
|
||||
ui_print "- Create resolv.conf"
|
||||
if [ ! -f "/system/etc/resolv.conf" ] ; then
|
||||
touch ${MODPATH}/system/etc/resolv.conf
|
||||
echo nameserver 8.8.8.8 > ${MODPATH}/system/etc/resolv.conf
|
||||
echo nameserver 9.9.9.9 >> ${MODPATH}/system/etc/resolv.conf
|
||||
echo nameserver 1.1.1.1 >> ${MODPATH}/system/etc/resolv.conf
|
||||
echo nameserver 149.112.112.112 >> ${MODPATH}/system/etc/resolv.conf
|
||||
fi
|
||||
ui_print "- Extract the files from the binary archive and copy them to the /system/bin and /data/adb/box/bin"
|
||||
tar -xjf "${MODPATH}/binary/${ARCH}.tar.bz2" -C "${MODPATH}/system/bin" >&2
|
||||
tar -xjf "${MODPATH}/binary/${ARCH}.tar.bz2" "mlbox" -C /data/adb/box/bin >&2
|
||||
|
||||
ui_print "- Extract the dashboard.zip file to the folder /data/adb/box/clash/dashboard and /data/adb/box/sing-box/dashboard"
|
||||
unzip -o "${MODPATH}/dashboard.zip" -d /data/adb/box/dashboard/ >&2
|
||||
unzip -o "${MODPATH}/dashboard.zip" -d /data/adb/box/clash/dashboard/ >&2
|
||||
unzip -o "${MODPATH}/dashboard.zip" -d /data/adb/box/sing-box/dashboard/ >&2
|
||||
|
||||
ui_print ""
|
||||
ui_print "--------------------------------------------------------"
|
||||
ui_print "- Are you going to create a resolve.conf file?"
|
||||
ui_print "- Press Vol Up: to create the resolve.conf file."
|
||||
ui_print "- Press Vol Down: to ignore the resolve.conf file."
|
||||
while true ; do
|
||||
getevent -lc 1 2>&1 | grep KEY_VOLUME > $TMPDIR/events
|
||||
sleep 1
|
||||
if $(cat $TMPDIR/events | grep -q KEY_VOLUMEUP) ; then
|
||||
ui_print "- Create a resolve.conf file if it doesn't already exist and add server nameservers."
|
||||
if [ ! -f "/data/adb/modules/box_for_magisk/system/etc/resolv.conf" ]; then
|
||||
cat > "${MODPATH}/system/etc/resolv.conf" <<EOF
|
||||
nameserver 8.8.8.8
|
||||
nameserver 1.1.1.1
|
||||
nameserver 9.9.9.9
|
||||
nameserver 94.140.14.14
|
||||
EOF
|
||||
ui_print "[+] /data/adb/modules/box_for_magisk/system/etc/resolv.conf"
|
||||
ui_print "[+] nameserver 8.8.8.8"
|
||||
ui_print "[+] nameserver 1.1.1.1"
|
||||
ui_print "[+] nameserver 9.9.9.9"
|
||||
ui_print "[+] nameserver 94.140.14.14"
|
||||
fi
|
||||
break
|
||||
elif $(cat $TMPDIR/events | grep -q KEY_VOLUMEDOWN) ; then
|
||||
ui_print "- ignore creating file resolve.conf"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
ui_print "- Move BFM files"
|
||||
mv ${MODPATH}/scripts/cacert.pem ${MODPATH}/system/etc/security/cacerts
|
||||
mv ${MODPATH}/scripts/bin/mlbox /data/adb/box/bin/
|
||||
mv ${MODPATH}/scripts/src/* /data/adb/box/scripts/
|
||||
mv ${MODPATH}/scripts/clash/* /data/adb/box/clash/
|
||||
mv ${MODPATH}/scripts/settings.ini /data/adb/box/
|
||||
mv ${MODPATH}/scripts/template.yml /data/adb/box/
|
||||
mv ${MODPATH}/scripts/xray /data/adb/box/
|
||||
mv ${MODPATH}/scripts/v2fly /data/adb/box/
|
||||
mv ${MODPATH}/scripts/sing-box /data/adb/box/
|
||||
mv "$MODPATH/scripts/cacert.pem" "$MODPATH/system/etc/security/cacerts"
|
||||
mv "$MODPATH/scripts/src/"* "/data/adb/box/scripts/"
|
||||
mv "$MODPATH/scripts/clash/"* "/data/adb/box/clash/"
|
||||
mv "$MODPATH/scripts/settings.ini" "/data/adb/box/"
|
||||
mv "$MODPATH/scripts/xray" "/data/adb/box/"
|
||||
mv "$MODPATH/scripts/v2fly" "/data/adb/box/"
|
||||
mv "$MODPATH/scripts/sing-box" "/data/adb/box/"
|
||||
|
||||
ui_print "- Delete leftover files"
|
||||
rm -rf ${MODPATH}/scripts
|
||||
rm -rf ${MODPATH}/binary
|
||||
rm -rf ${MODPATH}/box_service.sh
|
||||
rm -rf "${MODPATH}/scripts"
|
||||
rm -rf "${MODPATH}/binary"
|
||||
rm -f "${MODPATH}/box_service.sh"
|
||||
rm -f "${MODPATH}/dashboard.zip"
|
||||
sleep 1
|
||||
ui_print "- Setting permissions"
|
||||
set_perm_recursive ${MODPATH} 0 0 0755 0644
|
||||
set_perm_recursive /data/adb/box/ 0 3005 0755 0644
|
||||
set_perm_recursive /data/adb/box/scripts/ 0 3005 0755 0700
|
||||
set_perm_recursive /data/adb/box/dashboard/ 0 3005 0755 0700
|
||||
set_perm /data/adb/service.d/box_service.sh 0 0 0755
|
||||
set_perm ${MODPATH}/service.sh 0 0 0755
|
||||
set_perm ${MODPATH}/uninstall.sh 0 0 0755
|
||||
set_perm ${MODPATH}/system/etc/security/cacerts/cacert.pem 0 0 0644
|
||||
set_perm /data/adb/box/bin/mlbox 0 0 0755
|
||||
set_perm /data/adb/box/scripts/box.service 0 0 0755
|
||||
set_perm /data/adb/box/scripts/box.tool 0 0 0755
|
||||
set_perm /data/adb/box/scripts/start.sh 0 0 0755
|
||||
set_perm /data/adb/box/scripts/box.iptables 0 0 0755
|
||||
set_perm /data/adb/box/scripts/box.inotify 0 0 0755
|
||||
|
||||
chmod ugo+x /data/adb/box/bin/*
|
||||
chmod ugo+x ${MODPATH}/system/bin/*
|
||||
ui_print "- Setting permissions"
|
||||
set_perm_recursive "${MODPATH}" 0 0 0755 0644
|
||||
set_perm_recursive "/data/adb/box/" 0 3005 0755 0644
|
||||
set_perm_recursive "/data/adb/box/scripts/" 0 3005 0755 0700
|
||||
set_perm "/data/adb/service.d/box_service.sh" 0 0 0755
|
||||
set_perm "${MODPATH}/service.sh" 0 0 0755
|
||||
set_perm "${MODPATH}/uninstall.sh" 0 0 0755
|
||||
set_perm "${MODPATH}/system/etc/security/cacerts/cacert.pem" 0 0 0644
|
||||
set_perm ${MODPATH}/system/bin/curl 0 0 0755
|
||||
|
||||
set_perm /data/adb/box/scripts/box.inotify 0 0 0755
|
||||
set_perm /data/adb/box/scripts/box.service 0 0 0755
|
||||
set_perm /data/adb/box/scripts/box.iptables 0 0 0755
|
||||
set_perm /data/adb/box/scripts/box.tool 0 0 0755
|
||||
set_perm /data/adb/box/scripts/start.sh 0 0 0755
|
||||
set_perm /data/adb/box/bin/mlbox 0 0 0755
|
||||
|
||||
sleep 1
|
||||
|
||||
ui_print ""
|
||||
ui_print "--------------------------------------------------------"
|
||||
ui_print "- Have you downloaded KERNEL and GEOX?"
|
||||
ui_print "- Make sure you have a good internet connection."
|
||||
ui_print "- Press Vol Up: to download GEOX and KERNEL."
|
||||
ui_print "- Press Vol Down: to ignore downloading GEOX and KERNEL."
|
||||
while true ; do
|
||||
getevent -lc 1 2>&1 | grep KEY_VOLUME > $TMPDIR/events
|
||||
sleep 1
|
||||
if $(cat $TMPDIR/events | grep -q KEY_VOLUMEUP) ; then
|
||||
ui_print "- it will take a while...."
|
||||
if [ ! -f /data/adb/box/run/box.pid ]; then
|
||||
/data/adb/box/scripts/box.tool all && echo "- downloads are complete."
|
||||
else
|
||||
ui_print " - BFM service is still running, Cannot update geo and kernel, as it will cause conflicts"
|
||||
ui_print " - Download manually after reboot is complete"
|
||||
fi
|
||||
break
|
||||
elif $(cat $TMPDIR/events | grep -q KEY_VOLUMEDOWN) ; then
|
||||
ui_print "- ignore download GEOX and KERNEL"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
ui_print "- Installation is complete, reboot your device"
|
||||
ui_print ""
|
||||
ui_print " --- Notes --- "
|
||||
ui_print "[+] report issues to @taamarin on Telegram"
|
||||
ui_print "[+] Join @taamarin on telegram to get more updates"
|
||||
BIN
dashboard.zip
Normal file
BIN
dashboard.zip
Normal file
Binary file not shown.
124
index_en.md
Normal file
124
index_en.md
Normal file
@@ -0,0 +1,124 @@
|
||||
## WARNING
|
||||
This project is not responsible for: damaged devices, damaged SD cards, or burnt SoCs.
|
||||
|
||||
**Make sure your configuration file does not cause traffic loopback, otherwise it may cause your phone to restart endlessly.**
|
||||
|
||||
If you really don't know how to configure this module, you may need an application like ClashForAndroid, v2rayNG, Surfboard, SagerNet, AnXray, etc.
|
||||
|
||||
## Installation
|
||||
- Download the module zip package from RELEASE and install it via MAGISK. Then reboot.
|
||||
- Make sure you are connected to the internet, and execute the following command to download binaries etc:
|
||||
```shell
|
||||
su -c /data/adb/box/scripts/box.tool upyacd
|
||||
```
|
||||
```shell
|
||||
su -c /data/adb/box/scripts/box.tool subgeo
|
||||
```
|
||||
```shell
|
||||
su -c /data/adb/box/scripts/box.tool upcore
|
||||
```
|
||||
|
||||
- Support for the next online module update in Magisk Manager (updating the module will take effect without rebooting).
|
||||
|
||||
### Notes
|
||||
This module includes:
|
||||
- [clash](https://github.com/Dreamacro/clash)、
|
||||
- [clash.meta](https://github.com/MetaCubeX/Clash.Meta)、[sing-box](https://github.com/SagerNet/sing-box)、
|
||||
- [v2ray-core](https://github.com/v2fly/v2ray-core)、
|
||||
- [Xray-core](https://github.com/XTLS/Xray-core).
|
||||
- [sing-box]().
|
||||
|
||||
After installing the module, download the appropriate core file for your device's architecture and place it in the /data/adb/box/bin/ directory, or execute:
|
||||
|
||||
```shell
|
||||
su -c /data/adb/box/scripts/box.tool upcore
|
||||
```
|
||||
|
||||
## konfigurasi
|
||||
- bin_name:
|
||||
- clash
|
||||
- xray
|
||||
- v2ray
|
||||
- sing-box
|
||||
|
||||
- Each core works in the directory `/data/adb/box/bin/${bin_name}`, and the core name is determined by `bin_name` in the file `BFM`.
|
||||
- Each core configuration file needs to be customized by the user, and the scripts will check the validity of the configuration, and the check result will be saved in the file `/data/adb/box/run/runs.log.`
|
||||
- Tip: `clash` and `sing-box` come with ready-to-work default configurations with the transparent proxy script. For further configuration, see the official documentation. Address: [dokumen clash](https://github.com/Dreamacro/clash/wiki/configuration), [dokumen sing-box](https://sing-box.sagernet.org/configuration/outbound/)
|
||||
|
||||
|
||||
## Instructions
|
||||
### Conventional method (standard & recommended method)
|
||||
#### Start and stop management services
|
||||
**Layanan inti berikut secara kolektif disebut sebagai `BFM`**
|
||||
- The following core services are collectively referred to as `BFM`
|
||||
- You can enable or disable the module through the Magisk Manager application **in real time** to start or stop the `BFM` service, **without restarting the device**. Starting the service may take a few seconds, and stopping the service can take effect immediately.
|
||||
|
||||
#### Select applications (APPs) that require proxy
|
||||
- `BFM` defaults to proxying all applications (APPs) for all Android users.
|
||||
- If you want `BFM` to proxy all applications (APP), except for certain ones, please open the file `/data/adb/box/settings.ini` and change the value of `proxy_mode` to `blacklist` (default), add packages to `packages_list`, for example: `packages_list=("com.termux" "org.telegram.messenger")`
|
||||
- Use `whitelist` if you only want to proxy certain applications (APP).
|
||||
- When the value of `proxy_mode` is `core/tun`, transparent proxy will not work, only the corresponding kernel will start, which can be used to support TUN, currently only `clash` and `sing-box` are available.
|
||||
|
||||
### Advanced usage
|
||||
#### Changing proxy mode
|
||||
- `BFM` uses `TPROXY` to transparently proxy TCP + UDP (default). If it detects that the device does not support TPROXY, open `/data/adb/box/settings.ini` and change `network_mode="redirect"` to use `redirect` for TCP proxy only.
|
||||
- Open the file `/data/adb/box/settings.ini`, change the value of network_mode to redirect, tproxy, or mixed.
|
||||
- redirect: `redirec TCP only.`
|
||||
- tproxy: `tproxy TCP + UDP.`
|
||||
- mixed: `redirec TCP + tun UDP.`
|
||||
|
||||
#### Bypass transparent proxy when connecting to Wi-Fi or hotspot
|
||||
- `BFM` transparently proxies localhost and hotspot (including USB tethering) by default.
|
||||
- Open the file `/data/adb/box/settings.ini`, modify `ignore_out_list` and add `wlan+`, then transparent proxy will bypass wlan, and hotspot won't connect to the proxy.
|
||||
- Open the file `/data/adb/box/settings.ini`, modify `ap_list` and add `wlan+`. `BFM` will proxy the hotspot (for MediaTek devices, it may be ap+ / wlan+).
|
||||
- Use the ifconfig command in the terminal to find out the name of the AP.
|
||||
|
||||
#### Enter manual mode
|
||||
- If you want to fully control `BFM` by running commands, just create a new file `/data/adb/box/manual`. In this case, the `BFM` service will not start automatically when your device is turned on, and you also cannot set the start or stop of the service through the Magisk Manager app.
|
||||
|
||||
#### Starting and stopping the management service
|
||||
The `BFM` service script is /data/adb/box/scripts/box.service
|
||||
|
||||
- Start `BFM`:
|
||||
```shell
|
||||
su -c /data/adb/box/scripts/box.service start
|
||||
```
|
||||
- Stop `BFM`:
|
||||
```shell
|
||||
su -c /data/adb/box/scripts/box.service stop
|
||||
```
|
||||
|
||||
- The terminal will print logs and output them to a log file simultaneously.
|
||||
|
||||
#### Manage whether transparent proxy is enabled
|
||||
- The transparent proxy script is `/data/adb/box/scripts/box.tproxy`
|
||||
|
||||
- Enable transparent proxy:
|
||||
```shell
|
||||
su -c /data/adb/box/scripts/box.tproxy enable
|
||||
```
|
||||
|
||||
- Disable transparent proxy:
|
||||
```shell
|
||||
su -c /data/adb/box/scripts/box.tproxy disable
|
||||
```
|
||||
|
||||
## Other instructions
|
||||
- When modifying any of the core configuration files, please ensure that the tproxy related configurations are consistent with the definitions in the `/data/adb/box/settings.ini` file.
|
||||
- If the machine has a **public IP address**, add the IP to the intranet in the `/data/adb/box/settings.ini` file to prevent traffic loops.
|
||||
- Logs for the `BFM` service can be found in the `/data/adb/box/run` directory.
|
||||
|
||||
|
||||
## Uninstall
|
||||
- Removing the installation of this module from Magisk Manager will remove `/data/adb/service.d/box_service.sh` and keep the `BFM` data directory at /data/adb/box.
|
||||
- You can use the following commands to remove the `BFM` data:
|
||||
|
||||
```shell
|
||||
su -c rm -rf /data/adb/box
|
||||
```
|
||||
```shell
|
||||
su -c rm -rf /data/adb/service.d/box_service.sh
|
||||
```
|
||||
|
||||
## CHANGELOG
|
||||
[CHANGELOG](CHANGELOG.md)
|
||||
0
index_id.md
Normal file → Executable file
0
index_id.md
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
id=box_for_magisk
|
||||
name=Box for Magisk
|
||||
version=v0.2.1
|
||||
version=v0.4
|
||||
versionCode=20230220
|
||||
author=t@amarin
|
||||
description=use sing-box, clash, v2ray, and xray for tunnel proxy on android device
|
||||
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
proxies:
|
||||
@@ -1,17 +1,193 @@
|
||||
redir-port: 9797
|
||||
tproxy-port: 9898
|
||||
mode: rule
|
||||
allow-lan: true
|
||||
unified-delay: true
|
||||
bind-address: '*'
|
||||
# info / warning / error / debug / silent
|
||||
log-level: silent
|
||||
ipv6: false
|
||||
geodata-mode: true
|
||||
geodata-loader: memconservative
|
||||
external-controller: 0.0.0.0:9090
|
||||
# external-controller-tls: 0.0.0.0:9091 # RESTful API HTTPS device
|
||||
# secret: "123456"
|
||||
external-ui: ./dashboard/dist
|
||||
# tcp-concurrent: false
|
||||
# inbound-tfo: false
|
||||
# global-client-fingerprint: chrome
|
||||
# interface-name: "rmnet_data+"
|
||||
# routing-mark: 233
|
||||
geox-url:
|
||||
mmdb: "https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb"
|
||||
geoip: "https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geoip.dat"
|
||||
geosite: "https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geosite.dat"
|
||||
find-process-mode: strict # always, strict, off
|
||||
|
||||
profile:
|
||||
store-selected: true
|
||||
store-fake-ip: false
|
||||
|
||||
# experimental:
|
||||
# sniff-tls-sni: false
|
||||
# udp-fallback-match: false
|
||||
|
||||
# sniffer:
|
||||
# enable: false
|
||||
# ## 对 redir-host 类型识别的流量进行强制嗅探
|
||||
# ## 如:Tun、Redir 和 TProxy 并 DNS 为 redir-host 皆属于
|
||||
# force-dns-mapping: true
|
||||
# parse-pure-ip: true
|
||||
# override-destination: true
|
||||
# sniff:
|
||||
# TLS:
|
||||
# # ports:[443, 8443]
|
||||
# HTTP:
|
||||
# ports: [80, 8080-8880]
|
||||
# override-destination: true
|
||||
# force-domain:
|
||||
# - +.v2ex.com
|
||||
# # skip-domain:
|
||||
# # - +.google.com
|
||||
# sniffing:
|
||||
# - tls
|
||||
# - http
|
||||
# port-whitelist:
|
||||
# - "80"
|
||||
# - "443"
|
||||
|
||||
# tun:
|
||||
# enable: true
|
||||
# # biarkan default utun
|
||||
# device: utun
|
||||
# mtu: 9000
|
||||
# # gvisor / lwip / system
|
||||
# stack: system
|
||||
# dns-hijack:
|
||||
# - any:53
|
||||
# # bagi yg awam, kalau TUN on wajib true, only armv8/64
|
||||
# auto-route: true
|
||||
# auto-detect-interface: true
|
||||
# # end
|
||||
# inet4-address: 172.19.0.1/30
|
||||
# inet6-address: [fdfe:dcba:9876::1/126]
|
||||
# strict_route: false
|
||||
# # include_android_user:
|
||||
# # - 0
|
||||
# # - 10
|
||||
# # include_package:
|
||||
# # - com.android.chrome
|
||||
# # exclude_package:
|
||||
# # - com.android.captiveportallogin
|
||||
|
||||
dns:
|
||||
enable: true
|
||||
ipv6: false
|
||||
prefer-h3: true
|
||||
default-nameserver:
|
||||
# cloudflare
|
||||
- '1.1.1.1#BFM'
|
||||
# google
|
||||
- '8.8.8.8'
|
||||
listen: 0.0.0.0:1053
|
||||
use-hosts: true
|
||||
# redir-host / fake-ip
|
||||
enhanced-mode: fake-ip
|
||||
fake-ip-range: 28.0.0.1/8
|
||||
fake-ip-filter:
|
||||
- '+.lan'
|
||||
nameserver:
|
||||
# cloudflare
|
||||
- '1.1.1.1'
|
||||
- 'tls://1.0.0.1:853#BFM'
|
||||
# google
|
||||
- '8.8.8.8#BFM'
|
||||
- 'tls://8.8.4.4:853'
|
||||
# proxy-server-nameserver:
|
||||
# - '1.1.1.1'
|
||||
# nameserver-policy: { "geosite:youtube": [1.1.1.1, 8.8.8.8] }
|
||||
|
||||
# fallback:
|
||||
# - 'https://8.8.8.8/dns-query'
|
||||
# - 'tcp://8.8.4.4'
|
||||
# - 'quic://dns.adguard.com:784'
|
||||
# fallback-filter:
|
||||
# geoip: false
|
||||
# geoip-code: 'ID'
|
||||
# geosite:
|
||||
# # - gfw
|
||||
# ipcidr:
|
||||
# # - 240.0.0.0/4
|
||||
# domain:
|
||||
# - '+.google.com'
|
||||
# - '+.facebook.com'
|
||||
# - '+.youtube.com'
|
||||
# - '+.github.com'
|
||||
|
||||
hosts:
|
||||
# block update system android
|
||||
'ota.googlezip.net': 127.0.0.1
|
||||
'ota-cache1.googlezip.net': 127.0.0.1
|
||||
'ota-cache2.googlezip.net': 127.0.0.1
|
||||
|
||||
proxies:
|
||||
proxy-groups:
|
||||
- name: "llycoris"
|
||||
type: select
|
||||
use: [
|
||||
🌸
|
||||
]
|
||||
- { name: 'BFM', type: select, use: ["@BFM"] }
|
||||
- { name: 'block', type: select, proxies: ["REJECT", "BFM"] }
|
||||
proxy-providers:
|
||||
🌸:
|
||||
'@BFM':
|
||||
type: file
|
||||
path: ./assets/llycoris.txt
|
||||
path: ./provide/domestic.yml
|
||||
# filter: 'xxx' # Mendukung ekspresi reguler untuk memfilter berdasarkan nama node
|
||||
# exclude-filter: 'ctb' # Mendukung ekspresi reguler untuk dikecualikan berdasarkan nama node
|
||||
# exclude-type: 'ss|http' # Tidak mendukung ekspresi reguler, dipisahkan dengan '|', dikecualikan menurut jenis node
|
||||
health-check:
|
||||
enable: true
|
||||
url: http://cp.cloudflare.com/generate_204
|
||||
url: http://www.gstatic.com/generate_204
|
||||
interval: 1200
|
||||
rules:
|
||||
- MATCH,llycoris
|
||||
## block ads
|
||||
- DOMAIN-SUFFIX,googlesyndication.com,BFM
|
||||
|
||||
## block iklan
|
||||
# - AND,((GEOSITE,category-ads-all),(NOT,((DOMAIN-SUFFIX,googlesyndication.com)))),REJECT
|
||||
- GEOSITE,category-ads-all,block
|
||||
|
||||
## rules telegram
|
||||
# - GEOIP,telegram,BFM
|
||||
|
||||
## direct FCM
|
||||
# - AND,((NETWORK,TCP),(DST-PORT,5228-5230),(OR,((DOMAIN-KEYWORD,google)))),DIRECT
|
||||
|
||||
## direct ntp
|
||||
# - AND,((NETWORK,UDP),(DST-PORT,123)),DIRECT
|
||||
# - DST-PORT,123/136/137-139,DIRECT,udp
|
||||
|
||||
## block udp/quic YouTube
|
||||
- AND,((NETWORK,udp),(OR,((DST-PORT,443),(GEOSITE,youtube)))),block
|
||||
# - AND,((NETWORK,udp),(GEOSITE,youtube)),REJECT
|
||||
|
||||
## rules inner, recommended untuk non kuota reguler
|
||||
# - AND,((PROCESS-NAME,clash),(NOT,((IN-TYPE,inner)))),REJECT
|
||||
- IN-TYPE,inner,BFM
|
||||
## final
|
||||
- MATCH,BFM
|
||||
|
||||
## rules clash premium
|
||||
# rule-providers:
|
||||
# block:
|
||||
# type: http
|
||||
# behavior: domain
|
||||
# url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
|
||||
# path: ./ruleset/block.yaml
|
||||
# interval: 86400
|
||||
# script:
|
||||
# shortcuts:
|
||||
# # quic: network == 'udp' and dst_port == 443
|
||||
# youshit: network == 'udp' and ('youtube' in host or 'googlevideo' in host)
|
||||
# rules:
|
||||
# - DOMAIN-SUFFIX,googlesyndication.com,BFM
|
||||
# - RULE-SET,block,block
|
||||
# # - SCRIPT,quic,block
|
||||
# - SCRIPT,youshit,block
|
||||
# - MATCH,BFM
|
||||
2
scripts/clash/provide/domestic.yml
Executable file
2
scripts/clash/provide/domestic.yml
Executable file
@@ -0,0 +1,2 @@
|
||||
proxies:
|
||||
## tambah akun mu
|
||||
@@ -1,116 +1,108 @@
|
||||
#!/system/bin/sh
|
||||
|
||||
export PATH=$(magisk --path)/.magisk/busybox:$PATH:/system/bin
|
||||
settings="/data/adb/box/settings.ini"
|
||||
export PATH="$(magisk --path)/.magisk/busybox:$PATH:/system/bin"
|
||||
|
||||
# path busybox
|
||||
# define the settings and paths
|
||||
settings="/data/adb/box/settings.ini"
|
||||
busybox_path="/data/adb/magisk/busybox"
|
||||
|
||||
# true: enable / false: disable Ipv6
|
||||
ipv6="false"
|
||||
# true: for download Kernel meta, / false: Kernel premium
|
||||
# su -c /data/adb/box/scripts/box.tool upcore
|
||||
meta="true"
|
||||
# for download clash premium / dev
|
||||
dev="true"
|
||||
# port detect
|
||||
# enable/disable port detection: true / false
|
||||
port_detect="true"
|
||||
|
||||
# If you want to change the user or group, you must make the BFM core in the /system/bin directory, otherwise the changes will not take effect.
|
||||
# If you are using Magisk, you can copy the BFM core files (sing-box, clash, etc.) to /data/adb/modules/box_for_magisk/system/bin/ and reboot the phone
|
||||
# enable/disable IPv6: true / false
|
||||
ipv6="true"
|
||||
|
||||
# list of available kernel binaries
|
||||
bin_list=("clash" "sing-box" "xray" "v2fly")
|
||||
|
||||
# select the client to use : clash / sing-box / xray / v2fly
|
||||
bin_name="clash"
|
||||
|
||||
# set the port numbers for tproxy and redir
|
||||
tproxy_port='9898'
|
||||
redir_port='9797'
|
||||
|
||||
# This script is used to set the user and group for the BFM core files.
|
||||
# If you want to change the user or group, make sure the BFM core files are located in the /system/bin directory, otherwise the changes will not take effect.
|
||||
# If you are using Magisk, you can copy the BFM core files (sing-box, clash, etc.) to /data/adb/modules/box_for_magisk/system/bin/ and reboot the phone.
|
||||
# box_user_group="bin:system"
|
||||
box_user_group="root:net_admin"
|
||||
|
||||
# bin kernel
|
||||
c="clash"
|
||||
s="sing-box"
|
||||
x="xray"
|
||||
v="v2fly"
|
||||
bin_list=("${c}" "${x}" "${s}" "${v}")
|
||||
# select client
|
||||
bin_name=$c
|
||||
|
||||
# make sure the port is in sync with the config
|
||||
tproxy_port="9898"
|
||||
redir_port="9797"
|
||||
|
||||
# redirect: tcp / tproxy: udp + tcp / mixed: tcp + tun
|
||||
# redirect: tcp only, / tproxy: for tcp+udp with tproxy, / mixed: mode with redirect[tcp] and tun[udp]
|
||||
# Network mode: tproxy for transparent proxying
|
||||
network_mode="tproxy"
|
||||
# blacklist / whitelist / core (only tun)
|
||||
proxy_mode="blacklist"
|
||||
# Package Name
|
||||
# ex: package_lis=(org.telegram.messenger xyz.nextalone.nagram com.whatsapp)
|
||||
packages_list=()
|
||||
|
||||
# ap_list=("softap+" "wlan+" "swlan+" "ap+" "rndis+")
|
||||
# for AP info type "ifconfig" in terminal
|
||||
ap_list=("softap+" "wlan+" "swlan+" "ap+" "rndis+")
|
||||
# for AP bypass
|
||||
# Proxy mode: blacklist / whitelist / tun (only tun auto-route)
|
||||
proxy_mode="blacklist"
|
||||
|
||||
# List of package names to be proxied
|
||||
packages_list=( com.v2ray.ang )
|
||||
|
||||
# Display AP info by typing "ifconfig" in terminal
|
||||
ap_list=( "softap+" "wlan+" "swlan+" "ap+" "rndis+" )
|
||||
|
||||
# Ignore AP in the out list
|
||||
ignore_out_list=()
|
||||
|
||||
# set interval update, info: https://crontab.guru/
|
||||
crontab_sec="false"
|
||||
# "0 00 * * *" / every 12 p.m
|
||||
update_interval="0 00 * * *"
|
||||
# update sub&geo
|
||||
# type su -c /data/adb/box/scripts/box.tool subgeo
|
||||
auto_updategeox="true"
|
||||
# only clash subscription url
|
||||
auto_updatesubcript="false"
|
||||
subcript_url="http://127.0.0.1:9090/ui/akun.yaml"
|
||||
# Set update interval using cron, for more information: https://crontab.guru/
|
||||
crontab_sec='true'
|
||||
update_interval="0 00 * * *" # update every day at 12 a.m
|
||||
|
||||
# cgroup to limit memory usage
|
||||
cgroup_memory="false"
|
||||
# leave blank, for default value
|
||||
cgroup_memory_path=""
|
||||
# Update sub&geo
|
||||
# Type "su -c /data/adb/box/scripts/box.tool subgeo" to update
|
||||
auto_update_geox="true"
|
||||
|
||||
# Only update clash subscription URL
|
||||
auto_update_subscription="false"
|
||||
subscription_url=""
|
||||
|
||||
# Set cgroup to limit memory usage
|
||||
cgroup_memory="true"
|
||||
cgroup_memory_limit="50M"
|
||||
cgroup_memory_path=""
|
||||
|
||||
# box directory
|
||||
# Set box directory variables
|
||||
data_dir="/data/adb/box"
|
||||
# run directory
|
||||
run_path="${data_dir}/run"
|
||||
# log file
|
||||
logs_file="${run_path}/runs.log"
|
||||
# pid file
|
||||
pid_file="${run_path}/box.pid"
|
||||
# bin directory
|
||||
bin_kernel="${data_dir}/bin"
|
||||
# bin pat
|
||||
bin_path="${bin_kernel}/${bin_name}"
|
||||
# scripts directory
|
||||
scripts_dir="${data_dir}/scripts"
|
||||
# list uuid
|
||||
system_packages_file="/data/system/packages.list"
|
||||
uid_list="${run_path}/appuid.list"
|
||||
#config clash
|
||||
uid_list=("/data/adb/box/run/appuid.list")
|
||||
|
||||
# config clash
|
||||
name_clash_config="config.yaml"
|
||||
clash_config="${data_dir}/clash/${name_clash_config}"
|
||||
# Membaca nilai enable dari konfigurasi tun
|
||||
clash_tun_status=$(awk -F ': ' '/^tun: *$/{getline; print $2}' "${clash_config}")
|
||||
|
||||
# biarkan default utun
|
||||
tun_device="utun"
|
||||
cek_tun_device=$(grep "device:" /data/adb/box/template.yml | awk -F ': ' '{print $2}')
|
||||
# clash dns.fake-ip-range
|
||||
clash_fake_ip_range="43.0.0.1/8"
|
||||
ceks_fake_ip_range=$(grep "fake-ip-range:" ${data_dir}/template.yml | awk -F ': ' '{print $2}')
|
||||
# clash dns.listen
|
||||
clash_dns_port="1053"
|
||||
ceks_dns_port=$(grep "listen:" ${data_dir}/template.yml | awk -F ':' '{print $3}')
|
||||
# tun stack lwip(use cgo kernel) / system / gvisor
|
||||
clash_stack=$(grep "stack:" ${data_dir}/template.yml | awk -F ': ' '{print $2}')
|
||||
# tun status false / true
|
||||
clash_tun_status=$(awk -F ': ' '/^tun: *$/{getline; print $2}' ${data_dir}/template.yml)
|
||||
|
||||
# Dns Static
|
||||
static_dns1="8.8.4.4"
|
||||
static_dns2="2001:4860:4860::8844"
|
||||
# Set DNS variables, doc dns https://adguard-dns.io/kb/general/dns-providers/
|
||||
intervaldns=""
|
||||
# intervaldns="*/10 * * * *" #
|
||||
static_dns1="94.140.14.14"
|
||||
static_dns2="2a10:50c0::ad1:ff"
|
||||
|
||||
log() {
|
||||
export TZ=Asia/Jakarta
|
||||
now=$(date +"%I.%M %p %z")
|
||||
# Set the timezone to Asia/Jakarta
|
||||
export TZ=Asia/Jakarta
|
||||
# Get the current time
|
||||
now=$(date +"%I.%M %p %Z")
|
||||
case $1 in
|
||||
info)[ -t 1 ] && echo -e "\033[1;34m${now} [info]: $2\033[0m" || echo "${now} [info]: $2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
error)[ -t 1 ] && echo -e "\033[1;31m${now} [error]: $2\033[0m" || echo "${now} [error]: $2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
warn)[ -t 1 ] && echo -e "\033[1;33m${now} [warn]: $2\033[0m" || echo "${now} [warn]: $2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
*)[ -t 1 ] && echo -e "\033[1;35m${now} [$1]: $2\033[0m" || echo "${now} [$1]: $2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
# print the log message in blue
|
||||
info) color="\033[1;34m" ;;
|
||||
# print the log message in red
|
||||
error) color="\033[1;31m" ;;
|
||||
# print the log message in yellow
|
||||
warn) color="\033[1;33m" ;;
|
||||
# print the log message in magenta
|
||||
*) color="\033[1;35m" ;;
|
||||
esac
|
||||
}
|
||||
message="${now} [$1]: $2"
|
||||
if [ -t 1 ]; then
|
||||
echo -e "${color}${message}\033[0m"
|
||||
else
|
||||
echo "${message}" | tee -a ${logs_file} >> /dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
112
scripts/sing-box/config.json
Normal file → Executable file
112
scripts/sing-box/config.json
Normal file → Executable file
@@ -6,42 +6,14 @@
|
||||
"timestamp": false
|
||||
},
|
||||
"dns": {
|
||||
"final": "cloudflare",
|
||||
"strategy": "prefer_ipv4",
|
||||
"disable_cache": false,
|
||||
"disable_expire": false,
|
||||
"servers": [
|
||||
{
|
||||
"tag": "cloudflare",
|
||||
"address": "1.1.1.1",
|
||||
"detour": "sing-box"
|
||||
},
|
||||
{
|
||||
"tag": "googledns",
|
||||
"address": "8.8.8.8",
|
||||
"detour": "sing-box"
|
||||
},
|
||||
{
|
||||
"tag": "block",
|
||||
"address": "rcode://success"
|
||||
"address": "tls://1.1.1.1"
|
||||
}
|
||||
],
|
||||
"rules": [
|
||||
{
|
||||
"domain_suffix": [
|
||||
"googlesyndication.com"
|
||||
],
|
||||
"server": "cloudflare",
|
||||
"disable_cache": false
|
||||
},
|
||||
{
|
||||
"geosite": [
|
||||
"category-ads-all"
|
||||
],
|
||||
"server": "block",
|
||||
"disable_cache": false
|
||||
}
|
||||
]
|
||||
"rules": [],
|
||||
"strategy": "ipv4_only"
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
@@ -49,15 +21,10 @@
|
||||
"tag": "tproxy-in",
|
||||
"listen": "::",
|
||||
"listen_port": 9898,
|
||||
"network": [
|
||||
"udp",
|
||||
"tcp"
|
||||
],
|
||||
"tcp_fast_open": true,
|
||||
"sniff": true,
|
||||
"sniff_override_destination": true,
|
||||
"sniff_timeout": "300ms",
|
||||
"domain_strategy": "prefer_ipv4",
|
||||
"domain_strategy": "ipv4_only",
|
||||
"udp_timeout": 300
|
||||
}
|
||||
],
|
||||
@@ -75,51 +42,70 @@
|
||||
"tag": "dns-out"
|
||||
},
|
||||
{
|
||||
"tag": "sing-box",
|
||||
"tag": "BFM",
|
||||
"type": "selector",
|
||||
"outbounds": [
|
||||
"akun-a"
|
||||
]
|
||||
},
|
||||
{
|
||||
"tag": "blacklist",
|
||||
"type": "selector",
|
||||
"outbounds": [
|
||||
"direct",
|
||||
"sub-box"
|
||||
]
|
||||
"block"
|
||||
],
|
||||
"default": "block"
|
||||
},
|
||||
{
|
||||
"tag": "opok tsel",
|
||||
"tag": "akun-a",
|
||||
"type": "vmess",
|
||||
"server": "159.223.38.70",
|
||||
"server_port": 80,
|
||||
"uuid": "8a03dce3-3c8f-4785-be8d-bc8a832d0884",
|
||||
"server": "server.com",
|
||||
"server_port": 12345,
|
||||
"uuid": "aaa-aaa-aaa",
|
||||
"security": "auto",
|
||||
"alter_id": 0,
|
||||
"network": [
|
||||
"tcp",
|
||||
"udp"
|
||||
],
|
||||
"packet_encoding": "xudp",
|
||||
"transport": {
|
||||
"type": "ws",
|
||||
"path": "/worryfree",
|
||||
"path": "/path",
|
||||
"headers": {
|
||||
"Host": "dynamic-sg1b.obfs.xyz"
|
||||
"Host": "host.com"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "sub-box",
|
||||
"type": "selector",
|
||||
"outbounds": [
|
||||
"opok tsel"
|
||||
]
|
||||
}
|
||||
],
|
||||
"route": {
|
||||
"final": "sing-box",
|
||||
"geoip": {
|
||||
"download_url": "https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db",
|
||||
"download_detour": "direct"
|
||||
},
|
||||
"geosite": {
|
||||
"download_url": "https://github.com/CHIZI-0618/v2ray-rules-dat/raw/release/geosite.db",
|
||||
"download_detour": "direct"
|
||||
},
|
||||
"final": "BFM",
|
||||
"rules": [
|
||||
{
|
||||
"protocol": "dns",
|
||||
"outbound": "dns-out"
|
||||
},
|
||||
{
|
||||
"domain_suffix": [
|
||||
"googlesyndication.com"
|
||||
],
|
||||
"outbound": "BFM"
|
||||
},
|
||||
{
|
||||
"protocol": [
|
||||
"quic"
|
||||
],
|
||||
"port": [
|
||||
443
|
||||
],
|
||||
"network": "udp",
|
||||
"geosite": "youtube",
|
||||
"outbound": "blacklist"
|
||||
},
|
||||
{
|
||||
"geosite": "category-ads-all",
|
||||
"outbound": "blacklist"
|
||||
}
|
||||
],
|
||||
"find_process": false,
|
||||
@@ -128,7 +114,7 @@
|
||||
"experimental": {
|
||||
"clash_api": {
|
||||
"external_controller": "0.0.0.0:9090",
|
||||
"external_ui": "../dashboard/dist",
|
||||
"external_ui": "./dashboard/dist",
|
||||
"store_selected": false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
#!/system/bin/sh
|
||||
|
||||
scripts=$(realpath $0)
|
||||
scripts_dir=$(dirname ${scripts})
|
||||
scripts=$(realpath "$0")
|
||||
scripts_dir=$(dirname "${scripts}")
|
||||
|
||||
service_path="/data/adb/box/scripts/box.service"
|
||||
iptables_path="/data/adb/box/scripts/box.iptables"
|
||||
data_box="/data/adb/box"
|
||||
run_path="/data/adb/box/run"
|
||||
now=$(date +"%I.%M %p")
|
||||
now=$(date +"%I.%M %p %z")
|
||||
|
||||
events=$1
|
||||
monitor_dir=$2
|
||||
monitor_file=$3
|
||||
|
||||
service_control() {
|
||||
if [ "${monitor_file}" = "disable" ] ; then
|
||||
if [ "${events}" = "d" ] ; then
|
||||
${service_path} start > ${run_path}/service.log 2>> ${run_path}/service.log && \
|
||||
${iptables_path} enable >> ${run_path}/service.log 2>> ${run_path}/service.log
|
||||
elif [ "${events}" = "n" ] ; then
|
||||
${iptables_path} disable >> ${run_path}/service.log 2>> ${run_path}/service.log && \
|
||||
${service_path} stop >> ${run_path}/service.log 2>> ${run_path}/service.log
|
||||
if [ "${monitor_file}" = "disable" ]; then
|
||||
if [ "${events}" = "d" ]; then
|
||||
"${service_path}" start > "${run_path}/service.log" 2>> "${run_path}/service.log" && \
|
||||
"${iptables_path}" enable >> "${run_path}/service.log" 2>> "${run_path}/service.log"
|
||||
elif [ "${events}" = "n" ]; then
|
||||
"${iptables_path}" disable >> "${run_path}/service.log" 2>> "${run_path}/service.log" && \
|
||||
"${service_path}" stop >> "${run_path}/service.log" 2>> "${run_path}/service.log"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
[ -d ${run_path} ] || (mkdir -p ${run_path})
|
||||
if [ -f "${data_box}/settings.ini" ] ; then
|
||||
mkdir -p "${run_path}"
|
||||
if [ -f "${data_box}/settings.ini" ]; then
|
||||
service_control
|
||||
else
|
||||
echo "${now} [ERROR] settings.ini file not found" > ${run_path}/error.inotify.log
|
||||
echo "${now} [ERROR] settings.ini file not found" > "${run_path}/error.inotify.log"
|
||||
fi
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,217 +5,237 @@ scripts_dir=$(dirname ${scripts})
|
||||
source /data/adb/box/settings.ini
|
||||
|
||||
delete_logs() {
|
||||
for list in ${bin_list[*]} ; do
|
||||
rm -rf "${run_path}/${list}.log"
|
||||
# Delete logs for each bin in the list
|
||||
log info "Deleting & Backup logs for ${bin_list[*]}"
|
||||
for bin in "${bin_list[@]}" ; do
|
||||
mv "${run_path}/${bin}.log" "${run_path}/${bin}-$(date +%Y-%m-%d-%H-%M-%S).logs"
|
||||
rm -f "${run_path}/${bin}.log" || log warn "Error deleting ${bin}.log"
|
||||
done
|
||||
find ${run_path} -type f -name "root" | xargs rm -f
|
||||
find ${run_path} -type f -name "*.yaml" | xargs rm -f
|
||||
find ${run_path} -type f -name "*.list" | xargs rm -f
|
||||
find ${run_path} -type f -name "*.inotify.log" | xargs rm -f
|
||||
|
||||
# Delete the log three days ago
|
||||
# find ${run_path} -mtime +3 -type f -name "*.log" | xargs rm -f
|
||||
|
||||
# Delete other log files
|
||||
find "${run_path}" -type f \( -name "root" -o -name "*.yaml" -o -name "*.list" -o -name "*.inotify.log" -o -name "*-report.log" \) -exec rm -f {} \; || log warn "Error deleting other log files"
|
||||
|
||||
# Delete logs that are three days old or older
|
||||
find "${run_path}" -type f -name "*.logs" -mtime +2 -exec rm -f {} \; || log warn "Error deleting old logs"
|
||||
}
|
||||
|
||||
crontab_geo() {
|
||||
if [ "${auto_updategeox}" != "false" ] || [ "${auto_updatesubcript}" != "false" ] ; then
|
||||
echo "${update_interval} ${scripts_dir}/box.tool subgeo" >> ${run_path}/root
|
||||
log debug "interval crontab geo and subscription (${update_interval})."
|
||||
log debug "${bin_name} geox (${auto_updategeox})."
|
||||
[ "${bin_name}" = "clash" ] && log debug "${bin_name} subscription (${auto_updatesubcript})."
|
||||
if [ "${auto_update_geox}" != "false" ] || [ "${auto_update_subscription}" != "false" ]; then
|
||||
echo "${update_interval} ${scripts_dir}/box.tool subgeo" >> "${run_path}/root"
|
||||
log debug "Interval crontab geo and subscription (${update_interval})."
|
||||
log debug "${bin_name} geox (${auto_update_geox})."
|
||||
if [ "${bin_name}" = "clash" ]; then
|
||||
log debug "${bin_name} subscription (${auto_update_subscription})."
|
||||
fi
|
||||
else
|
||||
log info "crontab geox & subscription is disable."
|
||||
log info "Crontab geox & subscription is disabled."
|
||||
fi
|
||||
}
|
||||
|
||||
detected_port() {
|
||||
sleep 1
|
||||
[ "${port_detect}" = "true" ] && (${scripts_dir}/box.tool port) || (log warn "${bin_name} skip port detected." && return 1)
|
||||
}
|
||||
|
||||
temporary_config_file() {
|
||||
if [ -f "${data_dir}/template.yml" ] ; then
|
||||
if [ -f "${clash_config}" ] ; then
|
||||
cp -f ${data_dir}/template.yml ${data_dir}/run/config.yaml.temp \
|
||||
&& echo "\n" >> ${data_dir}/run/config.yaml.temp
|
||||
# sed -n -E '/^proxies:$/,$p' ${clash_config} >> ${data_dir}/run/config.yaml.temp
|
||||
awk '/proxies:/,EOF { print $0 }' ${clash_config} >> ${data_dir}/run/config.yaml.temp
|
||||
sleep .3
|
||||
sed -i '/^[ ]*$/d' ${data_dir}/run/config.yaml.temp
|
||||
else
|
||||
log error "${clash_config} file is missing."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
log error "${data_dir}/template.yml file is missing."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! (mv ${data_dir}/run/config.yaml.temp ${data_dir}/run/config.yaml) ; then
|
||||
log error "merge config failed!!!."
|
||||
exit 1
|
||||
fi
|
||||
[ "${port_detect}" = "true" ] && ${scripts_dir}/box.tool port || log warn "${bin_name} skip port detected." && return 1
|
||||
}
|
||||
|
||||
still_alive() {
|
||||
if ! (pidof ${bin_name} > /dev/null 2>&1) ; then
|
||||
log error "${bin_name} service is not running."
|
||||
log error "please, check ${bin_name}.log"
|
||||
kill -9 $(pidof ${bin_name}) || killall -9 ${bin_name}
|
||||
rm -rf ${pid_file}
|
||||
if ! pid=$(pidof ${bin_name} 2>/dev/null); then
|
||||
log error "${bin_name} service is not running."
|
||||
log error "Please check ${bin_name}.log for more information."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
sinkron_port() {
|
||||
if [ "${bin_name}" = "clash" ] ; then
|
||||
if [ "${ceks_dns_port}" != "${clash_dns_port}" ] ; then
|
||||
log info "sinkron dns listen"
|
||||
sed -i "s/clash_dns_port=.*/clash_dns_port=\""${ceks_dns_port}"\"/" ${settings}
|
||||
fi
|
||||
if [ "${ceks_fake_ip_range}" != "${clash_fake_ip_range}" ] ; then
|
||||
log error "fake-ip-range is out of sync, fix: open template.yml, match IP fake-ip-range: ${ceks_fake_ip_range} with clash_fake_ip_range: in settings.ini"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! kill -0 $pid 2>/dev/null; then
|
||||
log error "${bin_name} service is not running."
|
||||
log error "Killing stale pid ${pid}."
|
||||
kill -9 $pid || killall -9 ${bin_name}
|
||||
rm -f ${pid_file}
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_permission() {
|
||||
if [ "${box_user_group}" = "root:net_admin" ] ; then
|
||||
if [ ! -f ${bin_path} ] ; then
|
||||
log error "kernel ${bin_name} is missing"
|
||||
log error "please download and place it in the ${bin_path} directory."
|
||||
if [ "${box_user_group}" = "root:net_admin" ]; then
|
||||
if [ ! -f ${bin_path} ]; then
|
||||
log error "Kernel ${bin_name} is missing."
|
||||
log error "Please download and place it in the ${bin_path} directory."
|
||||
exit 1
|
||||
fi
|
||||
box_user_group="root:net_admin"
|
||||
# Set ownership and permission of kernel directory
|
||||
chown ${box_user_group} ${bin_path}
|
||||
chmod 6755 ${bin_path}
|
||||
chmod 644 "${data_dir}/${bin_name}"/*
|
||||
# Set ownership of data directory
|
||||
chown -R ${box_user_group} ${data_dir}
|
||||
log info "using kernel directory ${bin_name} in ${bin_path}"
|
||||
log info "Using kernel directory ${bin_name} in ${bin_path}"
|
||||
else
|
||||
if which ${bin_name} | grep -q "/system/bin/" ; then
|
||||
box_user=$(echo ${box_user_group} | awk -F ':' '{print $1}')
|
||||
box_group=$(echo ${box_user_group} | awk -F ':' '{print $2}')
|
||||
box_user_id=$(id -u ${box_user})
|
||||
box_group_id=$(id -g ${box_group})
|
||||
[ ${box_user_id} ] && [ ${box_group_id} ] || \
|
||||
(box_user_group="root:net_admin" && log warn "${box_user_group} error, use root:net_admin instead.")
|
||||
bin_path=$(which ${bin_name})
|
||||
chown ${box_user_group} ${bin_path}
|
||||
chmod 6755 ${bin_path}
|
||||
if [ "${box_user_id}" != "0" ] || [ "${box_group_id}" != "3005" ] ; then
|
||||
# setcap has been deprecated as it does not support binary outside of the /system/bin directory
|
||||
setcap 'cap_net_admin,cap_net_raw,cap_net_bind_service+ep' ${bin_path} || \
|
||||
(box_user_group="root:net_admin" && log error "setcap authorization failed, you may need libcap package.")
|
||||
# Check if box_user and box_group exist
|
||||
if [ ${box_user_id} ] && [ ${box_group_id} ]; then
|
||||
bin_path=$(which ${bin_name})
|
||||
# Set ownership and permission of kernel directory
|
||||
chown ${box_user_group} ${bin_path}
|
||||
chmod 6755 ${bin_path}
|
||||
chmod 644 "${data_dir}/${bin_name}"/*
|
||||
# Check if user is not root and group is not net_admin
|
||||
if [ "${box_user_id}" != "0" ] || [ "${box_group_id}" != "3005" ]; then
|
||||
# Set capability of kernel directory
|
||||
if command -v setcap > /dev/null; then
|
||||
setcap 'cap_net_admin,cap_net_raw,cap_net_bind_service+ep' ${bin_path} || \
|
||||
(box_user_group="root:net_admin" && log error "setcap authorization failed, you may need libcap package.")
|
||||
else
|
||||
box_user_group="root:net_admin"
|
||||
log warn "setcap authorization failed, you may need libcap package. Using root:net_admin instead."
|
||||
fi
|
||||
fi
|
||||
# Set ownership of data directory
|
||||
chown -R ${box_user_group} ${data_dir}
|
||||
log info "Using kernel directory ${bin_name} in ${bin_path}"
|
||||
else
|
||||
bin_path=$(which ${bin_name})
|
||||
box_user_group="root:net_admin"
|
||||
log warn "${box_user_group} error. Using root:net_admin instead."
|
||||
# Set ownership and permission of kernel directory
|
||||
chown ${box_user_group} ${bin_path}
|
||||
chmod 6755 ${bin_path}
|
||||
chmod 644 "${data_dir}/${bin_name}"/*
|
||||
# Set ownership of data directory
|
||||
chown -R ${box_user_group} ${data_dir}
|
||||
log info "Using kernel directory ${bin_name} in ${bin_path}"
|
||||
fi
|
||||
log info "using kernel directory ${bin_name} in ${bin_path}"
|
||||
chown -R ${box_user_group} ${data_dir}
|
||||
else
|
||||
log error "kernel ${bin_name} is missing"
|
||||
log error "please download kernel"
|
||||
log error "replace it in the /data/adb/modules/box_for_magisk/system/bin/${bin_name} directory. and reboot "
|
||||
log error "Kernel ${bin_name} is missing."
|
||||
log error "Please download kernel, replace it in the /data/adb/modules/box_for_magisk/system/bin/${bin_name} directory, and reboot."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
check_in_bin() {
|
||||
if ! command -v "${bin_path}" >/dev/null 2>&1; then
|
||||
log error "Error: '${bin_path}' not found or not executable."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "${bin_path}" ] || [ ! -x "${bin_path}" ]; then
|
||||
log error "Error: '${bin_path}' is not a valid file or cannot be executed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "${bin_name}" in
|
||||
clash)
|
||||
test_version=$(${bin_path} -v | grep -v 'clash')
|
||||
echo "${test_version}" | grep -qi 'clash' && \
|
||||
log info "$(${bin_path} -v)" || log error "kernel ${bin_name} corrupted."
|
||||
;;
|
||||
sing-box)
|
||||
test_version=$(${bin_path} version | grep "${bin_name}")
|
||||
echo "${test_version}" | grep -qi "${bin_name}" && \
|
||||
log info "$(${bin_path} version)" || log error "kernel ${bin_name} corrupted."
|
||||
;;
|
||||
if ! "${bin_path}" -v >/dev/null 2>&1; then
|
||||
log error "Error: '${bin_name}' version information not available."
|
||||
exit 1
|
||||
fi
|
||||
log info "$(${bin_path} -v)";;
|
||||
*)
|
||||
test_version=$(${bin_path} version | grep -v "${bin_name}")
|
||||
echo "${test_version}" | grep -qi "${bin_name}" && \
|
||||
log info "$(${bin_path} version)" || log error "kernel ${bin_name} corrupted."
|
||||
;;
|
||||
if ! "${bin_path}" version >/dev/null 2>&1; then
|
||||
echo "Error: '${bin_name}' version information not available."
|
||||
exit 1
|
||||
fi
|
||||
log info "$(${bin_path} version)";;
|
||||
esac
|
||||
}
|
||||
|
||||
create_tun() {
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
[ ! -e "/dev/net/tun" ] && \
|
||||
mkdir -p /dev/net && ln -s /dev/tun /dev/net/tun
|
||||
# mkdir -p /dev/net
|
||||
# [ ! -L /dev/net/tun ] && ln -sf /dev/tun /dev/net/tun
|
||||
# Mengaktifkan IP forwarding
|
||||
sysctl net.ipv4.ip_forward=1 >/dev/null 2>&1
|
||||
# Membuat symlink untuk /dev/tun jika belum ada
|
||||
if [ ! -c "/dev/net/tun" ]; then
|
||||
if ! mkdir -p /dev/net; then
|
||||
log warn "Cannot create directory /dev/net" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! mknod /dev/net/tun c 10 200; then
|
||||
log warn "Cannot create /dev/net/tun. Possible reasons:"
|
||||
log warn "This script is not executed as root user."
|
||||
log warn "Your system does not support the TUN/TAP driver."
|
||||
log warn "Your system kernel version is not compatible with the TUN/TAP driver."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
default_tp() {
|
||||
awk -v new_val="tproxy" '/network_mode/ {$0 = "network_mode=\"" new_val "\""} 1' ${settings} > ${data_dir}/tmp && mv ${data_dir}/tmp ${settings}
|
||||
}
|
||||
|
||||
run_box() {
|
||||
log info "client list: ${bin_list[*]}"
|
||||
log info "select: ${bin_name}"
|
||||
log info "starting ${bin_name} service."
|
||||
sinkron_port
|
||||
ulimit -SHn 1000000
|
||||
case "${bin_name}" in
|
||||
sing-box)
|
||||
[ "${proxy_mode}" = "core" ] && \
|
||||
log info "don't forget to set 'auto detect interface': true"
|
||||
# && (sed -i 's/"auto_detect_interface":.*/"auto_detect_interface": true/' ${data_dir}/sing-box/config.json) || (sed -i 's/"auto_detect_interface":.*/"auto_detect_interface": false/' ${data_dir}/sing-box/config.json)
|
||||
sed -i 's/network_mode=.*/network_mode="tproxy"/' ${settings}
|
||||
if (${bin_path} check -D ${data_dir}/${bin_name} > "${run_path}/${bin_name}-report.log" 2>&1) ; then
|
||||
nohup setuidgid 0:3005 ${bin_path} run -D ${data_dir}/${bin_name} > "${run_path}/${bin_name}.log" 2>&1 &
|
||||
echo -n $! > ${pid_file}
|
||||
# if [ "${network_mode}" = "mixed" ] || [ "${proxy_mode}" = "tun" ]; then
|
||||
# awk '{gsub(/"auto_detect_interface": false/,"\"auto_detect_interface\": true")}1' "${data_dir}/sing-box/config.json" > "${data_dir}/temp" && mv "${data_dir}/temp" "${data_dir}/sing-box/config.json"
|
||||
# sleep 0.75
|
||||
# awk '{gsub(/auto_route\": false/, "auto_route\": true"); print}' "${data_dir}/sing-box/config.json" > "${data_dir}/temp" && mv "${data_dir}/temp" "${data_dir}/sing-box/config.json"
|
||||
# else
|
||||
# awk '{gsub(/auto_route\": true/, "auto_route\": false"); print}' "${data_dir}/sing-box/config.json" > "${data_dir}/temp" && mv "${data_dir}/temp" "${data_dir}/sing-box/config.json"
|
||||
# sleep 0.75
|
||||
# awk '{gsub(/"auto_detect_interface": true/,"\"auto_detect_interface\": false")}1' "${data_dir}/sing-box/config.json" > "${data_dir}/temp" && mv "${data_dir}/temp" "${data_dir}/sing-box/config.json"
|
||||
# fi
|
||||
# sleep 1
|
||||
if ${bin_path} check -D "${data_dir}/${bin_name}" > "${run_path}/${bin_name}-report.log" 2>&1 ; then
|
||||
ulimit -SHn 65535
|
||||
nohup setuidgid 0:3005 ${bin_path} run -D "${data_dir}/${bin_name}" > "${run_path}/${bin_name}.log" 2>&1 &
|
||||
echo -n $! > "${pid_file}"
|
||||
else
|
||||
log error "configuration failed, please check the ${run_path}/${bin_name}-report.log file."
|
||||
log error "Configuration failed, please check the ${run_path}/${bin_name}-report.log file." >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
clash)
|
||||
if [ "${clash_tun_status}" = "true" ] ; then
|
||||
sed -i 's/tproxy-port:.*/tproxy-port: 0/' ${data_dir}/template.yml
|
||||
sed -i 's/network_mode=.*/network_mode="mixed"/' ${settings}
|
||||
sed -i 's/auto-route:.*/auto-route: true/' ${data_dir}/template.yml
|
||||
sed -i 's/auto-detect-interface:.*/auto-detect-interface: true/' ${data_dir}/template.yml
|
||||
if [ "${clash_tun_status}" != "true" ]; then
|
||||
awk -v tproxy_port="${tproxy_port}" '/tproxy-port:/ {$2=tproxy_port} {print}' ${clash_config} > ${data_dir}/tmp && mv ${data_dir}/tmp ${clash_config}
|
||||
default_tp
|
||||
else
|
||||
sed -i "s/tproxy-port:.*/tproxy-port: ${tproxy_port}/" ${data_dir}/template.yml
|
||||
# jika ingin mengunakan redirect, hapus line di bawah
|
||||
sed -i 's/network_mode=.*/network_mode="tproxy"/' ${settings}
|
||||
# end
|
||||
sed -i 's/auto-route:.*/auto-route: false/' ${data_dir}/template.yml
|
||||
sed -i 's/auto-detect-interface:.*/auto-detect-interface: false/' ${data_dir}/template.yml
|
||||
awk -v new_val="mixed" '/network_mode/ {$0 = "network_mode=\"" new_val "\""} 1' ${settings} > ${data_dir}/tmp && mv ${data_dir}/tmp ${settings}
|
||||
fi
|
||||
temporary_config_file
|
||||
if (${bin_path} -t -d ${data_dir}/${bin_name} -f ${data_dir}/run/config.yaml > "${run_path}/${bin_name}-report.log") ; then
|
||||
nohup setuidgid 0:3005 ${bin_path} -d ${data_dir}/${bin_name} -f ${data_dir}/run/config.yaml > "${run_path}/${bin_name}.log" 2>&1 &
|
||||
echo -n $! > ${pid_file}
|
||||
if ${bin_path} -t -d "${data_dir}/${bin_name}" -f "${clash_config}" > "${run_path}/${bin_name}-report.log" 2>&1; then
|
||||
ulimit -SHn 65535
|
||||
nohup setuidgid 0:3005 ${bin_path} -d "${data_dir}/${bin_name}" -f "${clash_config}" > "${run_path}/${bin_name}.log" 2>&1 &
|
||||
echo -n $! > "${pid_file}"
|
||||
else
|
||||
mv ${data_dir}/run/config.yaml ${clash_config}
|
||||
log error "configuration failed, please check the ${run_path}/${bin_name}-report.log file."
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
xray)
|
||||
sed -i 's/network_mode=.*/network_mode="tproxy"/' ${settings}
|
||||
if [ ! -f ${data_dir}/${bin_name}/*.json ] ; then
|
||||
log error "file ${data_dir}/xray/*.json no found"
|
||||
default_tp
|
||||
if [ ! -f "${data_dir}/${bin_name}"/*.json ]; then
|
||||
log error "file ${data_dir}/${bin_name}/*.json not found"
|
||||
exit 1
|
||||
fi
|
||||
export XRAY_LOCATION_ASSET=${data_dir}/${bin_name}
|
||||
export XRAY_LOCATION_CONFDIR=${data_dir}/${bin_name}
|
||||
if (${bin_path} -test > "${run_path}/${bin_name}-report.log" 2>&1) ; then
|
||||
export XRAY_LOCATION_ASSET="${data_dir}/${bin_name}"
|
||||
export XRAY_LOCATION_CONFDIR="${data_dir}/${bin_name}"
|
||||
|
||||
if ${bin_path} -test > "${run_path}/${bin_name}-report.log" 2>&1; then
|
||||
ulimit -SHn 65535
|
||||
nohup setuidgid 0:3005 ${bin_path} > "${run_path}/${bin_name}.log" 2>&1 &
|
||||
echo -n $! > ${pid_file}
|
||||
echo -n $! > "${pid_file}"
|
||||
else
|
||||
log error "configuration failed, please check the ${run_path}/${bin_name}-report.log file."
|
||||
log error "configuration failed, please check the ${run_path}/${bin_name}-report.log file."
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
v2fly)
|
||||
sed -i 's/network_mode=.*/network_mode="tproxy"/' ${settings}
|
||||
if [ ! -f ${data_dir}/${bin_name}/*.json ] ; then
|
||||
log error "file ${data_dir}/v2fly/*.json no found"
|
||||
default_tp
|
||||
if [ ! -f "${data_dir}/${bin_name}"/*.json ]; then
|
||||
log error "file ${data_dir}/v2ray/*.json not found"
|
||||
exit 1
|
||||
fi
|
||||
export V2RAY_LOCATION_ASSET=${data_dir}/${bin_name}
|
||||
export V2RAY_LOCATION_CONFDIR=${data_dir}/${bin_name}
|
||||
if (${bin_path} test > "${run_path}/${bin_name}-report.log" 2>&1) ; then
|
||||
ulimit -SHn 65535
|
||||
nohup setuidgid 0:3005 ${bin_path} run > "${run_path}/${bin_name}.log" 2>&1 &
|
||||
echo -n $! > ${pid_file}
|
||||
else
|
||||
@@ -232,83 +252,221 @@ run_box() {
|
||||
}
|
||||
|
||||
cgroup_limit() {
|
||||
[ "${cgroup_memory}" = "true" ] && (${scripts_dir}/box.tool cgroup && log info "cgroup limit: ${cgroup_memory_limit}.") || log info "${bin_name} cgroup: disable"
|
||||
if [ "${cgroup_memory}" = "true" ]; then
|
||||
if ${scripts_dir}/box.tool cgroup; then
|
||||
log info "cgroup limit: ${cgroup_memory_limit}."
|
||||
else
|
||||
log error "Failed to enable cgroup for ${bin_name}."
|
||||
fi
|
||||
else
|
||||
log info "${bin_name} cgroup: disabled."
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to display the usage of a binary
|
||||
bin_usage() {
|
||||
rss=$(grep VmRSS /proc/$(pidof ${bin_name})/status | awk -F':' '{print $2}' | awk '{print $1}')
|
||||
[ ${rss} -ge 1024 ] && bin_rss="$(expr ${rss} / 1024)Mb" || bin_rss="${rss}Kb"
|
||||
swap=$(grep VmSwap /proc/$(pidof ${bin_name})/status | awk -F':' '{print $2}' | awk '{print $1}')
|
||||
[ ${swap} -ge 1024 ] && bin_swap="$(expr ${swap} / 1024)Mb" || bin_swap="${swap}Kb"
|
||||
state=$(grep State /proc/$(pidof ${bin_name})/status | awk -F':' '{print $2}' | awk '{print $2}')
|
||||
# Get the process ID of the binary
|
||||
bin_pid=$(pidof ${bin_name})
|
||||
|
||||
if bin_pid=$(pidof ${bin_name}) ; then
|
||||
log info "${bin_name} has started with the $(stat -c %U:%G /proc/${bin_pid}) user group."
|
||||
log info "${bin_name} status: ${state}, PID: (${bin_pid})"
|
||||
log info "${bin_name} memory usage: ${bin_rss}, swap: ${bin_swap}"
|
||||
log info "${bin_name} cpu usage: $((/system/bin/ps -p $(pidof ${bin_name}) -o pcpu | grep -v %CPU | awk '{print $1}') 2> /dev/null)%"
|
||||
log info "${bin_name} running time: $(/system/bin/ps -p $(pidof ${bin_name}) -o comm,etime | grep ${bin_name} | awk '{print $2}')"
|
||||
echo -n ${bin_pid} > ${pid_file}
|
||||
if [ -z "${bin_pid}" ]; then
|
||||
log error "${bin_name} is not running"
|
||||
return
|
||||
fi
|
||||
|
||||
# Get the memory usage of the binary
|
||||
rss=$(grep VmRSS /proc/${bin_pid}/status | awk '{print $2}')
|
||||
[ "${rss}" -ge 1024 ] && bin_rss="$(expr ${rss} / 1024) MB" || bin_rss="${rss} KB"
|
||||
swap=$(grep VmSwap /proc/${bin_pid}/status | awk '{print $2}')
|
||||
[ "${swap}" -ge 1024 ] && bin_swap="$(expr ${swap} / 1024) MB" || bin_swap="${swap} KB"
|
||||
|
||||
# Get the state of the binary
|
||||
state=$(grep State /proc/${bin_pid}/status | awk '{print $2}')
|
||||
|
||||
# Get the user and group of the binary
|
||||
user_group=$(stat -c %U:%G /proc/${bin_pid})
|
||||
|
||||
# Log the information
|
||||
log info "${bin_name} has started with the ${user_group} user group."
|
||||
log info "${bin_name} status: ${state}, PID: (${bin_pid})"
|
||||
log info "${bin_name} memory usage: ${bin_rss}, swap: ${bin_swap}"
|
||||
|
||||
# Get the CPU usage of the binary
|
||||
cpu=$(/system/bin/ps -p ${bin_pid} -o pcpu | awk 'NR==2{print $1}' 2> /dev/null)
|
||||
if [ -n "${cpu}" ]; then
|
||||
log info "${bin_name} cpu usage: ${cpu}%"
|
||||
else
|
||||
log info "${bin_name} cpu usage: not available"
|
||||
fi
|
||||
|
||||
# Get the running time of the binary
|
||||
running_time=$(/system/bin/ps -p ${bin_pid} -o etime | awk 'NR==2{print $1}' 2> /dev/null)
|
||||
if [ -n "${running_time}" ]; then
|
||||
log info "${bin_name} running time: ${running_time} seconds"
|
||||
else
|
||||
log info "${bin_name} running time: not available"
|
||||
fi
|
||||
|
||||
# Save the process ID to the pid file
|
||||
echo -n ${bin_pid} > ${pid_file}
|
||||
}
|
||||
|
||||
display_bin_pid() {
|
||||
if bin_pid=$(pidof ${bin_name}) ; then
|
||||
# Mengecek apakah bin_name sudah didefinisikan
|
||||
if [ -z "${bin_name}" ]; then
|
||||
log error "bin_name: ${bin_name} not defined"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Mencari PID dari bin_name
|
||||
bin_pid=$(pidof "${bin_name}")
|
||||
|
||||
# Mengecek apakah bin_name sedang berjalan
|
||||
if [ -n "${bin_pid}" ]; then
|
||||
# Jika iya, mencetak pesan dan memanggil fungsi bin_usage
|
||||
log info "${bin_name} service is running. (PID: ${bin_pid})."
|
||||
bin_usage
|
||||
log info "${bin_name} service is running. (PID: $(pidof ${bin_name}))."
|
||||
else
|
||||
log warn "${bin_name} service is stopped." && return 1
|
||||
# Jika tidak, mencetak pesan dan mengembalikan status 1
|
||||
log warn "${bin_name} service is stopped."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
crontab_alive() {
|
||||
nohup crond -c ${run_path} > /dev/null 2>&1 &
|
||||
crontab -c ${run_path} -r
|
||||
touch ${run_path}/root
|
||||
chmod 0600 ${run_path}/root
|
||||
[ "${static_dns1}" != "" ] && \
|
||||
echo "*/1 * * * * ${scripts_dir}/box.tool keepdns" >> ${run_path}/root && log info "dns remains open."
|
||||
[ "${bin_name}" = "clash" ] && \
|
||||
log info "configuration ${clash_config}."
|
||||
# Memulai crond dengan opsi "-c" dan menyimpannya di background
|
||||
nohup crond -c "${run_path}" > /dev/null 2>&1 &
|
||||
# Menghapus crontab sebelumnya dan membuat crontab baru
|
||||
crontab -c "${run_path}" -r
|
||||
touch "${run_path}/root"
|
||||
chmod 0600 "${run_path}/root"
|
||||
|
||||
# Menambahkan cron job untuk memanggil box.tool keepdns setiap menit
|
||||
if [ "${intervaldns}" != "" ]; then
|
||||
echo "${intervaldns} ${scripts_dir}/box.tool keepdns" >> "${run_path}/root"
|
||||
log info "DNS remains open."
|
||||
fi
|
||||
|
||||
# Menampilkan pesan konfigurasi jika bin_name adalah "clash"
|
||||
if [ "${bin_name}" = "clash" ]; then
|
||||
log info "Configuration ${clash_config}."
|
||||
fi
|
||||
|
||||
# Menjalankan fungsi crontab_geo untuk menambahkan cron job berdasarkan lokasi geografis
|
||||
crontab_geo
|
||||
}
|
||||
|
||||
start_box() {
|
||||
echo -n "" > ${logs_file}
|
||||
[ -t 1 ] && echo "\033[1;31m$(date)\033[0m" || echo "$(date)" | tee -a ${logs_file} >> /dev/null 2>&1
|
||||
line="--------------------------------------------"
|
||||
[ -t 1 ] && echo "\033[1;32m$line\033[0m" || echo "$line" | tee -a ${logs_file} >> /dev/null 2>&1
|
||||
|
||||
if bin_pid=$(pidof ${bin_name}) ; then
|
||||
log info "${bin_name} service is still running, refresh iptables"
|
||||
${scripts_dir}/box.iptables renew
|
||||
exit 1
|
||||
data_wifi() {
|
||||
network_interface=$(ip route show | sed -n '1p' | awk '{print $3}')
|
||||
# network_interface=$(ip route show | sed -n '2p' | awk '{print $3}')
|
||||
data_info=$(ifconfig "${network_interface}" | grep "RX bytes")
|
||||
# Retrieving data usage from data information
|
||||
data_usage=$(echo "$data_info" | awk '/RX bytes/ {print $2}' | cut -d: -f2)
|
||||
# Convert bytes to MB/KB
|
||||
if (( $(echo "${data_usage} > 1024 * 1024 * 1024" | bc -l) )); then
|
||||
# Convert to GB
|
||||
data_usage_gb=$(echo "scale=2; ${data_usage} / 1024 / 1024 / 1024" | bc)
|
||||
log debug "Data usage: ${data_usage_gb} GB"
|
||||
elif (( $(echo "${data_usage} > 1024 * 1024" | bc -l) )); then
|
||||
data_usage_mb=$(echo "scale=2; ${data_usage} / 1024 / 1024" | bc)
|
||||
log debug "Data usage: ${data_usage_mb} MB"
|
||||
else
|
||||
data_usage_mb=$(echo "scale=2; ${data_usage} / 1024" | bc)
|
||||
log debug "Data usage: ${data_usage_mb} KB"
|
||||
fi
|
||||
|
||||
# Run dumpsys command to get wifi usage
|
||||
# Retrieving wifi information using ifconfig
|
||||
network_ap=$(ip route show | sed -n '3p' | awk '{print $3}')
|
||||
wifi_info=$(ifconfig "${network_ap}" | grep "RX bytes")
|
||||
# Retrieve data usage from wifi information
|
||||
wifi_usage=$(echo "$wifi_info" | awk '/RX bytes/ {print $2}' | cut -d: -f2)
|
||||
# Konversi byte menjadi MB / KB
|
||||
if (( $(echo "${wifi_usage} > 1024 * 1024 * 1024" | bc -l) )); then
|
||||
# Convert to GB
|
||||
wifi_usage_gb=$(echo "scale=2; ${wifi_usage} / 1024 / 1024 / 1024" | bc)
|
||||
log debug "WiFi usage: ${wifi_usage_gb} GB"
|
||||
elif (( $(echo "${wifi_usage} > 1024 * 1024" | bc -l) )); then
|
||||
wifi_usage_mb=$(echo "scale=2; ${wifi_usage} / 1024 / 1024" | bc)
|
||||
log debug "WiFi usage: ${wifi_usage_mb} MB"
|
||||
else
|
||||
wifi_usage_mb=$(echo "scale=2; ${wifi_usage} / 1024" | bc)
|
||||
log debug "WiFi usage: ${wifi_usage_mb} KB"
|
||||
fi
|
||||
}
|
||||
|
||||
start_box() {
|
||||
# Mengosongkan file log dan menambahkan timestamp dan garis pembatas
|
||||
echo -n "" > "${logs_file}"
|
||||
# Then use the chmod command to set file permissions to 755
|
||||
if [ -t 1 ]; then
|
||||
echo -e "\033[1;31m$(date)\033[0m"
|
||||
echo -e "\033[1;32m--------------------------------------------\033[0m"
|
||||
else
|
||||
echo "$(date)" | tee -a "${logs_file}" > /dev/null 2>&1
|
||||
echo "--------------------------------------------" | tee -a "${logs_file}" > /dev/null 2>&1
|
||||
fi
|
||||
|
||||
# Memperbarui iptables jika bin_name masih berjalan
|
||||
if bin_pid=$(pidof "${bin_name}"); then
|
||||
log info "${bin_name} service is still running, refreshing iptables"
|
||||
if "${scripts_dir}/box.iptables" renew; then
|
||||
log info "iptables refreshed successfully"
|
||||
exit 1
|
||||
else
|
||||
log error "failed to refresh iptables"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
log info "Good day"
|
||||
fi
|
||||
|
||||
# Memeriksa izin, memeriksa keberadaan bin, menghapus log lama, membuat TUN, menjalankan box, dan menunggu selama 1 detik
|
||||
check_permission
|
||||
check_in_bin
|
||||
delete_logs
|
||||
create_tun
|
||||
if [ "${network_mode}" = "mixed" ] || [ "${proxy_mode}" = "tun" ]; then
|
||||
create_tun
|
||||
fi
|
||||
run_box && sleep 1
|
||||
[ "${crontab_sec}" != "false" ] && \
|
||||
crontab_alive || log info "crontab: disable."
|
||||
# Menjalankan crontab_alive jika crontab_sec tidak sama dengan "false"
|
||||
if [ "${crontab_sec}" != "false" ]; then
|
||||
crontab_alive
|
||||
else
|
||||
log info "crontab: disabled."
|
||||
fi
|
||||
|
||||
# Menjalankan cgroup_limit, menunggu selama 1 detik, mendeteksi port yang digunakan, menunggu selama 1 detik, dan menampilkan PID bin
|
||||
cgroup_limit
|
||||
detected_port || sleep 1
|
||||
sleep 1
|
||||
detected_port
|
||||
sleep 1
|
||||
still_alive
|
||||
display_bin_pid
|
||||
data_wifi
|
||||
}
|
||||
|
||||
stop_box() {
|
||||
cronkill=$(/system/bin/ps -ef | grep root | grep "crond -c /data/adb/box/" | awk '{ print $2 }' | sort -u)
|
||||
for cron in ${cronkill[*]} ; do
|
||||
kill -9 ${cron}
|
||||
# Menggunakan perintah `pgrep` untuk mencari PID cronjob
|
||||
cronkill=$(pgrep -f "crond -c ${run_path}")
|
||||
for cron in ${cronkill[@]}; do
|
||||
kill -15 ${cron}
|
||||
done
|
||||
for list in ${bin_list[*]} ; do
|
||||
kill -9 $(pidof ${list}) || killall -9 ${list}
|
||||
|
||||
# Menggunakan loop untuk membunuh setiap binary
|
||||
for bin in ${bin_list[@]}; do
|
||||
# Menggunakan `pkill` untuk membunuh binary
|
||||
kill -9 "$(pidof ${bin})" || killall -9 "${bin}"
|
||||
done
|
||||
|
||||
sleep 0.5
|
||||
if ! [ $(pidof ${bin_name}) ] ; then
|
||||
find ${run_path} -type f -name "box.pid" | xargs rm -f
|
||||
sleep 0.5
|
||||
|
||||
# Mengecek apakah binary sudah terhenti
|
||||
if ! pidof ${bin_name} >/dev/null 2>&1; then
|
||||
# Menghapus file `box.pid` jika ada
|
||||
if [ -f ${run_path}/box.pid ]; then
|
||||
rm ${run_path}/box.pid
|
||||
sleep 0.5
|
||||
fi
|
||||
display_bin_pid || log warn "${bin_name} disconnected."
|
||||
else
|
||||
log error "failed to stop ${bin_name}"
|
||||
@@ -324,29 +482,22 @@ case "$1" in
|
||||
stop_box
|
||||
;;
|
||||
restart)
|
||||
stop_box && sleep 1
|
||||
start_box && (${scripts_dir}/box.iptables renew)
|
||||
stop_box
|
||||
sleep 1
|
||||
start_box
|
||||
${scripts_dir}/box.iptables renew
|
||||
;;
|
||||
usage)
|
||||
data_wifi
|
||||
case "${bin_name}" in
|
||||
clash)echo -e "$(${bin_path} -v)";;
|
||||
*)echo -e "$(${bin_path} version)";;
|
||||
clash) log debug "$(${bin_path} -v)";;
|
||||
*) log debug "$(${bin_path} version)";;
|
||||
esac
|
||||
[ $(pidof ${bin_name}) ] && \
|
||||
bin_usage || log warn "${bin_name} service is stopped"
|
||||
;;
|
||||
reload)
|
||||
if [ "${bin_name}" = "clash" ] ; then
|
||||
temporary_config_file
|
||||
log info "Open yacd-meta/configs"
|
||||
log info "klik reload configs"
|
||||
else
|
||||
log info "only for Clash"
|
||||
fi
|
||||
(${bin_path} -t -d ${data_dir}/clash -f ${data_dir}/run/config.yaml > "${run_path}/${bin_name}-report.log") && \
|
||||
log info "config.yaml passed" || log info "config.yaml ceks failed"
|
||||
;;
|
||||
*)
|
||||
echo "$0: usage: $0 {start|testing|stop|restart|usage|reload}"
|
||||
echo "$0: usage: $0 {start|stop|restart|usage}"
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -6,233 +6,283 @@ source /data/adb/box/settings.ini
|
||||
|
||||
user_agent="${bin_name}"
|
||||
|
||||
# membuat log pada terminal
|
||||
logs() {
|
||||
export TZ=Asia/Jakarta
|
||||
now=$(date +"%I.%M %p %z")
|
||||
case $1 in
|
||||
info)[ -t 1 ] && echo -n "\033[1;34m${now} [info]: $2\033[0m" || echo -n "${now} [info]: $2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
port)[ -t 1 ] && echo -n "\033[1;33m$2 \033[0m" || echo -n "$2 " | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
|
||||
testing)[ -t 1 ] && echo -n "\033[1;34m$2\033[0m" || echo -n "$2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
succes)[ -t 1 ] && echo -n "\033[1;32m$2 \033[0m" || echo -n "$2 " | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
failed)[ -t 1 ] && echo -n "\033[1;31m$2 \033[0m" || echo -n "$2 " | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
|
||||
*)[ -t 1 ] && echo -n "\033[1;35m${now} [$1]: $2\033[0m" || echo -n "${now} [$1]: $2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
esac
|
||||
now=$(date +"%I.%M %p %Z")
|
||||
if [ -t 1 ]; then
|
||||
case $1 in
|
||||
info) echo -n "\033[1;34m${now} [info]: $2\033[0m";;
|
||||
port) echo -n "\033[1;33m$2 \033[0m";;
|
||||
testing) echo -n "\033[1;34m$2\033[0m";;
|
||||
success) echo -n "\033[1;32m$2 \033[0m";;
|
||||
failed) echo -n "\033[1;31m$2 \033[0m";;
|
||||
*) echo -n "\033[1;35m${now} [$1]: $2\033[0m";;
|
||||
esac
|
||||
else
|
||||
case $1 in
|
||||
info) echo -n "${now} [info]: $2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
port) echo -n "$2 " | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
testing) echo -n "$2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
success) echo -n "$2 " | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
failed) echo -n "$2 " | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
*) echo -n "${now} [$1]: $2" | tee -a ${logs_file} >> /dev/null 2>&1;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
testing () {
|
||||
# Memeriksa koneksi internet dengan mlbox
|
||||
testing() {
|
||||
logs info "dns="
|
||||
for network in $(${data_dir}/bin/mlbox -timeout=5 -dns="-qtype=A -domain=asia.pool.ntp.org" | grep -v 'timeout' | grep -E '[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}') ; do
|
||||
local ntpip=${network}
|
||||
break
|
||||
for network in $(${data_dir}/bin/mlbox -timeout=5 -dns="-qtype=A -domain=asia.pool.ntp.org" | grep -v 'timeout' | grep -E '[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}'); do
|
||||
ntpip=${network}
|
||||
break
|
||||
done
|
||||
|
||||
if [ -n "${ntpip}" ] ; then
|
||||
logs succes "done"
|
||||
if [ -n "${ntpip}" ]; then
|
||||
logs success "done"
|
||||
|
||||
logs testing "http="
|
||||
httpIP=$(${data_dir}/bin/mlbox -timeout=5 -http="http://182.254.116.116/d?dn=reddit.com&clientip=1" 2>&1 | grep -Ev 'timeout|httpGetResponse' | grep -E '[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}')
|
||||
if [ -n "${httpIP}" ] ; then
|
||||
httpIP="${httpIP#*\|}"
|
||||
logs succes "done"
|
||||
else
|
||||
logs failed "failed"
|
||||
fi
|
||||
|
||||
logs testing "https="
|
||||
httpsResp=$(${data_dir}/bin/mlbox -timeout=5 -http="https://api.infoip.io" 2>&1 | grep -Ev 'timeout|httpGetResponse' | grep -E '[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}')
|
||||
[ -n "${httpsResp}" ] && logs succes "done" || logs failed "failed"
|
||||
|
||||
logs testing "udp="
|
||||
currentTime=$(${data_dir}/bin/mlbox -timeout=7 -ntp="${ntpip}" | grep -v 'timeout')
|
||||
echo "${currentTime}" | grep -qi 'LI:' && \
|
||||
logs succes "done" || logs failed "failed"
|
||||
logs testing "http="
|
||||
httpIP=$(${data_dir}/bin/mlbox -timeout=5 -http="http://182.254.116.116/d?dn=reddit.com&clientip=1" 2>&1 | grep -Ev 'timeout|httpGetResponse' | grep -E '[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}')
|
||||
if [ -n "${httpIP}" ]; then
|
||||
httpIP="${httpIP#*\|}"
|
||||
logs success "done"
|
||||
else
|
||||
logs failed "failed"
|
||||
fi
|
||||
|
||||
logs testing "https="
|
||||
httpsResp=$(${data_dir}/bin/mlbox -timeout=5 -http="https://api.infoip.io" 2>&1 | grep -Ev 'timeout|httpGetResponse' | grep -E '[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}')
|
||||
[ -n "${httpsResp}" ] && logs success "done" || logs failed "failed"
|
||||
|
||||
logs testing "udp="
|
||||
currentTime=$(${data_dir}/bin/mlbox -timeout=7 -ntp="${ntpip}" | grep -v 'timeout')
|
||||
echo "${currentTime}" | grep -qi 'LI:' && \
|
||||
logs success "done" || logs failed "failed"
|
||||
else
|
||||
logs failed "failed"
|
||||
fi
|
||||
logs failed "failed"
|
||||
fi
|
||||
|
||||
[ -t 1 ] && echo "\033[1;31m""\033[0m" || echo "" | tee -a ${logs_file} >> /dev/null 2>&1
|
||||
[ -t 1 ] && echo -e "\033[1;31m\033[0m" || echo "" | tee -a ${logs_file} >> /dev/null 2>&1
|
||||
}
|
||||
|
||||
# Memeriksa koneksi internet dengan mlbox
|
||||
network_check() {
|
||||
if [ -f ${data_dir}/bin/mlbox ] ; then
|
||||
logs info "check internet connection... "
|
||||
httpsResp=$(${data_dir}/bin/mlbox -timeout=5 -http="https://api.infoip.io" 2>&1 | grep -Ev 'timeout|httpGetResponse' | grep -E '[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}')
|
||||
if [ -n "${httpsResp}" ] ; then
|
||||
logs succes "done"
|
||||
else
|
||||
logs failed "failed"
|
||||
flags=false
|
||||
fi
|
||||
if [ -f "${data_dir}/bin/mlbox" ]; then
|
||||
logs info "Checking internet connection... "
|
||||
httpsResp=$(${data_dir}/bin/mlbox -timeout=5 -http="https://api.infoip.io" 2>&1 | grep -Ev 'timeout|httpGetResponse' | grep -E '[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}')
|
||||
if [ -n "${httpsResp}" ]; then
|
||||
logs success "done"
|
||||
else
|
||||
logs failed "failed"
|
||||
flags=false
|
||||
fi
|
||||
fi
|
||||
if [ -t 1 ]; then
|
||||
echo "\033[1;31m""\033[0m"
|
||||
else
|
||||
echo "" | tee -a ${logs_file} >> /dev/null 2>&1
|
||||
fi
|
||||
[ -t 1 ] && echo "\033[1;31m""\033[0m" || echo "" | tee -a ${logs_file} >> /dev/null 2>&1
|
||||
[ "${flags}" != "false" ] || exit 1
|
||||
}
|
||||
|
||||
# Memeriksa apakah suatu binary berjalan dengan mengecek file pid dan cmdline
|
||||
probe_bin_alive() {
|
||||
[ -f ${pid_file} ] && cmd_file="/proc/$(pidof ${bin_name})/cmdline" || return 1
|
||||
[ -f ${cmd_file} ] && grep -q ${bin_name} ${cmd_file} && return 0 || return 1
|
||||
}
|
||||
|
||||
restart_box() {
|
||||
${scripts_dir}/box.service stop
|
||||
sleep 0.5
|
||||
${scripts_dir}/box.service start
|
||||
if probe_bin_alive ; then
|
||||
${scripts_dir}/box.iptables renew
|
||||
log debug "$(date) ${bin_name} restart"
|
||||
if [ -f "${pid_file}" ]; then
|
||||
cmd_file="/proc/$(pidof "${bin_name}")/cmdline"
|
||||
if [ -f "${cmd_file}" ] && grep -q "${bin_name}" "${cmd_file}"; then
|
||||
return 0 # binary is alive
|
||||
else
|
||||
return 1 # binary is not alive
|
||||
fi
|
||||
else
|
||||
log error "${bin_name} failed to restart."
|
||||
return 1 # pid file not found, binary is not alive
|
||||
fi
|
||||
}
|
||||
|
||||
# Restart binary, setelah dihentikan dan dijalankan kembali
|
||||
restart_box() {
|
||||
${scripts_dir}/box.service restart
|
||||
sleep 0.5
|
||||
if probe_bin_alive ; then
|
||||
# ${scripts_dir}/box.iptables renew
|
||||
log debug "$(date) ${bin_name} restarted successfully."
|
||||
else
|
||||
log error "Failed to restart ${bin_name}."
|
||||
fi
|
||||
}
|
||||
|
||||
# Set DNS secara manual, mengubah net.ipv4.ip_forward dan net.ipv6.conf.all.forwarding menjadi 1
|
||||
keep_dns() {
|
||||
local_dns1=$(getprop net.dns1)
|
||||
local_dns2=$(getprop net.dns2)
|
||||
if [ "${local_dns1}" != "${static_dns1}" ] ; then
|
||||
# for count in $(seq 1 $(getprop | grep dns | wc -l)); do
|
||||
setprop net.dns1 ${static_dns1}
|
||||
setprop net.dns2 ${static_dns2}
|
||||
# done
|
||||
if [ "${local_dns1}" != "${static_dns1}" ] || [ "${local_dns2}" != "${static_dns2}" ]; then
|
||||
setprop net.dns1 "${static_dns1}"
|
||||
setprop net.dns2 "${static_dns2}"
|
||||
fi
|
||||
if [ "$(sysctl net.ipv4.ip_forward)" != "1" ]; then
|
||||
sysctl -w net.ipv4.ip_forward=1 > /dev/null
|
||||
fi
|
||||
if [ "$(sysctl net.ipv6.conf.all.forwarding)" != "1" ]; then
|
||||
sysctl -w net.ipv6.conf.all.forwarding=1 > /dev/null
|
||||
fi
|
||||
[ "$(sysctl net.ipv4.ip_forward)" != "1" ] && sysctl -w net.ipv4.ip_forward=1
|
||||
[ "$(sysctl net.ipv6.conf.all.forwarding)" != "1" ] && sysctl -w net.ipv6.conf.all.forwarding=1
|
||||
|
||||
unset local_dns1
|
||||
unset local_dns2
|
||||
}
|
||||
|
||||
# Memperbarui file dari URL
|
||||
update_file() {
|
||||
file="$1"
|
||||
file_bak="${file}.bak"
|
||||
update_url="$2"
|
||||
[ -f ${file} ] \
|
||||
&& mv -f ${file} ${file_bak}
|
||||
request="wget"
|
||||
request+=" --no-check-certificate"
|
||||
request+=" --user-agent ${user_agent}"
|
||||
request+=" -O ${file}"
|
||||
request+=" ${update_url}"
|
||||
echo ${request}
|
||||
${request} 2>&1
|
||||
sleep 0.5
|
||||
if [ -f "${file}" ] ; then
|
||||
return 0
|
||||
else
|
||||
[ -f "${file_bak}" ] && mv ${file_bak} ${file}
|
||||
local file="$1"
|
||||
local update_url="$2"
|
||||
local file_bak="${file}.bak"
|
||||
|
||||
if [ -f "${file}" ]; then
|
||||
mv "${file}" "${file_bak}" || return 1
|
||||
fi
|
||||
|
||||
local request="wget"
|
||||
local request+=" --no-check-certificate"
|
||||
local request+=" --user-agent ${user_agent}"
|
||||
local request+=" -O ${file}"
|
||||
local request+=" ${update_url}"
|
||||
|
||||
echo ${request}
|
||||
${request} >&2 || {
|
||||
if [ -f "${file_bak}" ]; then
|
||||
mv "${file_bak}" "${file}" || true
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Memeriksa dan memperbarui geoip dan geosite
|
||||
update_subgeo() {
|
||||
log info "daily updates"
|
||||
network_check
|
||||
|
||||
case "${bin_name}" in
|
||||
clash)
|
||||
if [ "${meta}" = "false" ] ; then
|
||||
geoip_file="${data_dir}/clash/Country.mmdb"
|
||||
geoip_url="https://github.com/Loyalsoldier/geoip/raw/release/Country-only-cn-private.mmdb"
|
||||
else
|
||||
geoip_file="${data_dir}/clash/GeoIP.dat"
|
||||
geoip_url="https://github.com/v2fly/geoip/raw/release/geoip-only-cn-private.dat"
|
||||
fi
|
||||
geoip_file="${data_dir}/clash/$(if [ "${meta}" = "false" ]; then echo "Country.mmdb"; else echo "GeoIP.dat"; fi)"
|
||||
geoip_url="https://github.com/$(if [ "${meta}" = "false" ]; then echo "Loyalsoldier/geoip/raw/release/Country-only-cn-private.mmdb"; else echo "v2fly/geoip/raw/release/geoip-only-cn-private.dat"; fi)"
|
||||
|
||||
geosite_file="${data_dir}/clash/GeoSite.dat"
|
||||
geosite_url="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
|
||||
;;
|
||||
;;
|
||||
sing-box)
|
||||
geoip_file="${data_dir}/sing-box/geoip.db"
|
||||
geoip_url="https://github.com/SagerNet/sing-geoip/releases/download/20221012/geoip-cn.db"
|
||||
geosite_file="${data_dir}/sing-box/geosite.db"
|
||||
geosite_url="https://github.com/CHIZI-0618/v2ray-rules-dat/raw/release/geosite.db"
|
||||
;;
|
||||
;;
|
||||
*)
|
||||
geoip_file="${data_dir}/${bin_name}/geoip.dat"
|
||||
geoip_url="https://github.com/v2fly/geoip/raw/release/geoip-only-cn-private.dat"
|
||||
geosite_file="${data_dir}/${bin_name}/geosite.dat"
|
||||
geosite_url="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
|
||||
;;
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "${auto_updategeox}" = "true" ] ; then
|
||||
if log debug "download ${geoip_url}" && update_file ${geoip_file} ${geoip_url} && log debug "download ${geosite_url}" && update_file ${geosite_file} ${geosite_url} ; then
|
||||
log debug "Update geo $(date +"%Y-%m-%d %I.%M %p")"
|
||||
flag=false
|
||||
fi
|
||||
if [ "${auto_update_geox}" = "true" ] && log debug "Downloading ${geoip_url}" && update_file "${geoip_file}" "${geoip_url}" && log debug "Downloading ${geosite_url}" && update_file "${geosite_file}" "${geosite_url}"; then
|
||||
log debug "Update geo $(date +"%Y-%m-%d %I.%M %p")"
|
||||
flag=false
|
||||
fi
|
||||
if [ "${bin_name}" = "clash" ] ; then
|
||||
if [ "${auto_updatesubcript}" = "true" ] ; then
|
||||
log debug "download ${clash_config}"
|
||||
if update_file ${clash_config} ${subcript_url} ; then
|
||||
flag=true
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${bin_name}" = "clash" ] && [ "${auto_update_subscription}" = "true" ] && update_file "${clash_config}" "${subscription_url}"; then
|
||||
flag=true
|
||||
log debug "Downloading ${clash_config}"
|
||||
fi
|
||||
if [ -f "${pid_file}" ] && [ "${flag}" = "true" ] ; then
|
||||
|
||||
if [ -f "${pid_file}" ] && [ "${flag}" = "true" ]; then
|
||||
restart_box
|
||||
fi
|
||||
}
|
||||
|
||||
# Function for detecting ports used by a process
|
||||
port_detection() {
|
||||
match_count=0
|
||||
if (ss -h > /dev/null 2>&1) ; then
|
||||
port=$(ss -antup | grep "${bin_name}" | awk '$7~/'pid=$(pidof ${bin_name})*'/{print $5}' | awk -F ':' '{print $2}' | sort -u)
|
||||
# Use 'command' function to check if 'ss' is available
|
||||
if command -v ss > /dev/null ; then
|
||||
# Use 'awk' with a regular expression to match the process ID
|
||||
ports=$(ss -antup | awk -v pid="$(pidof "${bin_name}")" '$7 ~ pid {print $5}' | awk -F ':' '{print $2}' | sort -u)
|
||||
else
|
||||
log warn "skip port detected"
|
||||
exit 0
|
||||
# Log a warning message if 'ss' is not available
|
||||
log debug "Warning: 'ss' command not found, skipping port detection." >&2
|
||||
return
|
||||
fi
|
||||
logs debug "${bin_name} port detected: "
|
||||
for sub_port in ${port[*]} ; do
|
||||
sleep 0.5
|
||||
logs port "${sub_port}"
|
||||
done
|
||||
|
||||
[ -t 1 ] && echo "\033[1;31m""\033[0m" || echo "" | tee -a ${logs_file} >> /dev/null 2>&1
|
||||
# Log the detected ports
|
||||
logs debug "${bin_name} port detected: "
|
||||
while read -r port ; do
|
||||
sleep 0.5
|
||||
logs port "${port}"
|
||||
done <<< "${ports}"
|
||||
|
||||
# Add a newline to the output if running in a terminal
|
||||
if [ -t 1 ]; then
|
||||
echo -e "\033[1;31m""\033[0m"
|
||||
else
|
||||
echo "" >> "${logs_file}" 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
# kill bin
|
||||
kill_alive() {
|
||||
for list in ${bin_list[*]} ; do
|
||||
kill -9 $(pidof ${list}) || killall -9 ${list}
|
||||
for list in "${bin_list[@]}" ; do
|
||||
if pgrep "$list" >/dev/null ; then
|
||||
kill -9 $(pgrep "$list") >/dev/null 2>&1 || killall -9 "$list" >/dev/null 2>&1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
update_kernel() {
|
||||
# su -c /data/adb/box/scripts/box.tool upcore
|
||||
network_check
|
||||
if [ $(uname -m) = "aarch64" ] ; then
|
||||
arch="arm64"
|
||||
platform="android"
|
||||
else
|
||||
arch="armv7"
|
||||
platform="linux"
|
||||
fi
|
||||
local file_kernel="${bin_name}-${arch}"
|
||||
case $(uname -m) in
|
||||
"aarch64") arch="arm64"; platform="android" ;;
|
||||
"armv7l") arch="armv7"; platform="linux" ;;
|
||||
"i686") arch="386"; platform="linux" ;;
|
||||
"x86_64") arch="amd64"; platform="linux" ;;
|
||||
*) log warn "Unsupported architecture: $(uname -m)" >&2; exit 1 ;;
|
||||
esac
|
||||
# Lakukan hal lainnya di bawah ini
|
||||
file_kernel="${bin_name}-${arch}"
|
||||
case "${bin_name}" in
|
||||
sing-box)
|
||||
local sing_box_version_temp=$(wget --no-check-certificate -qO- "https://api.github.com/repos/SagerNet/sing-box/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||
local sing_box_version=${sing_box_version_temp:1}
|
||||
download_link="https://github.com/SagerNet/sing-box/releases/download/${sing_box_version_temp}/sing-box-${sing_box_version}-${platform}-${arch}.tar.gz"
|
||||
url_api="https://api.github.com/repos/SagerNet/sing-box/releases/latest"
|
||||
url_down="https://github.com/SagerNet/sing-box/releases"
|
||||
sing_box_version_temp=$(wget --no-check-certificate -qO- "${url_api}" | grep '"tag_name":' | cut -d'"' -f4)
|
||||
sing_box_version=${sing_box_version_temp#v}
|
||||
download_link="${url_down}/download/${sing_box_version_temp}/sing-box-${sing_box_version}-${platform}-${arch}.tar.gz"
|
||||
log debug "download ${download_link}"
|
||||
update_file "${data_dir}/${file_kernel}.tar.gz" "${download_link}"
|
||||
[ "$?" = "0" ] && kill_alive > /dev/null 2>&1
|
||||
# [ "$?" = "0" ] && kill_alive > /dev/null 2>&1
|
||||
;;
|
||||
clash)
|
||||
if [ "${meta}" = "true" ] ; then
|
||||
tag="Prerelease-Alpha"
|
||||
tag_name="alpha-[0-9,a-z]+"
|
||||
# set meta and dev flags
|
||||
meta=true
|
||||
dev=true
|
||||
# if meta flag is true, download clash.meta
|
||||
if [ "${meta}" = "true" ]; then
|
||||
# set download link and get the latest version
|
||||
download_link="https://github.com/taamarin/Clash.Meta/releases"
|
||||
local latest_version=$(wget --no-check-certificate -qO- "${download_link}/expanded_assets/${tag}" | grep -oE "${tag_name}" | head -1)
|
||||
filename="clash.meta"
|
||||
filename+="-${platform}"
|
||||
filename+="-${arch}"
|
||||
filename+="-cgo"
|
||||
tag=$(wget --no-check-certificate -qO- ${download_link} | grep -oE 'tag\/([^"]+)' | cut -d '/' -f 2 | head -1)
|
||||
latest_version=$(wget --no-check-certificate -qO- "${download_link}/expanded_assets/${tag}" | grep -oE "alpha-[0-9,a-z]+" | head -1)
|
||||
# set the filename based on platform and architecture
|
||||
filename="clash.meta-${platform}-${arch}"
|
||||
[ $(uname -m) != "aarch64" ] || filename+="-cgo"
|
||||
filename+="-${latest_version}"
|
||||
# download and update the file
|
||||
log debug "download ${download_link}/download/${tag}/${filename}.gz"
|
||||
update_file "${data_dir}/${file_kernel}.gz" "${download_link}/download/${tag}/${filename}.gz"
|
||||
# if meta flag is false, download clash premium/dev
|
||||
else
|
||||
if [ "${dev}" != "false" ] ; then
|
||||
# if dev flag is true, download latest dev version
|
||||
if [ "${dev}" != "false" ]; then
|
||||
download_link="https://release.dreamacro.workers.dev/latest"
|
||||
log debug "download ${download_link}/clash-linux-${arch}-latest.gz"
|
||||
update_file "${data_dir}/${file_kernel}.gz" "${download_link}/clash-linux-${arch}-latest.gz"
|
||||
# if dev flag is false, download latest premium version
|
||||
else
|
||||
download_link="https://github.com/Dreamacro/clash/releases"
|
||||
filename=$(wget --no-check-certificate -qO- "${download_link}/expanded_assets/premium" | grep -oE "clash-linux-${arch}-[0-9]+.[0-9]+.[0-9]+" | head -1)
|
||||
@@ -240,31 +290,42 @@ update_kernel() {
|
||||
update_file "${data_dir}/${file_kernel}.gz" "${download_link}/download/premium/${filename}.gz"
|
||||
fi
|
||||
fi
|
||||
[ "$?" = "0" ] && kill_alive > /dev/null 2>&1
|
||||
# if the update_file command was successful, kill the alive process
|
||||
# [ "$?" = "0" ] && kill_alive > /dev/null 2>&1
|
||||
;;
|
||||
xray)
|
||||
# set download link and get the latest version
|
||||
latest_version=$(wget --no-check-certificate -qO- https://api.github.com/repos/XTLS/Xray-core/releases | grep "tag_name" | grep -o "v[0-9.]*" | head -1)
|
||||
case $(uname -m) in
|
||||
"i386") download_file="Xray-linux-32.zip" ;;
|
||||
"x86_64") download_file="Xray-linux-64.zip" ;;
|
||||
"armv7l") download_file="Xray-linux-arm32-v7a.zip" ;;
|
||||
"aarch64") download_file="Xray-android-arm64-v8a.zip" ;;
|
||||
*) log error "Unsupported architecture: $(uname -m)" >&2; exit 1 ;;
|
||||
esac
|
||||
# Lakukan hal lainnya di bawah ini
|
||||
download_link="https://github.com/XTLS/Xray-core/releases"
|
||||
github_api="https://api.github.com/repos/XTLS/Xray-core/releases"
|
||||
local latest_version=$(wget --no-check-certificate -qO- ${github_api} | grep "tag_name" | grep -o "v[0-9.]*" | head -1)
|
||||
|
||||
[ $(uname -m) != "aarch64" ] \
|
||||
&& download_file="Xray-linux-arm32-v7a.zip" || download_file="Xray-android-arm64-v8a.zip"
|
||||
|
||||
log debug "download ${download_link}/download/${latest_version}/${download_file}"
|
||||
log debug "Downloading ${download_link}/download/${latest_version}/${download_file}"
|
||||
update_file "${data_dir}/${file_kernel}.zip" "${download_link}/download/${latest_version}/${download_file}"
|
||||
[ "$?" = "0" ] && kill_alive > /dev/null 2>&1
|
||||
# if the update_file command was successful, kill the alive process
|
||||
# [ "$?" = "0" ] && kill_alive > /dev/null 2>&1
|
||||
;;
|
||||
v2fly)
|
||||
# set download link and get the latest version
|
||||
latest_version=$(wget --no-check-certificate -qO- https://api.github.com/repos/v2fly/v2ray-core/releases | grep "tag_name" | grep -o "v[0-9.]*" | head -1)
|
||||
case $(uname -m) in
|
||||
"i386") download_file="v2ray-linux-32.zip" ;;
|
||||
"x86_64") download_file="v2ray-linux-64.zip" ;;
|
||||
"armv7l") download_file="v2ray-linux-arm32-v7a.zip" ;;
|
||||
"aarch64") download_file="v2ray-android-arm64-v8a.zip" ;;
|
||||
*) log error "Unsupported architecture: $(uname -m)" >&2; exit 1 ;;
|
||||
esac
|
||||
# Lakukan hal lainnya di bawah ini
|
||||
download_link="https://github.com/v2fly/v2ray-core/releases"
|
||||
github_api="https://api.github.com/repos/v2fly/v2ray-core/releases"
|
||||
local latest_version=$(wget --no-check-certificate -qO- ${github_api} | grep "tag_name" | grep -o "v[0-9.]*" | head -1)
|
||||
|
||||
[ $(uname -m) != "aarch64" ] \
|
||||
&& download_file="v2ray-linux-arm32-v7a.zip" || download_file="v2ray-android-arm64-v8a.zip"
|
||||
|
||||
log debug "download ${download_link}/download/${latest_version}/${download_file}"
|
||||
log debug "Downloading ${download_link}/download/${latest_version}/${download_file}"
|
||||
update_file "${data_dir}/${file_kernel}.zip" "${download_link}/download/${latest_version}/${download_file}"
|
||||
[ "$?" = "0" ] && kill_alive > /dev/null 2>&1
|
||||
# if the update_file command was successful, kill the alive process
|
||||
# [ "$?" = "0" ] && kill_alive > /dev/null 2>&1
|
||||
;;
|
||||
*)
|
||||
log error "kernel error." && exit 1
|
||||
@@ -273,132 +334,210 @@ update_kernel() {
|
||||
|
||||
case "${bin_name}" in
|
||||
clash)
|
||||
[ -f /system/bin/gunzip ] \
|
||||
&& local extra="/system/bin/gunzip" || local extra="${busybox_path} gunzip"
|
||||
if (${extra} "${data_dir}/${file_kernel}.gz" >&2) ; then
|
||||
mv -f "${data_dir}/${file_kernel}" "${bin_kernel}/${bin_name}" \
|
||||
&& flag="true" || log error "failed to move the kernel"
|
||||
[ -f "${pid_file}" ] && [ "${flag}" = "true" ] \
|
||||
&& restart_box || log debug "${bin_name} does not restart"
|
||||
gunzip_command=$(command -v gunzip >/dev/null 2>&1 && echo "gunzip" || echo "${busybox_path} gunzip")
|
||||
if ${gunzip_command} "${data_dir}/${file_kernel}.gz" >&2 && mv "${data_dir}/${file_kernel}" "${bin_kernel}/${bin_name}"; then
|
||||
[ -f "${pid_file}" ] && restart_box || log debug "${bin_name} does not need to be restarted"
|
||||
else
|
||||
log warn "failed extra file ${data_dir}/${file_kernel}.gz"
|
||||
log error "Failed to extract or move the kernel"
|
||||
fi
|
||||
;;
|
||||
sing-box)
|
||||
[ -f /system/bin/tar ] \
|
||||
&& local extra="/system/bin/tar" || local extra="${busybox_path} tar"
|
||||
if (${extra} -xf "${data_dir}/${file_kernel}.tar.gz" -C ${data_dir}/bin >&2) ; then
|
||||
mv "${data_dir}/bin/sing-box-${sing_box_version}-${platform}-${arch}/sing-box" "${bin_kernel}/${bin_name}"
|
||||
rm -r "${data_dir}/bin/sing-box-${sing_box_version}-${platform}-${arch}" \
|
||||
&& flag="true" || log error "failed to move the kernel"
|
||||
[ -f "${pid_file}" ] && [ "${flag}" = "true" ] \
|
||||
&& restart_box || log debug "${bin_name} does not restart"
|
||||
tar_command=$(command -v tar >/dev/null 2>&1 && echo "tar" || echo "${busybox_path} tar")
|
||||
if ${tar_command} -xf "${data_dir}/${file_kernel}.tar.gz" -C "${data_dir}/bin" >&2 && mv "${data_dir}/bin/sing-box-${sing_box_version}-${platform}-${arch}/sing-box" "${bin_kernel}/${bin_name}" && rm -r "${data_dir}/bin/sing-box-${sing_box_version}-${platform}-${arch}"; then
|
||||
[ -f "${pid_file}" ] && restart_box || log debug "${bin_name} does not need to be restarted"
|
||||
else
|
||||
log warn "failed extra file ${data_dir}/${file_kernel}.gz"
|
||||
log warn "failed to extract ${data_dir}/${file_kernel}.tar.gz" && flag="false"
|
||||
fi
|
||||
;;
|
||||
v2fly)
|
||||
[ -f /system/bin/unzip ] \
|
||||
&& local extra="/system/bin/unzip" || local extra="${busybox_path} unzip"
|
||||
if (${extra} -o "${data_dir}/${file_kernel}.zip" "v2ray" -d ${bin_kernel} >&2) ; then
|
||||
mv "${bin_kernel}/v2ray" "${bin_kernel}/v2fly" \
|
||||
&& flag="true" || log error "failed to move the kernel"
|
||||
[ -f "${pid_file}" ] && [ "${flag}" = "true" ] \
|
||||
&& restart_box || log debug "${bin_name} does not restart"
|
||||
unzip_command=$(command -v unzip >/dev/null 2>&1 && echo "unzip" || echo "${busybox_path} unzip")
|
||||
if ${unzip_command} -o "${data_dir}/${file_kernel}.zip" "v2ray" -d "${bin_kernel}" >&2; then
|
||||
if mv "${bin_kernel}/v2ray" "${bin_kernel}/v2fly"; then
|
||||
[ -f "${pid_file}" ] && restart_box || log debug "${bin_name} does not need to be restarted"
|
||||
else
|
||||
log error "failed to move the kernel"
|
||||
fi
|
||||
else
|
||||
log warn "failed extra file ${data_dir}/${file_kernel}.gz"
|
||||
log warn "failed to extract ${data_dir}/${file_kernel}.zip"
|
||||
fi
|
||||
;;
|
||||
xray)
|
||||
[ -f /system/bin/unzip ] \
|
||||
&& local extra="/system/bin/unzip" || local extra="${busybox_path} unzip"
|
||||
if (${extra} -o "${data_dir}/${file_kernel}.zip" "xray" -d ${bin_kernel} >&2) ; then
|
||||
mv "${bin_kernel}/xray" "${bin_kernel}/xray" \
|
||||
&& flag="true" || log error "failed to move the kernel"
|
||||
[ -f "${pid_file}" ] && [ "${flag}" = "true" ] \
|
||||
&& restart_box || log debug "${bin_name} does not restart"
|
||||
xray)
|
||||
unzip_command=$(command -v unzip >/dev/null 2>&1 && echo "unzip" || echo "${busybox_path} unzip")
|
||||
if ${unzip_command} -o "${data_dir}/${file_kernel}.zip" "xray" -d "${bin_kernel}" >&2; then
|
||||
if mv "${bin_kernel}/xray" "${bin_kernel}/xray"; then
|
||||
[ -f "${pid_file}" ] && restart_box || log debug "${bin_name} does not need to be restarted"
|
||||
else
|
||||
log error "failed to move the kernel"
|
||||
fi
|
||||
else
|
||||
log warn "failed extra file ${data_dir}/${file_kernel}.gz"
|
||||
log warn "failed to extract ${data_dir}/${file_kernel}.zip"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
log error "kernel error." && exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
find "${data_dir}" -type f -name "${file_kernel}.*" -delete
|
||||
chown ${box_user_group} ${bin_path}
|
||||
chmod 6755 ${bin_path}
|
||||
}
|
||||
|
||||
# Function to limit cgroup memory
|
||||
cgroup_limit() {
|
||||
[ "${cgroup_memory_limit}" = "" ] && return
|
||||
[ "${cgroup_memory_path}" = "" ] \
|
||||
&& cgroup_memory_path=$(mount | grep cgroup | awk '/memory/{print $3}' | head -1)
|
||||
# Check if cgroup_memory_limit is set
|
||||
if [ -z "${cgroup_memory_limit}" ]; then
|
||||
log warn "cgroup_memory_limit is not set"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if cgroup_memory_path is set and exists
|
||||
if [ -z "${cgroup_memory_path}" ]; then
|
||||
local cgroup_memory_path=$(mount | grep cgroup | awk '/memory/{print $3}' | head -1)
|
||||
if [ -z "${cgroup_memory_path}" ]; then
|
||||
log warn "cgroup_memory_path is not set and cannot be found"
|
||||
return 1
|
||||
fi
|
||||
elif [ ! -d "${cgroup_memory_path}" ]; then
|
||||
log warn "${cgroup_memory_path} does not exist"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if pid_file is set and exists
|
||||
if [ -z "${pid_file}" ]; then
|
||||
log warn "pid_file is not set"
|
||||
return 1
|
||||
elif [ ! -f "${pid_file}" ]; then
|
||||
log warn "${pid_file} does not exist"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Create cgroup directory and move process to cgroup
|
||||
local bin_name=$(basename "$0")
|
||||
mkdir -p "${cgroup_memory_path}/${bin_name}"
|
||||
echo $(cat ${pid_file}) > "${cgroup_memory_path}/${bin_name}/cgroup.procs" \
|
||||
&& log info "${cgroup_memory_path}/${bin_name}/cgroup.procs"
|
||||
local pid=$(cat "${pid_file}")
|
||||
echo "${pid}" > "${cgroup_memory_path}/${bin_name}/cgroup.procs" \
|
||||
&& log info "Moved process ${pid} to ${cgroup_memory_path}/${bin_name}/cgroup.procs"
|
||||
|
||||
# Set memory limit for cgroup
|
||||
echo "${cgroup_memory_limit}" > "${cgroup_memory_path}/${bin_name}/memory.limit_in_bytes" \
|
||||
&& log info "${cgroup_memory_path}/${bin_name}/memory.limit_in_bytes"
|
||||
&& log info "Set memory limit to ${cgroup_memory_limit} for ${cgroup_memory_path}/${bin_name}/memory.limit_in_bytes"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
update_dashboard() {
|
||||
network_check
|
||||
file_dasboard="${data_dir}/dashboard.zip"
|
||||
rm -rf ${data_dir}/dashboard/dist
|
||||
#url="https://github.com/haishanh/yacd/archive/refs/heads/gh-pages.zip"
|
||||
url="https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip"
|
||||
dir_name="Yacd-meta-gh-pages"
|
||||
wget --no-check-certificate "${url}" -O ${file_dasboard} 2>&1
|
||||
unzip -o "${file_dasboard}" "${dir_name}/*" -d "${data_dir}/dashboard" >&2
|
||||
mv -f ${data_dir}/dashboard/"${dir_name}" "${data_dir}/dashboard/dist"
|
||||
rm -rf ${file_dasboard}
|
||||
if [ "${bin_name}" = "sing-box" ] || [ "${bin_name}" = "clash" ]; then
|
||||
file_dashboard="${data_dir}/${bin_name}/dashboard.zip"
|
||||
rm -rf "${data_dir}/${bin_name}/dashboard/dist"
|
||||
url="https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip"
|
||||
dir_name="Yacd-meta-gh-pages"
|
||||
wget --no-check-certificate "${url}" -O "${file_dashboard}" 2>&1
|
||||
unzip -o "${file_dashboard}" "${dir_name}/*" -d "${data_dir}/${bin_name}/dashboard" >&2
|
||||
mv -f "${data_dir}/${bin_name}/dashboard/${dir_name}" "${data_dir}/${bin_name}/dashboard/dist"
|
||||
rm -f "${file_dashboard}"
|
||||
else
|
||||
log debug "${bin_name} does not support dashboards"
|
||||
fi
|
||||
}
|
||||
|
||||
run_base64() {
|
||||
if [ "$(cat ${data_dir}/sing-box/acc.txt 2>&1)" != "" ] ; then
|
||||
log info "$(cat ${data_dir}/sing-box/acc.txt 2>&1)"
|
||||
base64 ${data_dir}/sing-box/acc.txt > ${data_dir}/dashboard/dist/proxy.txt
|
||||
log info "ceks ${data_dir}/dashboard/dist/proxy.txt"
|
||||
log info "done"
|
||||
acc_file="${data_dir}/sing-box/acc.txt"
|
||||
proxy_file="${data_dir}/dashboard/dist/proxy.txt"
|
||||
|
||||
if [ -s "$acc_file" ]; then
|
||||
log info "$(cat "$acc_file" 2>&1)"
|
||||
base64 "${acc_file}" > "${proxy_file}"
|
||||
log info "Generated ${proxy_file}"
|
||||
log info "Done"
|
||||
else
|
||||
log warn "${data_dir}/sing-box/acc.txt is empty"
|
||||
log warn "${acc_file} is empty or does not exist"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
cp_bin () {
|
||||
( cp /data/adb/box/bin/* /data/adb/modules/box_for_magisk/system/bin ) && log debug "file copy done"
|
||||
# copy bin ke system/bin
|
||||
cp_bin() {
|
||||
if cp /data/adb/box/bin/* /data/adb/modules/box_for_magisk/system/bin/; then
|
||||
log debug "File copy completed successfully."
|
||||
else
|
||||
log debug "File copy failed." >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
reload() {
|
||||
case "${bin_name}" in
|
||||
sing-box)
|
||||
if ${bin_path} check -D "${data_dir}/${bin_name}" > "${run_path}/${bin_name}-report.log" 2>&1; then
|
||||
log info "config.json passed"
|
||||
log info "Open yacd-meta/configs and click 'Reload Configs'"
|
||||
else
|
||||
log error "config.json check failed"
|
||||
cat "${run_path}/${bin_name}-report.log" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
clash)
|
||||
if ${bin_path} -t -d "${data_dir}/clash" -f "${clash_config}" > "${run_path}/${bin_name}-report.log" 2>&1; then
|
||||
log info "config.yaml passed"
|
||||
log info "Open yacd-meta/configs and click 'Reload Configs'"
|
||||
else
|
||||
log error "config.yaml check failed"
|
||||
cat "${run_path}/${bin_name}-report.log" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
log error "Unknown binary: ${bin_name}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
subgeo)
|
||||
update_subgeo
|
||||
find ${data_dir}/${bin_name} -type f -name "*.db.bak" | xargs rm -f
|
||||
find ${data_dir}/${bin_name} -type f -name "*.dat.bak" | xargs rm -f
|
||||
;;
|
||||
testing)
|
||||
testing
|
||||
;;
|
||||
port)
|
||||
port_detection
|
||||
;;
|
||||
cgroup)
|
||||
cgroup_limit
|
||||
;;
|
||||
upcore)
|
||||
update_kernel
|
||||
;;
|
||||
upyacd)
|
||||
update_dashboard
|
||||
;;
|
||||
rbase64)
|
||||
run_base64
|
||||
;;
|
||||
keepdns)
|
||||
keep_dns
|
||||
;;
|
||||
connect)
|
||||
network_check
|
||||
;;
|
||||
rbase64)
|
||||
run_base64
|
||||
;;
|
||||
upyacd)
|
||||
update_dashboard
|
||||
;;
|
||||
upcore)
|
||||
update_kernel
|
||||
;;
|
||||
cgroup)
|
||||
cgroup_limit
|
||||
;;
|
||||
port)
|
||||
port_detection
|
||||
;;
|
||||
subgeo)
|
||||
update_subgeo
|
||||
find "${data_dir}/${bin_name}" -type f -name "*.db.bak" -delete
|
||||
find "${data_dir}/${bin_name}" -type f -name "*.dat.bak" -delete
|
||||
;;
|
||||
reload)
|
||||
reload
|
||||
;;
|
||||
all)
|
||||
for list in "${bin_list[@]}" ; do
|
||||
bin_name="${list}"
|
||||
update_kernel
|
||||
update_subgeo
|
||||
done
|
||||
;;
|
||||
*)
|
||||
echo "$0: usage: $0 {connect|rbase64|upyacd|upcore|cgroup|port|subgeo}"
|
||||
echo "$0: usage: $0 {reload|testing|keepdns|connect|rbase64|upyacd|upcore|cgroup|port|subgeo|all}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -1,26 +1,28 @@
|
||||
#!/system/bin/sh
|
||||
|
||||
moddir="/data/adb/modules/box_for_magisk"
|
||||
if [ -n "$(magisk -v | grep lite)" ] ; then
|
||||
moddir=/data/adb/lite_modules/box_for_magisk
|
||||
if [ -n "$(magisk -v | grep lite)" ]; then
|
||||
moddir="/data/adb/lite_modules/box_for_magisk"
|
||||
fi
|
||||
|
||||
scripts_dir="/data/adb/box/scripts"
|
||||
|
||||
refresh_box() {
|
||||
if [ -f /data/adb/box/run/box.pid ] ; then
|
||||
${scripts_dir}/box.service stop >> /dev/null 2>&1
|
||||
${scripts_dir}/box.iptables disable >> /dev/null 2>&1
|
||||
if [ -f "/data/adb/box/run/box.pid" ]; then
|
||||
"${scripts_dir}/box.service" stop >> "/dev/null" 2>&1
|
||||
"${scripts_dir}/box.iptables" disable >> "/dev/null" 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
start_service() {
|
||||
if [ ! -f /data/adb/box/manual ] ; then
|
||||
[ -f ${moddir}/disable ] || \
|
||||
${scripts_dir}/box.service start >> /dev/null 2>&1
|
||||
[ -f /data/adb/box/run/box.pid ] && \
|
||||
${scripts_dir}/box.iptables enable >> /dev/null 2>&1
|
||||
inotifyd ${scripts_dir}/box.inotify ${moddir} >> /dev/null 2>&1 &
|
||||
if [ ! -f "/data/adb/box/manual" ]; then
|
||||
if [ ! -f "${moddir}/disable" ]; then
|
||||
"${scripts_dir}/box.service" start >> "/dev/null" 2>&1
|
||||
fi
|
||||
if [ -f "/data/adb/box/run/box.pid" ]; then
|
||||
"${scripts_dir}/box.iptables" enable >> "/dev/null" 2>&1
|
||||
fi
|
||||
inotifyd "${scripts_dir}/box.inotify" "${moddir}" >> "/dev/null" 2>&1 &
|
||||
# echo -n $! > /data/adb/box/run/inotifyd.pid
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -1,145 +0,0 @@
|
||||
# port: 9494
|
||||
# socks-port: 9595
|
||||
# mixed-port: 9696
|
||||
redir-port: 9797
|
||||
tproxy-port: 9898
|
||||
mode: rule
|
||||
allow-lan: true
|
||||
unified-delay: true
|
||||
bind-address: '*'
|
||||
# info / warning / error / debug / silent
|
||||
log-level: warning
|
||||
ipv6: false
|
||||
geodata-mode: true
|
||||
geodata-loader: memconservative
|
||||
external-controller: 0.0.0.0:9090
|
||||
external-controller-tls: 0.0.0.0:9091 # RESTful API HTTPS device
|
||||
# secret: "123456"
|
||||
external-ui: ../dashboard/dist
|
||||
tcp-concurrent: false
|
||||
inbound-tfo: true
|
||||
# global-client-fingerprint: chrome
|
||||
# interface-name: ""
|
||||
# routing-mark: 233
|
||||
geox-url:
|
||||
mmdb: "https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb"
|
||||
geoip: "https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geoip.dat"
|
||||
geosite: "https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geosite.dat"
|
||||
# - always, Diaktifkan untuk memaksa semua proses agar cocok
|
||||
# - strict, Secara default, ini dinilai dari √clash apakah diaktifkan atau tidak
|
||||
# - off, tidak cocok dengan prosesnya, disarankan untuk menggunakan mode ini di router
|
||||
find-process-mode: strict # always, strict, off
|
||||
|
||||
profile:
|
||||
store-selected: true
|
||||
store-fake-ip: false
|
||||
|
||||
# experimental:
|
||||
# sniff-tls-sni: false
|
||||
# udp-fallback-match: false
|
||||
# # fingerprint: ""
|
||||
|
||||
sniffer:
|
||||
enable: false
|
||||
## 对 redir-host 类型识别的流量进行强制嗅探
|
||||
## 如:Tun、Redir 和 TProxy 并 DNS 为 redir-host 皆属于
|
||||
force-dns-mapping: true
|
||||
parse-pure-ip: true
|
||||
override-destination: true
|
||||
sniff:
|
||||
TLS:
|
||||
# ports:[443, 8443]
|
||||
HTTP:
|
||||
ports: [80, 8080-8880]
|
||||
override-destination: true
|
||||
force-domain:
|
||||
- +.v2ex.com
|
||||
# skip-domain:
|
||||
# - +.google.com
|
||||
sniffing:
|
||||
- tls
|
||||
- http
|
||||
port-whitelist:
|
||||
- "80"
|
||||
- "443"
|
||||
|
||||
tun:
|
||||
enable: false
|
||||
# biarkan default utun
|
||||
device: utun
|
||||
mtu: 9000
|
||||
# gvisor / lwip / system
|
||||
stack: system
|
||||
dns-hijack:
|
||||
- any:53
|
||||
auto-route: false
|
||||
auto-detect-interface: false
|
||||
inet4-address: 172.19.0.1/30
|
||||
inet6-address: [fdfe:dcba:9876::1/126]
|
||||
strict_route: false
|
||||
# inet4_route_address:
|
||||
# - 0.0.0.0/1
|
||||
# - 128.0.0.0/1
|
||||
# inet6_route_address:
|
||||
# - "::/1"
|
||||
# - "8000::/1"
|
||||
# include_android_user:
|
||||
# - 0
|
||||
# - 10
|
||||
# include_package:
|
||||
# - com.android.chrome
|
||||
# exclude_package:
|
||||
# - com.android.captiveportallogin
|
||||
|
||||
dns:
|
||||
enable: true
|
||||
ipv6: false
|
||||
prefer-h3: true
|
||||
default-nameserver:
|
||||
- '1.1.1.1'
|
||||
- '8.8.8.8'
|
||||
listen: 0.0.0.0:1053
|
||||
use-hosts: true
|
||||
# redir-host / fake-ip
|
||||
enhanced-mode: fake-ip
|
||||
fake-ip-range: 43.0.0.1/8
|
||||
fake-ip-filter:
|
||||
- '+.lan'
|
||||
- '+.stun.*.*'
|
||||
- '+.stun.*.*.*'
|
||||
- '+.stun.*.*.*.*'
|
||||
- '+.stun.*.*.*.*.*'
|
||||
nameserver:
|
||||
- '1.1.1.1'
|
||||
- 'tls://1.0.0.1:853'
|
||||
- '8.8.8.8'
|
||||
- 'tls://8.8.4.4:853'
|
||||
# - 'tls://1.1.1.1:853' # DNS over TLS
|
||||
# - 'tls://1dot1dot1dot1.cloudflare-dns.com:853'
|
||||
# - https://doh.pub/dns-query # DNS over HTTPS
|
||||
# - https://dns.alidns.com/dns-query#h3=true
|
||||
# - https://mozilla.cloudflare-dns.com/dns-query#clash&h3=true
|
||||
# proxy-server-nameserver:
|
||||
# - '1.1.1.1'
|
||||
# # nameserver-policy:
|
||||
# # '+.googlesyndication.com': 1.1.1.1
|
||||
# fallback:
|
||||
# - 'https://8.8.8.8/dns-query'
|
||||
# - 'tcp://8.8.4.4'
|
||||
# # - 'quic://dns.adguard.com:784' # DNS over QUIC
|
||||
# fallback-filter:
|
||||
# geoip: false
|
||||
# geoip-code: 'ID'
|
||||
# geosite:
|
||||
# # - gfw
|
||||
# ipcidr:
|
||||
# # - 240.0.0.0/4
|
||||
# domain:
|
||||
# - '+.google.com'
|
||||
# - '+.facebook.com'
|
||||
# - '+.youtube.com'
|
||||
# - '+.github.com'
|
||||
hosts:
|
||||
'ota.googlezip.net': 127.0.0.1
|
||||
'ota-cache1.googlezip.net': 127.0.0.1
|
||||
'ota-cache2.googlezip.net': 127.0.0.1
|
||||
@@ -35,14 +35,12 @@
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "104.21.235.171",
|
||||
"address": "server.com",
|
||||
"port": 80,
|
||||
"users": [
|
||||
{
|
||||
"alterId": 0,
|
||||
"encryption": "",
|
||||
"flow": "",
|
||||
"id": "uuid",
|
||||
"id": "aaa-aaa-aaa",
|
||||
"level": 8,
|
||||
"security": "auto"
|
||||
}
|
||||
@@ -52,12 +50,16 @@
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "ws",
|
||||
"security": "",
|
||||
"security": "none",
|
||||
"tlsSettings": {
|
||||
"allowInsecure": false,
|
||||
"serverName": "sni.com"
|
||||
},
|
||||
"wsSettings": {
|
||||
"headers": {
|
||||
"Host": "x-ui-llyc.hidedns.me"
|
||||
"Host": "host.com"
|
||||
},
|
||||
"path": "/pulsa"
|
||||
"path": "/sheynsw"
|
||||
}
|
||||
},
|
||||
"tcpSettings": null,
|
||||
@@ -89,7 +91,7 @@
|
||||
"tag": "dns-out",
|
||||
"protocol": "dns",
|
||||
"settings": {
|
||||
"address": "1.1.1.1"
|
||||
"address": "8.8.8.8"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -100,7 +102,7 @@
|
||||
"domain:ota-cache2.googlezip.net": "127.0.0.1"
|
||||
},
|
||||
"servers": [
|
||||
"8.8.8.8"
|
||||
"1.1.1.1"
|
||||
],
|
||||
"tag": "dns",
|
||||
"queryStrategy": "UseIP"
|
||||
@@ -117,21 +119,6 @@
|
||||
],
|
||||
"outboundTag": "dns-out"
|
||||
},
|
||||
{
|
||||
"ip": [
|
||||
"1.1.1.1"
|
||||
],
|
||||
"outboundTag": "proxy",
|
||||
"port": "53",
|
||||
"type": "field"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"outboundTag": "direct",
|
||||
"protocol": [
|
||||
"bittorrent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain": [
|
||||
"regexp:\\.googlesyndication.com$"
|
||||
|
||||
@@ -29,51 +29,11 @@
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"tag": "proxy",
|
||||
"protocol": "vmess",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "104.21.235.171",
|
||||
"port": 80,
|
||||
"users": [
|
||||
{
|
||||
"alterId": 0,
|
||||
"encryption": "",
|
||||
"flow": "",
|
||||
"id": "uuid",
|
||||
"level": 8,
|
||||
"security": "auto"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "ws",
|
||||
"security": "",
|
||||
"wsSettings": {
|
||||
"headers": {
|
||||
"Host": "x-ui-llyc.hidedns.me"
|
||||
},
|
||||
"path": "/pulsa"
|
||||
}
|
||||
},
|
||||
"tcpSettings": null,
|
||||
"sockopt": {
|
||||
"domainStrategy": "UseIP"
|
||||
},
|
||||
"mux": {
|
||||
"concurrency": 8,
|
||||
"enabled": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "direct",
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"domainStrategy": "UseIP"
|
||||
"domainStrategy": "UseIPv4"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -89,7 +49,50 @@
|
||||
"tag": "dns-out",
|
||||
"protocol": "dns",
|
||||
"settings": {
|
||||
"address": "1.1.1.1"
|
||||
"address": "8.8.8.8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "proxy",
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "128.199.233.181",
|
||||
"port": 443,
|
||||
"users": [
|
||||
{
|
||||
"encryption": "none",
|
||||
"flow": "xtls-rprx-vision",
|
||||
"id": "8aeaf535-f729-4330-9474-669726f8c9d7",
|
||||
"level": 8,
|
||||
"security": "auto"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "tls",
|
||||
"tcpSettings": {
|
||||
"header": {
|
||||
"type": "none"
|
||||
}
|
||||
},
|
||||
"tlsSettings": {
|
||||
"allowInsecure": true,
|
||||
"fingerprint": "",
|
||||
"serverName": "www.google.com"
|
||||
}
|
||||
},
|
||||
"mux": {
|
||||
"concurrency": 8,
|
||||
"enabled": false
|
||||
},
|
||||
"tcpSettings": null,
|
||||
"sockopt": {
|
||||
"domainStrategy": "UseIPv4"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -103,7 +106,7 @@
|
||||
"8.8.8.8"
|
||||
],
|
||||
"tag": "dns",
|
||||
"queryStrategy": "UseIP"
|
||||
"queryStrategy": "UseIPv4"
|
||||
},
|
||||
"routing": {
|
||||
"domainStrategy": "IPIfNonMatch",
|
||||
@@ -117,21 +120,6 @@
|
||||
],
|
||||
"outboundTag": "dns-out"
|
||||
},
|
||||
{
|
||||
"ip": [
|
||||
"1.1.1.1"
|
||||
],
|
||||
"outboundTag": "proxy",
|
||||
"port": "53",
|
||||
"type": "field"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"outboundTag": "direct",
|
||||
"protocol": [
|
||||
"bittorrent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain": [
|
||||
"regexp:\\.googlesyndication.com$"
|
||||
|
||||
Reference in New Issue
Block a user