diff --git a/package/ctcgfw/luci-app-openclash/Makefile b/package/ctcgfw/luci-app-openclash/Makefile index 701bc13a95..0eef43305b 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.5 +PKG_VERSION:=0.36.6 PKG_RELEASE:=beta PKG_MAINTAINER:=vernesong @@ -98,6 +98,9 @@ fi mkdir -p /lib/upgrade/keep.d >/dev/null 2>&1 cat > "/lib/upgrade/keep.d/luci-app-openclash" <<-EOF /etc/openclash/custom/ +/etc/openclash/config/ +/etc/openclash/game_rules/ +/etc/openclash/proxy_provider/ EOF uci set openclash.config.enable=0 >/dev/null 2>&1 uci commit openclash >/dev/null 2>&1 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 28a8eb41e2..a5f4421a69 100755 --- a/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash +++ b/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash @@ -4,7 +4,6 @@ START=99 STOP=15 - CLASH="/etc/openclash/clash" CLASH_CONFIG="/etc/openclash" CRON_FILE="/etc/crontabs/root" @@ -155,7 +154,7 @@ yml_check() [ ! -z "$(grep "^ \{1,\}dns:" "$3")" ] && { sed -i "/^ \{1,\}dns:/c\dns:" "$3" } - + #位置检查 proxy_len=$(sed -n '/^Proxy:/=' "$3" 2>/dev/null) group_len=$(sed -n '/^ \{0,\}Proxy Group:/=' "$3" 2>/dev/null) @@ -168,22 +167,22 @@ yml_check() echo "${LOGTIME} Unsupported Config, Please Check The General Setting's location And Try-again!" >> $LOG_FILE mv "$START_BACKUP" "$CONFIG_FILE" exit 0 - fi + fi 2>/dev/null if [ "$proxy_len" -ge "$rule_len" ] || [ "$provider_len" -ge "$rule_len" ]; then echo "错误: 不支持的配置文件,服务器节点设置部分应位于规则之前,请根据模板修改后重试!" > $START_LOG echo "${LOGTIME} Unsupported Config, Please Check The Proxy Setting's location And Try-again!" >> $LOG_FILE mv "$START_BACKUP" "$CONFIG_FILE" exit 0 - fi + fi 2>/dev/null if [ "$group_len" -ge "$rule_len" ] || [ "$proxy_len" -ge "$group_len" ]; then echo "错误: 不支持的配置文件,策略组设置部分应位于规则之前、节点之后,请根据模板修改后重试!" > $START_LOG echo "${LOGTIME} Unsupported Config, Please Check The Group Setting's location And Try-again!" >> $LOG_FILE mv "$START_BACKUP" "$CONFIG_FILE" exit 0 - fi - + fi 2>/dev/null + #处理provider位置 if [ ! -z "$provider_len" ]; then if [ "$provider_len" -ge "$proxy_len" ] && [ "$provider_len" -le "$group_len" ]; then @@ -206,7 +205,7 @@ yml_check() sed -i '/^proxy-provider:/d' /tmp/backprovider.yaml 2>/dev/null sed -i '/proxy-provider:/r/tmp/backprovider.yaml' "$3" 2>/dev/null rm -rf /tmp/backprovider.yaml 2>/dev/null - fi + fi 2>/dev/null fi @@ -616,41 +615,6 @@ elif [ -f "/tmp/yaml_servers.yaml" ]; then fi } -proxy_router() -{ - ipset -! create router nethash && ipset flush router - rm -rf /tmp/openclash_pr_list.conf >/dev/null 2>&1 - # github and some other site need to go proxy with redir-host mode - echo "#for router itself" >> /tmp/openclash_pr_list.conf - echo "server=/.google.com/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.google.com/router" >> /tmp/openclash_pr_list.conf - echo "server=/.google.com.tw/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.google.com.tw/router" >> /tmp/openclash_pr_list.conf - echo "server=/.google.com.hk/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.google.com.hk/router" >> /tmp/openclash_pr_list.conf - echo "server=/.google.com.jp/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.google.com.jp/router" >> /tmp/openclash_pr_list.conf - echo "server=/.github.com/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.github.com/router" >> /tmp/openclash_pr_list.conf - echo "server=/.github.io/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.github.io/router" >> /tmp/openclash_pr_list.conf - echo "server=/.githubusercontent.com/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.githubusercontent.com/router" >> /tmp/openclash_pr_list.conf - echo "server=/.shields.io/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.shields.io/router" >> /tmp/openclash_pr_list.conf - echo "server=/.shields.io/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.shields.io/router" >> /tmp/openclash_pr_list.conf - echo "server=/.s3.amazonaws.com/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.s3.amazonaws.com/router" >> /tmp/openclash_pr_list.conf - echo "server=/.openwrt.org/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.openwrt.org/router" >> /tmp/openclash_pr_list.conf - echo "server=/.s3-ap-northeast-1.amazonaws.com/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.s3-ap-northeast-1.amazonaws.com/router" >> /tmp/openclash_pr_list.conf - echo "server=/.s3-ap-southeast-2.amazonaws.com/127.0.0.1#$dns_port" >> /tmp/openclash_pr_list.conf - echo "ipset=/.s3-ap-southeast-2.amazonaws.com/router" >> /tmp/openclash_pr_list.conf - mv /tmp/openclash_pr_list.conf /tmp/dnsmasq.d/openclash_pr_list.conf -} - start() { #禁止多个实例 @@ -727,13 +691,14 @@ 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) + echo "第二步: 配置文件检查..." >$START_LOG yml_check "$en_mode" "$enable_custom_dns" "$CONFIG_FILE" "$BACKUP_FILE" "$START_BACKUP" grep "^ \{0,\}Proxy Group:" "$CONFIG_FILE" >/dev/null 2>&1 && grep "^ \{0,\}Rule:" "$CONFIG_FILE" >/dev/null 2>&1 if [ "$?" -eq "0" ]; then grep "^ \{0,\}Proxy:" "$CONFIG_FILE" >/dev/null 2>&1 || grep "^ \{0,\}proxy-provider:" "$CONFIG_FILE" >/dev/null 2>&1 if [ "$?" -ne "0" ]; then - nohup $CLASH -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & + nohup "$CLASH" -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & echo "错误: 配置文件完整性检查不通过,已自动还原配置文件,请根据日志信息对照模板格式检查修改配置文件!" >$START_LOG mv "$START_BACKUP" "$CONFIG_FILE" stop @@ -746,8 +711,8 @@ if [ "$enable" -eq 1 ] && [ -f "$CONFIG_FILE" ]; then yml_auth_custom "$CONFIG_FILE" yml_cut "$CHANGE_FILE" "$RULE_FILE" "$DNS_FILE" "$CONFIG_FILE" "$PROXY_FILE" "$PROXY_PROVIDER_FILE" "$GROUP_FILE" yml_dns_custom "$enable_custom_dns" "$DNS_FILE" - sh /usr/share/openclash/yml_change.sh "$LOGTIME" "$en_mode" "$enable_custom_dns" "$da_password" "$cn_port" "$proxy_port" "$CHANGE_FILE" "$ipv6_enable" "$http_port" "$socks_port" "$lan_ip" "$log_level" "$proxy_mode" "$intranet_allowed" "$en_mode_tun" & - sh /usr/share/openclash/yml_rules_change.sh "$LOGTIME" "$rule_source" "$enable_custom_clash_rules" "$RULE_FILE" & + sh /usr/share/openclash/yml_change.sh >/dev/null 2>&1 "$LOGTIME" "$en_mode" "$enable_custom_dns" "$da_password" "$cn_port" "$proxy_port" "$CHANGE_FILE" "$ipv6_enable" "$http_port" "$socks_port" "$lan_ip" "$log_level" "$proxy_mode" "$intranet_allowed" "$en_mode_tun" & + sh /usr/share/openclash/yml_rules_change.sh >/dev/null 2>&1 "$LOGTIME" "$rule_source" "$enable_custom_clash_rules" "$RULE_FILE" "$set_rule_file" "$en_mode" & wait yml_game_custom echo "第四步: DNS设置检查..." >$START_LOG @@ -759,12 +724,11 @@ if [ "$enable" -eq 1 ] && [ -f "$CONFIG_FILE" ]; then echo "" >$START_LOG else echo "第五步: 启动 Clash 主程序..." >$START_LOG - nohup $CLASH -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & + nohup "$CLASH" -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & #检测proxy_provider配置文件状态 echo "第六步: 等待主程序下载代理集..." >$START_LOG yml_proxy_provider_check "$PROXY_PROVIDER_FILE" - rm -rf /tmp/yaml_* 2>/dev/null echo "第七步: 设置控制面板..." >$START_LOG ln -s /usr/share/openclash/yacd /www/luci-static/openclash 2>/dev/null @@ -809,11 +773,7 @@ EOF iptables -t nat -A openclash -p tcp -j REDIRECT --to-ports "$proxy_port" iptables -t nat -A PREROUTING -p tcp -j openclash - - if [ "$en_mode" = "redir-host" ]; then - proxy_router - iptables -t nat -A OUTPUT -p tcp -m set --match-set router dst -j REDIRECT --to-ports "$proxy_port" >/dev/null 2>&1 - else + 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" fi @@ -821,9 +781,6 @@ EOF ip6tables -t nat -N openclash ip6tables -t nat -A openclash -p tcp -j REDIRECT --to-ports "$proxy_port" ip6tables -t nat -A PREROUTING -p tcp -j openclash - if [ "$en_mode" = "redir-host" ]; then - ip6tables -t nat -A OUTPUT -p tcp -m set --match-set router dst -j REDIRECT --to-ports "$proxy_port" >/dev/null 2>&1 - fi fi else #TUN模式 @@ -835,7 +792,7 @@ EOF ipset add localnetwork 224.0.0.0/4 ipset add localnetwork 240.0.0.0/4 ipset add localnetwork 172.16.0.0/12 - ipset add localnetwork "$wan_ip4" + ipset add localnetwork "$wan_ip4" #启动TUN if [ "$en_mode_tun" = "2" ]; then ip tuntap add user root mode tun clash0 @@ -848,21 +805,15 @@ EOF #设置防火墙 iptables -t mangle -N openclash iptables -t mangle -F openclash - if [ "$en_mode" = "redir-host" ]; then - proxy_router - iptables -t mangle -A openclash -p tcp -m set --match-set router dst -j MARK --set-mark "$PROXY_FWMARK" >/dev/null 2>&1 - else + iptables -t mangle -A openclash -m set --match-set localnetwork dst -j RETURN + if [ "$en_mode" = "fake-ip" ]; then iptables -t mangle -A openclash -d 198.18.0.0/16 -j MARK --set-mark "$PROXY_FWMARK" fi - iptables -t mangle -A openclash -m set --match-set localnetwork dst -j RETURN iptables -t mangle -I OUTPUT -j openclash iptables -t mangle -I PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" #ipv6 if [ "$ipv6_enable" -eq 1 ]; then ip6tables -t mangle -I PREROUTING -j MARK --set-mark "$PROXY_FWMARK" - if [ "$en_mode" = "redir-host" ]; then - ip6tables -t mangle -A OUTPUT -p tcp -m set --match-set router dst -j MARK --set-mark "$PROXY_FWMARK" >/dev/null 2>&1 - fi fi fi @@ -898,7 +849,7 @@ EOF sed -i '/^Rule:/,$d' "$CONFIG_FILE" cat /etc/openclash/configrules.bak >> "$CONFIG_FILE" rm -rf /etc/openclash/configrules.bak - nohup $CLASH -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & + nohup "$CLASH" -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & sleep 3 if pidof clash >/dev/null; then /usr/share/openclash/openclash_history_set.sh @@ -934,7 +885,7 @@ EOF fi fi else - nohup $CLASH -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & + nohup "$CLASH" -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & echo "错误: 配置文件完整性检查不通过,已自动还原配置文件,请根据日志信息对照模板格式检查修改配置文件!" >$START_LOG mv "$START_BACKUP" "$CONFIG_FILE" stop @@ -942,6 +893,7 @@ EOF echo "" >$START_LOG fi rm -rf $START_BACKUP 2>/dev/null + rm -rf /tmp/yaml_* 2>/dev/null else subscribe_url=$(uci get openclash.config.subscribe_url 2>/dev/null) if [ ! -f "$CONFIG_FILE" ] && [ ! -z "$subscribe_url" ]; then @@ -965,8 +917,7 @@ stop() wait echo "第二步: 删除 OpenClash 防火墙规则..." >$START_LOG rm -rf /var/etc/openclash.include 2>/dev/null - ipset -F router >/dev/null 2>&1 && ipset -X router >/dev/null 2>&1 - rm -rf /tmp/dnsmasq.d/openclash_pr_list.conf + #ipv4 iptables -t nat -F openclash >/dev/null 2>&1 iptables -t nat -D PREROUTING -p tcp -j openclash >/dev/null 2>&1 @@ -977,21 +928,11 @@ stop() iptables -t nat -D OUTPUT "$out_line" >/dev/null 2>&1 done - out_lines=$(iptables -nvL OUTPUT -t nat |sed 1,2d |sed -n '/router/=' 2>/dev/null |sort -rn) - for out_line in $out_lines; do - iptables -t nat -D OUTPUT "$out_line" >/dev/null 2>&1 - done - #ipv6 ip6tables -t nat -F openclash >/dev/null 2>&1 ip6tables -t nat -D PREROUTING -p tcp -j openclash >/dev/null 2>&1 ip6tables -t nat -X openclash >/dev/null 2>&1 - out_lines=$(ip6tables -nvL OUTPUT -t nat |sed 1,2d |sed -n '/router/=' 2>/dev/null |sort -rn) - for out_line in $out_lines; do - ip6tables -t nat -D OUTPUT "$out_line" >/dev/null 2>&1 - done - #TUN ip link set dev clash0 down >/dev/null 2>&1 ip tuntap del clash0 mode tun >/dev/null 2>&1 @@ -1002,7 +943,6 @@ stop() iptables -t mangle -D OUTPUT -j openclash >/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 - ip6tables -t mangle -D OUTPUT -p tcp -m set --match-set router dst -j MARK --set-mark "$PROXY_FWMARK" >/dev/null 2>&1 iptables -t mangle -F openclash >/dev/null 2>&1 iptables -t mangle -X openclash >/dev/null 2>&1 ipset destroy localnetwork >/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 973db7e68b..f5218f5ef8 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.5-beta -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAAAqCAMAAAB2kksrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkVGOTQzM0E1NEMxQjExRUFBNjI0RTE1OEUwMEI5RjY4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkVGOTQzM0E2NEMxQjExRUFBNjI0RTE1OEUwMEI5RjY4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RUY5NDMzQTM0QzFCMTFFQUE2MjRFMTU4RTAwQjlGNjgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RUY5NDMzQTQ0QzFCMTFFQUE2MjRFMTU4RTAwQjlGNjgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6To/eXAAADAFBMVEVFmspISEgJca3R0dEHXpHB1eBJns5tbW09PT2EvN1TiqqEhIS6urokhLuiwNIKdbIJeLiCgoKenp7a2tqlpaVYpdLR4ux4eHgKa6EGcKzf39/R5vLn5+c6lco/Pz/GxsahoaEla5LOzs5jlLFpaWkGbak0dJmizOV2ttplnLuSu9KRkZFxcXG/v79FRUWsrKy1tbWy1uqTxeGDs85mrNXKysoEXI4XgL0FYJRiYmIWaJcEU4BLS0tDQ0Pg4OAEWYmLi4tkq9Ox0eMIYpWyytiixdgGdLJ2dnYIXY7AwMCcnJwGVYLCwsJBQUEJZJhHi7OStciEtNBCQkImcJq2trZFgKGXl5eyzt0nicFFkb0ahMHw9fdynrgFaaJlZWWNjY2jyN4JWIU2kcZHnM0FcrArjscYYo1zobsHZ50HbKWDrcXR3+ikzubB2eevr6+DqsFgYGCDq8IZdaqUlJQGZJpzsdQchsN0dHQEYphFgqaJweIwk8sndKE1h7UFZZsHV4cRgsMCc7QBcrNRUVFUVFRVVVVSUlILfL1WVlYFdrcHeLkEdrYOf8AOgMADdLQEdbYDdLUDdbUSg8MKe7xXV1cSg8QShMQAcrIThMUGd7gOf78Nfr8Nfr4Mfb4Mfb0IebkJeroJe7sJers6OjqqqqrU1NTV1dWrq6upqak7OzuAgIB+fn7C3u7w9/sHVoSBgYHq6upMTEyHv9/z8/P19fWErML09PTh7/eDvNx/f3/v9PeFvt6Gvt/B3e3A1N+CqcAFZ58HVoPg6u+JiYnB3e7o6OgUXonC3+90s9iGv98EVYOhv9DB3u7g7vYIaJ/W1taEvd3g6vDD3+8Fa6YZg8ALerkIWYcFZ6AGdbRGm8sEVYSDr8jv9voKebhVos+Du9wLb6gEV4eAudkzeqNUk7d/uNiyzNxEgKPP5PFGiK4Xe7Oyz+ALeLZnrtbB2+pTU1MPgMEQgcJZWVlaWlpfX19bW1tcXFxNTU1eXl5PT09QUFBYWFhdXV1OTk7///////8GdQXsAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADDNJREFUeNrslwlUFFcWhquRpaVVYoNpEWgFBKNogyYu2A2iEqKDEI3GcT9BjZpxizGJJiY4MyKgM5kNZjGZaLDZDDSCbIbEfd+IxixmT2ZJxpk4PeM4ATH8zH2vqrqrmiWcSY7ndB+/c6h373333lf1v+qqQmhrq1kz+IYn8Ac3YNOztrY2oS1xww3P4HduwaaQNqFmeLOH8Fv3YJNNWOMpkjf/xk14Vhj+jafwYzdhk/DNHc1vNx6k+b/dBeFrj+GO5reff7kLwn89hjua335ecBeE/3gMP3cXOtRcFxsbG+P3/auySKdb5HD8dLru1Bh0hm52f7EzXgi7Z989Ye2iT/fbt2+fr2vgUVXStX0y6vgZnHnx/0a47kr8rBpwEmfHX/+O6GJ1Kr8Gsx32VIzuTos38WY3F3upE55+i1/OW0+roo+KUdT3k9NWcf+MKktKInxV8TMueUp8z/i+1CXtNDdUAoElen0EraP7rprHIlbp5o5AomNrgZjvV/M/dsIp3D30waF345Qq6gusrK3tM5/U5H6YDUiurU1+w6XWp1Zkjir+Bt7obLku5zjCLTXxiaj20zIs+uq+t74jpLnKHw74SeZsVGd3p4VJa+rmYi93zDVcWpaRkbFsPq4pw759wjNY+BJWMXeeDcksLaO/qvgUajNEAnYq46Try53R1RxHaKdSdbw2QWOxmLTa3MHd1dbQV7U9ffv6day5JhSDJLMYs1qlZEPHHeNdNPdTLxIvZ8js7JiRWO79WcBn3rUYqQwHZGR49++f/m4tTjF3FXwyMtIp0F9VfAoz+ot8pYq/jtd37nzUN0wR8pU9PucIqnJEXDWvgd64hVu5FmYUYy/39qJYOs5OBEpulaAkvoQeQ2y2hL0Aakp4HhDP3eJ47og4um/Ro1ISkO74fBJuKpuvTLqlan5rUCUPs5YlEBsn8dDUeCnTjxfOUp56jkQ/1EtWPfrl5Nhw9WOy33kGthwFXulfseGdYXiEhnlAePo7Oe0ox+s5HUG6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 \ No newline at end of file +v0.36.6-beta +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAAAqCAMAAAB2kksrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkNDRUNCQ0M2NEZFNzExRUE4NDJDOTRFQ0ZGRDg5MTcyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkNDRUNCQ0M3NEZFNzExRUE4NDJDOTRFQ0ZGRDg5MTcyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Q0NFQ0JDQzQ0RkU3MTFFQTg0MkM5NEVDRkZEODkxNzIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Q0NFQ0JDQzU0RkU3MTFFQTg0MkM5NEVDRkZEODkxNzIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5dn6TAAAADAFBMVEVtbW09PT2Gv9+EvN3R4eqEhIQGZp26urokhLvB1eAKaqGizOU6lcqTvdVFmspYpdIJeLgJdbSCgoJ3t9uStcmenp4GcKxilLHa2tqlpaVTiqqDs854eHgHX5Hf39/n5+c/Pz/GxsbR5vKhoaEla5LOzs5paWllnr2y1uoHXI2RkZFxcXG/v79GRkasrKy1tbUFYJUEXI4GbamTxeE0dJoEU4BmrNXKysoJca1iYmIFWooWaJcJZJhkq9MIYpVLS0tDQ0Pg4OCLi4ux0eOyytmixdh2dnYXgL3AwMCcnJyiwNEHdLLCwsJBQUEGVYJGirEFZZpFgKJFkb1CQkImcZy2traXl5eyzdwnicHQ3+eEtNDS0tIFaaLQ0NA2kcZHnM1lZWUahMGNjY0JWIXw9fejyN6kzuYFcrArjscYYo1zobsIbKWDrcWDqsE0fKVyn7ivr69gYGAchsODq8IZdapJns6UlJTB2ecEYph0dHSJweIwk8tDfqBKns90sdVGg6ZFiK01h7VortcRgsMCc7QBcrNRUVFUVFRVVVVSUlILfL1WVlYFdrcHeLkDdLUDdLQEdbYDdbUEdrYOgMAOf8ASg8MSg8RXV1cShMQKe7wThMUAcrIGd7gOf78Nfr8Nfr4Mfb4Mfb0IebkJeroJe7sJers6OjqqqqrU1NTV1dVISEirq6upqak7Ozt+fn6AgIDw9/sHVoRJSUnC3u6BgYHq6urz8/NMTEz19fXh7/f09PR/f3+DvNyErMLB3e3v9PeFvt6hv9CCqcDg6u8IaJ/B3u6JiYkHVoPA1N/B3e4UXono6Ojg6vBInc4EVYPD3++Evd3W1tYLerl0s9jg7vZGm8sFZ58IWYfC3+9Vos8Zg8AFa6YGdbRInc0LdK8EVYSDr8gLb6iButoKeLfv9vqSuc8FdLPg7/cJcKwEWIiyz+DP5PEHV4dkmbfB2+pTU1MPgMEQgcJZWVlaWlpfX19bW1tcXFxNTU1eXl5PT09QUFBYWFhdXV1OTk7///////9obPo/AAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADGZJREFUeNrsVwlUVNcZfoOOihK3MCw6yIhgEB02HRW3ASTRiiAaV7RGDwa3Go1GozFmsa0ISLe0pbQmTQyySwaQNSLuu8aoMYuJ2Y22Sae1NiCGj/z3vveG9wYwnKb1nJnjdw73/v9////77/vum/ceQnNz1ZrBt5wBf3YAbH7G0twsNEdtuuUc+JNDYLNfs1A1tMFJ8EfHwGaLsMZZJG/4g4PgGWHod86CnzsINgvf3df8XsOJNP+Xo0D41mlwX/N7j386CoT/OA3ua37v8ZKjQPi30+D3joI2NdcGBwcH/R9OY5FWu8jmCFptR2r0Wn0H2V9uDy+5PejyoFur6NpeLi4uW+wDy1qVL9vq4vLgWnXMBS4v/9cQbtojYlYVOKJmR9z8kdAGa1V+FWbb7MkY1RGKt/F2B5u90g7WvsUv5621qugyMYrqXnJaMvdd7KrdxLwt6qhLq7wWbHHZ8spd0UpzfTngVajTBVAj7Y/VPBjBSjd9GKJsRwsE/W81/2s7eA+dH5r2UGe8p4quB+bV1k5ZAqznvpsFiKmtjTmgLt4KLJlSWztvvTp8AAfaa3fXNQ7hjhoRUagQNAxmXUXfOz8SpLnKHwrIDWejIrUjFEaNsYPNXm0bW3FmeVJS0vIl2KoMr5/in8TCZ5DM3MUWxLC0pO6qYjqZWhZNuqomJV1fbQ93W+MQWqlUEaGJLDWbjRpN+uCOaqvvqzqevn2FtjUv8MUgyczHrCYpWd82Y4Sd5oK6SYScIeO1thGIFT6fXv3UpxaByvDVpCSf7t3HvVuL95ibDNekpHEU6K4qribJ36Wwz1U1Ken62mvL1rspQutlj6/ZgqocEfaaV0Fn2MatdDMz8rGXe3uRL42zo4DCO4UojCikxxBbLWQvgKpCngdEcDc/gjsibOzbdCiXBKQ7PpOEm8zWy6PvqMjvDCrnYUZZCJE4mocmR0iZAi+cpdx6moReqJasavRKS7PghQtkX3geljQFro77nE0XvsTjNC0G/MddSLNH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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 2c8f2e55d5..586fac7060 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 @@ -22,10 +22,11 @@ function index() entry({"admin", "services", "openclash", "settings"},cbi("openclash/settings"),_("Global Settings"), 30).leaf = true entry({"admin", "services", "openclash", "servers"},cbi("openclash/servers"),_("Severs and Groups"), 40).leaf = true entry({"admin", "services", "openclash", "game-settings"},cbi("openclash/game-settings"),_("Game Rules and Groups"), 50).leaf = true + entry({"admin", "services", "openclash", "game-rules-manage"},form("openclash/game-rules-manage"), nil).leaf = true entry({"admin", "services", "openclash", "config-subscribe"},cbi("openclash/config-subscribe"),_("Config Update"), 60).leaf = true - entry({"admin", "services", "openclash", "servers-config"},cbi("openclash/servers-config"), nil).leaf = true - entry({"admin", "services", "openclash", "groups-config"},cbi("openclash/groups-config"), nil).leaf = true - entry({"admin", "services", "openclash", "proxy-provider-config"},cbi("openclash/proxy-provider-config"), nil).leaf = true + entry({"admin", "services", "openclash", "servers-config"},cbi("openclash/servers-config"), nil).leaf = true + entry({"admin", "services", "openclash", "groups-config"},cbi("openclash/groups-config"), nil).leaf = true + entry({"admin", "services", "openclash", "proxy-provider-config"},cbi("openclash/proxy-provider-config"), nil).leaf = true entry({"admin", "services", "openclash", "config"},form("openclash/config"),_("Server Config"), 70).leaf = true entry({"admin", "services", "openclash", "log"},form("openclash/log"),_("Logs"), 80).leaf = true @@ -54,41 +55,6 @@ local function is_watchdog() return luci.sys.exec("ps |grep openclash_watchdog.sh |grep -v grep 2>/dev/null |sed -n 1p") end -local function config_check() - local yaml = fs.isfile(CONFIG_FILE) - local proxy,group,rule - if yaml then - proxy_provier = luci.sys.call(string.format('egrep "^ {0,}proxy-provider:" "%s" >/dev/null 2>&1',CONFIG_FILE)) - proxy = luci.sys.call(string.format('egrep "^ {0,}Proxy:" "%s" >/dev/null 2>&1',CONFIG_FILE)) - group = luci.sys.call(string.format('egrep "^ {0,}Proxy Group:" "%s" >/dev/null 2>&1',CONFIG_FILE)) - rule = luci.sys.call(string.format('egrep "^ {0,}Rule:" "%s" >/dev/null 2>&1',CONFIG_FILE)) - end - if yaml then - if (proxy == 0) then - proxy = "" - else - if (proxy_provier == 0) then - proxy = "" - else - proxy = " - 代理服务器" - end - end - if (group == 0) then - group = "" - else - group = " - 策略组" - end - if (rule == 0) then - rule = "" - else - rule = " - 规则" - end - return proxy..group..rule - elseif (yaml ~= 0) then - return "1" - end -end - local function cn_port() return luci.sys.exec("uci get openclash.config.cn_port 2>/dev/null |tr -d '\n'") end @@ -158,12 +124,14 @@ local function corecv() if not nixio.fs.access("/etc/openclash/clash") then return "0" else - return luci.sys.exec("/etc/openclash/clash -v 2>/dev/null 2>/dev/null |awk -F ' ' '{print $2}'") + return luci.sys.exec("/etc/openclash/clash -v 2>/dev/null |awk -F ' ' '{print $2}'") end end local function corelv() - return luci.sys.exec("sh /usr/share/openclash/clash_version.sh && sed -n 1p /tmp/clash_last_version 2>/dev/null") + local new = luci.sys.exec("sh /usr/share/openclash/clash_version.sh") + local core_lv = luci.sys.exec("sed -n 1p /tmp/clash_last_version 2>/dev/null") + return core_lv..","..new end local function opcv() @@ -204,12 +172,8 @@ end function download_rule() local filename = luci.http.formvalue("filename") local rule_file_dir="/etc/openclash/game_rules/" .. filename - luci.sys.call(string.format('/usr/share/openclash/openclash_game_rule.sh "%s" >/dev/null 2>&1',filename)) - if not fs.isfile(rule_file_dir) then - return "0" - else - return "1" - end + local state = luci.sys.call(string.format('/usr/share/openclash/openclash_game_rule.sh "%s" >/dev/null 2>&1',filename)) + return state end function action_status() @@ -227,7 +191,6 @@ end function action_state() luci.http.prepare_content("application/json") luci.http.write_json({ - config_check = config_check(), config = config(), lhie1 = lhie1(), ConnersHua = ConnersHua(), 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 ae73c311f5..b4ea33efeb 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 @@ -15,33 +15,6 @@ m.pageaction = false m:section(SimpleSection).template = "openclash/status" m:section(SimpleSection).template = "openclash/state" -local e,a={} -for t,o in ipairs(fs.glob("/etc/openclash/config/*"))do -a=fs.stat(o) -if a then -e[t]={} -e[t].name=fs.basename(o) -BACKUP_FILE="/etc/openclash/backup/".. 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 - e[t].state=translate("Enable") -else - e[t].state=translate("Disable") -end -e[t].size=tostring(a.size) -e[t].remove=0 -e[t].enable=false -end -end - -form=SimpleForm("filelist") -form.reset=false -form.submit=false -tb=form:section(Table,e) -st=tb:option(DummyValue,"state",translate("State")) -nm=tb:option(DummyValue,"name",translate("Config Alias")) -mt=tb:option(DummyValue,"mtime",translate("Update Time")) - function IsYamlFile(e) e=e or"" local e=string.lower(string.sub(e,-5,-1)) @@ -53,6 +26,75 @@ function IsYmlFile(e) return e == ".yml" end +function config_check(CONFIG_FILE) + local yaml = fs.isfile(CONFIG_FILE) + local proxy,group,rule + if yaml then + proxy_provier = luci.sys.call(string.format('egrep "^ {0,}proxy-provider:" "%s" >/dev/null 2>&1',CONFIG_FILE)) + proxy = luci.sys.call(string.format('egrep "^ {0,}Proxy:" "%s" >/dev/null 2>&1',CONFIG_FILE)) + group = luci.sys.call(string.format('egrep "^ {0,}Proxy Group:" "%s" >/dev/null 2>&1',CONFIG_FILE)) + rule = luci.sys.call(string.format('egrep "^ {0,}Rule:" "%s" >/dev/null 2>&1',CONFIG_FILE)) + end + if yaml then + if (proxy == 0) then + proxy = 0 + else + if (proxy_provier == 0) then + proxy = 0 + else + proxy = " - 代理服务器" + end + end + if (group == 0) then + group = 0 + else + group = " - 策略组" + end + if (rule == 0) then + rule = 0 + else + rule = " - 规则" + end + if proxy and group and rule then + return "Config Normal" + else + return proxy..group..rule.."部分异常" + end + elseif (yaml ~= 0) then + return "配置文件不存在" + end +end + +local e,a={} +for t,o in ipairs(fs.glob("/etc/openclash/config/*"))do +a=fs.stat(o) +if a then +e[t]={} +e[t].num=string.format(t) +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 + e[t].state=translate("Enable") +else + e[t].state=translate("Disable") +end +e[t].size=tostring(a.size) +e[t].check=translate(config_check(CONFIG_FILE)) +end +end +form=SimpleForm("filelist") +form.reset=false +form.submit=false +tb=form:section(Table,e) +st=tb:option(DummyValue,"state",translate("State")) +st.template="openclash/cfg_check" +nm=tb:option(DummyValue,"name",translate("Config Alias")) +mt=tb:option(DummyValue,"mtime",translate("Update Time")) +ck=tb:option(DummyValue,"check",translate("启动参数检查")) +ck.template="openclash/cfg_check" + btnis=tb:option(Button,"switch",translate("Switch Config")) btnis.template="openclash/other_button" btnis.render=function(o,t,a) 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 a3fa1ca498..5c7773c213 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 @@ -8,6 +8,11 @@ local fs = require "luci.openclash" local uci = require("luci.model.uci").cursor() local CHIF = "0" +font_green = [[]] +font_off = [[]] +bold_on = [[]] +bold_off = [[]] + function IsYamlFile(e) e=e or"" local e=string.lower(string.sub(e,-5,-1)) @@ -133,6 +138,7 @@ form.reset=false form.submit=false tb=form:section(Table,e) st=tb:option(DummyValue,"state",translate("State")) +st.template="openclash/cfg_check" nm=tb:option(DummyValue,"name",translate("Config Alias")) mt=tb:option(DummyValue,"mtime",translate("Update Time")) sz=tb:option(DummyValue,"size",translate("Size")) @@ -277,10 +283,12 @@ s = m:section(Table, tab) local conf = string.sub(luci.sys.exec("uci get openclash.config.config_path"), 1, -2) local dconf = "/etc/openclash/default.yaml" +local conf_name = fs.basename(conf) +if not conf_name then conf_name = "config.yaml" end sev = s:option(Value, "user") sev.template = "cbi/tvalue" -sev.description = translate("You Can Modify config file Here, Except The Settings That Were Taken Over") +sev.description = translate("Modify Your Config file:").." "..font_green..bold_on..conf_name..bold_off..font_off.." "..translate("Here, Except The Settings That Were Taken Over") sev.rows = 40 sev.wrap = "off" sev.cfgvalue = function(self, section) @@ -289,7 +297,7 @@ end sev.write = function(self, section, value) if (CHIF == "0") then value = value:gsub("\r\n?", "\n") - NXFS.writefile(conf, value) + NXFS.writefile(conf, value) end end diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-rules-manage.lua b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-rules-manage.lua new file mode 100644 index 0000000000..9c84eb9995 --- /dev/null +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-rules-manage.lua @@ -0,0 +1,88 @@ + +local form, m +local openclash = "openclash" +local NXFS = require "nixio.fs" +local SYS = require "luci.sys" +local HTTP = require "luci.http" +local DISP = require "luci.dispatcher" +local UTIL = require "luci.util" +local fs = require "luci.openclash" +local uci = require "luci.model.uci".cursor() + +m = SimpleForm("openclash", translate("Game Rules List")) +m.description=translate("规则项目: SSTap-Rule ( https://github.com/FQrabbit/SSTap-Rule )
") +m.reset = false +m.submit = false + +local t = { + {Apply} +} + +a = m:section(Table, t) + +o = a:option(Button, "Apply") +o.inputtitle = translate("Back Configurations") +o.inputstyle = "apply" +o.write = function() + HTTP.redirect(DISP.build_url("admin", "services", "openclash", "game-settings")) +end + +if not NXFS.access("/tmp/rules_name") then + SYS.call("awk -F ',' '{print $1}' /etc/openclash/game_rules.list > /tmp/rules_name 2>/dev/null") +end +file = io.open("/tmp/rules_name", "r"); + +---- Rules List +local e={},o,t +if NXFS.access("/tmp/rules_name") then +for o in file:lines() do +table.insert(e,o) +end +for t,o in ipairs(e) do +e[t]={} +e[t].num=string.format(t) +e[t].name=o +e[t].filename=string.sub(luci.sys.exec(string.format("grep -F '%s,' /etc/openclash/game_rules.list |awk -F ',' '{print $3}' 2>/dev/null",e[t].name)),1,-2) +if e[t].filename == "" then +e[t].filename=string.sub(luci.sys.exec(string.format("grep -F '%s,' /etc/openclash/game_rules.list |awk -F ',' '{print $2}' 2>/dev/null",e[t].name)),1,-2) +end +RULE_FILE="/etc/openclash/game_rules/".. e[t].filename +if fs.mtime(RULE_FILE) then +e[t].mtime=os.date("%Y-%m-%d %H:%M:%S",fs.mtime(RULE_FILE)) +else +e[t].mtime="/" +end +if fs.isfile(RULE_FILE) then + e[t].exist=translate("Exist") +else + e[t].exist=translate("Not Exist") +end +e[t].remove=0 +end +end +file:close() + +form=SimpleForm("filelist") +form.reset=false +form.submit=false +tb=form:section(Table,e) +nu=tb:option(DummyValue,"num",translate("Order Number")) +st=tb:option(DummyValue,"exist",translate("State")) +nm=tb:option(DummyValue,"name",translate("Rule Name")) +fm=tb:option(DummyValue,"filename",translate("File Name")) +mt=tb:option(DummyValue,"mtime",translate("Update Time")) + +btnis=tb:option(DummyValue,"filename",translate("Download Rule")) +btnis.template="openclash/download_game_rule" + +btnrm=tb:option(Button,"remove",translate("Remove")) +btnrm.render=function(e,t,a) +e.inputstyle="reset" +Button.render(e,t,a) +end +btnrm.write=function(a,t) +fs.unlink("/etc/openclash/game_rules/"..e[t].filename) +HTTP.redirect(DISP.build_url("admin", "services", "openclash", "game-rules-manage")) +end + +return m, form 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 bbb7b3ce03..a32e2dcc36 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 @@ -14,7 +14,7 @@ m.pageaction = false m.description=translate("注意事项:
游戏代理为测试功能,不保证可用性。其中游戏模式使用的内核由comzyh修改 \
项目地址:https://github.com/comzyh/clash
使用步骤: \
1、在《服务器与策略组管理》页面创建您准备使用的游戏策略组和游戏节点(节点添加时必须选择要加入的策略组),策略组类型建议:FallBack,游戏节点必须支持UDP \ -
2、在此页面的游戏规则列表下载您要使用的游戏规则 \ +
2、点击《游戏规则管理》按钮进入游戏规则列表下载您要使用的游戏规则 \
3、在此页面上方设置您已下载的游戏规则的对应策略组并保存设置 \
4、替换内核一,下载地址:https://github.com/Dreamacro/clash/releases/tag/TUN \
或替换内核二,下载地址:https://github.com/vernesong/OpenClash/releases/tag/TUN \ @@ -39,11 +39,6 @@ function IsYmlFile(e) return e == ".yml" end -if not NXFS.access("/tmp/rules_name") then - SYS.call("awk -F ',' '{print $1}' /etc/openclash/game_rules.list > /tmp/rules_name 2>/dev/null") -end -file = io.open("/tmp/rules_name", "r"); - -- [[ Edit Game Rule ]] -- s = m:section(TypedSection, "game_config") s.anonymous = true @@ -104,58 +99,17 @@ o:value("DIRECT") o:value("REJECT") o.rmempty = true ----- Rules List -local e={},o,t -if NXFS.access("/tmp/rules_name") then -for o in file:lines() do -table.insert(e,o) -end -for t,o in ipairs(e) do -e[t]={} -e[t].num=string.format(t) -e[t].name=o -e[t].filename=string.sub(luci.sys.exec(string.format("grep -F '%s,' /etc/openclash/game_rules.list |awk -F ',' '{print $3}' 2>/dev/null",e[t].name)),1,-2) -if e[t].filename == "" then -e[t].filename=string.sub(luci.sys.exec(string.format("grep -F '%s,' /etc/openclash/game_rules.list |awk -F ',' '{print $2}' 2>/dev/null",e[t].name)),1,-2) -end -RULE_FILE="/etc/openclash/game_rules/".. e[t].filename -if fs.mtime(RULE_FILE) then -e[t].mtime=os.date("%Y-%m-%d %H:%M:%S",fs.mtime(RULE_FILE)) -else -e[t].mtime="/" -end -if fs.isfile(RULE_FILE) then - e[t].exist=translate("Exist") -else - e[t].exist=translate("Not Exist") -end -e[t].remove=0 -end -end -file:close() +local rm = { + {rule_mg} +} -form=SimpleForm("filelist", translate("Game Rules List")) -form.description=translate("规则项目: SSTap-Rule ( https://github.com/FQrabbit/SSTap-Rule )
") -form.reset=false -form.submit=false -tb=form:section(Table,e) -nu=tb:option(DummyValue,"num",translate("Order Number")) -st=tb:option(DummyValue,"exist",translate("State")) -nm=tb:option(DummyValue,"name",translate("Rule Name")) -fm=tb:option(DummyValue,"filename",translate("File Name")) -mt=tb:option(DummyValue,"mtime",translate("Update Time")) +rmg = m:section(Table, rm) -btnis=tb:option(DummyValue,"filename",translate("Download Rule")) -btnis.template="openclash/download_game_rule" - -btnrm=tb:option(Button,"remove",translate("Remove")) -btnrm.render=function(e,t,a) -e.inputstyle="reset" -Button.render(e,t,a) -end -btnrm.write=function(a,t) -fs.unlink("/etc/openclash/game_rules/"..e[t].filename) -HTTP.redirect(DISP.build_url("admin", "services", "openclash", "game-settings")) +o = rmg:option(Button, "rule_mg") +o.inputtitle = translate("Game Rules Manage") +o.inputstyle = "reload" +o.write = function() + HTTP.redirect(DISP.build_url("admin", "services", "openclash", "game-rules-manage")) end local t = { @@ -181,4 +135,4 @@ o.write = function() HTTP.redirect(DISP.build_url("admin", "services", "openclash")) end -return m, form +return m diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/cfg_check.htm b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/cfg_check.htm new file mode 100644 index 0000000000..c4852695a9 --- /dev/null +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/cfg_check.htm @@ -0,0 +1,18 @@ +<%+cbi/valueheader%> +
+<% + local val = self:cfgvalue(section) + if val == "启用" or val == "Enable" or val == "检查通过" or val == "Config Normal" then +%> +
+<% + else +%> +
+<% + end + write(pcdata(val)) +%> +
+
+<%+cbi/valuefooter%> diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/download_game_rule.htm b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/download_game_rule.htm index 4b5e37fcbb..9647d72f88 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/download_game_rule.htm +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/download_game_rule.htm @@ -14,15 +14,19 @@ if ( x && x.status == 200 ) { if(status.game_rule_download_status=="0") { - btn.value = '<%:下载失败%>'; + btn.value = '<%:下载失败%>'; } - else + else if (status.game_rule_download_status=="1") { - btn.value = '<%:下载成功%>'; + btn.value = '<%:下载成功%>'; + } + else if (status.game_rule_download_status=="2") + { + btn.value = '<%:规则没有更新%>'; } } else { - btn.value = '<%:下载超时%>'; + btn.value = '<%:下载超时%>'; } } ); diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/state.htm b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/state.htm index 92ac622af3..0ae9314d94 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/state.htm +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/state.htm @@ -3,39 +3,21 @@ -

