update 04-13 09:13

This commit is contained in:
github-actions[bot] 2022-04-13 09:13:21 +08:00
parent a4e1a1794b
commit e59cf6afb2
33 changed files with 37842 additions and 202 deletions

View File

@ -20404,6 +20404,7 @@ explore.studyperth.com.au
exploreholidayexcellent.com exploreholidayexcellent.com
explosivesnarlproprietor.com explosivesnarlproprietor.com
expmediadirect.com expmediadirect.com
expmediadirect1.com
expo123.net expo123.net
expocrack.com expocrack.com
exponderle.pro exponderle.pro
@ -23622,6 +23623,7 @@ grursusy.com
gruschiwere.com gruschiwere.com
grvmedia.com grvmedia.com
grvsrdlowot.xyz grvsrdlowot.xyz
grychiphidu.com
grygrothapi.pro grygrothapi.pro
gryshathepe.pro gryshathepe.pro
gs.getui.com gs.getui.com
@ -52787,6 +52789,7 @@ track-east.mobileadtrading.com
track-re01.com track-re01.com
track-server-100.com track-server-100.com
track-srv.vietnamnet.vn track-srv.vietnamnet.vn
track-tracingkit394853.com
track-victoriadates.com track-victoriadates.com
track-web.net track-web.net
track.58.com track.58.com

View File

@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openclash PKG_NAME:=luci-app-openclash
PKG_VERSION:=0.44.42 PKG_VERSION:=0.45.02
PKG_RELEASE:=beta PKG_RELEASE:=beta
PKG_MAINTAINER:=vernesong <https://github.com/vernesong/OpenClash> PKG_MAINTAINER:=vernesong <https://github.com/vernesong/OpenClash>
@ -100,6 +100,7 @@ define Package/$(PKG_NAME)/postrm
rm -rf /tmp/dler* >/dev/null 2>&1 rm -rf /tmp/dler* >/dev/null 2>&1
rm -rf /tmp/etc/openclash >/dev/null 2>&1 rm -rf /tmp/etc/openclash >/dev/null 2>&1
rm -rf /tmp/openclash_edit_file_name >/dev/null 2>&1 rm -rf /tmp/openclash_edit_file_name >/dev/null 2>&1
sed -i '/OpenClash Append/,/OpenClash Append End/d' "/usr/lib/lua/luci/model/network.lua" >/dev/null 2>&1
uci -q delete firewall.openclash uci -q delete firewall.openclash
uci -q commit firewall uci -q commit firewall
uci -q delete ucitrack.@openclash[-1] uci -q delete ucitrack.@openclash[-1]

View File

@ -22,6 +22,7 @@ function index()
entry({"admin", "services", "openclash", "update_subscribe"},call("action_update_subscribe")) entry({"admin", "services", "openclash", "update_subscribe"},call("action_update_subscribe"))
entry({"admin", "services", "openclash", "update_other_rules"},call("action_update_other_rules")) entry({"admin", "services", "openclash", "update_other_rules"},call("action_update_other_rules"))
entry({"admin", "services", "openclash", "update_geoip"},call("action_update_geoip")) entry({"admin", "services", "openclash", "update_geoip"},call("action_update_geoip"))
entry({"admin", "services", "openclash", "update_geosite"},call("action_update_geosite"))
entry({"admin", "services", "openclash", "currentversion"},call("action_currentversion")) entry({"admin", "services", "openclash", "currentversion"},call("action_currentversion"))
entry({"admin", "services", "openclash", "lastversion"},call("action_lastversion")) entry({"admin", "services", "openclash", "lastversion"},call("action_lastversion"))
entry({"admin", "services", "openclash", "save_corever_branch"},call("action_save_corever_branch")) entry({"admin", "services", "openclash", "save_corever_branch"},call("action_save_corever_branch"))
@ -94,9 +95,11 @@ local core_path_mode = uci:get("openclash", "config", "small_flash_memory")
if core_path_mode ~= "1" then if core_path_mode ~= "1" then
dev_core_path="/etc/openclash/core/clash" dev_core_path="/etc/openclash/core/clash"
tun_core_path="/etc/openclash/core/clash_tun" tun_core_path="/etc/openclash/core/clash_tun"
meta_core_path="/etc/openclash/core/clash_meta"
else else
dev_core_path="/tmp/etc/openclash/core/clash" dev_core_path="/tmp/etc/openclash/core/clash"
tun_core_path="/tmp/etc/openclash/core/clash_tun" tun_core_path="/tmp/etc/openclash/core/clash_tun"
meta_core_path="/tmp/etc/openclash/core/clash_meta"
end end
local function is_running() local function is_running()
@ -127,6 +130,10 @@ local function ipdb()
return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/etc/openclash/Country.mmdb")) return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/etc/openclash/Country.mmdb"))
end end
local function geosite()
return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/etc/openclash/GeoSite.dat"))
end
local function lhie1() local function lhie1()
return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/usr/share/openclash/res/lhie1.yaml")) return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/usr/share/openclash/res/lhie1.yaml"))
end end
@ -140,7 +147,11 @@ local function ConnersHua_return()
end end
local function chnroute() local function chnroute()
return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/etc/openclash/rule_provider/ChinaIP.yaml")) return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/etc/openclash/china_ip_route.ipset"))
end
local function chnroutev6()
return os.date("%Y-%m-%d %H:%M:%S",fs.mtime("/etc/openclash/china_ip6_route.ipset"))
end end
local function daip() local function daip()
@ -210,11 +221,20 @@ else
end end
end end
local function coremetacv()
if not nixio.fs.access(meta_core_path) then
return "0"
else
return luci.sys.exec(string.format("%s -v 2>/dev/null |awk -F ' ' '{print $3}'",meta_core_path))
end
end
local function corelv() local function corelv()
luci.sys.call("sh /usr/share/openclash/clash_version.sh") luci.sys.call("sh /usr/share/openclash/clash_version.sh")
local core_lv = luci.sys.exec("sed -n 1p /tmp/clash_last_version 2>/dev/null") local core_lv = luci.sys.exec("sed -n 1p /tmp/clash_last_version 2>/dev/null")
local core_tun_lv = luci.sys.exec("sed -n 2p /tmp/clash_last_version 2>/dev/null") local core_tun_lv = luci.sys.exec("sed -n 2p /tmp/clash_last_version 2>/dev/null")
return core_lv .. "," .. core_tun_lv local core_meta_lv = luci.sys.exec("sed -n 3p /tmp/clash_last_version 2>/dev/null")
return core_lv .. "," .. core_tun_lv .. "," .. core_meta_lv
end end
local function opcv() local function opcv()
@ -396,7 +416,11 @@ local function dler_login()
fs.unlink(sub_path) fs.unlink(sub_path)
fs.unlink("/tmp/dler_checkin") fs.unlink("/tmp/dler_checkin")
fs.unlink("/tmp/dler_info") fs.unlink("/tmp/dler_info")
return "402" if info and info.msg then
return info.msg
else
return "login faild"
end
end end
else else
uci:delete("openclash", "config", "dler_token") uci:delete("openclash", "config", "dler_token")
@ -404,7 +428,7 @@ local function dler_login()
fs.unlink(sub_path) fs.unlink(sub_path)
fs.unlink("/tmp/dler_checkin") fs.unlink("/tmp/dler_checkin")
fs.unlink("/tmp/dler_info") fs.unlink("/tmp/dler_info")
return "402" return "email or passwd is wrong"
end end
end end
@ -427,10 +451,14 @@ local function dler_logout()
fs.unlink("/tmp/dler_info") fs.unlink("/tmp/dler_info")
return info.ret return info.ret
else else
return "403" if info and info.msg then
return info.msg
else
return "logout faild"
end
end end
else else
return "403" return "logout faild"
end end
end end
@ -876,7 +904,9 @@ function action_state()
ConnersHua = ConnersHua(), ConnersHua = ConnersHua(),
ConnersHua_return = ConnersHua_return(), ConnersHua_return = ConnersHua_return(),
ipdb = ipdb(), ipdb = ipdb(),
geosite = geosite(),
historychecktime = historychecktime(), historychecktime = historychecktime(),
chnroutev6 = chnroutev6(),
chnroute = chnroute(); chnroute = chnroute();
}) })
end end
@ -908,6 +938,7 @@ function action_update()
coremodel = coremodel(), coremodel = coremodel(),
corecv = corecv(), corecv = corecv(),
coretuncv = coretuncv(), coretuncv = coretuncv(),
coremetacv = coremetacv(),
opcv = opcv(), opcv = opcv(),
corever = corever(), corever = corever(),
release_branch = release_branch(), release_branch = release_branch(),
@ -961,6 +992,10 @@ function action_update_geoip()
return luci.sys.call("/usr/share/openclash/openclash_ipdb.sh >/dev/null 2>&1") return luci.sys.call("/usr/share/openclash/openclash_ipdb.sh >/dev/null 2>&1")
end end
function action_update_geosite()
return luci.sys.call("/usr/share/openclash/openclash_geosite.sh >/dev/null 2>&1")
end
function act_ping() function act_ping()
local e={} local e={}
e.index=luci.http.formvalue("index") e.index=luci.http.formvalue("index")

View File

