diff --git a/package/ctcgfw/luci-app-vssr/Makefile b/package/ctcgfw/luci-app-vssr/Makefile index 8113698733..43ed9d0fc1 100644 --- a/package/ctcgfw/luci-app-vssr/Makefile +++ b/package/ctcgfw/luci-app-vssr/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-vssr -PKG_VERSION:=1.15 -PKG_RELEASE:=20200825 +PKG_VERSION:=1.16 +PKG_RELEASE:=20200826 include $(INCLUDE_DIR)/package.mk diff --git a/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua b/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua index 3ac6f8cf26..615268226c 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua @@ -97,19 +97,26 @@ end -- 切换节点 function change_node() + local sockets = require "socket" local e = {} local uci = luci.model.uci.cursor() local sid = luci.http.formvalue("set") local server = luci.http.formvalue("server") + local flow_table = {"youtube","tw_video","netflix","disney","prime","tvb","custom"} e.status = false e.sid = sid if sid ~= "" and server ~= "" then - uci:set("vssr", '@global[0]', server..'_server', sid) - if( server ~= "global" ) then + uci:set("vssr", '@global[0]', server..'_server', sid) + if( server ~= "global" and server ~= "udp_relay" ) then uci:set("vssr", '@global[0]', 'v2ray_flow', "1") + for i, v in pairs(flow_table) do + if( v ~= server) then + uci:set("vssr", '@global[0]', v..'_server', 'nil') + end + end end uci:commit("vssr") - luci.sys.exec("/etc/init.d/vssr restart") + luci.sys.call("/etc/init.d/vssr restart >/www/restartlog.htm 2>&1") e.status = true end luci.http.prepare_content("application/json") @@ -178,12 +185,18 @@ function check_ip() local d = {} local mm = require 'maxminddb' local vssr = require "vssrutil" + local port = 80 local db = mm.open('/usr/share/vssr/GeoLite2-Country.mmdb') local ip = vssr.wget("http://api.ipify.org/") - local res = db:lookup(ip) - local port = 80 - d.flag = string.lower(res:get("country", "iso_code")) - d.country = res:get("country", "names", "zh-CN") + if (ip ~= "") then + local res = db:lookup(ip) + d.flag = string.lower(res:get("country", "iso_code")) + d.country = res:get("country", "names", "zh-CN") + else + d.flag = "un" + d.country = "Unknown" + ip = "Unknown" + end e.outboard = ip e.outboardip = d e.baidu = vssr.check_site("www.baidu.com",port) diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua index 78305c26c0..69a221e0c8 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua @@ -6,6 +6,7 @@ local gfwmode = 0 local gfw_count = 0 local ip_count = 0 local ad_count = 0 +local server_count = 0 if nixio.fs.access("/etc/dnsmasq.ssr/gfw_list.conf") then gfwmode = 1 end @@ -23,24 +24,11 @@ if nixio.fs.access("/etc/china_ssr.txt") then ip_count = sys.exec("cat /etc/china_ssr.txt | wc -l") end -uci:foreach(vssr, "servers", function(s) - if s["type"] == "v2ray" then - if s.alias then - 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 - } - end - end + +uci:foreach("vssr", "servers", function(s) + server_count = server_count + 1 end) -local key_table = {} -for key, _ in pairs(server_table) do table.insert(key_table, key) end - -table.sort(key_table) m = Map(vssr) -- [[ 服务器节点故障自动切换设置 ]]-- @@ -98,14 +86,22 @@ o = s:option(DummyValue, "", "") o.rawhtml = true o.template = "vssr/update_subscribe" -o = s:option(Button, "delete", translate("Delete all 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() - uci:delete_all("vssr", "servers", function(s) return true end) - uci:commit("vssr") - luci.sys.exec("/etc/init.d/vssr stop") - luci.http.redirect(luci.dispatcher.build_url("admin", "services", "vssr", - "advanced")) + uci:delete_all("vssr", "servers", function(s) + if s.hashkey or s.isSubscribe then + return true + else + return false + end + end) + uci:save("vssr") + uci:commit("vssr") + luci.sys.exec("/etc/init.d/vssr restart") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "vssr", "servers")) + return end -- [[ adblock ]]-- diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client-config.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client-config.lua index e5bf092829..97eb875467 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client-config.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client-config.lua @@ -18,85 +18,33 @@ 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", + "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", + "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", + "plain", "http_simple", "http_post", "random_head", "tls1.2_ticket_auth" } -local securitys = { -"auto", -"none", -"aes-128-gcm", -"chacha20-poly1305" -} - +local securitys = {"auto", "none", "aes-128-gcm", "chacha20-poly1305"} m = Map(vssr, translate("Edit vssr Server")) m.redirect = luci.dispatcher.build_url("admin/services/vssr/servers") @@ -180,7 +128,6 @@ o = s:option(Value, "plugin_opts", translate("Plugin Opts")) o.rmempty = true o:depends("type", "ss") - o = s:option(ListValue, "protocol", translate("Protocol")) for _, v in ipairs(protocol) do o:value(v) end o.rmempty = true @@ -194,8 +141,6 @@ for _, v in ipairs(obfs) do o:value(v) end o.rmempty = true o:depends("type", "ssr") - - o = s:option(Value, "obfs_param", translate("Obfs param(optional)")) o:depends("type", "ssr") diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua index 70a8a611f0..df90fd9596 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua @@ -1,104 +1,111 @@ -- 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 vssr = "vssr" -local gfwmode=0 +local gfwmode = 0 -if nixio.fs.access("/etc/dnsmasq.ssr/gfw_list.conf") then -gfwmode=1 -end +if nixio.fs.access("/etc/dnsmasq.ssr/gfw_list.conf") then gfwmode = 1 end local uci = luci.model.uci.cursor() m = Map(vssr) -m:section(SimpleSection).template = "vssr/status_top" +m:section(SimpleSection).template = "vssr/status_top" local server_table = {} local tw_table = {} local tvb_table = {} uci:foreach(vssr, "servers", function(s) - if s.alias then - 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} - end - - if s.flag == "tw" then - if s.alias then - tw_table[s[".name"]] = "[%s]:%s" %{string.upper(s.type), s.alias} - elseif s.server and s.server_port then - tw_table[s[".name"]] = "[%s]:%s:%s" %{string.upper(s.type), s.server, s.server_port} - end - end - - if s.flag == "hk" then - if s.alias then - tvb_table[s[".name"]] = "[%s]:%s" %{string.upper(s.type), s.alias} - elseif s.server and s.server_port then - tvb_table[s[".name"]] = "[%s]:%s:%s" %{string.upper(s.type), s.server, s.server_port} - end - end + if s.alias then + 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 + } + end + + if s.flag == "tw" then + if s.alias then + tw_table[s[".name"]] = "[%s]:%s" % {string.upper(s.type), s.alias} + elseif s.server and s.server_port then + tw_table[s[".name"]] = "[%s]:%s:%s" % + { + string.upper(s.type), s.server, s.server_port + } + end + end + + if s.flag == "hk" then + if s.alias then + tvb_table[s[".name"]] = "[%s]:%s" % {string.upper(s.type), s.alias} + elseif s.server and s.server_port then + tvb_table[s[".name"]] = "[%s]:%s:%s" % + { + string.upper(s.type), s.server, s.server_port + } + end + 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 -local key_table_tw = {} -for key,_ in pairs(tw_table) do - table.insert(key_table_tw,key) -end +local key_table_tw = {} +for key, _ in pairs(tw_table) do table.insert(key_table_tw, key) end -local key_table_tvb = {} -for key,_ in pairs(tvb_table) do - table.insert(key_table_tvb,key) -end +local key_table_tvb = {} +for key, _ in pairs(tvb_table) do table.insert(key_table_tvb, key) end - - -table.sort(key_table) +table.sort(key_table) table.sort(key_table_tw) table.sort(key_table_tvb) -local route_name = {"youtube_server","tw_video_server","netflix_server","disney_server","prime_server","tvb_server","custom_server"} -local route_label = {"Youtube Proxy","TaiWan Video Proxy","Netflix Proxy","Diseny+ Proxy","Prime Video Proxy","TVB Video Proxy","Custom Proxy"} +local route_name = { + "youtube_server", "tw_video_server", "netflix_server", "disney_server", + "prime_server", "tvb_server", "custom_server" +} +local route_label = { + "Youtube Proxy", "TaiWan Video Proxy", "Netflix Proxy", "Diseny+ Proxy", + "Prime Video Proxy", "TVB Video Proxy", "Custom Proxy" +} -- [[ Global Setting ]]-- -s = m:section(TypedSection, "global",translate("Basic Settings [SS|SSR|V2ray|Trojan]")) +s = m:section(TypedSection, "global", + translate("Basic Settings [SS|SSR|V2ray|Trojan]")) 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 Main 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(Flag, "v2ray_flow", translate("Open v2ray route")) o.rmempty = false o.description = translate("When open v2ray routed,Apply may take more time.") -for i,v in pairs(route_name) do - o = s:option(ListValue, v, translate(route_label[i])) - o:value("nil", translate("Same as Main Server")) - if(v == "tw_video_server") then - for _,key in pairs(key_table_tw) do o:value(key,tw_table[key]) end - elseif(v == "tvb_server") then - for _,key in pairs(key_table_tvb) do o:value(key,tvb_table[key]) end +for i, v in pairs(route_name) do + o = s:option(ListValue, v, translate(route_label[i])) + o:value("nil", translate("Same as Main Server")) + if (v == "tw_video_server") then + for _, key in pairs(key_table_tw) do o:value(key, tw_table[key]) end + elseif (v == "tvb_server") then + for _, key in pairs(key_table_tvb) do + o:value(key, tvb_table[key]) + end else - 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 end - o:depends("v2ray_flow", "1") - o.default = "nil" -end + o:depends("v2ray_flow", "1") + o.default = "nil" +end o = s:option(ListValue, "threads", translate("Multi Threads Option")) o:value("0", translate("Auto Threads")) @@ -118,7 +125,7 @@ o.default = "router" o = s:option(ListValue, "dports", translate("Proxy Ports")) o:value("1", translate("All Ports")) o:value("2", translate("Only Common Ports")) -o.default = 1 +o.default = 1 o = s:option(ListValue, "pdnsd_enable", translate("Resolve Dns Mode")) o:value("1", translate("Use Pdnsd tcp query and cache")) @@ -141,5 +148,5 @@ o:value("114.114.114.114:53", translate("Oversea Mode DNS-1 (114.114.114.114)")) o:value("114.114.115.115:53", translate("Oversea Mode DNS-2 (114.114.115.115)")) o:depends("pdnsd_enable", "1") -m:section(SimpleSection).template = "vssr/status_bottom" +m:section(SimpleSection).template = "vssr/status_bottom" return m diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/control.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/control.lua index bd841e4db4..d7dd23e47a 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/control.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/control.lua @@ -9,37 +9,36 @@ s.anonymous = true -- Part of WAN s:tab("wan_ac", translate("WAN IP AC")) -o = s:taboption("wan_ac", DynamicList, "wan_bp_ips", translate("WAN White List IP")) +o = s:taboption("wan_ac", DynamicList, "wan_bp_ips", + translate("WAN White List IP")) o.datatype = "ip4addr" -o = s:taboption("wan_ac", DynamicList, "wan_fw_ips", translate("WAN Force Proxy IP")) +o = s:taboption("wan_ac", DynamicList, "wan_fw_ips", + translate("WAN Force Proxy IP")) o.datatype = "ip4addr" -- Part of LAN s:tab("lan_ac", translate("LAN IP AC")) -o = s:taboption("lan_ac", DynamicList, "lan_ac_ips", translate("LAN Bypassed Host List")) +o = s:taboption("lan_ac", DynamicList, "lan_ac_ips", + translate("LAN Bypassed Host List")) o.datatype = "ipaddr" -luci.ip.neighbors({ family = 4 }, function(entry) - if entry.reachable then - o:value(entry.dest:string()) - end +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then o:value(entry.dest:string()) end end) -o = s:taboption("lan_ac", DynamicList, "lan_fp_ips", translate("LAN Force Proxy Host List")) +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) - if entry.reachable then - o:value(entry.dest:string()) - end +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then o:value(entry.dest:string()) end end) -o = s:taboption("lan_ac", DynamicList, "lan_gm_ips", translate("Game Mode Host List")) +o = s:taboption("lan_ac", DynamicList, "lan_gm_ips", + translate("Game Mode Host List")) o.datatype = "ipaddr" -luci.ip.neighbors({ family = 4 }, function(entry) - if entry.reachable then - o:value(entry.dest:string()) - end +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then o:value(entry.dest:string()) end end) -- Part of Self @@ -50,44 +49,36 @@ end) -- o:value("2", translatef("Forwarded Proxy")) -- o.rmempty = false -s:tab("esc", translate("Bypass Domain List")) +s:tab("esc", translate("Bypass Domain List")) local escconf = "/etc/config/white.list" o = s:taboption("esc", TextValue, "escconf") o.rows = 13 o.wrap = "off" o.rmempty = true -o.cfgvalue = function(self, section) - return NXFS.readfile(escconf) or "" -end +o.cfgvalue = function(self, section) return NXFS.readfile(escconf) or "" end o.write = function(self, section, value) - NXFS.writefile(escconf, value:gsub("\r\n", "\n")) -end -o.remove = function(self, section, value) - NXFS.writefile(escconf, "") + NXFS.writefile(escconf, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) NXFS.writefile(escconf, "") end - -s:tab("block", translate("Black Domain List")) +s:tab("block", translate("Black Domain List")) local blockconf = "/etc/config/black.list" o = s:taboption("block", TextValue, "blockconf") o.rows = 13 o.wrap = "off" o.rmempty = true -o.cfgvalue = function(self, section) - return NXFS.readfile(blockconf) or " " -end +o.cfgvalue = function(self, section) return NXFS.readfile(blockconf) or " " end o.write = function(self, section, value) - NXFS.writefile(blockconf, value:gsub("\r\n", "\n")) -end -o.remove = function(self, section, value) - NXFS.writefile(blockconf, "") + NXFS.writefile(blockconf, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) NXFS.writefile(blockconf, "") end -s:tab("proxy", translate("Custom Proxy Domain Name")) +s:tab("proxy", translate("Custom Proxy Domain Name")) -o = s:taboption("proxy", DynamicList, "proxy_domain_name", translate("Proxy Domain Name")) +o = s:taboption("proxy", DynamicList, "proxy_domain_name", + translate("Proxy Domain Name")) o.datatype = "hostname" -return m \ No newline at end of file +return m diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua index 5422596af3..f6359aaf5f 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua @@ -7,9 +7,10 @@ t = f:field(TextValue, "conf") t.rmempty = true t.rows = 20 function t.cfgvalue() - luci.sys.exec("[ -f /tmp/vssr.log ] && sed '1!G;h;$!d' /tmp/vssr.log > /tmp/ssrpro.log") - return fs.readfile(conffile) or "" + luci.sys.exec( + "[ -f /tmp/vssr.log ] && sed '1!G;h;$!d' /tmp/vssr.log > /tmp/ssrpro.log") + return fs.readfile(conffile) or "" end -t.readonly="readonly" +t.readonly = "readonly" -return f \ No newline at end of file +return f diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server-config.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server-config.lua index 79a4d3eb23..9eaf7ae241 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server-config.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server-config.lua @@ -1,60 +1,33 @@ -- Copyright (C) 2017 yushi studio -- Licensed to the public under the GNU General Public License v3. - local m, s, o local vssr = "vssr" 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(vssr, translate("Edit vssr Server")) m.redirect = luci.dispatcher.build_url("admin/services/vssr/server") if m.uci:get(vssr, sid) ~= "server_config" then - luci.http.redirect(m.redirect) - return + luci.http.redirect(m.redirect) + return end - - - -- [[ Server Setting ]]-- s = m:section(NamedSection, sid, "server_config") s.anonymous = true -s.addremove = false +s.addremove = false o = s:option(Flag, "enable", translate("Enable")) o.default = 1 @@ -82,7 +55,6 @@ o = s:option(ListValue, "protocol", translate("Protocol")) for _, v in ipairs(protocol) do o:value(v) end o.rmempty = false - o = s:option(ListValue, "obfs", translate("Obfs")) for _, v in ipairs(obfs) do o:value(v) end o.rmempty = false diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server.lua index 19cbe2ef6f..3c356240a5 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server.lua @@ -1,67 +1,34 @@ -- Copyright (C) 2017 yushi studio -- Licensed to the public under the GNU General Public License v3. - local m, sec, o local vssr = "vssr" local uci = luci.model.uci.cursor() local ipkg = require("luci.model.ipkg") - m = Map(vssr, translate("vssr Server")) 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" } - - - - -- [[ Global Setting ]]-- sec = m:section(TypedSection, "server_global", translate("Global Setting")) sec.anonymous = true - - o = sec:option(Flag, "enable_server", translate("Enable Server")) o.rmempty = false @@ -72,43 +39,30 @@ sec.addremove = true sec.template = "cbi/tblsection" sec.extedit = luci.dispatcher.build_url("admin/services/vssr/server/%s") function sec.create(...) - local sid = TypedSection.create(...) - if sid then - luci.http.redirect(sec.extedit % sid) - return - end + local sid = TypedSection.create(...) + if sid then + luci.http.redirect(sec.extedit % sid) + return + end end o = sec:option(Flag, "enable", translate("Enable")) -function o.cfgvalue(...) - return Value.cfgvalue(...) or translate("0") -end +function o.cfgvalue(...) return Value.cfgvalue(...) or translate("0") end o.rmempty = false o = sec:option(DummyValue, "server_port", translate("Server Port")) -function o.cfgvalue(...) - return Value.cfgvalue(...) or "?" -end - +function o.cfgvalue(...) return Value.cfgvalue(...) or "?" end o = sec:option(DummyValue, "encrypt_method", translate("Encrypt Method")) function o.cfgvalue(...) - local v = Value.cfgvalue(...) - return v and v:upper() or "?" + local v = Value.cfgvalue(...) + return v and v:upper() or "?" end o = sec:option(DummyValue, "protocol", translate("Protocol")) -function o.cfgvalue(...) - return Value.cfgvalue(...) or "?" -end - - +function o.cfgvalue(...) return Value.cfgvalue(...) or "?" end o = sec:option(DummyValue, "obfs", translate("Obfs")) -function o.cfgvalue(...) - return Value.cfgvalue(...) or "?" -end - - +function o.cfgvalue(...) return Value.cfgvalue(...) or "?" end return m diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/socks5.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/socks5.lua index b896a44ff2..1242cdfc74 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/socks5.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/socks5.lua @@ -2,39 +2,36 @@ local vssr = "vssr" local uci = luci.model.uci.cursor() local server_table = {} - local sys = require "luci.sys" m = Map(vssr) -- [[ SOCKS5 Proxy ]]-- if nixio.fs.access("/usr/bin/v2ray/v2ray") then -s = m:section(TypedSection, "socks5_proxy", translate("V2ray SOCKS5 Proxy")) -s.anonymous = true + s = m:section(TypedSection, "socks5_proxy", translate("V2ray SOCKS5 Proxy")) + s.anonymous = true -o = s:option(Flag, "enable_server", translate("Enable Servers")) -o.rmempty = false + o = s:option(Flag, "enable_server", translate("Enable Servers")) + o.rmempty = false -o = s:option(Flag, "enable_auth", translate("Enable Auth")) -o.rmempty = false + o = s:option(Flag, "enable_auth", translate("Enable Auth")) + o.rmempty = false -o = s:option(Value, "Socks_user", translate("Socks user")) -o.default="user" -o.rmempty = true -o:depends("enable_auth", "1") - -o = s:option(Value, "Socks_pass", translate("Socks pass")) -o.default="password" -o.password = true -o.rmempty = true -o:depends("enable_auth", "1") - -o = s:option(Value, "local_port", translate("Local Port")) -o.datatype = "port" -o.default = 1080 -o.rmempty = false + o = s:option(Value, "Socks_user", translate("Socks user")) + o.default = "user" + o.rmempty = true + o:depends("enable_auth", "1") + o = s:option(Value, "Socks_pass", translate("Socks pass")) + o.default = "password" + o.password = true + o.rmempty = true + o:depends("enable_auth", "1") + o = s:option(Value, "local_port", translate("Local Port")) + o.datatype = "port" + o.default = 1080 + o.rmempty = false end diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/licence.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/licence.htm index 61d011643b..af7630dd73 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/licence.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/licence.htm @@ -11,11 +11,12 @@ https://www.maxmind.com.

