From 741822539b4635a0cf0b166d1d5a64f6a0e62714 Mon Sep 17 00:00:00 2001 From: Mattraks <16359027+Mattraks@users.noreply.github.com> Date: Wed, 23 Dec 2020 19:13:48 +0800 Subject: [PATCH] luci-app-ssr-plus: bump to 182-1 - Important improvement Rewrite startup code to speed up startup Same as global server, no need to start multiple processes Use unified path and configuration - Changes Add Reset default settings Optimize the use of shadowsocks plugin Remove the sh script used in update and modify the UI usage Remove Easylist China from adblock and add NEO DEV HOST Adjust the parameters used by wget to ensure compatibility - Fixes Fix the issue of starting twice after apply in the server node list Fix the problem that dnsmasq fails to start when the access control list contains wrong entries --- package/lean/luci-app-ssr-plus/Makefile | 10 +- .../luasrc/controller/shadowsocksr.lua | 92 +- .../model/cbi/shadowsocksr/advanced.lua | 29 +- .../model/cbi/shadowsocksr/client-config.lua | 446 +++--- .../luasrc/model/cbi/shadowsocksr/client.lua | 29 +- .../luasrc/model/cbi/shadowsocksr/control.lua | 16 +- .../luasrc/model/cbi/shadowsocksr/log.lua | 6 +- .../model/cbi/shadowsocksr/server-config.lua | 73 +- .../luasrc/model/cbi/shadowsocksr/server.lua | 71 +- .../luasrc/model/cbi/shadowsocksr/servers.lua | 41 +- .../luasrc/model/cbi/shadowsocksr/status.lua | 143 +- .../luasrc/view/shadowsocksr/check.htm | 1 - .../luasrc/view/shadowsocksr/checkport.htm | 13 +- .../luasrc/view/shadowsocksr/refresh.htm | 14 +- .../luasrc/view/shadowsocksr/reset.htm | 25 + .../luasrc/view/shadowsocksr/server_list.htm | 20 +- .../luasrc/view/shadowsocksr/ssrurl.htm | 10 +- .../luci-app-ssr-plus/po/zh_Hans/ssr-plus.po | 54 + .../root/etc/config/shadowsocksr | 42 - .../root/etc/init.d/shadowsocksr | 1233 +++++++++-------- .../root/etc/{ssr => ssrplus}/ad.conf | 0 .../root/etc/{ssr => ssrplus}/black.list | 0 .../root/etc/{ssr => ssrplus}/china_ssr.txt | 8 +- .../root/etc/{ssr => ssrplus}/deny.list | 0 .../root/etc/{ssr => ssrplus}/gfw_base.conf | 0 .../root/etc/{ssr => ssrplus}/gfw_list.conf | 96 +- .../root/etc/{ssr => ssrplus}/netflix.list | 0 .../root/etc/{ssr => ssrplus}/netflixip.list | 0 .../etc/{ssr => ssrplus}/oversea_list.conf | 0 .../root/etc/{ssr => ssrplus}/white.list | 0 .../root/etc/uci-defaults/luci-ssr-plus | 26 +- .../luci-app-ssr-plus/root/usr/bin/ssr-ad | 10 - .../luci-app-ssr-plus/root/usr/bin/ssr-gfw | 23 - .../root/usr/bin/ssr-monitor | 84 +- .../luci-app-ssr-plus/root/usr/bin/ssr-rules | 178 ++- .../luci-app-ssr-plus/root/usr/bin/ssr-switch | 84 +- .../root/usr/share/shadowsocksr/chinaipset.sh | 2 +- .../usr/share/shadowsocksr/gen_config.lua | 171 +++ .../usr/share/shadowsocksr/genred2config.sh | 147 +- .../share/shadowsocksr/gentrojanconfig.lua | 40 - .../usr/share/shadowsocksr/genv2config.lua | 111 -- .../root/usr/share/shadowsocksr/gfw2ipset.sh | 90 +- .../usr/share/shadowsocksr/ssrplusupdate.sh | 2 +- .../root/usr/share/shadowsocksr/subscribe.lua | 55 +- .../root/usr/share/shadowsocksr/update.lua | 185 ++- 45 files changed, 1946 insertions(+), 1734 deletions(-) create mode 100644 package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/ad.conf (100%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/black.list (100%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/china_ssr.txt (99%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/deny.list (100%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/gfw_base.conf (100%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/gfw_list.conf (99%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/netflix.list (100%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/netflixip.list (100%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/oversea_list.conf (100%) rename package/lean/luci-app-ssr-plus/root/etc/{ssr => ssrplus}/white.list (100%) delete mode 100755 package/lean/luci-app-ssr-plus/root/usr/bin/ssr-ad delete mode 100755 package/lean/luci-app-ssr-plus/root/usr/bin/ssr-gfw create mode 100644 package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua delete mode 100644 package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua delete mode 100644 package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/genv2config.lua mode change 100644 => 100755 package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua mode change 100644 => 100755 package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua diff --git a/package/lean/luci-app-ssr-plus/Makefile b/package/lean/luci-app-ssr-plus/Makefile index 9b3eb648a9..d6914a776a 100644 --- a/package/lean/luci-app-ssr-plus/Makefile +++ b/package/lean/luci-app-ssr-plus/Makefile @@ -1,14 +1,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-ssr-plus -PKG_VERSION:=181 -PKG_RELEASE:=2 - -include $(INCLUDE_DIR)/package.mk +PKG_VERSION:=182 +PKG_RELEASE:=1 define Package/$(PKG_NAME)/conffiles /etc/config/shadowsocksr -/etc/ssr/ +/etc/ssrplus/ endef define Package/$(PKG_NAME)/config @@ -56,7 +54,7 @@ PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server -LUCI_TITLE:=SS/SSR/V2Ray/Xray/Trojan/NaiveProxy/Socks5/Tun LuCI interface +LUCI_TITLE:=SS/SSR/V2Ray/Trojan/NaiveProxy/Socks5/Tun LuCI interface LUCI_PKGARCH:=all LUCI_DEPENDS:=+shadowsocksr-libev-alt +ipset +ip-full +iptables-mod-tproxy +dnsmasq-full +coreutils +coreutils-base64 +pdnsd-alt +wget +lua +libuci-lua \ +microsocks +dns2socks +shadowsocks-libev-ss-local +shadowsocksr-libev-ssr-local +shadowsocks-libev-ss-redir +simple-obfs +tcping +resolveip\ diff --git a/package/lean/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua b/package/lean/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua index 9c1ec9ec7e..61f441471e 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua @@ -1,30 +1,30 @@ -- Copyright (C) 2017 yushi studio -- Licensed to the public under the GNU General Public License v3. - module("luci.controller.shadowsocksr", package.seeall) function index() if not nixio.fs.access("/etc/config/shadowsocksr") then return end - entry({"admin", "services", "shadowsocksr"}, alias("admin", "services", "shadowsocksr", "client"),_("ShadowSocksR Plus+"), 10).dependent = true - entry({"admin", "services", "shadowsocksr", "client"}, cbi("shadowsocksr/client"),_("SSR Client"), 10).leaf = true - entry({"admin", "services", "shadowsocksr", "servers"}, arcombine(cbi("shadowsocksr/servers", {autoapply = true}), cbi("shadowsocksr/client-config")),_("Severs Nodes"), 20).leaf = true - entry({"admin", "services", "shadowsocksr", "control"},cbi("shadowsocksr/control"), _("Access Control"), 30).leaf = true - entry({"admin", "services", "shadowsocksr", "advanced"},cbi("shadowsocksr/advanced"),_("Advanced Settings"), 50).leaf = true - entry({"admin", "services", "shadowsocksr", "server"},arcombine(cbi("shadowsocksr/server"), cbi("shadowsocksr/server-config")),_("SSR Server"), 60).leaf = true - entry({"admin", "services", "shadowsocksr", "status"},form("shadowsocksr/status"),_("Status"), 70).leaf = true + entry({"admin", "services", "shadowsocksr"}, alias("admin", "services", "shadowsocksr", "client"), _("ShadowSocksR Plus+"), 10).dependent = true + entry({"admin", "services", "shadowsocksr", "client"}, cbi("shadowsocksr/client"), _("SSR Client"), 10).leaf = true + entry({"admin", "services", "shadowsocksr", "servers"}, arcombine(cbi("shadowsocksr/servers", {autoapply = true}), cbi("shadowsocksr/client-config")), _("Severs Nodes"), 20).leaf = true + entry({"admin", "services", "shadowsocksr", "control"}, cbi("shadowsocksr/control"), _("Access Control"), 30).leaf = true + entry({"admin", "services", "shadowsocksr", "advanced"}, cbi("shadowsocksr/advanced"), _("Advanced Settings"), 50).leaf = true + entry({"admin", "services", "shadowsocksr", "server"}, arcombine(cbi("shadowsocksr/server"), cbi("shadowsocksr/server-config")), _("SSR Server"), 60).leaf = true + entry({"admin", "services", "shadowsocksr", "status"}, form("shadowsocksr/status"), _("Status"), 70).leaf = true entry({"admin", "services", "shadowsocksr", "check"}, call("check_status")) entry({"admin", "services", "shadowsocksr", "refresh"}, call("refresh_data")) entry({"admin", "services", "shadowsocksr", "subscribe"}, call("subscribe")) entry({"admin", "services", "shadowsocksr", "checkport"}, call("check_port")) - entry({"admin", "services", "shadowsocksr", "log"},form("shadowsocksr/log"),_("Log"), 80).leaf = true - entry({"admin", "services", "shadowsocksr","run"},call("act_status")).leaf = true + entry({"admin", "services", "shadowsocksr", "log"}, form("shadowsocksr/log"), _("Log"), 80).leaf = true + entry({"admin", "services", "shadowsocksr", "run"}, call("act_status")).leaf = true entry({"admin", "services", "shadowsocksr", "ping"}, call("act_ping")).leaf = true + entry({"admin", "services", "shadowsocksr", "reset"}, call("act_reset")) end function subscribe() - luci.sys.call("/usr/bin/lua /usr/share/shadowsocksr/subscribe.lua >> /tmp/ssrplus.log 2>&1") + luci.sys.call("/usr/bin/lua /usr/share/shadowsocksr/subscribe.lua >>/var/log/ssrplus.log") luci.http.prepare_content("application/json") luci.http.write_json({ret = 1}) end @@ -41,16 +41,16 @@ function act_ping() local domain = luci.http.formvalue("domain") local port = luci.http.formvalue("port") e.index = luci.http.formvalue("index") - local iret = luci.sys.call(" ipset add ss_spec_wan_ac " .. domain .. " 2>/dev/null") + local iret = luci.sys.call("ipset add ss_spec_wan_ac " .. domain .. " 2>/dev/null") local socket = nixio.socket("inet", "stream") socket:setopt("socket", "rcvtimeo", 3) socket:setopt("socket", "sndtimeo", 3) e.socket = socket:connect(domain, port) socket:close() - e.ping = luci.sys.exec("ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*.[0-9]' | awk -F '=' '{print$2}'" % domain) - if (e.ping == "") then - e.ping = luci.sys.exec(string.format("echo -n $(tcping -q -c 1 -i 1 -t 2 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null",port, domain)) - end + -- e.ping = luci.sys.exec("ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*.[0-9]' | awk -F '=' '{print$2}'" % domain) + -- if (e.ping == "") then + e.ping = luci.sys.exec(string.format("echo -n $(tcping -q -c 1 -i 1 -t 2 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null", port, domain)) + -- end if (iret == 0) then luci.sys.call(" ipset del ss_spec_wan_ac " .. domain) end @@ -72,55 +72,9 @@ end function refresh_data() local set = luci.http.formvalue("set") - local uci = luci.model.uci.cursor() - local icount = 0 - local retstring = 0 - local function update(url, file, type, file2) - local Num = 1 - refresh_cmd = "wget-ssl --no-check-certificate -t 3 -T 10 -O- " .. url .. " > /tmp/ssr-update." .. type - sret = luci.sys.call(refresh_cmd .. " 2>/dev/null") - if sret == 0 then - if type == "gfw_data" then - luci.sys.call("/usr/bin/ssr-gfw " .. type) - Num = 2 - end - if type == "ad_data" then - luci.sys.call("/usr/bin/ssr-ad " .. type) - end - local new_md5 = luci.sys.exec("echo -n $([ -f '/tmp/ssr-update." .. type .. "' ] && md5sum /tmp/ssr-update." .. type .. " | awk '{print $1}')") - local old_md5 = luci.sys.exec("echo -n $([ -f '" .. file .. "' ] && md5sum " .. file .. " | awk '{print $1}')") - if new_md5 == old_md5 then - retstring = "0" - else - icount = luci.sys.exec("cat /tmp/ssr-update." .. type .. " | wc -l") - luci.sys.exec("cp -f /tmp/ssr-update." .. type .. " " .. file) - if file2 then luci.sys.exec("cp -f /tmp/ssr-update." .. type .. " " .. file2) end - retstring = tostring(tonumber(icount)/Num) - if type == "gfw_data" or type == "ad_data" then - luci.sys.exec("/usr/share/shadowsocksr/gfw2ipset.sh") - else - luci.sys.exec("/usr/share/shadowsocksr/chinaipset.sh /tmp/etc/china_ssr.txt") - end - end - else - retstring = "-1" - end - luci.sys.exec("rm -f /tmp/ssr-update." .. type) - end - if set == "gfw_data" then - update(uci:get_first("shadowsocksr", "global", "gfwlist_url", "https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt"), "/etc/ssr/gfw_list.conf", set, "/tmp/dnsmasq.ssr/gfw_list.conf") - end - if set == "ip_data" then - update(uci:get_first("shadowsocksr", "global", "chnroute_url","https://ispip.clang.cn/all_cn.txt"), "/etc/ssr/china_ssr.txt", set, "/tmp/etc/china_ssr.txt") - end - if set == "ad_data" then - update(uci:get_first("shadowsocksr", "global", "adblock_url","https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt"), "/etc/ssr/ad.conf", set, "/tmp/dnsmasq.ssr/ad.conf") - end - if set == "nfip_data" then - update(uci:get_first("shadowsocksr", "global", "nfip_url","https://raw.githubusercontent.com/QiuSimons/Netflix_IP/master/NF_only.txt"), "/etc/ssr/netflixip.list", set) - end + local retstring = luci.sys.exec("/usr/bin/lua /usr/share/shadowsocksr/update.lua " .. set) luci.http.prepare_content("application/json") - luci.http.write_json({ret = retstring,retcount = icount}) + luci.http.write_json({ret = tonumber(retstring)}) end function check_port() @@ -134,13 +88,13 @@ function check_port() if s.alias then server_name = s.alias elseif s.server and s.server_port then - server_name = "%s:%s" %{s.server, s.server_port} + server_name = "%s:%s" % {s.server, s.server_port} end iret = luci.sys.call("ipset add ss_spec_wan_ac " .. s.server .. " 2>/dev/null") socket = nixio.socket("inet", "stream") socket:setopt("socket", "rcvtimeo", 3) socket:setopt("socket", "sndtimeo", 3) - ret = socket:connect(s.server,s.server_port) + ret = socket:connect(s.server, s.server_port) if tostring(ret) == "true" then socket:close() retstring = retstring .. "[" .. server_name .. "] OK.
" @@ -154,3 +108,9 @@ function check_port() luci.http.prepare_content("application/json") luci.http.write_json({ret = retstring}) end + +function act_reset() + nixio.exec("/etc/init.d/shadowsocksr", "reset") + http.redirect(luci.dispatcher.build_url('admin/services/shadowsocksr')) + return +end diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua index f14d486e69..02d156f374 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua @@ -1,19 +1,18 @@ -local shadowsocksr = "shadowsocksr" local uci = luci.model.uci.cursor() local server_table = {} -uci:foreach(shadowsocksr, "servers", function(s) +uci:foreach("shadowsocksr", "servers", function(s) if s.alias then - server_table[s[".name"]] = "[%s]:%s" %{string.upper(s.type), s.alias} + server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.type), s.alias} elseif s.server and s.server_port then - server_table[s[".name"]] = "[%s]:%s:%s" %{string.upper(s.type), s.server, s.server_port} + server_table[s[".name"]] = "[%s]:%s:%s" % {string.upper(s.type), s.server, s.server_port} end end) -local key_table = {} -for key,_ in pairs(server_table) do - table.insert(key_table,key) -end +local key_table = {} +for key, _ in pairs(server_table) do + table.insert(key_table, key) +end table.sort(key_table) @@ -49,14 +48,16 @@ o = s:option(Flag, "adblock", translate("Enable adblock")) o.rmempty = false o = s:option(Value, "adblock_url", translate("adblock_url")) +o:value("https://neodev.team/lite_host_dnsmasq.conf", translate("NEO DEV HOST Lite")) +o:value("https://neodev.team/host_dnsmasq.conf", translate("NEO DEV HOST Full")) o:value("https://anti-ad.net/anti-ad-for-dnsmasq.conf", translate("anti-AD")) -o:value("https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt", translate("Easylist China")) -o.default = "https://anti-ad.net/anti-ad-for-dnsmasq.conf" +o.default = "https://neodev.team/lite_host_dnsmasq.conf" o:depends("adblock", "1") o.description = translate("Support AdGuardHome and DNSMASQ format list") o = s:option(Value, "gfwlist_url", translate("gfwlist Update url")) o:value("https://cdn.jsdelivr.net/gh/v2fly/domain-list-community@release/gfwlist.txt", translate("v2fly/domain-list-community")) +o:value("https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt", translate("Loyalsoldier/v2ray-rules-dat")) o:value("https://cdn.jsdelivr.net/gh/Loukky/gfwlist-by-loukky/gfwlist.txt", translate("Loukky/gfwlist-by-loukky")) o:value("https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt", translate("gfwlist/gfwlist")) o.default = "https://cdn.jsdelivr.net/gh/v2fly/domain-list-community@release/gfwlist.txt" @@ -72,6 +73,10 @@ o:value("https://cdn.jsdelivr.net/gh/QiuSimons/Netflix_IP/getflix.txt", translat o.default = "https://cdn.jsdelivr.net/gh/QiuSimons/Netflix_IP/NF_only.txt" o.description = translate("Customize Netflix IP Url") +o = s:option(Button, "reset", translate("Reset to defaults")) +o.rawhtml = true +o.template = "shadowsocksr/reset" + -- [[ SOCKS5 Proxy ]]-- s = m:section(TypedSection, "socks5_proxy", translate("Global SOCKS5 Proxy Server")) s.anonymous = true @@ -79,7 +84,9 @@ s.anonymous = true o = s:option(ListValue, "server", translate("Server")) o:value("nil", translate("Disable")) o:value("same", translate("Same as Global Server")) -for _,key in pairs(key_table) do o:value(key,server_table[key]) end +for _, key in pairs(key_table) do + o:value(key, server_table[key]) +end o.default = "nil" o.rmempty = false diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua index 1dae1bb19b..39c609ac72 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua @@ -1,118 +1,121 @@ -- Copyright (C) 2017 yushi studio github.com/ywb94 -- Licensed to the public under the GNU General Public License v3. - require "nixio.fs" require "luci.sys" require "luci.http" -local m, s, o,kcp_enable -local shadowsocksr = "shadowsocksr" +local m, s, o, kcp_enable local sid = arg[1] local uuid = luci.sys.exec("cat /proc/sys/kernel/random/uuid") local function isKcptun(file) -if not nixio.fs.access(file, "rwx", "rx", "rx") then -nixio.fs.chmod(file, 755) -end -local str = luci.sys.exec(file .. " -v | awk '{printf $1}'") -return (str:lower() == "kcptun") + if not nixio.fs.access(file, "rwx", "rx", "rx") then + nixio.fs.chmod(file, 755) + end + local str = luci.sys.exec(file .. " -v | awk '{printf $1}'") + return (str:lower() == "kcptun") end local server_table = {} local encrypt_methods = { -"none", -"table", -"rc4", -"rc4-md5-6", -"rc4-md5", -"aes-128-cfb", -"aes-192-cfb", -"aes-256-cfb", -"aes-128-ctr", -"aes-192-ctr", -"aes-256-ctr", -"bf-cfb", -"camellia-128-cfb", -"camellia-192-cfb", -"camellia-256-cfb", -"cast5-cfb", -"des-cfb", -"idea-cfb", -"rc2-cfb", -"seed-cfb", -"salsa20", -"chacha20", -"chacha20-ietf", + -- ssr + "none", + "table", + "rc4", + "rc4-md5-6", + "rc4-md5", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "cast5-cfb", + "des-cfb", + "idea-cfb", + "rc2-cfb", + "seed-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" } local encrypt_methods_ss = { --- aead -"aes-128-gcm", -"aes-192-gcm", -"aes-256-gcm", -"chacha20-ietf-poly1305", -"xchacha20-ietf-poly1305", --- stream -"table", -"rc4", -"rc4-md5", -"aes-128-cfb", -"aes-192-cfb", -"aes-256-cfb", -"aes-128-ctr", -"aes-192-ctr", -"aes-256-ctr", -"bf-cfb", -"camellia-128-cfb", -"camellia-192-cfb", -"camellia-256-cfb", -"salsa20", -"chacha20", -"chacha20-ietf", + -- aead + "aes-128-gcm", + "aes-192-gcm", + "aes-256-gcm", + "chacha20-ietf-poly1305", + "xchacha20-ietf-poly1305", + -- stream + "table", + "rc4", + "rc4-md5", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" } local protocol = { -"origin", -"verify_deflate", -"auth_sha1_v4", -"auth_aes128_sha1", -"auth_aes128_md5", -"auth_chain_a", -"auth_chain_b", -"auth_chain_c", -"auth_chain_d", -"auth_chain_e", -"auth_chain_f", + -- ssr + "origin", + "verify_deflate", + "auth_sha1_v4", + "auth_aes128_sha1", + "auth_aes128_md5", + "auth_chain_a", + "auth_chain_b", + "auth_chain_c", + "auth_chain_d", + "auth_chain_e", + "auth_chain_f" } obfs = { -"plain", -"http_simple", -"http_post", -"random_head", -"tls1.2_ticket_auth", + -- ssr + "plain", + "http_simple", + "http_post", + "random_head", + "tls1.2_ticket_auth" } local securitys = { -"auto", -"none", -"aes-128-gcm", -"chacha20-poly1305" + -- vmess + "auto", + "none", + "aes-128-gcm", + "chacha20-poly1305" } local flows = { -"xtls-rprx-origin", -"xtls-rprx-origin-udp443", -"xtls-rprx-direct", -"xtls-rprx-direct-udp443", -"xtls-rprx-splice", -"xtls-rprx-splice-udp443" + -- xlts + "xtls-rprx-origin", + "xtls-rprx-origin-udp443", + "xtls-rprx-direct", + "xtls-rprx-direct-udp443", + "xtls-rprx-splice", + "xtls-rprx-splice-udp443" } -m = Map(shadowsocksr, translate("Edit ShadowSocksR Server")) +m = Map("shadowsocksr", translate("Edit ShadowSocksR Server")) m.redirect = luci.dispatcher.build_url("admin/services/shadowsocksr/servers") -if m.uci:get(shadowsocksr, sid) ~= "servers" then -luci.http.redirect(m.redirect) -return +if m.uci:get("shadowsocksr", sid) ~= "servers" then + luci.http.redirect(m.redirect) + return end -- [[ Servers Setting ]]-- @@ -120,29 +123,31 @@ s = m:section(NamedSection, sid, "servers") s.anonymous = true s.addremove = false -o = s:option(DummyValue,"ssr_url","SS/SSR/V2RAY/TROJAN URL") +o = s:option(DummyValue, "ssr_url", "SS/SSR/V2RAY/TROJAN URL") o.rawhtml = true o.template = "shadowsocksr/ssrurl" -o.value =sid +o.value = sid o = s:option(ListValue, "type", translate("Server Node Type")) -o:value("ssr", translate("ShadowsocksR")) -if nixio.fs.access("/usr/bin/ss-redir") then -o:value("ss", translate("Shadowsocks New Version")) +if nixio.fs.access("/usr/bin/ssr-redir") then + o:value("ssr", translate("ShadowsocksR")) end -if nixio.fs.access("/usr/bin/xray") or nixio.fs.access("/usr/bin/xray/xray") or nixio.fs.access("/usr/bin/v2ray/v2ray") or nixio.fs.access("/usr/bin/v2ray") then -o:value("v2ray", translate("V2Ray")) -o:value("vless", translate("VLESS")) +if nixio.fs.access("/usr/bin/ss-redir") then + o:value("ss", translate("Shadowsocks New Version")) +end +if nixio.fs.access("/usr/bin/xray") or nixio.fs.access("/usr/bin/v2ray") then + o:value("vmess", translate("Vmess")) + o:value("vless", translate("VLESS")) end if nixio.fs.access("/usr/sbin/trojan") then -o:value("trojan", translate("Trojan")) + o:value("trojan", translate("Trojan")) end if nixio.fs.access("/usr/bin/naive") then -o:value("naiveproxy", translate("NaiveProxy")) + o:value("naiveproxy", translate("NaiveProxy")) end if nixio.fs.access("/usr/sbin/redsocks2") then -o:value("socks5", translate("Socks5")) -o:value("tun", translate("Network Tunnel")) + o:value("socks5", translate("Socks5")) + o:value("tun", translate("Network Tunnel")) end o.description = translate("Using incorrect encryption mothod may causes service fail to start") @@ -150,7 +155,9 @@ o = s:option(Value, "alias", translate("Alias(optional)")) o = s:option(ListValue, "iface", translate("Network interface to use")) for _, e in ipairs(luci.sys.net.devices()) do -if e ~= "lo" then o:value(e) end + if e ~= "lo" then + o:value(e) + end end o:depends("type", "tun") o.description = translate("Redirect traffic to this network interface") @@ -160,7 +167,7 @@ o.datatype = "host" o.rmempty = false o:depends("type", "ssr") o:depends("type", "ss") -o:depends("type", "v2ray") +o:depends("type", "vmess") o:depends("type", "vless") o:depends("type", "trojan") o:depends("type", "naiveproxy") @@ -171,7 +178,7 @@ o.datatype = "port" o.rmempty = false o:depends("type", "ssr") o:depends("type", "ss") -o:depends("type", "v2ray") +o:depends("type", "vmess") o:depends("type", "vless") o:depends("type", "trojan") o:depends("type", "naiveproxy") @@ -185,7 +192,7 @@ o:depends("type", "socks5") o = s:option(Value, "username", translate("Username")) o.rmempty = true o:depends("type", "naiveproxy") -o:depends("type", "socks5") +o:depends({type = "socks5", auth_enable = true}) o = s:option(Value, "password", translate("Password")) o.password = true @@ -194,29 +201,57 @@ o:depends("type", "ssr") o:depends("type", "ss") o:depends("type", "trojan") o:depends("type", "naiveproxy") -o:depends("type", "socks5") +o:depends({type = "socks5", auth_enable = true}) o = s:option(ListValue, "encrypt_method", translate("Encrypt Method")) -for _, v in ipairs(encrypt_methods) do o:value(v) end +for _, v in ipairs(encrypt_methods) do + o:value(v) +end o.rmempty = true o:depends("type", "ssr") o = s:option(ListValue, "encrypt_method_ss", translate("Encrypt Method")) -for _, v in ipairs(encrypt_methods_ss) do o:value(v) end +for _, v in ipairs(encrypt_methods_ss) do + o:value(v) +end o.rmempty = true o:depends("type", "ss") -- Shadowsocks Plugin -o = s:option(Value, "plugin", translate("Plugin")) +o = s:option(ListValue, "plugin", translate("Obfs")) +o:value("", translate("None")) +if nixio.fs.access("/usr/bin/obfs-local") then + o:value("obfs-local", translate("simple-obfs")) +end +if nixio.fs.access("/usr/bin/v2ray-plugin") then + o:value("v2ray-plugin", translate("v2ray-plugin")) +end o.rmempty = true o:depends("type", "ss") -o = s:option(Value, "plugin_opts", translate("Plugin Opts")) +o = s:option(ListValue, "simple_obfs", translate("Plugin Opts")) +o:value("obfs=tls;obfs-host=", translate("TLS")) +o:value("obfs=http;obfs-host=", translate("HTTP")) +o:depends("plugin", "obfs-local") o.rmempty = true -o:depends("type", "ss") + +o = s:option(ListValue, "v2ray_plugin", translate("Plugin Opts")) +o:value("tls;host=", translate("TLS")) +o:value("mode=quic;host=", translate("QUIC")) +o:value("none", translate("HTTP")) +o:depends("plugin", "v2ray-plugin") +o.rmempty = true + +o = s:option(Value, "plugin_opts", translate("Plugin Opts"), translate("Please fill in the Host, for example: www.baidu.com")) +o.rmempty = true +o:depends({type = "ss", plugin = "obfs-local"}) +o:depends({type = "ss", v2ray_plugin = "tls;host="}) +o:depends({type = "ss", v2ray_plugin = "mode=quic;host="}) o = s:option(ListValue, "protocol", translate("Protocol")) -for _, v in ipairs(protocol) do o:value(v) end +for _, v in ipairs(protocol) do + o:value(v) +end o.rmempty = true o:depends("type", "ssr") @@ -224,7 +259,9 @@ o = s:option(Value, "protocol_param", translate("Protocol param(optional)")) o:depends("type", "ssr") o = s:option(ListValue, "obfs", translate("Obfs")) -for _, v in ipairs(obfs) do o:value(v) end +for _, v in ipairs(obfs) do + o:value(v) +end o.rmempty = true o:depends("type", "ssr") @@ -236,13 +273,13 @@ o = s:option(Value, "alter_id", translate("AlterId")) o.datatype = "port" o.default = 16 o.rmempty = true -o:depends("type", "v2ray") +o:depends("type", "vmess") -- VmessId o = s:option(Value, "vmess_id", translate("Vmess/VLESS ID (UUID)")) o.rmempty = true o.default = uuid -o:depends("type", "v2ray") +o:depends("type", "vmess") o:depends("type", "vless") -- VLESS Encryption @@ -253,9 +290,11 @@ o:depends("type", "vless") -- 加密方式 o = s:option(ListValue, "security", translate("Encrypt Method")) -for _, v in ipairs(securitys) do o:value(v, v:upper()) end +for _, v in ipairs(securitys) do + o:value(v, v:upper()) +end o.rmempty = true -o:depends("type", "v2ray") +o:depends("type", "vmess") -- 传输协议 o = s:option(ListValue, "transport", translate("Transport")) @@ -265,11 +304,10 @@ o:value("ws", "WebSocket") o:value("h2", "HTTP/2") o:value("quic", "QUIC") o.rmempty = true -o:depends("type", "v2ray") +o:depends("type", "vmess") o:depends("type", "vless") -- [[ TCP部分 ]]-- - -- TCP伪装 o = s:option(ListValue, "tcp_guise", translate("Camouflage Type")) o:depends("transport", "tcp") @@ -288,10 +326,9 @@ o:depends("tcp_guise", "http") o.rmempty = true -- [[ WS部分 ]]-- - -- WS域名 o = s:option(Value, "ws_host", translate("WebSocket Host")) -o:depends("transport", "ws") +o:depends({transport = "ws", tls = false}) o.rmempty = true -- WS路径 @@ -312,7 +349,6 @@ o:depends("transport", "h2") o.rmempty = true -- [[ QUIC部分 ]]-- - o = s:option(ListValue, "quic_security", translate("QUIC Security")) o:depends("transport", "quic") o:value("none", translate("None")) @@ -331,19 +367,18 @@ o:value("none", translate("None")) o:value("srtp", translate("VideoCall (SRTP)")) o:value("utp", translate("BitTorrent (uTP)")) o:value("wechat-video", translate("WechatVideo")) -o:value("dtls", "DTLS 1.2") -o:value("wireguard", "WireGuard") +o:value("dtls", translate("DTLS 1.2")) +o:value("wireguard", translate("WireGuard")) -- [[ mKCP部分 ]]-- - o = s:option(ListValue, "kcp_guise", translate("Camouflage Type")) o:depends("transport", "kcp") o:value("none", translate("None")) o:value("srtp", translate("VideoCall (SRTP)")) o:value("utp", translate("BitTorrent (uTP)")) o:value("wechat-video", translate("WechatVideo")) -o:value("dtls", "DTLS 1.2") -o:value("wireguard", "WireGuard") +o:value("dtls", translate("DTLS 1.2")) +o:value("wireguard", translate("WireGuard")) o.rmempty = true o = s:option(Value, "mtu", translate("MTU")) @@ -383,55 +418,56 @@ o.default = 2 o.rmempty = true o = s:option(Value, "seed", translate("Obfuscate password (optional)")) -o:depends({type="vless", transport="kcp"}) +o:depends({type = "vless", transport = "kcp"}) o.rmempty = true o = s:option(Flag, "congestion", translate("Congestion")) o:depends("transport", "kcp") o.rmempty = true --- [[ allowInsecure ]]-- -o = s:option(Flag, "insecure", translate("allowInsecure")) -o.rmempty = false -o:depends("type", "v2ray") -o:depends("type", "vless") -o:depends("type", "trojan") -o.default = "0" -o.description = translate("If true, allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.") -- [[ TLS ]]-- o = s:option(Flag, "tls", translate("TLS")) o.rmempty = true o.default = "0" -o:depends("type", "v2ray") -o:depends("type", "vless") +o:depends("type", "vmess") +o:depends({type = "vless", xtls = false}) o:depends("type", "trojan") -o = s:option(Value, "tls_host", translate("TLS Host")) ---o:depends("type", "trojan") -o:depends("tls", "1") -o.rmempty = true - -- XTLS -if nixio.fs.access("/usr/bin/xray") or nixio.fs.access("/usr/bin/xray/xray") then -o = s:option(Flag, "xtls", translate("XTLS")) -o.rmempty = true -o.default = "0" -o:depends({type="vless", tls=true}) +if nixio.fs.access("/usr/bin/xray") then + o = s:option(Flag, "xtls", translate("XTLS")) + o.rmempty = true + o.default = "0" + o:depends({type = "vless", transport = "tcp", tls = false}) end -- Flow o = s:option(Value, "vless_flow", translate("Flow")) -for _, v in ipairs(flows) do o:value(v, v) end +for _, v in ipairs(flows) do + o:value(v, v) +end o.rmempty = true -o.default = "xtls-rprx-origin" -o:depends("xtls", "1") +o.default = "xtls-rprx-splice" +o:depends("xtls", true) + +o = s:option(Value, "tls_host", translate("TLS Host")) +o:depends("type", "trojan") +o:depends("tls", true) +o:depends("xtls", true) +o.rmempty = true + +-- [[ allowInsecure ]]-- +o = s:option(Flag, "insecure", translate("allowInsecure")) +o.rmempty = false +o:depends("tls", true) +o:depends("xtls", true) +o.description = translate("If true, allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.") -- [[ Mux ]]-- o = s:option(Flag, "mux", translate("Mux")) -o.rmempty = true -o.default = "0" -o:depends("type", "v2ray") -o:depends({type="vless", xtls=false}) +o.rmempty = false +o:depends("type", "vmess") +o:depends({type = "vless", xtls = false}) o = s:option(Value, "concurrency", translate("Concurrency")) o.datatype = "uinteger" @@ -444,7 +480,7 @@ o = s:option(Flag, "certificate", translate("Self-signed Certificate")) o.rmempty = true o.default = "0" o:depends("type", "trojan") -o:depends("type", "v2ray") +o:depends("type", "vmess") o:depends("type", "vless") o.description = translate("If you have a self-signed certificate,please check the box") @@ -455,31 +491,31 @@ o:depends("certificate", 1) cert_dir = "/etc/ssl/private/" local path -luci.http.setfilehandler( -function(meta, chunk, eof) -if not fd then -if (not meta) or (not meta.name) or (not meta.file) then return end -fd = nixio.open(cert_dir .. meta.file, "w") -if not fd then -path = translate("Create upload file error.") -return -end -end -if chunk and fd then -fd:write(chunk) -end -if eof and fd then -fd:close() -fd = nil -path = '/etc/ssl/private/' .. meta.file .. '' -end -end -) +luci.http.setfilehandler(function(meta, chunk, eof) + if not fd then + if (not meta) or (not meta.name) or (not meta.file) then + return + end + fd = nixio.open(cert_dir .. meta.file, "w") + if not fd then + path = translate("Create upload file error.") + return + end + end + if chunk and fd then + fd:write(chunk) + end + if eof and fd then + fd:close() + fd = nil + path = '/etc/ssl/private/' .. meta.file .. '' + end +end) if luci.http.formvalue("upload") then -local f = luci.http.formvalue("ulfile") -if #f <= 0 then -path = translate("No specify upload file.") -end + local f = luci.http.formvalue("ulfile") + if #f <= 0 then + path = translate("No specify upload file.") + end end o = s:option(Value, "certpath", translate("Current Certificate Path")) @@ -505,40 +541,40 @@ o.default = 1234 o.rmempty = false if nixio.fs.access("/usr/bin/kcptun-client") then -kcp_enable = s:option(Flag, "kcp_enable", translate("KcpTun Enable"), translate("bin:/usr/bin/kcptun-client")) -kcp_enable.rmempty = true -kcp_enable.default = "0" -kcp_enable:depends("type", "ssr") -kcp_enable:depends("type", "ss") + kcp_enable = s:option(Flag, "kcp_enable", translate("KcpTun Enable"), translate("bin:/usr/bin/kcptun-client")) + kcp_enable.rmempty = true + kcp_enable.default = "0" + kcp_enable:depends("type", "ssr") + kcp_enable:depends("type", "ss") -o = s:option(Value, "kcp_port", translate("KcpTun Port")) -o.datatype = "port" -o.default = 4000 -function o.validate(self, value, section) -local kcp_file="/usr/bin/kcptun-client" -local enable = kcp_enable:formvalue(section) or kcp_enable.disabled -if enable == kcp_enable.enabled then -if not nixio.fs.access(kcp_file) then -return nil, translate("Haven't a Kcptun executable file") -elseif not isKcptun(kcp_file) then -return nil, translate("Not a Kcptun executable file") -end -end + o = s:option(Value, "kcp_port", translate("KcpTun Port")) + o.datatype = "port" + o.default = 4000 + function o.validate(self, value, section) + local kcp_file = "/usr/bin/kcptun-client" + local enable = kcp_enable:formvalue(section) or kcp_enable.disabled + if enable == kcp_enable.enabled then + if not nixio.fs.access(kcp_file) then + return nil, translate("Haven't a Kcptun executable file") + elseif not isKcptun(kcp_file) then + return nil, translate("Not a Kcptun executable file") + end + end -return value -end -o:depends("type", "ssr") -o:depends("type", "ss") + return value + end + o:depends("type", "ssr") + o:depends("type", "ss") -o = s:option(Value, "kcp_password", translate("KcpTun Password")) -o.password = true -o:depends("type", "ssr") -o:depends("type", "ss") + o = s:option(Value, "kcp_password", translate("KcpTun Password")) + o.password = true + o:depends("type", "ssr") + o:depends("type", "ss") -o = s:option(Value, "kcp_param", translate("KcpTun Param")) -o.default = "--nocomp" -o:depends("type", "ssr") -o:depends("type", "ss") + o = s:option(Value, "kcp_param", translate("KcpTun Param")) + o.default = "--nocomp" + o:depends("type", "ssr") + o:depends("type", "ss") end return m diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua index b2e67608bb..eb7831e29a 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua @@ -1,27 +1,24 @@ -- Copyright (C) 2017 yushi studio github.com/ywb94 -- Copyright (C) 2018 lean github.com/coolsnowwolf -- Licensed to the public under the GNU General Public License v3. - local m, s, sec, o, kcp_enable -local shadowsocksr = "shadowsocksr" local uci = luci.model.uci.cursor() -m = Map(shadowsocksr, translate("ShadowSocksR Plus+ Settings"), - translate("

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

")) +m = Map("shadowsocksr", translate("ShadowSocksR Plus+ Settings"), translate("

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

")) m:section(SimpleSection).template = "shadowsocksr/status" local server_table = {} -uci:foreach(shadowsocksr, "servers", function(s) +uci:foreach("shadowsocksr", "servers", function(s) if s.alias then - server_table[s[".name"]] = "[%s]:%s" %{string.upper(s.type), s.alias} + server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.type), s.alias} elseif s.server and s.server_port then - server_table[s[".name"]] = "[%s]:%s:%s" %{string.upper(s.type), s.server, s.server_port} + server_table[s[".name"]] = "[%s]:%s:%s" % {string.upper(s.type), s.server, s.server_port} end end) local key_table = {} -for key,_ in pairs(server_table) do - table.insert(key_table,key) +for key, _ in pairs(server_table) do + table.insert(key_table, key) end table.sort(key_table) @@ -32,26 +29,32 @@ s.anonymous = true o = s:option(ListValue, "global_server", translate("Main Server")) o:value("nil", translate("Disable")) -for _,key in pairs(key_table) do o:value(key,server_table[key]) end +for _, key in pairs(key_table) do + o:value(key, server_table[key]) +end o.default = "nil" o.rmempty = false o = s:option(ListValue, "udp_relay_server", translate("Game Mode UDP Server")) o:value("", translate("Disable")) o:value("same", translate("Same as Global Server")) -for _,key in pairs(key_table) do o:value(key,server_table[key]) end +for _, key in pairs(key_table) do + o:value(key, server_table[key]) +end o = s:option(ListValue, "netflix_server", translate("Netflix Node")) o:value("nil", translate("Disable")) o:value("same", translate("Same as Global Server")) -for _,key in pairs(key_table) do o:value(key,server_table[key]) end +for _, key in pairs(key_table) do + o:value(key, server_table[key]) +end o.default = "nil" o.rmempty = false o = s:option(Flag, "netflix_proxy", translate("External Proxy Mode")) o.rmempty = false o.description = translate("Forward Netflix Proxy through Main Proxy") -o.default="0" +o.default = "0" o = s:option(ListValue, "threads", translate("Multi Threads Option")) o:value("0", translate("Auto Threads")) diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua index 22443d080d..fca98cc6b4 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua @@ -36,7 +36,7 @@ o.rmempty = false o = s:taboption("lan_ac", DynamicList, "lan_ac_ips", translate("LAN Host List")) o.datatype = "ipaddr" -luci.ip.neighbors({ family = 4 }, function(entry) +luci.ip.neighbors({family = 4}, function(entry) if entry.reachable then o:value(entry.dest:string()) end @@ -46,7 +46,7 @@ o:depends("lan_ac_mode", "b") o = s:taboption("lan_ac", DynamicList, "lan_bp_ips", translate("LAN Bypassed Host List")) o.datatype = "ipaddr" -luci.ip.neighbors({ family = 4 }, function(entry) +luci.ip.neighbors({family = 4}, function(entry) if entry.reachable then o:value(entry.dest:string()) end @@ -54,7 +54,7 @@ end) o = s:taboption("lan_ac", DynamicList, "lan_fp_ips", translate("LAN Force Proxy Host List")) o.datatype = "ipaddr" -luci.ip.neighbors({ family = 4 }, function(entry) +luci.ip.neighbors({family = 4}, function(entry) if entry.reachable then o:value(entry.dest:string()) end @@ -62,7 +62,7 @@ end) o = s:taboption("lan_ac", DynamicList, "lan_gm_ips", translate("Game Mode Host List")) o.datatype = "ipaddr" -luci.ip.neighbors({ family = 4 }, function(entry) +luci.ip.neighbors({family = 4}, function(entry) if entry.reachable then o:value(entry.dest:string()) end @@ -77,7 +77,7 @@ end) -- o.rmempty = false s:tab("esc", translate("Bypass Domain List")) -local escconf = "/etc/ssr/white.list" +local escconf = "/etc/ssrplus/white.list" o = s:taboption("esc", TextValue, "escconf") o.rows = 13 o.wrap = "off" @@ -93,7 +93,7 @@ o.remove = function(self, section, value) end s:tab("block", translate("Black Domain List")) -local blockconf = "/etc/ssr/black.list" +local blockconf = "/etc/ssrplus/black.list" o = s:taboption("block", TextValue, "blockconf") o.rows = 13 o.wrap = "off" @@ -109,7 +109,7 @@ o.remove = function(self, section, value) end s:tab("denydomain", translate("Deny Domain List")) -local denydomainconf = "/etc/ssr/deny.list" +local denydomainconf = "/etc/ssrplus/deny.list" o = s:taboption("denydomain", TextValue, "denydomainconf") o.rows = 13 o.wrap = "off" @@ -125,7 +125,7 @@ o.remove = function(self, section, value) end s:tab("netflix", translate("Netflix Domain List")) -local netflixconf = "/etc/ssr/netflix.list" +local netflixconf = "/etc/ssrplus/netflix.list" o = s:taboption("netflix", TextValue, "netflixconf") o.rows = 13 o.wrap = "off" diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua index a71d0003bf..fdf9e59f0d 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua @@ -7,8 +7,8 @@ t = f:field(TextValue, "conf") t.rmempty = true t.rows = 20 function t.cfgvalue() - if nixio.fs.access("/tmp/ssrplus.log") then - local logs = luci.util.execi("cat /tmp/ssrplus.log") + if nixio.fs.access("/var/log/ssrplus.log") then + local logs = luci.util.execi("cat /var/log/ssrplus.log") local s = "" for line in logs do s = line .. "\n" .. s @@ -16,5 +16,5 @@ function t.cfgvalue() return s end end -t.readonly="readonly" +t.readonly = "readonly" return f diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua index 3361f7c36e..1fe01f5182 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua @@ -5,48 +5,41 @@ require "luci.dispatcher" require "nixio.fs" local m, s, o -local shadowsocksr = "shadowsocksr" local sid = arg[1] local encrypt_methods = { -"rc4-md5", -"rc4-md5-6", -"rc4", -"table", -"aes-128-cfb", -"aes-192-cfb", -"aes-256-cfb", -"aes-128-ctr", -"aes-192-ctr", -"aes-256-ctr", -"bf-cfb", -"camellia-128-cfb", -"camellia-192-cfb", -"camellia-256-cfb", -"cast5-cfb", -"des-cfb", -"idea-cfb", -"rc2-cfb", -"seed-cfb", -"salsa20", -"chacha20", -"chacha20-ietf", + "rc4-md5", + "rc4-md5-6", + "rc4", + "table", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "cast5-cfb", + "des-cfb", + "idea-cfb", + "rc2-cfb", + "seed-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" } -local protocol = { -"origin", -} +local protocol = {"origin"} -obfs = { -"plain", -"http_simple", -"http_post", -} +obfs = {"plain", "http_simple", "http_post"} -m = Map(shadowsocksr, translate("Edit ShadowSocksR Server")) +m = Map("shadowsocksr", translate("Edit ShadowSocksR Server")) m.redirect = luci.dispatcher.build_url("admin/services/shadowsocksr/server") -if m.uci:get(shadowsocksr, sid) ~= "server_config" then +if m.uci:get("shadowsocksr", sid) ~= "server_config" then luci.http.redirect(m.redirect) return end @@ -70,7 +63,7 @@ o.default = "socks5" o = s:option(Value, "server_port", translate("Server Port")) o.datatype = "port" math.randomseed(tostring(os.time()):reverse():sub(1, 7)) -o.default = math.random(10240,20480) +o.default = math.random(10240, 20480) o.rmempty = false o.description = translate("warning! Please do not reuse the port!") @@ -89,17 +82,23 @@ o.password = true o.rmempty = false o = s:option(ListValue, "encrypt_method", translate("Encrypt Method")) -for _, v in ipairs(encrypt_methods) do o:value(v) end +for _, v in ipairs(encrypt_methods) do + o:value(v) +end o.rmempty = false o:depends("type", "ssr") o = s:option(ListValue, "protocol", translate("Protocol")) -for _, v in ipairs(protocol) do o:value(v) end +for _, v in ipairs(protocol) do + o:value(v) +end o.rmempty = false o:depends("type", "ssr") o = s:option(ListValue, "obfs", translate("Obfs")) -for _, v in ipairs(obfs) do o:value(v) end +for _, v in ipairs(obfs) do + o:value(v) +end o.rmempty = false o:depends("type", "ssr") diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua index a41163e1a5..d8c3565d33 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua @@ -3,51 +3,50 @@ require "luci.http" require "luci.dispatcher" local m, sec, o -local shadowsocksr = "shadowsocksr" local encrypt_methods = { -"table", -"rc4", -"rc4-md5", -"rc4-md5-6", -"aes-128-cfb", -"aes-192-cfb", -"aes-256-cfb", -"aes-128-ctr", -"aes-192-ctr", -"aes-256-ctr", -"bf-cfb", -"camellia-128-cfb", -"camellia-192-cfb", -"camellia-256-cfb", -"cast5-cfb", -"des-cfb", -"idea-cfb", -"rc2-cfb", -"seed-cfb", -"salsa20", -"chacha20", -"chacha20-ietf", + "table", + "rc4", + "rc4-md5", + "rc4-md5-6", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "cast5-cfb", + "des-cfb", + "idea-cfb", + "rc2-cfb", + "seed-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" } local protocol = { -"origin", -"verify_deflate", -"auth_sha1_v4", -"auth_aes128_sha1", -"auth_aes128_md5", -"auth_chain_a", + "origin", + "verify_deflate", + "auth_sha1_v4", + "auth_aes128_sha1", + "auth_aes128_md5", + "auth_chain_a" } obfs = { -"plain", -"http_simple", -"http_post", -"random_head", -"tls1.2_ticket_auth", -"tls1.2_ticket_fastauth", + "plain", + "http_simple", + "http_post", + "random_head", + "tls1.2_ticket_auth", + "tls1.2_ticket_fastauth" } -m = Map(shadowsocksr) +m = Map("shadowsocksr") -- [[ Global Setting ]]-- sec = m:section(TypedSection, "server_global", translate("Global Setting")) sec.anonymous = true diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua index 3360cee4e6..f7cad17426 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua @@ -3,17 +3,15 @@ require "luci.http" require "luci.dispatcher" require "luci.model.uci" local m, s, o -local shadowsocksr = "shadowsocksr" local uci = luci.model.uci.cursor() local server_count = 0 uci:foreach("shadowsocksr", "servers", function(s) server_count = server_count + 1 end) -m = Map(shadowsocksr, translate("Servers subscription and manage")) +m = Map("shadowsocksr", translate("Servers subscription and manage")) -- Server Subscribe - s = m:section(TypedSection, "server_subscribe") s.anonymous = true @@ -21,12 +19,11 @@ o = s:option(Flag, "auto_update", translate("Auto Update")) o.rmempty = false o.description = translate("Auto Update Server subscription, GFW list and CHN route") - o = s:option(ListValue, "auto_update_time", translate("Update time (every day)")) -for t = 0,23 do - o:value(t, t..":00") +for t = 0, 23 do + o:value(t, t .. ":00") end -o.default=2 +o.default = 2 o.rmempty = false o = s:option(DynamicList, "subscribe_url", translate("Subscribe URL")) @@ -36,28 +33,28 @@ o = s:option(Value, "filter_words", translate("Subscribe Filter Words")) o.rmempty = true o.description = translate("Filter Words splited by /") -o = s:option(Button,"update_Sub",translate("Update Subscribe List")) +o = s:option(Button, "update_Sub", translate("Update Subscribe List")) o.inputstyle = "reload" o.description = translate("Update subscribe url list first") o.write = function() + uci:commit("shadowsocksr") luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "servers")) end o = s:option(Flag, "switch", translate("Subscribe Default Auto-Switch")) o.rmempty = false o.description = translate("Subscribe new add server default Auto-Switch on") -o.default="1" +o.default = "1" o = s:option(Flag, "proxy", translate("Through proxy update")) o.rmempty = false o.description = translate("Through proxy update list, Not Recommended ") - -o = s:option(Button,"subscribe", translate("Update All Subscribe Severs")) +o = s:option(Button, "subscribe", translate("Update All Subscribe Severs")) o.rawhtml = true o.template = "shadowsocksr/subscribe" -o = s:option(Button,"delete",translate("Delete All Subscribe Severs")) +o = s:option(Button, "delete", translate("Delete All Subscribe Severs")) o.inputstyle = "reset" o.description = string.format(translate("Server Count") .. ": %d", server_count) o.write = function() @@ -69,9 +66,7 @@ o.write = function() end end) uci:save("shadowsocksr") - uci:commit("shadowsocksr") - luci.sys.exec("/etc/init.d/shadowsocksr restart &") - luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "servers")) + m.uci:commit("shadowsocksr") return end @@ -92,7 +87,7 @@ end o = s:option(DummyValue, "type", translate("Type")) function o.cfgvalue(...) - return (Value.cfgvalue(...) == "vless") and "VLESS" or Value.cfgvalue(...) + return Value.cfgvalue(...) end o = s:option(DummyValue, "alias", translate("Alias")) @@ -106,21 +101,19 @@ function o.cfgvalue(...) end o = s:option(DummyValue, "server_port", translate("Socket Connected")) -o.template="shadowsocksr/socket" -o.width="10%" +o.template = "shadowsocksr/socket" +o.width = "10%" o = s:option(DummyValue, "server", translate("Ping Latency")) -o.template="shadowsocksr/ping" -o.width="10%" +o.template = "shadowsocksr/ping" +o.width = "10%" -node = s:option(Button,"apply_node",translate("Apply")) +node = s:option(Button, "apply_node", translate("Apply")) node.inputstyle = "apply" node.write = function(self, section) uci:set("shadowsocksr", '@global[0]', 'global_server', section) uci:save("shadowsocksr") - uci:commit("shadowsocksr") - luci.sys.exec("/etc/init.d/shadowsocksr restart &") - luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "client")) + m.uci:commit("shadowsocksr") end o = s:option(Flag, "switch_enable", translate("Auto Switch")) diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua index c12fd5e258..1b99e546fe 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua @@ -4,177 +4,184 @@ require "nixio.fs" require "luci.sys" require "luci.model.uci" local m, s, o -local redir_run=0 -local reudp_run=0 -local sock5_run=0 -local server_run=0 -local kcptun_run=0 -local tunnel_run=0 -local gfw_count=0 -local ad_count=0 -local ip_count=0 -local nfip_count=0 +local redir_run = 0 +local reudp_run = 0 +local sock5_run = 0 +local server_run = 0 +local kcptun_run = 0 +local tunnel_run = 0 +local gfw_count = 0 +local ad_count = 0 +local ip_count = 0 +local nfip_count = 0 +local Process_list = luci.sys.exec("busybox ps -w") local uci = luci.model.uci.cursor() -local shadowsocksr = "shadowsocksr" -- html constants font_blue = [[]] font_off = [[]] bold_on = [[]] bold_off = [[]] -local kcptun_version=translate("Unknown") -local kcp_file="/usr/bin/kcptun-client" +local kcptun_version = translate("Unknown") +local kcp_file = "/usr/bin/kcptun-client" if not nixio.fs.access(kcp_file) then - kcptun_version=translate("Not exist") + kcptun_version = translate("Not exist") else if not nixio.fs.access(kcp_file, "rwx", "rx", "rx") then nixio.fs.chmod(kcp_file, 755) end - kcptun_version=luci.sys.exec(kcp_file .. " -v | awk '{printf $3}'") + kcptun_version = luci.sys.exec(kcp_file .. " -v | awk '{printf $3}'") if not kcptun_version or kcptun_version == "" then kcptun_version = translate("Unknown") end end -if nixio.fs.access("/etc/ssr/gfw_list.conf") then - gfw_count = tonumber(luci.sys.exec("cat /etc/ssr/gfw_list.conf | wc -l"))/2 +if nixio.fs.access("/etc/ssrplus/gfw_list.conf") then + gfw_count = tonumber(luci.sys.exec("cat /etc/ssrplus/gfw_list.conf | wc -l")) / 2 end -if nixio.fs.access("/etc/ssr/ad.conf") then - ad_count = tonumber(luci.sys.exec("cat /etc/ssr/ad.conf | wc -l")) +if nixio.fs.access("/etc/ssrplus/ad.conf") then + ad_count = tonumber(luci.sys.exec("cat /etc/ssrplus/ad.conf | wc -l")) end -if nixio.fs.access("/etc/ssr/china_ssr.txt") then - ip_count = tonumber(luci.sys.exec("cat /etc/ssr/china_ssr.txt | wc -l")) +if nixio.fs.access("/etc/ssrplus/china_ssr.txt") then + ip_count = tonumber(luci.sys.exec("cat /etc/ssrplus/china_ssr.txt | wc -l")) end -if nixio.fs.access("/etc/ssr/netflixip.list") then - nfip_count = tonumber(luci.sys.exec("cat /etc/ssr/netflixip.list | wc -l")) +if nixio.fs.access("/etc/ssrplus/netflixip.list") then + nfip_count = tonumber(luci.sys.exec("cat /etc/ssrplus/netflixip.list | wc -l")) end -local icount=luci.sys.exec("busybox ps -w | grep ssr-reudp |grep -v grep| wc -l") -if tonumber(icount)>0 then - reudp_run=1 -else - icount=luci.sys.exec("busybox ps -w | grep ssr-retcp |grep \"\\-u\"|grep -v grep| wc -l") - if tonumber(icount)>0 then - reudp_run=1 - end +if Process_list:find("udp.only.ssr.reudp") then + reudp_run = 1 end -if luci.sys.call("busybox ps -w | grep ssr-retcp | grep -v grep >/dev/null") == 0 then - redir_run=1 +if Process_list:find("tcp.only.ssr.retcp") then + redir_run = 1 end -if luci.sys.call("busybox ps -w | grep ssr-local | grep -v ssr-socksdns |grep -v grep >/dev/null") == 0 then - sock5_run=1 +if Process_list:find("tcp.udp.ssr.local") then + sock5_run = 1 end -if luci.sys.call("pidof kcptun-client >/dev/null") == 0 then - kcptun_run=1 +if Process_list:find("tcp.udp.ssr.retcp") then + redir_run = 1 + reudp_run = 1 end -if luci.sys.call("busybox ps -w | grep ssr-server | grep -v grep >/dev/null") == 0 then - server_run=1 +if Process_list:find("local.ssr.retcp") then + redir_run = 1 + sock5_run = 1 end --- if luci.sys.call("busybox ps -w | grep ssr-tunnel |grep -v grep >/dev/null") == 0 then --- tunnel_run=1 --- end -if luci.sys.call("pidof pdnsd >/dev/null") == 0 or (luci.sys.call("busybox ps -w | grep ssr-dns |grep -v grep >/dev/null") == 0 and luci.sys.call("pidof dns2socks >/dev/null") == 0)then - pdnsd_run=1 +if Process_list:find("local.udp.ssr.retcp") then + reudp_run = 1 + redir_run = 1 + sock5_run = 1 +end + +if Process_list:find("kcptun.client") then + kcptun_run = 1 +end + +if Process_list:find("ssr.server") then + server_run = 1 +end + +if Process_list:find("ssrplus/bin/pdnsd") or (Process_list:find("ssrplus.dns") and Process_list:find("dns2socks 127.0.0.1:.*127.0.0.1:5335")) then + pdnsd_run = 1 end m = SimpleForm("Version") m.reset = false m.submit = false -s=m:field(DummyValue,"redir_run",translate("Global Client")) +s = m:field(DummyValue, "redir_run", translate("Global Client")) s.rawhtml = true if redir_run == 1 then - s.value =font_blue .. bold_on .. translate("Running") .. bold_off .. font_off + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off else s.value = translate("Not Running") end -s=m:field(DummyValue,"reudp_run",translate("Game Mode UDP Relay")) +s = m:field(DummyValue, "reudp_run", translate("Game Mode UDP Relay")) s.rawhtml = true if reudp_run == 1 then - s.value =font_blue .. bold_on .. translate("Running") .. bold_off .. font_off + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off else s.value = translate("Not Running") end -if uci:get_first(shadowsocksr, 'global', 'pdnsd_enable', '0') ~= '0' then - s=m:field(DummyValue,"pdnsd_run",translate("DNS Anti-pollution")) +if uci:get_first("shadowsocksr", 'global', 'pdnsd_enable', '0') ~= '0' then + s = m:field(DummyValue, "pdnsd_run", translate("DNS Anti-pollution")) s.rawhtml = true if pdnsd_run == 1 then - s.value =font_blue .. bold_on .. translate("Running") .. bold_off .. font_off + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off else s.value = translate("Not Running") end end -s=m:field(DummyValue,"sock5_run",translate("Global SOCKS5 Proxy Server")) +s = m:field(DummyValue, "sock5_run", translate("Global SOCKS5 Proxy Server")) s.rawhtml = true if sock5_run == 1 then - s.value =font_blue .. bold_on .. translate("Running") .. bold_off .. font_off + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off else s.value = translate("Not Running") end -s=m:field(DummyValue,"server_run",translate("Local Servers")) +s = m:field(DummyValue, "server_run", translate("Local Servers")) s.rawhtml = true if server_run == 1 then - s.value =font_blue .. bold_on .. translate("Running") .. bold_off .. font_off + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off else s.value = translate("Not Running") end if nixio.fs.access("/usr/bin/kcptun-client") then - s=m:field(DummyValue,"kcp_version",translate("KcpTun Version")) + s = m:field(DummyValue, "kcp_version", translate("KcpTun Version")) s.rawhtml = true - s.value =kcptun_version - s=m:field(DummyValue,"kcptun_run",translate("KcpTun")) + s.value = kcptun_version + s = m:field(DummyValue, "kcptun_run", translate("KcpTun")) s.rawhtml = true if kcptun_run == 1 then - s.value =font_blue .. bold_on .. translate("Running") .. bold_off .. font_off + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off else s.value = translate("Not Running") end end -s=m:field(DummyValue,"google",translate("Google Connectivity")) +s = m:field(DummyValue, "google", translate("Google Connectivity")) s.value = translate("No Check") s.template = "shadowsocksr/check" -s=m:field(DummyValue,"baidu",translate("Baidu Connectivity")) +s = m:field(DummyValue, "baidu", translate("Baidu Connectivity")) s.value = translate("No Check") s.template = "shadowsocksr/check" -s=m:field(DummyValue,"gfw_data",translate("GFW List Data")) +s = m:field(DummyValue, "gfw_data", translate("GFW List Data")) s.rawhtml = true s.template = "shadowsocksr/refresh" s.value = gfw_count .. " " .. translate("Records") -s=m:field(DummyValue,"ip_data",translate("China IP Data")) +s = m:field(DummyValue, "ip_data", translate("China IP Data")) s.rawhtml = true s.template = "shadowsocksr/refresh" s.value = ip_count .. " " .. translate("Records") -s=m:field(DummyValue,"nfip_data",translate("Netflix IP Data")) +s = m:field(DummyValue, "nfip_data", translate("Netflix IP Data")) s.rawhtml = true s.template = "shadowsocksr/refresh" s.value = nfip_count .. " " .. translate("Records") -if uci:get_first(shadowsocksr, 'global', 'adblock', '0') == '1' then - s=m:field(DummyValue,"ad_data",translate("Advertising Data")) +if uci:get_first("shadowsocksr", 'global', 'adblock', '0') == '1' then + s = m:field(DummyValue, "ad_data", translate("Advertising Data")) s.rawhtml = true s.template = "shadowsocksr/refresh" s.value = ad_count .. " " .. translate("Records") end -s=m:field(DummyValue,"check_port",translate("Check Server Port")) +s = m:field(DummyValue, "check_port", translate("Check Server Port")) s.template = "shadowsocksr/checkport" -s.value =translate("No Check") +s.value = translate("No Check") return m diff --git a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm index c75056a80a..7383a5891b 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm +++ b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm @@ -26,5 +26,4 @@ //]]> <%=self.value%> - <%+cbi/valuefooter%> diff --git a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm index ed91a2f22c..71381488fa 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm +++ b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm @@ -1,7 +1,5 @@ <%+cbi/valueheader%> - <%=self.value%> - - - -<%+cbi/valuefooter%> \ No newline at end of file +<%+cbi/valuefooter%> diff --git a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm index 3e610d9ee2..3ce4e1f977 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm +++ b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm @@ -12,16 +12,18 @@ var s = document.getElementById(dataname+'-status'); if (s) { - if (rv.ret=="0") - s.innerHTML =""+"<%:No new data!%> "+""; - else if(rv.ret=="-1") + if(rv.ret=="-1") { s.innerHTML =""+"<%:Refresh Error!%> "+""; } + if (rv.ret=="0") + { + s.innerHTML =""+"<%:No new data!%> "+""; + } else - { - s.innerHTML =""+"<%:Refresh OK!%> "+"<%:Total Records:%>"+rv.ret+""; - } + { + s.innerHTML =""+"<%:Refresh OK!%> "+"<%:Total Records:%>"+rv.ret+""; + } } btn.disabled = false; btn.value = '<%:Refresh Data %>'; diff --git a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm new file mode 100644 index 0000000000..15b3927b20 --- /dev/null +++ b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm @@ -0,0 +1,25 @@ +<%+cbi/valueheader%> + + + +<%+cbi/valuefooter%> diff --git a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm index 9c5ba66ac5..047043b304 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm +++ b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm @@ -2,9 +2,6 @@ Copyright 2018-2019 Lienol Licensed to the public under the Apache License 2.0. -%> -<% -local dsp = require "luci.dispatcher" --%>