@ -95,6 +95,7 @@ o.description = font_red..bold_on..translate("Note: There is A Risk of Privacy L
o:depends("sub_convert", "1") o:depends("sub_convert", "1")
o:value("https://api.dler.io/sub", translate("api.dler.io")..translate("(Default)")) o:value("https://api.dler.io/sub", translate("api.dler.io")..translate("(Default)"))
o:value("https://subconverter.herokuapp.com/sub", translate("subconverter.herokuapp.com")..translate("(Default)")) o:value("https://subconverter.herokuapp.com/sub", translate("subconverter.herokuapp.com")..translate("(Default)"))
o:value("https://v.id9.cc/sub", translate("https://v.id9.cc/sub")..translate("(Support Vless By Pinyun)"))
o:value("https://sub.id9.cc/sub", translate("sub.id9.cc")) o:value("https://sub.id9.cc/sub", translate("sub.id9.cc"))
o:value("https://api.wcc.best/sub", translate("api.wcc.best")) o:value("https://api.wcc.best/sub", translate("api.wcc.best"))
o.default = "https://api.dler.io/sub" o.default = "https://api.dler.io/sub"

View File

@ -94,7 +94,7 @@ HTTP.setfilehandler(
if meta and chunk then fd = nixio.open(proxy_pro_dir .. meta.file, "w") end if meta and chunk then fd = nixio.open(proxy_pro_dir .. meta.file, "w") end
elseif fp == "rule-provider" then elseif fp == "rule-provider" then
if meta and chunk then fd = nixio.open(rule_pro_dir .. meta.file, "w") end if meta and chunk then fd = nixio.open(rule_pro_dir .. meta.file, "w") end
elseif fp == "clash" or fp == "clash_tun" then elseif fp == "clash" or fp == "clash_tun" or fp == "clash_meta" then
create_core_dir=fs.mkdir(core_dir) create_core_dir=fs.mkdir(core_dir)
if meta and chunk then fd = nixio.open(core_dir .. meta.file, "w") end if meta and chunk then fd = nixio.open(core_dir .. meta.file, "w") end
elseif fp == "backup-file" then elseif fp == "backup-file" then
@ -132,7 +132,7 @@ HTTP.setfilehandler(
um.value = translate("File saved to") .. ' "/etc/openclash/proxy_provider/"' um.value = translate("File saved to") .. ' "/etc/openclash/proxy_provider/"'
elseif fp == "rule-provider" then elseif fp == "rule-provider" then
um.value = translate("File saved to") .. ' "/etc/openclash/rule_provider/"' um.value = translate("File saved to") .. ' "/etc/openclash/rule_provider/"'
elseif fp == "clash" or fp == "clash_tun" then elseif fp == "clash" or fp == "clash_tun" or fp == "clash_meta" then
if string.lower(string.sub(meta.file, -7, -1)) == ".tar.gz" then if string.lower(string.sub(meta.file, -7, -1)) == ".tar.gz" then
os.execute(string.format("tar -C '/etc/openclash/core/core' -xzf %s >/dev/null 2>&1", (core_dir .. meta.file))) os.execute(string.format("tar -C '/etc/openclash/core/core' -xzf %s >/dev/null 2>&1", (core_dir .. meta.file)))
fs.unlink(core_dir .. meta.file) fs.unlink(core_dir .. meta.file)

View File

@ -14,7 +14,7 @@ m.pageaction = false
m.description=translate("Attention:").. m.description=translate("Attention:")..
"<br/>"..translate("The game proxy is a test function and does not guarantee the availability of rules").. "<br/>"..translate("The game proxy is a test function and does not guarantee the availability of rules")..
"<br/>"..translate("Preparation steps:").. "<br/>"..translate("Preparation steps:")..
"<br/>"..translate("1. In the <server and policy group management> page, create the policy group and node you are going to use, and apply the configuration (when adding nodes, you must select the policy group you want to join). Policy group type suggestion: fallback, game nodes must support UDP").. "<br/>"..translate("1. In the <server and policy group management> page, create the policy group and node you are going to use, and apply the configuration (when adding nodes, you must select the policy group you want to join). Policy group type suggestion: fallback, game nodes must be support UDP and not a Vmess")..
"<br/>"..translate("2. Click the <manage third party game rules> or <manage third party rule set> button to enter the rule list and download the rules you want to use").. "<br/>"..translate("2. Click the <manage third party game rules> or <manage third party rule set> button to enter the rule list and download the rules you want to use")..
"<br/>"..translate("3. On this page, set the corresponding configuration file and policy group of the rule you have downloaded, and save the settings").. "<br/>"..translate("3. On this page, set the corresponding configuration file and policy group of the rule you have downloaded, and save the settings")..
"<br/>"..translate("4. Install the TUN core").. "<br/>"..translate("4. Install the TUN core")..

View File

@ -117,6 +117,7 @@ o = s:option(ListValue, "type", translate("Server Node Type"))
o:value("ss", translate("Shadowsocks")) o:value("ss", translate("Shadowsocks"))
o:value("ssr", translate("ShadowsocksR")) o:value("ssr", translate("ShadowsocksR"))
o:value("vmess", translate("Vmess")) o:value("vmess", translate("Vmess"))
o:value("vless", translate("Vless"))
o:value("trojan", translate("trojan")) o:value("trojan", translate("trojan"))
o:value("snell", translate("Snell")) o:value("snell", translate("Snell"))
o:value("socks5", translate("Socks5")) o:value("socks5", translate("Socks5"))
@ -162,6 +163,7 @@ o:depends("type", "ss")
o = s:option(ListValue, "cipher_ssr", translate("Encrypt Method")) o = s:option(ListValue, "cipher_ssr", translate("Encrypt Method"))
for _, v in ipairs(encrypt_methods_ssr) do o:value(v) end for _, v in ipairs(encrypt_methods_ssr) do o:value(v) end
o:value("dummy", "none")
o.rmempty = true o.rmempty = true
o:depends("type", "ssr") o:depends("type", "ssr")
@ -194,10 +196,11 @@ o.rmempty = true
o:depends("type", "vmess") o:depends("type", "vmess")
-- VmessId -- VmessId
o = s:option(Value, "uuid", translate("VmessId (UUID)")) o = s:option(Value, "uuid", translate("UUID"))
o.rmempty = true o.rmempty = true
o.default = uuid o.default = uuid
o:depends("type", "vmess") o:depends("type", "vmess")
o:depends("type", "vless")
o = s:option(ListValue, "udp", translate("UDP Enable")) o = s:option(ListValue, "udp", translate("UDP Enable"))
o.rmempty = true o.rmempty = true
@ -207,6 +210,7 @@ o:value("false")
o:depends("type", "ss") o:depends("type", "ss")
o:depends("type", "ssr") o:depends("type", "ssr")
o:depends("type", "vmess") o:depends("type", "vmess")
o:depends("type", "vless")
o:depends("type", "socks5") o:depends("type", "socks5")
o:depends("type", "trojan") o:depends("type", "trojan")
o:depends({type = "snell", snell_version = "3"}) o:depends({type = "snell", snell_version = "3"})
@ -228,6 +232,14 @@ o:value("tls")
o:value("http") o:value("http")
o:depends("type", "snell") o:depends("type", "snell")
o = s:option(ListValue, "obfs_vless", translate("obfs-mode"))
o.rmempty = true
o.default = "none"
o:value("none")
o:value("ws", translate("websocket (ws)"))
o:value("grpc", translate("grpc"))
o:depends("type", "vless")
o = s:option(ListValue, "obfs_vmess", translate("obfs-mode")) o = s:option(ListValue, "obfs_vmess", translate("obfs-mode"))
o.rmempty = true o.rmempty = true
o.default = "none" o.default = "none"
@ -288,11 +300,13 @@ o = s:option(Value, "ws_opts_path", translate("ws-opts-path"))
o.rmempty = true o.rmempty = true
o.placeholder = translate("/path") o.placeholder = translate("/path")
o:depends("obfs_vmess", "websocket") o:depends("obfs_vmess", "websocket")
o:depends("obfs_vless", "ws")
o = s:option(DynamicList, "ws_opts_headers", translate("ws-opts-headers")) o = s:option(DynamicList, "ws_opts_headers", translate("ws-opts-headers"))
o.rmempty = true o.rmempty = true
o.placeholder = translate("Host: v2ray.com") o.placeholder = translate("Host: v2ray.com")
o:depends("obfs_vmess", "websocket") o:depends("obfs_vmess", "websocket")
o:depends("obfs_vless", "ws")
o = s:option(Value, "max_early_data", translate("max-early-data")) o = s:option(Value, "max_early_data", translate("max-early-data"))
o.rmempty = true o.rmempty = true
@ -317,6 +331,7 @@ o:depends("obfs_vmess", "grpc")
o:depends("type", "socks5") o:depends("type", "socks5")
o:depends("type", "http") o:depends("type", "http")
o:depends("type", "trojan") o:depends("type", "trojan")
o:depends("type", "vless")
-- [[ TLS ]]-- -- [[ TLS ]]--
o = s:option(ListValue, "tls", translate("tls")) o = s:option(ListValue, "tls", translate("tls"))
@ -326,6 +341,7 @@ o:value("true")
o:value("false") o:value("false")
o:depends("obfs", "websocket") o:depends("obfs", "websocket")
o:depends("type", "vmess") o:depends("type", "vmess")
o:depends("type", "vless")
o:depends("type", "socks5") o:depends("type", "socks5")
o:depends("type", "http") o:depends("type", "http")
@ -336,6 +352,14 @@ o.placeholder = translate("example.com")
o:depends({obfs_vmess = "websocket", tls = "true"}) o:depends({obfs_vmess = "websocket", tls = "true"})
o:depends({obfs_vmess = "grpc", tls = "true"}) o:depends({obfs_vmess = "grpc", tls = "true"})
o:depends({obfs_vmess = "none", tls = "true"}) o:depends({obfs_vmess = "none", tls = "true"})
o:depends("type", "vless")
o = s:option(Value, "vless_flow", translate("flow"))
o.rmempty = true
o.default = "xtls-rprx-direct"
o:value("xtls-rprx-direct")
o:value("xtls-rprx-origin")
o:depends("obfs_vless", "none")
o = s:option(Value, "keep_alive", translate("keep-alive")) o = s:option(Value, "keep_alive", translate("keep-alive"))
o.rmempty = true o.rmempty = true
@ -386,6 +410,7 @@ o.datatype = "host"
o.placeholder = translate("example") o.placeholder = translate("example")
o:depends("obfs_trojan", "grpc") o:depends("obfs_trojan", "grpc")
o:depends("obfs_vmess", "grpc") o:depends("obfs_vmess", "grpc")
o:depends("obfs_vless", "grpc")
-- [[ trojan-ws-path ]]-- -- [[ trojan-ws-path ]]--
o = s:option(Value, "trojan_ws_path", translate("Path")) o = s:option(Value, "trojan_ws_path", translate("Path"))

View File

@ -16,11 +16,17 @@ bold_off = [[</strong>]]
local op_mode = string.sub(luci.sys.exec('uci get openclash.config.operation_mode 2>/dev/null'),0,-2) local op_mode = string.sub(luci.sys.exec('uci get openclash.config.operation_mode 2>/dev/null'),0,-2)
if not op_mode then op_mode = "redir-host" end if not op_mode then op_mode = "redir-host" end
local lan_ip=SYS.exec("uci -q get network.lan.ipaddr |awk -F '/' '{print $1}' 2>/dev/null |tr -d '\n' || ip addr show 2>/dev/null | grep -w 'inet' | grep 'global' | grep 'brd' | grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | head -n 1 | tr -d '\n'") local lan_ip = SYS.exec("uci -q get network.lan.ipaddr |awk -F '/' '{print $1}' 2>/dev/null |tr -d '\n' || ip address show $(uci -q -p /tmp/state get network.lan.ifname) | grep -w 'inet' 2>/dev/null |grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | tr -d '\n' || ip addr show 2>/dev/null | grep -w 'inet' | grep 'global' | grep 'brd' | grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | head -n 1 | tr -d '\n'")
m = Map("openclash", translate("Global Settings(Will Modify The Config File Or Subscribe According To The Settings On This Page)")) m = Map("openclash", translate("Global Settings(Will Modify The Config File Or Subscribe According To The Settings On This Page)"))
m.pageaction = false m.pageaction = false
m.description=translate("To restore the default configuration, try accessing:").." <a href='javascript:void(0)' onclick='javascript:restore_config(this)'>http://"..lan_ip.."/cgi-bin/luci/admin/services/openclash/restore</a>" m.description = translate("Note: To restore the default configuration, try accessing:").." <a href='javascript:void(0)' onclick='javascript:restore_config(this)'>http://"..lan_ip.."/cgi-bin/luci/admin/services/openclash/restore</a>"..
"<br/>"..translate("Note: It is not recommended to enable IPv6 and related services for routing. Most of the network connection problems reported so far are related to it")..
"<br/>"..font_green..translate("Note: Turning on secure DNS in the browser will cause abnormal shunting, please be careful to turn it off")..font_off..
"<br/>"..font_green..translate("Note: Some software will modify the device HOSTS, which will cause abnormal shunt, please pay attention to check")..font_off..
"<br/>"..font_green..translate("Note: Game proxy please use nodes except Vmess")..font_off..
"<br/>"..translate("Note: The default proxy routes local traffic, BT, PT download, etc., please use redir mode as much as possible and pay attention to traffic avoidance")..
"<br/>"..translate("Note: If the connection is abnormal, please follow the steps on this page to check first")..": ".."<a href='javascript:void(0)' onclick='javascript:return winOpen(\"https://github.com/vernesong/OpenClash/wiki/%E7%BD%91%E7%BB%9C%E8%BF%9E%E6%8E%A5%E5%BC%82%E5%B8%B8%E6%97%B6%E6%8E%92%E6%9F%A5%E5%8E%9F%E5%9B%A0\")'>"..translate("Click to the page").."</a>"
s = m:section(TypedSection, "openclash") s = m:section(TypedSection, "openclash")
s.anonymous = true s.anonymous = true
@ -28,6 +34,7 @@ s.anonymous = true
s:tab("op_mode", translate("Operation Mode")) s:tab("op_mode", translate("Operation Mode"))
s:tab("settings", translate("General Settings")) s:tab("settings", translate("General Settings"))
s:tab("dns", translate("DNS Setting")) s:tab("dns", translate("DNS Setting"))
s:tab("meta", translate("Meta Settings"))
s:tab("stream_enhance", translate("Streaming Enhance")) s:tab("stream_enhance", translate("Streaming Enhance"))
s:tab("lan_ac", translate("Access Control")) s:tab("lan_ac", translate("Access Control"))
if op_mode == "fake-ip" then if op_mode == "fake-ip" then
@ -37,7 +44,7 @@ s:tab("rules", translate("Rules Setting"))
end end
s:tab("dashboard", translate("Dashboard Settings")) s:tab("dashboard", translate("Dashboard Settings"))
s:tab("rules_update", translate("Rules Update")) s:tab("rules_update", translate("Rules Update"))
s:tab("geo_update", translate("GEOIP Update")) s:tab("geo_update", translate("GEO Update"))
s:tab("chnr_update", translate("Chnroute Update")) s:tab("chnr_update", translate("Chnroute Update"))
s:tab("auto_restart", translate("Auto Restart")) s:tab("auto_restart", translate("Auto Restart"))
s:tab("version_update", translate("Version Update")) s:tab("version_update", translate("Version Update"))
@ -362,6 +369,118 @@ function custom_domain_dns_policy.write(self, section, value)
end end
end end
-- Meta
o = s:taboption("meta", Flag, "enable_meta_core", font_red..bold_on..translate("Enable Meta Core")..bold_off..font_off)
o.description = font_red..bold_on..translate("Some Premium Core Features are Unavailable, For Other More Useful Functions Go Wiki:")..bold_off..font_off.." ".."<a href='javascript:void(0)' onclick='javascript:return winOpen(\"https://clashmeta.gitbook.io/meta/\")'>https://clashmeta.gitbook.io/meta/</a>"
o.default = 0
o = s:taboption("meta", Flag, "enable_meta_sniffer", font_red..bold_on..translate("Enable Sniffer")..bold_off..font_off)
o.description = font_red..bold_on..translate("Sniffer Will Prevent Domain Name Proxy and DNS Hijack Failure")..bold_off..font_off
o.default = 1
o:depends("enable_meta_core", "1")
o = s:taboption("meta", Flag, "enable_meta_sniffer_force", translate("Force Sniffer"))
o.description = translate("Override All Dns Query")
o.default = 0
o:depends("enable_meta_sniffer", "1")
o = s:taboption("meta", ListValue, "geodata_loader", translate("Geodata Loader Mode"))
o:value("memconservative", translate("Memconservative"))
o:value("standard", translate("Standard"))
o.default = "memconservative"
o:depends("enable_meta_core", "1")
o = s:taboption("meta", Flag, "enable_geoip_dat", translate("Enable GeoIP Dat"))
o.description = translate("Replace GEOIP MMDB With GEOIP Dat, Large Size File, Need Download First")
o.default = 0
o:depends("enable_meta_core", "1")
o = s:taboption("meta", Flag, "geoip_auto_update", translate("Auto Update GeoIP Dat"))
o.default = 0
o:depends("enable_geoip_dat", "1")
o = s:taboption("meta", ListValue, "geoip_update_week_time", translate("Update Time (Every Week)"))
o:value("*", translate("Every Day"))
o:value("1", translate("Every Monday"))
o:value("2", translate("Every Tuesday"))
o:value("3", translate("Every Wednesday"))
o:value("4", translate("Every Thursday"))
o:value("5", translate("Every Friday"))
o:value("6", translate("Every Saturday"))
o:value("0", translate("Every Sunday"))
o.default = "1"
o:depends("geoip_auto_update", "1")
o = s:taboption("meta", ListValue, "geoip_update_day_time", translate("Update time (every day)"))
for t = 0,23 do
o:value(t, t..":00")
end
o.default = "0"
o:depends("geoip_auto_update", "1")
o = s:taboption("meta", Value, "geoip_custom_url")
o.title = translate("Custom GeoIP Dat URL")
o.rmempty = true
o.description = translate("Custom GeoIP Dat URL, Click Button Below To Refresh After Edit")
o:value("https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat", translate("Loyalsoldier-Version")..translate("(Default)"))
o.default = "https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat"
o:depends("geoip_auto_update", "1")
o = s:taboption("meta", Button, translate("GEOIP Dat Update"))
o.title = translate("Update GeoIP Dat")
o.inputtitle = translate("Check And Update")
o.inputstyle = "reload"
o.write = function()
m.uci:set("openclash", "config", "enable", 1)
m.uci:commit("openclash")
SYS.call("/usr/share/openclash/openclash_geoip.sh >/dev/null 2>&1 &")
HTTP.redirect(DISP.build_url("admin", "services", "openclash"))
end
o:depends("geoip_auto_update", "1")
o = s:taboption("meta", Flag, "geosite_auto_update", translate("Auto Update GeoSite Database"))
o.default = 0
o:depends("enable_meta_core", "1")
o = s:taboption("meta", ListValue, "geosite_update_week_time", translate("Update Time (Every Week)"))
o:value("*", translate("Every Day"))
o:value("1", translate("Every Monday"))
o:value("2", translate("Every Tuesday"))
o:value("3", translate("Every Wednesday"))
o:value("4", translate("Every Thursday"))
o:value("5", translate("Every Friday"))
o:value("6", translate("Every Saturday"))
o:value("0", translate("Every Sunday"))
o.default = "1"
o:depends("geosite_auto_update", "1")
o = s:taboption("meta", ListValue, "geosite_update_day_time", translate("Update time (every day)"))
for t = 0,23 do
o:value(t, t..":00")
end
o.default = "0"
o:depends("geosite_auto_update", "1")
o = s:taboption("meta", Value, "geosite_custom_url")
o.title = translate("Custom GeoSite URL")
o.rmempty = true
o.description = translate("Custom GeoSite Data URL, Click Button Below To Refresh After Edit")
o:value("https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat", translate("Loyalsoldier-Version")..translate("(Default)"))
o.default = "https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat"
o:depends("geosite_auto_update", "1")
o = s:taboption("meta", Button, translate("GEOSITE Update"))
o.title = translate("Update GeoSite Database")
o.inputtitle = translate("Check And Update")
o.inputstyle = "reload"
o.write = function()
m.uci:set("openclash", "config", "enable", 1)
m.uci:commit("openclash")
SYS.call("/usr/share/openclash/openclash_geosite.sh >/dev/null 2>&1 &")
HTTP.redirect(DISP.build_url("admin", "services", "openclash"))
end
o:depends("geosite_auto_update", "1")
---- Access Control ---- Access Control
if op_mode == "redir-host" then if op_mode == "redir-host" then
o = s:taboption("lan_ac", ListValue, "lan_ac_mode", translate("LAN Access Control Mode")) o = s:taboption("lan_ac", ListValue, "lan_ac_mode", translate("LAN Access Control Mode"))
@ -467,7 +586,7 @@ end
--Stream Enhance --Stream Enhance
o = s:taboption("stream_enhance", Flag, "stream_domains_prefetch", font_red..bold_on..translate("Prefetch Netflix, Disney Plus Domains")..bold_off..font_off) o = s:taboption("stream_enhance", Flag, "stream_domains_prefetch", font_red..bold_on..translate("Prefetch Netflix, Disney Plus Domains")..bold_off..font_off)
o.description = translate("Prevent Some Devices From Directly Using IP Access To Cause Unlocking Failure") o.description = translate("Prevent Some Devices From Directly Using IP Access To Cause Unlocking Failure, Recommend Use meta Sniffer Function")
o.default = 0 o.default = 0
o = s:taboption("stream_enhance", Value, "stream_domains_prefetch_interval", translate("Domains Prefetch Interval(min)")) o = s:taboption("stream_enhance", Value, "stream_domains_prefetch_interval", translate("Domains Prefetch Interval(min)"))
@ -508,7 +627,7 @@ o:depends("stream_auto_select_netflix", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_netflix", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_netflix", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "HK|SG|TW" o.placeholder = "HK|SG|TW"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_netflix", "1") o:depends("stream_auto_select_netflix", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_netflix", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_netflix", translate("Unlock Nodes Filter"))
@ -536,7 +655,7 @@ o:depends("stream_auto_select_disney", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_disney", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_disney", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "HK|SG|TW" o.placeholder = "HK|SG|TW"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_disney", "1") o:depends("stream_auto_select_disney", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_disney", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_disney", translate("Unlock Nodes Filter"))
@ -564,7 +683,7 @@ o:depends("stream_auto_select_ytb", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_ytb", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_ytb", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "HK|US" o.placeholder = "HK|US"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_ytb", "1") o:depends("stream_auto_select_ytb", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_ytb", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_ytb", translate("Unlock Nodes Filter"))
@ -592,7 +711,7 @@ o:depends("stream_auto_select_prime_video", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_prime_video", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_prime_video", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "HK|US|SG" o.placeholder = "HK|US|SG"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_prime_video", "1") o:depends("stream_auto_select_prime_video", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_prime_video", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_prime_video", translate("Unlock Nodes Filter"))
@ -642,7 +761,7 @@ o:depends("stream_auto_select_hbo_max", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_hbo_max", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_hbo_max", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "US" o.placeholder = "US"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_hbo_max", "1") o:depends("stream_auto_select_hbo_max", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_hbo_max", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_hbo_max", translate("Unlock Nodes Filter"))
@ -670,7 +789,7 @@ o:depends("stream_auto_select_hbo_go_asia", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_hbo_go_asia", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_hbo_go_asia", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "HK|SG|TW" o.placeholder = "HK|SG|TW"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_hbo_go_asia", "1") o:depends("stream_auto_select_hbo_go_asia", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_hbo_go_asia", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_hbo_go_asia", translate("Unlock Nodes Filter"))
@ -698,7 +817,7 @@ o:depends("stream_auto_select_tvb_anywhere", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_tvb_anywhere", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_tvb_anywhere", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "HK|SG|TW" o.placeholder = "HK|SG|TW"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_tvb_anywhere", "1") o:depends("stream_auto_select_tvb_anywhere", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_tvb_anywhere", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_tvb_anywhere", translate("Unlock Nodes Filter"))
@ -726,7 +845,7 @@ o:depends("stream_auto_select_dazn", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_dazn", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_dazn", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "DE" o.placeholder = "DE"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_dazn", "1") o:depends("stream_auto_select_dazn", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_dazn", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_dazn", translate("Unlock Nodes Filter"))
@ -754,7 +873,7 @@ o:depends("stream_auto_select_paramount_plus", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_paramount_plus", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_paramount_plus", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "US" o.placeholder = "US"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_paramount_plus", "1") o:depends("stream_auto_select_paramount_plus", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_paramount_plus", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_paramount_plus", translate("Unlock Nodes Filter"))
@ -782,7 +901,7 @@ o:depends("stream_auto_select_discovery_plus", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_discovery_plus", translate("Unlock Region Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_region_key_discovery_plus", translate("Unlock Region Filter"))
o.default = "" o.default = ""
o.placeholder = "US" o.placeholder = "US"
o.description = translate("It Will Be Selected Region According To The Regex") o.description = translate("It Will Be Selected Region(Country Shortcode) According To The Regex")
o:depends("stream_auto_select_discovery_plus", "1") o:depends("stream_auto_select_discovery_plus", "1")
o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_discovery_plus", translate("Unlock Nodes Filter")) o = s:taboption("stream_enhance", Value, "stream_auto_select_node_key_discovery_plus", translate("Unlock Nodes Filter"))

File diff suppressed because one or more lines are too long

View File

@ -57,6 +57,9 @@
} }
else { else {
s.innerHTML ="<font color='red'><strong>"+"<%:Dler Cloud Login Faild%>"+"</strong></font>"; s.innerHTML ="<font color='red'><strong>"+"<%:Dler Cloud Login Faild%>"+"</strong></font>";
if (status.dler_login) {
alert("<%:Dler Cloud Login Faild%>: "+status.dler_login)
}
window.location.href='<%="settings?tab.openclash.config=dlercloud"%>'; window.location.href='<%="settings?tab.openclash.config=dlercloud"%>';
} }
} }
@ -79,6 +82,9 @@
} }
else { else {
s.innerHTML ="<font color='red'><strong>"+"<%:Dler Cloud Logout Faild%>"+"</strong></font>"; s.innerHTML ="<font color='red'><strong>"+"<%:Dler Cloud Logout Faild%>"+"</strong></font>";
if (status.dler_logout) {
alert("<%:Dler Cloud Logout Faild%>: "+status.dler_logout)
}
} }
} }
btn.disabled = false; btn.disabled = false;

View File

@ -197,7 +197,7 @@ function import_ssr_url(btn, urlname, sid) {
document.getElementsByName('cbid.openclash.' + sid + '.server')[0].value = ssm[1]; document.getElementsByName('cbid.openclash.' + sid + '.server')[0].value = ssm[1];
document.getElementsByName('cbid.openclash.' + sid + '.port')[0].value = ssm[2]; document.getElementsByName('cbid.openclash.' + sid + '.port')[0].value = ssm[2];
document.getElementsByName('cbid.openclash.' + sid + '.protocol')[0].value = ssm[3]; document.getElementsByName('cbid.openclash.' + sid + '.protocol')[0].value = ssm[3];
document.getElementsByName('cbid.openclash.' + sid + '.cipher_ssr')[0].value = ssm[4]; document.getElementsByName('cbid.openclash.' + sid + '.cipher_ssr')[0].value = (ssm[4] == "none" ? "dummy" : ssm[4]);
document.getElementsByName('cbid.openclash.' + sid + '.obfs_ssr')[0].value = ssm[5]; document.getElementsByName('cbid.openclash.' + sid + '.obfs_ssr')[0].value = ssm[5];
document.getElementsByName('cbid.openclash.' + sid + '.password')[0].value = b64decsafe(ssm[6]); document.getElementsByName('cbid.openclash.' + sid + '.password')[0].value = b64decsafe(ssm[6]);
document.getElementsByName('cbid.openclash.' + sid + '.obfs_param')[0].value = dictvalue(pdict, 'obfsparam'); document.getElementsByName('cbid.openclash.' + sid + '.obfs_param')[0].value = dictvalue(pdict, 'obfsparam');

View File

@ -155,12 +155,14 @@
<tr id="hid_2"> <tr id="hid_2">
<td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_close_all_connection"><%:Collecting data...%></p></td> <td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_close_all_connection"><%:Collecting data...%></p></td>
<td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_reload_firewall"><%:Collecting data...%></p></td> <td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_reload_firewall"><%:Collecting data...%></p></td>
<td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_flush_fakeip_cache"><%:Collecting data...%></p></td>
<td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_update_subscribe"><%:Collecting data...%></p></td> <td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_update_subscribe"><%:Collecting data...%></p></td>
<td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_one_key_update"><%:Collecting data...%></p></td>
</tr> </tr>
<tr id="hid_3"> <tr id="hid_3">
<td width="50%" colspan="2" align="center"><p style="margin: 10px 0; text-align: center" id="_update_other_rules"><%:Collecting data...%></p></td> <td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_update_other_rules"><%:Collecting data...%></p></td>
<td width="50%" colspan="2" align="center"><p style="margin: 10px 0; text-align: center" id="_update_geoip"><%:Collecting data...%></p></td> <td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_update_geoip"><%:Collecting data...%></p></td>
<td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_update_geosite"><%:Collecting data...%></p></td>
<td width="25%" align="center"><p style="margin: 10px 0; text-align: center" id="_one_key_update"><%:Collecting data...%></p></td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
@ -173,7 +175,8 @@
</td></tr> </td></tr>
<tr><td width="25%"><%:Node Select Backup%></td><td width="25%" align="left" id="_historychecktime"><%:Collecting data...%></td><td width="25%"><%:lhie1 Rule Update%></td><td width="25%" align="left" id="_lhie1"><%:Collecting data...%></td></tr> <tr><td width="25%"><%:Node Select Backup%></td><td width="25%" align="left" id="_historychecktime"><%:Collecting data...%></td><td width="25%"><%:lhie1 Rule Update%></td><td width="25%" align="left" id="_lhie1"><%:Collecting data...%></td></tr>
<tr><td width="25%"><%:ConnersHua Rule Update%></td><td width="25%" align="left" id="_ConnersHua"><%:Collecting data...%></td><td width="25%"><%:ConnersHua Return Rule Update%></td><td width="25%" align="left" id="_ConnersHua_return"><%:Collecting data...%></td></tr> <tr><td width="25%"><%:ConnersHua Rule Update%></td><td width="25%" align="left" id="_ConnersHua"><%:Collecting data...%></td><td width="25%"><%:ConnersHua Return Rule Update%></td><td width="25%" align="left" id="_ConnersHua_return"><%:Collecting data...%></td></tr>
<tr><td width="25%"><%:Mainland IP Update%></td><td width="25%" align="left" id="_chnroute"><%:Collecting data...%></td><td width="25%"><%:GEOIPBy MaxMindData Update%></td><td width="25%" align="left" id="_ipdb"><%:Collecting data...%></td></tr> <tr><td width="25%"><%:Mainland IP Update%></td><td width="25%" align="left" id="_chnroute"><%:Collecting data...%></td><td width="25%"><%: Mainland IPv6 Update%></td><td width="25%" align="left" id="_chnroutev6"><%:Collecting data...%></td></tr>
<tr><td width="25%"><%:GEOIP Data Update%></td><td width="25%" align="left" id="_ipdb"><%:Collecting data...%></td><td width="25%"><%:GeoSite Data Update%></td><td width="25%" align="left" id="_geosite"><%:Collecting data...%></td></tr>
</table> </table>
</fieldset> </fieldset>
<script type="text/javascript">//<![CDATA[ <script type="text/javascript">//<![CDATA[
@ -192,11 +195,15 @@
var update_subscribe = document.getElementById('_update_subscribe'); var update_subscribe = document.getElementById('_update_subscribe');
var update_other_rules = document.getElementById('_update_other_rules'); var update_other_rules = document.getElementById('_update_other_rules');
var update_geoip = document.getElementById('_update_geoip'); var update_geoip = document.getElementById('_update_geoip');
var update_geosite = document.getElementById('_update_geosite');
var flush_fakeip_cache= document.getElementById('_flush_fakeip_cache');
var ipdb = document.getElementById('_ipdb'); var ipdb = document.getElementById('_ipdb');
var geosite = document.getElementById('_geosite');
var lhie1 = document.getElementById('_lhie1'); var lhie1 = document.getElementById('_lhie1');
var ConnersHua = document.getElementById('_ConnersHua'); var ConnersHua = document.getElementById('_ConnersHua');
var ConnersHua_return = document.getElementById('_ConnersHua_return'); var ConnersHua_return = document.getElementById('_ConnersHua_return');
var chnroute = document.getElementById('_chnroute'); var chnroute = document.getElementById('_chnroute');
var chnroutev6 = document.getElementById('_chnroutev6');
var historychecktime = document.getElementById('_historychecktime'); var historychecktime = document.getElementById('_historychecktime');
var hid_1 = document.getElementById("hid_1"); var hid_1 = document.getElementById("hid_1");
var hid_2 = document.getElementById("hid_2"); var hid_2 = document.getElementById("hid_2");
@ -245,10 +252,12 @@
webo.innerHTML = status.web ? '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Open Panel%>" onclick="return net_dashboard(this)"/>' : '<b style=color:red><%:Not Running%></b>'; webo.innerHTML = status.web ? '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Open Panel%>" onclick="return net_dashboard(this)"/>' : '<b style=color:red><%:Not Running%></b>';
close_all_connection.innerHTML = status.clash ? '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Close All Connections%>" onclick="return b_close_all_connection(this)"/>' : '<b style=color:red><%:Not Running%></b>'; close_all_connection.innerHTML = status.clash ? '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Close All Connections%>" onclick="return b_close_all_connection(this)"/>' : '<b style=color:red><%:Not Running%></b>';
reload_firewall.innerHTML = status.clash ? '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Reload Firewall Rules%>" onclick="return b_reload_firewall(this)"/>' : '<b style=color:red><%:Not Running%></b>'; reload_firewall.innerHTML = status.clash ? '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Reload Firewall Rules%>" onclick="return b_reload_firewall(this)"/>' : '<b style=color:red><%:Not Running%></b>';
flush_fakeip_cache.innerHTML = status.clash ? '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Flush Fake-IP Cache%>" onclick="return b_flush_fakeip_cache(this)"/>' : '<b style=color:red><%:Not Running%></b>';
one_key_update.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check All Components Update%>" onclick="return all_one_key_update(this)"/>'; one_key_update.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check All Components Update%>" onclick="return all_one_key_update(this)"/>';
update_subscribe.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check Config Update%>" onclick="return b_update_subscribe(this)"/>'; update_subscribe.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check Config Update%>" onclick="return b_update_subscribe(this)"/>';
update_other_rules.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check Third Party Rules Update%>" onclick="return b_update_other_rules(this)"/>'; update_other_rules.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check Third Party Rules Update%>" onclick="return b_update_other_rules(this)"/>';
update_geoip.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check GEOIP Data Update%>" onclick="return b_update_geoip(this)"/>'; update_geoip.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check GEOIP Data Update%>" onclick="return b_update_geoip(this)"/>';
update_geosite.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check GeoSite Data Update%>" onclick="return b_update_geosite(this)"/>';
if (status.daip && window.location.hostname == status.daip) { if (status.daip && window.location.hostname == status.daip) {
daip.innerHTML = status.daip ? "<b style=color:green>"+status.daip+"</b>" : "<b style=color:red>"+"<%:Not Set%>"+"</b>"; daip.innerHTML = status.daip ? "<b style=color:green>"+status.daip+"</b>" : "<b style=color:red>"+"<%:Not Set%>"+"</b>";
dapo.innerHTML = status.cn_port ? "<b style=color:green>"+status.cn_port+"</b>" : "<b style=color:red>"+"<%:Not Set%>"+"</b>"; dapo.innerHTML = status.cn_port ? "<b style=color:green>"+status.cn_port+"</b>" : "<b style=color:red>"+"<%:Not Set%>"+"</b>";
@ -389,10 +398,12 @@
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "state")%>', null, function(x, status) { XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "state")%>', null, function(x, status) {
if ( x && x.status == 200 ) { if ( x && x.status == 200 ) {
ipdb.innerHTML = status.ipdb ? "<b style=color:green>"+status.ipdb+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>"; ipdb.innerHTML = status.ipdb ? "<b style=color:green>"+status.ipdb+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>";
geosite.innerHTML = status.geosite ? "<b style=color:green>"+status.geosite+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>";
lhie1.innerHTML = status.lhie1 ? "<b style=color:green>"+status.lhie1+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>"; lhie1.innerHTML = status.lhie1 ? "<b style=color:green>"+status.lhie1+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>";
ConnersHua.innerHTML = status.ConnersHua ? "<b style=color:green>"+status.ConnersHua+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>"; ConnersHua.innerHTML = status.ConnersHua ? "<b style=color:green>"+status.ConnersHua+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>";
ConnersHua_return.innerHTML = status.ConnersHua_return ? "<b style=color:green>"+status.ConnersHua_return+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>"; ConnersHua_return.innerHTML = status.ConnersHua_return ? "<b style=color:green>"+status.ConnersHua_return+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>";
chnroute.innerHTML = status.chnroute ? "<b style=color:green>"+status.chnroute+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>"; chnroute.innerHTML = status.chnroute ? "<b style=color:green>"+status.chnroute+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>";
chnroutev6.innerHTML = status.chnroutev6 ? "<b style=color:green>"+status.chnroutev6+"</b>" : "<b style=color:red>"+"<%:File Not Exist%>"+"</b>";
if ( status.historychecktime != "0" ) { if ( status.historychecktime != "0" ) {
historychecktime.innerHTML = "<b style=color:green>"+status.historychecktime+"</b>"; historychecktime.innerHTML = "<b style=color:green>"+status.historychecktime+"</b>";
} }
@ -568,6 +579,51 @@
}); });
}; };
function b_update_geosite(btn)
{
btn.disabled = true;
btn.value = '<%:Checking...%>';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "update_geosite")%>', null, function(x, status) {
if ( x && x.status == 200 ) {
btn.disabled = false;
btn.value = '<%:Check GeoSite Data Update%>';
}
else {
btn.disabled = false;
btn.value = '<%:Check GeoSite Data Update%>';
}
return false;
});
};
function b_flush_fakeip_cache(btn)
{
btn.disabled = true;
btn.value = '<%:Flushing...%> ';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash","flush_fakeip_cache")%>',
null,
function(x,status)
{
if ( x && x.status == 200 ) {
if(status.flush_status == "0" || status.flush_status != "")
{
btn.value = '<%:Flush Failed%>';
}
else
{
btn.value = '<%:Flush Successful%>';
}
}
else {
btn.value = '<%:Flush Timeout%>';
}
}
);
btn.disabled = false;
return false;
};
function b_update_subscribe(btn) function b_update_subscribe(btn)
{ {
btn.disabled = true; btn.disabled = true;
@ -732,7 +788,7 @@
XHR.poll(6, '<%=luci.dispatcher.build_url("admin", "services", "openclash", "startlog")%>', null, function(x, status) { XHR.poll(6, '<%=luci.dispatcher.build_url("admin", "services", "openclash", "startlog")%>', null, function(x, status) {
if ( x && x.status == 200 ) { if ( x && x.status == 200 ) {
if ( status.startlog == "\n" || status.startlog == "" ) { if ( status.startlog == "\n" || status.startlog == "" ) {
var rdmdl=Math.floor(Math.random()*12)+1; var rdmdl=Math.floor(Math.random()*16)+1;
if(rdmdl==1) if(rdmdl==1)
{ {
startlog.innerHTML = '<b><font><%:Tip: You can modify the profile on the profile page (for content that is not taken over)%></font></b>'; startlog.innerHTML = '<b><font><%:Tip: You can modify the profile on the profile page (for content that is not taken over)%></font></b>';
@ -781,6 +837,22 @@
{ {
startlog.innerHTML = '<b><font><%:Tip: you can update the version in the global settings page%></font></b>'; startlog.innerHTML = '<b><font><%:Tip: you can update the version in the global settings page%></font></b>';
} }
if(rdmdl==13)
{
startlog.innerHTML = '<b><font><%:Note: It is not recommended to enable IPv6 and related services for routing. Most of the network connection problems reported so far are related to it%></font></b>';
}
if(rdmdl==14)
{
startlog.innerHTML = '<b><font><%:Note: Turning on secure DNS in the browser will cause abnormal shunting, please be careful to turn it off%></font></b>';
}
if(rdmdl==15)
{
startlog.innerHTML = '<b><font><%:Note: Some software will modify the device HOSTS, which will cause abnormal shunt, please pay attention to check%></font></b>';
}
if(rdmdl==16)
{
startlog.innerHTML = '<b><font><%:Note: The default proxy routes local traffic, BT, PT download, etc., please use redir mode as much as possible and pay attention to traffic avoidance%></font></b>';
}
} }
} }
}); });

View File

@ -3,7 +3,6 @@
.sub_tab{ .sub_tab{
display: inline-block; display: inline-block;
white-space: nowrap; white-space: nowrap;
color: black;
font-size: 12px; font-size: 12px;
text-align: left; text-align: left;
margin-top: 5px; margin-top: 5px;
@ -13,7 +12,6 @@
.sub_tab_show{ .sub_tab_show{
display: inline-block; display: inline-block;
white-space: nowrap; white-space: nowrap;
color: black;
font-size: 12px; font-size: 12px;
margin-top: 5px; margin-top: 5px;
text-align: left; text-align: left;
@ -38,17 +36,11 @@
<script type="text/javascript">//<![CDATA[ <script type="text/javascript">//<![CDATA[
var new_sub_info_get_<%=idname%> = true;
sub_info_get_<%=idname%>(); sub_info_get_<%=idname%>();
function sub_info_get_<%=idname%>() function sub_info_get_<%=idname%>()
{ {
if (document.getElementById('<%=idname%>').innerHTML != "" && ! new_sub_info_get_<%=idname%>) {
clearTimeout(s_<%=idname%>);
return
}
else {
if (localStorage.getItem("<%=filename%>")) { if (localStorage.getItem("<%=filename%>")) {
var save_info = JSON.parse(localStorage.getItem("<%=filename%>")); var save_info = JSON.parse(localStorage.getItem("<%=filename%>"));
document.getElementById('<%=idname%>').className = "sub_tab_show"; document.getElementById('<%=idname%>').className = "sub_tab_show";
@ -58,31 +50,32 @@ function sub_info_get_<%=idname%>()
else { else {
document.getElementById('<%=idname%>').innerHTML = "<%:Plan Traffic%>" + ": " + "<span style=color:green>" + save_info.used + "</span> | <span style=color:green>" + save_info.total + "</span> <br/> <%:Plan Expiration Time%>: " + "<span style=color:green>" + save_info.expire + "</span>"; document.getElementById('<%=idname%>').innerHTML = "<%:Plan Traffic%>" + ": " + "<span style=color:green>" + save_info.used + "</span> | <span style=color:green>" + save_info.total + "</span> <br/> <%:Plan Expiration Time%>: " + "<span style=color:green>" + save_info.expire + "</span>";
} }
}
}; };
if (s_<%=idname%>) { clearTimeout(s_<%=idname%>); };
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "sub_info_get")%>', {filename: "<%=filename%>"}, function(x, status) { XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "sub_info_get")%>', {filename: "<%=filename%>"}, function(x, status) {
if (x && x.status == 200 && status.sub_info != "" && status.sub_info != "No Sub Info Found") { if (x && x.status == 200 && status.sub_info != "" && status.sub_info != "No Sub Info Found") {
localStorage.setItem("<%=filename%>",JSON.stringify(status)); localStorage.setItem("<%=filename%>",JSON.stringify(status));
new_sub_info_get_<%=idname%> = false;
document.getElementById('<%=idname%>').className = "sub_tab_show"; document.getElementById('<%=idname%>').className = "sub_tab_show";
document.getElementById('<%=idname%>').innerHTML = "<%:Plan Traffic%>" + ": " + "<span style=color:green>" + status.used + "</span> | <span style=color:green>" + status.total + "</span> <br/> <%:Plan Expiration Time%>: " + "<span style=color:green>" + status.expire + "</span>"; document.getElementById('<%=idname%>').innerHTML = "<%:Plan Traffic%>" + ": " + "<span style=color:green>" + status.used + "</span> | <span style=color:green>" + status.total + "</span> <br/> <%:Plan Expiration Time%>: " + "<span style=color:green>" + status.expire + "</span>";
} }
else if ( x && x.status == 200 && status.sub_info == "No Sub Info Found" ) { else if ( x && x.status == 200 && status.sub_info == "No Sub Info Found" ) {
localStorage.setItem("<%=filename%>",JSON.stringify(status)); localStorage.setItem("<%=filename%>",JSON.stringify(status));
new_sub_info_get_<%=idname%> = false;
document.getElementById('<%=idname%>').className = "sub_tab_show"; document.getElementById('<%=idname%>').className = "sub_tab_show";
document.getElementById('<%=idname%>').innerHTML = "<span><%:No Sub Info Found%></span>"; document.getElementById('<%=idname%>').innerHTML = "<span><%:No Sub Info Found%></span>";
clearTimeout(s_<%=idname%>);
return
} }
else { else {
if (document.getElementById('<%=idname%>').innerHTML == "") {
document.getElementById('<%=idname%>').className = "sub_tab_show"; document.getElementById('<%=idname%>').className = "sub_tab_show";
document.getElementById('<%=idname%>').innerHTML = "<span style=color:red><%:Sub Info Get Error%></span>"; document.getElementById('<%=idname%>').innerHTML = "<span style=color:red><%:Sub Info Get Error%></span>";
}
var s_<%=idname%> = setTimeout("sub_info_get_<%=idname%>()",1000*120);
return
}; };
}); });
var s_<%=idname%> = setTimeout("sub_info_get_<%=idname%>()",1000*600); var s_<%=idname%> = setTimeout("sub_info_get_<%=idname%>()",1000*1800);
}; };
//]]></script> //]]></script>

View File

@ -47,6 +47,13 @@
</td></tr> </td></tr>
<tr><td width="25%">[TUN] <%:Current Core%></td><td width="25%" align="left" id="CORE_TUN_CV"><%:Collecting data...%></td><td width="25%">[TUN] <%:Latest Core%></td><td width="25%" align="left" id="CORE_TUN_LV"><%:Collecting data...%></td></tr> <tr><td width="25%">[TUN] <%:Current Core%></td><td width="25%" align="left" id="CORE_TUN_CV"><%:Collecting data...%></td><td width="25%">[TUN] <%:Latest Core%></td><td width="25%" align="left" id="CORE_TUN_LV"><%:Collecting data...%></td></tr>
<tr><td width="25%"><%:Update Core%></td><td width="25%" align="left" id="core_tun_up"><%:Collecting data...%></td><td width="25%"><%:Download Latest Core%></td><td width="25%" align="left" id="ma_core_tun_up"><%:Collecting data...%></td></tr> <tr><td width="25%"><%:Update Core%></td><td width="25%" align="left" id="core_tun_up"><%:Collecting data...%></td><td width="25%"><%:Download Latest Core%></td><td width="25%" align="left" id="ma_core_tun_up"><%:Collecting data...%></td></tr>
<tr><td width="100%" colspan="4">
<p align="center">
<b><%:Core path:%>/etc/openclash/core/clash_meta</b>
</p>
</td></tr>
<tr><td width="25%">[Meta] <%:Current Core%></td><td width="25%" align="left" id="CORE_META_CV"><%:Collecting data...%></td><td width="25%">[Meta] <%:Latest Core%></td><td width="25%" align="left" id="CORE_META_LV"><%:Collecting data...%></td></tr>
<tr><td width="25%"><%:Update Core%></td><td width="25%" align="left" id="core_meta_up"><%:Collecting data...%></td><td width="25%"><%:Download Latest Core%></td><td width="25%" align="left" id="ma_core_meta_up"><%:Collecting data...%></td></tr>
</table> </table>
</fieldset> </fieldset>
<fieldset class="cbi-section"> <fieldset class="cbi-section">
@ -95,14 +102,18 @@
var core_lv = document.getElementById('CORE_LV'); var core_lv = document.getElementById('CORE_LV');
var core_tun_cv = document.getElementById('CORE_TUN_CV'); var core_tun_cv = document.getElementById('CORE_TUN_CV');
var core_tun_lv = document.getElementById('CORE_TUN_LV'); var core_tun_lv = document.getElementById('CORE_TUN_LV');
var core_meta_cv = document.getElementById('CORE_META_CV');
var core_meta_lv = document.getElementById('CORE_META_LV');
var op_cv = document.getElementById('OP_CV'); var op_cv = document.getElementById('OP_CV');
var op_lv = document.getElementById('OP_LV'); var op_lv = document.getElementById('OP_LV');
var core_up = document.getElementById('core_up'); var core_up = document.getElementById('core_up');
var core_tun_up = document.getElementById('core_tun_up'); var core_tun_up = document.getElementById('core_tun_up');
var core_meta_up = document.getElementById('core_meta_up');
var op_up = document.getElementById('op_up'); var op_up = document.getElementById('op_up');
var update_tip = document.getElementById('update_tip'); var update_tip = document.getElementById('update_tip');
var ma_core_up = document.getElementById('ma_core_up'); var ma_core_up = document.getElementById('ma_core_up');
var ma_core_tun_up = document.getElementById('ma_core_tun_up'); var ma_core_tun_up = document.getElementById('ma_core_tun_up');
var ma_core_meta_up = document.getElementById('ma_core_meta_up');
var ma_op_up = document.getElementById('ma_op_up'); var ma_op_up = document.getElementById('ma_op_up');
var restore = document.getElementById('restore'); var restore = document.getElementById('restore');
var backup = document.getElementById('backup'); var backup = document.getElementById('backup');
@ -154,10 +165,20 @@
else { else {
core_tun_cv.innerHTML = "<b style=color:red><%:Unknown%></b>"; core_tun_cv.innerHTML = "<b style=color:red><%:Unknown%></b>";
} }
if ( status.coremetacv == "0" ) {
core_meta_cv.innerHTML = "<b><font color=red><%:File Not Exist%></font></b>";
}
else if (status.coremetacv != "") {
core_meta_cv.innerHTML = "<b><font color=green>"+status.coremetacv+"</font></b>";
}
else {
core_meta_cv.innerHTML = "<b><font color=red><%:Unknown%></font></b>";
}
var corelv = status.corelv; var corelv = status.corelv;
var arr_core = corelv.split(","); var arr_core = corelv.split(",");
var corelvis = arr_core[0]; var corelvis = arr_core[0];
var coretunlvis = arr_core[1]; var coretunlvis = arr_core[1];
var coremetalvis = arr_core[2];
if (corelvis != status.corecv && corelvis != "") { if (corelvis != status.corecv && corelvis != "") {
core_lv.innerHTML = "<b style=color:green>"+corelvis+"<%:<New>%></b>"; core_lv.innerHTML = "<b style=color:green>"+corelvis+"<%:<New>%></b>";
} }
@ -176,6 +197,15 @@
else { else {
core_tun_lv.innerHTML = "<b style=color:red><%:Unknown%></b>"; core_tun_lv.innerHTML = "<b style=color:red><%:Unknown%></b>";
} }
if (coremetalvis != status.coremetacv && coremetalvis != "") {
core_meta_lv.innerHTML = "<b><font color=green>"+coremetalvis+"<%:<New>%></font></b>";
}
else if (coremetalvis != "" && coremetalvis == status.coremetacv) {
core_meta_lv.innerHTML = "<b><font color=green>"+coremetalvis+"</font></b>";
}
else {
core_meta_lv.innerHTML = "<b><font color=red><%:Unknown%></font></b>";
}
var oplv = status.oplv; var oplv = status.oplv;
var arr_op = oplv.split(","); var arr_op = oplv.split(",");
var oplvis = arr_op[0]; var oplvis = arr_op[0];
@ -195,9 +225,11 @@
core_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check And Update%>" onclick="return core_update(this,\'Dev\')"/>'; core_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check And Update%>" onclick="return core_update(this,\'Dev\')"/>';
core_tun_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check And Update%>" onclick="return core_update(this,\'TUN\')"/>'; core_tun_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check And Update%>" onclick="return core_update(this,\'TUN\')"/>';
core_meta_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check And Update%>" onclick="return core_update(this,\'Meta\')"/>';
op_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check And Update%>" onclick="return op_update(this)"/>'; op_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Check And Update%>" onclick="return op_update(this)"/>';
ma_core_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Download%>" onclick="return ma_core_update(this,\'Dev\')"/>'; ma_core_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Download%>" onclick="return ma_core_update(this,\'Dev\')"/>';
ma_core_tun_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Download%>" onclick="return ma_core_update(this,\'TUN\')"/>'; ma_core_tun_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Download%>" onclick="return ma_core_update(this,\'TUN\')"/>';
ma_core_meta_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Download%>" onclick="return ma_core_update(this,\'Meta\')"/>';
ma_op_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Download%>" onclick="return ma_op_update(this)"/>'; ma_op_up.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reload" value="<%:Download%>" onclick="return ma_op_update(this)"/>';
restore.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reset" value="<%:Restore Default Config%>" onclick="return restore_config(this)"/>'; restore.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reset" value="<%:Restore Default Config%>" onclick="return restore_config(this)"/>';
one_key_update.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reset" value="<%:One Click Check Update%>" onclick="return all_one_key_update(this)"/>'; one_key_update.innerHTML = '<input type="button" class="btn cbi-button cbi-button-reset" value="<%:One Click Check Update%>" onclick="return all_one_key_update(this)"/>';
@ -260,6 +292,10 @@
alert('<%:Failed to get the latest version. Please try again later!%>') alert('<%:Failed to get the latest version. Please try again later!%>')
} }
} }
if (type == "Meta") {
url4='https://raw.githubusercontent.com/vernesong/OpenClash/'+r+'/core-lateset/meta/clash-'+status.corever+'.tar.gz';
window.location.href=url4;
}
} }
else { else {
alert('<%:No Compiled Version is Selected, Please Select on The Top and Try Again!%>') alert('<%:No Compiled Version is Selected, Please Select on The Top and Try Again!%>')

View File

@ -7,6 +7,7 @@
<option value="rule-provider"><%:Rule Provider File%></option> <option value="rule-provider"><%:Rule Provider File%></option>
<option value="clash">[Dev] <%:Core File%></option> <option value="clash">[Dev] <%:Core File%></option>
<option value="clash_tun">[TUN] <%:Core File%></option> <option value="clash_tun">[TUN] <%:Core File%></option>
<option value="clash_meta">[Meta] <%:Core File%></option>
<option value="backup-file"><%:Backup File%></option> <option value="backup-file"><%:Backup File%></option>
</select> </select>
<input class="cbi-input-file" style="width: 30%" type="file" id="ulfile" name="ulfile" /> <input class="cbi-input-file" style="width: 30%" type="file" id="ulfile" name="ulfile" />

View File

@ -50,9 +50,6 @@ msgstr "第三方规则订阅"
msgid "Dashboard Settings" msgid "Dashboard Settings"
msgstr "外部控制" msgstr "外部控制"
msgid "GEOIP数据库订阅"
msgstr "外部控制"
msgid "Enable" msgid "Enable"
msgstr "启用" msgstr "启用"
@ -432,8 +429,8 @@ msgstr "管理页面映射端口"
msgid "Port For Dashboard Login From Public Network" msgid "Port For Dashboard Login From Public Network"
msgstr "设置映射端口,便于从公网访问时自动登录" msgstr "设置映射端口,便于从公网访问时自动登录"
msgid "GEOIP Update" msgid "GEO Update"
msgstr "GEOIP数据库订阅" msgstr "GEO 数据库订阅"
msgid "Auto Update GEOIP Database" msgid "Auto Update GEOIP Database"
msgstr "自动更新 GEOIP 数据库" msgstr "自动更新 GEOIP 数据库"
@ -441,6 +438,12 @@ msgstr "自动更新GEOIP数据库"
msgid "Update GEOIP Database" msgid "Update GEOIP Database"
msgstr "更新 GEOIP 数据库" msgstr "更新 GEOIP 数据库"
msgid "Auto Update GeoSite Database"
msgstr "自动更新 GeoSite 数据库"
msgid "Update GeoSite Database"
msgstr "更新 GeoSite 数据库"
msgid "Auto Update Chnroute Lists" msgid "Auto Update Chnroute Lists"
msgstr "自动更新大陆白名单" msgstr "自动更新大陆白名单"
@ -1116,7 +1119,7 @@ msgid "Small Flash Memory"
msgstr "小闪存模式" msgstr "小闪存模式"
msgid "Move Core And GEOIP Data File To /tmp/etc/openclash For Small Flash Memory Device" msgid "Move Core And GEOIP Data File To /tmp/etc/openclash For Small Flash Memory Device"
msgstr "针对闪存空间不够的设备移动内核和GEOIP数据库文件到 /tmp/etc/openclash 文件夹" msgstr "针对闪存空间不够的设备,移动内核和 GEOIP 数据库文件到 /tmp/etc/openclash 文件夹"
msgid "Round-robin" msgid "Round-robin"
msgstr "轮询(轮流使用全部代理)" msgstr "轮询(轮流使用全部代理)"
@ -1172,14 +1175,20 @@ msgstr "ConnersHua 规则更新日期"
msgid "Mainland IP Update" msgid "Mainland IP Update"
msgstr "大陆IP白名单 更新日期" msgstr "大陆IP白名单 更新日期"
msgid "Mainland IPv6 Update"
msgstr "大陆IPv6白名单 更新日期"
msgid "lhie1 Rule Update" msgid "lhie1 Rule Update"
msgstr "lhie1 规则更新日期" msgstr "lhie1 规则更新日期"
msgid "ConnersHua Return Rule Update" msgid "ConnersHua Return Rule Update"
msgstr "ConnersHua 回国规则更新日期" msgstr "ConnersHua 回国规则更新日期"
msgid "GEOIPBy MaxMindData Update" msgid "GEOIP Data Update"
msgstr "GEOIPBy MaxMind数据库日期" msgstr "GEOIP 数据库日期"
msgid "GeoSite Data Update"
msgstr "GeoSite 数据库日期"
msgid "No Backup" msgid "No Backup"
msgstr "暂未备份" msgstr "暂未备份"
@ -1226,6 +1235,9 @@ msgstr "第三方规则检查更新"
msgid "Check GEOIP Data Update" msgid "Check GEOIP Data Update"
msgstr "GEOIP 数据库检查更新" msgstr "GEOIP 数据库检查更新"
msgid "Check GeoSite Data Update"
msgstr "GeoSite 数据库检查更新"
msgid "Check and update all Cores and plug-ins?" msgid "Check and update all Cores and plug-ins?"
msgstr "确定要一键检查并更新所有内核及插件吗?" msgstr "确定要一键检查并更新所有内核及插件吗?"
@ -1427,6 +1439,9 @@ msgstr ", 如发生回环死机请尝试启用"
msgid "Custom GEOIP URL" msgid "Custom GEOIP URL"
msgstr "GEOIP 数据库更新URL" msgstr "GEOIP 数据库更新URL"
msgid "Custom GeoSite URL"
msgstr "GeoSite 数据库更新URL"
msgid "Custom Chnroute6 Lists URL" msgid "Custom Chnroute6 Lists URL"
msgstr "大陆IPv6段更新URL" msgstr "大陆IPv6段更新URL"
@ -1436,6 +1451,9 @@ msgstr "大陆IP段更新URL"
msgid "Custom GEOIP Data URL, Click Button Below To Refresh After Edit" msgid "Custom GEOIP Data URL, Click Button Below To Refresh After Edit"
msgstr "自定义 GEOIP 数据库的更新来源,编辑后点击下方按钮生效" msgstr "自定义 GEOIP 数据库的更新来源,编辑后点击下方按钮生效"
msgid "Custom GeoSite Data URL, Click Button Below To Refresh After Edit"
msgstr "自定义 GeoSite 数据库的更新来源,编辑后点击下方按钮生效"
msgid "Custom Chnroute Lists URL, Click Button Below To Refresh After Edit" msgid "Custom Chnroute Lists URL, Click Button Below To Refresh After Edit"
msgstr "自定义大陆IP段的更新来源编辑后点击下方按钮生效" msgstr "自定义大陆IP段的更新来源编辑后点击下方按钮生效"
@ -1730,6 +1748,42 @@ msgstr "大陆IP白名单下载失败请检查网络或稍后再试..."
msgid "Chnroute6 Cidr List Update Error, Please Try Again Later..." msgid "Chnroute6 Cidr List Update Error, Please Try Again Later..."
msgstr "大陆IPv6白名单下载失败请检查网络或稍后再试..." msgstr "大陆IPv6白名单下载失败请检查网络或稍后再试..."
msgid "Start Downloading GeoSite Database..."
msgstr "开始下载 GeoSite 数据库..."
msgid "GeoSite Database Download Success, Check Updated..."
msgstr "GeoSite 数据库下载成功,检查数据库版本是否更新..."
msgid "GeoSite Database Has Been Updated, Starting To Replace The Old Version..."
msgstr "GeoSite 数据库版本有更新,开始替换数据库版本..."
msgid "GeoSite Database Update Successful!"
msgstr "GeoSite 数据库更新成功!"
msgid "Updated GeoSite Database No Change, Do Nothing..."
msgstr "GeoSite 数据库版本没有更新,停止继续操作..."
msgid "GeoSite Database Update Error, Please Try Again Later..."
msgstr "GeoSite 数据库下载失败,请检查网络或稍后再试..."
msgid "Start Downloading GeoIP Dat..."
msgstr "开始下载 GeoIP Dat 数据库..."
msgid "GeoIP Dat Download Success, Check Updated..."
msgstr "GeoIP Dat 数据库下载成功,检查数据库版本是否更新..."
msgid "GeoIP Dat Has Been Updated, Starting To Replace The Old Version..."
msgstr "GeoIP Dat 数据库版本有更新,开始替换数据库版本..."
msgid "GeoIP Dat Update Successful!"
msgstr "GeoIP Dat 数据库更新成功!"
msgid "Updated GeoIP Dat No Change, Do Nothing..."
msgstr "GeoIP Dat 数据库版本没有更新,停止继续操作..."
msgid "GeoIP Dat Update Error, Please Try Again Later..."
msgstr "GeoIP Dat 数据库下载失败,请检查网络或稍后再试..."
msgid "Start Downloading Geoip Database..." msgid "Start Downloading Geoip Database..."
msgstr "开始下载 GEOIP 数据库..." msgstr "开始下载 GEOIP 数据库..."
@ -1743,7 +1797,7 @@ msgid "Geoip Database Update Successful!"
msgstr "GEOIP 数据库更新成功!" msgstr "GEOIP 数据库更新成功!"
msgid "Updated Geoip Database No Change, Do Nothing..." msgid "Updated Geoip Database No Change, Do Nothing..."
msgstr "数据库版本没有更新,停止继续操作..." msgstr "GEOIP 数据库版本没有更新,停止继续操作..."
msgid "Geoip Database Update Error, Please Try Again Later..." msgid "Geoip Database Update Error, Please Try Again Later..."
msgstr "GEOIP 数据库下载失败,请检查网络或稍后再试..." msgstr "GEOIP 数据库下载失败,请检查网络或稍后再试..."
@ -1865,21 +1919,27 @@ msgstr "错误:配置文件格式校验失败..."
msgid "Tip: Detected The Exclusive Function of The TUN Core, Use TUN Core to Start..." msgid "Tip: Detected The Exclusive Function of The TUN Core, Use TUN Core to Start..."
msgstr "提示: 检测到配置了 TUN 内核专属功能,调用 TUN 内核启动..." msgstr "提示: 检测到配置了 TUN 内核专属功能,调用 TUN 内核启动..."
msgid "Tip: Detected The Exclusive Function of The Meta Core, Use Meta Core to Start..."
msgstr "提示: 检测到配置了 Meta 内核专属功能,调用 Meta 内核启动..."
msgid "Tip: No Special Configuration Detected, Use Dev Core to Start..." msgid "Tip: No Special Configuration Detected, Use Dev Core to Start..."
msgstr "提示: 未检测到特殊配置,调用 Dev 内核启动..." msgstr "提示: 未检测到特殊配置,调用 Dev 内核启动..."
msgid "Tip: Detected that the Dev Core is not Installed, Use TUN Core to Start..." msgid "Tip: Detected that the Dev Core is not Installed, Use TUN Core to Start..."
msgstr "提示: 检测到 Dev 内核未安装,调用 TUN 内核启动..." msgstr "提示: 检测到 Dev 内核未安装,调用 TUN 内核启动..."
msgid "Tip: Detected that the Dev Core is not Installed, Use Game Core to Start..." msgid "Tip: Detected that the Dev Core is not Installed, Use Meta Core to Start..."
msgstr "提示: 检测到 Dev 内核未安装,调用 Game 内核启动..." msgstr "提示: 检测到 Dev 内核未安装,调用 Meta 内核启动..."
msgid "Tip: Detected that the Dev Core is not Installed, Use Game Core to Start..."
msgstr "提示: 检测到 Dev 内核未安装,调用 Game 内核启动..."
msgid "Tip: Detected that the GEOIP Database is not Installed, Ready to Download..." msgid "Tip: Detected that the GEOIP Database is not Installed, Ready to Download..."
msgstr "提示: 检测到 GEOIP 数据库文件不存在,准备开始下载..." msgstr "提示: 检测到 GEOIP 数据库文件不存在,准备开始下载..."
msgid "Tip: Detected that the GEOSITE Database is not Installed, Ready to Download..."
msgstr "提示: 检测到 GEOSITE 数据库文件不存在,准备开始下载..."
msgid "Tip: Detected that the GEOIP Dat is not Installed, Ready to Download..."
msgstr "提示: 检测到 GEOIP Dat 数据库文件不存在,准备开始下载..."
msgid "Tip: Detected that the Core is not Installed, Ready to Download..." msgid "Tip: Detected that the Core is not Installed, Ready to Download..."
msgstr "提示: 检测到内核文件不存在,准备开始下载..." msgstr "提示: 检测到内核文件不存在,准备开始下载..."
@ -2030,8 +2090,8 @@ msgstr "游戏代理为测试功能,不保证规则可用性"
msgid "Preparation steps:" msgid "Preparation steps:"
msgstr "准备步骤:" msgstr "准备步骤:"
msgid "1. In the <server and policy group management> page, create the policy group and node you are going to use, and apply the configuration (when adding nodes, you must select the policy group you want to join). Policy group type suggestion: fallback, game nodes must support UDP" msgid "1. In the <server and policy group management> page, create the policy group and node you are going to use, and apply the configuration (when adding nodes, you must select the policy group you want to join). Policy group type suggestion: fallback, game nodes must be support UDP and not a Vmess"
msgstr "1、在《服务器与策略组管理》页面创建您准备使用的策略组和节点并应用配置节点添加时必须选择要加入的策略组策略组类型建议:FallBack游戏节点必须支持UDP" msgstr "1、在《服务器与策略组管理》页面创建您准备使用的策略组和节点并应用配置节点添加时必须选择要加入的策略组策略组类型建议:FallBack游戏节点必须支持UDP且不是Vmess节点"
msgid "2. Click the <manage third party game rules> or <manage third party rule set> button to enter the rule list and download the rules you want to use" msgid "2. Click the <manage third party game rules> or <manage third party rule set> button to enter the rule list and download the rules you want to use"
msgstr "2、点击《管理第三方游戏规则》或者《管理第三方规则集》按钮进入规则列表下载您要使用的规则" msgstr "2、点击《管理第三方游戏规则》或者《管理第三方规则集》按钮进入规则列表下载您要使用的规则"
@ -2057,8 +2117,8 @@ msgstr "如需自定义外部配置文件(订阅转换模板),请按照说明
msgid "If you have a recommended external configuration file (subscription conversion template), you can modify by following The file format of /usr/share/opencrash/res/sub_ini.list and pr" msgid "If you have a recommended external configuration file (subscription conversion template), you can modify by following The file format of /usr/share/opencrash/res/sub_ini.list and pr"
msgstr "如您有值得推荐的外部配置文件(订阅转换模板),可以按照 /usr/share/openclash/res/sub_ini.list 的文件格式修改后提交PR" msgstr "如您有值得推荐的外部配置文件(订阅转换模板),可以按照 /usr/share/openclash/res/sub_ini.list 的文件格式修改后提交PR"
msgid "To restore the default configuration, try accessing:" msgid "Note: To restore the default configuration, try accessing:"
msgstr "如遇到配置丢失或者需要还原默认配置,请尝试访问地址:" msgstr "注意: 如遇到配置丢失或者需要还原默认配置,请尝试访问地址:"
msgid "Take Effect If Fallback DNS Setted, Prevent DNS Pollution" msgid "Take Effect If Fallback DNS Setted, Prevent DNS Pollution"
msgstr "只有在配置文件设置了 Fallback 组的DNS时才会生效正确设置可以有效防止DNS污染" msgstr "只有在配置文件设置了 Fallback 组的DNS时才会生效正确设置可以有效防止DNS污染"
@ -2234,8 +2294,8 @@ msgstr "错误:设置自定义规则失败,"
msgid "Error: Set BT/P2P DIRECT Rules Failed," msgid "Error: Set BT/P2P DIRECT Rules Failed,"
msgstr "错误设置仅代理命中规则流量BT/P2P直连失败" msgstr "错误设置仅代理命中规则流量BT/P2P直连失败"
msgid "Error: Set 198.18.0.1/16 REJECT Rule Failed," msgid "Error: Set Loop Protect Rules Failed,"
msgstr "错误:设置198.18.0.1/16REJECT规则失败," msgstr "错误:设置防回环规则失败,"
msgid "Error: Set lhie1 Rules Failed," msgid "Error: Set lhie1 Rules Failed,"
msgstr "错误设置第三方规则lhie1失败" msgstr "错误设置第三方规则lhie1失败"
@ -2387,8 +2447,8 @@ msgstr "点击更新规则"
msgid "Prefetch Netflix, Disney Plus Domains" msgid "Prefetch Netflix, Disney Plus Domains"
msgstr "实验性:预解析 Netflix、Disney Plus 域名" msgstr "实验性:预解析 Netflix、Disney Plus 域名"
msgid "Prevent Some Devices From Directly Using IP Access To Cause Unlocking Failure" msgid "Prevent Some Devices From Directly Using IP Access To Cause Unlocking Failure, Recommend Use meta Sniffer Function"
msgstr "防止部分设备直接使用IP访问导致DNS解锁失败" msgstr "防止部分设备直接使用IP访问导致DNS解锁失败,建议换用 meta 内核的探测功能"
msgid "Update Preset Domains List" msgid "Update Preset Domains List"
msgstr "更新预置域名列表" msgstr "更新预置域名列表"
@ -2579,11 +2639,11 @@ msgstr "解锁检测失败!开始进行解锁节点自动选择..."
msgid "It Will Be Searched According To The Regex When Auto Search Group Fails" msgid "It Will Be Searched According To The Regex When Auto Search Group Fails"
msgstr "策略组自动获取失败时将会根据正则表达式进行匹配" msgstr "策略组自动获取失败时将会根据正则表达式进行匹配"
msgid "It Will Be Selected Region According To The Regex" msgid "It Will Be Selected Region(Country Shortcode) According To The Regex"
msgstr "解锁区域将会根据正则表达式进行匹配" msgstr "解锁区域(国家简码)将会根据正则表达式进行匹配"
msgid "It Will Be Selected Nodes According To The Regex" msgid "It Will Be Selected Nodes According To The Regex"
msgstr "解锁节点将会根据正则表达式进行匹配" msgstr "解锁节点的名字将会根据正则表达式进行匹配"
msgid "not support unlock!" msgid "not support unlock!"
msgstr "不支持解锁!" msgstr "不支持解锁!"
@ -2749,3 +2809,90 @@ msgstr "仅支持规则Rule模式其他模式默认分流禁用后
msgid "Error: Set Router Self Proxy Rule Failed," msgid "Error: Set Router Self Proxy Rule Failed,"
msgstr "错误:修改路由自身代理规则失败," msgstr "错误:修改路由自身代理规则失败,"
msgid "Error: Streaming Unlock Now Disabled, Need Start From Luci Page, Exiting..."
msgstr "错误流媒体解锁处于禁用状态请在LUCI界面启用退出..."
msgid "Error: Streaming Unlock Has No Parameter of Type, Exiting..."
msgstr "错误:流媒体解锁没有指定需要检测的流媒体类型,退出..."
msgid "Error: Streaming Unlock Could not Work Because of Router-Self Proxy Disabled, Exiting..."
msgstr "错误:因为禁用了代理路由器自身流量,流媒体解锁无法工作,退出..."
msgid "Error: Multiple Scripts Running, Exiting..."
msgstr "错误:多个脚本运行中,退出..."
msgid "Error: Streaming DNS Prefetch Could not Work Because of Router-Self Proxy Disabled, Exiting..."
msgstr "错误:因为禁用了代理路由器自身流量,预解析无法工作,退出..."
msgid "Enable Meta Core"
msgstr "使用 Meta 内核"
msgid "Some Premium Core Features are Unavailable, For Other More Useful Functions Go Wiki:"
msgstr "Meta 内核还未支持 Premium 内核的全部功能要了解其独有功能请前往Wiki:"
msgid "Enable Sniffer"
msgstr "*启用流量(域名)探测"
msgid "Sniffer Will Prevent Domain Name Proxy and DNS Hijack Failure"
msgstr "流量域名探测能有效防止域名分流异常和DNS劫持失败"
msgid "Force Sniffer"
msgstr "强制流量(域名)探测"
msgid "Override All Dns Query"
msgstr "启用后将尽可能的覆盖DNS查询到的域名"
msgid "(Support Vless By Pinyun)"
msgstr "(由品云提供,支持 Vless)"
msgid "Meta Settings"
msgstr "Meta 设置"
msgid "Geodata Loader Mode"
msgstr "Geodata 数据加载方式"
msgid "Memconservative"
msgstr "小内存模式"
msgid "Standard"
msgstr "标准模式"
msgid "Enable GeoIP Dat"
msgstr "启用 GeoIP Dat 版数据库"
msgid "Replace GEOIP MMDB With GEOIP Dat, Large Size File, Need Download First"
msgstr "使用 Geoip Dat 替换 GEOIP MMDB 数据库, 文件体积较大且无内置,启动后会自动下载"
msgid "Auto Update GeoIP Dat"
msgstr "自动更新 GeoIP Dat 数据库"
msgid "Custom GeoIP Dat URL"
msgstr "GeoIP Dat 数据库更新URL"
msgid "Custom GeoIP Dat URL, Click Button Below To Refresh After Edit"
msgstr "自定义 GeoIP Dat 数据库的更新来源,编辑后点击下方按钮生效"
msgid "Update GeoIP Dat"
msgstr "更新 GeoIP Dat 数据库"
msgid "Note: It is not recommended to enable IPv6 and related services for routing. Most of the network connection problems reported so far are related to it"
msgstr "注意: 路由不建议开启 IPV6 和相关服务,目前反馈的网络连接问题多数与它有关"
msgid "Note: Turning on secure DNS in the browser will cause abnormal shunting, please be careful to turn it off"
msgstr "注意: 浏览器开启安全 DNS会导致分流异常请注意关闭"
msgid "Note: Some software will modify the device HOSTS, which will cause abnormal shunt, please pay attention to check"
msgstr "注意: 部分软件会修改设备 HOSTS会导致分流异常请注意检查"
msgid "Note: The default proxy routes local traffic, BT, PT download, etc., please use redir mode as much as possible and pay attention to traffic avoidance"
msgstr "注意: 默认代理路由本机流量BT、PT 下载等请尽量使用 redir 模式并注意进行流量规避"
msgid "Note: Game proxy please use nodes except Vmess"
msgstr "注意: 游戏代理请使用 Vmess 以外的节点"
msgid "Note: If the connection is abnormal, please follow the steps on this page to check first"
msgstr "注意: 连接异常时请按照此页步骤先进行检查"
msgid "Click to the page"
msgstr "点击前往"

View File

@ -53,7 +53,10 @@ config openclash 'config'
option delay_start '0' option delay_start '0'
option router_self_proxy '1' option router_self_proxy '1'
option release_branch 'master' option release_branch 'master'
option enable_meta_core '0'
option geo_custom_url 'https://cdn.jsdelivr.net/gh/alecthw/mmdb_china_ip_list@release/lite/Country.mmdb' option geo_custom_url 'https://cdn.jsdelivr.net/gh/alecthw/mmdb_china_ip_list@release/lite/Country.mmdb'
option geosite_custom_url 'https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat'
option geoip_custom_url 'https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat'
option chnr_custom_url 'https://ispip.clang.cn/all_cn.txt' option chnr_custom_url 'https://ispip.clang.cn/all_cn.txt'
option chnr6_custom_url 'https://ispip.clang.cn/all_cn_ipv6.txt' option chnr6_custom_url 'https://ispip.clang.cn/all_cn_ipv6.txt'

View File

@ -52,6 +52,12 @@ add_cron()
[ -z "$(grep "openclash_ipdb.sh" "$CRON_FILE" 2>/dev/null)" ] && { [ -z "$(grep "openclash_ipdb.sh" "$CRON_FILE" 2>/dev/null)" ] && {
[ "$(uci -q get openclash.config.geo_auto_update)" -eq 1 ] && echo "0 $(uci -q get openclash.config.geo_update_day_time) * * $(uci -q get openclash.config.geo_update_week_time) /usr/share/openclash/openclash_ipdb.sh" >> $CRON_FILE [ "$(uci -q get openclash.config.geo_auto_update)" -eq 1 ] && echo "0 $(uci -q get openclash.config.geo_update_day_time) * * $(uci -q get openclash.config.geo_update_week_time) /usr/share/openclash/openclash_ipdb.sh" >> $CRON_FILE
} }
[ -z "$(grep "openclash_geosite.sh" "$CRON_FILE" 2>/dev/null)" ] && {
[ "$(uci -q get openclash.config.geosite_auto_update)" -eq 1 ] && echo "0 $(uci -q get openclash.config.geosite_update_day_time) * * $(uci -q get openclash.config.geosite_update_week_time) /usr/share/openclash/openclash_geosite.sh" >> $CRON_FILE
}
[ -z "$(grep "openclash_geoip.sh" "$CRON_FILE" 2>/dev/null)" ] && {
[ "$(uci -q get openclash.config.geoip_auto_update)" -eq 1 ] && echo "0 $(uci -q get openclash.config.geoip_update_day_time) * * $(uci -q get openclash.config.geoip_update_week_time) /usr/share/openclash/openclash_geoip.sh" >> $CRON_FILE
}
[ -z "$(grep "openclash_chnroute.sh" "$CRON_FILE" 2>/dev/null)" ] && { [ -z "$(grep "openclash_chnroute.sh" "$CRON_FILE" 2>/dev/null)" ] && {
[ "$(uci -q get openclash.config.chnr_auto_update)" -eq 1 ] && echo "0 $(uci -q get openclash.config.chnr_update_day_time) * * $(uci -q get openclash.config.chnr_update_week_time) /usr/share/openclash/openclash_chnroute.sh" >> $CRON_FILE [ "$(uci -q get openclash.config.chnr_auto_update)" -eq 1 ] && echo "0 $(uci -q get openclash.config.chnr_update_day_time) * * $(uci -q get openclash.config.chnr_update_week_time) /usr/share/openclash/openclash_chnroute.sh" >> $CRON_FILE
} }
@ -67,6 +73,8 @@ del_cron()
sed -i '/openclash.sh/d' $CRON_FILE 2>/dev/null sed -i '/openclash.sh/d' $CRON_FILE 2>/dev/null
sed -i '/openclash_rule.sh/d' $CRON_FILE 2>/dev/null sed -i '/openclash_rule.sh/d' $CRON_FILE 2>/dev/null
sed -i '/openclash_ipdb.sh/d' $CRON_FILE 2>/dev/null sed -i '/openclash_ipdb.sh/d' $CRON_FILE 2>/dev/null
sed -i '/openclash_geoip.sh/d' $CRON_FILE 2>/dev/null
sed -i '/openclash_geosite.sh/d' $CRON_FILE 2>/dev/null
sed -i '/openclash_chnroute.sh/d' $CRON_FILE 2>/dev/null sed -i '/openclash_chnroute.sh/d' $CRON_FILE 2>/dev/null
sed -i '/\/etc\/init.d\/openclash/d' $CRON_FILE 2>/dev/null sed -i '/\/etc\/init.d\/openclash/d' $CRON_FILE 2>/dev/null
/etc/init.d/cron restart /etc/init.d/cron restart
@ -191,6 +199,7 @@ kill_clash()
for clash_pid in $clash_pids; do for clash_pid in $clash_pids; do
kill -9 "$clash_pid" 2>/dev/null kill -9 "$clash_pid" 2>/dev/null
done >/dev/null 2>&1 done >/dev/null 2>&1
sleep 1
} }
start_fail() start_fail()
@ -1153,7 +1162,7 @@ yml_other_rules_get()
check_run_quick() check_run_quick()
{ {
quick_start=true quick_start=true
check_file="$RAW_CONFIG_FILE /etc/openclash/custom/openclash_custom_domain_dns.list /etc/openclash/custom/openclash_custom_domain_dns_policy.list /etc/openclash/custom/openclash_custom_fake_filter.list /etc/openclash/custom/openclash_custom_fallback_filter.yaml /etc/openclash/custom/openclash_custom_hosts.list /etc/openclash/custom/openclash_custom_rules.list /etc/openclash/custom/openclash_custom_rules_2.list $dev_core_path $tun_core_path $geoip_path $chnr_path $chnr6_path /usr/share/openclash/res/ConnersHua.yaml /usr/share/openclash/res/ConnersHua_return.yaml /usr/share/openclash/res/lhie1.yaml /usr/share/openclash/res/openclash_version /tmp/openclash_fake_filter.list" check_file="$RAW_CONFIG_FILE /etc/openclash/custom/openclash_custom_domain_dns.list /etc/openclash/custom/openclash_custom_domain_dns_policy.list /etc/openclash/custom/openclash_custom_fake_filter.list /etc/openclash/custom/openclash_custom_fallback_filter.yaml /etc/openclash/custom/openclash_custom_hosts.list /etc/openclash/custom/openclash_custom_rules.list /etc/openclash/custom/openclash_custom_rules_2.list $dev_core_path $tun_core_path $meta_core_path $ipdb_path $geosite_path $geoip_path $chnr_path $chnr6_path /usr/share/openclash/res/ConnersHua.yaml /usr/share/openclash/res/ConnersHua_return.yaml /usr/share/openclash/res/lhie1.yaml /usr/share/openclash/res/openclash_version /tmp/openclash_fake_filter.list"
if [ ! -f "$CONFIG_FILE" ] || [ ! -f "/tmp/openclash_config.tmp" ] || [ ! -f "/tmp/openclash.change" ]; then if [ ! -f "$CONFIG_FILE" ] || [ ! -f "/tmp/openclash_config.tmp" ] || [ ! -f "/tmp/openclash.change" ]; then
quick_start=false quick_start=false
return return
@ -1240,12 +1249,17 @@ do_run_file()
if [ "$small_flash_memory" != "1" ]; then if [ "$small_flash_memory" != "1" ]; then
dev_core_path="/etc/openclash/core/clash" dev_core_path="/etc/openclash/core/clash"
tun_core_path="/etc/openclash/core/clash_tun" tun_core_path="/etc/openclash/core/clash_tun"
geoip_path="/etc/openclash/Country.mmdb" meta_core_path="/etc/openclash/core/clash_meta"
ipdb_path="/etc/openclash/Country.mmdb"
chnr_path="/etc/openclash/china_ip_route.ipset" chnr_path="/etc/openclash/china_ip_route.ipset"
chnr6_path="/etc/openclash/china_ip6_route.ipset" chnr6_path="/etc/openclash/china_ip6_route.ipset"
mv "/tmp/etc/openclash/Country.mmdb" "$geoip_path" 2>/dev/null geosite_path="/etc/openclash/GeoSite.dat"
geoip_path="/etc/openclash/GeoIP.dat"
mv "/tmp/etc/openclash/Country.mmdb" "$ipdb_path" 2>/dev/null
mv "/tmp/etc/openclash/china_ip_route.ipset" "$chnr_path" 2>/dev/null mv "/tmp/etc/openclash/china_ip_route.ipset" "$chnr_path" 2>/dev/null
mv "/tmp/etc/openclash/china_ip6_route.ipset" "$chnr6_path" 2>/dev/null mv "/tmp/etc/openclash/china_ip6_route.ipset" "$chnr6_path" 2>/dev/null
mv "/tmp/etc/openclash/GeoSite.dat" "$geosite_path" 2>/dev/null
mv "/tmp/etc/openclash/GeoIP.dat" "$geoip_path" 2>/dev/null
mv "/tmp/etc/openclash/core/" "/etc/openclash" 2>/dev/null mv "/tmp/etc/openclash/core/" "/etc/openclash" 2>/dev/null
if [ "$CACHE_PATH" != "/tmp/etc/openclash/cache.db" ]; then if [ "$CACHE_PATH" != "/tmp/etc/openclash/cache.db" ]; then
rm -rf "/tmp/etc/openclash" 2>/dev/null rm -rf "/tmp/etc/openclash" 2>/dev/null
@ -1253,18 +1267,24 @@ do_run_file()
else else
dev_core_path="/tmp/etc/openclash/core/clash" dev_core_path="/tmp/etc/openclash/core/clash"
tun_core_path="/tmp/etc/openclash/core/clash_tun" tun_core_path="/tmp/etc/openclash/core/clash_tun"
geoip_path="/tmp/etc/openclash/Country.mmdb" meta_core_path="/tmp/etc/openclash/core/clash_meta"
ipdb_path="/tmp/etc/openclash/Country.mmdb"
chnr_path="/tmp/etc/openclash/china_ip_route.ipset" chnr_path="/tmp/etc/openclash/china_ip_route.ipset"
chnr6_path="/tmp/etc/openclash/china_ip6_route.ipset" chnr6_path="/tmp/etc/openclash/china_ip6_route.ipset"
[ ! -h "/etc/openclash/Country.mmdb" ] && mv "/etc/openclash/Country.mmdb" "$geoip_path" 2>/dev/null geosite_path="/tmp/etc/openclash/GeoSite.dat"
geoip_path="/tmp/etc/openclash/GeoIP.dat"
[ ! -h "/etc/openclash/Country.mmdb" ] && mv "/etc/openclash/Country.mmdb" "$ipdb_path" 2>/dev/null
[ ! -h "/etc/openclash/china_ip_route.ipset" ] && mv "/etc/openclash/china_ip_route.ipset" "$chnr_path" 2>/dev/null [ ! -h "/etc/openclash/china_ip_route.ipset" ] && mv "/etc/openclash/china_ip_route.ipset" "$chnr_path" 2>/dev/null
[ ! -h "/etc/openclash/china_ip6_route.ipset" ] && mv "/etc/openclash/china_ip6_route.ipset" "$chnr6_path" 2>/dev/null [ ! -h "/etc/openclash/china_ip6_route.ipset" ] && mv "/etc/openclash/china_ip6_route.ipset" "$chnr6_path" 2>/dev/null
[ ! -h "/etc/openclash/GeoSite.dat" ] && mv "/etc/openclash/GeoSite.dat" "$geosite_path" 2>/dev/null
[ ! -h "/etc/openclash/GeoIP.dat" ] && mv "/etc/openclash/GeoIP.dat" "$geoip_path" 2>/dev/null
mv "/etc/openclash/core/" "/tmp/etc/openclash" 2>/dev/null mv "/etc/openclash/core/" "/tmp/etc/openclash" 2>/dev/null
fi fi
rm -rf "/etc/openclash/cache.db" 2>/dev/null rm -rf "/etc/openclash/cache.db" 2>/dev/null
rm -rf "/etc/openclash/clash" 2>/dev/null rm -rf "/etc/openclash/clash" 2>/dev/null
if [ "$enable_meta_core" != "1" ]; then
if [ -n "$en_mode_tun" ]; then if [ -n "$en_mode_tun" ]; then
ln -s "$tun_core_path" /etc/openclash/clash 2>/dev/null ln -s "$tun_core_path" /etc/openclash/clash 2>/dev/null
core_type="TUN" core_type="TUN"
@ -1287,30 +1307,42 @@ do_run_file()
if [ "$proxy_mode" = "script" ] || [ "$config_set_custom_rule_provider" -eq 1 ] || [ "$rule_name" = "ConnersHua" ] || [ "$rule_name" = "lhie1" ] || [ -n "$(ruby_read "$RAW_CONFIG_FILE" "['rules'].grep(/(^RULE-SET,|^SCRIPT,)/)")" ] || [ -n "$(ruby_read "/etc/openclash/custom/openclash_custom_rules.list" "['rules'].grep(/(^RULE-SET,|^SCRIPT,)/)")" ] || [ -n "$(ruby_read "/etc/openclash/custom/openclash_custom_rules_2.list" "['rules'].grep(/(^RULE-SET,|^SCRIPT,)/)")" ]; then if [ "$proxy_mode" = "script" ] || [ "$config_set_custom_rule_provider" -eq 1 ] || [ "$rule_name" = "ConnersHua" ] || [ "$rule_name" = "lhie1" ] || [ -n "$(ruby_read "$RAW_CONFIG_FILE" "['rules'].grep(/(^RULE-SET,|^SCRIPT,)/)")" ] || [ -n "$(ruby_read "/etc/openclash/custom/openclash_custom_rules.list" "['rules'].grep(/(^RULE-SET,|^SCRIPT,)/)")" ] || [ -n "$(ruby_read "/etc/openclash/custom/openclash_custom_rules_2.list" "['rules'].grep(/(^RULE-SET,|^SCRIPT,)/)")" ]; then
if [ -z "$en_mode_tun" ]; then if [ -z "$en_mode_tun" ]; then
rm -rf "/etc/openclash/clash"
ln -s "$tun_core_path" /etc/openclash/clash 2>/dev/null ln -s "$tun_core_path" /etc/openclash/clash 2>/dev/null
core_type="TUN" core_type="TUN"
core_start_log="Tip: Detected The Exclusive Function of The TUN Core, Use TUN Core to Start..." core_start_log="Tip: Detected The Exclusive Function of The TUN Core, Use TUN Core to Start..."
fi fi
fi fi
else
ln -s "$meta_core_path" /etc/openclash/clash 2>/dev/null
core_type="Meta"
core_start_log="Tip: Detected The Exclusive Function of The Meta Core, Use Meta Core to Start..."
fi
if [ ! -f "/etc/openclash/clash" ] && [ -f "$dev_core_path" ] && [ -z "$core_type" ]; then if [ ! -f "/etc/openclash/clash" ] && [ -f "$dev_core_path" ] && [ -z "$core_type" ]; then
ln -s "$dev_core_path" /etc/openclash/clash 2>/dev/null ln -s "$dev_core_path" /etc/openclash/clash 2>/dev/null
core_start_log="Tip: No Special Configuration Detected, Use Dev Core to Start..." core_start_log="Tip: No Special Configuration Detected, Use Dev Core to Start..."
fi fi
if [ ! -f "/etc/openclash/clash" ] && [ -f "$tun_core_path" ]; then if [ ! -f "/etc/openclash/clash" ] && [ -f "$tun_core_path" ] && [ -z "$core_type" ]; then
ln -s "$tun_core_path" /etc/openclash/clash 2>/dev/null ln -s "$tun_core_path" /etc/openclash/clash 2>/dev/null
core_type="TUN" core_type="TUN"
core_start_log="Tip: Detected that the Dev Core is not Installed, Use TUN Core to Start..." core_start_log="Tip: Detected that the Dev Core is not Installed, Use TUN Core to Start..."
fi fi
if [ ! -f "/etc/openclash/clash" ] && [ -f "$meta_core_path" ] && [ -z "$core_type" ]; then
ln -s "$meta_core_path" /etc/openclash/clash 2>/dev/null
core_type="Meta"
core_start_log="Tip: Detected that the Dev Core is not Installed, Use Meta Core to Start..."
fi
[ ! -f "$CLASH" ] && { [ ! -f "$CLASH" ] && {
LOG_OUT "Tip: Detected that the Core is not Installed, Ready to Download..." LOG_OUT "Tip: Detected that the Core is not Installed, Ready to Download..."
rm -rf "/tmp/clash_last_version" rm -rf "/tmp/clash_last_version"
/usr/share/openclash/openclash_core.sh "$core_type" /usr/share/openclash/openclash_core.sh "$core_type"
if [ "$core_type" == "TUN" ] && [ ! -f "$tun_core_path" ]; then if [ "$core_type" == "TUN" ] && [ ! -f "$tun_core_path" ]; then
start_fail start_fail
elif [ "$core_type" == "Meta" ] && [ ! -f "$meta_core_path" ]; then
start_fail
elif [ -z "$core_type" ] && [ ! -f "$dev_core_path" ]; then elif [ -z "$core_type" ] && [ ! -f "$dev_core_path" ]; then
start_fail start_fail
else else
@ -1320,11 +1352,21 @@ do_run_file()
fi fi
} }
[ ! -f "$geoip_path" ] && { [ ! -f "$ipdb_path" ] && {
LOG_OUT "Tip: Detected that the GEOIP Database is not Installed, Ready to Download..." LOG_OUT "Tip: Detected that the GEOIP Database is not Installed, Ready to Download..."
/usr/share/openclash/openclash_ipdb.sh /usr/share/openclash/openclash_ipdb.sh
} }
[ ! -f "$geosite_path" ] && {
LOG_OUT "Tip: Detected that the GEOSITE Database is not Installed, Ready to Download..."
/usr/share/openclash/openclash_geosite.sh
}
[ ! -f "$geoip_path" ] && [ "$enable_geoip_dat" == "1" ] && {
LOG_OUT "Tip: Detected that the GEOIP Dat is not Installed, Ready to Download..."
/usr/share/openclash/openclash_geoip.sh
}
if [ "$china_ip_route" = "1" ] || [ "$china_ip6_route" = "1" ] || [ "$disable_udp_quic" = "1" ]; then if [ "$china_ip_route" = "1" ] || [ "$china_ip6_route" = "1" ] || [ "$disable_udp_quic" = "1" ]; then
if [ ! -f "$chnr_path" ] || [ ! -f "$chnr6_path" ]; then if [ ! -f "$chnr_path" ] || [ ! -f "$chnr6_path" ]; then
LOG_OUT "Tip: Detected that the Chnroute Cidr List is not Installed, Ready to Download..." LOG_OUT "Tip: Detected that the Chnroute Cidr List is not Installed, Ready to Download..."
@ -1332,12 +1374,17 @@ do_run_file()
fi fi
fi fi
if [ ! -f "$chnr_path" ] || [ ! -f "$chnr6_path" ] || [ ! -f "$geoip_path" ]; then if [ ! -f "$chnr_path" ] || [ ! -f "$chnr6_path" ] || [ ! -f "$ipdb_path" ] || [ ! -f "$geosite_path" ]; then
start_fail
fi
if [ "$enable_geoip_dat" == "1" ] && [ ! -f "$geoip_path" ]; then
start_fail start_fail
fi fi
[ ! -x "$tun_core_path" ] && chmod 4755 "$tun_core_path" 2>/dev/null [ ! -x "$tun_core_path" ] && chmod 4755 "$tun_core_path" 2>/dev/null
[ ! -x "$dev_core_path" ] && chmod 4755 "$dev_core_path" 2>/dev/null [ ! -x "$dev_core_path" ] && chmod 4755 "$dev_core_path" 2>/dev/null
[ ! -x "$meta_core_path" ] && chmod 4755 "$meta_core_path" 2>/dev/null
#fake_ip_filter #fake_ip_filter
if [ "$3" = "fake-ip" ]; then if [ "$3" = "fake-ip" ]; then
@ -1350,8 +1397,16 @@ do_run_file()
fi fi
fi fi
[ -f "$ipdb_path" ] && [ "$small_flash_memory" = "1" ] && {
ln -s "$ipdb_path" /etc/openclash/Country.mmdb 2>/dev/null
}
[ -f "$geosite_path" ] && [ "$small_flash_memory" = "1" ] && {
ln -s "$geosite_path" /etc/openclash/GeoSite.dat 2>/dev/null
}
[ -f "$geoip_path" ] && [ "$small_flash_memory" = "1" ] && { [ -f "$geoip_path" ] && [ "$small_flash_memory" = "1" ] && {
ln -s "$geoip_path" /etc/openclash/Country.mmdb 2>/dev/null ln -s "$geoip_path" /etc/openclash/GeoIP.dat 2>/dev/null
} }
[ -f "$chnr_path" ] && [ "$small_flash_memory" = "1" ] && { [ -f "$chnr_path" ] && [ "$small_flash_memory" = "1" ] && {
@ -1450,7 +1505,7 @@ start_run_core()
rm -rf "$TMP_CONFIG_FILE" 2>/dev/null rm -rf "$TMP_CONFIG_FILE" 2>/dev/null
fi fi
config_reload=$(uci -q get openclash.config.config_reload) config_reload=$(uci -q get openclash.config.config_reload)
if [ -n "$(pidof clash)" ] && [ "$core_type" != "TUN" ] && [ "$config_reload" != "0" ]; then if [ -n "$(pidof clash)" ] && [ "$core_type" != "TUN" ] && [ "$core_type" != "Meta" ] && [ "$config_reload" != "0" ]; then
curl -s --connect-timeout 5 -m 5 -H 'Content-Type: application/json' -H "Authorization: Bearer ${da_password}" -XPUT http://"$lan_ip":"$cn_port"/configs -d "{\"path\": \"$CONFIG_FILE\"}" 2>/dev/null curl -s --connect-timeout 5 -m 5 -H 'Content-Type: application/json' -H "Authorization: Bearer ${da_password}" -XPUT http://"$lan_ip":"$cn_port"/configs -d "{\"path\": \"$CONFIG_FILE\"}" 2>/dev/null
else else
kill_clash kill_clash
@ -2029,6 +2084,10 @@ if [ -n "$en_mode_tun" ]; then
ip route replace default dev utun table "$PROXY_ROUTE_TABLE" ip route replace default dev utun table "$PROXY_ROUTE_TABLE"
ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE"
if [ "$enable_meta_core" == "1" ]; then
route add -net 198.18.0.0/16 dev utun
fi
#设置防火墙 #设置防火墙
if [ "$en_mode" = "fake-ip" ]; then if [ "$en_mode" = "fake-ip" ]; then
iptables -t mangle -N openclash_output iptables -t mangle -N openclash_output
@ -2288,7 +2347,7 @@ get_config()
http_port=$(uci -q get openclash.config.http_port) http_port=$(uci -q get openclash.config.http_port)
socks_port=$(uci -q get openclash.config.socks_port) socks_port=$(uci -q get openclash.config.socks_port)
enable_redirect_dns=$(uci -q get openclash.config.enable_redirect_dns) enable_redirect_dns=$(uci -q get openclash.config.enable_redirect_dns)
lan_ip=$(uci -q get network.lan.ipaddr |awk -F '/' '{print $1}' 2>/dev/null || ip addr show 2>/dev/null | grep -w 'inet' | grep 'global' | grep 'brd' | grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | head -n 1) lan_ip=$(uci -q get network.lan.ipaddr |awk -F '/' '{print $1}' 2>/dev/null || ip address show $(uci -q -p /tmp/state get network.lan.ifname) | grep -w "inet" 2>/dev/null |grep -Eo 'inet [0-9\.]+' | awk '{print $2}' || ip addr show 2>/dev/null | grep -w 'inet' | grep 'global' | grep 'brd' | grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | head -n 1)
lan_ip_cidrs=$(ip route | grep "/" | awk '{print $1}' | grep -vE "^198.18" 2>/dev/null) lan_ip_cidrs=$(ip route | grep "/" | awk '{print $1}' | grep -vE "^198.18" 2>/dev/null)
wan_ip4s=$(ifconfig | grep 'inet addr' | awk '{print $2}' | cut -d: -f2 | grep -vE "(^198.18|^192.168|^127.0)" 2>/dev/null) wan_ip4s=$(ifconfig | grep 'inet addr' | awk '{print $2}' | cut -d: -f2 | grep -vE "(^198.18|^192.168|^127.0)" 2>/dev/null)
wan_ip6s=$(ifconfig | grep 'inet6 addr' | awk '{print $3}' 2>/dev/null) wan_ip6s=$(ifconfig | grep 'inet6 addr' | awk '{print $3}' 2>/dev/null)
@ -2318,6 +2377,11 @@ get_config()
core_version=$(uci -q get openclash.config.core_version || echo 0) core_version=$(uci -q get openclash.config.core_version || echo 0)
github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0) github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0)
router_self_proxy=$(uci -q get openclash.config.router_self_proxy || echo 1) router_self_proxy=$(uci -q get openclash.config.router_self_proxy || echo 1)
enable_meta_core=$(uci -q get openclash.config.enable_meta_core || echo 0)
enable_meta_sniffer=$(uci -q get openclash.config.enable_meta_sniffer || echo 0)
enable_meta_sniffer_force=$(uci -q get openclash.config.enable_meta_sniffer_force || echo 0)
geodata_loader=$(uci -q get openclash.config.geodata_loader || echo "memconservative")
enable_geoip_dat=$(uci -q get openclash.config.enable_geoip_dat || echo 0)
_koolshare=$(cat /usr/lib/os-release 2>/dev/null |grep OPENWRT_RELEASE 2>/dev/null |grep -i koolshare 2>/dev/null) _koolshare=$(cat /usr/lib/os-release 2>/dev/null |grep OPENWRT_RELEASE 2>/dev/null |grep -i koolshare 2>/dev/null)
[ -z "$dns_port" ] && dns_port=7874 && uci -q set openclash.config.dns_port=7874 [ -z "$dns_port" ] && dns_port=7874 && uci -q set openclash.config.dns_port=7874
uci -q set openclash.config.restricted_mode=0 && uci -q commit openclash uci -q set openclash.config.restricted_mode=0 && uci -q commit openclash
@ -2350,8 +2414,8 @@ start()
config_foreach yml_auth_get "authentication" config_foreach yml_auth_get "authentication"
yml_auth_custom "$TMP_CONFIG_FILE" yml_auth_custom "$TMP_CONFIG_FILE"
yml_dns_custom "$enable_custom_dns" "$TMP_CONFIG_FILE" "$append_wan_dns" "$ipv6_dns" yml_dns_custom "$enable_custom_dns" "$TMP_CONFIG_FILE" "$append_wan_dns" "$ipv6_dns"
/usr/share/openclash/yml_change.sh 2>/dev/null "$en_mode" "$da_password" "$cn_port" "$proxy_port" "$TMP_CONFIG_FILE" "$ipv6_enable" "$http_port" "$socks_port" "$log_level" "$proxy_mode" "$en_mode_tun" "$stack_type" "$dns_port" "$mixed_port" "$tproxy_port" "$ipv6_dns" "$store_fakeip" "$stream_domains_prefetch" "$dns_remote" /usr/share/openclash/yml_change.sh 2>/dev/null "$en_mode" "$da_password" "$cn_port" "$proxy_port" "$TMP_CONFIG_FILE" "$ipv6_enable" "$http_port" "$socks_port" "$log_level" "$proxy_mode" "$en_mode_tun" "$stack_type" "$dns_port" "$mixed_port" "$tproxy_port" "$ipv6_dns" "$store_fakeip" "$stream_domains_prefetch" "$dns_remote" "$enable_meta_core" "$enable_meta_sniffer" "$enable_meta_sniffer_force" "$enable_geoip_dat" "$geodata_loader"
/usr/share/openclash/yml_rules_change.sh 2>/dev/null "$rule_source" "$enable_custom_clash_rules" "$TMP_CONFIG_FILE" "$enable_rule_proxy" "$CONFIG_NAME" "$router_self_proxy" "$lan_ip" /usr/share/openclash/yml_rules_change.sh 2>/dev/null "$rule_source" "$enable_custom_clash_rules" "$TMP_CONFIG_FILE" "$enable_rule_proxy" "$CONFIG_NAME" "$router_self_proxy" "$lan_ip" "$proxy_port" "$tproxy_port"
yml_custom_rule_provider "$TMP_CONFIG_FILE" yml_custom_rule_provider "$TMP_CONFIG_FILE"
yml_game_custom "$TMP_CONFIG_FILE" yml_game_custom "$TMP_CONFIG_FILE"
yml_provider_path "$TMP_CONFIG_FILE" "proxy-providers" "proxy_provider" "$github_address_mod" yml_provider_path "$TMP_CONFIG_FILE" "proxy-providers" "proxy_provider" "$github_address_mod"

File diff suppressed because one or more lines are too long

View File

@ -33,27 +33,6 @@ cat > "/lib/upgrade/keep.d/luci-app-openclash" <<-EOF
/etc/openclash/ /etc/openclash/
EOF EOF
if [ -f "/tmp/openclash.bak" ]; then
mv -f "/tmp/openclash.bak" "/etc/config/openclash" >/dev/null 2>&1
cp -rf "/tmp/openclash/." "/etc/openclash/" >/dev/null 2>&1
cp -rf "/tmp/openclash_config/." "/etc/openclash/config/" >/dev/null 2>&1
cp -rf "/tmp/openclash_core/." "/etc/openclash/core/" >/dev/null 2>&1
cp -rf "/tmp/openclash_history/." "/etc/openclash/history/" >/dev/null 2>&1
cp -rf "/tmp/openclash_proxy_provider/." "/etc/openclash/proxy_provider/" >/dev/null 2>&1
cp -rf "/tmp/openclash_rule_provider/." "/etc/openclash/rule_provider/" >/dev/null 2>&1
cp -rf "/tmp/openclash_game_rules/." "/etc/openclash/game_rules/" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_rules.list.bak" "/etc/openclash/custom/openclash_custom_rules.list" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_rules_2.list.bak" "/etc/openclash/custom/openclash_custom_rules_2.list" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_hosts.list.bak" "/etc/openclash/custom/openclash_custom_hosts.list" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_fake_filter.list.bak" "/etc/openclash/custom/openclash_custom_fake_filter.list" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_domain_dns.list.bak" "/etc/openclash/custom/openclash_custom_domain_dns.list" >/dev/null 2>&1
rm -rf "/etc/openclash/openclash" >/dev/null 2>&1
rm -rf "/etc/openclash/fake_filter.list" >/dev/null 2>&1
rm -rf "/etc/openclash/openclash_servers_fake_filter.conf" >/dev/null 2>&1
rm -rf "/tmp/openclash" >/dev/null 2>&1
rm -rf "/tmp/openclash.bak" >/dev/null 2>&1
fi
source "/etc/openwrt_release" source "/etc/openwrt_release"
case "${DISTRIB_ARCH}" in case "${DISTRIB_ARCH}" in
aarch64_*) aarch64_*)
@ -93,6 +72,81 @@ if [ -n "$(uci -q get dhcp.@dnsmasq[0].resolvfile)" ]; then
uci -q set openclash.config.default_resolvfile=$(uci -q get dhcp.@dnsmasq[0].resolvfile) uci -q set openclash.config.default_resolvfile=$(uci -q get dhcp.@dnsmasq[0].resolvfile)
fi fi
if [ -f "/tmp/openclash.bak" ]; then
mv -f "/tmp/openclash.bak" "/etc/config/openclash" >/dev/null 2>&1
cp -rf "/tmp/openclash/." "/etc/openclash/" >/dev/null 2>&1
cp -rf "/tmp/openclash_config/." "/etc/openclash/config/" >/dev/null 2>&1
cp -rf "/tmp/openclash_core/." "/etc/openclash/core/" >/dev/null 2>&1
cp -rf "/tmp/openclash_history/." "/etc/openclash/history/" >/dev/null 2>&1
cp -rf "/tmp/openclash_proxy_provider/." "/etc/openclash/proxy_provider/" >/dev/null 2>&1
cp -rf "/tmp/openclash_rule_provider/." "/etc/openclash/rule_provider/" >/dev/null 2>&1
cp -rf "/tmp/openclash_game_rules/." "/etc/openclash/game_rules/" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_rules.list.bak" "/etc/openclash/custom/openclash_custom_rules.list" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_rules_2.list.bak" "/etc/openclash/custom/openclash_custom_rules_2.list" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_hosts.list.bak" "/etc/openclash/custom/openclash_custom_hosts.list" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_fake_filter.list.bak" "/etc/openclash/custom/openclash_custom_fake_filter.list" >/dev/null 2>&1
mv -f "/tmp/openclash_custom_domain_dns.list.bak" "/etc/openclash/custom/openclash_custom_domain_dns.list" >/dev/null 2>&1
rm -rf "/etc/openclash/openclash" >/dev/null 2>&1
rm -rf "/etc/openclash/fake_filter.list" >/dev/null 2>&1
rm -rf "/etc/openclash/openclash_servers_fake_filter.conf" >/dev/null 2>&1
rm -rf "/tmp/openclash" >/dev/null 2>&1
rm -rf "/tmp/openclash.bak" >/dev/null 2>&1
fi
if [ -f "/usr/lib/lua/luci/model/network.lua" ]; then
sed -i '/OpenClash Append/,/OpenClash Append End/d' "/usr/lib/lua/luci/model/network.lua" >/dev/null 2>&1
cat >> "/usr/lib/lua/luci/model/network.lua" << EOF
-------------- OpenClash Append --------------
function get_all_wan_networks(self)
local k, v
local wan_nets = { }
local route_statuses = self:get_all_status_by_route("0.0.0.0", 0)
for k, v in pairs(route_statuses) do
wan_nets[#wan_nets+1] = network(k, v.proto)
end
return wan_nets
end
function get_all_wan6_networks(self)
local k, v
local wan6_nets = { }
local route_statuses = self:get_all_status_by_route("::", 0)
for k, v in pairs(route_statuses) do
wan6_nets[#wan6_nets+1] = network(k, v.proto)
end
return wan6_nets
end
function get_all_status_by_route(self, addr, mask)
local route_statuses = { }
local _, object
for _, object in ipairs(utl.ubus()) do
local net = object:match("^network%.interface%.(.+)")
if net then
local s = utl.ubus(object, "status", {})
if s and s.route then
local rt
for _, rt in ipairs(s.route) do
if not rt.table and rt.target == addr and rt.mask == mask then
route_statuses[net] = s
end
end
end
end
end
return route_statuses
end
-------------- OpenClash Append End --------------
EOF
fi
uci -q set openclash.config.enable=0 uci -q set openclash.config.enable=0
uci -q commit openclash uci -q commit openclash

View File

@ -22,10 +22,12 @@ fi
if [ "$small_flash_memory" != "1" ]; then if [ "$small_flash_memory" != "1" ]; then
dev_core_path="/etc/openclash/core/clash" dev_core_path="/etc/openclash/core/clash"
tun_core_path="/etc/openclash/core/clash_tun" tun_core_path="/etc/openclash/core/clash_tun"
meta_core_path="/etc/openclash/core/clash_meta"
mkdir -p /etc/openclash/core mkdir -p /etc/openclash/core
else else
dev_core_path="/tmp/etc/openclash/core/clash" dev_core_path="/tmp/etc/openclash/core/clash"
tun_core_path="/tmp/etc/openclash/core/clash_tun" tun_core_path="/tmp/etc/openclash/core/clash_tun"
meta_core_path="/tmp/etc/openclash/core/clash_meta"
mkdir -p /tmp/etc/openclash/core mkdir -p /tmp/etc/openclash/core
fi fi
@ -40,6 +42,10 @@ case $CORE_TYPE in
exit 0 exit 0
fi fi
;; ;;
"Meta")
CORE_CV=$($meta_core_path -v 2>/dev/null |awk -F ' ' '{print $3}')
CORE_LV=$(sed -n 3p /tmp/clash_last_version 2>/dev/null)
;;
*) *)
CORE_CV=$($dev_core_path -v 2>/dev/null |awk -F ' ' '{print $2}') CORE_CV=$($dev_core_path -v 2>/dev/null |awk -F ' ' '{print $2}')
CORE_LV=$(sed -n 1p /tmp/clash_last_version 2>/dev/null) CORE_LV=$(sed -n 1p /tmp/clash_last_version 2>/dev/null)
@ -65,6 +71,21 @@ if [ "$CORE_CV" != "$CORE_LV" ] || [ -z "$CORE_CV" ]; then
curl -sL -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://mirrors.tuna.tsinghua.edu.cn/osdn/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz >/dev/null 2>&1 curl -sL -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://mirrors.tuna.tsinghua.edu.cn/osdn/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz >/dev/null 2>&1
fi fi
;; ;;
"Meta")
LOG_OUT "【Meta】Core Downloading, Please Try to Download and Upload Manually If Fails"
if [ "$github_address_mod" != "0" ]; then
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ]; then
curl -sL -m 30 --speed-time 15 --speed-limit 1 https://cdn.jsdelivr.net/gh/vernesong/OpenClash@"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz >/dev/null 2>&1
else
curl -sL -m 30 --speed-time 15 --speed-limit 1 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz >/dev/null 2>&1
fi
else
curl -sL -m 30 --speed-time 15 --speed-limit 1 https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz >/dev/null 2>&1
fi
if [ "$?" != "0" ]; then
curl -sL -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://mirrors.tuna.tsinghua.edu.cn/osdn/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz >/dev/null 2>&1
fi
;;
*) *)
LOG_OUT "【Dev】Core Downloading, Please Try to Download and Upload Manually If Fails" LOG_OUT "【Dev】Core Downloading, Please Try to Download and Upload Manually If Fails"
if [ "$github_address_mod" != "0" ]; then if [ "$github_address_mod" != "0" ]; then
@ -90,6 +111,15 @@ if [ "$CORE_CV" != "$CORE_LV" ] || [ -z "$CORE_CV" ]; then
rm -rf /tmp/clash_tun.gz >/dev/null 2>&1 rm -rf /tmp/clash_tun.gz >/dev/null 2>&1
rm -rf "$tun_core_path" >/dev/null 2>&1 rm -rf "$tun_core_path" >/dev/null 2>&1
chmod 4755 /tmp/clash_tun >/dev/null 2>&1 chmod 4755 /tmp/clash_tun >/dev/null 2>&1
}
;;
"Meta")
[ -s "/tmp/clash_meta.tar.gz" ] && {
rm -rf "$meta_core_path" >/dev/null 2>&1
tar zxvf /tmp/clash_meta.tar.gz -C /tmp
mv /tmp/clash /tmp/clash_meta >/dev/null 2>&1
rm -rf /tmp/clash_meta.tar.gz >/dev/null 2>&1
chmod 4755 /tmp/clash_meta >/dev/null 2>&1
} }
;; ;;
*) *)
@ -106,6 +136,9 @@ if [ "$CORE_CV" != "$CORE_LV" ] || [ -z "$CORE_CV" ]; then
"TUN") "TUN")
rm -rf /tmp/clash_tun >/dev/null 2>&1 rm -rf /tmp/clash_tun >/dev/null 2>&1
;; ;;
"Meta")
rm -rf /tmp/clash_meta >/dev/null 2>&1
;;
*) *)
rm -rf /tmp/clash >/dev/null 2>&1 rm -rf /tmp/clash >/dev/null 2>&1
esac esac
@ -118,6 +151,9 @@ if [ "$CORE_CV" != "$CORE_LV" ] || [ -z "$CORE_CV" ]; then
"TUN") "TUN")
mv /tmp/clash_tun "$tun_core_path" >/dev/null 2>&1 mv /tmp/clash_tun "$tun_core_path" >/dev/null 2>&1
;; ;;
"Meta")
mv /tmp/clash_meta "$meta_core_path" >/dev/null 2>&1
;;
*) *)
mv /tmp/clash "$dev_core_path" >/dev/null 2>&1 mv /tmp/clash "$dev_core_path" >/dev/null 2>&1
esac esac
@ -159,6 +195,9 @@ case $CORE_TYPE in
"TUN") "TUN")
rm -rf /tmp/clash_tun >/dev/null 2>&1 rm -rf /tmp/clash_tun >/dev/null 2>&1
;; ;;
"Meta")
rm -rf /tmp/clash_meta >/dev/null 2>&1
;;
*) *)
rm -rf /tmp/clash >/dev/null 2>&1 rm -rf /tmp/clash >/dev/null 2>&1
esac esac