Flag-icon-css

-

A collection of all country flags in SVG — plus the CSS for easier integration https://flagicons.lipis.dev

- +

A collection of all country flags in SVG — plus the CSS for + easier integration https://flagicons.lipis.dev

+ -<%+footer%> \ No newline at end of file +<%+footer%> diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/refresh.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/refresh.htm index 694128cc30..7487bee563 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/refresh.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/refresh.htm @@ -2,34 +2,34 @@ + onclick="return refresh_data(this,'<%=self.option%>')" /> <%=self.value%> -<%+cbi/valuefooter%> \ No newline at end of file +<%+cbi/valuefooter%> diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm index 81a92f5763..b301ca0411 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm @@ -52,7 +52,7 @@ str = padright(str, l, "="); try { return atob(str); - }catch(err) { + } catch (err) { return str; } } @@ -131,59 +131,59 @@ return false; } else if (ssu[0] == "ss") { var url0, param = ""; - var sipIndex = ssu[1].indexOf("@"); - var ploc = ssu[1].indexOf("#"); - if (ploc > 0) { - url0 = ssu[1].substr(0, ploc); - param = ssu[1].substr(ploc + 1); - } else { - url0 = ssu[1]; - } + var sipIndex = ssu[1].indexOf("@"); + var ploc = ssu[1].indexOf("#"); + if (ploc > 0) { + url0 = ssu[1].substr(0, ploc); + param = ssu[1].substr(ploc + 1); + } else { + url0 = ssu[1]; + } - if (sipIndex != -1) { - // SIP002 - var userInfo = b64decsafe(url0.substr(0, sipIndex)); - var temp = url0.substr(sipIndex + 1).split("/?"); - var serverInfo = temp[0].split(":"); - var server = serverInfo[0]; - var port = serverInfo[1]; - var method, password, plugin, pluginOpts; - if (temp[1]) { - var pluginInfo = decodeURIComponent(temp[1]); - var pluginIndex = pluginInfo.indexOf(";"); - var pluginNameInfo = pluginInfo.substr(0, pluginIndex); - plugin = pluginNameInfo.substr(pluginNameInfo.indexOf("=") + 1) - pluginOpts = pluginInfo.substr(pluginIndex + 1); - } + if (sipIndex != -1) { + // SIP002 + var userInfo = b64decsafe(url0.substr(0, sipIndex)); + var temp = url0.substr(sipIndex + 1).split("/?"); + var serverInfo = temp[0].split(":"); + var server = serverInfo[0]; + var port = serverInfo[1]; + var method, password, plugin, pluginOpts; + if (temp[1]) { + var pluginInfo = decodeURIComponent(temp[1]); + var pluginIndex = pluginInfo.indexOf(";"); + var pluginNameInfo = pluginInfo.substr(0, pluginIndex); + plugin = pluginNameInfo.substr(pluginNameInfo.indexOf("=") + 1) + pluginOpts = pluginInfo.substr(pluginIndex + 1); + } - var userInfoSplitIndex = userInfo.indexOf(":"); - if (userInfoSplitIndex != -1) { - method = userInfo.substr(0, userInfoSplitIndex); - password = userInfo.substr(userInfoSplitIndex + 1); - } - el('.type').value = "ss"; - el('.type').dispatchEvent(event); - el('.server').value = server; - el('.server_port').value = port; - el('.password').value = password || ""; - el('.encrypt_method_ss').value = method || ""; - el('.plugin').value = plugin || ""; - el('.plugin_opts').value = pluginOpts || ""; - } else { - var sstr = b64decsafe(url0); - el('.type').value = "ss"; - el('.type').dispatchEvent(event); - var team = sstr.split('@'); - console.log(param); - var part1 = team[0].split(':'); - var part2 = team[1].split(':'); - el('.server').value = part2[0]; - el('.server_port').value = part2[1]; - el('.password').value = part1[1]; - el('.encrypt_method_ss').value = part1[0]; - el('.plugin').value = ""; - el('.plugin_opts').value = ""; - } + var userInfoSplitIndex = userInfo.indexOf(":"); + if (userInfoSplitIndex != -1) { + method = userInfo.substr(0, userInfoSplitIndex); + password = userInfo.substr(userInfoSplitIndex + 1); + } + el('.type').value = "ss"; + el('.type').dispatchEvent(event); + el('.server').value = server; + el('.server_port').value = port; + el('.password').value = password || ""; + el('.encrypt_method_ss').value = method || ""; + el('.plugin').value = plugin || ""; + el('.plugin_opts').value = pluginOpts || ""; + } else { + var sstr = b64decsafe(url0); + el('.type').value = "ss"; + el('.type').dispatchEvent(event); + var team = sstr.split('@'); + console.log(param); + var part1 = team[0].split(':'); + var part2 = team[1].split(':'); + el('.server').value = part2[0]; + el('.server_port').value = part2[1]; + el('.password').value = part1[1]; + el('.encrypt_method_ss').value = part1[0]; + el('.plugin').value = ""; + el('.plugin_opts').value = ""; + } if (param != undefined) { rema = decodeURI(param) @@ -209,22 +209,22 @@ var part2 = team[1].split(':'); var others = part2[1].split('?'); var queryParam = {} - if(others.length > 1) { - var queryParams = others[1] - var queryArray = queryParams.split('&') - for (i = 0; i < queryArray.length; i++) { - var params = queryArray[i].split('='); - queryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || ''); - } - } + if (others.length > 1) { + var queryParams = others[1] + var queryArray = queryParams.split('&') + for (i = 0; i < queryArray.length; i++) { + var params = queryArray[i].split('='); + queryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || ''); + } + } el('.server').value = part2[0]; el('.server_port').value = others[0]; el('.password').value = part1[1]; - if(queryParam.peer || queryParam.sni){ + if (queryParam.peer || queryParam.sni) { el('.tls').checked = true; el('.peer').value = queryParam.peer || queryParam.sni; } - + if (param != undefined) { rema = decodeURI(param) el('.alias').value = decodeURI(param); @@ -305,4 +305,4 @@ onclick="return import_ssr_url(this, '<%=self.option%>', '<%=self.value%>')" /> -<%+cbi/valuefooter%> \ No newline at end of file +<%+cbi/valuefooter%> diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status_bottom.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status_bottom.htm index 1e47c7d522..1da8a7ce4e 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status_bottom.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status_bottom.htm @@ -20,7 +20,7 @@ \ No newline at end of file + diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status_top.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status_top.htm index 6d97e18300..40801eed08 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status_top.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status_top.htm @@ -1,4 +1,4 @@ - + @@ -90,4 +90,4 @@ ); //]]> - \ No newline at end of file + diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm index 874bad2c63..b23a504532 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm @@ -1,6 +1,6 @@ - - - + + +
@@ -97,7 +97,7 @@ var iploaded = false; var ajaxArray = new Array(); var currentCheckCount = 0; - + //渲染节点列表 $.each(servers, function (i, val) { @@ -106,7 +106,7 @@ $(id).addClass("fast"); } val.flag = (val.flag == undefined) ? "un" : val.flag; - $(id).attr("data-flag",val.flag); + $(id).attr("data-flag", val.flag); $(id).find(".type .tp").text(val.type); $(id).find(".type").addClass("flag-icon-" + val.flag); $(id).find(".alias").text(val.alias); @@ -122,98 +122,83 @@ //转换节点名称的Emoji显示 $(".alias").emoji(); //适配方框的大小 - + $(".flag-icon").each(function (index, el) { - if ($(el).height < 60) { - $(el).parent.height(60); - $(el).width(60) - } else { - $(el).width($(el).height()); - } - }); - + if ($(el).height < 60) { + $(el).parent.height(60); + $(el).width(60) + } else { + $(el).width($(el).height()); + } + }); + //切换节点 function apply_node(node) { //$("#cbi-apply-vssr1").show(); //显示应用中 - var $html = ""; - $html +='
'; - $html +='
'; - $html +='
'; - if($('#cbi-' + CONFIG + '-' +node).attr("data-flag") == "tw"){ - $html +='
'; + $html += '
'; + $html += '
'; + $html += '
'; + $html += '
'; + if ($('#cbi-' + CONFIG + '-' + node).attr("data-flag") == "tw") { + $html += '
'; } - $html +='
'; - $html +='
'; - $html +='
'; - if($('#cbi-' + CONFIG + '-' +node).attr("data-flag") =="hk"){ - $html +='
'; + $html += '
'; + $html += '
'; + $html += '
'; + if ($('#cbi-' + CONFIG + '-' + node).attr("data-flag") == "hk") { + $html += '
'; } - $html +='
'; - $html +='
'; + $html += '
'; + $html += '
'; Swal.fire({ - title: '请选择应用于', - html:$html, - focusConfirm: false, - confirmButtonText:'关闭', - onRender: (toast) => { - $(".change-node").click(function(){ - var dataServer = $(this).attr("data-server"); - XHR.halt(); - $.each(ajaxArray, function (n, value) { value.abort(); }) //中断所有的ajax请求 - Swal.fire({ - title: '正在应用中', - allowOutsideClick:false, - onBeforeOpen: () => { - Swal.showLoading() - } - }) - $.get(CHANGE_NODE_URL, { set: node,server:dataServer }, - function (data, status) { - $("#cbi-apply-vssr1").hide(); //隐藏应用中 - if (data.status) { - var id = '#cbi-<%=self.config%>-' + node; - if(dataServer == "global"){ - $(".cbi-section-table-row").removeClass("fast"); - $(id).addClass("fast"); + title: '请选择应用于', + html: $html, + focusConfirm: false, + confirmButtonText: '关闭', + onRender: (toast) => { + $(".change-node").click(function () { + var dataServer = $(this).attr("data-server"); + XHR.halt(); + $.each(ajaxArray, function (n, value) { value.abort(); }) //中断所有的ajax请求 + Swal.fire({ + title: '正在应用中', + allowOutsideClick: false, + onBeforeOpen: () => { + Swal.showLoading() } - - Swal.close(); - XHR.run(); - } - }); - }) - } + }) + $.get(CHANGE_NODE_URL, { set: node, server: dataServer }, + function (data, status) { + $("#cbi-apply-vssr1").hide(); //隐藏应用中 + if (data.status) { + var id = '#cbi-<%=self.config%>-' + node; + if (dataServer == "global") { + $(".cbi-section-table-row").removeClass("fast"); + $(id).addClass("fast"); + } + Swal.close(); + XHR.run(); + } + }); + }) + } }) - - - - /*$.get(CHANGE_NODE_URL, { set: node }, - function (data, status) { - $("#cbi-apply-vssr1").hide(); //隐藏应用中 - if (data.status) { - var id = '#cbi-<%=self.config%>-' + node; - $(".cbi-section-table-row").removeClass("fast"); - $(id).addClass("fast"); - } - });*/ } - - - //设定自动切换台 + //设定自动切换 $(".incon").click(function () { $.each(ajaxArray, function (n, value) { value.abort(); }) //中断所有的ajax请求 $node_switch_icon = $(this).find(".pure-imgw"); $node_target = $(this).attr("data-setction"); $.post(SWITCH_NODE_URL, { node: $node_target }, function (data) { - if(data.status){ - if(data.switch){ + if (data.status) { + if (data.switch) { $node_switch_icon.removeClass("hidden"); - }else{ + } else { $node_switch_icon.addClass("hidden"); } - }else{ + } else { alert("请求出错!") } }, "json"); @@ -230,10 +215,9 @@ host = $(this).find(".cbi-section-table-row ").attr("server"); port = $(this).find(".cbi-section-table-row ").attr("server_port"); $(".host_con").text(""); - if(host != undefined){ + if (host != undefined) { check_port(host, port, this); } - }); } @@ -242,7 +226,7 @@ $.ajaxSettings.async = true; var axhr = $.get(CHECK_PING_URL, { host: hosts, port: ports }, function (data, status) { - currentCheckCount ++ + currentCheckCount++ var host_con = $(target).find(".host_con"); host_con.removeClass("fast"); host_con.removeClass("middle"); @@ -266,8 +250,8 @@ host_con.addClass("nopass"); host_con.text("Error"); } - - if(currentCheckCount == ajaxArray.length){ + + if (currentCheckCount == ajaxArray.length) { XHR.run(); } }); @@ -275,15 +259,13 @@ } $(document).ready(function () { - //setTimeout(function () { check(); }, 500); //延迟500MS开始检测 - - $( "body" ).on( "iploaded", function( event, param1 ) { - if(!iploaded){ + $("body").on("iploaded", function (event, param1) { + if (!iploaded) { iploaded = true; check(); } }); - + $(".cbi-page-actions").hide(); //隐藏底部保存提交按钮 $(".cbi-button-check").click(function () { check(); @@ -291,4 +273,4 @@ }); }); - \ No newline at end of file + diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm index c9e5d80b62..0d2e2cd9c3 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm @@ -1,108 +1,108 @@ <%+cbi/valueheader%> - +
- "> + ">
-<%+cbi/valuefooter%> \ No newline at end of file +<%+cbi/valuefooter%> diff --git a/package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po b/package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po index bc9a105e01..af0bd448f7 100644 --- a/package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po +++ b/package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po @@ -479,8 +479,8 @@ msgstr "游戏模式UDP中继" msgid "Server failsafe auto swith settings" msgstr "服务器节点故障自动切换设置" -msgid "Delete all severs" -msgstr "删除所有服务器" +msgid "Delete All Subscribe Severs" +msgstr "删除所有订阅服务器" msgid "Severs Nodes" msgstr "节点列表" diff --git a/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr b/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr index 4882698786..46e3a44613 100755 --- a/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr +++ b/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr @@ -39,192 +39,192 @@ shunt_port=(2080 2081 2082 2083 2084 2085 2086 2087) shunt_array=("youtube" "tw_video" "netflix" "disney" "prime" "tvb" "custom") scount=0 uci_get_by_name() { - local ret=$(uci get $NAME.$1.$2 2>/dev/null) - echo ${ret:=$3} + local ret=$(uci get $NAME.$1.$2 2>/dev/null) + echo ${ret:=$3} } uci_get_by_type() { - local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null) - echo ${ret:=$3} + local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null) + echo ${ret:=$3} } add_cron() { - sed -i '/vssr.log/d' $CRON_FILE && echo '0 1 * * * echo "" > /tmp/vssr.log' >>$CRON_FILE - [ $(uci_get_by_type server_subscribe auto_update 0) -eq 1 ] && echo "0 $(uci_get_by_type server_subscribe auto_update_time) * * * /usr/bin/lua /usr/share/vssr/subscribe.lua" >>$CRON_FILE - [ $(uci_get_by_type server_subscribe auto_update 0) -eq 1 ] && echo "0 $(uci_get_by_type server_subscribe auto_update_time) * * * /usr/bin/lua /usr/share/vssr/update.lua" >>$CRON_FILE - crontab $CRON_FILE + sed -i '/vssr.log/d' $CRON_FILE && echo '0 1 * * * echo "" > /tmp/vssr.log' >>$CRON_FILE + [ $(uci_get_by_type server_subscribe auto_update 0) -eq 1 ] && echo "0 $(uci_get_by_type server_subscribe auto_update_time) * * * /usr/bin/lua /usr/share/vssr/subscribe.lua" >>$CRON_FILE + [ $(uci_get_by_type server_subscribe auto_update 0) -eq 1 ] && echo "0 $(uci_get_by_type server_subscribe auto_update_time) * * * /usr/bin/lua /usr/share/vssr/update.lua" >>$CRON_FILE + crontab $CRON_FILE } del_cron() { - sed -i '/vssr/d' $CRON_FILE - sed -i '/vssr.log/d' $CRON_FILE - /etc/init.d/cron restart + sed -i '/vssr/d' $CRON_FILE + sed -i '/vssr.log/d' $CRON_FILE + /etc/init.d/cron restart } count_shunt() { - scount=0 - for ((i = 0; i < ${#shunt_array[@]}; i++)); do - local server_index=$(uci_get_by_type global ${shunt_array[i]}_server) - local server_type=$(uci_get_by_name $server_index type) - if [ "$server_type" != "" ]; then - scount=$(($scount + 1)) - fi - done + scount=0 + for ((i = 0; i < ${#shunt_array[@]}; i++)); do + local server_index=$(uci_get_by_type global ${shunt_array[i]}_server) + local server_type=$(uci_get_by_name $server_index type) + if [ "$server_type" != "" ]; then + scount=$(($scount + 1)) + fi + done } count_shunt run_mode=$(uci_get_by_type global run_mode) gen_config_file() { - local hostip=$(uci_get_by_name $1 server) + local hostip=$(uci_get_by_name $1 server) - [ $2 = "0" -a $kcp_flag = "1" ] && hostip="127.0.0.1" + [ $2 = "0" -a $kcp_flag = "1" ] && hostip="127.0.0.1" - if [ $2 = "0" ]; then - re_type="tcp" - config_file=$CONFIG_FILE - server_obj=$GLOBAL_SERVER - elif [ $2 = "1" ]; then - re_type="udp" - config_file=$CONFIG_UDP_FILE - server_obj=$UDP_RELAY_SERVER - fi - if [ $(uci_get_by_name $1 fast_open 0) = "1" ]; then - fastopen="true" - else - fastopen="false" - fi + if [ $2 = "0" ]; then + re_type="tcp" + config_file=$CONFIG_FILE + server_obj=$GLOBAL_SERVER + elif [ $2 = "1" ]; then + re_type="udp" + config_file=$CONFIG_UDP_FILE + server_obj=$UDP_RELAY_SERVER + fi + if [ $(uci_get_by_name $1 fast_open 0) = "1" ]; then + fastopen="true" + else + fastopen="false" + fi - local stype=$(uci_get_by_name $1 type) - local port=$(uci_get_by_name $1 local_port) - if [ "$stype" == "trojan" ]; then - if [ "$re_type" == "udp" ]; then - re_type="client" - port="10801" - else - re_type="nat" - fi - fi - local mport=0 - if [ $3 = "1" ]; then - stype="v2ray" - mport=1090 - re_type="tcp" - fi - lua /usr/share/vssr/genconfig_${stype}.lua ${server_obj} ${re_type} ${port} ${hostip} ${mport} >${config_file} - sed -i 's/\\//g' $config_file + local stype=$(uci_get_by_name $1 type) + local port=$(uci_get_by_name $1 local_port) + if [ "$stype" == "trojan" ]; then + if [ "$re_type" == "udp" ]; then + re_type="client" + port="10801" + else + re_type="nat" + fi + fi + local mport=0 + if [ $3 = "1" ]; then + stype="v2ray" + mport=1090 + re_type="tcp" + fi + lua /usr/share/vssr/genconfig_${stype}.lua ${server_obj} ${re_type} ${port} ${hostip} ${mport} >${config_file} + sed -i 's/\\//g' $config_file } get_arg_out() { - case "$(uci_get_by_type access_control router_proxy 1)" in - 1) echo "-o" ;; - 2) echo "-O" ;; - esac + case "$(uci_get_by_type access_control router_proxy 1)" in + 1) echo "-o" ;; + 2) echo "-O" ;; + esac } start_rules() { - local server=$(uci_get_by_name $GLOBAL_SERVER server) - #resolve name - if echo $server | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then - server=${server} - elif [ "$server" != "${server#*:[0-9a-fA-F]}" ]; then - server=${server} - else - server=$(ping ${server} -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1) - if echo $server | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then - echo $server >/etc/ssr_ip - else - server=$(cat /etc/ssr_ip) - fi - fi + local server=$(uci_get_by_name $GLOBAL_SERVER server) + #resolve name + if echo $server | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then + server=${server} + elif [ "$server" != "${server#*:[0-9a-fA-F]}" ]; then + server=${server} + else + server=$(ping ${server} -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1) + if echo $server | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then + echo $server >/etc/ssr_ip + else + server=$(cat /etc/ssr_ip) + fi + fi - kcp_server=$server + kcp_server=$server - local kcp_enable=$(uci_get_by_name $GLOBAL_SERVER kcp_enable 0) - if [ $kcp_enable = "1" ]; then - kcp_flag=1 - fi + local kcp_enable=$(uci_get_by_name $GLOBAL_SERVER kcp_enable 0) + if [ $kcp_enable = "1" ]; then + kcp_flag=1 + fi - local local_port=$(uci_get_by_name $GLOBAL_SERVER local_port) - local lan_ac_ips=$(uci_get_by_type access_control lan_ac_ips) - local lan_ac_mode="b" - local router_proxy=$(uci_get_by_type access_control router_proxy) - if [ "$GLOBAL_SERVER" == "$UDP_RELAY_SERVER" -a $kcp_flag == 0 ]; then - ARG_UDP="-u" - elif [ -n "$UDP_RELAY_SERVER" ]; then - ARG_UDP="-U" - local udp_server=$(uci_get_by_name $UDP_RELAY_SERVER server) - if echo $udp_server | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then - udp_server=${udp_server} - elif [ "$udp_server" != "${udp_server#*:[0-9a-fA-F]}" ]; then - udp_server=${udp_server} - else - udp_server=$(ping ${udp_server} -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1) - if echo $udp_server | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then - echo $udp_server >/etc/ssr_ip - else - udp_server=$(cat /etc/ssr_ip) - fi - fi - local udp_local_port=$(uci_get_by_name $UDP_RELAY_SERVER local_port) - fi + local local_port=$(uci_get_by_name $GLOBAL_SERVER local_port) + local lan_ac_ips=$(uci_get_by_type access_control lan_ac_ips) + local lan_ac_mode="b" + local router_proxy=$(uci_get_by_type access_control router_proxy) + if [ "$GLOBAL_SERVER" == "$UDP_RELAY_SERVER" -a $kcp_flag == 0 ]; then + ARG_UDP="-u" + elif [ -n "$UDP_RELAY_SERVER" ]; then + ARG_UDP="-U" + local udp_server=$(uci_get_by_name $UDP_RELAY_SERVER server) + if echo $udp_server | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then + udp_server=${udp_server} + elif [ "$udp_server" != "${udp_server#*:[0-9a-fA-F]}" ]; then + udp_server=${udp_server} + else + udp_server=$(ping ${udp_server} -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1) + if echo $udp_server | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then + echo $udp_server >/etc/ssr_ip + else + udp_server=$(cat /etc/ssr_ip) + fi + fi + local udp_local_port=$(uci_get_by_name $UDP_RELAY_SERVER local_port) + fi - if [ -n "$lan_ac_ips" ]; then - case "$lan_ac_mode" in - w | W | b | B) local ac_ips="$lan_ac_mode$lan_ac_ips" ;; - esac - fi + if [ -n "$lan_ac_ips" ]; then + case "$lan_ac_mode" in + w | W | b | B) local ac_ips="$lan_ac_mode$lan_ac_ips" ;; + esac + fi - #deal gfw firewall rule - local gfwmode="" - if [ "$run_mode" = "gfw" ]; then - gfwmode="-g" - elif [ "$run_mode" = "router" ]; then - gfwmode="-r" - elif [ "$run_mode" = "oversea" ]; then - gfwmode="-c" - elif [ "$run_mode" = "all" ]; then - gfwmode="-z" - fi + #deal gfw firewall rule + local gfwmode="" + if [ "$run_mode" = "gfw" ]; then + gfwmode="-g" + elif [ "$run_mode" = "router" ]; then + gfwmode="-r" + elif [ "$run_mode" = "oversea" ]; then + gfwmode="-c" + elif [ "$run_mode" = "all" ]; then + gfwmode="-z" + fi - local dports=$(uci_get_by_type global dports 1) - if [ $dports = "1" ]; then - proxyport=" " - else - proxyport="-m multiport --dports 22,53,587,465,995,993,143,80,443 " - fi + local dports=$(uci_get_by_type global dports 1) + if [ $dports = "1" ]; then + proxyport=" " + else + proxyport="-m multiport --dports 22,53,587,465,995,993,143,80,443 " + fi - /usr/bin/vssr-rules \ - -s "$server" \ - -l "$local_port" \ - -S "$udp_server" \ - -L "$udp_local_port" \ - -a "$ac_ips" \ - -i "$(uci_get_by_type access_control wan_bp_list)" \ - -b "$(uci_get_by_type access_control wan_bp_ips)" \ - -w "$(uci_get_by_type access_control wan_fw_ips)" \ - -p "$(uci_get_by_type access_control lan_fp_ips)" \ - -G "$(uci_get_by_type access_control lan_gm_ips)" \ - -D "$proxyport" \ - $(get_arg_out) $gfwmode $ARG_UDP - return $? + /usr/bin/vssr-rules \ + -s "$server" \ + -l "$local_port" \ + -S "$udp_server" \ + -L "$udp_local_port" \ + -a "$ac_ips" \ + -i "$(uci_get_by_type access_control wan_bp_list)" \ + -b "$(uci_get_by_type access_control wan_bp_ips)" \ + -w "$(uci_get_by_type access_control wan_fw_ips)" \ + -p "$(uci_get_by_type access_control lan_fp_ips)" \ + -G "$(uci_get_by_type access_control lan_gm_ips)" \ + -D "$proxyport" \ + $(get_arg_out) $gfwmode $ARG_UDP + return $? } start_pdnsd() { - local usr_dns="$1" - local usr_port="$2" + local usr_dns="$1" + local usr_port="$2" - local tcp_dns_list="208.67.222.222, 208.67.220.220" - [ -z "$usr_dns" ] && usr_dns="8.8.8.8" - [ -z "$usr_port" ] && usr_port="53" + local tcp_dns_list="208.67.222.222, 208.67.220.220" + [ -z "$usr_dns" ] && usr_dns="8.8.8.8" + [ -z "$usr_port" ] && usr_port="53" - [ -d /var/etc ] || mkdir -p /var/etc + [ -d /var/etc ] || mkdir -p /var/etc - if [ ! -d /var/pdnsd ]; then - mkdir -p /var/pdnsd - echo -ne "pd13\000\000\000\000" >/var/pdnsd/pdnsd.cache - chown -R nobody:nogroup /var/pdnsd - fi + if [ ! -d /var/pdnsd ]; then + mkdir -p /var/pdnsd + echo -ne "pd13\000\000\000\000" >/var/pdnsd/pdnsd.cache + chown -R nobody:nogroup /var/pdnsd + fi - cat >/var/etc/pdnsd.conf </var/etc/pdnsd.conf <${config_file} - sed -i 's/\\//g' $config_file - case "$server_type" in - ss | ssr) - bin=$(find_bin "ss-local") - [ "$server_type" == "ssr" ] && bin=$(find_bin "ssr-local") - $bin -c $config_file $ARG_OTA -f /var/run/vssr-${shunt_type[i]}.pid1 >/dev/null 2>&1 - ;; - trojan) - $bin --config $config_file >/dev/null 2>&1 & - ;; - esac - echo "$(date "+%Y-%m-%d %H:%M:%S") ${shunt_type[i]}: $server_type 分流服务已启动!" >>/tmp/vssr.log - fi - done - return $? + for ((i = 0; i < ${#shunt_type[@]}; i++)); do + local server_index=$(uci_get_by_type global ${shunt_type[i]}_server) + local server_port=${shunt_port[i]} + local server_type=$(uci_get_by_name $server_index type) + local server_ip=$(uci_get_by_name $server_index server) + [ "$server_type" == "trojan" ] && re_type="client" || re_type="tcp" + if [ "$server_type" != "v2ray" -a "$server_type" != "" ]; then + local config_file=/var/etc/${NAME}_${shunt_type[i]}.json + local bin=$(find_bin $server_type) + lua /usr/share/vssr/genconfig_${server_type}.lua ${server_index} ${re_type} ${server_port} ${server_ip} >${config_file} + sed -i 's/\\//g' $config_file + case "$server_type" in + ss | ssr) + bin=$(find_bin "ss-local") + [ "$server_type" == "ssr" ] && bin=$(find_bin "ssr-local") + $bin -c $config_file $ARG_OTA -f /var/run/vssr-${shunt_type[i]}.pid1 >/dev/null 2>&1 + ;; + trojan) + $bin --config $config_file >/dev/null 2>&1 & + ;; + esac + echo "$(date "+%Y-%m-%d %H:%M:%S") ${shunt_type[i]}: $server_type 分流服务已启动!" >>/tmp/vssr.log + fi + done + return $? } start_redir() { - case "$(uci_get_by_name $GLOBAL_SERVER auth_enable)" in - 1 | on | true | yes | enabled) ARG_OTA="-A" ;; - *) ARG_OTA="" ;; - esac + case "$(uci_get_by_name $GLOBAL_SERVER auth_enable)" in + 1 | on | true | yes | enabled) ARG_OTA="-A" ;; + *) ARG_OTA="" ;; + esac - #deal kcp - local kcp_enable=$(uci_get_by_name $GLOBAL_SERVER kcp_enable 0) - if [ $kcp_enable = "1" ]; then - [ ! -f "/usr/bin/kcptun-client" ] && return 1 + #deal kcp + local kcp_enable=$(uci_get_by_name $GLOBAL_SERVER kcp_enable 0) + if [ $kcp_enable = "1" ]; then + [ ! -f "/usr/bin/kcptun-client" ] && return 1 - local kcp_str=$(/usr/bin/kcptun-client -v | grep kcptun | wc -l) - [ "0" = $kcp_str ] && return 1 - local kcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port) - local server_port=$(uci_get_by_name $GLOBAL_SERVER server_port) - local password=$(uci_get_by_name $GLOBAL_SERVER kcp_password) - local kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param) - [ "$password" != "" ] && password="--key "${password} - service_start /usr/bin/kcptun-client \ - -r $kcp_server:$kcp_port \ - -l :$server_port $password $kcp_param - kcp_enable_flag=1 - fi + local kcp_str=$(/usr/bin/kcptun-client -v | grep kcptun | wc -l) + [ "0" = $kcp_str ] && return 1 + local kcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port) + local server_port=$(uci_get_by_name $GLOBAL_SERVER server_port) + local password=$(uci_get_by_name $GLOBAL_SERVER kcp_password) + local kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param) + [ "$password" != "" ] && password="--key "${password} + service_start /usr/bin/kcptun-client \ + -r $kcp_server:$kcp_port \ + -l :$server_port $password $kcp_param + kcp_enable_flag=1 + fi - gen_config_file $GLOBAL_SERVER 0 0 - local stype=$(uci_get_by_name $GLOBAL_SERVER type) - sscmd=$(find_bin $stype) + gen_config_file $GLOBAL_SERVER 0 0 + local stype=$(uci_get_by_name $GLOBAL_SERVER type) + sscmd=$(find_bin $stype) - local utype=$(uci_get_by_name $UDP_RELAY_SERVER type) - ucmd=$(find_bin $utype) + local utype=$(uci_get_by_name $UDP_RELAY_SERVER type) + ucmd=$(find_bin $utype) - if [ "$(uci_get_by_type global threads 0)" = "0" ]; then - threads=$(cat /proc/cpuinfo | grep 'processor' | wc -l) - else - threads=$(uci_get_by_type global threads) - fi - #转发TCP - redir_tcp=1 - if [ $scount == "0" ]; then - local last_config_file=$CONFIG_FILE - case "$stype" in - ss | ssr) - local pid_file="/var/run/ssr-retcp.pid" - local name="Shadowsocks" - [ "$type" == "ssr" ] && name="ShadowsocksR" - for i in $(seq 1 $threads); do - $sscmd -c $last_config_file $ARG_OTA -f /var/run/ssr-retcp_$i.pid >/dev/null 2>&1 - done - echo "$(date "+%Y-%m-%d %H:%M:%S") $name $threads 线程 已启动!" >>/tmp/vssr.log - ;; - v2ray) - $sscmd -config $last_config_file >/dev/null 2>&1 & - echo $sscmd - echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -version | head -1) 已启动!" >>/tmp/vssr.log - ;; - trojan) - for i in $(seq 1 $threads); do - $sscmd -c $last_config_file >/dev/null 2>&1 & - done - echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -V 2>&1 | head -1) $threads 线程 已启动!" >>/tmp/vssr.log - ;; - esac - else - if [ $stype != "vray" ]; then - #开启 v2ray 路由服务 - gen_config_file $GLOBAL_SERVER 0 1 - sscmd=$(find_bin "v2ray") - local last_config_file=$CONFIG_FILE - $sscmd -config $last_config_file >/dev/null 2>&1 & - echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -version | head -1) 已启动!" >>/tmp/vssr.log - fi + if [ "$(uci_get_by_type global threads 0)" = "0" ]; then + threads=$(cat /proc/cpuinfo | grep 'processor' | wc -l) + else + threads=$(uci_get_by_type global threads) + fi + #转发TCP + redir_tcp=1 + if [ $scount == "0" ]; then + local last_config_file=$CONFIG_FILE + case "$stype" in + ss | ssr) + local pid_file="/var/run/ssr-retcp.pid" + local name="Shadowsocks" + [ "$type" == "ssr" ] && name="ShadowsocksR" + for i in $(seq 1 $threads); do + $sscmd -c $last_config_file $ARG_OTA -f /var/run/ssr-retcp_$i.pid >/dev/null 2>&1 + done + echo "$(date "+%Y-%m-%d %H:%M:%S") $name $threads 线程 已启动!" >>/tmp/vssr.log + ;; + v2ray) + $sscmd -config $last_config_file >/dev/null 2>&1 & + echo $sscmd + echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -version | head -1) 已启动!" >>/tmp/vssr.log + ;; + trojan) + for i in $(seq 1 $threads); do + $sscmd -c $last_config_file >/dev/null 2>&1 & + done + echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -V 2>&1 | head -1) $threads 线程 已启动!" >>/tmp/vssr.log + ;; + esac + else + if [ $stype != "vray" ]; then + #开启 v2ray 路由服务 + gen_config_file $GLOBAL_SERVER 0 1 + sscmd=$(find_bin "v2ray") + local last_config_file=$CONFIG_FILE + $sscmd -config $last_config_file >/dev/null 2>&1 & + echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -version | head -1) 已启动!" >>/tmp/vssr.log + fi - fi + fi - #转发UDP - if [ -n "$UDP_RELAY_SERVER" ]; then - redir_udp=1 - gen_config_file $UDP_RELAY_SERVER 1 0 - last_config_file=$CONFIG_UDP_FILE - case "$stype" in - ss | ssr) - case "$(uci_get_by_name $UDP_RELAY_SERVER auth_enable)" in - 1 | on | true | yes | enabled) ARG_OTA="-A" ;; - *) ARG_OTA="" ;; - esac - local name="Shadowsocks" - [ "$type" == "ssr" ] && name="ShadowsocksR" - pid_file="/var/run/ssr-reudp.pid" - $ucmd -c $last_config_file $ARG_OTA -U -f /var/run/ssr-reudp.pid >/dev/null 2>&1 - echo "$(date "+%Y-%m-%d %H:%M:%S") UDP TPROXY Relay: $name 已启动!" >>/tmp/vssr.log - ;; - v2ray) - $ucmd -config $last_config_file >/dev/null 2>&1 & - echo "$(date "+%Y-%m-%d %H:%M:%S") UDP TPROXY Relay: V2ray 已启动!" >>/tmp/vssr.log - ;; - trojan) - $ucmd --config $last_config_file >/dev/null 2>&1 & - ipt2socks -U -4 -b 0.0.0.0 -s 127.0.0.1 -p 10801 -l $(uci_get_by_name $UDP_RELAY_SERVER local_port) >/dev/null 2>&1 & - echo "$(date "+%Y-%m-%d %H:%M:%S") UDP TPROXY Relay: Trojan 已启动!" >>/tmp/vssr.log - ;; - esac - fi + #转发UDP + if [ -n "$UDP_RELAY_SERVER" ]; then + redir_udp=1 + gen_config_file $UDP_RELAY_SERVER 1 0 + last_config_file=$CONFIG_UDP_FILE + case "$stype" in + ss | ssr) + case "$(uci_get_by_name $UDP_RELAY_SERVER auth_enable)" in + 1 | on | true | yes | enabled) ARG_OTA="-A" ;; + *) ARG_OTA="" ;; + esac + local name="Shadowsocks" + [ "$type" == "ssr" ] && name="ShadowsocksR" + pid_file="/var/run/ssr-reudp.pid" + $ucmd -c $last_config_file $ARG_OTA -U -f /var/run/ssr-reudp.pid >/dev/null 2>&1 + echo "$(date "+%Y-%m-%d %H:%M:%S") UDP TPROXY Relay: $name 已启动!" >>/tmp/vssr.log + ;; + v2ray) + $ucmd -config $last_config_file >/dev/null 2>&1 & + echo "$(date "+%Y-%m-%d %H:%M:%S") UDP TPROXY Relay: V2ray 已启动!" >>/tmp/vssr.log + ;; + trojan) + $ucmd --config $last_config_file >/dev/null 2>&1 & + ipt2socks -U -4 -b 0.0.0.0 -s 127.0.0.1 -p 10801 -l $(uci_get_by_name $UDP_RELAY_SERVER local_port) >/dev/null 2>&1 & + echo "$(date "+%Y-%m-%d %H:%M:%S") UDP TPROXY Relay: Trojan 已启动!" >>/tmp/vssr.log + ;; + esac + fi - #deal with dns + #deal with dns - if [ "$(uci_get_by_type global pdnsd_enable)" = "1" ]; then - local dnsstr="$(uci_get_by_type global tunnel_forward 8.8.4.4:53)" - local dnsserver=$(echo "$dnsstr" | awk -F ':' '{print $1}') - local dnsport=$(echo "$dnsstr" | awk -F ':' '{print $2}') - if [ "$run_mode" = "gfw" ]; then - ipset add gfwlist $dnsserver 2>/dev/null - elif [ "$run_mode" = "oversea" ]; then - ipset add oversea $dnsserver 2>/dev/null - else - ipset add ss_spec_wan_ac $dnsserver nomatch 2>/dev/null - fi - start_pdnsd $dnsserver $dnsport - pdnsd_enable_flag=1 - fi + if [ "$(uci_get_by_type global pdnsd_enable)" = "1" ]; then + local dnsstr="$(uci_get_by_type global tunnel_forward 8.8.4.4:53)" + local dnsserver=$(echo "$dnsstr" | awk -F ':' '{print $1}') + local dnsport=$(echo "$dnsstr" | awk -F ':' '{print $2}') + if [ "$run_mode" = "gfw" ]; then + ipset add gfwlist $dnsserver 2>/dev/null + elif [ "$run_mode" = "oversea" ]; then + ipset add oversea $dnsserver 2>/dev/null + else + ipset add ss_spec_wan_ac $dnsserver nomatch 2>/dev/null + fi + start_pdnsd $dnsserver $dnsport + pdnsd_enable_flag=1 + fi - if [ "$(uci_get_by_type global enable_switch)" = "1" ]; then - if [ "$(uci_get_by_name $GLOBAL_SERVER switch_enable)" = "1" ]; then - if [ -z "$switch_server" ]; then - local switch_time=$(uci_get_by_type global switch_time) - local switch_timeout=$(uci_get_by_type global switch_timeout) - service_start /usr/bin/vssr-switch start $switch_time $switch_timeout - switch_enable=1 - fi - fi - fi - add_cron + if [ "$(uci_get_by_type global enable_switch)" = "1" ]; then + if [ "$(uci_get_by_name $GLOBAL_SERVER switch_enable)" = "1" ]; then + if [ -z "$switch_server" ]; then + local switch_time=$(uci_get_by_type global switch_time) + local switch_timeout=$(uci_get_by_type global switch_timeout) + service_start /usr/bin/vssr-switch start $switch_time $switch_timeout + switch_enable=1 + fi + fi + fi + add_cron - return $? + return $? } gen_service_file() { - if [ $(uci_get_by_name $1 fast_open) = "1" ]; then - fastopen="true" - else - fastopen="false" - fi - cat <<-EOF >$2 + if [ $(uci_get_by_name $1 fast_open) = "1" ]; then + fastopen="true" + else + fastopen="false" + fi + cat <<-EOF >$2 { "server": "0.0.0.0", "server_port": $(uci_get_by_name $1 server_port), @@ -464,31 +464,31 @@ gen_service_file() { } start_service() { - [ $(uci_get_by_name $1 enable) = "0" ] && return 1 - let server_count=server_count+1 - if [ $server_count = 1 ]; then - iptables -N SSR-SERVER-RULE && - iptables -t filter -I INPUT -j SSR-SERVER-RULE - fi + [ $(uci_get_by_name $1 enable) = "0" ] && return 1 + let server_count=server_count+1 + if [ $server_count = 1 ]; then + iptables -N SSR-SERVER-RULE && + iptables -t filter -I INPUT -j SSR-SERVER-RULE + fi - gen_service_file $1 /var/etc/${NAME}_${server_count}.json - /usr/bin/ssr-server -c /var/etc/${NAME}_${server_count}.json -u -f /var/run/ssr-server${server_count}.pid >/dev/null 2>&1 - 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 - return 0 + gen_service_file $1 /var/etc/${NAME}_${server_count}.json + /usr/bin/ssr-server -c /var/etc/${NAME}_${server_count}.json -u -f /var/run/ssr-server${server_count}.pid >/dev/null 2>&1 + 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 + return 0 } gen_serv_include() { - FWI=$(uci get firewall.vssr.path 2>/dev/null) - [ -n "$FWI" ] || return 0 - if [ ! -f $FWI ]; then - echo '#!/bin/sh' >$FWI - fi - extract_rules() { - echo "*filter" - iptables-save -t filter | grep SSR-SERVER-RULE | sed -e "s/^-A INPUT/-I INPUT/" - echo 'COMMIT' - } - cat <<-EOF >>$FWI + FWI=$(uci get firewall.vssr.path 2>/dev/null) + [ -n "$FWI" ] || return 0 + if [ ! -f $FWI ]; then + echo '#!/bin/sh' >$FWI + fi + extract_rules() { + echo "*filter" + iptables-save -t filter | grep SSR-SERVER-RULE | sed -e "s/^-A INPUT/-I INPUT/" + echo 'COMMIT' + } + cat <<-EOF >>$FWI iptables-save -c | grep -v "SSR-SERVER" | iptables-restore -c iptables-restore -n <<-EOT $(extract_rules) @@ -497,112 +497,112 @@ gen_serv_include() { } start_server() { - SERVER_ENABLE=$(uci_get_by_type server_global enable_server) - [ "$SERVER_ENABLE" = 0 ] && return 0 - mkdir -p /var/run /var/etc + SERVER_ENABLE=$(uci_get_by_type server_global enable_server) + [ "$SERVER_ENABLE" = 0 ] && return 0 + mkdir -p /var/run /var/etc - config_load $NAME - config_foreach start_service server_config - gen_serv_include - return 0 + config_load $NAME + config_foreach start_service server_config + gen_serv_include + return 0 } start_local() { - local local_server=$(uci_get_by_type socks5_proxy enable_server) + local local_server=$(uci_get_by_type socks5_proxy enable_server) - [ "$local_server" = "0" ] && return 1 - mkdir -p /var/run /var/etc + [ "$local_server" = "0" ] && return 1 + mkdir -p /var/run /var/etc - lua /usr/share/vssr/genconfig_v2ray_s.lua >$CONFIG_SOCK5_FILE - sed -i 's/\\//g' $config_file + lua /usr/share/vssr/genconfig_v2ray_s.lua >$CONFIG_SOCK5_FILE + sed -i 's/\\//g' $config_file - /usr/bin/v2ray/v2ray -config $CONFIG_SOCK5_FILE >/dev/null 2>&1 & - local_enable=1 + /usr/bin/v2ray/v2ray -config $CONFIG_SOCK5_FILE >/dev/null 2>&1 & + local_enable=1 } rules() { - [ "$GLOBAL_SERVER" = "nil" ] && return 1 - mkdir -p /var/run /var/etc - UDP_RELAY_SERVER=$(uci_get_by_type global udp_relay_server) - [ "$UDP_RELAY_SERVER" = "same" ] && UDP_RELAY_SERVER=$GLOBAL_SERVER - if start_rules; then - return 0 - else - return 1 - fi + [ "$GLOBAL_SERVER" = "nil" ] && return 1 + mkdir -p /var/run /var/etc + UDP_RELAY_SERVER=$(uci_get_by_type global udp_relay_server) + [ "$UDP_RELAY_SERVER" = "same" ] && UDP_RELAY_SERVER=$GLOBAL_SERVER + if start_rules; then + return 0 + else + return 1 + fi } start() { - if [ -z "$switch_server" ]; then - GLOBAL_SERVER=$(uci_get_by_type global global_server) - else - GLOBAL_SERVER=$switch_server - switch_enable=1 - fi + if [ -z "$switch_server" ]; then + GLOBAL_SERVER=$(uci_get_by_type global global_server) + else + GLOBAL_SERVER=$switch_server + switch_enable=1 + fi - if rules; then - start_redir + if rules; then + start_redir - mkdir -p /tmp/dnsmasq.d && cp -a /etc/dnsmasq.ssr /tmp/ && cp -a /etc/dnsmasq.oversea /tmp/ - if ! [ "$run_mode" = "oversea" ]; then - cat >/tmp/dnsmasq.d/dnsmasq-ssr.conf </tmp/dnsmasq.d/dnsmasq-ssr.conf </tmp/dnsmasq.d/dnsmasq-ssr.conf </tmp/dnsmasq.d/dnsmasq-ssr.conf </dev/null 2>&1 + /usr/share/vssr/gfw2ipset.sh + /etc/init.d/dnsmasq restart >/dev/null 2>&1 - fi - start_server - start_local - if [ $scount != "0" ]; then - start_shunt - fi - if [ $(uci_get_by_type global monitor_enable) = 1 ]; then - let total_count=server_count+redir_tcp+redir_udp+tunnel_enable+kcp_enable_flag+local_enable+pdnsd_enable_flag+switch_enable - if [ $total_count -gt 0 ]; then - #param:server(count) redir_tcp(0:no,1:yes) redir_udp tunnel kcp local gfw - service_start /usr/bin/vssr-monitor $server_count $redir_tcp $redir_udp $tunnel_enable $kcp_enable_flag $local_enable $pdnsd_enable_flag $switch_enable - fi - fi + fi + start_server + start_local + if [ $scount != "0" ]; then + start_shunt + fi + if [ $(uci_get_by_type global monitor_enable) = 1 ]; then + let total_count=server_count+redir_tcp+redir_udp+tunnel_enable+kcp_enable_flag+local_enable+pdnsd_enable_flag+switch_enable + if [ $total_count -gt 0 ]; then + #param:server(count) redir_tcp(0:no,1:yes) redir_udp tunnel kcp local gfw + service_start /usr/bin/vssr-monitor $server_count $redir_tcp $redir_udp $tunnel_enable $kcp_enable_flag $local_enable $pdnsd_enable_flag $switch_enable + fi + fi - ENABLE_SERVER=$(uci_get_by_type global global_server) - [ "$ENABLE_SERVER" = "nil" ] && return 1 + ENABLE_SERVER=$(uci_get_by_type global global_server) + [ "$ENABLE_SERVER" = "nil" ] && return 1 } boot() { - (/usr/share/vssr/chinaipset.sh && sleep 5 && start >/dev/null 2>&1) & + (/usr/share/vssr/chinaipset.sh && sleep 5 && start >/dev/null 2>&1) & } stop() { - echo "stop" - /usr/bin/vssr-rules -f - 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 - kill -9 $(busybox ps -w | grep vssr-switch | grep -v grep | awk '{print $1}') >/dev/null 2>&1 - fi - if [ $(uci_get_by_type global monitor_enable) = 1 ]; then - kill -9 $(busybox ps -w | grep vssr-monitor | grep -v grep | awk '{print $1}') >/dev/null 2>&1 - fi - killall -q -9 ss-redir ss-local obfs-local ssr-redir ssr-local ssr-server v2ray v2ray-plugin trojan microsocks ipt2socks dns2socks redsocks2 pdnsd + echo "stop" + /usr/bin/vssr-rules -f + 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 + kill -9 $(busybox ps -w | grep vssr-switch | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + fi + if [ $(uci_get_by_type global monitor_enable) = 1 ]; then + kill -9 $(busybox ps -w | grep vssr-monitor | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + fi + killall -q -9 ss-redir ss-local obfs-local ssr-redir ssr-local ssr-server v2ray v2ray-plugin trojan microsocks ipt2socks dns2socks redsocks2 pdnsd - if [ -f "/tmp/dnsmasq.d/dnsmasq-ssr.conf" ]; then - rm -f /tmp/dnsmasq.d/dnsmasq-ssr.conf - /etc/init.d/dnsmasq restart >/dev/null 2>&1 - fi - del_cron + if [ -f "/tmp/dnsmasq.d/dnsmasq-ssr.conf" ]; then + rm -f /tmp/dnsmasq.d/dnsmasq-ssr.conf + /etc/init.d/dnsmasq restart >/dev/null 2>&1 + fi + del_cron } diff --git a/package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-rules b/package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-rules index 4ce92ea8d5..c11cc1430e 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-rules +++ b/package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-rules @@ -7,12 +7,12 @@ # See /LICENSE for more information. # -TAG="_SS_SPEC_RULE_" # comment tag -IPT="iptables -t nat" # alias of iptables -FWI=$(uci get firewall.vssr.path 2>/dev/null) # firewall include file +TAG="_SS_SPEC_RULE_" # comment tag +IPT="iptables -t nat" # alias of iptables +FWI=$(uci get firewall.vssr.path 2>/dev/null) # firewall include file usage() { - cat <<-EOF + cat <<-EOF Usage: vssr-rules [options] Valid options are: @@ -39,194 +39,194 @@ usage() { -g gfw list mode -r return china mode -h show this help message and exit -EOF - exit $1 + EOF + exit $1 } loger() { - # 1.alert 2.crit 3.err 4.warn 5.notice 6.info 7.debug - logger -st vssr-rules[$$] -p$1 $2 + # 1.alert 2.crit 3.err 4.warn 5.notice 6.info 7.debug + logger -st vssr-rules[$$] -p$1 $2 } flush_r() { - flush_iptables() { - local ipt="iptables -t $1" - local DAT=$(iptables-save -t $1) - eval $(echo "$DAT" | grep "$TAG" | sed -e 's/^-A/$ipt -D/' -e 's/$/;/') - for chain in $(echo "$DAT" | awk '/^:SS_SPEC/{print $1}'); do - $ipt -F ${chain:1} 2>/dev/null && $ipt -X ${chain:1} - done - } - flush_iptables nat - flush_iptables mangle - ip rule del fwmark 0x01/0x01 table 100 2>/dev/null - ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null - ipset -X ss_spec_lan_ac 2>/dev/null - ipset -X ss_spec_wan_ac 2>/dev/null - ipset -X ssr_gen_router 2>/dev/null - ipset -X fplan 2>/dev/null - ipset -X gmlan 2>/dev/null - ipset -X oversea 2>/dev/null - ipset -X whitelist 2>/dev/null - ipset -X blacklist 2>/dev/null - [ -n "$FWI" ] && echo '#!/bin/sh' >$FWI - return 0 + flush_iptables() { + local ipt="iptables -t $1" + local DAT=$(iptables-save -t $1) + eval $(echo "$DAT" | grep "$TAG" | sed -e 's/^-A/$ipt -D/' -e 's/$/;/') + for chain in $(echo "$DAT" | awk '/^:SS_SPEC/{print $1}'); do + $ipt -F ${chain:1} 2>/dev/null && $ipt -X ${chain:1} + done + } + flush_iptables nat + flush_iptables mangle + ip rule del fwmark 0x01/0x01 table 100 2>/dev/null + ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null + ipset -X ss_spec_lan_ac 2>/dev/null + ipset -X ss_spec_wan_ac 2>/dev/null + ipset -X ssr_gen_router 2>/dev/null + ipset -X fplan 2>/dev/null + ipset -X gmlan 2>/dev/null + ipset -X oversea 2>/dev/null + ipset -X whitelist 2>/dev/null + ipset -X blacklist 2>/dev/null + [ -n "$FWI" ] && echo '#!/bin/sh' >$FWI + return 0 } ipset_r() { - ipset -N gmlan hash:net 2>/dev/null - for ip in $LAN_GM_IP; do ipset -! add gmlan $ip; done - case "$RUNMODE" in - router) - ipset -! -R <<-EOF || return 1 + ipset -N gmlan hash:net 2>/dev/null + for ip in $LAN_GM_IP; do ipset -! add gmlan $ip; done + case "$RUNMODE" in + router) + ipset -! -R <<-EOF || return 1 create ss_spec_wan_ac hash:net $(gen_iplist | sed -e "s/^/add ss_spec_wan_ac /") EOF - ipset -N gfwlist hash:net 2>/dev/null - $IPT -N SS_SPEC_WAN_AC - $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN - $IPT -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN - $IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW - ;; - gfw) - ipset -N gfwlist hash:net 2>/dev/null - $IPT -N SS_SPEC_WAN_AC - $IPT -A SS_SPEC_WAN_AC -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW - $IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -m set ! --match-set china dst -j SS_SPEC_WAN_FW - $IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j RETURN - $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN - ;; - oversea) - ipset -N oversea hash:net 2>/dev/null - $IPT -N SS_SPEC_WAN_AC - ipset -N gmlan hash:net 2>/dev/null - for ip in $LAN_GM_IP; do ipset -! add gmlan $ip; done - $IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j SS_SPEC_WAN_FW - $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN - ;; - all) - $IPT -N SS_SPEC_WAN_AC - $IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW - $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN - ;; - esac - - ipset -N fplan hash:net 2>/dev/null - for ip in $LAN_FP_IP; do ipset -! add fplan $ip ; done - $IPT -I SS_SPEC_WAN_AC -m set --match-set fplan src -j SS_SPEC_WAN_FW - - ipset -N whitelist hash:net 2>/dev/null - ipset -N blacklist hash:net 2>/dev/null - $IPT -I SS_SPEC_WAN_AC -m set --match-set blacklist dst -j SS_SPEC_WAN_FW - $IPT -I SS_SPEC_WAN_AC -m set --match-set whitelist dst -j RETURN + ipset -N gfwlist hash:net 2>/dev/null + $IPT -N SS_SPEC_WAN_AC + $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN + $IPT -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN + $IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW + ;; + gfw) + ipset -N gfwlist hash:net 2>/dev/null + $IPT -N SS_SPEC_WAN_AC + $IPT -A SS_SPEC_WAN_AC -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW + $IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -m set ! --match-set china dst -j SS_SPEC_WAN_FW + $IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j RETURN + $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN + ;; + oversea) + ipset -N oversea hash:net 2>/dev/null + $IPT -N SS_SPEC_WAN_AC + ipset -N gmlan hash:net 2>/dev/null + for ip in $LAN_GM_IP; do ipset -! add gmlan $ip; done + $IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j SS_SPEC_WAN_FW + $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN + ;; + all) + $IPT -N SS_SPEC_WAN_AC + $IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW + $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN + ;; + esac - for ip in $WAN_BP_IP; do ipset -! add whitelist $ip; done - for ip in $WAN_FW_IP; do ipset -! add blacklist $ip; done + ipset -N fplan hash:net 2>/dev/null + for ip in $LAN_FP_IP; do ipset -! add fplan $ip; done + $IPT -I SS_SPEC_WAN_AC -m set --match-set fplan src -j SS_SPEC_WAN_FW - return $? + ipset -N whitelist hash:net 2>/dev/null + ipset -N blacklist hash:net 2>/dev/null + $IPT -I SS_SPEC_WAN_AC -m set --match-set blacklist dst -j SS_SPEC_WAN_FW + $IPT -I SS_SPEC_WAN_AC -m set --match-set whitelist dst -j RETURN + + for ip in $WAN_BP_IP; do ipset -! add whitelist $ip; done + for ip in $WAN_FW_IP; do ipset -! add blacklist $ip; done + + return $? } fw_rule() { - $IPT -N SS_SPEC_WAN_FW - $IPT -A SS_SPEC_WAN_FW -d 0.0.0.0/8 -j RETURN - $IPT -A SS_SPEC_WAN_FW -d 10.0.0.0/8 -j RETURN - $IPT -A SS_SPEC_WAN_FW -d 127.0.0.0/8 -j RETURN - $IPT -A SS_SPEC_WAN_FW -d 169.254.0.0/16 -j RETURN - $IPT -A SS_SPEC_WAN_FW -d 172.16.0.0/12 -j RETURN - $IPT -A SS_SPEC_WAN_FW -d 192.168.0.0/16 -j RETURN - $IPT -A SS_SPEC_WAN_FW -d 224.0.0.0/4 -j RETURN - $IPT -A SS_SPEC_WAN_FW -d 240.0.0.0/4 -j RETURN - $IPT -A SS_SPEC_WAN_FW -p tcp $PROXY_PORTS \ - -j REDIRECT --to-ports $local_port 2>/dev/null || { - loger 3 "Can't redirect, please check the iptables." - exit 1 - } - return $? + $IPT -N SS_SPEC_WAN_FW + $IPT -A SS_SPEC_WAN_FW -d 0.0.0.0/8 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 10.0.0.0/8 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 127.0.0.0/8 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 169.254.0.0/16 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 172.16.0.0/12 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 192.168.0.0/16 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 224.0.0.0/4 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 240.0.0.0/4 -j RETURN + $IPT -A SS_SPEC_WAN_FW -p tcp $PROXY_PORTS \ + -j REDIRECT --to-ports $local_port 2>/dev/null || { + loger 3 "Can't redirect, please check the iptables." + exit 1 + } + return $? } ac_rule() { - if [ -n "$LAN_AC_IP" ]; then - case "${LAN_AC_IP:0:1}" in - w | W) - MATCH_SET="-m set --match-set ss_spec_lan_ac src" - ;; - b | B) - MATCH_SET="-m set ! --match-set ss_spec_lan_ac src" - ;; - *) - loger 3 "Bad argument \`-a $LAN_AC_IP\`." - return 2 - ;; - esac - fi - IFNAME=$(uci get -P/var/state network.lan.ifname 2>/dev/null) - ipset -! -R <<-EOF || return 1 + if [ -n "$LAN_AC_IP" ]; then + case "${LAN_AC_IP:0:1}" in + w | W) + MATCH_SET="-m set --match-set ss_spec_lan_ac src" + ;; + b | B) + MATCH_SET="-m set ! --match-set ss_spec_lan_ac src" + ;; + *) + loger 3 "Bad argument \`-a $LAN_AC_IP\`." + return 2 + ;; + esac + fi + IFNAME=$(uci get -P/var/state network.lan.ifname 2>/dev/null) + ipset -! -R <<-EOF || return 1 create ss_spec_lan_ac hash:net $(for ip in ${LAN_AC_IP:1}; do echo "add ss_spec_lan_ac $ip"; done) EOF - $IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS $MATCH_SET \ - -m comment --comment "$TAG" -j SS_SPEC_WAN_AC - if [ "$OUTPUT" = 1 ]; then - $IPT -I OUTPUT 1 -p tcp $EXT_ARGS \ - -m comment --comment "$TAG" -j SS_SPEC_WAN_AC - elif [ "$OUTPUT" = 2 ]; then - ipset -! -R <<-EOF || return 1 + $IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS $MATCH_SET \ + -m comment --comment "$TAG" -j SS_SPEC_WAN_AC + if [ "$OUTPUT" = 1 ]; then + $IPT -I OUTPUT 1 -p tcp $EXT_ARGS \ + -m comment --comment "$TAG" -j SS_SPEC_WAN_AC + elif [ "$OUTPUT" = 2 ]; then + ipset -! -R <<-EOF || return 1 create ssr_gen_router hash:net $(gen_spec_iplist | sed -e "s/^/add ssr_gen_router /") EOF - $IPT -N SS_SPEC_ROUTER && \ - $IPT -A SS_SPEC_ROUTER -m set --match-set ssr_gen_router dst -j RETURN && \ - $IPT -A SS_SPEC_ROUTER -j SS_SPEC_WAN_FW - $IPT -I OUTPUT 1 -p tcp -m comment --comment "$TAG" -j SS_SPEC_ROUTER - fi - return $? + $IPT -N SS_SPEC_ROUTER && + $IPT -A SS_SPEC_ROUTER -m set --match-set ssr_gen_router dst -j RETURN && + $IPT -A SS_SPEC_ROUTER -j SS_SPEC_WAN_FW + $IPT -I OUTPUT 1 -p tcp -m comment --comment "$TAG" -j SS_SPEC_ROUTER + fi + return $? } tp_rule() { - [ -n "$TPROXY" ] || return 0 - ip rule add fwmark 0x01/0x01 table 100 - ip route add local 0.0.0.0/0 dev lo table 100 - local ipt="iptables -t mangle" - $ipt -N SS_SPEC_TPROXY - $ipt -A SS_SPEC_TPROXY -p udp --dport 443 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp --dport 80 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp --dport 53 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -d 0.0.0.0/8 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -d 10.0.0.0/8 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -d 127.0.0.0/8 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -d 169.254.0.0/16 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -d 172.16.0.0/12 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -d 192.168.0.0/16 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -d 224.0.0.0/4 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -d 240.0.0.0/4 -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp ! --dport 53 -d $server -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set fplan src \ - -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 - case "$RUNMODE" in - router) - $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst \ - -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 - $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set ! --match-set ss_spec_wan_ac dst \ - -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 - ;; - gfw) - $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set china dst -j RETURN - $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst \ - -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 - $ipt -A SS_SPEC_TPROXY -p udp -m set $PROXY_PORTS --match-set gfwlist dst \ - -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 - ;; - oversea) - $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set china dst \ - -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 - ;; - all) - $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 - ;; - esac - $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET \ - -m comment --comment "$TAG" -j SS_SPEC_TPROXY - return $? + [ -n "$TPROXY" ] || return 0 + ip rule add fwmark 0x01/0x01 table 100 + ip route add local 0.0.0.0/0 dev lo table 100 + local ipt="iptables -t mangle" + $ipt -N SS_SPEC_TPROXY + $ipt -A SS_SPEC_TPROXY -p udp --dport 443 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp --dport 80 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp --dport 53 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 0.0.0.0/8 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 10.0.0.0/8 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 127.0.0.0/8 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 169.254.0.0/16 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 172.16.0.0/12 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 192.168.0.0/16 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 224.0.0.0/4 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 240.0.0.0/4 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp ! --dport 53 -d $server -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set fplan src \ + -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + case "$RUNMODE" in + router) + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst \ + -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set ! --match-set ss_spec_wan_ac dst \ + -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + ;; + gfw) + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set china dst -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst \ + -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + $ipt -A SS_SPEC_TPROXY -p udp -m set $PROXY_PORTS --match-set gfwlist dst \ + -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + ;; + oversea) + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set china dst \ + -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + ;; + all) + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + ;; + esac + $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET \ + -m comment --comment "$TAG" -j SS_SPEC_TPROXY + return $? } get_wan_ip() { @@ -261,7 +261,7 @@ EOF } gen_spec_iplist() { - cat <<-EOF + cat <<-EOF 0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 @@ -278,112 +278,112 @@ gen_spec_iplist() { 224.0.0.0/4 240.0.0.0/4 255.255.255.255 - $(get_wan_ip) + $(get_wan_ip) EOF } gen_include() { - [ -n "$FWI" ] || return 0 - extract_rules() { - echo "*$1" - iptables-save -t $1 | grep SS_SPEC_ |\ - sed -e "s/^-A \(OUTPUT\|PREROUTING\)/-I \1 1/" - echo 'COMMIT' - } - cat <<-EOF >>$FWI - iptables-save -c | grep -v "SS_SPEC" | iptables-restore -c - iptables-restore -n <<-EOT - $(extract_rules nat) - $(extract_rules mangle) - EOT -EOF - return 0 + [ -n "$FWI" ] || return 0 + extract_rules() { + echo "*$1" + iptables-save -t $1 | grep SS_SPEC_ | + sed -e "s/^-A \(OUTPUT\|PREROUTING\)/-I \1 1/" + echo 'COMMIT' + } + cat <<-EOF >>$FWI + iptables-save -c | grep -v "SS_SPEC" | iptables-restore -c + iptables-restore -n <<-EOT + $(extract_rules nat) + $(extract_rules mangle) + EOT + EOF + return 0 } while getopts ":s:l:S:L:i:e:a:b:w:p:G:D:oOuUfgrczh" arg; do - case "$arg" in - s) - server=$OPTARG - ;; - l) - local_port=$OPTARG - ;; - S) - SERVER=$OPTARG - ;; - L) - LOCAL_PORT=$OPTARG - ;; - i) - IGNORE_LIST=$OPTARG - ;; - e) - EXT_ARGS=$OPTARG - ;; - a) - LAN_AC_IP=$OPTARG - ;; - b) - WAN_BP_IP=$(for ip in $OPTARG; do echo $ip; done) - ;; - w) - WAN_FW_IP=$OPTARG - ;; - p) - LAN_FP_IP=$OPTARG - ;; - G) - LAN_GM_IP=$OPTARG - ;; - D) - PROXY_PORTS=$OPTARG - ;; - o) - OUTPUT=1 - ;; - O) - OUTPUT=2 - ;; - u) - TPROXY=1 - ;; - U) - TPROXY=2 - ;; - g) - RUNMODE=gfw - ;; - r) - RUNMODE=router - ;; - c) - RUNMODE=oversea - ;; - z) - RUNMODE=all - ;; - f) - flush_r - exit 0 - ;; - h) - usage 0 - ;; - esac + case "$arg" in + s) + server=$OPTARG + ;; + l) + local_port=$OPTARG + ;; + S) + SERVER=$OPTARG + ;; + L) + LOCAL_PORT=$OPTARG + ;; + i) + IGNORE_LIST=$OPTARG + ;; + e) + EXT_ARGS=$OPTARG + ;; + a) + LAN_AC_IP=$OPTARG + ;; + b) + WAN_BP_IP=$(for ip in $OPTARG; do echo $ip; done) + ;; + w) + WAN_FW_IP=$OPTARG + ;; + p) + LAN_FP_IP=$OPTARG + ;; + G) + LAN_GM_IP=$OPTARG + ;; + D) + PROXY_PORTS=$OPTARG + ;; + o) + OUTPUT=1 + ;; + O) + OUTPUT=2 + ;; + u) + TPROXY=1 + ;; + U) + TPROXY=2 + ;; + g) + RUNMODE=gfw + ;; + r) + RUNMODE=router + ;; + c) + RUNMODE=oversea + ;; + z) + RUNMODE=all + ;; + f) + flush_r + exit 0 + ;; + h) + usage 0 + ;; + esac done if [ -z "$server" -o -z "$local_port" ]; then - usage 2 + usage 2 fi if [ "$TPROXY" == 1 ]; then - SERVER=$server - LOCAL_PORT=$local_port + SERVER=$server + LOCAL_PORT=$local_port elif [ "$TPROXY" == 2 ]; then - : ${SERVER:?"You must assign an ip for the udp relay server."} - : ${LOCAL_PORT:?"You must assign a port for the udp relay server."} + : ${SERVER:?"You must assign an ip for the udp relay server."} + : ${LOCAL_PORT:?"You must assign a port for the udp relay server."} fi flush_r && fw_rule && ipset_r && ac_rule && tp_rule && gen_include [ "$?" == 0 ] || loger 3 "Start failed!" -exit $? \ No newline at end of file +exit $? diff --git a/package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-switch b/package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-switch index 42e13de434..220bcbfdcb 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-switch +++ b/package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-switch @@ -20,13 +20,13 @@ CONFIG_SWTICH_FILE=/var/etc/${NAME}_t.json [ -n "$2" ] && switch_time=$2 uci_get_by_name() { - local ret=$(uci get $NAME.$1.$2 2>/dev/null) - echo ${ret:=$3} + local ret=$(uci get $NAME.$1.$2 2>/dev/null) + echo ${ret:=$3} } uci_get_by_type() { - local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null) - echo ${ret:=$3} + local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null) + echo ${ret:=$3} } DEFAULT_SERVER=$(uci_get_by_type global global_server) @@ -34,143 +34,143 @@ CURRENT_SERVER=$DEFAULT_SERVER #判断代理是否正常 check_proxy() { - local result=0 - local try_count=$(uci_get_by_type global switch_try_count 3) - for i in $(seq 1 $try_count); do - /usr/bin/ssr-check www.google.com 80 $switch_time 1 - if [ "$?" == "0" ]; then - result=0 - break - else - /usr/bin/ssr-check www.baidu.com 80 $switch_time 1 - if [ "$?" == "0" ]; then - result=1 - else - result=2 - fi - fi - sleep 1 - done - return $result + local result=0 + local try_count=$(uci_get_by_type global switch_try_count 3) + for i in $(seq 1 $try_count); do + /usr/bin/ssr-check www.google.com 80 $switch_time 1 + if [ "$?" == "0" ]; then + result=0 + break + else + /usr/bin/ssr-check www.baidu.com 80 $switch_time 1 + if [ "$?" == "0" ]; then + result=1 + else + result=2 + fi + fi + sleep 1 + done + return $result } test_proxy() { - local servername=$(uci_get_by_name $1 server) - local serverport=$(uci_get_by_name $1 server_port) - ret=$(ping -c 3 $servername | grep 'loss' | awk -F ',' '{ print $3 }' | awk -F "%" '{ print $1 }') - [ -z "$ret" ] && return 1 - [ "$ret" -gt "50" ] && return 1 - ipset add ss_spec_wan_ac $servername 2>/dev/null - ret=$? - /usr/bin/ssr-check $servername $serverport $switch_time - local ret2=$? - if [ "$ret" = "0" ]; then - ipset del ss_spec_wan_ac $servername 2>/dev/null - fi - if [ "$ret2" = "0" ]; then - return 0 - else - return 1 - fi + local servername=$(uci_get_by_name $1 server) + local serverport=$(uci_get_by_name $1 server_port) + ret=$(ping -c 3 $servername | grep 'loss' | awk -F ',' '{ print $3 }' | awk -F "%" '{ print $1 }') + [ -z "$ret" ] && return 1 + [ "$ret" -gt "50" ] && return 1 + ipset add ss_spec_wan_ac $servername 2>/dev/null + ret=$? + /usr/bin/ssr-check $servername $serverport $switch_time + local ret2=$? + if [ "$ret" = "0" ]; then + ipset del ss_spec_wan_ac $servername 2>/dev/null + fi + if [ "$ret2" = "0" ]; then + return 0 + else + return 1 + fi } search_proxy() { - let server_count=server_count+1 - [ "$normal_flag" = "1" -a "$server_count" -le "$server_locate" ] && return 0 - [ "$(uci_get_by_name $1 switch_enable)" != "1" ] && return 1 - [ $ENABLE_SERVER != nil ] && return 0 - [ "$1" = "$CURRENT_SERVER" ] && return 0 - local servername=$(uci_get_by_name $1 server) - local serverport=$(uci_get_by_name $1 server_port) - ipset add ss_spec_wan_ac $servername 2>/dev/null - ret=$? - /usr/bin/ssr-check $servername $serverport $switch_time - local ret2=$? - if [ "$ret" = "0" ]; then - ipset del ss_spec_wan_ac $servername 2>/dev/null - fi - if [ "$ret2" = "0" ]; then - server_locate=$server_count - ENABLE_SERVER=$1 - return 0 - else - return 1 - fi + let server_count=server_count+1 + [ "$normal_flag" = "1" -a "$server_count" -le "$server_locate" ] && return 0 + [ "$(uci_get_by_name $1 switch_enable)" != "1" ] && return 1 + [ $ENABLE_SERVER != nil ] && return 0 + [ "$1" = "$CURRENT_SERVER" ] && return 0 + local servername=$(uci_get_by_name $1 server) + local serverport=$(uci_get_by_name $1 server_port) + ipset add ss_spec_wan_ac $servername 2>/dev/null + ret=$? + /usr/bin/ssr-check $servername $serverport $switch_time + local ret2=$? + if [ "$ret" = "0" ]; then + ipset del ss_spec_wan_ac $servername 2>/dev/null + fi + if [ "$ret2" = "0" ]; then + server_locate=$server_count + ENABLE_SERVER=$1 + return 0 + else + return 1 + fi } #选择可用的代理 select_proxy() { - config_load $NAME - ENABLE_SERVER=nil - mkdir -p /var/run /var/etc - server_count=0 - config_foreach search_proxy servers + config_load $NAME + ENABLE_SERVER=nil + mkdir -p /var/run /var/etc + server_count=0 + config_foreach search_proxy servers } #切换代理 switch_proxy() { - /etc/init.d/vssr restart $1 - return 0 + /etc/init.d/vssr restart $1 + return 0 } start() { - #不支持kcptun启用时的切换 - [ $(uci_get_by_name $DEFAULT_SERVER kcp_enable) = "1" ] && return 1 + #不支持kcptun启用时的切换 + [ $(uci_get_by_name $DEFAULT_SERVER kcp_enable) = "1" ] && return 1 - while [ "1" = "1" ]; do #死循环 - sleep $cycle_time + while [ "1" = "1" ]; do #死循环 + sleep $cycle_time - LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") + LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") - #判断当前代理是否为缺省服务器 - if [ "$CURRENT_SERVER" != "$DEFAULT_SERVER" ]; then - #echo "not default proxy" - echo "$(date "+%Y-%m-%d %H:%M:%S") 当前为备用节点,尝试切换为主节点。" >>/tmp/vssr.log + #判断当前代理是否为缺省服务器 + if [ "$CURRENT_SERVER" != "$DEFAULT_SERVER" ]; then + #echo "not default proxy" + echo "$(date "+%Y-%m-%d %H:%M:%S") 当前为备用节点,尝试切换为主节点。" >>/tmp/vssr.log - #检查缺省服务器是否正常 - if test_proxy $DEFAULT_SERVER; then - #echo "switch to default proxy" - echo "$(date "+%Y-%m-%d %H:%M:%S") 主节点不可用." >>/tmp/vssr.log - #缺省服务器正常,切换回来 - CURRENT_SERVER=$DEFAULT_SERVER - switch_proxy $CURRENT_SERVER - echo "$(date "+%Y-%m-%d %H:%M:%S") 切换为默认节点 ["$(uci_get_by_name $CURRENT_SERVER server)"]" >>/tmp/vssr.log - continue - else - echo "$(date "+%Y-%m-%d %H:%M:%S") 主节点不可用,继续使用当前备用节点。" >>/tmp/vssr.log - fi - fi + #检查缺省服务器是否正常 + if test_proxy $DEFAULT_SERVER; then + #echo "switch to default proxy" + echo "$(date "+%Y-%m-%d %H:%M:%S") 主节点不可用." >>/tmp/vssr.log + #缺省服务器正常,切换回来 + CURRENT_SERVER=$DEFAULT_SERVER + switch_proxy $CURRENT_SERVER + echo "$(date "+%Y-%m-%d %H:%M:%S") 切换为默认节点 ["$(uci_get_by_name $CURRENT_SERVER server)"]" >>/tmp/vssr.log + continue + else + echo "$(date "+%Y-%m-%d %H:%M:%S") 主节点不可用,继续使用当前备用节点。" >>/tmp/vssr.log + fi + fi - #判断当前代理是否正常 - check_proxy - current_ret=$? + #判断当前代理是否正常 + check_proxy + current_ret=$? - if [ "$current_ret" = "1" ]; then - #当前代理错误,判断有无可用的服务器 - #echo "current error" - echo "$(date "+%Y-%m-%d %H:%M:%S") 当前节点不可用,尝试切换其他节点。" >>/tmp/vssr.log + if [ "$current_ret" = "1" ]; then + #当前代理错误,判断有无可用的服务器 + #echo "current error" + echo "$(date "+%Y-%m-%d %H:%M:%S") 当前节点不可用,尝试切换其他节点。" >>/tmp/vssr.log - select_proxy - if [ "$ENABLE_SERVER" != nil ]; then - #有其他服务器可用,进行切换 - #echo $(uci_get_by_name $new_proxy server) - echo "$(date "+%Y-%m-%d %H:%M:%S") 另外一个节点可用,即将切换节点。" >>/tmp/vssr.log - CURRENT_SERVER=$ENABLE_SERVER - switch_proxy $CURRENT_SERVER - normal_flag=1 - echo "$(date "+%Y-%m-%d %H:%M:%S") 切换节点成功。" >>/tmp/vssr.log - else - switch_proxy $CURRENT_SERVER - normal_flag=1 - echo "$(date "+%Y-%m-%d %H:%M:%S") 尝试重启当前节点。" >>/tmp/vssr.log - fi - else - normal_flag=0 - #echo "$(date "+%Y-%m-%d %H:%M:%S") vssr No Problem." >> /tmp/vssr.log - fi + select_proxy + if [ "$ENABLE_SERVER" != nil ]; then + #有其他服务器可用,进行切换 + #echo $(uci_get_by_name $new_proxy server) + echo "$(date "+%Y-%m-%d %H:%M:%S") 另外一个节点可用,即将切换节点。" >>/tmp/vssr.log + CURRENT_SERVER=$ENABLE_SERVER + switch_proxy $CURRENT_SERVER + normal_flag=1 + echo "$(date "+%Y-%m-%d %H:%M:%S") 切换节点成功。" >>/tmp/vssr.log + else + switch_proxy $CURRENT_SERVER + normal_flag=1 + echo "$(date "+%Y-%m-%d %H:%M:%S") 尝试重启当前节点。" >>/tmp/vssr.log + fi + else + normal_flag=0 + #echo "$(date "+%Y-%m-%d %H:%M:%S") vssr No Problem." >> /tmp/vssr.log + fi - done + done } diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/lua/vssrutil.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/lua/vssrutil.lua index 226e1c3780..d22fec2ee0 100644 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/lua/vssrutil.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/lua/vssrutil.lua @@ -98,11 +98,15 @@ function _M.get_flag(remark, host) end end - if (iso_code == nil) then - local ret = nixio.getaddrinfo(host, "any") - local hostip = ret[1].address - local res = db:lookup(hostip) - iso_code = string.lower(res:get("country", "iso_code")) + if (iso_code == nil ) then + if( host ~= "") then + local ret = nixio.getaddrinfo(host, "any") + local hostip = ret[1].address + local res = db:lookup(hostip) + iso_code = string.lower(res:get("country", "iso_code")) + else + iso_code = "un" + end end return string.gsub(iso_code, '\n', '') end @@ -119,17 +123,16 @@ function _M.check_site(host, port) return ret end - function _M.trim(text) - if not text or text == "" then - return "" - end - return (string.gsub(text, "^%s*(.-)%s*$", "%1")) + if not text or text == "" then return "" end + return (string.gsub(text, "^%s*(.-)%s*$", "%1")) end function _M.wget(url) - local stdout = luci.sys.exec('wget-ssl -q --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" --no-check-certificate -t 3 -T 10 -O- "' .. url .. '"') - return _M.trim(stdout) + local stdout = luci.sys.exec( + 'wget-ssl -q --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" --no-check-certificate -t 3 -T 10 -O- "' .. + url .. '"') + return _M.trim(stdout) end return _M diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/chinaipset.sh b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/chinaipset.sh index 044d524d94..63149e8cfb 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/chinaipset.sh +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/chinaipset.sh @@ -1,5 +1,5 @@ -echo "create china hash:net family inet hashsize 1024 maxelem 65536" > /tmp/china.ipset -awk '!/^$/&&!/^#/{printf("add china %s'" "'\n",$0)}' /etc/china_ssr.txt >> /tmp/china.ipset +echo "create china hash:net family inet hashsize 1024 maxelem 65536" >/tmp/china.ipset +awk '!/^$/&&!/^#/{printf("add china %s'" "'\n",$0)}' /etc/china_ssr.txt >>/tmp/china.ipset ipset -! flush china -ipset -! restore < /tmp/china.ipset 2>/dev/null +ipset -! restore /dev/null rm -f /tmp/china.ipset diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ss.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ss.lua index 80c35f0bcc..ebf54a4b95 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ss.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ss.lua @@ -1,7 +1,7 @@ -local ucursor = require "luci.model.uci".cursor() +local ucursor = require"luci.model.uci".cursor() local json = require "luci.jsonc" local server_section = arg[1] -local proto = arg[2] +local proto = arg[2] local local_port = arg[3] local host = arg[4] @@ -13,11 +13,11 @@ local ss = { local_address = "0.0.0.0", local_port = local_port, password = server.password, - timeout = (server.timeout ~= nil) and server.timeout or 60, + timeout = (server.timeout ~= nil) and server.timeout or 60, method = server.encrypt_method_ss, reuse_port = true, fast_open = (server.fast_open == "1") and true or false, plugin = (server.plugin ~= nil) and server.plugin or nil, - plugin_opts = (server.plugin ~= nil) and server.plugin_opts or nil, + plugin_opts = (server.plugin ~= nil) and server.plugin_opts or nil } print(json.stringify(ss, 1)) diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ssr.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ssr.lua index fbc38a779e..18d7a7acf2 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ssr.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ssr.lua @@ -1,7 +1,7 @@ -local ucursor = require "luci.model.uci".cursor() +local ucursor = require"luci.model.uci".cursor() local json = require "luci.jsonc" local server_section = arg[1] -local proto = arg[2] +local proto = arg[2] local local_port = arg[3] local host = arg[4] @@ -13,13 +13,13 @@ local ssr = { local_address = "0.0.0.0", local_port = local_port, password = server.password, - timeout = (server.timeout ~= nil) and server.timeout or 60, + timeout = (server.timeout ~= nil) and server.timeout or 60, method = server.encrypt_method, protocol = server.protocol, protocol_param = server.protocol_param, obfs = server.obfs, obfs_param = server.obfs_param, reuse_port = true, - fast_open = (server.fast_open == "1") and true or false, + fast_open = (server.fast_open == "1") and true or false } print(json.stringify(ssr, 1)) diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_trojan.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_trojan.lua index 9e901ef690..daabd732c5 100644 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_trojan.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_trojan.lua @@ -1,4 +1,4 @@ -local ucursor = require "luci.model.uci".cursor() +local ucursor = require"luci.model.uci".cursor() local json = require "luci.jsonc" local server_section = arg[1] local proto = arg[2] @@ -7,34 +7,34 @@ local local_port = arg[3] local server = ucursor:get_all("vssr", server_section) local trojan = { - log_level = 3, - run_type = proto, - local_addr = "0.0.0.0", - local_port = tonumber(local_port), - remote_addr = server.server, - remote_port = tonumber(server.server_port), - udp_timeout = 60, - -- 传入连接 - password = {server.password}, - -- 传出连接 - ssl = { - verify = (server.insecure == "0") and true or false, - verify_hostname = (server.tls == "1") and false or true, - cert = "", - cipher = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA", - cipher_tls13 = "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384", - sni = server.peer, - alpn = {"h2", "http/1.1"}, - curve = "", - reuse_session = true, - session_ticket = false, - }, - tcp = { - no_delay = true, - keep_alive = true, - reuse_port = true, - fast_open = (server.fast_open == "1") and true or false, - fast_open_qlen = 20 - } + log_level = 3, + run_type = proto, + local_addr = "0.0.0.0", + local_port = tonumber(local_port), + remote_addr = server.server, + remote_port = tonumber(server.server_port), + udp_timeout = 60, + -- 传入连接 + password = {server.password}, + -- 传出连接 + ssl = { + verify = (server.insecure == "0") and true or false, + verify_hostname = (server.tls == "1") and false or true, + cert = "", + cipher = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA", + cipher_tls13 = "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384", + sni = server.peer, + alpn = {"h2", "http/1.1"}, + curve = "", + reuse_session = true, + session_ticket = false + }, + tcp = { + no_delay = true, + keep_alive = true, + reuse_port = true, + fast_open = (server.fast_open == "1") and true or false, + fast_open_qlen = 20 + } } print(json.stringify(trojan, 1)) diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua index 84beedf7bf..d815b1233d 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua @@ -15,14 +15,15 @@ local disney_server = ucursor:get_first(name, 'global', 'disney_server') local prime_server = ucursor:get_first(name, 'global', 'prime_server') local tvb_server = ucursor:get_first(name, 'global', 'tvb_server') local custom_server = ucursor:get_first(name, 'global', 'custom_server') -local proxy_domain_name = ucursor:get_list(name,"@access_control[0]","proxy_domain_name") +local proxy_domain_name = ucursor:get_list(name, "@access_control[0]", + "proxy_domain_name") function gen_outbound(server_node, tags, local_ports) local bound = {} if server_node == "nil" then bound = nil else - + local server = ucursor:get_all(name, server_node) if server.type ~= "v2ray" then bound = { @@ -30,10 +31,7 @@ function gen_outbound(server_node, tags, local_ports) protocol = "socks", settings = { servers = { - { - address = "127.0.0.1", - port = tonumber(local_ports) - } + {address = "127.0.0.1", port = tonumber(local_ports)} } } } @@ -61,7 +59,8 @@ function gen_outbound(server_node, tags, local_ports) network = server.transport, security = (server.tls == '1') and "tls" or "none", tlsSettings = { - allowInsecure = (server.insecure == "1") and true or false, + allowInsecure = (server.insecure == "1") and true or + false, serverName = server.ws_host }, kcpSettings = (server.transport == "kcp") and { @@ -69,7 +68,8 @@ function gen_outbound(server_node, tags, local_ports) tti = tonumber(server.tti), uplinkCapacity = tonumber(server.uplink_capacity), downlinkCapacity = tonumber(server.downlink_capacity), - congestion = (server.congestion == "1") and true or false, + congestion = (server.congestion == "1") and true or + false, readBufferSize = tonumber(server.read_buffer_size), writeBufferSize = tonumber(server.write_buffer_size), header = {type = server.kcp_guise} @@ -100,18 +100,18 @@ end local outbounds_table = {} - if v2ray_flow == "1" then - table.insert(outbounds_table, gen_outbound(server_section, "global",2080)) - table.insert(outbounds_table, gen_outbound(youtube_server, "youtube",2081)) - table.insert(outbounds_table, gen_outbound(tw_video_server, "twvideo",2082)) - table.insert(outbounds_table, gen_outbound(netflix_server, "netflix",2083)) - table.insert(outbounds_table, gen_outbound(disney_server, "disney",2084)) - table.insert(outbounds_table, gen_outbound(prime_server, "prime",2085)) - table.insert(outbounds_table, gen_outbound(tvb_server, "tvb",2086)) - table.insert(outbounds_table, gen_outbound(custom_server, "custom",2087)) + table.insert(outbounds_table, gen_outbound(server_section, "global", 2080)) + table.insert(outbounds_table, gen_outbound(youtube_server, "youtube", 2081)) + table.insert(outbounds_table, gen_outbound(tw_video_server, "twvideo", 2082)) + table.insert(outbounds_table, gen_outbound(netflix_server, "netflix", 2083)) + table.insert(outbounds_table, gen_outbound(disney_server, "disney", 2084)) + table.insert(outbounds_table, gen_outbound(prime_server, "prime", 2085)) + table.insert(outbounds_table, gen_outbound(tvb_server, "tvb", 2086)) + table.insert(outbounds_table, gen_outbound(custom_server, "custom", 2087)) else - table.insert(outbounds_table, gen_outbound(server_section, "main",local_port)) + table.insert(outbounds_table, + gen_outbound(server_section, "main", local_port)) end -- rules gen @@ -119,20 +119,10 @@ end local youtube_rule = { type = "field", domain = { - "youtube", - "ggpht.com", - "googlevideo.com", - "withyoutube.com", - "youtu.be", - "youtube-nocookie.com", - "youtube.com", - "youtubeeducation.com", - "youtubegaming.com", - "youtubei.googleapis.com", - "youtubekids.com", - "youtubemobilesupport.com", - "yt.be", - "ytimg.com" + "youtube", "ggpht.com", "googlevideo.com", "withyoutube.com", + "youtu.be", "youtube-nocookie.com", "youtube.com", + "youtubeeducation.com", "youtubegaming.com", "youtubei.googleapis.com", + "youtubekids.com", "youtubemobilesupport.com", "yt.be", "ytimg.com" }, outboundTag = "youtube" } @@ -140,15 +130,8 @@ local youtube_rule = { local tw_video_rule = { type = "field", domain = { - "vidol.tv", - "hinet.net", - "books.com", - "litv.tv", - "pstatic.net", - "app-measurement.com", - "kktv.com.tw", - "gamer.com.tw", - "wetv.vip" + "vidol.tv", "hinet.net", "books.com", "litv.tv", "pstatic.net", + "app-measurement.com", "kktv.com.tw", "gamer.com.tw", "wetv.vip" }, outboundTag = "twvideo" } @@ -156,20 +139,12 @@ local tw_video_rule = { local netflix_rule = { type = "field", domain = { - "fast.com", - "netflix.ca", - "netflix.com", - "netflix.net", - "netflixinvestor.com", - "netflixtechblog.com", - "nflxext.com", - "nflximg.com", - "nflximg.net", - "nflxsearch.net", - "nflxso.net", + "fast.com", "netflix.ca", "netflix.com", "netflix.net", + "netflixinvestor.com", "netflixtechblog.com", "nflxext.com", + "nflximg.com", "nflximg.net", "nflxsearch.net", "nflxso.net", "nflxvideo.net" }, - + outboundTag = "netflix" } @@ -185,17 +160,9 @@ local disney_rule = { local prime_rule = { type = "field", domain = { - "aiv-cdn.net", - "amazonaws.com", - "amazonvideo.com", - "llnwd.net", - "amazonprimevideos.com", - "amazonvideo.cc", - "prime-video.com", - "primevideo.cc", - "primevideo.com", - "primevideo.info", - "primevideo.org", + "aiv-cdn.net", "amazonaws.com", "amazonvideo.com", "llnwd.net", + "amazonprimevideos.com", "amazonvideo.cc", "prime-video.com", + "primevideo.cc", "primevideo.com", "primevideo.info", "primevideo.org", "rimevideo.tv" }, outboundTag = "prime" @@ -203,10 +170,7 @@ local prime_rule = { local tvb_rule = { type = "field", - domain = { - "tvsuper.com", - "tvb.com" - }, + domain = {"tvsuper.com", "tvb.com"}, outboundTag = "tvb" } @@ -259,7 +223,9 @@ local v2ray = { protocol = "dokodemo-door", settings = {network = proto, followRedirect = true}, sniffing = {enabled = true, destOverride = {"http", "tls"}}, - streamSettings = {sockopt = { tproxy = (proto == "tcp") and "redirect" or "tproxy"}} + streamSettings = { + sockopt = {tproxy = (proto == "tcp") and "redirect" or "tproxy"} + } } }, diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray_s.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray_s.lua index 097be17777..653c8dad25 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray_s.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray_s.lua @@ -1,4 +1,4 @@ -local ucursor = require "luci.model.uci".cursor() +local ucursor = require"luci.model.uci".cursor() local name = "vssr" local json = require "luci.jsonc" local proto = "socks" @@ -7,36 +7,25 @@ local local_port = ucursor:get_first(name, 'socks5_proxy', 'local_port') local Socks_user = ucursor:get_first(name, 'socks5_proxy', 'Socks_user') local Socks_pass = ucursor:get_first(name, 'socks5_proxy', 'Socks_pass') - local v2ray = { - log = { - --error = "/var/log/v2ray.log", - loglevel = "warning" - }, - -- 传入连接 - inbound = { - port = local_port, - protocol = proto, - settings = { - auth = (auth_type == '1') and "password" or "noauth", - accounts =(auth_type == "1") and { - { - user = (auth_type == '1') and Socks_user, - pass = Socks_pass - } - } or nil, - } - }, - -- 传出连接 - outbound = { - protocol = "freedom" - }, - -- 额外传出连接 - outboundDetour = { - { - protocol = "blackhole", - tag = "blocked" - } - } + log = { + -- error = "/var/log/v2ray.log", + loglevel = "warning" + }, + -- 传入连接 + inbound = { + port = local_port, + protocol = proto, + settings = { + auth = (auth_type == '1') and "password" or "noauth", + accounts = (auth_type == "1") and + {{user = (auth_type == '1') and Socks_user, pass = Socks_pass}} or + nil + } + }, + -- 传出连接 + outbound = {protocol = "freedom"}, + -- 额外传出连接 + outboundDetour = {{protocol = "blackhole", tag = "blocked"}} } -print(json.stringify(v2ray,1)) \ No newline at end of file +print(json.stringify(v2ray, 1)) diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/gfw2ipset.sh b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/gfw2ipset.sh index 7edc30e584..a16f82c10e 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/gfw2ipset.sh +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/gfw2ipset.sh @@ -3,23 +3,19 @@ mkdir -p /tmp/dnsmasq.ssr -awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"gfwlist"'\n",$0)}' /etc/config/gfw.list > /tmp/dnsmasq.ssr/custom_forward.conf -awk '!/^$/&&!/^#/{printf("server=/.%s/'"127.0.0.1#5335"'\n",$0)}' /etc/config/gfw.list >> /tmp/dnsmasq.ssr/custom_forward.conf +awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"gfwlist"'\n",$0)}' /etc/config/gfw.list >/tmp/dnsmasq.ssr/custom_forward.conf +awk '!/^$/&&!/^#/{printf("server=/.%s/'"127.0.0.1#5335"'\n",$0)}' /etc/config/gfw.list >>/tmp/dnsmasq.ssr/custom_forward.conf -awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"blacklist"'\n",$0)}' /etc/config/black.list > /tmp/dnsmasq.ssr/blacklist_forward.conf -awk '!/^$/&&!/^#/{printf("server=/.%s/'"127.0.0.1#5335"'\n",$0)}' /etc/config/black.list >> /tmp/dnsmasq.ssr/blacklist_forward.conf +awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"blacklist"'\n",$0)}' /etc/config/black.list >/tmp/dnsmasq.ssr/blacklist_forward.conf +awk '!/^$/&&!/^#/{printf("server=/.%s/'"127.0.0.1#5335"'\n",$0)}' /etc/config/black.list >>/tmp/dnsmasq.ssr/blacklist_forward.conf -awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"whitelist"'\n",$0)}' /etc/config/white.list > /tmp/dnsmasq.ssr/whitelist_forward.conf +awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"whitelist"'\n",$0)}' /etc/config/white.list >/tmp/dnsmasq.ssr/whitelist_forward.conf - -function valid_ip() -{ +function valid_ip() { ip=$1 - read_ip=$(echo $ip|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}') - if echo $ip|grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' >/dev/null - then - if [ $read_ip == "yes" ] - then + read_ip=$(echo $ip | awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}') + if echo $ip | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' >/dev/null; then + if [ $read_ip == "yes" ]; then return 0 else return 1 @@ -32,14 +28,14 @@ function valid_ip() config_load vssr function addWhiteList() { - local iface="$1" - local host - config_get host "$iface" server - if valid_ip $host; then - ipset -! add whitelist $host - else - [ ! -z "$host" ] && echo "ipset=/.$host/whitelist" >> /tmp/dnsmasq.ssr/whitelist_forward.conf - fi + local iface="$1" + local host + config_get host "$iface" server + if valid_ip $host; then + ipset -! add whitelist $host + else + [ ! -z "$host" ] && echo "ipset=/.$host/whitelist" >>/tmp/dnsmasq.ssr/whitelist_forward.conf + fi } -config_foreach addWhiteList \ No newline at end of file +config_foreach addWhiteList diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.lua index cac3dc6508..6e089fc7f6 100644 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.lua @@ -9,7 +9,6 @@ require 'luci.util' require 'luci.jsonc' require 'luci.sys' - -- these global functions are accessed all the time by the event handler -- so caching them is worth the effort local luci = luci @@ -210,7 +209,7 @@ local function processData(szType, content) end result.encrypt_method_ss = method result.password = password - + elseif szType == "trojan" then local idx_sp = 0 local alias = "" @@ -263,14 +262,16 @@ local function processData(szType, content) result.alias = alias result.switch_enable = switch_enable local vssrutil = require "vssrutil" - result.flag = vssrutil.get_flag(result.alias,result.server) + result.flag = vssrutil.get_flag(result.alias, result.server) return result end -- wget local function wget(url) - local stdout = luci.sys.exec('wget-ssl -q --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" --no-check-certificate -t 3 -T 10 -O- "' .. url .. '"') - return trim(stdout) + local stdout = luci.sys.exec( + 'wget-ssl -q --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" --no-check-certificate -t 3 -T 10 -O- "' .. + url .. '"') + return trim(stdout) end local execute = function() diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua index d19f21a1e0..72e322dec7 100644 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua @@ -1,4 +1,5 @@ #!/usr/bin/lua + ------------------------------------------------ -- This file is part of the luci-app-ssr-plus update.lua -- By Mattraks @@ -7,101 +8,103 @@ require 'nixio' require 'luci.util' require 'luci.jsonc' require 'luci.sys' -local icount =0 +local icount = 0 local ucic = luci.model.uci.cursor() local log = function(...) - print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({ ... }, " ")) + print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({...}, " ")) end log('正在更新【GFW列表】数据库') if nixio.fs.access("/usr/bin/wget-ssl") then - refresh_cmd="wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O /tmp/gfw.b64" - else - refresh_cmd="wget -O /tmp/gfw.b64 http://iytc.net/tools/list.b64" - end - sret=luci.sys.call(refresh_cmd .. " 2>/dev/null") - if sret== 0 then - luci.sys.call("/usr/bin/vssr-gfw") - icount = luci.sys.exec("cat /tmp/gfwnew.txt | wc -l") - if tonumber(icount)>1000 then - oldcount=luci.sys.exec("cat /etc/dnsmasq.ssr/gfw_list.conf | wc -l") - if tonumber(icount) ~= tonumber(oldcount) then - luci.sys.exec("cp -f /tmp/gfwnew.txt /etc/dnsmasq.ssr/gfw_list.conf") --- retstring=tostring(math.ceil(tonumber(icount)/2)) - log('更新成功! 新的总纪录数:'.. icount) - else - log('你已经是最新数据,无需更新!') - end - else - log('更新失败!') - end - luci.sys.exec("rm -f /tmp/gfwnew.txt") + refresh_cmd = + "wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O /tmp/gfw.b64" else - log('更新失败!') + refresh_cmd = "wget -O /tmp/gfw.b64 http://iytc.net/tools/list.b64" +end +sret = luci.sys.call(refresh_cmd .. " 2>/dev/null") +if sret == 0 then + luci.sys.call("/usr/bin/vssr-gfw") + icount = luci.sys.exec("cat /tmp/gfwnew.txt | wc -l") + if tonumber(icount) > 1000 then + oldcount = luci.sys.exec("cat /etc/dnsmasq.ssr/gfw_list.conf | wc -l") + if tonumber(icount) ~= tonumber(oldcount) then + luci.sys + .exec("cp -f /tmp/gfwnew.txt /etc/dnsmasq.ssr/gfw_list.conf") + -- retstring=tostring(math.ceil(tonumber(icount)/2)) + log('更新成功! 新的总纪录数:' .. icount) + else + log('你已经是最新数据,无需更新!') + end + else + log('更新失败!') + end + luci.sys.exec("rm -f /tmp/gfwnew.txt") +else + log('更新失败!') end log('正在更新【国内IP段】数据库') -refresh_cmd="wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' 2>/dev/null| awk -F\\| '/CN\\|ipv4/ { printf(\"%s/%d\\n\", $4, 32-log($5)/log(2)) }' > /tmp/china_ssr.txt" -sret=luci.sys.call(refresh_cmd) +refresh_cmd = + "wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' 2>/dev/null| awk -F\\| '/CN\\|ipv4/ { printf(\"%s/%d\\n\", $4, 32-log($5)/log(2)) }' > /tmp/china_ssr.txt" +sret = luci.sys.call(refresh_cmd) icount = luci.sys.exec("cat /tmp/china_ssr.txt | wc -l") - if sret== 0 then - icount = luci.sys.exec("cat /tmp/china_ssr.txt | wc -l") - if tonumber(icount)>1000 then - oldcount=luci.sys.exec("cat /etc/china_ssr.txt | wc -l") - if tonumber(icount) ~= tonumber(oldcount) then - luci.sys.exec("cp -f /tmp/china_ssr.txt /etc/china_ssr.txt") --- retstring=tostring(math.ceil(tonumber(icount)/2)) - log('更新成功! 新的总纪录数:'.. icount) - else - log('你已经是最新数据,无需更新!') - end - else - log('更新失败!') - end - luci.sys.exec("rm -f /tmp/china_ssr.txt") +if sret == 0 then + icount = luci.sys.exec("cat /tmp/china_ssr.txt | wc -l") + if tonumber(icount) > 1000 then + oldcount = luci.sys.exec("cat /etc/china_ssr.txt | wc -l") + if tonumber(icount) ~= tonumber(oldcount) then + luci.sys.exec("cp -f /tmp/china_ssr.txt /etc/china_ssr.txt") + -- retstring=tostring(math.ceil(tonumber(icount)/2)) + log('更新成功! 新的总纪录数:' .. icount) + else + log('你已经是最新数据,无需更新!') + end + else + log('更新失败!') + end + luci.sys.exec("rm -f /tmp/china_ssr.txt") else - log('更新失败!') + log('更新失败!') end -- --[[ if ucic:get_first('vssr', 'global', 'adblock', '') == '1' then -log('正在更新【广告屏蔽】数据库') - local need_process = 0 - if nixio.fs.access("/usr/bin/wget-ssl") then - refresh_cmd="wget-ssl --no-check-certificate -O - https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt > /tmp/adnew.conf" - need_process = 1 -else - refresh_cmd="wget -O /tmp/ad.conf http://iytc.net/tools/ad.conf" -end -sret=luci.sys.call(refresh_cmd .. " 2>/dev/null") -if sret== 0 then - if need_process == 1 then - luci.sys.call("/usr/bin/vssr-ad") - end - icount = luci.sys.exec("cat /tmp/ad.conf | wc -l") - if tonumber(icount)>1000 then - if nixio.fs.access("/etc/dnsmasq.ssr/ad.conf") then - oldcount=luci.sys.exec("cat /etc/dnsmasq.ssr/ad.conf | wc -l") - else - oldcount=0 - end - if tonumber(icount) ~= tonumber(oldcount) then - luci.sys.exec("cp -f /tmp/ad.conf /etc/dnsmasq.ssr/ad.conf") --- retstring=tostring(math.ceil(tonumber(icount))) - if oldcount==0 then - luci.sys.call("/etc/init.d/dnsmasq restart") - end - log('更新成功! 新的总纪录数:'.. icount) - else - log('你已经是最新数据,无需更新!') - end - else - log('更新失败!') - end - luci.sys.exec("rm -f /tmp/ad.conf") -else - log('更新失败!') -end + log('正在更新【广告屏蔽】数据库') + local need_process = 0 + if nixio.fs.access("/usr/bin/wget-ssl") then + refresh_cmd = + "wget-ssl --no-check-certificate -O - https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt > /tmp/adnew.conf" + need_process = 1 + else + refresh_cmd = "wget -O /tmp/ad.conf http://iytc.net/tools/ad.conf" + end + sret = luci.sys.call(refresh_cmd .. " 2>/dev/null") + if sret == 0 then + if need_process == 1 then luci.sys.call("/usr/bin/vssr-ad") end + icount = luci.sys.exec("cat /tmp/ad.conf | wc -l") + if tonumber(icount) > 1000 then + if nixio.fs.access("/etc/dnsmasq.ssr/ad.conf") then + oldcount = luci.sys.exec("cat /etc/dnsmasq.ssr/ad.conf | wc -l") + else + oldcount = 0 + end + if tonumber(icount) ~= tonumber(oldcount) then + luci.sys.exec("cp -f /tmp/ad.conf /etc/dnsmasq.ssr/ad.conf") + -- retstring=tostring(math.ceil(tonumber(icount))) + if oldcount == 0 then + luci.sys.call("/etc/init.d/dnsmasq restart") + end + log('更新成功! 新的总纪录数:' .. icount) + else + log('你已经是最新数据,无需更新!') + end + else + log('更新失败!') + end + luci.sys.exec("rm -f /tmp/ad.conf") + else + log('更新失败!') + end end -- --]] diff --git a/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css b/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css index 0cb10e4750..df51473156 100644 --- a/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css +++ b/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css @@ -1,5 +1,5 @@ -@import url("flag-icon.min.css"); -@import url("sweetalert2.css?v=2"); +@import url("flag-icon.min.css?v=1.16"); +@import url("sweetalert2.css?v=1.16"); /*! Pure v1.0.1 Copyright 2013 Yahoo! @@ -225,7 +225,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md } .pure-u-23-24 { - width: 95.8333% + width: 95.8333% } .pure-u-1, @@ -251,7 +251,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md overflow-y: hidden; border: 1px solid rgba(0, 0, 0, .05); border-radius: .375rem; - background-color:#fff; + background-color: #fff; box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15); } @@ -259,14 +259,17 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md margin: 1rem; } -.pure-img{ + +.pure-img { max-height: 100%; width: auto; } -.pure-imgw{ + +.pure-imgw { max-width: 100%; height: auto; } + .green { font-size: 1.25rem; color: #2dce89; @@ -308,10 +311,12 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md color: #8898aa !important; line-height: 1.8em; } -.p-in5{ + +.p-in5 { padding: 8px; } -.flag-icon:before{ + +.flag-icon:before { position: absolute; } @@ -328,21 +333,23 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md line-height: 1.7em; overflow: hidden; letter-spacing: normal; - -} -.cbi-section-table-row:hover{ - background: #fff; - + } -.cbi-section-table-row.fast{ +.cbi-section-table-row:hover { + background: #fff; + +} + +.cbi-section-table-row.fast { background: #5e72e4; color: #fff; } -.cbi-section-table-row.fast .ssr-button{ +.cbi-section-table-row.fast .ssr-button { color: #fff; } + .cbi-section-table-row.fast .ssr-button:hover, .cbi-section-table-row.fast .ssr-button:focus, .cbi-section-table-row.fast .ssr-button:active { @@ -352,7 +359,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md box-shadow: none; } -.cbi-section-table-row.fast .host_con{ +.cbi-section-table-row.fast .host_con { color: #fff !important; } @@ -386,15 +393,18 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md } -.alias{ - margin-bottom:1px; +.alias { + margin-bottom: 1px; } -.incon{ + +.incon { cursor: pointer; } -.incon .pure-imgw{ + +.incon .pure-imgw { transition: all 0.2s; } + .incon:nth-child(2) { position: absolute; left: 0; @@ -404,9 +414,10 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md border: 0; border-right: #d1dfed 1px solid; background-position: top; - + } -.incon:nth-child(2) .tp{ + +.incon:nth-child(2) .tp { position: absolute; left: 0; bottom: 0; @@ -492,48 +503,56 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md padding: 0.1rem 0.5rem; border-radius: 0.2rem; } -footer.mobile-hide{ + +footer.mobile-hide { display: block; } -.mar-10 {margin-left: 50px; margin-right: 10px;} +.mar-10 { + margin-left: 50px; + margin-right: 10px; +} -.status-bar{ +.status-bar { position: fixed; bottom: 0; right: 0; - box-shadow: 0 0 2rem 0 rgba(136,152,170,.3); + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .3); color: #525f7f; background: #fff; z-index: 5; box-sizing: border-box; } -.status-bar .inner{ +.status-bar .inner { margin: 1em; } -.status-bar .inner .flag{ +.status-bar .inner .flag { height: 3em; display: block; float: left; margin-right: 1em; } -.status-bar .inner .status-info{ + +.status-bar .inner .status-info { font-weight: bold; } -.status-bar .icon-con{ + +.status-bar .icon-con { height: 3em; text-align: right; } -.choose_node .gap{ - margin:0.5rem 1rem; - position:relative; +.choose_node .gap { + margin: 0.5rem 1rem; + position: relative; } -.choose_node .gap .cbi-button{ - width:100% !important; + +.choose_node .gap .cbi-button { + width: 100% !important; } + @media screen and (max-width: 2000px) { .pure-u-1-5 { width: 25%; @@ -589,8 +608,9 @@ footer.mobile-hide{ border-color: #fb6340 !important; box-shadow: 0 0 1rem 0 rgba(136, 152, 170, .75); } - .choose_node .pure-u-1-2{ - width:50%; + + .choose_node .pure-u-1-2 { + width: 50%; } } @@ -626,6 +646,8 @@ footer.mobile-hide{ .modals h2 { padding: 0 !important; + background-color: transparent !important; + color: #fff !important; } .modals h3 { @@ -642,6 +664,7 @@ footer.mobile-hide{ height: calc(100% - 4rem); font-family: 'Lucida Console'; font-size: 11px; + line-height: 1.5em; background: transparent; color: #FFFFFF; outline: none; @@ -678,23 +701,26 @@ footer.mobile-hide{ left: 0; top: 0; } - .status-bar .pure-u-1-2{ + + .status-bar .pure-u-1-2 { width: 50%; } - .status-bar .inner .flag{ + + .status-bar .inner .flag { height: 3em; display: block; float: left; margin-right: 1em; } - .status-bar .icon-con{ + + .status-bar .icon-con { height: 2.5em; text-align: right; } } - @media (prefers-color-scheme: dark) { - .block { +@media (prefers-color-scheme: dark) { + .block { background-color: #3c3c3c !important; box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, 0.35); } @@ -704,11 +730,12 @@ footer.mobile-hide{ background-color: #3c3c3c !important; box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.35); } - .incon:nth-child(2) { - border-right: #1e1e1e 1px solid; -} -.ssr-button { - color: #ccc; -} - } \ No newline at end of file + .incon:nth-child(2) { + border-right: #1e1e1e 1px solid; + } + + .ssr-button { + color: #ccc; + } +} \ No newline at end of file