From 48cfb8b7cb09ed9cd474824c2615a8ce8cee2bae Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Tue, 10 Mar 2020 22:36:42 +0800 Subject: [PATCH] OpenClash: bump to v0.36.9-beta --- package/ctcgfw/luci-app-openclash/Makefile | 4 +- .../files/etc/config/openclash | 1 + .../files/etc/init.d/openclash | 117 +++++++++----- .../files/etc/openclash/openclash_version | 4 +- .../usr/lib/lua/luci/controller/openclash.lua | 19 --- .../lua/luci/model/cbi/openclash/client.lua | 4 +- .../lua/luci/model/cbi/openclash/config.lua | 6 +- .../model/cbi/openclash/game-settings.lua | 18 ++- .../lua/luci/model/cbi/openclash/settings.lua | 8 + .../lib/lua/luci/view/openclash/developer.htm | 43 ++--- .../lib/lua/luci/view/openclash/status.htm | 14 +- .../usr/share/openclash/dashboard/index.html | 4 +- .../js/1.bundle.f302eae39f433a9c3fa1.min.js | 2 - .../js/1.bundle.f42e08fe49cdc3329278.min.js | 2 + ...e.f42e08fe49cdc3329278.min.js.LICENSE.txt} | 21 +-- .../js/bundle.f302eae39f433a9c3fa1.min.js | 1 - .../js/bundle.f42e08fe49cdc3329278.min.js | 1 + ...3fa1.css => main.f42e08fe49cdc3329278.css} | 0 .../files/usr/share/openclash/openclash.sh | 147 +++++++++++++----- .../usr/share/openclash/openclash_rule.sh | 8 +- .../usr/share/openclash/yml_groups_get.sh | 13 +- .../share/openclash/yml_groups_name_get.sh | 82 ++++++---- .../usr/share/openclash/yml_proxys_get.sh | 10 +- .../usr/share/openclash/yml_proxys_set.sh | 2 +- .../i18n/zh_Hans/openclash.zh-cn.po | 5 +- 25 files changed, 321 insertions(+), 215 deletions(-) delete mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/1.bundle.f42e08fe49cdc3329278.min.js rename package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/{1.bundle.f302eae39f433a9c3fa1.min.js.LICENSE.txt => 1.bundle.f42e08fe49cdc3329278.min.js.LICENSE.txt} (54%) delete mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/bundle.f302eae39f433a9c3fa1.min.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/bundle.f42e08fe49cdc3329278.min.js rename package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/{main.f302eae39f433a9c3fa1.css => main.f42e08fe49cdc3329278.css} (100%) diff --git a/package/ctcgfw/luci-app-openclash/Makefile b/package/ctcgfw/luci-app-openclash/Makefile index e9d5008b8e..035928de84 100644 --- a/package/ctcgfw/luci-app-openclash/Makefile +++ b/package/ctcgfw/luci-app-openclash/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-openclash -PKG_VERSION:=0.36.7 +PKG_VERSION:=0.36.9 PKG_RELEASE:=beta PKG_MAINTAINER:=vernesong @@ -14,7 +14,7 @@ define Package/$(PKG_NAME) SUBMENU:=3. Applications TITLE:=LuCI support for clash PKGARCH:=all - DEPENDS:=+iptables +dnsmasq-full +coreutils +coreutils-nohup +bash +curl +jsonfilter +ca-certificates + DEPENDS:=+iptables +dnsmasq-full +coreutils +coreutils-nohup +bash +curl +jsonfilter +ca-certificates +ipset +ip-full +iptables-mod-tproxy MAINTAINER:=vernesong endef diff --git a/package/ctcgfw/luci-app-openclash/files/etc/config/openclash b/package/ctcgfw/luci-app-openclash/files/etc/config/openclash index 200d01265a..639b41cdbf 100644 --- a/package/ctcgfw/luci-app-openclash/files/etc/config/openclash +++ b/package/ctcgfw/luci-app-openclash/files/etc/config/openclash @@ -23,6 +23,7 @@ config openclash 'config' option log_level 'silent' option proxy_mode 'Rule' option intranet_allowed '0' + option enable_udp_proxy '0' config dns_servers option group 'nameserver' diff --git a/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash b/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash index 9c8e564e12..7b8f12c2c0 100755 --- a/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash +++ b/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash @@ -105,42 +105,58 @@ yml_check() #检查关键字避免后续操作出错 #proxies - sed -i "/^ \{0,\}\'Proxy\':/c\Proxy:" "$3" 2>/dev/null - sed -i '/^ \{0,\}\"Proxy\":/c\Proxy:' "$3" 2>/dev/null - sed -i "/^ \{1,\}Proxy:/c\Proxy:" "$3" 2>/dev/null - [ -z "$(grep "^Proxy:" "$CFG_FILE")" ] && { - sed -i "s/^\'proxies\':/Proxy:/" "$CFG_FILE" 2>/dev/null - sed -i 's/^\"proxies\":/Proxy:/' "$CFG_FILE" 2>/dev/null - sed -i "s/^proxies:/Proxy:/" "$CFG_FILE" 2>/dev/null + [ ! -z "$(grep "^ \{0,\}\'Proxy\':" "$3")" ] || [ ! -z "$(grep '^ \{0,\}\"Proxy\":' "$3")" ] || [ ! -z "$(grep '^ \{1,\}Proxy:' "$3")" ] && { + sed -i "/^ \{0,\}\'Proxy\':/c\Proxy:" "$3" 2>/dev/null + sed -i '/^ \{0,\}\"Proxy\":/c\Proxy:' "$3" 2>/dev/null + sed -i "/^ \{1,\}Proxy:/c\Proxy:" "$3" 2>/dev/null + } + [ -z "$(grep "^Proxy:" "$3")" ] && { + sed -i "s/^\'proxies\':/Proxy:/" "$3" 2>/dev/null + sed -i 's/^\"proxies\":/Proxy:/' "$3" 2>/dev/null + sed -i "s/^proxies:/Proxy:/" "$3" 2>/dev/null } #proxy-providers - sed -i "/^ \{0,\}\'proxy-provider\':/c\proxy-provider:" "$3" 2>/dev/null - sed -i '/^ \{0,\}\"proxy-provider\":/c\proxy-provider:' "$3" 2>/dev/null - sed -i "/^ \{1,\}proxy-provider:/c\proxy-provider:" "$3" 2>/dev/null - sed -i "/^ \{0,\}\'proxy-providers\':/c\proxy-provider:" "$3" 2>/dev/null - sed -i '/^ \{0,\}\"proxy-providers\":/c\proxy-provider:' "$3" 2>/dev/null - sed -i "/^ \{0,\}proxy-providers:/c\proxy-provider:" "$3" 2>/dev/null - + [ ! -z "$(grep "^ \{0,\}\'proxy-provider\':" "$3")" ] || [ ! -z "$(grep '^ \{0,\}\"proxy-provider\":' "$3")" ] || [ ! -z "$(grep '^ \{1,\}proxy-provider:' "$3")" ] && { + sed -i "/^ \{0,\}\'proxy-provider\':/c\proxy-provider:" "$3" 2>/dev/null + sed -i '/^ \{0,\}\"proxy-provider\":/c\proxy-provider:' "$3" 2>/dev/null + sed -i "/^ \{1,\}proxy-provider:/c\proxy-provider:" "$3" 2>/dev/null + } + [ -z "$(grep "^proxy-provider:" "$3")" ] && { + sed -i "/^ \{0,\}\'proxy-providers\':/c\proxy-provider:" "$3" 2>/dev/null + sed -i '/^ \{0,\}\"proxy-providers\":/c\proxy-provider:' "$3" 2>/dev/null + sed -i "/^ \{0,\}proxy-providers:/c\proxy-provider:" "$3" 2>/dev/null + } #proxy-groups - sed -i "/^ \{0,\}\'Proxy Group\':/c\Proxy Group:" "$3" 2>/dev/null - sed -i '/^ \{0,\}\"Proxy Group\":/c\Proxy Group:' "$3" 2>/dev/null - sed -i "/^ \{1,\}Proxy Group:/c\Proxy Group:" "$3" 2>/dev/null - sed -i "/^ \{0,\}\'proxy-groups\':/c\Proxy Group:" "$3" 2>/dev/null - sed -i '/^ \{0,\}\"proxy-groups\":/c\Proxy Group:' "$3" 2>/dev/null - sed -i "/^ \{0,\}proxy-groups:/c\Proxy Group:" "$3" 2>/dev/null - + [ ! -z "$(grep "^ \{0,\}\'Proxy Group\':" "$3")" ] || [ ! -z "$(grep '^ \{0,\}\"Proxy Group\":' "$3")" ] || [ ! -z "$(grep '^ \{1,\}Proxy Group:' "$3")" ] && { + sed -i "/^ \{0,\}\'Proxy Group\':/c\Proxy Group:" "$3" 2>/dev/null + sed -i '/^ \{0,\}\"Proxy Group\":/c\Proxy Group:' "$3" 2>/dev/null + sed -i "/^ \{1,\}Proxy Group:/c\Proxy Group:" "$3" 2>/dev/null + } + [ -z "$(grep "^Proxy Group:" "$3")" ] && { + sed -i "/^ \{0,\}\'proxy-groups\':/c\Proxy Group:" "$3" 2>/dev/null + sed -i '/^ \{0,\}\"proxy-groups\":/c\Proxy Group:' "$3" 2>/dev/null + sed -i "/^ \{0,\}proxy-groups:/c\Proxy Group:" "$3" 2>/dev/null + } + #rules - sed -i "/^ \{0,\}\'Rule\':/c\Rule:" "$3" 2>/dev/null - sed -i '/^ \{0,\}\"Rule\":/c\Rule:' "$3" 2>/dev/null - sed -i "/^ \{1,\}Rule:/c\Rule:" "$3" 2>/dev/null - sed -i "/^ \{0,\}\'rules\':/c\Rule:" "$3" 2>/dev/null - sed -i '/^ \{0,\}\"rules\":/c\Rule:' "$3" 2>/dev/null - sed -i "/^ \{0,\}rules:/c\Rule:" "$3" 2>/dev/null - - sed -i "/^ \{0,\}\'dns\':/c\dns:" "$3" 2>/dev/null - sed -i '/^ \{0,\}\"dns\":/c\dns:' "$3" 2>/dev/null - sed -i "/^ \{1,\}dns:/c\dns:" "$3" 2>/dev/null + [ ! -z "$(grep "^ \{0,\}\'Rule\':" "$3")" ] || [ ! -z "$(grep '^ \{0,\}\"Rule\":' "$3")" ] || [ ! -z "$(grep '^ \{1,\}Rule:' "$3")" ] && { + sed -i "/^ \{0,\}\'Rule\':/c\Rule:" "$3" 2>/dev/null + sed -i '/^ \{0,\}\"Rule\":/c\Rule:' "$3" 2>/dev/null + sed -i "/^ \{1,\}Rule:/c\Rule:" "$3" 2>/dev/null + } + [ -z "$(grep "^Rule:" "$3")" ] && { + sed -i "/^ \{0,\}\'rules\':/c\Rule:" "$3" 2>/dev/null + sed -i '/^ \{0,\}\"rules\":/c\Rule:' "$3" 2>/dev/null + sed -i "/^ \{0,\}rules:/c\Rule:" "$3" 2>/dev/null + } + + #dns + [ ! -z "$(grep "^ \{0,\}\'dns\':" "$3")" ] || [ ! -z "$(grep '^ \{0,\}\"dns\":' "$3")" ] || [ ! -z "$(grep '^ \{1,\}dns:' "$3")" ] && { + sed -i "/^ \{0,\}\'dns\':/c\dns:" "$3" 2>/dev/null + sed -i '/^ \{0,\}\"dns\":/c\dns:' "$3" 2>/dev/null + sed -i "/^ \{1,\}dns:/c\dns:" "$3" 2>/dev/null + } #创建启动备份 cp "$3" "$5" @@ -687,6 +703,7 @@ if [ "$enable" -eq 1 ] && [ -f "$CONFIG_FILE" ]; then log_level=$(uci get openclash.config.log_level 2>/dev/null) proxy_mode=$(uci get openclash.config.proxy_mode 2>/dev/null) intranet_allowed=$(uci get openclash.config.intranet_allowed 2>/dev/null) + enable_udp_proxy=$(uci get openclash.config.enable_udp_proxy 2>/dev/null) echo "第二步: 配置文件检查..." >$START_LOG yml_check "$en_mode" "$enable_custom_dns" "$CONFIG_FILE" "$BACKUP_FILE" "$START_BACKUP" @@ -752,7 +769,6 @@ mkdir -p /var/etc cat > "/var/etc/openclash.include" <<-EOF /etc/init.d/openclash restart EOF - iptables -t nat -I PREROUTING -p tcp --dport 53 -j ACCEPT if [ -z "$en_mode_tun" ]; then #tcp @@ -771,9 +787,12 @@ EOF done fi iptables -t nat -A openclash -p tcp -j REDIRECT --to-ports "$proxy_port" + iptables -t nat -I PREROUTING -p tcp -d 8.8.8.8 -j REDIRECT --to-ports "$proxy_port" + iptables -t nat -I PREROUTING -p tcp -d 8.8.4.4 -j REDIRECT --to-ports "$proxy_port" iptables -t nat -A PREROUTING -p tcp -j openclash #udp + if [ "$enable_udp_proxy" -eq 1 ]; then ip rule add fwmark 1 table 100 ip route add local default dev lo table 100 iptables -t mangle -N openclash @@ -793,26 +812,39 @@ EOF iptables -t mangle -A openclash -p udp -j TPROXY --on-port "$proxy_port" --tproxy-mark 1 iptables -t mangle -A PREROUTING -p udp -j openclash + fi if [ "$en_mode" = "fake-ip" ]; then iptables -t nat -A OUTPUT -p tcp -d 198.18.0.0/16 -j REDIRECT --to-ports "$proxy_port" - iptables -t mangle -A OUTPUT -p udp -d 198.18.0.0/16 -j MARK --set-mark 1 + if [ "$enable_udp_proxy" -eq 1 ]; then + iptables -t mangle -A OUTPUT -p udp -d 198.18.0.0/16 -j MARK --set-mark 1 + fi fi - + if [ "$ipv6_enable" -eq 1 ]; then + #tcp ip6tables -t nat -N openclash - ip6tables -t mangle -N openclash if [ ! -z "$lan_ip6" ]; then for lan_ip6s in $lan_ip6; do ip6tables -t nat -A openclash -d "$lan_ip6s" -j RETURN 2>/dev/null - ip6tables -t mangle -A openclash -d "$lan_ip6s" -j RETURN 2>/dev/null done fi ip6tables -t nat -A openclash -p tcp -j REDIRECT --to-ports "$proxy_port" ip6tables -t nat -A PREROUTING -p tcp -j openclash - ip6tables -t mangle -A openclash -p udp -j TPROXY --on-port "$proxy_port" --tproxy-mark 1 - ip6tables -t mangle -A PREROUTING -p udp -j openclash + #udp + if [ "$enable_udp_proxy" -eq 1 ]; then + ip6tables -t mangle -N openclash + if [ ! -z "$lan_ip6" ]; then + for lan_ip6s in $lan_ip6; do + if [ "$enable_udp_proxy" -eq 1 ]; then + ip6tables -t mangle -A openclash -d "$lan_ip6s" -j RETURN 2>/dev/null + fi + done + fi + ip6tables -t mangle -A openclash -p udp -j TPROXY --on-port "$proxy_port" --tproxy-mark 1 + ip6tables -t mangle -A PREROUTING -p udp -j openclash + fi fi else #TUN模式 @@ -853,6 +885,7 @@ EOF fi iptables -t mangle -I OUTPUT -j openclash iptables -t mangle -I PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" + iptables -t nat -I PREROUTING -p tcp --dport 53 -j ACCEPT #ipv6 #if [ "$ipv6_enable" -eq 1 ]; then #ip6tables -t mangle -I PREROUTING -j MARK --set-mark "$PROXY_FWMARK" @@ -966,6 +999,8 @@ stop() ip rule del fwmark 1 table 100 >/dev/null 2>&1 ip route del local default dev lo table 100 >/dev/null 2>&1 + + iptables -t nat -D PREROUTING -p tcp --dport 53 -j ACCEPT >/dev/null 2>&1 iptables -t mangle -F openclash >/dev/null 2>&1 iptables -t mangle -D PREROUTING -p udp -j openclash >/dev/null 2>&1 @@ -985,6 +1020,11 @@ stop() iptables -t nat -D OUTPUT "$out_line" >/dev/null 2>&1 done + out_lines=$(iptables -nvL PREROUTING -t nat |sed 1,2d |sed -n '/8.8./=' 2>/dev/null |sort -rn) + for out_line in $out_lines; do + iptables -t nat -D PREROUTING "$out_line" >/dev/null 2>&1 + done + #ipv6 ip6tables -t mangle -F openclash >/dev/null 2>&1 ip6tables -t mangle -D PREROUTING -p udp -j openclash >/dev/null 2>&1 @@ -1002,7 +1042,6 @@ stop() ip rule del fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" >/dev/null 2>&1 iptables -t mangle -D OUTPUT -j openclash >/dev/null 2>&1 - iptables -t nat -D PREROUTING -p tcp --dport 53 -j ACCEPT >/dev/null 2>&1 iptables -t mangle -D PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" >/dev/null 2>&1 ip6tables -t mangle -D PREROUTING -j MARK --set-mark "$PROXY_FWMARK" >/dev/null 2>&1 iptables -t mangle -F openclash >/dev/null 2>&1 diff --git a/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version b/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version index 820d39a44b..ac5e38a3b1 100644 --- a/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version +++ b/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version @@ -1,2 +1,2 @@ -v0.36.8-beta -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAAAqCAMAAAB2kksrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVGQkYwQjEzNjE0MDExRUFCNzI4RUQ0NzU0MTdCQUFFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVGQkYwQjE0NjE0MDExRUFCNzI4RUQ0NzU0MTdCQUFFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NUZCRjBCMTE2MTQwMTFFQUI3MjhFRDQ3NTQxN0JBQUUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NUZCRjBCMTI2MTQwMTFFQUI3MjhFRDQ3NTQxN0JBQUUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7ZA2oFAAADAFBMVEXR0dEkhbyEvN3R4uwreqcGVYJtbW09PT3B1eBFmsqEhIS6uroKaqFYpdIJdbSUxeEGXpFlnbyx0OI6lsoJeLiTu9KCgoKenp7a2tqlpaVTiqp4eHgkapLf3981dZpjlLHn5+c/Pz8GcKzGxsbR5vJ3t9uhoaEFXI6izOXOzs5paWkJca0FYJQGbak1h7WRkZFxcXG/v79GRkasrKy1tbWy1elmrdaDs86ixdkEU4DKyspzobtiYmIWaJcqjcYEWYkXgL2yzd0IYpVLS0tDQ0MXYo0JX4/g4OCLi4tkq9NGirGStcgJZJiyytl2dnbAwMCcnJzR3+gHdLHCwsJBQUFFgKKiwNJCQkIFaaImcJu2trYahMGXl5dFkb2DqsHw9feEtNBynrg3kcYchsNlZWUnicGNjY2jyN4JWIUFcrAZdatHnM0HZ50HbKWDrcWkzuavr6+hv9BgYGCDq8KUlJRWk7cGZJpJns7B2uiRuM8EYph0dHQJcKyJweIwk8tInM10sdVGhKdKns9DfqAFZZsRgsMCc7QBcrNRUVFUVFRVVVVSUlILfL1WVlYFdrcHeLkEdrYDdLUOgMAEdbYOf8ADdLQDdbUSg8NXV1cSg8QShMQThMUAcrIKe7wGd7gOf78Nfr8Nfr4Mfb4Mfb0IebkJeroJe7sJers6OjqqqqrU1NTV1dWrq6tISEipqak7Ozt+fn7w9/uAgIAHVoRJSUmBgYHC3u7q6urz8/NMTEz19fXh7/f09PR/f3+DvNzv9PfB3e2Gvt+Fvt6Hv9/g6u+CqcCErMLB3u6JiYmGv98FZ5/A1N8UXono6Ojg6vDB3e4IaJ+Evd0Lerng7vbW1tbC3+/D3+90s9gEVYMHWIcLdK9Gm8sFZ6AFa6ZVos8Zg78Lb6gGdbRInc6Dr8gFdLPv9vqDu9wKeLcEV4cvksujxNY2jsAId7fP5PGAudlTU1MPgMEQgcJZWVlaWlpfX19bW1tcXFxNTU1eXl5PT09QUFBYWFhdXV1OTk7////////izl8cAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADHBJREFUeNrsVwtUVGUeHzQYHCFQ0gEHhUESEQ29gDWKzxkFH+SCWL4ynycsXTUtTd22WnZXBGK3fbG7Ya0R8hpkAnknmvjEF5r5KLOstrbaZtd1AzF+7P/77p3h3kGMs3U8Z+b4O4f7/Z+//72/7869F1V7e83aYdddAX91Ajz/M0t7u6o9bst118BfnALPh7araka2uAj+7Bx43qJa6yqSt/zJSfAz1cjvXAW/dBL8Q/XdXc3vNFxI8387C1Tfugzuan7n8S9ngeq/LoO7mt95vOIsUP3HZfB7Z8EtNddERUVFevz4qizXaJbbHQ+Npjs9Oo2um+yvdQm/+w/c7+cYfGWZ94EDB15yDIzv3HvAe5lj81Ecfe3/huqaI2Ln14AjbmHstR8ITZRG4ddgod2ehTHdoXgX73Zz2OtdYNl7/HLeW6aIjhejqPW2la3h/tFb9VqOOnAexdGuxr3+0tGXXr8tOmmuqwT8i7XacBql+aGaRyFK7maOQpx9a4HIH1fzv3WBc+jZZ3qfnjiniG4EEg8deuRxYCP3/SxAwqFDCfvlRctqWe8zXwI+Ss792N/VuNvmOFQ3lYiNQ5WHmsGorep/8weCNFf4IwEPyVyIqvTuUAhqoZvDdt4ao3FySkpKypTHMVoe3vhIYAoLn8Qa5i6wIIGVpXjJi/aLvSljgQU7lYn9O7vC7XIcqk4qVcWqTeVGo6BWZw7rrra6/ort6d/f49aam4MxRDKLML9NKtbdmjHWQXMP5ZBYW4UNb9wSO2MwdupHlz6aeggx8villJSpXl6rLh7COeaugWdKykwvr5le8qJzOES9ETNT6NegYH0H77zxxviNfrLQRpvHc/agokaEo+Y10Oq3cSvTyIwi7OHeHhRJx4VxQPHNYhTHFtNjiGWL2QugppjXAbHcLYrljgg7+zYtKiUB6Y7PJuFmsXxl/E0F+c0hlTzMKIshEsfz0KxYqdKDN86Xn3qGBG/USlYtvDMyLHjxDNlnXoQlQ4ZLMz9ny5l+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 \ No newline at end of file +v0.36.9-beta +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAAAqCAMAAAB2kksrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA3NTgxOUE5NjIxQzExRUFBQTc4QUJGQUM2QkNCMkFFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjA3NTgxOUFBNjIxQzExRUFBQTc4QUJGQUM2QkNCMkFFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDc1ODE5QTc2MjFDMTFFQUFBNzhBQkZBQzZCQ0IyQUUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc1ODE5QTg2MjFDMTFFQUFBNzhBQkZBQzZCQ0IyQUUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6DwdzXAAADAFBMVEUGZp1Jns5FgKJISEjR0dFtbW09PT06lsoGVYKEhISGv9+6urokhbyiwNJFmsrR5vJlnr13t9uCgoIJeLienp7a2tqlpaVYpdJ4eHgGXpEWaJckapIGcKzf398JdbTn5+c/Pz8GbqnGxsahoaGizOXOzs5hlLFpaWk0dZoJca0nd6WTvNORkZFxcXEGWoq/v79FRUWDs86srKy1tbUKaqFmrdYJXo6TxeGy1uoEXI4IYZTKyspiYmIEU4AEYJVkq9NLS0tDQ0Pg4OCLi4sGdLLR4OgXgL2x0OJGirHB1eCyytmixdgXYo12dnbAwMCcnJwrjsbCwsJBQUEJZJgFaaKStchzqchCQkImcJu2traXl5eyzdwahMFHnMxFkb3w9feDqsGEtNCkzuZlZWUnicEchsONjY2jyN4FcrA2kcYKb6hzobsJWIUHbKWDrcVyn7jQ3+evr69gYGAFZZuDq8IZdapVi6uUlJTB2eZ0dHQEYpiJweIwk8t0sdVSiag1h7UGdbQJcKsHV4cRgsMCc7QBcrNRUVFUVFRVVVVSUlILfL0FdrdWVlYHeLkKe7wDdLUDdbUOgMADdLQEdrYOf8AEdbYSg8NXV1cSg8QShMQThMUAcrIGd7gOf78Nfr8Nfr4Mfb4Mfb0IebkJeroJersJe7s6OjqqqqrU1NTV1dWrq6upqak7Ozt+fn6AgIDw9/sHVoTC3u6BgYHq6uqEvd3z8/P19fVMTEyEvN309PSDvNzh7/d/f3/v9PeCqcCFvt7B3e3A1N/g6u+JiYng6vCErMLB3e7o6Ojg7vYUXomFvd4LerkIaJ/B3u7D3++hv9B0s9jW1tYEVYMFZ58IWYdGm8sZg8DC3+8Fa6YLdK+Dr8jR4uyDu9wKeLeFvd1VoMzv9vrg7/cEWIiAudl/uNjP5PE1jsLg7PNGhaiRuM9kmbfB2+omfq84k8ZEf6FTU1MPgMEQgcJZWVlaWlpfX19bW1tcXFxNTU1eXl5PT09QUFBYWFhdXV1OTk7///////+9FrVwAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADGBJREFUeNrsVwtUVGUevzgyMvigbMBBUAYVhEIcwQcok8MjFTJXUctn+TxZWmqYppmb7q4IDuy2L3Y3aot0eEkDIiASKvhOTYO11N7uq9qt2XXdQIwf+/++e2fm3kGMs3U8Z+b4O4f7/Z+//72/7869F6Gjo3rt8GuegD+4ATY/b+3oEDqSNl7zDPzeLbDZr0OoHtHqIfide2CzVVjrKZK3/tZN8Lww4ltPwU/cBJuFb+9ofrvhQZr/210gfOMxuKP57ce/3AXCfz0GdzS//XjJXSD8x2Pwa3fBTTXXxMTERHn/8Kos1WiWOhxvjaY7PTqNrpvsr3SJXnf73t3LNfjS8gG+vr5eroHp3el9xRe+r/zfEK66ImFuNTiS5iVc/Z7QxGgUfjXmOexpmNAdinfxbjeHvdoFlr/DL+ed5YrodDGKugH2siXc971p73QXTl+XOjm8fL1evSU6aa6rBPxLtNowGqX5vprHIEbumkciybG1QNQPq/kfu8D7+OCuKXd9gPcVUS/ggWPH+j4GeHG/lxVIO3Ys7ZC8aLkf7z0K63Il5yEc6mrcLXMcwg0lEpJQ5a1mMGmr+t/4niDNFf4IwFsy56EqqzsUBrWhm8NeuznG4OjUVatWTX0MY+Rhr75Bq1j4KJYwd4EVaaxs1Wh50RKk8qIHxCInSNfXusKtchxCJ5WqEtSJKpPJoFabh3dXW11/xfb07+99c81VIRgqmcWY2y4V627OmOCiubdySIK9wo7Xb444rBz75KUnxx5DnDx8adWqsaNHz/zTMbzPXK7uTAqMlhcB63lvD2CBgpR0ff316V69ZCEvu8dzjqCiRoSr5tXQ6rdzy2xiRjH2cm8viqXjvCSg5EYJShJK6DHEsiXsBVBdwuuABO4WJ3BHhIN9uxaVkoB0x+eRcNNYvjL5hoL8xtBKHmaUJRCJk3loWoJU6c0b58pPPVvCANRJVh0GZGdb8flpsk9/Dmu2DJdmfsSW01/gcVoWAEEzT2e7gJ4/43nRWHoC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 \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/controller/openclash.lua b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/controller/openclash.lua index b0bffb5fd9..434ef92954 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/controller/openclash.lua +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/controller/openclash.lua @@ -32,16 +32,6 @@ function index() end local fs = require "luci.openclash" -CONFIG_FILE=string.sub(luci.sys.exec("uci get openclash.config.config_path"), 1, -2) - -if CONFIG_FILE == "" or not fs.isfile(CONFIG_FILE) then - CONFIG_FILE_FIRST=luci.sys.exec("ls -lt '/etc/openclash/config/' | grep -E '.yaml|.yml' | head -n 1 |awk '{print $9}'") - if CONFIG_FILE_FIRST ~= "" then - CONFIG_FILE="/etc/openclash/config/" .. string.sub(CONFIG_FILE_FIRST, 1, -2) - else - CONFIG_FILE = "" - end -end local function is_running() return luci.sys.call("pidof clash >/dev/null") == 0 @@ -63,14 +53,6 @@ local function mode() return luci.sys.exec("uci get openclash.config.en_mode 2>/dev/null") end -local function config() - if CONFIG_FILE ~= "" then - return string.sub(CONFIG_FILE, 23, -1) - else - return "1" - end -end - local function ipdb() return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/etc/openclash/Country.mmdb")) end @@ -191,7 +173,6 @@ end function action_state() luci.http.prepare_content("application/json") luci.http.write_json({ - config = config(), lhie1 = lhie1(), ConnersHua = ConnersHua(), ConnersHua_return = ConnersHua_return(), diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/client.lua b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/client.lua index 81c3002db3..a16d2466d8 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/client.lua +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/client.lua @@ -36,7 +36,7 @@ function config_check(CONFIG_FILE) end proxy = luci.sys.call(string.format('egrep "^ {0,}Proxy:" "%s" >/dev/null 2>&1',CONFIG_FILE)) if (proxy ~= 0) then - proxy = luci.sys.call(string.format('egrep "^ {0,}proxies:" "%s" >/dev/null 2>&1',CONFIG_FILE)) + proxy = luci.sys.call(string.format('egrep "^proxies:" "%s" >/dev/null 2>&1',CONFIG_FILE)) end group = luci.sys.call(string.format('egrep "^ {0,}Proxy Group:" "%s" >/dev/null 2>&1',CONFIG_FILE)) if (group ~= 0) then @@ -87,7 +87,7 @@ e[t].name=fs.basename(o) BACKUP_FILE="/etc/openclash/backup/".. e[t].name CONFIG_FILE="/etc/openclash/config/".. e[t].name e[t].mtime=os.date("%Y-%m-%d %H:%M:%S",fs.mtime(BACKUP_FILE)) or os.date("%Y-%m-%d %H:%M:%S",a.mtime) -if string.sub(luci.sys.exec("uci get openclash.config.config_path"), 23, -2) == e[t].name then +if string.sub(luci.sys.exec("uci get openclash.config.config_path 2>/dev/null"), 23, -2) == e[t].name then e[t].state=translate("Enable") else e[t].state=translate("Disable") diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/config.lua b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/config.lua index 79a310d01a..87c79df160 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/config.lua +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/config.lua @@ -34,7 +34,7 @@ function config_check(CONFIG_FILE) end proxy = luci.sys.call(string.format('egrep "^ {0,}Proxy:" "%s" >/dev/null 2>&1',CONFIG_FILE)) if (proxy ~= 0) then - proxy = luci.sys.call(string.format('egrep "^ {0,}proxies:" "%s" >/dev/null 2>&1',CONFIG_FILE)) + proxy = luci.sys.call(string.format('egrep "^proxies:" "%s" >/dev/null 2>&1',CONFIG_FILE)) end group = luci.sys.call(string.format('egrep "^ {0,}Proxy Group:" "%s" >/dev/null 2>&1',CONFIG_FILE)) if (group ~= 0) then @@ -163,7 +163,7 @@ e[t].name=fs.basename(o) BACKUP_FILE="/etc/openclash/backup/".. e[t].name CONFIG_FILE="/etc/openclash/config/".. e[t].name e[t].mtime=os.date("%Y-%m-%d %H:%M:%S",fs.mtime(BACKUP_FILE)) or os.date("%Y-%m-%d %H:%M:%S",a.mtime) -if string.sub(luci.sys.exec("uci get openclash.config.config_path"), 23, -2) == e[t].name then +if string.sub(luci.sys.exec("uci get openclash.config.config_path 2>/dev/null"), 23, -2) == e[t].name then e[t].state=translate("Enable") else e[t].state=translate("Disable") @@ -324,7 +324,7 @@ local tab = { s = m:section(Table, tab) -local conf = string.sub(luci.sys.exec("uci get openclash.config.config_path"), 1, -2) +local conf = string.sub(luci.sys.exec("uci get openclash.config.config_path 2>/dev/null"), 1, -2) local dconf = "/etc/openclash/default.yaml" local conf_name = fs.basename(conf) if not conf_name then conf_name = "config.yaml" end diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua index a32e2dcc36..c64cdeef1c 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua @@ -11,14 +11,20 @@ local uci = require "luci.model.uci".cursor() m = Map(openclash, translate("Game Rules and Groups")) m.pageaction = false -m.description=translate("注意事项:
游戏代理为测试功能,不保证可用性。其中游戏模式使用的内核由comzyh修改 \ -
项目地址:https://github.com/comzyh/clash
使用步骤: \ -
1、在《服务器与策略组管理》页面创建您准备使用的游戏策略组和游戏节点(节点添加时必须选择要加入的策略组),策略组类型建议:FallBack,游戏节点必须支持UDP \ +m.description=translate("注意事项:
游戏代理为测试功能,不保证可用性。 \ +
准备步骤:\ +
1、在《服务器与策略组管理》页面创建您准备使用的游戏策略组和游戏节点,并应用配置(节点添加时必须选择要加入的策略组),策略组类型建议:FallBack,游戏节点必须支持UDP \
2、点击《游戏规则管理》按钮进入游戏规则列表下载您要使用的游戏规则 \
3、在此页面上方设置您已下载的游戏规则的对应策略组并保存设置 \ -
4、替换内核一,下载地址:https://github.com/Dreamacro/clash/releases/tag/TUN \ -
或替换内核二,下载地址:https://github.com/vernesong/OpenClash/releases/tag/TUN \ -
5、在《全局设置》-《常规设置》-《运行模式》中选择TUN模式(内核一)或者游戏模式(内核二)并启动") +
\ +
在普通模式下使用: \ +
1、在《全局设置》-《常规设置》-《运行模式》中选择普通模式并启用UDP流量代理,然后重新启动。 \ +
\ +
在TUN模式下使用: \ +
1、替换内核一,下载地址:https://github.com/Dreamacro/clash/releases/tag/TUN \ +
2、或替换内核二,下载地址:https://github.com/vernesong/OpenClash/releases/tag/TUN \ +
3、项目地址:https://github.com/comzyh/clash \ +
4、在《全局设置》-《常规设置》-《运行模式》中选择TUN模式(内核一)或者游戏模式(内核二)并重新启动") function IsRuleFile(e) diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua index 0dcc62014e..8ccde05761 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua @@ -54,6 +54,14 @@ o:value("redir-host-vpn", translate("redir-host-vpn(game mode)")) o:value("fake-ip-vpn", translate("fake-ip-vpn(game mode)")) o.default = "redir-host" +o = s:taboption("settings", ListValue, "enable_udp_proxy", font_red..bold_on..translate("Proxy UDP Traffics")..bold_off..font_off) +o.description = translate("Select Mode For UDP Traffics, The Servers Must Support UDP while Choose Proxy") +o:depends("en_mode", "redir-host") +o:depends("en_mode", "fake-ip") +o:value("0", translate("Disable")) +o:value("1", translate("Enable")) +o.default = "0" + o = s:taboption("settings", ListValue, "proxy_mode", font_red..bold_on..translate("Proxy Mode")..bold_off..font_off) o.description = translate("Select Proxy Mode") o:value("Rule", translate("Rule Proxy Mode")) diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/developer.htm b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/developer.htm index cdc47eadab..03ab3775e4 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/developer.htm +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/developer.htm @@ -26,71 +26,72 @@ var haishanh = document.getElementById('_haishanh'); var FQrabbit = document.getElementById('_FQrabbit'); var Fndroid = document.getElementById('_Fndroid'); - Dreamacro.innerHTML = 'Dreamacro'; - vernesong.innerHTML = 'vernesong'; - frainzy1477.innerHTML = 'frainzy1477'; - SukkaW.innerHTML = 'SukkaW'; - lhie1_dev.innerHTML = 'lhie1'; - ConnersHua_dev.innerHTML = 'ConnersHua'; - MaxMind.innerHTML = 'MaxMind'; - haishanh.innerHTML = 'haishanh'; - FQrabbit.innerHTML = 'FQrabbit'; - Fndroid.innerHTML = 'Fndroid'; + Dreamacro.innerHTML = 'Dreamacro'; + vernesong.innerHTML = 'vernesong'; + frainzy1477.innerHTML = 'frainzy1477'; + SukkaW.innerHTML = 'SukkaW'; + lhie1_dev.innerHTML = 'lhie1'; + ConnersHua_dev.innerHTML = 'ConnersHua'; + MaxMind.innerHTML = 'MaxMind'; + haishanh.innerHTML = 'haishanh'; + FQrabbit.innerHTML = 'FQrabbit'; + Fndroid.innerHTML = 'Fndroid'; + function Dreamacro_rediret() { url1='https://github.com/Dreamacro'; window.open(url1); - } + }; function vernesong_rediret() { url2='https://github.com/vernesong'; window.open(url2); - } + }; function frainzy1477_rediret() { url3='https://github.com/frainzy1477'; window.open(url3); - } + }; function SukkaW_rediret() { url4='https://github.com/SukkaW'; window.open(url4); - } + }; function lhie1_rediret() { url5='https://github.com/lhie1'; window.open(url5); - } + }; function ConnersHua_rediret() { url6='https://github.com/ConnersHua'; window.open(url6); - } + }; function MaxMind_rediret() { url9='https://dev.maxmind.com/geoip/geoip2/geolite2/'; window.open(url9); - } + }; function haishanh_rediret() { url10='https://github.com/haishanh'; window.open(url10); - } + }; function Fndroid_rediret() { url11='https://github.com/Fndroid'; window.open(url11); - } + }; function FQrabbit_rediret() { url12='https://github.com/FQrabbit'; window.open(url12); - } + }; function imgerrorfun(imgobj,imgSrc){ setTimeout(function(){ imgobj.src=imgSrc; },1000*10); - } + }; //]]> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm index 238d35100e..d8155ebf49 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm @@ -11,15 +11,15 @@

- Wiki + Wiki     - star + star     - +

@@ -163,7 +163,7 @@ XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "currentversion")%>', status.currentversion, function(x, status) { if ( x && x.status == 200 ) { - clashversion.innerHTML = 'currentversion'; + clashversion.innerHTML = 'currentversion'; } }); @@ -173,7 +173,7 @@ if ( x && x.status == 200 ) { if ( status.lastversion != "\n" && status.lastversion != "" ) { - clashversion.innerHTML = 'lastversion'; + clashversion.innerHTML = 'lastversion'; } } }); @@ -183,7 +183,7 @@ { XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "currentversion")%>', status.currentversion, function(x, status) { if ( x && x.status == 200 ) { - clashversion.innerHTML = 'currentversion'; + clashversion.innerHTML = 'currentversion'; } }); } diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/index.html b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/index.html index ad630255e7..8859107e60 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/index.html +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/index.html @@ -5,8 +5,8 @@ Clash - +
- + diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js deleted file mode 100644 index bad63ddbfb..0000000000 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1.bundle.f302eae39f433a9c3fa1.min.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(e,t,n){"use strict";e.exports=n(52)},function(e,t,n){e.exports=n(56)()},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}n.d(t,"a",(function(){return r}))},,,,function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}}(),e.exports=n(53)},function(e,t,n){var r=n(41)(Object,"create");e.exports=r},function(e,t,n){var r=n(111);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(117);e.exports=function(e,t){var n=e.__data__;return r(t)?n["string"==typeof t?"string":"hash"]:n.map}},,function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){var r=n(40),o=n(90);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t,n){var r=n(22).Symbol;e.exports=r},function(e,t,n){var r=n(87),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t,n){e.exports=function(){"use strict";var e="millisecond",t="second",n="minute",r="hour",o="day",i="week",a="month",u="quarter",l="year",c=/^(\d{4})-?(\d{1,2})-?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d{1,3})?$/,s=/\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,f=function(e,t,n){var r=String(e);return!r||r.length>=t?e:""+Array(t+1-r.length).join(n)+e},d={s:f,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),o=n%60;return(t<=0?"+":"-")+f(r,2,"0")+":"+f(o,2,"0")},m:function(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),r=e.clone().add(n,a),o=t-r<0,i=e.clone().add(n+(o?-1:1),a);return Number(-(n+(t-r)/(o?r-i:i-r))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(c){return{M:a,y:l,w:i,d:o,h:r,m:n,s:t,ms:e,Q:u}[c]||String(c||"").toLowerCase().replace(/s$/,"")},u:function(e){return void 0===e}},p={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},h="en",m={};m[h]=p;var v=function(e){return e instanceof w},g=function(e,t,n){var r;if(!e)return h;if("string"==typeof e)m[e]&&(r=e),t&&(m[e]=t,r=e);else{var o=e.name;m[o]=e,r=o}return n||(h=r),r},y=function(e,t,n){if(v(e))return e.clone();var r=t?"string"==typeof t?{format:t,pl:n}:t:{};return r.date=e,new w(r)},b=d;b.l=g,b.i=v,b.w=function(e,t){return y(e,{locale:t.$L,utc:t.$u,$offset:t.$offset})};var w=function(){function f(e){this.$L=this.$L||g(e.locale,null,!0),this.parse(e)}var d=f.prototype;return d.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(b.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var r=t.match(c);if(r)return n?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(t)}(e),this.init()},d.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},d.$utils=function(){return b},d.isValid=function(){return!("Invalid Date"===this.$d.toString())},d.isSame=function(e,t){var n=y(e);return this.startOf(t)<=n&&n<=this.endOf(t)},d.isAfter=function(e,t){return y(e)=0;d--){var p=o[d];"."===p?s(o,d):".."===p?(s(o,d),f++):f&&(s(o,d),f--)}if(!u)for(;f--;f)o.unshift("..");!u||""===o[0]||o[0]&&c(o[0])||o.unshift("");var h=o.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};function d(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var p=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=d(t),o=d(n);return r!==t||o!==n?e(r,o):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var h=function(e,t){if(!e)throw new Error("Invariant failed")};function m(e){return"/"===e.charAt(0)?e:"/"+e}function v(e){return"/"===e.charAt(0)?e.substr(1):e}function g(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function y(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function b(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function w(e,t,n,r){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var i=t.indexOf("?");return-1!==i&&(n=t.substr(i),t=t.substr(0,i)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e)).state=t:(void 0===(o=Object(l.a)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=f(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function x(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var i="function"==typeof e?e(t,n):e;"string"==typeof i?"function"==typeof r?r(i,o):o(!0):o(!1!==i)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,r):n.push(r),f({action:"PUSH",location:r,index:t,entries:n})}}))},replace:function(e,t){var r=w(e,t,d(),g.location);s.confirmTransitionTo(r,"REPLACE",n,(function(e){e&&(g.entries[g.index]=r,f({action:"REPLACE",location:r}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=g.index+e;return t>=0&&ts&&a[f-1]===l[f+c-1];)--f;for(var d=s;d=f;--d){p=t.concat([d]);n[h+d-f]={op:"add",path:p,value:l[d]},r.push({op:"remove",path:p})}}(e,t,n,r);case o.Set:(function(e,t,n,r){var o=e.base,i=e.copy,a=0;o.forEach((function(e){if(!i.has(e)){var o=t.concat([a]);n.push({op:"remove",path:o,value:e}),r.unshift({op:"add",path:o,value:e})}a++})),a=0,i.forEach((function(e){if(!o.has(e)){var i=t.concat([a]);n.push({op:"add",path:i,value:e}),r.unshift({op:"remove",path:i,value:e})}a++}))})(e,t,n,r)}}(i,r,n.patches,n.inversePatches)}return i.copy}function z(e,t,n,i){var a=t[s];return a&&(a.type!==o.ES5Object&&a.type!==o.ES5Array||(a.copy=_(a.draft,!0)),t=a.copy),g(t,(function(o,u){return function e(t,n,o,i,a,u,l,c){if(l===a)throw Error("Immer forbids circular references");var s=!!i&&a===o,f=E(a);if(h(l)){var d=c&&s&&!f&&!b(i.assigned,u)?c.concat(u):void 0;l=I(t,l,n,d),function(e,t,n){switch(y(e)){case r.Map:e.set(t,n);break;case r.Set:e.delete(t),e.add(n);break;default:e[t]=n}}(a,u,l),h(l)&&(n.canAutoFreeze=!1)}else{if(s&&x(l,w(i.base,u)))return;m(l)&&(g(l,(function(r,a){return e(t,n,o,i,l,r,a,c)})),n.parent||j(t,l))}s&&t.onAssign&&!f&&t.onAssign(i,u,l)}(e,n,t,a,t,o,u,i)})),t}function j(e,t,n){void 0===n&&(n=!1),e.autoFreeze&&!h(t)&&T(t,n)}var A={get:function(e,t){if(t===s)return e;var n=e.drafts;if(!e.modified&&b(n,t))return n[t];var r=k(e)[t];if(e.finalized||!m(r))return r;if(e.modified){if(r!==L(e.base,t))return r;n=e.copy}return n[t]=e.scope.immer.createProxy(r,e)},has:function(e,t){return t in k(e)},ownKeys:function(e){return Reflect.ownKeys(k(e))},set:function(e,t,n){if(!e.modified){var r=L(e.base,t);if(n?x(r,n)||n===e.drafts[t]:x(r,n)&&t in e.base)return!0;F(e),D(e)}return e.assigned[t]=!0,e.copy[t]=n,!0},deleteProperty:function(e,t){return void 0!==L(e.base,t)||t in e.base?(e.assigned[t]=!1,F(e),D(e)):e.assigned[t]&&delete e.assigned[t],e.copy&&delete e.copy[t],!0},getOwnPropertyDescriptor:function(e,t){var n=k(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&(r.writable=!0,r.configurable=e.type!==o.ProxyArray||"length"!==t),r},defineProperty:function(){throw new Error("Object.defineProperty() cannot be used on an Immer draft")},getPrototypeOf:function(e){return Object.getPrototypeOf(e.base)},setPrototypeOf:function(){throw new Error("Object.setPrototypeOf() cannot be used on an Immer draft")}},N={};function L(e,t){var n=e[s],r=Reflect.getOwnPropertyDescriptor(n?k(n):e,t);return r&&r.value}function D(e){if(!e.modified){if(e.modified=!0,e.type===o.ProxyObject||e.type===o.ProxyArray){var t=e.copy=_(e.base);g(e.drafts,(function(e,n){t[e]=n})),e.drafts=void 0}e.parent&&D(e.parent)}}function F(e){e.copy||(e.copy=_(e.base))}function U(e,t,n){e.drafts.forEach((function(e){e[s].finalizing=!0})),n?h(t)&&t[s].scope===e&&G(e.drafts):(e.patches&&function e(t){if(!t||"object"!=typeof t)return;var n=t[s];if(!n)return;var r=n.base,i=n.draft,a=n.assigned,u=n.type;if(u===o.ES5Object)g(i,(function(t){t!==s&&(void 0!==r[t]||b(r,t)?a[t]||e(i[t]):(a[t]=!0,B(n)))})),g(r,(function(e){void 0!==i[e]||b(i,e)||(a[e]=!1,B(n))}));else if(u===o.ES5Array){if(Q(n)&&(B(n),a.length=!0),i.length=0;t--){var n=e[t][s];if(!n.modified)switch(n.type){case o.ES5Array:Q(n)&&B(n);break;case o.ES5Object:K(n)&&B(n)}}}function K(e){for(var t=e.base,n=e.draft,r=Object.keys(n),o=r.length-1;o>=0;o--){var i=r[o],a=t[i];if(void 0===a&&!b(t,i))return!0;var u=n[i],l=u&&u[s];if(l?l.base!==a:!x(u,a))return!0}return r.length!==Object.keys(t).length}function Q(e){var t=e.draft;if(t.length!==e.base.length)return!0;var n=Object.getOwnPropertyDescriptor(t,t.length-1);return!(!n||n.get)}var X=function(e){if(!e)throw new Error("Map is not polyfilled");function t(e,t){return this[s]={type:o.Map,parent:t,scope:t?t.scope:O.current,modified:!1,finalized:!1,copy:void 0,assigned:void 0,base:e,draft:this,isManual:!1,revoked:!1},this}p(t,e);var n=t.prototype;return Object.defineProperty(n,"size",{get:function(){return k(this[s]).size},enumerable:!0,configurable:!0}),n.has=function(e){return k(this[s]).has(e)},n.set=function(e,t){var n=this[s];return Y(n),k(n).get(e)!==t&&(J(n),n.scope.immer.markChanged(n),n.assigned.set(e,!0),n.copy.set(e,t),n.assigned.set(e,!0)),this},n.delete=function(e){if(!this.has(e))return!1;var t=this[s];return Y(t),J(t),t.scope.immer.markChanged(t),t.assigned.set(e,!1),t.copy.delete(e),!0},n.clear=function(){var e=this[s];return Y(e),J(e),e.scope.immer.markChanged(e),e.assigned=new Map,e.copy.clear()},n.forEach=function(e,t){var n=this;k(this[s]).forEach((function(r,o,i){e.call(t,n.get(o),o,n)}))},n.get=function(e){var t=this[s];Y(t);var n=k(t).get(e);if(t.finalized||!m(n))return n;if(n!==t.base.get(e))return n;var r=t.scope.immer.createProxy(n,t);return J(t),t.copy.set(e,r),r},n.keys=function(){return k(this[s]).keys()},n.values=function(){var e,t=this,n=this.keys();return(e={})[f]=function(){return t.values()},e.next=function(){var e=n.next();return e.done?e:{done:!1,value:t.get(e.value)}},e},n.entries=function(){var e,t=this,n=this.keys();return(e={})[f]=function(){return t.entries()},e.next=function(){var e=n.next();if(e.done)return e;var r=t.get(e.value);return{done:!1,value:[e.value,r]}},e},n[f]=function(){return this.entries()},t}(Map);function J(e){e.copy||(e.assigned=new Map,e.copy=new Map(e.base))}var Z=function(e){if(!e)throw new Error("Set is not polyfilled");function t(e,t){return this[s]={type:o.Set,parent:t,scope:t?t.scope:O.current,modified:!1,finalized:!1,copy:void 0,base:e,draft:this,drafts:new Map,revoked:!1,isManual:!1},this}p(t,e);var n=t.prototype;return Object.defineProperty(n,"size",{get:function(){return k(this[s]).size},enumerable:!0,configurable:!0}),n.has=function(e){var t=this[s];return Y(t),t.copy?!!t.copy.has(e)||!(!t.drafts.has(e)||!t.copy.has(t.drafts.get(e))):t.base.has(e)},n.add=function(e){var t=this[s];return Y(t),t.copy?t.copy.add(e):t.base.has(e)||(ee(t),t.scope.immer.markChanged(t),t.copy.add(e)),this},n.delete=function(e){if(!this.has(e))return!1;var t=this[s];return Y(t),ee(t),t.scope.immer.markChanged(t),t.copy.delete(e)||!!t.drafts.has(e)&&t.copy.delete(t.drafts.get(e))},n.clear=function(){var e=this[s];return Y(e),ee(e),e.scope.immer.markChanged(e),e.copy.clear()},n.values=function(){var e=this[s];return Y(e),ee(e),e.copy.values()},n.entries=function(){var e=this[s];return Y(e),ee(e),e.copy.entries()},n.keys=function(){return this.values()},n[f]=function(){return this.values()},n.forEach=function(e,t){for(var n=this.values(),r=n.next();!r.done;)e.call(t,r.value,r.value,this),r=n.next()},t}(Set);function ee(e){e.copy||(e.copy=new Set,e.base.forEach((function(t){if(m(t)){var n=e.scope.immer.createProxy(t,e);e.drafts.set(t,n),e.copy.add(n)}else e.copy.add(t)})))}function te(e,t){return t.forEach((function(t){var n=t.path,o=t.op;n.length||P();for(var i=e,a=0;a=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}return h(e)?te(e,t):this.produce(e,(function(e){return te(e,t.slice(n+1))}))},e.prototype.createProxy=function(e,t){var n=S(e)?function(e,t){return new X(e,t)}(e,t):E(e)?function(e,t){return new Z(e,t)}(e,t):this.useProxies?function(e,t){var n=Array.isArray(e),r={type:n?o.ProxyArray:o.ProxyObject,scope:t?t.scope:O.current,modified:!1,finalized:!1,assigned:{},parent:t,base:e,draft:null,drafts:{},copy:null,revoke:null,isManual:!1},i=r,a=A;n&&(i=[r],a=N);var u=Proxy.revocable(i,a),l=u.revoke,c=u.proxy;return r.draft=c,r.revoke=l,c}(e,t):$(e,t);return(t?t.scope:O.current).drafts.push(n),n},e.prototype.willFinalize=function(e,t,n){this.useProxies||U(e,t,n)},e.prototype.markChanged=function(e){this.useProxies?D(e):B(e)},e}()),ae=ie.produce;ie.produceWithPatches.bind(ie),ie.setAutoFreeze.bind(ie),ie.setUseProxies.bind(ie),ie.applyPatches.bind(ie),ie.createDraft.bind(ie),ie.finishDraft.bind(ie);t.a=ae}).call(this,n(34))},function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,t){for(var n,u,l=a(e),c=1;c=200&&e<300}};l.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){l.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){l.headers[e]=r.merge(i)})),e.exports=l}).call(this,n(34))},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var l,c=[],s=!1,f=-1;function d(){s&&l&&(s=!1,l.length?c=l.concat(c):f=-1,c.length&&p())}function p(){if(!s){var e=u(d);s=!0;for(var t=c.length;t;){for(l=c,c=[];++f1)for(var n=1;nM.length&&M.push(e)}function j(e,t,n){return null==e?0:function e(t,n,r,o){var u=typeof t;"undefined"!==u&&"boolean"!==u||(t=null);var l=!1;if(null===t)l=!0;else switch(u){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return r(o,t,""===n?"."+A(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var c=0;c