View File

@ -35,6 +35,7 @@ core_type=$(uci -q get openclash.config.core_version)
cpu_model=$(opkg status libc 2>/dev/null |grep 'Architecture' |awk -F ': ' '{print $2}' 2>/dev/null) cpu_model=$(opkg status libc 2>/dev/null |grep 'Architecture' |awk -F ': ' '{print $2}' 2>/dev/null)
core_version=$(/etc/openclash/core/clash -v 2>/dev/null |awk -F ' ' '{print $2}' 2>/dev/null) core_version=$(/etc/openclash/core/clash -v 2>/dev/null |awk -F ' ' '{print $2}' 2>/dev/null)
core_tun_version=$(/etc/openclash/core/clash_tun -v 2>/dev/null |awk -F ' ' '{print $2}' 2>/dev/null) core_tun_version=$(/etc/openclash/core/clash_tun -v 2>/dev/null |awk -F ' ' '{print $2}' 2>/dev/null)
core_meta_version=$(/etc/openclash/core/clash_meta -v 2>/dev/null |awk -F ' ' '{print $3}' 2>/dev/null)
servers_update=$(uci -q get openclash.config.servers_update) servers_update=$(uci -q get openclash.config.servers_update)
mix_proxies=$(uci -q get openclash.config.mix_proxies) mix_proxies=$(uci -q get openclash.config.mix_proxies)
op_version=$(sed -n 1p /usr/share/openclash/res/openclash_version) op_version=$(sed -n 1p /usr/share/openclash/res/openclash_version)
@ -196,6 +197,29 @@ Dev内核运行权限: 正常
EOF EOF
fi fi
cat >> "$DEBUG_LOG" <<-EOF
Meta内核版本: $core_meta_version
EOF
if [ ! -f "/etc/openclash/core/clash_meta" ]; then
cat >> "$DEBUG_LOG" <<-EOF
Meta内核文件: 不存在
EOF
else
cat >> "$DEBUG_LOG" <<-EOF
Meta内核文件: 存在
EOF
fi
if [ ! -x "/etc/openclash/core/clash_meta" ]; then
cat >> "$DEBUG_LOG" <<-EOF
Meta内核运行权限: 否
EOF
else
cat >> "$DEBUG_LOG" <<-EOF
Meta内核运行权限: 正常
EOF
fi
cat >> "$DEBUG_LOG" <<-EOF cat >> "$DEBUG_LOG" <<-EOF
#===================== 插件设置 =====================# #===================== 插件设置 =====================#