- 一些必要的状态显示,运行前请确保各项目显示正常,需要更新请到全局设置页面操作 + 组件的状态显示,运行前请确保各项目显示正常,需要更新请到全局设置页面操作

正在使用的配置文件 <%:Collecting data...%> 启动参数检查(配置文件) <%:Collecting data...%>
GEOIP(By MaxMind)数据库日期 <%:Collecting data...%> lhie1 规则更新日期 <%:Collecting data...%>
ConnersHua 规则更新日期 <%:Collecting data...%> ConnersHua 回国规则更新日期 <%:Collecting data...%>
+ - + - + - + diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.241abbb3a6eecf3d305f.css b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.241abbb3a6eecf3d305f.css new file mode 100644 index 0000000000..e352013332 --- /dev/null +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.241abbb3a6eecf3d305f.css @@ -0,0 +1,7 @@ +._37wt2_a2Gx{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}._37wt2_a2Gx .L80zPM0Rx0{display:-webkit-inline-box;display:inline-flex;-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}._37wt2_a2Gx .L80zPM0Rx0._36RO7_wtuv{-webkit-transform:rotate(180deg);transform:rotate(180deg)}._37wt2_a2Gx .L80zPM0Rx0:focus{outline:var(--color-focus-blue) solid 1px}._1s98xvUoBx{font-family:var(--font-normal);font-size:.75em;margin-left:3px;padding:2px 7px;display:-webkit-inline-box;display:inline-flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;background-color:var(--bg-near-transparent);border-radius:30px} +._2V-RqIAl7n{border-radius:20px;color:#eee;font-size:.6em}@media screen and (min-width:30em){._2V-RqIAl7n{font-size:1em}} +.NpfXwxWAxo{position:relative;padding:5px;border-radius:8px;overflow:hidden;max-width:280px;background-color:var(--color-bg-proxy-selected)}@media screen and (min-width:30em){.NpfXwxWAxo{min-width:200px;border-radius:10px;padding:10px}}.NpfXwxWAxo._2zD7drviYH{background-color:var(--color-focus-blue);color:#ddd}.NpfXwxWAxo._2bylJNYYdN{opacity:.5}._1rVl-Kdmss{font-family:var(--font-mono);font-size:.6em}@media screen and (min-width:30em){._1rVl-Kdmss{font-size:1em}}.aS2noEcBcP{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:justify;justify-content:space-between}._3kdi5nima5{width:100%;overflow:hidden;text-overflow:ellipsis;margin-bottom:5px;font-size:.85em}@media screen and (min-width:30em){._3kdi5nima5{font-size:1.1em}}._3NpxWygDxO{width:12px;height:12px;border-radius:8px}._3NpxWygDxO ._2zD7drviYH{outline:1px solid pink} +._3PCSxT0l14{margin-bottom:12px}._1yYRIyvlRd{display:-webkit-box;display:flex;flex-wrap:wrap;margin-top:8px}._1OcDlvlM5R{margin-right:5px;margin-bottom:5px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}@media screen and (min-width:30em){._1OcDlvlM5R{margin-right:10px;margin-bottom:10px}}._1OcDlvlM5R._3oAxPKtZFv{cursor:pointer}._1OcDlvlM5R._3oAxPKtZFv:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px)} +._3GVE9k27aM{margin-bottom:12px}._3GVE9k27aM small{color:#777}._1PV2l5z2zN{padding:10px 15px}@media screen and (min-width:30em){._1PV2l5z2zN{padding:10px 40px}}._1b5XrAhEUm{display:-webkit-box;display:flex}._1b5XrAhEUm button{margin:0 5px}._1b5XrAhEUm button:first-child{margin-left:0}._2t6Q6BkZ73{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;cursor:pointer} +.rtf{box-sizing:border-box;margin:25px;position:fixed;white-space:nowrap;z-index:9998;padding-left:0;list-style:none}.rtf.open .rtf--mb>*{-webkit-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(315deg);transform:rotate(315deg);-webkit-transition:transform .2s ease-in-out;transition:transform .2s ease-in-out}.rtf.open .rtf--mb>ul{list-style:none;margin:0;padding:0}.rtf.open .rtf--ab__c:hover>span,.rtf.open .rtf--ab__c>span.always-show{-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out;opacity:.9}.rtf.open .rtf--ab__c:first-child{-webkit-transform:translateY(-60px) scale(1);transform:translateY(-60px) scale(1);-webkit-transition-delay:.03s;transition-delay:.03s}.rtf.open .rtf--ab__c:first-child.top{-webkit-transform:translateY(60px) scale(1);transform:translateY(60px) scale(1)}.rtf.open .rtf--ab__c:nth-child(2){-webkit-transform:translateY(-120px) scale(1);transform:translateY(-120px) scale(1);-webkit-transition-delay:.09s;transition-delay:.09s}.rtf.open .rtf--ab__c:nth-child(2).top{-webkit-transform:translateY(120px) scale(1);transform:translateY(120px) scale(1)}.rtf.open .rtf--ab__c:nth-child(3){-webkit-transform:translateY(-180px) scale(1);transform:translateY(-180px) scale(1);-webkit-transition-delay:.12s;transition-delay:.12s}.rtf.open .rtf--ab__c:nth-child(3).top{-webkit-transform:translateY(180px) scale(1);transform:translateY(180px) scale(1)}.rtf.open .rtf--ab__c:nth-child(4){-webkit-transform:translateY(-240px) scale(1);transform:translateY(-240px) scale(1);-webkit-transition-delay:.15s;transition-delay:.15s}.rtf.open .rtf--ab__c:nth-child(4).top{-webkit-transform:translateY(240px) scale(1);transform:translateY(240px) scale(1)}.rtf.open .rtf--ab__c:nth-child(5){-webkit-transform:translateY(-300px) scale(1);transform:translateY(-300px) scale(1);-webkit-transition-delay:.18s;transition-delay:.18s}.rtf.open .rtf--ab__c:nth-child(5).top{-webkit-transform:translateY(300px) scale(1);transform:translateY(300px) scale(1)}.rtf.open .rtf--ab__c:nth-child(6){-webkit-transform:translateY(-360px) scale(1);transform:translateY(-360px) scale(1);-webkit-transition-delay:.21s;transition-delay:.21s}.rtf.open .rtf--ab__c:nth-child(6).top{-webkit-transform:translateY(360px) scale(1);transform:translateY(360px) scale(1)}.rtf--mb__c{padding:25px;margin:-25px}.rtf--mb__c :last-child{margin-bottom:0}.rtf--mb__c:hover>span,.rtf--mb__c>span.always-show{opacity:.9}.rtf--mb__c:hover>span,.rtf--mb__c>span,.rtf--mb__c>span.always-show{-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.rtf--mb__c>span{opacity:0;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:6px;margin-left:4px;background:rgba(0,0,0,.75);padding:2px 4px;border-radius:2px;color:#fff;font-size:13px;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28)}.rtf--mb__c>span.right{right:100%}.rtf--mb{height:56px;width:56px;z-index:9999;background:#387cec;display:-webkit-inline-box;display:inline-flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;position:relative;border:none;border-radius:50%;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28);cursor:pointer;outline:none;padding:0;-webkit-user-drag:none;font-weight:700;color:#f1f1f1;font-size:18px}.rtf--ab__c,.rtf--mb>*{-webkit-transition:transform .2s ease-in-out;transition:transform .2s ease-in-out}.rtf--ab__c{display:block;position:absolute;top:0;right:1px;padding:10px 0;margin:-10px 0}.rtf--ab__c>span{opacity:0;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:6px;background:rgba(0,0,0,.75);padding:2px 4px;border-radius:2px;color:#fff;font-size:13px;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28)}.rtf--ab__c>span.right{right:100%}.rtf--ab__c:first-child{-webkit-transform:translateY(-60px) scale(0);transform:translateY(-60px) scale(0);-webkit-transition-delay:.21s;transition-delay:.21s}.rtf--ab__c:first-child.top{-webkit-transform:translateY(60px) scale(0);transform:translateY(60px) scale(0)}.rtf--ab__c:nth-child(2){-webkit-transform:translateY(-120px) scale(0);transform:translateY(-120px) scale(0);-webkit-transition-delay:.18s;transition-delay:.18s}.rtf--ab__c:nth-child(2).top{-webkit-transform:translateY(120px) scale(0);transform:translateY(120px) scale(0)}.rtf--ab__c:nth-child(3){-webkit-transform:translateY(-180px) scale(0);transform:translateY(-180px) scale(0);-webkit-transition-delay:.15s;transition-delay:.15s}.rtf--ab__c:nth-child(3).top{-webkit-transform:translateY(180px) scale(0);transform:translateY(180px) scale(0)}.rtf--ab__c:nth-child(4){-webkit-transform:translateY(-240px) scale(0);transform:translateY(-240px) scale(0);-webkit-transition-delay:.12s;transition-delay:.12s}.rtf--ab__c:nth-child(4).top{-webkit-transform:translateY(240px) scale(0);transform:translateY(240px) scale(0)}.rtf--ab__c:nth-child(5){-webkit-transform:translateY(-300px) scale(0);transform:translateY(-300px) scale(0);-webkit-transition-delay:.09s;transition-delay:.09s}.rtf--ab__c:nth-child(5).top{-webkit-transform:translateY(300px) scale(0);transform:translateY(300px) scale(0)}.rtf--ab__c:nth-child(6){-webkit-transform:translateY(-360px) scale(0);transform:translateY(-360px) scale(0);-webkit-transition-delay:.03s;transition-delay:.03s}.rtf--ab__c:nth-child(6).top{-webkit-transform:translateY(360px) scale(0);transform:translateY(360px) scale(0)}.rtf--ab{height:48px;width:48px;background-color:#aaa;display:-webkit-inline-box;display:inline-flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;position:relative;border:none;border-radius:50%;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28);cursor:pointer;outline:none;padding:0;-webkit-user-drag:none;font-weight:700;color:#f1f1f1;margin-right:4px;font-size:16px;z-index:10000}.rtf--ab:hover{background:#387cec;border:1px solid #387cec;color:#fff}.rtf--ab:focus{border-color:var(--color-focus-blue)} +._1myfcMimT9{padding:10px 15px}@media screen and (min-width:30em){._1myfcMimT9{padding:10px 40px}} diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.6cc15bdf1bc70c0d1a8d.js b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.6cc15bdf1bc70c0d1a8d.js deleted file mode 100644 index b5466646eb..0000000000 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.6cc15bdf1bc70c0d1a8d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{D46e:function(e,a,t){e.exports={header:"_3PCSxT0l14",list:"_1yYRIyvlRd",proxy:"_1OcDlvlM5R",proxySelectable:"_3oAxPKtZFv"}},FWZb:function(e,a,t){e.exports={proxy:"NpfXwxWAxo",now:"_2zD7drviYH",error:"_2bylJNYYdN",proxyType:"_1rVl-Kdmss",proxyName:"_3kdi5nima5",proxyLatencyWrap:"_12JM32OJa5",proxySmall:"_3NpxWygDxO"}},L5YO:function(e,a,t){e.exports={group:"_1myfcMimT9"}},RbL9:function(e,a,t){e.exports={proxyLatency:"_2V-RqIAl7n"}},wyCT:function(e,a,t){"use strict";t.r(a);t("2B1R"),t("DQNa");var n=t("q1tI"),r=t.n(n),c=t("WfPo"),i=t("DKqX"),o=(t("sMBO"),t("rePB")),l=t("TSYQ"),s=t.n(l),u=t("RbL9"),m=t.n(u);function p(e){var a=e.number,t=e.color;return r.a.createElement("span",{className:m.a.proxyLatency,style:{color:t}},r.a.createElement("span",null,a," ms"))}var d=t("HGr0"),f=t("FWZb"),v=t.n(f),b=r.a.useMemo,y={good:"#67c23a",normal:"#d4b75c",bad:"#e67f3c",na:"#909399"};function E(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=e.number;e.error;return a<200?y.good:a<400?y.normal:"number"==typeof a?y.bad:y.na}var x=function(e,a){var t=a.name,n=Object(d.c)(e),r=Object(d.b)(e);return{proxy:n[t],latency:r[t]}},O=Object(c.a)(x)((function(e){var a,t=e.now,n=e.name,c=e.proxy,i=e.latency,l=b((function(){return E(i)}),[i]);return r.a.createElement("div",{className:s()(v.a.proxy,(a={},Object(o.a)(a,v.a.now,t),Object(o.a)(a,v.a.error,i&&i.error),a))},r.a.createElement("div",{className:v.a.proxyName},n),r.a.createElement("div",{className:v.a.proxyType,style:{opacity:t?.6:.2}},c.type),r.a.createElement("div",{className:v.a.proxyLatencyWrap},i&&i.number?r.a.createElement(p,{number:i.number,color:l}):null))})),h=Object(c.a)(x)((function(e){var a=e.now,t=(e.name,e.proxy,e.latency),n=b((function(){return E(t)}),[t]);return r.a.createElement("div",{className:s()(v.a.proxySmall,Object(o.a)({},v.a.now,a)),style:{backgroundColor:n}})})),w=t("riol"),j=t("D46e"),N=t.n(j),g=r.a.memo,k=r.a.useCallback,C=r.a.useMemo;function _(e){var a=e.all,t=e.now,n=e.isSelectable,c=e.itemOnTapCallback;return r.a.createElement("div",{className:N.a.list},a.map((function(e){var a=s()(N.a.proxy,Object(o.a)({},N.a.proxySelectable,n));return r.a.createElement("div",{className:a,key:e,onClick:function(){n&&c&&c(e)}},r.a.createElement(O,{name:e,now:e===t}))})))}function A(e){var a=e.all,t=e.now,n=e.isSelectable,c=e.itemOnTapCallback;return r.a.createElement("div",{className:N.a.list},a.map((function(e){var a=s()(N.a.proxy,Object(o.a)({},N.a.proxySelectable,n));return r.a.createElement("div",{className:a,key:e,onClick:function(){n&&c&&c(e)}},r.a.createElement(h,{name:e,now:e===t}))})))}var D=g((function(e){var a=e.name,t=e.proxies,n=e.apiConfig,c=e.dispatch,i=t[a],o=i.all,l=i.type,s=i.now,u=C((function(){return"Selector"===l}),[l]),m=k((function(e){u&&c(Object(d.i)(n,a,e))}),[n,c,a,u]);return r.a.createElement("div",{className:N.a.group},r.a.createElement("div",{className:N.a.header},r.a.createElement(w.b,{name:a,type:i.type})),r.a.createElement(_,{all:o,now:s,isSelectable:u,itemOnTapCallback:m}))})),S=t("5Wrh"),L=t("ySHw"),P=t("o0o1"),T=t.n(P),R=(t("ls82"),t("HaE+")),M=t("ODXe"),W=t("j7o3"),F=t("OAQO"),Y=t("FVam"),H=t("bdgK"),Z=t("ZMKu"),q=t("OADI"),z=t("x5hA"),J=t.n(z),K=r.a.memo,V=r.a.useState,B=r.a.useRef,I=r.a.useEffect,Q=r.a.useCallback;var X={rest:{scale:1},pressed:{scale:.95}},G={rest:{rotate:0},hover:{rotate:360,transition:{duration:.3}}};function U(){return r.a.createElement(Z.a.div,{className:J.a.refresh,variants:X,initial:"rest",whileHover:"hover",whileTap:"pressed"},r.a.createElement(Z.a.div,{className:"flexCenter",variants:G},r.a.createElement(F.a,{size:16})))}var $={initialOpen:{height:"auto",transition:{duration:0}},open:function(e){return{height:e,opacity:1,visibility:"visible",transition:{duration:.3}}},closed:{height:0,opacity:0,visibility:"hidden",transition:{duration:.3}}},ee={open:{x:0},closed:{x:20}},ae=K((function(e){var a,t,n=e.children,c=e.isOpen,i=(a=c,t=B(),I((function(){t.current=a}),[a]),t.current),o=function(){var e=B(),a=V({height:0}),t=Object(M.a)(a,2),n=t[0],r=t[1];return I((function(){var a=new H.a((function(e){var a=Object(M.a)(e,1)[0];return r(a.contentRect)}));return e.current&&a.observe(e.current),function(){return a.disconnect()}}),[]),[e,n]}(),l=Object(M.a)(o,2),s=l[0],u=l[1].height;return r.a.createElement("div",null,r.a.createElement(Z.a.div,{animate:c&&i===c?"initialOpen":c?"open":"closed",custom:u,variants:$},r.a.createElement(Z.a.div,{variants:ee,ref:s},n)))})),te=Object(c.a)((function(e){return{apiConfig:Object(q.b)(e)}}))((function(e){var a=e.item,t=e.dispatch,n=e.apiConfig,c=V(!1),i=Object(M.a)(c,2),l=i[0],u=i[1],m=Q((function(){return t(Object(d.j)(n,a.name))}),[n,t,a.name]),p=Q(Object(R.a)(T.a.mark((function e(){return T.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return u(!0),e.next=3,t(Object(d.f)(n,a.name));case 3:u(!1);case 4:case"end":return e.stop()}}),e)}))),[n,t,a.name,u]),f=V(!1),v=Object(M.a)(f,2),b=v[0],y=v[1],E=Q((function(){return y((function(e){return!e}))}),[]),x=Object(Y.a)(new Date(a.updatedAt),new Date);return r.a.createElement("div",{className:J.a.body},r.a.createElement("div",{className:J.a.header,onClick:E},r.a.createElement(w.b,{name:a.name,type:a.vehicleType}),r.a.createElement(S.a,{kind:"minimal"},r.a.createElement("span",{className:s()(J.a.arrow,Object(o.a)({},J.a.isOpen,b))},r.a.createElement(W.a,null)))),r.a.createElement("div",{className:J.a.updatedAt},r.a.createElement("small",null,"Updated ",x," ago")),r.a.createElement(ae,{isOpen:b},r.a.createElement(_,{all:a.proxies}),r.a.createElement("div",{className:J.a.actionFooter},r.a.createElement(S.a,{text:"Update",start:r.a.createElement(U,null),onClick:m}),r.a.createElement(S.a,{text:"Health Check",start:r.a.createElement(L.a,{size:16}),onClick:p,isLoading:l}))),r.a.createElement(ae,{isOpen:!b},r.a.createElement(A,{all:a.proxies})))}));var ne=function(e){var a=e.items;return 0===a.length?null:r.a.createElement(r.a.Fragment,null,r.a.createElement(i.a,{title:"Proxy Provider"}),r.a.createElement("div",null,a.map((function(e){return r.a.createElement(te,{key:e.name,item:e})}))))},re=t("L5YO"),ce=t.n(re),ie=r.a.useEffect,oe=r.a.useMemo,le=r.a.useCallback,se=r.a.useRef;a.default=Object(c.a)((function(e){return{apiConfig:Object(q.b)(e),groupNames:Object(d.d)(e),proxies:Object(d.c)(e),proxyProviders:Object(d.e)(e),delay:Object(d.b)(e)}}))((function(e){var a=e.dispatch,t=e.groupNames,n=e.proxies,c=e.delay,o=e.proxyProviders,l=e.apiConfig,s=se({}),u=le((function(){return a(Object(d.h)(l))}),[l,a]),m=le((function(){s.current.startAt=new Date,a(Object(d.a)(l)).then((function(){s.current.completeAt=new Date}))}),[l,a]);ie((function(){m();var e=function(){s.current.startAt&&new Date-s.current.startAt>3e4&&m()};return window.addEventListener("focus",e,!1),function(){return window.removeEventListener("focus",e,!1)}}),[m]);var p=oe((function(){return r.a.createElement(L.a,{width:16})}),[]);return r.a.createElement(r.a.Fragment,null,r.a.createElement(i.a,{title:"Proxies"}),r.a.createElement("div",null,r.a.createElement("div",{className:"fabgrp"},r.a.createElement(S.a,{text:"Test Latency",start:p,onClick:u})),t.map((function(e){return r.a.createElement("div",{className:ce.a.group,key:e},r.a.createElement(D,{name:e,proxies:n,delay:c,apiConfig:l,dispatch:a}))}))),r.a.createElement(ne,{items:o}),r.a.createElement("div",{style:{height:60}}))}))},x5hA:function(e,a,t){e.exports={header:"_1cq9WGaZ9s",arrow:"_1cAwPwoPmt",isOpen:"sDt5qh1OfE",updatedAt:"_3GVE9k27aM",body:"_1PV2l5z2zN",actionFooter:"_1b5XrAhEUm",refresh:"_2t6Q6BkZ73"}}}]); \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.c47b16ee58ce8279a498.js b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.c47b16ee58ce8279a498.js new file mode 100644 index 0000000000..7e7ecfb81d --- /dev/null +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.c47b16ee58ce8279a498.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{D46e:function(e,t,a){e.exports={header:"_3PCSxT0l14",list:"_1yYRIyvlRd",proxy:"_1OcDlvlM5R",proxySelectable:"_3oAxPKtZFv"}},FWZb:function(e,t,a){e.exports={proxy:"NpfXwxWAxo",now:"_2zD7drviYH",error:"_2bylJNYYdN",proxyType:"_1rVl-Kdmss",row:"aS2noEcBcP",proxyName:"_3kdi5nima5",proxySmall:"_3NpxWygDxO"}},L5YO:function(e,t,a){e.exports={group:"_1myfcMimT9"}},RL2M:function(e,t,a){e.exports={header:"_37wt2_a2Gx",arrow:"L80zPM0Rx0",isOpen:"_36RO7_wtuv",qty:"_1s98xvUoBx"}},RbL9:function(e,t,a){e.exports={proxyLatency:"_2V-RqIAl7n"}},wyCT:function(e,t,a){"use strict";a.r(t);a("2B1R");var n=a("q1tI"),r=a.n(n),c=a("WfPo"),l=a("DKqX"),i=(a("TeQF"),a("ToJy"),a("KQm4")),o=a("rePB"),u=a("ODXe"),s=a("TSYQ"),m=a.n(s),p=a("Wwog"),f=a("HGr0"),v=a("j7o3"),b=a("riol"),d=a("5Wrh"),y=a("RL2M"),E=a.n(y);function O(e){var t=e.name,a=e.type,n=e.toggle,c=e.isOpen,l=e.qty;return r.a.createElement("div",{className:E.a.header},r.a.createElement("div",{onClick:n,style:{cursor:"pointer"}},r.a.createElement(b.b,{name:t,type:a})),"number"==typeof l?r.a.createElement("span",{className:E.a.qty},l):null,r.a.createElement(d.a,{kind:"minimal",onClick:n},r.a.createElement("span",{className:m()(E.a.arrow,Object(o.a)({},E.a.isOpen,c))},r.a.createElement(v.a,{size:20}))))}var x=a("RbL9"),h=a.n(x);function w(e){var t=e.number,a=e.color;return r.a.createElement("span",{className:h.a.proxyLatency,style:{color:a}},r.a.createElement("span",null,t," ms"))}var j=a("FWZb"),g=a.n(j),N=r.a.useMemo,k="#67c23a",C="#d4b75c",_="#e67f3c",A="#909399";function T(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.number;e.error;return t<200?k:t<400?C:"number"==typeof t?_:A}var S=function(e,t){var a=t.name,n=Object(f.c)(e),r=Object(f.b)(e);return{proxy:n[a],latency:r[a]}},R=Object(c.a)(S)((function(e){var t,a=e.now,n=e.name,c=e.proxy,l=e.latency,i=N((function(){return T(l)}),[l]);return r.a.createElement("div",{className:m()(g.a.proxy,(t={},Object(o.a)(t,g.a.now,a),Object(o.a)(t,g.a.error,l&&l.error),t))},r.a.createElement("div",{className:g.a.proxyName},n),r.a.createElement("div",{className:g.a.row},r.a.createElement("span",{className:g.a.proxyType,style:{opacity:a?.6:.2}},c.type),l&&l.number?r.a.createElement(w,{number:l.number,color:i}):null))})),D=Object(c.a)(S)((function(e){var t=e.now,a=e.name,n=(e.proxy,e.latency),c=N((function(){return T(n)}),[n]),l=N((function(){var e=a;return n&&"number"==typeof n.number&&(e+=" "+n.number+" ms"),e}),[a,n]);return r.a.createElement("div",{title:l,className:m()(g.a.proxySmall,Object(o.a)({},g.a.now,t)),style:{backgroundColor:c}})})),P=r.a.useState,L=r.a.useCallback;var F=a("D46e"),q=a.n(F),z=r.a.useCallback,M=r.a.useMemo;function H(e){var t=e.all,a=e.now,n=e.isSelectable,c=e.itemOnTapCallback,l=e.sortedAll||t;return r.a.createElement("div",{className:q.a.list},l.map((function(e){var t=m()(q.a.proxy,Object(o.a)({},q.a.proxySelectable,n));return r.a.createElement("div",{className:t,key:e,onClick:function(){n&&c&&c(e)}},r.a.createElement(R,{name:e,now:e===a}))})))}var Q=function(e,t){return void 0===e?0:!e.error&&e.number>0?e.number:t};var W=Object(p.a)((function(e,t,a){var n=Object(i.a)(e);return a&&(n=function(e,t){return e.filter((function(e){var a=t[e];return void 0===a||!a.error&&0!==a.number}))}(e,t)),n.sort((function(e,a){return Q(t[e],999999)-Q(t[a],999999)}))}));function Y(e){var t=e.all,a=e.now,n=e.isSelectable,c=e.itemOnTapCallback;return r.a.createElement("div",{className:q.a.list},t.map((function(e){var t=m()(q.a.proxy,Object(o.a)({},q.a.proxySelectable,n));return r.a.createElement("div",{className:t,key:e,onClick:function(){n&&c&&c(e)}},r.a.createElement(D,{name:e,now:e===a}))})))}var Z=Object(c.a)((function(e,t){var a=t.name,n=t.delay,r=Object(f.c)(e),c=Object(f.f)(e),l=r[a],i=l.all,o=l.type,u=l.now;return{all:W(i,n,c),type:o,now:u}}))((function(e){var t=e.name,a=e.all,n=e.type,c=e.now,l=e.apiConfig,i=e.dispatch,o=M((function(){return"Selector"===n}),[n]),s=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=P(e),a=Object(u.a)(t,2),n=a[0],r=a[1],c=L((function(){return r((function(e){return!e}))}),[]);return[n,c]}(!0),m=Object(u.a)(s,2),p=m[0],v=m[1],b=z((function(e){o&&i(Object(f.j)(l,t,e))}),[l,i,t,o]);return r.a.createElement("div",{className:q.a.group},r.a.createElement(O,{name:t,type:n,toggle:v,qty:a.length,isOpen:p}),p?r.a.createElement(H,{all:a,now:c,isSelectable:o,itemOnTapCallback:b}):r.a.createElement(Y,{all:a}))})),K=a("8/mu"),U=a("ySHw"),B=a("fIvA"),I=a("o0o1"),V=a.n(I),J=(a("ls82"),a("HaE+")),X=a("OAQO"),G=a("FVam"),$=a("ZMKu"),ee=a("bdgK"),te=r.a.memo,ae=r.a.useState,ne=r.a.useRef,re=r.a.useEffect;var ce={initialOpen:{height:"auto",transition:{duration:0}},open:function(e){return{height:e,opacity:1,visibility:"visible",transition:{duration:.3}}},closed:{height:0,opacity:0,visibility:"hidden",transition:{duration:.3}}},le={open:{x:0},closed:{x:20}},ie=te((function(e){var t,a,n=e.children,c=e.isOpen,l=(t=c,a=ne(),re((function(){a.current=t}),[t]),a.current),i=function(){var e=ne(),t=ae({height:0}),a=Object(u.a)(t,2),n=a[0],r=a[1];return re((function(){var t=new ee.a((function(e){var t=Object(u.a)(e,1)[0];return r(t.contentRect)}));return e.current&&t.observe(e.current),function(){return t.disconnect()}}),[]),[e,n]}(),o=Object(u.a)(i,2),s=o[0],m=o[1].height;return r.a.createElement("div",null,r.a.createElement($.a.div,{animate:c&&l===c?"initialOpen":c?"open":"closed",custom:m,variants:ce},r.a.createElement($.a.div,{variants:le,ref:s},n)))})),oe=a("OADI"),ue=a("x5hA"),se=a.n(ue),me=r.a.useState,pe=r.a.useCallback;var fe={rest:{scale:1},pressed:{scale:.95}},ve={rest:{rotate:0},hover:{rotate:360,transition:{duration:.3}}};function be(){return r.a.createElement($.a.div,{className:se.a.refresh,variants:fe,initial:"rest",whileHover:"hover",whileTap:"pressed"},r.a.createElement($.a.div,{className:"flexCenter",variants:ve},r.a.createElement(X.a,{size:16})))}var de=Object(c.a)((function(e,t){var a=t.proxies,n=Object(f.f)(e),r=Object(f.b)(e);return{apiConfig:Object(oe.b)(e),proxies:W(a,r,n)}}))((function(e){var t=e.name,a=e.proxies,n=e.vehicleType,c=e.updatedAt,l=e.dispatch,i=e.apiConfig,o=me(!1),s=Object(u.a)(o,2),m=s[0],p=s[1],v=pe((function(){return l(Object(f.l)(i,t))}),[i,l,t]),b=pe(Object(J.a)(V.a.mark((function e(){return V.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return p(!0),e.next=3,l(Object(f.g)(i,t));case 3:p(!1);case 4:case"end":return e.stop()}}),e)}))),[i,l,t,p]),y=me(!1),E=Object(u.a)(y,2),x=E[0],h=E[1],w=pe((function(){return h((function(e){return!e}))}),[]),j=Object(G.a)(new Date(c),new Date);return r.a.createElement("div",{className:se.a.body},r.a.createElement(O,{name:t,toggle:w,type:n,isOpen:x,qty:a.length}),r.a.createElement("div",{className:se.a.updatedAt},r.a.createElement("small",null,"Updated ",j," ago")),r.a.createElement(ie,{isOpen:x},r.a.createElement(H,{all:a}),r.a.createElement("div",{className:se.a.actionFooter},r.a.createElement(d.a,{text:"Update",start:r.a.createElement(be,null),onClick:v}),r.a.createElement(d.a,{text:"Health Check",start:r.a.createElement(U.a,{size:16}),onClick:b,isLoading:m}))),r.a.createElement(ie,{isOpen:!x},r.a.createElement(Y,{all:a})))}));var ye=function(e){var t=e.items;return 0===t.length?null:r.a.createElement(r.a.Fragment,null,r.a.createElement(l.a,{title:"Proxy Provider"}),r.a.createElement("div",null,t.map((function(e){return r.a.createElement(de,{key:e.name,name:e.name,proxies:e.proxies,type:e.type,vehicleType:e.vehicleType,updatedAt:e.updatedAt})}))))},Ee=a("cq0i"),Oe=(a("z9QD"),a("L5YO")),xe=a.n(Oe),he=r.a.useEffect,we=r.a.useCallback,je=r.a.useRef;t.default=Object(c.a)((function(e){return{apiConfig:Object(oe.b)(e),groupNames:Object(f.d)(e),proxyProviders:Object(f.e)(e),delay:Object(f.b)(e),filterZeroRT:Object(f.f)(e)}}))((function(e){var t=e.dispatch,a=e.groupNames,n=e.delay,i=e.proxyProviders,o=e.apiConfig,u=e.filterZeroRT,s=je({}),m=Object(c.c)().toggleUnavailableProxiesFilter,p=we((function(){return t(Object(f.i)(o))}),[o,t]),v=we((function(){s.current.startAt=new Date,t(Object(f.a)(o)).then((function(){s.current.completeAt=new Date}))}),[o,t]);return he((function(){v();var e=function(){s.current.startAt&&new Date-s.current.startAt>3e4&&v()};return window.addEventListener("focus",e,!1),function(){return window.removeEventListener("focus",e,!1)}}),[v]),r.a.createElement(r.a.Fragment,null,r.a.createElement(l.a,{title:"Proxies"}),r.a.createElement("div",null,a.map((function(e){return r.a.createElement("div",{className:xe.a.group,key:e},r.a.createElement(Z,{name:e,delay:n,apiConfig:o,dispatch:t}))}))),r.a.createElement(ye,{items:i}),r.a.createElement("div",{style:{height:60}}),r.a.createElement(Ee.b,{icon:r.a.createElement(K.a,null)},r.a.createElement(Ee.a,{text:"Test Latency",onClick:p},r.a.createElement(U.a,{width:16})),r.a.createElement(Ee.a,{text:(u?"Show":"Hide")+" Unavailable Proxies",onClick:m},r.a.createElement(B.a,{width:16}))))}))},x5hA:function(e,t,a){e.exports={updatedAt:"_3GVE9k27aM",body:"_1PV2l5z2zN",actionFooter:"_1b5XrAhEUm",refresh:"_2t6Q6BkZ73"}},z9QD:function(e,t,a){}}]); \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.d435411ad74e5f59ce94.css b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.d435411ad74e5f59ce94.css deleted file mode 100644 index 4a85d3510a..0000000000 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.d435411ad74e5f59ce94.css +++ /dev/null @@ -1,5 +0,0 @@ -._2V-RqIAl7n{border-radius:20px;padding:3px 0;color:#eee;font-size:.6em}@media screen and (min-width:30em){._2V-RqIAl7n{font-size:1em}} -.NpfXwxWAxo{position:relative;padding:5px;border-radius:8px;overflow:hidden;max-width:280px;background-color:var(--color-bg-proxy-selected)}@media screen and (min-width:30em){.NpfXwxWAxo{min-width:150px;border-radius:10px;padding:10px}}.NpfXwxWAxo._2zD7drviYH{background-color:var(--color-focus-blue);color:#ddd}.NpfXwxWAxo._2bylJNYYdN{opacity:.5}._1rVl-Kdmss{font-family:var(--font-mono);font-size:.6em}@media screen and (min-width:30em){._1rVl-Kdmss{font-size:1em}}._3kdi5nima5{width:100%;overflow:hidden;text-overflow:ellipsis;margin-bottom:5px;font-size:.85em}@media screen and (min-width:30em){._3kdi5nima5{font-size:1.1em}}._12JM32OJa5{height:30px;display:-webkit-box;display:flex;-webkit-box-align:end;align-items:flex-end}._3NpxWygDxO{width:12px;height:12px;border-radius:8px}._3NpxWygDxO ._2zD7drviYH{outline:1px solid pink} -._3PCSxT0l14{margin-bottom:12px}._1yYRIyvlRd{display:-webkit-box;display:flex;flex-wrap:wrap;margin-top:8px}._1OcDlvlM5R{margin-right:5px;margin-bottom:5px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}@media screen and (min-width:30em){._1OcDlvlM5R{margin-right:10px;margin-bottom:10px}}._1OcDlvlM5R._3oAxPKtZFv{cursor:pointer}._1OcDlvlM5R._3oAxPKtZFv:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px)} -._1cq9WGaZ9s{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;cursor:pointer}._1cq9WGaZ9s ._1cAwPwoPmt{display:-webkit-inline-box;display:inline-flex;-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}._1cq9WGaZ9s ._1cAwPwoPmt.sDt5qh1OfE{-webkit-transform:rotate(180deg);transform:rotate(180deg)}._1cq9WGaZ9s ._1cAwPwoPmt:focus{outline:var(--color-focus-blue) solid 1px}._3GVE9k27aM{margin-bottom:12px}._3GVE9k27aM small{color:#777}._1PV2l5z2zN{padding:10px 15px}@media screen and (min-width:30em){._1PV2l5z2zN{padding:10px 40px}}._1b5XrAhEUm{display:-webkit-box;display:flex}._1b5XrAhEUm button{margin:0 5px}._1b5XrAhEUm button:first-child{margin-left:0}._2t6Q6BkZ73{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;cursor:pointer} -._1myfcMimT9{padding:10px 15px}@media screen and (min-width:30em){._1myfcMimT9{padding:10px 40px}} diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/react~app.0e7d4c38821c1ecfbf2f.js b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/react~app.0e7d4c38821c1ecfbf2f.js deleted file mode 100644 index 621120bbde..0000000000 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/react~app.0e7d4c38821c1ecfbf2f.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see react~app.0e7d4c38821c1ecfbf2f.js.LICENSE */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{i8i4: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(e){console.error(e)}}}(),e.exports=n("yl30")},q1tI:function(e,t,n){"use strict";e.exports=n("viRO")},viRO:function(e,t,n){"use strict";var r=n("MgzW"),l="function"==typeof Symbol&&Symbol.for,i=l?Symbol.for("react.element"):60103,a=l?Symbol.for("react.portal"):60106,o=l?Symbol.for("react.fragment"):60107,u=l?Symbol.for("react.strict_mode"):60108,c=l?Symbol.for("react.profiler"):60114,s=l?Symbol.for("react.provider"):60109,f=l?Symbol.for("react.context"):60110,d=l?Symbol.for("react.forward_ref"):60112,p=l?Symbol.for("react.suspense"):60113,m=l?Symbol.for("react.suspense_list"):60120,h=l?Symbol.for("react.memo"):60115,g=l?Symbol.for("react.lazy"):60116;l&&Symbol.for("react.fundamental"),l&&Symbol.for("react.responder"),l&&Symbol.for("react.scope");var v="function"==typeof Symbol&&Symbol.iterator;function y(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;nO.length&&O.push(e)}function I(e,t,n){return null==e?0:function e(t,n,r,l){var o=typeof t;"undefined"!==o&&"boolean"!==o||(t=null);var u=!1;if(null===t)u=!0;else switch(o){case"string":case"number":u=!0;break;case"object":switch(t.$$typeof){case i:case a:u=!0}}if(u)return r(l,t,""===n?"."+F(t,0):n),1;if(u=0,n=""===n?".":n+":",Array.isArray(t))for(var c=0;c