luci-app-clash: update
@ -1,14 +1,39 @@
|
||||
#
|
||||
# Copyright (C) 2015-2016 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v3.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=clash
|
||||
PKG_VERSION:=0.14.0
|
||||
PKG_VERSION:=0.15.0
|
||||
PKG_RELEASE:=1
|
||||
PKG_MAINTAINER:=frainzy1477
|
||||
|
||||
ifeq ($(ARCH),mipsel)
|
||||
PKG_ARCH:=mipsle
|
||||
endif
|
||||
ifeq ($(ARCH),mips)
|
||||
PKG_ARCH:=mips64
|
||||
endif
|
||||
ifeq ($(ARCH),i386)
|
||||
PKG_ARCH:=386
|
||||
endif
|
||||
ifeq ($(ARCH),x86_64)
|
||||
PKG_ARCH:=amd64
|
||||
endif
|
||||
ifeq ($(ARCH),arm)
|
||||
PKG_ARCH:=armv6
|
||||
ifneq ($(BOARD),bcm53xx)
|
||||
PKG_ARCH:=armv7
|
||||
endif
|
||||
ifeq ($(BOARD),kirkwood)
|
||||
PKG_ARCH:=armv5
|
||||
endif
|
||||
endif
|
||||
ifeq ($(ARCH),aarch64)
|
||||
PKG_ARCH:=armv8
|
||||
endif
|
||||
|
||||
PKG_SOURCE:=clash-linux-$(PKG_ARCH)-v$(PKG_VERSION).gz
|
||||
PKG_SOURCE_URL:=https://github.com/Dreamacro/clash/releases/download/v$(PKG_VERSION)/
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_HASH:=skip
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@ -21,48 +46,20 @@ define Package/$(PKG_NAME)
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/description
|
||||
clash is a cross-platform proxy software
|
||||
clash is a cross-platform proxy software
|
||||
endef
|
||||
|
||||
ifeq ($(ARCH),x86_64)
|
||||
PKG_ARCH_CLASH:=linux-amd64
|
||||
endif
|
||||
ifeq ($(ARCH),i386)
|
||||
PKG_ARCH_CLASH:=linux-386
|
||||
endif
|
||||
ifeq ($(ARCH),mipsel)
|
||||
PKG_ARCH_CLASH:=linux-mipsle
|
||||
endif
|
||||
ifeq ($(ARCH),mips)
|
||||
PKG_ARCH_CLASH:=linux-mips-hardfloat
|
||||
endif
|
||||
ifeq ($(ARCH),arm)
|
||||
PKG_ARCH_CLASH:=linux-armv6
|
||||
endif
|
||||
ifeq ($(ARCH),aarch64)
|
||||
PKG_ARCH_CLASH:=linux-armv8
|
||||
endif
|
||||
|
||||
define Build/Prepare
|
||||
#[ ! -f $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH).tar.gz ] && wget https://github.com/Dreamacro/clash/releases/download/v$(PKG_VERSION)/clash-$(PKG_ARCH_CLASH).tar.gz -O $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH).tar.gz
|
||||
#tar -xzvf $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH).tar.gz -C $(PKG_BUILD_DIR)
|
||||
[ ! -f $(PKG_BUILD_DIR)/clash-$(PKG_ARCH_CLASH).gz ] && wget https://github.com/Dreamacro/clash/releases/download/v$(PKG_VERSION)/clash-$(PKG_ARCH_CLASH)-v$(PKG_VERSION).gz -O $(PKG_BUILD_DIR)/clash-$(PKG_ARCH_CLASH).gz
|
||||
gunzip $(PKG_BUILD_DIR)/clash-$(PKG_ARCH_CLASH).gz
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
gzip -dc "$(DL_DIR)/$(PKG_SOURCE)" > $(PKG_BUILD_DIR)/clash-linux-$(PKG_ARCH)
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
#chmod +x $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH) && upx --ultra-brute $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH)
|
||||
#echo "$(PKG_VERSION)" > $(PKG_BUILD_DIR)/clash_version
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/etc/clash
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/clash-$(PKG_ARCH_CLASH) $(1)/etc/clash/clash
|
||||
#$(INSTALL_DIR) $(1)/usr/share/clash
|
||||
#$(INSTALL_DATA) $(PKG_BUILD_DIR)/clash_version $(1)/usr/share/clash/clash_version
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/clash-linux-$(PKG_ARCH) $(1)/etc/clash/clash
|
||||
endef
|
||||
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
|
||||
96
package/jsda/luci-app-clash/Makefile
Executable file → Normal file
@ -1,14 +1,90 @@
|
||||
# Copyright (C) 2016 Openwrt.org
|
||||
#
|
||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_TITLE:=LuCI Support for clash
|
||||
LUCI_DEPENDS:=+clash +pdnsd-alt
|
||||
PKG_VERSION:=0.14.2
|
||||
PKG_NAME:=luci-app-clash
|
||||
PKG_VERSION:=0.30.0
|
||||
PKG_RELEASE:=1
|
||||
PKG_MAINTAINER:=frainzy1477
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/luci-app-clash
|
||||
SECTION:=luci
|
||||
CATEGORY:=LuCI
|
||||
SUBMENU:=2. Services
|
||||
TITLE:=LuCI app for clash
|
||||
DEPENDS:=+bash +coreutils-nohup +wget
|
||||
PKGARCH:=all
|
||||
MAINTAINER:=frainzy1477
|
||||
endef
|
||||
|
||||
define Package/luci-app-clash/description
|
||||
LuCI configuration for clash.
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/postinst
|
||||
#!/bin/sh
|
||||
rm -rf /tmp/luci*
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
${CURDIR}/tools/po2lmo/src/po2lmo ${CURDIR}/po/zh-cn/clash.po ${CURDIR}/po/zh-cn/clash.zh-cn.lmo
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/clash
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/clash
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n
|
||||
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/clash
|
||||
|
||||
$(INSTALL_DIR) $(1)/www
|
||||
|
||||
$(INSTALL_DIR) $(1)/usr/share/clash
|
||||
$(INSTALL_DIR) $(1)/usr/share/clash/web
|
||||
$(INSTALL_DIR) $(1)/usr/share/clash/dashboard
|
||||
$(INSTALL_DIR) $(1)/usr/share/clash/dashboard/img
|
||||
$(INSTALL_DIR) $(1)/usr/share/clash/dashboard/js
|
||||
|
||||
$(INSTALL_BIN) ./root/etc/init.d/clash $(1)/etc/init.d/clash
|
||||
$(INSTALL_CONF) ./root/etc/config/clash $(1)/etc/config/clash
|
||||
$(INSTALL_CONF) ./root/etc/clash/* $(1)/etc/clash/
|
||||
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/clash-watchdog.sh $(1)/usr/share/clash/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/clash.sh $(1)/usr/share/clash/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/ipdb.sh $(1)/usr/share/clash/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/dns.yaml $(1)/usr/share/clash/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/rule.yaml $(1)/usr/share/clash/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/clash_version $(1)/usr/share/clash/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/check_version.sh $(1)/usr/share/clash/
|
||||
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/web/* $(1)/usr/share/clash/web
|
||||
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/index.html $(1)/usr/share/clash/dashboard/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/main.d32d2df9dcc55f57282d.css $(1)/usr/share/clash/dashboard/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/img/33343e6117c37aaef8886179007ba6b5.png $(1)/usr/share/clash/dashboard/img/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/img/logo.png $(1)/www/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/1.bundle.d32d2df9dcc55f57282d.min.js $(1)/usr/share/clash/dashboard/js/
|
||||
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/bundle.d32d2df9dcc55f57282d.min.js $(1)/usr/share/clash/dashboard/js/
|
||||
|
||||
$(INSTALL_DATA) ./luasrc/controller/*.lua $(1)/usr/lib/lua/luci/controller/
|
||||
|
||||
$(INSTALL_DATA) ./luasrc/model/cbi/clash/*.lua $(1)/usr/lib/lua/luci/model/cbi/clash/
|
||||
|
||||
$(INSTALL_DATA) ./luasrc/view/clash/* $(1)/usr/lib/lua/luci/view/clash/
|
||||
|
||||
$(INSTALL_DATA) ./po/zh-cn/clash.zh-cn.lmo $(1)/usr/lib/lua/luci/i18n/
|
||||
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,luci-app-clash))
|
||||
|
||||
58
package/jsda/luci-app-clash/luasrc/controller/clash.lua
Executable file → Normal file
@ -1,21 +1,32 @@
|
||||
module("luci.controller.clash", package.seeall)
|
||||
|
||||
function index()
|
||||
|
||||
if not nixio.fs.access("/etc/config/clash") then
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
entry({"admin", "services", "clash"},alias("admin", "services", "clash", "client"), _("Clash"), 60).dependent = true
|
||||
entry({"admin", "services", "clash", "client"},cbi("clash/client"),_("Clash Client"), 10).leaf = true
|
||||
entry({"admin", "services", "clash", "dns"},cbi("clash/dns"),_("DNS Settings"), 20).leaf = true
|
||||
entry({"admin", "services", "clash", "config"},cbi("clash/config"),_("Server Config"), 30).leaf = true
|
||||
entry({"admin", "services", "clash"},alias("admin", "services", "clash", "overview"), _("Clash"), 60).dependent = false
|
||||
entry({"admin", "services", "clash", "overview"},cbi("clash/overview"),_("Overview"), 10).leaf = true
|
||||
entry({"admin", "services", "clash", "client"},cbi("clash/client"),_("Client"), 20).leaf = true
|
||||
entry({"admin", "services", "clash", "settings"}, firstchild(),_("Settings"), 100)
|
||||
entry({"admin", "services", "clash", "settings", "port"},cbi("clash/port"),_("Proxy Ports"), 100).leaf = true
|
||||
entry({"admin", "services", "clash", "settings", "dns"},cbi("clash/dns"),_("DNS Settings"), 120).leaf = true
|
||||
entry({"admin", "services", "clash", "settings", "access"},cbi("clash/access"),_("Access Control"), 130).leaf = true
|
||||
entry({"admin", "services", "clash", "config"},cbi("clash/config"),_("Config"), 140).leaf = true
|
||||
entry({"admin","services","clash","status"},call("action_status")).leaf=true
|
||||
entry({"admin", "services", "clash", "log"},cbi("clash/log"),_("Logs"), 40).leaf = true
|
||||
entry({"admin", "services", "clash", "log"},cbi("clash/log"),_("Logs"), 150).leaf = true
|
||||
entry({"admin","services","clash","check_status"},call("check_status")).leaf=true
|
||||
|
||||
|
||||
end
|
||||
|
||||
local function dash_port()
|
||||
return luci.sys.exec("uci get clash.config.dash_port 2>/dev/null")
|
||||
end
|
||||
local function dash_pass()
|
||||
return luci.sys.exec("uci get clash.config.dash_pass 2>/dev/null")
|
||||
end
|
||||
|
||||
local function is_running()
|
||||
return luci.sys.call("pidof clash >/dev/null") == 0
|
||||
@ -25,25 +36,42 @@ local function is_web()
|
||||
return luci.sys.call("pidof clash >/dev/null") == 0
|
||||
end
|
||||
|
||||
local function is_bbr()
|
||||
return luci.sys.call("[ `cat /proc/sys/net/ipv4/tcp_congestion_control 2>/dev/null` = bbr ] 2>/dev/null") == 0
|
||||
local function localip()
|
||||
return luci.sys.exec("uci get network.lan.ipaddr")
|
||||
end
|
||||
|
||||
local function is_pdn()
|
||||
return luci.sys.call("pgrep dnscache >/dev/null") == 0
|
||||
local function check_version()
|
||||
return luci.sys.exec("sh /usr/share/clash/check_version.sh")
|
||||
end
|
||||
|
||||
local function is_dns()
|
||||
return luci.sys.call("pgrep pdnsd >/dev/null") == 0
|
||||
local function current_version()
|
||||
return luci.sys.exec("sed -n 1p /usr/share/clash/clash_version")
|
||||
end
|
||||
|
||||
local function new_version()
|
||||
return luci.sys.exec("sed -n 1p /usr/share/clash/new_version")
|
||||
end
|
||||
|
||||
function check_status()
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json({
|
||||
check_version = check_version(),
|
||||
current_version = current_version(),
|
||||
new_version = new_version()
|
||||
|
||||
})
|
||||
end
|
||||
function action_status()
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json({
|
||||
web = is_web(),
|
||||
clash = is_running(),
|
||||
bbr = is_bbr(),
|
||||
pdnsd = is_pdn(),
|
||||
dnscache = is_dns()
|
||||
localip = localip(),
|
||||
dash_port = dash_port(),
|
||||
current_version = current_version(),
|
||||
new_version = new_version(),
|
||||
dash_pass = dash_pass()
|
||||
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
@ -0,0 +1,65 @@
|
||||
|
||||
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"
|
||||
|
||||
m = Map("clash")
|
||||
s = m:section(TypedSection, "clash")
|
||||
s.anonymous = true
|
||||
s.addremove=false
|
||||
|
||||
md = s:option(Flag, "proxylan", translate("Proxy Lan IP"))
|
||||
md.default = 1
|
||||
md.rmempty = false
|
||||
md.description = translate("Only selected IPs will be proxied if enabled")
|
||||
md:depends("rejectlan", 0)
|
||||
|
||||
|
||||
o = s:option(DynamicList, "lan_ac_ips", translate("Proxy Lan List"))
|
||||
o.datatype = "ipaddr"
|
||||
o.description = translate("Only selected IPs will be proxied")
|
||||
luci.ip.neighbors({ family = 4 }, function(entry)
|
||||
if entry.reachable then
|
||||
o:value(entry.dest:string())
|
||||
end
|
||||
end)
|
||||
o:depends("proxylan", 1)
|
||||
|
||||
|
||||
update_time = SYS.exec("ls -l --full-time /etc/clash/Country.mmdb|awk '{print $6,$7;}'")
|
||||
o = s:option(Button,"update",translate("Update GEOIP Database"))
|
||||
o.title = translate("GEOIP Database")
|
||||
o.inputtitle = translate("Update GEOIP Database")
|
||||
o.description = update_time
|
||||
o.inputstyle = "reload"
|
||||
o.write = function()
|
||||
SYS.call("bash /usr/share/clash/ipdb.sh >>/tmp/clash.log 2>&1 &")
|
||||
HTTP.redirect(DISP.build_url("admin", "services", "clash","settings", "access"))
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
md = s:option(Flag, "rejectlan", translate("Bypass Lan IP"))
|
||||
md.default = 1
|
||||
md.rmempty = false
|
||||
md.description = translate("Selected IPs will not be proxied if enabled")
|
||||
md:depends("proxylan", 0)
|
||||
|
||||
|
||||
o = s:option(DynamicList, "lan_ips", translate("Bypass Lan List"))
|
||||
o.datatype = "ipaddr"
|
||||
o.description = translate("Selected IPs will not be proxied")
|
||||
luci.ip.neighbors({ family = 4 }, function(entry)
|
||||
if entry.reachable then
|
||||
o:value(entry.dest:string())
|
||||
end
|
||||
end)
|
||||
o:depends("rejectlan", 1)
|
||||
|
||||
|
||||
|
||||
|
||||
return m
|
||||
50
package/jsda/luci-app-clash/luasrc/model/cbi/clash/client.lua
Executable file → Normal file
@ -1,4 +1,3 @@
|
||||
|
||||
local NXFS = require "nixio.fs"
|
||||
local SYS = require "luci.sys"
|
||||
local HTTP = require "luci.http"
|
||||
@ -6,39 +5,18 @@ local DISP = require "luci.dispatcher"
|
||||
local UTIL = require "luci.util"
|
||||
|
||||
|
||||
m = Map("clash", translate("Clash Client"))
|
||||
m:section(SimpleSection).template = "clash/status"
|
||||
m = Map("clash")
|
||||
s = m:section(TypedSection, "clash")
|
||||
s.anonymous = true
|
||||
|
||||
|
||||
o = s:option( Flag, "enable")
|
||||
o.title = translate("Enable Clash")
|
||||
o.title = translate("Enable")
|
||||
o.default = 0
|
||||
o.rmempty = false
|
||||
o.description = translate("After clash start running, wait a moment for servers to resolve,enjoy")
|
||||
o.description = translate("Enable Client")
|
||||
|
||||
|
||||
o = s:option(Value, "proxy_port")
|
||||
o.title = translate("* Clash Redir Port")
|
||||
o.default = 7892
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Clash config redir-port")
|
||||
|
||||
o = s:option(Value, "cn_port")
|
||||
o.title = translate("Dashboard Port")
|
||||
o.default = 9090
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Dashboard hostname is Your router local address. eg, 192.168.1.1")
|
||||
|
||||
o = s:option(Value, "dashboard_password")
|
||||
o.title = translate("Dashboard Secret")
|
||||
o.default = 123456
|
||||
o.rmempty = false
|
||||
o.description = translate("Dashboard Secret")
|
||||
|
||||
o = s:option(Flag, "auto_update", translate("Auto Update"))
|
||||
o.rmempty = false
|
||||
o.description = translate("Auto Update Server subscription")
|
||||
@ -50,6 +28,15 @@ o:value(t, t..":00")
|
||||
end
|
||||
o.default=0
|
||||
o.rmempty = false
|
||||
o.description = translate("Daily Server subscription update time")
|
||||
|
||||
o = s:option(ListValue, "subcri", translate("Subcription Type"))
|
||||
o.default = clash
|
||||
o:value("clash", translate("clash"))
|
||||
o:value("v2rayn2clash", translate("v2rayn2clash"))
|
||||
o:value("surge2clash", translate("surge2clash"))
|
||||
o.description = translate("Select Subcription Type, enter only your subcription url without https://tgbot.lbyczf.com/*?")
|
||||
|
||||
|
||||
o = s:option(Value, "subscribe_url")
|
||||
o.title = translate("Subcription Url")
|
||||
@ -58,24 +45,21 @@ o.rmempty = true
|
||||
|
||||
o = s:option(Button,"update")
|
||||
o.title = translate("Update Subcription")
|
||||
o.inputtitle = translate("Update Configuration")
|
||||
o.inputtitle = translate("Update")
|
||||
o.inputstyle = "reload"
|
||||
o.write = function()
|
||||
os.execute("mv /etc/clash/config.yml /etc/clash/config.bak")
|
||||
os.execute("mv /etc/clash/config.yaml /etc/clash/config.bak")
|
||||
os.execute("rm -rf /tmp/clash.log")
|
||||
SYS.call("bash /usr/share/clash/clash.sh >>/tmp/clash.log 2>&1 &")
|
||||
HTTP.redirect(DISP.build_url("admin", "services", "clash"))
|
||||
HTTP.redirect(DISP.build_url("admin", "services", "clash", "client"))
|
||||
end
|
||||
|
||||
|
||||
local apply = luci.http.formvalue("cbi.apply")
|
||||
if apply then
|
||||
os.execute("/etc/init.d/clash restart >/dev/null 2>&1 &")
|
||||
SYS.call("/etc/init.d/clash restart >/dev/null 2>&1 &")
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return m
|
||||
|
||||
|
||||
|
||||
19
package/jsda/luci-app-clash/luasrc/model/cbi/clash/config.lua
Executable file → Normal file
@ -8,15 +8,15 @@ local UTIL = require "luci.util"
|
||||
|
||||
local http = luci.http
|
||||
|
||||
ful = SimpleForm("upload", translate("Server Configuration"), nil)
|
||||
ful = Form("upload", nil)
|
||||
ful.reset = false
|
||||
ful.submit = false
|
||||
|
||||
sul =ful:section(SimpleSection, "", translate(""))
|
||||
o = sul:option(FileUpload, "")
|
||||
o.title = translate("Upload Clash Configuration")
|
||||
o.title = translate("Upload Config")
|
||||
o.template = "clash/clash_upload"
|
||||
o.description = translate("NB: Rename your config file to config.yml before upload. file will save to /etc/clash")
|
||||
o.description = translate("NB: Rename your config file to config.yaml before upload. file will save to /etc/clash")
|
||||
um = sul:option(DummyValue, "", nil)
|
||||
um.template = "clash/clash_dvalue"
|
||||
|
||||
@ -41,6 +41,7 @@ http.setfilehandler(
|
||||
fd:close()
|
||||
fd = nil
|
||||
um.value = translate("File saved to") .. ' "/etc/clash/' .. meta.file .. '"'
|
||||
os.execute("/etc/init.d/clash restart >/dev/null 2>&1 &")
|
||||
end
|
||||
end
|
||||
)
|
||||
@ -61,10 +62,12 @@ s.anonymous = true
|
||||
s.addremove=false
|
||||
|
||||
|
||||
local conf = "/etc/clash/config.yml"
|
||||
local conf = "/etc/clash/config.yaml"
|
||||
sev = s:option(TextValue, "conf")
|
||||
sev.readonly=true
|
||||
sev.description = translate("Changes to config file must be made from source")
|
||||
--update_time = SYS.exec("ls -l --full-time /etc/clash/config.yaml|awk '{print $6,$7;}'")
|
||||
--sev.description = update_time
|
||||
--sev.description = translate("Changes to config file must be made from source")
|
||||
sev.rows = 20
|
||||
sev.wrap = "off"
|
||||
sev.cfgvalue = function(self, section)
|
||||
@ -74,5 +77,11 @@ sev.write = function(self, section, value)
|
||||
end
|
||||
|
||||
|
||||
o = s:option(Button,"configrm")
|
||||
o.inputtitle = translate("Delete Config")
|
||||
o.write = function()
|
||||
os.execute("rm -rf /etc/clash/config.yaml")
|
||||
end
|
||||
|
||||
|
||||
return ful , m
|
||||
|
||||
107
package/jsda/luci-app-clash/luasrc/model/cbi/clash/dns.lua
Executable file → Normal file
@ -1,96 +1,43 @@
|
||||
--
|
||||
|
||||
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 "nixio.fs"
|
||||
|
||||
m = Map("clash", translate("DNS Acceleration & Forwarder"))
|
||||
m = Map("clash")
|
||||
s = m:section(TypedSection, "clash")
|
||||
s.anonymous = true
|
||||
s.addremove=false
|
||||
|
||||
dns = s:option(Flag, "dns", translate("Enable DNS"))
|
||||
dns.default = 1
|
||||
dns.rmempty = false
|
||||
dns.description = translate("Enable DNS Cache Acceleration and anti ISP DNS pollution")
|
||||
|
||||
o = s:option(ListValue, "dnsmodel", translate("Choose DNS Resolve Model"))
|
||||
o.description = translate("Choose DNS Resolve With White or Black List Model")
|
||||
o:value("gfw", translate("GFW List Mode"))
|
||||
o:value("oversea", translate("Oversea Mode"))
|
||||
o:depends("dns", 1)
|
||||
|
||||
o = s:option(Value, "dnsserver", translate("Domestic DNS Server"))
|
||||
o.description = translate("DNS Servers located in China")
|
||||
o:value("119.29.29.29", translate("烟台帝思普网络BPG DNS (119.29.29.29)"))
|
||||
o:value("101.132.183.99", translate("无污染PdoMo-DNS (101.132.183.99)"))
|
||||
o:value("193.112.15.186", translate("无污染PdoMo-DNS (193.112.15.186)"))
|
||||
o:value("114.114.115.115", translate("南京信风网络GreatbitDNS (114.114.115.115)"))
|
||||
o:value("223.6.6.6", translate("阿里云AliDNS (223.6.6.6)"))
|
||||
o:value("223.5.5.5", translate("阿里云AliDNS (223.5.5.5)"))
|
||||
o:value("1.2.4.8", translate("中国互联网络SecureDNS (1.2.4.8)"))
|
||||
o:depends("dns", 1)
|
||||
|
||||
o = s:option(Value, "dnsserver_d", translate("Global DNS Server"))
|
||||
o.description = translate("DNS Servers located Overseas")
|
||||
o:value("208.67.222.222", translate("OpenDNS (208.67.222.222)"))
|
||||
o:value("208.67.220.220", translate("OpenDNS (208.67.220.220)"))
|
||||
o:value("8.8.4.4", translate("Google Public DNS (8.8.4.4)"))
|
||||
o:value("8.8.8.8", translate("Google Public DNS (8.8.8.8)"))
|
||||
o:value("209.244.0.3", translate("Level 3 Public DNS (209.244.0.3)"))
|
||||
o:value("209.244.0.4", translate("Level 3 Public DNS (209.244.0.4)"))
|
||||
o:value("4.2.2.1", translate("Level 3 Public DNS (4.2.2.1)"))
|
||||
o:value("4.2.2.2", translate("Level 3 Public DNS (4.2.2.2)"))
|
||||
o:value("4.2.2.3", translate("Level 3 Public DNS (4.2.2.3)"))
|
||||
o:value("4.2.2.4", translate("Level 3 Public DNS (4.2.2.4)"))
|
||||
o:value("1.1.1.1", translate("Cloudflare DNS (1.1.1.1)"))
|
||||
o:depends("dns", 1)
|
||||
y = s:option(ListValue, "dnsforwader", translate("DNS Forwarding"))
|
||||
y.default = 1
|
||||
y:value("0", translate("disabled"))
|
||||
y:value("1", translate("enabled"))
|
||||
y.description = translate("Set custom DNS forwarder in DHCP and DNS Settings")
|
||||
|
||||
|
||||
gfw_list = s:option(Value, "gfw_list", translate("Self Defined GFW_List"), translate("Please modify the file here."))
|
||||
gfw_list.template = "cbi/tvalue"
|
||||
gfw_list.rows = 13
|
||||
gfw_list.wrap = "off"
|
||||
gfw_list:depends("dnsmodel", "gfw")
|
||||
|
||||
function gfw_list.cfgvalue(self, section)
|
||||
return fs.readfile("/etc/config/clash_gfw.list") or ""
|
||||
md = s:option(Flag, "mode", translate("Custom DNS"))
|
||||
md.default = 1
|
||||
md.rmempty = false
|
||||
md.description = translate("Enabling Custom DNS will Overwrite your config.yaml dns section")
|
||||
|
||||
|
||||
local dns = "/usr/share/clash/dns.yaml"
|
||||
o = s:option(TextValue, "dns",translate("Modify yaml DNS"))
|
||||
o.template = "clash/tvalue"
|
||||
o.rows = 25
|
||||
o.wrap = "off"
|
||||
o.cfgvalue = function(self, section)
|
||||
return NXFS.readfile(dns) or ""
|
||||
end
|
||||
function gfw_list.write(self, section, value)
|
||||
if value then
|
||||
value = value:gsub("\r\n", "\n")
|
||||
fs.writefile("/etc/config/clash_gfw.list", value)
|
||||
end
|
||||
o.write = function(self, section, value)
|
||||
NXFS.writefile(dns, value:gsub("\r\n", "\n"))
|
||||
end
|
||||
|
||||
o = s:option(Button,"update")
|
||||
o.title = translate("Apply Modify List")
|
||||
o.inputtitle = translate("Apply Modify List")
|
||||
o.inputstyle = "reload"
|
||||
o:depends("dnsmodel", "gfw")
|
||||
o.write = function()
|
||||
SYS.call("bash /usr/share/clash/gfw2ipset.sh && /etc/init.d/dnsmasq restart >/dev/null 2>&1 &")
|
||||
end
|
||||
|
||||
o = s:option(Button,"update_gfw")
|
||||
o.title = translate("Update GFW List")
|
||||
o.inputtitle = translate("Update GFW List")
|
||||
o.inputstyle = "reload"
|
||||
o:depends("dnsmodel", "gfw")
|
||||
o.write = function()
|
||||
SYS.call("bash /usr/share/clash/update.sh && /etc/init.d/dnsmasq restart >/dev/null 2>&1")
|
||||
end
|
||||
|
||||
|
||||
|
||||
local apply = luci.http.formvalue("cbi.apply")
|
||||
if apply then
|
||||
os.execute("/etc/init.d/clash restart >/dev/null 2>&1 &")
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
o.description = translate("NB: press ENTER to create a blank line at the end of input.")
|
||||
o:depends("mode", 1)
|
||||
|
||||
return m
|
||||
|
||||
|
||||
|
||||
19
package/jsda/luci-app-clash/luasrc/model/cbi/clash/log.lua
Executable file → Normal file
@ -1,18 +1,20 @@
|
||||
--
|
||||
|
||||
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"
|
||||
|
||||
ful = Form("upload", nil)
|
||||
ful.reset = false
|
||||
ful.submit = false
|
||||
|
||||
m = Map("clash", translate("Server logs"))
|
||||
|
||||
m = Map("clash")
|
||||
s = m:section(TypedSection, "clash")
|
||||
s.anonymous = true
|
||||
s.addremove=false
|
||||
|
||||
|
||||
|
||||
local clog = "/tmp/clash.log"
|
||||
log = s:option(TextValue, "clog")
|
||||
log.readonly=true
|
||||
@ -26,4 +28,11 @@ log.write = function(self, section, value)
|
||||
NXFS.writefile(clog, value:gsub("\r\n", "\n"))
|
||||
end
|
||||
|
||||
return m
|
||||
o = s:option(Button,"log")
|
||||
o.inputtitle = translate("Clear Logs")
|
||||
o.write = function()
|
||||
SYS.call('echo "" > /tmp/clash.log')
|
||||
HTTP.redirect(DISP.build_url("admin", "services", "clash", "log"))
|
||||
end
|
||||
|
||||
return m, ful
|
||||
|
||||
@ -0,0 +1,16 @@
|
||||
|
||||
local m
|
||||
local sys = require "luci.sys"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
ful = Form("upload", nil)
|
||||
ful.reset = false
|
||||
ful.submit = false
|
||||
|
||||
|
||||
m = Map("clash")
|
||||
m:section(SimpleSection).template = "clash/status"
|
||||
|
||||
|
||||
return m, ful
|
||||
|
||||
54
package/jsda/luci-app-clash/luasrc/model/cbi/clash/port.lua
Normal file
@ -0,0 +1,54 @@
|
||||
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"
|
||||
|
||||
|
||||
m = Map("clash")
|
||||
s = m:section(TypedSection, "clash")
|
||||
s.anonymous = true
|
||||
|
||||
o = s:option(Value, "http_port")
|
||||
o.title = translate("Http Port")
|
||||
o.default = 7890
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Http Port")
|
||||
|
||||
o = s:option(Value, "socks_port")
|
||||
o.title = translate("Socks Port")
|
||||
o.default = 7891
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Socks Port")
|
||||
|
||||
o = s:option(Value, "redir_port")
|
||||
o.title = translate("Redir Port")
|
||||
o.default = 7892
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Redir Port")
|
||||
|
||||
o = s:option(Value, "dash_port")
|
||||
o.title = translate("Dashboard Port")
|
||||
o.default = 9191
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
o.description = translate("Dashboard Port")
|
||||
|
||||
o = s:option(Value, "dash_pass")
|
||||
o.title = translate("Dashboard Secret")
|
||||
o.default = 123456
|
||||
o.rmempty = false
|
||||
o.description = translate("Dashboard Secret")
|
||||
|
||||
o = s:option(ListValue, "level", translate("Log level"))
|
||||
o.description = translate("Choose Log Level")
|
||||
o:value("info", "info")
|
||||
o:value("silent", "silent")
|
||||
o:value("warning", "warning")
|
||||
o:value("error", "error")
|
||||
o:value("debug", "debug")
|
||||
|
||||
return m
|
||||
0
package/jsda/luci-app-clash/luasrc/view/clash/clash_dvalue.htm
Executable file → Normal file
0
package/jsda/luci-app-clash/luasrc/view/clash/clash_upload.htm
Executable file → Normal file
214
package/jsda/luci-app-clash/luasrc/view/clash/status.htm
Executable file → Normal file
@ -1,29 +1,215 @@
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
<p width="100%" align="center" id="_logo"></p>
|
||||
<p width="100%" align="center"><%:Rule-based Custom Proxy Client%></p>
|
||||
<p width="100%" align="center"><font color="green"><b id="_version"></b></font></p>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
<table width="100%" cellspacing="10">
|
||||
<tr><td id="_web"><em> <%:Collecting data...%> </em></td></tr>
|
||||
<tr><td width="33%"> Clash 客户端 </td><td id="_clash"><em><%:Collecting data...%></em></td></tr>
|
||||
<tr><td width="33%"> BBR 加速 </td><td id="_bbr"><em><%:Collecting data...%></em></td></tr>
|
||||
<tr><td width="33%"> 国外DNS加速</td><td id="_pdnsd"><em><%:Collecting data...%></em></td></tr>
|
||||
<tr><td width="33%"> 国内DNS加速</td><td id="_dnscache"><em><%:Collecting data...%></em></td></tr>
|
||||
<tr><td width="50%"><span><%:Clash Client%></span></td><td id="_clash"><em><%:Collecting data...%></em></td> </tr>
|
||||
<tr><td width="50%"><span><%:Clash Dashboard%></span></td><td id="_web"><em> <%:Collecting data...%> </em></td> </tr>
|
||||
<tr><td width="50%"><span><%:Yacd Dashboard%></span></td><td id="_webb"><em> <%:Collecting data...%> </em></td> </tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
<table width="100%" cellspacing="10">
|
||||
<tr><td width="50%"> <%:Dashboard Host%></td><td id="_ip"><em><%:Collecting data...%></em></td></tr>
|
||||
<tr><td width="50%"> <%:Dashboard Port%></td><td id="_port"><em><%:Collecting data...%></em></td></tr>
|
||||
<tr><td width="50%"> <%:Dashboard Secret%></td> <td id="_secret"><em><%:Collecting data...%></em></td></tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
<table width="100%" cellspacing="10">
|
||||
|
||||
<tr><td class="align-left" width="50%"><span><%:Global IP%> </span> : <span id="ip-gb"></span> <span id="ip-geo"></span></td> <td class="align-right" width="25%"> <span><%:Google%></span> : <span id="_google"><em><%:Collecting data...%></em></span></td><td class="align-right"><%:Youtube%> </span> : <span id="_youtube"><em><%:Collecting data...%></em></span></td></tr>
|
||||
<tr><td class="align-left" width="50%"><span><%:Domestic IP%> </span> : <span id="d-ip"></span></td> <td class="align-right" width="25%"> <span><%:Baidu%></span> : <span id="_baidu"><em><%:Collecting data...%></em></span></td> <td class="align-right"><%:Taobao%> </span> : <span id="_taobao"><em><%:Collecting data...%></em></span></td></tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
|
||||
|
||||
let random = parseInt(Math.random() * 100000000);
|
||||
let IP = {
|
||||
get: (url, type) =>
|
||||
fetch(url, { method: 'GET' }).then((resp) => {
|
||||
if (type === 'text')
|
||||
return Promise.all([resp.ok, resp.status, resp.text(), resp.headers]);
|
||||
else {
|
||||
return Promise.all([resp.ok, resp.status, resp.json(), resp.headers]);
|
||||
}
|
||||
}).then(([ok, status, data, headers]) => {
|
||||
if (ok) {
|
||||
let json = {
|
||||
ok,
|
||||
status,
|
||||
data,
|
||||
headers
|
||||
}
|
||||
return json;
|
||||
} else {
|
||||
throw new Error(JSON.stringify(json.error));
|
||||
}
|
||||
}).catch(error => {
|
||||
throw error;
|
||||
}),
|
||||
|
||||
|
||||
getIpipnetIP: () => {
|
||||
IP.get(`https://myip.ipip.net/?z=${random}`, 'text')
|
||||
.then((resp) => {
|
||||
let data = resp.data.replace('当前 IP:', '').split(' 来自于:');
|
||||
document.getElementById('d-ip').innerHTML = `${data[0]} ${data[1]}`;
|
||||
});
|
||||
},
|
||||
|
||||
getIpsbIP: (data) => {
|
||||
document.getElementById('ip-gb').innerHTML = data.address;
|
||||
document.getElementById('ip-geo').innerHTML = `${data.country} ${data.province} ${data.city} ${data.isp.name}`
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
|
||||
IP.getIpipnetIP();
|
||||
|
||||
|
||||
var HTTP = {
|
||||
checker: (domain, cbElID) => {
|
||||
let img = new Image;
|
||||
let timeout = setTimeout(() => {
|
||||
img.onerror = img.onload = null;
|
||||
img = null;
|
||||
document.getElementById(cbElID).innerHTML = '<b><font color=red><%:NO ACCESS%></font></b>'
|
||||
}, 1000);
|
||||
img.onerror = () => {
|
||||
clearTimeout(timeout);
|
||||
document.getElementById(cbElID).innerHTML = '<b><font color=red><%:TIMEOUT%></font></b>'
|
||||
}
|
||||
img.onload = () => {
|
||||
clearTimeout(timeout);
|
||||
document.getElementById(cbElID).innerHTML = '<b><font color=green><%:CONNECT OK%></font></b>'
|
||||
}
|
||||
img.src = `https://${domain}/favicon.ico?${+(new Date)}`
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var web = document.getElementById('_web');
|
||||
var webb = document.getElementById('_webb');
|
||||
var clash = document.getElementById('_clash');
|
||||
var bbr = document.getElementById('_bbr');
|
||||
var pdnsd = document.getElementById('_pdnsd');
|
||||
var dnscache = document.getElementById('_dnscache');
|
||||
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', null, function(x, status) {
|
||||
var ip = document.getElementById('_ip');
|
||||
var port = document.getElementById('_port');
|
||||
var secret = document.getElementById('_secret');
|
||||
var version = document.getElementById('_version');
|
||||
var logo = document.getElementById('_logo');
|
||||
XHR.poll(1, '<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', null, function(x, status) {
|
||||
if ( x && x.status == 200 ) {
|
||||
web.innerHTML = status.web ? '<em><b><a type="button" class="btn" style="background-color:black;color:white;padding: 5px;" href="http://'+window.location.hostname+'/clash" target="_blank"/> 打开本地管理页面 </a><a type="button" class="btn" style="background-color:black;color:white;padding: 5px;" href="http://yacd.haishan.me" target="_blank"/> 打开在线管理页面 </a></b></em>' : '<em><b><font color=red></font></b></em>';
|
||||
clash.innerHTML = status.clash ? '<em><b><font color=green><%:RUNNING%></font> </b></em>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
|
||||
bbr.innerHTML = status.bbr ? '<em><b><font color=green><%:RUNNING%></font></b></em>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
|
||||
pdnsd.innerHTML = status.pdnsd ? '<em><b><font color=green><%:RUNNING%></font></b></em>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
|
||||
dnscache.innerHTML = status.dnscache ? '<em><b><font color=green><%:RUNNING%></font></b></em>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
|
||||
web.innerHTML = status.web ? '<a type="button" class="btn" style="background-color:black;padding: 5px;" href="http://'+window.location.hostname+':'+status.dash_port+'/ui" target="_blank"/><b><font color=green><%:OPEN DASHBOARD%></font></b></a>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
|
||||
webb.innerHTML = status.web ? '<a type="button" class="btn" style="background-color:black;padding: 5px;" href="http://'+window.location.hostname+'/clash" target="_blank"/><b><font color=green><%:OPEN DASHBOARD%></font></b></a>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
|
||||
clash.innerHTML = status.clash ? '<b><font color=green><%:RUNNING%></font> </b>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
|
||||
ip.innerHTML = status.localip ? '<b><font color=green>'+status.localip+'</font> </b>' : '<em><b><font color=red><%:NOT SET%></font></b></em>';
|
||||
logo.innerHTML = status.localip ? '<img id="logo" src="http://'+window.location.hostname+'/logo.png" width="150" onclick="return homepage()">' : '<em><b><font color=red><%:NOT SET%></font></b></em>';
|
||||
port.innerHTML = status.dash_port ? '<b><font color=green>'+status.dash_port+'</font> </b>' : '<em><b><font color=red><%:NOT SET%></font></b></em>';
|
||||
secret.innerHTML = status.dash_pass ? '<b><font color=green>'+status.dash_pass+'</font> </b>' : '<em><b><font color=red><%:NOT SET%></font></b></em>';
|
||||
HTTP.checker('www.baidu.com', '_baidu');
|
||||
HTTP.checker('www.google.com', '_google');
|
||||
HTTP.checker('www.youtube.com', '_youtube');
|
||||
HTTP.checker('www.taobao.com', '_taobao');
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', null, function(x, status) {
|
||||
if ( x && x.status == 200 ) {
|
||||
IP.getIpipnetIP();
|
||||
getip();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', status.current_version, function(x, status) {
|
||||
if ( x && x.status == 200 ) {
|
||||
version.innerHTML = status.current_version ? '<b><font color=green><%:Current Version%>'+' : v'+status.current_version+'</font> </b><br><center><input type="button" class="cbi-button cbi-button-reload" value="<%:Check Update%>" onclick="return version_check(this)"/></center>' : '<em><b><font color=red>NOT SET</font></b></em>';
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
function version_check(btn)
|
||||
{
|
||||
btn.disabled = true;
|
||||
btn.value = '<%:Checking...%>';
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "clash", "check_status")%>', null, function(x, status) {
|
||||
if(status.new_version > status.current_version)
|
||||
{
|
||||
version.innerHTML ='<font color="green"><b>'+'<%:New Version%>'+' : v'+status.new_version+'</b></font><br><center>' + '<input type="button" class="cbi-button cbi-button-apply" value="<%:Download%>" onclick="return download_update(this)"/>' + ' ' + '<input type="button" class="cbi-button cbi-button-reset" value="<%:Return Check%>" onclick="return check_return(this)"/></center>';
|
||||
}
|
||||
|
||||
else if(status.new_version==0)
|
||||
{
|
||||
version.innerHTML ='<font color="red"><b>'+'<%:Check Error!%>'+'</b></font>'+'<br><center><input type="button" class="cbi-button cbi-button-reset" value="<%:Return Check%>" onclick="return check_return(this)"/></center>';
|
||||
|
||||
}
|
||||
else if(status.current_version >= status.new_version)
|
||||
{
|
||||
version.innerHTML ='<font color="green"><b>'+'<%:No New Version%>'+'</b></font>'+'<br><center><input type="button" class="cbi-button cbi-button-reset" value="<%:Return Check%>" onclick="return check_return(this)"/></center>';
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
function download_update(btn)
|
||||
{
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "clash", "check_status")%>', null, function(x, status) {
|
||||
btn.disabled = true;
|
||||
btn.value = '<%:Download%>';
|
||||
url='https://github.com/frainzy1477/luci-app-clash/releases/download/v'+status.new_version+'/luci-app-clash_'+status.new_version+'-1_all.ipk';
|
||||
window.open(url);
|
||||
btn.disabled = false;
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function check_return(btn)
|
||||
{
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', status.current_version, function(x, status) {
|
||||
btn.disabled = true;
|
||||
btn.value = '<%:Return Check%>';
|
||||
version.innerHTML = '<b><font color="green">'+'<%:Current Version%>'+' : v'+status.current_version+'</font></b>'+'<br><center><input type="button" class="cbi-button cbi-button-reload" value="<%:Check Update%>" onclick="return version_check(this)"/></center>';
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
//]]></script>
|
||||
<script src="https://ipv4.ip.sb/addrinfo?callback=IP.getIpsbIP"></script>
|
||||
|
||||
<script type="application/javascript">
|
||||
|
||||
function getip() {
|
||||
$.getJSON("https://ipv4.ip.sb/addrinfo?callback=?",
|
||||
function(json) {
|
||||
console.log(json)
|
||||
document.getElementById('ip-gb').innerHTML = json.address;
|
||||
document.getElementById('ip-geo').innerHTML = `${json.country} ${json.province} ${json.city} ${json.isp.name}`
|
||||
}
|
||||
);
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
5
package/jsda/luci-app-clash/luasrc/view/clash/tvalue.htm
Normal file
@ -0,0 +1,5 @@
|
||||
<%+cbi/valueheader%>
|
||||
<textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 280px"<% else %> cols="<%=self.size%>"<% end %> data-update="change"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap") .. ifattr(self.readonly, "readonly") %>>
|
||||
<%-=pcdata(self:cfgvalue(section))-%>
|
||||
</textarea>
|
||||
<%+cbi/valuefooter%>
|
||||
334
package/jsda/luci-app-clash/po/zh-cn/clash.po
Executable file → Normal file
@ -1,87 +1,183 @@
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
||||
msgid "enabled"
|
||||
msgstr "启用"
|
||||
|
||||
msgid "Subcription Type"
|
||||
msgstr "服务器订阅类型"
|
||||
|
||||
msgid "Select Subcription Type, enter only your subcription url without https://tgbot.lbyczf.com/*?"
|
||||
msgstr "选择服务器订阅类型,输入服务器订阅不要带https://tgbot.lbyczf.com/*?"
|
||||
|
||||
msgid "disabled"
|
||||
msgstr "停用"
|
||||
|
||||
msgid "Access Control"
|
||||
msgstr "访问控制"
|
||||
|
||||
msgid "Proxy Ports"
|
||||
msgstr "代理端口设置"
|
||||
|
||||
msgid "DNS Settings"
|
||||
msgstr "DNS设置"
|
||||
|
||||
msgid "Http Port"
|
||||
msgstr "http代理端口"
|
||||
|
||||
msgid "Socks Port"
|
||||
msgstr "socks代理端口"
|
||||
|
||||
msgid "Redir Port"
|
||||
msgstr "redir代理端口"
|
||||
|
||||
msgid "No New Version"
|
||||
msgstr "已安装最新本"
|
||||
|
||||
msgid "Log level"
|
||||
msgstr "日志级别"
|
||||
|
||||
msgid "Choose Log Level"
|
||||
msgstr "选择日志级别"
|
||||
|
||||
msgid "Overview"
|
||||
msgstr "概览"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "下载新版本"
|
||||
|
||||
msgid "Checking..."
|
||||
msgstr "正在检查..."
|
||||
|
||||
msgid "Rule-based Custom Proxy Client"
|
||||
msgstr "基于规则的自定义代理客户端"
|
||||
|
||||
msgid "Check Error!"
|
||||
msgstr "检查错误"
|
||||
|
||||
msgid "New Version"
|
||||
msgstr "最新版本"
|
||||
|
||||
msgid "Current Version"
|
||||
msgstr "当前版本"
|
||||
|
||||
msgid "Return Check"
|
||||
msgstr "返回检查"
|
||||
|
||||
msgid "Check Update"
|
||||
msgstr "检查更新"
|
||||
|
||||
msgid "DNS Forwarding"
|
||||
msgstr "DNS转发"
|
||||
|
||||
msgid "Set custom DNS forwarder in DHCP and DNS Settings"
|
||||
msgstr "在DHCP和DNS设置自定义DNS转发"
|
||||
|
||||
msgid "Proxy Lan IP"
|
||||
msgstr "走代理的局域网IP"
|
||||
|
||||
msgid "Only selected IPs will be proxied if enabled"
|
||||
msgstr "如果启用,仅选择IP只走代理"
|
||||
|
||||
msgid "Proxy Lan List"
|
||||
msgstr "走代理的IP列表"
|
||||
|
||||
msgid "Only selected IPs will be proxied"
|
||||
msgstr "选择IP只走代理"
|
||||
|
||||
msgid "Bypass Lan IP"
|
||||
msgstr "不走代理的局域网IP"
|
||||
|
||||
msgid "Selected IPs will not be proxied if enabled"
|
||||
msgstr "如果启用,仅选择IP只不走代理"
|
||||
|
||||
msgid "Bypass Lan List"
|
||||
msgstr "不走代理的IP列表"
|
||||
|
||||
msgid "Selected IPs will not be proxied"
|
||||
msgstr "选择LAN IP只不走代理"
|
||||
|
||||
msgid "Enabling Custom DNS will Overwrite your config.yaml dns section"
|
||||
msgstr "启用自定义DNS会覆盖config.yaml dns"
|
||||
|
||||
msgid "Dashboard Host"
|
||||
msgstr "外部控制Host"
|
||||
|
||||
msgid "Dashboard Port"
|
||||
msgstr "外部控制端口"
|
||||
|
||||
msgid "Clear Logs"
|
||||
msgstr "清理日志"
|
||||
|
||||
msgid "Dashboard Secret"
|
||||
msgstr "外部控制密钥"
|
||||
|
||||
msgid "Google"
|
||||
msgstr "谷歌网"
|
||||
|
||||
msgid "Youtube"
|
||||
msgstr "Youtube网"
|
||||
|
||||
msgid "Baidu"
|
||||
msgstr "百度网"
|
||||
|
||||
msgid "Taobao"
|
||||
msgstr "淘宝网"
|
||||
|
||||
msgid "CONNECT OK"
|
||||
msgstr "连接正常"
|
||||
|
||||
msgid "TIMEOUT"
|
||||
msgstr "连接超时"
|
||||
|
||||
msgid "NOT SET"
|
||||
msgstr "未设置"
|
||||
|
||||
msgid "NO ACCESS"
|
||||
msgstr "无法访问"
|
||||
|
||||
msgid "Domestic IP"
|
||||
msgstr "国内网IP"
|
||||
|
||||
msgid "Global IP"
|
||||
msgstr "国外网IP"
|
||||
|
||||
msgid "clash"
|
||||
msgstr "clash"
|
||||
|
||||
msgid "Clash Client"
|
||||
msgstr "Clash 客户端"
|
||||
msgid "OPEN DASHBOARD"
|
||||
msgstr "打开外部控制"
|
||||
|
||||
msgid "Server Configuration"
|
||||
msgid "Clash Dashboard"
|
||||
msgstr "Clash外部控制"
|
||||
|
||||
msgid "Yacd Dashboard"
|
||||
msgstr "Yacd外部控制"
|
||||
|
||||
msgid "Client"
|
||||
msgstr "客户端"
|
||||
|
||||
msgid "Clash Client"
|
||||
msgstr "客户端"
|
||||
|
||||
msgid "Configuration"
|
||||
msgstr "配置文件"
|
||||
|
||||
msgid "Server logs"
|
||||
msgstr "服务器日志"
|
||||
msgid "logs"
|
||||
msgstr "日志"
|
||||
|
||||
msgid "Custom DNS"
|
||||
msgstr "自定义DNS"
|
||||
|
||||
msgid "Modify yaml DNS"
|
||||
msgstr "修改 DNS"
|
||||
|
||||
msgid "Logs"
|
||||
msgstr "服务器日志"
|
||||
msgstr "日志"
|
||||
|
||||
msgid "Enable"
|
||||
msgstr "启用"
|
||||
|
||||
msgid "Enable Clash"
|
||||
msgstr "启用 Clash"
|
||||
|
||||
msgid "DNS Server 1"
|
||||
msgstr "上游 DNS 服务器(国内)"
|
||||
|
||||
msgid "DNS Server 2"
|
||||
msgstr "上游 DNS 服务器(国际)"
|
||||
|
||||
msgid "Enable BBR"
|
||||
msgstr "启用 BBR"
|
||||
|
||||
msgid "Bottleneck Bandwidth and Round-trip propagation time (BBR)"
|
||||
msgstr ""
|
||||
"BBR拥塞控制算法可以加强TCP应用表现,但会降低路由器本机上的WIFI吞吐性能"
|
||||
|
||||
msgid "Enable DNS"
|
||||
msgstr "启用 DNS 加速"
|
||||
|
||||
msgid "DNS Acceleration & Forwarder"
|
||||
msgstr "DNS 加速 & 代理"
|
||||
|
||||
msgid "DNS Settings"
|
||||
msgstr "DNS 设置"
|
||||
|
||||
msgid "Server Config"
|
||||
msgstr "服务器配置"
|
||||
|
||||
msgid "Upload Clash Configuration"
|
||||
msgstr "上传 Clash 配置"
|
||||
|
||||
msgid ""
|
||||
"NB: Rename your config file to config.yml before upload. file will save to /"
|
||||
"etc/clash"
|
||||
msgstr ""
|
||||
"注意:上传之前,请将配置文件重命名为config.yml。文件将保存到 /etc/clash"
|
||||
|
||||
msgid "Enable DNS Cache Acceleration and anti ISP DNS pollution"
|
||||
msgstr "启用DNS多线程查询、缓存,并防止ISP的DNS广告和域名劫持"
|
||||
|
||||
msgid "Domestic DNS Server"
|
||||
msgstr "国内上游DNS服务器"
|
||||
|
||||
msgid "Global DNS Server"
|
||||
msgstr "国外上游DNS服务器"
|
||||
|
||||
msgid "* Clash Redir Port"
|
||||
msgstr "* 转发端口"
|
||||
|
||||
msgid "* Domestic DNS Fowarder"
|
||||
msgstr "* 国内代理DNS服务器"
|
||||
|
||||
msgid "* Global DNS Fowarder"
|
||||
msgstr "* 国外代理DNS服务器"
|
||||
|
||||
msgid "Subcription Url"
|
||||
msgstr "订阅URL"
|
||||
|
||||
msgid "Update Subcription"
|
||||
msgstr "更新订阅配置"
|
||||
|
||||
msgid "Update Configuration"
|
||||
msgstr "更新配置文件"
|
||||
msgid "Settings"
|
||||
msgstr "设置"
|
||||
|
||||
msgid "Update time (every day)"
|
||||
msgstr "更新时间 (每天)"
|
||||
@ -89,68 +185,50 @@ msgstr "更新时间 (每天)"
|
||||
msgid "Auto Update"
|
||||
msgstr "自动更新"
|
||||
|
||||
msgid "After clash start running, wait a moment for servers to resolve,enjoy"
|
||||
msgstr "运行后,等待服务器传播"
|
||||
|
||||
msgid "Clash config redir-port"
|
||||
msgstr "转发端口"
|
||||
|
||||
msgid "Domestic DNS Server Fowarder"
|
||||
msgstr "国内DNS代理服务器地址"
|
||||
|
||||
msgid "Global DNS Server Fowarder"
|
||||
msgstr "国外DNS代理服务器地址"
|
||||
|
||||
msgid "Server Subscription Address"
|
||||
msgstr "服务器订阅地址"
|
||||
|
||||
msgid "Auto Update Server subscription"
|
||||
msgstr "自动更新服务器订阅"
|
||||
|
||||
msgid "Daily Server subscription update time"
|
||||
msgstr "每日服务器订阅更新时间"
|
||||
|
||||
msgid "Under Server Config you can manually upload configuration from pc"
|
||||
msgstr "在服务器配置可以选择手动上载配置"
|
||||
msgid "Enable"
|
||||
msgstr "启用"
|
||||
|
||||
msgid "Delete Config"
|
||||
msgstr "删除配置"
|
||||
|
||||
msgid "Config"
|
||||
msgstr "配置"
|
||||
|
||||
msgid "NB: press ENTER to create a blank line at the end of input."
|
||||
msgstr "填写时请按照模板格式, 按Enter键在输入结束时创建一行空行"
|
||||
|
||||
msgid "GEOIP Database"
|
||||
msgstr "GEOIP数据库"
|
||||
|
||||
msgid "Update GEOIP Database"
|
||||
msgstr "更新GEOIP数据库"
|
||||
|
||||
msgid "Upload Config"
|
||||
msgstr "上传配置"
|
||||
|
||||
msgid "NB: Rename your config file to config.yaml before upload. file will save to /etc/clash"
|
||||
msgstr "注意:上传之前,请将配置文件重命名为config.yaml。文件将保存到 /etc/clash"
|
||||
|
||||
msgid "Subcription Url"
|
||||
msgstr "订阅URL"
|
||||
|
||||
msgid "Update Subcription"
|
||||
msgstr "更新订阅配置"
|
||||
|
||||
msgid "Update"
|
||||
msgstr "更新"
|
||||
|
||||
msgid "Enable Client"
|
||||
msgstr "启用客户端"
|
||||
|
||||
msgid "Server Subscription Address"
|
||||
msgstr "服务器订阅地址"
|
||||
|
||||
msgid "Changes to config file must be made from source"
|
||||
msgstr "必须从源文件更改配置文件"
|
||||
|
||||
msgid "DNS Servers located in China"
|
||||
msgstr "选择国内上游DNS服务器"
|
||||
|
||||
msgid "DNS Servers located Overseas"
|
||||
msgstr "选择国外上游DNS服务器"
|
||||
|
||||
msgid "Dashboard Secret"
|
||||
msgstr "管理页面秘密"
|
||||
|
||||
msgid "Dashboard hostname is Your router local address. eg, 192.168.1.1"
|
||||
msgstr "管理页面主机名是您的路由器本地地址。例如,192.168.1.1"
|
||||
|
||||
msgid "Dashboard Port"
|
||||
msgstr "管理页面端口"
|
||||
|
||||
msgid "Self Defined GFW_List"
|
||||
msgstr "添加自定义GFW地址"
|
||||
|
||||
msgid "GFW List Mode"
|
||||
msgstr "GFW列表模式"
|
||||
|
||||
msgid "Oversea Mode"
|
||||
msgstr "海外用户回国模式"
|
||||
|
||||
msgid "Please modify the file here."
|
||||
msgstr "填写时请按照模板格式"
|
||||
|
||||
msgid "Apply Modify List"
|
||||
msgstr "应用自定义GFW列表"
|
||||
|
||||
msgid "Choose DNS Resolve Model"
|
||||
msgstr "运行模式"
|
||||
|
||||
msgid "Choose DNS Resolve With White or Black List Model"
|
||||
msgstr "选择DNS解析模式"
|
||||
|
||||
msgid "Update GFW List"
|
||||
msgstr "更新GFW列表"
|
||||
msgstr "必须从源文件更改配置文件"
|
||||
BIN
package/jsda/luci-app-clash/root/etc/clash/Country.mmdb
Executable file → Normal file
@ -1,618 +0,0 @@
|
||||
# 2019-03-10 18:17:37
|
||||
#---------------------------------------------------#
|
||||
## 配置文件需要放置在 $HOME/.config/clash/config.yml
|
||||
##
|
||||
## 如果您不知道如何操作,请参阅 SS-Rule-Snippet 的 Wiki: https://github.com/Hackl0us/SS-Rule-Snippet/wiki/clash(X)
|
||||
#---------------------------------------------------#
|
||||
|
||||
# HTTP 代理端口
|
||||
port: 7890
|
||||
|
||||
# SOCKS5 代理端口
|
||||
socks-port: 7891
|
||||
|
||||
# Linux 和 macOS 的 redir 代理端口 (如需使用此功能,请取消注释)
|
||||
# redir-port: 7892
|
||||
|
||||
# 允许局域网的连接(可用来共享代理)
|
||||
allow-lan: false
|
||||
|
||||
# 规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
|
||||
mode: Rule
|
||||
|
||||
# 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
|
||||
# 5 个级别:silent / info / warning / error / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
|
||||
log-level: silent
|
||||
|
||||
# clash 的 RESTful API
|
||||
external-controller: 127.0.0.1:9090
|
||||
|
||||
# 您可以将静态网页资源(如 clash-dashboard)放置在一个目录中,clash 将会服务于 `${API}/ui`
|
||||
# 参数应填写配置目录的相对路径或绝对路径。
|
||||
# external-ui: folder
|
||||
|
||||
# RESTful API 的口令 (可选)
|
||||
secret: ""
|
||||
|
||||
dns:
|
||||
enable: true
|
||||
ipv6: false
|
||||
# listen: 0.0.0.0:53
|
||||
# enhanced-mode: redir-host
|
||||
nameserver:
|
||||
- 1.2.4.8
|
||||
- 114.114.114.114
|
||||
- 223.5.5.5
|
||||
- tls://dns.rubyfish.cn:853
|
||||
|
||||
fallback: # 与 nameserver 内的服务器列表同时发起请求,当规则符合 GEOIP 在 CN 以外时,fallback 列表内的域名服务器生效。
|
||||
- tls://dns.rubyfish.cn:853
|
||||
- tls://dns.google
|
||||
|
||||
# clash DNS 请求逻辑:
|
||||
# (1) 当访问一个域名时, nameserver 与 fallback 列表内的所有服务器并发请求,得到域名对应的 IP 地址。
|
||||
# (2) clash 将选取 nameserver 列表内,解析最快的结果。
|
||||
# (3) 若解析结果中,IP 地址属于 国外,那么 clash 将选择 fallback 列表内,解析最快的结果。
|
||||
#
|
||||
# 因此,我在 nameserver 和 fallback 内都放置了无污染、解析速度较快的国内 DNS 服务器,以达到最快的解析速度。
|
||||
# 但是 fallback 列表内服务器会用在解析境外网站,为了结果绝对无污染,我仅保留了支持 DoT/DoH 的两个服务器。
|
||||
#
|
||||
# 注意:
|
||||
# (1) 如果您为了确保 DNS 解析结果无污染,请仅保留列表内以 tls:// 开头的 DNS 服务器,但是通常对于国内没有太大必要。
|
||||
# (2) 如果您不在乎可能解析到污染的结果,更加追求速度。请将 nameserver 列表的服务器插入至 fallback 列表内,并移除重复项。
|
||||
|
||||
Proxy:
|
||||
|
||||
# shadowsocks
|
||||
# 所支持的加密方式与 go-shadowsocks2 保持一致
|
||||
# 支持加密方式: AEAD_AES_128_GCM AEAD_AES_192_GCM AEAD_AES_256_GCM AEAD_CHACHA20_POLY1305 AES-128-CTR AES-192-CTR AES-256-CTR AES-128-CFB AES-192-CFB AES-256-CFB CHACHA20-IETF XCHACHA20
|
||||
# clash 额外支持 chacha20 rc4-md5 xchacha20-ietf-poly1305 加密方式
|
||||
|
||||
- name: "ss1"
|
||||
type: ss
|
||||
server: server
|
||||
port: 443
|
||||
cipher: AEAD_CHACHA20_POLY1305
|
||||
password: "password"
|
||||
plugin: obfs
|
||||
plugin-opts:
|
||||
mode: tls # 混淆模式,可以选择 http 或 tls
|
||||
host: bing.com # 混淆域名,需要和服务器配置保持一致
|
||||
|
||||
- name: "ss2"
|
||||
type: ss
|
||||
server: server
|
||||
port: 443
|
||||
cipher: AEAD_CHACHA20_POLY1305
|
||||
password: "password"
|
||||
plugin: v2ray-plugin
|
||||
plugin-opts:
|
||||
mode: websocket # 暂时不支持 QUIC 协议
|
||||
# tls: true # wss
|
||||
# skip-cert-verify: true
|
||||
# host: bing.com
|
||||
# path: "/"
|
||||
|
||||
# vmess
|
||||
# 支持加密方式:auto / aes-128-gcm / chacha20-poly1305 / none
|
||||
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto }
|
||||
# tls
|
||||
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto, tls: true }
|
||||
# tls (skip-cert-verify)
|
||||
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto, tls: true, skip-cert-verify: true }
|
||||
# ws-path + ws-headers
|
||||
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto, network: ws, ws-path: /path, ws-headers: { Host: v2ray.com } }
|
||||
# ws + tls
|
||||
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto, network: ws, ws-path: /path, tls: true }
|
||||
|
||||
|
||||
# socks5
|
||||
- { name: "socks", type: socks5, server: server, port: 443 }
|
||||
# socks5 with authentication
|
||||
- { name: "socks", type: socks5, server: server, port: 443, username: "username", password: "password" }
|
||||
# tls
|
||||
- { name: "socks", type: socks5, server: server, port: 443, tls: true }
|
||||
# tls (skip-cert-verify)
|
||||
- { name: "socks", type: socks5, server: server, port: 443, tls: true, skip-cert-verify: true }
|
||||
|
||||
# http
|
||||
- { name: "http", type: http, server: server, port: 443 }
|
||||
# http with authentication
|
||||
- { name: "http", type: http, server: server, port: 443, username: "username", password: "password" }
|
||||
# tls (https)
|
||||
- { name: "http", type: http, server: server, port: 443, tls: true }
|
||||
# tls (https) (skip-cert-verify)
|
||||
- { name: "http", type: http, server: server, port: 443, tls: true, skip-cert-verify: true }
|
||||
|
||||
Proxy Group:
|
||||
# url-test 可以自动选择与指定 URL 测速后,延迟最短的服务器
|
||||
- { name: "auto", type: url-test, proxies: ["ss1", "ss2", "vmess1"], url: "https://www.bing.com", interval: 300 }
|
||||
|
||||
# fallback 可以尽量按照用户书写的服务器顺序,在确保服务器可用的情况下,自动选择服务器
|
||||
- { name: "fallback-auto", type: fallback, proxies: ["ss1", "ss2", "vmess1"], url: "https://www.bing.com", interval: 300 }
|
||||
|
||||
# load-balance 可以使相同 eTLD 请求在同一条代理线路上
|
||||
- { name: "load-balance", type: load-balance, proxies: ["ss1", "ss2", "vmess1"] }
|
||||
|
||||
# select 用来允许用户手动选择 代理服务器 或 服务器组
|
||||
# 您也可以使用 RESTful API 去切换服务器,这种方式推荐在 GUI 中使用
|
||||
- { name: "Proxy", type: select, proxies: ["ss1", "ss2", "vmess1", "auto"] }
|
||||
|
||||
Rule:
|
||||
# Apple
|
||||
- DOMAIN,hls.itunes.apple.com,Proxy
|
||||
- DOMAIN,itunes.apple.com,Proxy
|
||||
- DOMAIN-SUFFIX,digicert.com,DIRECT
|
||||
- DOMAIN-SUFFIX,icloud.com,DIRECT
|
||||
- DOMAIN-SUFFIX,icloud-content.com,DIRECT
|
||||
- DOMAIN-SUFFIX,mzstatic.com,DIRECT
|
||||
- DOMAIN-SUFFIX,akadns.net,DIRECT
|
||||
- DOMAIN-SUFFIX,aaplimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,cdn-apple.com,DIRECT
|
||||
- DOMAIN-SUFFIX,apple.com,DIRECT
|
||||
#- DOMAIN,e.crashlytics.com,REJECT //注释此选项有助于大多数App开发者分析崩溃信息;如果您拒绝一切崩溃数据统计、搜集,请取消 # 注释。
|
||||
|
||||
|
||||
# 自定义规则
|
||||
## 您可以在此处插入您补充的自定义规则
|
||||
|
||||
# 国内网站
|
||||
- DOMAIN-SUFFIX,cn,DIRECT
|
||||
- DOMAIN-KEYWORD,-cn,DIRECT
|
||||
|
||||
- DOMAIN-SUFFIX,126.com,DIRECT
|
||||
- DOMAIN-SUFFIX,126.net,DIRECT
|
||||
- DOMAIN-SUFFIX,127.net,DIRECT
|
||||
- DOMAIN-SUFFIX,163.com,DIRECT
|
||||
- DOMAIN-SUFFIX,360buyimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,36kr.com,DIRECT
|
||||
- DOMAIN-SUFFIX,acfun.tv,DIRECT
|
||||
- DOMAIN-SUFFIX,air-matters.com,DIRECT
|
||||
- DOMAIN-SUFFIX,aixifan.com,DIRECT
|
||||
- DOMAIN-SUFFIX,akamaized.net,DIRECT
|
||||
- DOMAIN-KEYWORD,alicdn,DIRECT
|
||||
- DOMAIN-KEYWORD,alipay,DIRECT
|
||||
- DOMAIN-KEYWORD,taobao,DIRECT
|
||||
- DOMAIN-SUFFIX,amap.com,DIRECT
|
||||
- DOMAIN-SUFFIX,autonavi.com,DIRECT
|
||||
- DOMAIN-KEYWORD,baidu,DIRECT
|
||||
- DOMAIN-SUFFIX,bdimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,bdstatic.com,DIRECT
|
||||
- DOMAIN-SUFFIX,bilibili.com,DIRECT
|
||||
- DOMAIN-SUFFIX,caiyunapp.com,DIRECT
|
||||
- DOMAIN-SUFFIX,clouddn.com,DIRECT
|
||||
- DOMAIN-SUFFIX,cnbeta.com,DIRECT
|
||||
- DOMAIN-SUFFIX,cnbetacdn.com,DIRECT
|
||||
- DOMAIN-SUFFIX,cootekservice.com,DIRECT
|
||||
- DOMAIN-SUFFIX,csdn.net,DIRECT
|
||||
- DOMAIN-SUFFIX,ctrip.com,DIRECT
|
||||
- DOMAIN-SUFFIX,dgtle.com,DIRECT
|
||||
- DOMAIN-SUFFIX,dianping.com,DIRECT
|
||||
- DOMAIN-SUFFIX,douban.com,DIRECT
|
||||
- DOMAIN-SUFFIX,doubanio.com,DIRECT
|
||||
- DOMAIN-SUFFIX,duokan.com,DIRECT
|
||||
- DOMAIN-SUFFIX,easou.com,DIRECT
|
||||
- DOMAIN-SUFFIX,ele.me,DIRECT
|
||||
- DOMAIN-SUFFIX,feng.com,DIRECT
|
||||
- DOMAIN-SUFFIX,fir.im,DIRECT
|
||||
- DOMAIN-SUFFIX,frdic.com,DIRECT
|
||||
- DOMAIN-SUFFIX,g-cores.com,DIRECT
|
||||
- DOMAIN-SUFFIX,godic.net,DIRECT
|
||||
- DOMAIN-SUFFIX,gtimg.com,DIRECT
|
||||
- DOMAIN,cdn.hockeyapp.net,DIRECT
|
||||
- DOMAIN-SUFFIX,hongxiu.com,DIRECT
|
||||
- DOMAIN-SUFFIX,hxcdn.net,DIRECT
|
||||
- DOMAIN-SUFFIX,iciba.com,DIRECT
|
||||
- DOMAIN-SUFFIX,ifeng.com,DIRECT
|
||||
- DOMAIN-SUFFIX,ifengimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,ipip.net,DIRECT
|
||||
- DOMAIN-SUFFIX,iqiyi.com,DIRECT
|
||||
- DOMAIN-SUFFIX,jd.com,DIRECT
|
||||
- DOMAIN-SUFFIX,jianshu.com,DIRECT
|
||||
- DOMAIN-SUFFIX,knewone.com,DIRECT
|
||||
- DOMAIN-SUFFIX,le.com,DIRECT
|
||||
- DOMAIN-SUFFIX,lecloud.com,DIRECT
|
||||
- DOMAIN-SUFFIX,lemicp.com,DIRECT
|
||||
- DOMAIN-SUFFIX,licdn.com,DIRECT
|
||||
- DOMAIN-SUFFIX,linkedin.com,DIRECT
|
||||
- DOMAIN-SUFFIX,luoo.net,DIRECT
|
||||
- DOMAIN-SUFFIX,meituan.com,DIRECT
|
||||
- DOMAIN-SUFFIX,meituan.net,DIRECT
|
||||
- DOMAIN-SUFFIX,mi.com,DIRECT
|
||||
- DOMAIN-SUFFIX,miaopai.com,DIRECT
|
||||
- DOMAIN-SUFFIX,microsoft.com,DIRECT
|
||||
- DOMAIN-SUFFIX,microsoftonline.com,DIRECT
|
||||
- DOMAIN-SUFFIX,miui.com,DIRECT
|
||||
- DOMAIN-SUFFIX,miwifi.com,DIRECT
|
||||
- DOMAIN-SUFFIX,mob.com,DIRECT
|
||||
- DOMAIN-SUFFIX,netease.com,DIRECT
|
||||
- DOMAIN-SUFFIX,office.com,DIRECT
|
||||
- DOMAIN-SUFFIX,office365.com,DIRECT
|
||||
- DOMAIN-KEYWORD,officecdn,DIRECT
|
||||
- DOMAIN-SUFFIX,oschina.net,DIRECT
|
||||
- DOMAIN-SUFFIX,ppsimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,pstatp.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qcloud.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qdaily.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qdmm.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qhimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qhres.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qidian.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qihucdn.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qiniu.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qiniucdn.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qiyipic.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qq.com,DIRECT
|
||||
- DOMAIN-SUFFIX,qqurl.com,DIRECT
|
||||
- DOMAIN-SUFFIX,tencent.com,DIRECT
|
||||
- DOMAIN-SUFFIX,rarbg.to,DIRECT
|
||||
- DOMAIN-SUFFIX,ruguoapp.com,DIRECT
|
||||
- DOMAIN-SUFFIX,segmentfault.com,DIRECT
|
||||
- DOMAIN-SUFFIX,sinaapp.com,DIRECT
|
||||
- DOMAIN-SUFFIX,smzdm.com,DIRECT
|
||||
- DOMAIN-SUFFIX,sogou.com,DIRECT
|
||||
- DOMAIN-SUFFIX,sogoucdn.com,DIRECT
|
||||
- DOMAIN-SUFFIX,sohu.com,DIRECT
|
||||
- DOMAIN-SUFFIX,soku.com,DIRECT
|
||||
- DOMAIN-SUFFIX,speedtest.net,DIRECT
|
||||
- DOMAIN-SUFFIX,sspai.com,DIRECT
|
||||
- DOMAIN-SUFFIX,suning.com,DIRECT
|
||||
- DOMAIN-SUFFIX,taobao.com,DIRECT
|
||||
- DOMAIN-SUFFIX,tenpay.com,DIRECT
|
||||
- DOMAIN-SUFFIX,tmall.com,DIRECT
|
||||
- DOMAIN-SUFFIX,tudou.com,DIRECT
|
||||
- DOMAIN-SUFFIX,umetrip.com,DIRECT
|
||||
- DOMAIN-SUFFIX,upaiyun.com,DIRECT
|
||||
- DOMAIN-SUFFIX,upyun.com,DIRECT
|
||||
- DOMAIN-SUFFIX,v2ex.com,DIRECT
|
||||
- DOMAIN-SUFFIX,veryzhun.com,DIRECT
|
||||
- DOMAIN-SUFFIX,weather.com,DIRECT
|
||||
- DOMAIN-SUFFIX,weibo.com,DIRECT
|
||||
- DOMAIN-SUFFIX,xiami.com,DIRECT
|
||||
- DOMAIN-SUFFIX,xiami.net,DIRECT
|
||||
- DOMAIN-SUFFIX,xiaomicp.com,DIRECT
|
||||
- DOMAIN-SUFFIX,ximalaya.com,DIRECT
|
||||
- DOMAIN-SUFFIX,xmcdn.com,DIRECT
|
||||
- DOMAIN-SUFFIX,xunlei.com,DIRECT
|
||||
- DOMAIN-SUFFIX,yhd.com,DIRECT
|
||||
- DOMAIN-SUFFIX,yihaodianimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,yinxiang.com,DIRECT
|
||||
- DOMAIN-SUFFIX,ykimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,youdao.com,DIRECT
|
||||
- DOMAIN-SUFFIX,youku.com,DIRECT
|
||||
- DOMAIN-SUFFIX,zealer.com,DIRECT
|
||||
- DOMAIN-SUFFIX,zhihu.com,DIRECT
|
||||
- DOMAIN-SUFFIX,zhimg.com,DIRECT
|
||||
- DOMAIN-SUFFIX,zimuzu.tv,DIRECT
|
||||
|
||||
# 抗 DNS 污染
|
||||
- DOMAIN-KEYWORD,amazon,Proxy
|
||||
- DOMAIN-KEYWORD,google,Proxy
|
||||
- DOMAIN-KEYWORD,gmail,Proxy
|
||||
- DOMAIN-KEYWORD,youtube,Proxy
|
||||
- DOMAIN-KEYWORD,facebook,Proxy
|
||||
- DOMAIN-SUFFIX,fb.me,Proxy
|
||||
- DOMAIN-SUFFIX,fbcdn.net,Proxy
|
||||
- DOMAIN-KEYWORD,twitter,Proxy
|
||||
- DOMAIN-KEYWORD,instagram,Proxy
|
||||
- DOMAIN-KEYWORD,dropbox,Proxy
|
||||
- DOMAIN-SUFFIX,twimg.com,Proxy
|
||||
- DOMAIN-KEYWORD,blogspot,Proxy
|
||||
- DOMAIN-SUFFIX,youtu.be,Proxy
|
||||
- DOMAIN-KEYWORD,whatsapp,Proxy
|
||||
|
||||
# 常见广告域名屏蔽
|
||||
- DOMAIN-KEYWORD,admarvel,REJECT
|
||||
- DOMAIN-KEYWORD,admaster,REJECT
|
||||
- DOMAIN-KEYWORD,adsage,REJECT
|
||||
- DOMAIN-KEYWORD,adsmogo,REJECT
|
||||
- DOMAIN-KEYWORD,adsrvmedia,REJECT
|
||||
- DOMAIN-KEYWORD,adwords,REJECT
|
||||
- DOMAIN-KEYWORD,adservice,REJECT
|
||||
- DOMAIN-KEYWORD,domob,REJECT
|
||||
- DOMAIN-KEYWORD,duomeng,REJECT
|
||||
- DOMAIN-KEYWORD,dwtrack,REJECT
|
||||
- DOMAIN-KEYWORD,guanggao,REJECT
|
||||
- DOMAIN-KEYWORD,lianmeng,REJECT
|
||||
- DOMAIN-KEYWORD,omgmta,REJECT
|
||||
- DOMAIN-KEYWORD,openx,REJECT
|
||||
- DOMAIN-KEYWORD,partnerad,REJECT
|
||||
- DOMAIN-KEYWORD,pingfore,REJECT
|
||||
- DOMAIN-KEYWORD,supersonicads,REJECT
|
||||
- DOMAIN-KEYWORD,tracking,REJECT
|
||||
- DOMAIN-KEYWORD,uedas,REJECT
|
||||
- DOMAIN-KEYWORD,umeng,REJECT
|
||||
- DOMAIN-KEYWORD,usage,REJECT
|
||||
- DOMAIN-KEYWORD,wlmonitor,REJECT
|
||||
- DOMAIN-KEYWORD,zjtoolbar,REJECT
|
||||
|
||||
# 国外网站
|
||||
- DOMAIN-SUFFIX,9to5mac.com,Proxy
|
||||
- DOMAIN-SUFFIX,abpchina.org,Proxy
|
||||
- DOMAIN-SUFFIX,adblockplus.org,Proxy
|
||||
- DOMAIN-SUFFIX,adobe.com,Proxy
|
||||
- DOMAIN-SUFFIX,alfredapp.com,Proxy
|
||||
- DOMAIN-SUFFIX,amplitude.com,Proxy
|
||||
- DOMAIN-SUFFIX,ampproject.org,Proxy
|
||||
- DOMAIN-SUFFIX,android.com,Proxy
|
||||
- DOMAIN-SUFFIX,angularjs.org,Proxy
|
||||
- DOMAIN-SUFFIX,aolcdn.com,Proxy
|
||||
- DOMAIN-SUFFIX,apkpure.com,Proxy
|
||||
- DOMAIN-SUFFIX,appledaily.com,Proxy
|
||||
- DOMAIN-SUFFIX,appshopper.com,Proxy
|
||||
- DOMAIN-SUFFIX,appspot.com,Proxy
|
||||
- DOMAIN-SUFFIX,arcgis.com,Proxy
|
||||
- DOMAIN-SUFFIX,archive.org,Proxy
|
||||
- DOMAIN-SUFFIX,armorgames.com,Proxy
|
||||
- DOMAIN-SUFFIX,aspnetcdn.com,Proxy
|
||||
- DOMAIN-SUFFIX,att.com,Proxy
|
||||
- DOMAIN-SUFFIX,awsstatic.com,Proxy
|
||||
- DOMAIN-SUFFIX,azureedge.net,Proxy
|
||||
- DOMAIN-SUFFIX,azurewebsites.net,Proxy
|
||||
- DOMAIN-SUFFIX,bing.com,Proxy
|
||||
- DOMAIN-SUFFIX,bintray.com,Proxy
|
||||
- DOMAIN-SUFFIX,bit.com,Proxy
|
||||
- DOMAIN-SUFFIX,bit.ly,Proxy
|
||||
- DOMAIN-SUFFIX,bitbucket.org,Proxy
|
||||
- DOMAIN-SUFFIX,bjango.com,Proxy
|
||||
- DOMAIN-SUFFIX,bkrtx.com,Proxy
|
||||
- DOMAIN-SUFFIX,blog.com,Proxy
|
||||
- DOMAIN-SUFFIX,blogcdn.com,Proxy
|
||||
- DOMAIN-SUFFIX,blogger.com,Proxy
|
||||
- DOMAIN-SUFFIX,blogsmithmedia.com,Proxy
|
||||
- DOMAIN-SUFFIX,blogspot.com,Proxy
|
||||
- DOMAIN-SUFFIX,blogspot.hk,Proxy
|
||||
- DOMAIN-SUFFIX,bloomberg.com,Proxy
|
||||
- DOMAIN-SUFFIX,box.com,Proxy
|
||||
- DOMAIN-SUFFIX,box.net,Proxy
|
||||
- DOMAIN-SUFFIX,cachefly.net,Proxy
|
||||
- DOMAIN-SUFFIX,chromium.org,Proxy
|
||||
- DOMAIN-SUFFIX,cl.ly,Proxy
|
||||
- DOMAIN-SUFFIX,cloudflare.com,Proxy
|
||||
- DOMAIN-SUFFIX,cloudfront.net,Proxy
|
||||
- DOMAIN-SUFFIX,cloudmagic.com,Proxy
|
||||
- DOMAIN-SUFFIX,cmail19.com,Proxy
|
||||
- DOMAIN-SUFFIX,cnet.com,Proxy
|
||||
- DOMAIN-SUFFIX,cocoapods.org,Proxy
|
||||
- DOMAIN-SUFFIX,comodoca.com,Proxy
|
||||
- DOMAIN-SUFFIX,crashlytics.com,Proxy
|
||||
- DOMAIN-SUFFIX,culturedcode.com,Proxy
|
||||
- DOMAIN-SUFFIX,d.pr,Proxy
|
||||
- DOMAIN-SUFFIX,danilo.to,Proxy
|
||||
- DOMAIN-SUFFIX,dayone.me,Proxy
|
||||
- DOMAIN-SUFFIX,db.tt,Proxy
|
||||
- DOMAIN-SUFFIX,deskconnect.com,Proxy
|
||||
- DOMAIN-SUFFIX,disq.us,Proxy
|
||||
- DOMAIN-SUFFIX,disqus.com,Proxy
|
||||
- DOMAIN-SUFFIX,disquscdn.com,Proxy
|
||||
- DOMAIN-SUFFIX,dnsimple.com,Proxy
|
||||
- DOMAIN-SUFFIX,docker.com,Proxy
|
||||
- DOMAIN-SUFFIX,dribbble.com,Proxy
|
||||
- DOMAIN-SUFFIX,droplr.com,Proxy
|
||||
- DOMAIN-SUFFIX,duckduckgo.com,Proxy
|
||||
- DOMAIN-SUFFIX,dueapp.com,Proxy
|
||||
- DOMAIN-SUFFIX,dytt8.net,Proxy
|
||||
- DOMAIN-SUFFIX,edgecastcdn.net,Proxy
|
||||
- DOMAIN-SUFFIX,edgekey.net,Proxy
|
||||
- DOMAIN-SUFFIX,edgesuite.net,Proxy
|
||||
- DOMAIN-SUFFIX,engadget.com,Proxy
|
||||
- DOMAIN-SUFFIX,entrust.net,Proxy
|
||||
- DOMAIN-SUFFIX,eurekavpt.com,Proxy
|
||||
- DOMAIN-SUFFIX,evernote.com,Proxy
|
||||
- DOMAIN-SUFFIX,fabric.io,Proxy
|
||||
- DOMAIN-SUFFIX,fast.com,Proxy
|
||||
- DOMAIN-SUFFIX,fastly.net,Proxy
|
||||
- DOMAIN-SUFFIX,fc2.com,Proxy
|
||||
- DOMAIN-SUFFIX,feedburner.com,Proxy
|
||||
- DOMAIN-SUFFIX,feedly.com,Proxy
|
||||
- DOMAIN-SUFFIX,feedsportal.com,Proxy
|
||||
- DOMAIN-SUFFIX,fiftythree.com,Proxy
|
||||
- DOMAIN-SUFFIX,firebaseio.com,Proxy
|
||||
- DOMAIN-SUFFIX,flexibits.com,Proxy
|
||||
- DOMAIN-SUFFIX,flickr.com,Proxy
|
||||
- DOMAIN-SUFFIX,flipboard.com,Proxy
|
||||
- DOMAIN-SUFFIX,g.co,Proxy
|
||||
- DOMAIN-SUFFIX,gabia.net,Proxy
|
||||
- DOMAIN-SUFFIX,geni.us,Proxy
|
||||
- DOMAIN-SUFFIX,gfx.ms,Proxy
|
||||
- DOMAIN-SUFFIX,ggpht.com,Proxy
|
||||
- DOMAIN-SUFFIX,ghostnoteapp.com,Proxy
|
||||
- DOMAIN-SUFFIX,git.io,Proxy
|
||||
- DOMAIN-KEYWORD,github,Proxy
|
||||
- DOMAIN-SUFFIX,globalsign.com,Proxy
|
||||
- DOMAIN-SUFFIX,gmodules.com,Proxy
|
||||
- DOMAIN-SUFFIX,godaddy.com,Proxy
|
||||
- DOMAIN-SUFFIX,golang.org,Proxy
|
||||
- DOMAIN-SUFFIX,gongm.in,Proxy
|
||||
- DOMAIN-SUFFIX,goo.gl,Proxy
|
||||
- DOMAIN-SUFFIX,goodreaders.com,Proxy
|
||||
- DOMAIN-SUFFIX,goodreads.com,Proxy
|
||||
- DOMAIN-SUFFIX,gravatar.com,Proxy
|
||||
- DOMAIN-SUFFIX,gstatic.com,Proxy
|
||||
- DOMAIN-SUFFIX,gvt0.com,Proxy
|
||||
- DOMAIN-SUFFIX,hockeyapp.net,Proxy
|
||||
- DOMAIN-SUFFIX,hotmail.com,Proxy
|
||||
- DOMAIN-SUFFIX,icons8.com,Proxy
|
||||
- DOMAIN-SUFFIX,ift.tt,Proxy
|
||||
- DOMAIN-SUFFIX,ifttt.com,Proxy
|
||||
- DOMAIN-SUFFIX,iherb.com,Proxy
|
||||
- DOMAIN-SUFFIX,imageshack.us,Proxy
|
||||
- DOMAIN-SUFFIX,img.ly,Proxy
|
||||
- DOMAIN-SUFFIX,imgur.com,Proxy
|
||||
- DOMAIN-SUFFIX,imore.com,Proxy
|
||||
- DOMAIN-SUFFIX,instapaper.com,Proxy
|
||||
- DOMAIN-SUFFIX,ipn.li,Proxy
|
||||
- DOMAIN-SUFFIX,is.gd,Proxy
|
||||
- DOMAIN-SUFFIX,issuu.com,Proxy
|
||||
- DOMAIN-SUFFIX,itgonglun.com,Proxy
|
||||
- DOMAIN-SUFFIX,itun.es,Proxy
|
||||
- DOMAIN-SUFFIX,ixquick.com,Proxy
|
||||
- DOMAIN-SUFFIX,j.mp,Proxy
|
||||
- DOMAIN-SUFFIX,js.revsci.net,Proxy
|
||||
- DOMAIN-SUFFIX,jshint.com,Proxy
|
||||
- DOMAIN-SUFFIX,jtvnw.net,Proxy
|
||||
- DOMAIN-SUFFIX,justgetflux.com,Proxy
|
||||
- DOMAIN-SUFFIX,kat.cr,Proxy
|
||||
- DOMAIN-SUFFIX,klip.me,Proxy
|
||||
- DOMAIN-SUFFIX,libsyn.com,Proxy
|
||||
- DOMAIN-SUFFIX,linode.com,Proxy
|
||||
- DOMAIN-SUFFIX,lithium.com,Proxy
|
||||
- DOMAIN-SUFFIX,littlehj.com,Proxy
|
||||
- DOMAIN-SUFFIX,live.com,Proxy
|
||||
- DOMAIN-SUFFIX,live.net,Proxy
|
||||
- DOMAIN-SUFFIX,livefilestore.com,Proxy
|
||||
- DOMAIN-SUFFIX,llnwd.net,Proxy
|
||||
- DOMAIN-SUFFIX,macid.co,Proxy
|
||||
- DOMAIN-SUFFIX,macromedia.com,Proxy
|
||||
- DOMAIN-SUFFIX,macrumors.com,Proxy
|
||||
- DOMAIN-SUFFIX,mashable.com,Proxy
|
||||
- DOMAIN-SUFFIX,mathjax.org,Proxy
|
||||
- DOMAIN-SUFFIX,medium.com,Proxy
|
||||
- DOMAIN-SUFFIX,mega.co.nz,Proxy
|
||||
- DOMAIN-SUFFIX,mega.nz,Proxy
|
||||
- DOMAIN-SUFFIX,megaupload.com,Proxy
|
||||
- DOMAIN-SUFFIX,microsofttranslator.com,Proxy
|
||||
- DOMAIN-SUFFIX,mindnode.com,Proxy
|
||||
- DOMAIN-SUFFIX,mobile01.com,Proxy
|
||||
- DOMAIN-SUFFIX,modmyi.com,Proxy
|
||||
- DOMAIN-SUFFIX,msedge.net,Proxy
|
||||
- DOMAIN-SUFFIX,myfontastic.com,Proxy
|
||||
- DOMAIN-SUFFIX,name.com,Proxy
|
||||
- DOMAIN-SUFFIX,nextmedia.com,Proxy
|
||||
- DOMAIN-SUFFIX,nsstatic.net,Proxy
|
||||
- DOMAIN-SUFFIX,nssurge.com,Proxy
|
||||
- DOMAIN-SUFFIX,nyt.com,Proxy
|
||||
- DOMAIN-SUFFIX,nytimes.com,Proxy
|
||||
- DOMAIN-SUFFIX,omnigroup.com,Proxy
|
||||
- DOMAIN-SUFFIX,onedrive.com,Proxy
|
||||
- DOMAIN-SUFFIX,onenote.com,Proxy
|
||||
- DOMAIN-SUFFIX,ooyala.com,Proxy
|
||||
- DOMAIN-SUFFIX,openvpn.net,Proxy
|
||||
- DOMAIN-SUFFIX,openwrt.org,Proxy
|
||||
- DOMAIN-SUFFIX,orkut.com,Proxy
|
||||
- DOMAIN-SUFFIX,osxdaily.com,Proxy
|
||||
- DOMAIN-SUFFIX,outlook.com,Proxy
|
||||
- DOMAIN-SUFFIX,ow.ly,Proxy
|
||||
- DOMAIN-SUFFIX,paddleapi.com,Proxy
|
||||
- DOMAIN-SUFFIX,parallels.com,Proxy
|
||||
- DOMAIN-SUFFIX,parse.com,Proxy
|
||||
- DOMAIN-SUFFIX,pdfexpert.com,Proxy
|
||||
- DOMAIN-SUFFIX,periscope.tv,Proxy
|
||||
- DOMAIN-SUFFIX,pinboard.in,Proxy
|
||||
- DOMAIN-SUFFIX,pinterest.com,Proxy
|
||||
- DOMAIN-SUFFIX,pixelmator.com,Proxy
|
||||
- DOMAIN-SUFFIX,pixiv.net,Proxy
|
||||
- DOMAIN-SUFFIX,playpcesor.com,Proxy
|
||||
- DOMAIN-SUFFIX,playstation.com,Proxy
|
||||
- DOMAIN-SUFFIX,playstation.com.hk,Proxy
|
||||
- DOMAIN-SUFFIX,playstation.net,Proxy
|
||||
- DOMAIN-SUFFIX,playstationnetwork.com,Proxy
|
||||
- DOMAIN-SUFFIX,pushwoosh.com,Proxy
|
||||
- DOMAIN-SUFFIX,rime.im,Proxy
|
||||
- DOMAIN-SUFFIX,servebom.com,Proxy
|
||||
- DOMAIN-SUFFIX,sfx.ms,Proxy
|
||||
- DOMAIN-SUFFIX,shadowsocks.org,Proxy
|
||||
- DOMAIN-SUFFIX,sharethis.com,Proxy
|
||||
- DOMAIN-SUFFIX,shazam.com,Proxy
|
||||
- DOMAIN-SUFFIX,skype.com,Proxy
|
||||
- DOMAIN-SUFFIX,smartdnsProxy.com,Proxy
|
||||
- DOMAIN-SUFFIX,smartmailcloud.com,Proxy
|
||||
- DOMAIN-SUFFIX,sndcdn.com,Proxy
|
||||
- DOMAIN-SUFFIX,sony.com,Proxy
|
||||
- DOMAIN-SUFFIX,soundcloud.com,Proxy
|
||||
- DOMAIN-SUFFIX,sourceforge.net,Proxy
|
||||
- DOMAIN-SUFFIX,spotify.com,Proxy
|
||||
- DOMAIN-SUFFIX,squarespace.com,Proxy
|
||||
- DOMAIN-SUFFIX,sstatic.net,Proxy
|
||||
- DOMAIN-SUFFIX,st.luluku.pw,Proxy
|
||||
- DOMAIN-SUFFIX,stackoverflow.com,Proxy
|
||||
- DOMAIN-SUFFIX,startpage.com,Proxy
|
||||
- DOMAIN-SUFFIX,staticflickr.com,Proxy
|
||||
- DOMAIN-SUFFIX,steamcommunity.com,Proxy
|
||||
- DOMAIN-SUFFIX,symauth.com,Proxy
|
||||
- DOMAIN-SUFFIX,symcb.com,Proxy
|
||||
- DOMAIN-SUFFIX,symcd.com,Proxy
|
||||
- DOMAIN-SUFFIX,tapbots.com,Proxy
|
||||
- DOMAIN-SUFFIX,tapbots.net,Proxy
|
||||
- DOMAIN-SUFFIX,tdesktop.com,Proxy
|
||||
- DOMAIN-SUFFIX,techcrunch.com,Proxy
|
||||
- DOMAIN-SUFFIX,techsmith.com,Proxy
|
||||
- DOMAIN-SUFFIX,thepiratebay.org,Proxy
|
||||
- DOMAIN-SUFFIX,theverge.com,Proxy
|
||||
- DOMAIN-SUFFIX,time.com,Proxy
|
||||
- DOMAIN-SUFFIX,timeinc.net,Proxy
|
||||
- DOMAIN-SUFFIX,tiny.cc,Proxy
|
||||
- DOMAIN-SUFFIX,tinypic.com,Proxy
|
||||
- DOMAIN-SUFFIX,tmblr.co,Proxy
|
||||
- DOMAIN-SUFFIX,todoist.com,Proxy
|
||||
- DOMAIN-SUFFIX,trello.com,Proxy
|
||||
- DOMAIN-SUFFIX,trustasiassl.com,Proxy
|
||||
- DOMAIN-SUFFIX,tumblr.co,Proxy
|
||||
- DOMAIN-SUFFIX,tumblr.com,Proxy
|
||||
- DOMAIN-SUFFIX,tweetdeck.com,Proxy
|
||||
- DOMAIN-SUFFIX,tweetmarker.net,Proxy
|
||||
- DOMAIN-SUFFIX,twitch.tv,Proxy
|
||||
- DOMAIN-SUFFIX,txmblr.com,Proxy
|
||||
- DOMAIN-SUFFIX,typekit.net,Proxy
|
||||
- DOMAIN-SUFFIX,ubertags.com,Proxy
|
||||
- DOMAIN-SUFFIX,ublock.org,Proxy
|
||||
- DOMAIN-SUFFIX,ubnt.com,Proxy
|
||||
- DOMAIN-SUFFIX,ulyssesapp.com,Proxy
|
||||
- DOMAIN-SUFFIX,urchin.com,Proxy
|
||||
- DOMAIN-SUFFIX,usertrust.com,Proxy
|
||||
- DOMAIN-SUFFIX,v.gd,Proxy
|
||||
- DOMAIN-SUFFIX,vimeo.com,Proxy
|
||||
- DOMAIN-SUFFIX,vimeocdn.com,Proxy
|
||||
- DOMAIN-SUFFIX,vine.co,Proxy
|
||||
- DOMAIN-SUFFIX,vivaldi.com,Proxy
|
||||
- DOMAIN-SUFFIX,vox-cdn.com,Proxy
|
||||
- DOMAIN-SUFFIX,vsco.co,Proxy
|
||||
- DOMAIN-SUFFIX,vultr.com,Proxy
|
||||
- DOMAIN-SUFFIX,w.org,Proxy
|
||||
- DOMAIN-SUFFIX,w3schools.com,Proxy
|
||||
- DOMAIN-SUFFIX,webtype.com,Proxy
|
||||
- DOMAIN-SUFFIX,wikiwand.com,Proxy
|
||||
- DOMAIN-SUFFIX,wikileaks.org,Proxy
|
||||
- DOMAIN-SUFFIX,wikimedia.org,Proxy
|
||||
- DOMAIN-SUFFIX,wikipedia.com,Proxy
|
||||
- DOMAIN-SUFFIX,wikipedia.org,Proxy
|
||||
- DOMAIN-SUFFIX,windows.com,Proxy
|
||||
- DOMAIN-SUFFIX,windows.net,Proxy
|
||||
- DOMAIN-SUFFIX,wire.com,Proxy
|
||||
- DOMAIN-SUFFIX,wordpress.com,Proxy
|
||||
- DOMAIN-SUFFIX,workflowy.com,Proxy
|
||||
- DOMAIN-SUFFIX,wp.com,Proxy
|
||||
- DOMAIN-SUFFIX,wsj.com,Proxy
|
||||
- DOMAIN-SUFFIX,wsj.net,Proxy
|
||||
- DOMAIN-SUFFIX,xda-developers.com,Proxy
|
||||
- DOMAIN-SUFFIX,xeeno.com,Proxy
|
||||
- DOMAIN-SUFFIX,xiti.com,Proxy
|
||||
- DOMAIN-SUFFIX,yahoo.com,Proxy
|
||||
- DOMAIN-SUFFIX,yimg.com,Proxy
|
||||
- DOMAIN-SUFFIX,ying.com,Proxy
|
||||
- DOMAIN-SUFFIX,yoyo.org,Proxy
|
||||
- DOMAIN-SUFFIX,ytimg.com,Proxy
|
||||
|
||||
# Telegram
|
||||
- DOMAIN-SUFFIX,telegra.ph,Proxy
|
||||
- DOMAIN-SUFFIX,telegram.org,Proxy
|
||||
|
||||
- IP-CIDR,91.108.56.0/22,Proxy
|
||||
- IP-CIDR,91.108.4.0/22,Proxy
|
||||
- IP-CIDR,91.108.8.0/22,Proxy
|
||||
- IP-CIDR,109.239.140.0/24,Proxy
|
||||
- IP-CIDR,149.154.160.0/20,Proxy
|
||||
- IP-CIDR,149.154.164.0/22,Proxy
|
||||
|
||||
# LAN
|
||||
- DOMAIN-SUFFIX,local,DIRECT
|
||||
- IP-CIDR,127.0.0.0/8,DIRECT
|
||||
- IP-CIDR,172.16.0.0/12,DIRECT
|
||||
- IP-CIDR,192.168.0.0/16,DIRECT
|
||||
- IP-CIDR,10.0.0.0/8,DIRECT
|
||||
- IP-CIDR,17.0.0.0/8,DIRECT
|
||||
- IP-CIDR,100.64.0.0/10,DIRECT
|
||||
|
||||
# 最终规则
|
||||
- GEOIP,CN,DIRECT
|
||||
- MATCH,Proxy
|
||||
@ -1,110 +0,0 @@
|
||||
ipset=/.91smartyun.pt/gfwlist
|
||||
ipset=/.adobe.com/gfwlist
|
||||
ipset=/.amazonaws.com/gfwlist
|
||||
ipset=/.ampproject.org/gfwlist
|
||||
ipset=/.apple.news/gfwlist
|
||||
ipset=/.aws.amazon.com/gfwlist
|
||||
ipset=/.azureedge.net/gfwlist
|
||||
ipset=/.github.com/gfwlist
|
||||
ipset=/.backpackers.com.tw/gfwlist
|
||||
ipset=/.bitfinex.com/gfwlist
|
||||
ipset=/.buzzfeed.com/gfwlist
|
||||
ipset=/.clockwise.ee/gfwlist
|
||||
ipset=/.cloudfront.net/gfwlist
|
||||
ipset=/.coindesk.com/gfwlist
|
||||
ipset=/.coinsquare.io/gfwlist
|
||||
ipset=/.cryptocompare.com/gfwlist
|
||||
ipset=/.dropboxstatic.com/gfwlist
|
||||
ipset=/.eurecom.fr/gfwlist
|
||||
ipset=/.gdax.com/gfwlist
|
||||
ipset=/.isnssdk.com/gfwlist
|
||||
ipset=/.kknews.cc/gfwlist
|
||||
ipset=/.nutaq.com/gfwlist
|
||||
ipset=/.openairinterface.org/gfwlist
|
||||
ipset=/.skype.com/gfwlist
|
||||
ipset=/.snssdk.com/gfwlist
|
||||
ipset=/.sublimetext.com/gfwlist
|
||||
ipset=/.textnow.com/gfwlist
|
||||
ipset=/.textnow.me/gfwlist
|
||||
ipset=/.trouter.io/gfwlist
|
||||
ipset=/.uploaded.net/gfwlist
|
||||
ipset=/.whatsapp.com/gfwlist
|
||||
ipset=/.whatsapp.net/gfwlist
|
||||
ipset=/.wsj.net/gfwlist
|
||||
ipset=/.google.com/gfwlist
|
||||
ipset=/.google.com.hk/gfwlist
|
||||
ipset=/.gstatic.com/gfwlist
|
||||
ipset=/.googleusercontent.com/gfwlist
|
||||
ipset=/.googlepages.com/gfwlist
|
||||
ipset=/.googlevideo.com/gfwlist
|
||||
ipset=/.googlecode.com/gfwlist
|
||||
ipset=/.googleapis.com/gfwlist
|
||||
ipset=/.googlesource.com/gfwlist
|
||||
ipset=/.googledrive.com/gfwlist
|
||||
ipset=/.ggpht.com/gfwlist
|
||||
ipset=/.youtube.com/gfwlist
|
||||
ipset=/.youtu.be/gfwlist
|
||||
ipset=/.ytimg.com/gfwlist
|
||||
ipset=/.twitter.com/gfwlist
|
||||
ipset=/.facebook.com/gfwlist
|
||||
ipset=/.fastly.net/gfwlist
|
||||
ipset=/.akamai.net/gfwlist
|
||||
ipset=/.akamaiedge.net/gfwlist
|
||||
ipset=/.akamaihd.net/gfwlist
|
||||
ipset=/.edgesuite.net/gfwlist
|
||||
ipset=/.edgekey.net/gfwlist
|
||||
server=/.91smartyun.pt/127.0.0.1#5353
|
||||
server=/.adobe.com/127.0.0.1#5353
|
||||
server=/.amazonaws.com/127.0.0.1#5353
|
||||
server=/.ampproject.org/127.0.0.1#5353
|
||||
server=/.apple.news/127.0.0.1#5353
|
||||
server=/.aws.amazon.com/127.0.0.1#5353
|
||||
server=/.azureedge.net/127.0.0.1#5353
|
||||
server=/.github.com/127.0.0.1#5353
|
||||
server=/.backpackers.com.tw/127.0.0.1#5353
|
||||
server=/.bitfinex.com/127.0.0.1#5353
|
||||
server=/.buzzfeed.com/127.0.0.1#5353
|
||||
server=/.clockwise.ee/127.0.0.1#5353
|
||||
server=/.cloudfront.net/127.0.0.1#5353
|
||||
server=/.coindesk.com/127.0.0.1#5353
|
||||
server=/.coinsquare.io/127.0.0.1#5353
|
||||
server=/.cryptocompare.com/127.0.0.1#5353
|
||||
server=/.dropboxstatic.com/127.0.0.1#5353
|
||||
server=/.eurecom.fr/127.0.0.1#5353
|
||||
server=/.gdax.com/127.0.0.1#5353
|
||||
server=/.isnssdk.com/127.0.0.1#5353
|
||||
server=/.kknews.cc/127.0.0.1#5353
|
||||
server=/.nutaq.com/127.0.0.1#5353
|
||||
server=/.openairinterface.org/127.0.0.1#5353
|
||||
server=/.skype.com/127.0.0.1#5353
|
||||
server=/.snssdk.com/127.0.0.1#5353
|
||||
server=/.sublimetext.com/127.0.0.1#5353
|
||||
server=/.textnow.com/127.0.0.1#5353
|
||||
server=/.textnow.me/127.0.0.1#5353
|
||||
server=/.trouter.io/127.0.0.1#5353
|
||||
server=/.uploaded.net/127.0.0.1#5353
|
||||
server=/.whatsapp.com/127.0.0.1#5353
|
||||
server=/.whatsapp.net/127.0.0.1#5353
|
||||
server=/.wsj.net/127.0.0.1#5353
|
||||
server=/.google.com/127.0.0.1#5353
|
||||
server=/.google.com.hk/127.0.0.1#5353
|
||||
server=/.gstatic.com/127.0.0.1#5353
|
||||
server=/.googleusercontent.com/127.0.0.1#5353
|
||||
server=/.googlepages.com/127.0.0.1#5353
|
||||
server=/.googlevideo.com/127.0.0.1#5353
|
||||
server=/.googlecode.com/127.0.0.1#5353
|
||||
server=/.googleapis.com/127.0.0.1#5353
|
||||
server=/.googlesource.com/127.0.0.1#5353
|
||||
server=/.googledrive.com/127.0.0.1#5353
|
||||
server=/.ggpht.com/127.0.0.1#5353
|
||||
server=/.youtube.com/127.0.0.1#5353
|
||||
server=/.youtu.be/127.0.0.1#5353
|
||||
server=/.ytimg.com/127.0.0.1#5353
|
||||
server=/.twitter.com/127.0.0.1#5353
|
||||
server=/.facebook.com/127.0.0.1#5353
|
||||
server=/.fastly.net/127.0.0.1#5353
|
||||
server=/.akamai.net/127.0.0.1#5353
|
||||
server=/.akamaiedge.net/127.0.0.1#5353
|
||||
server=/.akamaihd.net/127.0.0.1#5353
|
||||
server=/.edgesuite.net/127.0.0.1#5353
|
||||
server=/.edgekey.net/127.0.0.1#5353
|
||||
@ -1,192 +0,0 @@
|
||||
server=/v.youku.com/127.0.0.1#5333
|
||||
server=/api.youku.com/127.0.0.1#5333
|
||||
server=/v2.tudou.com/127.0.0.1#5333
|
||||
server=/www.tudou.com/127.0.0.1#5333
|
||||
server=/s.plcloud.music.qq.com/127.0.0.1#5333
|
||||
server=/i.y.qq.com/127.0.0.1#5333
|
||||
server=/hot.vrs.sohu.com/127.0.0.1#5333
|
||||
server=/live.tv.sohu.com/127.0.0.1#5333
|
||||
server=/pad.tv.sohu.com/127.0.0.1#5333
|
||||
server=/my.tv.sohu.com/127.0.0.1#5333
|
||||
server=/hot.vrs.letv.com/127.0.0.1#5333
|
||||
server=/data.video.qiyi.com/127.0.0.1#5333
|
||||
server=/cache.video.qiyi.com/127.0.0.1#5333
|
||||
server=/cache.vip.qiyi.com/127.0.0.1#5333
|
||||
server=/vv.video.qq.com/127.0.0.1#5333
|
||||
server=/tt.video.qq.com/127.0.0.1#5333
|
||||
server=/ice.video.qq.com/127.0.0.1#5333
|
||||
server=/tjsa.video.qq.com/127.0.0.1#5333
|
||||
server=/a10.video.qq.com/127.0.0.1#5333
|
||||
server=/xyy.video.qq.com/127.0.0.1#5333
|
||||
server=/vcq.video.qq.com/127.0.0.1#5333
|
||||
server=/vsh.video.qq.com/127.0.0.1#5333
|
||||
server=/vbj.video.qq.com/127.0.0.1#5333
|
||||
server=/bobo.video.qq.com/127.0.0.1#5333
|
||||
server=/flvs.video.qq.com/127.0.0.1#5333
|
||||
server=/bkvv.video.qq.com/127.0.0.1#5333
|
||||
server=/info.zb.qq.com/127.0.0.1#5333
|
||||
server=/geo.js.kankan.xunlei.com/127.0.0.1#5333
|
||||
server=/web-play.pptv.com/127.0.0.1#5333
|
||||
server=/web-play.pplive.cn/127.0.0.1#5333
|
||||
server=/dyn.ugc.pps.tv/127.0.0.1#5333
|
||||
server=/v.pps.tv/127.0.0.1#5333
|
||||
server=/inner.kandian.com/127.0.0.1#5333
|
||||
server=/ipservice.163.com/127.0.0.1#5333
|
||||
server=/so.open.163.com/127.0.0.1#5333
|
||||
server=/zb.s.qq.com/127.0.0.1#5333
|
||||
server=/ip.kankan.xunlei.com/127.0.0.1#5333
|
||||
server=/vxml.56.com/127.0.0.1#5333
|
||||
server=/music.sina.com.cn/127.0.0.1#5333
|
||||
server=/play.baidu.com/127.0.0.1#5333
|
||||
server=/v.iask.com/127.0.0.1#5333
|
||||
server=/tv.weibo.com/127.0.0.1#5333
|
||||
server=/wtv.v.iask.com/127.0.0.1#5333
|
||||
server=/video.sina.com.cn/127.0.0.1#5333
|
||||
server=/www.yinyuetai.com/127.0.0.1#5333
|
||||
server=/api.letv.com/127.0.0.1#5333
|
||||
server=/live.gslb.letv.com/127.0.0.1#5333
|
||||
server=/static.itv.letv.com/127.0.0.1#5333
|
||||
server=/ip.apps.cntv.cn/127.0.0.1#5333
|
||||
server=/vdn.apps.cntv.cn/127.0.0.1#5333
|
||||
server=/vdn.live.cntv.cn/127.0.0.1#5333
|
||||
server=/vip.sports.cntv.cn/127.0.0.1#5333
|
||||
server=/a.play.api.3g.youku.com/127.0.0.1#5333
|
||||
server=/i.play.api.3g.youku.com/127.0.0.1#5333
|
||||
server=/api.3g.youku.com/127.0.0.1#5333
|
||||
server=/tv.api.3g.youku.com/127.0.0.1#5333
|
||||
server=/play.api.3g.youku.com/127.0.0.1#5333
|
||||
server=/play.api.3g.tudou.com/127.0.0.1#5333
|
||||
server=/tv.api.3g.tudou.com/127.0.0.1#5333
|
||||
server=/api.3g.tudou.com/127.0.0.1#5333
|
||||
server=/api.tv.sohu.com/127.0.0.1#5333
|
||||
server=/access.tv.sohu.com/127.0.0.1#5333
|
||||
server=/iface.iqiyi.com/127.0.0.1#5333
|
||||
server=/iface2.iqiyi.com/127.0.0.1#5333
|
||||
server=/cache.m.iqiyi.com/127.0.0.1#5333
|
||||
server=/dynamic.app.m.letv.com/127.0.0.1#5333
|
||||
server=/dynamic.meizi.app.m.letv.com/127.0.0.1#5333
|
||||
server=/dynamic.search.app.m.letv.com/127.0.0.1#5333
|
||||
server=/dynamic.live.app.m.letv.com/127.0.0.1#5333
|
||||
server=/listso.m.areainfo.ppstream.com/127.0.0.1#5333
|
||||
server=/epg.api.pptv.com/127.0.0.1#5333
|
||||
server=/play.api.pptv.com/127.0.0.1#5333
|
||||
server=/m.letv.com/127.0.0.1#5333
|
||||
server=/interface.bilibili.com/127.0.0.1#5333
|
||||
server=/3g.music.qq.com/127.0.0.1#5333
|
||||
server=/mqqplayer.3g.qq.com/127.0.0.1#5333
|
||||
server=/proxy.music.qq.com/127.0.0.1#5333
|
||||
server=/proxymc.qq.com/127.0.0.1#5333
|
||||
server=/ip2.kugou.com/127.0.0.1#5333
|
||||
server=/ip.kugou.com/127.0.0.1#5333
|
||||
server=/client.api.ttpod.com/127.0.0.1#5333
|
||||
server=/mobi.kuwo.cn/127.0.0.1#5333
|
||||
server=/mobilefeedback.kugou.com/127.0.0.1#5333
|
||||
server=/tingapi.ting.baidu.com/127.0.0.1#5333
|
||||
server=/music.baidu.com/127.0.0.1#5333
|
||||
server=/serviceinfo.sdk.duomi.com/127.0.0.1#5333
|
||||
server=/music.163.com/127.0.0.1#5333
|
||||
server=/www.xiami.com/127.0.0.1#5333
|
||||
server=/spark.api.xiami.com/127.0.0.1#5333
|
||||
server=/iplocation.geo.qiyi.com/127.0.0.1#5333
|
||||
server=/sns.video.qq.com/127.0.0.1#5333
|
||||
server=/v5.pc.duomi.com/127.0.0.1#5333
|
||||
server=/tms.is.ysten.com/127.0.0.1#5333
|
||||
server=/internal.check.duokanbox.com/127.0.0.1#5333
|
||||
server=/openapi.youku.com/127.0.0.1#5333
|
||||
server=/y.qq.com/127.0.0.1#5333
|
||||
ipset=/v.youku.com/oversea
|
||||
ipset=/api.youku.com/oversea
|
||||
ipset=/v2.tudou.com/oversea
|
||||
ipset=/www.tudou.com/oversea
|
||||
ipset=/s.plcloud.music.qq.com/oversea
|
||||
ipset=/i.y.qq.com/oversea
|
||||
ipset=/hot.vrs.sohu.com/oversea
|
||||
ipset=/live.tv.sohu.com/oversea
|
||||
ipset=/pad.tv.sohu.com/oversea
|
||||
ipset=/my.tv.sohu.com/oversea
|
||||
ipset=/hot.vrs.letv.com/oversea
|
||||
ipset=/data.video.qiyi.com/oversea
|
||||
ipset=/cache.video.qiyi.com/oversea
|
||||
ipset=/cache.vip.qiyi.com/oversea
|
||||
ipset=/vv.video.qq.com/oversea
|
||||
ipset=/tt.video.qq.com/oversea
|
||||
ipset=/ice.video.qq.com/oversea
|
||||
ipset=/tjsa.video.qq.com/oversea
|
||||
ipset=/a10.video.qq.com/oversea
|
||||
ipset=/xyy.video.qq.com/oversea
|
||||
ipset=/vcq.video.qq.com/oversea
|
||||
ipset=/vsh.video.qq.com/oversea
|
||||
ipset=/vbj.video.qq.com/oversea
|
||||
ipset=/bobo.video.qq.com/oversea
|
||||
ipset=/flvs.video.qq.com/oversea
|
||||
ipset=/bkvv.video.qq.com/oversea
|
||||
ipset=/info.zb.qq.com/oversea
|
||||
ipset=/geo.js.kankan.xunlei.com/oversea
|
||||
ipset=/web-play.pptv.com/oversea
|
||||
ipset=/web-play.pplive.cn/oversea
|
||||
ipset=/dyn.ugc.pps.tv/oversea
|
||||
ipset=/v.pps.tv/oversea
|
||||
ipset=/inner.kandian.com/oversea
|
||||
ipset=/ipservice.163.com/oversea
|
||||
ipset=/so.open.163.com/oversea
|
||||
ipset=/zb.s.qq.com/oversea
|
||||
ipset=/ip.kankan.xunlei.com/oversea
|
||||
ipset=/vxml.56.com/oversea
|
||||
ipset=/music.sina.com.cn/oversea
|
||||
ipset=/play.baidu.com/oversea
|
||||
ipset=/v.iask.com/oversea
|
||||
ipset=/tv.weibo.com/oversea
|
||||
ipset=/wtv.v.iask.com/oversea
|
||||
ipset=/video.sina.com.cn/oversea
|
||||
ipset=/www.yinyuetai.com/oversea
|
||||
ipset=/api.letv.com/oversea
|
||||
ipset=/live.gslb.letv.com/oversea
|
||||
ipset=/static.itv.letv.com/oversea
|
||||
ipset=/ip.apps.cntv.cn/oversea
|
||||
ipset=/vdn.apps.cntv.cn/oversea
|
||||
ipset=/vdn.live.cntv.cn/oversea
|
||||
ipset=/vip.sports.cntv.cn/oversea
|
||||
ipset=/a.play.api.3g.youku.com/oversea
|
||||
ipset=/i.play.api.3g.youku.com/oversea
|
||||
ipset=/api.3g.youku.com/oversea
|
||||
ipset=/tv.api.3g.youku.com/oversea
|
||||
ipset=/play.api.3g.youku.com/oversea
|
||||
ipset=/play.api.3g.tudou.com/oversea
|
||||
ipset=/tv.api.3g.tudou.com/oversea
|
||||
ipset=/api.3g.tudou.com/oversea
|
||||
ipset=/api.tv.sohu.com/oversea
|
||||
ipset=/access.tv.sohu.com/oversea
|
||||
ipset=/iface.iqiyi.com/oversea
|
||||
ipset=/iface2.iqiyi.com/oversea
|
||||
ipset=/cache.m.iqiyi.com/oversea
|
||||
ipset=/dynamic.app.m.letv.com/oversea
|
||||
ipset=/dynamic.meizi.app.m.letv.com/oversea
|
||||
ipset=/dynamic.search.app.m.letv.com/oversea
|
||||
ipset=/dynamic.live.app.m.letv.com/oversea
|
||||
ipset=/listso.m.areainfo.ppstream.com/oversea
|
||||
ipset=/epg.api.pptv.com/oversea
|
||||
ipset=/play.api.pptv.com/oversea
|
||||
ipset=/m.letv.com/oversea
|
||||
ipset=/interface.bilibili.com/oversea
|
||||
ipset=/3g.music.qq.com/oversea
|
||||
ipset=/mqqplayer.3g.qq.com/oversea
|
||||
ipset=/proxy.music.qq.com/oversea
|
||||
ipset=/proxymc.qq.com/oversea
|
||||
ipset=/ip2.kugou.com/oversea
|
||||
ipset=/ip.kugou.com/oversea
|
||||
ipset=/client.api.ttpod.com/oversea
|
||||
ipset=/mobi.kuwo.cn/oversea
|
||||
ipset=/mobilefeedback.kugou.com/oversea
|
||||
ipset=/tingapi.ting.baidu.com/oversea
|
||||
ipset=/music.baidu.com/oversea
|
||||
ipset=/serviceinfo.sdk.duomi.com/oversea
|
||||
ipset=/music.163.com/oversea
|
||||
ipset=/www.xiami.com/oversea
|
||||
ipset=/spark.api.xiami.com/oversea
|
||||
ipset=/iplocation.geo.qiyi.com/oversea
|
||||
ipset=/sns.video.qq.com/oversea
|
||||
ipset=/v5.pc.duomi.com/oversea
|
||||
ipset=/tms.is.ysten.com/oversea
|
||||
ipset=/internal.check.duokanbox.com/oversea
|
||||
ipset=/openapi.youku.com/oversea
|
||||
ipset=/y.qq.com/oversea
|
||||
20
package/jsda/luci-app-clash/root/etc/config/clash
Executable file → Normal file
@ -1,11 +1,17 @@
|
||||
config clash 'config'
|
||||
option proxy_port '7892'
|
||||
option redir_port '7892'
|
||||
option http_port '7890'
|
||||
option socks_port '7891'
|
||||
option enable '0'
|
||||
option dns '0'
|
||||
option mode '0'
|
||||
option dash_port '9191'
|
||||
option dash_pass '123456'
|
||||
option auto_update '0'
|
||||
option auto_update_time '0'
|
||||
option cn_port '9090'
|
||||
option dnsserver '101.132.183.99'
|
||||
option dnsserver_d '208.67.222.222'
|
||||
option dnsmodel 'gfw'
|
||||
|
||||
option level 'info'
|
||||
option proxylan '0'
|
||||
option rejectlan '0'
|
||||
option dnsforwader '0'
|
||||
option v2ray 'https://tgbot.lbyczf.com/v2rayn2clash?url='
|
||||
option surge 'https://tgbot.lbyczf.com/surge2clash?url='
|
||||
option subcri 'clash'
|
||||
@ -1,54 +0,0 @@
|
||||
91smartyun.pt
|
||||
adobe.com
|
||||
amazonaws.com
|
||||
ampproject.org
|
||||
apple.news
|
||||
aws.amazon.com
|
||||
azureedge.net
|
||||
backpackers.com.tw
|
||||
bitfinex.com
|
||||
buzzfeed.com
|
||||
clockwise.ee
|
||||
cloudfront.net
|
||||
coindesk.com
|
||||
coinsquare.io
|
||||
cryptocompare.com
|
||||
dropboxstatic.com
|
||||
eurecom.fr
|
||||
gdax.com
|
||||
isnssdk.com
|
||||
kknews.cc
|
||||
nutaq.com
|
||||
openairinterface.org
|
||||
skype.com
|
||||
snssdk.com
|
||||
sublimetext.com
|
||||
textnow.com
|
||||
textnow.me
|
||||
trouter.io
|
||||
uploaded.net
|
||||
whatsapp.com
|
||||
whatsapp.net
|
||||
wsj.net
|
||||
google.com
|
||||
google.com.hk
|
||||
gstatic.com
|
||||
googleusercontent.com
|
||||
googlepages.com
|
||||
googlevideo.com
|
||||
googlecode.com
|
||||
googleapis.com
|
||||
googlesource.com
|
||||
googledrive.com
|
||||
ggpht.com
|
||||
youtube.com
|
||||
youtu.be
|
||||
ytimg.com
|
||||
twitter.com
|
||||
facebook.com
|
||||
fastly.net
|
||||
akamai.net
|
||||
akamaiedge.net
|
||||
akamaihd.net
|
||||
edgesuite.net
|
||||
edgekey.net
|
||||
@ -1,494 +1,331 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (c) 2011-2015 OpenWrt.org
|
||||
|
||||
START=99
|
||||
STOP=15
|
||||
|
||||
|
||||
CLASH="/etc/clash/clash"
|
||||
CLASH_CONFIG="/etc/clash"
|
||||
CRON_FILE="/etc/crontabs/root"
|
||||
|
||||
USE_PROCD=1
|
||||
|
||||
PDNSD_BIN="/var/sbin/dnscache"
|
||||
|
||||
pdnsd_genconfig() {
|
||||
|
||||
DNS_SERVER=$(uci get clash.config.dnsserver 2>/dev/null)
|
||||
dnsserver_d=$(uci get clash.config.dnsserver_d 2>/dev/null)
|
||||
pdnsd_port="5353"
|
||||
dnscachee="5333"
|
||||
[ -d /var/etc ] || mkdir -p /var/etc
|
||||
|
||||
if [ ! -f /var/dnscache/pdnsd.cache ]; then
|
||||
mkdir -p /var/dnscache
|
||||
echo -ne "pd13\000\000\000\000" > /var/dnscache/pdnsd.cache
|
||||
chown -R nobody.nogroup /var/dnscache
|
||||
fi
|
||||
|
||||
cat > /var/etc/dnscache.conf <<EOF
|
||||
global {
|
||||
perm_cache=1024;
|
||||
cache_dir="/var/dnscache";
|
||||
pid_file = /var/run/dnscache.pid;
|
||||
server_ip = 0.0.0.0;
|
||||
server_port=$dnscachee;
|
||||
status_ctl = on;
|
||||
paranoid=on;
|
||||
query_method=udp_only;
|
||||
neg_domain_pol = off;
|
||||
par_queries = 400;
|
||||
min_ttl = 1h;
|
||||
max_ttl = 1w;
|
||||
timeout = 10;
|
||||
}
|
||||
|
||||
server {
|
||||
label = "routine";
|
||||
ip = $DNS_SERVER;
|
||||
timeout = 20;
|
||||
reject = 74.125.127.102,
|
||||
74.125.155.102,
|
||||
74.125.39.102,
|
||||
74.125.39.113,
|
||||
209.85.229.138,
|
||||
128.121.126.139,
|
||||
159.106.121.75,
|
||||
169.132.13.103,
|
||||
192.67.198.6,
|
||||
202.106.1.2,
|
||||
202.181.7.85,
|
||||
203.161.230.171,
|
||||
203.98.7.65,
|
||||
207.12.88.98,
|
||||
208.56.31.43,
|
||||
209.145.54.50,
|
||||
209.220.30.174,
|
||||
209.36.73.33,
|
||||
211.94.66.147,
|
||||
213.169.251.35,
|
||||
216.221.188.182,
|
||||
216.234.179.13,
|
||||
243.185.187.39,
|
||||
37.61.54.158,
|
||||
4.36.66.178,
|
||||
46.82.174.68,
|
||||
59.24.3.173,
|
||||
64.33.88.161,
|
||||
64.33.99.47,
|
||||
64.66.163.251,
|
||||
65.104.202.252,
|
||||
65.160.219.113,
|
||||
66.45.252.237,
|
||||
69.55.52.253,
|
||||
72.14.205.104,
|
||||
72.14.205.99,
|
||||
78.16.49.15,
|
||||
8.7.198.45,
|
||||
93.46.8.89,
|
||||
37.61.54.158,
|
||||
243.185.187.39,
|
||||
190.93.247.4,
|
||||
190.93.246.4,
|
||||
190.93.245.4,
|
||||
190.93.244.4,
|
||||
65.49.2.178,
|
||||
189.163.17.5,
|
||||
23.89.5.60,
|
||||
49.2.123.56,
|
||||
54.76.135.1,
|
||||
77.4.7.92,
|
||||
118.5.49.6,
|
||||
159.24.3.173,
|
||||
188.5.4.96,
|
||||
197.4.4.12,
|
||||
220.250.64.24,
|
||||
243.185.187.30,
|
||||
249.129.46.48,
|
||||
253.157.14.165;
|
||||
reject_policy = fail;
|
||||
}
|
||||
|
||||
server {
|
||||
label = "special";
|
||||
ip = $dnsserver_d;
|
||||
port = $pdnsd_port;
|
||||
proxy_only = on;
|
||||
timeout = 20;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
source {
|
||||
owner=localhost;
|
||||
// serve_aliases=on;
|
||||
file="/etc/hosts";
|
||||
}
|
||||
|
||||
rr {
|
||||
name=localhost;
|
||||
reverse=on;
|
||||
a=127.0.0.1;
|
||||
owner=localhost;
|
||||
soa=localhost,root.localhost,42,86400,900,86400,86400;
|
||||
}
|
||||
EOF
|
||||
|
||||
[ -d /var/sbin ] || mkdir -p /var/sbin
|
||||
[ -f /var/sbin/dnscache ] || cp -a /usr/sbin/pdnsd /var/sbin/dnscache
|
||||
}
|
||||
|
||||
|
||||
|
||||
start_pdnsd() {
|
||||
pdnsd_port="5353"
|
||||
dnsserver_d=$(uci get clash.config.dnsserver_d 2>/dev/null)
|
||||
local usr_dns="$1"
|
||||
local usr_port="$2"
|
||||
|
||||
|
||||
[ -z "$usr_dns" ] && usr_dns="8.8.8.8"
|
||||
[ -z "$usr_port" ] && usr_port="53"
|
||||
|
||||
[ -d /var/etc ] || mkdir -p /var/etc
|
||||
|
||||
if [ ! -d /var/pdnsd ];then
|
||||
mkdir -p /var/pdnsd
|
||||
echo -ne "pd13\000\000\000\000" >/var/pdnsd/pdnsd.cache
|
||||
chown -R nobody:nogroup /var/pdnsd
|
||||
fi
|
||||
|
||||
cat > /var/etc/pdnsd.conf <<EOF
|
||||
global {
|
||||
perm_cache=1024;
|
||||
cache_dir="/var/pdnsd";
|
||||
pid_file = /var/run/pdnsd.pid;
|
||||
run_as="nobody";
|
||||
server_ip = 0.0.0.0;
|
||||
server_port = $pdnsd_port;
|
||||
status_ctl = on;
|
||||
query_method = tcp_only;
|
||||
min_ttl=1h;
|
||||
max_ttl=1w;
|
||||
timeout=20;
|
||||
neg_domain_pol=on;
|
||||
proc_limit=2;
|
||||
procq_limit=8;
|
||||
}
|
||||
|
||||
|
||||
server {
|
||||
label= "v2-usrdns";
|
||||
ip = $usr_dns;
|
||||
port = $usr_port;
|
||||
timeout=20;
|
||||
uptest=none;
|
||||
interval=10m;
|
||||
purge_cache=off;
|
||||
}
|
||||
server {
|
||||
label= "v2-pdnsd";
|
||||
ip = $dnsserver_d;
|
||||
port = $pdnsd_port;
|
||||
timeout=20;
|
||||
uptest=none;
|
||||
interval=10m;
|
||||
purge_cache=off;
|
||||
}
|
||||
EOF
|
||||
|
||||
/usr/sbin/pdnsd -c /var/etc/pdnsd.conf -d
|
||||
|
||||
}
|
||||
|
||||
change_dns() {
|
||||
dns=$(uci get clash.config.dns 2>/dev/null)
|
||||
if [ $dns -eq 1 ]; then
|
||||
pdnsd_port="5353"
|
||||
dnscachee="5333"
|
||||
clash_port="7874"
|
||||
dns_serve1=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
|
||||
if [ $dns_serve1 ]; then
|
||||
uci del dhcp.@dnsmasq[-1].server
|
||||
fi
|
||||
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$clash_port
|
||||
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$pdnsd_port
|
||||
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$dnscachee
|
||||
uci delete dhcp.@dnsmasq[0].resolvfile
|
||||
uci set dhcp.@dnsmasq[0].noresolv=1
|
||||
uci commit dhcp
|
||||
fi
|
||||
}
|
||||
revert_dns() {
|
||||
uci del dhcp.@dnsmasq[-1].server
|
||||
#===========================================================================================================================
|
||||
dns_serve1=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
|
||||
if [ $dns_serve1 ]; then
|
||||
uci del dhcp.@dnsmasq[-1].server
|
||||
fi
|
||||
uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto
|
||||
uci set dhcp.@dnsmasq[0].noresolv=0
|
||||
uci commit dhcp
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
add_cron(){
|
||||
#===========================================================================================================================
|
||||
sed -i '/clash.log/d' $CRON_FILE
|
||||
echo '0 0 * * 0 echo "" > /tmp/clash.log' >> $CRON_FILE
|
||||
[ -n "$(grep -w "/usr/share/clash/clash.sh" $CRON_FILE)" ] && sed -i '/\/usr\/share\/clash\/clash.sh/d' $CRON_FILE
|
||||
auto=$(uci get clash.config.auto_update 2>/dev/null)
|
||||
if [ $auto -eq 1 ]; then
|
||||
[ -z "$(grep -w "/usr/share/clash/clash.sh" $CRON_FILE)" ] && echo "0 $(uci get clash.config.auto_update_time 2>/dev/null) * * * /usr/share/clash/clash.sh" >> $CRON_FILE
|
||||
[ -z "$(grep -w "/etc/init.d/clash" $CRON_FILE)" ] && echo "05 0 * * * /etc/init.d/clash restart" >> $CRON_FILE
|
||||
fi
|
||||
[ -z "$(grep -w "/usr/share/clash/update.sh" $CRON_FILE)" ] && echo "0 0 * * 0 /usr/share/clash/update.sh" >> $CRON_FILE
|
||||
crontab $CRON_FILE
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
del_cron()
|
||||
{
|
||||
del_cron(){
|
||||
#===========================================================================================================================
|
||||
sed -i '/clash/d' $CRON_FILE
|
||||
sed -i '/clash.log/d' $CRON_FILE
|
||||
/etc/init.d/cron restart
|
||||
}
|
||||
|
||||
|
||||
get_dnsmasq() {
|
||||
local pid=$(pidof dnsmasq)
|
||||
[ $? -ne 0 ] && echo "/tmp/dnsmasq.d"
|
||||
local conf_dir=$(cat /etc/dnsmasq.conf | grep conf-dir= | sed 's/.*=//')
|
||||
local conf_tmp=$(cat /proc/$pid/cmdline | grep dnsmasq.conf)
|
||||
local conf_dir_tmp=$(cat $conf_tmp | grep conf-dir= | sed 's/.*=//')
|
||||
if [ -n "$conf_dir" ]; then
|
||||
echo $conf_dir
|
||||
elif [ -n "$conf_dir_tmp" ];then
|
||||
echo $conf_dir_tmp
|
||||
else
|
||||
echo "/tmp/dnsmasq.d"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
dns_poisoning() {
|
||||
dns_model=$(uci get clash.config.dnsmodel 2>/dev/null)
|
||||
local gfw_list=/etc/clash/dnsmasq_gfwlist.conf
|
||||
local gfw_list_tmp=$dnsmasq_confdir/dnsmasq_gfwlist.conf
|
||||
local custom_forward_list=/etc/clash/custom_forward.conf
|
||||
local custom_forward_list_tmp=$dnsmasq_confdir/custom_forward.conf
|
||||
local oversea_list=/etc/clash/oversea_list.conf
|
||||
local oversea_list_tmp=$dnsmasq_confdir/oversea_list.conf
|
||||
|
||||
if [ "$(uci get clash.config.dns 2>/dev/null)" = "1" ] ;then
|
||||
local dnsstr=$(uci get clash.config.dnsserver)
|
||||
local dnsport="53"
|
||||
if [ "$dns_model" == "gfw" ]; then
|
||||
ipset add gfwlist $dnsstr 2>/dev/null
|
||||
elif [ "$dns_model" == "oversea" ]; then
|
||||
ipset add oversea $dnsstr 2>/dev/null
|
||||
fi
|
||||
start_pdnsd $dnsstr $dnsport
|
||||
pdnsd_enable_flag=1
|
||||
fi
|
||||
#start_pdnsd
|
||||
pdnsd_port="5353"
|
||||
dnscachee="5333"
|
||||
if [ "$dns_model" == "gfw" ]; then
|
||||
gfw_list_port=`grep google.co.jp /etc/clash/dnsmasq_gfwlist.conf |awk -F '#' '{print $2}'`
|
||||
if [ "$pdnsd_port" != "$gfw_list_port" ]; then
|
||||
sed -i "s/#${gfw_list_port}/#${pdnsd_port}/g" /etc/clash/dnsmasq_gfwlist.conf
|
||||
fi
|
||||
[ ! -f $gfw_list_tmp ] && {
|
||||
ln -s $gfw_list $gfw_list_tmp
|
||||
ln -s $custom_forward_list $custom_forward_list_tmp
|
||||
}
|
||||
else
|
||||
oversea_list_port=`grep v.youku.com /etc/clash/oversea_list.conf |awk -F '#' '{print $2}'`
|
||||
if [ "$dnscachee" != "$oversea_list_port" ]; then
|
||||
sed -i "s/#${oversea_list_port}/#${dnscachee}/g" /etc/clash/oversea_list.conf
|
||||
fi
|
||||
[ ! -f $oversea_list_tmp ] && {
|
||||
ln -s $oversea_list $oversea_list_tmp
|
||||
}
|
||||
fi
|
||||
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
|
||||
yml_change(){
|
||||
#===========================================================================================================================
|
||||
mode=$(uci get clash.config.mode 2>/dev/null)
|
||||
da_password=$(uci get clash.config.dash_pass 2>/dev/null)
|
||||
redir_port=$(uci get clash.config.redir_port 2>/dev/null)
|
||||
http_port=$(uci get clash.config.http_port 2>/dev/null)
|
||||
socks_port=$(uci get clash.config.socks_port 2>/dev/null)
|
||||
dash_port=$(uci get clash.config.dash_port 2>/dev/null)
|
||||
log_level=$(uci get clash.config.level 2>/dev/null)
|
||||
subtype=$(uci get clash.config.subcri 2>/dev/null)
|
||||
if [ $mode -eq 1 ]; then
|
||||
|
||||
sed -i "/Proxy:/i\#clash-openwrt" /etc/clash/config.yaml
|
||||
sed -i "/#clash-openwrt/a\#=============" /etc/clash/config.yaml
|
||||
sed -i "/#=============/a\ " /etc/clash/config.yaml
|
||||
sed -i '1,/#clash-openwrt/d' /etc/clash/config.yaml
|
||||
mv /etc/clash/config.yaml /etc/clash/dns.yaml
|
||||
cat /usr/share/clash/dns.yaml /etc/clash/dns.yaml > /etc/clash/config.yaml
|
||||
rm -rf /etc/clash/dns.yaml
|
||||
sed -i "1i\port: ${http_port}" /etc/clash/config.yaml
|
||||
sed -i "2i\socks-port: ${socks_port}" /etc/clash/config.yaml
|
||||
sed -i "3i\redir-port: ${redir_port}" /etc/clash/config.yaml
|
||||
sed -i "4i\allow-lan: true" /etc/clash/config.yaml
|
||||
sed -i "5i\mode: Rule" /etc/clash/config.yaml
|
||||
sed -i "6i\log-level: ${log_level}" /etc/clash/config.yaml
|
||||
sed -i "7i\external-controller: 0.0.0.0:${dash_port}" /etc/clash/config.yaml
|
||||
sed -i "8i\secret: '${da_password}'" /etc/clash/config.yaml
|
||||
sed -i "9i\external-ui: "/usr/share/clash/dashboard"" /etc/clash/config.yaml
|
||||
sed -i "10i\ " /etc/clash/config.yaml
|
||||
sed -i "11i\ " /etc/clash/config.yaml
|
||||
sed -i '/#=============/ d' /etc/clash/config.yaml
|
||||
|
||||
else
|
||||
if [ $subtype=="v2rayn2clash" ] || [ $subtype=="surge2clash" ];then
|
||||
sed -i "/Proxy:/i\#clash-openwrt" /etc/clash/config.yaml
|
||||
sed -i "/#clash-openwrt/a\#=============" /etc/clash/config.yaml
|
||||
sed -i "/#=============/a\ " /etc/clash/config.yaml
|
||||
sed -i '1,/#clash-openwrt/d' /etc/clash/config.yaml
|
||||
mv /etc/clash/config.yaml /etc/clash/dns.yaml
|
||||
cat /usr/share/clash/dns.yaml /etc/clash/dns.yaml > /etc/clash/config.yaml
|
||||
rm -rf /etc/clash/dns.yaml
|
||||
else
|
||||
sed -i "/dns:/i\#clash-openwrt" /etc/clash/config.yaml
|
||||
sed -i "/#clash-openwrt/a\#=============" /etc/clash/config.yaml
|
||||
sed -i '1,/#clash-openwrt/d' /etc/clash/config.yaml
|
||||
fi
|
||||
sed -i "1i\port: ${http_port}" /etc/clash/config.yaml
|
||||
sed -i "2i\socks-port: ${socks_port}" /etc/clash/config.yaml
|
||||
sed -i "3i\redir-port: ${redir_port}" /etc/clash/config.yaml
|
||||
sed -i "4i\allow-lan: true" /etc/clash/config.yaml
|
||||
sed -i "5i\mode: Rule" /etc/clash/config.yaml
|
||||
sed -i "6i\log-level: ${log_level}" /etc/clash/config.yaml
|
||||
sed -i "7i\external-controller: 0.0.0.0:${dash_port}" /etc/clash/config.yaml
|
||||
sed -i "8i\secret: '${da_password}'" /etc/clash/config.yaml
|
||||
sed -i "9i\external-ui: "/usr/share/clash/dashboard"" /etc/clash/config.yaml
|
||||
sed -i "10i\ " /etc/clash/config.yaml
|
||||
sed -i "11i\ " /etc/clash/config.yaml
|
||||
sed -i '/#=============/ d' /etc/clash/config.yaml
|
||||
|
||||
sed -i '/redir-port:/ d' /etc/clash/config.yml 2>/dev/null
|
||||
sed -i "2i\redir-port: ${proxy_port}" /etc/clash/config.yml
|
||||
|
||||
|
||||
sed -i '/log-level:/ d' /etc/clash/config.yml 2>/dev/null
|
||||
sed -i "4i\log-level: info" /etc/clash/config.yml
|
||||
sed -i '/fallback:/ d' /etc/clash/config.yml 2>/dev/null
|
||||
|
||||
da_password=$(uci get clash.config.dashboard_password 2>/dev/null)
|
||||
sed -i '/secret:/ d' /etc/clash/config.yml 2>/dev/null
|
||||
sed -i "/dns:/i\secret: '${da_password}'" /etc/clash/config.yml
|
||||
|
||||
cn_port=$(uci get clash.config.cn_port 2>/dev/null)
|
||||
sed -i '/external-controller:/ d' /etc/clash/config.yml 2>/dev/null
|
||||
sed -i "/secret:/i\external-controller: 0.0.0.0:$cn_port" /etc/clash/config.yml
|
||||
|
||||
grep dns: /etc/clash/config.yml >/dev/null 2>&1
|
||||
if [ "$?" -ne "0" ]; then
|
||||
sed -i "/Proxy:/i\dns:" /etc/clash/config.yml
|
||||
sed -i "/dns:/a\ enable: true" /etc/clash/config.yml
|
||||
sed -i "/enable: true/a\ ipv6: false" /etc/clash/config.yml
|
||||
sed -i "/ipv6: false/a\ listen: 0.0.0.0:7874" /etc/clash/config.yml
|
||||
sed -i "/listen: 0.0.0.0:7874/a\ enhanced-mode: redir-host" /etc/clash/config.yml
|
||||
sed -i "/enhanced-mode: redir-host/a\ nameserver:" /etc/clash/config.yml
|
||||
sed -i "/nameserver:/a\ - 114.114.114.114" /etc/clash/config.yml
|
||||
sed -i "/114.114.114.114/a\ - 119.29.29.29" /etc/clash/config.yml
|
||||
sed -i "/119.29.29.29/a\ - 223.5.5.5" /etc/clash/config.yml
|
||||
sed -i "/223.5.5.5/a\ fallback:" /etc/clash/config.yml
|
||||
sed -i "/fallback:/a\ - tls://dns.rubyfish.cn:853" /etc/clash/config.yml
|
||||
sed -i "/dns.rubyfish.cn:853/a\ - tls://1.1.1.1:853" /etc/clash/config.yml
|
||||
sed -i "/1.1.1.1:853/a\ - tcp://208.67.222.222:443" /etc/clash/config.yml
|
||||
sed -i "/208.67.222.222:443/a\ - tls://dns.google" /etc/clash/config.yml
|
||||
fi
|
||||
|
||||
allow_lan=`grep allow-lan: /etc/clash/config.yml |awk -F ' ' '{print $2}'`
|
||||
allow_lan_r=$(echo $allow_lan |tr [a-z] [A-Z])
|
||||
if [ $allow_lan_r == "FALSE" ]; then
|
||||
sed -i '/allow-lan:/ d' /etc/clash/config.yml
|
||||
sed -i "4i\allow-lan: true" /etc/clash/config.yml
|
||||
fi
|
||||
fi
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
|
||||
yml_dns_change(){
|
||||
dns=$(uci get clash.config.dns 2>/dev/null)
|
||||
if [ $dns -eq 1 ]; then
|
||||
dns_port=`grep listen: /etc/clash/config.yml |awk -F ':' '{print $3}' |tr -cd "[0-9]"`
|
||||
if [ $dns_port -ne 7874 ]; then
|
||||
sed -i '/listen:/ d' /etc/clash/config.yml
|
||||
sed -i "/nameserver:/i\ listen: 0.0.0.0:7874" /etc/clash/config.yml
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
yml_dns_change(){
|
||||
#===========================================================================================================================
|
||||
dns_port=$(grep listen: /etc/clash/config.yaml |awk -F ':' '{print $3}' |tr -cd "[0-9]")
|
||||
dnsforwader=$(uci get clash.config.dnsforwader 2>/dev/null)
|
||||
|
||||
|
||||
if [ $dns -ne 1 ]; then
|
||||
dns_port=`grep listen: /etc/clash/config.yml |awk -F ':' '{print $3}' |tr -cd "[0-9]"`
|
||||
if [ $dns_port -eq 53 ]; then
|
||||
sed -i '/listen:/ d' /etc/clash/config.yaml
|
||||
sed -i "/nameserver:/i\ listen: 0.0.0.0:5300" /etc/clash/config.yaml
|
||||
fi
|
||||
|
||||
if [ $dnsforwader -eq 1 ]; then
|
||||
if [ $dns_port -eq 53 ]; then
|
||||
sed -i '/-127.0.0.1:/ d' /etc/clash/config.yml
|
||||
sed -i '/listen:/ d' /etc/clash/config.yml
|
||||
sed -i "/nameserver:/i\ listen: 0.0.0.0:7874" /etc/clash/config.yml
|
||||
clash_port="7874"
|
||||
dns_serve1=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
|
||||
if [ $dns_serve1 ]; then
|
||||
uci del dhcp.@dnsmasq[-1].server
|
||||
fi
|
||||
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$clash_port
|
||||
uci delete dhcp.@dnsmasq[0].resolvfile
|
||||
uci set dhcp.@dnsmasq[0].noresolv=1
|
||||
uci commit dhcp
|
||||
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#5300 >/dev/null 2>&1
|
||||
uci delete dhcp.@dnsmasq[0].resolvfile
|
||||
uci set dhcp.@dnsmasq[0].noresolv=1
|
||||
uci commit dhcp
|
||||
else
|
||||
dns_serve1=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
|
||||
if [ $dns_serve1 ]; then
|
||||
uci del dhcp.@dnsmasq[-1].server
|
||||
fi
|
||||
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$dns_port
|
||||
uci delete dhcp.@dnsmasq[0].resolvfile
|
||||
uci set dhcp.@dnsmasq[0].noresolv=1
|
||||
uci commit dhcp
|
||||
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$dns_port >/dev/null 2>&1
|
||||
uci delete dhcp.@dnsmasq[0].resolvfile
|
||||
uci set dhcp.@dnsmasq[0].noresolv=1
|
||||
uci commit dhcp
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
start_service(){
|
||||
|
||||
|
||||
|
||||
access() {
|
||||
#===========================================================================================================================
|
||||
lan_ac_ips=$(uci get clash.config.lan_ac_ips)
|
||||
ipset -! -R <<-EOF
|
||||
create clash_lan_ac hash:net
|
||||
$(for ip in $lan_ac_ips; do echo "add clash_lan_ac $ip"; done)
|
||||
EOF
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
|
||||
reject_access() {
|
||||
#===========================================================================================================================
|
||||
lan_ac=$(uci get clash.config.lan_ips)
|
||||
ipset -! -R <<-EOF
|
||||
create clash_lan hash:net
|
||||
$(for ip in $lan_ac; do echo "add clash_lan $ip"; done)
|
||||
EOF
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
|
||||
rules(){
|
||||
#===========================================================================================================================
|
||||
lan_ip=$(uci get network.lan.ipaddr 2>/dev/null)
|
||||
lanac=$(uci get clash.config.rejectlan 2>/dev/null)
|
||||
lan=$(uci get clash.config.proxylan 2>/dev/null)
|
||||
dns_port=$(grep listen: /etc/clash/config.yaml |awk -F ':' '{print $3}' |tr -cd "[0-9]")
|
||||
redir_port=$(uci get clash.config.redir_port 2>/dev/null)
|
||||
|
||||
iptables -t nat -N clash_tcp
|
||||
iptables -t nat -N clash_udp
|
||||
iptables -t nat -A clash_tcp -d 0.0.0.0/8 -j RETURN
|
||||
iptables -t nat -A clash_tcp -d 10.0.0.0/8 -j RETURN
|
||||
iptables -t nat -A clash_tcp -d 127.0.0.0/8 -j RETURN
|
||||
iptables -t nat -A clash_tcp -d 169.254.0.0/16 -j RETURN
|
||||
iptables -t nat -A clash_tcp -d 172.16.0.0/12 -j RETURN
|
||||
iptables -t nat -A clash_tcp -d 192.168.0.0/16 -j RETURN
|
||||
iptables -t nat -A clash_tcp -d 224.0.0.0/4 -j RETURN
|
||||
iptables -t nat -A clash_tcp -d 240.0.0.0/4 -j RETURN
|
||||
iptables -t nat -A clash_tcp -d $lan_ip -j RETURN
|
||||
iptables -t nat -A clash_tcp -p tcp --dport 22 -j ACCEPT
|
||||
iptables -t nat -A clash_udp -p udp -j REDIRECT --to-ports $dns_port
|
||||
if [ $lanac -eq 1 ]; then
|
||||
iptables -t nat -A clash_tcp -p tcp -m set --match-set clash_lan src -j RETURN
|
||||
iptables -t nat -A clash_tcp -p tcp -j REDIRECT --to-ports $redir_port
|
||||
elif [ $lan -eq 1 ]; then
|
||||
iptables -t nat -A clash_tcp -p tcp -m set --match-set clash_lan_ac src -j REDIRECT --to-ports $redir_port
|
||||
else
|
||||
iptables -t nat -A clash_tcp -p tcp -j REDIRECT --to-ports $redir_port
|
||||
fi
|
||||
iptables -t nat -I PREROUTING 1 -p udp --dport 53 -j clash_udp
|
||||
iptables -t nat -A PREROUTING -p tcp -j clash_tcp
|
||||
|
||||
|
||||
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
yml_yaml(){
|
||||
#===========================================================================================================================
|
||||
subscribe_url=$(uci get clash.config.subscribe_url 2>/dev/null)
|
||||
size=$(ls -l /etc/clash/config.yaml|awk '{print $5}')
|
||||
if [ -f /etc/clash/config.yml ] && [ ! -f /etc/clash/config.yaml ] || [ -f /etc/clash/config.yml ] && [ -f /etc/clash/config.yaml ] && [ $size -eq 0 ];then
|
||||
mv /etc/clash/config.yml /etc/clash/config.yaml
|
||||
elif [ ! -f /etc/clash/config.yaml ] && [ $subscribe_url ];then
|
||||
sh /usr/share/clash/clash.sh >>/tmp/clash.log >/dev/null 2>&1
|
||||
fi
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
start(){
|
||||
#===========================================================================================================================
|
||||
if pidof clash >/dev/null; then
|
||||
kill $(pidof clash) >/dev/null 2>&1 || kill -9 $(ps | grep clash | grep -v grep | awk '{print $1}') >/dev/null 2>&1
|
||||
fi
|
||||
enable=$(uci get clash.config.enable 2>/dev/null)
|
||||
yml_yaml
|
||||
size=$(ls -l /etc/clash/config.yaml|awk '{print $5}')
|
||||
lan=$(uci get clash.config.proxylan 2>/dev/null)
|
||||
lanac=$(uci get clash.config.rejectlan 2>/dev/null)
|
||||
|
||||
if [ $enable -eq 1 ]; then
|
||||
proxy_port=$(uci get clash.config.proxy_port 2>/dev/null)
|
||||
|
||||
yml_dns_change
|
||||
yml_change
|
||||
|
||||
nohup $CLASH -d "$CLASH_CONFIG" > /tmp/clash.log 2>&1 &
|
||||
|
||||
ln -s /usr/share/clash/web /www/clash
|
||||
|
||||
dns=$(uci get clash.config.dns 2>/dev/null)
|
||||
bbr=$(uci get clash.config.bbr 2>/dev/null)
|
||||
if [ $size -ne 0 ]; then
|
||||
|
||||
|
||||
if [ $lan ]; then
|
||||
access >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
if [ $lanac ]; then
|
||||
reject_access >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
yml_change
|
||||
|
||||
yml_dns_change
|
||||
|
||||
nohup $CLASH -d "$CLASH_CONFIG" > /tmp/clash.log 2>&1 &
|
||||
|
||||
if [ $dns -eq 1 ]; then
|
||||
pdnsd_genconfig
|
||||
procd_open_instance
|
||||
procd_set_param command "$PDNSD_BIN" -c /var/etc/dnscache.conf
|
||||
procd_set_param respawn
|
||||
procd_set_param stderr 1
|
||||
procd_close_instance
|
||||
dnsmasq_confdir=$(get_dnsmasq)
|
||||
dns_poisoning
|
||||
change_dns
|
||||
fi
|
||||
ln -s /usr/share/clash/web /www/clash
|
||||
|
||||
uci set firewall.@defaults[0].flow_offloading=1
|
||||
uci commit firewall
|
||||
/etc/init.d/firewall restart >/dev/null 2>&1
|
||||
|
||||
rules >/dev/null 2>&1
|
||||
|
||||
iptables -t nat -N clash
|
||||
iptables -t nat -A clash -d 0.0.0.0/8 -j RETURN
|
||||
iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN
|
||||
iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
|
||||
iptables -t nat -A clash -d 169.254.0.0/16 -j RETURN
|
||||
iptables -t nat -A clash -d 172.16.0.0/12 -j RETURN
|
||||
iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
|
||||
iptables -t nat -A clash -d 224.0.0.0/4 -j RETURN
|
||||
iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN
|
||||
killall -1 dnsmasq
|
||||
|
||||
iptables -t nat -A clash -p tcp -j REDIRECT --to-ports $proxy_port
|
||||
iptables -t nat -A clash -p udp -j REDIRECT --to-ports $proxy_port
|
||||
iptables -t nat -A PREROUTING -p tcp -j clash
|
||||
iptables -t nat -A PREROUTING -p udp -j clash
|
||||
|
||||
|
||||
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
||||
|
||||
|
||||
|
||||
if pidof clash >/dev/null; then
|
||||
add_cron
|
||||
echo "CLASH STARTED SUCCESSFULLY"
|
||||
else
|
||||
echo "CANNOT START"
|
||||
fi
|
||||
nohup /usr/share/clash/clash-watchdog.sh >/dev/null 2>&1
|
||||
|
||||
fi
|
||||
else
|
||||
echo "===============================$(date "+%Y-%m-%d %H:%M:%S") problem with config.yaml, config.yaml is either empty or not found =====================================" >> /tmp/clash.log
|
||||
|
||||
|
||||
fi
|
||||
|
||||
else
|
||||
echo "===============================$(date "+%Y-%m-%d %H:%M:%S") CLIENT IS DISABLED =====================================" >> /tmp/clash.log
|
||||
fi
|
||||
|
||||
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
|
||||
|
||||
stop_service(){
|
||||
stop(){
|
||||
#===========================================================================================================================
|
||||
iptables -t nat -F clash_tcp >/dev/null 2>&1
|
||||
iptables -t nat -X clash_tcp >/dev/null 2>&1
|
||||
iptables -t nat -F clash_udp >/dev/null 2>&1
|
||||
iptables -t nat -X clash_udp >/dev/null 2>&1
|
||||
iptables -t nat -D PREROUTING -p tcp -j clash_tcp >/dev/null 2>&1
|
||||
iptables -t nat -D PREROUTING -p udp -j clash_udp >/dev/null 2>&1
|
||||
|
||||
srulecount=`iptables -L|grep clash|wc -l`
|
||||
if [ $srulecount -gt 0 ] ;then
|
||||
iptables -t nat -F clash
|
||||
iptables -t nat -D PREROUTING -p tcp -j clash
|
||||
iptables -t nat -X clash
|
||||
fi
|
||||
ipset -! flush clash_lan_ac >/dev/null 2>&1
|
||||
ipset -! flush clash_lan >/dev/null 2>&1
|
||||
|
||||
kill -9 $(ps | grep pdnsd | grep -v grep | awk '{print $1}') >/dev/null 2>&1
|
||||
kill -9 $(ps | grep clash-watchdog.sh | grep -v grep | awk '{print $1}') >/dev/null 2>&1
|
||||
|
||||
kill -9 `pidof clash|sed "s/$//g"` 2>/dev/null
|
||||
|
||||
kill -9 `pidof clash|sed "s/$//g"` 2>/dev/null
|
||||
revert_dns
|
||||
|
||||
uci set firewall.@defaults[0].flow_offloading=1
|
||||
uci commit firewall
|
||||
/etc/init.d/firewall restart >/dev/null 2>&1
|
||||
|
||||
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
||||
|
||||
kill $(pidof dnscache) >/dev/null 2>&1 || kill -9 $(ps | grep dnscache | grep -v grep | awk '{print $1}') >/dev/null 2>&1
|
||||
rm -rf /www/clash 2> /dev/null
|
||||
|
||||
revert_dns
|
||||
|
||||
dnsmasq_confdir=$(get_dnsmasq)
|
||||
rm -rf $dnsmasq_confdir/dnsmasq_gfwlist.conf >/dev/null 2>&1
|
||||
rm -rf $dnsmasq_confdir/custom_forward.conf >/dev/null 2>&1
|
||||
rm -rf $dnsmasq_confdir/oversea_list.conf >/dev/null 2>&1
|
||||
del_cron
|
||||
|
||||
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
||||
|
||||
|
||||
rm -rf /www/clash 2> /dev/null
|
||||
rm -rf /tmp/clash.log
|
||||
|
||||
del_cron
|
||||
|
||||
echo "CLASH STOP"
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
|
||||
restart(){
|
||||
stop
|
||||
sleep 3
|
||||
start
|
||||
#===========================================================================================================================
|
||||
|
||||
if pidof clash >/dev/null; then
|
||||
stop
|
||||
sleep 2
|
||||
start
|
||||
else
|
||||
start
|
||||
fi
|
||||
|
||||
#===========================================================================================================================
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,11 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@clash[-1]
|
||||
add ucitrack clash
|
||||
set ucitrack.@clash[-1].init=clash
|
||||
commit ucitrack
|
||||
EOF
|
||||
chmod 777 /etc/init.d/clash
|
||||
rm -f /tmp/luci-indexcache
|
||||
exit 0
|
||||
10
package/jsda/luci-app-clash/root/usr/share/clash/check_version.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
if [ -f /usr/share/clash/new_version ];then
|
||||
rm -rf /usr/share/clash/new_version
|
||||
fi
|
||||
new_version=`wget -qO- "https://github.com/frainzy1477/luci-app-clash/tags"| grep "/frainzy1477/luci-app-clash/releases/tag/"| head -n 1| awk -F "/tag/v" '{print $2}'| sed 's/\">//'`
|
||||
if [ $new_version ]; then
|
||||
echo $new_version > /usr/share/clash/new_version 2>&1 & >/dev/null
|
||||
elif [ $new_version =="" ]; then
|
||||
echo 0 > /usr/share/clash/new_version 2>&1 & >/dev/null
|
||||
fi
|
||||
35
package/jsda/luci-app-clash/root/usr/share/clash/clash-watchdog.sh
Executable file
@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
|
||||
sleeptime=300
|
||||
logfile="/tmp/clash.log"
|
||||
CLASH="/etc/clash/clash"
|
||||
CLASH_CONFIG="/etc/clash"
|
||||
enable=$(uci get clash.config.enable 2>/dev/null)
|
||||
|
||||
clean_log(){
|
||||
logrow=$(grep -c "" ${logfile})
|
||||
logrow1=$(grep -c "" ${logfile1})
|
||||
if [ $logrow -ge 1000 ];then
|
||||
cat /dev/null > ${logfile}
|
||||
echo "$curtime Logs exceeded limit,cleaning logs now..!" >> ${logfile}
|
||||
fi
|
||||
|
||||
|
||||
}
|
||||
|
||||
while [ $enable -eq 1 ];
|
||||
do
|
||||
curtime=`date "+%H:%M:%S"`
|
||||
if pidof clash>/dev/null; then
|
||||
clean_log
|
||||
fi
|
||||
if ! pidof clash>/dev/null; then
|
||||
nohup $CLASH -d $CLASH_CONFIG > /tmp/clash.log 2>&1 &
|
||||
echo "$curtime Clash Is Restarting!" >> ${logfile}
|
||||
fi
|
||||
|
||||
sleep ${sleeptime}
|
||||
continue
|
||||
done
|
||||
|
||||
|
||||
@ -1,6 +1,30 @@
|
||||
#!/bin/bash
|
||||
subscribe_url=$(uci get clash.config.subscribe_url 2>/dev/null)
|
||||
subtype=$(uci get clash.config.subcri 2>/dev/null)
|
||||
urlv2ray=$(uci get clash.config.v2ray 2>/dev/null)
|
||||
urlsurge=$(uci get clash.config.surge 2>/dev/null)
|
||||
enable=$(uci get clash.config.enable 2>/dev/null)
|
||||
if pidof clash >/dev/null; then
|
||||
/etc/init.d/clash stop 2>/dev/null
|
||||
fi
|
||||
rm -rf /etc/clash/config.bak 2> /dev/null
|
||||
wget-ssl --user-agent="User-Agent: Mozilla" $subscribe_url -O 2>&1 >1 /etc/clash/config.yml
|
||||
[ "$?" -ne "0" ] && wget-ssl -O 2>&1 >1 /etc/clash/config.yml "$subscribe_url"
|
||||
if [ $subtype == "clash" ];then
|
||||
wget-ssl --user-agent="User-Agent: Mozilla" $subscribe_url -O 2>&1 >1 /etc/clash/config.yaml
|
||||
elif [ $subtype == "v2rayn2clash" ];then
|
||||
wget-ssl --user-agent="User-Agent: Mozilla" $urlv2ray.$subscribe_url -O 2>&1 >1 /etc/clash/server.yaml
|
||||
if [ -f /etc/clash/server.yaml ];then
|
||||
sed -i '/Rule:/,$d' /etc/clash/server.yaml
|
||||
cat /etc/clash/server.yaml /usr/share/clash/rule.yaml > /etc/clash/config.yaml
|
||||
fi
|
||||
elif [ $subtype == "surge2clash" ];then
|
||||
wget-ssl --user-agent="User-Agent: Mozilla" $urlsurge.$subscribe_url -O 2>&1 >1 /etc/clash/server.yaml
|
||||
if [ -f /etc/clash/server.yaml ];then
|
||||
sed -i '/Rule:/,$d' /etc/clash/server.yaml
|
||||
cat /etc/clash/server.yaml /usr/share/clash/rule.yaml > /etc/clash/config.yaml
|
||||
fi
|
||||
fi
|
||||
rm -rf /etc/clash/server.yaml 2> /dev/null
|
||||
if [ $enable -eq 1 ]; then
|
||||
[ "$?" -eq "0" ] && /etc/init.d/clash restart 2>/dev/null
|
||||
fi
|
||||
|
||||
|
||||
@ -0,0 +1 @@
|
||||
0.30.0
|
||||
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 14 KiB |
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="ltr">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<title>CLASH -DASHBOARD</title>
|
||||
<link href="main.d32d2df9dcc55f57282d.css" rel="stylesheet"></head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="text/javascript" src="js/1.bundle.d32d2df9dcc55f57282d.min.js"></script><script type="text/javascript" src="js/bundle.d32d2df9dcc55f57282d.min.js"></script></body>
|
||||
</html>
|
||||
24
package/jsda/luci-app-clash/root/usr/share/clash/dns.yaml
Normal file
@ -0,0 +1,24 @@
|
||||
#experimental:
|
||||
# ignore-resolve-fail: true
|
||||
|
||||
#local SOCKS5/HTTP(S) server
|
||||
#authentication:
|
||||
# - "user1:pass1"
|
||||
# - "user2:pass2"
|
||||
|
||||
dns:
|
||||
enable: true
|
||||
# ipv6: false
|
||||
listen: 0.0.0.0:5300
|
||||
enhanced-mode: fake-ip
|
||||
#fake-ip-range: 198.18.0.1/16
|
||||
nameserver:
|
||||
- 101.132.183.99
|
||||
- 119.29.29.29
|
||||
- 114.114.114.114
|
||||
- 114.114.115.115
|
||||
- tls://dns.rubyfish.cn:853
|
||||
- https://1.1.1.1/dns-query
|
||||
# fallback:
|
||||
# - tls://1.1.1.1:853
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
pdnsd_port="5353"
|
||||
awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"gfwlist"'\n",$0)}' /etc/config/clash_gfw.list > /etc/clash/custom_forward.conf
|
||||
awk '!/^$/&&!/^#/{printf("server=/.%s/'"127.0.0.1#$pdnsd_port"'\n",$0)}' /etc/config/clash_gfw.list >> /etc/clash/custom_forward.conf
|
||||
|
||||
8
package/jsda/luci-app-clash/root/usr/share/clash/ipdb.sh
Executable file
@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
wget-ssl --no-check-certificate --user-agent="User-Agent: Mozilla" https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz -O /tmp/ipdb.tar.gz
|
||||
if [ "$?" -eq "0" ]; then
|
||||
tar zxvf /tmp/ipdb.tar.gz -C /tmp\
|
||||
&& rm -rf /tmp/ipdb.tar.gz >/dev/null 2>&1\
|
||||
&& mv /tmp/GeoLite2-Country_*/GeoLite2-Country.mmdb /etc/clash/Country.mmdb\
|
||||
&& rm -rf /tmp/GeoLite2-Country_* >/dev/null 2>&1
|
||||
fi
|
||||
1871
package/jsda/luci-app-clash/root/usr/share/clash/rule.yaml
Normal file
@ -1,39 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
wget-ssl --no-check-certificate https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt -O /tmp/gfw.b64
|
||||
|
||||
generate_china_banned()
|
||||
{
|
||||
|
||||
cat $1 | base64 -d > /tmp/gfwlist.txt
|
||||
rm -f $1
|
||||
sed -i '/^@@|/d' /tmp/gfwlist.txt
|
||||
|
||||
cat /tmp/gfwlist.txt | sort -u |
|
||||
sed 's#!.\+##; s#|##g; s#@##g; s#http:\/\/##; s#https:\/\/##;' |
|
||||
sed '/\*/d; /apple\.com/d; /sina\.cn/d; /sina\.com\.cn/d; /baidu\.com/d; /byr\.cn/d; /jlike\.com/d; /weibo\.com/d; /zhongsou\.com/d; /youdao\.com/d; /sogou\.com/d; /so\.com/d; /soso\.com/d; /aliyun\.com/d; /taobao\.com/d; /jd\.com/d; /qq\.com/d' |
|
||||
sed '/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/d' |
|
||||
grep '^[0-9a-zA-Z\.-]\+$' | grep '\.' | sed 's#^\.\+##' | sort -u |
|
||||
awk '
|
||||
BEGIN { prev = "________"; } {
|
||||
cur = $0;
|
||||
if (index(cur, prev) == 1 && substr(cur, 1 + length(prev) ,1) == ".") {
|
||||
} else {
|
||||
print cur;
|
||||
prev = cur;
|
||||
}
|
||||
}' | sort -u
|
||||
|
||||
}
|
||||
|
||||
generate_china_banned /tmp/gfw.b64 > /tmp/gfw.txt
|
||||
rm -f /tmp/gfwlist.txt
|
||||
sed '/.*/s/.*/server=\/\.&\/127.0.0.1#5335\nipset=\/\.&\/gfwlist/' /tmp/gfw.txt >/tmp/gfwnew.txt
|
||||
rm -f /tmp/gfw.txt
|
||||
|
||||
if [ -s "/tmp/gfwnew.txt" ];then
|
||||
if ( ! cmp -s /tmp/gfwnew.txt /etc/clash/dnsmasq_gfwlist.conf );then
|
||||
mv /tmp/gfwnew.txt /etc/clash/dnsmasq_gfwlist.conf
|
||||
rm -f /tmp/gfwnew.txt
|
||||
fi
|
||||
fi
|
||||
@ -1 +0,0 @@
|
||||
yacd.haishan.me
|
||||
@ -1,19 +0,0 @@
|
||||
.C8qYV83bFf{width:100%;height:100%;display:flex;justify-content:center;align-items:center}._3ZgNvq3EI4{width:40px;height:40px;margin:10px;background-color:#ddd;border-radius:100%;-webkit-animation:_1TUw6u7qIP 1s ease-in-out infinite;animation:_1TUw6u7qIP 1s ease-in-out infinite}@-webkit-keyframes _1TUw6u7qIP{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes _1TUw6u7qIP{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}
|
||||
._1vi9X6zp__{position:fixed;top:0;bottom:0;left:0;right:0;overflow:hidden;padding:20px;background:var(--color-background);color:var(--color-text);text-align:center}._3a-vmAlkFb{color:#2a477a;opacity:.6;display:flex;justify-content:center;align-items:center;padding:40px}.PdRbGY12nx{color:var(--color-text-secondary)}.PdRbGY12nx:active,.PdRbGY12nx:hover{color:#387cec}
|
||||
._2kIwVmZrIm{background:var(--color-bg-sidebar);position:relative}.fD4vFw6Suh{display:block}._3MSOuOjw1N{display:flex;align-items:center;justify-content:center;padding:25px 0 15px;color:#2a477a;transition:color .3s ease-in-out}@media (max-width:768px){._3MSOuOjw1N{padding:0}}._3MSOuOjw1N:hover{-webkit-animation:_1_NWwXY6R9 .3s ease-in-out 0s infinite alternate;animation:_1_NWwXY6R9 .3s ease-in-out 0s infinite alternate}._3MSOuOjw1N img{width:80px;height:80px}@-webkit-keyframes _1_NWwXY6R9{0%{color:#2a477a}to{color:#1f52ac}}@keyframes _1_NWwXY6R9{0%{color:#2a477a}to{color:#1f52ac}}@media (max-width:768px){.ARkuP2UF9U{display:flex;justify-content:space-between;overflow:scroll}}._3s-CY8UZIW{color:var(--color-text);text-decoration:none;display:flex;align-items:center;padding:8px 20px}@media (max-width:768px){._3s-CY8UZIW{flex-direction:column}}._3s-CY8UZIW svg{color:var(--color-icon)}.z0TS5nXW6e{background:var(--color-sb-active-row-bg)}@media (max-width:768px){.z0TS5nXW6e{background:none;border-bottom:2px solid #387cec}}._9C_umw6HLy{padding-left:14px}@media (max-width:768px){._9C_umw6HLy{padding-left:0;padding-top:5px}}.akNaLv2foe{position:absolute;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:50px;height:50px;padding:20px 0;display:flex;justify-content:center;align-items:center}@media (max-width:768px){.akNaLv2foe{display:none}}.akNaLv2foe svg{display:block;color:var(--color-icon)}
|
||||
._3KeIuWaGkq{height:76px;display:flex;align-items:center}.dzHwHz5D1B{padding:0 40px;text-align:left;margin:0}
|
||||
._3uGf10f84P{color:var(--color-text);display:flex;align-items:center}._30JMM9GgkW,._1wybRgv0kl{padding-top:10px;padding-bottom:10px;width:200px}._30JMM9GgkW div:first-child,._1wybRgv0kl div:first-child{color:var(--color-text-secondary)}._30JMM9GgkW div:nth-child(2),._1wybRgv0kl div:nth-child(2){padding:10px 0 0;font-size:2em}._1wybRgv0kl{padding-right:20px}._30JMM9GgkW{padding-left:20px}
|
||||
._3oXtG6fVlC{padding:10px 40px}
|
||||
.wO91liFQQU{padding:0 40px 5px}.KerXKV44-V{position:relative;height:40px}._1eCIOxLbbw{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:0;width:100%}._15uzlTthxn{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2YC46TUu3I{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:10px}
|
||||
._2NcK3n4XfS{display:flex;align-items:center;flex-wrap:wrap;font-size:.9em;padding:10px}._1VGUXJPYcC{color:#eee;flex-shrink:0;text-align:center;width:66px;background:green;border-radius:5px;padding:3px 5px;margin:0 8px}.gCXzfg0oD0{flex-shrink:0;color:#999;font-size:14px}._2xrBv_irGt{flex-shrink:0;display:flex;font-family:Roboto Mono,Menlo,monospace;align-items:center;padding:8px 0;width:100%;white-space:pre;overflow:auto}._3DQv5_YG6N{margin:0;padding:0;color:var(--color-text)}._3DQv5_YG6N li,._3DQv5_YG6N li.even{background:var(--color-background)}._33sOhzRCb3{padding:10px 40px}._2vDkW41OaJ{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#2d2d30}._2vDkW41OaJ div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}.-N8zaF3LNs{opacity:.3}
|
||||
input._1HMH3rGR_r[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;background-color:#fafafa;border:1px solid #d3d3d3;border-radius:26px;box-shadow:inset 0 0 0 1px #d3d3d3;cursor:pointer;height:28px;position:relative;transition:border .25s .15s,box-shadow .25s .3s,padding .25s;width:44px;vertical-align:top}input._1HMH3rGR_r[type=checkbox]:after{background-color:#fff;border:1px solid #d3d3d3;border-radius:24px;box-shadow:inset 0 -3px 3px rgba(0,0,0,.025),0 1px 4px rgba(0,0,0,.15),0 4px 4px rgba(0,0,0,.1);content:"";display:block;height:26px;left:0;position:absolute;right:16px;top:0;transition:border .25s .15s,left .25s .1s,right .15s .175s}input._1HMH3rGR_r[type=checkbox]:checked{border-color:#047aff;box-shadow:inset 0 0 0 13px #047aff;padding-left:18px;transition:border .25s,box-shadow .25s,padding .25s .15s}input._1HMH3rGR_r[type=checkbox]:checked:after{border-color:#047aff;left:16px;right:0;transition:border .25s,left .15s .25s,right .25s .175s}
|
||||
._1hOXHPZoyT{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #525252;color:var(--color-text);background:var(--color-toggle-bg);display:flex;position:relative}._1hOXHPZoyT input{position:absolute;left:0;opacity:0}._1hOXHPZoyT label{flex:1;z-index:2;display:flex;align-items:center;justify-content:center;padding:10px 0;cursor:pointer}._2NWH7f7uzO{z-index:1;position:absolute;display:block;left:0;height:100%;transition:left .2s ease-out;background:var(--color-toggle-selected)}
|
||||
._3rwuJToU6r{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:4px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._3rwuJToU6r:focus{border-color:var(--color-focus-blue)}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
|
||||
._3WDSAUufkz{padding:10px 40px 40px}._3WDSAUufkz>div{width:360px}._1su0iUCppI{padding:16px 0}
|
||||
._1aZG3SnwLf{position:fixed;top:0;right:0;left:0;bottom:0;background:#444}._2LHk9jeQDw{outline:none;position:absolute;color:#ddd;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:#444;padding:20px;border-radius:10px}
|
||||
._2kZ6EP0GvK{position:relative;padding:10px 0}._2kZ6EP0GvK input{-webkit-appearance:none;background-color:transparent;background-image:none;border:none;border-radius:0;border-bottom:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 8px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2kZ6EP0GvK input:focus{border-color:var(--color-focus-blue)}._2kZ6EP0GvK label{position:absolute;left:8px;bottom:22px;transition:-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out;transition:transform .15s ease-in-out,-webkit-transform .15s ease-in-out;-webkit-transform-origin:0 0;transform-origin:0 0}._2kZ6EP0GvK input:focus+label,._2kZ6EP0GvK label._3w9bv5tyrV{-webkit-transform:scale(.75) translateY(-25px);transform:scale(.75) translateY(-25px)}._2kZ6EP0GvK input:focus+label{color:var(--color-focus-blue)}
|
||||
._3RK6Pn_rfX{-webkit-appearance:none;outline:none;color:var(--color-btn-fg);background:var(--color-btn-bg);border:1px solid #555;border-radius:100px;padding:6px 12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}._3RK6Pn_rfX:focus{border-color:var(--color-focus-blue)}._3RK6Pn_rfX:hover{background:#387cec;border:1px solid #387cec;color:#fff}._3RK6Pn_rfX:active{-webkit-transform:scale(.97);transform:scale(.97)}
|
||||
._3tUhhoh39M:focus{outline:none}._1jIFhvdOto{display:flex;justify-content:center;align-items:center}._1jIFhvdOto ._2AZET42BFX{color:#2d2d30;opacity:.4;transition:opacity .4s}._1jIFhvdOto ._2AZET42BFX:hover{opacity:.7}._3z12O_CR-o{padding:30px 0 10px}._2bUexeGz9_{display:flex}._2bUexeGz9_ div{flex:1 1 auto}._2bUexeGz9_ div:nth-child(2){flex-grow:0;flex-basis:120px;margin-left:10px}._2QbR27nKyF{padding:30px 0 10px;display:flex;justify-content:flex-end;align-items:center}
|
||||
._38eRjlSxqU{background:none;position:fixed;top:0;bottom:0;left:0;right:0;-webkit-transform:none;transform:none;padding:0;border-radius:0}._2laj9XLU4e{position:absolute;top:10%;left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);max-width:376px;margin:0 auto}._2cugp_ojFQ{background:#222}
|
||||
@font-face{font-family:Roboto Mono;font-style:normal;font-weight:400;src:local("Roboto Mono"),local("RobotoMono-Regular"),url(https://cdn.jsdelivr.net/npm/@hsjs/fonts@0.0.1/robotomono/v5/L0x5DF4xlVMF-BfR8bXMIjhLq3-cXbKD.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.border-bottom,.border-left,.border-top{position:relative}.border-bottom:after,.border-top:before{position:absolute;content:"";height:1px;width:100%;-webkit-transform:scaleY(.5) translateZ(0);transform:scaleY(.5) translateZ(0);left:0;right:0;background:#555}.border-left:before{position:absolute;content:"";height:100%;width:1px;-webkit-transform:scaleX(.5) translateZ(0);transform:scaleX(.5) translateZ(0);top:0;bottom:0;background:#555}.border-top:before{top:0}.border-bottom:after{bottom:0}.border-left:before{left:0}*,:after,:before{box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,PingFang SC,Microsoft YaHei,微软雅黑;margin:0;padding:0;--color-focus-blue:#1a73e8}body,body.dark{--color-background:#202020;--color-text:#ddd;--color-text-secondary:#ccc;--color-bg-sidebar:#2d2d30;--color-sb-active-row-bg:#494b4e;--color-input-bg:#2d2d30;--color-input-border:#3f3f3f;--color-toggle-bg:#353535;--color-toggle-selected:#181818;--color-icon:#c7c7c7;--color-btn-bg:#232323;--color-btn-fg:#bebebe}body.light{--color-background:#fbfbfb;--color-text:#222;--color-text-secondary:#646464;--color-bg-sidebar:#e7e7e7;--color-sb-active-row-bg:#d0d0d0;--color-input-bg:#fff;--color-input-border:silver;--color-toggle-bg:#fff;--color-toggle-selected:#d7d7d7;--color-icon:#5b5b5b;--color-btn-bg:#f4f4f4;--color-btn-fg:#101010}
|
||||
._1zCe_vGIjz{display:flex;background:var(--color-background);color:var(--color-text);min-height:300px;height:100vh}@media (max-width:768px){._1zCe_vGIjz{flex-direction:column}}._2hH5WcxSWh{flex-grow:1;overflow:auto}
|
||||
@ -1,19 +0,0 @@
|
||||
.C8qYV83bFf{width:100%;height:100%;display:flex;justify-content:center;align-items:center}._3ZgNvq3EI4{width:40px;height:40px;margin:10px;background-color:#ddd;border-radius:100%;-webkit-animation:_1TUw6u7qIP 1s ease-in-out infinite;animation:_1TUw6u7qIP 1s ease-in-out infinite}@-webkit-keyframes _1TUw6u7qIP{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes _1TUw6u7qIP{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}
|
||||
._1vi9X6zp__{position:fixed;top:0;bottom:0;left:0;right:0;overflow:hidden;padding:20px;background:var(--color-background);color:var(--color-text);text-align:center}._3a-vmAlkFb{color:#2a477a;opacity:.6;display:flex;justify-content:center;align-items:center;padding:40px}.PdRbGY12nx{color:var(--color-text-secondary)}.PdRbGY12nx:active,.PdRbGY12nx:hover{color:#387cec}
|
||||
._2kIwVmZrIm{background:var(--color-bg-sidebar);position:relative}.fD4vFw6Suh{display:block}._3MSOuOjw1N{display:flex;align-items:center;justify-content:center;padding:25px 0 15px;color:#2a477a;transition:color .3s ease-in-out}@media (max-width:768px){._3MSOuOjw1N{padding:0}}._3MSOuOjw1N:hover{-webkit-animation:_1_NWwXY6R9 .3s ease-in-out 0s infinite alternate;animation:_1_NWwXY6R9 .3s ease-in-out 0s infinite alternate}._3MSOuOjw1N img{width:80px;height:80px}@-webkit-keyframes _1_NWwXY6R9{0%{color:#2a477a}to{color:#1f52ac}}@keyframes _1_NWwXY6R9{0%{color:#2a477a}to{color:#1f52ac}}@media (max-width:768px){.ARkuP2UF9U{display:flex;justify-content:space-between;overflow:scroll}}._3s-CY8UZIW{color:var(--color-text);text-decoration:none;display:flex;align-items:center;padding:8px 20px}@media (max-width:768px){._3s-CY8UZIW{flex-direction:column}}._3s-CY8UZIW svg{color:var(--color-icon)}.z0TS5nXW6e{background:var(--color-sb-active-row-bg)}@media (max-width:768px){.z0TS5nXW6e{background:none;border-bottom:2px solid #387cec}}._9C_umw6HLy{padding-left:14px}@media (max-width:768px){._9C_umw6HLy{padding-left:0;padding-top:5px}}.akNaLv2foe{position:absolute;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:50px;height:50px;padding:20px 0;display:flex;justify-content:center;align-items:center}@media (max-width:768px){.akNaLv2foe{display:none}}.akNaLv2foe svg{display:block;color:var(--color-icon)}
|
||||
._3KeIuWaGkq{height:76px;display:flex;align-items:center}.dzHwHz5D1B{padding:0 40px;text-align:left;margin:0}
|
||||
._3uGf10f84P{color:var(--color-text);display:flex;align-items:center}._30JMM9GgkW,._1wybRgv0kl{padding-top:10px;padding-bottom:10px;width:200px}._30JMM9GgkW div:first-child,._1wybRgv0kl div:first-child{color:var(--color-text-secondary)}._30JMM9GgkW div:nth-child(2),._1wybRgv0kl div:nth-child(2){padding:10px 0 0;font-size:2em}._1wybRgv0kl{padding-right:20px}._30JMM9GgkW{padding-left:20px}
|
||||
._3oXtG6fVlC{padding:10px 40px}
|
||||
.wO91liFQQU{padding:0 40px 5px}.KerXKV44-V{position:relative;height:40px}._1eCIOxLbbw{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:0;width:100%}._15uzlTthxn{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2YC46TUu3I{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:10px}
|
||||
._2NcK3n4XfS{display:flex;align-items:center;flex-wrap:wrap;font-size:.9em;padding:10px}._1VGUXJPYcC{color:#eee;flex-shrink:0;text-align:center;width:66px;background:green;border-radius:5px;padding:3px 5px;margin:0 8px}.gCXzfg0oD0{flex-shrink:0;color:#999;font-size:14px}._2xrBv_irGt{flex-shrink:0;display:flex;font-family:Roboto Mono,Menlo,monospace;align-items:center;padding:8px 0;width:100%;white-space:pre;overflow:auto}._3DQv5_YG6N{margin:0;padding:0;color:var(--color-text)}._3DQv5_YG6N li,._3DQv5_YG6N li.even{background:var(--color-background)}._33sOhzRCb3{padding:10px 40px}._2vDkW41OaJ{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#2d2d30}._2vDkW41OaJ div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}.-N8zaF3LNs{opacity:.3}
|
||||
input._1HMH3rGR_r[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;background-color:#fafafa;border:1px solid #d3d3d3;border-radius:26px;box-shadow:inset 0 0 0 1px #d3d3d3;cursor:pointer;height:28px;position:relative;transition:border .25s .15s,box-shadow .25s .3s,padding .25s;width:44px;vertical-align:top}input._1HMH3rGR_r[type=checkbox]:after{background-color:#fff;border:1px solid #d3d3d3;border-radius:24px;box-shadow:inset 0 -3px 3px rgba(0,0,0,.025),0 1px 4px rgba(0,0,0,.15),0 4px 4px rgba(0,0,0,.1);content:"";display:block;height:26px;left:0;position:absolute;right:16px;top:0;transition:border .25s .15s,left .25s .1s,right .15s .175s}input._1HMH3rGR_r[type=checkbox]:checked{border-color:#047aff;box-shadow:inset 0 0 0 13px #047aff;padding-left:18px;transition:border .25s,box-shadow .25s,padding .25s .15s}input._1HMH3rGR_r[type=checkbox]:checked:after{border-color:#047aff;left:16px;right:0;transition:border .25s,left .15s .25s,right .25s .175s}
|
||||
._1hOXHPZoyT{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #525252;color:var(--color-text);background:var(--color-toggle-bg);display:flex;position:relative}._1hOXHPZoyT input{position:absolute;left:0;opacity:0}._1hOXHPZoyT label{flex:1;z-index:2;display:flex;align-items:center;justify-content:center;padding:10px 0;cursor:pointer}._2NWH7f7uzO{z-index:1;position:absolute;display:block;left:0;height:100%;transition:left .2s ease-out;background:var(--color-toggle-selected)}
|
||||
._3rwuJToU6r{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:4px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._3rwuJToU6r:focus{border-color:var(--color-focus-blue)}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
|
||||
._3WDSAUufkz{padding:10px 40px 40px}._3WDSAUufkz>div{width:360px}._1su0iUCppI{padding:16px 0}
|
||||
._1aZG3SnwLf{position:fixed;top:0;right:0;left:0;bottom:0;background:#444}._2LHk9jeQDw{outline:none;position:absolute;color:#ddd;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:#444;padding:20px;border-radius:10px}
|
||||
._2kZ6EP0GvK{position:relative;padding:10px 0}._2kZ6EP0GvK input{-webkit-appearance:none;background-color:transparent;background-image:none;border:none;border-radius:0;border-bottom:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 8px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2kZ6EP0GvK input:focus{border-color:var(--color-focus-blue)}._2kZ6EP0GvK label{position:absolute;left:8px;bottom:22px;transition:-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out;transition:transform .15s ease-in-out,-webkit-transform .15s ease-in-out;-webkit-transform-origin:0 0;transform-origin:0 0}._2kZ6EP0GvK input:focus+label,._2kZ6EP0GvK label._3w9bv5tyrV{-webkit-transform:scale(.75) translateY(-25px);transform:scale(.75) translateY(-25px)}._2kZ6EP0GvK input:focus+label{color:var(--color-focus-blue)}
|
||||
._3RK6Pn_rfX{-webkit-appearance:none;outline:none;color:var(--color-btn-fg);background:var(--color-btn-bg);border:1px solid #555;border-radius:100px;padding:6px 12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}._3RK6Pn_rfX:focus{border-color:var(--color-focus-blue)}._3RK6Pn_rfX:hover{background:#387cec;border:1px solid #387cec;color:#fff}._3RK6Pn_rfX:active{-webkit-transform:scale(.97);transform:scale(.97)}
|
||||
._3tUhhoh39M:focus{outline:none}._1jIFhvdOto{display:flex;justify-content:center;align-items:center}._1jIFhvdOto ._2AZET42BFX{color:#2d2d30;opacity:.4;transition:opacity .4s}._1jIFhvdOto ._2AZET42BFX:hover{opacity:.7}._3z12O_CR-o{padding:30px 0 10px}._2bUexeGz9_{display:flex}._2bUexeGz9_ div{flex:1 1 auto}._2bUexeGz9_ div:nth-child(2){flex-grow:0;flex-basis:120px;margin-left:10px}._2QbR27nKyF{padding:30px 0 10px;display:flex;justify-content:flex-end;align-items:center}
|
||||
._38eRjlSxqU{background:none;position:fixed;top:0;bottom:0;left:0;right:0;-webkit-transform:none;transform:none;padding:0;border-radius:0}._2laj9XLU4e{position:absolute;top:10%;left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);max-width:376px;margin:0 auto}._2cugp_ojFQ{background:#222}
|
||||
@font-face{font-family:Roboto Mono;font-style:normal;font-weight:400;src:local("Roboto Mono"),local("RobotoMono-Regular"),url(https://cdn.jsdelivr.net/npm/@hsjs/fonts@0.0.1/robotomono/v5/L0x5DF4xlVMF-BfR8bXMIjhLq3-cXbKD.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.border-bottom,.border-left,.border-top{position:relative}.border-bottom:after,.border-top:before{position:absolute;content:"";height:1px;width:100%;-webkit-transform:scaleY(.5) translateZ(0);transform:scaleY(.5) translateZ(0);left:0;right:0;background:#555}.border-left:before{position:absolute;content:"";height:100%;width:1px;-webkit-transform:scaleX(.5) translateZ(0);transform:scaleX(.5) translateZ(0);top:0;bottom:0;background:#555}.border-top:before{top:0}.border-bottom:after{bottom:0}.border-left:before{left:0}*,:after,:before{box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,PingFang SC,Microsoft YaHei,微软雅黑;margin:0;padding:0;--color-focus-blue:#1a73e8}body,body.dark{--color-background:#202020;--color-text:#ddd;--color-text-secondary:#ccc;--color-bg-sidebar:#2d2d30;--color-sb-active-row-bg:#494b4e;--color-input-bg:#2d2d30;--color-input-border:#3f3f3f;--color-toggle-bg:#353535;--color-toggle-selected:#181818;--color-icon:#c7c7c7;--color-btn-bg:#232323;--color-btn-fg:#bebebe}body.light{--color-background:#fbfbfb;--color-text:#222;--color-text-secondary:#646464;--color-bg-sidebar:#e7e7e7;--color-sb-active-row-bg:#d0d0d0;--color-input-bg:#fff;--color-input-border:silver;--color-toggle-bg:#fff;--color-toggle-selected:#d7d7d7;--color-icon:#5b5b5b;--color-btn-bg:#f4f4f4;--color-btn-fg:#101010}
|
||||
._1zCe_vGIjz{display:flex;background:var(--color-background);color:var(--color-text);min-height:300px;height:100vh}@media (max-width:768px){._1zCe_vGIjz{flex-direction:column}}._2hH5WcxSWh{flex-grow:1;overflow:auto}
|
||||
@ -0,0 +1,21 @@
|
||||
/*! modern-normalize | MIT License | https://github.com/sindresorhus/modern-normalize */html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}:root{-moz-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}hr{height:0}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{padding:0}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}
|
||||
._1EnK5MMInH{width:100%;height:100%;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}._39z9L5I2ao{--color1:#ddd;--size:40px;width:var(--size);height:var(--size);margin:10px;background-color:var(--color1);border-radius:100%;-webkit-animation:_1DSWK2a-pe 1s ease-in-out infinite;animation:_1DSWK2a-pe 1s ease-in-out infinite}@-webkit-keyframes _1DSWK2a-pe{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes _1DSWK2a-pe{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}
|
||||
._1rJPiLWN4s{position:fixed;top:0;bottom:0;left:0;right:0;overflow:hidden;padding:20px;background:var(--color-background);color:var(--color-text);text-align:center}._3h_IywJG1l{color:#2a477a;opacity:.6;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;padding:40px}.aXXDDfyTjE,._3h_IywJG1l{-webkit-box-align:center;align-items:center}.aXXDDfyTjE{display:-webkit-inline-box;display:inline-flex;color:var(--color-text-secondary)}.aXXDDfyTjE:active,.aXXDDfyTjE:hover{color:#387cec}.aXXDDfyTjE svg{margin-right:5px}
|
||||
._30oJwXNik9{background:var(--color-bg-sidebar);position:relative}._1SsCcpJvxN{display:block}._2r8EkOI78X{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;padding:25px 0 15px;color:#2a477a;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out}@media (max-width:768px){._2r8EkOI78X{display:none}}._2r8EkOI78X:hover{-webkit-animation:_2KRqAfqV8c .3s ease-in-out 0s infinite alternate;animation:_2KRqAfqV8c .3s ease-in-out 0s infinite alternate}._2r8EkOI78X img{width:80px;height:80px}@-webkit-keyframes _2KRqAfqV8c{0%{color:#2a477a}to{color:#1f52ac}}@keyframes _2KRqAfqV8c{0%{color:#2a477a}to{color:#1f52ac}}@media (max-width:768px){._2vUQ0Hs_C5{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;overflow:scroll}}._8mEn9Wlw1n{color:var(--color-text);text-decoration:none;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;padding:8px 20px}@media (max-width:768px){._8mEn9Wlw1n{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}}._8mEn9Wlw1n svg{color:var(--color-icon)}._1WyHmd6t6y{background:var(--color-sb-active-row-bg)}@media (max-width:768px){._1WyHmd6t6y{background:none;border-bottom:2px solid #387cec}}._2eMIYGbP9O{padding-left:14px}@media (max-width:768px){._2eMIYGbP9O{padding-left:0;padding-top:5px}}.nURY8qkFLS{--sz:50px;position:absolute;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:var(--sz);height:var(--sz);padding:20px 0;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}@media (max-width:768px){.nURY8qkFLS{display:none}}.nURY8qkFLS svg{display:block;color:var(--color-icon)}
|
||||
.SNYKRrv_2I{height:76px;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.VG1cD2OYvg{padding:0 40px;text-align:left;margin:0}
|
||||
._37kQcxVR4T{color:var(--color-text);display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}._1U3kUwas7v,.-Hr5Z5iYfF{padding-top:10px;padding-bottom:10px;width:200px}._1U3kUwas7v div:first-child,.-Hr5Z5iYfF div:first-child{color:var(--color-text-secondary)}._1U3kUwas7v div:nth-child(2),.-Hr5Z5iYfF div:nth-child(2){padding:10px 0 0;font-size:2em}.-Hr5Z5iYfF{padding-right:20px}._1U3kUwas7v{padding-left:20px}
|
||||
._2rN7aLQPCl{padding:10px 40px}
|
||||
._1u5AP7XMF9{padding:0 40px 5px}._2zeyKJDdFH{position:relative;height:40px}._3DQ7SXxKRA{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:0;width:100%}._1f-XUgRxH1{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._3PLtWxZwrd{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:10px}
|
||||
._2tpN_G7FeO{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;flex-wrap:wrap;font-size:.9em;padding:10px}._3wuPHKqO5W{color:#eee;flex-shrink:0;text-align:center;width:66px;background:green;border-radius:5px;padding:3px 5px;margin:0 8px}.IwiVCclCSC{flex-shrink:0;color:#999;font-size:14px}._3I1beKAMFt{flex-shrink:0;display:-webkit-box;display:flex;font-family:Roboto Mono,Menlo,monospace;-webkit-box-align:center;align-items:center;padding:8px 0;width:100%;white-space:pre;overflow:auto}._2MDNI6JESq{margin:0;padding:0;color:var(--color-text)}._2MDNI6JESq li,._2MDNI6JESq li.even{background:var(--color-background)}._3KX1sKJ1QD{padding:10px 40px}._19_8g6kTIV{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;color:#2d2d30}._19_8g6kTIV div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}._3ljFcrWmBC{opacity:.3}
|
||||
input.nJQwngxVo8[type=checkbox]{--white:#fff;--grey:#d3d3d3;--color-theme:#047aff;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;background-color:darken(var(--white),2%);border:1px solid var(--grey);border-radius:26px;box-shadow:inset 0 0 0 1px var(--grey);cursor:pointer;height:28px;position:relative;-webkit-transition:border .25s .15s,box-shadow .25s .3s,padding .25s;transition:border .25s .15s,box-shadow .25s .3s,padding .25s;width:44px;vertical-align:top}input.nJQwngxVo8[type=checkbox]:after{background-color:var(--white);border:1px solid var(--grey);border-radius:24px;box-shadow:inset 0 -3px 3px rgba(0,0,0,.025),0 1px 4px rgba(0,0,0,.15),0 4px 4px rgba(0,0,0,.1);content:"";display:block;height:26px;left:0;position:absolute;right:16px;top:0;-webkit-transition:border .25s .15s,left .25s .1s,right .15s .175s;transition:border .25s .15s,left .25s .1s,right .15s .175s}input.nJQwngxVo8[type=checkbox]:checked{border-color:var(--color-theme);box-shadow:inset 0 0 0 13px var(--color-theme);padding-left:18px;-webkit-transition:border .25s,box-shadow .25s,padding .25s .15s;transition:border .25s,box-shadow .25s,padding .25s .15s}input.nJQwngxVo8[type=checkbox]:checked:after{border-color:var(--color-theme);left:16px;right:0;-webkit-transition:border .25s,left .15s .25s,right .25s .175s;transition:border .25s,left .15s .25s,right .25s .175s}
|
||||
._3evbv-Ui87{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #525252;color:var(--color-text);background:var(--color-toggle-bg);display:-webkit-box;display:flex;position:relative}._3evbv-Ui87 input{position:absolute;left:0;opacity:0}._3evbv-Ui87 label{-webkit-box-flex:1;flex:1;z-index:2;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;padding:10px 0;cursor:pointer}._1ok8KIb1RH{z-index:1;position:absolute;display:block;left:0;height:100%;-webkit-transition:left .2s ease-out;transition:left .2s ease-out;background:var(--color-toggle-selected)}
|
||||
._2S85tjFa1n{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:4px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2S85tjFa1n:focus{border-color:var(--color-focus-blue)}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
|
||||
._2A0HoxnDqc{-webkit-appearance:none;outline:none;color:var(--color-btn-fg);background:var(--color-btn-bg);border:1px solid #555;border-radius:100px;padding:6px 12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}._2A0HoxnDqc:focus{border-color:var(--color-focus-blue)}._2A0HoxnDqc:hover{background:#387cec;border:1px solid #387cec;color:#fff}._2A0HoxnDqc:active{-webkit-transform:scale(.97);transform:scale(.97)}
|
||||
._2id19fefQX{display:-webkit-box;display:flex;flex-wrap:wrap}._2QQQyNTKoG{-webkit-box-flex:0;flex-grow:0;margin-right:10px;margin-bottom:10px;cursor:pointer;border:2px solid transparent}.XJkW0wZSAx{border-color:#387cec}
|
||||
._2OZZRrEL0J{padding:10px 40px 40px}._2OZZRrEL0J>div{width:360px}.lF_ZoyIdZN{padding:10px 40px 40px}.VduFBb2hWX{padding:0 40px}.VduFBb2hWX>div{border-top:1px dashed #373737}._2NQoBOQcGA{padding:16px 0}
|
||||
.ctrHyq7uir{position:fixed;top:0;right:0;left:0;bottom:0;background:#444;z-index:1024}._17mHpKiOUD{outline:none;position:absolute;color:#ddd;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:#444;padding:20px;border-radius:10px}
|
||||
._1r-KsYFNaj{position:relative;padding:10px 0}._1r-KsYFNaj input{-webkit-appearance:none;background-color:initial;background-image:none;border:none;border-radius:0;border-bottom:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 8px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._1r-KsYFNaj input:focus{border-color:var(--color-focus-blue)}._1r-KsYFNaj label{position:absolute;left:8px;bottom:22px;-webkit-transition:-webkit-transform .15s ease-in-out;transition:-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out;transition:transform .15s ease-in-out,-webkit-transform .15s ease-in-out;-webkit-transform-origin:0 0;transform-origin:0 0}._1r-KsYFNaj input:focus+label,._1r-KsYFNaj label.Hn6h5kxOg7{-webkit-transform:scale(.75) translateY(-25px);transform:scale(.75) translateY(-25px)}._1r-KsYFNaj input:focus+label{color:var(--color-focus-blue)}
|
||||
._3hz7LVhvUv:focus{outline:none}._3HF-KB9mgO{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}._3HF-KB9mgO ._3HzgPICn91{color:#2d2d30;opacity:.4;-webkit-transition:opacity .4s;transition:opacity .4s}._3HF-KB9mgO ._3HzgPICn91:hover{opacity:.7}._1wpZuvoD5I{padding:30px 0 10px}.L7jTy-EFJ2{display:-webkit-box;display:flex}.L7jTy-EFJ2 div{-webkit-box-flex:1;flex:1 1 auto}.L7jTy-EFJ2 div:nth-child(2){-webkit-box-flex:0;flex-grow:0;flex-basis:120px;margin-left:10px}._2fehqRU9GV{padding:30px 0 10px;display:-webkit-box;display:flex;-webkit-box-pack:end;justify-content:flex-end;-webkit-box-align:center;align-items:center}
|
||||
._3D3ZNp4oBz{background:none;position:fixed;top:0;bottom:0;left:0;right:0;-webkit-transform:none;transform:none;padding:0;border-radius:0}.tgH3yv-xGR{position:absolute;top:10%;left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);max-width:376px;margin:0 auto}._3MMuzHtwZL{background:#222}
|
||||
@font-face{font-family:Roboto Mono;font-style:normal;font-weight:400;src:local("Roboto Mono"),local("RobotoMono-Regular"),url(https://cdn.jsdelivr.net/npm/@hsjs/fonts@0.0.1/robotomono/v5/L0x5DF4xlVMF-BfR8bXMIjhLq3-cXbKD.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.border-bottom,.border-left,.border-top{position:relative}.border-top:before{top:0}.border-bottom:after,.border-top:before{position:absolute;content:"";height:1px;width:100%;-webkit-transform:scaleY(.5) translateZ(0);transform:scaleY(.5) translateZ(0);left:0;right:0;background:#555}.border-bottom:after{bottom:0}.border-left:before{position:absolute;content:"";height:100%;width:1px;-webkit-transform:scaleX(.5) translateZ(0);transform:scaleX(.5) translateZ(0);top:0;bottom:0;background:#555;left:0}*,:after,:before{box-sizing:border-box}:root{--font-mono:"Roboto Mono",Menlo,monospace;--color-focus-blue:#1a73e8}body{font-family:Merriweather Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,PingFang SC,Microsoft YaHei,微软雅黑;margin:0;padding:0}body,body.dark{--color-background:#202020;--color-text:#ddd;--color-text-secondary:#ccc;--color-bg-sidebar:#2d2d30;--color-sb-active-row-bg:#494b4e;--color-input-bg:#2d2d30;--color-input-border:#3f3f3f;--color-toggle-bg:#353535;--color-toggle-selected:#181818;--color-icon:#c7c7c7;--color-btn-bg:#232323;--color-btn-fg:#bebebe;--color-bg-proxy-selected:#303030}body.light{--color-background:#fbfbfb;--color-text:#222;--color-text-secondary:#646464;--color-bg-sidebar:#e7e7e7;--color-sb-active-row-bg:#d0d0d0;--color-input-bg:#fff;--color-input-border:silver;--color-toggle-bg:#fff;--color-toggle-selected:#d7d7d7;--color-icon:#5b5b5b;--color-btn-bg:#f4f4f4;--color-btn-fg:#101010;--color-bg-proxy-selected:#cfcfcf}
|
||||
._35EMVy62Je{display:-webkit-box;display:flex;background:var(--color-background);color:var(--color-text);min-height:300px;height:100vh}@media (max-width:768px){._35EMVy62Je{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}}.AwL8oIubvP{-webkit-box-flex:1;flex-grow:1;overflow:auto}
|
||||
@ -1 +0,0 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{RnhZ:function(s,j,a){var e={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function n(s){var j=r(s);return a(j)}function r(s){if(!a.o(e,s)){var j=new Error("Cannot find module '"+s+"'");throw j.code="MODULE_NOT_FOUND",j}return e[s]}n.keys=function(){return Object.keys(e)},n.resolve=r,s.exports=n,n.id="RnhZ"}}]);
|
||||
27
package/jsda/luci-app-clash/root/usr/share/clash/web/index.html
Executable file → Normal file
@ -7,34 +7,29 @@
|
||||
<link rel="icon" type="image/png" sizes="128x128" href="yacd-128.png">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name=viewport content="width=device-width, initial-scale=1">
|
||||
<meta name="application-name" content="yacd">
|
||||
<meta name="description" content="Yet Another Clash Dashboard">
|
||||
<meta name="theme-color" content="#202020">
|
||||
<title>Clash Dashboard</title>
|
||||
<meta name="application-name" content="YACD">
|
||||
<meta name="description" content="YACD">
|
||||
<meta name="theme-color" content="#fff000">
|
||||
<title>YAC - DASHBOARD</title>
|
||||
<link rel="prefetch" href="https://cdn.jsdelivr.net/npm/@hsjs/fonts@0.0.1/robotomono/v5/L0x5DF4xlVMF-BfR8bXMIjhLq3-cXbKD.woff2">
|
||||
<meta property="og:image" content="https://user-images.githubusercontent.com/1166872/47304841-536f3d80-d65a-11e8-8908-1917127dafc5.png">
|
||||
<meta property="og:site_name" content="yacd">
|
||||
<meta property="og:type" content="object">
|
||||
<meta property="og:title" content="yacd">
|
||||
<meta property="og:description" content="Yet Another Clash Dashboard">
|
||||
<link rel="prefetch" href="https://fonts.loli.net/css?family=Merriweather+Sans:400,700&display=swap" rel="stylesheet">
|
||||
|
||||
|
||||
|
||||
<link href="vendors~app.cda11fd699c21032bf33.css" rel="stylesheet">
|
||||
|
||||
<link href="app.0cf7eee065d397bd5720.css" rel="stylesheet">
|
||||
<link href="app.5a1265735d78e67da9fe.css" rel="stylesheet">
|
||||
|
||||
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
||||
|
||||
<script src="runtime~app.13adcd71fa0e99de437e.js" type="text/javascript"></script>
|
||||
<script src="runtime~app.dc7b6d94c7fe054b4bce.js" type="text/javascript"></script>
|
||||
|
||||
<script src="react~app.74ee4d30468cbf4a5d2c.js" type="text/javascript"></script>
|
||||
<script src="core-js~app.b0e192aa2040bbc66d02.js" type="text/javascript"></script>
|
||||
|
||||
<script src="vendors~app.1bf29b22ff4581af4265.js" type="text/javascript"></script>
|
||||
<script src="react~app.6097406f382313d294e3.js" type="text/javascript"></script>
|
||||
|
||||
<script src="app.7d03376b2a8f5f8f7dd3.js" type="text/javascript"></script>
|
||||
<script src="app.6cc7f04cc66718dd2c90.js" type="text/javascript"></script>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
@ -1,4 +0,0 @@
|
||||
._1T7fQAsbpR{border-radius:20px;margin:10px 0;padding:3px 0;color:#eee}
|
||||
._2vOEjYlEyC{position:relative;height:90px}._3mJtqp4Lr3{position:absolute;bottom:0;left:20%;display:flex;align-items:center;justify-content:center}._3dXrm7UHsc{position:absolute;top:0;left:0;width:100%;height:100%}._2j1gEiL0Iq{width:100%;padding-right:20px;overflow:hidden;text-overflow:ellipsis;margin:10px 0;font-size:1.1em}
|
||||
._1dDKqDiB1I>h2{margin-top:0}._1dDKqDiB1I>h2 span:nth-child(2){font-size:12px;color:#777;font-weight:400;margin:0 .3em}._3aqhlBsrD_{display:flex;flex-wrap:wrap}._2r-ecUmPW9{width:300px;padding:10px 5px;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}._2r-ecUmPW9._1tU2opfYtb{cursor:pointer}._2r-ecUmPW9._1tU2opfYtb:hover{-webkit-transform:scale(1.1);transform:scale(1.1)}
|
||||
._10FuALZoAk{padding:10px 40px}.tZaEoW-_A6{position:fixed;right:20px;bottom:20px}
|
||||
@ -0,0 +1,4 @@
|
||||
._2V-RqIAl7n{border-radius:20px;padding:3px 0;color:#eee}
|
||||
.NpfXwxWAxo{position:relative;padding:10px;border-radius:10px;background-color:var(--color-bg-proxy-selected)}.NpfXwxWAxo._2zD7drviYH{background-color:var(--color-focus-blue);color:#ddd}._1rVl-Kdmss{font-family:var(--font-mono)}._3kdi5nima5{width:100%;overflow:hidden;text-overflow:ellipsis;margin-bottom:5px;font-size:1.1em}._12JM32OJa5{height:30px;display:-webkit-box;display:flex;-webkit-box-align:end;align-items:flex-end}
|
||||
._3PCSxT0l14>h2{margin-top:0}._3PCSxT0l14>h2 span:nth-child(2){font-size:12px;color:#777;font-weight:400;margin:0 .3em}._1yYRIyvlRd{display:-webkit-box;display:flex;flex-wrap:wrap}._1OcDlvlM5R{max-width:280px;min-width:150px;margin:10px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}._1OcDlvlM5R._3oAxPKtZFv{cursor:pointer}._1OcDlvlM5R._3oAxPKtZFv:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px)}
|
||||
.pWc1mov26e{padding-bottom:50px}._1myfcMimT9{padding:10px 40px}._1khaX45NQe{position:fixed;z-index:1;right:20px;bottom:20px}
|
||||
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{D46e:function(e,a,t){e.exports={header:"_3PCSxT0l14",list:"_1yYRIyvlRd",proxy:"_1OcDlvlM5R",proxySelectable:"_3oAxPKtZFv"}},FWZb:function(e,a,t){e.exports={proxy:"NpfXwxWAxo",now:"_2zD7drviYH",proxyType:"_1rVl-Kdmss",proxyName:"_3kdi5nima5",proxyLatencyWrap:"_12JM32OJa5"}},L5YO:function(e,a,t){e.exports={body:"pWc1mov26e",group:"_1myfcMimT9",fabgrp:"_1khaX45NQe"}},RbL9:function(e,a,t){e.exports={proxyLatency:"_2V-RqIAl7n"}},wyCT:function(e,a,t){"use strict";t.r(a);var n=t("o0o1"),r=t.n(n),c=t("HaE+"),o=t("q1tI"),l=t.n(o),s=t("u4Dv"),p=t("DKqX"),m=t("rePB"),i=t("17x9"),u=t.n(i),y=t("TSYQ"),b=t.n(y),x=t("RbL9"),d=t.n(x),f={good:"#67C23A",normal:"#E6A23C",bad:"#F56C6C",na:"#909399"};function v(e){var a=e.latency,t=a.number,n=a.error,r=Object(o.useMemo)(function(){return function(e,a){return""!==a?f.na:e<200?f.good:e<400?f.normal:f.bad}(t,n)},[t,n]);return l.a.createElement("span",{className:d.a.proxyLatency,style:{color:r}},""!==n?l.a.createElement("span",null,n):l.a.createElement("span",null,t," ms"))}v.propTypes={latency:u.a.shape({number:u.a.number,error:u.a.string})};var E=t("FWZb"),O=t.n(E),w=t("EQlU"),N=function(e){return{proxies:Object(w.d)(e),delay:Object(w.c)(e)}};function j(e){var a=e.now,t=e.name,n=Object(s.c)(N),r=n.proxies,c=n.delay[t],o=r[t];return l.a.createElement("div",{className:b()(O.a.proxy,Object(m.a)({},O.a.now,a))},l.a.createElement("div",{className:O.a.proxyName},t),l.a.createElement("div",{className:O.a.proxyType,style:{opacity:a?.6:.2}},o.type),l.a.createElement("div",{className:O.a.proxyLatencyWrap},c?l.a.createElement(v,{latency:c}):null))}j.propTypes={now:u.a.bool,name:u.a.string};var g=j,h=t("D46e"),_=t.n(h),T=function(e){return{proxies:Object(w.d)(e)}};function k(e){var a=e.name,t=Object(s.c)(T).proxies,n=Object(s.b)({switchProxy:w.g}),r=t[a],c=r.all;return l.a.createElement("div",{className:_.a.group},l.a.createElement("div",{className:_.a.header},l.a.createElement("h2",null,l.a.createElement("span",null,a),l.a.createElement("span",null,r.type))),l.a.createElement("div",{className:_.a.list},c.map(function(e){var t="Selector"===r.type,c=b()(_.a.proxy,Object(m.a)({},_.a.proxySelectable,t));return l.a.createElement("div",{className:c,key:e,onClick:function(){t&&n.switchProxy(a,e)}},l.a.createElement(g,{isSelectable:t,name:e,now:e===r.now}))})))}k.propTypes={name:u.a.string};var L=t("5Wrh"),C=t("L5YO"),D=t.n(C);t.d(a,"default",function(){return W});var P=function(e){return{proxies:Object(w.d)(e),groupNames:Object(w.e)(e)}},A={fetchProxies:w.b,requestDelayAll:w.f};function W(){var e=Object(s.b)(A),a=e.fetchProxies,t=e.requestDelayAll;Object(o.useEffect)(function(){Object(c.a)(r.a.mark(function e(){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,a();case 2:case"end":return e.stop()}},e)}))()},[a,t]);var n=Object(s.c)(P).groupNames;return l.a.createElement(l.a.Fragment,null,l.a.createElement(p.a,{title:"Proxies"}),l.a.createElement("div",{className:D.a.body},l.a.createElement("div",{className:D.a.fabgrp},l.a.createElement(L.a,{label:"Test Latency",onClick:t})),n.map(function(e){return l.a.createElement("div",{className:D.a.group,key:e},l.a.createElement(k,{name:e}))})))}}}]);
|
||||
@ -0,0 +1,2 @@
|
||||
._3eSLieOhVX{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;padding:10px 40px}._2n1pW09UvV{width:40px;padding-right:15px;color:var(--color-text-secondary);opacity:.4}.t1XJIwvW7A{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;font-size:12px;opacity:.8}._1fNf8kj0HA{padding:10px 0;font-family:Roboto Mono,Menlo,monospace;font-size:19px}._3yJmN0tON0{width:110px}
|
||||
._2Tux7NhweE{position:fixed;right:20px;bottom:20px}
|
||||
@ -1,2 +0,0 @@
|
||||
.UMp7OzQg3G{display:flex;align-items:center;padding:10px 40px}._1Eb-khMrK9{width:40px;padding-right:15px;color:var(--color-text-secondary);opacity:.4}._3gMUZClReX{display:flex;align-items:center;font-size:12px;opacity:.8}._1rY_DqaLoo{padding:10px 0;font-family:Roboto Mono,Menlo,monospace;font-size:19px}.xiFCTEaRmD{width:110px}
|
||||
._1NnlpS7hAZ{position:fixed;right:20px;bottom:20px}
|
||||
@ -1 +0,0 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{BVyM:function(e,t,a){"use strict";a.r(t);var n=a("ODXe"),r=a("q1tI"),c=a.n(r),l=a("u4Dv"),i=a("5Wrh"),u=a("iR1w"),s=a("DKqX"),o=a("17x9"),m=a.n(o),f=a("fSNl"),d=a.n(f),p={_default:"#59caf9",DIRECT:"#f5bc41",REJECT:"#cb3166"};function b(e){var t=e.type,a=e.payload,n=e.proxy,r=e.id,l=function(e){var t=e.proxy,a=p._default;return p[t]&&(a=p[t]),{color:a}}({proxy:n});return c.a.createElement("div",{className:d.a.rule},c.a.createElement("div",{className:d.a.left},r),c.a.createElement("div",null,c.a.createElement("div",{className:d.a.b},a),c.a.createElement("div",{className:d.a.a},c.a.createElement("div",{className:d.a.type},t),c.a.createElement("div",{className:d.a.proxy,style:l},n))))}b.propTypes={id:m.a.number,type:m.a.string,payload:m.a.string,proxy:m.a.string};var v=b,E=a("II4a"),y=a("Tvb5"),h={updateSearchText:y.f},O=Object(E.a)({mapStateToProps:function(e){return{searchText:Object(y.e)(e)}},actions:h}),x=a("Kv4h"),R=a("Jo2d"),g=a.n(R);a.d(t,"default",function(){return _});var N=30,j=function(e){return{rules:Object(y.d)(e)}},w={fetchRules:y.b,fetchRulesOnce:y.c};function T(e,t){return t[e].id}var D=Object(r.memo)(function(e){var t=e.index,a=e.style,n=e.data[t];return c.a.createElement("div",{style:a},c.a.createElement(v,n))},u.b);function _(){var e=Object(l.b)(w),t=e.fetchRulesOnce,a=e.fetchRules,o=Object(l.c)(j).rules;Object(r.useEffect)(function(){t()},[]);var m=Object(x.a)(),f=Object(n.a)(m,2),d=f[0],p=f[1];return c.a.createElement("div",null,c.a.createElement(s.a,{title:"Rules"}),c.a.createElement(O,null),c.a.createElement("div",{ref:d,style:{paddingBottom:N}},c.a.createElement(u.a,{height:p-N,width:"100%",itemCount:o.length,itemSize:80,itemData:o,itemKey:T},D)),c.a.createElement("div",{className:g.a.fabgrp},c.a.createElement(i.a,{label:"Refresh",onClick:a})))}},Jo2d:function(e,t,a){e.exports={fabgrp:"_1NnlpS7hAZ"}},fSNl:function(e,t,a){e.exports={rule:"UMp7OzQg3G",left:"_1Eb-khMrK9",a:"_3gMUZClReX",b:"_1rY_DqaLoo",type:"xiFCTEaRmD"}}}]);
|
||||
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{BVyM:function(e,t,a){"use strict";a.r(t);var n=a("ODXe"),r=a("q1tI"),c=a.n(r),l=a("u4Dv"),i=a("5Wrh"),u=a("iR1w"),s=a("DKqX"),o=a("17x9"),m=a.n(o),f=a("xrux"),d=a.n(f),p={_default:"#59caf9",DIRECT:"#f5bc41",REJECT:"#cb3166"};function v(e){var t=e.type,a=e.payload,n=e.proxy,r=e.id,l=function(e){var t=e.proxy,a=p._default;return p[t]&&(a=p[t]),{color:a}}({proxy:n});return c.a.createElement("div",{className:d.a.rule},c.a.createElement("div",{className:d.a.left},r),c.a.createElement("div",null,c.a.createElement("div",{className:d.a.b},a),c.a.createElement("div",{className:d.a.a},c.a.createElement("div",{className:d.a.type},t),c.a.createElement("div",{style:l},n))))}v.propTypes={id:m.a.number,type:m.a.string,payload:m.a.string,proxy:m.a.string};var b=v,E=a("II4a"),h=a("Tvb5"),y={updateSearchText:h.f},x=Object(E.a)({mapStateToProps:function(e){return{searchText:Object(h.e)(e)}},actions:y}),O=a("Kv4h"),j=a("mlDh"),w=a.n(j);a.d(t,"default",function(){return _});var N=30,R=function(e){return{rules:Object(h.d)(e)}},g={fetchRules:h.b,fetchRulesOnce:h.c};function T(e,t){return t[e].id}var D=Object(r.memo)(function(e){var t=e.index,a=e.style,n=e.data[t];return c.a.createElement("div",{style:a},c.a.createElement(b,n))},u.b);function _(){var e=Object(l.b)(g),t=e.fetchRulesOnce,a=e.fetchRules,o=Object(l.c)(R).rules;Object(r.useEffect)(function(){t()},[t]);var m=Object(O.a)(),f=Object(n.a)(m,2),d=f[0],p=f[1];return c.a.createElement("div",null,c.a.createElement(s.a,{title:"Rules"}),c.a.createElement(x,null),c.a.createElement("div",{ref:d,style:{paddingBottom:N}},c.a.createElement(u.a,{height:p-N,width:"100%",itemCount:o.length,itemSize:80,itemData:o,itemKey:T},D)),c.a.createElement("div",{className:w.a.fabgrp},c.a.createElement(i.a,{label:"Refresh",onClick:a})))}},mlDh:function(e,t,a){e.exports={fabgrp:"_2Tux7NhweE"}},xrux:function(e,t,a){e.exports={rule:"_3eSLieOhVX",left:"_2n1pW09UvV",a:"t1XJIwvW7A",b:"_1fNf8kj0HA",type:"_3yJmN0tON0"}}}]);
|
||||
@ -1 +0,0 @@
|
||||
!function(e){function t(t){for(var n,o,i=t[0],c=t[1],f=t[2],l=0,d=[];l<i.length;l++)o=i[l],a[o]&&d.push(a[o][0]),a[o]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(s&&s(t);d.length;)d.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var c=r[o];0!==a[c]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={5:0},a={5:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{2:1,4:1}[e]&&t.push(o[e]=new Promise(function(t,r){for(var n=({1:"chartjs",2:"proxies",4:"rules",7:"vendors~chartjs"}[e]||e)+"."+{1:"b2d521827b9653fbe51e",2:"5faba7c2002d69028d3b",4:"44a05b7877aa80c5200a",7:"e70a9b7c776e0b5915eb",8:"61b9d343bffeeca67c24"}[e]+".css",a=i.p+n,u=document.getElementsByTagName("link"),c=0;c<u.length;c++){var f=(s=u[c]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(f===n||f===a))return t()}var l=document.getElementsByTagName("style");for(c=0;c<l.length;c++){var s;if((f=(s=l[c]).getAttribute("data-href"))===n||f===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.request=n,delete o[e],d.parentNode.removeChild(d),r(u)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)}).then(function(){o[e]=0}));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise(function(t,n){r=a[e]=[t,n]});t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,i.nc&&c.setAttribute("nonce",i.nc),c.src=function(e){return i.p+""+({1:"chartjs",2:"proxies",4:"rules",7:"vendors~chartjs"}[e]||e)+"."+{1:"d91d6d554779ee39cfc5",2:"17dba4530a8b6bb3aeba",4:"4bbd50e7e2e1a499c1b6",7:"d6fcbfe2bea99b4952bf",8:"f532a0e4e50d9fed13e8"}[e]+".js"}(e),u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src,u=new Error("Loading chunk "+e+" failed.\n("+n+": "+o+")");u.type=n,u.request=o,r[1](u)}a[e]=void 0}};var f=setTimeout(function(){u({type:"timeout",target:c})},12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i.oe=function(e){throw console.error(e),e};var c=window.webpackJsonp=window.webpackJsonp||[],f=c.push.bind(c);c.push=t,c=c.slice();for(var l=0;l<c.length;l++)t(c[l]);var s=f;r()}([]);
|
||||
@ -0,0 +1 @@
|
||||
!function(e){function t(t){for(var n,o,c=t[0],l=t[1],f=t[2],s=t[3]||[],d=0,h=[];d<c.length;d++)o=c[d],a[o]&&h.push(a[o][0]),a[o]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(t),i.push.apply(i,s);h.length;)h.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var f=r[o];0!==a[f]&&(n=!1)}n&&(u.splice(t--,1),e=l(l.s=r[0]))}return 0===u.length&&(i.forEach(function(e){if(void 0===a[e]){a[e]=null;var t=document.createElement("link");l.nc&&t.setAttribute("nonce",l.nc),t.rel="prefetch",t.as="script",t.href=c(e),document.head.appendChild(t)}}),i.length=0),e}var n={},o={5:0},a={5:0},u=[],i=[];function c(e){return l.p+""+({2:"proxies",4:"rules",6:"vendors~chartjs"}[e]||e)+"."+{2:"993826afdebb153e0805",4:"6f76e629fb04fefe588a",6:"429cb8fa2f4d9b575993",7:"a322784ecacd704a28c6"}[e]+".js"}function l(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{2:1,4:1}[e]&&t.push(o[e]=new Promise(function(t,r){for(var n=({2:"proxies",4:"rules",6:"vendors~chartjs"}[e]||e)+"."+{2:"9022775a13e050c1509f",4:"1fba3c440f97fe0e3bb1",6:"7d5d6ed1822d5d0495fb",7:"80c51b1d7a5a45aaeac0"}[e]+".css",a=l.p+n,u=document.getElementsByTagName("link"),i=0;i<u.length;i++){var c=(s=u[i]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(c===n||c===a))return t()}var f=document.getElementsByTagName("style");for(i=0;i<f.length;i++){var s;if((c=(s=f[i]).getAttribute("data-href"))===n||c===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=n,delete o[e],d.parentNode.removeChild(d),r(u)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)}).then(function(){o[e]=0}));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise(function(t,n){r=a[e]=[t,n]});t.push(r[2]=n);var u,i=document.createElement("script");i.charset="utf-8",i.timeout=120,l.nc&&i.setAttribute("nonce",l.nc),i.src=c(e);var f=new Error;u=function(t){i.onerror=i.onload=null,clearTimeout(s);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;f.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",f.name="ChunkLoadError",f.type=n,f.request=o,r[1](f)}a[e]=void 0}};var s=setTimeout(function(){u({type:"timeout",target:i})},12e4);i.onerror=i.onload=u,document.head.appendChild(i)}return Promise.all(t)},l.m=e,l.c=n,l.d=function(e,t,r){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(l.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)l.d(r,n,function(t){return e[t]}.bind(null,n));return r},l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="",l.oe=function(e){throw console.error(e),e};var f=window.webpackJsonp=window.webpackJsonp||[],s=f.push.bind(f);f.push=t,f=f.slice();for(var d=0;d<f.length;d++)t(f[d]);var p=s;r()}([]);
|
||||
@ -1 +0,0 @@
|
||||
/*! modern-normalize | MIT License | https://github.com/sindresorhus/modern-normalize */html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}hr{height:0}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{padding:0}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}
|
||||
@ -1 +0,0 @@
|
||||
/*! modern-normalize | MIT License | https://github.com/sindresorhus/modern-normalize */html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}hr{height:0}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{padding:0}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}
|
||||
0
package/jsda/luci-app-clash/root/usr/share/clash/web/yacd-128.png
Executable file → Normal file
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
0
package/jsda/luci-app-clash/root/usr/share/clash/web/yacd-64.png
Executable file → Normal file
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
0
package/jsda/luci-app-clash/root/usr/share/clash/web/yacd.ico
Executable file → Normal file
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
12
package/jsda/luci-app-clash/tools/po2lmo/Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
INSTALL = install
|
||||
PREFIX = /usr/bin
|
||||
|
||||
po2lmo: src/po2lmo.o src/template_lmo.o
|
||||
$(CC) $(LDFLAGS) -o src/po2lmo src/po2lmo.o src/template_lmo.o
|
||||
|
||||
install:
|
||||
$(INSTALL) -m 755 src/po2lmo $(PREFIX)
|
||||
|
||||
clean:
|
||||
$(RM) src/po2lmo src/*.o
|
||||
BIN
package/jsda/luci-app-clash/tools/po2lmo/src/po2lmo
Normal file
247
package/jsda/luci-app-clash/tools/po2lmo/src/po2lmo.c
Normal file
@ -0,0 +1,247 @@
|
||||
/*
|
||||
* lmo - Lua Machine Objects - PO to LMO conversion tool
|
||||
*
|
||||
* Copyright (C) 2009-2012 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "template_lmo.h"
|
||||
|
||||
static void die(const char *msg)
|
||||
{
|
||||
fprintf(stderr, "Error: %s\n", msg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void usage(const char *name)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s input.po output.lmo\n", name);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void print(const void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||
{
|
||||
if( fwrite(ptr, size, nmemb, stream) == 0 )
|
||||
die("Failed to write stdout");
|
||||
}
|
||||
|
||||
static int extract_string(const char *src, char *dest, int len)
|
||||
{
|
||||
int pos = 0;
|
||||
int esc = 0;
|
||||
int off = -1;
|
||||
|
||||
for( pos = 0; (pos < strlen(src)) && (pos < len); pos++ )
|
||||
{
|
||||
if( (off == -1) && (src[pos] == '"') )
|
||||
{
|
||||
off = pos + 1;
|
||||
}
|
||||
else if( off >= 0 )
|
||||
{
|
||||
if( esc == 1 )
|
||||
{
|
||||
switch (src[pos])
|
||||
{
|
||||
case '"':
|
||||
case '\\':
|
||||
off++;
|
||||
break;
|
||||
}
|
||||
dest[pos-off] = src[pos];
|
||||
esc = 0;
|
||||
}
|
||||
else if( src[pos] == '\\' )
|
||||
{
|
||||
dest[pos-off] = src[pos];
|
||||
esc = 1;
|
||||
}
|
||||
else if( src[pos] != '"' )
|
||||
{
|
||||
dest[pos-off] = src[pos];
|
||||
}
|
||||
else
|
||||
{
|
||||
dest[pos-off] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (off > -1) ? strlen(dest) : -1;
|
||||
}
|
||||
|
||||
static int cmp_index(const void *a, const void *b)
|
||||
{
|
||||
uint32_t x = ((const lmo_entry_t *)a)->key_id;
|
||||
uint32_t y = ((const lmo_entry_t *)b)->key_id;
|
||||
|
||||
if (x < y)
|
||||
return -1;
|
||||
else if (x > y)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void print_uint32(uint32_t x, FILE *out)
|
||||
{
|
||||
uint32_t y = htonl(x);
|
||||
print(&y, sizeof(uint32_t), 1, out);
|
||||
}
|
||||
|
||||
static void print_index(void *array, int n, FILE *out)
|
||||
{
|
||||
lmo_entry_t *e;
|
||||
|
||||
qsort(array, n, sizeof(*e), cmp_index);
|
||||
|
||||
for (e = array; n > 0; n--, e++)
|
||||
{
|
||||
print_uint32(e->key_id, out);
|
||||
print_uint32(e->val_id, out);
|
||||
print_uint32(e->offset, out);
|
||||
print_uint32(e->length, out);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char line[4096];
|
||||
char key[4096];
|
||||
char val[4096];
|
||||
char tmp[4096];
|
||||
int state = 0;
|
||||
int offset = 0;
|
||||
int length = 0;
|
||||
int n_entries = 0;
|
||||
void *array = NULL;
|
||||
lmo_entry_t *entry = NULL;
|
||||
uint32_t key_id, val_id;
|
||||
|
||||
FILE *in;
|
||||
FILE *out;
|
||||
|
||||
if( (argc != 3) || ((in = fopen(argv[1], "r")) == NULL) || ((out = fopen(argv[2], "w")) == NULL) )
|
||||
usage(argv[0]);
|
||||
|
||||
memset(line, 0, sizeof(key));
|
||||
memset(key, 0, sizeof(val));
|
||||
memset(val, 0, sizeof(val));
|
||||
|
||||
while( (NULL != fgets(line, sizeof(line), in)) || (state >= 2 && feof(in)) )
|
||||
{
|
||||
if( state == 0 && strstr(line, "msgid \"") == line )
|
||||
{
|
||||
switch(extract_string(line, key, sizeof(key)))
|
||||
{
|
||||
case -1:
|
||||
die("Syntax error in msgid");
|
||||
case 0:
|
||||
state = 1;
|
||||
break;
|
||||
default:
|
||||
state = 2;
|
||||
}
|
||||
}
|
||||
else if( state == 1 || state == 2 )
|
||||
{
|
||||
if( strstr(line, "msgstr \"") == line || state == 2 )
|
||||
{
|
||||
switch(extract_string(line, val, sizeof(val)))
|
||||
{
|
||||
case -1:
|
||||
state = 4;
|
||||
break;
|
||||
default:
|
||||
state = 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(extract_string(line, tmp, sizeof(tmp)))
|
||||
{
|
||||
case -1:
|
||||
state = 2;
|
||||
break;
|
||||
default:
|
||||
strcat(key, tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( state == 3 )
|
||||
{
|
||||
switch(extract_string(line, tmp, sizeof(tmp)))
|
||||
{
|
||||
case -1:
|
||||
state = 4;
|
||||
break;
|
||||
default:
|
||||
strcat(val, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
if( state == 4 )
|
||||
{
|
||||
if( strlen(key) > 0 && strlen(val) > 0 )
|
||||
{
|
||||
key_id = sfh_hash(key, strlen(key));
|
||||
val_id = sfh_hash(val, strlen(val));
|
||||
|
||||
if( key_id != val_id )
|
||||
{
|
||||
n_entries++;
|
||||
array = realloc(array, n_entries * sizeof(lmo_entry_t));
|
||||
entry = (lmo_entry_t *)array + n_entries - 1;
|
||||
|
||||
if (!array)
|
||||
die("Out of memory");
|
||||
|
||||
entry->key_id = key_id;
|
||||
entry->val_id = val_id;
|
||||
entry->offset = offset;
|
||||
entry->length = strlen(val);
|
||||
|
||||
length = strlen(val) + ((4 - (strlen(val) % 4)) % 4);
|
||||
|
||||
print(val, length, 1, out);
|
||||
offset += length;
|
||||
}
|
||||
}
|
||||
|
||||
state = 0;
|
||||
memset(key, 0, sizeof(key));
|
||||
memset(val, 0, sizeof(val));
|
||||
}
|
||||
|
||||
memset(line, 0, sizeof(line));
|
||||
}
|
||||
|
||||
print_index(array, n_entries, out);
|
||||
|
||||
if( offset > 0 )
|
||||
{
|
||||
print_uint32(offset, out);
|
||||
fsync(fileno(out));
|
||||
fclose(out);
|
||||
}
|
||||
else
|
||||
{
|
||||
fclose(out);
|
||||
unlink(argv[2]);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
return(0);
|
||||
}
|
||||
328
package/jsda/luci-app-clash/tools/po2lmo/src/template_lmo.c
Normal file
@ -0,0 +1,328 @@
|
||||
/*
|
||||
* lmo - Lua Machine Objects - Base functions
|
||||
*
|
||||
* Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "template_lmo.h"
|
||||
|
||||
/*
|
||||
* Hash function from http://www.azillionmonkeys.com/qed/hash.html
|
||||
* Copyright (C) 2004-2008 by Paul Hsieh
|
||||
*/
|
||||
|
||||
uint32_t sfh_hash(const char *data, int len)
|
||||
{
|
||||
uint32_t hash = len, tmp;
|
||||
int rem;
|
||||
|
||||
if (len <= 0 || data == NULL) return 0;
|
||||
|
||||
rem = len & 3;
|
||||
len >>= 2;
|
||||
|
||||
/* Main loop */
|
||||
for (;len > 0; len--) {
|
||||
hash += sfh_get16(data);
|
||||
tmp = (sfh_get16(data+2) << 11) ^ hash;
|
||||
hash = (hash << 16) ^ tmp;
|
||||
data += 2*sizeof(uint16_t);
|
||||
hash += hash >> 11;
|
||||
}
|
||||
|
||||
/* Handle end cases */
|
||||
switch (rem) {
|
||||
case 3: hash += sfh_get16(data);
|
||||
hash ^= hash << 16;
|
||||
hash ^= data[sizeof(uint16_t)] << 18;
|
||||
hash += hash >> 11;
|
||||
break;
|
||||
case 2: hash += sfh_get16(data);
|
||||
hash ^= hash << 11;
|
||||
hash += hash >> 17;
|
||||
break;
|
||||
case 1: hash += *data;
|
||||
hash ^= hash << 10;
|
||||
hash += hash >> 1;
|
||||
}
|
||||
|
||||
/* Force "avalanching" of final 127 bits */
|
||||
hash ^= hash << 3;
|
||||
hash += hash >> 5;
|
||||
hash ^= hash << 4;
|
||||
hash += hash >> 17;
|
||||
hash ^= hash << 25;
|
||||
hash += hash >> 6;
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
uint32_t lmo_canon_hash(const char *str, int len)
|
||||
{
|
||||
char res[4096];
|
||||
char *ptr, prev;
|
||||
int off;
|
||||
|
||||
if (!str || len >= sizeof(res))
|
||||
return 0;
|
||||
|
||||
for (prev = ' ', ptr = res, off = 0; off < len; prev = *str, off++, str++)
|
||||
{
|
||||
if (isspace(*str))
|
||||
{
|
||||
if (!isspace(prev))
|
||||
*ptr++ = ' ';
|
||||
}
|
||||
else
|
||||
{
|
||||
*ptr++ = *str;
|
||||
}
|
||||
}
|
||||
|
||||
if ((ptr > res) && isspace(*(ptr-1)))
|
||||
ptr--;
|
||||
|
||||
return sfh_hash(res, ptr - res);
|
||||
}
|
||||
|
||||
lmo_archive_t * lmo_open(const char *file)
|
||||
{
|
||||
int in = -1;
|
||||
uint32_t idx_offset = 0;
|
||||
struct stat s;
|
||||
|
||||
lmo_archive_t *ar = NULL;
|
||||
|
||||
if (stat(file, &s) == -1)
|
||||
goto err;
|
||||
|
||||
if ((in = open(file, O_RDONLY)) == -1)
|
||||
goto err;
|
||||
|
||||
if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL)
|
||||
{
|
||||
memset(ar, 0, sizeof(*ar));
|
||||
|
||||
ar->fd = in;
|
||||
ar->size = s.st_size;
|
||||
|
||||
fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC);
|
||||
|
||||
if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED)
|
||||
goto err;
|
||||
|
||||
idx_offset = ntohl(*((const uint32_t *)
|
||||
(ar->mmap + ar->size - sizeof(uint32_t))));
|
||||
|
||||
if (idx_offset >= ar->size)
|
||||
goto err;
|
||||
|
||||
ar->index = (lmo_entry_t *)(ar->mmap + idx_offset);
|
||||
ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t);
|
||||
ar->end = ar->mmap + ar->size;
|
||||
|
||||
return ar;
|
||||
}
|
||||
|
||||
err:
|
||||
if (in > -1)
|
||||
close(in);
|
||||
|
||||
if (ar != NULL)
|
||||
{
|
||||
if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
|
||||
munmap(ar->mmap, ar->size);
|
||||
|
||||
free(ar);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void lmo_close(lmo_archive_t *ar)
|
||||
{
|
||||
if (ar != NULL)
|
||||
{
|
||||
if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
|
||||
munmap(ar->mmap, ar->size);
|
||||
|
||||
close(ar->fd);
|
||||
free(ar);
|
||||
|
||||
ar = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
lmo_catalog_t *_lmo_catalogs = NULL;
|
||||
lmo_catalog_t *_lmo_active_catalog = NULL;
|
||||
|
||||
int lmo_load_catalog(const char *lang, const char *dir)
|
||||
{
|
||||
DIR *dh = NULL;
|
||||
char pattern[16];
|
||||
char path[PATH_MAX];
|
||||
struct dirent *de = NULL;
|
||||
|
||||
lmo_archive_t *ar = NULL;
|
||||
lmo_catalog_t *cat = NULL;
|
||||
|
||||
if (!lmo_change_catalog(lang))
|
||||
return 0;
|
||||
|
||||
if (!dir || !(dh = opendir(dir)))
|
||||
goto err;
|
||||
|
||||
if (!(cat = malloc(sizeof(*cat))))
|
||||
goto err;
|
||||
|
||||
memset(cat, 0, sizeof(*cat));
|
||||
|
||||
snprintf(cat->lang, sizeof(cat->lang), "%s", lang);
|
||||
snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang);
|
||||
|
||||
while ((de = readdir(dh)) != NULL)
|
||||
{
|
||||
if (!fnmatch(pattern, de->d_name, 0))
|
||||
{
|
||||
snprintf(path, sizeof(path), "%s/%s", dir, de->d_name);
|
||||
ar = lmo_open(path);
|
||||
|
||||
if (ar)
|
||||
{
|
||||
ar->next = cat->archives;
|
||||
cat->archives = ar;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
closedir(dh);
|
||||
|
||||
cat->next = _lmo_catalogs;
|
||||
_lmo_catalogs = cat;
|
||||
|
||||
if (!_lmo_active_catalog)
|
||||
_lmo_active_catalog = cat;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
if (dh) closedir(dh);
|
||||
if (cat) free(cat);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int lmo_change_catalog(const char *lang)
|
||||
{
|
||||
lmo_catalog_t *cat;
|
||||
|
||||
for (cat = _lmo_catalogs; cat; cat = cat->next)
|
||||
{
|
||||
if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
|
||||
{
|
||||
_lmo_active_catalog = cat;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash)
|
||||
{
|
||||
unsigned int m, l, r;
|
||||
uint32_t k;
|
||||
|
||||
l = 0;
|
||||
r = ar->length - 1;
|
||||
|
||||
while (1)
|
||||
{
|
||||
m = l + ((r - l) / 2);
|
||||
|
||||
if (r < l)
|
||||
break;
|
||||
|
||||
k = ntohl(ar->index[m].key_id);
|
||||
|
||||
if (k == hash)
|
||||
return &ar->index[m];
|
||||
|
||||
if (k > hash)
|
||||
{
|
||||
if (!m)
|
||||
break;
|
||||
|
||||
r = m - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
l = m + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int lmo_translate(const char *key, int keylen, char **out, int *outlen)
|
||||
{
|
||||
uint32_t hash;
|
||||
lmo_entry_t *e;
|
||||
lmo_archive_t *ar;
|
||||
|
||||
if (!key || !_lmo_active_catalog)
|
||||
return -2;
|
||||
|
||||
hash = lmo_canon_hash(key, keylen);
|
||||
|
||||
for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
|
||||
{
|
||||
if ((e = lmo_find_entry(ar, hash)) != NULL)
|
||||
{
|
||||
*out = ar->mmap + ntohl(e->offset);
|
||||
*outlen = ntohl(e->length);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void lmo_close_catalog(const char *lang)
|
||||
{
|
||||
lmo_archive_t *ar, *next;
|
||||
lmo_catalog_t *cat, *prev;
|
||||
|
||||
for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next)
|
||||
{
|
||||
if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
|
||||
{
|
||||
if (prev)
|
||||
prev->next = cat->next;
|
||||
else
|
||||
_lmo_catalogs = cat->next;
|
||||
|
||||
for (ar = cat->archives; ar; ar = next)
|
||||
{
|
||||
next = ar->next;
|
||||
lmo_close(ar);
|
||||
}
|
||||
|
||||
free(cat);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
92
package/jsda/luci-app-clash/tools/po2lmo/src/template_lmo.h
Normal file
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* lmo - Lua Machine Objects - General header
|
||||
*
|
||||
* Copyright (C) 2009-2012 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef _TEMPLATE_LMO_H_
|
||||
#define _TEMPLATE_LMO_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fnmatch.h>
|
||||
#include <dirent.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
|
||||
#if (defined(__GNUC__) && defined(__i386__))
|
||||
#define sfh_get16(d) (*((const uint16_t *) (d)))
|
||||
#else
|
||||
#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
|
||||
+(uint32_t)(((const uint8_t *)(d))[0]) )
|
||||
#endif
|
||||
|
||||
|
||||
struct lmo_entry {
|
||||
uint32_t key_id;
|
||||
uint32_t val_id;
|
||||
uint32_t offset;
|
||||
uint32_t length;
|
||||
} __attribute__((packed));
|
||||
|
||||
typedef struct lmo_entry lmo_entry_t;
|
||||
|
||||
|
||||
struct lmo_archive {
|
||||
int fd;
|
||||
int length;
|
||||
uint32_t size;
|
||||
lmo_entry_t *index;
|
||||
char *mmap;
|
||||
char *end;
|
||||
struct lmo_archive *next;
|
||||
};
|
||||
|
||||
typedef struct lmo_archive lmo_archive_t;
|
||||
|
||||
|
||||
struct lmo_catalog {
|
||||
char lang[6];
|
||||
struct lmo_archive *archives;
|
||||
struct lmo_catalog *next;
|
||||
};
|
||||
|
||||
typedef struct lmo_catalog lmo_catalog_t;
|
||||
|
||||
|
||||
uint32_t sfh_hash(const char *data, int len);
|
||||
uint32_t lmo_canon_hash(const char *data, int len);
|
||||
|
||||
lmo_archive_t * lmo_open(const char *file);
|
||||
void lmo_close(lmo_archive_t *ar);
|
||||
|
||||
|
||||
extern lmo_catalog_t *_lmo_catalogs;
|
||||
extern lmo_catalog_t *_lmo_active_catalog;
|
||||
|
||||
int lmo_load_catalog(const char *lang, const char *dir);
|
||||
int lmo_change_catalog(const char *lang);
|
||||
int lmo_translate(const char *key, int keylen, char **out, int *outlen);
|
||||
void lmo_close_catalog(const char *lang);
|
||||
|
||||
#endif
|
||||