View File

@ -0,0 +1,60 @@
#!/bin/sh
. /usr/share/openclash/openclash_ps.sh
. /usr/share/openclash/log.sh
set_lock() {
exec 873>"/tmp/lock/openclash_geoip.lock" 2>/dev/null
flock -x 873 2>/dev/null
}
del_lock() {
flock -u 873 2>/dev/null
rm -rf "/tmp/lock/openclash_geoip.lock"
}
small_flash_memory=$(uci get openclash.config.small_flash_memory 2>/dev/null)
GEOIP_CUSTOM_URL=$(uci get openclash.config.geoip_custom_url 2>/dev/null)
github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0)
set_lock
if [ "$small_flash_memory" != "1" ]; then
geoip_path="/etc/openclash/GeoIP.dat"
mkdir -p /etc/openclash
else
geoip_path="/tmp/etc/openclash/GeoIP.dat"
mkdir -p /tmp/etc/openclash
fi
LOG_OUT "Start Downloading GeoIP Dat..."
if [ -z "$GEOIP_CUSTOM_URL" ]; then
if [ "$github_address_mod" != "0" ]; then
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ]; then
curl -sL --connect-timeout 5 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat -o /tmp/GeoIP.dat >/dev/null 2>&1
else
curl -sL --connect-timeout 5 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat -o /tmp/GeoIP.dat >/dev/null 2>&1
fi
else
curl -sL --connect-timeout 5 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat -o /tmp/GeoIP.dat >/dev/null 2>&1
fi
else
curl -sL --connect-timeout 5 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$GEOIP_CUSTOM_URL" -o /tmp/GeoIP.dat >/dev/null 2>&1
fi
if [ "$?" -eq "0" ] && [ -s "/tmp/GeoIP.dat" ]; then
LOG_OUT "GeoIP Dat Download Success, Check Updated..."
cmp -s /tmp/GeoIP.dat "$geoip_path"
if [ "$?" -ne "0" ]; then
LOG_OUT "GeoIP Dat Has Been Updated, Starting To Replace The Old Version..."
mv /tmp/GeoIP.dat "$geoip_path" >/dev/null 2>&1
LOG_OUT "GeoIP Dat Update Successful!"
sleep 3
[ "$(unify_ps_prevent)" -eq 0 ] && /etc/init.d/openclash restart >/dev/null 2>&1 &
else
LOG_OUT "Updated GeoIP Dat No Change, Do Nothing..."
sleep 3
fi
else
LOG_OUT "GeoIP Dat Update Error, Please Try Again Later..."
sleep 3
fi
rm -rf /tmp/GeoIP.dat >/dev/null 2>&1
SLOG_CLEAN
del_lock

