mirror of
https://github.com/kenzok8/openwrt-packages.git
synced 2025-11-03 08:28:50 +08:00
update 2023-03-04 02:21:25
This commit is contained in:
@ -4325,6 +4325,7 @@ atlasdmt.com
|
||||
atlasonepoint.com
|
||||
atlaspost.com
|
||||
atlassian.com
|
||||
atlassian.net
|
||||
atlasvpn.com
|
||||
atnext.com
|
||||
atom.io
|
||||
@ -4647,6 +4648,7 @@ azuresmartspaces.net
|
||||
azurespeed.com
|
||||
azurestackvalidation.com
|
||||
azurewebsites.net
|
||||
b-eroland.net
|
||||
b-ok.as
|
||||
b-ok.cc
|
||||
b-ok.global
|
||||
@ -16128,6 +16130,7 @@ japan18tube.com
|
||||
japanbeast.com
|
||||
japancoconut.weebly.com
|
||||
japancupid.com
|
||||
japanese-scat.net
|
||||
japanesebeauties.net
|
||||
japanesegirlspictures.com
|
||||
japaneselovelygirl.com
|
||||
@ -16259,6 +16262,7 @@ javme.me
|
||||
javmenu.com
|
||||
javmix.me
|
||||
javmix.tv
|
||||
javmobile.mobi
|
||||
javmobile.net
|
||||
javmodel.com
|
||||
javmoo.com
|
||||
@ -17299,6 +17303,7 @@ laurelvictoriagray.com
|
||||
lavteam.org
|
||||
lawofhongkong.com
|
||||
lawyerpu.com
|
||||
laxd.com
|
||||
lazerpenguin.com
|
||||
lazymike.com
|
||||
lazymind.me
|
||||
@ -19411,6 +19416,7 @@ movenetworks.com
|
||||
movetv.com
|
||||
movidius.com
|
||||
movidius.net
|
||||
movie-erog.com
|
||||
movie-jamrock.com
|
||||
moviefap.com
|
||||
movienthusiast.com
|
||||
@ -20880,6 +20886,7 @@ observable.net
|
||||
observechina.net
|
||||
obsproject.com
|
||||
obsrvbl.com
|
||||
obutsumania.com
|
||||
obutu.com
|
||||
ocaspro.com
|
||||
ocbmwdealers.com
|
||||
@ -24110,6 +24117,7 @@ sc-cdn.net
|
||||
sc1288.co
|
||||
sc1919.com
|
||||
sca
|
||||
sca-tolo.info
|
||||
scala-lang.org
|
||||
scala-sbt.org
|
||||
scalatube.com
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-openclash
|
||||
PKG_VERSION:=0.45.87
|
||||
PKG_VERSION:=0.45.97
|
||||
PKG_RELEASE:=beta
|
||||
PKG_MAINTAINER:=vernesong <https://github.com/vernesong/OpenClash>
|
||||
|
||||
@ -45,6 +45,7 @@ define Build/Prepare
|
||||
$(CP) $(CURDIR)/luasrc $(PKG_BUILD_DIR)
|
||||
$(foreach po,$(wildcard ${CURDIR}/po/zh-cn/*.po), \
|
||||
po2lmo $(po) $(PKG_BUILD_DIR)/$(patsubst %.po,%.lmo,$(notdir $(po)));)
|
||||
sed -i "s/v0.00.00-beta/v$(PKG_VERSION)-beta/g" $(PKG_BUILD_DIR)/root/www/luci-static/resources/openclash/img/version.svg >/dev/null 2>&1
|
||||
chmod 0755 $(PKG_BUILD_DIR)/root/etc/init.d/openclash
|
||||
chmod -R 0755 $(PKG_BUILD_DIR)/root/usr/share/openclash/
|
||||
mkdir -p $(PKG_BUILD_DIR)/root/etc/openclash/config
|
||||
@ -69,7 +70,7 @@ define Build/Prepare
|
||||
cp -f "$(PKG_BUILD_DIR)/root/etc/openclash/custom/openclash_custom_chnroute_pass.list" "$(PKG_BUILD_DIR)/root/usr/share/openclash/backup/openclash_custom_chnroute_pass.list" >/dev/null 2>&1
|
||||
cp -f "$(PKG_BUILD_DIR)/root/etc/openclash/custom/openclash_custom_chnroute6_pass.list" "$(PKG_BUILD_DIR)/root/usr/share/openclash/backup/openclash_custom_chnroute6_pass.list" >/dev/null 2>&1
|
||||
cp -f "$(PKG_BUILD_DIR)/root/etc/openclash/custom/openclash_custom_firewall_rules.sh" "$(PKG_BUILD_DIR)/root/usr/share/openclash/backup/openclash_custom_firewall_rules.sh" >/dev/null 2>&1
|
||||
cp -f "$(PKG_BUILD_DIR)/root/usr/share/openclash/yml_change.sh" "$(PKG_BUILD_DIR)/root/usr/share/openclash/backup/yml_change.sh" >/dev/null 2>&1
|
||||
cp -f "$(PKG_BUILD_DIR)/root/etc/openclash/custom/openclash_custom_overwrite.sh" "$(PKG_BUILD_DIR)/root/usr/share/openclash/backup/openclash_custom_overwrite.sh" >/dev/null 2>&1
|
||||
exit 0
|
||||
endef
|
||||
|
||||
@ -94,6 +95,9 @@ define Package/$(PKG_NAME)/preinst
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/postinst
|
||||
#!/bin/sh
|
||||
sed -i "s/v0.00.00-beta/v$(PKG_VERSION)-beta/g" /www/luci-static/resources/openclash/img/version.svg >/dev/null 2>&1
|
||||
exit 0
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/prerm
|
||||
|
||||
@ -73,25 +73,27 @@ function index()
|
||||
entry({"admin", "services", "openclash", "rename_file"}, call("rename_file"))
|
||||
entry({"admin", "services", "openclash", "manual_stream_unlock_test"}, call("manual_stream_unlock_test"))
|
||||
entry({"admin", "services", "openclash", "all_proxies_stream_test"}, call("all_proxies_stream_test"))
|
||||
entry({"admin", "services", "openclash", "settings"},cbi("openclash/settings"),_("Global Settings"), 30).leaf = true
|
||||
entry({"admin", "services", "openclash", "servers"},cbi("openclash/servers"),_("Servers and Groups"), 40).leaf = true
|
||||
entry({"admin", "services", "openclash", "set_subinfo_url"}, call("set_subinfo_url"))
|
||||
entry({"admin", "services", "openclash", "settings"},cbi("openclash/settings"),_("Plugin Settings"), 30).leaf = true
|
||||
entry({"admin", "services", "openclash", "config-overwrite"},cbi("openclash/config-overwrite"),_("Overwrite Settings"), 40).leaf = true
|
||||
entry({"admin", "services", "openclash", "servers"},cbi("openclash/servers"),_("Onekey Create"), 50).leaf = true
|
||||
entry({"admin", "services", "openclash", "other-rules-edit"},cbi("openclash/other-rules-edit"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "custom-dns-edit"},cbi("openclash/custom-dns-edit"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "other-file-edit"},cbi("openclash/other-file-edit"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "rule-providers-settings"},cbi("openclash/rule-providers-settings"),_("Rule Providers and Groups"), 50).leaf = true
|
||||
entry({"admin", "services", "openclash", "rule-providers-settings"},cbi("openclash/rule-providers-settings"),_("Rule Providers Append"), 60).leaf = true
|
||||
entry({"admin", "services", "openclash", "game-rules-manage"},form("openclash/game-rules-manage"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "rule-providers-manage"},form("openclash/rule-providers-manage"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "proxy-provider-file-manage"},form("openclash/proxy-provider-file-manage"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "rule-providers-file-manage"},form("openclash/rule-providers-file-manage"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "game-rules-file-manage"},form("openclash/game-rules-file-manage"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "config-subscribe"},cbi("openclash/config-subscribe"),_("Config Update"), 60).leaf = true
|
||||
entry({"admin", "services", "openclash", "config-subscribe"},cbi("openclash/config-subscribe"),_("Config Subscribe"), 70).leaf = true
|
||||
entry({"admin", "services", "openclash", "config-subscribe-edit"},cbi("openclash/config-subscribe-edit"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "servers-config"},cbi("openclash/servers-config"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "groups-config"},cbi("openclash/groups-config"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "proxy-provider-config"},cbi("openclash/proxy-provider-config"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "rule-providers-config"},cbi("openclash/rule-providers-config"), nil).leaf = true
|
||||
entry({"admin", "services", "openclash", "config"},form("openclash/config"),_("Config Manage"), 70).leaf = true
|
||||
entry({"admin", "services", "openclash", "log"},cbi("openclash/log"),_("Server Logs"), 80).leaf = true
|
||||
entry({"admin", "services", "openclash", "config"},form("openclash/config"),_("Config Manage"), 80).leaf = true
|
||||
entry({"admin", "services", "openclash", "log"},cbi("openclash/log"),_("Server Logs"), 90).leaf = true
|
||||
|
||||
end
|
||||
local fs = require "luci.openclash"
|
||||
@ -582,63 +584,116 @@ function action_switch_config()
|
||||
uci:commit("openclash")
|
||||
end
|
||||
|
||||
function sub_info_get()
|
||||
local filename, sub_url, sub_info, info, upload, download, total, expire, http_code, len, percent, day_left, day_expire
|
||||
function set_subinfo_url()
|
||||
local filename, url, info
|
||||
filename = luci.http.formvalue("filename")
|
||||
sub_info = ""
|
||||
if filename and not is_start() then
|
||||
uci:foreach("openclash", "config_subscribe",
|
||||
url = luci.http.formvalue("url")
|
||||
if not filename then
|
||||
info = "Oops: The config file name seems to be incorrect"
|
||||
end
|
||||
if url ~= "" and not string.find(url, "http") then
|
||||
info = "Oops: The url link format seems to be incorrect"
|
||||
end
|
||||
if not info then
|
||||
uci:foreach("openclash", "subscribe_info",
|
||||
function(s)
|
||||
if s.name == filename and s.address and string.find(s.address, "http") then
|
||||
_, len = string.gsub(s.address, '[^\n]+', "")
|
||||
if len and len > 1 then return end
|
||||
sub_url = s.address
|
||||
info = luci.sys.exec(string.format("curl -sLI -X GET -m 10 -w 'http_code='%%{http_code} -H 'User-Agent: Clash' '%s'", sub_url))
|
||||
if not info or tonumber(string.sub(string.match(info, "http_code=%d+"), 11, -1)) ~= 200 then
|
||||
info = luci.sys.exec(string.format("curl -sLI -X GET -m 10 -w 'http_code='%%{http_code} -H 'User-Agent: Quantumultx' '%s'", sub_url))
|
||||
end
|
||||
if info then
|
||||
http_code=string.sub(string.match(info, "http_code=%d+"), 11, -1)
|
||||
if tonumber(http_code) == 200 then
|
||||
info = string.lower(info)
|
||||
if string.find(info, "subscription%-userinfo") then
|
||||
info = luci.sys.exec("echo '%s' |grep 'subscription-userinfo'" %info)
|
||||
upload = string.sub(string.match(info, "upload=%d+"), 8, -1) or nil
|
||||
download = string.sub(string.match(info, "download=%d+"), 10, -1) or nil
|
||||
total = tonumber(string.format("%.1f",string.sub(string.match(info, "total=%d+"), 7, -1))) or nil
|
||||
used = tonumber(string.format("%.1f",(upload + download))) or nil
|
||||
if string.match(info, "expire=%d+") then
|
||||
day_expire = tonumber(string.sub(string.match(info, "expire=%d+"), 8, -1)) or nil
|
||||
end
|
||||
expire = os.date("%Y-%m-%d", day_expire) or "null"
|
||||
if day_expire and os.time() <= day_expire then
|
||||
day_left = math.ceil((day_expire - os.time()) / (3600*24))
|
||||
elseif day_expire == nil then
|
||||
day_left = "null"
|
||||
else
|
||||
day_left = 0
|
||||
end
|
||||
|
||||
if used and total and used < total then
|
||||
percent = string.format("%.1f",((total-used)/total)*100) or nil
|
||||
elseif used == nil or total == nil or total == 0 then
|
||||
percent = 100
|
||||
else
|
||||
percent = 0
|
||||
end
|
||||
total = fs.filesize(total) or "null"
|
||||
used = fs.filesize(used) or "null"
|
||||
sub_info = "Successful"
|
||||
else
|
||||
sub_info = "No Sub Info Found"
|
||||
end
|
||||
end
|
||||
if s.name == filename then
|
||||
if url == "" then
|
||||
uci:delete("openclash", s[".name"])
|
||||
uci:commit("openclash")
|
||||
info = "Delete success"
|
||||
else
|
||||
uci:set("openclash", s[".name"], "url", url)
|
||||
uci:commit("openclash")
|
||||
info = "Success"
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
if not info then
|
||||
if url == "" then
|
||||
info = "Delete success"
|
||||
else
|
||||
uci:section("openclash", "subscribe_info", nil, {name = filename, url = url})
|
||||
uci:commit("openclash")
|
||||
info = "Success"
|
||||
end
|
||||
end
|
||||
end
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json({
|
||||
info = info;
|
||||
})
|
||||
end
|
||||
|
||||
function sub_info_get()
|
||||
local filepath, filename, sub_url, sub_info, info, upload, download, total, expire, http_code, len, percent, day_left, day_expire
|
||||
local info_tb = {}
|
||||
filename = luci.http.formvalue("filename")
|
||||
sub_info = ""
|
||||
if filename and not is_start() then
|
||||
uci:foreach("openclash", "subscribe_info",
|
||||
function(s)
|
||||
if s.name == filename and s.url and string.find(s.url, "http") then
|
||||
string.gsub(s.url, '[^\n]+', function(w) table.insert(info_tb, w) end)
|
||||
sub_url = info_tb[1]
|
||||
end
|
||||
end
|
||||
)
|
||||
if not sub_url then
|
||||
uci:foreach("openclash", "config_subscribe",
|
||||
function(s)
|
||||
if s.name == filename and s.address and string.find(s.address, "http") then
|
||||
string.gsub(s.address, '[^\n]+', function(w) table.insert(info_tb, w) end)
|
||||
sub_url = info_tb[1]
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
if not sub_url then
|
||||
sub_info = "No Sub Info Found"
|
||||
else
|
||||
info = luci.sys.exec(string.format("curl -sLI -X GET -m 10 -w 'http_code='%%{http_code} -H 'User-Agent: Clash' '%s'", sub_url))
|
||||
if not info or tonumber(string.sub(string.match(info, "http_code=%d+"), 11, -1)) ~= 200 then
|
||||
info = luci.sys.exec(string.format("curl -sLI -X GET -m 10 -w 'http_code='%%{http_code} -H 'User-Agent: Quantumultx' '%s'", sub_url))
|
||||
end
|
||||
if info then
|
||||
http_code=string.sub(string.match(info, "http_code=%d+"), 11, -1)
|
||||
if tonumber(http_code) == 200 then
|
||||
info = string.lower(info)
|
||||
if string.find(info, "subscription%-userinfo") then
|
||||
info = luci.sys.exec("echo '%s' |grep 'subscription-userinfo'" %info)
|
||||
upload = string.sub(string.match(info, "upload=%d+"), 8, -1) or nil
|
||||
download = string.sub(string.match(info, "download=%d+"), 10, -1) or nil
|
||||
total = tonumber(string.format("%.1f",string.sub(string.match(info, "total=%d+"), 7, -1))) or nil
|
||||
used = tonumber(string.format("%.1f",(upload + download))) or nil
|
||||
if string.match(info, "expire=%d+") then
|
||||
day_expire = tonumber(string.sub(string.match(info, "expire=%d+"), 8, -1)) or nil
|
||||
end
|
||||
expire = os.date("%Y-%m-%d", day_expire) or "null"
|
||||
if day_expire and os.time() <= day_expire then
|
||||
day_left = math.ceil((day_expire - os.time()) / (3600*24))
|
||||
elseif day_expire == nil then
|
||||
day_left = "null"
|
||||
else
|
||||
day_left = 0
|
||||
end
|
||||
|
||||
if used and total and used < total then
|
||||
percent = string.format("%.1f",((total-used)/total)*100) or nil
|
||||
elseif used == nil or total == nil or total == 0 then
|
||||
percent = 100
|
||||
else
|
||||
percent = 0
|
||||
end
|
||||
total = fs.filesize(total) or "null"
|
||||
used = fs.filesize(used) or "null"
|
||||
sub_info = "Successful"
|
||||
else
|
||||
sub_info = "No Sub Info Found"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
luci.http.prepare_content("application/json")
|
||||
|
||||
@ -0,0 +1,593 @@
|
||||
|
||||
local NXFS = require "nixio.fs"
|
||||
local SYS = require "luci.sys"
|
||||
local HTTP = require "luci.http"
|
||||
local DISP = require "luci.dispatcher"
|
||||
local UTIL = require "luci.util"
|
||||
local fs = require "luci.openclash"
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
local json = require "luci.jsonc"
|
||||
local datatype = require "luci.cbi.datatypes"
|
||||
|
||||
font_green = [[<b style=color:green>]]
|
||||
font_red = [[<b style=color:red>]]
|
||||
font_off = [[</b>]]
|
||||
bold_on = [[<strong>]]
|
||||
bold_off = [[</strong>]]
|
||||
|
||||
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
|
||||
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 || uci -q -p /tmp/state get network.lan.device) | 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("Overwrite Settings"))
|
||||
m.pageaction = false
|
||||
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>"
|
||||
|
||||
s = m:section(TypedSection, "openclash")
|
||||
s.anonymous = true
|
||||
|
||||
s:tab("settings", translate("General Settings"))
|
||||
s:tab("dns", "DNS "..translate("Settings"))
|
||||
s:tab("meta", translate("Meta Settings"))
|
||||
s:tab("rules", translate("Rules Setting"))
|
||||
s:tab("developer", translate("Developer Settings"))
|
||||
|
||||
----- General Settings
|
||||
o = s:taboption("settings", ListValue, "interface_name", translate("Bind Network Interface"))
|
||||
local de_int = SYS.exec("ip route |grep 'default' |awk '{print $5}' 2>/dev/null") or SYS.exec("/usr/share/openclash/openclash_get_network.lua 'dhcp'")
|
||||
o.description = translate("Default Interface Name:").." "..font_green..bold_on..de_int..bold_off..font_off..translate(",Try Enable If Network Loopback")
|
||||
local interfaces = SYS.exec("ls -l /sys/class/net/ 2>/dev/null |awk '{print $9}' 2>/dev/null")
|
||||
for interface in string.gmatch(interfaces, "%S+") do
|
||||
o:value(interface)
|
||||
end
|
||||
o:value("0", translate("Disable"))
|
||||
o.default = "0"
|
||||
|
||||
o = s:taboption("settings", Value, "tolerance", translate("Url-Test Group Tolerance (ms)"))
|
||||
o.description = translate("Switch To The New Proxy When The Delay Difference Between Old and The Fastest Currently is Greater Than This Value")
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("100")
|
||||
o:value("150")
|
||||
o.datatype = "uinteger"
|
||||
o.default = "0"
|
||||
|
||||
o = s:taboption("settings", Value, "github_address_mod", translate("Github Address Modify"))
|
||||
o.description = translate("Modify The Github Address In The Config And OpenClash With Proxy(CDN) To Prevent File Download Faild. Format Reference:").." ".."<a href='javascript:void(0)' onclick='javascript:return winOpen(\"https://ghproxy.com/\")'>https://ghproxy.com/</a>"
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("https://fastly.jsdelivr.net/")
|
||||
o:value("https://testingcf.jsdelivr.net/")
|
||||
o:value("https://raw.fastgit.org/")
|
||||
o:value("https://cdn.jsdelivr.net/")
|
||||
o.default = "0"
|
||||
|
||||
o = s:taboption("settings", Value, "urltest_address_mod", translate("Url-Test Address Modify"))
|
||||
o.description = translate("Modify The Url-Test Address In The Config")
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("http://www.gstatic.com/generate_204")
|
||||
o:value("http://cp.cloudflare.com/generate_204")
|
||||
o:value("https://cp.cloudflare.com/generate_204")
|
||||
o:value("http://captive.apple.com/generate_204")
|
||||
o.default = "0"
|
||||
|
||||
o = s:taboption("settings", ListValue, "log_level", translate("Log Level"))
|
||||
o.description = translate("Select Core's Log Level")
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("info", translate("Info Mode"))
|
||||
o:value("warning", translate("Warning Mode"))
|
||||
o:value("error", translate("Error Mode"))
|
||||
o:value("debug", translate("Debug Mode"))
|
||||
o:value("silent", translate("Silent Mode"))
|
||||
o.default = "0"
|
||||
|
||||
o = s:taboption("settings", Value, "dns_port")
|
||||
o.title = translate("DNS Port")
|
||||
o.default = "7874"
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Please Make Sure Ports Available")
|
||||
|
||||
o = s:taboption("settings", Value, "proxy_port")
|
||||
o.title = translate("Redir Port")
|
||||
o.default = "7892"
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Please Make Sure Ports Available")
|
||||
|
||||
o = s:taboption("settings", Value, "tproxy_port")
|
||||
o.title = translate("TProxy Port")
|
||||
o.default = "7895"
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Please Make Sure Ports Available")
|
||||
|
||||
o = s:taboption("settings", Value, "http_port")
|
||||
o.title = translate("HTTP(S) Port")
|
||||
o.default = "7890"
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Please Make Sure Ports Available")
|
||||
|
||||
o = s:taboption("settings", Value, "socks_port")
|
||||
o.title = translate("SOCKS5 Port")
|
||||
o.default = "7891"
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Please Make Sure Ports Available")
|
||||
|
||||
o = s:taboption("settings", Value, "mixed_port")
|
||||
o.title = translate("Mixed Port")
|
||||
o.default = "7893"
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Please Make Sure Ports Available")
|
||||
|
||||
---- DNS Settings
|
||||
|
||||
o = s:taboption("dns", Flag, "enable_custom_dns", font_red..bold_on..translate("Custom DNS Setting")..bold_off..font_off)
|
||||
o.description = font_red..bold_on..translate("Set OpenClash Upstream DNS Resolve Server")..bold_off..font_off
|
||||
o.default = 0
|
||||
|
||||
o = s:taboption("dns", Flag, "append_wan_dns", translate("Append Upstream DNS"))
|
||||
o.description = translate("Append The Upstream Assigned DNS And Gateway IP To The Nameserver")
|
||||
o.default = 1
|
||||
|
||||
o = s:taboption("dns", Flag, "append_default_dns", translate("Append Default DNS"))
|
||||
o.description = translate("Automatically Append Compliant DNS to default-nameserver")
|
||||
o.default = 1
|
||||
|
||||
if op_mode == "fake-ip" then
|
||||
o = s:taboption("dns", Value, "fakeip_range", translate("Fake-IP Range (IPv4 Cidr)"))
|
||||
o.description = translate("Set Fake-IP Range (IPv4 Cidr)")
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("198.18.0.1/16")
|
||||
o.default = "0"
|
||||
o.placeholder = "198.18.0.1/16"
|
||||
function o.validate(self, value)
|
||||
if value == "0" then
|
||||
return "0"
|
||||
end
|
||||
if datatype.cidr4(value) then
|
||||
return value
|
||||
end
|
||||
return "198.18.0.1/16"
|
||||
end
|
||||
|
||||
o = s:taboption("dns", Flag, "store_fakeip", translate("Persistence Fake-IP"))
|
||||
o.description = font_red..bold_on..translate("Cache Fake-IP DNS Resolution Records To File, Improve The Response Speed After Startup")..bold_off..font_off
|
||||
o.default = 1
|
||||
|
||||
end
|
||||
|
||||
o = s:taboption("dns", Flag, "custom_fallback_filter", translate("Fallback-Filter"))
|
||||
o.description = translate("Take Effect If Fallback DNS Setted, Prevent DNS Pollution")
|
||||
o.default = 0
|
||||
|
||||
custom_fallback_filter = s:taboption("dns", Value, "custom_fallback_fil")
|
||||
custom_fallback_filter.template = "cbi/tvalue"
|
||||
custom_fallback_filter.rows = 20
|
||||
custom_fallback_filter.wrap = "off"
|
||||
custom_fallback_filter:depends("custom_fallback_filter", "1")
|
||||
|
||||
function custom_fallback_filter.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_custom_fallback_filter.yaml") or ""
|
||||
end
|
||||
function custom_fallback_filter.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_custom_fallback_filter.yaml")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_custom_fallback_filter.yaml", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if op_mode == "fake-ip" then
|
||||
o = s:taboption("dns", Flag, "custom_fakeip_filter", translate("Fake-IP-Filter"))
|
||||
o.default = 0
|
||||
|
||||
custom_fake_black = s:taboption("dns", Value, "custom_fake_filter")
|
||||
custom_fake_black.template = "cbi/tvalue"
|
||||
custom_fake_black.description = translate("Domain Names In The List Do Not Return Fake-IP, One rule per line")
|
||||
custom_fake_black.rows = 20
|
||||
custom_fake_black.wrap = "off"
|
||||
custom_fake_black:depends("custom_fakeip_filter", "1")
|
||||
|
||||
function custom_fake_black.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_custom_fake_filter.list") or ""
|
||||
end
|
||||
function custom_fake_black.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_custom_fake_filter.list")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_custom_fake_filter.list", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
o = s:taboption("dns", Flag, "custom_name_policy", translate("Nameserver-Policy"))
|
||||
o.default = 0
|
||||
|
||||
custom_domain_dns_policy = s:taboption("dns", Value, "custom_domain_dns_core")
|
||||
custom_domain_dns_policy.template = "cbi/tvalue"
|
||||
custom_domain_dns_policy.description = translate("Domain Names In The List Use The Custom DNS Server, But Still Return Fake-IP Results, One rule per line")
|
||||
custom_domain_dns_policy.rows = 20
|
||||
custom_domain_dns_policy.wrap = "off"
|
||||
custom_domain_dns_policy:depends("custom_name_policy", "1")
|
||||
|
||||
function custom_domain_dns_policy.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_custom_domain_dns_policy.list") or ""
|
||||
end
|
||||
function custom_domain_dns_policy.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_custom_domain_dns_policy.list")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_custom_domain_dns_policy.list", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
o = s:taboption("dns", Flag, "custom_host", translate("Hosts"))
|
||||
o.default = 0
|
||||
|
||||
custom_hosts = s:taboption("dns", Value, "custom_hosts")
|
||||
custom_hosts.template = "cbi/tvalue"
|
||||
custom_hosts.description = translate("Custom Hosts Here, You May Need to Turn off The Rebinding Protection Option of Dnsmasq When Hosts Has Set a Reserved Address, For More Go:").." ".."<a href='javascript:void(0)' onclick='javascript:return winOpen(\"https://lancellc.gitbook.io/clash/clash-config-file/dns/host\")'>https://lancellc.gitbook.io/clash/clash-config-file/dns/host</a>"
|
||||
custom_hosts.rows = 20
|
||||
custom_hosts.wrap = "off"
|
||||
custom_hosts:depends("custom_host", "1")
|
||||
|
||||
function custom_hosts.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_custom_hosts.list") or ""
|
||||
end
|
||||
function custom_hosts.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_custom_hosts.list")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_custom_hosts.list", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Meta
|
||||
o = s:taboption("meta", Flag, "enable_tcp_concurrent", font_red..bold_on..translate("Enable Tcp Concurrent")..bold_off..font_off)
|
||||
o.description = font_red..bold_on..translate("TCP Concurrent Request IPs, Choose The Lowest Latency One To Connection")..bold_off..font_off
|
||||
o.default = "0"
|
||||
|
||||
o = s:taboption("meta", ListValue, "find_process_mode", translate("Enable Process Rule"))
|
||||
o.description = translate("Whether to Enable Process Rules, If You Are Not Sure, Please Choose off Which Useful in Router Environment")
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("off", translate("OFF "))
|
||||
o:value("always", translate("Always "))
|
||||
o:value("strict", translate("strict "))
|
||||
o.default = "0"
|
||||
|
||||
o = s:taboption("meta", ListValue, "global_client_fingerprint", translate("Client Fingerprint"))
|
||||
o.description = translate("Change The Client Fingerprint, Only Support TLS Transport in TCP/GRPC/WS/HTTP For Vless/Vmess and Trojan")
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("none", translate("None "))
|
||||
o:value("random", translate("Random"))
|
||||
o:value("chrome", translate("Chrome"))
|
||||
o:value("firefox", translate("Firefox"))
|
||||
o:value("safari", translate("Safari"))
|
||||
o:value("ios", translate("IOS"))
|
||||
o:value("android", translate("Android"))
|
||||
o:value("edge", translate("Edge"))
|
||||
o:value("360", translate("360"))
|
||||
o:value("qq", translate("QQ"))
|
||||
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 = s:taboption("meta", Flag, "enable_meta_sniffer_pure_ip", translate("Forced Sniff Pure IP"))
|
||||
o.description = translate("Forced Sniff Pure IP Connections")
|
||||
o.default = 1
|
||||
o:depends("enable_meta_sniffer", "1")
|
||||
|
||||
o = s:taboption("meta", Flag, "enable_meta_sniffer_custom", translate("Custom Sniffer Settings"))
|
||||
o.description = translate("Custom The Force and Skip Sniffing Doamin Lists")
|
||||
o.default = 0
|
||||
o:depends("enable_meta_sniffer", "1")
|
||||
|
||||
sniffing_domain_force = s:taboption("meta", Value, "sniffing_domain_force", translate("Force Sniffing Domains Lists"))
|
||||
sniffing_domain_force:depends("enable_meta_sniffer_custom", "1")
|
||||
sniffing_domain_force.template = "cbi/tvalue"
|
||||
sniffing_domain_force.description = translate("Will Override Dns Queries If Domains in The List")
|
||||
sniffing_domain_force.rows = 20
|
||||
sniffing_domain_force.wrap = "off"
|
||||
|
||||
function sniffing_domain_force.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_force_sniffing_domain.yaml") or ""
|
||||
end
|
||||
function sniffing_domain_force.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_force_sniffing_domain.yaml")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_force_sniffing_domain.yaml", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
sniffing_port_filter = s:taboption("meta", Value, "sniffing_port_filter", translate("Sniffing Ports Filter"))
|
||||
sniffing_port_filter:depends("enable_meta_sniffer_custom", "1")
|
||||
sniffing_port_filter.template = "cbi/tvalue"
|
||||
sniffing_port_filter.description = translate("Will Only Sniffing If Ports in The List")
|
||||
sniffing_port_filter.rows = 20
|
||||
sniffing_port_filter.wrap = "off"
|
||||
|
||||
function sniffing_port_filter.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_sniffing_ports_filter.yaml") or ""
|
||||
end
|
||||
function sniffing_port_filter.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_sniffing_ports_filter.yaml")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_sniffing_ports_filter.yaml", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
sniffing_domain_filter = s:taboption("meta", Value, "sniffing_domain_filter", translate("Force Sniffing Domains(sni) Filter"))
|
||||
sniffing_domain_filter:depends("enable_meta_sniffer_custom", "1")
|
||||
sniffing_domain_filter.template = "cbi/tvalue"
|
||||
sniffing_domain_filter.description = translate("Will Disable Sniffing If Domains(sni) in The List")
|
||||
sniffing_domain_filter.rows = 20
|
||||
sniffing_domain_filter.wrap = "off"
|
||||
|
||||
function sniffing_domain_filter.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_sniffing_domain_filter.yaml") or ""
|
||||
end
|
||||
function sniffing_domain_filter.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_sniffing_domain_filter.yaml")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_sniffing_domain_filter.yaml", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
o = s:taboption("meta", ListValue, "geodata_loader", translate("Geodata Loader Mode"))
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("memconservative", translate("Memconservative"))
|
||||
o:value("standard", translate("Standard"))
|
||||
o.default = "0"
|
||||
|
||||
o = s:taboption("meta", ListValue, "enable_geoip_dat", translate("Enable GeoIP Dat"))
|
||||
o.description = translate("Replace GEOIP MMDB With GEOIP Dat, Large Size File")..", "..font_red..bold_on..translate("Need Download First")..bold_off..font_off
|
||||
o.default = 0
|
||||
o:value("0", translate("Disable"))
|
||||
o:value("1", translate("Enable"))
|
||||
|
||||
---- Rules Settings
|
||||
o = s:taboption("rules", Flag, "rule_source", translate("Enable Other Rules"))
|
||||
o.description = translate("Use Other Rules")
|
||||
o.default = 0
|
||||
|
||||
o = s:taboption("rules", Flag, "enable_rule_proxy", translate("Rule Match Proxy Mode"))
|
||||
o.description = translate("Append Some Rules to Config, Allow Only Traffic Proxies that Match the Rule, Prevent BT/P2P Passing")
|
||||
o.default = 0
|
||||
|
||||
o = s:taboption("rules", Flag, "enable_custom_clash_rules", font_red..bold_on..translate("Custom Clash Rules")..bold_off..font_off)
|
||||
o.description = translate("Use Custom Rules")
|
||||
o.default = 0
|
||||
|
||||
custom_rules = s:taboption("rules", Value, "custom_rules")
|
||||
custom_rules:depends("enable_custom_clash_rules", 1)
|
||||
custom_rules.template = "cbi/tvalue"
|
||||
custom_rules.description = translate("Custom Priority Rules Here, For More Go:").." ".."<a href='javascript:void(0)' onclick='javascript:return winOpen(\"https://lancellc.gitbook.io/clash/clash-config-file/rules\")'>https://lancellc.gitbook.io/clash/clash-config-file/rules</a>".." ,"..translate("IP To CIDR:").." ".."<a href='javascript:void(0)' onclick='javascript:return winOpen(\"http://ip2cidr.com\")'>http://ip2cidr.com</a>"
|
||||
custom_rules.rows = 20
|
||||
custom_rules.wrap = "off"
|
||||
|
||||
function custom_rules.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_custom_rules.list") or ""
|
||||
end
|
||||
function custom_rules.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_custom_rules.list")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_custom_rules.list", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
custom_rules_2 = s:taboption("rules", Value, "custom_rules_2")
|
||||
custom_rules_2:depends("enable_custom_clash_rules", 1)
|
||||
custom_rules_2.template = "cbi/tvalue"
|
||||
custom_rules_2.description = translate("Custom Extended Rules Here, For More Go:").." ".."<a href='javascript:void(0)' onclick='javascript:return winOpen(\"https://lancellc.gitbook.io/clash/clash-config-file/rules\")'>https://lancellc.gitbook.io/clash/clash-config-file/rules</a>".." ,"..translate("IP To CIDR:").." ".."<a href='javascript:void(0)' onclick='javascript:return winOpen(\"http://ip2cidr.com\")'>http://ip2cidr.com</a>"
|
||||
custom_rules_2.rows = 20
|
||||
custom_rules_2.wrap = "off"
|
||||
|
||||
function custom_rules_2.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_custom_rules_2.list") or ""
|
||||
end
|
||||
function custom_rules_2.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_custom_rules_2.list")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_custom_rules_2.list", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---- developer
|
||||
o = s:taboption("developer", Value, "ymchange_custom")
|
||||
o.template = "cbi/tvalue"
|
||||
o.description = translate("Custom Config Overwrite Scripts Which Will Run After Plugin Own Completely, Please Be Careful, The Wrong Changes May Lead to Exceptions")
|
||||
o.rows = 30
|
||||
o.wrap = "off"
|
||||
|
||||
function o.cfgvalue(self, section)
|
||||
return NXFS.readfile("/etc/openclash/custom/openclash_custom_overwrite.sh") or ""
|
||||
end
|
||||
function o.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n?", "\n")
|
||||
local old_value = NXFS.readfile("/etc/openclash/custom/openclash_custom_overwrite.sh")
|
||||
if value ~= old_value then
|
||||
NXFS.writefile("/etc/openclash/custom/openclash_custom_overwrite.sh", value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- [[ Edit Custom DNS ]] --
|
||||
ds = m:section(TypedSection, "dns_servers", translate("Add Custom DNS Servers")..translate("(Take Effect After Choose Above)"))
|
||||
ds.anonymous = true
|
||||
ds.addremove = true
|
||||
ds.sortable = true
|
||||
ds.template = "openclash/tblsection_dns"
|
||||
ds.extedit = luci.dispatcher.build_url("admin/services/openclash/custom-dns-edit/%s")
|
||||
function ds.create(...)
|
||||
local sid = TypedSection.create(...)
|
||||
if sid then
|
||||
luci.http.redirect(ds.extedit % sid)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
---- enable flag
|
||||
o = ds:option(Flag, "enabled", translate("Enable"))
|
||||
o.rmempty = false
|
||||
o.default = o.enabled
|
||||
o.cfgvalue = function(...)
|
||||
return Flag.cfgvalue(...) or "1"
|
||||
end
|
||||
|
||||
---- group
|
||||
o = ds:option(ListValue, "group", translate("DNS Server Group"))
|
||||
o:value("nameserver", translate("NameServer "))
|
||||
o:value("fallback", translate("FallBack "))
|
||||
o:value("default", translate("Default-NameServer"))
|
||||
o.default = "nameserver"
|
||||
o.rempty = false
|
||||
|
||||
---- IP address
|
||||
o = ds:option(Value, "ip", translate("DNS Server Address"))
|
||||
o.placeholder = translate("Not Null")
|
||||
o.datatype = "or(host, string)"
|
||||
o.rmempty = true
|
||||
|
||||
---- port
|
||||
o = ds:option(Value, "port", translate("DNS Server Port"))
|
||||
o.datatype = "port"
|
||||
o.rempty = true
|
||||
|
||||
---- type
|
||||
o = ds:option(ListValue, "type", translate("DNS Server Type"))
|
||||
o:value("udp", translate("UDP"))
|
||||
o:value("tcp", translate("TCP"))
|
||||
o:value("tls", translate("TLS"))
|
||||
o:value("https", translate("HTTPS"))
|
||||
o:value("quic", translate("QUIC ")..translate("(Only Meta Core)"))
|
||||
o.default = "udp"
|
||||
o.rempty = false
|
||||
|
||||
-- [[ Other Rules Manage ]]--
|
||||
ss = m:section(TypedSection, "other_rules", translate("Other Rules Edit")..translate("(Take Effect After Choose Above)"))
|
||||
ss.anonymous = true
|
||||
ss.addremove = true
|
||||
ss.sortable = true
|
||||
ss.template = "cbi/tblsection"
|
||||
ss.extedit = luci.dispatcher.build_url("admin/services/openclash/other-rules-edit/%s")
|
||||
function ss.create(...)
|
||||
local sid = TypedSection.create(...)
|
||||
if sid then
|
||||
luci.http.redirect(ss.extedit % sid)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
o = ss:option(Flag, "enabled", translate("Enable"))
|
||||
o.rmempty = false
|
||||
o.default = o.enabled
|
||||
o.cfgvalue = function(...)
|
||||
return Flag.cfgvalue(...) or "1"
|
||||
end
|
||||
|
||||
o = ss:option(DummyValue, "config", translate("Config File"))
|
||||
function o.cfgvalue(...)
|
||||
return Value.cfgvalue(...) or translate("None")
|
||||
end
|
||||
|
||||
o = ss:option(DummyValue, "rule_name", translate("Other Rules Name"))
|
||||
function o.cfgvalue(...)
|
||||
if Value.cfgvalue(...) == "lhie1" then
|
||||
return translate("lhie1 Rules")
|
||||
elseif Value.cfgvalue(...) == "ConnersHua" then
|
||||
return translate("ConnersHua(Provider-type) Rules")
|
||||
elseif Value.cfgvalue(...) == "ConnersHua_return" then
|
||||
return translate("ConnersHua Return Rules")
|
||||
else
|
||||
return translate("None")
|
||||
end
|
||||
end
|
||||
|
||||
o = ss:option(DummyValue, "Note", translate("Note"))
|
||||
function o.cfgvalue(...)
|
||||
return Value.cfgvalue(...) or translate("None")
|
||||
end
|
||||
|
||||
-- [[ Edit Authentication ]] --
|
||||
s = m:section(TypedSection, "authentication", translate("Set Authentication of SOCKS5/HTTP(S)"))
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.sortable = false
|
||||
s.template = "cbi/tblsection"
|
||||
s.rmempty = false
|
||||
|
||||
---- enable flag
|
||||
o = s:option(Flag, "enabled", translate("Enable"))
|
||||
o.rmempty = false
|
||||
o.default = o.enabled
|
||||
o.cfgvalue = function(...)
|
||||
return Flag.cfgvalue(...) or "1"
|
||||
end
|
||||
|
||||
---- username
|
||||
o = s:option(Value, "username", translate("Username"))
|
||||
o.placeholder = translate("Not Null")
|
||||
o.rempty = true
|
||||
|
||||
---- password
|
||||
o = s:option(Value, "password", translate("Password"))
|
||||
o.placeholder = translate("Not Null")
|
||||
o.rmempty = true
|
||||
|
||||
local t = {
|
||||
{Commit, Apply}
|
||||
}
|
||||
|
||||
a = m:section(Table, t)
|
||||
|
||||
o = a:option(Button, "Commit", " ")
|
||||
o.inputtitle = translate("Commit Settings")
|
||||
o.inputstyle = "apply"
|
||||
o.write = function()
|
||||
m.uci:commit("openclash")
|
||||
end
|
||||
|
||||
o = a:option(Button, "Apply", " ")
|
||||
o.inputtitle = translate("Apply Settings")
|
||||
o.inputstyle = "apply"
|
||||
o.write = function()
|
||||
m.uci:set("openclash", "config", "enable", 1)
|
||||
m.uci:commit("openclash")
|
||||
SYS.call("/etc/init.d/openclash restart >/dev/null 2>&1 &")
|
||||
HTTP.redirect(DISP.build_url("admin", "services", "openclash"))
|
||||
end
|
||||
|
||||
m:append(Template("openclash/config_editor"))
|
||||
m:append(Template("openclash/toolbar_show"))
|
||||
|
||||
return m
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ font_off = [[</b>]]
|
||||
bold_on = [[<strong>]]
|
||||
bold_off = [[</strong>]]
|
||||
|
||||
m = Map("openclash", translate("Config Update"))
|
||||
m = Map("openclash", translate("Config Subscribe"))
|
||||
m.pageaction = false
|
||||
|
||||
s = m:section(TypedSection, "openclash")
|
||||
|
||||
@ -13,7 +13,7 @@ bold_off = [[</strong>]]
|
||||
|
||||
m = Map(openclash, translate("Add Custom DNS Servers"))
|
||||
m.pageaction = false
|
||||
m.redirect = luci.dispatcher.build_url("admin/services/openclash/settings")
|
||||
m.redirect = luci.dispatcher.build_url("admin/services/openclash/config-overwrite")
|
||||
if m.uci:get(openclash, sid) ~= "dns_servers" then
|
||||
luci.http.redirect(m.redirect)
|
||||
return
|
||||
|
||||
@ -96,7 +96,7 @@ o.default = "150"
|
||||
o.rmempty = true
|
||||
o:depends("type", "url-test")
|
||||
|
||||
o = s:option(Value, "policy_filter", translate("Policy Filter").." "..translate("(Only Meta Core)"))
|
||||
o = s:option(Value, "policy_filter", translate("Provider Filter").." "..translate("(Only Meta Core)"))
|
||||
o.rmempty = true
|
||||
o.placeholder = "bgp|sg"
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ end
|
||||
|
||||
m = Map(openclash, translate("Other Rules Edit"))
|
||||
m.pageaction = false
|
||||
m.redirect = luci.dispatcher.build_url("admin/services/openclash/settings")
|
||||
m.redirect = luci.dispatcher.build_url("admin/services/openclash/config-overwrite")
|
||||
if m.uci:get(openclash, sid) ~= "other_rules" then
|
||||
luci.http.redirect(m.redirect)
|
||||
return
|
||||
@ -189,7 +189,7 @@ end
|
||||
o:value("DIRECT")
|
||||
o:value("REJECT")
|
||||
|
||||
o = s:option(ListValue, "Apple_TV", translate("Apple TV"))
|
||||
o = s:option(ListValue, "AppleTV", translate("Apple TV"))
|
||||
o:depends("rule_name", "lhie1")
|
||||
o.rmempty = true
|
||||
for groupname in string.gmatch(groupnames, "([^'##\n']+)##") do
|
||||
|
||||
@ -9,7 +9,7 @@ local UTIL = require "luci.util"
|
||||
local fs = require "luci.openclash"
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
|
||||
m = Map(openclash, translate("Rule Providers and Groups"))
|
||||
m = Map(openclash, translate("Rule Providers Append"))
|
||||
m.pageaction = false
|
||||
m.description=translate("Attention:")..
|
||||
"<br/>"..translate("The game proxy is a test function and does not guarantee the availability of rules")..
|
||||
@ -42,11 +42,11 @@ function IsYmlFile(e)
|
||||
end
|
||||
|
||||
-- [[ Edit Game Rule ]] --
|
||||
s = m:section(TypedSection, "game_config", translate("Game Rules and Groups (Only TUN & Meta Core Support)"))
|
||||
s = m:section(TypedSection, "game_config", translate("Game Rules Append (Only TUN & Meta Core Support)"))
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.sortable = true
|
||||
s.template = "cbi/tblsection"
|
||||
s.template = "openclash/tblsection"
|
||||
s.rmempty = false
|
||||
|
||||
---- enable flag
|
||||
@ -118,11 +118,11 @@ o:value("REJECT")
|
||||
o.rmempty = true
|
||||
|
||||
-- [[ Edit Other Rule Provider ]] --
|
||||
s = m:section(TypedSection, "rule_provider_config", translate("Other Rule Providers and Groups (Only TUN & Meta Core Support)"))
|
||||
s = m:section(TypedSection, "rule_provider_config", translate("Other Rule Providers Append (Only TUN & Meta Core Support)"))
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.sortable = true
|
||||
s.template = "cbi/tblsection"
|
||||
s.template = "openclash/tblsection"
|
||||
s.rmempty = false
|
||||
|
||||
---- enable flag
|
||||
@ -204,11 +204,11 @@ o:value("0", translate("Priority Match"))
|
||||
o:value("1", translate("Extended Match"))
|
||||
|
||||
-- [[ Edit Custom Rule Provider ]] --
|
||||
s = m:section(TypedSection, "rule_providers", translate("Custom Rule Providers and Groups (Only TUN & Meta Core Support)"))
|
||||
s = m:section(TypedSection, "rule_providers", translate("Custom Rule Providers Append (Only TUN & Meta Core Support)"))
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.sortable = true
|
||||
s.template = "cbi/tblsection"
|
||||
s.template = "openclash/tblsection"
|
||||
s.extedit = luci.dispatcher.build_url("admin/services/openclash/rule-providers-config/%s")
|
||||
function s.create(...)
|
||||
local sid = TypedSection.create(...)
|
||||
|
||||
@ -361,6 +361,13 @@ o:depends("type", "trojan")
|
||||
o:depends({type = "snell", snell_version = "3"})
|
||||
o:depends("type", "wireguard")
|
||||
|
||||
o = s:option(ListValue, "udp_over_tcp", translate("udp-over-tcp"))
|
||||
o.rmempty = true
|
||||
o.default = "false"
|
||||
o:value("true")
|
||||
o:value("false")
|
||||
o:depends("type", "ss")
|
||||
|
||||
o = s:option(ListValue, "xudp", translate("XUDP Enable")..translate("(Only Meta Core)"))
|
||||
o.rmempty = true
|
||||
o.default = "true"
|
||||
@ -495,14 +502,6 @@ o:depends("type", "vless")
|
||||
o:depends("type", "hysteria")
|
||||
o:depends("type", "tuic")
|
||||
|
||||
o = s:option(ListValue, "fast_open", translate("Fast Open"))
|
||||
o.rmempty = true
|
||||
o.default = "false"
|
||||
o:value("true")
|
||||
o:value("false")
|
||||
o:depends("type", "hysteria")
|
||||
o:depends("type", "tuic")
|
||||
|
||||
-- [[ TLS ]]--
|
||||
o = s:option(ListValue, "tls", translate("TLS"))
|
||||
o.rmempty = true
|
||||
@ -529,6 +528,7 @@ o.rmempty = true
|
||||
o.default = "xtls-rprx-direct"
|
||||
o:value("xtls-rprx-direct")
|
||||
o:value("xtls-rprx-origin")
|
||||
o:value("xtls-rprx-vision")
|
||||
o:depends("obfs_vless", "none")
|
||||
|
||||
o = s:option(Value, "keep_alive", translate("keep-alive"))
|
||||
@ -693,6 +693,30 @@ o:value("true")
|
||||
o:value("false")
|
||||
o:depends("type", "vmess")
|
||||
|
||||
-- [[ TFO ]]--
|
||||
o = s:option(ListValue, "fast_open", translate("Fast Open"))
|
||||
o.rmempty = true
|
||||
o.default = "true"
|
||||
o:value("true")
|
||||
o:value("false")
|
||||
o:depends("type", "hysteria")
|
||||
o:depends("type", "tuic")
|
||||
|
||||
-- [[ TFO ]]--
|
||||
o = s:option(ListValue, "tfo", translate("TFO")..translate("(Only Meta Core)"))
|
||||
o.rmempty = true
|
||||
o.default = "true"
|
||||
o:value("true")
|
||||
o:value("false")
|
||||
o:depends("type", "http")
|
||||
o:depends("type", "socks5")
|
||||
o:depends("type", "trojan")
|
||||
o:depends("type", "vless")
|
||||
o:depends("type", "vmess")
|
||||
o:depends("type", "ss")
|
||||
o:depends("type", "ssr")
|
||||
o:depends("type", "snell")
|
||||
|
||||
-- [[ fingerprint ]]--
|
||||
o = s:option(Value, "fingerprint", translate("Fingerprint")..translate("(Only Meta Core)"))
|
||||
o.rmempty = true
|
||||
|
||||
@ -9,13 +9,14 @@ font_off = [[</b>]]
|
||||
bold_on = [[<strong>]]
|
||||
bold_off = [[</strong>]]
|
||||
|
||||
m = Map(openclash, translate("Servers manage and Config create"))
|
||||
m = Map(openclash, translate("Onekey Create (Servers&Groups manage)"))
|
||||
m.pageaction = false
|
||||
m.description=translate("Attention:")..
|
||||
"<br/>"..translate("1. Before modifying the configuration file, please click the button below to read the configuration file")..
|
||||
"<br/>"..translate("2. Proxy-providers address can be directly filled in the subscription link")..
|
||||
"<br/>"..
|
||||
"<br/>"..translate("Introduction to proxy usage: https://lancellc.gitbook.io/clash/clash-config-file/proxies")
|
||||
"<br/>"..translate("Introduction to proxy usage: https://lancellc.gitbook.io/clash/clash-config-file/proxies")..
|
||||
"<br/>"..translate("Introduction to proxy-provider usage: https://lancellc.gitbook.io/clash/clash-config-file/proxy-provider")
|
||||
|
||||
s = m:section(TypedSection, "openclash")
|
||||
s.anonymous = true
|
||||
@ -55,7 +56,7 @@ s = m:section(TypedSection, "groups", translate("Proxy Groups(No Need Set when C
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.sortable = true
|
||||
s.template = "cbi/tblsection"
|
||||
s.template = "openclash/tblsection"
|
||||
s.extedit = luci.dispatcher.build_url("admin/services/openclash/groups-config/%s")
|
||||
function s.create(...)
|
||||
local sid = TypedSection.create(...)
|
||||
@ -93,7 +94,7 @@ s = m:section(TypedSection, "proxy-provider", translate("Proxy-Provider"))
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.sortable = true
|
||||
s.template = "cbi/tblsection"
|
||||
s.template = "openclash/tblsection"
|
||||
s.extedit = luci.dispatcher.build_url("admin/services/openclash/proxy-provider-config/%s")
|
||||
function s.create(...)
|
||||
local sid = TypedSection.create(...)
|
||||
@ -137,7 +138,7 @@ s = m:section(TypedSection, "servers", translate("Proxies"))
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.sortable = true
|
||||
s.template = "cbi/tblsection"
|
||||
s.template = "openclash/tblsection"
|
||||
s.extedit = luci.dispatcher.build_url("admin/services/openclash/servers-config/%s")
|
||||
function s.create(...)
|
||||
local sid = TypedSection.create(...)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -2,18 +2,18 @@
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
function import_file_name(btn, option, file_path) {
|
||||
var file_name = prompt("<%:Paste the name of the new file (including the extension) here:%>", "");
|
||||
if (file_name == null || file_name == "") {
|
||||
return false;
|
||||
}
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "create_file")%>', {filename: file_name, filepath: file_path}, function(x, status) {
|
||||
if (x && x.status == 200)
|
||||
{
|
||||
location.reload();
|
||||
}
|
||||
});
|
||||
var file_name = prompt("<%:Paste the name of the new file (including the extension) here:%>", "");
|
||||
if (file_name == null || file_name == "") {
|
||||
return false;
|
||||
}
|
||||
//]]>
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "create_file")%>', {filename: file_name, filepath: file_path}, function(x, status) {
|
||||
if (x && x.status == 200)
|
||||
{
|
||||
location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
//]]>
|
||||
</script>
|
||||
<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Create File%>" onclick="return import_file_name(this, '<%=self.option%>', '<%=self.value%>')" />
|
||||
<%+cbi/valuefooter%>
|
||||
|
||||
@ -130,7 +130,9 @@
|
||||
<tr><td>
|
||||
<div style="display: flex">
|
||||
<div style="width: 51%">
|
||||
<h3 style="margin: 10px -2% 10px 2%"><%:IP Address%></h3>
|
||||
<h3 style="margin: 10px -2% 10px 2%;"><%:IP Address%>
|
||||
<span style="float: right; margin: 5px 10% 5px 0%;"><img src='/luci-static/resources/openclash/img/eye-light.svg' height="20px" title='<%:Hide IP%>' alt='<%:Hide IP%>' onclick='return privacy_my_ip(this)'></span>
|
||||
</h3>
|
||||
<p style="margin: 10px -2% 10px 2%">
|
||||
<span class="ip-title">IP.TB <%:Mainland%>:</span><span class="ip-result" id="ip-taobao"></span> <span class="ip-geo" id="ip-taobao-geo"></span>
|
||||
</p>
|
||||
@ -145,7 +147,9 @@
|
||||
</p>
|
||||
</div>
|
||||
<div style="width: 49%">
|
||||
<h3 style="margin: 10px 0 10px 5%"><%:Website Access Check%></h3>
|
||||
<h3 style="margin: 10px 0 10px 5%"><%:Website Access Check%>
|
||||
<span style="float: right; margin: 5px 10% 5px 0%;"><img src='/luci-static/resources/openclash/img/arrow-clockwise-light.svg' height="20px" title='<%:Refresh%>' alt='<%:Refresh%>' onclick='return refresh_myip(this)'></span>
|
||||
</h3>
|
||||
<p style="margin: 10px 0 10px 5%">
|
||||
<span class="ip-state_title"><%:Baidu Search%>:</span><span id="http-baidu"></span><span id="ldtime-baidu"></span>
|
||||
</p>
|
||||
@ -174,6 +178,12 @@
|
||||
window.open(url2);
|
||||
}
|
||||
const $$ = document;
|
||||
var ip_pcol_ip;
|
||||
var ip_ipsb_ip;
|
||||
var ip_taobao_ip;
|
||||
var ip_ipify_ip;
|
||||
var refresh_http;
|
||||
var refresh_ip;
|
||||
$$.getElementById('ip-pcol').innerHTML = '<%:Querying...%>';
|
||||
$$.getElementById('ip-ipify').innerHTML = '<%:Querying...%>';
|
||||
$$.getElementById('ip-taobao').innerHTML = '<%:Querying...%>';
|
||||
@ -307,7 +317,6 @@
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
function getPcolIP(data){
|
||||
let pcisp = data.addr.split(' ');
|
||||
$$.getElementById('ip-pcol').innerHTML = data.ip;
|
||||
@ -348,15 +357,53 @@
|
||||
//HTTP.runcheck();
|
||||
IP.getIpifyIP();
|
||||
//IP.getSpeedIP();
|
||||
}
|
||||
};
|
||||
|
||||
function privacy_my_ip(imgobj)
|
||||
{
|
||||
if (imgobj.getAttribute("src") == "/luci-static/resources/openclash/img/eye-light.svg") {
|
||||
imgobj.src='/luci-static/resources/openclash/img/eye-slash-light.svg';
|
||||
imgobj.title='<%:Show IP%>';
|
||||
imgobj.alt='<%:Show IP%>';
|
||||
ip_pcol_ip = $$.getElementById('ip-pcol').innerHTML;
|
||||
ip_ipsb_ip = $$.getElementById('ip-ipsb').innerHTML;
|
||||
ip_taobao_ip = $$.getElementById('ip-taobao').innerHTML;
|
||||
ip_ipify_ip = $$.getElementById('ip-ipify').innerHTML;
|
||||
$$.getElementById('ip-pcol').innerHTML = '***.***.***.***';
|
||||
$$.getElementById('ip-ipsb').innerHTML = '***.***.***.***';
|
||||
$$.getElementById('ip-taobao').innerHTML = '***.***.***.***';
|
||||
$$.getElementById('ip-ipify').innerHTML = '***.***.***.***';
|
||||
clearInterval(refresh_ip);
|
||||
}
|
||||
else {
|
||||
imgobj.src='/luci-static/resources/openclash/img/eye-light.svg';
|
||||
imgobj.title='<%:Hide IP%>';
|
||||
imgobj.alt='<%:Hide IP%>';
|
||||
$$.getElementById('ip-pcol').innerHTML = ip_pcol_ip;
|
||||
$$.getElementById('ip-ipsb').innerHTML = ip_ipsb_ip;
|
||||
$$.getElementById('ip-taobao').innerHTML = ip_taobao_ip;
|
||||
$$.getElementById('ip-ipify').innerHTML = ip_ipify_ip;
|
||||
myip_Load();
|
||||
refresh_ip = setInterval("myip_Load()", Math.floor(Math.random()*(30-10+1)+10)*1000);
|
||||
}
|
||||
};
|
||||
|
||||
function refresh_myip(imgobj)
|
||||
{
|
||||
clearInterval(refresh_http);
|
||||
clearInterval(refresh_ip);
|
||||
myip_Load();
|
||||
HTTP.runcheck();
|
||||
refresh_http = setInterval("HTTP.runcheck()", Math.floor(Math.random()*(10-5+1)+5)*1000);
|
||||
refresh_ip = setInterval("myip_Load()", Math.floor(Math.random()*(30-10+1)+10)*1000);
|
||||
};
|
||||
|
||||
HTTP.runcheck();
|
||||
IP.getIpifyIP();
|
||||
//IP.getSpeedIP();
|
||||
setInterval("HTTP.runcheck()", Math.floor(Math.random()*(10-5+1)+5)*1000);
|
||||
setInterval("myip_Load()", Math.floor(Math.random()*(30-10+1)+10)*1000);
|
||||
refresh_http = setInterval("HTTP.runcheck()", Math.floor(Math.random()*(10-5+1)+5)*1000);
|
||||
refresh_ip = setInterval("myip_Load()", Math.floor(Math.random()*(30-10+1)+10)*1000);
|
||||
|
||||
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
document.write('<script defer="defer" src="https://whois.pconline.com.cn/ipJson.jsp?callback=getPcolIP&z='+parseInt(Math.random() * 100000000)+'" type="text/javascript"><\/script>');
|
||||
|
||||
@ -39,11 +39,11 @@
|
||||
<%
|
||||
if uci:get("openclash", "config", "enable_meta_core") ~= '1' then
|
||||
%>
|
||||
<img id="_logo" src="/luci-static/resources/openclash/img/logo.png?<%=random%>" loading="lazy" onload="return logo_check(this,this.src,'https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/<%=RELEASE_BRANCH%>/img/logo.png')" onerror="return imgerrorfuns(this,'https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/<%=RELEASE_BRANCH%>/img/logo.png')" title="Hello, World!" alt="OpenClash" onclick="return homepage()" />
|
||||
<img id="_logo" src="/luci-static/resources/openclash/img/logo.png?<%=random%>" loading="lazy" onload="return logo_check(this,this.src,'https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/<%=RELEASE_BRANCH%>/img/logo.png')" onerror="return logo_error(this,'/luci-static/resources/openclash/img/logo.png?<%=random%>')" title="Hello, World!" alt="OpenClash" onclick="return homepage()" />
|
||||
<%
|
||||
else
|
||||
%>
|
||||
<img id="_logo" src="/luci-static/resources/openclash/img/meta.png?<%=random%>" loading="lazy" onload="return logo_check(this,this.src,'https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/<%=RELEASE_BRANCH%>/img/meta.png')" onerror="return imgerrorfuns(this,'https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/<%=RELEASE_BRANCH%>/img/meta.png')" title="Hello, World!" alt="OpenClash" onclick="return homepage()" />
|
||||
<img id="_logo" src="/luci-static/resources/openclash/img/meta.png?<%=random%>" loading="lazy" onload="return logo_check(this,this.src,'https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/<%=RELEASE_BRANCH%>/img/meta.png')" onerror="return logo_error(this,'/luci-static/resources/openclash/img/meta.png?<%=random%>')" title="Hello, World!" alt="OpenClash" onclick="return homepage()" />
|
||||
<%
|
||||
end
|
||||
%>
|
||||
@ -485,12 +485,12 @@
|
||||
if (x && x.status == 200 && status.mode) {
|
||||
if (status.mode == "fake-ip" || status.mode == "fake-ip-tun" || status.mode == "fake-ip-mix")
|
||||
{
|
||||
mode.innerHTML = status.clash && status.watchdog ? "<b style=color:green><%:Fake-IP%></b> | " : '<b style=color:red><%:Not Running%></b>';
|
||||
mode.innerHTML = status.clash && status.watchdog ? "<b style=color:green><%:Fake-IP%></b> | " : '<b style=color:red><%:Not Running%></b> ';
|
||||
radio_run_normal.innerHTML = "<%:Enhance%>"
|
||||
}
|
||||
else if (status.mode == "redir-host" || status.mode == "redir-host-tun" || status.mode == "redir-host-mix")
|
||||
{
|
||||
mode.innerHTML = status.clash && status.watchdog ? "<b style=color:green><%:Redir-Host%></b> | " : '<b style=color:red><%:Not Running%></b>';
|
||||
mode.innerHTML = status.clash && status.watchdog ? "<b style=color:green><%:Redir-Host%></b> | " : '<b style=color:red><%:Not Running%></b> ';
|
||||
radio_run_normal.innerHTML = "<%:Compatible%>"
|
||||
};
|
||||
for (i=0; i<radio_ru.length; i++) {
|
||||
@ -907,6 +907,11 @@
|
||||
{
|
||||
clashversion.innerHTML = '<img id="clashversion" src="/luci-static/resources/openclash/img/version.svg?<%=random%>" alt="currentversion" height="21px" onerror="return imgerrorfuns(this,\'https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/<%=RELEASE_BRANCH%>/img/version.png\')" onclick="return go_update()">';
|
||||
};
|
||||
|
||||
function logo_error(imgobj,imgSrc)
|
||||
{
|
||||
imgobj.src=imgSrc;
|
||||
};
|
||||
|
||||
function imgerrorfuns(imgobj,imgSrc){
|
||||
setTimeout(function(){
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
font-size: 12px;
|
||||
margin: 0 auto;
|
||||
opacity: 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.sub_tab_show{
|
||||
@ -19,7 +20,17 @@
|
||||
-o-transition: all 1.5s;
|
||||
transition: all 1s;
|
||||
opacity: 1;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.sub_setting{
|
||||
display: inline-block;
|
||||
white-space: nowrap;
|
||||
margin: 0 auto;
|
||||
opacity: 1;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<%
|
||||
@ -28,7 +39,7 @@
|
||||
local filename = fs.filename(val)
|
||||
local idname = math.random(1000)..(string.match(filename, "[%w_]+") or "")
|
||||
%>
|
||||
<div id='<%=idname%>' class="sub_tab"></div>
|
||||
<div><span id='<%=idname%>' class="sub_tab"></span> <span class="sub_setting"><img src='/luci-static/resources/openclash/img/arrow-clockwise-light.svg' height="20px" title='<%:Refresh%>' alt='<%:Refresh%>' onclick='return sub_info_refresh_<%=idname%>(this)'></span> <span class="sub_setting"><img src='/luci-static/resources/openclash/img/wrench-light.svg' height="20px" title='<%:Specify URL%>' alt='<%:Specify URL%>' onclick='return set_subinfo_url_<%=idname%>(this,"<%=filename%>")'></span><div>
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
|
||||
@ -48,24 +59,9 @@ function progressbar_<%=idname%>(v, m, pc, np, f, t, tr) {
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
function sub_info_get_<%=idname%>()
|
||||
function sub_info_refresh_<%=idname%>()
|
||||
{
|
||||
|
||||
if (localStorage.getItem("<%=filename%>")) {
|
||||
var save_info = JSON.parse(localStorage.getItem("<%=filename%>"));
|
||||
document.getElementById('<%=idname%>').className = "sub_tab_show";
|
||||
if (save_info.sub_info == "No Sub Info Found") {
|
||||
document.getElementById('<%=idname%>').innerHTML = "<span><%:No Sub Info Found%></span>";
|
||||
}
|
||||
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 = progressbar_<%=idname%>((save_info.used), (save_info.total), (save_info.percent ? save_info.percent : 0), false, false, (save_info.expire), (save_info.day_left ? save_info.day_left : 0));
|
||||
}
|
||||
};
|
||||
|
||||
if (s_<%=idname%>) { clearTimeout(s_<%=idname%>);};
|
||||
|
||||
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") {
|
||||
retry_<%=idname%> = 0;
|
||||
@ -91,12 +87,57 @@ function sub_info_get_<%=idname%>()
|
||||
}
|
||||
else {
|
||||
retry_<%=idname%> ++;
|
||||
s_<%=idname%> = setTimeout("sub_info_get_<%=idname%>()",1000*120);
|
||||
s_<%=idname%> = setTimeout("sub_info_refresh_<%=idname%>()",1000*120);
|
||||
return
|
||||
}
|
||||
|
||||
};
|
||||
s_<%=idname%> = setTimeout("sub_info_get_<%=idname%>()",1000*1800);
|
||||
s_<%=idname%> = setTimeout("sub_info_refresh_<%=idname%>()",1000*1800);
|
||||
});
|
||||
};
|
||||
|
||||
function sub_info_get_<%=idname%>()
|
||||
{
|
||||
if (localStorage.getItem("<%=filename%>")) {
|
||||
var save_info = JSON.parse(localStorage.getItem("<%=filename%>"));
|
||||
document.getElementById('<%=idname%>').className = "sub_tab_show";
|
||||
if (save_info.sub_info == "No Sub Info Found") {
|
||||
document.getElementById('<%=idname%>').innerHTML = "<span><%:No Sub Info Found%></span>";
|
||||
}
|
||||
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 = progressbar_<%=idname%>((save_info.used), (save_info.total), (save_info.percent ? save_info.percent : 0), false, false, (save_info.expire), (save_info.day_left ? save_info.day_left : 0));
|
||||
}
|
||||
}
|
||||
else {
|
||||
sub_info_refresh_<%=idname%>();
|
||||
};
|
||||
s_<%=idname%> = setTimeout("sub_info_refresh_<%=idname%>()",1000*30);
|
||||
};
|
||||
|
||||
function set_subinfo_url_<%=idname%>(btn, filename) {
|
||||
var new_url = prompt("<%:Paste the new url of subscribe infos sources here:%>", "");
|
||||
if (filename == null || filename == "") {
|
||||
return false;
|
||||
}
|
||||
if (new_url == null) {
|
||||
return false;
|
||||
}
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "set_subinfo_url")%>', {filename: filename, url: new_url}, function(x, status) {
|
||||
if (x && x.status == 200 && status.info == "Success")
|
||||
{
|
||||
sub_info_refresh_<%=idname%>();
|
||||
alert("<%:Specify subscribe infos sources url successfully!%>");
|
||||
}
|
||||
else if (x && x.status == 200 && status.info == "Delete success")
|
||||
{
|
||||
sub_info_refresh_<%=idname%>();
|
||||
alert("<%:Delete Specify Subscribe infos sources url successfully!%>");
|
||||
}
|
||||
else
|
||||
{
|
||||
alert("<%:Specify subscribe infos sources url failed:%>\n" + status.info);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
336
luci-app-openclash/luasrc/view/openclash/tblsection.htm
Normal file
336
luci-app-openclash/luasrc/view/openclash/tblsection.htm
Normal file
@ -0,0 +1,336 @@
|
||||
<%-
|
||||
local rowcnt = 1
|
||||
local uci = require("luci.model.uci").cursor()
|
||||
local fs = require "luci.openclash"
|
||||
|
||||
function rowstyle()
|
||||
rowcnt = rowcnt + 1
|
||||
return (rowcnt % 2) + 1
|
||||
end
|
||||
|
||||
function width(o)
|
||||
if o.width then
|
||||
if type(o.width) == 'number' then
|
||||
return ' style="width:%dpx"' % o.width
|
||||
end
|
||||
return ' style="width:%s"' % o.width
|
||||
end
|
||||
return ''
|
||||
end
|
||||
|
||||
local head_width
|
||||
local a={}
|
||||
local e={}
|
||||
for t,o in ipairs(fs.glob("/etc/openclash/config/*"))do
|
||||
a=fs.stat(o)
|
||||
if a then
|
||||
e[t]={}
|
||||
e[t].name=fs.basename(o)
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(e, 1, {name="ALL"})
|
||||
|
||||
if #e > 4 then
|
||||
head_width = (95 / #e).."%"
|
||||
else
|
||||
head_width = "120px"
|
||||
end
|
||||
|
||||
local sectiontype = "_"..self.config.."_"..string.match(self.sectiontype, "[%w_]+") or "self.sectiontype"
|
||||
-%>
|
||||
|
||||
<style type="text/css">
|
||||
*{margin: 0;padding: 0;}
|
||||
|
||||
ul{
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%>{
|
||||
height: 33px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%> ul{
|
||||
position: absolute;
|
||||
left: -1px;
|
||||
width: 100%;
|
||||
}
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%> ul li{
|
||||
float: left;
|
||||
width: <%=head_width%>;
|
||||
height: 33px;
|
||||
line-height: 33px;
|
||||
padding: 0 1px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
border-right: 1px solid #dddddd;
|
||||
}
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%> ul li.selected{
|
||||
background-color: white;
|
||||
font-weight: bolder;
|
||||
border-bottom: 0;
|
||||
border-right: 1px solid #dddddd;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%> ul li:hover{
|
||||
color: orangered;
|
||||
}
|
||||
|
||||
#tab-content .dom-<%=self.config%>-<%=self.sectiontype%>{
|
||||
display: none;
|
||||
}
|
||||
|
||||
#tab-content .dom-<%=self.config%>-<%=self.sectiontype%> ul li{
|
||||
float: left;
|
||||
margin: 15px 10px;
|
||||
width: 225px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- tblsection -->
|
||||
<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
|
||||
<% if self.title and #self.title > 0 then -%>
|
||||
<legend><%=self.title%></legend>
|
||||
<%- end %>
|
||||
<%- if self.sortable then -%>
|
||||
<input type="hidden" id="cbi.sts.<%=self.config%>.<%=self.sectiontype%>" name="cbi.sts.<%=self.config%>.<%=self.sectiontype%>" value="" />
|
||||
<%- end -%>
|
||||
<div class="cbi-section-descr"><%=self.description%></div>
|
||||
<%- local count = 0 -%>
|
||||
<div id="tab-header-<%=self.config%>-<%=self.sectiontype%>">
|
||||
<ul class="cbi-tabmenu">
|
||||
<%-
|
||||
if #e ~= 1 then
|
||||
for t,o in ipairs(e)do
|
||||
if o.name == fs.basename(uci:get("openclash", "config", "config_path")) then
|
||||
-%>
|
||||
<li name="tab-header-<%=self.config%>-<%=self.sectiontype%>" class="selected"><%=o.name%></li>
|
||||
<%- else -%>
|
||||
<li name="tab-header-<%=self.config%>-<%=self.sectiontype%>"><%=o.name%></li>
|
||||
<%- end -%>
|
||||
<%- end -%>
|
||||
<%- else -%>
|
||||
<li name="tab-header-<%=self.config%>-<%=self.sectiontype%>" class="selected">ALL</li>
|
||||
<%- end -%>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="tab-content">
|
||||
<%- for t,o in ipairs(e)do
|
||||
if uci:get("openclash", "config", "config_path") and o.name == fs.basename(uci:get("openclash", "config", "config_path")) then
|
||||
-%>
|
||||
<div class="dom-<%=self.config%>-<%=self.sectiontype%>" style="display: block;">
|
||||
<%- elseif not uci:get("openclash", "config", "config_path") and o.name == "ALL" then -%>
|
||||
<div class="dom-<%=self.config%>-<%=self.sectiontype%>" style="display: block;">
|
||||
<%- else -%>
|
||||
<div class="dom-<%=self.config%>-<%=self.sectiontype%>">
|
||||
<%- end -%>
|
||||
<table class="cbi-section-table">
|
||||
<tr class="cbi-section-table-titles">
|
||||
<%- if not self.anonymous then -%>
|
||||
<%- if self.sectionhead then -%>
|
||||
<th class="cbi-section-table-cell"><%=self.sectionhead%></th>
|
||||
<%- else -%>
|
||||
<th> </th>
|
||||
<%- end -%>
|
||||
<%- end -%>
|
||||
<%- for i, k in pairs(self.children) do if not k.optional then -%>
|
||||
<th class="cbi-section-table-cell"<%=width(k)%>>
|
||||
<%- if k.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=k.titleref%>"><%- end -%>
|
||||
<%-=k.title-%>
|
||||
<%- if k.titleref then -%></a><%- end -%>
|
||||
</th>
|
||||
<%- count = count + 1; end; end; if self.sortable then -%>
|
||||
<th class="cbi-section-table-cell"><%:Sort%></th>
|
||||
<%- end; if self.extedit or self.addremove then -%>
|
||||
<th class="cbi-section-table-cell"> </th>
|
||||
<%- count = count + 1; end -%>
|
||||
</tr>
|
||||
<tr class="cbi-section-table-descr">
|
||||
<%- if not self.anonymous then -%>
|
||||
<%- if self.sectiondesc then -%>
|
||||
<th class="cbi-section-table-cell"><%=self.sectiondesc%></th>
|
||||
<%- else -%>
|
||||
<th></th>
|
||||
<%- end -%>
|
||||
<%- end -%>
|
||||
<%- for i, k in pairs(self.children) do if not k.optional then -%>
|
||||
<th class="cbi-section-table-cell"<%=width(k)%>><%=k.description%></th>
|
||||
<%- end; end; if self.sortable then -%>
|
||||
<th class="cbi-section-table-cell"></th>
|
||||
<%- end; if self.extedit or self.addremove then -%>
|
||||
<th class="cbi-section-table-cell"></th>
|
||||
<%- end -%>
|
||||
</tr>
|
||||
<%- local isempty = true
|
||||
for i, k in ipairs(self:cfgsections()) do
|
||||
section = k
|
||||
while true do
|
||||
if o.name ~= "ALL" then
|
||||
if uci:get("openclash", section, "config") ~= o.name then
|
||||
break
|
||||
end
|
||||
end
|
||||
isempty = false
|
||||
scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
|
||||
-%>
|
||||
<tr class="cbi-section-table-row<% if self.extedit or self.rowcolors then %> cbi-rowstyle-<%=rowstyle()%><% end %>" id="cbi-<%=self.config%>-<%=section%>">
|
||||
<% if not self.anonymous then -%>
|
||||
<th><h3><%=(type(self.sectiontitle) == "function") and self:sectiontitle(section) or k%></h3></th>
|
||||
<%- end %>
|
||||
<%-
|
||||
for k, node in ipairs(self.children) do
|
||||
if not node.optional then
|
||||
node:render(section, scope or {})
|
||||
end
|
||||
end
|
||||
-%>
|
||||
<%- if self.sortable then -%>
|
||||
<td class="cbi-section-table-cell">
|
||||
<input class="cbi-button cbi-button-up" type="button" value="" onclick="return cbi_row_swap(this, true, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" alt="<%:Move up%>" title="<%:Move up%>" />
|
||||
<input class="cbi-button cbi-button-down" type="button" value="" onclick="return cbi_row_swap(this, false, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" alt="<%:Move down%>" title="<%:Move down%>" />
|
||||
</td>
|
||||
<%- end -%>
|
||||
|
||||
<%- if self.extedit or self.addremove then -%>
|
||||
<td class="cbi-section-table-cell">
|
||||
<%- if self.extedit then -%>
|
||||
<input class="cbi-button cbi-button-edit" type="button" value="<%:Edit%>"
|
||||
<%- if type(self.extedit) == "string" then
|
||||
%> onclick="location.href='<%=self.extedit:format(section)%>';return switch_to_tab<%=sectiontype%>()"
|
||||
<%- elseif type(self.extedit) == "function" then
|
||||
%> onclick="location.href='<%=self:extedit(section)%>';return switch_to_tab<%=sectiontype%>()"
|
||||
<%- end
|
||||
%> alt="<%:Edit%>" title="<%:Edit%>" />
|
||||
<%- end; if self.addremove then %>
|
||||
<input class="cbi-button cbi-button-remove" type="submit" value="<%:Delete%>" onclick="this.form.cbi_state='del-section'; return switch_to_tab<%=sectiontype%>()" name="cbi.rts.<%=self.config%>.<%=k%>" alt="<%:Delete%>" title="<%:Delete%>" />
|
||||
<%- end -%>
|
||||
</td>
|
||||
<%- end -%>
|
||||
<%-
|
||||
break
|
||||
end
|
||||
-%>
|
||||
</tr>
|
||||
<%- end -%>
|
||||
|
||||
<%- if isempty then -%>
|
||||
<tr class="cbi-section-table-row">
|
||||
<td colspan="<%=count%>"><em><br /><%:This section contains no values yet%></em></td>
|
||||
</tr>
|
||||
<%- end -%>
|
||||
</table>
|
||||
|
||||
<% if self.error then %>
|
||||
<div class="cbi-section-error">
|
||||
<ul><% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%>
|
||||
<li><%=pcdata(e):gsub("\n","<br />")%></li>
|
||||
<%- end end %></ul>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%- if self.addremove then -%>
|
||||
<% if self.template_addremove then include(self.template_addremove) else -%>
|
||||
<div class="cbi-section-create cbi-tblsection-create">
|
||||
<% if self.anonymous then %>
|
||||
<input class="cbi-button cbi-button-add" type="submit" onclick="return switch_to_tab<%=sectiontype%>('create')" value="<%:Add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" title="<%:Add%>" />
|
||||
<% else %>
|
||||
<% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
|
||||
<input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" data-type="uciname" data-optional="true" />
|
||||
<input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" title="<%:Add%>" />
|
||||
<% if self.invalid_cts then -%>
|
||||
<br /><%:Invalid%></div>
|
||||
<%- end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<%- end %>
|
||||
<%- end -%>
|
||||
</div>
|
||||
<%- end -%>
|
||||
</div>
|
||||
</fieldset>
|
||||
<!-- /tblsection -->
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
window.addEventListener('load', onload<%=sectiontype%>, false);
|
||||
|
||||
var titles<%=sectiontype%> = document.getElementsByName('tab-header-<%=self.config%>-<%=self.sectiontype%>');
|
||||
var divs<%=sectiontype%> = document.getElementsByClassName('dom-<%=self.config%>-<%=self.sectiontype%>');
|
||||
|
||||
function switch_to_tab<%=sectiontype%>(type){
|
||||
|
||||
if(titles<%=sectiontype%>.length != divs<%=sectiontype%>.length) return;
|
||||
|
||||
if ( type == 'create' ) {
|
||||
for(var j=0; j < titles<%=sectiontype%>.length; j++){
|
||||
titles<%=sectiontype%>[j].className = '';
|
||||
divs<%=sectiontype%>[j].style.display = 'none';
|
||||
};
|
||||
titles<%=sectiontype%>[0].className = 'selected';
|
||||
divs<%=sectiontype%>[0].style.display = 'block';
|
||||
localStorage.setItem("titles<%=sectiontype%>",0);
|
||||
};
|
||||
|
||||
localStorage.setItem("id<%=sectiontype%>",'cbi-<%=self.config%>-<%=self.sectiontype%>');
|
||||
return true;
|
||||
};
|
||||
|
||||
function onload<%=sectiontype%>() {
|
||||
|
||||
if(titles<%=sectiontype%>.length != divs<%=sectiontype%>.length) return;
|
||||
|
||||
if (localStorage.getItem("id<%=sectiontype%>")) {
|
||||
if (document.getElementById(localStorage.getItem("id<%=sectiontype%>"))) {
|
||||
document.getElementById(localStorage.getItem("id<%=sectiontype%>")).scrollIntoView();
|
||||
};
|
||||
localStorage.removeItem("id<%=sectiontype%>");
|
||||
};
|
||||
|
||||
if (localStorage.getItem("titles<%=sectiontype%>")) {
|
||||
if (titles<%=sectiontype%>[localStorage.getItem("titles<%=sectiontype%>")]) {
|
||||
for(var j=0; j < titles<%=sectiontype%>.length; j++){
|
||||
titles<%=sectiontype%>[j].className = '';
|
||||
divs<%=sectiontype%>[j].style.display = 'none';
|
||||
};
|
||||
titles<%=sectiontype%>[localStorage.getItem("titles<%=sectiontype%>")].className = 'selected';
|
||||
divs<%=sectiontype%>[localStorage.getItem("titles<%=sectiontype%>")].style.display = 'block';
|
||||
};
|
||||
localStorage.removeItem("titles<%=sectiontype%>");
|
||||
};
|
||||
|
||||
for(var i=0; i < titles<%=sectiontype%>.length; i++){
|
||||
var li<%=sectiontype%> = titles<%=sectiontype%>[i];
|
||||
li<%=sectiontype%>.id = i;
|
||||
|
||||
li<%=sectiontype%>.onclick = function(){
|
||||
for(var j=0; j < titles<%=sectiontype%>.length; j++){
|
||||
titles<%=sectiontype%>[j].className = '';
|
||||
divs<%=sectiontype%>[j].style.display = 'none';
|
||||
};
|
||||
this.className = 'selected';
|
||||
divs<%=sectiontype%>[this.id].style.display = 'block';
|
||||
localStorage.setItem("titles<%=sectiontype%>",this.id);
|
||||
localStorage.setItem("id<%=sectiontype%>","cbi-<%=self.config%>-<%=self.sectiontype%>");
|
||||
};
|
||||
|
||||
li<%=sectiontype%>.onTouchStart = function(){
|
||||
for(var j=0; j < titles<%=sectiontype%>.length; j++){
|
||||
titles<%=sectiontype%>[j].className = '';
|
||||
divs<%=sectiontype%>[j].style.display = 'none';
|
||||
};
|
||||
this.className = 'selected';
|
||||
divs<%=sectiontype%>[this.id].style.display = 'block';
|
||||
localStorage.setItem("titles<%=sectiontype%>",this.id);
|
||||
localStorage.setItem("id<%=sectiontype%>","cbi-<%=self.config%>-<%=self.sectiontype%>");
|
||||
};
|
||||
};
|
||||
};
|
||||
//]]>
|
||||
</script>
|
||||
309
luci-app-openclash/luasrc/view/openclash/tblsection_dns.htm
Normal file
309
luci-app-openclash/luasrc/view/openclash/tblsection_dns.htm
Normal file
@ -0,0 +1,309 @@
|
||||
<%-
|
||||
local rowcnt = 1
|
||||
local uci = require("luci.model.uci").cursor()
|
||||
local fs = require "luci.openclash"
|
||||
|
||||
function rowstyle()
|
||||
rowcnt = rowcnt + 1
|
||||
return (rowcnt % 2) + 1
|
||||
end
|
||||
|
||||
function width(o)
|
||||
if o.width then
|
||||
if type(o.width) == 'number' then
|
||||
return ' style="width:%dpx"' % o.width
|
||||
end
|
||||
return ' style="width:%s"' % o.width
|
||||
end
|
||||
return ''
|
||||
end
|
||||
|
||||
local head_width
|
||||
local e={}
|
||||
table.insert(e, {group="nameserver"})
|
||||
table.insert(e, {group="fallback"})
|
||||
table.insert(e, {group="default"})
|
||||
|
||||
local sectiontype = "_"..self.config.."_"..string.match(self.sectiontype, "[%w_]+") or "self.sectiontype"
|
||||
-%>
|
||||
|
||||
<style type="text/css">
|
||||
*{margin: 0;padding: 0;}
|
||||
|
||||
ul{
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%>{
|
||||
height: 33px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%> ul{
|
||||
position: absolute;
|
||||
left: -1px;
|
||||
width: 100%;
|
||||
}
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%> ul li{
|
||||
float: left;
|
||||
width: 150px;
|
||||
height: 33px;
|
||||
line-height: 33px;
|
||||
padding: 0 1px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
border-right: 1px solid #dddddd;
|
||||
}
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%> ul li.selected{
|
||||
background-color: white;
|
||||
font-weight: bolder;
|
||||
border-bottom: 0;
|
||||
border-right: 1px solid #dddddd;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#tab-header-<%=self.config%>-<%=self.sectiontype%> ul li:hover{
|
||||
color: orangered;
|
||||
}
|
||||
|
||||
#tab-content .dom-<%=self.config%>-<%=self.sectiontype%>{
|
||||
display: none;
|
||||
}
|
||||
|
||||
#tab-content .dom-<%=self.config%>-<%=self.sectiontype%> ul li{
|
||||
float: left;
|
||||
margin: 15px 10px;
|
||||
width: 225px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- tblsection -->
|
||||
<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
|
||||
<% if self.title and #self.title > 0 then -%>
|
||||
<legend><%=self.title%></legend>
|
||||
<%- end %>
|
||||
<%- if self.sortable then -%>
|
||||
<input type="hidden" id="cbi.sts.<%=self.config%>.<%=self.sectiontype%>" name="cbi.sts.<%=self.config%>.<%=self.sectiontype%>" value="" />
|
||||
<%- end -%>
|
||||
<div class="cbi-section-descr"><%=self.description%></div>
|
||||
<%- local count = 0 -%>
|
||||
<div id="tab-header-<%=self.config%>-<%=self.sectiontype%>">
|
||||
<ul class="cbi-tabmenu">
|
||||
<li name="tab-header-<%=self.config%>-<%=self.sectiontype%>" class="selected">NameServer</li>
|
||||
<li name="tab-header-<%=self.config%>-<%=self.sectiontype%>">FallBack</li>
|
||||
<li name="tab-header-<%=self.config%>-<%=self.sectiontype%>">Default-NameServer</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="tab-content">
|
||||
<%- for t,o in ipairs(e)do
|
||||
if o.group == "nameserver" then
|
||||
-%>
|
||||
<div class="dom-<%=self.config%>-<%=self.sectiontype%>" style="display: block;">
|
||||
<%- else -%>
|
||||
<div class="dom-<%=self.config%>-<%=self.sectiontype%>">
|
||||
<%- end -%>
|
||||
<table class="cbi-section-table">
|
||||
<tr class="cbi-section-table-titles">
|
||||
<%- if not self.anonymous then -%>
|
||||
<%- if self.sectionhead then -%>
|
||||
<th class="cbi-section-table-cell"><%=self.sectionhead%></th>
|
||||
<%- else -%>
|
||||
<th> </th>
|
||||
<%- end -%>
|
||||
<%- end -%>
|
||||
<%- for i, k in pairs(self.children) do if not k.optional then -%>
|
||||
<th class="cbi-section-table-cell"<%=width(k)%>>
|
||||
<%- if k.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=k.titleref%>"><%- end -%>
|
||||
<%-=k.title-%>
|
||||
<%- if k.titleref then -%></a><%- end -%>
|
||||
</th>
|
||||
<%- count = count + 1; end; end; if self.sortable then -%>
|
||||
<th class="cbi-section-table-cell"><%:Sort%></th>
|
||||
<%- end; if self.extedit or self.addremove then -%>
|
||||
<th class="cbi-section-table-cell"> </th>
|
||||
<%- count = count + 1; end -%>
|
||||
</tr>
|
||||
<tr class="cbi-section-table-descr">
|
||||
<%- if not self.anonymous then -%>
|
||||
<%- if self.sectiondesc then -%>
|
||||
<th class="cbi-section-table-cell"><%=self.sectiondesc%></th>
|
||||
<%- else -%>
|
||||
<th></th>
|
||||
<%- end -%>
|
||||
<%- end -%>
|
||||
<%- for i, k in pairs(self.children) do if not k.optional then -%>
|
||||
<th class="cbi-section-table-cell"<%=width(k)%>><%=k.description%></th>
|
||||
<%- end; end; if self.sortable then -%>
|
||||
<th class="cbi-section-table-cell"></th>
|
||||
<%- end; if self.extedit or self.addremove then -%>
|
||||
<th class="cbi-section-table-cell"></th>
|
||||
<%- end -%>
|
||||
</tr>
|
||||
<%- local isempty = true
|
||||
for i, k in ipairs(self:cfgsections()) do
|
||||
section = k
|
||||
while true do
|
||||
if uci:get("openclash", section, "group") ~= o.group then
|
||||
break
|
||||
end
|
||||
isempty = false
|
||||
scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
|
||||
-%>
|
||||
<tr class="cbi-section-table-row<% if self.extedit or self.rowcolors then %> cbi-rowstyle-<%=rowstyle()%><% end %>" id="cbi-<%=self.config%>-<%=section%>">
|
||||
<% if not self.anonymous then -%>
|
||||
<th><h3><%=(type(self.sectiontitle) == "function") and self:sectiontitle(section) or k%></h3></th>
|
||||
<%- end %>
|
||||
<%-
|
||||
for k, node in ipairs(self.children) do
|
||||
if not node.optional then
|
||||
node:render(section, scope or {})
|
||||
end
|
||||
end
|
||||
-%>
|
||||
<%- if self.sortable then -%>
|
||||
<td class="cbi-section-table-cell">
|
||||
<input class="cbi-button cbi-button-up" type="button" value="" onclick="return cbi_row_swap(this, true, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" alt="<%:Move up%>" title="<%:Move up%>" />
|
||||
<input class="cbi-button cbi-button-down" type="button" value="" onclick="return cbi_row_swap(this, false, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" alt="<%:Move down%>" title="<%:Move down%>" />
|
||||
</td>
|
||||
<%- end -%>
|
||||
|
||||
<%- if self.extedit or self.addremove then -%>
|
||||
<td class="cbi-section-table-cell">
|
||||
<%- if self.extedit then -%>
|
||||
<input class="cbi-button cbi-button-edit" type="button" value="<%:Edit%>"
|
||||
<%- if type(self.extedit) == "string" then
|
||||
%> onclick="location.href='<%=self.extedit:format(section)%>';return switch_to_tab<%=sectiontype%>()"
|
||||
<%- elseif type(self.extedit) == "function" then
|
||||
%> onclick="location.href='<%=self:extedit(section)%>';return switch_to_tab<%=sectiontype%>()"
|
||||
<%- end
|
||||
%> alt="<%:Edit%>" title="<%:Edit%>" />
|
||||
<%- end; if self.addremove then %>
|
||||
<input class="cbi-button cbi-button-remove" type="submit" value="<%:Delete%>" onclick="this.form.cbi_state='del-section';return switch_to_tab<%=sectiontype%>()" name="cbi.rts.<%=self.config%>.<%=k%>" alt="<%:Delete%>" title="<%:Delete%>" />
|
||||
<%- end -%>
|
||||
</td>
|
||||
<%- end -%>
|
||||
<%-
|
||||
break
|
||||
end
|
||||
-%>
|
||||
</tr>
|
||||
<%- end -%>
|
||||
|
||||
<%- if isempty then -%>
|
||||
<tr class="cbi-section-table-row">
|
||||
<td colspan="<%=count%>"><em><br /><%:This section contains no values yet%></em></td>
|
||||
</tr>
|
||||
<%- end -%>
|
||||
</table>
|
||||
|
||||
<% if self.error then %>
|
||||
<div class="cbi-section-error">
|
||||
<ul><% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%>
|
||||
<li><%=pcdata(e):gsub("\n","<br />")%></li>
|
||||
<%- end end %></ul>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%- if self.addremove then -%>
|
||||
<% if self.template_addremove then include(self.template_addremove) else -%>
|
||||
<div class="cbi-section-create cbi-tblsection-create">
|
||||
<% if self.anonymous then %>
|
||||
<input class="cbi-button cbi-button-add" type="submit" onclick="return switch_to_tab<%=sectiontype%>('create')" value="<%:Add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" title="<%:Add%>" />
|
||||
<% else %>
|
||||
<% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
|
||||
<input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" data-type="uciname" data-optional="true" />
|
||||
<input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" title="<%:Add%>" />
|
||||
<% if self.invalid_cts then -%>
|
||||
<br /><%:Invalid%></div>
|
||||
<%- end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<%- end %>
|
||||
<%- end -%>
|
||||
</div>
|
||||
<%- end -%>
|
||||
</div>
|
||||
</fieldset>
|
||||
<!-- /tblsection -->
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
window.addEventListener('load', onload<%=sectiontype%>, false);
|
||||
|
||||
var titles<%=sectiontype%> = document.getElementsByName('tab-header-<%=self.config%>-<%=self.sectiontype%>');
|
||||
var divs<%=sectiontype%> = document.getElementsByClassName('dom-<%=self.config%>-<%=self.sectiontype%>');
|
||||
|
||||
function switch_to_tab<%=sectiontype%>(type){
|
||||
|
||||
if(titles<%=sectiontype%>.length != divs<%=sectiontype%>.length) return;
|
||||
|
||||
if ( type == 'create' ) {
|
||||
for(var j=0; j < titles<%=sectiontype%>.length; j++){
|
||||
titles<%=sectiontype%>[j].className = '';
|
||||
divs<%=sectiontype%>[j].style.display = 'none';
|
||||
};
|
||||
titles<%=sectiontype%>[0].className = 'selected';
|
||||
divs<%=sectiontype%>[0].style.display = 'block';
|
||||
localStorage.setItem("titles<%=sectiontype%>",0);
|
||||
};
|
||||
|
||||
localStorage.setItem("id<%=sectiontype%>",'cbi-<%=self.config%>-<%=self.sectiontype%>');
|
||||
return true;
|
||||
};
|
||||
|
||||
function onload<%=sectiontype%>() {
|
||||
|
||||
if(titles<%=sectiontype%>.length != divs<%=sectiontype%>.length) return;
|
||||
|
||||
if (localStorage.getItem("id<%=sectiontype%>")) {
|
||||
if (document.getElementById(localStorage.getItem("id<%=sectiontype%>"))) {
|
||||
document.getElementById(localStorage.getItem("id<%=sectiontype%>")).scrollIntoView();
|
||||
};
|
||||
localStorage.removeItem("id<%=sectiontype%>");
|
||||
};
|
||||
|
||||
if (localStorage.getItem("titles<%=sectiontype%>")) {
|
||||
if (titles<%=sectiontype%>[localStorage.getItem("titles<%=sectiontype%>")]) {
|
||||
for(var j=0; j < titles<%=sectiontype%>.length; j++){
|
||||
titles<%=sectiontype%>[j].className = '';
|
||||
divs<%=sectiontype%>[j].style.display = 'none';
|
||||
};
|
||||
titles<%=sectiontype%>[localStorage.getItem("titles<%=sectiontype%>")].className = 'selected';
|
||||
divs<%=sectiontype%>[localStorage.getItem("titles<%=sectiontype%>")].style.display = 'block';
|
||||
};
|
||||
localStorage.removeItem("titles<%=sectiontype%>");
|
||||
};
|
||||
|
||||
for(var i=0; i < titles<%=sectiontype%>.length; i++){
|
||||
var li<%=sectiontype%> = titles<%=sectiontype%>[i];
|
||||
li<%=sectiontype%>.id = i;
|
||||
|
||||
li<%=sectiontype%>.onclick = function(){
|
||||
for(var j=0; j < titles<%=sectiontype%>.length; j++){
|
||||
titles<%=sectiontype%>[j].className = '';
|
||||
divs<%=sectiontype%>[j].style.display = 'none';
|
||||
};
|
||||
this.className = 'selected';
|
||||
divs<%=sectiontype%>[this.id].style.display = 'block';
|
||||
localStorage.setItem("titles<%=sectiontype%>",this.id);
|
||||
localStorage.setItem("id<%=sectiontype%>","cbi-<%=self.config%>-<%=self.sectiontype%>");
|
||||
};
|
||||
|
||||
li<%=sectiontype%>.onTouchStart = function(){
|
||||
for(var j=0; j < titles<%=sectiontype%>.length; j++){
|
||||
titles<%=sectiontype%>[j].className = '';
|
||||
divs<%=sectiontype%>[j].style.display = 'none';
|
||||
};
|
||||
this.className = 'selected';
|
||||
divs<%=sectiontype%>[this.id].style.display = 'block';
|
||||
localStorage.setItem("titles<%=sectiontype%>",this.id);
|
||||
localStorage.setItem("id<%=sectiontype%>","cbi-<%=self.config%>-<%=self.sectiontype%>");
|
||||
};
|
||||
};
|
||||
};
|
||||
//]]>
|
||||
</script>
|
||||
@ -117,6 +117,27 @@
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function restore_config(btn)
|
||||
{
|
||||
btn.value = '<%:Restore Default Config%>';
|
||||
btn.disabled = true;
|
||||
var r = confirm("<%:Are you sure want to restore the default config?%>")
|
||||
if (r == true) {
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "restore")%>', null, function(x, status) {
|
||||
if ( x && x.status == 200 ) {
|
||||
alert('<%:Restore succeeded!%>')
|
||||
window.location.href='<%="settings"%>';
|
||||
}
|
||||
else {
|
||||
alert('<%:Restore failed!%>')
|
||||
window.location.href='<%="settings"%>';
|
||||
}
|
||||
});
|
||||
}
|
||||
btn.disabled = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
function winOpen(url)
|
||||
{
|
||||
|
||||
@ -361,15 +361,15 @@
|
||||
if ( x && x.status == 200 ) {
|
||||
if ( status.corever != "0" ) {
|
||||
if (type == "Dev") {
|
||||
url1='https://raw.githubusercontent.com/vernesong/OpenClash/'+r+'/core-lateset/dev/clash-'+status.corever+'.tar.gz';
|
||||
url1='https://raw.githubusercontent.com/vernesong/OpenClash/core/'+r+'/dev/clash-'+status.corever+'.tar.gz';
|
||||
window.location.href=url1;
|
||||
}
|
||||
if (type == "TUN") {
|
||||
var corelv = status.corelv;
|
||||
var arr_core = corelv.split(",");
|
||||
var coretunlvis = arr_core[1];
|
||||
var arr_core = corelv.split(",");
|
||||
var coretunlvis = arr_core[1];
|
||||
if ( coretunlvis != "" ) {
|
||||
url3='https://raw.githubusercontent.com/vernesong/OpenClash/'+r+'/core-lateset/premium/clash-'+status.corever+'-'+coretunlvis+'.gz';
|
||||
url3='https://raw.githubusercontent.com/vernesong/OpenClash/core/'+r+'/premium/clash-'+status.corever+'-'+coretunlvis+'.gz';
|
||||
window.location.href=url3;
|
||||
}
|
||||
else {
|
||||
@ -377,7 +377,7 @@
|
||||
}
|
||||
}
|
||||
if (type == "Meta") {
|
||||
url4='https://raw.githubusercontent.com/vernesong/OpenClash/'+r+'/core-lateset/meta/clash-'+status.corever+'.tar.gz';
|
||||
url4='https://raw.githubusercontent.com/vernesong/OpenClash/core/'+r+'/meta/clash-'+status.corever+'.tar.gz';
|
||||
window.location.href=url4;
|
||||
}
|
||||
}
|
||||
@ -403,7 +403,7 @@
|
||||
var oplv = status.oplv;
|
||||
var oplvis = oplv.substring(oplv.indexOf("v") + 1,oplv.indexOf(","));
|
||||
if ( oplvis != "" ) {
|
||||
url2='https://raw.githubusercontent.com/vernesong/OpenClash/'+r+'/luci-app-openclash_'+oplvis+'_all.ipk';
|
||||
url2='https://raw.githubusercontent.com/vernesong/OpenClash/package/'+r+'/luci-app-openclash_'+oplvis+'_all.ipk';
|
||||
window.location.href=url2;
|
||||
}
|
||||
else {
|
||||
@ -437,27 +437,6 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
function restore_config(btn)
|
||||
{
|
||||
btn.value = '<%:Restore Default Config%>';
|
||||
btn.disabled = true;
|
||||
var r = confirm("<%:Are you sure want to restore the default config?%>")
|
||||
if (r == true) {
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "openclash", "restore")%>', null, function(x, status) {
|
||||
if ( x && x.status == 200 ) {
|
||||
alert('<%:Restore succeeded!%>')
|
||||
window.location.href='<%="settings"%>';
|
||||
}
|
||||
else {
|
||||
alert('<%:Restore failed!%>')
|
||||
window.location.href='<%="settings"%>';
|
||||
}
|
||||
});
|
||||
}
|
||||
btn.disabled = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
function backup_all_file(btn)
|
||||
{
|
||||
btn.value = '<%:Backup OpenClash%>';
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
<%+cbi/valueheader%>
|
||||
<div style="text-align: center; margin:0 auto; display:block; white-space: nowrap;">
|
||||
<label class="cbi-value" style="display:inline-block; width: 100%;" for="ulfile"><%:Upload File Type%>
|
||||
<label class="cbi-value" style="display:inline-block; width: 100%;" for="ulfile"><%:Upload File Type%> <%:(Click to select)%>
|
||||
<select name="file_type" style="width:auto">
|
||||
<option value="config" selected="selected"><%:Config File%></option>
|
||||
<option value="config" selected="selected"><%:Config File%> (.yaml)</option>
|
||||
<option value="proxy-provider"><%:Proxy Provider File%></option>
|
||||
<option value="rule-provider"><%:Rule Provider File%></option>
|
||||
<option value="clash">[Dev] <%: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="clash">[Dev] <%:Core File%> (.tar.gz)</option>
|
||||
<option value="clash_tun">[TUN] <%:Core File%> (.gz)</option>
|
||||
<option value="clash_meta">[Meta] <%:Core File%> (.tar.gz)</option>
|
||||
<option value="backup-file"><%:Backup File%> (.tar.gz)</option>
|
||||
</select>
|
||||
<input class="cbi-input-file" style="width: 30%" type="file" id="ulfile" name="ulfile" />
|
||||
<input type="submit" class="btn cbi-button cbi-input-reload" name="upload" value="<%:Upload%>" />
|
||||
|
||||
@ -8,8 +8,8 @@ msgstr "OpenClash"
|
||||
msgid "A Clash Client For OpenWrt"
|
||||
msgstr "一个运行在 OpenWrt 上的 Clash 客户端,兼容 Shadowsocks(R)、Vmess、Trojan、Snell 等协议,根据灵活的规则配置实现策略代理"
|
||||
|
||||
msgid "Global Settings(Will Modify The Config File Or Subscribe According To The Settings On This Page)"
|
||||
msgstr "全局设置(将按照本页设置自动修改配置文件和获取订阅)"
|
||||
msgid "Plugin Settings"
|
||||
msgstr "插件设置"
|
||||
|
||||
msgid "Credits"
|
||||
msgstr "技术支持"
|
||||
@ -17,20 +17,23 @@ msgstr "技术支持"
|
||||
msgid "Overviews"
|
||||
msgstr "运行状态"
|
||||
|
||||
msgid "Global Settings"
|
||||
msgstr "全局设置"
|
||||
msgid "Plugin Settings"
|
||||
msgstr "插件设置"
|
||||
|
||||
msgid "Rule Providers and Groups"
|
||||
msgstr "规则集与策略组管理"
|
||||
msgid "Overwrite Settings"
|
||||
msgstr "覆写设置"
|
||||
|
||||
msgid "Game Rules and Groups (Only TUN & Meta Core Support)"
|
||||
msgstr "游戏规则与策略组管理(仅 TUN & Meta 内核)"
|
||||
msgid "Rule Providers Append"
|
||||
msgstr "规则附加"
|
||||
|
||||
msgid "Other Rule Providers and Groups (Only TUN & Meta Core Support)"
|
||||
msgstr "第三方规则集与策略组管理(仅 TUN & Meta 内核)"
|
||||
msgid "Game Rules Append (Only TUN & Meta Core Support)"
|
||||
msgstr "游戏规则附加(仅 TUN & Meta 内核)"
|
||||
|
||||
msgid "Custom Rule Providers and Groups (Only TUN & Meta Core Support)"
|
||||
msgstr "自定义规则集与策略组管理(仅 TUN & Meta 内核)"
|
||||
msgid "Other Rule Providers Append (Only TUN & Meta Core Support)"
|
||||
msgstr "第三方规则集附加(仅 TUN & Meta 内核)"
|
||||
|
||||
msgid "Custom Rule Providers Append (Only TUN & Meta Core Support)"
|
||||
msgstr "自定义规则集附加(仅 TUN & Meta 内核)"
|
||||
|
||||
msgid "General Settings"
|
||||
msgstr "常规设置"
|
||||
@ -38,8 +41,8 @@ msgstr "常规设置"
|
||||
msgid "Settings"
|
||||
msgstr "设置"
|
||||
|
||||
msgid "Config Update"
|
||||
msgstr "配置文件订阅"
|
||||
msgid "Config Subscribe"
|
||||
msgstr "配置订阅"
|
||||
|
||||
msgid "Config Subscribe Edit"
|
||||
msgstr "编辑配置文件订阅信息"
|
||||
@ -140,8 +143,8 @@ msgstr "选择运行模式,如客户端的网络异常请尝试清除DNS缓存
|
||||
msgid "Proxy Mode"
|
||||
msgstr "代理模式"
|
||||
|
||||
msgid "Select Proxy Mode, Use Script Mode Could Prevent Proxy BT traffics If Rules Support, eg.lhie1's"
|
||||
msgstr "选择默认代理模式,如果规则支持,使用脚本模式可以阻止代理BT流量,比如lhie1规则"
|
||||
msgid "Select Proxy Mode"
|
||||
msgstr "选择默认代理模式"
|
||||
|
||||
msgid "Rule Proxy Mode"
|
||||
msgstr "Rule【策略代理】"
|
||||
@ -222,7 +225,7 @@ msgid "(Maybe Incompatible For Your Firmware)"
|
||||
msgstr "(部分固件可能不兼容)"
|
||||
|
||||
msgid "Custom DNS Setting"
|
||||
msgstr "自定义上游 DNS 服务器"
|
||||
msgstr "*自定义上游 DNS 服务器"
|
||||
|
||||
msgid "Use Custom Rules"
|
||||
msgstr "启用后将把自定义规则增加到配置文件,规则请到下方文本框编辑"
|
||||
@ -236,24 +239,17 @@ msgstr "(在上方设置中启用本功能后生效)"
|
||||
msgid "Advanced Setting"
|
||||
msgstr "高级设置"
|
||||
|
||||
msgid "DNS Advanced Settings"
|
||||
msgstr "DNS 高级设置"
|
||||
|
||||
msgid "(Please Don't Modify it at Will)"
|
||||
msgstr "(如您不知道选项有何用,请不要随意修改)"
|
||||
msgid "Enable Specify DNS Server"
|
||||
msgstr "启用第二 DNS 服务器"
|
||||
|
||||
msgid "Specify DNS Server"
|
||||
msgstr "指定(第二)DNS 服务器"
|
||||
msgstr "指定服务器"
|
||||
|
||||
msgid "Specify DNS Server For List and Server Nodes With Fake-IP Mode, Only One IP Server Address Support"
|
||||
msgstr "指定下方列表中域名和 Fake-IP 模式下非代理集内节点的DNS服务器,只支持填写一个IP地址"
|
||||
|
||||
msgid "Domain Names In The List Do Not Return Fake-IP, One rule per line"
|
||||
msgstr "每行请只填写一个域名,列表中的域名在(Fake-IP模式)下查询DNS时将返回真实IP地址"
|
||||
|
||||
msgid "Domain Names In The List Use The Custom DNS Server, One rule per line, Depend on Dnsmasq"
|
||||
msgstr "每行请只填写一个域名,列表中的域名将使用上方指定的DNS进行查询,此功能依赖于 Dnsmasq"
|
||||
msgid "Specify DNS Server For List, Only One IP Server Address Support"
|
||||
msgstr "指定下方列表中域名的 DNS 服务器,只支持填写一个IP地址"
|
||||
|
||||
msgid "Domain Names In The List Do Not Return Fake-IP, One rule per line, Depend on Dnsmasq"
|
||||
msgstr "每行请只填写一个域名,列表中的域名将使用上方指定的 DNS 进行查询并返回真实IP地址,此功能依赖于 Dnsmasq"
|
||||
|
||||
msgid "Domain Names In The List Use The Custom DNS Server, But Still Return Fake-IP Results, One rule per line"
|
||||
msgstr "每行请只填写一个规则,列表中的域名将使用指定的 DNS 进行查询,但 Fake-IP 模式下仍将返回保留地址"
|
||||
@ -300,15 +296,15 @@ msgstr "允许解析 IPv6 类型的 DNS 请求"
|
||||
msgid "Rules Setting"
|
||||
msgstr "规则设置"
|
||||
|
||||
msgid "Rules Setting(Access Control)"
|
||||
msgstr "规则设置(访问控制)"
|
||||
|
||||
msgid "Config Manage"
|
||||
msgstr "配置文件管理"
|
||||
msgstr "配置管理"
|
||||
|
||||
msgid "Upload File Type"
|
||||
msgstr "上传文件类型"
|
||||
|
||||
msgid "(Click to select)"
|
||||
msgstr "(点击选择)"
|
||||
|
||||
msgid "Proxy Provider File"
|
||||
msgstr "代理集文件"
|
||||
|
||||
@ -444,13 +440,13 @@ msgstr "设置公网协议是否开启了SSL,便于从公网访问时自动登
|
||||
msgid "GEO Update"
|
||||
msgstr "GEO 数据库订阅"
|
||||
|
||||
msgid "Auto Update GEOIP Database"
|
||||
msgstr "自动更新 GEOIP 数据库"
|
||||
msgid "Auto Update GeoIP MMDB"
|
||||
msgstr "自动更新 GeoIP MMDB 数据库"
|
||||
|
||||
msgid "Update GEOIP Database"
|
||||
msgstr "更新 GEOIP 数据库"
|
||||
msgid "Update GeoIP MMDB"
|
||||
msgstr "更新 GeoIP MMDB 数据库"
|
||||
|
||||
msgid "Auto Update GeoSite Database"
|
||||
msgid "Auto Update GeoSite"
|
||||
msgstr "自动更新 GeoSite 数据库"
|
||||
|
||||
msgid "Update GeoSite Database"
|
||||
@ -574,10 +570,7 @@ msgid "Choose Proxy Groups, Base On Your Config File"
|
||||
msgstr "指定流量(策略)的代理方式,只支持选择(策略组),信息来源于您的配置文件"
|
||||
|
||||
msgid "Custom Clash Rules"
|
||||
msgstr "自定义规则"
|
||||
|
||||
msgid "Custom Clash Rules(Access Control)"
|
||||
msgstr "自定义规则(访问控制)"
|
||||
msgstr "*自定义规则"
|
||||
|
||||
msgid "Custom Priority Rules Here, For More Go:"
|
||||
msgstr "设置自定义规则(优先匹配),详细信息请参阅:"
|
||||
@ -588,15 +581,12 @@ msgstr "设置自定义规则(候补匹配),详细信息请参阅:"
|
||||
msgid "IP To CIDR:"
|
||||
msgstr "在线 IP 段转 CIDR 地址:"
|
||||
|
||||
msgid "Custom Hosts Here, For More Go:"
|
||||
msgstr "设置自定义 Hosts,详细信息请参阅:"
|
||||
msgid "Custom Hosts Here, You May Need to Turn off The Rebinding Protection Option of Dnsmasq When Hosts Has Set a Reserved Address, For More Go:"
|
||||
msgstr "设置自定义 Hosts,设置了保留地址时需要关闭 Dnsmasq 的重绑定保护选项才能生效,详细信息请参阅:"
|
||||
|
||||
msgid "Set Custom Rules"
|
||||
msgstr "设置自定义规则(在上方规则设置中启用本功能后生效)"
|
||||
|
||||
msgid "Set Custom Hosts (Does Not Override Config Settings)"
|
||||
msgstr "设置自定义 Hosts(不会覆盖配置文件设置)"
|
||||
|
||||
msgid "Version Update"
|
||||
msgstr "版本更新"
|
||||
|
||||
@ -637,8 +627,8 @@ msgstr "更新客户端"
|
||||
msgid "Only For IPK Install Type Or Not Release Memory"
|
||||
msgstr "只支持通过 IPK 安装的版本进行更新,因为随系统编译的版本更新后不会释放旧版本的闪存空间"
|
||||
|
||||
msgid "Servers and Groups"
|
||||
msgstr "服务器与策略组管理"
|
||||
msgid "Onekey Create"
|
||||
msgstr "一键生成"
|
||||
|
||||
msgid "Read Config"
|
||||
msgstr "读取配置"
|
||||
@ -661,8 +651,8 @@ msgstr "返回概览"
|
||||
msgid "Refresh Page"
|
||||
msgstr "刷新页面"
|
||||
|
||||
msgid "Servers manage and Config create"
|
||||
msgstr "服务器&策略组管理(支持配置文件一键生成)"
|
||||
msgid "Onekey Create (Servers&Groups manage)"
|
||||
msgstr "一键生成(服务器&策略组管理)"
|
||||
|
||||
msgid "Keep Settings"
|
||||
msgstr "保留配置"
|
||||
@ -1004,7 +994,7 @@ msgid "Other Rule Providers List"
|
||||
msgstr "第三方规则集列表"
|
||||
|
||||
msgid "Proxy UDP Traffics"
|
||||
msgstr "*UDP 流量转发"
|
||||
msgstr "UDP 流量转发"
|
||||
|
||||
msgid "The Servers Must Support UDP forwarding"
|
||||
msgstr "启用时服务器必须支持 UDP 转发"
|
||||
@ -1042,8 +1032,8 @@ msgstr "切换操作模式"
|
||||
msgid "Switch Mode"
|
||||
msgstr "切换"
|
||||
|
||||
msgid "Access Control"
|
||||
msgstr "访问控制"
|
||||
msgid "Black&White"
|
||||
msgstr "黑白名单"
|
||||
|
||||
msgid "LAN Access Control Mode"
|
||||
msgstr "局域网访问控制模式"
|
||||
@ -1073,10 +1063,10 @@ msgid "In The Fake-IP Mode, Only Pure IP Requests Are Supported"
|
||||
msgstr "在 Fake-IP 模式下,只支持过滤纯 IP 类型的请求"
|
||||
|
||||
msgid "Rule Match Proxy Mode"
|
||||
msgstr "*仅代理命中规则流量"
|
||||
msgstr "仅代理命中规则流量"
|
||||
|
||||
msgid "Only Proxy Rules Match, Prevent BT/P2P Passing"
|
||||
msgstr "仅允许代理命中规则的流量,防止 BT、P2P 下载流量经过代理"
|
||||
msgid "Append Some Rules to Config, Allow Only Traffic Proxies that Match the Rule, Prevent BT/P2P Passing"
|
||||
msgstr "附加规则到配置文件,仅允许匹配规则的流量代理,防止 BT、P2P 下载流量经过代理"
|
||||
|
||||
msgid "Common Ports Proxy Mode"
|
||||
msgstr "*仅允许常用端口流量"
|
||||
@ -1084,6 +1074,12 @@ msgstr "*仅允许常用端口流量"
|
||||
msgid "Only Common Ports, Prevent BT/P2P Passing"
|
||||
msgstr "仅允许常用端口的流量经过 Clash,防止 BT、P2P 下载流量经过代理"
|
||||
|
||||
msgid "443 or 21-443, Use Space to Separate"
|
||||
msgstr "443 or 21-443, 请使用空格分隔"
|
||||
|
||||
msgid "Default Common Ports"
|
||||
msgstr "默认常用端口"
|
||||
|
||||
msgid "Provider File Manage"
|
||||
msgstr "代理(规则)集文件管理"
|
||||
|
||||
@ -1447,23 +1443,23 @@ msgstr "当前系统默认接口:"
|
||||
msgid ",Try Enable If Network Loopback"
|
||||
msgstr ", 如发生回环死机请尝试启用"
|
||||
|
||||
msgid "Custom GEOIP URL"
|
||||
msgstr "GEOIP 数据库更新URL"
|
||||
msgid "Custom GeoIP MMDB URL"
|
||||
msgstr "GeoIP MMDB 数据库更新 URL"
|
||||
|
||||
msgid "Custom GeoSite URL"
|
||||
msgstr "GeoSite 数据库更新URL"
|
||||
msgstr "GeoSite 数据库更新 URL"
|
||||
|
||||
msgid "Custom Chnroute6 Lists URL"
|
||||
msgstr "大陆IPv6段更新URL"
|
||||
msgstr "大陆IPv6段更新 URL"
|
||||
|
||||
msgid "Custom Chnroute Lists URL"
|
||||
msgstr "大陆IP段更新URL"
|
||||
msgstr "大陆IP段更新 URL"
|
||||
|
||||
msgid "Custom CN Doamin Lists URL"
|
||||
msgstr "大陆域名列表文件更新URL"
|
||||
msgstr "大陆域名列表文件更新 URL"
|
||||
|
||||
msgid "Custom GEOIP Data URL, Click Button Below To Refresh After Edit"
|
||||
msgstr "自定义 GEOIP 数据库的更新来源,编辑后点击下方按钮生效"
|
||||
msgid "Custom GeoIP MMDB URL, Click Button Below To Refresh After Edit"
|
||||
msgstr "自定义 GeoIP MMDB 数据库的更新来源,编辑后点击下方按钮生效"
|
||||
|
||||
msgid "Custom GeoSite Data URL, Click Button Below To Refresh After Edit"
|
||||
msgstr "自定义 GeoSite 数据库的更新来源,编辑后点击下方按钮生效"
|
||||
@ -2011,6 +2007,9 @@ msgstr "发现 53 端口被劫持,清理防火墙规则..."
|
||||
msgid "OpenClash Start Running..."
|
||||
msgstr "OpenClash 开始启动..."
|
||||
|
||||
msgid "OpenClash Restart..."
|
||||
msgstr "OpenClash 重新启动中..."
|
||||
|
||||
msgid "Step 1: Get The Configuration..."
|
||||
msgstr "第一步: 获取配置..."
|
||||
|
||||
@ -2141,7 +2140,10 @@ msgid "Introduction to rule set usage: https://lancellc.gitbook.io/clash/clash-c
|
||||
msgstr "规则集使用介绍:https://lancellc.gitbook.io/clash/clash-config-file/rule-provider"
|
||||
|
||||
msgid "Introduction to proxy usage: https://lancellc.gitbook.io/clash/clash-config-file/proxies"
|
||||
msgstr "代理使用介绍:https://lancellc.gitbook.io/clash/clash-config-file/rule-provider"
|
||||
msgstr "代理使用介绍:https://lancellc.gitbook.io/clash/clash-config-file/proxies"
|
||||
|
||||
msgid "Introduction to proxy-provider usage: https://lancellc.gitbook.io/clash/clash-config-file/proxy-provider"
|
||||
msgstr "代理集使用介绍:https://lancellc.gitbook.io/clash/clash-config-file/proxy-provider"
|
||||
|
||||
msgid "Subconverter external configuration (subscription conversion template) Description: https://github.com/tindy2013/subconverter#external-configuration-file"
|
||||
msgstr "subconverter 外部配置(订阅转换模板)说明:https://github.com/tindy2013/subconverter#external-configuration-file"
|
||||
@ -2158,9 +2160,6 @@ msgstr "注意: 如遇到配置丢失或者需要还原默认配置,请尝试
|
||||
msgid "Take Effect If Fallback DNS Setted, Prevent DNS Pollution"
|
||||
msgstr "只有在配置文件设置了 Fallback 组的DNS时才会生效,正确设置可以有效防止 DNS 污染"
|
||||
|
||||
msgid "Custom Fallback-Filter"
|
||||
msgstr "自定义 Fallback-Filter"
|
||||
|
||||
msgid "Error: Fallback-Filter Need fallback of DNS Been Setted, Ignore..."
|
||||
msgstr "错误:只有在配置文件设置了 Fallback 组的 DNS 时 Fallback-Filter 才会生效,跳过此项修改..."
|
||||
|
||||
@ -2555,7 +2554,7 @@ msgid "Streaming Enhance"
|
||||
msgstr "流媒体增强"
|
||||
|
||||
msgid "Auto Select Unlock Proxy"
|
||||
msgstr "自动选择解锁节点"
|
||||
msgstr "*自动选择解锁节点"
|
||||
|
||||
msgid "Auto Select Proxy For Streaming Unlock, Support Netflix, Disney Plus, HBO And YouTube Premium, etc"
|
||||
msgstr "自动选择解锁节点,支持 Netflix、Disney Plus、HBO 和 YouTube Premium 等"
|
||||
@ -2888,7 +2887,7 @@ msgid "Error: Streaming DNS Prefetch Could not Work Because of Router-Self Proxy
|
||||
msgstr "错误:因为禁用了代理路由器自身流量,预解析无法工作,退出..."
|
||||
|
||||
msgid "Enable Meta Core"
|
||||
msgstr "使用 Meta 内核"
|
||||
msgstr "*使用 Meta 内核"
|
||||
|
||||
msgid "Some Premium Core Features are Unavailable, For Other More Useful Functions Go Wiki:"
|
||||
msgstr "Meta 内核还未支持 Premium 内核的全部功能,要了解其独有功能,请前往Wiki:"
|
||||
@ -2930,7 +2929,7 @@ msgid "Auto Update GeoIP Dat"
|
||||
msgstr "自动更新 GeoIP Dat 数据库"
|
||||
|
||||
msgid "Custom GeoIP Dat URL"
|
||||
msgstr "GeoIP Dat 数据库更新URL"
|
||||
msgstr "GeoIP Dat 数据库更新 URL"
|
||||
|
||||
msgid "Custom GeoIP Dat URL, Click Button Below To Refresh After Edit"
|
||||
msgstr "自定义 GeoIP Dat 数据库的更新来源,编辑后点击下方按钮生效"
|
||||
@ -2974,9 +2973,6 @@ msgstr "(TUN&Meta 内核)"
|
||||
msgid "Warning: Only Meta Core Support QUIC Type DNS, Skip"
|
||||
msgstr "警告:仅 Meta 内核支持 QUIC 类型的 DNS,跳过"
|
||||
|
||||
msgid "Policy Filter"
|
||||
msgstr "节点筛选"
|
||||
|
||||
msgid "Force Sniffing Domains Lists"
|
||||
msgstr "强制探测(嗅探)的域名列表"
|
||||
|
||||
@ -3155,7 +3151,7 @@ msgid "Domains or IPs in The List Will Not be Affected by The China IP Route Opt
|
||||
msgstr "列表中的域名或 IP 将不会受到绕过中国大陆 IP 选项的影响,此功能依赖于 Dnsmasq"
|
||||
|
||||
msgid "Warning: You May Need to Turn off The Rebinding Protection Option of Dnsmasq When Hosts Has Set a Reserved Address"
|
||||
msgstr "警告:Hosts 设置了保留地址时可能需要关闭 dnsmasq 的重绑定保护选项才能生效"
|
||||
msgstr "警告:Hosts 设置了保留地址时需要关闭 Dnsmasq 的重绑定保护选项才能生效"
|
||||
|
||||
msgid "LAN Block Google DNS IP List"
|
||||
msgstr "实验性:屏蔽 Google DNS 的局域网设备 IP"
|
||||
@ -3164,7 +3160,7 @@ msgid "LAN Block Google DNS Mac List"
|
||||
msgstr "实验性:屏蔽 Google DNS 的局域网设备 Mac"
|
||||
|
||||
msgid "Auto Select Logic"
|
||||
msgstr "自动选择逻辑"
|
||||
msgstr "*自动选择逻辑"
|
||||
|
||||
msgid "Urltest"
|
||||
msgstr "低延迟优先"
|
||||
@ -3179,7 +3175,7 @@ msgid "Google Not CN"
|
||||
msgstr "Google 非送中"
|
||||
|
||||
msgid "In Fake-ip Mode, Even If This Option is Turned Off, Domain Type Connections Still Pass Through The Core For The Availability"
|
||||
msgstr "在 Fake-IP 模式时,即使关闭此选项,域名类型的连接仍将通过核心以保证可用性"
|
||||
msgstr "在 Fake-IP 模式时,即使关闭此选项,域名类型的连接可能仍将通过核心以保证可用性"
|
||||
|
||||
msgid "Warning: TUN Interface Start Failed, Please Check The Dependence or Try to Restart Again!"
|
||||
msgstr "警告:TUN 接口启动失败,请检查依赖情况或稍后重试!"
|
||||
@ -3283,21 +3279,21 @@ msgstr "IPv6 设置"
|
||||
msgid "IPv6 Settings"
|
||||
msgstr "IPv6 设置"
|
||||
|
||||
msgid "Custom Config Override Script, Any Changes Will Be Restored After The Install of the OC, Please Be Careful, The Wrong Changes May Lead to Exceptions"
|
||||
msgstr "自定义配置文件的覆写脚本,任何修改都将在插件重新安装后还原,请谨慎修改,错误的修改可能会导致异常"
|
||||
msgid "Custom Config Overwrite Scripts Which Will Run After Plugin Own Completely, Please Be Careful, The Wrong Changes May Lead to Exceptions"
|
||||
msgstr "自定义配置文件的覆写脚本,此脚本将在插件覆写完成后执行,请谨慎修改,错误的修改可能会导致异常"
|
||||
|
||||
msgid "Custom Firewall Rules, Support IPv4 and IPv6, All Rules Will Be Added After The OpenClash Rules Completely"
|
||||
msgid "Custom Firewall Rules, Support IPv4 and IPv6, All Rules Will Be Added After Plugin Own Completely"
|
||||
msgstr "自定义防火墙规则,支持 IPv4 和 IPv6,此脚本规则将在 OpenClash 的内置规则完成后执行"
|
||||
|
||||
msgid "Tip: Start Add Custom Firewall Rules..."
|
||||
msgstr "提示:开始添加自定义防火墙规则..."
|
||||
|
||||
msgid "Tip: Start Running Custom Overwrite Scripts..."
|
||||
msgstr "提示:开始运行自定义覆写脚本..."
|
||||
|
||||
msgid "Developer Settings"
|
||||
msgstr "开发者选项"
|
||||
|
||||
msgid "Restore Override Script"
|
||||
msgstr "还原覆写脚本"
|
||||
|
||||
msgid "Restore"
|
||||
msgstr "还原"
|
||||
|
||||
@ -3318,3 +3314,33 @@ msgstr "守护程序:修改 Client-fingerprint 失败,"
|
||||
|
||||
msgid "Error: Edit Client-fingerprint Failed,"
|
||||
msgstr "错误:修改 Client-fingerprint 失败,"
|
||||
|
||||
msgid "Traffic Control"
|
||||
msgstr "流量控制"
|
||||
|
||||
msgid "Hide IP"
|
||||
msgstr "隐藏 IP 地址"
|
||||
|
||||
msgid "Show IP"
|
||||
msgstr "显示 IP 地址"
|
||||
|
||||
msgid "Refresh"
|
||||
msgstr "刷新"
|
||||
|
||||
msgid "Refresh"
|
||||
msgstr "刷新"
|
||||
|
||||
msgid "Specify URL"
|
||||
msgstr "指定订阅信息获取地址"
|
||||
|
||||
msgid "Paste the new url of subscribe infos sources here:"
|
||||
msgstr "在此处粘贴并指定订阅信息来源的新地址:"
|
||||
|
||||
msgid "Specify subscribe infos sources url successfully!"
|
||||
msgstr "指定新的订阅信息来源地址成功!"
|
||||
|
||||
msgid "Delete Specify Subscribe infos sources url successfully!"
|
||||
msgstr "已删除指定的订阅信息来源地址!"
|
||||
|
||||
msgid "Specify subscribe infos sources url failed:"
|
||||
msgstr "指定新的订阅信息来源地址失败:"
|
||||
@ -23,7 +23,6 @@ config openclash 'config'
|
||||
option core_version '0'
|
||||
option en_mode 'redir-host'
|
||||
option enable_redirect_dns '1'
|
||||
option dns_advanced_setting '0'
|
||||
option servers_if_update '0'
|
||||
option disable_masq_cache '1'
|
||||
option servers_update '0'
|
||||
@ -43,13 +42,16 @@ config openclash 'config'
|
||||
option common_ports '0'
|
||||
option log_size '1024'
|
||||
option tolerance '0'
|
||||
option store_fakeip '1'
|
||||
option store_fakeip '0'
|
||||
option custom_fallback_filter '0'
|
||||
option append_wan_dns '1'
|
||||
option custom_fakeip_filter '0'
|
||||
option custom_host '0'
|
||||
option custom_name_policy '0'
|
||||
option append_wan_dns '0'
|
||||
option stream_domains_prefetch '0'
|
||||
option stream_auto_select '0'
|
||||
option bypass_gateway_compatible '0'
|
||||
option github_address_mod 'https://testingcf.jsdelivr.net/'
|
||||
option github_address_mod '0'
|
||||
option urltest_address_mod '0'
|
||||
option delay_start '0'
|
||||
option router_self_proxy '1'
|
||||
@ -57,7 +59,7 @@ config openclash 'config'
|
||||
option enable_meta_core '0'
|
||||
option dashboard_type 'Official'
|
||||
option yacd_type 'Official'
|
||||
option append_default_dns '1'
|
||||
option append_default_dns '0'
|
||||
option geo_custom_url 'https://testingcf.jsdelivr.net/gh/alecthw/mmdb_china_ip_list@release/lite/Country.mmdb'
|
||||
option geosite_custom_url 'https://testingcf.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat'
|
||||
option geoip_custom_url 'https://testingcf.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat'
|
||||
|
||||
@ -365,7 +365,7 @@ yml_other_rules_get()
|
||||
check_run_quick()
|
||||
{
|
||||
quick_start=true
|
||||
check_file="$(echo $RAW_CONFIG_FILE | tr " " "?") /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 /etc/openclash/custom/openclash_force_sniffing_domain.yaml /etc/openclash/custom/openclash_sniffing_domain_filter.yaml /etc/openclash/custom/openclash_sniffing_ports_filter.yaml /etc/openclash/custom/openclash_custom_localnetwork_ipv4.list /etc/openclash/custom/openclash_custom_localnetwork_ipv6.list /etc/openclash/custom/openclash_custom_chnroute_pass.list /etc/openclash/custom/openclash_custom_chnroute6_pass.list $cndomain_path"
|
||||
check_file="$(echo $RAW_CONFIG_FILE | tr " " "?") /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 /etc/openclash/custom/openclash_force_sniffing_domain.yaml /etc/openclash/custom/openclash_sniffing_domain_filter.yaml /etc/openclash/custom/openclash_sniffing_ports_filter.yaml /etc/openclash/custom/openclash_custom_localnetwork_ipv4.list /etc/openclash/custom/openclash_custom_localnetwork_ipv6.list /etc/openclash/custom/openclash_custom_chnroute_pass.list /etc/openclash/custom/openclash_custom_chnroute6_pass.list $cndomain_path /etc/openclash/custom/openclash_custom_overwrite.sh"
|
||||
if [ ! -f "$CONFIG_FILE" ] || [ ! -f "/tmp/openclash_config.tmp" ] || [ ! -f "/tmp/openclash.change" ]; then
|
||||
quick_start=false
|
||||
return
|
||||
@ -1230,6 +1230,15 @@ cat > "/var/etc/openclash.include" <<-EOF
|
||||
/etc/init.d/openclash reload "firewall" >/dev/null 2>&1
|
||||
EOF
|
||||
|
||||
#common ports
|
||||
if [ -n "$common_ports" ] && [ "$common_ports" != "0" ]; then
|
||||
if [ "$common_ports" = "1" ]; then
|
||||
common_port="21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889"
|
||||
else
|
||||
common_port=$common_ports
|
||||
fi
|
||||
fi
|
||||
|
||||
local settype nftflag
|
||||
if dnsmasq --version | grep -q 'Compile time options:.* nftset'; then
|
||||
settype="nftset"
|
||||
@ -1261,7 +1270,7 @@ if [ -n "$FW4" ]; then
|
||||
nft -f '/etc/openclash/china_ip_route.ipset' 2>/dev/null
|
||||
done
|
||||
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
mkdir -p ${DNSMASQ_CONF_DIR} 2>/dev/null
|
||||
echo "add set inet fw4 china_ip_route_pass { type ipv4_addr; flags interval; auto-merge; }" >>/tmp/openclash_china_ip_route_pass.list
|
||||
[ -z `(awk '!/^$/&&!/^#/&&/(^([1-9]|1[0-9]|1[1-9]{2}|2[0-4][0-9]|25[0-5])\.)(([0-9]{1,2}|1[1-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5][0-9]|25[0-4])((\/[0-9][0-9])?)$/{printf(" %s,'" "'\n",$0)}' /etc/openclash/custom/openclash_custom_chnroute_pass.list)` ] || {
|
||||
@ -1306,7 +1315,7 @@ if [ -n "$FW4" ]; then
|
||||
nft add rule inet fw4 nat_output position 0 udp dport 53 ip daddr {127.0.0.1} meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
if [ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" != "2" ]; then
|
||||
LOG_OUT "Tip: Bypass the China IP May Cause the Dnsmasq Load For a Long Time After Restart in FAKE-IP Mode, Hijack the DNS to Core Untill the Dnsmasq Works Well..."
|
||||
nft insert rule inet fw4 dstnat position 0 tcp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft insert rule inet fw4 dstnat position 0 udp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
@ -1397,8 +1406,7 @@ if [ -n "$FW4" ]; then
|
||||
fi
|
||||
|
||||
#common ports
|
||||
if [ "$common_ports" = "1" ]; then
|
||||
common_port="21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889"
|
||||
if [ -n "$common_ports" ] && [ "$common_ports" != "0" ]; then
|
||||
nft 'add set inet fw4 common_ports { type inet_service; }'
|
||||
for i in $common_port; do
|
||||
nft add element inet fw4 common_ports { "$i" }
|
||||
@ -1455,7 +1463,7 @@ if [ -n "$FW4" ]; then
|
||||
nft 'add rule inet fw4 openclash tcp dport != @common_ports counter return' 2>/dev/null
|
||||
fi
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash ip daddr @china_ip_route counter return' 2>/dev/null
|
||||
@ -1496,7 +1504,7 @@ if [ -n "$FW4" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle udp dport != @common_ports counter return' 2>/dev/null
|
||||
fi
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route counter return' 2>/dev/null
|
||||
@ -1545,7 +1553,7 @@ if [ -n "$FW4" ]; then
|
||||
nft add rule inet fw4 openclash_output tcp dport != @common_ports skuid != 65534 counter return 2>/dev/null
|
||||
fi
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash_output skuid != 65534 ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_output skuid != 65534 ip daddr @china_ip_route counter return' 2>/dev/null
|
||||
@ -1602,7 +1610,7 @@ if [ -n "$FW4" ]; then
|
||||
if [ "$en_mode_tun" -eq 1 ]; then
|
||||
nft add rule inet fw4 openclash_mangle_output meta l4proto {tcp,udp} th dport { 0-65535 } ip daddr { "$fakeip_range" } mark set "$PROXY_FWMARK" 2>/dev/null
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route counter return' 2>/dev/null
|
||||
@ -1611,7 +1619,7 @@ if [ -n "$FW4" ]; then
|
||||
nft add rule inet fw4 openclash_mangle_output tcp dport { 0-65535 } skuid != 65534 meta mark set "$PROXY_FWMARK" 2>/dev/null
|
||||
else
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route counter return' 2>/dev/null
|
||||
@ -1623,7 +1631,7 @@ if [ -n "$FW4" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @wan_ac_black_ips counter return' 2>/dev/null
|
||||
nft 'add rule inet fw4 openclash_mangle_output meta l4proto {tcp,udp} th dport != @common_ports skuid != 65534 counter return' 2>/dev/null
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route counter return' 2>/dev/null
|
||||
@ -1660,7 +1668,7 @@ if [ -n "$FW4" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle meta l4proto {tcp,udp} th dport != @common_ports counter return' 2>/dev/null
|
||||
fi
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route counter return' 2>/dev/null
|
||||
@ -1672,23 +1680,25 @@ if [ -n "$FW4" ]; then
|
||||
if [ "$en_mode_tun" -eq 1 ]; then
|
||||
nft 'insert rule inet fw4 mangle_prerouting position 0 meta l4proto {tcp,udp} counter jump openclash_mangle' 2>/dev/null
|
||||
else
|
||||
nft 'insert rule inet fw4 mangle_prerouting position 0 meta nfproto {ipv4} tcp dport 53 counter jump openclash_dns_hijack' 2>/dev/null
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ip saddr @lan_ac_black_ips counter return' 2>/dev/null
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ether saddr @lan_ac_black_macs counter return' 2>/dev/null
|
||||
if [ "$lan_ac_mode" = "1" ] && [ -n "$(uci -q get openclash.config.lan_ac_white_ips)" ] && [ -n "$(uci -q get openclash.config.lan_ac_white_macs)" ]; then
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ether saddr != @lan_ac_white_macs ip saddr != @lan_ac_white_ips counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ether saddr != @lan_ac_white_macs counter return' 2>/dev/null
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ip saddr != @lan_ac_white_ips counter return' 2>/dev/null
|
||||
if [ "$enable_redirect_dns" -eq 1 ]; then
|
||||
nft 'insert rule inet fw4 mangle_prerouting position 0 meta nfproto {ipv4} tcp dport 53 counter jump openclash_dns_hijack' 2>/dev/null
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ip saddr @lan_ac_black_ips counter return' 2>/dev/null
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ether saddr @lan_ac_black_macs counter return' 2>/dev/null
|
||||
if [ "$lan_ac_mode" = "1" ] && [ -n "$(uci -q get openclash.config.lan_ac_white_ips)" ] && [ -n "$(uci -q get openclash.config.lan_ac_white_macs)" ]; then
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ether saddr != @lan_ac_white_macs ip saddr != @lan_ac_white_ips counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ether saddr != @lan_ac_white_macs counter return' 2>/dev/null
|
||||
nft 'add rule inet fw4 openclash_dns_hijack ip saddr != @lan_ac_white_ips counter return' 2>/dev/null
|
||||
fi
|
||||
nft add rule inet fw4 openclash_dns_hijack meta nfproto {ipv4} tcp dport 53 mark set "$PROXY_FWMARK" comment \"OpenClash TCP DNS Hijack\" 2>/dev/null
|
||||
fi
|
||||
nft add rule inet fw4 openclash_dns_hijack meta nfproto {ipv4} tcp dport 53 mark set "$PROXY_FWMARK" comment \"OpenClash TCP DNS Hijack\" 2>/dev/null
|
||||
nft 'insert rule inet fw4 mangle_prerouting position 0 ip protocol udp counter jump openclash_mangle' 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ "$enable_redirect_dns" -eq 2 ]; then
|
||||
local position=$(nft list chain inet fw4 openclash_dns_redirect |grep "DNS" |grep -v "REDIRECT" |awk -F '# handle ' '{print$2}' |sort -rn |head -1 || ehco 0)
|
||||
nft insert rule inet fw4 openclash_dns_redirect "$position" meta nfproto {ipv4} tcp dport 53 counter accept comment \"OpenClash TCP DNS Hijack\" 2>/dev/null
|
||||
else
|
||||
elif [ "$enable_redirect_dns" -eq 1 ]; then
|
||||
nft insert rule inet fw4 dstnat position 0 meta nfproto {ipv4} tcp dport 53 counter accept comment \"OpenClash TCP DNS Hijack\" 2>/dev/null
|
||||
fi
|
||||
|
||||
@ -1741,7 +1751,7 @@ if [ -n "$FW4" ]; then
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft insert rule inet fw4 dstnat position 0 meta nfproto {ipv6} tcp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft insert rule inet fw4 dstnat position 0 meta nfproto {ipv6} udp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft 'add chain inet fw4 nat_output { type nat hook output priority -1; }' 2>/dev/null
|
||||
@ -1760,7 +1770,7 @@ if [ -n "$FW4" ]; then
|
||||
nft -f '/etc/openclash/china_ip6_route.ipset' 2>/dev/null
|
||||
done
|
||||
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
mkdir -p ${DNSMASQ_CONF_DIR} 2>/dev/null
|
||||
|
||||
echo "add set inet fw4 china_ip6_route_pass { type ipv6_addr; flags interval; auto-merge; }" >>/tmp/openclash_china_ip6_route_pass.list
|
||||
@ -1847,7 +1857,7 @@ if [ -n "$FW4" ]; then
|
||||
fi
|
||||
|
||||
if [ "$china_ip6_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle_v6 ip6 daddr @china_ip6_route ip6 daddr != @china_ip6_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_mangle_v6 ip6 daddr @china_ip6_route counter return' 2>/dev/null
|
||||
@ -1877,7 +1887,7 @@ if [ -n "$FW4" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle_output_v6 meta nfproto {ipv6} th dport != @common_ports skuid != 65534 counter return' 2>/dev/null
|
||||
|
||||
if [ "$china_ip6_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
nft 'add rule inet fw4 openclash_mangle_output_v6 skuid != 65534 ip6 daddr @china_ip6_route ip6 daddr != @china_ip6_route_pass counter return' 2>/dev/null
|
||||
else
|
||||
nft 'add rule inet fw4 openclash_mangle_output_v6 skuid != 65534 ip6 daddr @china_ip6_route counter return' 2>/dev/null
|
||||
@ -1939,7 +1949,7 @@ else
|
||||
ipset -! flush china_ip_route 2>/dev/null
|
||||
ipset -! restore </etc/openclash/china_ip_route.ipset 2>/dev/null
|
||||
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
mkdir -p ${DNSMASQ_CONF_DIR} 2>/dev/null
|
||||
echo "create china_ip_route_pass hash:net family inet hashsize 1024 maxelem 1000000" >/tmp/openclash_china_ip_route_pass.list
|
||||
awk '!/^$/&&!/^#/&&/(^([1-9]|1[0-9]|1[1-9]{2}|2[0-4][0-9]|25[0-5])\.)(([0-9]{1,2}|1[1-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5][0-9]|25[0-4])((\/[0-9][0-9])?)$/{printf("add china_ip_route_pass %s'" "'\n",$0)}' /etc/openclash/custom/openclash_custom_chnroute_pass.list >>/tmp/openclash_china_ip_route_pass.list 2>/dev/null
|
||||
@ -1979,7 +1989,7 @@ else
|
||||
iptables -t nat -I OUTPUT -p tcp --dport 53 -d 127.0.0.1 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
if [ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" != "2" ]; then
|
||||
LOG_OUT "Tip: Bypass the China IP May Cause the Dnsmasq Load For a Long Time After Restart in FAKE-IP Mode, Hijack the DNS to Core Untill the Dnsmasq Works Well..."
|
||||
iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
@ -2076,8 +2086,7 @@ else
|
||||
fi
|
||||
|
||||
#common ports
|
||||
if [ "$common_ports" = "1" ]; then
|
||||
common_port="21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889"
|
||||
if [ -n "$common_ports" ] && [ "$common_ports" != "0" ]; then
|
||||
ipset create common_ports bitmap:port range 0-65535
|
||||
for i in $common_port; do
|
||||
ipset add common_ports $i
|
||||
@ -2131,7 +2140,7 @@ else
|
||||
iptables -t nat -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1
|
||||
fi
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
iptables -t nat -A openclash -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t nat -A openclash -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2173,7 +2182,7 @@ else
|
||||
iptables -t mangle -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1
|
||||
fi
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
iptables -t mangle -A openclash -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t mangle -A openclash -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2219,7 +2228,7 @@ else
|
||||
iptables -t nat -A openclash_output -m owner ! --uid-owner 65534 -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1
|
||||
fi
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
iptables -t nat -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t nat -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2276,7 +2285,7 @@ else
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -d "$fakeip_range" -j MARK --set-mark "$PROXY_FWMARK"
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set wan_ac_black_ips dst -j RETURN >/dev/null 2>&1
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2285,7 +2294,7 @@ else
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -p tcp -j MARK --set-mark "$PROXY_FWMARK"
|
||||
else
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2302,7 +2311,7 @@ else
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set wan_ac_black_ips dst -j RETURN >/dev/null 2>&1
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2338,7 +2347,7 @@ else
|
||||
iptables -t mangle -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1
|
||||
fi
|
||||
if [ "$china_ip_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
iptables -t mangle -A openclash -m set --match-set china_ip_route dst -m set ! --match-set china_ip_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t mangle -A openclash -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2352,23 +2361,26 @@ else
|
||||
if [ "$en_mode_tun" -eq 1 ]; then
|
||||
iptables -t mangle -I PREROUTING -j openclash
|
||||
else
|
||||
iptables -t mangle -I PREROUTING -p tcp --dport 53 -j openclash_dns_hijack
|
||||
iptables -t mangle -A openclash_dns_hijack -m set --match-set lan_ac_black_ips src -j RETURN >/dev/null 2>&1
|
||||
iptables -t mangle -A openclash_dns_hijack -m set --match-set lan_ac_black_macs src -j RETURN >/dev/null 2>&1
|
||||
if [ "$lan_ac_mode" = "1" ] && [ -n "$(uci -q get openclash.config.lan_ac_white_ips)" ] && [ -n "$(uci -q get openclash.config.lan_ac_white_macs)" ]; then
|
||||
iptables -t mangle -A openclash_dns_hijack -m set ! --match-set lan_ac_white_ips src -m set ! --match-set lan_ac_white_macs src -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t mangle -A openclash_dns_hijack -m set ! --match-set lan_ac_white_ips src -j RETURN >/dev/null 2>&1
|
||||
iptables -t mangle -A openclash_dns_hijack -m set ! --match-set lan_ac_white_macs src -j RETURN >/dev/null 2>&1
|
||||
if [ "$enable_redirect_dns" -eq 1 ]; then
|
||||
iptables -t mangle -I PREROUTING -p tcp --dport 53 -j openclash_dns_hijack
|
||||
iptables -t mangle -A openclash_dns_hijack -m set --match-set lan_ac_black_ips src -j RETURN >/dev/null 2>&1
|
||||
iptables -t mangle -A openclash_dns_hijack -m set --match-set lan_ac_black_macs src -j RETURN >/dev/null 2>&1
|
||||
if [ "$lan_ac_mode" = "1" ] && [ -n "$(uci -q get openclash.config.lan_ac_white_ips)" ] && [ -n "$(uci -q get openclash.config.lan_ac_white_macs)" ]; then
|
||||
iptables -t mangle -A openclash_dns_hijack -m set ! --match-set lan_ac_white_ips src -m set ! --match-set lan_ac_white_macs src -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
iptables -t mangle -A openclash_dns_hijack -m set ! --match-set lan_ac_white_ips src -j RETURN >/dev/null 2>&1
|
||||
iptables -t mangle -A openclash_dns_hijack -m set ! --match-set lan_ac_white_macs src -j RETURN >/dev/null 2>&1
|
||||
fi
|
||||
iptables -t mangle -A openclash_dns_hijack -m comment --comment "OpenClash TCP DNS Hijack" -p tcp --dport 53 -j MARK --set-mark "$PROXY_FWMARK"
|
||||
fi
|
||||
iptables -t mangle -A openclash_dns_hijack -m comment --comment "OpenClash TCP DNS Hijack" -p tcp --dport 53 -j MARK --set-mark "$PROXY_FWMARK"
|
||||
iptables -t mangle -I PREROUTING -p udp -j openclash
|
||||
fi
|
||||
|
||||
if [ "$enable_redirect_dns" -eq 2 ]; then
|
||||
local position=$(iptables -nvL openclash_dns_redirect -t nat|grep "DNS" |grep -v "REDIRECT" |wc -l)
|
||||
let position++
|
||||
iptables -t nat -I openclash_dns_redirect "$position" -m comment --comment "OpenClash TCP DNS Hijack" -p tcp --dport 53 -j ACCEPT
|
||||
else
|
||||
elif [ "$enable_redirect_dns" -eq 1 ]; then
|
||||
iptables -t nat -I PREROUTING -m comment --comment "OpenClash TCP DNS Hijack" -p tcp --dport 53 -j ACCEPT
|
||||
fi
|
||||
|
||||
@ -2426,7 +2438,7 @@ else
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" != "2" ]; then
|
||||
ip6tables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p udp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
@ -2438,7 +2450,7 @@ else
|
||||
if [ "$china_ip6_route" = "1" ] || [ "$disable_udp_quic" = "1" ]; then
|
||||
ipset -! flush china_ip6_route 2>/dev/null
|
||||
ipset -! restore </etc/openclash/china_ip6_route.ipset 2>/dev/null
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
mkdir -p ${DNSMASQ_CONF_DIR} 2>/dev/null
|
||||
echo "create china_ip6_route_pass hash:net family inet6 hashsize 1024 maxelem 1000000" >/tmp/openclash_china_ip6_route_pass.list
|
||||
awk '!/^$/&&!/^#/&&!/^(\*?\.?)*[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})*$/{printf("add china_ip6_route_pass %s'" "'\n",$0)}' /etc/openclash/custom/openclash_custom_chnroute6_pass.list >>/tmp/openclash_china_ip6_route_pass.list 2>/dev/null
|
||||
@ -2520,7 +2532,7 @@ else
|
||||
fi
|
||||
|
||||
if [ "$china_ip6_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
ip6tables -t mangle -A openclash -m set --match-set china_ip6_route dst -m set ! --match-set china_ip6_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
ip6tables -t mangle -A openclash -m set --match-set china_ip6_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2550,7 +2562,7 @@ else
|
||||
ip6tables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set wan_ac_black_ipv6s dst -j RETURN >/dev/null 2>&1
|
||||
ip6tables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1
|
||||
if [ "$china_ip6_route" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ "$enable_redirect_dns" != "2" ]; then
|
||||
ip6tables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip6_route dst -m set ! --match-set china_ip6_route_pass dst -j RETURN >/dev/null 2>&1
|
||||
else
|
||||
ip6tables -t mangle -A openclash_output -m owner ! --uid-owner 65534 -m set --match-set china_ip6_route dst -j RETURN >/dev/null 2>&1
|
||||
@ -2732,7 +2744,12 @@ get_config()
|
||||
http_port=$(uci -q get openclash.config.http_port)
|
||||
socks_port=$(uci -q get openclash.config.socks_port)
|
||||
enable_redirect_dns=$(uci -q get openclash.config.enable_redirect_dns)
|
||||
fakeip_range=$(uci -q get openclash.config.fakeip_range || echo "198.18.0.1/16")
|
||||
if [ "$(uci -q get openclash.config.fakeip_range)" == "0" ]; then
|
||||
fakeip_range=$(ruby_read "$CONFIG_FILE" "['dns']['fake-ip-range']")
|
||||
else
|
||||
fakeip_range=$(uci -q get openclash.config.fakeip_range)
|
||||
fi
|
||||
[ -z "$fakeip_range" ] && fakeip_range="198.18.0.1/16"
|
||||
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 || uci -q -p /tmp/state get network.lan.device) | 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 "^$(echo "$fakeip_range"|awk -F '.' '{print $1"."$2}')" 2>/dev/null)
|
||||
lan_ip6_cidrs=$(ip -6 route | grep "/" | awk '{print $1}' | grep -vE "^unreachable" 2>/dev/null)
|
||||
@ -2755,22 +2772,22 @@ get_config()
|
||||
common_ports=$(uci -q get openclash.config.common_ports)
|
||||
dns_port=$(uci -q get openclash.config.dns_port)
|
||||
stream_domains_prefetch=$(uci -q get openclash.config.stream_domains_prefetch || echo 0)
|
||||
store_fakeip=$(uci -q get openclash.config.store_fakeip || echo 1)
|
||||
store_fakeip=$(uci -q get openclash.config.store_fakeip || echo 0)
|
||||
bypass_gateway_compatible=$(uci -q get openclash.config.bypass_gateway_compatible || echo 0)
|
||||
core_version=$(uci -q get openclash.config.core_version || echo 0)
|
||||
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_custom=$(uci -q get openclash.config.enable_meta_sniffer_custom || echo 0)
|
||||
geodata_loader=$(uci -q get openclash.config.geodata_loader || echo "memconservative")
|
||||
geodata_loader=$(uci -q get openclash.config.geodata_loader || echo 0)
|
||||
enable_geoip_dat=$(uci -q get openclash.config.enable_geoip_dat || echo 0)
|
||||
enable_tcp_concurrent=$(uci -q get openclash.config.enable_tcp_concurrent || echo 0)
|
||||
append_default_dns=$(uci -q get openclash.config.append_default_dns || echo 1)
|
||||
enable_meta_sniffer_pure_ip=$(uci -q get openclash.config.enable_meta_sniffer_pure_ip || echo 1)
|
||||
append_default_dns=$(uci -q get openclash.config.append_default_dns || echo 0)
|
||||
enable_meta_sniffer_pure_ip=$(uci -q get openclash.config.enable_meta_sniffer_pure_ip || echo 0)
|
||||
custom_china_domain_dns_server=$(uci -q get openclash.config.custom_china_domain_dns_server || echo "114.114.114.114")
|
||||
find_process_mode=$(uci -q get openclash.config.find_process_mode || echo off)
|
||||
find_process_mode=$(uci -q get openclash.config.find_process_mode || echo 0)
|
||||
upnp_lease_file=$(uci -q get upnpd.config.upnp_lease_file)
|
||||
global_client_fingerprint=$(uci -q get openclash.config.global_client_fingerprint || echo "none")
|
||||
global_client_fingerprint=$(uci -q get openclash.config.global_client_fingerprint || echo "0")
|
||||
[ -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
|
||||
}
|
||||
@ -2801,6 +2818,11 @@ start()
|
||||
/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" "$enable_meta_core" "$enable_meta_sniffer" "$enable_geoip_dat" "$geodata_loader" "$enable_meta_sniffer_custom" "$interface_name" "$enable_tcp_concurrent" "$core_type" "$append_default_dns" "$enable_meta_sniffer_pure_ip" "$find_process_mode" "$fakeip_range" "$global_client_fingerprint"
|
||||
/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" "$enable_meta_core" "$enable_redirect_dns" "$fakeip_range"
|
||||
/usr/share/openclash/openclash_custom_domain_dns.sh >/dev/null 2>&1
|
||||
#Custom overwrite
|
||||
if [ -f "/etc/openclash/custom/openclash_custom_overwrite.sh" ]; then
|
||||
chmod +x /etc/openclash/custom/openclash_custom_overwrite.sh >/dev/null 2>&1
|
||||
/etc/openclash/custom/openclash_custom_overwrite.sh 2>/dev/null "$TMP_CONFIG_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
LOG_OUT "Step 4: Start Running The Clash Core..."
|
||||
@ -2922,6 +2944,8 @@ restart()
|
||||
mkdir -p /tmp/lock
|
||||
touch $LOCK_FILE
|
||||
set_lock
|
||||
echo "OpenClash Restart..."
|
||||
LOG_OUT "OpenClash Restart..."
|
||||
stop
|
||||
start
|
||||
del_lock
|
||||
|
||||
@ -0,0 +1,69 @@
|
||||
#!/bin/sh
|
||||
. /usr/share/openclash/ruby.sh
|
||||
. /usr/share/openclash/log.sh
|
||||
. /lib/functions.sh
|
||||
|
||||
# This script is called by /etc/init.d/openclash
|
||||
# Add your custom overwrite scripts here, they will be take effict after the OpenClash own srcipts
|
||||
|
||||
LOG_OUT "Tip: Start Running Custom Overwrite Scripts..."
|
||||
LOGTIME=$(echo $(date "+%Y-%m-%d %H:%M:%S"))
|
||||
LOG_FILE="/tmp/openclash.log"
|
||||
CONFIG_FILE="$1" #config path
|
||||
|
||||
#Simple Demo:
|
||||
#General Demo
|
||||
#1--config path
|
||||
#2--key name
|
||||
#3--value
|
||||
#ruby_edit "$CONFIG_FILE" "['redir-port']" "7892"
|
||||
#ruby_edit "$CONFIG_FILE" "['secret']" "123456"
|
||||
#ruby_edit "$CONFIG_FILE" "['dns']['enable']" "true"
|
||||
|
||||
#Hash Demo
|
||||
#1--config path
|
||||
#2--key name
|
||||
#3--hash type value
|
||||
#ruby_edit "$CONFIG_FILE" "['experimental']" "{'sniff-tls-sni'=>true}"
|
||||
#ruby_edit "$CONFIG_FILE" "['sniffer']" "{'sniffing'=>['tls','http']}"
|
||||
|
||||
#Array Demo:
|
||||
#1--config path
|
||||
#2--key name
|
||||
#3--position(start from 0, end with -1)
|
||||
#4--value
|
||||
#ruby_arr_insert "$CONFIG_FILE" "['dns']['nameserver']" "0" "114.114.114.114"
|
||||
|
||||
#Array Add From Yaml File Demo:
|
||||
#1--config path
|
||||
#2--key name
|
||||
#3--position(start from 0, end with -1)
|
||||
#4--value file path
|
||||
#5--value key name in #4 file
|
||||
#ruby_arr_add_file "$CONFIG_FILE" "['dns']['fallback-filter']['ipcidr']" "0" "/etc/openclash/custom/openclash_custom_fallback_filter.yaml" "['fallback-filter']['ipcidr']"
|
||||
|
||||
#Ruby Script Demo:
|
||||
#ruby -ryaml -rYAML -I "/usr/share/openclash" -E UTF-8 -e "
|
||||
# begin
|
||||
# Value = YAML.load_file('$CONFIG_FILE');
|
||||
# rescue Exception => e
|
||||
# puts '${LOGTIME} Error: Load File Failed,【' + e.message + '】';
|
||||
# end;
|
||||
|
||||
#General
|
||||
# begin
|
||||
# Thread.new{
|
||||
# Value['redir-port']=7892;
|
||||
# Value['tproxy-port']=7895;
|
||||
# Value['port']=7890;
|
||||
# Value['socks-port']=7891;
|
||||
# Value['mixed-port']=7893;
|
||||
# }.join;
|
||||
|
||||
# rescue Exception => e
|
||||
# puts '${LOGTIME} Error: Set General Failed,【' + e.message + '】';
|
||||
# ensure
|
||||
# File.open('$CONFIG_FILE','w') {|f| YAML.dump(Value, f)};
|
||||
# end" 2>/dev/null >> $LOG_FILE
|
||||
|
||||
exit 0
|
||||
@ -1,4 +1,4 @@
|
||||
skip-domain:
|
||||
- '+.apple.com'
|
||||
- Mijia Cloud
|
||||
- '+.jd.com'
|
||||
- dlg.io.mi.com
|
||||
@ -36,7 +36,7 @@ cp -f "/etc/openclash/custom/openclash_custom_localnetwork_ipv6.list" "/usr/shar
|
||||
cp -f "/etc/openclash/custom/openclash_custom_chnroute_pass.list" "/usr/share/openclash/backup/openclash_custom_chnroute_pass.list" >/dev/null 2>&1
|
||||
cp -f "/etc/openclash/custom/openclash_custom_chnroute6_pass.list" "/usr/share/openclash/backup/openclash_custom_chnroute6_pass.list" >/dev/null 2>&1
|
||||
cp -f "/etc/openclash/custom/openclash_custom_firewall_rules.sh" "/usr/share/openclash/backup/openclash_custom_firewall_rules.sh" >/dev/null 2>&1
|
||||
cp -f "/usr/share/openclash/yml_change.sh" "/usr/share/openclash/backup/yml_change.sh" >/dev/null 2>&1
|
||||
cp -f "/etc/openclash/custom/openclash_custom_overwrite.sh" "/usr/share/openclash/backup/openclash_custom_overwrite.sh" >/dev/null 2>&1
|
||||
|
||||
mkdir -p /lib/upgrade/keep.d
|
||||
cat > "/lib/upgrade/keep.d/luci-app-openclash" <<-EOF
|
||||
|
||||
@ -21,18 +21,18 @@ set_lock
|
||||
if [ "$TIME" != "$CHTIME" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL -m 10 "$github_address_mod"gh/vernesong/OpenClash@"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL -m 60 "$github_address_mod"gh/vernesong/OpenClash@core/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL -m 10 https://raw.fastgit.org/vernesong/OpenClash/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL -m 60 https://raw.fastgit.org/vernesong/OpenClash/core/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL -m 10 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL -m 60 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/core/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL -m 10 https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL -m 60 https://raw.githubusercontent.com/vernesong/OpenClash/core/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
|
||||
if [ "${PIPESTATUS[0]}" -ne 0 ] || [ -n "$(cat $LAST_OPVER |grep '<html>')" ]; then
|
||||
curl -SsL -m 10 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL -m 60 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core_version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl_status=${PIPESTATUS[0]}
|
||||
else
|
||||
curl_status=0
|
||||
|
||||
@ -30,6 +30,9 @@ disable_udp_quic=$(uci -q get openclash.config.disable_udp_quic)
|
||||
ipv6_enable=$(uci -q get openclash.config.ipv6_enable)
|
||||
router_self_proxy=$(uci -q get openclash.config.router_self_proxy || echo 1)
|
||||
DNSPORT=$(uci -q get dhcp.@dnsmasq[0].port)
|
||||
DNSMASQ_CONF_DIR=$(uci -q get dhcp.@dnsmasq[0].confdir || echo '/tmp/dnsmasq.d')
|
||||
DNSMASQ_CONF_DIR=${DNSMASQ_CONF_DIR%*/}
|
||||
custom_china_domain_dns_server=$(uci -q get openclash.config.custom_china_domain_dns_server || echo "114.114.114.114")
|
||||
FW4=$(command -v fw4)
|
||||
|
||||
if [ -z "$DNSPORT" ]; then
|
||||
@ -61,15 +64,15 @@ config_download()
|
||||
{
|
||||
if [ -n "$subscribe_url_param" ]; then
|
||||
if [ -n "$c_address" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 -H 'User-Agent: Clash' "$c_address""$subscribe_url_param" -o "$CFG_FILE" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$CFG_FILE" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 -H 'User-Agent: Clash' "$c_address""$subscribe_url_param" -o "$CFG_FILE" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$CFG_FILE" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 -H 'User-Agent: Clash' https://api.dler.io/sub"$subscribe_url_param" -o "$CFG_FILE" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$CFG_FILE" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 -H 'User-Agent: Clash' https://api.dler.io/sub"$subscribe_url_param" -o "$CFG_FILE" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$CFG_FILE" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
if [ "$?" -ne 0 ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 -H 'User-Agent: Clash' https://subconverter.herokuapp.com/sub"$subscribe_url_param" -o "$CFG_FILE" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$CFG_FILE" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 -H 'User-Agent: Clash' https://subconverter.herokuapp.com/sub"$subscribe_url_param" -o "$CFG_FILE" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$CFG_FILE" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 -H 'User-Agent: Clash' "$subscribe_url" -o "$CFG_FILE" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$CFG_FILE" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 -H 'User-Agent: Clash' "$subscribe_url" -o "$CFG_FILE" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$CFG_FILE" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
@ -239,9 +242,18 @@ change_dns()
|
||||
uci -q set dhcp.@dnsmasq[0].cachesize=0
|
||||
}
|
||||
uci commit dhcp
|
||||
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
|
||||
if [ -z "$(echo "$en_mode" |grep "redir-host")" ] && [ "$china_ip_route" -eq 1 ] && [ "$enable_redirect_dns" != "2" ]; then
|
||||
cat "/etc/openclash/accelerated-domains.china.conf" |awk -v dns="${custom_china_domain_dns_server}" -F '/' '!/^$/&&!/^#/{print $1"/"$2"/"dns}' >${DNSMASQ_CONF_DIR}/dnsmasq_accelerated-domains.china.conf 2>/dev/null
|
||||
for i in `awk '!/^$/&&!/^#/&&!/(^([1-9]|1[0-9]|1[1-9]{2}|2[0-4][0-9]|25[0-5])\.)(([0-9]{1,2}|1[1-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5][0-9]|25[0-4])((\/[0-9][0-9])?)$/{printf("%s\n",$0)}' /etc/openclash/custom/openclash_custom_chnroute_pass.list`
|
||||
do
|
||||
sed -i "/server=\/${i}\//d" ${DNSMASQ_CONF_DIR}/dnsmasq_accelerated-domains.china.conf 2>/dev/null
|
||||
done 2>/dev/null
|
||||
fi
|
||||
|
||||
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
||||
|
||||
if [ -n "$FW4" ]; then
|
||||
for nft in "nat_output" "mangle_output"; do
|
||||
local handles=$(nft -a list chain inet fw4 ${nft} |grep -E "openclash|OpenClash" |grep -v "OpenClash DNS Hijack" |awk -F '# handle ' '{print$2}')
|
||||
@ -250,13 +262,20 @@ change_dns()
|
||||
done
|
||||
done >/dev/null 2>&1
|
||||
echo "$nat_output_rules" |while read line
|
||||
do >/dev/null 2>&1
|
||||
do
|
||||
if [ -n "$(echo "$line" |grep "OpenClash DNS Hijack")" ]; then
|
||||
continue
|
||||
fi
|
||||
nft add rule inet fw4 nat_output ${line}
|
||||
done
|
||||
done >/dev/null 2>&1
|
||||
echo "$mangle_output_rules" |while read line
|
||||
do
|
||||
if [ -n "$(echo "$line" |grep "OpenClash DNS Hijack")" ]; then
|
||||
continue
|
||||
fi
|
||||
nft add rule inet fw4 mangle_output ${line}
|
||||
done >/dev/null 2>&1
|
||||
|
||||
if [ "$enable_redirect_dns" = "2" ]; then
|
||||
if [ "$router_self_proxy" = 1 ]; then
|
||||
nft add rule inet fw4 nat_output position 0 tcp dport 53 ip daddr {127.0.0.1} meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
@ -269,6 +288,25 @@ change_dns()
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ -z "$(echo "$en_mode" |grep "redir-host")" ] && [ "$china_ip_route" -eq 1 ] && [ "$enable_redirect_dns" != "2" ]; then
|
||||
LOG_OUT "Tip: Bypass the China IP May Cause the Dnsmasq Load For a Long Time After Restart in FAKE-IP Mode, Hijack the DNS to Core Untill the Dnsmasq Works Well..."
|
||||
nft insert rule inet fw4 dstnat position 0 tcp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft insert rule inet fw4 dstnat position 0 udp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft 'add chain inet fw4 nat_output { type nat hook output priority -1; }' 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 tcp dport 53 meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 udp dport 53 meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 tcp dport 12353 meta skuid != 65534 counter redirect to "$DNSPORT" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 udp dport 12353 meta skuid != 65534 counter redirect to "$DNSPORT" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
if [ "$ipv6_enable" -eq 1 ]; then
|
||||
nft insert rule inet fw4 dstnat position 0 meta nfproto {ipv6} tcp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft insert rule inet fw4 dstnat position 0 meta nfproto {ipv6} udp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft 'add chain inet fw4 nat_output { type nat hook output priority -1; }' 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 meta nfproto {ipv6} tcp dport 53 meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 meta nfproto {ipv6} udp dport 53 meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 meta nfproto {ipv6} tcp dport 12353 meta skuid != 65534 counter redirect to "$DNSPORT" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 meta nfproto {ipv6} udp dport 12353 meta skuid != 65534 counter redirect to "$DNSPORT" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
else
|
||||
iptables -t nat -D OUTPUT -j openclash_output >/dev/null 2>&1
|
||||
iptables -t mangle -D OUTPUT -j openclash_output >/dev/null 2>&1
|
||||
@ -288,6 +326,23 @@ change_dns()
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ -z "$(echo "$en_mode" |grep "redir-host")" ] && [ "$china_ip_route" -eq 1 ] && [ "$enable_redirect_dns" != "2" ]; then
|
||||
LOG_OUT "Tip: Bypass the China IP May Cause the Dnsmasq Load For a Long Time After Restart in FAKE-IP Mode, Hijack the DNS to Core Untill the Dnsmasq Works Well..."
|
||||
iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I OUTPUT -p udp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I OUTPUT -p tcp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I OUTPUT -p udp --dport 12353 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$DNSPORT" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I OUTPUT -p tcp --dport 12353 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$DNSPORT" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
if [ "$ipv6_enable" -eq 1 ]; then
|
||||
ip6tables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p udp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p tcp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p udp --dport 12353 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$DNSPORT" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p tcp --dport 12353 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$DNSPORT" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
[ "$(unify_ps_status "openclash_watchdog.sh")" -eq 0 ] && [ "$(unify_ps_prevent)" -eq 0 ] && nohup /usr/share/openclash/openclash_watchdog.sh &
|
||||
fi
|
||||
@ -326,8 +381,7 @@ field_name_check()
|
||||
|
||||
config_download_direct()
|
||||
{
|
||||
if pidof clash >/dev/null; then
|
||||
|
||||
if pidof clash >/dev/null && [ "$router_self_proxy" = 1 ]; then
|
||||
kill_watchdog
|
||||
if [ "$enable_redirect_dns" -eq 1 ]; then
|
||||
uci -q del_list dhcp.@dnsmasq[0].server=127.0.0.1#"$dns_port"
|
||||
@ -350,6 +404,7 @@ EOF
|
||||
uci -q set dhcp.@dnsmasq[0].noresolv=0
|
||||
uci -q delete dhcp.@dnsmasq[0].cachesize
|
||||
uci commit dhcp
|
||||
rm -rf ${DNSMASQ_CONF_DIR}/dnsmasq_accelerated-domains.china.conf >/dev/null 2>&1
|
||||
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
||||
fi
|
||||
if [ -n "$FW4" ]; then
|
||||
@ -361,34 +416,11 @@ EOF
|
||||
nft delete rule inet fw4 ${nft} handle ${handle}
|
||||
done
|
||||
done >/dev/null 2>&1
|
||||
if [ -z "$(echo "$en_mode" |grep "redir-host")" ] && [ "$china_ip_route" -eq 1 ] && [ "$enable_redirect_dns" = "1" ]; then
|
||||
LOG_OUT "Tip: Bypass the China IP May Cause the Dnsmasq Load For a Long Time After Restart in FAKE-IP Mode, Hijack the DNS to Core Untill the Dnsmasq Works Well..."
|
||||
handles=$(nft -a list chain inet fw4 dstnat |grep "OpenClash DNS Hijack" |awk -F '# handle ' '{print$2}')
|
||||
for handle in $handles; do
|
||||
nft delete rule inet fw4 dstnat handle ${handle}
|
||||
done >/dev/null 2>&1
|
||||
position=$(nft list chain inet fw4 dstnat |grep "OpenClash" |grep "DNS" |awk -F '# handle ' '{print$2}' |sort -rn |head -1 || ehco 0)
|
||||
nft insert rule inet fw4 dstnat position "$position" tcp dport 53 redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft insert rule inet fw4 dstnat position "$position" udp dport 53 redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft 'add chain inet fw4 nat_output { type nat hook output priority -1; }' 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 tcp dport 53 meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 udp dport 53 meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 tcp dport 12353 meta skuid != 65534 counter redirect to "$DNSPORT" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 udp dport 12353 meta skuid != 65534 counter redirect to "$DNSPORT" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
if [ "$ipv6_enable" -eq 1 ]; then
|
||||
nft insert rule inet fw4 dstnat position "$position" meta nfproto {ipv6} tcp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft insert rule inet fw4 dstnat position "$position" meta nfproto {ipv6} udp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 meta nfproto {ipv6} tcp dport 53 meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 meta nfproto {ipv6} udp dport 53 meta skuid != 65534 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 meta nfproto {ipv6} tcp dport 12353 meta skuid != 65534 counter redirect to "$DNSPORT" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
nft add rule inet fw4 nat_output position 0 meta nfproto {ipv6} udp dport 12353 meta skuid != 65534 counter redirect to "$DNSPORT" comment \"OpenClash DNS Hijack\" 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
else
|
||||
iptables -t nat -D OUTPUT -j openclash_output >/dev/null 2>&1
|
||||
iptables -t mangle -D OUTPUT -j openclash_output >/dev/null 2>&1
|
||||
ip6tables -t mangle -D OUTPUT -j openclash_output >/dev/null 2>&1
|
||||
for ipt in "iptables -nvL OUTPUT -t nat" "iptables -nvL PREROUTING -t nat" "ip6tables -nvL PREROUTING -t nat" "ip6tables -nvL OUTPUT -t nat"; do
|
||||
for ipt in "iptables -nvL OUTPUT -t nat" "iptables -nvL OUTPUT -t mangle" "ip6tables -nvL OUTPUT -t mangle" "ip6tables -nvL OUTPUT -t nat"; do
|
||||
for comment in "OpenClash DNS Hijack"; do
|
||||
local lines=$($ipt |sed 1,2d |sed -n "/${comment}/=" 2>/dev/null |sort -rn)
|
||||
if [ -n "$lines" ]; then
|
||||
@ -398,28 +430,8 @@ EOF
|
||||
fi
|
||||
done
|
||||
done >/dev/null 2>&1
|
||||
if [ -z "$(echo "$en_mode" |grep "redir-host")" ] && [ "$china_ip_route" -eq 1 ] && [ "$enable_redirect_dns" = "1" ]; then
|
||||
LOG_OUT "Tip: Bypass the China IP May Cause the Dnsmasq Load For a Long Time After Restart in FAKE-IP Mode, Hijack the DNS to Core Untill the Dnsmasq Works Well..."
|
||||
position=$(iptables -nvL PREROUTING -t nat |sed 1,2d |grep "OpenClash" |sed -n "/DNS/=" 2>/dev/null |sort -rn |head -1 || ehco 0)
|
||||
[ "$position" -ne 0 ] && let position++
|
||||
iptables -t nat -I PREROUTING "$position" -p udp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I PREROUTING "$position" -p tcp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I OUTPUT -p udp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I OUTPUT -p tcp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I OUTPUT -p udp --dport 12353 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$DNSPORT" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
iptables -t nat -I OUTPUT -p tcp --dport 12353 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$DNSPORT" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
if [ "$ipv6_enable" -eq 1 ]; then
|
||||
position=$(ip6tables -nvL PREROUTING -t nat |sed 1,2d |grep "OpenClash" |sed -n "/DNS/=" 2>/dev/null |sort -rn |head -1 || ehco 0)
|
||||
[ "$position" -ne 0 ] && let position++
|
||||
ip6tables -t nat -I PREROUTING "$position" -p udp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I PREROUTING "$position" -p tcp --dport 53 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p udp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p tcp --dport 53 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$dns_port" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p udp --dport 12353 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$DNSPORT" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
ip6tables -t nat -I OUTPUT -p tcp --dport 12353 -m owner ! --uid-owner 65534 -j REDIRECT --to-ports "$DNSPORT" -m comment --comment "OpenClash DNS Hijack" 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
sleep 3
|
||||
|
||||
config_download
|
||||
|
||||
@ -41,13 +41,13 @@
|
||||
LOG_OUT "Start Downloading The Chnroute Cidr List..."
|
||||
if [ -z "$CHNR_CUSTOM_URL" ]; then
|
||||
if pidof clash >/dev/null; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://ispip.clang.cn/all_cn.txt -o /tmp/china_ip_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://ispip.clang.cn/all_cn.txt -o /tmp/china_ip_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" != "0" ] || ! pidof clash >/dev/null; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://ispip.clang.cn/all_cn_cidr.txt -o /tmp/china_ip_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://ispip.clang.cn/all_cn_cidr.txt -o /tmp/china_ip_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$CHNR_CUSTOM_URL" -o /tmp/china_ip_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$CHNR_CUSTOM_URL" -o /tmp/china_ip_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
|
||||
if [ "${PIPESTATUS[0]}" -eq 0 ] && [ -s "/tmp/china_ip_route.txt" ]; then
|
||||
@ -83,9 +83,9 @@
|
||||
#ipv6
|
||||
LOG_OUT "Start Downloading The Chnroute6 Cidr List..."
|
||||
if [ -z "$CHNR6_CUSTOM_URL" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://ispip.clang.cn/all_cn_ipv6.txt -o /tmp/china_ip6_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip6_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://ispip.clang.cn/all_cn_ipv6.txt -o /tmp/china_ip6_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip6_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$CHNR6_CUSTOM_URL" -o /tmp/china_ip6_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip6_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$CHNR6_CUSTOM_URL" -o /tmp/china_ip6_route.txt 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_ip6_route.txt" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -eq "0" ] && [ -s "/tmp/china_ip6_route.txt" ]; then
|
||||
LOG_OUT "Chnroute6 Cidr List Download Success, Check Updated..."
|
||||
@ -120,18 +120,18 @@
|
||||
#CN DOMAIN
|
||||
LOG_OUT "Start Downloading The CN Domains List..."
|
||||
if [ -n "$CNDOMAIN_CUSTOM_URL" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$CNDOMAIN_CUSTOM_URL" -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$CNDOMAIN_CUSTOM_URL" -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/felixonmars/dnsmasq-china-list@master/accelerated-domains.china.conf -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/felixonmars/dnsmasq-china-list@master/accelerated-domains.china.conf -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf -o "/tmp/china_domains.list" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/china_domains.list" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@ -61,17 +61,17 @@ if [ "$CORE_CV" != "$CORE_LV" ] || [ -z "$CORE_CV" ]; then
|
||||
LOG_OUT "【TUN】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/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@"$RELEASE_BRANCH"/core-lateset/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@core/"$RELEASE_BRANCH"/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/core/"$RELEASE_BRANCH"/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/core/"$RELEASE_BRANCH"/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/core/"$RELEASE_BRANCH"/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/premium/clash-"$CPU_MODEL"-"$CORE_LV".gz -o /tmp/clash_tun.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_tun.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl_status=${PIPESTATUS[0]}
|
||||
else
|
||||
curl_status=0
|
||||
@ -84,17 +84,17 @@ if [ "$CORE_CV" != "$CORE_LV" ] || [ -z "$CORE_CV" ]; then
|
||||
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/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@core/"$RELEASE_BRANCH"/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/core/"$RELEASE_BRANCH"/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$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 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/core/"$RELEASE_BRANCH"/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/core/"$RELEASE_BRANCH"/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/meta/clash-"$CPU_MODEL".tar.gz -o /tmp/clash_meta.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash_meta.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl_status=${PIPESTATUS[0]}
|
||||
else
|
||||
curl_status=0
|
||||
@ -107,17 +107,17 @@ if [ "$CORE_CV" != "$CORE_LV" ] || [ -z "$CORE_CV" ]; then
|
||||
LOG_OUT "【Dev】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/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@"$RELEASE_BRANCH"/core-lateset/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@core/"$RELEASE_BRANCH"/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/core/"$RELEASE_BRANCH"/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/core/"$RELEASE_BRANCH"/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/core-lateset/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/core/"$RELEASE_BRANCH"/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/core-lateset/dev/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/clash.tar.gz" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl_status=${PIPESTATUS[0]}
|
||||
else
|
||||
curl_status=0
|
||||
|
||||
@ -16,7 +16,7 @@ set_lock
|
||||
DNSMASQ_CONF_DIR=$(uci -q get dhcp.@dnsmasq[0].confdir || echo '/tmp/dnsmasq.d')
|
||||
DNSMASQ_CONF_DIR=${DNSMASQ_CONF_DIR%*/}
|
||||
rm -rf ${DNSMASQ_CONF_DIR}/dnsmasq_openclash_custom_domain.conf >/dev/null 2>&1
|
||||
if [ "$(uci get openclash.config.dns_advanced_setting 2>/dev/null)" = "1" ] && [ "$(uci get openclash.config.enable_redirect_dns 2>/dev/null)" = "1" ]; then
|
||||
if [ "$(uci get openclash.config.enable_custom_domain_dns_server 2>/dev/null)" = "1" ] && [ "$(uci get openclash.config.enable_redirect_dns 2>/dev/null)" = "1" ]; then
|
||||
LOG_OUT "Setting Secondary DNS Server List..."
|
||||
|
||||
custom_domain_dns_server=$(uci get openclash.config.custom_domain_dns_server 2>/dev/null)
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
fi
|
||||
fi
|
||||
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$DOWNLOAD_PATH" -o "$DASH_FILE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$DASH_FILE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$DOWNLOAD_PATH" -o "$DASH_FILE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$DASH_FILE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
|
||||
if [ "${PIPESTATUS[0]}" -eq 0 ] && [ -s "$DASH_FILE_DIR" ] && [ -z "$(grep "404: Not Found" "$DASH_FILE_DIR")" ] && [ -z "$(grep "Package size exceeded the configured limit" "$DASH_FILE_DIR")" ]; then
|
||||
unzip -qt "$DASH_FILE_DIR" >/dev/null 2>&1
|
||||
|
||||
@ -63,32 +63,32 @@ urlencode() {
|
||||
[ "$RULE_TYPE" != "netflix" ] && [ "$RULE_TYPE" != "disney" ] && DOWNLOAD_PATH=$(urlencode "$DOWNLOAD_PATH")
|
||||
|
||||
if [ "$RULE_TYPE" = "netflix" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$RULE_TYPE" = "disney" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$RULE_TYPE" = "game" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/FQrabbit/SSTap-Rule@master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/FQrabbit/SSTap-Rule@master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"FQrabbit/SSTap-Rule/master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"FQrabbit/SSTap-Rule/master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/FQrabbit/SSTap-Rule/master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/FQrabbit/SSTap-Rule/master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/FQrabbit/SSTap-Rule/master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/FQrabbit/SSTap-Rule/master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
elif [ "$RULE_TYPE" = "provider" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/"$(echo "$DOWNLOAD_PATH" |awk -F '/master' '{print $1}' 2>/dev/null)"@master"$(echo "$DOWNLOAD_PATH" |awk -F 'master' '{print $2}')" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/"$(echo "$DOWNLOAD_PATH" |awk -F '/master' '{print $1}' 2>/dev/null)"@master"$(echo "$DOWNLOAD_PATH" |awk -F 'master' '{print $2}')" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod""$(echo "$DOWNLOAD_PATH" |awk -F '/master' '{print $1}' 2>/dev/null)"/master"$(echo "$DOWNLOAD_PATH" |awk -F 'master' '{print $2}')" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod""$(echo "$DOWNLOAD_PATH" |awk -F '/master' '{print $1}' 2>/dev/null)"/master"$(echo "$DOWNLOAD_PATH" |awk -F 'master' '{print $2}')" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$TMP_RULE_DIR" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@ -30,20 +30,20 @@
|
||||
if [ -z "$GEOIP_CUSTOM_URL" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "${github_address_mod}gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "${github_address_mod}gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "https://raw.fastgit.org/Loyalsoldier/v2ray-rules-dat/release/geoip.dat" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "https://raw.fastgit.org/Loyalsoldier/v2ray-rules-dat/release/geoip.dat" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -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 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -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 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -ne "0" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/v/v2/v2raya/dists/v2ray-rules-dat/geoip.dat" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/v/v2/v2raya/dists/v2ray-rules-dat/geoip.dat" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$GEOIP_CUSTOM_URL" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$GEOIP_CUSTOM_URL" -o /tmp/GeoIP.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoIP.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -eq "0" ] && [ -s "/tmp/GeoIP.dat" ]; then
|
||||
LOG_OUT "GeoIP Dat Download Success, Check Updated..."
|
||||
|
||||
@ -30,20 +30,20 @@
|
||||
if [ -z "$GEOSITE_CUSTOM_URL" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/Loyalsoldier/v2ray-rules-dat/release/geosite.dat -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/Loyalsoldier/v2ray-rules-dat/release/geosite.dat -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -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 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -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 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -ne "0" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/v/v2/v2raya/dists/v2ray-rules-dat/geosite.dat" -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/v/v2/v2raya/dists/v2ray-rules-dat/geosite.dat" -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$GEOSITE_CUSTOM_URL" -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$GEOSITE_CUSTOM_URL" -o /tmp/GeoSite.dat 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/GeoSite.dat" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -eq "0" ] && [ -s "/tmp/GeoSite.dat" ]; then
|
||||
LOG_OUT "GeoSite Database Download Success, Check Updated..."
|
||||
|
||||
@ -30,17 +30,17 @@
|
||||
if [ -z "$GEOIP_CUSTOM_URL" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/alecthw/mmdb_china_ip_list@release/lite/Country.mmdb -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/alecthw/mmdb_china_ip_list@release/lite/Country.mmdb -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/alecthw/mmdb_china_ip_list/release/lite/Country.mmdb -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/alecthw/mmdb_china_ip_list/release/lite/Country.mmdb -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/lite/Country.mmdb -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/lite/Country.mmdb -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/lite/Country.mmdb -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/lite/Country.mmdb -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$GEOIP_CUSTOM_URL" -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$GEOIP_CUSTOM_URL" -o /tmp/Country.mmdb 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/Country.mmdb" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -eq 0 ] && [ -s "/tmp/Country.mmdb" ]; then
|
||||
LOG_OUT "Geoip Database Download Success, Check Updated..."
|
||||
|
||||
@ -36,41 +36,41 @@
|
||||
if [ "$rule_name" = "lhie1" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/dler-io/Rules@master/Clash/Rule.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/dler-io/Rules@master/Clash/Rule.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/dler-io/Rules/master/Clash/Rule.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/dler-io/Rules/master/Clash/Rule.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/dler-io/Rules/master/Clash/Rule.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/dler-io/Rules/master/Clash/Rule.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/dler-io/Rules/master/Clash/Rule.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/dler-io/Rules/master/Clash/Rule.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
sed -i '1i rules:' /tmp/rules.yaml
|
||||
elif [ "$rule_name" = "ConnersHua" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/DivineEngine/Profiles@master/Clash/Outbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/DivineEngine/Profiles@master/Clash/Outbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/DivineEngine/Profiles/master/Clash/Outbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/DivineEngine/Profiles/master/Clash/Outbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Outbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Outbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Outbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Outbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
sed -i "s/# - RULE-SET,ChinaIP,DIRECT/- RULE-SET,ChinaIP,DIRECT/g" /tmp/rules.yaml 2>/dev/null
|
||||
sed -i "s/- GEOIP,/#- GEOIP,/g" /tmp/rules.yaml 2>/dev/null
|
||||
elif [ "$rule_name" = "ConnersHua_return" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/DivineEngine/Profiles@master/Clash/Inbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/DivineEngine/Profiles@master/Clash/Inbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/DivineEngine/Profiles/master/Clash/Inbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/DivineEngine/Profiles/master/Clash/Inbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Inbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Inbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Inbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Inbound.yaml -o /tmp/rules.yaml 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/rules.yaml" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
fi
|
||||
if [ -s "/tmp/rules.yaml" ]; then
|
||||
|
||||
@ -75,7 +75,7 @@ function unlock_auto_select()
|
||||
--Get ip port and password
|
||||
get_auth_info()
|
||||
|
||||
info = SYS.exec(string.format('curl -sL -m 3 --retry 2 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET http://%s:%s/proxies', passwd, ip, port))
|
||||
info = SYS.exec(string.format('curl -sL -m 5 --retry 2 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET http://%s:%s/proxies', passwd, ip, port))
|
||||
if info then
|
||||
info = JSON.parse(info)
|
||||
if not info or not info.proxies then os.exit(0) end
|
||||
@ -244,7 +244,7 @@ function unlock_auto_select()
|
||||
get_proxy(info, value.all[i], value.name)
|
||||
if group_type == "Selector" then
|
||||
if group_name == value.all[i] then
|
||||
SYS.exec(string.format("curl -sL -m 3 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, group_name, ip, port, urlencode(value.name)))
|
||||
SYS.exec(string.format("curl -sL -m 5 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, group_name, ip, port, urlencode(value.name)))
|
||||
end
|
||||
if not all_test then
|
||||
--filter nodes
|
||||
@ -280,7 +280,7 @@ function unlock_auto_select()
|
||||
if proxy == "REJECT" or get_group_now(info, proxy) == "REJECT" then
|
||||
break
|
||||
else
|
||||
SYS.exec(string.format("curl -sL -m 3 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, proxy, ip, port, urlencode(group_name)))
|
||||
SYS.exec(string.format("curl -sL -m 5 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, proxy, ip, port, urlencode(group_name)))
|
||||
region, old_region = proxy_unlock_test()
|
||||
if status == 2 then
|
||||
if region and region ~= "" then
|
||||
@ -333,7 +333,7 @@ function unlock_auto_select()
|
||||
if status == 2 and not all_test then
|
||||
break
|
||||
elseif p == #(proxies) and #(proxies) ~= 1 then
|
||||
SYS.exec(string.format("curl -sL -m 3 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, now_name, ip, port, urlencode(group_name)))
|
||||
SYS.exec(string.format("curl -sL -m 5 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, now_name, ip, port, urlencode(group_name)))
|
||||
end
|
||||
break
|
||||
end
|
||||
@ -341,7 +341,7 @@ function unlock_auto_select()
|
||||
end
|
||||
else
|
||||
--only group expand
|
||||
SYS.exec(string.format("curl -sL -m 3 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, value.all[i], ip, port, urlencode(group_name)))
|
||||
SYS.exec(string.format("curl -sL -m 5 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, value.all[i], ip, port, urlencode(group_name)))
|
||||
while true do
|
||||
if table_include(tested_proxy, now_name) or #nodes_filter(now_name, info) == 0 then
|
||||
break
|
||||
@ -430,8 +430,8 @@ function unlock_auto_select()
|
||||
end
|
||||
end
|
||||
for k, v in pairs(fallback_select) do
|
||||
SYS.exec(string.format("curl -sL -m 3 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, v[1], ip, port, urlencode(value.name)))
|
||||
SYS.exec(string.format("curl -sL -m 3 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, v[3], ip, port, urlencode(v[2])))
|
||||
SYS.exec(string.format("curl -sL -m 5 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, v[1], ip, port, urlencode(value.name)))
|
||||
SYS.exec(string.format("curl -sL -m 5 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, v[3], ip, port, urlencode(v[2])))
|
||||
if table_include(groups, v[3]) then
|
||||
group_now = "【".. v[3] .. " ➟ " .. get_group_now(info, v[3]) .. "】"
|
||||
else
|
||||
@ -467,7 +467,7 @@ function unlock_auto_select()
|
||||
break
|
||||
end
|
||||
elseif i == #(value.all) then
|
||||
SYS.exec(string.format("curl -sL -m 3 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, proxy_default, ip, port, urlencode(value.name)))
|
||||
SYS.exec(string.format("curl -sL -m 5 --retry 2 -w %%{http_code} -o /dev/null -H 'Authorization: Bearer %s' -H 'Content-Type:application/json' -X PUT -d '{\"name\":\"%s\"}' http://%s:%s/proxies/%s", passwd, proxy_default, ip, port, urlencode(value.name)))
|
||||
if table_include(groups, proxy_default) then
|
||||
group_now = value.name.." ➟ "..proxy_default.." ➟ "..get_group_now(info, proxy_default)
|
||||
else
|
||||
@ -567,7 +567,7 @@ function table_sort_by_urltest(t, d)
|
||||
return
|
||||
end
|
||||
|
||||
info = SYS.exec(string.format('curl -sL -m 3 --retry 2 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET http://%s:%s/providers/proxies', passwd, ip, port))
|
||||
info = SYS.exec(string.format('curl -sL -m 5 --retry 2 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET http://%s:%s/providers/proxies', passwd, ip, port))
|
||||
if info then
|
||||
info = JSON.parse(info)
|
||||
if not info or not info.providers then return t end
|
||||
@ -596,7 +596,7 @@ function table_sort_by_urltest(t, d)
|
||||
else
|
||||
delay_url = "http://www.gstatic.com/generate_204"
|
||||
end
|
||||
group_delay = SYS.exec(string.format('curl -sL -m 5 --retry 2 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET "http://%s:%s/proxies/%s/delay?timeout=5000&url=%s"', passwd, ip, port, urlencode(t[n]), urlencode(delay_url)))
|
||||
group_delay = SYS.exec(string.format('curl -sL -m 60 --retry 2 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET "http://%s:%s/proxies/%s/delay?timeout=5000&url=%s"', passwd, ip, port, urlencode(t[n]), urlencode(delay_url)))
|
||||
if group_delay then
|
||||
group_delay = JSON.parse(group_delay)
|
||||
end
|
||||
@ -676,7 +676,7 @@ function close_connections()
|
||||
--close connections
|
||||
if #(group_cons_id) > 0 then
|
||||
for i = 1, #(group_cons_id) do
|
||||
SYS.exec(string.format('curl -sL -m 3 --retry 2 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -X DELETE http://%s:%s/connections/%s >/dev/null 2>&1 &', passwd, ip, port, group_cons_id[i]))
|
||||
SYS.exec(string.format('curl -sL -m 5 --retry 2 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -X DELETE http://%s:%s/connections/%s >/dev/null 2>&1 &', passwd, ip, port, group_cons_id[i]))
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1005,7 +1005,7 @@ function netflix_unlock_test()
|
||||
local filmId = 70143836
|
||||
local url = "https://www.netflix.com/title/"..filmId
|
||||
local headers = "User-Agent: "..UA
|
||||
local info = SYS.exec(string.format('curl -sLI --connect-timeout 5 -m 10 --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 info = SYS.exec(string.format('curl -sLI --connect-timeout 5 -m 5 --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 region
|
||||
local old_region = ""
|
||||
@ -1052,7 +1052,7 @@ function disney_unlock_test()
|
||||
local regex = UCI:get("openclash", "config", "stream_auto_select_region_key_disney") or ""
|
||||
local old_region = ""
|
||||
|
||||
preassertion = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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))
|
||||
preassertion = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
assertion = JSON.parse(preassertion).assertion
|
||||
@ -1061,7 +1061,7 @@ function disney_unlock_test()
|
||||
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"
|
||||
tokencontent = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 %s -H 'User-Agent: %s' -d '%s' -XPOST %s", auth, UA, disneycookie, url2))
|
||||
tokencontent = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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 JSON.parse(tokencontent).error_description then
|
||||
@ -1070,7 +1070,7 @@ function disney_unlock_test()
|
||||
end
|
||||
end
|
||||
|
||||
data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 %s -H 'User-Agent: %s' -d '%s' -XPOST %s", headers, UA, body, url3))
|
||||
data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
status = 1
|
||||
@ -1116,7 +1116,7 @@ end
|
||||
function hbo_now_unlock_test()
|
||||
status = 0
|
||||
local url = "https://play.hbonow.com/"
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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 data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
data = JSON.parse(data)
|
||||
end
|
||||
@ -1134,7 +1134,7 @@ end
|
||||
function hbo_max_unlock_test()
|
||||
status = 0
|
||||
local url = "https://www.hbomax.com/"
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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 data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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 region = ""
|
||||
local old_region = ""
|
||||
@ -1174,13 +1174,13 @@ end
|
||||
function hbo_go_asia_unlock_test()
|
||||
status = 0
|
||||
local url = "https://api2.hbogoasia.com/v1/geog?lang=undefined&version=0&bundleId=www.hbogoasia.com"
|
||||
local httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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 httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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 region = ""
|
||||
local old_region = ""
|
||||
if tonumber(httpcode) == 200 then
|
||||
status = 1
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --speed-time 5 --speed-limit 1 --retry 2 -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
|
||||
if data then
|
||||
data = JSON.parse(data)
|
||||
end
|
||||
@ -1213,14 +1213,14 @@ end
|
||||
function ytb_unlock_test()
|
||||
status = 0
|
||||
local url = "https://m.youtube.com/premium"
|
||||
local httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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 httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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 old_region = ""
|
||||
local data, he_data
|
||||
local regex = UCI:get("openclash", "config", "stream_auto_select_region_key_ytb") or ""
|
||||
if tonumber(httpcode) == 200 then
|
||||
status = 1
|
||||
data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' -b 'YSC=BiCUU3-5Gdk; CONSENT=YES+cb.20220301-11-p0.en+FX+700; GPS=1; VISITOR_INFO1_LIVE=4VwPMkB7W5A; PREF=tz=Asia.Shanghai; _gcl_au=1.1.1809531354.1646633279' %s", UA, url))
|
||||
data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' -b 'YSC=BiCUU3-5Gdk; CONSENT=YES+cb.20220301-11-p0.en+FX+700; GPS=1; VISITOR_INFO1_LIVE=4VwPMkB7W5A; PREF=tz=Asia.Shanghai; _gcl_au=1.1.1809531354.1646633279' %s", UA, url))
|
||||
if string.find(data,"www%.google%.cn") or string.find(data, "is not available in your country") then
|
||||
return
|
||||
end
|
||||
@ -1228,7 +1228,7 @@ function ytb_unlock_test()
|
||||
if region then
|
||||
status = 2
|
||||
else
|
||||
he_data = SYS.exec(string.format("curl -sIL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
|
||||
he_data = SYS.exec(string.format("curl -sIL --connect-timeout 5 -m 5 --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.sub(string.match(he_data, "gl=%a+"), 4, -1)
|
||||
if region then
|
||||
status = 2
|
||||
@ -1254,13 +1254,13 @@ end
|
||||
function tvb_anywhere_unlock_test()
|
||||
status = 0
|
||||
local url = "https://uapisfm.tvbanywhere.com.sg/geoip/check/platform/android"
|
||||
local httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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 httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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 old_region = ""
|
||||
local regex = UCI:get("openclash", "config", "stream_auto_select_region_key_tvb_anywhere") or ""
|
||||
if tonumber(httpcode) == 200 then
|
||||
status = 1
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
data = JSON.parse(data)
|
||||
end
|
||||
@ -1290,13 +1290,13 @@ end
|
||||
function prime_video_unlock_test()
|
||||
status = 0
|
||||
local url = "https://www.primevideo.com"
|
||||
local httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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 httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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 old_region = ""
|
||||
local regex = UCI:get("openclash", "config", "stream_auto_select_region_key_prime_video") or ""
|
||||
if tonumber(httpcode) == 200 then
|
||||
status = 1
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
region = string.sub(string.match(data, "\"currentTerritory\":\"%a+\""), 21, -2)
|
||||
if region then
|
||||
@ -1323,13 +1323,13 @@ function dazn_unlock_test()
|
||||
status = 0
|
||||
local url = "https://www.dazn.com"
|
||||
local url2 = "https://startup.core.indazn.com/misl/v5/Startup"
|
||||
local httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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 httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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 old_region = ""
|
||||
local regex = UCI:get("openclash", "config", "stream_auto_select_region_key_dazn") or ""
|
||||
if tonumber(httpcode) == 200 then
|
||||
status = 1
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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))
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
data = JSON.parse(data)
|
||||
end
|
||||
@ -1362,13 +1362,13 @@ function paramount_plus_unlock_test()
|
||||
local region
|
||||
local old_region = ""
|
||||
local regex = UCI:get("openclash", "config", "stream_auto_select_region_key_paramount_plus") or ""
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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))
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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)
|
||||
if data and tonumber(data.http_code) == 200 then
|
||||
status = 1
|
||||
if not string.find(data.url_effective, "intl") then
|
||||
status = 2
|
||||
data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' %s", UA, url))
|
||||
data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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))
|
||||
if region then
|
||||
if FS.isfile(string.format("/tmp/openclash_%s_region", type)) then
|
||||
@ -1395,12 +1395,12 @@ function discovery_plus_unlock_test()
|
||||
local region
|
||||
local old_region = ""
|
||||
local regex = UCI:get("openclash", "config", "stream_auto_select_region_key_discovery_plus") or ""
|
||||
local token = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' '%s'", UA, url))
|
||||
local token = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
status = 1
|
||||
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 data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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))
|
||||
local data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
region = string.upper(JSON.parse(data).data.attributes.currentLocationTerritory) or string.upper(JSON.parse(data).data.attributes.currentLocationSovereignTerritory)
|
||||
if region then
|
||||
@ -1438,9 +1438,9 @@ function bilibili_unlock_test()
|
||||
url = string.format("https://api.bilibili.com/pgc/player/web/playurl?avid=82846771&qn=0&type=&otype=json&ep_id=307247&fourk=1&fnver=0&fnval=16&session=%s&module=bangumi", randsession)
|
||||
region = "CN"
|
||||
end
|
||||
httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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))
|
||||
httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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))
|
||||
if httpcode and tonumber(httpcode) == 200 then
|
||||
data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --speed-time 5 --speed-limit 1 --retry 2 -H 'Accept-Language: en' -H 'Content-Type: application/json' -H 'User-Agent: %s' '%s'", UA, url))
|
||||
data = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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
|
||||
data = JSON.parse(data)
|
||||
status = 1
|
||||
@ -1467,7 +1467,7 @@ function google_not_cn_test()
|
||||
status = 0
|
||||
local url = "https://timeline.google.com"
|
||||
local region
|
||||
local httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 10 --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 httpcode = SYS.exec(string.format("curl -sL --connect-timeout 5 -m 5 --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))
|
||||
if httpcode then
|
||||
if tonumber(httpcode) == 200 then
|
||||
status = 2
|
||||
|
||||
@ -34,17 +34,17 @@ if [ -n "$OP_CV" ] && [ -n "$OP_LV" ] && [ "$(expr "$OP_LV" \> "$OP_CV")" -eq 1
|
||||
LOG_OUT "Start Downloading【OpenClash - v$LAST_VER】..."
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@package/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/package/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/package/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/package/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="/tmp/openclash.ipk" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl_status=${PIPESTATUS[0]}
|
||||
else
|
||||
curl_status=0
|
||||
|
||||
@ -11,18 +11,18 @@ LOG_FILE="/tmp/openclash.log"
|
||||
if [ "$TIME" != "$CHTIME" ]; then
|
||||
if [ "$github_address_mod" != "0" ]; then
|
||||
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"gh/vernesong/OpenClash@package/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.fastgit.org/vernesong/OpenClash/package/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 "$github_address_mod"https://raw.githubusercontent.com/vernesong/OpenClash/package/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://raw.githubusercontent.com/vernesong/OpenClash/package/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
fi
|
||||
|
||||
if [ "${PIPESTATUS[0]}" -ne 0 ] || [ -n "$(cat $LAST_OPVER |grep '<html>')" ]; then
|
||||
curl -SsL --connect-timeout 10 -m 30 --speed-time 15 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 https://ftp.jaist.ac.jp/pub/sourceforge.jp/storage/g/o/op/openclash/"$RELEASE_BRANCH"/version -o $LAST_OPVER 2>&1 | awk -v time="$(date "+%Y-%m-%d %H:%M:%S")" -v file="$LAST_OPVER" '{print time "【" file "】Download Failed:【"$0"】"}' >> "$LOG_FILE"
|
||||
curl_status=${PIPESTATUS[0]}
|
||||
else
|
||||
curl_status=0
|
||||
|
||||
@ -31,7 +31,7 @@ STREAM_AUTO_SELECT=1
|
||||
FW4=$(command -v fw4)
|
||||
|
||||
check_dnsmasq() {
|
||||
if [ -z "$(echo "$en_mode" |grep "redir-host")" ] && [ "$china_ip_route" -eq 1 ] && [ "$enable_redirect_dns" = "1" ]; then
|
||||
if [ -z "$(echo "$en_mode" |grep "redir-host")" ] && [ "$china_ip_route" -eq 1 ] && [ "$enable_redirect_dns" != "2" ]; then
|
||||
if [ "$(nslookup www.baidu.com 127.0.0.1:12353 >/dev/null 2>&1 || echo $?)" != "1" ]; then
|
||||
DNSPORT=$(uci -q get dhcp.@dnsmasq[0].port)
|
||||
if [ -z "$DNSPORT" ]; then
|
||||
|
||||
@ -30,7 +30,7 @@ local Value RUBY_YAML_PARSE
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
return
|
||||
fi
|
||||
RUBY_YAML_PARSE="Thread.new{Value = YAML.load_file('$1'); Value$2; File.open('$1','w') {|f| YAML.dump(Value, f)}}.join"
|
||||
RUBY_YAML_PARSE="Thread.new{Value = YAML.load_file('$1'); Value$2=$3; File.open('$1','w') {|f| YAML.dump(Value, f)}}.join"
|
||||
ruby -ryaml -rYAML -I "/usr/share/openclash" -E UTF-8 -e "$RUBY_YAML_PARSE" 2>/dev/null
|
||||
}
|
||||
|
||||
|
||||
@ -5,10 +5,12 @@
|
||||
|
||||
LOG_FILE="/tmp/openclash.log"
|
||||
LOGTIME=$(echo $(date "+%Y-%m-%d %H:%M:%S"))
|
||||
dns_advanced_setting=$(uci -q get openclash.config.dns_advanced_setting)
|
||||
custom_fakeip_filter=$(uci -q get openclash.config.custom_fakeip_filter)
|
||||
custom_name_policy=$(uci -q get openclash.config.custom_name_policy)
|
||||
custom_host=$(uci -q get openclash.config.custom_host)
|
||||
core_type=$(uci -q get openclash.config.core_type)
|
||||
enable_custom_dns=$(uci -q get openclash.config.enable_custom_dns)
|
||||
append_wan_dns=$(uci -q get openclash.config.append_wan_dns || echo 1)
|
||||
append_wan_dns=$(uci -q get openclash.config.append_wan_dns || echo 0)
|
||||
tolerance=$(uci -q get openclash.config.tolerance || echo 0)
|
||||
custom_fallback_filter=$(uci -q get openclash.config.custom_fallback_filter || echo 0)
|
||||
enable_meta_core=$(uci -q get openclash.config.enable_meta_core || echo 0)
|
||||
@ -36,18 +38,6 @@ else
|
||||
stack_type=${12}
|
||||
fi
|
||||
|
||||
if [ "${21}" != "1" ]; then
|
||||
enable_geoip_dat="false"
|
||||
else
|
||||
enable_geoip_dat="true"
|
||||
fi
|
||||
|
||||
if [ "${25}" != "1" ]; then
|
||||
enable_tcp_concurrent="false"
|
||||
else
|
||||
enable_tcp_concurrent="true"
|
||||
fi
|
||||
|
||||
if [ "$(ruby_read "$5" "['external-controller']")" != "$controller_address:$3" ]; then
|
||||
uci -q set openclash.config.config_reload=0
|
||||
fi
|
||||
@ -358,7 +348,9 @@ Thread.new{
|
||||
Value['socks-port']=$8;
|
||||
Value['mixed-port']=${14};
|
||||
Value['mode']='$rule_mode';
|
||||
Value['log-level']='$9';
|
||||
if '$9' != '0' then
|
||||
Value['log-level']='$9';
|
||||
end;
|
||||
Value['allow-lan']=true;
|
||||
Value['external-controller']='0.0.0.0:$3';
|
||||
Value['secret']='$2';
|
||||
@ -371,31 +363,23 @@ Thread.new{
|
||||
end;
|
||||
if '${24}' != '0' then
|
||||
Value['interface-name']='${24}';
|
||||
else
|
||||
Value.delete('interface-name');
|
||||
end;
|
||||
if ${19} == 1 then
|
||||
Value['geodata-mode']=$enable_geoip_dat;
|
||||
Value['geodata-loader']='${22}';
|
||||
Value['tcp-concurrent']=$enable_tcp_concurrent;
|
||||
Value['find-process-mode']='${29}';
|
||||
Value['global-client-fingerprint']='${31}';
|
||||
else
|
||||
if Value.key?('geodata-mode') then
|
||||
Value.delete('geodata-mode');
|
||||
if '${21}' != '0' then
|
||||
Value['geodata-mode']=true;
|
||||
end;
|
||||
if Value.key?('geodata-loader') then
|
||||
Value.delete('geodata-loader');
|
||||
if '${22}' != '0' then
|
||||
Value['geodata-loader']='${22}';
|
||||
end;
|
||||
if '${25}' != '0' then
|
||||
Value['tcp-concurrent']=true;
|
||||
end;
|
||||
if '${29}' != '0' then
|
||||
Value['find-process-mode']='${29}';
|
||||
end;
|
||||
if '${31}' != '0' then
|
||||
Value['global-client-fingerprint']='${31}';
|
||||
end;
|
||||
if Value.key?('tcp-concurrent') then
|
||||
Value.delete('tcp-concurrent');
|
||||
end
|
||||
if Value.key?('find-process-mode') then
|
||||
Value.delete('find-process-mode');
|
||||
end
|
||||
if Value.key?('global-client-fingerprint') then
|
||||
Value.delete('global-client-fingerprint');
|
||||
end
|
||||
end;
|
||||
if not Value.key?('dns') then
|
||||
Value_1={'dns'=>{'enable'=>true}};
|
||||
@ -406,7 +390,7 @@ Thread.new{
|
||||
if ${16} == 1 then
|
||||
Value['dns']['ipv6']=true;
|
||||
#meta core v6 DNS
|
||||
if ${19} != 1 then
|
||||
if ${19} == 1 then
|
||||
Value['ipv6']=true;
|
||||
end;
|
||||
else
|
||||
@ -430,13 +414,9 @@ Thread.new{
|
||||
Value['sniffer']=Value_sniffer['sniffer'];
|
||||
if '$1' == 'redir-host' then
|
||||
Value['sniffer']['force-dns-mapping']=true;
|
||||
else
|
||||
Value['sniffer']['force-dns-mapping']=false;
|
||||
end;
|
||||
if ${28} == 1 then
|
||||
Value['sniffer']['parse-pure-ip']=true;
|
||||
else
|
||||
Value['sniffer']['parse-pure-ip']=false;
|
||||
end;
|
||||
if File::exist?('/etc/openclash/custom/openclash_force_sniffing_domain.yaml') then
|
||||
if ${23} == 1 then
|
||||
@ -445,11 +425,6 @@ Thread.new{
|
||||
Value['sniffer']['force-domain']=Value_7['force-domain'];
|
||||
Value['sniffer']['force-domain']=Value['sniffer']['force-domain'].uniq;
|
||||
end;
|
||||
else
|
||||
if not Value['sniffer'].key?('force-domain') then
|
||||
Value_force_domain={'force-domain'=>['+.netflix.com', '+.nflxvideo.net', '+.amazonaws.com', '+.media.dssott.com']};
|
||||
Value['sniffer'].merge!(Value_force_domain);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if File::exist?('/etc/openclash/custom/openclash_sniffing_domain_filter.yaml') then
|
||||
@ -463,11 +438,6 @@ Thread.new{
|
||||
Value['sniffer']['skip-domain']=Value_7['skip-domain'];
|
||||
Value['sniffer']['skip-domain']=Value['sniffer']['skip-domain'].uniq;
|
||||
end;
|
||||
else
|
||||
if not Value['sniffer'].key?('skip-domain') then
|
||||
Value_skip_domain={'skip-domain'=>['+.apple.com', 'Mijia Cloud', '+.jd.com']};
|
||||
Value['sniffer'].merge!(Value_skip_domain);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if File::exist?('/etc/openclash/custom/openclash_sniffing_ports_filter.yaml') then
|
||||
@ -476,11 +446,6 @@ Thread.new{
|
||||
if Value_7 != false and not Value_7['sniff'].to_a.empty? then
|
||||
Value['sniffer']['sniff']=Value_7['sniff'];
|
||||
end;
|
||||
else
|
||||
if not Value['sniffer'].key?('sniff') then
|
||||
Value_sniff={'sniff'=>{'TLS'=>nil, 'HTTP'=>{'ports'=>[80, '8080-8880'], 'override-destination'=>true}}};
|
||||
Value['sniffer'].merge!(Value_sniff);
|
||||
end;
|
||||
end;
|
||||
else
|
||||
if File::exist?('/etc/openclash/custom/openclash_sniffing_port_filter.yaml') and ${23} == 1 then
|
||||
@ -494,9 +459,6 @@ Thread.new{
|
||||
Value['sniffer'].merge!(Value_sniffer);
|
||||
end;
|
||||
else
|
||||
if Value.key?('sniffer') then
|
||||
Value.delete('sniffer');
|
||||
end;
|
||||
if '${26}' == 'TUN' then
|
||||
Value_tun_sniff={'experimental'=>{'sniff-tls-sni'=>true}};
|
||||
Value['experimental'] = Value_tun_sniff['experimental'];
|
||||
@ -512,7 +474,6 @@ Thread.new{
|
||||
Value['tun']['stack']='$stack_type';
|
||||
if ${19} == 1 then
|
||||
Value['tun']['device']='utun';
|
||||
Value['tun']['mtu']=65535;
|
||||
end;
|
||||
Value_2={'dns-hijack'=>['tcp://any:53']};
|
||||
Value['tun']['auto-route']=false;
|
||||
@ -532,9 +493,7 @@ Thread.new{
|
||||
else
|
||||
Value['profile']['store-selected']=true;
|
||||
end;
|
||||
if ${17} != 1 then
|
||||
Value['profile']['store-fake-ip']=false;
|
||||
else
|
||||
if ${17} == 1 then
|
||||
Value['profile']['store-fake-ip']=true;
|
||||
end;
|
||||
if Value.key?('ebpf') then
|
||||
@ -663,7 +622,7 @@ end;
|
||||
#nameserver-policy
|
||||
begin
|
||||
Thread.new{
|
||||
if '$dns_advanced_setting' == '1' then
|
||||
if '$custom_name_policy' == '1' then
|
||||
if File::exist?('/etc/openclash/custom/openclash_custom_domain_dns_policy.list') then
|
||||
Value_6 = YAML.load_file('/etc/openclash/custom/openclash_custom_domain_dns_policy.list');
|
||||
if Value_6 != false and not Value_6.nil? then
|
||||
@ -684,29 +643,33 @@ end;
|
||||
#fake-ip-filter
|
||||
begin
|
||||
Thread.new{
|
||||
if '$custom_fakeip_filter' == '1' then
|
||||
if '$1' == 'fake-ip' then
|
||||
if File::exist?('/etc/openclash/custom/openclash_custom_fake_filter.list') then
|
||||
Value_4 = IO.readlines('/etc/openclash/custom/openclash_custom_fake_filter.list');
|
||||
if not Value_4.empty? then
|
||||
Value_4 = Value_4.map!{|x| x.gsub(/#.*$/,'').strip} - ['', nil];
|
||||
if Value['dns'].has_key?('fake-ip-filter') and not Value['dns']['fake-ip-filter'].to_a.empty? then
|
||||
Value['dns']['fake-ip-filter'] = Value['dns']['fake-ip-filter'] | Value_4;
|
||||
else
|
||||
Value['dns']['fake-ip-filter'] = Value_4;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if File::exist?('/tmp/openclash_fake_filter_include') then
|
||||
Value_4 = IO.readlines('/tmp/openclash_fake_filter_include');
|
||||
if not Value_4.empty? then
|
||||
Value_4 = Value_4.map!{|x| x.gsub(/#.*$/,'').strip} - ['', nil];
|
||||
if Value['dns'].has_key?('fake-ip-filter') and not Value['dns']['fake-ip-filter'].to_a.empty? then
|
||||
Value['dns']['fake-ip-filter'] = Value['dns']['fake-ip-filter'] | Value_4;
|
||||
else
|
||||
Value['dns']['fake-ip-filter'] = Value_4;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if '$1' == 'fake-ip' then
|
||||
if File::exist?('/etc/openclash/custom/openclash_custom_fake_filter.list') then
|
||||
Value_4 = IO.readlines('/etc/openclash/custom/openclash_custom_fake_filter.list');
|
||||
if not Value_4.empty? then
|
||||
Value_4 = Value_4.map!{|x| x.gsub(/#.*$/,'').strip} - ['', nil];
|
||||
if Value['dns'].has_key?('fake-ip-filter') and not Value['dns']['fake-ip-filter'].to_a.empty? then
|
||||
Value['dns']['fake-ip-filter'] = Value['dns']['fake-ip-filter'] | Value_4;
|
||||
else
|
||||
Value['dns']['fake-ip-filter'] = Value_4;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if File::exist?('/tmp/openclash_fake_filter_include') then
|
||||
Value_4 = IO.readlines('/tmp/openclash_fake_filter_include');
|
||||
if not Value_4.empty? then
|
||||
Value_4 = Value_4.map!{|x| x.gsub(/#.*$/,'').strip} - ['', nil];
|
||||
if Value['dns'].has_key?('fake-ip-filter') and not Value['dns']['fake-ip-filter'].to_a.empty? then
|
||||
Value['dns']['fake-ip-filter'] = Value['dns']['fake-ip-filter'] | Value_4;
|
||||
else
|
||||
Value['dns']['fake-ip-filter'] = Value_4;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if ${18} == 1 then
|
||||
if Value['dns'].has_key?('fake-ip-filter') and not Value['dns']['fake-ip-filter'].to_a.empty? then
|
||||
Value['dns']['fake-ip-filter'].insert(-1,'+.nflxvideo.net');
|
||||
@ -740,31 +703,33 @@ end;
|
||||
#custom hosts
|
||||
begin
|
||||
Thread.new{
|
||||
if File::exist?('/etc/openclash/custom/openclash_custom_hosts.list') then
|
||||
begin
|
||||
Value_3 = YAML.load_file('/etc/openclash/custom/openclash_custom_hosts.list');
|
||||
if Value_3 != false and not Value_3.nil? then
|
||||
Value['dns']['use-hosts']=true;
|
||||
if Value.has_key?('hosts') and not Value['hosts'].to_a.empty? then
|
||||
Value['hosts'].merge!(Value_3);
|
||||
else
|
||||
Value['hosts']=Value_3;
|
||||
if '$custom_host' == '1' then
|
||||
if File::exist?('/etc/openclash/custom/openclash_custom_hosts.list') then
|
||||
begin
|
||||
Value_3 = YAML.load_file('/etc/openclash/custom/openclash_custom_hosts.list');
|
||||
if Value_3 != false and not Value_3.nil? then
|
||||
Value['dns']['use-hosts']=true;
|
||||
if Value.has_key?('hosts') and not Value['hosts'].to_a.empty? then
|
||||
Value['hosts'].merge!(Value_3);
|
||||
else
|
||||
Value['hosts']=Value_3;
|
||||
end;
|
||||
Value['hosts'].uniq;
|
||||
puts '${LOGTIME} Warning: You May Need to Turn off The Rebinding Protection Option of Dnsmasq When Hosts Has Set a Reserved Address';
|
||||
end;
|
||||
Value['hosts'].uniq;
|
||||
puts '${LOGTIME} Warning: You May Need to Turn off The Rebinding Protection Option of Dnsmasq When Hosts Has Set a Reserved Address';
|
||||
end;
|
||||
rescue
|
||||
Value_3 = IO.readlines('/etc/openclash/custom/openclash_custom_hosts.list');
|
||||
if not Value_3.empty? then
|
||||
Value_3 = Value_3.map!{|x| x.gsub(/#.*$/,'').strip} - ['', nil];
|
||||
Value['dns']['use-hosts']=true;
|
||||
if Value.has_key?('hosts') and not Value['hosts'].to_a.empty? then
|
||||
Value_3.each{|x| Value['hosts'].merge!(x)};
|
||||
else
|
||||
Value_3.each{|x| Value['hosts'].merge!(x)};
|
||||
rescue
|
||||
Value_3 = IO.readlines('/etc/openclash/custom/openclash_custom_hosts.list');
|
||||
if not Value_3.empty? then
|
||||
Value_3 = Value_3.map!{|x| x.gsub(/#.*$/,'').strip} - ['', nil];
|
||||
Value['dns']['use-hosts']=true;
|
||||
if Value.has_key?('hosts') and not Value['hosts'].to_a.empty? then
|
||||
Value_3.each{|x| Value['hosts'].merge!(x)};
|
||||
else
|
||||
Value_3.each{|x| Value['hosts'].merge!(x)};
|
||||
end;
|
||||
Value['hosts'].uniq;
|
||||
puts '${LOGTIME} Warning: You May Need to Turn off The Rebinding Protection Option of Dnsmasq When Hosts Has Set a Reserved Address';
|
||||
end;
|
||||
Value['hosts'].uniq;
|
||||
puts '${LOGTIME} Warning: You May Need to Turn off The Rebinding Protection Option of Dnsmasq When Hosts Has Set a Reserved Address';
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -462,6 +462,14 @@ do
|
||||
end
|
||||
}.join
|
||||
|
||||
Thread.new{
|
||||
#TFO
|
||||
if Value['proxies'][$count].key?('tfo') then
|
||||
tfo = '${uci_set}tfo=' + Value['proxies'][$count]['tfo'].to_s
|
||||
system(tfo)
|
||||
end
|
||||
}.join
|
||||
|
||||
if '$server_type' == 'ss' then
|
||||
Thread.new{
|
||||
#cipher
|
||||
@ -470,6 +478,14 @@ do
|
||||
system(cipher)
|
||||
end
|
||||
}.join
|
||||
|
||||
Thread.new{
|
||||
#udp-over-tcp
|
||||
if Value['proxies'][$count].key?('udp-over-tcp') then
|
||||
udp_over_tcp = '${uci_set}udp_over_tcp=' + Value['proxies'][$count]['udp-over-tcp'].to_s
|
||||
system(udp_over_tcp)
|
||||
end
|
||||
}.join
|
||||
|
||||
Thread.new{
|
||||
#plugin-opts
|
||||
|
||||
@ -281,7 +281,8 @@ yml_servers_set()
|
||||
config_get "packet_addr" "$section" "packet_addr" ""
|
||||
config_get "client_fingerprint" "$section" "client_fingerprint" ""
|
||||
config_get "ip_version" "$section" "ip_version" ""
|
||||
|
||||
config_get "tfo" "$section" "tfo" ""
|
||||
config_get "udp_over_tcp" "$section" "udp_over_tcp" ""
|
||||
|
||||
if [ "$enabled" = "0" ]; then
|
||||
return
|
||||
@ -399,6 +400,11 @@ EOF
|
||||
if [ ! -z "$udp" ]; then
|
||||
cat >> "$SERVER_FILE" <<-EOF
|
||||
udp: $udp
|
||||
EOF
|
||||
fi
|
||||
if [ ! -z "$udp_over_tcp" ]; then
|
||||
cat >> "$SERVER_FILE" <<-EOF
|
||||
udp-over-tcp: $udp_over_tcp
|
||||
EOF
|
||||
fi
|
||||
if [ ! -z "$obfss" ]; then
|
||||
@ -1133,18 +1139,25 @@ cat >> "$SERVER_FILE" <<-EOF
|
||||
ip-version: "$ip_version"
|
||||
EOF
|
||||
fi
|
||||
|
||||
|
||||
#TFO
|
||||
if [ ! -z "$tfo" ]; then
|
||||
cat >> "$SERVER_FILE" <<-EOF
|
||||
tfo: $tfo
|
||||
EOF
|
||||
fi
|
||||
|
||||
#interface-name
|
||||
if [ -n "$interface_name" ]; then
|
||||
cat >> "$SERVER_FILE" <<-EOF
|
||||
interface-name: $interface_name
|
||||
interface-name: "$interface_name"
|
||||
EOF
|
||||
fi
|
||||
|
||||
#routing_mark
|
||||
if [ -n "$routing_mark" ]; then
|
||||
cat >> "$SERVER_FILE" <<-EOF
|
||||
routing-mark: $routing_mark
|
||||
routing-mark: "$routing_mark"
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
@ -1735,7 +1748,7 @@ ${uci_set}HBOMax="HBO Max"
|
||||
${uci_set}HBOGo="HBO Go"
|
||||
${uci_set}Pornhub="Pornhub"
|
||||
${uci_set}Apple="Apple"
|
||||
${uci_set}Apple_TV="Apple_TV"
|
||||
${uci_set}AppleTV="Apple TV"
|
||||
${uci_set}GoogleFCM="Google FCM"
|
||||
${uci_set}Scholar="Scholar"
|
||||
${uci_set}Microsoft="Microsoft"
|
||||
@ -1772,7 +1785,7 @@ ${uci_set}Others="Others"
|
||||
${UCI_DEL_LIST}="Discovery Plus" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Discovery Plus" >/dev/null 2>&1
|
||||
${UCI_DEL_LIST}="DAZN" >/dev/null 2>&1 && ${UCI_ADD_LIST}="DAZN" >/dev/null 2>&1
|
||||
${UCI_DEL_LIST}="ChatGPT" >/dev/null 2>&1 && ${UCI_ADD_LIST}="ChatGPT" >/dev/null 2>&1
|
||||
${UCI_DEL_LIST}="Apple_TV" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Apple_TV" >/dev/null 2>&1
|
||||
${UCI_DEL_LIST}="Apple TV" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Apple TV" >/dev/null 2>&1
|
||||
${UCI_DEL_LIST}="Google FCM" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Google FCM" >/dev/null 2>&1
|
||||
${UCI_DEL_LIST}="Scholar" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Scholar" >/dev/null 2>&1
|
||||
${UCI_DEL_LIST}="Disney" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Disney" >/dev/null 2>&1
|
||||
|
||||
@ -888,7 +888,7 @@ yml_other_rules_get()
|
||||
config_get "Discovery" "$section" "Discovery" "$GlobalTV"
|
||||
config_get "DAZN" "$section" "DAZN" "$GlobalTV"
|
||||
config_get "ChatGPT" "$section" "ChatGPT" "$Proxy"
|
||||
config_get "Apple_TV" "$section" "Apple_TV" "$GlobalTV"
|
||||
config_get "AppleTV" "$section" "AppleTV" "$GlobalTV"
|
||||
}
|
||||
|
||||
if [ "$1" != "0" ]; then
|
||||
@ -931,7 +931,7 @@ if [ "$1" != "0" ]; then
|
||||
|| [ -z "$(grep -F "$HBOGo" /tmp/Proxy_Group)" ]\
|
||||
|| [ -z "$(grep -F "$Pornhub" /tmp/Proxy_Group)" ]\
|
||||
|| [ -z "$(grep -F "$Apple" /tmp/Proxy_Group)" ]\
|
||||
|| [ -z "$(grep -F "$Apple_TV" /tmp/Proxy_Group)" ]\
|
||||
|| [ -z "$(grep -F "$AppleTV" /tmp/Proxy_Group)" ]\
|
||||
|| [ -z "$(grep -F "$Scholar" /tmp/Proxy_Group)" ]\
|
||||
|| [ -z "$(grep -F "$Netflix" /tmp/Proxy_Group)" ]\
|
||||
|| [ -z "$(grep -F "$Disney" /tmp/Proxy_Group)" ]\
|
||||
@ -993,7 +993,7 @@ if [ "$1" != "0" ]; then
|
||||
.gsub(/,Proxy$/, ',$Proxy#delete_')
|
||||
.gsub(/,YouTube$/, ',$Youtube#delete_')
|
||||
.gsub(/,Apple$/, ',$Apple#delete_')
|
||||
.gsub(/,Apple TV$/, ',$Apple_TV#delete_')
|
||||
.gsub(/,Apple TV$/, ',$AppleTV#delete_')
|
||||
.gsub(/,Scholar$/, ',$Scholar#delete_')
|
||||
.gsub(/,Netflix$/, ',$Netflix#delete_')
|
||||
.gsub(/,Disney$/, ',$Disney#delete_')
|
||||
@ -1024,7 +1024,7 @@ if [ "$1" != "0" ]; then
|
||||
.gsub!(/: \"Proxy\"/,': \"$Proxy#delete_\"')
|
||||
.gsub!(/: \"YouTube\"/,': \"$Youtube#delete_\"')
|
||||
.gsub!(/: \"Apple\"/,': \"$Apple#delete_\"')
|
||||
.gsub!(/: \"Apple TV\"/,': \"$Apple_TV#delete_\"')
|
||||
.gsub!(/: \"Apple TV\"/,': \"$AppleTV#delete_\"')
|
||||
.gsub!(/: \"Scholar\"/,': \"$Scholar#delete_\"')
|
||||
.gsub!(/: \"Netflix\"/,': \"$Netflix#delete_\"')
|
||||
.gsub!(/: \"Disney\"/,': \"$Disney#delete_\"')
|
||||
|
||||
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" fill="#000000" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><polyline points="176.2 99.7 224.2 99.7 224.2 51.7" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></polyline><path d="M190.2,190.2a88,88,0,1,1,0-124.4l34,33.9" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></path></svg>
|
||||
|
After Width: | Height: | Size: 467 B |
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" fill="#000000" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><path d="M128,56C48,56,16,128,16,128s32,72,112,72,112-72,112-72S208,56,128,56Z" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></path><circle cx="128" cy="128" r="40" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></circle></svg>
|
||||
|
After Width: | Height: | Size: 475 B |
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" fill="#000000" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><line x1="48" y1="40" x2="208" y2="216" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></line><path d="M154.9,157.6A39.6,39.6,0,0,1,128,168a40,40,0,0,1-26.9-69.6" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></path><path d="M74,68.6C33.2,89.2,16,128,16,128s32,72,112,72a117.9,117.9,0,0,0,54-12.6" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></path><path d="M208.6,169.1C230.4,149.6,240,128,240,128S208,56,128,56a123.9,123.9,0,0,0-20.7,1.7" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></path><path d="M135.5,88.7a39.9,39.9,0,0,1,32.3,35.5" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></path></svg>
|
||||
|
After Width: | Height: | Size: 994 B |
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="186" height="20" role="img" aria-label="Current Version: v0.45.87-beta"><title>Current Version: v0.45.87-beta</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="186" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="97" height="20" fill="#555"/><rect x="97" width="89" height="20" fill="#007ec6"/><rect width="186" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="870">Current Version</text><text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="870">Current Version</text><text aria-hidden="true" x="1405" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="790">v0.45.87-beta</text><text x="1405" y="140" transform="scale(.1)" fill="#fff" textLength="790">v0.45.87-beta</text></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="186" height="20" role="img" aria-label="Current Version: v0.45.91-beta"><title>Current Version: v0.45.91-beta</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="186" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="97" height="20" fill="#555"/><rect x="97" width="89" height="20" fill="#007ec6"/><rect width="186" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="870">Current Version</text><text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="870">Current Version</text><text aria-hidden="true" x="1405" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="790">v0.45.91-beta</text><text x="1405" y="140" transform="scale(.1)" fill="#fff" textLength="790">v0.00.00-beta</text></g></svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" fill="#000000" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><path d="M218.9,71a63.9,63.9,0,0,1-89.8,81h0L73,217a24,24,0,0,1-34-34l65-56.1h0a63.9,63.9,0,0,1,81-89.8L143,79l5.7,28.3L177,113Z" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="12"></path></svg>
|
||||
|
After Width: | Height: | Size: 389 B |
Reference in New Issue
Block a user