diff --git a/patch-luci-app-ssr-plus.patch b/patch-luci-app-ssr-plus.patch new file mode 100644 index 0000000..701564d --- /dev/null +++ b/patch-luci-app-ssr-plus.patch @@ -0,0 +1,343 @@ +diff --git a/luci-app-ssr-plus/Makefile b/luci-app-ssr-plus/Makefile +index 2aa3cf8..64d4f5e 100644 +--- a/luci-app-ssr-plus/Makefile ++++ b/luci-app-ssr-plus/Makefile +@@ -30,6 +30,7 @@ PKG_CONFIG_DEPENDS:= \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Simple_Obfs \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin \ ++ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Xray_Plugin \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan +@@ -63,6 +64,7 @@ LUCI_DEPENDS:= \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server:shadowsocks-rust-ssserver \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Simple_Obfs:simple-obfs \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin:v2ray-plugin \ ++ +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Xray_Plugin:xray-plugin \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client:shadowsocksr-libev-ssr-local \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client:shadowsocksr-libev-ssr-redir \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server:shadowsocksr-libev-ssr-server \ +@@ -75,7 +77,7 @@ select PACKAGE_luci-lua-runtime if PACKAGE_$(PKG_NAME) + + choice + prompt "Shadowsocks Client Selection" +- default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client if aarch64 || x86_64 ++ default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client if aarch64||arm||i386||mips||mipsel||x86_64 + default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client + + config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Client +@@ -92,8 +94,8 @@ endchoice + + choice + prompt "Shadowsocks Server Selection" +- default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server if aarch64 +- default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server if i386||x86_64||arm ++ default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server if aarch64||arm||i386||mips||mipsel||x86_64 ++ default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server + default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Server + + config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Server +@@ -141,7 +143,7 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_DNSPROXY + + config PACKAGE_$(PKG_NAME)_INCLUDE_MosDNS + bool "Include MosDNS" +- default y if aarch64||arm||i386||x86_64 ++ default n + + config PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria + bool "Include Hysteria" +@@ -189,6 +191,10 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin + bool "Include Shadowsocks V2ray Plugin" + default n + ++config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Xray_Plugin ++ bool "Include Shadowsocks Xray Plugin" ++ default n ++ + config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client + bool "Include ShadowsocksR Libev Client" + default y +diff --git a/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua b/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua +index 8906a67..1bd4ffe 100644 +--- a/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua ++++ b/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua +@@ -7,7 +7,7 @@ function index() + call("act_reset") + end + local page +- page = entry({"admin", "services", "shadowsocksr"}, alias("admin", "services", "shadowsocksr", "client"), _("ShadowSocksR Plus+"), 10) ++ page = entry({"admin", "services", "shadowsocksr"}, alias("admin", "services", "shadowsocksr", "client"), _("ShadowSocksR Plus+"), 1) + page.dependent = true + page.acl_depends = { "luci-app-ssr-plus" } + entry({"admin", "services", "shadowsocksr", "client"}, cbi("shadowsocksr/client"), _("SSR Client"), 10).leaf = true +diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua +index b8286c7..26f4988 100644 +--- a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua ++++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua +@@ -27,7 +27,7 @@ local function is_finded(e) + return luci.sys.exec(string.format('type -t -p "%s" 2>/dev/null', e)) ~= "" + end + +-m = Map("shadowsocksr", translate("ShadowSocksR Plus+ Settings"), translate("

Support SS/SSR/V2RAY/XRAY/TROJAN/NAIVEPROXY/SOCKS5/TUN etc.

")) ++m = Map("shadowsocksr", translate("ShadowSocksR Plus+ Settings")) + m:section(SimpleSection).template = "shadowsocksr/status" + + local server_table = {} +diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm +index 4a16adc..5f6a673 100644 +--- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm ++++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm +@@ -13,9 +13,9 @@ + if (s) + { + if (rv.ret=="0") +- s.innerHTML =""+"<%:Connect OK%>"+""; ++ s.innerHTML =""+"<%:Connect OK%>"+""; + else +- s.innerHTML =""+"<%:Connect Error%>"+""; ++ s.innerHTML =""+"<%:Connect Error%>"+""; + } + btn.disabled = false; + btn.value = '<%:Check Connect%>'; +diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm +index ea4113d..da89fd5 100644 +--- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm ++++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm +@@ -15,13 +15,13 @@ + switch (rv.ret) + { + case 0: +- s.innerHTML =""+"<%:Refresh OK!%> "+"<%:Total Records:%>"+rv.retcount+""; ++ s.innerHTML =""+"<%:Refresh OK!%> "+"<%:Total Records:%>"+rv.retcount+""; + break; + case 1: +- s.innerHTML =""+"<%:No new data!%> "+""; ++ s.innerHTML =""+"<%:No new data!%> "+""; + break; + default: +- s.innerHTML =""+"<%:Refresh Error!%> "+""; ++ s.innerHTML =""+"<%:Refresh Error!%> "+""; + break; + } + } +diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm +index ff0c486..1882ac5 100644 +--- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm ++++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm +@@ -7,7 +7,7 @@ + return false; + } + if (reset != "reset") { +- s.innerHTML = "<%:The content entered is incorrect!%>"; ++ s.innerHTML = "<%:The content entered is incorrect!%>"; + return false; + } + btn.disabled = true; +@@ -15,7 +15,7 @@ + murl=dataname; + XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr","reset")%>', { set:murl }, function(x,rv) { + btn.value = '<%:Reset complete%>'; +- s.innerHTML = "<%:Reset complete%>"; ++ s.innerHTML = "<%:Reset complete%>"; + }); + return false; + } +diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm +index 2ba1be9..ed7148f 100644 +--- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm ++++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm +@@ -18,7 +18,7 @@ + const wsPath = wsPaths[index]; + const tls = tlss[index]; + if (!dom) res(); +- port.innerHTML = 'connect'; ++ port.innerHTML = 'connect'; + XHR.get('<%=luci.dispatcher.build_url("admin/services/shadowsocksr/ping")%>', { + index, + domain: dom.getAttribute("hint"), +@@ -34,11 +34,11 @@ + if (result.ping < 200) col = '#ff7700'; + if (result.ping < 100) col = '#249400'; + } +- dom.innerHTML = `${(result.ping ? result.ping : "--") + " ms"}`; ++ dom.innerHTML = `${(result.ping ? result.ping : "--") + " ms"}`; + if (result.socket) { +- port.innerHTML = 'ok'; ++ port.innerHTML = 'ok'; + } else { +- port.innerHTML = 'fail'; ++ port.innerHTML = 'fail'; + } + res(); + }); +diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm +index 8f57302..03ba998 100644 +--- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm ++++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm +@@ -75,9 +75,9 @@ function export_ssr_url(btn, urlname, sid) { + textarea.select(); + try { + document.execCommand("copy"); // Security exception may be thrown by some browsers. +- s.innerHTML = "<%:Copy SSR to clipboard successfully.%>"; ++ s.innerHTML = "<%:Copy SSR to clipboard successfully.%>"; + } catch (ex) { +- s.innerHTML = "<%:Unable to copy SSR to clipboard.%>"; ++ s.innerHTML = "<%:Unable to copy SSR to clipboard.%>"; + } finally { + document.body.removeChild(textarea); + } +@@ -89,7 +89,7 @@ function import_ssr_url(btn, urlname, sid) { + if (!s) return false; + var ssrurl = prompt("<%:Paste sharing link here%>", ""); + if (ssrurl == null || ssrurl == "") { +- s.innerHTML = "<%:User cancelled.%>"; ++ s.innerHTML = "<%:User cancelled.%>"; + return false; + } + s.innerHTML = ""; +@@ -324,7 +324,7 @@ function import_ssr_url(btn, urlname, sid) { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0].value = dictvalue(pdict, 'protoparam'); + var rem = pdict['remarks']; + if (typeof (rem) != 'undefined' && rem != '' && rem.length > 0) document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = b64decutf8safe(rem); +- s.innerHTML = "<%:Import configuration information successfully.%>"; ++ s.innerHTML = "<%:Import configuration information successfully.%>"; + return false; + case "trojan": + try { +@@ -417,7 +417,7 @@ function import_ssr_url(btn, urlname, sid) { + break; + } + +- s.innerHTML = "<%:Import configuration information successfully.%>"; ++ s.innerHTML = "<%:Import configuration information successfully.%>"; + return false; + case "vmess": + var sstr = b64DecodeUnicode(ssu[1]); +@@ -500,7 +500,7 @@ function import_ssr_url(btn, urlname, sid) { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.xmux')[0].checked = true; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.xmux')[0].dispatchEvent(event); + } +- s.innerHTML = "<%:Import configuration information successfully.%>"; ++ s.innerHTML = "<%:Import configuration information successfully.%>"; + return false; + case "vless": + try { +@@ -618,10 +618,10 @@ function import_ssr_url(btn, urlname, sid) { + } + break; + } +- s.innerHTML = "<%:Import configuration information successfully.%>"; ++ s.innerHTML = "<%:Import configuration information successfully.%>"; + return false; + default: +- s.innerHTML = "<%:Invalid format.%>"; ++ s.innerHTML = "<%:Invalid format.%>"; + return false; + } + } +diff --git a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr +index 27c9d6b..23b5f29 100755 +--- a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr ++++ b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr +@@ -1287,8 +1287,18 @@ start_server() { + echolog "Server:Socks5 Server$server_count Started!" + ;; + esac +- iptables -t filter -A SSR-SERVER-RULE -p tcp --dport $(uci_get_by_name $1 server_port) -j ACCEPT +- iptables -t filter -A SSR-SERVER-RULE -p udp --dport $(uci_get_by_name $1 server_port) -j ACCEPT ++ ssr_server_port=$(uci show shadowsocksr | grep 'server_config.*server_port' | awk -F"'" '{print $2}' | tr "\n" " ") ++ if [ -n "$ssr_server_port" ]; then ++ uci -q delete firewall.shadowsocksr_server ++ uci set firewall.shadowsocksr_server=rule ++ uci set firewall.shadowsocksr_server.name="shadowsocksr_server" ++ uci set firewall.shadowsocksr_server.target="ACCEPT" ++ uci set firewall.shadowsocksr_server.src="wan" ++ uci set firewall.shadowsocksr_server.dest_port="$ssr_server_port" ++ uci set firewall.shadowsocksr_server.enabled="1" ++ uci commit firewall ++ /etc/init.d/firewall reload >/dev/null 2>&1 ++ fi + return 0 + } + gen_serv_include() { +@@ -1445,12 +1455,6 @@ stop() { + unlock + set_lock + /usr/bin/ssr-rules -f +- local srulecount=$(iptables -L | grep SSR-SERVER-RULE | wc -l) +- if [ $srulecount -gt 0 ]; then +- iptables -F SSR-SERVER-RULE +- iptables -t filter -D INPUT -j SSR-SERVER-RULE +- iptables -X SSR-SERVER-RULE 2>/dev/null +- fi + if [ -z "$switch_server" ]; then + $PS -w | grep -v "grep" | grep ssr-switch | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 & + rm -f /var/lock/ssr-switch.lock +@@ -1461,7 +1465,7 @@ stop() { + ( \ + # Graceful kill first, so programs have the chance to stop its subprocesses + $PS -w | grep -v "grep" | grep "$TMP_PATH" | awk '{print $1}' | xargs kill >/dev/null 2>&1 ; \ +- sleep 3s; \ ++ sleep 1s; \ + # Force kill hanged programs + $PS -w | grep -v "grep" | grep "$TMP_PATH" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 ; \ + ) +@@ -1484,6 +1488,9 @@ stop() { + + /etc/init.d/dnsmasq restart >/dev/null 2>&1 + fi ++ uci -q delete firewall.shadowsocksr_server ++ uci commit firewall ++ /etc/init.d/firewall reload >/dev/null 2>&1 + del_cron + unset_lock + } +diff --git a/luci-app-ssr-plus/root/etc/ssrplus/white.list b/luci-app-ssr-plus/root/etc/ssrplus/white.list +index 9055fcb..8c3ca2b 100644 +--- a/luci-app-ssr-plus/root/etc/ssrplus/white.list ++++ b/luci-app-ssr-plus/root/etc/ssrplus/white.list +@@ -1,7 +1,37 @@ +-bilibili.com +-bilibili.cn +-bilivideo.com +-bilivideo.cn ++aaplimg.com ++account.synology.com ++apple-cloudkit.com ++apple.co ++apple.com ++apple.com.cn ++appstore.com + biliapi.com + biliapi.net +-apple.com +\ No newline at end of file ++bilibili.cn ++bilibili.com ++bilivideo.cn ++bilivideo.com ++bing.com ++cdn-apple.com ++checkip.dyndns.org ++checkip.synology.com ++checkipv6.synology.com ++checkport.synology.com ++crashlytics.com ++ddns.synology.com ++gitmirror.com ++icloud-content.com ++icloud.com ++icloud.com.cn ++images-cn.ssl-images-amazon.com ++mirrorlist.centos.org ++mzstatic.com ++office365.com ++officecdn-microsoft-com.akamaized.net ++teamviewer.com ++whatismyip.akamai.com ++windows.com ++windowsupdate.com ++worldbank.org ++worldscientific.com ++www-cdn.icloud.com.akadns.net \ No newline at end of file