View File

@ -0,0 +1,60 @@
#!/bin/sh
. /usr/share/openclash/openclash_ps.sh
. /usr/share/openclash/log.sh
set_lock() {
exec 874>"/tmp/lock/openclash_geosite.lock" 2>/dev/null
flock -x 874 2>/dev/null
}
del_lock() {
flock -u 874 2>/dev/null
rm -rf "/tmp/lock/openclash_geosite.lock"
}
small_flash_memory=$(uci get openclash.config.small_flash_memory 2>/dev/null)
GEOSITE_CUSTOM_URL=$(uci get openclash.config.geosite_custom_url 2>/dev/null)
github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0)
set_lock
if [ "$small_flash_memory" != "1" ]; then
geosite_path="/etc/openclash/GeoSite.dat"
mkdir -p /etc/openclash
else
geosite_path="/tmp/etc/openclash/GeoSite.dat"
mkdir -p /tmp/etc/openclash
fi
LOG_OUT "Start Downloading GeoSite Database..."
if [ -z "$GEOSITE_CUSTOM_URL" ]; then
if [ "$github_address_mod" != "0" ]; then
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ]; then
curl -sL --connect-timeout 5 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat -o /tmp/GeoSite.dat >/dev/null 2>&1
else
curl -sL --connect-timeout 5 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat -o /tmp/GeoSite.dat >/dev/null 2>&1
fi
else
curl -sL --connect-timeout 5 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat -o /tmp/GeoSite.dat >/dev/null 2>&1
fi
else
curl -sL --connect-timeout 5 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$GEOSITE_CUSTOM_URL" -o /tmp/GeoSite.dat >/dev/null 2>&1
fi
if [ "$?" -eq "0" ] && [ -s "/tmp/GeoSite.dat" ]; then
LOG_OUT "GeoSite Database Download Success, Check Updated..."
cmp -s /tmp/GeoSite.dat "$geosite_path"
if [ "$?" -ne "0" ]; then
LOG_OUT "GeoSite Database Has Been Updated, Starting To Replace The Old Version..."
mv /tmp/GeoSite.dat "$geosite_path" >/dev/null 2>&1
LOG_OUT "GeoSite Database Update Successful!"
sleep 3
[ "$(unify_ps_prevent)" -eq 0 ] && /etc/init.d/openclash restart >/dev/null 2>&1 &
else
LOG_OUT "Updated GeoSite Database No Change, Do Nothing..."
sleep 3
fi
else
LOG_OUT "GeoSite Database Update Error, Please Try Again Later..."
sleep 3
fi
rm -rf /tmp/GeoSite.dat >/dev/null 2>&1
SLOG_CLEAN
del_lock

