Compare commits

..
120 Commits
Author SHA1 Message Date
action a97651184f update 2026-11-01 11:53:54
marry-jell / merge (push) Waiting to run
2026-11-01 11:53:54 +08:00
action 24c9105eb9 update 2026-11-01 06:58:38 2026-11-01 06:58:38 +08:00
action 04b58d28a1 update 2026-10-31 18:07:25 2026-10-31 18:07:25 +08:00
action 6ce64f7ba2 update 2026-10-31 11:45:08 2026-10-31 11:45:08 +08:00
action 4cbbab4563 update 2026-10-31 07:26:01 2026-10-31 07:26:01 +08:00
action 00e269d429 update 2026-10-31 01:37:59 2026-10-31 01:37:59 +08:00
action a60cfc3dee update 2026-10-30 18:48:17 2026-10-30 18:48:17 +08:00
action 850d89d8e3 update 2026-10-30 12:00:24 2026-10-30 12:00:24 +08:00
action 99d6229f91 update 2026-10-30 07:45:21 2026-10-30 07:45:21 +08:00
action 76e81abc86 update 2026-10-30 01:55:00 2026-10-30 01:55:00 +08:00
action 95f76f26d3 update 2026-10-29 18:46:39 2026-10-29 18:46:39 +08:00
action e2f86e09f4 update 2026-10-29 11:59:06 2026-10-29 11:59:06 +08:00
action bc85557d34 update 2026-10-29 07:49:11 2026-10-29 07:49:11 +08:00
action 4b8b360547 update 2026-10-29 01:48:05 2026-10-29 01:48:05 +08:00
action 36d6943a0b update 2026-10-29 01:36:37 2026-10-29 01:36:37 +08:00
cwx 3a91d7a1df Update jell.yml to modify git_sparse_clone entries
Comment out the git_sparse_clone for openwrt-honk and add a new clone for luci-app-honk.
2026-10-29 01:36:03 +08:00
action f01306d457 update 2026-10-28 21:59:16 2026-10-28 21:59:16 +08:00
action d27d8dcd9f update 2026-10-27 17:31:47 2026-10-27 17:31:47 +08:00
action 63a5dffe55 update 2026-10-27 11:22:48 2026-10-27 11:22:48 +08:00
action a4d6470641 update 2026-10-27 07:31:06 2026-10-27 07:31:06 +08:00
action 197c60d843 update 2026-10-27 02:06:14 2026-10-27 02:06:14 +08:00
action 8de6b6ed73 update 2026-10-26 17:35:19 2026-10-26 17:35:19 +08:00
action 2f2bfddf57 update 2026-10-26 10:49:13 2026-10-26 10:49:13 +08:00
action 081b505e64 update 2026-10-26 06:14:13 2026-10-26 06:14:13 +08:00
action 07319b83f4 update 2026-10-26 02:40:26 2026-10-26 02:40:26 +08:00
action bdc73ee156 update 2026-10-25 23:25:42 2026-10-25 23:25:42 +08:00
action 7fca8e9a3a update 2026-10-25 16:53:21 2026-10-25 16:53:21 +08:00
action 91f217be10 update 2026-10-25 10:50:50 2026-10-25 10:50:50 +08:00
action 7d11e45779 update 2026-10-25 06:12:14 2026-10-25 06:12:14 +08:00
action 97b4bdf8c8 update 2026-10-25 02:32:31 2026-10-25 02:32:31 +08:00
action 852fced2b3 update 2026-10-24 23:15:37 2026-10-24 23:15:37 +08:00
action 6d61e8bf50 update 2026-10-24 16:34:19 2026-10-24 16:34:19 +08:00
action b2346e5950 update 2026-10-24 10:57:49 2026-10-24 10:57:49 +08:00
action bb0d48355d update 2026-10-24 06:50:26 2026-10-24 06:50:26 +08:00
action 015941ec68 update 2026-10-24 00:18:10 2026-10-24 00:18:10 +08:00
action 0dc3af034c update 2026-10-23 17:00:19 2026-10-23 17:00:19 +08:00
action 3bae01757c update 2026-10-23 11:01:00 2026-10-23 11:01:00 +08:00
action 990c543d65 update 2026-10-23 06:55:36 2026-10-23 06:55:36 +08:00
action d64c67f0ed update 2026-10-23 00:28:40 2026-10-23 00:28:40 +08:00
action 3f38c69f75 update 2026-10-22 17:05:51 2026-10-22 17:05:51 +08:00
action 06b74cb314 update 2026-10-22 10:57:37 2026-10-22 10:57:37 +08:00
action 72fa0cc54b update 2026-10-22 06:58:37 2026-10-22 06:58:37 +08:00
action 7d3acd4d45 update 2026-10-22 00:28:18 2026-10-22 00:28:18 +08:00
action a9612da342 update 2026-10-21 17:03:19 2026-10-21 17:03:19 +08:00
action 4570f1512e update 2026-10-21 10:58:41 2026-10-21 10:58:41 +08:00
action f144cc6010 update 2026-10-21 06:53:29 2026-10-21 06:53:29 +08:00
action ee55ecd1ef update 2026-10-21 00:12:55 2026-10-21 00:12:55 +08:00
action 57c1b033cd update 2026-10-20 17:03:51 2026-10-20 17:03:51 +08:00
action ab408c1971 update 2026-10-20 11:04:02 2026-10-20 11:04:02 +08:00
action 47987226ff update 2026-10-20 07:15:28 2026-10-20 07:15:28 +08:00
action f322ead2a4 update 2026-10-20 02:12:23 2026-10-20 02:12:23 +08:00
action 313fe55d56 update 2026-10-19 17:31:01 2026-10-19 17:31:01 +08:00
action 6604b3420d update 2026-10-19 10:54:07 2026-10-19 10:54:07 +08:00
action fdd23bf660 update 2026-10-19 06:10:41 2026-10-19 06:10:42 +08:00
action acd7155b51 update 2026-10-19 02:25:00 2026-10-19 02:25:00 +08:00
action 98f89b4fef update 2026-10-18 23:15:13 2026-10-18 23:15:13 +08:00
action 21a5be24ad update 2026-10-18 16:29:22 2026-10-18 16:29:22 +08:00
action e0041d08f8 update 2026-10-18 10:40:47 2026-10-18 10:40:47 +08:00
action e0ea584b8d update 2026-10-18 02:06:11 2026-10-18 02:06:11 +08:00
action b9c5dc7236 update 2026-10-17 22:50:00 2026-10-17 22:50:00 +08:00
action 63dbfd1d1b update 2026-10-17 16:12:15 2026-10-17 16:12:15 +08:00
action fbf8d8b632 update 2026-10-17 10:39:23 2026-10-17 10:39:23 +08:00
action 9d553b1a00 update 2026-10-17 06:25:36 2026-10-17 06:25:36 +08:00
action 544b0b2540 update 2026-10-17 03:19:16 2026-10-17 03:19:16 +08:00
action cb9f7df14a update 2026-10-16 23:56:54 2026-10-16 23:56:54 +08:00
action f87a7ddf22 update 2026-10-16 16:41:18 2026-10-16 16:41:18 +08:00
action 4b2689b979 update 2026-10-16 10:47:46 2026-10-16 10:47:46 +08:00
action e0a60ac545 update 2026-10-16 06:51:30 2026-10-16 06:51:30 +08:00
action 9122882ea3 update 2026-10-16 00:09:36 2026-10-16 00:09:36 +08:00
action eaef2c6d95 update 2026-10-15 16:45:49 2026-10-15 16:45:49 +08:00
action ebedf5b446 update 2026-10-15 10:50:44 2026-10-15 10:50:44 +08:00
action 27917e2b63 update 2026-10-15 06:56:05 2026-10-15 06:56:05 +08:00
action e75bfefc80 update 2026-10-14 17:13:24 2026-10-14 17:13:24 +08:00
action 79897976d6 update 2026-10-14 11:12:00 2026-10-14 11:12:00 +08:00
action c90a1f4fc1 update 2026-10-14 04:56:49 2026-10-14 04:56:49 +08:00
action 1e69cad46b update 2026-10-13 23:30:23 2026-10-13 23:30:23 +08:00
action 09818a2882 update 2026-10-13 13:05:00 2026-10-13 13:05:00 +08:00
action 8c4f64e256 update 2026-10-13 04:47:12 2026-10-13 04:47:12 +08:00
action 681afee1a6 update 2026-10-12 19:35:39 2026-10-12 19:35:39 +08:00
action 1650840a7b update 2026-10-12 11:55:00 2026-10-12 11:55:00 +08:00
action 09632204fd update 2026-10-12 07:23:36 2026-10-12 07:23:36 +08:00
action 5ece75ecfd update 2026-10-12 01:13:21 2026-10-12 01:13:21 +08:00
action 6f8f22eee4 update 2026-10-11 22:01:38 2026-10-11 22:01:38 +08:00
cwx ebe57dfba9 Change branch from master to main for openwrt-honk
Updated branch name from 'master' to 'main' for openwrt-honk repository.
2026-10-11 22:01:10 +08:00
action 4f0804a849 update 2026-10-11 21:59:08 2026-10-11 21:59:08 +08:00
cwx 219ad87c1a Update repository URL for luci-app-honk 2026-10-11 21:58:46 +08:00
action 8ccdf8f9f7 update 2026-10-11 18:30:33 2026-10-11 18:30:33 +08:00
action 93f2a53ca4 update 2026-10-11 11:31:10 2026-10-11 11:31:10 +08:00
action b77f061182 update 2026-10-11 07:08:20 2026-10-11 07:08:20 +08:00
action 7ae707aaa6 update 2026-10-11 00:49:02
marry-jell / merge (push) Canceled after 0s
2026-10-11 00:49:02 +08:00
action 54d5be6086 update 2026-10-10 18:25:08 2026-10-10 18:25:08 +08:00
action f202e2088f update 2026-10-10 11:56:38 2026-10-10 11:56:38 +08:00
action 33877ad635 update 2026-10-10 04:29:04 2026-10-10 04:29:04 +08:00
action cc69bd0f95 update 2026-10-09 22:53:44 2026-10-09 22:53:44 +08:00
action beac9fdb5a update 2026-10-09 12:11:19 2026-10-09 12:11:19 +08:00
action d6b7af2a48 update 2026-10-09 04:58:55 2026-10-09 04:58:55 +08:00
action 9c17634d78 update 2026-10-08 23:08:26 2026-10-08 23:08:26 +08:00
action 2f8de8b88d update 2026-10-08 20:05:36 2026-10-08 20:05:36 +08:00
cwx 4d8fedd7c6 Add sparse clone for luci-app-honk 2026-10-08 20:05:06 +08:00
action a406d6528c update 2026-10-08 13:17:49 2026-10-08 13:17:49 +08:00
action 4c2363b0c6 update 2026-10-08 07:58:49 2026-10-08 07:58:49 +08:00
action 170f9b0957 update 2026-10-08 02:18:41 2026-10-08 02:18:41 +08:00
action bd061545ed update 2026-10-07 18:47:42 2026-10-07 18:47:42 +08:00
action 617f7ca2a6 update 2026-10-07 11:52:44 2026-10-07 11:52:44 +08:00
action d6cc6efa77 update 2026-10-07 04:44:36 2026-10-07 04:44:36 +08:00
action a2da411394 update 2026-10-06 22:40:04 2026-10-06 22:40:04 +08:00
action daaa6d2406 update 2026-10-06 12:26:53 2026-10-06 12:26:53 +08:00
action 4e01b07aa7 update 2026-10-06 04:10:42 2026-10-06 04:10:42 +08:00
action ec960a1df0 update 2026-10-05 19:05:58 2026-10-05 19:05:58 +08:00
action ce2c617af4 update 2026-10-05 11:38:51 2026-10-05 11:38:51 +08:00
action 11e98dacca update 2026-10-05 06:40:15 2026-10-05 06:40:15 +08:00
action 5c0c622001 update 2026-10-05 00:19:25 2026-10-05 00:19:25 +08:00
action c75ec11645 update 2026-10-04 18:21:54 2026-10-04 18:21:54 +08:00
action 595111c0e8 update 2026-10-04 11:53:55 2026-10-04 11:53:55 +08:00
action 1de7579d69 update 2026-10-04 06:37:06 2026-10-04 06:37:07 +08:00
action 6ef9b7e09f update 2026-10-04 02:56:49 2026-10-04 02:56:49 +08:00
action 880eb38e4c update 2026-10-03 23:35:33 2026-10-03 23:35:33 +08:00
action 7a2d332eaf update 2026-10-03 17:36:19 2026-10-03 17:36:19 +08:00
action ba8090b29d update 2026-10-03 07:30:26 2026-10-03 07:30:26 +08:00
action e14489bd54 update 2026-10-03 01:17:33 2026-10-03 01:17:33 +08:00
1529 changed files with 370787 additions and 39718 deletions

No files matched your search