View File

@ -10,14 +10,17 @@ local wan, wan6
if not type then os.exit(0) end if not type then os.exit(0) end
if pcall(function() local x = ntm:get_wannet(); local y = ntm:get_wan6net(); end) then if pcall(function() local x = ntm:get_all_wan_networks(); local y = ntm:get_all_wan6_networks(); end) then
wan = ntm:get_all_wan_networks()
wan6 = ntm:get_all_wan6_networks()
elseif pcall(function() local x = ntm:get_wan_networks(); local y = ntm:get_wan6_networks(); end) then
wan = ntm:get_wan_networks()
wan6 = ntm:get_wan6_networks()
elseif pcall(function() local x = ntm:get_wannet(); local y = ntm:get_wan6net(); end) then
wan = {} wan = {}
wan6 = {} wan6 = {}
wan[1] = ntm:get_wannet() wan[1] = ntm:get_wannet()
wan6[1] = ntm:get_wan6net() wan6[1] = ntm:get_wan6net()
elseif pcall(function() local x = ntm:get_wan_networks(); local y = ntm:get_wan6_networks(); end) then
wan = ntm:get_wan_networks()
wan6 = ntm:get_wan6_networks()
else else
os.exit(0) os.exit(0)
end end

View File

@ -19,8 +19,20 @@ local groups = {}
local proxies = {} local proxies = {}
local self_status = luci.sys.exec(string.format('ps -w |grep -v grep |grep -c "openclash_streaming_unlock.lua %s"', type)) local self_status = luci.sys.exec(string.format('ps -w |grep -v grep |grep -c "openclash_streaming_unlock.lua %s"', type))
if enable == 0 or not type or router_self_proxy == 0 then os.exit(0) end if enable == 0 then
if tonumber(self_status) > 1 then os.exit(0) end print(os.date("%Y-%m-%d %H:%M:%S").." ".."Error: Streaming Unlock Now Disabled, Need Start From Luci Page, Exiting...")
os.exit(0)
elseif not type then
print(os.date("%Y-%m-%d %H:%M:%S").." ".."Error: Streaming Unlock Has No Parameter of Type, Exiting...")
os.exit(0)
elseif router_self_proxy == 0 then
print(os.date("%Y-%m-%d %H:%M:%S").." ".."Error: Streaming Unlock Could not Work Because of Router-Self Proxy Disabled, Exiting...")
os.exit(0)
elseif tonumber(self_status) > 1 then
print(os.date("%Y-%m-%d %H:%M:%S").." ".."Error: Multiple Scripts Running, Exiting...")
os.exit(0)
end
if arg[2] == "all" then all_test = true else all_test = false end if arg[2] == "all" then all_test = true else all_test = false end
function unlock_auto_select() function unlock_auto_select()
@ -460,6 +472,10 @@ function get_auth_info()
passwd = uci:get("openclash", "config", "dashboard_password") or "" passwd = uci:get("openclash", "config", "dashboard_password") or ""
ip = luci.sys.exec("uci -q get network.lan.ipaddr |awk -F '/' '{print $1}' 2>/dev/null |tr -d '\n'") ip = luci.sys.exec("uci -q get network.lan.ipaddr |awk -F '/' '{print $1}' 2>/dev/null |tr -d '\n'")
if not ip or ip == "" then
ip = luci.sys.exec("ip address show $(uci -q -p /tmp/state get network.lan.ifname) | grep -w 'inet' 2>/dev/null |grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | tr -d '\n'")
end
if not ip or ip == "" then if not ip or ip == "" then
ip = luci.sys.exec("ip addr show 2>/dev/null | grep -w 'inet' | grep 'global' | grep 'brd' | grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | head -n 1 | tr -d '\n'") ip = luci.sys.exec("ip addr show 2>/dev/null | grep -w 'inet' | grep 'global' | grep 'brd' | grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | head -n 1 | tr -d '\n'")
end end
@ -789,7 +805,7 @@ function netflix_unlock_test()
status = 0 status = 0
local url = "https://www.netflix.com/title/"..filmId local url = "https://www.netflix.com/title/"..filmId
local headers = "User-Agent: "..UA local headers = "User-Agent: "..UA
local info = luci.sys.exec(string.format('curl -sLI --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{json} -H "Content-Type: application/json" -H "%s" -XGET %s', headers, url)) local info = luci.sys.exec(string.format('curl -sLI --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{json} -H "Content-Type: application/json" -H "%s" -XGET %s', headers, url))
local result = {} local result = {}
local region local region
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_netflix") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_netflix") or ""
@ -824,7 +840,7 @@ function disney_unlock_test()
local region, assertion, data, preassertion, disneycookie, tokencontent local region, assertion, data, preassertion, disneycookie, tokencontent
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_disney") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_disney") or ""
preassertion = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 %s -H 'User-Agent: %s' -H 'content-type: application/json; charset=UTF-8' -d '{\"deviceFamily\":\"browser\",\"applicationRuntime\":\"chrome\",\"deviceProfile\":\"windows\",\"attributes\":{}}' -XPOST %s", auth, UA, url)) preassertion = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 %s -H 'User-Agent: %s' -H 'content-type: application/json; charset=UTF-8' -d '{\"deviceFamily\":\"browser\",\"applicationRuntime\":\"chrome\",\"deviceProfile\":\"windows\",\"attributes\":{}}' -XPOST %s", auth, UA, url))
if preassertion and json.parse(preassertion) then if preassertion and json.parse(preassertion) then
assertion = json.parse(preassertion).assertion assertion = json.parse(preassertion).assertion
@ -833,7 +849,7 @@ function disney_unlock_test()
if not assertion then return end if not assertion then return end
disneycookie = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange&latitude=0&longitude=0&platform=browser&subject_token="..assertion.."&subject_token_type=urn%3Abamtech%3Aparams%3Aoauth%3Atoken-type%3Adevice" disneycookie = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange&latitude=0&longitude=0&platform=browser&subject_token="..assertion.."&subject_token_type=urn%3Abamtech%3Aparams%3Aoauth%3Atoken-type%3Adevice"
tokencontent = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 %s -H 'User-Agent: %s' -d '%s' -XPOST %s", auth, UA, disneycookie, url2)) tokencontent = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 %s -H 'User-Agent: %s' -d '%s' -XPOST %s", auth, UA, disneycookie, url2))
if tokencontent and json.parse(tokencontent) then if tokencontent and json.parse(tokencontent) then
if json.parse(tokencontent).error_description then if json.parse(tokencontent).error_description then
@ -842,7 +858,7 @@ function disney_unlock_test()
end end
end end
data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 %s -H 'User-Agent: %s' -d '%s' -XPOST %s", headers, UA, body, url3)) data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 %s -H 'User-Agent: %s' -d '%s' -XPOST %s", headers, UA, body, url3))
if data and json.parse(data) then if data and json.parse(data) then
status = 1 status = 1
@ -872,7 +888,7 @@ end
function hbo_now_unlock_test() function hbo_now_unlock_test()
status = 0 status = 0
local url = "https://play.hbonow.com/" local url = "https://play.hbonow.com/"
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{json} -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{json} -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
if data then if data then
data = json.parse(data) data = json.parse(data)
end end
@ -890,7 +906,7 @@ end
function hbo_max_unlock_test() function hbo_max_unlock_test()
status = 0 status = 0
local url = "https://www.hbomax.com/" local url = "https://www.hbomax.com/"
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{json} -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{json} -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
local result = {} local result = {}
local region = "" local region = ""
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_hbo_max") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_hbo_max") or ""
@ -919,12 +935,12 @@ end
function hbo_go_asia_unlock_test() function hbo_go_asia_unlock_test()
status = 0 status = 0
local url = "https://api2.hbogoasia.com/v1/geog?lang=undefined&version=0&bundleId=www.hbogoasia.com" local url = "https://api2.hbogoasia.com/v1/geog?lang=undefined&version=0&bundleId=www.hbogoasia.com"
local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_hbo_go_asia") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_hbo_go_asia") or ""
local region = "" local region = ""
if tonumber(httpcode) == 200 then if tonumber(httpcode) == 200 then
status = 1 status = 1
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
if data then if data then
data = json.parse(data) data = json.parse(data)
end end
@ -947,12 +963,12 @@ end
function ytb_unlock_test() function ytb_unlock_test()
status = 0 status = 0
local url = "https://m.youtube.com/premium" local url = "https://m.youtube.com/premium"
local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
local region = "" local region = ""
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_ytb") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_ytb") or ""
if tonumber(httpcode) == 200 then if tonumber(httpcode) == 200 then
status = 1 status = 1
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
if string.find(data, "is not available in your country") then if string.find(data, "is not available in your country") then
return return
end end
@ -975,12 +991,12 @@ end
function tvb_anywhere_unlock_test() function tvb_anywhere_unlock_test()
status = 0 status = 0
local url = "https://uapisfm.tvbanywhere.com.sg/geoip/check/platform/android" local url = "https://uapisfm.tvbanywhere.com.sg/geoip/check/platform/android"
local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
local region = "" local region = ""
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_tvb_anywhere") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_tvb_anywhere") or ""
if tonumber(httpcode) == 200 then if tonumber(httpcode) == 200 then
status = 1 status = 1
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
if data then if data then
data = json.parse(data) data = json.parse(data)
end end
@ -1000,12 +1016,12 @@ end
function prime_video_unlock_test() function prime_video_unlock_test()
status = 0 status = 0
local url = "https://www.primevideo.com" local url = "https://www.primevideo.com"
local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
local region local region
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_prime_video") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_prime_video") or ""
if tonumber(httpcode) == 200 then if tonumber(httpcode) == 200 then
status = 1 status = 1
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
if data then if data then
region = string.sub(string.match(data, "\"currentTerritory\":\"%a+\""), 21, -2) region = string.sub(string.match(data, "\"currentTerritory\":\"%a+\""), 21, -2)
if region then if region then
@ -1024,12 +1040,12 @@ function dazn_unlock_test()
status = 0 status = 0
local url = "https://www.dazn.com" local url = "https://www.dazn.com"
local url2 = "https://startup.core.indazn.com/misl/v5/Startup" local url2 = "https://startup.core.indazn.com/misl/v5/Startup"
local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local httpcode = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{http_code} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
local region local region
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_dazn") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_dazn") or ""
if tonumber(httpcode) == 200 then if tonumber(httpcode) == 200 then
status = 1 status = 1
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' -X POST -d '{\"LandingPageKey\":\"generic\",\"Languages\":\"zh-CN,zh,en\",\"Platform\":\"web\",\"PlatformAttributes\":{},\"Manufacturer\":\"\",\"PromoCode\":\"\",\"Version\":\"2\"}' %s", UA, url2)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' -X POST -d '{\"LandingPageKey\":\"generic\",\"Languages\":\"zh-CN,zh,en\",\"Platform\":\"web\",\"PlatformAttributes\":{},\"Manufacturer\":\"\",\"PromoCode\":\"\",\"Version\":\"2\"}' %s", UA, url2))
if data then if data then
data = json.parse(data) data = json.parse(data)
end end
@ -1051,13 +1067,13 @@ function paramount_plus_unlock_test()
local url = "https://www.paramountplus.com/" local url = "https://www.paramountplus.com/"
local region local region
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_paramount_plus") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_paramount_plus") or ""
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -o /dev/null -w %%{json} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -o /dev/null -w %%{json} -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
data = json.parse(data) data = json.parse(data)
if data and tonumber(data.http_code) == 200 then if data and tonumber(data.http_code) == 200 then
status = 1 status = 1
if not string.find(data.url_effective, "intl") then if not string.find(data.url_effective, "intl") then
status = 2 status = 2
data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url)) data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
region = string.upper(string.sub(string.match(data, "\"siteEdition\":\"%a+|%a+\""), 19, -1)) or string.upper(string.sub(string.match(data, "property: '%a+'"), 12, -2)) region = string.upper(string.sub(string.match(data, "\"siteEdition\":\"%a+|%a+\""), 19, -1)) or string.upper(string.sub(string.match(data, "property: '%a+'"), 12, -2))
if region then if region then
if not datamatch(region, regex) then if not datamatch(region, regex) then
@ -1075,12 +1091,12 @@ function discovery_plus_unlock_test()
local url1 = "https://us1-prod-direct.discoveryplus.com/users/me" local url1 = "https://us1-prod-direct.discoveryplus.com/users/me"
local region local region
local regex = uci:get("openclash", "config", "stream_auto_select_region_key_discovery_plus") or "" local regex = uci:get("openclash", "config", "stream_auto_select_region_key_discovery_plus") or ""
local token = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' '%s'", UA, url)) local token = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' '%s'", UA, url))
if token and json.parse(token) and json.parse(token).data and json.parse(token).data.attributes then if token and json.parse(token) and json.parse(token).data and json.parse(token).data.attributes then
status = 1 status = 1
token = json.parse(token).data.attributes.token token = json.parse(token).data.attributes.token
local cookie = string.format("-b \"_gcl_au=1.1.858579665.1632206782; _rdt_uuid=1632206782474.6a9ad4f2-8ef7-4a49-9d60-e071bce45e88; _scid=d154b864-8b7e-4f46-90e0-8b56cff67d05; _pin_unauth=dWlkPU1qWTRNR1ZoTlRBdE1tSXdNaTAwTW1Nd0xUbGxORFV0WWpZMU0yVXdPV1l6WldFeQ; _sctr=1|1632153600000; aam_fw=aam%%3D9354365%%3Baam%%3D9040990; aam_uuid=24382050115125439381416006538140778858; st=%s; gi_ls=0; _uetvid=a25161a01aa711ec92d47775379d5e4d; AMCV_BC501253513148ED0A490D45%%40AdobeOrg=-1124106680%%7CMCIDTS%%7C18894%%7CMCMID%%7C24223296309793747161435877577673078228%%7CMCAAMLH-1633011393%%7C9%%7CMCAAMB-1633011393%%7CRKhpRz8krg2tLO6pguXWp5olkAcUniQYPHaMWWgdJ3xzPWQmdj0y%%7CMCOPTOUT-1632413793s%%7CNONE%%7CvVersion%%7C5.2.0; ass=19ef15da-95d6-4b1d-8fa2-e9e099c9cc38.1632408400.1632406594\"", token) local cookie = string.format("-b \"_gcl_au=1.1.858579665.1632206782; _rdt_uuid=1632206782474.6a9ad4f2-8ef7-4a49-9d60-e071bce45e88; _scid=d154b864-8b7e-4f46-90e0-8b56cff67d05; _pin_unauth=dWlkPU1qWTRNR1ZoTlRBdE1tSXdNaTAwTW1Nd0xUbGxORFV0WWpZMU0yVXdPV1l6WldFeQ; _sctr=1|1632153600000; aam_fw=aam%%3D9354365%%3Baam%%3D9040990; aam_uuid=24382050115125439381416006538140778858; st=%s; gi_ls=0; _uetvid=a25161a01aa711ec92d47775379d5e4d; AMCV_BC501253513148ED0A490D45%%40AdobeOrg=-1124106680%%7CMCIDTS%%7C18894%%7CMCMID%%7C24223296309793747161435877577673078228%%7CMCAAMLH-1633011393%%7C9%%7CMCAAMB-1633011393%%7CRKhpRz8krg2tLO6pguXWp5olkAcUniQYPHaMWWgdJ3xzPWQmdj0y%%7CMCOPTOUT-1632413793s%%7CNONE%%7CvVersion%%7C5.2.0; ass=19ef15da-95d6-4b1d-8fa2-e9e099c9cc38.1632408400.1632406594\"", token)
local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 3 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s %s", UA, cookie, url1)) local data = luci.sys.exec(string.format("curl -sL --connect-timeout 5 -m 15 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s %s", UA, cookie, url1))
if data and json.parse(data) and json.parse(data).data and json.parse(data).data.attributes and json.parse(data).data.attributes.currentLocationSovereignTerritory then if data and json.parse(data) and json.parse(data).data and json.parse(data).data.attributes and json.parse(data).data.attributes.currentLocationSovereignTerritory then
region = string.upper(json.parse(data).data.attributes.currentLocationTerritory) or string.upper(json.parse(data).data.attributes.currentLocationSovereignTerritory) region = string.upper(json.parse(data).data.attributes.currentLocationTerritory) or string.upper(json.parse(data).data.attributes.currentLocationSovereignTerritory)
if region then if region then

View File

@ -17,6 +17,7 @@ if [ "$1" = "one_key_update" ]; then
uci -q commit openclash uci -q commit openclash
/usr/share/openclash/openclash_core.sh "$1" >/dev/null 2>&1 & /usr/share/openclash/openclash_core.sh "$1" >/dev/null 2>&1 &
/usr/share/openclash/openclash_core.sh "TUN" "$1" >/dev/null 2>&1 & /usr/share/openclash/openclash_core.sh "TUN" "$1" >/dev/null 2>&1 &
/usr/share/openclash/openclash_core.sh "Meta" "$1" >/dev/null 2>&1 &
wait wait
fi fi

View File

@ -75,7 +75,7 @@ if [ "$enable" -eq 1 ]; then
nohup $CLASH -d $CLASH_CONFIG -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & nohup $CLASH -d $CLASH_CONFIG -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 &
fi fi
sleep 3 sleep 3
if [ "$core_type" = "TUN" ]; then if [ "$core_type" == "TUN" ] || [ "$core_type" == "Meta" ]; then
ip route replace default dev utun table "$PROXY_ROUTE_TABLE" 2>/dev/null ip route replace default dev utun table "$PROXY_ROUTE_TABLE" 2>/dev/null
ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" 2>/dev/null ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" 2>/dev/null
fi fi
@ -193,6 +193,8 @@ fi
fi fi
fi fi
STREAM_AUTO_SELECT=$(expr "$STREAM_AUTO_SELECT" + 1) STREAM_AUTO_SELECT=$(expr "$STREAM_AUTO_SELECT" + 1)
elif [ "$router_self_proxy" != "1" ] && [ "$stream_auto_select" -eq 1 ]; then
LOG_OUT "Error: Streaming Unlock Could not Work Because of Router-Self Proxy Disabled, Exiting..."
fi fi
##STREAM_DNS_PREFETCH ##STREAM_DNS_PREFETCH
@ -219,6 +221,8 @@ fi
fi fi
fi fi
STREAM_DOMAINS_PREFETCH=$(expr "$STREAM_DOMAINS_PREFETCH" + 1) STREAM_DOMAINS_PREFETCH=$(expr "$STREAM_DOMAINS_PREFETCH" + 1)
elif [ "$router_self_proxy" != "1" ] && [ "$stream_domains_prefetch" -eq 1 ]; then
LOG_OUT "Error: Streaming DNS Prefetch Could not Work Because of Router-Self Proxy Disabled, Exiting..."
fi fi
SLOG_CLEAN SLOG_CLEAN