+4
View File
@@ -158,6 +158,10 @@ jobs:
AdGuardHome AdGuardHome
git_sparse_clone master https://github.com/kenzok8/small \ git_sparse_clone master https://github.com/kenzok8/small \
dae daed luci-app-daede dae daed luci-app-daede
#git_sparse_clone main https://github.com/kenzok8/openwrt-honk \
# honk luci-app-honk
git_sparse_clone master https://github.com/QiuSimons/luci-app-honk \
honk luci-app-honk
git_sparse_clone main https://github.com/djylb/nps-openwrt \ git_sparse_clone main https://github.com/djylb/nps-openwrt \
npc luci-app-npc npc luci-app-npc
git_sparse_clone main https://github.com/smallprogram/openwrt-ghfu \ git_sparse_clone main https://github.com/smallprogram/openwrt-ghfu \
+4 -4
View File
@@ -7,13 +7,13 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=alist PKG_NAME:=alist
PKG_VERSION:=3.64.0 PKG_VERSION:=3.66.0
PKG_WEB_VERSION:=3.64.0 PKG_WEB_VERSION:=3.66.0
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/AlistGo/alist/tar.gz/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/AlistGo/alist/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=599065ec4b26375e4012cf212415f4195c9b92864bdcde4105356261920563f4 PKG_HASH:=6ea517d6927d22ba245a149bfde5542f3c60f48f5d610f105f7bab4d8101539b
PKG_LICENSE:=GPL-3.0 PKG_LICENSE:=GPL-3.0
PKG_LICENSE_FILE:=LICENSE PKG_LICENSE_FILE:=LICENSE
@@ -23,7 +23,7 @@ define Download/$(PKG_NAME)-web
FILE:=$(PKG_NAME)-web-$(PKG_WEB_VERSION).tar.gz FILE:=$(PKG_NAME)-web-$(PKG_WEB_VERSION).tar.gz
URL_FILE:=dist.tar.gz URL_FILE:=dist.tar.gz
URL:=https://github.com/AlistGo/alist-web/releases/download/$(PKG_WEB_VERSION)/ URL:=https://github.com/AlistGo/alist-web/releases/download/$(PKG_WEB_VERSION)/
HASH:=b80550662de42a2f8a72d35bca8ed66ec9ad0c24a9a02ceec6a01bf5038cf6f4 HASH:=f0e42134d4c2cead509f7847304c0e8b52e299e3cfe6e8ab033fb8c2eb9248df
endef endef
PKG_BUILD_DEPENDS:=golang/host PKG_BUILD_DEPENDS:=golang/host
+5 -2
View File
@@ -9,7 +9,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=brlaser PKG_NAME:=brlaser
PKG_VERSION:=v3 PKG_VERSION:=3
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE_URL:=https://github.com/pdewacht/brlaser.git PKG_SOURCE_URL:=https://github.com/pdewacht/brlaser.git
@@ -17,11 +17,14 @@ PKG_SOURCE_PROTO:=git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=2a49e3287c70c254e7e3ac9dabe9d6a07218c3fa PKG_SOURCE_VERSION:=2a49e3287c70c254e7e3ac9dabe9d6a07218c3fa
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
PKG_FIXUP:=autoreconf PKG_FIXUP:=autoreconf
PKG_INSTALL:=1 PKG_INSTALL:=1
# Add CMAKE_POLICY_VERSION_MINIMUM to handle CMake 3.5+ compatibility
CMAKE_OPTIONS += -DCMAKE_POLICY_VERSION_MINIMUM=3.5
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk include $(INCLUDE_DIR)/cmake.mk
+57 -12
View File
@@ -1,19 +1,20 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=clashoo PKG_NAME:=clashoo
PKG_SHORT_SHA:=9f053c4 PKG_UPSTREAM_VERSION:=1.19.33
PKG_COMMIT_DATE:=2026.10.02 PKG_UPSTREAM_TAG:=v$(PKG_UPSTREAM_VERSION)
PKG_SHORT_SHA:=3f27ef3
PKG_VERSION:=$(PKG_COMMIT_DATE)~$(PKG_SHORT_SHA) PKG_VERSION:=2026.10.25.$(PKG_UPSTREAM_VERSION)
PKG_RELEASE:=1 PKG_RELEASE:=5
PKG_SOURCE:=$(PKG_NAME)-alpha-$(PKG_SHORT_SHA).tar.gz PKG_SOURCE:=$(PKG_NAME)-stable-$(PKG_UPSTREAM_TAG)-$(PKG_SHORT_SHA).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-alpha-$(PKG_SHORT_SHA) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-stable-$(PKG_UPSTREAM_TAG)-$(PKG_SHORT_SHA)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-alpha-$(PKG_SHORT_SHA) PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-clashoo/releases/download/mihomo-src PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-clashoo/releases/download/mihomo-src
PKG_SOURCE_VERSION:=9f053c49075de076d83d3e5918241e410f7e9adf PKG_SOURCE_VERSION:=3f27ef39f8c96bbfbc8b0b9bb10f5c9ef60149d8
PKG_HASH:=b2d1f5d9ecfc2c6818578e2be21d31d5e25976b6f8b96aff1a9e3cb5183e503a PKG_HASH:=1ef7a4087f3805bd2624a940e2e43a0bc23719a25465c9f503aa6c11572f1321
PKG_BUILD_VERSION:=alpha-$(PKG_SHORT_SHA) PKG_BUILD_VERSION:=$(PKG_UPSTREAM_TAG)
PKG_LICENSE:=GPL3.0+ PKG_LICENSE:=GPL3.0+
PKG_MAINTAINER:=kenzok8 PKG_MAINTAINER:=kenzok8
@@ -50,8 +51,11 @@ endef
define Package/clashoo/install define Package/clashoo/install
$(call GoPackage/Package/Install/Bin,$(1)) $(call GoPackage/Package/Install/Bin,$(1))
$(INSTALL_DIR) $(1)/usr/libexec/clashoo
$(INSTALL_DIR) $(1)/usr/bin $(INSTALL_DIR) $(1)/usr/bin
ln -sf /usr/bin/mihomo $(1)/usr/bin/clash-meta mv -f $(1)/usr/bin/mihomo $(1)/usr/libexec/clashoo/mihomo-stable
ln -sf /usr/libexec/clashoo/mihomo-stable $(1)/usr/bin/mihomo
ln -sf /usr/libexec/clashoo/mihomo-stable $(1)/usr/bin/clash-meta
$(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_DIR) $(1)/etc/config $(INSTALL_DIR) $(1)/etc/config
@@ -82,14 +86,55 @@ define Package/clashoo/install
$(RM) $(1)/usr/share/clashoo/core_down_complete $(RM) $(1)/usr/share/clashoo/core_down_complete
endef endef
define Package/clashoo/preinst
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
save_core() {
src="$$1"
dst="$$2"
[ -f "$$src" ] && [ ! -L "$$src" ] || return 0
if [ -e "$$dst" ] || [ -L "$$dst" ]; then return 0; fi
mkdir -p "$$(dirname "$$dst")" || return 1
tmp="$$dst.tmp.$$$$"
cp "$$src" "$$tmp" && chmod 0755 "$$tmp" && cmp -s "$$src" "$$tmp" || {
rm -f "$$tmp"
return 1
}
if command -v sha256sum >/dev/null 2>&1; then
old_hash="$$(sha256sum "$$src" | awk '{print $$1}')"
new_hash="$$(sha256sum "$$tmp" | awk '{print $$1}')"
[ "$$old_hash" = "$$new_hash" ] || {
rm -f "$$tmp"
return 1
}
fi
mv -f "$$tmp" "$$dst"
}
save_core /usr/bin/mihomo /usr/share/clashoo/bin/mihomo-alpha || exit 1
save_core /usr/bin/mihomo-stable /usr/share/clashoo/bin/mihomo-stable || exit 1
if [ -x /usr/bin/clash-meta ] && [ ! -L /usr/bin/clash-meta ] && [ ! -e /usr/share/clashoo/bin/mihomo-stable ]; then
if ! /usr/bin/clash-meta -v 2>/dev/null | grep -Eiq '(alpha|beta|rc|pre|smart)'; then
save_core /usr/bin/clash-meta /usr/share/clashoo/bin/mihomo-stable || exit 1
fi
fi
fi
exit 0
endef
define Package/clashoo/postinst define Package/clashoo/postinst
#!/bin/sh #!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then if [ -z "$${IPKG_INSTROOT}" ]; then
[ -x /usr/bin/mihomo ] && [ ! -x /usr/bin/clash-meta ] && ln -sf /usr/bin/mihomo /usr/bin/clash-meta
rm -f /usr/share/clashoo/check_luci_version.sh /usr/share/clashoo/check_clash_meta_version.sh /usr/share/clashoo/check_mihomo_core_version.sh rm -f /usr/share/clashoo/check_luci_version.sh /usr/share/clashoo/check_clash_meta_version.sh /usr/share/clashoo/check_mihomo_core_version.sh
rm -f /usr/share/clashoo/cuslist.sh /usr/share/clashoo/groups.sh /usr/share/clashoo/load_groups.sh /usr/share/clashoo/panel_diag.sh rm -f /usr/share/clashoo/cuslist.sh /usr/share/clashoo/groups.sh /usr/share/clashoo/load_groups.sh /usr/share/clashoo/panel_diag.sh
rm -f /usr/share/clashoo/rmlist.sh /usr/share/clashoo/uplist.sh /usr/share/clashoo/rpc_restart_async.sh /usr/share/clashoo/rpc_update_china_ip_async.sh rm -f /usr/share/clashoo/rmlist.sh /usr/share/clashoo/uplist.sh /usr/share/clashoo/rpc_restart_async.sh /usr/share/clashoo/rpc_update_china_ip_async.sh
rm -rf /usr/share/clashoo/create rm -rf /usr/share/clashoo/create
# 旧方案把 stable 内核放在 /usr/bin/mihomo-stable,现方案改用
# /usr/libexec/clashoo/mihomo-stable(随包)+ /usr/share/clashoo/bin/(自定义下载)。
# preinst 已把它抄到 /usr/share/clashoo/bin/mihomo-stable,确认内容相同后才删
# 旧位置;目标已有其他自定义内核时保留旧文件,避免误删。
if [ -f /usr/share/clashoo/bin/mihomo-stable ] && [ -f /usr/bin/mihomo-stable ] && [ ! -L /usr/bin/mihomo-stable ] && cmp -s /usr/bin/mihomo-stable /usr/share/clashoo/bin/mihomo-stable; then
rm -f /usr/bin/mihomo-stable
fi
/usr/share/clashoo/migrate_lan_acl.sh >/dev/null 2>&1 || true /usr/share/clashoo/migrate_lan_acl.sh >/dev/null 2>&1 || true
/usr/share/clashoo/migrate_fake_ip_filter.sh >/dev/null 2>&1 || true /usr/share/clashoo/migrate_fake_ip_filter.sh >/dev/null 2>&1 || true
/usr/share/clashoo/detect_core_arch.sh >/dev/null 2>&1 || true /usr/share/clashoo/detect_core_arch.sh >/dev/null 2>&1 || true
+2 -2
View File
@@ -9,7 +9,7 @@ config clashoo 'config'
option dash_port '9090' option dash_port '9090'
option dashboard_panel 'zashboard' option dashboard_panel 'zashboard'
option level 'info' option level 'info'
option core '3' option core '2'
option allow_lan '1' option allow_lan '1'
option dnsforwader '1' option dnsforwader '1'
option subcri 'meta' option subcri 'meta'
@@ -28,7 +28,7 @@ config clashoo 'config'
option listen_port '1053' option listen_port '1053'
option interf '0' option interf '0'
option download_core 'amd64-compatible' option download_core 'amd64-compatible'
option dcore '3' option dcore '2'
option same_tag '1' option same_tag '1'
option geoip_source '3' option geoip_source '3'
option geoip_format 'mmdb' option geoip_format 'mmdb'
+331 -69
View File
@@ -169,43 +169,54 @@ cleanup_stale_core_nft() {
} }
_core_candidates() { _core_candidates() {
echo "/usr/bin/mihomo-stable /usr/bin/mihomo /usr/bin/clash-meta /etc/clashoo/clash" echo "/usr/share/clashoo/bin/mihomo-stable /usr/libexec/clashoo/mihomo-stable /usr/share/clashoo/bin/mihomo-alpha /usr/bin/mihomo /usr/bin/clash-meta /etc/clashoo/clash"
} }
_migrate_legacy_mihomo_stable() { _migrate_legacy_mihomo_stable() {
local legacy=/usr/bin/clash-meta version local legacy=/usr/bin/clash-meta target=/usr/share/clashoo/bin/mihomo-stable version staged
[ -x /usr/bin/mihomo-stable ] && return 0 [ -x "$target" ] && return 0
[ -x "$legacy" ] && [ ! -L "$legacy" ] || return 0 [ -x "$legacy" ] && [ ! -L "$legacy" ] || return 0
version=$("$legacy" -v 2>/dev/null | head -n 1) version=$("$legacy" -v 2>/dev/null | head -n 1)
[ -n "$version" ] || return 0 [ -n "$version" ] || return 0
echo "$version" | grep -Eiq '(alpha|beta|rc|pre|smart)' && return 0 echo "$version" | grep -Eiq '(alpha|beta|rc|pre|smart)' && return 0
cp -f "$legacy" /usr/bin/mihomo-stable 2>/dev/null && chmod 0755 /usr/bin/mihomo-stable mkdir -p "$(dirname "$target")" || return 1
staged="${target}.$$"
cp -f "$legacy" "$staged" 2>/dev/null && chmod 0755 "$staged" && mv -f "$staged" "$target"
} }
_fallback_missing_mihomo_core() { _mihomo_stable_binary() {
local selected fallback local bundled=/usr/libexec/clashoo/mihomo-stable manual=/usr/share/clashoo/bin/mihomo-stable bundled_ver manual_ver
is_singbox_selected && return 0 # A successful custom download is an explicit override, even if its version is older.
selected="$(uci -q get clashoo.config.core 2>/dev/null)" if [ -x "$manual" ] &&
case "$selected" in [ "$(sed -n '1{s/^[[:space:]]*//;s/[[:space:]]*$//;p;}' /usr/share/clashoo/clash_meta_version 2>/dev/null)" = "custom-url" ]; then
2) echo "$manual"
[ -x /usr/bin/mihomo-stable ] && return 0 return 0
[ -x /usr/bin/mihomo ] || return 0 fi
fallback=3 [ -x "$bundled" ] || { [ -x "$manual" ] && { echo "$manual"; return 0; }; return 1; }
;; [ -x "$manual" ] || { echo "$bundled"; return; }
3) bundled_ver="$("$bundled" -v 2>/dev/null | awk '{for (i = 1; i < NF; i++) if ($i == "Meta") {print $(i + 1); exit}}')"
[ -x /usr/bin/mihomo ] && return 0 manual_ver="$("$manual" -v 2>/dev/null | awk '{for (i = 1; i < NF; i++) if ($i == "Meta") {print $(i + 1); exit}}')"
[ -x /usr/bin/mihomo-stable ] || return 0 bundled_ver="${bundled_ver#v}"
fallback=2 manual_ver="${manual_ver#v}"
;; printf '%s\n' "$bundled_ver" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$' || bundled_ver=""
*) return 0 ;; printf '%s\n' "$manual_ver" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$' || manual_ver=""
esac if [ -n "$bundled_ver" ] && [ -n "$manual_ver" ]; then
uci -q set clashoo.config.core="$fallback" if awk -v manual="$manual_ver" -v bundled="$bundled_ver" 'BEGIN {
uci -q set clashoo.config.dcore="$fallback" split(manual, m, "."); split(bundled, b, ".");
uci -q commit clashoo >/dev/null 2>&1 for (i = 1; i <= 3; i++) {
if [ "$fallback" = "3" ]; then if (m[i] + 0 > b[i] + 0) exit 0;
log_msg "Stable core missing, falling back to Alpha" "稳定版内核缺失,自动回退到 Alpha" if (m[i] + 0 < b[i] + 0) exit 1;
}
exit 0;
}'; then
echo "$manual"
else
echo "$bundled"
fi
elif [ -n "$manual_ver" ]; then
echo "$manual"
else else
log_msg "Alpha core missing, falling back to stable" "Alpha 内核缺失,自动回退到稳定版" echo "$bundled"
fi fi
} }
@@ -220,11 +231,11 @@ _detect_selected_core() {
return 1 return 1
;; ;;
2|mihomo) 2|mihomo)
[ -x /usr/bin/mihomo-stable ] && echo /usr/bin/mihomo-stable && return _mihomo_stable_binary
return 1 return $?
;; ;;
3|mihomo-alpha) 3|mihomo-alpha)
[ -x /usr/bin/mihomo ] && echo /usr/bin/mihomo && return [ -x /usr/share/clashoo/bin/mihomo-alpha ] && echo /usr/share/clashoo/bin/mihomo-alpha && return
return 1 return 1
;; ;;
esac esac
@@ -233,7 +244,7 @@ _detect_selected_core() {
core_supports_advanced_features() { core_supports_advanced_features() {
case "$CLASH" in case "$CLASH" in
*/mihomo|*/mihomo-stable|*/clash-meta|*/smart) */mihomo|*/mihomo-stable|*/mihomo-alpha|*/clash-meta|*/smart)
return 0 return 0
;; ;;
*) *)
@@ -724,9 +735,12 @@ cleanup_legacy_startup_backups() {
#=========================================================================================================================== #===========================================================================================================================
# Historical backup artifacts can clutter LuCI "System -> Startup". # Historical backup artifacts can clutter LuCI "System -> Startup".
# Keep runtime clean by removing known obsolete backup filenames. # Keep runtime clean by removing known obsolete backup filenames.
# The old `*bak*` glob also wiped other packages' backups (e.g. wireless.bak),
# so scope it to Clashoo's own script names (legacy `clash`, current `clashoo`).
# `._*` is macOS AppleDouble metadata, never a valid init script, so it stays.
rm -f /etc/init.d/._clash \ rm -f /etc/init.d/._clash \
/etc/init.d/._* \ /etc/init.d/._* \
/etc/init.d/*bak* >/dev/null 2>&1 || true /etc/init.d/clash*bak* >/dev/null 2>&1 || true
#=========================================================================================================================== #===========================================================================================================================
} }
@@ -876,6 +890,10 @@ revert_dns() {
add_cron(){ add_cron(){
#=========================================================================================================================== #===========================================================================================================================
# core.log 落在 tmpfs 上,按分钟卡一次大小;内核对日志没有上限,
# 一旦刷屏写满 /tmp,dnsmasq 与配置生成都会跟着挂。
[ -z "$(grep -w "lib/core_log_guard.sh" "$CRON_FILE")" ] && echo "* * * * * sh /usr/share/clashoo/lib/core_log_guard.sh >/dev/null 2>&1" >> "$CRON_FILE"
auto=$(uci get clashoo.config.auto_update 2>/dev/null) auto=$(uci get clashoo.config.auto_update 2>/dev/null)
clear=$(uci get clashoo.config.auto_clear_log 2>/dev/null) clear=$(uci get clashoo.config.auto_clear_log 2>/dev/null)
if [ "${auto:-0}" -eq 1 ] || [ "${clear:-0}" -eq 1 ]; then if [ "${auto:-0}" -eq 1 ] || [ "${clear:-0}" -eq 1 ]; then
@@ -908,6 +926,7 @@ del_cron(){
sed -i '/update\/update_all.sh/d' "$CRON_FILE" sed -i '/update\/update_all.sh/d' "$CRON_FILE"
sed -i '/\/usr\/share\/clash\/update_all.sh/d' "$CRON_FILE" sed -i '/\/usr\/share\/clash\/update_all.sh/d' "$CRON_FILE"
sed -i '/update\/maintenance_cron.sh/d' "$CRON_FILE" sed -i '/update\/maintenance_cron.sh/d' "$CRON_FILE"
sed -i '/lib\/core_log_guard.sh/d' "$CRON_FILE"
sed -i '/clashoo.txt/d' "$CRON_FILE" sed -i '/clashoo.txt/d' "$CRON_FILE"
sed -i '/update\/lgbm_update.sh/d' "$CRON_FILE" sed -i '/update\/lgbm_update.sh/d' "$CRON_FILE"
sed -i '/\/usr\/share\/clash\/lgbm_update.sh/d' "$CRON_FILE" sed -i '/\/usr\/share\/clash\/lgbm_update.sh/d' "$CRON_FILE"
@@ -1049,7 +1068,7 @@ _user_dns_fields() {
command -v yq >/dev/null 2>&1 || return 0 command -v yq >/dev/null 2>&1 || return 0
[ -s "$CONFIG_YAML" ] || return 0 [ -s "$CONFIG_YAML" ] || return 0
for field in nameserver proxy-server-nameserver fallback direct-nameserver \ for field in nameserver proxy-server-nameserver fallback direct-nameserver \
default-nameserver nameserver-policy respect-rules; do default-nameserver nameserver-policy proxy-server-nameserver-policy respect-rules; do
case ",$force," in *,"$field",*) continue ;; esac case ",$force," in *,"$field",*) continue ;; esac
[ "$(yq -M e "(.dns // {}) | has(\"${field}\")" "$CONFIG_YAML" 2>/dev/null)" = "true" ] && [ "$(yq -M e "(.dns // {}) | has(\"${field}\")" "$CONFIG_YAML" 2>/dev/null)" = "true" ] &&
out="${out}${out:+,}${field}" out="${out}${out:+,}${field}"
@@ -1091,7 +1110,7 @@ _clashoo_dns_force_fields() {
command -v yq >/dev/null 2>&1 || return 0 command -v yq >/dev/null 2>&1 || return 0
[ -s "$CONFIG_YAML" ] || return 0 [ -s "$CONFIG_YAML" ] || return 0
local managed legacy fields local managed legacy fields
fields="nameserver,proxy-server-nameserver,direct-nameserver,default-nameserver,nameserver-policy,respect-rules" fields="nameserver,proxy-server-nameserver,direct-nameserver,default-nameserver,nameserver-policy,proxy-server-nameserver-policy,respect-rules"
managed="$(yq -M e '(.dns."x-clashoo-managed-dns" // false) == true' "$CONFIG_YAML" 2>/dev/null)" managed="$(yq -M e '(.dns."x-clashoo-managed-dns" // false) == true' "$CONFIG_YAML" 2>/dev/null)"
if [ "$managed" = "true" ]; then if [ "$managed" = "true" ]; then
printf '%s' "$fields" printf '%s' "$fields"
@@ -1151,6 +1170,103 @@ _dns_nameserver_inherit_mode() {
printf '%s' inherit printf '%s' inherit
} }
# issue #73: mihomo resolves proxy server domains through
# proxy-server-nameserver(-policy) and ignores nameserver-policy there. Airports
# ship their own resolver for node domains (e.g. "+.chylink.xyz" -> DoT) which
# answers with reachable relay IPs, so mirror the entries that match a node
# server domain before mixin drops them.
#
# Everything travels through a private 0700 work dir: large airports can produce
# hundreds of KB of policy entries, which neither argv nor env vars can carry
# (E2BIG), and predictable /tmp names are symlink bait.
_dns_node_policy_workdir=""
_dns_node_policy_cleanup() {
[ -n "${_dns_node_policy_workdir:-}" ] || return 0
rm -rf "$_dns_node_policy_workdir" 2>/dev/null
_dns_node_policy_workdir=""
return 0
}
# Same inputs yml_change feeds mixin: settle FORCE/PRESENT here so the skip
# decision cannot disagree with the config that mixin actually generates.
_dns_node_policy_mode() {
CLASHOO_DNS_FORCE="$(_clashoo_dns_force_fields)"
CLASHOO_DNS_PRESENT="$(_user_dns_fields "$CLASHOO_DNS_FORCE")"
export CLASHOO_DNS_FORCE CLASHOO_DNS_PRESENT
_dns_nameserver_inherit_mode
}
_dns_node_policy_capture() {
_dns_node_policy_cleanup
command -v yq >/dev/null 2>&1 || return 0
command -v ucode >/dev/null 2>&1 || return 0
local helper workdir
helper="${CLASHOO_NODE_DNS_UC:-/usr/share/clashoo/runtime/dns_node_policy.uc}"
[ -r "$helper" ] || return 0
[ -s "$CONFIG_YAML" ] || return 0
# skip mode keeps the source DNS verbatim: mihomo already falls back to the
# normal DNS policy for node domains when no dedicated resolver is generated.
[ "$(_dns_node_policy_mode)" = "skip" ] && return 0
# sweep leftovers from an interrupted start; they are private to root anyway
find "${TMPDIR:-/tmp}" -maxdepth 1 -name 'clashoo-node-dns.*' -mmin +60 \
-exec rm -rf {} + >/dev/null 2>&1
workdir="$(mktemp -d "${TMPDIR:-/tmp}/clashoo-node-dns.XXXXXX" 2>/dev/null)" || return 0
chmod 700 "$workdir" 2>/dev/null
if ! yq -M e -o=json -I0 '({"policies": (.dns."nameserver-policy" // {}), "servers": [(.proxies // [])[] | select(type == "!!map") | .server // ""]})' "$CONFIG_YAML" > "$workdir/source.json" 2>/dev/null ||
[ ! -s "$workdir/source.json" ]; then
rm -rf "$workdir"
return 0
fi
chmod 600 "$workdir/source.json" 2>/dev/null
if ! CLASHOO_NODE_DNS_SOURCE_FILE="$workdir/source.json" ucode "$helper" > "$workdir/policy.json" 2>/dev/null ||
[ ! -s "$workdir/policy.json" ]; then
rm -rf "$workdir"
return 0
fi
chmod 600 "$workdir/policy.json" 2>/dev/null
rm -f "$workdir/source.json"
if [ "$(yq -M e -r 'length' "$workdir/policy.json" 2>/dev/null)" = "0" ]; then
rm -rf "$workdir"
return 0
fi
_dns_node_policy_workdir="$workdir"
return 0
}
_dns_node_policy_apply() {
local policy_file rc
policy_file="${_dns_node_policy_workdir:+"$_dns_node_policy_workdir/policy.json"}"
if [ -z "$policy_file" ] || [ ! -s "$policy_file" ] || ! command -v yq >/dev/null 2>&1; then
_dns_node_policy_cleanup
return 0
fi
# existing keys keep their value; overlapping patterns are left to mihomo
CLASHOO_NODE_DNS_POLICY_FILE="$policy_file" yq -M e -i '(.dns // {}) as $dns |
(load(strenv(CLASHOO_NODE_DNS_POLICY_FILE)) // {}) as $derived |
.dns."proxy-server-nameserver-policy" = ($derived * ($dns."proxy-server-nameserver-policy" // {}))
' "$CONFIG_YAML" 2>/dev/null
rc=$?
# mihomo rejects a node policy without a proxy node resolver
if [ "$(yq -M e -r '((.dns."proxy-server-nameserver" // []) | length)' "$CONFIG_YAML" 2>/dev/null)" = "0" ]; then
yq -M e -i '.dns."proxy-server-nameserver" = (.dns."default-nameserver" // ["223.5.5.5"])' "$CONFIG_YAML" 2>/dev/null || true
fi
_dns_node_policy_cleanup
[ "$rc" = "0" ] && log_msg "Inherited node domain DNS policy from subscription" "已从订阅继承节点域名 DNS 策略"
return 0
}
_dns_proxy_nameservers() { _dns_proxy_nameservers() {
local i=0 t en a p port s out="" prefix local i=0 t en a p port s out="" prefix
while :; do while :; do
@@ -1481,7 +1597,7 @@ _remap_dns_system_nameserver() {
ip_rules() { ip_rules() {
#=========================================================================================================================== #===========================================================================================================================
sh /usr/share/clashoo/runtime/iprules.sh 2>/dev/null CLASHOO_CONFIG_YAML="$CONFIG_YAML" sh /usr/share/clashoo/runtime/iprules.sh 2>/dev/null
#=========================================================================================================================== #===========================================================================================================================
} }
@@ -1691,15 +1807,21 @@ _lan_dns_split_enabled() {
yml_dns_change(){ yml_dns_change(){
#=========================================================================================================================== #===========================================================================================================================
dns_port=$(sed -n 's/^[[:space:]]*listen:.*:[[:space:]]*['"'"'"]*\([0-9]\{1,\}\)['"'"'"]*[[:space:]]*$/\1/p' /etc/clashoo/config.yaml 2>/dev/null | head -n1) dns_port=$(sed -n 's/^[[:space:]]*listen:.*:[[:space:]]*['"'"'"]*\([0-9]\{1,\}\)['"'"'"]*[[:space:]]*$/\1/p' "$CONFIG_YAML" 2>/dev/null | head -n1)
listen_port=$(uci get clashoo.config.listen_port 2>/dev/null) listen_port=$(uci get clashoo.config.listen_port 2>/dev/null)
[ -z "$listen_port" ] && listen_port=5300 [ -z "$listen_port" ] && listen_port=5300
if [ -z "$dns_port" ]; then if [ -z "$dns_port" ]; then
dns_port="$listen_port" dns_port="$listen_port"
if grep -q '^dns:' /etc/clashoo/config.yaml && ! grep -q "^ \{0,\}listen:" /etc/clashoo/config.yaml; then if grep -q '^dns:' "$CONFIG_YAML" && ! grep -q "^ \{0,\}listen:" "$CONFIG_YAML"; then
sed -i "/^dns:/a\ listen: 0.0.0.0:${dns_port}" /etc/clashoo/config.yaml 2>/dev/null sed -i "/^dns:/a\ listen: 0.0.0.0:${dns_port}" "$CONFIG_YAML" 2>/dev/null
fi fi
fi fi
if [ "${CLASHOO_RELOAD_CANDIDATE:-0}" = "1" ]; then
if [ "${dns_port:-0}" -eq 53 ]; then
sed -i "s@^\([[:space:]]*listen:[[:space:]]*\)0\.0\.0\.0:53@\10.0.0.0:${listen_port}@g" "$CONFIG_YAML" || return 1
fi
return 0
fi
dnsforwader=$(uci get clashoo.config.dnsforwader 2>/dev/null) dnsforwader=$(uci get clashoo.config.dnsforwader 2>/dev/null)
dnscache=$(uci get clashoo.config.dnscache 2>/dev/null) dnscache=$(uci get clashoo.config.dnscache 2>/dev/null)
if [ "$(uci -q get clashoo.config.enable_dns 2>/dev/null)" = "0" ]; then if [ "$(uci -q get clashoo.config.enable_dns 2>/dev/null)" = "0" ]; then
@@ -1980,7 +2102,11 @@ _finish_geo_bootstrap() {
read need_mmdb need_geosite < /var/run/clashoo_bootstrap_pending 2>/dev/null read need_mmdb need_geosite < /var/run/clashoo_bootstrap_pending 2>/dev/null
log_msg "Bootstrap: fetching geo data via proxy" "引导模式:正在通过代理补全 Geo 数据" log_msg "Bootstrap: fetching geo data via proxy" "引导模式:正在通过代理补全 Geo 数据"
/usr/share/clashoo/update/geoip.sh >/dev/null 2>&1 if [ "$need_geosite" = "1" ]; then
/usr/share/clashoo/update/geoip.sh --require-geosite >/dev/null 2>&1
else
/usr/share/clashoo/update/geoip.sh >/dev/null 2>&1
fi
still=0 still=0
[ "$need_mmdb" = "1" ] && ! _has_valid_local_mmdb && still=1 [ "$need_mmdb" = "1" ] && ! _has_valid_local_mmdb && still=1
@@ -2018,12 +2144,12 @@ _start_validate_core() {
echo "Clashoo" > "$REAL_LOG" echo "Clashoo" > "$REAL_LOG"
return 1 return 1
elif [ "${core:-0}" -eq 2 ] && [ ! -x "$CLASH" ]; then elif [ "${core:-0}" -eq 2 ] && [ ! -x "$CLASH" ]; then
log_msg "mihomo core not found, detected binary is unavailable: $CLASH" "找不到可用的 mihomo 内核: $CLASH" log_msg "mihomo stable core not found, detected binary is unavailable: $CLASH" "找不到可用的 mihomo 稳定版内核: $CLASH"
sleep 1 sleep 1
echo "Clashoo" > "$REAL_LOG" echo "Clashoo" > "$REAL_LOG"
return 1 return 1
elif [ "${core:-0}" -eq 3 ] && [ ! -x "$CLASH" ]; then elif [ "${core:-0}" -eq 3 ] && [ ! -x "$CLASH" ]; then
log_msg "mihomo core not found, detected binary is unavailable: $CLASH" "找不到可用的 mihomo 内核: $CLASH" log_msg "mihomo Alpha core not found, detected binary is unavailable: $CLASH" "找不到可用的 mihomo Alpha 内核,请在组件更新中安装: $CLASH"
sleep 1 sleep 1
echo "Clashoo" > "$REAL_LOG" echo "Clashoo" > "$REAL_LOG"
return 1 return 1
@@ -2036,30 +2162,33 @@ _start_validate_core() {
} }
_start_prepare_config() { _start_prepare_config() {
local _reload_candidate="${CLASHOO_RELOAD_CANDIDATE:-0}"
# Core-only: run the imported config verbatim. select_config already copied # Core-only: run the imported config verbatim. select_config already copied
# it to /etc/clashoo/config.yaml, so skip every mixin/DNS/rule rewrite below. # it to /etc/clashoo/config.yaml, so skip every mixin/DNS/rule rewrite below.
[ "$(uci -q get clashoo.config.core_only 2>/dev/null)" = "1" ] && return 0 [ "$(uci -q get clashoo.config.core_only 2>/dev/null)" = "1" ] && return 0
check >/dev/null 2>&1 check >/dev/null 2>&1 || return 1
_migrate_dns_roles >/dev/null 2>&1 [ "$_reload_candidate" = "1" ] || _migrate_dns_roles >/dev/null 2>&1
enable_dns=$(uci get clashoo.config.enable_dns 2>/dev/null) enable_dns=$(uci get clashoo.config.enable_dns 2>/dev/null)
if [ -z "$(grep -E "^ {0,}listen:" /etc/clashoo/config.yaml)" ] || [ -z "$(grep -E "^ {0,}enhanced-mode:" /etc/clashoo/config.yaml)" ] || [ -z "$(grep -E "^ {0,}dns:" /etc/clashoo/config.yaml)" ];then if [ -z "$(grep -E "^ {0,}listen:" "$CONFIG_YAML")" ] || [ -z "$(grep -E "^ {0,}enhanced-mode:" "$CONFIG_YAML")" ] || [ -z "$(grep -E "^ {0,}dns:" "$CONFIG_YAML")" ];then
if [ "${enable_dns:-0}" -eq 0 ];then if [ "${enable_dns:-0}" -eq 0 ];then
[ "$_reload_candidate" = "1" ] && return 1
uci set clashoo.config.enable_dns="1" && uci commit clashoo uci set clashoo.config.enable_dns="1" && uci commit clashoo
log_msg "Enabling Custom Dns" "启用自定义DNS" log_msg "Enabling Custom Dns" "启用自定义DNS"
fi fi
fi fi
if { egrep -q '^ {0,}rule-providers:' "/etc/clashoo/config.yaml" || egrep -q '^ {0,}script:' "/etc/clashoo/config.yaml"; } && ! core_supports_advanced_features; then if { egrep -q '^ {0,}rule-providers:' "$CONFIG_YAML" || egrep -q '^ {0,}script:' "$CONFIG_YAML"; } && ! core_supports_advanced_features; then
if [ -x /usr/bin/mihomo ]; then [ "$_reload_candidate" = "1" ] && return 1
uci set clashoo.config.core="3" && uci commit clashoo if [ -n "$(_mihomo_stable_binary)" ]; then
elif [ -x /usr/bin/mihomo-stable ]; then
uci set clashoo.config.core="2" && uci commit clashoo uci set clashoo.config.core="2" && uci commit clashoo
elif [ -x /usr/share/clashoo/bin/mihomo-alpha ]; then
uci set clashoo.config.core="3" && uci commit clashoo
else else
log_msg "Current config requires mihomo/clash-meta core" "当前配置需要 mihomo 或 clash-meta 内核" log_msg "Current config requires mihomo/clash-meta core" "当前配置需要 mihomo 或 clash-meta 内核"
backend_remove_rules >/dev/null 2>&1 backend_remove_rules >/dev/null 2>&1
@@ -2073,6 +2202,7 @@ _start_prepare_config() {
fi fi
if [ "$(uci get clashoo.config.p_mode 2>/dev/null)" = "script" ]; then if [ "$(uci get clashoo.config.p_mode 2>/dev/null)" = "script" ]; then
[ "$_reload_candidate" = "1" ] && return 1
uci set clashoo.config.p_mode="rule" && uci commit clashoo uci set clashoo.config.p_mode="rule" && uci commit clashoo
fi fi
@@ -2082,13 +2212,15 @@ _start_prepare_config() {
fi fi
_adapt_dns_loopback_resolver >/dev/null 2>&1 _adapt_dns_loopback_resolver >/dev/null 2>&1
# stage bundled cn.mrs into the core dir; mihomo rejects rule-set paths outside /etc/clashoo # stage bundled cn.mrs into the core dir; mihomo rejects rule-set paths outside /etc/clashoo
if [ -f /usr/share/clashoo/ruleset/cn.mrs ]; then if [ "$_reload_candidate" != "1" ] && [ -f /usr/share/clashoo/ruleset/cn.mrs ]; then
if [ ! -f /etc/clashoo/ruleset/cn.mrs ] || [ /usr/share/clashoo/ruleset/cn.mrs -nt /etc/clashoo/ruleset/cn.mrs ]; then if [ ! -f /etc/clashoo/ruleset/cn.mrs ] || [ /usr/share/clashoo/ruleset/cn.mrs -nt /etc/clashoo/ruleset/cn.mrs ]; then
mkdir -p /etc/clashoo/ruleset mkdir -p /etc/clashoo/ruleset
cp -f /usr/share/clashoo/ruleset/cn.mrs /etc/clashoo/ruleset/cn.mrs 2>/dev/null cp -f /usr/share/clashoo/ruleset/cn.mrs /etc/clashoo/ruleset/cn.mrs 2>/dev/null
fi fi
fi fi
_dns_node_policy_capture
yml_change >/dev/null 2>&1 yml_change >/dev/null 2>&1
_dns_node_policy_apply
append_luci_fake_ip_filter_extras >/dev/null 2>&1 append_luci_fake_ip_filter_extras >/dev/null 2>&1
normalize_fake_ip_filter >/dev/null 2>&1 normalize_fake_ip_filter >/dev/null 2>&1
drop_legacy_cn_ip_injection >/dev/null 2>&1 drop_legacy_cn_ip_injection >/dev/null 2>&1
@@ -2117,12 +2249,13 @@ _start_prepare_config() {
log_msg "GeoIP database not found, continue without local GeoIP DB" "未找到本地 GeoIP 数据库,继续启动(可在系统页更新 GeoIP)" log_msg "GeoIP database not found, continue without local GeoIP DB" "未找到本地 GeoIP 数据库,继续启动(可在系统页更新 GeoIP)"
fi fi
_prepare_geo_bootstrap_mode [ "$_reload_candidate" = "1" ] || _prepare_geo_bootstrap_mode
_remap_dns_system_nameserver >/dev/null 2>&1 _remap_dns_system_nameserver >/dev/null 2>&1
ensure_dns_cn_policy_fallback >/dev/null 2>&1 ensure_dns_cn_policy_fallback >/dev/null 2>&1
if [ ! -f /etc/clashoo/config.yaml ];then if [ ! -f "$CONFIG_YAML" ];then
[ "$_reload_candidate" = "1" ] && return 1
log_msg "Cannot find config.yaml" "找不到config.yaml" log_msg "Cannot find config.yaml" "找不到config.yaml"
backend_remove_rules >/dev/null 2>&1 backend_remove_rules >/dev/null 2>&1
sleep 1 sleep 1
@@ -2130,10 +2263,10 @@ _start_prepare_config() {
exit 0 exit 0
fi fi
yml_dns_change >/dev/null 2>&1 yml_dns_change >/dev/null 2>&1 || return 1
# Sync processed config (with DNS listen injected) to mihomo working directory # Sync processed config (with DNS listen injected) to mihomo working directory
cp -f "$CONFIG_YAML" "${CLASH_CONFIG}/config.yaml" 2>/dev/null [ "$_reload_candidate" = "1" ] || cp -f "$CONFIG_YAML" "${CLASH_CONFIG}/config.yaml" 2>/dev/null
ip_rules >/dev/null 2>&1 ip_rules >/dev/null 2>&1
} }
@@ -2145,12 +2278,25 @@ _core_only_ui_args() {
printf ' -ext-ui %s' "$(shell_quote /etc/clashoo/dashboard)" printf ' -ext-ui %s' "$(shell_quote /etc/clashoo/dashboard)"
} }
_mihomo_proxy_dns_valid() {
local config="$1" proxy_count policy_count respect_rules
command -v yq >/dev/null 2>&1 || return 0
[ -s "$config" ] || return 0
proxy_count="$(yq -M e -r '(.dns."proxy-server-nameserver" // []) | length' "$config" 2>/dev/null)"
[ "$proxy_count" = "0" ] || return 0
policy_count="$(yq -M e -r '(.dns."proxy-server-nameserver-policy" // {}) | length' "$config" 2>/dev/null)"
respect_rules="$(yq -M e -r '.dns."respect-rules" // false' "$config" 2>/dev/null)"
[ "$policy_count" = "0" ] && [ "$respect_rules" != "true" ]
}
_start_launch_core() { _start_launch_core() {
local _cmd _core_only local _cmd _core_only
disable_quic_gso=$(uci get clashoo.config.disable_quic_gso 2>/dev/null) disable_quic_gso=$(uci get clashoo.config.disable_quic_gso 2>/dev/null)
_core_only=$(uci -q get clashoo.config.core_only 2>/dev/null) _core_only=$(uci -q get clashoo.config.core_only 2>/dev/null)
mkdir -p "$(dirname "$CORE_LOG_PATH")" >/dev/null 2>&1 mkdir -p "$(dirname "$CORE_LOG_PATH")" >/dev/null 2>&1
touch "$CORE_LOG_PATH" >/dev/null 2>&1 touch "$CORE_LOG_PATH" >/dev/null 2>&1
# core.log 在 tmpfs 上,先按大小裁剪,避免上次跑飞的大日志直接卡死启动
sh /usr/share/clashoo/lib/core_log_guard.sh "$CORE_LOG_PATH" >/dev/null 2>&1
# Core-only runs the imported config verbatim, which may reference absolute # Core-only runs the imported config verbatim, which may reference absolute
# paths (e.g. OpenClash's external-ui /usr/share/openclash/ui). mihomo's # paths (e.g. OpenClash's external-ui /usr/share/openclash/ui). mihomo's
@@ -2158,6 +2304,13 @@ _start_launch_core() {
# in core-only the user is explicitly trusting their own config. # in core-only the user is explicitly trusting their own config.
[ "$_core_only" = "1" ] && export SAFE_PATHS="/" [ "$_core_only" = "1" ] && export SAFE_PATHS="/"
if ! _mihomo_proxy_dns_valid "${CLASH_CONFIG}/config.yaml"; then
log_msg "Proxy node DNS is required by node DNS policy or respect-rules; set a Proxy Node Domain Resolver in LuCI" "节点域名 DNS 策略或 DNS 遵循规则需要代理节点域名解析,请在 LuCI 中配置"
runtime_state_record_health "fail" "preflight:proxy_dns_missing"
echo "Clashoo" > "$REAL_LOG"
return 1
fi
# preflight dry-run with watchdog: bail on bad config without touching # preflight dry-run with watchdog: bail on bad config without touching
# firewall/dnsmasq, and never let a geo auto-download (mihomo blocks ~90s on # firewall/dnsmasq, and never let a geo auto-download (mihomo blocks ~90s on
# a missing GeoIP/GeoSite when GitHub is unreachable) freeze startup/UI. # a missing GeoIP/GeoSite when GitHub is unreachable) freeze startup/UI.
@@ -2182,6 +2335,10 @@ _start_launch_core() {
procd_set_param command /bin/sh -c "$_cmd" procd_set_param command /bin/sh -c "$_cmd"
[ "$disable_quic_gso" = "1" ] && procd_set_param env QUIC_GO_DISABLE_GSO=1 [ "$disable_quic_gso" = "1" ] && procd_set_param env QUIC_GO_DISABLE_GSO=1
[ "$_core_only" = "1" ] && procd_set_param env SAFE_PATHS=/ [ "$_core_only" = "1" ] && procd_set_param env SAFE_PATHS=/
# 默认 4095 个 fd 顶不住 BT/PCDN 类连接洪水,打爆后核心会陷入
# accept 失败刷屏,与 sing-box 实例保持一致提到 1000000。
procd_set_param limits core="unlimited"
procd_set_param limits nofile="1000000 1000000"
procd_set_param respawn 3600 5 5 procd_set_param respawn 3600 5 5
procd_close_instance procd_close_instance
[ "$disable_quic_gso" = "1" ] && log_msg "Disable quic-go GSO support" "已启用:禁用 quic-go GSO 支持" [ "$disable_quic_gso" = "1" ] && log_msg "Disable quic-go GSO support" "已启用:禁用 quic-go GSO 支持"
@@ -2268,7 +2425,6 @@ start_service(){
sync_legacy_core_field sync_legacy_core_field
_migrate_legacy_mihomo_stable _migrate_legacy_mihomo_stable
_fallback_missing_mihomo_core
CLASH="$(_detect_selected_core)" CLASH="$(_detect_selected_core)"
cleanup_legacy_startup_backups cleanup_legacy_startup_backups
@@ -2465,6 +2621,52 @@ stop_service(){
#=========================================================================================================================== #===========================================================================================================================
} }
_mihomo_reload_api() {
local _path="$1" _response="$2" _dp _ds _lip
_dp="$(uci -q get clashoo.config.dash_port)"; [ -n "$_dp" ] || _dp=9090
_ds="$(uci -q get clashoo.config.dash_pass)"
_lip="$(uci -q get network.lan.ipaddr 2>/dev/null | awk -F'/' '{print $1}')"
[ -n "$_lip" ] || _lip=127.0.0.1
MIHOMO_RELOAD_CURL_RC=0
MIHOMO_RELOAD_HTTP_CODE="$(curl -sS -m 5 -o "$_response" -w '%{http_code}' \
-H "Authorization: Bearer ${_ds}" -H "Content-Type: application/json" \
-X PUT -d '{"path":"'"$_path"'"}' \
"http://${_lip}:${_dp}/configs?force=true" 2>/dev/null)" || MIHOMO_RELOAD_CURL_RC=$?
[ "$MIHOMO_RELOAD_CURL_RC" -eq 0 ] || return 1
case "$MIHOMO_RELOAD_HTTP_CODE" in
2??) return 0 ;;
*) return 1 ;;
esac
}
_mihomo_reload_save_dns() {
MIHOMO_DHCP_MODE="$(stat -c %a /etc/config/dhcp)" || return 1
cp /etc/config/dhcp "$1"
}
_mihomo_reload_restore_dns() {
cp "$1" /etc/config/dhcp && chmod "$MIHOMO_DHCP_MODE" /etc/config/dhcp &&
uci -q revert dhcp && _reload_dnsmasq >/dev/null 2>&1
}
_mihomo_reload_restore() {
local _previous="$1" _response="$2" _dns_backup="$3" _peripheral_changed="$4" _restore _failed=0
if ! _mihomo_reload_api "$_previous" "$_response"; then
return 1
fi
if [ "$_peripheral_changed" = "1" ]; then
if _restore="$(mktemp "${CLASH_CONFIG}/.reload-restore.XXXXXX")"; then
cp "$_previous" "$_restore" && mv -f "$_restore" "$CONFIG_YAML" || { rm -f "$_restore"; _failed=1; }
else
_failed=1
fi
_mihomo_reload_restore_dns "$_dns_backup" || _failed=1
backend_remove_rules >/dev/null 2>&1 || _failed=1
backend_apply_rules >/dev/null 2>&1 || _failed=1
fi
return "$_failed"
}
reload_service() reload_service()
{ {
if is_singbox_selected; then if is_singbox_selected; then
@@ -2477,23 +2679,83 @@ reload_service()
start start
fi fi
elif _core_running; then elif _core_running; then
local _candidate _previous _response _dns_backup _source _pf_rc _error _peripheral_changed
_error=""
resolve_effective_tp_modes resolve_effective_tp_modes
runtime_state_record_preflight "mihomo" _candidate="$(mktemp "${CLASH_CONFIG}/.reload-candidate.XXXXXX")" || { _log_runtime_error "Mihomo reload failed: cannot stage candidate"; return 1; }
backend_remove_rules 2>/dev/null _previous="$(mktemp "${CLASH_CONFIG}/.reload-previous.XXXXXX")" || { rm -f "$_candidate"; _log_runtime_error "Mihomo reload failed: cannot back up current config"; return 1; }
( select_config && _start_prepare_config ) >/dev/null 2>&1 _response="$(mktemp /tmp/clashoo-reload-response.XXXXXX)" || { rm -f "$_candidate" "$_previous"; _log_runtime_error "Mihomo reload failed: cannot stage API response"; return 1; }
# hot-reload via mihomo REST API (config + addtype rules), no process restart or tunnel drop _dns_backup="$(mktemp "${CLASH_CONFIG}/.reload-dhcp.XXXXXX")" || { rm -f "$_candidate" "$_previous" "$_response"; _log_runtime_error "Mihomo reload failed: cannot back up DNS state"; return 1; }
local _dp _ds _lip _source="$(uci -q get clashoo.config.use_config 2>/dev/null)"
_dp="$(uci -q get clashoo.config.dash_port)"; [ -n "$_dp" ] || _dp=9090 if [ ! -s "$_source" ]; then
_ds="$(uci -q get clashoo.config.dash_pass)" _error="selected config is missing or empty"
_lip="$(uci -q get network.lan.ipaddr 2>/dev/null | awk -F'/' '{print $1}')" elif ! cp "$_source" "$_candidate" || ! cp "$CONFIG_YAML" "$_previous" ||
[ -n "$_lip" ] || _lip=127.0.0.1 ! _mihomo_reload_save_dns "$_dns_backup"; then
curl -m 5 -H "Authorization: Bearer ${_ds}" -H "Content-Type: application/json" \ _error="cannot back up current config or DNS state"
-X PUT -d '{"path":"'"$CONFIG_YAML"'"}' \ elif ! ( CONFIG_YAML="$_candidate"; CLASHOO_RELOAD_CANDIDATE=1; _start_prepare_config ) >/dev/null 2>&1 ||
"http://${_lip}:${_dp}/configs?force=true" >/dev/null 2>&1 [ ! -s "$_candidate" ]; then
backend_apply_rules 2>/dev/null _error="candidate generation failed; check DNS and core settings"
if [ "$(uci -q get clashoo.config.core_only 2>/dev/null)" != "1" ]; then
_reload_dnsmasq >/dev/null 2>&1
fi fi
rm -f "${_candidate}.mixin" 2>/dev/null
if [ -n "$_error" ]; then
_log_runtime_error "Mihomo reload failed: ${_error}; current config preserved"
rm -f "$_candidate" "$_previous" "$_response" "$_dns_backup"
return 1
fi
if ! _mihomo_proxy_dns_valid "$_candidate"; then
_log_runtime_error "Mihomo reload failed: node DNS policy or respect-rules requires a Proxy Node Domain Resolver; current config preserved"
rm -f "$_candidate" "$_previous" "$_response" "$_dns_backup"
return 1
fi
if [ "$(uci -q get clashoo.config.core_only 2>/dev/null)" = "1" ]; then
SAFE_PATHS=/ _run_with_timeout 15 "$CLASH" -d "$CLASH_CONFIG" -f "$_candidate" -t >> "$CORE_LOG_PATH" 2>&1
else
_run_with_timeout 15 "$CLASH" -d "$CLASH_CONFIG" -f "$_candidate" -t >> "$CORE_LOG_PATH" 2>&1
fi
_pf_rc=$?
if [ "$_pf_rc" -ne 0 ]; then
if [ "$_pf_rc" -eq 124 ]; then
_error="Mihomo reload failed: candidate preflight timed out"
else
_error="Mihomo reload failed: candidate config invalid (exit ${_pf_rc}; see core log)"
fi
_log_runtime_error "$_error; current config preserved"
rm -f "$_candidate" "$_previous" "$_response" "$_dns_backup"
return 1
fi
if ! _mihomo_reload_api "$_candidate" "$_response"; then
_error="Mihomo reload failed (curl ${MIHOMO_RELOAD_CURL_RC}, HTTP ${MIHOMO_RELOAD_HTTP_CODE})"
if _mihomo_reload_restore "$_previous" "$_response" "$_dns_backup" 0; then
_log_runtime_error "${_error}; previous config restored"
rm -f "$_candidate" "$_previous" "$_response" "$_dns_backup"
else
_log_runtime_error "${_error}; reload outcome unknown; candidate and backup retained"
rm -f "$_response" "$_dns_backup"
fi
return 1
fi
_peripheral_changed=0
if ! mv -f "$_candidate" "$CONFIG_YAML"; then
_error="Mihomo reload failed: cannot commit candidate config"
elif [ "$(uci -q get clashoo.config.core_only 2>/dev/null)" != "1" ]; then
_peripheral_changed=1
if ! backend_remove_rules >/dev/null 2>&1 || ! backend_apply_rules >/dev/null 2>&1 ||
! yml_dns_change >/dev/null 2>&1 || ! _reload_dnsmasq >/dev/null 2>&1; then
_error="Mihomo reload failed: firewall or DNS update failed"
fi
fi
if [ -n "$_error" ]; then
if _mihomo_reload_restore "$_previous" "$_response" "$_dns_backup" "$_peripheral_changed"; then
_log_runtime_error "${_error}; previous config and settings restored"
rm -f "$_candidate" "$_previous" "$_response" "$_dns_backup"
else
_log_runtime_error "${_error}; rollback incomplete; previous config retained for recovery"
rm -f "$_candidate" "$_response"
fi
return 1
fi
rm -f "$_previous" "$_response" "$_dns_backup" "${CONFIG_YAML}.dns-leak-nameserver"
runtime_state_record_preflight "mihomo"
runtime_run_health_check_settle >/dev/null 2>&1 runtime_run_health_check_settle >/dev/null 2>&1
fi fi
} }
@@ -0,0 +1,28 @@
#!/bin/sh
# clashoo core log size guard
# 用法: core_log_guard.sh [logfile]
#
# core.log 落在 /var/log(= /tmp 下的 tmpfs),没有大小上限时一次 accept
# 失败风暴就能把它写到几百 MB,直接把 /tmp 写满(dnsmasq、配置生成、
# cron 全部失效)。这里在超过上限时就地裁剪,只保留尾部内容。
# 内核进程持有该文件的 O_APPEND fd,所以必须原地重写,不能替换 inode。
set -u
LOG="${1:-/var/log/clashoo/core.log}"
MAX_KB="${CLASHOO_CORE_LOG_MAX_KB:-16384}"
KEEP_KB="${CLASHOO_CORE_LOG_KEEP_KB:-1024}"
[ -f "$LOG" ] || exit 0
size="$(wc -c <"$LOG" 2>/dev/null)"
case "${size:-}" in ''|*[!0-9]*) exit 0 ;; esac
[ "$size" -gt $((MAX_KB * 1024)) ] || exit 0
tmp="${LOG}.trim.$$"
if tail -c $((KEEP_KB * 1024)) "$LOG" >"$tmp" 2>/dev/null && cat "$tmp" >"$LOG" 2>/dev/null; then
rm -f "$tmp"
else
rm -f "$tmp"
: >"$LOG" 2>/dev/null || true
fi
exit 0
@@ -30,6 +30,8 @@ echo "$$" >"$PID_FILE"
while :; do while :; do
[ "$(uci -q get clashoo.config.enable 2>/dev/null)" = "1" ] || break [ "$(uci -q get clashoo.config.enable 2>/dev/null)" = "1" ] || break
/usr/share/clashoo/net/access_check_cache.sh >/dev/null 2>&1 || true /usr/share/clashoo/net/access_check_cache.sh >/dev/null 2>&1 || true
# 每轮顺手卡一下 core.log 大小(tmpfs 很小,跑飞会写满 /tmp)
sh /usr/share/clashoo/lib/core_log_guard.sh >/dev/null 2>&1 || true
if [ -n "$INTERVAL_FIXED" ]; then if [ -n "$INTERVAL_FIXED" ]; then
sleep "$INTERVAL_FIXED" sleep "$INTERVAL_FIXED"
else else
@@ -120,7 +120,6 @@ set clashoo_china6 {
2400:5280:1400::/38, 2400:5280:1400::/38,
2400:5280:1c00::/38, 2400:5280:1c00::/38,
2400:5280:3400::/38, 2400:5280:3400::/38,
2400:5280:4c00::/38,
2400:5280:5000::/36, 2400:5280:5000::/36,
2400:5280:6000::/35, 2400:5280:6000::/35,
2400:5280:8000::/34, 2400:5280:8000::/34,
@@ -589,6 +588,7 @@ set clashoo_china6 {
2401:8680:4020::/43, 2401:8680:4020::/43,
2401:8680:4040::/42, 2401:8680:4040::/42,
2401:8680:4080::/41, 2401:8680:4080::/41,
2401:8680:4100::/48,
2401:8680:4103::/48, 2401:8680:4103::/48,
2401:8680:4104::/46, 2401:8680:4104::/46,
2401:8680:4108::/45, 2401:8680:4108::/45,
@@ -775,6 +775,7 @@ set clashoo_china6 {
2401:f860:8a::/47, 2401:f860:8a::/47,
2401:f860:8c::/46, 2401:f860:8c::/46,
2401:f860:91::/48, 2401:f860:91::/48,
2401:f860:93::/48,
2401:f860:95::/48, 2401:f860:95::/48,
2401:f860:96::/48, 2401:f860:96::/48,
2401:f860:98::/45, 2401:f860:98::/45,
@@ -955,8 +956,12 @@ set clashoo_china6 {
2402:7540::/32, 2402:7540::/32,
2402:75c0::/32, 2402:75c0::/32,
2402:7740::/32, 2402:7740::/32,
2402:7820::/32,
2402:7d00::/32, 2402:7d00::/32,
2402:7d80::/32, 2402:7d80::/32,
2402:7da0::/32,
2402:7e20::/32,
2402:7ee0::/32,
2402:8180::/32, 2402:8180::/32,
2402:8300::/32, 2402:8300::/32,
2402:8380::/32, 2402:8380::/32,
@@ -1252,9 +1257,12 @@ set clashoo_china6 {
2403:6180::/32, 2403:6180::/32,
2403:6280::/32, 2403:6280::/32,
2403:62c0::/32, 2403:62c0::/32,
2403:6380::/42, 2403:6380::/44,
2403:6380:20::/44,
2403:6380:33::/48,
2403:6380:34::/46,
2403:6380:38::/45,
2403:6380:41::/48, 2403:6380:41::/48,
2403:6380:43::/48,
2403:6380:44::/46, 2403:6380:44::/46,
2403:6380:48::/45, 2403:6380:48::/45,
2403:6380:50::/44, 2403:6380:50::/44,
@@ -1484,6 +1492,9 @@ set clashoo_china6 {
2404:1e80::/32, 2404:1e80::/32,
2404:1f40::/32, 2404:1f40::/32,
2404:21c0::/32, 2404:21c0::/32,
2404:2280:1000::/36,
2404:2280:2000::/35,
2404:2280:4000::/36,
2404:30c0::/32, 2404:30c0::/32,
2404:3140::/32, 2404:3140::/32,
2404:31c0::/32, 2404:31c0::/32,
@@ -1761,10 +1772,11 @@ set clashoo_china6 {
2405:84c0:8000::/48, 2405:84c0:8000::/48,
2405:84c0:8002::/48, 2405:84c0:8002::/48,
2405:84c0:8006::/48, 2405:84c0:8006::/48,
2405:84c0:8008::/45, 2405:84c0:800a::/47,
2405:84c0:800c::/46,
2405:84c0:8010::/48, 2405:84c0:8010::/48,
2405:84c0:8019::/48, 2405:84c0:8019::/48,
2405:84c0:801c::/46, 2405:84c0:801e::/47,
2405:84c0:8020::/47, 2405:84c0:8020::/47,
2405:84c0:8036::/47, 2405:84c0:8036::/47,
2405:84c0:8038::/46, 2405:84c0:8038::/46,
@@ -1779,7 +1791,11 @@ set clashoo_china6 {
2405:84c0:8050::/48, 2405:84c0:8050::/48,
2405:84c0:8053::/48, 2405:84c0:8053::/48,
2405:84c0:8058::/45, 2405:84c0:8058::/45,
2405:84c0:8060::/43, 2405:84c0:8061::/48,
2405:84c0:8062::/47,
2405:84c0:8064::/46,
2405:84c0:8068::/45,
2405:84c0:8070::/44,
2405:84c0:8080::/41, 2405:84c0:8080::/41,
2405:84c0:8100::/40, 2405:84c0:8100::/40,
2405:84c0:8200::/39, 2405:84c0:8200::/39,
@@ -1934,7 +1950,13 @@ set clashoo_china6 {
2406:840:118::/45, 2406:840:118::/45,
2406:840:120::/43, 2406:840:120::/43,
2406:840:140::/42, 2406:840:140::/42,
2406:840:180::/41, 2406:840:181::/48,
2406:840:182::/47,
2406:840:184::/46,
2406:840:188::/45,
2406:840:190::/44,
2406:840:1a0::/43,
2406:840:1c0::/42,
2406:840:201::/48, 2406:840:201::/48,
2406:840:202::/47, 2406:840:202::/47,
2406:840:204::/46, 2406:840:204::/46,
@@ -2032,7 +2054,10 @@ set clashoo_china6 {
2406:840:8a0::/43, 2406:840:8a0::/43,
2406:840:8c0::/42, 2406:840:8c0::/42,
2406:840:900::/40, 2406:840:900::/40,
2406:840:a00::/44, 2406:840:a01::/48,
2406:840:a02::/47,
2406:840:a04::/46,
2406:840:a08::/45,
2406:840:a12::/47, 2406:840:a12::/47,
2406:840:a14::/46, 2406:840:a14::/46,
2406:840:a18::/45, 2406:840:a18::/45,
@@ -2214,7 +2239,7 @@ set clashoo_china6 {
2406:840:9103::/48, 2406:840:9103::/48,
2406:840:9104::/46, 2406:840:9104::/46,
2406:840:9108::/45, 2406:840:9108::/45,
2406:840:9112::/47, 2406:840:9113::/48,
2406:840:9114::/46, 2406:840:9114::/46,
2406:840:9118::/45, 2406:840:9118::/45,
2406:840:9120::/43, 2406:840:9120::/43,
@@ -2230,12 +2255,15 @@ set clashoo_china6 {
2406:840:9610::/44, 2406:840:9610::/44,
2406:840:9630::/44, 2406:840:9630::/44,
2406:840:9640::/43, 2406:840:9640::/43,
2406:840:9660::/46, 2406:840:9660::/48,
2406:840:9662::/47,
2406:840:9664::/47, 2406:840:9664::/47,
2406:840:9667::/48, 2406:840:9667::/48,
2406:840:9668::/45, 2406:840:9668::/45,
2406:840:9670::/44, 2406:840:9670::/44,
2406:840:9680::/41, 2406:840:9690::/44,
2406:840:96a0::/43,
2406:840:96c0::/42,
2406:840:9800::/46, 2406:840:9800::/46,
2406:840:9808::/45, 2406:840:9808::/45,
2406:840:9810::/45, 2406:840:9810::/45,
@@ -2252,10 +2280,15 @@ set clashoo_china6 {
2406:840:9900::/42, 2406:840:9900::/42,
2406:840:9940::/43, 2406:840:9940::/43,
2406:840:9960::/47, 2406:840:9960::/47,
2406:840:9963::/48,
2406:840:9965::/48, 2406:840:9965::/48,
2406:840:9968::/46, 2406:840:9968::/46,
2406:840:996d::/48, 2406:840:996d::/48,
2406:840:996e::/47, 2406:840:996e::/47,
2406:840:9970::/46,
2406:840:9974::/47,
2406:840:9976::/48,
2406:840:9978::/45,
2406:840:9981::/48, 2406:840:9981::/48,
2406:840:9982::/47, 2406:840:9982::/47,
2406:840:9984::/46, 2406:840:9984::/46,
@@ -2285,7 +2318,8 @@ set clashoo_china6 {
2406:840:e0cc::/47, 2406:840:e0cc::/47,
2406:840:e0ce::/48, 2406:840:e0ce::/48,
2406:840:e0d0::/44, 2406:840:e0d0::/44,
2406:840:e0e4::/46, 2406:840:e0e4::/48,
2406:840:e0e6::/47,
2406:840:e0e9::/48, 2406:840:e0e9::/48,
2406:840:e0ea::/47, 2406:840:e0ea::/47,
2406:840:e0ec::/46, 2406:840:e0ec::/46,
@@ -2375,7 +2409,7 @@ set clashoo_china6 {
2406:840:ea00::/40, 2406:840:ea00::/40,
2406:840:eb06::/48, 2406:840:eb06::/48,
2406:840:eb09::/48, 2406:840:eb09::/48,
2406:840:eb0a::/48, 2406:840:eb0a::/47,
2406:840:eb0c::/47, 2406:840:eb0c::/47,
2406:840:eb0e::/48, 2406:840:eb0e::/48,
2406:840:eb10::/44, 2406:840:eb10::/44,
@@ -2623,7 +2657,7 @@ set clashoo_china6 {
2406:840:fee8::/46, 2406:840:fee8::/46,
2406:840:feec::/48, 2406:840:feec::/48,
2406:840:feee::/47, 2406:840:feee::/47,
2406:840:fef1::/48, 2406:840:feff::/48,
2406:840:ff00::/40, 2406:840:ff00::/40,
2406:880::/32, 2406:880::/32,
2406:8c0::/32, 2406:8c0::/32,
@@ -3032,26 +3066,7 @@ set clashoo_china6 {
2407:fb80::/32, 2407:fb80::/32,
2407:fc80::/32, 2407:fc80::/32,
2407:fd80::/32, 2407:fd80::/32,
2408:4000::/40, 2408:4000::/28,
2408:4000:100::/47,
2408:4000:103::/48,
2408:4000:104::/46,
2408:4000:108::/45,
2408:4000:110::/44,
2408:4000:120::/43,
2408:4000:140::/42,
2408:4000:180::/41,
2408:4000:200::/39,
2408:4000:400::/38,
2408:4000:800::/37,
2408:4000:1000::/36,
2408:4000:2000::/35,
2408:4000:4000::/34,
2408:4000:8000::/33,
2408:4001::/32,
2408:4002::/31,
2408:4004::/30,
2408:4008::/29,
2408:4010::/30, 2408:4010::/30,
2408:4014::/31, 2408:4014::/31,
2408:4016:1::/48, 2408:4016:1::/48,
@@ -3117,6 +3132,40 @@ set clashoo_china6 {
240a:a000::/20, 240a:a000::/20,
240a:c000::/20, 240a:c000::/20,
240b:2000::/22, 240b:2000::/22,
240b:4000::/31,
240b:4002::/36,
240b:4002:1000::/44,
240b:4002:1011::/48,
240b:4002:1012::/47,
240b:4002:1014::/46,
240b:4002:1018::/45,
240b:4002:1020::/43,
240b:4002:1040::/42,
240b:4002:1080::/41,
240b:4002:1100::/40,
240b:4002:1200::/39,
240b:4002:1400::/38,
240b:4002:1800::/37,
240b:4002:2000::/35,
240b:4002:4000::/34,
240b:4002:8000::/33,
240b:4004::/31,
240b:4006::/48,
240b:4006:1000::/43,
240b:4006:1020::/44,
240b:4006:1100::/44,
240b:4006:1110::/45,
240b:4006:1118::/46,
240b:4007::/32,
240b:4009::/32,
240b:400b::/32,
240b:400c::/30,
240b:4010:fffe::/47,
240b:4011::/32,
240b:4012::/31,
240b:4014::/30,
240b:4018::/30,
240b:401f::/32,
240b:6000::/20, 240b:6000::/20,
240b:8000::/21, 240b:8000::/21,
240b:a000::/25, 240b:a000::/25,
@@ -3220,10 +3269,37 @@ set clashoo_china6 {
2605:9d80:9042::/48, 2605:9d80:9042::/48,
2605:9d80:9071::/48, 2605:9d80:9071::/48,
2605:9d80:9092::/48, 2605:9d80:9092::/48,
2620:57:4004::/47,
2804:1e48:9002::/48,
2a03:f900::/29, 2a03:f900::/29,
2a04:3e00:1002::/48, 2a04:3e00::/48,
2a04:3e00:2::/47,
2a04:3e00:4::/46,
2a04:3e00:8::/45,
2a04:3e00:10::/44,
2a04:3e00:20::/43,
2a04:3e00:40::/42,
2a04:3e00:80::/41,
2a04:3e00:100::/40,
2a04:3e00:200::/39,
2a04:3e00:400::/38,
2a04:3e00:800::/37,
2a04:3e00:1001::/48,
2a04:3e00:1002::/47,
2a04:3e00:1004::/46,
2a04:3e00:1008::/45,
2a04:3e00:1010::/44,
2a04:3e00:1020::/43,
2a04:3e00:1040::/42,
2a04:3e00:1080::/41,
2a04:3e00:1100::/40,
2a04:3e00:1200::/39,
2a04:3e00:1400::/38,
2a04:3e00:1800::/37,
2a04:3e00:2000::/35,
2a04:3e00:4000::/34,
2a04:3e00:8000::/33,
2a04:3e01::/32,
2a04:3e02::/31,
2a04:3e04::/30,
2a04:f580:8010::/47, 2a04:f580:8010::/47,
2a04:f580:8090::/48, 2a04:f580:8090::/48,
2a04:f580:8210::/47, 2a04:f580:8210::/47,
@@ -3231,12 +3307,10 @@ set clashoo_china6 {
2a04:f580:9010::/48, 2a04:f580:9010::/48,
2a04:f580:9012::/47, 2a04:f580:9012::/47,
2a04:f580:9020::/48, 2a04:f580:9020::/48,
2a04:f580:9030::/48,
2a04:f580:9040::/48, 2a04:f580:9040::/48,
2a04:f580:9050::/48, 2a04:f580:9050::/48,
2a04:f580:9060::/48, 2a04:f580:9060::/48,
2a04:f580:9070::/48, 2a04:f580:9070::/48,
2a04:f580:9080::/48,
2a04:f580:9210::/48, 2a04:f580:9210::/48,
2a04:f580:9212::/47, 2a04:f580:9212::/47,
2a04:f580:9220::/48, 2a04:f580:9220::/48,
@@ -3294,13 +3368,18 @@ set clashoo_china6 {
2a0a:d685::/40, 2a0a:d685::/40,
2a0a:d685:100::/41, 2a0a:d685:100::/41,
2a0a:d685:180::/42, 2a0a:d685:180::/42,
2a0a:d685:1c0::/43, 2a0a:d685:1c0::/44,
2a0a:d685:1d1::/48,
2a0a:d685:1d2::/47,
2a0a:d685:1d4::/46,
2a0a:d685:1d8::/45,
2a0a:d685:1e2::/47, 2a0a:d685:1e2::/47,
2a0a:d685:1e4::/46, 2a0a:d685:1e4::/46,
2a0a:d685:1e8::/45, 2a0a:d685:1e8::/45,
2a0a:d685:1f0::/45, 2a0a:d685:1f0::/45,
2a0a:d685:1f8::/47, 2a0a:d685:1f8::/47,
2a0a:d685:1fa::/48, 2a0a:d685:1fa::/48,
2a0a:d685:200::/48,
2a0a:d685:202::/47, 2a0a:d685:202::/47,
2a0a:d685:204::/46, 2a0a:d685:204::/46,
2a0a:d685:208::/45, 2a0a:d685:208::/45,
@@ -3390,7 +3469,10 @@ set clashoo_china6 {
2a13:1802:2000::/35, 2a13:1802:2000::/35,
2a13:1802:4000::/34, 2a13:1802:4000::/34,
2a13:1802:8000::/34, 2a13:1802:8000::/34,
2a13:1802:c000::/44, 2a13:1802:c000::/48,
2a13:1802:c002::/47,
2a13:1802:c004::/46,
2a13:1802:c008::/45,
2a13:1802:c020::/43, 2a13:1802:c020::/43,
2a13:1802:c040::/42, 2a13:1802:c040::/42,
2a13:1802:c080::/41, 2a13:1802:c080::/41,
@@ -64,6 +64,7 @@ set clashoo_china {
5.10.138.0/23, 5.10.138.0/23,
5.10.140.0/24, 5.10.140.0/24,
5.10.143.0/24, 5.10.143.0/24,
5.181.224.0/23,
8.128.4.0/22, 8.128.4.0/22,
8.128.32.0/19, 8.128.32.0/19,
8.128.64.0/19, 8.128.64.0/19,
@@ -91,11 +92,92 @@ set clashoo_china {
8.168.0.0/15, 8.168.0.0/15,
8.176.0.0/17, 8.176.0.0/17,
8.176.128.0/19, 8.176.128.0/19,
8.208.0.0/17,
8.208.128.0/21,
8.208.140.0/22,
8.208.144.0/20,
8.208.160.0/19,
8.208.192.0/18,
8.209.0.0/19,
8.209.36.0/22,
8.209.40.0/21,
8.209.48.0/20,
8.209.64.0/18,
8.209.128.0/18,
8.209.192.0/24,
8.209.194.0/23,
8.209.196.0/22,
8.209.200.0/21,
8.209.208.0/20,
8.209.224.0/19,
8.210.0.0/16,
8.211.0.0/17,
8.211.128.0/18,
8.211.192.0/19,
8.211.224.0/22,
8.211.232.0/21,
8.211.240.0/20,
8.212.0.0/18,
8.212.64.0/20,
8.212.80.0/21,
8.212.88.0/22,
8.212.92.0/24,
8.212.94.0/23,
8.212.96.0/22,
8.212.104.0/21,
8.212.112.0/20,
8.212.128.0/19,
8.212.160.0/20,
8.212.176.0/21,
8.212.188.0/22,
8.212.192.0/18,
8.213.0.0/16,
8.214.0.0/17,
8.214.128.0/19,
8.214.164.0/22,
8.214.168.0/21,
8.214.176.0/20,
8.214.192.0/18,
8.215.0.0/17,
8.215.128.0/19,
8.215.160.0/22,
8.215.168.0/21,
8.215.176.0/20,
8.215.192.0/18,
8.216.0.0/18,
8.216.64.0/21,
8.216.72.0/22,
8.216.80.0/20,
8.216.96.0/19,
8.216.128.0/17,
8.217.0.0/16,
8.218.0.0/15,
8.220.0.0/18,
8.220.64.0/19,
8.220.96.0/20,
8.220.112.0/21,
8.220.120.0/22,
8.220.128.0/19,
8.220.160.0/21,
8.220.172.0/22,
8.220.176.0/20,
8.220.192.0/19,
8.220.224.0/21,
8.220.232.0/22,
8.220.240.0/21,
8.221.0.0/17,
8.221.128.0/20,
8.221.144.0/21,
8.221.156.0/22,
8.221.160.0/19,
8.221.192.0/18,
8.222.0.0/15,
14.0.0.0/21, 14.0.0.0/21,
14.0.12.0/22, 14.0.12.0/22,
14.1.0.0/22, 14.1.0.0/22,
14.1.24.0/22, 14.1.24.0/22,
14.1.108.0/22, 14.1.108.0/22,
14.1.112.0/22,
14.16.0.0/12, 14.16.0.0/12,
14.102.128.0/22, 14.102.128.0/22,
14.102.180.0/22, 14.102.180.0/22,
@@ -308,6 +390,75 @@ set clashoo_china {
42.242.0.0/15, 42.242.0.0/15,
42.244.0.0/14, 42.244.0.0/14,
42.248.0.0/13, 42.248.0.0/13,
43.90.0.0/16,
43.92.0.0/15,
43.94.0.0/18,
43.96.0.0/23,
43.96.3.0/24,
43.96.4.0/22,
43.96.8.0/22,
43.96.18.0/24,
43.96.20.0/22,
43.96.24.0/22,
43.96.32.0/22,
43.96.40.0/24,
43.96.42.0/24,
43.96.44.0/23,
43.96.46.0/24,
43.96.48.0/21,
43.96.59.0/24,
43.96.60.0/24,
43.96.62.0/23,
43.96.64.0/21,
43.96.72.0/22,
43.96.78.0/24,
43.96.80.0/23,
43.96.85.0/24,
43.96.86.0/24,
43.96.88.0/23,
43.96.90.0/24,
43.96.92.0/22,
43.96.96.0/23,
43.96.100.0/23,
43.96.103.0/24,
43.96.104.0/23,
43.96.107.0/24,
43.96.109.0/24,
43.96.110.0/23,
43.96.112.0/22,
43.96.116.0/24,
43.96.118.0/23,
43.96.120.0/24,
43.96.122.0/24,
43.96.124.0/23,
43.96.126.0/24,
43.97.0.0/17,
43.98.0.0/15,
43.100.0.0/15,
43.102.0.0/17,
43.102.192.0/18,
43.103.0.0/16,
43.104.0.0/14,
43.108.0.0/16,
43.110.0.0/15,
43.112.0.0/15,
43.114.0.0/16,
43.116.0.0/17,
43.116.160.0/24,
43.116.192.0/18,
43.117.0.0/16,
43.118.0.0/17,
43.118.128.0/18,
43.119.0.0/16,
43.120.0.0/15,
43.122.0.0/16,
43.123.0.0/17,
43.123.128.0/18,
43.124.0.0/16,
43.125.0.0/19,
43.125.32.0/20,
43.125.48.0/21,
43.126.0.0/17,
43.136.0.0/13, 43.136.0.0/13,
43.144.0.0/15, 43.144.0.0/15,
43.148.0.0/14, 43.148.0.0/14,
@@ -435,6 +586,7 @@ set clashoo_china {
43.241.48.0/22, 43.241.48.0/22,
43.241.76.0/22, 43.241.76.0/22,
43.241.80.0/20, 43.241.80.0/20,
43.241.100.0/23,
43.241.112.0/22, 43.241.112.0/22,
43.241.168.0/21, 43.241.168.0/21,
43.241.176.0/21, 43.241.176.0/21,
@@ -457,7 +609,8 @@ set clashoo_china {
43.242.160.0/21, 43.242.160.0/21,
43.242.168.0/22, 43.242.168.0/22,
43.242.180.0/22, 43.242.180.0/22,
43.242.188.0/22, 43.242.189.0/24,
43.242.190.0/23,
43.242.192.0/21, 43.242.192.0/21,
43.242.204.0/22, 43.242.204.0/22,
43.242.216.0/21, 43.242.216.0/21,
@@ -647,6 +800,7 @@ set clashoo_china {
45.117.68.0/22, 45.117.68.0/22,
45.117.124.0/22, 45.117.124.0/22,
45.117.252.0/22, 45.117.252.0/22,
45.119.42.0/23,
45.119.60.0/22, 45.119.60.0/22,
45.119.64.0/21, 45.119.64.0/21,
45.119.72.0/22, 45.119.72.0/22,
@@ -727,6 +881,7 @@ set clashoo_china {
45.127.128.0/22, 45.127.128.0/22,
45.127.144.0/21, 45.127.144.0/21,
45.127.156.0/22, 45.127.156.0/22,
45.199.179.0/24,
45.248.8.0/22, 45.248.8.0/22,
45.248.80.0/21, 45.248.80.0/21,
45.248.96.0/20, 45.248.96.0/20,
@@ -772,6 +927,7 @@ set clashoo_china {
45.251.160.0/19, 45.251.160.0/19,
45.251.192.0/19, 45.251.192.0/19,
45.251.224.0/22, 45.251.224.0/22,
45.251.248.0/23,
45.252.0.0/21, 45.252.0.0/21,
45.252.9.0/24, 45.252.9.0/24,
45.252.10.0/23, 45.252.10.0/23,
@@ -829,8 +985,167 @@ set clashoo_china {
45.255.224.0/20, 45.255.224.0/20,
45.255.240.0/21, 45.255.240.0/21,
45.255.248.0/22, 45.255.248.0/22,
47.52.0.0/16,
47.56.0.0/16,
47.57.0.0/17,
47.57.128.0/18,
47.57.192.0/22,
47.57.196.0/24,
47.57.198.0/23,
47.57.200.0/21,
47.57.208.0/20,
47.57.224.0/19,
47.74.0.0/15,
47.76.0.0/16,
47.77.0.0/20,
47.77.16.0/21,
47.77.24.0/22,
47.77.32.0/19,
47.77.64.0/19,
47.77.96.0/20,
47.77.112.0/23,
47.77.128.0/17,
47.78.0.0/15,
47.80.0.0/14,
47.84.0.0/16,
47.85.0.0/17,
47.85.128.0/23,
47.85.131.0/24,
47.85.132.0/22,
47.85.136.0/21,
47.85.144.0/20,
47.85.160.0/19,
47.85.192.0/18,
47.86.0.0/16,
47.87.0.0/20,
47.87.16.0/21,
47.87.32.0/19,
47.87.64.0/21,
47.87.72.0/24,
47.87.80.0/20,
47.87.96.0/19,
47.87.128.0/20,
47.87.144.0/21,
47.87.156.0/22,
47.87.160.0/19,
47.87.192.0/18,
47.88.0.0/16,
47.89.0.0/18,
47.89.72.0/21,
47.89.80.0/22,
47.89.84.0/24,
47.89.88.0/23,
47.89.90.0/24,
47.89.92.0/22,
47.89.96.0/20,
47.89.122.0/23,
47.89.124.0/23,
47.89.128.0/17,
47.90.0.0/17,
47.90.128.0/19,
47.90.160.0/21,
47.90.168.0/22,
47.90.176.0/20,
47.90.192.0/18,
47.91.0.0/16,
47.92.0.0/14, 47.92.0.0/14,
47.96.0.0/11, 47.96.0.0/11,
47.235.0.0/21,
47.235.8.0/22,
47.235.12.0/23,
47.235.16.0/20,
47.236.0.0/17,
47.236.128.0/18,
47.236.192.0/20,
47.236.208.0/21,
47.236.220.0/22,
47.236.224.0/19,
47.237.0.0/17,
47.237.128.0/18,
47.237.192.0/19,
47.237.224.0/20,
47.237.240.0/21,
47.237.249.0/24,
47.237.250.0/23,
47.237.252.0/22,
47.238.0.0/20,
47.238.16.0/21,
47.238.28.0/22,
47.238.32.0/19,
47.238.64.0/18,
47.238.128.0/17,
47.239.0.0/16,
47.240.0.0/14,
47.244.0.0/16,
47.245.0.0/17,
47.245.128.0/20,
47.245.144.0/21,
47.245.152.0/22,
47.245.160.0/19,
47.245.192.0/20,
47.245.208.0/21,
47.245.216.0/22,
47.245.224.0/19,
47.246.32.0/22,
47.246.66.0/23,
47.246.68.0/23,
47.246.72.0/21,
47.246.82.0/23,
47.246.84.0/22,
47.246.88.0/23,
47.246.91.0/24,
47.246.92.0/23,
47.246.96.0/22,
47.246.101.0/24,
47.246.102.0/23,
47.246.104.0/21,
47.246.120.0/24,
47.246.122.0/23,
47.246.124.0/23,
47.246.128.0/23,
47.246.131.0/24,
47.246.132.0/23,
47.246.135.0/24,
47.246.136.0/21,
47.246.144.0/22,
47.246.150.0/23,
47.246.152.0/22,
47.246.157.0/24,
47.246.158.0/23,
47.246.160.0/23,
47.246.162.0/24,
47.246.164.0/22,
47.246.168.0/21,
47.246.176.0/20,
47.246.192.0/20,
47.246.208.0/23,
47.246.212.0/22,
47.246.216.0/22,
47.250.0.0/18,
47.250.68.0/22,
47.250.72.0/21,
47.250.80.0/20,
47.250.96.0/21,
47.250.108.0/22,
47.250.112.0/20,
47.250.128.0/17,
47.251.0.0/17,
47.251.132.0/22,
47.251.136.0/21,
47.251.144.0/20,
47.251.160.0/19,
47.251.196.0/22,
47.251.200.0/21,
47.251.208.0/20,
47.251.224.0/19,
47.252.0.0/16,
47.253.0.0/18,
47.253.64.0/19,
47.253.96.0/20,
47.253.112.0/21,
47.253.120.0/22,
47.253.128.0/17,
47.254.0.0/16,
49.4.0.0/17, 49.4.0.0/17,
49.4.128.0/22, 49.4.128.0/22,
49.4.160.0/20, 49.4.160.0/20,
@@ -896,14 +1211,7 @@ set clashoo_china {
58.240.0.0/12, 58.240.0.0/12,
59.32.0.0/11, 59.32.0.0/11,
59.64.0.0/12, 59.64.0.0/12,
59.80.0.0/15, 59.80.0.0/14,
59.82.0.0/16,
59.83.0.0/17,
59.83.144.0/20,
59.83.160.0/20,
59.83.192.0/19,
59.83.224.0/21,
59.83.232.0/22,
59.107.0.0/17, 59.107.0.0/17,
59.107.226.0/24, 59.107.226.0/24,
59.107.255.0/24, 59.107.255.0/24,
@@ -922,9 +1230,7 @@ set clashoo_china {
59.153.136.0/22, 59.153.136.0/22,
59.153.152.0/22, 59.153.152.0/22,
59.153.164.0/22, 59.153.164.0/22,
59.153.168.0/22, 59.153.168.0/21,
59.153.173.0/24,
59.153.174.0/23,
59.153.176.0/20, 59.153.176.0/20,
59.153.192.0/22, 59.153.192.0/22,
59.155.0.0/16, 59.155.0.0/16,
@@ -977,6 +1283,7 @@ set clashoo_china {
61.232.0.0/14, 61.232.0.0/14,
61.236.0.0/15, 61.236.0.0/15,
61.240.0.0/14, 61.240.0.0/14,
62.182.190.0/23,
62.234.0.0/16, 62.234.0.0/16,
63.140.0.0/24, 63.140.0.0/24,
63.140.3.0/24, 63.140.3.0/24,
@@ -1153,8 +1460,7 @@ set clashoo_china {
103.5.56.0/22, 103.5.56.0/22,
103.5.152.0/22, 103.5.152.0/22,
103.5.168.0/22, 103.5.168.0/22,
103.5.192.0/23, 103.5.192.0/22,
103.5.194.0/24,
103.5.252.0/22, 103.5.252.0/22,
103.6.76.0/22, 103.6.76.0/22,
103.6.220.0/22, 103.6.220.0/22,
@@ -1635,6 +1941,7 @@ set clashoo_china {
103.70.236.0/22, 103.70.236.0/22,
103.70.252.0/22, 103.70.252.0/22,
103.71.0.0/22, 103.71.0.0/22,
103.71.49.0/24,
103.71.68.0/22, 103.71.68.0/22,
103.71.72.0/22, 103.71.72.0/22,
103.71.80.0/21, 103.71.80.0/21,
@@ -1659,7 +1966,10 @@ set clashoo_china {
103.72.234.0/23, 103.72.234.0/23,
103.72.236.0/22, 103.72.236.0/22,
103.72.240.0/20, 103.72.240.0/20,
103.73.0.0/19, 103.73.0.0/21,
103.73.10.0/23,
103.73.12.0/22,
103.73.16.0/20,
103.73.48.0/22, 103.73.48.0/22,
103.73.116.0/22, 103.73.116.0/22,
103.73.120.0/22, 103.73.120.0/22,
@@ -1676,6 +1986,7 @@ set clashoo_china {
103.74.48.0/22, 103.74.48.0/22,
103.74.56.0/21, 103.74.56.0/21,
103.74.80.0/22, 103.74.80.0/22,
103.74.126.0/23,
103.74.148.0/22, 103.74.148.0/22,
103.74.152.0/21, 103.74.152.0/21,
103.74.204.0/22, 103.74.204.0/22,
@@ -1735,7 +2046,7 @@ set clashoo_china {
103.81.120.0/22, 103.81.120.0/22,
103.81.148.0/22, 103.81.148.0/22,
103.81.164.0/22, 103.81.164.0/22,
103.81.184.0/23, 103.81.184.0/22,
103.81.200.0/22, 103.81.200.0/22,
103.81.232.0/22, 103.81.232.0/22,
103.82.60.0/22, 103.82.60.0/22,
@@ -1750,6 +2061,7 @@ set clashoo_china {
103.83.64.0/22, 103.83.64.0/22,
103.83.72.0/22, 103.83.72.0/22,
103.83.112.0/22, 103.83.112.0/22,
103.83.180.0/22,
103.84.0.0/22, 103.84.0.0/22,
103.84.12.0/22, 103.84.12.0/22,
103.84.16.0/20, 103.84.16.0/20,
@@ -2325,7 +2637,6 @@ set clashoo_china {
103.169.108.0/23, 103.169.108.0/23,
103.169.162.0/23, 103.169.162.0/23,
103.169.202.0/23, 103.169.202.0/23,
103.169.216.0/24,
103.170.4.0/23, 103.170.4.0/23,
103.170.134.0/23, 103.170.134.0/23,
103.170.212.0/23, 103.170.212.0/23,
@@ -2367,6 +2678,7 @@ set clashoo_china {
103.186.228.0/23, 103.186.228.0/23,
103.189.92.0/23, 103.189.92.0/23,
103.189.152.0/22, 103.189.152.0/22,
103.189.197.0/24,
103.190.20.0/23, 103.190.20.0/23,
103.190.71.0/24, 103.190.71.0/24,
103.190.104.0/23, 103.190.104.0/23,
@@ -2728,8 +3040,7 @@ set clashoo_china {
103.235.85.0/24, 103.235.85.0/24,
103.235.87.0/24, 103.235.87.0/24,
103.235.100.0/22, 103.235.100.0/22,
103.235.132.0/22, 103.235.128.0/20,
103.235.136.0/21,
103.235.144.0/21, 103.235.144.0/21,
103.235.184.0/22, 103.235.184.0/22,
103.235.192.0/22, 103.235.192.0/22,
@@ -2839,6 +3150,7 @@ set clashoo_china {
103.247.200.0/22, 103.247.200.0/22,
103.247.212.0/22, 103.247.212.0/22,
103.248.0.0/23, 103.248.0.0/23,
103.248.64.0/22,
103.248.100.0/22, 103.248.100.0/22,
103.248.124.0/22, 103.248.124.0/22,
103.248.152.0/22, 103.248.152.0/22,
@@ -2953,16 +3265,7 @@ set clashoo_china {
110.6.0.0/15, 110.6.0.0/15,
110.16.0.0/14, 110.16.0.0/14,
110.34.40.0/21, 110.34.40.0/21,
110.40.0.0/15, 110.40.0.0/14,
110.42.0.0/20,
110.42.16.0/24,
110.42.18.0/23,
110.42.20.0/22,
110.42.24.0/21,
110.42.32.0/19,
110.42.64.0/18,
110.42.128.0/17,
110.43.0.0/16,
110.44.12.0/22, 110.44.12.0/22,
110.44.144.0/20, 110.44.144.0/20,
110.48.0.0/16, 110.48.0.0/16,
@@ -2983,20 +3286,7 @@ set clashoo_china {
110.92.68.0/22, 110.92.68.0/22,
110.93.32.0/19, 110.93.32.0/19,
110.94.0.0/15, 110.94.0.0/15,
110.96.0.0/15, 110.96.0.0/11,
110.98.0.0/16,
110.100.0.0/14,
110.104.0.0/13,
110.112.0.0/13,
110.120.0.0/16,
110.121.0.0/22,
110.121.8.0/21,
110.121.16.0/20,
110.121.32.0/19,
110.121.64.0/18,
110.121.128.0/17,
110.122.0.0/15,
110.124.0.0/14,
110.152.0.0/14, 110.152.0.0/14,
110.156.0.0/15, 110.156.0.0/15,
110.165.32.0/19, 110.165.32.0/19,
@@ -3063,7 +3353,7 @@ set clashoo_china {
111.235.160.0/19, 111.235.160.0/19,
112.0.0.0/10, 112.0.0.0/10,
112.64.0.0/14, 112.64.0.0/14,
112.73.232.0/24, 112.73.222.0/24,
112.74.0.0/15, 112.74.0.0/15,
112.80.0.0/12, 112.80.0.0/12,
112.96.0.0/13, 112.96.0.0/13,
@@ -3146,12 +3436,7 @@ set clashoo_china {
114.31.64.0/21, 114.31.64.0/21,
114.54.0.0/15, 114.54.0.0/15,
114.60.0.0/14, 114.60.0.0/14,
114.64.0.0/15, 114.64.0.0/14,
114.66.0.0/17,
114.66.224.0/22,
114.66.236.0/22,
114.66.240.0/20,
114.67.0.0/16,
114.68.0.0/16, 114.68.0.0/16,
114.79.64.0/18, 114.79.64.0/18,
114.80.0.0/12, 114.80.0.0/12,
@@ -3180,7 +3465,8 @@ set clashoo_china {
114.112.240.0/23, 114.112.240.0/23,
114.112.245.0/24, 114.112.245.0/24,
114.112.247.0/24, 114.112.247.0/24,
114.112.248.0/22, 114.112.248.0/23,
114.112.251.0/24,
114.112.252.0/23, 114.112.252.0/23,
114.113.0.0/17, 114.113.0.0/17,
114.113.128.0/21, 114.113.128.0/21,
@@ -3298,6 +3584,7 @@ set clashoo_china {
116.242.0.0/15, 116.242.0.0/15,
116.244.0.0/14, 116.244.0.0/14,
116.248.0.0/15, 116.248.0.0/15,
116.251.64.0/18,
116.252.0.0/15, 116.252.0.0/15,
116.254.104.0/21, 116.254.104.0/21,
116.254.128.0/17, 116.254.128.0/17,
@@ -3337,6 +3624,7 @@ set clashoo_china {
117.120.148.0/22, 117.120.148.0/22,
117.120.164.0/22, 117.120.164.0/22,
117.120.184.0/21, 117.120.184.0/21,
117.120.196.0/22,
117.120.208.0/21, 117.120.208.0/21,
117.120.216.0/22, 117.120.216.0/22,
117.120.248.0/21, 117.120.248.0/21,
@@ -3349,7 +3637,6 @@ set clashoo_china {
117.132.0.0/15, 117.132.0.0/15,
117.134.0.0/17, 117.134.0.0/17,
117.134.128.0/18, 117.134.128.0/18,
117.134.207.0/24,
117.134.208.0/23, 117.134.208.0/23,
117.134.212.0/23, 117.134.212.0/23,
117.134.216.0/22, 117.134.216.0/22,
@@ -3460,13 +3747,7 @@ set clashoo_china {
119.48.0.0/13, 119.48.0.0/13,
119.57.0.0/16, 119.57.0.0/16,
119.58.0.0/16, 119.58.0.0/16,
119.59.128.0/24, 119.59.128.0/17,
119.59.130.0/24,
119.59.132.0/22,
119.59.136.0/21,
119.59.144.0/20,
119.59.160.0/19,
119.59.192.0/18,
119.60.0.0/15, 119.60.0.0/15,
119.62.0.0/16, 119.62.0.0/16,
119.63.32.0/19, 119.63.32.0/19,
@@ -3487,7 +3768,6 @@ set clashoo_china {
119.161.120.0/21, 119.161.120.0/21,
119.161.128.0/21, 119.161.128.0/21,
119.161.144.0/21, 119.161.144.0/21,
119.161.152.0/23,
119.161.160.0/19, 119.161.160.0/19,
119.161.192.0/18, 119.161.192.0/18,
119.162.0.0/15, 119.162.0.0/15,
@@ -3564,8 +3844,7 @@ set clashoo_china {
121.59.102.0/23, 121.59.102.0/23,
121.59.104.0/23, 121.59.104.0/23,
121.59.107.0/24, 121.59.107.0/24,
121.59.108.0/24, 121.59.108.0/22,
121.59.110.0/23,
121.59.112.0/21, 121.59.112.0/21,
121.59.121.0/24, 121.59.121.0/24,
121.59.123.0/24, 121.59.123.0/24,
@@ -3605,8 +3884,7 @@ set clashoo_china {
122.8.68.0/22, 122.8.68.0/22,
122.8.76.0/22, 122.8.76.0/22,
122.8.80.0/23, 122.8.80.0/23,
122.8.112.0/21, 122.8.116.0/22,
122.8.124.0/22,
122.8.192.0/18, 122.8.192.0/18,
122.9.0.0/16, 122.9.0.0/16,
122.10.129.0/24, 122.10.129.0/24,
@@ -3696,15 +3974,13 @@ set clashoo_china {
123.49.128.0/18, 123.49.128.0/18,
123.49.192.0/23, 123.49.192.0/23,
123.49.194.0/24, 123.49.194.0/24,
123.49.197.0/24, 123.49.196.0/22,
123.49.198.0/23,
123.49.200.0/21, 123.49.200.0/21,
123.49.208.0/20, 123.49.208.0/20,
123.49.224.0/21, 123.49.224.0/20,
123.49.232.0/22,
123.49.236.0/24,
123.49.240.0/24, 123.49.240.0/24,
123.49.242.0/23, 123.49.242.0/23,
123.49.245.0/24,
123.49.248.0/21, 123.49.248.0/21,
123.50.160.0/19, 123.50.160.0/19,
123.52.0.0/14, 123.52.0.0/14,
@@ -3782,10 +4058,6 @@ set clashoo_china {
124.67.0.0/16, 124.67.0.0/16,
124.68.16.0/20, 124.68.16.0/20,
124.68.64.0/18, 124.68.64.0/18,
124.68.176.0/20,
124.68.224.0/20,
124.68.244.0/22,
124.68.248.0/21,
124.69.0.0/16, 124.69.0.0/16,
124.70.0.0/16, 124.70.0.0/16,
124.71.0.0/17, 124.71.0.0/17,
@@ -3885,6 +4157,15 @@ set clashoo_china {
139.5.212.0/22, 139.5.212.0/22,
139.5.244.0/22, 139.5.244.0/22,
139.9.0.0/16, 139.9.0.0/16,
139.95.0.0/20,
139.95.16.0/22,
139.95.22.0/23,
139.95.24.0/21,
139.95.32.0/21,
139.95.40.0/23,
139.95.64.0/23,
139.95.96.0/22,
139.95.128.0/17,
139.129.0.0/16, 139.129.0.0/16,
139.148.0.0/16, 139.148.0.0/16,
139.155.0.0/16, 139.155.0.0/16,
@@ -3945,14 +4226,7 @@ set clashoo_china {
140.179.0.0/16, 140.179.0.0/16,
140.205.0.0/16, 140.205.0.0/16,
140.206.0.0/15, 140.206.0.0/15,
140.210.0.0/20, 140.210.0.0/16,
140.210.16.0/21,
140.210.24.0/22,
140.210.28.0/23,
140.210.30.0/24,
140.210.32.0/19,
140.210.64.0/18,
140.210.128.0/17,
140.224.0.0/16, 140.224.0.0/16,
140.237.0.0/16, 140.237.0.0/16,
140.240.0.0/16, 140.240.0.0/16,
@@ -3961,7 +4235,8 @@ set clashoo_china {
140.249.0.0/16, 140.249.0.0/16,
140.250.0.0/16, 140.250.0.0/16,
140.255.0.0/16, 140.255.0.0/16,
142.86.192.0/19, 142.86.200.0/21,
142.86.208.0/20,
142.86.224.0/20, 142.86.224.0/20,
142.86.240.0/21, 142.86.240.0/21,
142.86.248.0/22, 142.86.248.0/22,
@@ -4008,9 +4283,23 @@ set clashoo_china {
146.222.94.0/24, 146.222.94.0/24,
147.78.132.0/24, 147.78.132.0/24,
147.78.134.0/24, 147.78.134.0/24,
147.139.0.0/17,
147.139.128.0/18,
147.139.192.0/19,
147.139.224.0/20,
147.139.240.0/21,
147.139.248.0/22,
148.70.0.0/16, 148.70.0.0/16,
149.41.64.0/18, 149.41.64.0/18,
149.41.192.0/19, 149.41.192.0/19,
149.129.0.0/20,
149.129.16.0/21,
149.129.32.0/19,
149.129.64.0/18,
149.129.128.0/19,
149.129.168.0/21,
149.129.176.0/20,
149.129.192.0/18,
150.0.0.0/16, 150.0.0.0/16,
150.115.0.0/16, 150.115.0.0/16,
150.121.0.0/16, 150.121.0.0/16,
@@ -4068,6 +4357,10 @@ set clashoo_china {
156.107.170.0/24, 156.107.170.0/24,
156.107.179.0/24, 156.107.179.0/24,
156.107.181.0/24, 156.107.181.0/24,
156.227.20.0/24,
156.236.12.0/24,
156.236.17.0/24,
156.245.1.0/24,
157.0.0.0/16, 157.0.0.0/16,
157.10.34.0/23, 157.10.34.0/23,
157.10.36.0/23, 157.10.36.0/23,
@@ -4086,7 +4379,7 @@ set clashoo_china {
157.20.194.0/23, 157.20.194.0/23,
157.20.246.0/23, 157.20.246.0/23,
157.61.0.0/16, 157.61.0.0/16,
157.66.42.0/23, 157.66.43.0/24,
157.66.70.0/23, 157.66.70.0/23,
157.66.88.0/21, 157.66.88.0/21,
157.66.164.0/23, 157.66.164.0/23,
@@ -4144,6 +4437,7 @@ set clashoo_china {
160.202.62.0/24, 160.202.62.0/24,
160.202.148.0/22, 160.202.148.0/22,
160.202.152.0/22, 160.202.152.0/22,
160.202.210.0/23,
160.202.212.0/22, 160.202.212.0/22,
160.202.216.0/21, 160.202.216.0/21,
160.202.224.0/19, 160.202.224.0/19,
@@ -4162,6 +4456,7 @@ set clashoo_china {
160.250.170.0/23, 160.250.170.0/23,
160.250.214.0/23, 160.250.214.0/23,
160.250.252.0/23, 160.250.252.0/23,
161.117.0.0/16,
161.163.0.0/21, 161.163.0.0/21,
161.163.28.0/23, 161.163.28.0/23,
161.189.0.0/16, 161.189.0.0/16,
@@ -4191,6 +4486,7 @@ set clashoo_china {
163.52.28.0/23, 163.52.28.0/23,
163.52.76.0/23, 163.52.76.0/23,
163.52.108.0/23, 163.52.108.0/23,
163.52.246.0/23,
163.53.0.0/20, 163.53.0.0/20,
163.53.36.0/22, 163.53.36.0/22,
163.53.40.0/21, 163.53.40.0/21,
@@ -4220,7 +4516,6 @@ set clashoo_china {
163.223.32.0/23, 163.223.32.0/23,
163.223.72.0/23, 163.223.72.0/23,
163.223.124.0/23, 163.223.124.0/23,
163.223.217.0/24,
163.223.222.0/23, 163.223.222.0/23,
163.227.34.0/23, 163.227.34.0/23,
163.227.40.0/23, 163.227.40.0/23,
@@ -4248,6 +4543,29 @@ set clashoo_china {
167.189.0.0/16, 167.189.0.0/16,
167.220.244.0/22, 167.220.244.0/22,
168.160.0.0/16, 168.160.0.0/16,
170.33.15.0/24,
170.33.20.0/22,
170.33.24.0/24,
170.33.29.0/24,
170.33.30.0/23,
170.33.32.0/22,
170.33.41.0/24,
170.33.64.0/23,
170.33.66.0/24,
170.33.68.0/23,
170.33.72.0/23,
170.33.76.0/22,
170.33.80.0/22,
170.33.84.0/24,
170.33.104.0/22,
170.33.112.0/23,
170.33.114.0/24,
170.33.129.0/24,
170.33.130.0/23,
170.33.136.0/23,
170.33.138.0/24,
170.33.168.0/23,
170.33.192.0/23,
170.179.0.0/16, 170.179.0.0/16,
171.8.0.0/13, 171.8.0.0/13,
171.34.0.0/15, 171.34.0.0/15,
@@ -4382,7 +4700,6 @@ set clashoo_china {
183.91.52.0/22, 183.91.52.0/22,
183.91.56.0/24, 183.91.56.0/24,
183.91.61.0/24, 183.91.61.0/24,
183.91.63.0/24,
183.91.128.0/22, 183.91.128.0/22,
183.91.136.0/21, 183.91.136.0/21,
183.91.144.0/20, 183.91.144.0/20,
@@ -4417,6 +4734,7 @@ set clashoo_china {
192.140.160.0/19, 192.140.160.0/19,
192.140.192.0/20, 192.140.192.0/20,
192.140.208.0/21, 192.140.208.0/21,
192.140.244.0/23,
192.144.128.0/17, 192.144.128.0/17,
192.163.11.0/24, 192.163.11.0/24,
192.232.34.0/23, 192.232.34.0/23,
@@ -4426,6 +4744,12 @@ set clashoo_china {
193.119.0.0/19, 193.119.0.0/19,
194.138.202.0/23, 194.138.202.0/23,
194.138.245.0/24, 194.138.245.0/24,
198.11.128.0/20,
198.11.145.0/24,
198.11.146.0/23,
198.11.148.0/22,
198.11.152.0/21,
198.11.160.0/19,
198.175.100.0/22, 198.175.100.0/22,
198.208.17.0/24, 198.208.17.0/24,
198.208.19.0/24, 198.208.19.0/24,
@@ -4796,8 +5120,7 @@ set clashoo_china {
202.143.56.0/21, 202.143.56.0/21,
202.143.100.0/22, 202.143.100.0/22,
202.143.104.0/22, 202.143.104.0/22,
202.144.196.0/23, 202.144.196.0/22,
202.144.198.0/24,
202.146.160.0/20, 202.146.160.0/20,
202.146.184.0/23, 202.146.184.0/23,
202.146.186.0/24, 202.146.186.0/24,
@@ -4837,7 +5160,6 @@ set clashoo_china {
202.164.0.0/20, 202.164.0.0/20,
202.164.96.0/19, 202.164.96.0/19,
202.165.176.0/20, 202.165.176.0/20,
202.165.208.0/21,
202.165.239.0/24, 202.165.239.0/24,
202.165.240.0/23, 202.165.240.0/23,
202.165.243.0/24, 202.165.243.0/24,
@@ -5709,6 +6031,7 @@ set clashoo_china {
203.81.1.0/24, 203.81.1.0/24,
203.81.2.0/24, 203.81.2.0/24,
203.81.5.0/24, 203.81.5.0/24,
203.81.7.0/24,
203.81.16.0/20, 203.81.16.0/20,
203.81.244.0/22, 203.81.244.0/22,
203.82.0.0/23, 203.82.0.0/23,
@@ -5782,17 +6105,7 @@ set clashoo_china {
203.104.32.0/20, 203.104.32.0/20,
203.105.96.0/19, 203.105.96.0/19,
203.105.128.0/19, 203.105.128.0/19,
203.107.0.0/23, 203.107.0.0/17,
203.107.2.0/24,
203.107.4.0/22,
203.107.8.0/21,
203.107.16.0/20,
203.107.32.0/19,
203.107.69.0/24,
203.107.70.0/23,
203.107.72.0/21,
203.107.80.0/20,
203.107.96.0/19,
203.110.160.0/19, 203.110.160.0/19,
203.110.208.0/20, 203.110.208.0/20,
203.110.232.0/23, 203.110.232.0/23,
@@ -5817,8 +6130,7 @@ set clashoo_china {
203.123.58.0/24, 203.123.58.0/24,
203.128.32.0/19, 203.128.32.0/19,
203.128.96.0/19, 203.128.96.0/19,
203.128.225.0/24, 203.128.224.0/22,
203.128.226.0/23,
203.128.228.0/24, 203.128.228.0/24,
203.128.231.0/24, 203.128.231.0/24,
203.129.8.0/24, 203.129.8.0/24,
@@ -5931,6 +6243,7 @@ set clashoo_china {
203.223.16.0/24, 203.223.16.0/24,
203.223.21.0/24, 203.223.21.0/24,
203.223.22.0/23, 203.223.22.0/23,
205.204.96.0/19,
206.109.70.0/23, 206.109.70.0/23,
206.109.75.0/24, 206.109.75.0/24,
210.2.0.0/19, 210.2.0.0/19,
@@ -5986,6 +6299,8 @@ set clashoo_china {
211.144.0.0/14, 211.144.0.0/14,
211.148.0.0/16, 211.148.0.0/16,
211.149.0.0/19, 211.149.0.0/19,
211.149.33.0/24,
211.149.34.0/23,
211.149.48.0/21, 211.149.48.0/21,
211.149.64.0/21, 211.149.64.0/21,
211.149.80.0/21, 211.149.80.0/21,
@@ -6176,12 +6491,14 @@ set clashoo_china {
223.112.0.0/14, 223.112.0.0/14,
223.116.0.0/15, 223.116.0.0/15,
223.121.128.0/17, 223.121.128.0/17,
223.122.4.0/22, 223.122.5.0/24,
223.122.12.0/22, 223.122.6.0/23,
223.122.13.0/24,
223.122.14.0/23,
223.122.18.0/23, 223.122.18.0/23,
223.122.20.0/22, 223.122.20.0/22,
223.122.26.0/23, 223.122.26.0/23,
223.122.28.0/22, 223.122.28.0/23,
223.123.196.0/22, 223.123.196.0/22,
223.123.204.0/22, 223.123.204.0/22,
223.123.208.0/20, 223.123.208.0/20,
Binary file not shown.
Binary file not shown.
@@ -153,21 +153,25 @@ resolve_via() {
} }
curl_subscription() { curl_subscription() {
local url tmp hdr err ua extra_resolve http_code rc local url tmp hdr err ua host ip http_code rc
url="$1" url="$1"
tmp="$2" tmp="$2"
hdr="$3" hdr="$3"
err="$4" err="$4"
ua="$5" ua="$5"
extra_resolve="$6" host="$6"
ip="$7"
rm -f "$tmp" "$hdr" "$err" >/dev/null 2>&1 rm -f "$tmp" "$hdr" "$err" >/dev/null 2>&1
# shellcheck disable=SC2086 set --
if [ -n "$host" ] && [ -n "$ip" ]; then
set -- --resolve "$host:443:$ip" --resolve "$host:80:$ip"
fi
http_code="$(curl -sSL --connect-timeout 15 --max-time 60 \ http_code="$(curl -sSL --connect-timeout 15 --max-time 60 \
--speed-time 30 --speed-limit 1 --retry 2 \ --speed-time 30 --speed-limit 1 --retry 2 \
-H "User-Agent: ${ua}" -D "$hdr" -o "$tmp" \ -H "User-Agent: ${ua}" -D "$hdr" -o "$tmp" \
$extra_resolve \ "$@" \
-w '%{http_code}' "$url" 2>"$err")" -w '%{http_code}' "$url" 2>"$err")"
rc=$? rc=$?
printf '%s\n' "$http_code" printf '%s\n' "$http_code"
@@ -176,7 +180,7 @@ curl_subscription() {
download_subscription() { download_subscription() {
local url target tmp hdr err rc http_code info_line ua err_msg local url target tmp hdr err rc http_code info_line ua err_msg
local host ip dns extra local host ip dns
url="$1" url="$1"
target="$2" target="$2"
tmp="${TMP_PREFIX}.yaml" tmp="${TMP_PREFIX}.yaml"
@@ -187,25 +191,27 @@ download_subscription() {
[ -n "$ua" ] || ua="$DEFAULT_SUB_UA" [ -n "$ua" ] || ua="$DEFAULT_SUB_UA"
if command -v curl >/dev/null 2>&1; then if command -v curl >/dev/null 2>&1; then
http_code="$(curl_subscription "$url" "$tmp" "$hdr" "$err" "$ua" "")" http_code="$(curl_subscription "$url" "$tmp" "$hdr" "$err" "$ua" "" "")"
rc=$? rc=$?
if [ "$rc" -ne 0 ] || [ "$http_code" = "000" ]; then if [ "$rc" -ne 0 ] || [ "$http_code" = "000" ]; then
host="$(extract_host "$url")" host="$(extract_host "$url")"
case "$host" in
''|[-.]*|*[!A-Za-z0-9.-]*) host='' ;;
esac
if [ -n "$host" ]; then if [ -n "$host" ]; then
for dns in 223.5.5.5 119.29.29.29 1.1.1.1 8.8.8.8; do for dns in 223.5.5.5 119.29.29.29 1.1.1.1 8.8.8.8; do
ip="$(resolve_via "$host" "$dns")" ip="$(resolve_via "$host" "$dns")"
[ -n "$ip" ] || continue [ -n "$ip" ] || continue
log_update "DNS 回退:${host} -> ${ip} (@${dns})" log_update "DNS 回退:${host} -> ${ip} (@${dns})"
extra="--resolve ${host}:443:${ip} --resolve ${host}:80:${ip}" http_code="$(curl_subscription "$url" "$tmp" "$hdr" "$err" "$ua" "$host" "$ip")"
http_code="$(curl_subscription "$url" "$tmp" "$hdr" "$err" "$ua" "$extra")"
rc=$? rc=$?
[ "$rc" -eq 0 ] && [ "$http_code" = "200" ] && break [ "$rc" -eq 0 ] && [ "$http_code" = "200" ] && break
done done
fi fi
fi fi
else else
wget -q --tries=4 --timeout=20 \ wget -q --timeout=20 \
--user-agent="$ua" "$url" -O "$tmp" 2>"$err" --user-agent="$ua" "$url" -O "$tmp" 2>"$err"
rc=$? rc=$?
http_code="" http_code=""
@@ -145,132 +145,70 @@ dns_mihomo_apply_respect_rules() {
# Use fallback DNS for queries; keep bootstrap DNS unchanged. # Use fallback DNS for queries; keep bootstrap DNS unchanged.
dns_mihomo_apply_leak_nameservers() { dns_mihomo_apply_leak_nameservers() {
local cfg="$1" enabled="${2:-0}" state="${1}.dns-leak-nameserver" local cfg="$1" enabled="${2:-0}" state="${1}.dns-leak-nameserver"
local selected="${1}.dns-leak-selected" current="${1}.dns-leak-current" tmp="${1}.$$" local selected="${1}.dns-leak-selected" tmp="${1}.$$"
# The config is rebuilt from the selected subscription on every run.
# A saved nameserver from an earlier run must never replace its DNS.
rm -f "$state" 2>/dev/null
[ "$enabled" = "1" ] || return 0
[ -f "$cfg" ] || return 0 [ -f "$cfg" ] || return 0
command -v yq >/dev/null 2>&1 || return 0 command -v yq >/dev/null 2>&1 || return 0
if [ "$enabled" = "1" ]; then yq e -r '.dns.fallback[]' "$cfg" > "$selected" 2>/dev/null || true
yq e -r '.dns.fallback[]' "$cfg" > "$selected" 2>/dev/null || true if [ ! -s "$selected" ]; then
if [ ! -s "$selected" ]; then printf '%s\n' 'https://1.1.1.1/dns-query' 'https://8.8.8.8/dns-query' > "$selected"
printf '%s\n' 'https://1.1.1.1/dns-query' 'https://8.8.8.8/dns-query' > "$selected"
fi
yq e -r '.dns.nameserver[]' "$cfg" > "$current" 2>/dev/null || true
if [ ! -f "$state" ] ||
! grep -q 'clashoo:dns_leak_protect_respect_rules' "$cfg" ||
! cmp -s "$current" "$selected"; then
awk '
function indent_len(s) { match(s, /[^ ]/); return RSTART ? RSTART - 1 : length(s) }
/^dns:[[:space:]]*$/ { in_dns = 1; dns_indent = indent_len($0); next }
in_dns && /^[^[:space:]#][^:]*:/ { exit }
in_dns && /^[[:space:]]*nameserver:/ {
print
rest = $0
sub(/^[[:space:]]*nameserver:[[:space:]]*/, "", rest)
sub(/[[:space:]]*(#.*)?$/, "", rest)
if (rest == "") { in_ns = 1; ns_indent = indent_len($0) }
next
}
in_ns {
cur_indent = indent_len($0)
if ($0 ~ /^[[:space:]]*$/ || cur_indent > ns_indent) {
print
next
}
exit
}
' "$cfg" > "$state"
[ -s "$state" ] || printf '__ABSENT__\n' > "$state"
fi
awk -v selected="$selected" '
function indent_len(s) { match(s, /[^ ]/); return RSTART ? RSTART - 1 : length(s) }
function spaces(n, out,i) {
out = ""
for (i = 0; i < n; i++) out = out " "
return out
}
function print_selected(sp, line) {
print sp "nameserver:"
while ((getline line < selected) > 0)
if (line != "") print sp " - " line
close(selected)
inserted = 1
}
/^dns:[[:space:]]*$/ {
in_dns = 1
dns_indent = indent_len($0)
child_indent = -1
print
next
}
in_dns && /^[^[:space:]#][^:]*:/ {
if (!inserted) print_selected(spaces(child_indent > 0 ? child_indent : dns_indent + 2))
in_dns = 0
print
next
}
in_dns && /^[[:space:]]*[^#[:space:]][^:]*:/ && child_indent < 0 {
child_indent = indent_len($0)
}
in_dns && /^[[:space:]]*nameserver:/ {
ns_indent = indent_len($0)
rest = $0
sub(/^[[:space:]]*nameserver:[[:space:]]*/, "", rest)
sub(/[[:space:]]*(#.*)?$/, "", rest)
print_selected(spaces(ns_indent))
if (rest == "") skip_ns = 1
next
}
skip_ns {
cur_indent = indent_len($0)
if ($0 ~ /^[[:space:]]*$/ || cur_indent > ns_indent) next
skip_ns = 0
}
{ print }
END {
if (in_dns && !inserted)
print_selected(spaces(child_indent > 0 ? child_indent : dns_indent + 2))
}
' "$cfg" > "$tmp" && mv "$tmp" "$cfg"
elif [ -f "$state" ]; then
awk -v state="$state" '
function indent_len(s) { match(s, /[^ ]/); return RSTART ? RSTART - 1 : length(s) }
function print_original( line) {
if ((getline line < state) > 0 && line != "__ABSENT__") {
print line
while ((getline line < state) > 0) print line
}
close(state)
restored = 1
}
/^dns:[[:space:]]*$/ { in_dns = 1; print; next }
in_dns && /^[^[:space:]#][^:]*:/ {
if (!restored) print_original()
in_dns = 0
print
next
}
in_dns && /^[[:space:]]*nameserver:/ {
ns_indent = indent_len($0)
rest = $0
sub(/^[[:space:]]*nameserver:[[:space:]]*/, "", rest)
sub(/[[:space:]]*(#.*)?$/, "", rest)
print_original()
if (rest == "") skip_ns = 1
next
}
skip_ns {
cur_indent = indent_len($0)
if ($0 ~ /^[[:space:]]*$/ || cur_indent > ns_indent) next
skip_ns = 0
}
{ print }
END { if (in_dns && !restored) print_original() }
' "$cfg" > "$tmp" && mv "$tmp" "$cfg"
rm -f "$state"
fi fi
rm -f "$selected" "$current" "$tmp" 2>/dev/null
awk -v selected="$selected" '
function indent_len(s) { match(s, /[^ ]/); return RSTART ? RSTART - 1 : length(s) }
function spaces(n, out,i) {
out = ""
for (i = 0; i < n; i++) out = out " "
return out
}
function print_selected(sp, line) {
print sp "nameserver:"
while ((getline line < selected) > 0)
if (line != "") print sp " - " line
close(selected)
inserted = 1
}
/^dns:[[:space:]]*$/ {
in_dns = 1
dns_indent = indent_len($0)
child_indent = -1
print
next
}
in_dns && /^[^[:space:]#][^:]*:/ {
if (!inserted) print_selected(spaces(child_indent > 0 ? child_indent : dns_indent + 2))
in_dns = 0
print
next
}
in_dns && /^[[:space:]]*[^#[:space:]][^:]*:/ && child_indent < 0 {
child_indent = indent_len($0)
}
in_dns && /^[[:space:]]*nameserver:/ {
ns_indent = indent_len($0)
rest = $0
sub(/^[[:space:]]*nameserver:[[:space:]]*/, "", rest)
sub(/[[:space:]]*(#.*)?$/, "", rest)
print_selected(spaces(ns_indent))
if (rest == "") skip_ns = 1
next
}
skip_ns {
cur_indent = indent_len($0)
if ($0 ~ /^[[:space:]]*$/ || cur_indent > ns_indent) next
skip_ns = 0
}
{ print }
END {
if (in_dns && !inserted)
print_selected(spaces(child_indent > 0 ? child_indent : dns_indent + 2))
}
' "$cfg" > "$tmp" && mv "$tmp" "$cfg"
rm -f "$selected" "$tmp" 2>/dev/null
} }
@@ -0,0 +1,118 @@
#!/usr/bin/ucode
'use strict';
import { readfile } from 'fs';
// Mirror node-domain DNS policies from the subscription into
// proxy-server-nameserver-policy (issue #73).
//
// Airports publish their own resolver for node domains, e.g.
// nameserver-policy:
// "+.chylink.xyz": [tls://112.74.48.57:10853]
// which answers with domestic relay IPs. mihomo resolves *proxy server* domains
// through proxy-server-nameserver(-policy) and ignores nameserver-policy there,
// so that resolver is never used and node domains fall back to public DNS -
// which may return overseas CDN IPs that some lines cannot reach at all, leaving
// every node (AnyTLS is TCP-only) timing out.
//
// Input : CLASHOO_NODE_DNS_SOURCE_FILE = path to {"policies": {...}, "servers": [...]}
// (CLASHOO_NODE_DNS_SOURCE with the JSON itself is still accepted)
// Output: JSON map with only the policy entries matching a node server domain
// (nothing is printed when there is no match)
let source = '';
let source_file = getenv('CLASHOO_NODE_DNS_SOURCE_FILE') || '';
if (length(source_file)) {
try {
source = readfile(source_file) || '';
}
catch (e) {
exit(0);
}
}
else {
source = getenv('CLASHOO_NODE_DNS_SOURCE') || '';
}
if (!length(source))
exit(0);
let parsed;
try {
parsed = json(source);
}
catch (e) {
exit(0);
}
if (type(parsed) != 'object')
exit(0);
let policies = parsed.policies;
let servers = parsed.servers;
if (type(policies) != 'object' || type(servers) != 'array')
exit(0);
let domains = [];
let seen = {};
for (let server in servers) {
if (type(server) != 'string' || !length(server))
continue;
server = lc(server);
if (seen[server])
continue;
seen[server] = true;
push(domains, server);
}
if (!length(domains))
exit(0);
// suffix match on a label boundary: node.example.com matches +.example.com
function domain_matches(key, domain) {
let key_len = length(key);
let domain_len = length(domain);
if (!key_len || domain_len < key_len)
return false;
if (domain == key)
return true;
if (substr(domain, domain_len - key_len) != key)
return false;
return substr(domain, domain_len - key_len - 1, 1) == '.';
}
let result = {};
for (let key, value in policies) {
if (type(key) != 'string' || !length(key))
continue;
let lowered = lc(key);
let is_pattern = match(lowered, /^[+*]?\./) != null;
let domain = replace(lowered, /^\+\./, '');
domain = replace(domain, /^\*\./, '');
domain = replace(domain, /^\./, '');
let matched = false;
for (let candidate in domains) {
if (is_pattern ? domain_matches(domain, candidate) : (candidate == lowered)) {
matched = true;
break;
}
}
if (matched)
result[key] = value;
}
if (!length(keys(result)))
exit(0);
print(sprintf('%J', result));
@@ -6,7 +6,7 @@ TMP_PREFIX="/tmp/clashoo_iprules.$$"
CUSTOM_RULE_FILE="${TMP_PREFIX}.ipadd.conf" CUSTOM_RULE_FILE="${TMP_PREFIX}.ipadd.conf"
RULE="${TMP_PREFIX}.rules_conf.yaml" RULE="${TMP_PREFIX}.rules_conf.yaml"
CLASH="${TMP_PREFIX}.conf.yaml" CLASH="${TMP_PREFIX}.conf.yaml"
CONFIG_YAML="/etc/clashoo/config.yaml" CONFIG_YAML="${CLASHOO_CONFIG_YAML:-/etc/clashoo/config.yaml}"
CLASH_CONFIG="${TMP_PREFIX}.config.yaml" CLASH_CONFIG="${TMP_PREFIX}.config.yaml"
trap 'rm -f "$CUSTOM_RULE_FILE" "$RULE" "$CLASH" "$CLASH_CONFIG"' EXIT trap 'rm -f "$CUSTOM_RULE_FILE" "$RULE" "$CLASH" "$CLASH_CONFIG"' EXIT
@@ -145,7 +145,7 @@ if (type(inherited_nameserver) != 'array') {
inherited_nameserver = []; inherited_nameserver = [];
} }
let dns_role_fields = ['nameserver', 'proxy-server-nameserver', 'direct-nameserver', let dns_role_fields = ['nameserver', 'proxy-server-nameserver', 'direct-nameserver',
'default-nameserver', 'nameserver-policy', 'respect-rules']; 'default-nameserver', 'nameserver-policy', 'proxy-server-nameserver-policy', 'respect-rules'];
let had_user_dns_roles = false; let had_user_dns_roles = false;
for (let f in dns_role_fields) for (let f in dns_role_fields)
if (dns_present[f]) had_user_dns_roles = true; if (dns_present[f]) had_user_dns_roles = true;
@@ -200,18 +200,23 @@ if (length(bootstrap) && (!dns_present['default-nameserver'] || dns_force['defau
cfg['dns']['default-nameserver'] = bootstrap; cfg['dns']['default-nameserver'] = bootstrap;
let policies = {}; let policies = {};
let proxy_policies = {};
uci.foreach('clashoo', 'dns_policy', function(sec) { uci.foreach('clashoo', 'dns_policy', function(sec) {
if (b(sec.enabled) == false) return; if (b(sec.enabled) == false) return;
if (s(sec.policy_type, 'nameserver-policy') != 'nameserver-policy') return; let role = s(sec.policy_type, 'nameserver-policy');
if (role != 'nameserver-policy' && role != 'proxy-server-nameserver-policy') return;
let matcher = trim(sec.matcher || ''); let matcher = trim(sec.matcher || '');
let servers = sec.nameserver; let servers = sec.nameserver;
if (type(servers) != 'array') servers = servers != null ? [servers] : []; if (type(servers) != 'array') servers = servers != null ? [servers] : [];
if (!length(matcher) || !length(servers)) return; if (!length(matcher) || !length(servers)) return;
if (matcher == 'geosite:cn') { matcher = 'rule-set:cn_domain'; need_cn_rs = true; } if (matcher == 'geosite:cn') { matcher = 'rule-set:cn_domain'; need_cn_rs = true; }
policies[matcher] = servers; if (role == 'nameserver-policy') policies[matcher] = servers;
else proxy_policies[matcher] = servers;
}); });
if (length(keys(policies)) && (!dns_present['nameserver-policy'] || dns_force['nameserver-policy'])) if (length(keys(policies)) && (!dns_present['nameserver-policy'] || dns_force['nameserver-policy']))
cfg['dns']['nameserver-policy'] = policies; cfg['dns']['nameserver-policy'] = policies;
if (length(keys(proxy_policies)) && (!dns_present['proxy-server-nameserver-policy'] || dns_force['proxy-server-nameserver-policy']))
cfg['dns']['proxy-server-nameserver-policy'] = proxy_policies;
let respect_rules = a('dns_respect_rules') == null ? true : ab('dns_respect_rules'); let respect_rules = a('dns_respect_rules') == null ? true : ab('dns_respect_rules');
if (dns_force['respect-rules']) if (dns_force['respect-rules'])
@@ -7,15 +7,21 @@ SECRET=$(uci get clashoo.config.dash_pass 2>/dev/null)
LAN_IP=$(uci get network.lan.ipaddr 2>/dev/null |awk -F '/' '{print $1}' 2>/dev/null) LAN_IP=$(uci get network.lan.ipaddr 2>/dev/null |awk -F '/' '{print $1}' 2>/dev/null)
PORT=$(uci get clashoo.config.dash_port 2>/dev/null) PORT=$(uci get clashoo.config.dash_port 2>/dev/null)
urlencode() { urlencode() {
local data
if [ "$#" != 1 ]; then if [ "$#" != 1 ]; then
return 1 return 1
fi fi
data=$(curl -s -o /dev/null -w %{url_effective} --get --data-urlencode "$1" "") printf '%s' "$1" | hexdump -v -e '1/1 "%u "' | awk '
if [ ! -z "$data" ]; then {
echo "${data##/?}" for (i = 1; i <= NF; i++) {
fi b = $i + 0
return 0 if ((b >= 48 && b <= 57) || (b >= 65 && b <= 90) ||
(b >= 97 && b <= 122) || b == 45 || b == 46 ||
b == 95 || b == 126)
printf "%c", b
else
printf "%%%02X", b
}
}'
} }
cat $HISTORY_PATH |while read line cat $HISTORY_PATH |while read line
do do
@@ -28,4 +34,4 @@ do
fi fi
done >/dev/null 2>&1 done >/dev/null 2>&1
curl -m 5 --retry 2 -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X DELETE http://"$LAN_IP":"$PORT"/connections >/dev/null 2>&1 curl -m 5 --retry 2 -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X DELETE http://"$LAN_IP":"$PORT"/connections >/dev/null 2>&1
fi fi
@@ -58,8 +58,8 @@ fetch_text() {
return $? return $?
fi fi
if command -v wget >/dev/null 2>&1; then if command -v wget >/dev/null 2>&1; then
[ -n "$proxy" ] && { http_proxy="$proxy" https_proxy="$proxy" wget -qO- --timeout="$REQUEST_TIMEOUT" --tries=1 "$url"; return $?; } [ -n "$proxy" ] && { http_proxy="$proxy" https_proxy="$proxy" wget -qO- --timeout="$REQUEST_TIMEOUT" "$url"; return $?; }
wget -qO- --timeout="$REQUEST_TIMEOUT" --tries=1 "$url" wget -qO- --timeout="$REQUEST_TIMEOUT" "$url"
return $? return $?
fi fi
return 127 return 127
@@ -74,10 +74,10 @@ download_file() {
return $? return $?
fi fi
if [ -n "$proxy" ]; then if [ -n "$proxy" ]; then
http_proxy="$proxy" https_proxy="$proxy" wget -qO "$out" --timeout="$REQUEST_TIMEOUT" --tries=1 "$url" http_proxy="$proxy" https_proxy="$proxy" wget -qO "$out" --timeout="$REQUEST_TIMEOUT" "$url"
return $? return $?
fi fi
wget -qO "$out" --timeout="$REQUEST_TIMEOUT" --tries=1 "$url" wget -qO "$out" --timeout="$REQUEST_TIMEOUT" "$url"
} }
download_url() { download_url() {
@@ -296,20 +296,27 @@ load_github_urls() {
return 0 return 0
} }
# `~` 是版本里的预发布分隔符,而 release 资产文件名会把它换成 `.`
# (clashoo_2026.10.25.6780eee-r3_x86_64.ipk 对应已安装的 2026.10.25~6780eee-r3)。
# 只比分隔符就会误判成「校验失败」,所以比较前统一归一化,解析时保持文件名原样。
version_equal() {
[ -n "$1" ] && [ "$(printf '%s' "$1" | tr '~' '.')" = "$(printf '%s' "$2" | tr '~' '.')" ]
}
package_version_from_url() { package_version_from_url() {
file="${1##*/}" file="${1##*/}"
case "$file" in case "$file" in
clashoo_*_"$ARCH".ipk) clashoo_*_"$ARCH".ipk)
v="${file#clashoo_}" v="${file#clashoo_}"
v="${v%_${ARCH}.ipk}" printf '%s\n' "${v%_${ARCH}.ipk}"
printf '%s\n' "$v" | sed 's/^\([0-9][0-9][0-9][0-9]\.[0-9][0-9]*\.[0-9][0-9]*\)\./\1~/'
;; ;;
clashoo_*.ipk) printf '%s\n' "$file" | sed -n 's/^clashoo_\(.*\)_[^_][^_]*\.ipk$/\1/p' | sed 's/^\([0-9][0-9][0-9][0-9]\.[0-9][0-9]*\.[0-9][0-9]*\)\./\1~/' ;; # 架构名本身可能带下划线(aarch64_generic / arm_cortex-a7_neon-vfpv4),
# 只截到版本号为止,否则尾巴会混进版本串。
clashoo_*.ipk) printf '%s\n' "$file" | sed -n 's/^clashoo_\([^_]*\)_.*\.ipk$/\1/p' ;;
luci-app-clashoo_*.ipk) printf '%s\n' "$file" | sed -n 's/^luci-app-clashoo_\(.*\)_all\.ipk$/\1/p' ;; luci-app-clashoo_*.ipk) printf '%s\n' "$file" | sed -n 's/^luci-app-clashoo_\(.*\)_all\.ipk$/\1/p' ;;
luci-i18n-clashoo-zh-cn_*.ipk) printf '%s\n' "$file" | sed -n 's/^luci-i18n-clashoo-zh-cn_\(.*\)_all\.ipk$/\1/p' ;; luci-i18n-clashoo-zh-cn_*.ipk) printf '%s\n' "$file" | sed -n 's/^luci-i18n-clashoo-zh-cn_\(.*\)_all\.ipk$/\1/p' ;;
clashoo-*.apk) clashoo-*.apk)
v="$(printf '%s\n' "$file" | sed -n -e 's/^clashoo-\(.*-r[0-9][0-9]*\)-.*\.apk$/\1/p' -e 's/^clashoo-\(.*-r[0-9][0-9]*\)\.apk$/\1/p' | head -n 1)" printf '%s\n' "$file" | sed -n -e 's/^clashoo-\(.*-r[0-9][0-9]*\)-.*\.apk$/\1/p' -e 's/^clashoo-\(.*-r[0-9][0-9]*\)\.apk$/\1/p' | head -n 1
printf '%s\n' "$v" | sed 's/^\([0-9][0-9][0-9][0-9]\.[0-9][0-9]*\.[0-9][0-9]*\)\./\1~/'
;; ;;
luci-app-clashoo-*.apk) printf '%s\n' "$file" | sed -n -e 's/^luci-app-clashoo-\(.*-r[0-9][0-9]*\)-.*\.apk$/\1/p' -e 's/^luci-app-clashoo-\(.*-r[0-9][0-9]*\)\.apk$/\1/p' | head -n 1 ;; luci-app-clashoo-*.apk) printf '%s\n' "$file" | sed -n -e 's/^luci-app-clashoo-\(.*-r[0-9][0-9]*\)-.*\.apk$/\1/p' -e 's/^luci-app-clashoo-\(.*-r[0-9][0-9]*\)\.apk$/\1/p' | head -n 1 ;;
luci-i18n-clashoo-zh-cn-*.apk) printf '%s\n' "$file" | sed -n -e 's/^luci-i18n-clashoo-zh-cn-\(.*-r[0-9][0-9]*\)-.*\.apk$/\1/p' -e 's/^luci-i18n-clashoo-zh-cn-\(.*-r[0-9][0-9]*\)\.apk$/\1/p' | head -n 1 ;; luci-i18n-clashoo-zh-cn-*.apk) printf '%s\n' "$file" | sed -n -e 's/^luci-i18n-clashoo-zh-cn-\(.*-r[0-9][0-9]*\)-.*\.apk$/\1/p' -e 's/^luci-i18n-clashoo-zh-cn-\(.*-r[0-9][0-9]*\)\.apk$/\1/p' | head -n 1 ;;
@@ -405,14 +412,14 @@ run_pkg_update() {
core_ver_before="$(installed_package_version clashoo)" core_ver_before="$(installed_package_version clashoo)"
apk_core_ready() { apk_core_ready() {
package_installed clashoo && [ "$(installed_package_version clashoo)" = "$core_ver" ] \ package_installed clashoo && version_equal "$(installed_package_version clashoo)" "$core_ver" \
&& [ -x /etc/init.d/clashoo ] && [ -x /usr/share/clashoo/update/component_update.sh ] && [ -x /etc/init.d/clashoo ] && [ -x /usr/share/clashoo/update/component_update.sh ]
} }
apk_luci_ready() { apk_luci_ready() {
package_installed luci-app-clashoo && [ "$(installed_package_version luci-app-clashoo)" = "$luci_ver" ] \ package_installed luci-app-clashoo && version_equal "$(installed_package_version luci-app-clashoo)" "$luci_ver" \
&& { [ -z "$I18N_URL" ] || { package_installed luci-i18n-clashoo-zh-cn \ && { [ -z "$I18N_URL" ] || { package_installed luci-i18n-clashoo-zh-cn \
&& [ "$(installed_package_version luci-i18n-clashoo-zh-cn)" = "$i18n_ver" ]; }; } \ && version_equal "$(installed_package_version luci-i18n-clashoo-zh-cn)" "$i18n_ver"; }; } \
&& [ -r /usr/share/luci/menu.d/luci-app-clashoo.json ] \ && [ -r /usr/share/luci/menu.d/luci-app-clashoo.json ] \
&& [ -r /usr/share/rpcd/ucode/luci.clashoo ] && [ -r /usr/share/rpcd/ucode/luci.clashoo ]
} }
@@ -434,7 +441,7 @@ run_pkg_update() {
cur_ver="$(installed_package_version clashoo)" cur_ver="$(installed_package_version clashoo)"
if [ "$PM" = "apk" ] && apk_update_ready; then if [ "$PM" = "apk" ] && apk_update_ready; then
finish 0 "Clashoo 核心已是最新版本" finish 0 "Clashoo 核心已是最新版本"
elif [ "$PM" != "apk" ] && [ -n "$core_ver" ] && [ "$cur_ver" = "$core_ver" ]; then elif [ "$PM" != "apk" ] && version_equal "$cur_ver" "$core_ver"; then
finish 0 "Clashoo 核心已是最新版本" finish 0 "Clashoo 核心已是最新版本"
fi fi
else else
@@ -442,7 +449,7 @@ run_pkg_update() {
cur_ver="$(installed_package_version luci-app-clashoo)" cur_ver="$(installed_package_version luci-app-clashoo)"
if [ "$PM" = "apk" ] && apk_update_ready; then if [ "$PM" = "apk" ] && apk_update_ready; then
finish 0 "客户端已是最新版本" finish 0 "客户端已是最新版本"
elif [ "$PM" != "apk" ] && [ -n "$luci_ver" ] && [ "$cur_ver" = "$luci_ver" ]; then elif [ "$PM" != "apk" ] && version_equal "$cur_ver" "$luci_ver"; then
finish 0 "客户端已是最新版本" finish 0 "客户端已是最新版本"
fi fi
fi fi
@@ -532,11 +539,11 @@ run_pkg_update() {
apk_update_ready || validation_failed apk_update_ready || validation_failed
fi fi
elif [ "$which" = "clashoo" ]; then elif [ "$which" = "clashoo" ]; then
package_installed clashoo && [ "$(installed_package_version clashoo)" = "$core_ver" ] \ package_installed clashoo && version_equal "$(installed_package_version clashoo)" "$core_ver" \
&& [ -x /etc/init.d/clashoo ] && [ -x /usr/share/clashoo/update/component_update.sh ] \ && [ -x /etc/init.d/clashoo ] && [ -x /usr/share/clashoo/update/component_update.sh ] \
|| validation_failed || validation_failed
else else
package_installed luci-app-clashoo && [ "$(installed_package_version luci-app-clashoo)" = "$luci_ver" ] \ package_installed luci-app-clashoo && version_equal "$(installed_package_version luci-app-clashoo)" "$luci_ver" \
&& [ -r /usr/share/luci/menu.d/luci-app-clashoo.json ] \ && [ -r /usr/share/luci/menu.d/luci-app-clashoo.json ] \
&& [ -r /usr/share/rpcd/ucode/luci.clashoo ] \ && [ -r /usr/share/rpcd/ucode/luci.clashoo ] \
|| validation_failed || validation_failed
@@ -176,7 +176,7 @@ fetch_url_try() {
return $? return $?
fi fi
if command -v wget >/dev/null 2>&1; then if command -v wget >/dev/null 2>&1; then
wget -qO- --timeout="$CONNECT_TIMEOUT" --no-check-certificate --user-agent="Clash/OpenWRT" "$url" wget -qO- --timeout="$CONNECT_TIMEOUT" --user-agent="Clash/OpenWRT" "$url"
return $? return $?
fi fi
return 127 return 127
@@ -204,7 +204,7 @@ download_file_try() {
return $? return $?
fi fi
if command -v wget >/dev/null 2>&1; then if command -v wget >/dev/null 2>&1; then
wget -q --timeout="$REQUEST_TIMEOUT" --tries=1 --no-check-certificate --user-agent="Clash/OpenWRT" "$url" -O "$out" wget -q --timeout="$REQUEST_TIMEOUT" --user-agent="Clash/OpenWRT" "$url" -O "$out"
return $? return $?
fi fi
return 127 return 127
@@ -216,7 +216,7 @@ head_url_try() {
curl -fsSIL --connect-timeout "$CONNECT_TIMEOUT" --max-time "$REQUEST_TIMEOUT" -A "Clash/OpenWRT" "$url" >/dev/null 2>&1 curl -fsSIL --connect-timeout "$CONNECT_TIMEOUT" --max-time "$REQUEST_TIMEOUT" -A "Clash/OpenWRT" "$url" >/dev/null 2>&1
return $? return $?
fi fi
wget -q --spider --timeout="$CONNECT_TIMEOUT" --no-check-certificate --user-agent="Clash/OpenWRT" "$url" wget -q --spider --timeout="$CONNECT_TIMEOUT" --user-agent="Clash/OpenWRT" "$url"
} }
map_mihomo_arch() { map_mihomo_arch() {
@@ -637,7 +637,7 @@ fetch_latest_tag() {
if command -v curl >/dev/null 2>&1; then if command -v curl >/dev/null 2>&1; then
tag="$(curl -fsSIL --connect-timeout "$CONNECT_TIMEOUT" --max-time "$REQUEST_TIMEOUT" -A "Clash/OpenWRT" "$u" 2>/dev/null | sed -n 's#^[Ll]ocation: .*/releases/tag/\([^[:space:]\r]*\).*#\1#p' | head -n 1)" tag="$(curl -fsSIL --connect-timeout "$CONNECT_TIMEOUT" --max-time "$REQUEST_TIMEOUT" -A "Clash/OpenWRT" "$u" 2>/dev/null | sed -n 's#^[Ll]ocation: .*/releases/tag/\([^[:space:]\r]*\).*#\1#p' | head -n 1)"
else else
tag="$(wget -S --spider --timeout="$CONNECT_TIMEOUT" --no-check-certificate --user-agent="Clash/OpenWRT" "$u" 2>&1 | sed -n 's#^ Location: .*/releases/tag/\([^[:space:]]*\).*#\1#p' | head -n 1)" tag="$(wget -S --spider --timeout="$CONNECT_TIMEOUT" --user-agent="Clash/OpenWRT" "$u" 2>&1 | sed -n 's#^ Location: .*/releases/tag/\([^[:space:]]*\).*#\1#p' | head -n 1)"
fi fi
case "$tag" in case "$tag" in
v*[-]*) v*[-]*)
@@ -684,7 +684,7 @@ fetch_latest_tag() {
if command -v curl >/dev/null 2>&1; then if command -v curl >/dev/null 2>&1; then
tag="$(curl -fsSIL --connect-timeout "$CONNECT_TIMEOUT" --max-time "$REQUEST_TIMEOUT" -A "Clash/OpenWRT" "$u" 2>/dev/null | sed -n 's#^[Ll]ocation: .*/releases/tag/\([^[:space:][:cntrl:]]*\).*#\1#p' | head -n 1)" tag="$(curl -fsSIL --connect-timeout "$CONNECT_TIMEOUT" --max-time "$REQUEST_TIMEOUT" -A "Clash/OpenWRT" "$u" 2>/dev/null | sed -n 's#^[Ll]ocation: .*/releases/tag/\([^[:space:][:cntrl:]]*\).*#\1#p' | head -n 1)"
else else
tag="$(wget -S --spider --timeout="$CONNECT_TIMEOUT" --no-check-certificate --user-agent="Clash/OpenWRT" "$u" 2>&1 | sed -n 's#^ Location: .*/releases/tag/\([^[:space:]]*\).*#\1#p' | head -n 1)" tag="$(wget -S --spider --timeout="$CONNECT_TIMEOUT" --user-agent="Clash/OpenWRT" "$u" 2>&1 | sed -n 's#^ Location: .*/releases/tag/\([^[:space:]]*\).*#\1#p' | head -n 1)"
fi fi
[ -n "$tag" ] && { echo "$tag"; return 0; } [ -n "$tag" ] && { echo "$tag"; return 0; }
@@ -1062,10 +1062,10 @@ if [ -n "$CUSTOM_CORE_URL" ]; then
write_log "使用自定义内核下载链接" write_log "使用自定义内核下载链接"
URL="$CUSTOM_CORE_URL" URL="$CUSTOM_CORE_URL"
if [ "$CORETYPE" = "3" ]; then if [ "$CORETYPE" = "3" ]; then
TARGET="/usr/bin/mihomo" TARGET="/usr/share/clashoo/bin/mihomo-alpha"
VERSION_FILE="/usr/share/clashoo/mihomo_version" VERSION_FILE="/usr/share/clashoo/mihomo_version"
else else
TARGET="/usr/bin/mihomo-stable" TARGET="/usr/share/clashoo/bin/mihomo-stable"
VERSION_FILE="/usr/share/clashoo/clash_meta_version" VERSION_FILE="/usr/share/clashoo/clash_meta_version"
fi fi
TAG="custom" TAG="custom"
@@ -1175,7 +1175,7 @@ elif [ "$CORETYPE" = "2" ]; then
[ -z "$TAG" ] && write_log "获取稳定版版本号失败" && exit 1 [ -z "$TAG" ] && write_log "获取稳定版版本号失败" && exit 1
ASSET=$(pick_mihomo_asset "MetaCubeX/mihomo" "$TAG" "$(map_mihomo_arch "$MODELTYPE")" "stable") ASSET=$(pick_mihomo_asset "MetaCubeX/mihomo" "$TAG" "$(map_mihomo_arch "$MODELTYPE")" "stable")
URL="https://github.com/MetaCubeX/mihomo/releases/download/${TAG}/${ASSET}" URL="https://github.com/MetaCubeX/mihomo/releases/download/${TAG}/${ASSET}"
TARGET="/usr/bin/mihomo-stable" TARGET="/usr/share/clashoo/bin/mihomo-stable"
VERSION_FILE="/usr/share/clashoo/clash_meta_version" VERSION_FILE="/usr/share/clashoo/clash_meta_version"
VERSION_VALUE="$TAG" VERSION_VALUE="$TAG"
else else
@@ -1189,7 +1189,7 @@ else
[ -z "$ASSET" ] && ASSET=$(pick_mihomo_asset "MetaCubeX/mihomo" "$TAG" "$(map_mihomo_arch "$MODELTYPE")" "alpha") [ -z "$ASSET" ] && ASSET=$(pick_mihomo_asset "MetaCubeX/mihomo" "$TAG" "$(map_mihomo_arch "$MODELTYPE")" "alpha")
[ -z "$ASSET" ] && ASSET=$(pick_mihomo_asset "MetaCubeX/mihomo" "$TAG" "$(map_mihomo_arch "$MODELTYPE")" "stable") [ -z "$ASSET" ] && ASSET=$(pick_mihomo_asset "MetaCubeX/mihomo" "$TAG" "$(map_mihomo_arch "$MODELTYPE")" "stable")
URL="https://github.com/MetaCubeX/mihomo/releases/download/${TAG}/${ASSET}" URL="https://github.com/MetaCubeX/mihomo/releases/download/${TAG}/${ASSET}"
TARGET="/usr/bin/mihomo" TARGET="/usr/share/clashoo/bin/mihomo-alpha"
VERSION_FILE="/usr/share/clashoo/mihomo_version" VERSION_FILE="/usr/share/clashoo/mihomo_version"
VERSION_VALUE="$(printf '%s\n' "$ASSET" | sed -n 's#^mihomo-.*-alpha-\([0-9a-fA-F]\{7,\}\)\.gz$#\1#p' | head -n 1)" VERSION_VALUE="$(printf '%s\n' "$ASSET" | sed -n 's#^mihomo-.*-alpha-\([0-9a-fA-F]\{7,\}\)\.gz$#\1#p' | head -n 1)"
[ -z "$VERSION_VALUE" ] && VERSION_VALUE="$TAG" [ -z "$VERSION_VALUE" ] && VERSION_VALUE="$TAG"
@@ -12,6 +12,8 @@ cfg_mmdb_url="$(uci -q get clashoo.config.geoip_mmdb_url 2>/dev/null)"
cfg_geosite_url="$(uci -q get clashoo.config.geosite_url 2>/dev/null)" cfg_geosite_url="$(uci -q get clashoo.config.geosite_url 2>/dev/null)"
cfg_geoip_dat_url="$(uci -q get clashoo.config.geoip_dat_url 2>/dev/null)" cfg_geoip_dat_url="$(uci -q get clashoo.config.geoip_dat_url 2>/dev/null)"
cfg_geoip_asn_url="$(uci -q get clashoo.config.geoip_asn_url 2>/dev/null)" cfg_geoip_asn_url="$(uci -q get clashoo.config.geoip_asn_url 2>/dev/null)"
require_geosite=0
[ "$1" = "--require-geosite" ] && require_geosite=1
DEFAULT_MMDB_URL="https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb" DEFAULT_MMDB_URL="https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb"
DEFAULT_GEOSITE_URL="https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geosite.dat" DEFAULT_GEOSITE_URL="https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geosite.dat"
@@ -36,6 +38,10 @@ cleanup() {
} }
config_needs_geosite() { config_needs_geosite() {
_cfg="$(uci -q get clashoo.config.use_config 2>/dev/null)"
if [ -s "$_cfg" ] && grep -Eq "^[[:space:]]*-[[:space:]]*[\"']?GEOSITE,|^[[:space:]]*geosite:[[:space:]]*|^[[:space:]]*'geosite:|^[[:space:]]*-[[:space:]]*[\"']?geosite:" "$_cfg"; then
return 0
fi
_cfg="/etc/clashoo/config.yaml" _cfg="/etc/clashoo/config.yaml"
[ -f "$_cfg" ] || return 1 [ -f "$_cfg" ] || return 1
grep -Eq "^[[:space:]]*-[[:space:]]*[\"']?GEOSITE,|^[[:space:]]*geosite:[[:space:]]*|^[[:space:]]*'geosite:|^[[:space:]]*-[[:space:]]*[\"']?geosite:" "$_cfg" grep -Eq "^[[:space:]]*-[[:space:]]*[\"']?GEOSITE,|^[[:space:]]*geosite:[[:space:]]*|^[[:space:]]*'geosite:|^[[:space:]]*-[[:space:]]*[\"']?geosite:" "$_cfg"
@@ -67,7 +73,7 @@ _fetch() {
fi fi
return $? return $?
fi fi
wget -q --timeout=120 --no-check-certificate --user-agent="Clash/OpenWRT" "$url" -O "$target" wget -q --timeout=120 --user-agent="Clash/OpenWRT" "$url" -O "$target"
} }
# 多源拉取:本机代理 → 国内镜像(gh-proxy / ghfast / jsdelivr)→ 原 URL 兜底 # 多源拉取:本机代理 → 国内镜像(gh-proxy / ghfast / jsdelivr)→ 原 URL 兜底
@@ -133,19 +139,19 @@ download_geosite() {
size=0 size=0
if [ -z "$url" ]; then if [ -z "$url" ]; then
log "GeoSite.dat skip (url empty)" log "GeoSite.dat skip (url empty)"
return 0 return 1
fi fi
rm -f "$tmp_target" >/dev/null 2>&1 rm -f "$tmp_target" >/dev/null 2>&1
if ! download_to "$url" "$tmp_target"; then if ! download_to "$url" "$tmp_target"; then
rm -f "$tmp_target" >/dev/null 2>&1 rm -f "$tmp_target" >/dev/null 2>&1
log "GeoSite.dat update failed" log "GeoSite.dat update failed"
return 0 return 1
fi fi
size=$(wc -c <"$tmp_target" 2>/dev/null) size=$(wc -c <"$tmp_target" 2>/dev/null)
if [ -z "$size" ] || [ "$size" -lt "$GEOSITE_MIN_SIZE" ]; then if [ -z "$size" ] || [ "$size" -lt "$GEOSITE_MIN_SIZE" ]; then
log "GeoSite.dat download invalid or incomplete (${size:-0} bytes)" log "GeoSite.dat download invalid or incomplete (${size:-0} bytes)"
rm -f "$tmp_target" >/dev/null 2>&1 rm -f "$tmp_target" >/dev/null 2>&1
return 0 return 1
fi fi
mv -f "$tmp_target" /etc/clashoo/GeoSite.dat >/dev/null 2>&1 || return 1 mv -f "$tmp_target" /etc/clashoo/GeoSite.dat >/dev/null 2>&1 || return 1
cp -f /etc/clashoo/GeoSite.dat /etc/clashoo/geosite.dat >/dev/null 2>&1 || true cp -f /etc/clashoo/GeoSite.dat /etc/clashoo/geosite.dat >/dev/null 2>&1 || true
@@ -248,8 +254,10 @@ if [ "$geoip_source" != "1" ]; then
fi fi
log "Country.mmdb updated" log "Country.mmdb updated"
if config_needs_geosite; then if [ "$require_geosite" -eq 1 ] || config_needs_geosite; then
download_geosite "$geosite_url" if ! download_geosite "$geosite_url"; then
exit 1
fi
else else
log "GeoSite.dat skip (no geosite reference in config)" log "GeoSite.dat skip (no geosite reference in config)"
fi fi
@@ -257,6 +265,13 @@ if [ "$geoip_source" != "1" ]; then
download_optional "$geoip_asn_url" /etc/clashoo/GeoLite2-ASN.mmdb "GeoLite2-ASN.mmdb" download_optional "$geoip_asn_url" /etc/clashoo/GeoLite2-ASN.mmdb "GeoLite2-ASN.mmdb"
fi fi
if [ "$geoip_source" = "1" ] && { [ "$require_geosite" -eq 1 ] || config_needs_geosite; }; then
geosite_url="${cfg_geosite_url:-$DEFAULT_GEOSITE_URL}"
if ! download_geosite "$geosite_url"; then
exit 1
fi
fi
touch /var/run/geoip_down_complete >/dev/null 2>&1 touch /var/run/geoip_down_complete >/dev/null 2>&1
if pidof mihomo >/dev/null 2>&1 || pidof clash-meta >/dev/null 2>&1; then if pidof mihomo >/dev/null 2>&1 || pidof clash-meta >/dev/null 2>&1; then
@@ -22,7 +22,7 @@ if command -v curl >/dev/null 2>&1; then
curl -fL --connect-timeout 15 --max-time 120 -A "Clash/OpenWRT" "$DOWNLOAD_URL" -o "$TMP_PATH" 2>/dev/null curl -fL --connect-timeout 15 --max-time 120 -A "Clash/OpenWRT" "$DOWNLOAD_URL" -o "$TMP_PATH" 2>/dev/null
dl_rc=$? dl_rc=$?
elif command -v wget >/dev/null 2>&1; then elif command -v wget >/dev/null 2>&1; then
wget -q --timeout=30 --tries=2 --no-check-certificate -U "Clash/OpenWRT" "$DOWNLOAD_URL" -O "$TMP_PATH" 2>/dev/null wget -q --timeout=30 -U "Clash/OpenWRT" "$DOWNLOAD_URL" -O "$TMP_PATH" 2>/dev/null
dl_rc=$? dl_rc=$?
else else
log "No curl or wget found" log "No curl or wget found"
@@ -32,5 +32,6 @@ fi
if [ "$(uci -q get clashoo.config.auto_clear_log)" = "1" ] && due log_cleanup.status clear_time; then if [ "$(uci -q get clashoo.config.auto_clear_log)" = "1" ] && due log_cleanup.status clear_time; then
: >"$LOG_FILE" : >"$LOG_FILE"
sh /usr/share/clashoo/lib/core_log_guard.sh >/dev/null 2>&1
stamp log_cleanup.status stamp log_cleanup.status
fi fi
@@ -79,13 +79,29 @@ download_zip() {
--proxy "$proxy" -A "Clash/OpenWRT" "$url" -o "$ZIP_FILE"; then --proxy "$proxy" -A "Clash/OpenWRT" "$url" -o "$ZIP_FILE"; then
return 0 return 0
fi fi
if wget -q --timeout=60 --no-check-certificate --user-agent="Clash/OpenWRT" "$url" -O "$ZIP_FILE"; then if wget -q --timeout=60 --user-agent="Clash/OpenWRT" "$url" -O "$ZIP_FILE"; then
return 0 return 0
fi fi
done done
return 1 return 1
} }
validate_zip_entries() {
entries="$TMP_ROOT/entries.txt"
if command -v unzip >/dev/null 2>&1; then
unzip -Z1 "$ZIP_FILE" >"$entries" 2>/dev/null || return 1
elif command -v bsdtar >/dev/null 2>&1; then
bsdtar -tf "$ZIP_FILE" >"$entries" 2>/dev/null || return 1
else
return 1
fi
[ -s "$entries" ] || return 1
awk '
/^\// || /^[A-Za-z]:/ || /(^|\/)\.\.(\/|$)/ || /\\/ || /\r/ { bad = 1 }
END { exit bad }
' "$entries"
}
extract_zip() { extract_zip() {
if command -v unzip >/dev/null 2>&1; then if command -v unzip >/dev/null 2>&1; then
unzip -oq "$ZIP_FILE" -d "$UNPACK_DIR" >/dev/null 2>&1 unzip -oq "$ZIP_FILE" -d "$UNPACK_DIR" >/dev/null 2>&1
@@ -141,6 +157,12 @@ if ! download_zip; then
exit 1 exit 1
fi fi
if ! validate_zip_entries; then
set_state "error" "压缩包路径无效"
log_msg "Dashboard panel archive has unsafe entries" "面板压缩包含不安全路径"
exit 1
fi
extract_zip extract_zip
extract_rc=$? extract_rc=$?
if [ "$extract_rc" -ne 0 ]; then if [ "$extract_rc" -ne 0 ]; then
@@ -154,6 +176,12 @@ if [ "$extract_rc" -ne 0 ]; then
exit 1 exit 1
fi fi
if find "$UNPACK_DIR" ! -type d ! -type f | grep -q .; then
set_state "error" "压缩包文件类型无效"
log_msg "Dashboard panel archive has unsafe file types" "面板压缩包含不安全文件类型"
exit 1
fi
SRC_DIR="$(find_web_root)" SRC_DIR="$(find_web_root)"
if [ -z "$SRC_DIR" ] || [ ! -f "$SRC_DIR/index.html" ]; then if [ -z "$SRC_DIR" ] || [ ! -f "$SRC_DIR/index.html" ]; then
set_state "error" "文件无效" set_state "error" "文件无效"
@@ -188,7 +188,7 @@ download_to() {
DOWNLOAD_ERROR="$(curl_error "$last_rc")" DOWNLOAD_ERROR="$(curl_error "$last_rc")"
return 1 return 1
fi fi
wget -q --tries=4 --timeout=20 --user-agent="$ua" "$url" -O "$out" wget -q --timeout=20 --user-agent="$ua" "$url" -O "$out"
rc=$? rc=$?
[ "$rc" -eq 0 ] && return 0 [ "$rc" -eq 0 ] && return 0
DOWNLOAD_ERROR="网络错误(wget rc=${rc})" DOWNLOAD_ERROR="网络错误(wget rc=${rc})"
@@ -209,8 +209,7 @@ update_info() {
} }
service_running() { service_running() {
[ -n "${CLASHOO_SERVICE_CMD:-}" ] && return 0 [ "$("$SERVICE_CMD" status 2>/dev/null)" = "running" ]
"$SERVICE_CMD" status >/dev/null 2>&1
} }
template_output_name() { template_output_name() {
@@ -9,10 +9,11 @@ TARGET_V6="${NFT_DIR}/geoip6_cn.nft"
FW4_SCRIPT="${FW4_SCRIPT:-/usr/share/clashoo/net/fw4.sh}" FW4_SCRIPT="${FW4_SCRIPT:-/usr/share/clashoo/net/fw4.sh}"
PROC_ROOT="${PROC_ROOT:-/proc}" PROC_ROOT="${PROC_ROOT:-/proc}"
SINGBOX_BIN_DIR="${SINGBOX_BIN_DIR:-/usr/share/clashoo/bin}" SINGBOX_BIN_DIR="${SINGBOX_BIN_DIR:-/usr/share/clashoo/bin}"
TMP_V4="/tmp/china_ip.txt.$$" TMP_ROOT="$(mktemp -d /tmp/clashoo_china_ip.XXXXXX)"
TMP_V6="/tmp/china_ipv6.txt.$$" TMP_V4="$TMP_ROOT/china_ip.txt"
OUT_V4="/tmp/geoip_cn.nft.$$" TMP_V6="$TMP_ROOT/china_ipv6.txt"
OUT_V6="/tmp/geoip6_cn.nft.$$" OUT_V4="$TMP_ROOT/geoip_cn.nft"
OUT_V6="$TMP_ROOT/geoip6_cn.nft"
log() { log() {
printf ' %s - %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" >> "$LOG_FILE" printf ' %s - %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" >> "$LOG_FILE"
@@ -30,14 +31,14 @@ download_with_fallback() {
local output="$2" local output="$2"
local ip local ip
if curl -fsSL "$url" -o "$output"; then if curl -fsSL --connect-timeout 10 --max-time 120 "$url" -o "$output"; then
return 0 return 0
fi fi
case "$url" in case "$url" in
https://ispip.clang.cn/*) https://ispip.clang.cn/*)
for ip in 182.247.248.127 103.220.64.183; do for ip in 182.247.248.127 103.220.64.183; do
if curl -fsSL --resolve "ispip.clang.cn:443:${ip}" "$url" -o "$output"; then if curl -fsSL --connect-timeout 10 --max-time 120 --resolve "ispip.clang.cn:443:${ip}" "$url" -o "$output"; then
log "DNS 异常,已使用 --resolve(${ip}) 回源下载" log "DNS 异常,已使用 --resolve(${ip}) 回源下载"
return 0 return 0
fi fi
@@ -49,7 +50,7 @@ download_with_fallback() {
} }
cleanup() { cleanup() {
rm -f "$TMP_V4" "$TMP_V6" "$OUT_V4" "$OUT_V6" rm -rf "$TMP_ROOT"
} }
trap cleanup EXIT INT TERM trap cleanup EXIT INT TERM
@@ -61,6 +62,21 @@ render_nft_set() {
local set_type="$4" local set_type="$4"
awk -v set_name="$set_name" -v set_type="$set_type" ' awk -v set_name="$set_name" -v set_type="$set_type" '
function valid_cidr(value, parts, octets, i, prefix) {
if (split(value, parts, "/") != 2 || parts[2] !~ /^[0-9]+$/)
return 0
prefix = parts[2] + 0
if (set_type == "ipv4_addr") {
if (prefix > 32 || split(parts[1], octets, ".") != 4)
return 0
for (i = 1; i <= 4; i++)
if (octets[i] !~ /^[0-9]+$/ || length(octets[i]) > 3 || octets[i] + 0 > 255)
return 0
return 1
}
return set_type == "ipv6_addr" && prefix <= 128 &&
parts[1] ~ /^[0-9A-Fa-f:]+$/ && index(parts[1], ":") > 0
}
BEGIN { BEGIN {
print "set " set_name " {" print "set " set_name " {"
print "\ttype " set_type ";" print "\ttype " set_type ";"
@@ -73,6 +89,12 @@ render_nft_set() {
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0) gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0)
if ($0 == "") if ($0 == "")
next next
if (!valid_cidr($0)) {
if (!invalid)
printf "invalid CIDR at line %d\n", NR > "/dev/stderr"
invalid = 1
next
}
if (!first) if (!first)
print "," print ","
printf "\t\t%s", $0 printf "\t\t%s", $0
@@ -83,8 +105,13 @@ render_nft_set() {
print "" print ""
print "\t}" print "\t}"
print "}" print "}"
if (invalid || first)
exit 1
} }
' "$source_file" > "$output_file" ' "$source_file" > "$output_file" || return 1
# nft catches malformed IPv6 forms and invalid network prefixes before replacement.
{ printf 'table inet clashoo_validate {\n'; cat "$output_file"; printf '\n}\n'; } |
nft -c -f - >/dev/null 2>&1
} }
url4="$(uci -q get clashoo.config.china_ip_url 2>/dev/null || true)" url4="$(uci -q get clashoo.config.china_ip_url 2>/dev/null || true)"
@@ -107,7 +134,10 @@ download_with_fallback "$url4" "$TMP_V4"
} }
changed=0 changed=0
render_nft_set "$TMP_V4" "$OUT_V4" clashoo_china ipv4_addr if ! render_nft_set "$TMP_V4" "$OUT_V4" clashoo_china ipv4_addr; then
log '大陆 IPv4 白名单包含无效 CIDR,保留原文件'
exit 1
fi
if cmp -s "$OUT_V4" "$TARGET_V4"; then if cmp -s "$OUT_V4" "$TARGET_V4"; then
log '大陆 IPv4 白名单内容无变化' log '大陆 IPv4 白名单内容无变化'
else else
@@ -119,7 +149,10 @@ fi
if download_with_fallback "$url6" "$TMP_V6"; then if download_with_fallback "$url6" "$TMP_V6"; then
if [ -s "$TMP_V6" ]; then if [ -s "$TMP_V6" ]; then
render_nft_set "$TMP_V6" "$OUT_V6" clashoo_china6 ipv6_addr if ! render_nft_set "$TMP_V6" "$OUT_V6" clashoo_china6 ipv6_addr; then
log '大陆 IPv6 白名单包含无效 CIDR,保留原文件'
exit 1
fi
if cmp -s "$OUT_V6" "$TARGET_V6"; then if cmp -s "$OUT_V6" "$TARGET_V6"; then
log '大陆 IPv6 白名单内容无变化' log '大陆 IPv6 白名单内容无变化'
else else
+4 -4
View File
@@ -5,13 +5,13 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=dae PKG_NAME:=dae
PKG_VERSION:=2026.09.24 PKG_VERSION:=2026.10.30
PKG_RELEASE:=2 PKG_RELEASE:=1
PKG_SOURCE:=dae-src-2026.09.24-17135da7c881.tar.gz PKG_SOURCE:=dae-src-2026.10.30-55c59e68c059.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=17135da7c881800738cc63566160d4ee6d59a8a70ae5043b8005c5d189b05752 PKG_HASH:=55c59e68c059fff41694c75097004af639d7f58462e35a84d75d3f5f03d4cf12
PKG_LICENSE:=AGPL-3.0-only PKG_LICENSE:=AGPL-3.0-only
PKG_LICENSE_FILE:=LICENSE PKG_LICENSE_FILE:=LICENSE
+4 -4
View File
@@ -5,13 +5,13 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=daed PKG_NAME:=daed
PKG_VERSION:=2026.09.24 PKG_VERSION:=2026.10.30
PKG_RELEASE:=2 PKG_RELEASE:=1
PKG_SOURCE:=daed-src-2026.09.24-527bb166b1ae.tar.gz PKG_SOURCE:=daed-src-2026.10.30-1850c01d032c.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=527bb166b1aea6a54330ebbc8be5b0418baed74636b838aeaa78c17b70f2f996 PKG_HASH:=1850c01d032cebc3d29bd104c7c654ab422ed1199c5207cd952a0d9340e9289b
PKG_LICENSE:=AGPL-3.0-only MIT PKG_LICENSE:=AGPL-3.0-only MIT
PKG_LICENSE_FILES:=LICENSE wing/LICENSE PKG_LICENSE_FILES:=LICENSE wing/LICENSE
+2 -2
View File
@@ -6,12 +6,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=dns2socks-rust PKG_NAME:=dns2socks-rust
PKG_VERSION:=0.2.6 PKG_VERSION:=0.2.7
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/tun2proxy/dns2socks/tar.gz/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/tun2proxy/dns2socks/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=c90e9cf8da4d2b01618110ea8416ff6c53e17efd8319ee5ec12132fd14b35ec0 PKG_HASH:=34ecdeb98281d0873146a08f351e485e7fb9cfacb55ac748ccfe463987f6befd
PKG_BUILD_DIR:=$(BUILD_DIR)/dns2socks-$(PKG_VERSION) PKG_BUILD_DIR:=$(BUILD_DIR)/dns2socks-$(PKG_VERSION)
PKG_MAINTAINER:=Zxlhhyccc <zxlhhyccc@gmail.com> PKG_MAINTAINER:=Zxlhhyccc <zxlhhyccc@gmail.com>
+2 -2
View File
@@ -1,12 +1,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=docker PKG_NAME:=docker
PKG_VERSION:=29.9.0-rc.1 PKG_VERSION:=29.9.2
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/docker/cli/tar.gz/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/docker/cli/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=5b2eda9020415e28922d273cc9e76409f0034bf6efdff2cec2637aa8fc476aea PKG_HASH:=e3b1fab5e2ee2d6b63b8ce0e8bbd08d6f54c0537c470332f2c345ab997233409
PKG_BUILD_DIR:=$(BUILD_DIR)/cli-$(PKG_VERSION) PKG_BUILD_DIR:=$(BUILD_DIR)/cli-$(PKG_VERSION)
PKG_GIT_SHORT_COMMIT:=$(shell $(CURDIR)/git-short-commit.sh 'github.com/docker/cli' 'v$(PKG_VERSION)' '$(TMP_DIR)/git-short-commit/$(PKG_NAME)-$(PKG_VERSION)') PKG_GIT_SHORT_COMMIT:=$(shell $(CURDIR)/git-short-commit.sh 'github.com/docker/cli' 'v$(PKG_VERSION)' '$(TMP_DIR)/git-short-commit/$(PKG_NAME)-$(PKG_VERSION)')
+2 -2
View File
@@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=dockerd PKG_NAME:=dockerd
PKG_VERSION:=29.8.2 PKG_VERSION:=29.9.2
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_LICENSE:=Apache-2.0 PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE PKG_LICENSE_FILES:=LICENSE
@@ -10,7 +10,7 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_GIT_URL:=github.com/moby/moby PKG_GIT_URL:=github.com/moby/moby
PKG_GIT_REF:=docker-v$(PKG_VERSION) PKG_GIT_REF:=docker-v$(PKG_VERSION)
PKG_SOURCE_URL:=https://codeload.$(PKG_GIT_URL)/tar.gz/$(PKG_GIT_REF)? PKG_SOURCE_URL:=https://codeload.$(PKG_GIT_URL)/tar.gz/$(PKG_GIT_REF)?
PKG_HASH:=5ed520023fe6600579e5c910733814a5ddb7100db41bc3672682a5b50146f6bd PKG_HASH:=d7ce182528eb4c182f3884a7a83b7652ffcbc59b21d3d302050564ff949a9689
PKG_GIT_SHORT_COMMIT:=$(shell $(CURDIR)/git-short-commit.sh '$(PKG_GIT_URL)' '$(PKG_GIT_REF)' '$(TMP_DIR)/git-short-commit/$(PKG_NAME)-$(PKG_VERSION)') PKG_GIT_SHORT_COMMIT:=$(shell $(CURDIR)/git-short-commit.sh '$(PKG_GIT_URL)' '$(PKG_GIT_REF)' '$(TMP_DIR)/git-short-commit/$(PKG_NAME)-$(PKG_VERSION)')
PKG_MAINTAINER:=Gerard Ryan <G.M0N3Y.2503@gmail.com> PKG_MAINTAINER:=Gerard Ryan <G.M0N3Y.2503@gmail.com>
Regular → Executable
+19 -1
View File
@@ -1,3 +1,21 @@
#!/bin/sh #!/bin/sh
$1 -v 2>&1 | grep -F "$PKG_VERSION" # frpc/frps both accept "verify -c <file>" to validate a config without
# connecting, which exercises the TOML config loader end-to-end.
case "$1" in
frpc)
conf="/tmp/frpc.$$.toml"
printf 'serverAddr = "127.0.0.1"\nserverPort = 7000\n' > "$conf"
frpc verify -c "$conf" || { echo "FAIL: frpc rejected a valid config"; rm -f "$conf"; exit 1; }
rm -f "$conf"
;;
frps)
conf="/tmp/frps.$$.toml"
printf 'bindPort = 7000\n' > "$conf"
frps verify -c "$conf" || { echo "FAIL: frps rejected a valid config"; rm -f "$conf"; exit 1; }
rm -f "$conf"
;;
*)
exit 0
;;
esac
+2 -2
View File
@@ -1,12 +1,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=geoview PKG_NAME:=geoview
PKG_VERSION:=0.2.6 PKG_VERSION:=0.2.9
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/snowie2000/geoview/tar.gz/$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/snowie2000/geoview/tar.gz/$(PKG_VERSION)?
PKG_HASH:=1b46d4255ab22ec433a14f804e9487885cc2693323579c1385d51919838db132 PKG_HASH:=b080a141505a3180c3b81468304864e4373c4868680ff39fb82ee6973e3b5e94
PKG_LICENSE:=Apache-2.0 PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE PKG_LICENSE_FILES:=LICENSE
+3 -3
View File
@@ -9,9 +9,9 @@ PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://gn.googlesource.com/gn.git PKG_SOURCE_URL:=https://gn.googlesource.com/gn.git
PKG_SOURCE_DATE:=2026-09-24 PKG_SOURCE_DATE:=2026-10-29
PKG_SOURCE_VERSION:=2dfb8cbd3b749242ee4492a7f15eba6889d52c7f PKG_SOURCE_VERSION:=ed7fee04cb30b96ed40ef188acfad5417349e399
PKG_MIRROR_HASH:=479eb70e636e563dd84a161bb68f2e4d43c5239561aea55c360f44e30e1efc72 PKG_MIRROR_HASH:=8ac4c439bb3f11e9fc945a509a76dba265e13de6b4f8b965496881696079be9c
PKG_LICENSE:=BSD 3-Clause PKG_LICENSE:=BSD 3-Clause
PKG_LICENSE_FILES:=LICENSE PKG_LICENSE_FILES:=LICENSE
+2 -2
View File
@@ -3,7 +3,7 @@
#ifndef OUT_LAST_COMMIT_POSITION_H_ #ifndef OUT_LAST_COMMIT_POSITION_H_
#define OUT_LAST_COMMIT_POSITION_H_ #define OUT_LAST_COMMIT_POSITION_H_
#define LAST_COMMIT_POSITION_NUM 2578 #define LAST_COMMIT_POSITION_NUM 2615
#define LAST_COMMIT_POSITION "2578 (2dfb8cbd3b74)" #define LAST_COMMIT_POSITION "2615 (ed7fee04cb30)"
#endif // OUT_LAST_COMMIT_POSITION_H_ #endif // OUT_LAST_COMMIT_POSITION_H_
+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=gost PKG_NAME:=gost
PKG_VERSION:=3.3.0 PKG_VERSION:=3.3.2
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/go-gost/gost/tar.gz/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/go-gost/gost/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=2a65e2da14fef6b6da8d4e32a8bc62e39970dbb141db42bc6f5821f90ac1e9a3 PKG_HASH:=838674347bfd7a7df43cab5ca25a21992a247fe50fe61e9a12497d5a1699a3d5
PKG_LICENSE:=MIT PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE PKG_LICENSE_FILES:=LICENSE
+106
View File
@@ -0,0 +1,106 @@
# SPDX-License-Identifier: GPL-2.0-only
include $(TOPDIR)/rules.mk
PKG_NAME:=honk
PKG_VERSION:=0.1.0_beta4
PKG_RELEASE:=1
# Raw upstream release tag. It keeps the dots in qualifiers (e.g. v0.0.1.beta.49)
# because that is what the GitHub release asset name uses.
HONK_RELEASE_TAG:=v0.1.0-beta.4
HONK_ASSET_TAG:=v0.1.0-beta.4
# SHA256 of each release tarball, kept in sync by scripts/update_honk_version.sh.
HONK_HASH_X86_64:=48f694b13b9c5200e8e884ee19431035bd67b0ef01d04caef007047ad11ba02c
HONK_HASH_AARCH64:=6cc92f862a1684ba9c49e9f9c08fb108f53444f338f1e9be84013e2f7fb7423d
PKG_LICENSE:=AGPL-3.0-only
PKG_LICENSE_FILE:=LICENSE
PKG_MAINTAINER:=luci-app-honk maintainers
ifeq ($(ARCH),x86_64)
HONK_TARGET:=x86_64-unknown-linux-musl
HONK_HASH:=$(HONK_HASH_X86_64)
else ifeq ($(ARCH),aarch64)
HONK_TARGET:=aarch64-unknown-linux-musl
HONK_HASH:=$(HONK_HASH_AARCH64)
endif
# mimalloc build: faster QUIC. honk.init sets MIMALLOC_ARENA_RESERVE=0 so the
# 1 GiB arena reservation stays out of VmSize. Use "-stock" to go back.
HONK_SUFFIX:=
# Upstream feature variant: -native-api (recommended for OpenWrt gateway), -full, or empty for legacy releases.
HONK_VARIANT:=-native-api
HONK_ASSET:=honk-core-$(HONK_ASSET_TAG)-$(HONK_TARGET)$(HONK_SUFFIX)$(HONK_VARIANT).tar.gz
PKG_SOURCE:=$(HONK_ASSET)
PKG_SOURCE_URL:=https://github.com/daeuniverse/honk/releases/download/$(HONK_RELEASE_TAG)/
PKG_HASH:=$(HONK_HASH)
include $(INCLUDE_DIR)/package.mk
define Package/honk
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=honk - eBPF transparent proxy engine (dae-compatible)
URL:=https://github.com/daeuniverse/honk
DEPENDS:=@(x86_64||aarch64) \
+ca-bundle +ip-full \
+kmod-sched-core +kmod-sched-bpf +kmod-veth +kmod-nft-queue \
+v2ray-geoip +v2ray-geosite \
+@KERNEL_XDP_SOCKETS \
+HONK_USE_VMLINUX_BTF:vmlinux-btf
endef
define Package/honk/config
choice
prompt "BTF source for CO-RE"
default HONK_USE_KERNEL_BTF
depends on PACKAGE_honk
config HONK_USE_KERNEL_BTF
bool "Use kernel BTF (integrated)"
depends on KERNEL_DEBUG_INFO_BTF
config HONK_USE_VMLINUX_BTF
bool "Use vmlinux-btf package"
endchoice
endef
define Package/honk/conffiles
/etc/honk/config.dae
/etc/honk/config.d/
/etc/honk/state/
/etc/config/honk
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(TAR) -xzf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) --strip-components=1
endef
define Build/Compile
true
endef
define Package/honk/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/honk-core $(1)/usr/bin/honk-core
$(INSTALL_DIR) $(1)/etc/honk/config.d
$(INSTALL_CONF) $(CURDIR)/files/config.dae $(1)/etc/honk/config.dae
$(INSTALL_CONF) $(CURDIR)/files/config.d/node.dae $(1)/etc/honk/config.d/node.dae
$(INSTALL_CONF) $(CURDIR)/files/config.d/route.dae $(1)/etc/honk/config.d/route.dae
$(INSTALL_CONF) $(CURDIR)/files/config.d/dns.dae $(1)/etc/honk/config.d/dns.dae
$(INSTALL_CONF) $(CURDIR)/files/config.d/api.dae $(1)/etc/honk/config.d/api.dae
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) $(CURDIR)/files/honk.config $(1)/etc/config/honk
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) $(CURDIR)/files/honk.init $(1)/etc/init.d/honk
endef
$(eval $(call BuildPackage,honk))
File renamed without changes.
+24
View File
@@ -0,0 +1,24 @@
# dns.dae
dns {
#bind: 'tcp+udp://[::]:53530'
client_subnet: auto
max_cache_size: 50000
#ipversion_prefer: 4
upstream {
local: 'udp://127.0.0.1:53' -> direct
remote: 'tcp+udp://dns.google:53'
}
routing {
request {
qtype(https) -> reject
qname(geosite: gfw) -> remote
fallback: local
}
response {
upstream(remote) -> accept
qname(geosite: private) -> accept
ip(geoip: cn) -> accept
fallback: remote
}
}
}
+35
View File
@@ -0,0 +1,35 @@
# node.dae
node {
node1: 'xxx'
node2: 'xxx'
}
subscription {
# 短形式:默认 86400s 刷新一次
sub: 'http://sub'
# 短形式 + UA:仍然只能默认 86400s
sub_ua: 'http://sub'(honk/1.0 like)
# 块形式:可以自定义定时刷新周期
sub2: {
url: 'http://sub'
ua: 'honk/1.0'
interval: '10000s' # 每 10000 秒刷新一次
}
# 禁用定期刷新
sub3: {
url: 'http://sub'
interval: 0
}
}
group {
proxy {
filter: subtag(sub) && !name(keyword: 'ExpireAt:')
filter: name(node1, node2)
policy: score
}
}
+27
View File
@@ -0,0 +1,27 @@
# route.dae
routing {
pname(dnsmasq, zerotier-one) -> direct(must)
dip(224.0.0.0/3, 'ff00::/8', geoip: private) -> direct
domain(geosite: category-bank-cn, geosite: boc@!cn, geosite: synology) -> direct
# block quic, if u node has poor quic support, enable this line
# l4proto(udp) && dport(443) -> block
domain(geosite: spotify) -> proxy
domain(geosite: category-doh) -> proxy
domain(geosite: tiktok) -> proxy
domain(geosite: category-ai-!cn, geosite: github) -> proxy
domain(geosite: gfw) -> proxy
dip(geoip: telegram) -> proxy
dip(geoip: cn) -> direct
# geoip:cn always using chiness asn, can use domain rule to override
# domain(geosite: cn) -> direct
# using proxy for ssh, http, https, and common ports, avoid (bt, or other p2p)
# dport(22, 80, 443, 8080, 6443, 9090) -> proxy
# fallback: direct
fallback: proxy
}
+31
View File
@@ -0,0 +1,31 @@
# config.dae
# Load all honk files placed in ./config.d/.
include {
config.d/*.dae
}
global {
log_level: warn
check_interval: 600s
check_tolerance: 30ms
lan_interface: br-lan
wan_interface: auto
auto_config_kernel_parameter: true
disable_waiting_network: false
data_dir: '/etc/honk'
log_file: '/var/log/honk/honk.log'
store_subscribe: true
# if u not using dns bind, set dial_mode to domain++ prefer
dial_mode: domain
bootstrap_resolver: '223.5.5.5:53'
tcp_check_url: 'https://www.gstatic.com/generate_204'
tcp_check_http_method: HEAD
udp_check_dns: 'dns.google.com:53', '8.8.8.8', '2001:4860:4860::8888'
}
assets {
geodata {
geosite: 'https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geosite.dat'
geoip: 'https://raw.githubusercontent.com/QiuSimons/geoip-moedove/refs/heads/main/geoip.dat'
}
}
+7
View File
@@ -0,0 +1,7 @@
config honk 'config'
option enabled '0'
option advanced '0'
option dashboard 'none'
option config_file '/etc/honk/config.dae'
+124
View File
@@ -0,0 +1,124 @@
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=96
STOP=10
extra_command "hot_reload" "Hot-reload service"
CONF="honk"
PROG="/usr/bin/honk-core"
# honk-core hardcodes dae-compatible datapath names (dae0/dae0peer + daens);
# these are the real interface/netns names, not leftover dae config.
HONK_HOST_IFACE="dae0"
HONK_PEER_IFACE="dae0peer"
HONK_NETNS_NAME="daens"
HONK_NETNS_PATH="/run/netns/$HONK_NETNS_NAME"
RESOLV_HONK="/tmp/resolv.conf.honk"
set_chmod_640() {
mkdir -p /etc/honk/config.d /etc/honk/state /var/log/honk
chmod -R u=rwX,go= /etc/honk 2>/dev/null || true
chmod 700 /etc/honk /etc/honk/config.d /etc/honk/state 2>/dev/null || true
}
cleanup_netns() {
ip netns del "$HONK_NETNS_NAME" 2>/dev/null || true
umount "$HONK_NETNS_PATH" 2>/dev/null || true
rm -f "$HONK_NETNS_PATH" 2>/dev/null || true
ip link del "$HONK_HOST_IFACE" 2>/dev/null || true
ip link del "$HONK_PEER_IFACE" 2>/dev/null || true
}
hijack_resolv_conf() {
grep -q ' /tmp/resolv\.conf ' /proc/mounts && return 0
local dns_list WANS
. /lib/functions/network.sh
unset -v __NETWORK_CACHE
__network_ifstatus WANS "" "[@.route[@.target='0.0.0.0' && !@.table]].interface" 2>/dev/null
set -- $WANS
if [ $# -eq 1 ]; then
dns_list=$(ubus call "network.interface.$1" status 2>/dev/null | \
jsonfilter -e '@["dns-server"][*]' 2>/dev/null)
if [ -z "$dns_list" ] && [ -f "/tmp/resolv.conf.d/resolv.conf.auto" ]; then
dns_list=$(awk '/^nameserver/{print $2}' "/tmp/resolv.conf.d/resolv.conf.auto")
fi
fi
[ -z "$dns_list" ] && dns_list="119.29.29.29 223.5.5.5"
[ -f /tmp/resolv.conf ] || touch /tmp/resolv.conf
grep -E '^(search|domain) ' /tmp/resolv.conf > "$RESOLV_HONK" 2>/dev/null
for dns in $dns_list; do
echo "nameserver $dns" >> "$RESOLV_HONK"
done
mount --bind "$RESOLV_HONK" /tmp/resolv.conf
mount -o remount,ro,bind /tmp/resolv.conf
}
restore_resolv_conf() {
while grep -q ' /tmp/resolv\.conf ' /proc/mounts; do
mount -o remount,rw,bind /tmp/resolv.conf 2>/dev/null
umount /tmp/resolv.conf 2>/dev/null || break
done
rm -f "$RESOLV_HONK"
}
start_service() {
local enabled config_file
config_load "$CONF"
config_get_bool enabled "config" "enabled" "0"
[ "$enabled" -eq "1" ] || return 1
config_get config_file "config" "config_file" "/etc/honk/config.dae"
if [ ! -x "$PROG" ]; then
logger -t honk "not starting: $PROG is missing or not executable"
return 1
fi
set_chmod_640
cleanup_netns
hijack_resolv_conf
procd_open_instance "$CONF"
# mimalloc pre-reserves a 1 GiB arena; VSZ only, but it dwarfs the real
# footprint in ps. MIMALLOC_ARENA_RESERVE=0: grow on demand instead.
procd_set_param env DAE_LOCATION_ASSET="/usr/share/v2ray" MIMALLOC_ARENA_RESERVE="0"
procd_set_param command "$PROG" --config "$config_file"
procd_set_param netdev "$HONK_HOST_IFACE" "$HONK_PEER_IFACE"
procd_set_param limits core="unlimited"
procd_set_param limits nofile="1000000 1000000"
procd_set_param term_timeout 8
procd_set_param respawn 3600 5 5
procd_set_param stderr 1
procd_close_instance
}
service_stopped() {
restore_resolv_conf
cleanup_netns
}
reload_service() {
stop
start
}
service_triggers() {
procd_add_reload_trigger "$CONF"
}
hot_reload() {
set_chmod_640
if /etc/init.d/honk running; then
"$PROG" reload
else
start
fi
}
+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=hysteria PKG_NAME:=hysteria
PKG_VERSION:=2.12.3 PKG_VERSION:=2.13.0
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)?
PKG_HASH:=2679b76ab9cacbfd7574a48453325843865a347f1925858c4fb4fee3be132147 PKG_HASH:=dfde427a93a0dc5ff65ddc1e239df3b1def54bf33f8b137c571daa7b27ecddd0
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-app-v$(PKG_VERSION) PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-app-v$(PKG_VERSION)
PKG_LICENSE:=MIT PKG_LICENSE:=MIT
+1 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector-mod-email PKG_NAME:=internet-detector-mod-email
PKG_VERSION:=1.7.4 PKG_VERSION:=1.7.4
PKG_RELEASE:=1 PKG_RELEASE:=2
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector> PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
+1 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector-mod-modem-restart PKG_NAME:=internet-detector-mod-modem-restart
PKG_VERSION:=1.7.4 PKG_VERSION:=1.7.4
PKG_RELEASE:=1 PKG_RELEASE:=2
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector> PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
+1 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector-mod-telegram PKG_NAME:=internet-detector-mod-telegram
PKG_VERSION:=1.7.4 PKG_VERSION:=1.7.4
PKG_RELEASE:=1 PKG_RELEASE:=2
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector> PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
@@ -57,7 +57,7 @@ function httpRequest(url, proxyType, proxyHost, proxyPort, proxyUser, proxyPassw
if(length(r) > 0) { if(length(r) > 0) {
retCode = r[0]; retCode = r[0];
} }
data = replace(data, retCodeRegexp, ''); data = trim(replace(data, retCodeRegexp, ''));
} }
} }
return { retCode, data }; return { retCode, data };
+3 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector PKG_NAME:=internet-detector
PKG_VERSION:=1.7.4 PKG_VERSION:=1.7.4
PKG_RELEASE:=1 PKG_RELEASE:=2
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector> PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
@@ -62,6 +62,8 @@ define Package/$(PKG_NAME)/install
$(INSTALL_DATA) ./files/usr/lib/lua/internet-detector/modules/mod_public_ip.lua $(1)/usr/lib/lua/internet-detector/modules/mod_public_ip.lua $(INSTALL_DATA) ./files/usr/lib/lua/internet-detector/modules/mod_public_ip.lua $(1)/usr/lib/lua/internet-detector/modules/mod_public_ip.lua
$(INSTALL_DATA) ./files/usr/lib/lua/internet-detector/modules/mod_user_scripts.lua $(1)/usr/lib/lua/internet-detector/modules/mod_user_scripts.lua $(INSTALL_DATA) ./files/usr/lib/lua/internet-detector/modules/mod_user_scripts.lua $(1)/usr/lib/lua/internet-detector/modules/mod_user_scripts.lua
$(INSTALL_DATA) ./files/usr/lib/lua/internet-detector/modules/mod_regular_script.lua $(1)/usr/lib/lua/internet-detector/modules/mod_regular_script.lua $(INSTALL_DATA) ./files/usr/lib/lua/internet-detector/modules/mod_regular_script.lua $(1)/usr/lib/lua/internet-detector/modules/mod_regular_script.lua
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/internet-detector $(1)/lib/upgrade/keep.d/internet-detector
endef endef
define Package/$(PKG_NAME)/postinst define Package/$(PKG_NAME)/postinst
@@ -0,0 +1 @@
/etc/internet-detector/*
@@ -35,10 +35,6 @@ o:value("tun", "TUN")
o:value("tap", "TAP") o:value("tap", "TAP")
o.rmempty = false o.rmempty = false
o = s:option(Flag, "lzo", translate("LZO compression"))
o.default = "1"
o.rmempty = false
o = s:option(Flag, "route_nopull", translate("No pull route")) o = s:option(Flag, "route_nopull", translate("No pull route"))
o.default = "1" o.default = "1"
o.rmempty = false o.rmempty = false
@@ -43,9 +43,6 @@ msgstr "协议"
msgid "Type" msgid "Type"
msgstr "类型" msgstr "类型"
msgid "LZO compression"
msgstr "LZO 压缩"
msgid "No pull route" msgid "No pull route"
msgstr "不拉取路由" msgstr "不拉取路由"
@@ -47,9 +47,6 @@ start_instance() {
local _key="key key" local _key="key key"
} }
local c_lzo=$(uci -q get ${CONFIG}.${cfgid}.lzo)
[ "${c_lzo}" = "1" ] && local _lzo="comp-lzo"
local c_route_nopull=$(uci -q get ${CONFIG}.${cfgid}.route_nopull) local c_route_nopull=$(uci -q get ${CONFIG}.${cfgid}.route_nopull)
[ "${c_route_nopull}" = "1" ] && local _route_nopull="route-nopull" [ "${c_route_nopull}" = "1" ] && local _route_nopull="route-nopull"
@@ -201,7 +198,6 @@ start_instance() {
${_auth_user_pass} ${_auth_user_pass}
${_tls_auth} ${_tls_auth}
${_tls_crypt} ${_tls_crypt}
${_lzo}
${_route_nopull} ${_route_nopull}
verb 3 verb 3
@@ -45,10 +45,6 @@ o.placeholder = "255.255.255.0"
o.default = o.placeholder o.default = o.placeholder
o.rmempty = false o.rmempty = false
o = s:taboption("general", Flag, "lzo", translate("LZO compression"))
o.default = "1"
o.rmempty = false
o = s:taboption("general", TextValue, "extra_config", translate("Extra Config")) o = s:taboption("general", TextValue, "extra_config", translate("Extra Config"))
o.datatype = "string" o.datatype = "string"
o.rows = 3 o.rows = 3
@@ -28,9 +28,6 @@ msgstr "IP 段"
msgid "Subnet mask" msgid "Subnet mask"
msgstr "子网掩码" msgstr "子网掩码"
msgid "LZO compression"
msgstr "LZO 压缩"
msgid "Extra Config" msgid "Extra Config"
msgstr "额外配置" msgstr "额外配置"
@@ -6,5 +6,4 @@ config server 'server'
option ipv6 '1' option ipv6 '1'
option ip_segment '172.30.1.0' option ip_segment '172.30.1.0'
option subnet_mask '255.255.255.0' option subnet_mask '255.255.255.0'
option lzo '1'
option ddns 'example.com' option ddns 'example.com'
@@ -80,8 +80,6 @@ gen_include() {
start_service() { start_service() {
local enabled=$(uci -q get ${CONFIG}.server.enabled) local enabled=$(uci -q get ${CONFIG}.server.enabled)
[ "${enabled}" -eq 1 ] || return 1 [ "${enabled}" -eq 1 ] || return 1
local lzo=$(uci -q get ${CONFIG}.server.lzo)
[ "${lzo}" -eq 1 ] && lzo_conf="comp-lzo"
mkdir -p ${TMP_OVPN_PATH} mkdir -p ${TMP_OVPN_PATH}
_ca=${OVPN_PATH}/ca.crt _ca=${OVPN_PATH}/ca.crt
@@ -147,7 +145,6 @@ start_service() {
up ${SCRIPT_PATH}/up.sh up ${SCRIPT_PATH}/up.sh
down ${SCRIPT_PATH}/down.sh down ${SCRIPT_PATH}/down.sh
keepalive 10 120 keepalive 10 120
${lzo_conf}
persist-key persist-key
persist-tun persist-tun
script-security 3 script-security 3
@@ -16,7 +16,6 @@ cat <<-EOF > /tmp/openvpn.ovpn
persist-key persist-key
persist-tun persist-tun
auth-user-pass auth-user-pass
comp-lzo
verb 3 verb 3
<ca> <ca>
$(cat /usr/share/openvpn-server/ca.crt) $(cat /usr/share/openvpn-server/ca.crt)
-46
View File
@@ -1,46 +0,0 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2009-2013 OpenWrt.org
#
include $(TOPDIR)/rules.mk
PKG_NAME:=BaiduPCS-Go
PKG_VERSION:=3.9.0
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/qjfoidnh/BaiduPCS-Go/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=de71666e961a3eeb90f8aca7b11934c3f0296d1870e036a7c086ba1decfca8ab
PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE
PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
GO_PKG:=github.com/qjfoidnh/BaiduPCS-Go
GO_PKG_LDFLAGS_X:=main.Version=v$(PKG_VERSION)
include $(INCLUDE_DIR)/package.mk
include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk
define Package/BaiduPCS-Go
SECTION:=net
CATEGORY:=Network
SUBMENU:=Download Manager
TITLE:=Terminal utility for Baidu Network Disk
URL:=https://github.com/qjfoidnh/BaiduPCS-Go
DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle
endef
define Package/BaiduPCS-Go/install
$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))
$(INSTALL_DIR) $(1)/usr/bin/
$(CP) $(PKG_INSTALL_DIR)/usr/bin/BaiduPCS-Go $(1)/usr/bin/
endef
$(eval $(call GoBinPackage,BaiduPCS-Go))
$(eval $(call BuildPackage,BaiduPCS-Go))
-85
View File
@@ -1,85 +0,0 @@
#
# Copyright (C) 2019 OpenWrt.org
#
# KFERMercer <KFER.Mercer@gmail.com>
#
# This is free software, licensed under the GNU General Public License v3.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=baidupcs-web
PKG_VERSION:=3.7.1
PKG_RELEASE:=2
include $(INCLUDE_DIR)/package.mk
define Package/baidupcs-web
SECTION:=net
CATEGORY:=Network
TITLE:=BaiduPCS-Web is a web controller for BaiduPCS-Go
URL:=https://github.com/Erope/baidupcs-web
endef
define Package/$(PKG_NAME)/description
BaiduPCS-Web is a web controller for BaiduPCS-Go
endef
# 禁止OpenWrt对二进制文件进行strip
STRIP:=true
ifeq ($(ARCH),i386)
PKG_ARCH_BAIDUPCS-WEB:=386
endif
ifeq ($(ARCH),x86_64)
PKG_ARCH_BAIDUPCS-WEB:=amd64
endif
ifeq ($(ARCH),mipsel)
PKG_ARCH_BAIDUPCS-WEB:=mipsle
endif
ifeq ($(ARCH),mips)
PKG_ARCH_BAIDUPCS-WEB:=mipsle
endif
ifeq ($(ARCH),arm)
ifeq ($(BOARD),bcm53xx)
PKG_ARCH_BAIDUPCS-WEB:=armv5
else ifeq ($(BOARD),kirkwood)
PKG_ARCH_BAIDUPCS-WEB:=armv5
else
PKG_ARCH_BAIDUPCS-WEB:=armv7
endif
endif
ifeq ($(ARCH),aarch64)
PKG_ARCH_BAIDUPCS-WEB:=arm64
endif
PKG_SOURCE:=BaiduPCS-Go-v$(PKG_VERSION)-linux-$(PKG_ARCH_BAIDUPCS-WEB).zip
PKG_SOURCE_URL:=https://github.com/coolsnowwolf/baidupcs-web/raw/master/
UNZIP_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/$(PKG_NAME)-unzip
PKG_HASH:=skip
define Build/Prepare
mkdir -vp $(UNZIP_DIR)
unzip -od $(UNZIP_DIR) $(DL_DIR)/$(PKG_SOURCE)
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/baidupcs-web/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(UNZIP_DIR)/*/BaiduPCS-Go $(1)/usr/bin/baidupcs-web
chmod 755 $(1)/usr/bin/baidupcs-web
endef
$(eval $(call BuildPackage,baidupcs-web))
-70
View File
@@ -1,70 +0,0 @@
#
# Copyright (C) 2009-2012 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=libcryptopp
PKG_VERSION:=5.6.4
PKG_RELEASE:=2
PKG_SOURCE:=cryptopp$(subst .,,$(PKG_VERSION)).zip
PKG_SOURCE_URL:=http://www.cryptopp.com/
PKG_MD5SUM:=4ee7e5cdd4a45a14756c169eaf2a77fc
PKG_USE_NINJA:=0
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION)
CMAKE_INSTALL:=1
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk
define Package/libcryptopp
SECTION:=libs
CATEGORY:=Libraries
DEPENDS:=+libpthread +libstdcpp
TITLE:=Free C++ class library of cryptographic schemes
URL:=http://packages.debian.org/sid/libcrypto++-dev
endef
define Package/libcryptopp/description
Crypto++ is library for creating C++ programs which use cryptographic algorithms.
The library uses a Pipes & Filters architecture with heavy use of templates and
abstract base classes.
endef
#CONFIGURE_ARGS += \
# --enable-static \
# --enable-shared
#TARGET_LDFLAGS += \
# -lpthread
CMAKE_OPTIONS += -DCMAKE_CXX_FLAGS="$(FPIC)"
CMAKE_OPTIONS += -DBUILD_STATIC=ON
CMAKE_OPTIONS += -DBUILD_SHARED=ON
UNPACK_CMD=cd $(PKG_BUILD_DIR) && unzip "$(DL_DIR)/$(PKG_SOURCE)"
define Build/Prepare
$(Build/Prepare/Default)
cd $(PKG_BUILD_DIR) && rm -f GNUmakefile GNUmakefile-cross
endef
define Build/InstallDev
$(INSTALL_DIR) $(1)/usr/include/cryptopp
$(CP) $(PKG_INSTALL_DIR)/usr/include/cryptopp/* $(1)/usr/include/cryptopp/
$(INSTALL_DIR) $(1)/usr/lib
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libcryptopp.{a,so*} $(1)/usr/lib/
endef
define Package/libcryptopp/install
$(INSTALL_DIR) $(1)/usr/lib
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libcryptopp.so* $(1)/usr/lib/
endef
$(eval $(call BuildPackage,libcryptopp))
@@ -1,22 +0,0 @@
#
# <https://github.com/KFERMercer/luci-app-baidupcs-web>
#
# Copyright (C) 2020 KFERMercer <KFER.Mercer@gmail.com>
# Copyright (C) 2020 [CTCGFW] Project OpenWRT
#
# THIS IS FREE SOFTWARE, LICENSED UNDER GPLv3.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-baidupcs-web
LUCI_TITLE:=LuCI support for BaiduPCS-Go
LUCI_DEPENDS:=+baidupcs-web +wget +openssl-util
LUCI_PKGARCH:=all
PKG_VERSION:=1.0
PKG_RELEASE:=6
PKG_MAINTAINER:=<https://github.com/KFERMercer/luci-app-baidupcs-web>
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -1,18 +0,0 @@
module("luci.controller.baidupcs-web", package.seeall)
function index()
if not nixio.fs.access("/etc/config/baidupcs-web") then
return
end
entry({"admin", "nas", "baidupcs-web"}, cbi("baidupcs-web"), _("BaiduPCS Web"), 300).dependent = true
entry({"admin", "nas", "baidupcs-web", "status"}, call("act_status")).leaf = true
end
function act_status()
local e = {}
e.running=luci.sys.call("pgrep baidupcs-web >/dev/null") == 0
-- e.port = luci.sys.exec("uci get baidupcs-web.config.port")
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
@@ -1,48 +0,0 @@
--[[
Copyright (C) 2020 KFERMercer <KFER.Mercer@gmail.com>
Copyright (C) 2020 [CTCGFW] Project OpenWRT
THIS IS FREE SOFTWARE, LICENSED UNDER GPLv3
]]--
m = Map("baidupcs-web")
m.title = translate("BaiduPCS-Web")
m.description = translate("基于BaiduPCS-Go, 可以让你高效的使用百度云")
m:section(SimpleSection).template = "baidupcs-web/baidupcs-web_status"
s = m:section(TypedSection, "baidupcs-web")
s.addremove = false
s.anonymous = true
enable = s:option(Flag, "enabled", translate("启用"))
enable.rmempty = false
o = s:option(Value, "port", translate("网页端口"))
o.datatype = "port"
o.placeholder = "5299"
o.default = "5299"
o.rmempty = false
o = s:option(Value, "download_dir", translate("下载目录"))
o.placeholder = "/opt/baidupcsweb-download"
o.default = "/opt/baidupcsweb-download"
o.rmempty = false
o = s:option(Value, "max_download_rate", translate("最大下载速度"))
o.placeholder = "0"
o = s:option(Value, "max_upload_rate", translate("最大上传速度"))
o.placeholder = "0"
o.description = translate("0代表不限制, 单位为每秒的传输速率, 后缀'/s' 可省略, 如 2MB/s, 2MB, 2m, 2mb 均为一个意思")
o = s:option(Value, "max_download_load", translate("同时进行下载文件的最大数量"))
o.placeholder = "1"
o.description = translate("不要太贪心, 当心被封号")
o = s:option(Value, "max_parallel", translate("最大并发连接数"))
o.placeholder = "8"
return m
@@ -1,38 +0,0 @@
<!--
Copyright (C) 2020 KFERMercer <KFER.Mercer@gmail.com>
THIS IS FREE SOFTWARE, LICENSED UNDER GPLv3.
-->
<script type="text/javascript">//<![CDATA[
XHR.poll(3, '<%=url([[admin]], [[nas]], [[baidupcs-web]], [[status]])%>', null,
function(x, data) {
var tb = document.getElementById('baidupcs-web_status');
if (data && tb) {
if (data.running) {
var links = '<em><b><font color=green>BaiduPCS-Web <%:RUNNING%></font></b></em><input class="cbi-button mar-10" type="button" value="<%:打开管理页面%>" onclick="openClient();" />';
tb.innerHTML = links;
} else {
tb.innerHTML = '<em><b><font color=red>BaiduPCS-Web <%:NOT RUNNING%></font></b></em>';
}
}
}
);
function openClient() {
var curWwwPath = window.document.location.href;
var pathName = window.document.location.pathname;
var pos = curWwwPath.indexOf(pathName);
var localhostPath = curWwwPath.substring(0, pos);
var clientPort = window.document.getElementById("cbid.baidupcs-web.config.port").value
var url = localhostPath + ":" + clientPort;
window.open(url)
};
//]]>
</script>
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
<fieldset class="cbi-section">
<p id="baidupcs-web_status">
<em><%:Collecting data...%></em>
</p>
</fieldset>
@@ -1,2 +0,0 @@
config baidupcs-web 'config'
@@ -1,34 +0,0 @@
#!/bin/sh /etc/rc.common
START=90
STOP=10
BaiduPCSWeb="/usr/bin/baidupcs-web"
enabled="$(uci -q get baidupcs-web.config.enabled)"
port="$(uci -q get baidupcs-web.config.port)"
download_dir="$(uci -q get baidupcs-web.config.download_dir)"
max_download_rate="$(uci -q get baidupcs-web.config.max_download_rate || echo '0')"
max_upload_rate="$(uci -q get baidupcs-web.config.max_upload_rate || echo '0')"
max_download_load="$(uci -q get baidupcs-web.config.max_download_load || echo '1')"
max_parallel="$(uci -q get baidupcs-web.config.max_parallel || echo '8')"
start() {
stop
[ "$enabled" == "1" ] || exit 0
mkdir -p "${download_dir}"
"${BaiduPCSWeb}" config set \
--savedir "${download_dir}" \
--max_download_rate "${max_download_rate}" \
--max_upload_rate "${max_upload_rate}" \
--max_download_load "${max_download_load}" \
--max_parallel "${max_parallel}" \
--max_upload_parallel "${max_parallel}" \
>/dev/null 2>&1
"${BaiduPCSWeb}" web --port "${port}" --access >/dev/null 2>&1 &
}
stop() {
killall "${BaiduPCSWeb}" >/dev/null 2>&1
}
@@ -1,11 +0,0 @@
{
"luci-app-baidupcs-web": {
"description": "Grant UCI access for luci-app-baidupcs-web",
"read": {
"uci": [ "baidupcs-web" ]
},
"write": {
"uci": [ "baidupcs-web" ]
}
}
}
@@ -1,4 +0,0 @@
{
"config": "baidupcs-web",
"init": "baidupcs-web"
}
@@ -6,12 +6,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for MWAN3 Helper LUCI_TITLE:=LuCI support for MWAN3 Helper
LUCI_DEPENDS:=+luci-app-mwan3 +pdnsd-alt +dnsmasq-full +ipset LUCI_DEPENDS:=+luci-app-mwan3 +dnsmasq-full +ipset
LUCI_PKGARCH:=all LUCI_PKGARCH:=all
PKG_NAME:=luci-app-mwan3helper PKG_NAME:=luci-app-mwan3helper
PKG_VERSION:=1 PKG_VERSION:=1
PKG_RELEASE:=4 PKG_RELEASE:=5
include $(TOPDIR)/feeds/luci/luci.mk include $(TOPDIR)/feeds/luci/luci.mk
@@ -1,5 +1,3 @@
-- Licensed to the public under the GNU General Public License v3.
module("luci.controller.mwan3helper", package.seeall) module("luci.controller.mwan3helper", package.seeall)
function index() function index()
@@ -7,15 +5,6 @@ function index()
return return
end end
entry({"admin", "services", "mwan3helper"}, alias("admin", "services", "mwan3helper", "client"), _("MWAN3 Helper"), 300).dependent = true entry({"admin", "services", "mwan3helper"}, alias("admin", "services", "mwan3helper", "list"), _("MWAN3 Helper"), 300).dependent = true
entry({"admin", "services", "mwan3helper", "client"}, cbi("mwan3helper/client"), _("Settings"), 10).leaf = true entry({"admin", "services", "mwan3helper", "list"}, cbi("mwan3helper/list")).leaf = true
entry({"admin", "services", "mwan3helper", "lists"}, cbi("mwan3helper/list"), _("IPSet Lists"), 20).leaf = true
entry({"admin", "services", "mwan3helper", "status"}, call("act_status")).leaf = true
end
function act_status()
local e = {}
e.running = luci.sys.call("pgrep mwan3dns >/dev/null") == 0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end end
@@ -1,28 +0,0 @@
m = Map("mwan3helper")
m.title = translate("MWAN3 Helper")
m.description = translate("MWAN3 Helper generate IPSets")
m:section(SimpleSection).template = "mwan3helper/mwan3helper_status"
s = m:section(TypedSection, "mwan3helper")
s.addremove = false
s.anonymous = true
o = s:option(Flag, "enabled", translate("Enable GFW IPSet"))
o.description = translate("启用 DNS 防污染并打开GFW IPSet(与SSR的GFW列表模式不能同时开启)")
o.rmempty = false
o = s:option(ListValue, "dns", translate("Anti-pollution DNS Server"))
o:value("208.67.222.222:443", translate("OpenDNS (208.67.222.222)"))
o:value("208.67.220.220:443", translate("OpenDNS (208.67.220.220)"))
o:value("8.8.4.4:53", translate("Google Public DNS (8.8.4.4)"))
o:value("8.8.8.8:53", translate("Google Public DNS (8.8.8.8)"))
o:value("209.244.0.3:53", translate("Level 3 Public DNS (209.244.0.3)"))
o:value("209.244.0.4:53", translate("Level 3 Public DNS (209.244.0.4)"))
o:value("4.2.2.1:53", translate("Level 3 Public DNS (4.2.2.1)"))
o:value("4.2.2.2:53", translate("Level 3 Public DNS (4.2.2.2)"))
o:value("4.2.2.3:53", translate("Level 3 Public DNS (4.2.2.3)"))
o:value("4.2.2.4:53", translate("Level 3 Public DNS (4.2.2.4)"))
o:value("1.1.1.1:53", translate("Cloudflare DNS (1.1.1.1)"))
return m
@@ -1,35 +1,75 @@
local sys = require "luci.sys"
m = Map("mwan3helper") m = Map("mwan3helper")
m.title = translate("MWAN3 IPSets") m.title = translate("MWAN3 Helper")
m.description = translate("MWAN3 Helper generate IPSets")
s = m:section(TypedSection, "mwan3helper") s = m:section(TypedSection, "mwan3helper")
s.addremove = false s.addremove = false
s.anonymous = true s.anonymous = true
o = s:option(DummyValue, "gfwlist", translate("GFW列表")) o = s:option(Flag, "enabled", translate("Enable"))
o.description = translate("GFW列表数据: 5207 条,IPSET 名称为 gfwlist") o.rmempty = false
o = s:option(DummyValue, "all_cn", translate("中国所有IP地址")) local function get_num(ipset_name)
o.description = translate("中国所有IP地址路由表数据: 8304 条, IPSET 名称为 cn") local base_cmd = "ipset -q list %s | grep -E 'Number of entries:' | awk -F ': ' '{print $2}'"
local num = sys.exec(base_cmd % ipset_name)
if not num or num == "" then
num = 0
end
return num
end
o = s:option(DummyValue, "chinatelecom", translate("中国电信"))
o.description = translate("中国电信路由表数据: 1948 条, IPSET 名称为 ct")
o = s:option(DummyValue, "unicom_cnc", translate("中国联通/网通")) local data = {
o.description = translate("中国联通/网通路由表数据: 895 条, IPSET 名称为 cnc") all_cn = {
name = translate("中国所有IP地址"),
ipset_name = "cn",
num = get_num("cn")
},
ct = {
name = translate("中国电信"),
ipset_name = "ct",
num = get_num("ct")
},
cnc = {
name = translate("中国联通"),
ipset_name = "cnc",
num = get_num("cnc")
},
cmcc = {
name = translate("中国移动/铁通"),
ipset_name = "cmcc",
num = get_num("cmcc")
},
cbtn = {
name = translate("中国广电"),
ipset_name = "cbtn",
num = get_num("cbtn")
},
cernet = {
name = translate("中国教育网"),
ipset_name = "cernet",
num = get_num("cernet")
},
gwbn = {
name = translate("长城宽带/鹏博士"),
ipset_name = "gwbn",
num = get_num("gwbn")
},
othernet = {
name = translate("中国其他ISP"),
ipset_name = "othernet",
num = get_num("othernet")
},
}
o = s:option(DummyValue, "cmcc", translate("中国移动")) local data_order = {"all_cn", "ct", "cnc", "cmcc", "cbtn", "cernet", "gwbn", "othernet"}
o.description = translate("中国移动路由表数据: 55 条, IPSET 名称为 cmcc")
o = s:option(DummyValue, "crtc", translate("中国铁通")) for i, v in ipairs(data_order) do
o.description = translate("中国铁通路由表数据: 16 条, IPSET 名称为 crtc") local d = data[v]
o = s:option(DummyValue, v, d.name)
o = s:option(DummyValue, "cernet", translate("中国教育网")) o.description = translatef("%s 条, IPSet 名称为 %s", d.num, d.ipset_name)
o.description = translate("中国教育网路由表数据: 162 条, IPSET 名称为 cernet") end
o = s:option(DummyValue, "gwbn", translate("长城宽带/鹏博士"))
o.description = translate("长城宽带/鹏博士: 94 条, IPSET 名称为 gwbn")
o = s:option(DummyValue, "othernet", translate("中国其他ISP"))
o.description = translate("中国其他ISP: 5134 条, IPSET 名称为 othernet")
return m return m
@@ -1,22 +0,0 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(3, '<%=url([[admin]], [[services]], [[mwan3helper]], [[status]])%>', null,
function(x, data) {
var tb = document.getElementById('mwan3helper_status');
if (data && tb) {
if (data.running) {
var links = '<em><b><font color=green>MWAN3 Helper <%:RUNNING%></font></b></em>';
tb.innerHTML = links;
} else {
tb.innerHTML = '<em><b><font color=red>MWAN3 Helper <%:NOT RUNNING%></font></b></em>';
}
}
}
);
//]]>
</script>
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
<fieldset class="cbi-section">
<p id="mwan3helper_status">
<em><%:Collecting data...%></em>
</p>
</fieldset>
@@ -1,24 +1,5 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "MWAN3 Helper" msgid "MWAN3 Helper"
msgstr "MWAN3 分流助手" msgstr "MWAN3 分流助手"
msgid "Settings"
msgstr "设置"
msgid "IPSet Lists"
msgstr "IPSet列表"
msgid "MWAN3 Helper generate IPSets" msgid "MWAN3 Helper generate IPSets"
msgstr "自动生成中国地址段和各大ISP运营商的 IPSet 地址段,并解决国外域名的污染问题,帮助MWAN3分流 ISP/WireGuard 等" msgstr "自动生成中国地址段和各大ISP运营商的 IPSet 地址段"
msgid "Enable GFW IPSet"
msgstr "启用 GFW IPSet"
@@ -1,5 +1,3 @@
config mwan3helper 'config' config mwan3helper 'config'
option dns '208.67.222.222:443'
option enabled '0' option enabled '0'
@@ -3,164 +3,26 @@
START=60 START=60
DNSMASQ_RESTART=N destroy_ipset() {
DNS_SERVER="208.67.222.222" for i in "$@"; do
ipset -q -F $i
start_pdnsd() { ipset -q -X $i
# DNS_SERVER=$(uci get flowoffload.@flow[0].dns_server 2>/dev/null) done
[ -d /var/etc ] || mkdir -p /var/etc
if [ ! -f /var/mwan3dns/pdnsd.cache ]; then
mkdir -p /var/mwan3dns
echo -ne "pd13\000\000\000\000" > /var/mwan3dns/pdnsd.cache
chown -R nobody.nogroup /var/mwan3dns
fi
cat > /var/etc/mwan3dns.conf <<EOF
global {
perm_cache=1024; # dns缓存大小,单位KB,建议不要写的太大
cache_dir="/var/mwan3dns"; # 缓存文件的位置
pid_file = /var/run/mwan3dns.pid;
server_ip = 0.0.0.0; # pdnsd监听的网卡,0.0.0.0是全部网卡
server_port=53000; # pdnsd监听的端口,不要和别的服务冲突即可
status_ctl = on;
paranoid=on; # 二次请求模式,如果请求主DNS服务器返回的是垃圾地址,就向备用服务器请求
query_method=udp_only;
neg_domain_pol = off;
par_queries = 400; # 最多同时请求数
min_ttl = 1h; # DNS结果最短缓存时间
max_ttl = 1w; # DNS结果最长缓存时间
timeout = 10; # DNS请求超时时间,单位秒
} }
server {
label = "routine";
ip = $DNS_SERVER;
port = 53;
timeout = 5;
reject = 74.125.127.102, # 以下是脏IP,也就是DNS污染一般会返回的结果,如果收到如下DNS结果会触发二次请求(TCP协议一般不会碰到脏IP)
74.125.155.102,
74.125.39.102,
74.125.39.113,
209.85.229.138,
128.121.126.139,
159.106.121.75,
169.132.13.103,
192.67.198.6,
202.106.1.2,
202.181.7.85,
203.161.230.171,
203.98.7.65,
207.12.88.98,
208.56.31.43,
209.145.54.50,
209.220.30.174,
209.36.73.33,
211.94.66.147,
213.169.251.35,
216.221.188.182,
216.234.179.13,
243.185.187.39,
37.61.54.158,
4.36.66.178,
46.82.174.68,
59.24.3.173,
64.33.88.161,
64.33.99.47,
64.66.163.251,
65.104.202.252,
65.160.219.113,
66.45.252.237,
69.55.52.253,
72.14.205.104,
72.14.205.99,
78.16.49.15,
8.7.198.45,
93.46.8.89,
37.61.54.158,
243.185.187.39,
190.93.247.4,
190.93.246.4,
190.93.245.4,
190.93.244.4,
65.49.2.178,
189.163.17.5,
23.89.5.60,
49.2.123.56,
54.76.135.1,
77.4.7.92,
118.5.49.6,
159.24.3.173,
188.5.4.96,
197.4.4.12,
220.250.64.24,
243.185.187.30,
249.129.46.48,
253.157.14.165;
reject_policy = fail;
}
server {
label = "special"; # 这个随便写
ip = 208.67.222.222,208.67.220.220; # 这里为备用DNS服务器的 ip 地址
port = 443; # 推荐使用53以外的端口(DNS服务器必须支持)
proxy_only = on;
timeout = 5;
}
source {
owner=localhost;
// serve_aliases=on;
file="/etc/hosts";
}
rr {
name=localhost;
reverse=on;
a=127.0.0.1;
owner=localhost;
soa=localhost,root.localhost,42,86400,900,86400,86400;
}
EOF
[ -d /var/sbin ] || mkdir -p /var/sbin
[ -f /var/sbin/mwan3dns ] || cp -a /usr/sbin/pdnsd /var/sbin/mwan3dns
/var/sbin/mwan3dns -c /var/etc/mwan3dns.conf -d
echo "Start MWAN3 Helper DNS"
}
stop_pdnsd() {
kill $(pidof mwan3dns) >/dev/null 2>&1 || kill -9 $(ps | grep mwan3dns | grep -v grep | awk '{print $1}') >/dev/null 2>&1
echo "Stop MWAN3 Helper DNS"
}
start(){ start(){
/etc/mwan3helper/genipset.sh cn '/etc/mwan3helper/all_cn.txt' en=$(uci -q get mwan3helper.config.enabled || echo "0")
/etc/mwan3helper/genipset.sh ct '/etc/mwan3helper/chinatelecom.txt' if [ $en -eq 1 ]; then
/etc/mwan3helper/genipset.sh cnc '/etc/mwan3helper/unicom_cnc.txt' [ ! -x /etc/mwan3helper/genipset.sh ] && chmod +x /etc/mwan3helper/genipset.sh
/etc/mwan3helper/genipset.sh cmcc '/etc/mwan3helper/cmcc.txt' /etc/mwan3helper/genipset.sh cn '/etc/mwan3helper/all_cn.txt'
/etc/mwan3helper/genipset.sh crtc '/etc/mwan3helper/crtc.txt' /etc/mwan3helper/genipset.sh ct '/etc/mwan3helper/chinatelecom.txt'
/etc/mwan3helper/genipset.sh cernet '/etc/mwan3helper/cernet.txt' /etc/mwan3helper/genipset.sh cnc '/etc/mwan3helper/unicom_cnc.txt'
/etc/mwan3helper/genipset.sh gwbn '/etc/mwan3helper/gwbn.txt' /etc/mwan3helper/genipset.sh cmcc '/etc/mwan3helper/cmcc.txt'
/etc/mwan3helper/genipset.sh othernet '/etc/mwan3helper/othernet.txt' /etc/mwan3helper/genipset.sh cbtn '/etc/mwan3helper/chinabtn.txt'
en=$(uci get mwan3helper.config.enabled 2>/dev/null) /etc/mwan3helper/genipset.sh cernet '/etc/mwan3helper/cernet.txt'
if [ $en -eq 1 ]; then /etc/mwan3helper/genipset.sh gwbn '/etc/mwan3helper/gwbn.txt'
start_pdnsd /etc/mwan3helper/genipset.sh othernet '/etc/mwan3helper/othernet.txt'
mkdir -p /tmp/etc/dnsmasq-mwan3.d else
ipset -N gfwlist hash:net 2>/dev/null destroy_ipset cn ct cnc cmcc cbtn cernet gwbn othernet
awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"gfwlist"'\n",$0)}' /etc/mwan3helper/gfw.txt > /tmp/etc/dnsmasq-mwan3.d/mwan3_gfwlist.conf fi
awk '!/^$/&&!/^#/{printf("server=/.%s/'"127.0.0.1#53000"'\n",$0)}' /etc/mwan3helper/gfw.txt >> /tmp/etc/dnsmasq-mwan3.d/mwan3_gfwlist.conf
cat > /tmp/dnsmasq.d/dnsmasq-mwan3.conf <<EOF
conf-dir=/var/etc/dnsmasq-mwan3.d
EOF
/etc/init.d/dnsmasq restart
fi
}
stop(){
stop_pdnsd
rm -f /tmp/dnsmasq.d/dnsmasq-mwan3.conf
/etc/init.d/dnsmasq restart
} }
File diff suppressed because it is too large. Load diff
@@ -1,33 +1,23 @@
1.51.0.0/16 1.51.0.0/16
1.184.0.0/15 1.184.0.0/15
42.201.32.0/19
42.244.0.0/14 42.244.0.0/14
43.252.48.0/22 43.252.48.0/24
49.52.0.0/14 49.52.0.0/14
49.120.0.0/14 49.120.0.0/14
49.140.0.0/15 49.140.0.0/15
49.208.0.0/15 49.208.0.0/15
58.154.0.0/15 58.154.0.0/15
58.192.0.0/15 58.192.0.0/12
58.194.0.0/15 59.64.0.0/12
58.196.0.0/15
58.198.0.0/15
58.200.0.0/13
59.64.0.0/14
59.68.0.0/14
59.72.0.0/15
59.74.0.0/15
59.76.0.0/16
59.77.0.0/16
59.78.0.0/15
101.4.0.0/14 101.4.0.0/14
101.76.0.0/15 101.76.0.0/15
103.31.48.0/22
103.81.200.0/22 103.81.200.0/22
103.87.20.0/22
103.115.120.0/22 103.115.120.0/22
103.137.60.0/24 103.137.60.0/24
103.165.110.0/23 103.165.110.0/23
103.205.162.0/24 103.252.172.0/22
103.226.80.0/22
110.64.0.0/15 110.64.0.0/15
111.114.0.0/15 111.114.0.0/15
111.116.0.0/15 111.116.0.0/15
@@ -41,23 +31,24 @@
115.158.0.0/16 115.158.0.0/16
116.13.0.0/16 116.13.0.0/16
116.56.0.0/15 116.56.0.0/15
116.255.128.0/24
118.202.0.0/15 118.202.0.0/15
118.228.0.0/15 118.228.0.0/15
118.230.0.0/16 118.230.0.0/16
120.94.0.0/16 120.94.0.0/15
120.95.0.0/16
121.48.0.0/15 121.48.0.0/15
121.52.160.0/19 121.52.160.0/19
121.192.0.0/16 121.192.0.0/14
121.193.0.0/16
121.194.0.0/15
121.248.0.0/14 121.248.0.0/14
122.204.0.0/14 122.204.0.0/14
125.216.0.0/15 125.216.0.0/13
125.218.0.0/16 162.105.0.0/16
125.219.0.0/16 166.111.0.0/16
125.220.0.0/15 168.160.0.0/17
125.222.0.0/15 168.160.152.0/24
168.160.158.0/23
168.160.160.0/21
168.160.168.0/24
175.185.0.0/16 175.185.0.0/16
175.186.0.0/15 175.186.0.0/15
180.84.0.0/15 180.84.0.0/15
@@ -66,106 +57,33 @@
183.168.0.0/15 183.168.0.0/15
183.170.0.0/16 183.170.0.0/16
183.172.0.0/14 183.172.0.0/14
192.124.154.0/24
202.4.128.0/19 202.4.128.0/19
202.38.2.0/23 202.38.2.0/23
202.38.64.0/19 202.38.64.0/18
202.38.96.0/19 202.38.135.0/24
202.38.140.0/23 202.38.140.0/23
202.38.146.0/23
202.38.184.0/21 202.38.184.0/21
202.38.192.0/18 202.38.192.0/18
202.112.0.0/16 202.106.125.0/24
202.113.0.0/20 202.106.126.0/24
202.113.16.0/20 202.112.0.0/13
202.113.32.0/19 202.120.0.0/15
202.113.64.0/18
202.113.128.0/18
202.113.192.0/19
202.113.224.0/20
202.113.240.0/20
202.114.0.0/19
202.114.32.0/19
202.114.64.0/18
202.114.128.0/17
202.115.0.0/19
202.115.128.0/17
202.116.0.0/19
202.116.32.0/20
202.116.48.0/20
202.116.64.0/19
202.116.96.0/19
202.116.128.0/17
202.117.0.0/18
202.117.64.0/18
202.117.128.0/17
202.118.0.0/19
202.118.32.0/19
202.118.64.0/18
202.118.128.0/17
202.119.0.0/19
202.119.32.0/19
202.119.64.0/20
202.119.80.0/20
202.119.96.0/19
202.119.128.0/17
202.120.0.0/18
202.120.64.0/18
202.120.128.0/17
202.121.0.0/16
202.127.216.0/21
202.127.224.0/19 202.127.224.0/19
202.179.240.0/20 202.179.240.0/20
202.192.0.0/13 202.192.0.0/12
202.200.0.0/14
202.204.0.0/14
203.91.120.0/21 203.91.120.0/21
210.25.0.0/16 210.25.0.0/16
210.26.0.0/15 210.26.0.0/15
210.28.0.0/14 210.28.0.0/14
210.32.0.0/14 210.32.0.0/12
210.36.0.0/14 211.64.0.0/13
210.40.0.0/13 211.80.0.0/13
211.64.0.0/14 218.192.0.0/13
211.68.0.0/15 219.216.0.0/13
211.70.0.0/15 219.224.0.0/13
211.80.0.0/16
211.81.0.0/16
211.82.0.0/16
211.83.0.0/16
211.84.0.0/15
211.86.0.0/15
218.192.0.0/16
218.193.0.0/16
218.194.0.0/16
218.195.0.0/16
218.196.0.0/14
219.216.0.0/15
219.218.0.0/15
219.220.0.0/16
219.221.0.0/16
219.222.0.0/15
219.224.0.0/15
219.226.0.0/16
219.227.0.0/16
219.228.0.0/15
219.230.0.0/15
219.242.0.0/15 219.242.0.0/15
219.244.0.0/14 219.244.0.0/14
222.16.0.0/15 222.16.0.0/12
222.18.0.0/15 222.192.0.0/12
222.20.0.0/15
222.22.0.0/16
222.23.0.0/16
222.24.0.0/15
222.26.0.0/15
222.28.0.0/14
222.192.0.0/14
222.196.0.0/15
222.198.0.0/16
222.199.0.0/16
222.200.0.0/14
222.204.0.0/15
222.206.0.0/15
223.2.0.0/15 223.2.0.0/15
223.128.0.0/15 223.128.0.0/15
@@ -0,0 +1,24 @@
45.253.60.0/22
103.1.20.0/22
103.1.168.0/22
103.89.184.0/21
103.89.192.0/19
103.89.224.0/21
103.222.184.0/22
111.31.196.0/24
111.31.239.0/24
117.124.237.0/24
117.126.0.0/16
163.61.202.0/23
182.51.114.0/23
182.51.116.0/23
182.51.118.0/24
182.51.122.0/23
182.51.124.0/24
202.143.100.0/22
211.89.230.0/23
211.146.0.0/19
211.146.32.0/21
211.148.160.0/19
211.156.128.0/19
221.129.0.0/16
File diff suppressed because it is too large. Load diff
@@ -1,55 +1,319 @@
27.0.160.0/22
36.128.0.0/10 36.128.0.0/10
36.192.0.0/16
36.206.0.0/16
36.212.0.0/15
36.214.0.0/16
36.221.0.0/17
39.128.0.0/10 39.128.0.0/10
43.239.172.0/22 42.62.0.0/17
42.157.198.0/23
43.193.65.0/24
43.196.232.0/22
43.226.236.0/24
43.228.116.0/22
43.231.32.0/22
43.239.172.0/23
43.240.72.0/23
43.241.49.0/24
43.241.50.0/24
43.243.12.0/22
43.243.128.0/22
43.247.88.0/22
43.248.96.0/21
43.248.116.0/22
43.248.128.0/20
43.248.184.0/21
43.248.196.0/22
43.248.200.0/21
43.251.244.0/22 43.251.244.0/22
45.121.68.0/22 43.254.88.0/22
45.121.72.0/22 43.255.84.0/24
45.121.172.0/22 43.255.228.0/22
45.121.176.0/22 45.113.20.0/22
45.122.96.0/21 45.113.200.0/22
45.123.152.0/22 45.117.8.0/22
45.124.36.0/22 45.119.64.0/22
45.125.24.0/22 45.120.100.0/22
45.253.72.0/22 45.125.25.0/24
61.14.240.0/22 45.248.8.0/22
61.14.244.0/22 45.248.204.0/22
45.250.28.0/22
45.250.40.0/22
45.251.96.0/22
52.82.164.0/22
52.82.184.0/23
52.82.188.0/23
52.82.190.0/24
54.222.46.0/23
54.222.48.0/21
54.222.65.0/24
54.222.89.0/24
54.222.96.0/23
54.222.100.0/22
54.222.104.0/21
54.222.112.0/22
54.222.116.0/23
58.67.192.0/19
58.83.0.0/17
58.83.160.0/23
58.83.176.0/23
58.83.192.0/18
59.151.0.0/19
59.151.64.0/18
59.191.0.0/17
61.232.0.0/14
61.237.0.0/16
69.235.184.0/21
101.36.128.0/17
101.125.130.0/24
101.144.0.0/12
101.251.192.0/21
101.251.200.0/22
101.251.224.0/20
101.251.240.0/21
101.251.248.0/22
103.1.10.0/23
103.3.128.0/22
103.8.220.0/22
103.19.232.0/22
103.20.112.0/22 103.20.112.0/22
103.21.176.0/22 103.21.176.0/22
103.35.104.0/22 103.35.104.0/22
103.61.156.0/22 103.37.47.0/24
103.61.160.0/22 103.37.72.0/24
103.62.24.0/22 103.40.12.0/22
103.62.204.0/22 103.40.192.0/23
103.62.208.0/22 103.45.162.0/23
103.46.170.0/23
103.52.176.0/23
103.53.124.0/22
103.59.116.0/22
103.60.164.0/22
103.78.228.0/22
103.82.224.0/22
103.83.72.0/22
103.84.170.0/23
103.85.84.0/22
103.85.172.0/22
103.85.177.0/24
103.85.178.0/23
103.87.180.0/22
103.95.68.0/22
103.101.180.0/22
103.110.132.0/22
103.130.160.0/23
103.143.228.0/23
103.152.29.0/24
103.192.0.0/22 103.192.0.0/22
103.192.144.0/22 103.205.252.0/22
103.193.140.0/22 103.208.12.0/22
103.203.164.0/22 103.213.96.0/22
103.205.108.0/22 103.215.36.0/22
103.205.116.0/22 103.216.4.0/22
103.222.196.0/22 103.216.152.0/22
103.219.24.0/21
103.219.32.0/21
103.220.60.0/22
103.229.212.0/22
103.230.236.0/23
103.232.166.0/23
103.233.52.0/22
103.238.132.0/22
103.239.152.0/22
103.239.204.0/22
103.239.244.0/23
103.239.247.0/24
103.252.36.0/22
103.253.232.0/22
106.3.144.0/21
106.13.252.0/22
106.75.0.0/17
110.42.0.0/21
110.42.8.0/22
110.42.12.0/23
110.42.14.0/24
110.56.0.0/13
110.96.0.0/16
110.100.0.0/16
110.112.0.0/15
110.114.0.0/16
110.115.128.0/17
110.116.0.0/16
110.120.0.0/16
110.172.200.0/21
110.199.0.0/16
110.203.0.0/23
110.211.0.0/16
110.218.0.0/15
110.236.0.0/15
111.0.0.0/10 111.0.0.0/10
111.132.0.0/16
111.148.0.0/16
111.149.0.0/24
111.223.12.0/22
112.0.0.0/10 112.0.0.0/10
113.18.0.0/16
114.112.80.0/20
114.118.104.0/21
114.118.112.0/20
115.180.0.0/17
116.85.16.0/22
116.242.224.0/19
117.48.0.0/18
117.48.64.0/19
117.48.144.0/20
117.48.193.0/24
117.48.194.0/24
117.48.219.0/24
117.48.232.0/22
117.50.0.0/17
117.128.0.0/10 117.128.0.0/10
118.26.197.0/24
118.26.198.0/23
118.26.200.0/21
118.26.224.0/20
118.30.0.0/16
118.193.127.0/24
118.195.0.0/17
118.204.0.0/17
119.44.205.0/24
119.161.183.0/24
120.132.0.0/19
120.132.96.0/20
120.132.116.0/24
120.132.120.0/21
120.132.128.0/19
120.132.176.0/20
120.132.192.0/23
120.132.208.0/20
120.132.224.0/19
120.133.0.0/19
120.133.48.0/20
120.133.96.0/19
120.133.224.0/22
120.192.0.0/10 120.192.0.0/10
175.176.188.0/22 121.46.16.0/20
121.46.192.0/22
121.70.0.0/17
121.255.0.0/16
122.14.192.0/18
122.70.0.0/15
122.72.3.0/24
122.72.16.0/24
122.72.38.0/24
122.72.112.0/24
122.94.0.0/16
123.58.0.0/20
123.61.0.0/16
123.64.0.0/15
123.66.0.0/16
123.77.0.0/16
123.88.0.0/15
123.90.0.0/16
123.99.192.0/20
123.103.14.0/24
124.201.0.0/17
124.243.192.0/18
124.250.16.0/20
124.250.61.0/24
124.250.120.0/23
124.250.128.0/17
124.251.0.0/19
124.251.56.0/22
124.251.96.0/23
124.251.126.0/23
124.251.128.0/17
125.254.128.0/19
125.254.160.0/21
125.254.176.0/21
125.254.184.0/22
125.254.188.0/23
125.254.190.0/24
139.159.32.0/20
139.220.128.0/17
140.179.224.0/19
140.210.16.0/20
140.210.64.0/19
157.15.104.0/23
157.20.246.0/23
157.66.164.0/23
160.19.76.0/23
160.202.212.0/22
161.207.18.0/23
167.189.0.0/16
180.188.16.0/21
182.50.112.0/20
182.157.0.0/16
182.175.244.0/22
183.84.4.0/22
183.192.0.0/10 183.192.0.0/10
192.140.209.0/24
192.140.210.0/23
192.140.212.0/22
202.46.224.0/22
202.123.120.0/22
202.141.176.0/20
203.76.240.0/22
203.130.32.0/22
203.135.104.0/21
203.196.0.0/22
203.196.4.0/24
203.212.12.0/22
211.98.0.0/16
211.99.117.0/24
211.99.118.0/23
211.99.120.0/23
211.99.160.0/22
211.99.188.0/22
211.99.216.0/24
211.103.0.0/17 211.103.0.0/17
211.136.0.0/14 211.136.0.0/13
211.140.0.0/15 211.144.159.0/24
211.142.0.0/17 211.151.4.0/23
211.142.128.0/17 211.151.32.0/19
211.143.0.0/16 211.151.64.0/18
218.200.0.0/14 211.151.128.0/17
218.204.0.0/15 211.152.0.0/19
218.206.0.0/15 211.155.236.0/24
218.98.96.0/23
218.98.98.0/24
218.98.100.0/24
218.98.111.0/24
218.98.112.0/23
218.200.0.0/13
218.245.0.0/21
219.83.160.0/21
221.122.0.0/19
221.122.32.0/20
221.122.128.0/17
221.123.128.0/18
221.130.0.0/15 221.130.0.0/15
221.172.0.0/16
221.174.0.0/16
221.176.0.0/13 221.176.0.0/13
223.64.0.0/11 222.35.0.0/16
223.96.0.0/12 222.42.115.0/24
223.112.0.0/14 222.44.0.0/15
223.116.0.0/15 222.49.128.0/17
223.120.128.0/17 222.50.0.0/16
223.121.128.0/17 222.59.128.0/17
223.122.0.0/15 223.64.0.0/10
223.124.0.0/14 223.160.0.0/20
223.160.16.0/21
223.160.112.0/20
223.160.128.0/22
223.160.134.0/23
223.160.136.0/21
223.160.144.0/20
223.160.160.0/19
223.160.192.0/19
223.160.224.0/21
223.160.232.0/22
223.160.236.0/23
223.161.194.0/23
223.161.196.0/22
223.161.200.0/21
223.161.208.0/20
223.161.224.0/19
223.223.192.0/20
@@ -1,16 +0,0 @@
36.192.0.0/11
43.247.240.0/22
61.232.0.0/14
61.236.0.0/15
101.144.0.0/12
103.3.128.0/22
110.96.0.0/11
110.192.0.0/11
115.180.0.0/15
118.204.0.0/14
120.90.0.0/15
122.64.0.0/11
123.64.0.0/11
211.98.0.0/16
221.172.0.0/14
222.32.0.0/11
File diff suppressed because it is too large. Load diff
@@ -1,290 +1,69 @@
1.94.0.0/15 60.195.252.0/22
14.1.24.0/22 103.155.76.0/23
14.103.0.0/16 103.235.144.0/24
14.196.0.0/15 113.48.48.0/20
42.196.0.0/14 113.48.224.0/20
43.242.56.0/22 113.49.16.0/20
43.242.144.0/22 113.50.0.0/20
43.243.144.0/22 113.50.32.0/24
43.243.148.0/22 113.50.48.0/20
43.247.200.0/22 113.50.64.0/20
43.247.204.0/22 115.182.0.0/19
43.247.208.0/22 115.182.32.0/22
43.247.224.0/22 115.182.40.0/21
43.250.16.0/22 115.182.48.0/20
43.250.20.0/22 115.182.64.0/18
45.121.240.0/22 115.182.128.0/19
45.121.244.0/22 115.182.160.0/20
45.121.248.0/22 115.182.192.0/22
45.121.252.0/22 115.182.200.0/21
45.122.4.0/22 115.182.208.0/20
45.122.8.0/22 115.182.224.0/20
45.122.12.0/22 118.64.0.0/21
45.122.16.0/22 118.64.248.0/21
45.122.20.0/22 118.65.0.0/21
45.122.24.0/22 118.66.184.0/24
45.122.28.0/22 118.66.224.0/20
45.122.32.0/22 118.144.64.0/21
45.122.36.0/22 118.144.72.0/22
45.122.40.0/22 118.144.77.0/24
45.122.192.0/22 118.144.78.0/24
45.122.196.0/22 118.144.80.0/20
45.122.200.0/22 118.145.0.0/19
45.122.204.0/22 118.244.192.0/22
45.122.208.0/22 118.244.196.0/24
45.122.212.0/22 118.244.202.0/23
45.122.216.0/22 118.244.205.0/24
45.123.28.0/22 118.244.206.0/23
45.123.32.0/22 118.244.208.0/20
45.123.36.0/22 118.244.224.0/20
45.123.76.0/22 121.39.255.0/24
45.123.80.0/22 122.49.16.0/20
45.123.84.0/22 122.49.32.0/20
45.123.88.0/22 123.196.112.0/20
45.123.204.0/22 124.14.5.0/24
45.123.212.0/22 124.14.8.0/24
45.123.224.0/22 124.14.12.0/23
45.123.228.0/22 124.14.15.0/24
45.123.232.0/22 124.14.22.0/24
45.123.236.0/22 124.202.128.0/19
45.123.240.0/22 210.74.0.0/22
45.123.244.0/22 210.79.224.0/19
45.123.248.0/22 211.147.4.0/22
45.123.252.0/22 211.154.160.0/22
45.124.0.0/22 211.154.168.0/21
45.124.100.0/22 211.155.128.0/19
45.252.152.0/22 211.161.101.0/24
45.252.200.0/22 211.161.102.0/23
45.252.204.0/22 211.161.192.0/22
45.252.208.0/22 211.161.203.0/24
45.252.212.0/22 211.161.209.0/24
45.252.216.0/22 211.161.221.0/24
45.252.220.0/22 211.165.0.0/16
45.252.224.0/22 211.166.0.0/16
45.253.0.0/22 218.241.16.0/22
45.253.4.0/22 218.241.24.0/22
45.253.8.0/22 218.241.152.0/21
45.253.12.0/22 219.234.80.0/20
45.253.16.0/22 219.238.232.0/21
45.253.20.0/22 219.239.92.0/22
45.253.28.0/22
45.253.36.0/22
45.253.40.0/22
45.253.56.0/22
45.253.76.0/22
45.253.80.0/22
45.253.84.0/22
45.253.92.0/22
45.254.28.0/22
45.254.56.0/22
45.254.96.0/22
45.254.132.0/22
45.254.152.0/22
45.254.180.0/22
45.254.200.0/22
45.254.204.0/22
45.254.208.0/22
45.254.212.0/22
45.254.216.0/22
45.254.220.0/22
45.254.224.0/22
45.254.228.0/22
49.220.0.0/14
59.152.16.0/22
59.152.20.0/22
59.152.24.0/22
59.152.28.0/22
59.152.64.0/22
59.152.68.0/22
59.152.72.0/22
59.152.76.0/22
59.152.112.0/22
59.152.116.0/22
60.194.0.0/15
60.206.0.0/15
61.14.212.0/22
61.14.216.0/22
61.14.220.0/22
101.38.0.0/15
101.40.0.0/15
101.104.0.0/14
101.130.0.0/15
103.23.56.0/22
103.24.184.0/22
103.38.0.0/22
103.38.228.0/22
103.38.232.0/22
103.41.148.0/22
103.41.152.0/22
103.62.72.0/22
103.62.76.0/22
103.62.80.0/22
103.62.84.0/22
103.62.96.0/22
103.62.100.0/22
103.62.104.0/22
103.62.108.0/22
103.62.112.0/22
103.62.116.0/22
103.62.120.0/22
103.62.124.0/22
103.62.128.0/22
103.62.132.0/22
103.63.64.0/22
103.63.68.0/22
103.63.72.0/22
103.63.76.0/22
103.63.80.0/22
103.63.84.0/22
103.63.88.0/22
103.63.140.0/22
103.63.144.0/22
103.63.152.0/22
103.63.196.0/22
103.63.200.0/22
103.63.204.0/22
103.63.208.0/22
103.192.48.0/22
103.192.52.0/22
103.192.56.0/22
103.192.84.0/22
103.192.88.0/22
103.192.92.0/22
103.192.96.0/22
103.192.100.0/22
103.192.104.0/22
103.192.108.0/22
103.192.112.0/22
103.192.216.0/22
103.202.152.0/22
103.202.156.0/22
103.202.160.0/22
103.202.164.0/22
103.202.168.0/22
103.202.172.0/22
103.202.176.0/22
103.202.180.0/22
103.202.184.0/22
103.202.188.0/22
103.202.192.0/22
103.202.196.0/22
103.202.200.0/21
103.202.228.0/22
103.202.236.0/22
103.202.240.0/22
103.202.244.0/22
103.202.248.0/22
103.202.252.0/22
103.203.0.0/22
103.203.4.0/22
103.203.8.0/22
103.203.12.0/22
103.203.16.0/22
103.203.20.0/22
103.203.24.0/22
103.203.28.0/22
103.203.32.0/22
103.203.104.0/22
103.203.108.0/22
103.203.112.0/22
103.203.116.0/22
103.203.120.0/22
103.203.124.0/22
103.203.128.0/22
103.204.88.0/22
103.204.112.0/22
103.204.148.0/22
103.204.152.0/22
103.221.88.0/22
103.221.132.0/22
103.221.156.0/22
103.221.180.0/22
103.221.184.0/22
103.221.188.0/22
103.221.192.0/22
103.221.196.0/22
103.222.0.0/22
103.222.4.0/22
103.222.8.0/22
103.222.12.0/22
103.222.16.0/22
103.222.24.0/22
103.222.28.0/22
103.222.36.0/22
103.222.44.0/22
103.222.48.0/22
103.222.56.0/22
103.222.60.0/22
103.222.64.0/22
103.222.68.0/22
103.222.72.0/22
103.222.76.0/22
103.222.80.0/22
103.222.84.0/22
103.222.88.0/22
103.222.92.0/22
103.222.96.0/22
103.222.100.0/22
103.222.104.0/22
103.222.108.0/22
103.222.200.0/22
103.222.204.0/22
103.222.208.0/22
103.222.212.0/22
103.238.20.0/22
103.238.24.0/22
103.238.40.0/22
115.31.72.0/22
115.31.76.0/22
115.47.0.0/16
115.182.0.0/16
115.183.0.0/16
115.187.0.0/22
115.187.4.0/22
115.187.8.0/22
115.187.12.0/22
115.190.0.0/15
116.199.128.0/19
117.58.0.0/17
117.120.64.0/18
118.28.0.0/15
124.14.0.0/15
124.192.0.0/15
124.200.0.0/13
124.254.0.0/18
175.188.0.0/14
180.88.0.0/14
180.235.112.0/22
202.4.252.0/22
202.160.156.0/22
202.168.136.0/22
202.168.140.0/22
203.78.156.0/22
203.82.112.0/22
203.82.116.0/22
203.82.120.0/22
203.82.124.0/22
203.82.224.0/22
203.82.228.0/22
203.82.232.0/22
203.82.236.0/22
203.86.64.0/20
203.114.80.0/22
203.114.84.0/22
203.114.88.0/22
203.114.92.0/22
203.207.92.0/22
203.207.112.0/20
203.207.192.0/21
203.207.208.0/20
211.101.0.0/18
211.103.128.0/17
211.164.0.0/14
218.249.0.0/16
219.90.68.0/22
219.90.72.0/22
219.90.76.0/22
219.238.0.0/15
220.112.0.0/14
223.208.0.0/14
223.255.0.0/17
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,17 +0,0 @@
module("luci.controller.nps",package.seeall)
function index()
if not nixio.fs.access("/etc/config/nps") then
return
end
entry({"admin", "services", "nps"}, cbi("nps"), _("Nps Penetrate"), 100).dependent = true
entry({"admin", "services", "nps", "status"}, call("act_status")).leaf = true
end
function act_status()
local e = {}
e.running = luci.sys.call("pgrep npc > /dev/null") == 0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
@@ -1,54 +0,0 @@
m = Map("nps")
m.title = translate("Nps Penetrate")
m.description = translate("Nps is a fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.")
m:section(SimpleSection).template = "nps/nps_status"
s = m:section(TypedSection, "nps")
s.addremove = false
s.anonymous = true
enable = s:option(Flag, "enabled", translate("Enable"))
enable.rmempty = false
server = s:option(Value, "server_addr", translate("Server"))
server.description = translate("Must an IPv4 address")
server.datatype = "ipaddr"
server.optional = false
server.rmempty = false
port = s:option(Value, "server_port", translate("Port"))
port.datatype = "port"
port.default = "8024"
port.optional = false
port.rmempty = false
protocol = s:option(ListValue, "protocol", translate("Protocol Type"))
protocol:value("tcp", translate("TCP Protocol"))
protocol:value("kcp", translate("KCP Protocol"))
protocol.default = "tcp"
vkey = s:option(Value, "vkey", translate("vkey"))
vkey.optional = false
vkey.password = true
vkey.rmempty = false
compress = s:option(Flag, "compress", translate("Enable Compression"))
compress.description = translate("The contents will be compressed to speed up the traffic forwarding speed, but this will consume some additional cpu resources.")
compress.default = "1"
compress.rmempty = false
crypt = s:option(Flag, "crypt", translate("Enable Encryption"))
crypt.description = translate("Encrypted the communication between Npc and Nps, will effectively prevent the traffic intercepted.")
crypt.default = "1"
crypt.rmempty = false
log_level = s:option(ListValue, "log_level", translate("Log Level"))
log_level:value("0", "Emergency")
log_level:value("2", "Critical")
log_level:value("3", "Error")
log_level:value("4", "Warning")
log_level:value("7", "Debug")
log_level.default = "3"
return m
@@ -1,22 +0,0 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(3, '<%=url([[admin]], [[services]], [[nps]], [[status]])%>', null,
function(x, data) {
var tb = document.getElementById('nps_status');
if (data && tb) {
if (data.running) {
var links = "<em><b><font color=green>Nps <%:RUNNING%></font></b></em>";
tb.innerHTML = links;
} else {
tb.innerHTML = "<em><b><font color=red>Nps <%:NOT RUNNING%></font></b></em>";
}
}
}
);
//]]>
</script>
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
<fieldset class="cbi-section">
<p id="nps_status">
<em><%:Collecting data...%></em>
</p>
</fieldset>
@@ -1,47 +0,0 @@
msgid "Nps Penetrate"
msgstr "Nps 内网穿透"
msgid "Nps is a fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet."
msgstr "Nps 是一种快速反向代理,可帮助您将 NAT 或防火墙后面的本地服务器公开到 Internet。"
msgid "Must an IPv4 address"
msgstr "必须是 IPv4 地址"
msgid "vkey"
msgstr "密钥(vkey)"
msgid "Enable Compression"
msgstr "使用压缩传输"
msgid "Enable Encryption"
msgstr "使用加密传输"
msgid "The contents will be compressed to speed up the traffic forwarding speed, but this will consume some additional cpu resources."
msgstr "压缩传输内容,加快流量转发速度,会额外消耗 CPU 资源。"
msgid "Encrypted the communication between Npc and Nps, will effectively prevent the traffic intercepted."
msgstr "加密传输 npc 与 nps 之间的通信内容,会有效防止流量被拦截。"
msgid "RUNNING"
msgstr "运行中"
msgid "NOT RUNNING"
msgstr "未运行"
msgid "Basic Setting"
msgstr "基本设置"
msgid "Protocol Type"
msgstr "协议类型"
msgid "Server"
msgstr "服务端地址"
msgid "TCP Protocol"
msgstr "TCP"
msgid "KCP Protocol"
msgstr "KCP"
msgid "Log Level"
msgstr "日志级别"
-1
View File
@@ -1 +0,0 @@
zh-cn
@@ -1,11 +0,0 @@
config nps
option enabled '0'
option server_addr '1.1.1.1'
option server_port '8024'
option protocol 'tcp'
option compress '1'
option crypt '1'
option vkey 'aaa'
option log_level '4'
@@ -1,68 +0,0 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org
START=50
USE_PROCD=1
LOGFILE="/tmp/nps.log"
tmpconf="/tmp/etc/nps.conf"
nps_header() {
local enabled server_addr server_port protocol vkey compress crypt log_level
config_get enabled $1 enabled
config_get server_addr $1 server_addr
config_get server_port $1 server_port
config_get protocol $1 protocol
config_get vkey $1 vkey
config_get compress $1 compress
config_get crypt $1 crypt
config_get log_level $1 log_level
[ -f $tmpconf ] && rm $tmpconf
echo "[common]" >$tmpconf
echo "server_addr=${server_addr}:${server_port}" >>$tmpconf
echo "conn_type=${protocol}" >>$tmpconf
echo "vkey=${vkey}" >>$tmpconf
echo "auto_reconnection=true" >>$tmpconf
nps_write_bool compress $1
nps_write_bool crypt $1
Log_level=$log_level
Enabled=$enabled
}
nps_write_bool() {
local opt="$1"
local config="$2"
local val
config_get_bool val $config "$opt"
if [ "$val" -eq 0 ]; then
echo "${opt}=false" >> $tmpconf
else
echo "${opt}=true" >> $tmpconf
fi
}
start_service() {
config_load nps
config_foreach nps_header nps
if [ "$Enabled" = "1" ];then
logger -t FRPC 'Starting Nps service'
procd_open_instance
procd_set_param command /usr/bin/npc -config=$tmpconf -log_level=$Log_level -log_path=$LOGFILE
#procd_set_param file $tmpconf
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
fi
}
service_triggers() {
procd_add_reload_trigger "nps"
}
@@ -1,11 +0,0 @@
{
"luci-app-nps": {
"description": "Grant UCI access for luci-app-nps",
"read": {
"uci": [ "nps" ]
},
"write": {
"uci": [ "nps" ]
}
}
}
@@ -1,4 +0,0 @@
{
"config": "nps",
"init": "nps"
}
Loaded 100 of 1529 files, more files were not shown because too many files have changed in this diff. Show more