File diff suppressed because one or more lines are too long

View File

@ -25,6 +25,18 @@ else
stack_type=${12} stack_type=${12}
fi fi
if [ "${22}" != "1" ]; then
sniffer_force="false"
else
sniffer_force="true"
fi
if [ "${23}" != "1" ]; then
enable_geoip_dat="false"
else
enable_geoip_dat="true"
fi
if [ "$(ruby_read "$5" "['external-controller']")" != "$controller_address:$3" ]; then if [ "$(ruby_read "$5" "['external-controller']")" != "$controller_address:$3" ]; then
uci set openclash.config.config_reload=0 uci set openclash.config.config_reload=0
fi fi
@ -53,6 +65,17 @@ begin
Value['secret']='$2'; Value['secret']='$2';
Value['bind-address']='*'; Value['bind-address']='*';
Value['external-ui']='/usr/share/openclash/dashboard'; Value['external-ui']='/usr/share/openclash/dashboard';
if ${21} == 1 then
Value['geodata-mode']=$enable_geoip_dat;
Value['geodata-loader']='${24}';
else
if Value.key?('geodata-mode') then
Value.delete('geodata-mode')
end
if Value.key?('geodata-loader') then
Value.delete('geodata-loader')
end
end
if not Value.key?('dns') then if not Value.key?('dns') then
Value_1={'dns'=>{'enable'=>true}} Value_1={'dns'=>{'enable'=>true}}
Value['dns']=Value_1['dns'] Value['dns']=Value_1['dns']
@ -80,10 +103,26 @@ else
Value['dns'].delete('fake-ip-range') Value['dns'].delete('fake-ip-range')
end; end;
Value['dns']['listen']='0.0.0.0:${13}' Value['dns']['listen']='0.0.0.0:${13}'
if ${21} == 1 then
Value_sniffer={'sniffer'=>{'enable'=>true}};
Value['sniffer']=Value_sniffer['sniffer'];
Value['sniffer']['force']=$sniffer_force
Value_sniffer={'sniffing'=>['tls']}
Value['sniffer'].merge!(Value_sniffer)
else
if Value.key?('sniffer') then
Value.delete('sniffer')
end
end;
Value_2={'tun'=>{'enable'=>true}}; Value_2={'tun'=>{'enable'=>true}};
if $en_mode_tun != 0 then if $en_mode_tun != 0 then
Value['tun']=Value_2['tun'] Value['tun']=Value_2['tun']
Value['tun']['stack']='$stack_type' Value['tun']['stack']='$stack_type'
if ${20} == 1 then
Value['tun']['device']='utun'
end
Value['tun']['auto-route']=false
Value['tun']['auto-detect-interface']=false
Value_2={'dns-hijack'=>['tcp://8.8.8.8:53','tcp://8.8.4.4:53']} Value_2={'dns-hijack'=>['tcp://8.8.8.8:53','tcp://8.8.4.4:53']}
Value['tun'].merge!(Value_2) Value['tun'].merge!(Value_2)
else else
@ -91,6 +130,9 @@ else
Value.delete('tun') Value.delete('tun')
end end
end; end;
if Value.key?('iptables') then
Value.delete('iptables')
end;
if not Value.key?('profile') then if not Value.key?('profile') then
Value_3={'profile'=>{'store-selected'=>true}} Value_3={'profile'=>{'store-selected'=>true}}
Value['profile']=Value_3['profile'] Value['profile']=Value_3['profile']

View File

@ -539,7 +539,11 @@ do
Thread.new{ Thread.new{
#cipher #cipher
if Value['proxies'][$count].key?('cipher') then if Value['proxies'][$count].key?('cipher') then
if Value['proxies'][$count]['cipher'].to_s == 'none' then
cipher = '${uci_set}cipher_ssr=dummy'
else
cipher = '${uci_set}cipher_ssr=' + Value['proxies'][$count]['cipher'].to_s cipher = '${uci_set}cipher_ssr=' + Value['proxies'][$count]['cipher'].to_s
end
system(cipher) system(cipher)
end end
}.join }.join
@ -723,6 +727,83 @@ do
end end
}.join }.join
end; end;
if '$server_type' == 'vless' then
Thread.new{
#uuid
if Value['proxies'][$count].key?('uuid') then
uuid = '${uci_set}uuid=' + Value['proxies'][$count]['uuid'].to_s
system(uuid)
end
}.join
Thread.new{
#tls
if Value['proxies'][$count].key?('tls') then
tls = '${uci_set}tls=' + Value['proxies'][$count]['tls'].to_s
system(tls)
end
}.join
Thread.new{
#skip-cert-verify
if Value['proxies'][$count].key?('skip-cert-verify') then
skip_cert_verify = '${uci_set}skip_cert_verify=' + Value['proxies'][$count]['skip-cert-verify'].to_s
system(skip_cert_verify)
end
}.join
Thread.new{
#servername
if Value['proxies'][$count].key?('servername') then
servername = '${uci_set}servername=\"' + Value['proxies'][$count]['servername'].to_s + '\"'
system(servername)
end
}.join
Thread.new{
#flow
if Value['proxies'][$count].key?('flow') then
flow = '${uci_set}vless_flow=\"' + Value['proxies'][$count]['flow'].to_s + '\"'
system(flow)
end
}.join
Thread.new{
#network:
if Value['proxies'][$count].key?('network') then
if Value['proxies'][$count]['network'].to_s == 'ws'
system '${uci_set}obfs_vless=ws'
#ws-opts-path:
if Value['proxies'][$count].key?('ws-opts') then
if Value['proxies'][$count]['ws-opts'].key?('path') then
ws_opts_path = '${uci_set}ws_opts_path=\"' + Value['proxies'][$count]['ws-opts']['path'].to_s + '\"'
system(ws_opts_path)
end
#ws-opts-headers:
if Value['proxies'][$count]['ws-opts'].key?('headers') then
system '${uci_del}ws_opts_headers >/dev/null 2>&1'
Value['proxies'][$count]['ws-opts']['headers'].keys.each{
|v|
ws_opts_headers = '${uci_add}ws_opts_headers=\"' + v.to_s + ': '+ Value['proxies'][$count]['ws-opts']['headers'][v].to_s + '\"'
system(ws_opts_headers)
}
end
end
elsif Value['proxies'][$count]['network'].to_s == 'grpc'
#grpc-service-name
system '${uci_set}obfs_vless=grpc'
if Value['proxies'][$count].key?('grpc-opts') then
if Value['proxies'][$count]['grpc-opts'].key?('grpc-service-name') then
grpc_service_name = '${uci_set}grpc_service_name=\"' + Value['proxies'][$count]['grpc-opts']['grpc-service-name'].to_s + '\"'
system(grpc_service_name)
end
end
else
system '${uci_set}obfs_vless=none'
end
end
}.join
end;
if '$server_type' == 'snell' then if '$server_type' == 'snell' then
Thread.new{ Thread.new{
if Value['proxies'][$count].key?('obfs-opts') then if Value['proxies'][$count].key?('obfs-opts') then

View File

@ -234,6 +234,8 @@ yml_servers_set()
config_get "trojan_ws_headers" "$section" "trojan_ws_headers" "" config_get "trojan_ws_headers" "$section" "trojan_ws_headers" ""
config_get "interface_name" "$section" "interface_name" "" config_get "interface_name" "$section" "interface_name" ""
config_get "routing_mark" "$section" "routing_mark" "" config_get "routing_mark" "$section" "routing_mark" ""
config_get "obfs_vless" "$section" "obfs_vless" ""
config_get "vless_flow" "$section" "vless_flow" ""
if [ "$enabled" = "0" ]; then if [ "$enabled" = "0" ]; then
return return
@ -286,6 +288,10 @@ yml_servers_set()
fi fi
LOG_OUT "Start Writing【$CONFIG_NAME - $type - $name】Proxy To Config File..." LOG_OUT "Start Writing【$CONFIG_NAME - $type - $name】Proxy To Config File..."
if [ "$cipher_ssr" == "none" ]; then
cipher_ssr="dummy"
fi
if [ "$obfs" != "none" ] && [ -n "$obfs" ]; then if [ "$obfs" != "none" ] && [ -n "$obfs" ]; then
if [ "$obfs" = "websocket" ]; then if [ "$obfs" = "websocket" ]; then
obfss="plugin: v2ray-plugin" obfss="plugin: v2ray-plugin"
@ -296,6 +302,14 @@ yml_servers_set()
obfss="" obfss=""
fi fi
if [ "$obfs_vless" = "ws" ]; then
obfs_vless="network: ws"
fi
if [ "$obfs_vless" = "grpc" ]; then
obfs_vless="network: grpc"
fi
if [ "$obfs_vmess" = "websocket" ]; then if [ "$obfs_vmess" = "websocket" ]; then
obfs_vmess="network: ws" obfs_vmess="network: ws"
fi fi
@ -525,6 +539,72 @@ EOF
fi fi
fi fi
#vless
if [ "$type" = "vless" ]; then
cat >> "$SERVER_FILE" <<-EOF
- name: "$name"
type: $type
server: "$server"
port: $port
uuid: $uuid
EOF
if [ ! -z "$udp" ]; then
cat >> "$SERVER_FILE" <<-EOF
udp: $udp
EOF
fi
if [ ! -z "$skip_cert_verify" ]; then
cat >> "$SERVER_FILE" <<-EOF
skip-cert-verify: $skip_cert_verify
EOF
fi
if [ ! -z "$tls" ]; then
cat >> "$SERVER_FILE" <<-EOF
tls: $tls
EOF
fi
if [ ! -z "$servername" ]; then
cat >> "$SERVER_FILE" <<-EOF
servername: "$servername"
EOF
fi
if [ "$obfs_vless" != "none" ]; then
cat >> "$SERVER_FILE" <<-EOF
$obfs_vless
EOF
if [ "$obfs_vless" = "network: ws" ]; then
if [ -n "$ws_opts_path" ] || [ -n "$ws_opts_headers" ]; then
cat >> "$SERVER_FILE" <<-EOF
ws-opts:
EOF
if [ -n "$ws_opts_path" ]; then
cat >> "$SERVER_FILE" <<-EOF
path: "$ws_opts_path"
EOF
fi
if [ -n "$ws_opts_headers" ]; then
cat >> "$SERVER_FILE" <<-EOF
headers:
EOF
config_list_foreach "$section" "ws_opts_headers" set_ws_headers
fi
fi
fi
if [ ! -z "$grpc_service_name" ] && [ "$obfs_vless" = "network: grpc" ]; then
cat >> "$SERVER_FILE" <<-EOF
grpc-opts:
grpc-service-name: "$grpc_service_name"
EOF
fi
else
if [ ! -z "$vless_flow" ]; then
cat >> "$SERVER_FILE" <<-EOF
flow: "$vless_flow"
EOF
fi
fi
fi
#socks5 #socks5
if [ "$type" = "socks5" ]; then if [ "$type" = "socks5" ]; then
cat >> "$SERVER_FILE" <<-EOF cat >> "$SERVER_FILE" <<-EOF

View File

@ -245,7 +245,7 @@ yml_other_set()
if Value['rules'].to_a.grep(/(?=.*SRC-IP-CIDR,198.18.0.1)/).empty? then if Value['rules'].to_a.grep(/(?=.*SRC-IP-CIDR,198.18.0.1)/).empty? then
Value['rules']=Value['rules'].to_a.insert(0,'SRC-IP-CIDR,198.18.0.1/32,DIRECT') Value['rules']=Value['rules'].to_a.insert(0,'SRC-IP-CIDR,198.18.0.1/32,DIRECT')
end end
if Value['rules'].to_a.grep(/(?=.*SRC-IP-CIDR,'$7')/).empty? then if Value['rules'].to_a.grep(/(?=.*SRC-IP-CIDR,'$7')/).empty? and not '$7'.empty? then
Value['rules']=Value['rules'].to_a.insert(0,'SRC-IP-CIDR,$7/32,DIRECT') Value['rules']=Value['rules'].to_a.insert(0,'SRC-IP-CIDR,$7/32,DIRECT')
end end
else else
@ -264,11 +264,17 @@ yml_other_set()
if Value['rules'].to_a.grep(/(?=.*198.18.0)(?=.*REJECT)/).empty? then if Value['rules'].to_a.grep(/(?=.*198.18.0)(?=.*REJECT)/).empty? then
Value['rules']=Value['rules'].to_a.insert(0,'IP-CIDR,198.18.0.1/16,REJECT,no-resolve') Value['rules']=Value['rules'].to_a.insert(0,'IP-CIDR,198.18.0.1/16,REJECT,no-resolve')
end end
if Value['rules'].to_a.grep(/(?=.*DST-PORT,'$8',REJECT)/).empty? then
Value['rules']=Value['rules'].to_a.insert(0,'DST-PORT,$8,REJECT')
end
if Value['rules'].to_a.grep(/(?=.*DST-PORT,'$9',REJECT)/).empty? then
Value['rules']=Value['rules'].to_a.insert(0,'DST-PORT,$9,REJECT')
end
else else
Value['rules']=%w(IP-CIDR,198.18.0.1/16,REJECT,no-resolve) Value['rules']=['IP-CIDR,198.18.0.1/16,REJECT,no-resolve','DST-PORT,$8,REJECT','DST-PORT,$9,REJECT']
end; end;
rescue Exception => e rescue Exception => e
puts '${LOGTIME} Error: Set 198.18.0.1/16 REJECT Rule Failed,【' + e.message + '】' puts '${LOGTIME} Error: Set Loop Protect Rules Failed,【' + e.message + '】'
ensure ensure
File.open('$3','w') {|f| YAML.dump(Value, f)} File.open('$3','w') {|f| YAML.dump(Value, f)}
end" 2>/dev/null >> $LOG_FILE end" 2>/dev/null >> $LOG_FILE
@ -328,14 +334,14 @@ if [ "$1" != "0" ]; then
config_load "openclash" config_load "openclash"
config_foreach yml_other_rules_get "other_rules" "$5" config_foreach yml_other_rules_get "other_rules" "$5"
if [ -z "$rule_name" ]; then if [ -z "$rule_name" ]; then
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
exit 0 exit 0
#判断策略组是否存在 #判断策略组是否存在
elif [ "$rule_name" = "ConnersHua_return" ]; then elif [ "$rule_name" = "ConnersHua_return" ]; then
if [ -z "$(grep -F "$Proxy" /tmp/Proxy_Group)" ]\ if [ -z "$(grep -F "$Proxy" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ];then || [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ];then
LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!"
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
exit 0 exit 0
fi fi
elif [ "$rule_name" = "ConnersHua" ]; then elif [ "$rule_name" = "ConnersHua" ]; then
@ -345,7 +351,7 @@ if [ "$1" != "0" ]; then
|| [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Domestic" /tmp/Proxy_Group)" ]; then || [ -z "$(grep -F "$Domestic" /tmp/Proxy_Group)" ]; then
LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!"
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
exit 0 exit 0
fi fi
elif [ "$rule_name" = "lhie1" ]; then elif [ "$rule_name" = "lhie1" ]; then
@ -375,13 +381,13 @@ if [ "$1" != "0" ]; then
|| [ -z "$(grep -F "$GoogleFCM" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$GoogleFCM" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Domestic" /tmp/Proxy_Group)" ]; then || [ -z "$(grep -F "$Domestic" /tmp/Proxy_Group)" ]; then
LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!"
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
exit 0 exit 0
fi fi
fi fi
if [ -z "$Proxy" ]; then if [ -z "$Proxy" ]; then
LOG_OUT "Error: Missing Porxy-Group's Name, Stop Setting The Other Rules!" LOG_OUT "Error: Missing Porxy-Group's Name, Stop Setting The Other Rules!"
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
exit 0 exit 0
else else
#删除原有的部分,防止冲突 #删除原有的部分,防止冲突
@ -510,4 +516,4 @@ if [ "$1" != "0" ]; then
fi fi
fi fi
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"