From 28d0f3451910022ad3769f72928b2b3de8cd0370 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sun, 19 Jan 2020 11:39:26 +0800 Subject: [PATCH] luci-app-clash: sync with upstream source --- package/jsda/luci-app-clash/Makefile | 3 +- .../luasrc/controller/clash.lua | 57 ++++++- .../luasrc/model/cbi/clash/cusconfig.lua | 7 + .../luasrc/model/cbi/clash/dns.lua | 48 ------ .../luasrc/model/cbi/clash/geoip.lua | 141 ++++++++++++++++++ .../luasrc/model/cbi/clash/groups.lua | 2 +- .../model/cbi/clash/provider-config.lua | 2 +- .../luasrc/model/cbi/clash/subconfig.lua | 6 + .../luasrc/model/cbi/clash/upconfig.lua | 8 + .../luasrc/model/cbi/clash/update.lua | 63 +++++++- .../luasrc/view/clash/geoip.htm | 77 ++++++++++ package/jsda/luci-app-clash/po/zh-cn/clash.po | 95 +++++++++++- .../jsda/luci-app-clash/root/etc/init.d/clash | 86 +++++++++-- .../root/usr/share/clash/core_download.sh | 2 +- .../root/usr/share/clash/del_servers.sh | 19 +++ .../root/usr/share/clash/geoip.sh | 26 ++++ .../root/usr/share/clash/list.sh | 38 ++++- .../root/usr/share/clash/luci_version | 2 +- .../root/usr/share/clash/proxy.sh | 92 +++++++----- 19 files changed, 663 insertions(+), 111 deletions(-) create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/geoip.lua create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/geoip.htm create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/del_servers.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/geoip.sh diff --git a/package/jsda/luci-app-clash/Makefile b/package/jsda/luci-app-clash/Makefile index a9f3eeff6c..2adf54d2e8 100644 --- a/package/jsda/luci-app-clash/Makefile +++ b/package/jsda/luci-app-clash/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-clash -PKG_VERSION:=1.4.6 +PKG_VERSION:=1.4.8 PKG_MAINTAINER:=frainzy1477 @@ -141,6 +141,7 @@ define Package/$(PKG_NAME)/install $(INSTALL_BIN) ./root/usr/share/clash/yum_change.sh $(1)/usr/share/clash/ $(INSTALL_BIN) ./root/usr/share/clash/groups.sh $(1)/usr/share/clash/ $(INSTALL_BIN) ./root/usr/share/clash/rule.sh $(1)/usr/share/clash/ + $(INSTALL_BIN) ./root/usr/share/clash/geoip.sh $(1)/usr/share/clash/ $(INSTALL_BIN) ./root/usr/share/clash/list.sh $(1)/usr/share/clash/ $(INSTALL_BIN) ./root/usr/share/clash/v2ssr.sh $(1)/usr/share/clash/ $(INSTALL_BIN) ./root/usr/share/clash/server.list $(1)/usr/share/clash/ diff --git a/package/jsda/luci-app-clash/luasrc/controller/clash.lua b/package/jsda/luci-app-clash/luasrc/controller/clash.lua index 9ffccd9403..455abd4a5f 100644 --- a/package/jsda/luci-app-clash/luasrc/controller/clash.lua +++ b/package/jsda/luci-app-clash/luasrc/controller/clash.lua @@ -23,7 +23,8 @@ function index() entry({"admin", "services", "clash", "settings"}, firstchild(),_("Settings"), 50) entry({"admin", "services", "clash", "settings", "port"},cbi("clash/port"),_("Proxy Ports"), 60).leaf = true entry({"admin", "services", "clash", "settings", "dns"},cbi("clash/dns"),_("DNS Settings"), 70).leaf = true - entry({"admin", "services", "clash", "settings", "list"},cbi("clash/list"),_("Custom List"), 80).leaf = true + entry({"admin", "services", "clash", "settings", "geoip"},cbi("clash/geoip"),_("Update GeoIP"), 80).leaf = true + entry({"admin", "services", "clash", "settings", "list"},cbi("clash/list"),_("Custom List"), 90).leaf = true entry({"admin", "services", "clash", "config"},firstchild(),_("Config"), 100) entry({"admin", "services", "clash", "config", "actconfig"},cbi("clash/actconfig"),_("Config In Use"), 110).leaf = true @@ -43,12 +44,16 @@ function index() entry({"admin", "services", "clash", "doupdate"}, call("do_update")).leaf=true entry({"admin", "services", "clash", "start"}, call("do_start")).leaf=true entry({"admin", "services", "clash", "stop"}, call("do_stop")).leaf=true - entry({"admin", "services", "clash", "getlog"}, call("get_log")).leaf=true + entry({"admin", "services", "clash", "geo"}, call("geoip_check")).leaf=true + entry({"admin", "services", "clash", "geoipupdate"}, call("geoip_update")).leaf=true + entry({"admin", "services", "clash", "check_geoip"}, call("check_geoip_log")).leaf=true entry({"admin", "services", "clash", "corelog"},call("down_check")).leaf=true entry({"admin", "services", "clash", "logstatus"},call("logstatus_check")).leaf=true end +local fss = require "luci.clash" + local function dash_port() return luci.sys.exec("uci get clash.config.dash_port 2>/dev/null") end @@ -129,6 +134,9 @@ local function readlog() return luci.sys.exec("sed -n '$p' /usr/share/clash/clash_real.txt 2>/dev/null") end +local function geo_data() + return os.date("%Y-%m-%d %H:%M:%S",fss.mtime("/etc/clash/Country.mmdb")) +end local function downcheck() if nixio.fs.access("/var/run/core_update_error") then @@ -143,17 +151,37 @@ end function action_read() luci.http.prepare_content("application/json") luci.http.write_json({ - readlog = readlog(); + readlog = readlog(); }) end function down_check() luci.http.prepare_content("application/json") luci.http.write_json({ - downcheck = downcheck(); + downcheck = downcheck(); }) end +local function geoipcheck() + if nixio.fs.access("/var/run/geoip_update_error") then + return "0" + elseif nixio.fs.access("/var/run/geoip_update") then + return "1" + elseif nixio.fs.access("/var/run/geoip_down_complete") then + return "2" + end +end + +function geoip_check() + luci.http.prepare_content("application/json") + luci.http.write_json({ + geoipcheck = geoipcheck(); + }) +end + + + + function check_status() luci.http.prepare_content("application/json") luci.http.write_json({ @@ -197,6 +225,11 @@ function act_ping() end +function geoip_update() + fs.writefile("/var/run/geoiplog","0") + luci.sys.exec("(rm /var/run/geoip_update_error ; touch /var/run/geoip_update ; sh /usr/share/clash/geoip.sh >/tmp/geoip_update.txt 2>&1 || touch /var/run/geoip_update_error ;rm /var/run/geoip_update) &") +end + function do_update() fs.writefile("/var/run/clashlog","0") @@ -227,6 +260,22 @@ else end end +function check_geoip_log() + luci.http.prepare_content("text/plain; charset=utf-8") + local fdp=tonumber(fs.readfile("/var/run/geoiplog")) or 0 + local f=io.open("/tmp/geoip_update.txt", "r+") + f:seek("set",fdp) + local a=f:read(2048000) or "" + fdp=f:seek() + fs.writefile("/var/run/geoiplog",tostring(fdp)) + f:close() +if fs.access("/var/run/geoip_update") then + luci.http.write(a) +else + luci.http.write(a.."\0") +end +end + function logstatus_check() luci.http.prepare_content("text/plain; charset=utf-8") diff --git a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/cusconfig.lua b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/cusconfig.lua index 4b88e09a79..c296acd0f5 100644 --- a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/cusconfig.lua +++ b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/cusconfig.lua @@ -29,6 +29,13 @@ sev.write = function(self, section, value) NXFS.writefile(conf, value:gsub("\r\n", "\n")) end +o=s:option(Button,"apply") +o.inputtitle = translate("Save & Apply") +o.inputstyle = "reload" +o.write = function() + m.uci:commit("clash") +end + o = s:option(Button,"configrm") o.inputtitle = translate("Delete Config") diff --git a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/dns.lua b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/dns.lua index d5c31e7e64..a52e35d41c 100644 --- a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/dns.lua +++ b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/dns.lua @@ -15,54 +15,6 @@ m.pageaction = false s.anonymous = true s.addremove=false -o = s:option(FileUpload, "",translate("Update GEOIP Database")) -o.description = translate("NB: Upload GEOIP Database file Country.mmdb") -.."
" -..translate("https://github.com/Dreamacro/maxmind-geoip/releases") -.."
" -..translate("https://static.clash.to/GeoIP2/GeoIP2-Country.tar.gz") - -o.title = translate("Update GEOIP Database") -o.template = "clash/clash_upload" -um = s:option(DummyValue, "", nil) -um.template = "clash/clash_dvalue" - -local dir, fd -dir = "/etc/clash/" -http.setfilehandler( - function(meta, chunk, eof) - if not fd then - if not meta then return end - - if meta and chunk then fd = nixio.open(dir .. meta.file, "w") end - - if not fd then - um.value = translate("upload file error.") - return - end - end - if chunk and fd then - fd:write(chunk) - end - if eof and fd then - fd:close() - fd = nil - um.value = translate("File saved to") .. ' "/etc/clash/"' - SYS.call("chmod + x /etc/clash/Country.mmdb") - if luci.sys.call("pidof clash >/dev/null") == 0 then - SYS.call("/etc/init.d/clash restart >/dev/null 2>&1 &") - end - end - end -) - -if luci.http.formvalue("upload") then - local f = luci.http.formvalue("ulfile") - if #f <= 0 then - um.value = translate("No specify upload file.") - end -end - y = s:option(ListValue, "dnsforwader", translate("DNS Forwarding")) y:value("0", translate("disabled")) diff --git a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/geoip.lua b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/geoip.lua new file mode 100644 index 0000000000..4656d2c2bb --- /dev/null +++ b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/geoip.lua @@ -0,0 +1,141 @@ + +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 uci = require("luci.model.uci").cursor() +local clash = "clash" +local http = luci.http + +font_red = [[]] +font_off = [[]] +bold_on = [[]] +bold_off = [[]] + + +k = Map(clash) +k.reset = false +k.submit = false +s=k:section(TypedSection, "clash", translate("Local Update GeoIP")) +s.anonymous = true +s.addremove=false +o = s:option(FileUpload, "") +o.description = translate("NB: Upload GEOIP Database file Country.mmdb") +.."
" +..translate("https://github.com/Dreamacro/maxmind-geoip/releases") +.."
" +..translate("https://static.clash.to/GeoIP2/GeoIP2-Country.tar.gz") +.."
" +..translate("https://geolite.clash.dev/Country.mmdb") + +o.title = translate(" ") +o.template = "clash/clash_upload" +um = s:option(DummyValue, "", nil) +um.template = "clash/clash_dvalue" + +local dir, fd +dir = "/etc/clash/" +http.setfilehandler( + function(meta, chunk, eof) + if not fd then + if not meta then return end + + if meta and chunk then fd = nixio.open(dir .. meta.file, "w") end + + if not fd then + um.value = translate("upload file error.") + return + end + end + if chunk and fd then + fd:write(chunk) + end + if eof and fd then + fd:close() + fd = nil + um.value = translate("File saved to") .. ' "/etc/clash/"' + SYS.call("chmod + x /etc/clash/Country.mmdb") + if luci.sys.call("pidof clash >/dev/null") == 0 then + SYS.call("/etc/init.d/clash restart >/dev/null 2>&1 &") + end + end + end +) + +if luci.http.formvalue("upload") then + local f = luci.http.formvalue("ulfile") + if #f <= 0 then + um.value = translate("No specify upload file.") + end +end + + + + +m = Map("clash") +s = m:section(TypedSection, "clash" , translate("Online Update GeoIP")) +m.pageaction = false +s.anonymous = true +s.addremove=false + +o = s:option(Flag, "auto_update_geoip", translate("Auto Update")) +o.description = translate("Auto Update GeoIP Database") + +o = s:option(ListValue, "auto_update_geoip_time", translate("Update time (every day)")) +for t = 0,23 do +o:value(t, t..":00") +end +o.default=0 +o.description = translate("GeoIP Update Time") + + +o = s:option(ListValue, "up_time", translate("Update Every (Week/Month)")) +o.rmempty = false +o.description = translate("Time For Update (Once a week/Month)") +o:value("weekly", translate("Weekly")) +o:value("monthly", translate("Monthly")) + +o = s:option(ListValue, "geoip_update_day", translate("Update Day (Day of Week)")) +o:value("1", translate("Every Monday")) +o:value("2", translate("Every Tuesday")) +o:value("3", translate("Every Wednesday")) +o:value("4", translate("Every Thursday")) +o:value("5", translate("Every Friday")) +o:value("6", translate("Every Saturday")) +o:value("0", translate("Every Sunday")) +update_time = SYS.exec("ls -l --full-time /etc/clash/Country.mmdb|awk '{print $6,$7;}'") +o.description = translate("Update Time")..'- ' ..font_red..bold_on..update_time..bold_off..font_off..' ' +o:depends("up_time", "weekly") + +o = s:option(ListValue, "geo_update_week", translate("Update Day (Day of Month)")) +o:value("1", translate("Every 1st Day")) +o:value("7", translate("Every 7th Day")) +o:value("14", translate("Every 14th Day")) +o:value("21", translate("Every 21st Day")) +o:value("28", translate("Every 28th Day")) +update_time = SYS.exec("ls -l --full-time /etc/clash/Country.mmdb|awk '{print $6,$7;}'") +o.description = translate("Update Time")..'- ' ..font_red..bold_on..update_time..bold_off..font_off..' ' +o:depends("up_time", "monthly") + + +o = s:option(Value, "license_key") +o.title = translate("License Key") +o.description = translate("MaxMind License Key")..translate(" https://www.maxmind.com/en/geolite2/signup") +o.rmempty = true + +o=s:option(Button,"update_geoip") +o.inputtitle = translate("Save & Apply") +o.title = translate("Save & Apply") +o.inputstyle = "reload" +o.write = function() + m.uci:commit("clash") +end + +o = s:option(Button,"download") +o.title = translate("Download") +o.template = "clash/geoip" + + +return m, k + diff --git a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/groups.lua b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/groups.lua index dad743666a..332c242eba 100644 --- a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/groups.lua +++ b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/groups.lua @@ -46,7 +46,7 @@ o:depends("type", "fallback") o:depends("type", "load-balance") o = s:option(DynamicList, "other_group", translate("Other Group")) -o.rmempty = false +o.rmempty = true o.description = translate("Proxy Groups Must Exist In Rule") o:value("ALL", translate("All Servers")) uci:foreach("clash", "servers", diff --git a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/provider-config.lua b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/provider-config.lua index 0d7f0010f0..f7124204d3 100644 --- a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/provider-config.lua +++ b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/provider-config.lua @@ -96,7 +96,7 @@ for t,f in ipairs(fss.glob("/etc/clash/provider/*"))do end end end -o.rmempty = true +o.rmempty = false o:depends("type", "file") diff --git a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/subconfig.lua b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/subconfig.lua index a3a0d9fe61..9dbf097262 100644 --- a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/subconfig.lua +++ b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/subconfig.lua @@ -28,6 +28,12 @@ sev.write = function(self, section, value) NXFS.writefile(conf, value:gsub("\r\n", "\n")) end +o=s:option(Button,"apply") +o.inputtitle = translate("Save & Apply") +o.inputstyle = "reload" +o.write = function() + m.uci:commit("clash") +end o = s:option(Button,"configrm") diff --git a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/upconfig.lua b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/upconfig.lua index b01c3e7178..b1f2386092 100644 --- a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/upconfig.lua +++ b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/upconfig.lua @@ -34,6 +34,14 @@ o.write = function() SYS.call("rm -rf /usr/share/clash/config/upload/config.yaml >/dev/null 2>&1 &") end +o=s:option(Button,"apply") +o.inputtitle = translate("Save & Apply") +o.inputstyle = "reload" +o.write = function() + m.uci:commit("clash") +end + + return m diff --git a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/update.lua b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/update.lua index 04e97bc6af..ea65f2dc28 100644 --- a/package/jsda/luci-app-clash/luasrc/model/cbi/clash/update.lua +++ b/package/jsda/luci-app-clash/luasrc/model/cbi/clash/update.lua @@ -4,7 +4,8 @@ local HTTP = require "luci.http" local DISP = require "luci.dispatcher" local UTIL = require "luci.util" local uci = require("luci.model.uci").cursor() -local m +local m , r, k +local http = luci.http font_green = [[]] font_off = [[]] @@ -16,9 +17,63 @@ m:section(SimpleSection).template = "clash/update" m.pageaction = false k = Map("clash") -s = k:section(TypedSection, "clash") -s.anonymous = true +s=k:section(TypedSection, "clash", translate("Upload Clash(Tun)")) +s.anonymous = true +s.addremove=false +o = s:option(FileUpload, "") +o.description = translate("NB: Upload Clash Supported Tun (clash)") +.."
" +..translate("https://github.com/comzyh/clash/releases") +.."
" +..translate("https://github.com/Dreamacro/clash/releases/tag/TUN") + + +o.title = translate(" ") +o.template = "clash/clash_upload" +um = s:option(DummyValue, "", nil) +um.template = "clash/clash_dvalue" + +local dir, fd +dir = "/etc/clash/clashtun/" +http.setfilehandler( + function(meta, chunk, eof) + if not fd then + if not meta then return end + + if meta and chunk then fd = nixio.open(dir .. meta.file, "w") end + + if not fd then + um.value = translate("upload file error.") + return + end + end + if chunk and fd then + fd:write(chunk) + end + if eof and fd then + fd:close() + fd = nil + um.value = translate("File saved to") .. ' "/etc/clash/clashtun/"' + SYS.call("chmod 755 /etc/clash/clashtun/clash") + if luci.sys.call("pidof clash >/dev/null") == 0 then + SYS.call("/etc/init.d/clash restart >/dev/null 2>&1 &") + end + end + end +) + +if luci.http.formvalue("upload") then + local f = luci.http.formvalue("ulfile") + if #f <= 0 then + um.value = translate("No specify upload file.") + end +end + + + +s = k:section(TypedSection, "clash", translate("Download Clash/Clashr")) +s.anonymous = true o = s:option(ListValue, "dcore", translate("Core Type")) o.default = "clashcore" o:value("1", translate("Clash")) @@ -56,6 +111,6 @@ o.title = translate("Download") o.template = "clash/core_check" -return m, k +return m, k diff --git a/package/jsda/luci-app-clash/luasrc/view/clash/geoip.htm b/package/jsda/luci-app-clash/luasrc/view/clash/geoip.htm new file mode 100644 index 0000000000..c54f5f7f6c --- /dev/null +++ b/package/jsda/luci-app-clash/luasrc/view/clash/geoip.htm @@ -0,0 +1,77 @@ +<%+cbi/valueheader%> +<%local fs=require"nixio.fs"%> + + +

+ + + + +<%+cbi/valuefooter%> diff --git a/package/jsda/luci-app-clash/po/zh-cn/clash.po b/package/jsda/luci-app-clash/po/zh-cn/clash.po index 51d201aad2..cc875002f7 100644 --- a/package/jsda/luci-app-clash/po/zh-cn/clash.po +++ b/package/jsda/luci-app-clash/po/zh-cn/clash.po @@ -672,4 +672,97 @@ msgid "Provider File" msgstr "代理集文件" msgid "Modify Tun DNS" -msgstr "修改Tun DNS" \ No newline at end of file +msgstr "修改Tun DNS" + +msgid "Local Update GeoIP" +msgstr "本地更新GeoIP数据库" + +msgid "Online Update GeoIP" +msgstr "在线更新GeoIP数据库" + +msgid "MaxMind License Key" +msgstr "MaxMind许可证密钥" + +msgid "License Key" +msgstr "许可证密钥" + +msgid "Auto Update GeoIP Database" +msgstr "自动更新GeoIP数据库" + +msgid "Update Day (Day of Month)" +msgstr "更新(每月的日)" + +msgid "GeoIP Update Time" +msgstr "GeoIP更新时间" + +msgid "Every 1st Day" +msgstr "每月的第一天" + +msgid "Every 7th Day" +msgstr "每月的第七天" + +msgid "Every 14th Day" +msgstr "每月的第十四天" + +msgid "Every 21st Day" +msgstr "每月的第二十一天" + +msgid "Every 28th Day" +msgstr "每月的第二十八天" + +msgid "Update GeoIP" +msgstr "更新GeoIP数据库" + +msgid "Update Time" +msgstr "更新时间" + +msgid "Every Monday" +msgstr "每周一" + +msgid "Every Tuesday" +msgstr "每周二" + +msgid "Every Wednesday" +msgstr "每周三" + +msgid "Every Thursday" +msgstr "每周四" + +msgid "Every Friday" +msgstr "每周五" + +msgid "Every Saturday" +msgstr "每周六" + +msgid "Every Sunday" +msgstr "每周日" + +msgid "Update Every (Week/Month)" +msgstr "更新(每周/每月)" + +msgid "Update Day (Day of Week)" +msgstr "更新的天" + +msgid "Time For Update (Once a week/Month)" +msgstr "更新(每周一次/每月一次)" + +msgid "Weekly" +msgstr "每周" + +msgid "Monthly" +msgstr "每月" + +msgid "Upload Clash(Tun)" +msgstr "上传Clash(Tun)" + +msgid "NB: Upload Clash Supported Tun (clash)" +msgstr "注意:上传clash支持的Tun" + +msgid "Download Clash/Clashr" +msgstr "下载Clash/Clashr" + +msgid "No file chosen" +msgstr "未选择文件" + +msgid "Chose File" +msgstr "选择文件" diff --git a/package/jsda/luci-app-clash/root/etc/init.d/clash b/package/jsda/luci-app-clash/root/etc/init.d/clash index a9bf126abd..60f9eb57c8 100755 --- a/package/jsda/luci-app-clash/root/etc/init.d/clash +++ b/package/jsda/luci-app-clash/root/etc/init.d/clash @@ -9,20 +9,20 @@ CLASHT="/etc/clash/clashtun/clash" CLASH_CONFIG="/etc/clash" CRON_FILE="/etc/crontabs/root" CONFIG_YAML="/etc/clash/config.yaml" -CONFIG_YAML_OLD="/etc/clash/config.yml" +CONFIG_YAML_OLD="/etc/clash/config.yml" CONFIG_YAML_SUB="/usr/share/clash/config/sub/config.yaml" CONFIG_YAML_UPL="/usr/share/clash/config/upload/config.yaml" CONFIG_YAML_CUS="/usr/share/clash/config/custom/config.yaml" CUSLIST="/tmp/dnsmasq.d/custom_list.conf" CUSLITT="/tmp/dnsmasq.clash" -CUSLISTV="/var/dnsmasq.d/custom_list.conf" +CUSLISTV="/var/dnsmasq.d/custom_list.conf" CUSLITTV="/var/dnsmasq.clash" REAL_LOG="/usr/share/clash/clash_real.txt" revert_dns() { #=========================================================================================================================== - dns_port=$(grep "^ \{0,\}listen:" $CONFIG_YAML |awk -F ':' '{print $3}' 2>/dev/null) + dns_port=$(grep "^ \{0,\}listen:" $CONFIG_YAML |awk -F ':' '{print $3}' 2>/dev/null) uci del_list dhcp.@dnsmasq[0].server=127.0.0.1#$dns_port >/dev/null 2>&1 uci set dhcp.@dnsmasq[0].noresolv=0 uci delete dhcp.@dnsmasq[0].cachesize @@ -44,6 +44,23 @@ config_type=$(uci get clash.config.config_type 2>/dev/null) [ -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 "/usr/share/clash/v2ssr.sh" $CRON_FILE)" ] && echo "0 $(uci get clash.config.auto_update_time 2>/dev/null) * * * /usr/share/clash/v2ssr.sh" >> $CRON_FILE fi + auto_geoip=$(uci get clash.config.auto_update_geoip 2>/dev/null) + if [ "${auto_geoip}" -eq 1 ]; then + day=$(uci get clash.config.geoip_update_day 2>/dev/null) + week=$(uci get clash.config.geo_update_week 2>/dev/null) + if [ -z $week ];then + update_week="*" + else + update_week=$week + fi + if [ -z $day ];then + update_day="*" + else + update_day=$day + fi + + [ -z "$(grep -w "/usr/share/clash/geoip.sh" $CRON_FILE)" ] && echo "0 $(uci get clash.config.auto_update_geoip_time 2>/dev/null) $update_week * $update_day /usr/share/clash/geoip.sh" >> $CRON_FILE + fi crontab $CRON_FILE #=========================================================================================================================== } @@ -209,6 +226,8 @@ rules(){ elif [ "${tun_mode}" -eq 2 ] || [ "${tun_mode}" -eq 3 ];then PROXY_FWMARK="0x162" PROXY_ROUTE_TABLE="0x162" + PROXY_BYPASS_USER="root" + ipset create localnetwork hash:net ipset add localnetwork 127.0.0.0/8 ipset add localnetwork 10.0.0.0/8 @@ -220,16 +239,29 @@ rules(){ ip tuntap add user root mode tun clash0 ip link set clash0 up + ip address replace 198.18.0.0/16 dev clash0 ip route replace default dev clash0 table "$PROXY_ROUTE_TABLE" - ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" - + ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" + iptables -t mangle -N clash iptables -t mangle -F clash + iptables -t mangle -A clash -m owner --uid-owner "$PROXY_BYPASS_USER" -j RETURN iptables -t mangle -A clash -d 198.18.0.0/16 -j MARK --set-mark "$PROXY_FWMARK" - iptables -t mangle -A clash -m set --match-set localnetwork dst -j RETURN + iptables -t mangle -A clash -m set --match-set localnetwork dst -j RETURN + iptables -t mangle -A clash -j MARK --set-mark "$PROXY_FWMARK" + + + iptables -t nat -N CLASH_DNS + iptables -t nat -F CLASH_DNS + iptables -t nat -A CLASH_DNS -m owner --uid-owner "$PROXY_BYPASS_USER" -j RETURN + iptables -t nat -A CLASH_DNS -p udp -j DNAT --to "127.0.0.1:$dns_port" iptables -t mangle -I OUTPUT -j clash - iptables -t mangle -I PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" + iptables -t mangle -I PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" + + iptables -t nat -I OUTPUT -p udp --dport 53 -j CLASH_DNS + iptables -t nat -I PREROUTING -p udp --dport 53 -j DNAT --to "127.0.0.1:$dns_port" + if [ -f /usr/sbin/ip6tables ] && [ "${ipv6}" -eq 1 ]; then ip6tables -t mangle -I PREROUTING -j MARK --set-mark "$PROXY_FWMARK" fi @@ -409,7 +441,28 @@ if [ -f $CONFIG_YAML ] && [ "$(ls -l $CONFIG_YAML|awk '{print int($5/1024)}')" fi yml_dns_change >/dev/null 2>&1 - + + if [ ! -f /etc/clash/Country.mmdb ];then + if [ "${lang}" == "en" ] || [ $lang == "auto" ];then + echo "Cannot find Country.mmdb" >$REAL_LOG + elif [ "${lang}" == "zh_cn" ];then + echo "找不到Country.mmdb" >$REAL_LOG + fi + sleep 5 + echo "Clash for OpenWRT" >$REAL_LOG + exit 0 + fi + + if [ ! -f /etc/clash/config.yaml ];then + if [ "${lang}" == "en" ] || [ $lang == "auto" ];then + echo "Cannot find config.yaml" >$REAL_LOG + elif [ "${lang}" == "zh_cn" ];then + echo "找不到config.yaml" >$REAL_LOG + fi + sleep 5 + echo "Clash for OpenWRT" >$REAL_LOG + exit 0 + fi if [ "${core}" -eq 1 ];then nohup $CLASH -d "$CLASH_CONFIG" > /tmp/clash.txt 2>&1 & @@ -525,6 +578,7 @@ remove_mark(){ tun_mode=$(uci get clash.config.tun_mode 2>/dev/null) ipv6=$(uci get clash.config.ipv6 2>/dev/null) + dns_port=$(grep "^ \{0,\}listen:" $CONFIG_YAML |awk -F ':' '{print $3}' 2>/dev/null) if [ -f /usr/sbin/ip6tables ] && [ "${ipv6}" -eq 1 ]; then ip6tables -t nat -F clash_ipv6 2>/dev/null1 && ip6tables -t nat -X clash_ipv6 2>/dev/null @@ -534,7 +588,6 @@ remove_mark(){ done fi - if [ "${tun_mode}" -eq 2 ] || [ "${tun_mode}" -eq 3 ];then PROXY_FWMARK="0x162" 2>/dev/null @@ -542,11 +595,15 @@ remove_mark(){ ip link set dev clash0 down 2>/dev/null ip tuntap del clash0 mode tun 2>/dev/null + ip route del default dev clash0 table "$PROXY_ROUTE_TABLE" 2>/dev/null ip rule del fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" 2>/dev/null iptables -t mangle -D OUTPUT -j clash 2>/dev/null iptables -t mangle -D PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" 2>/dev/null + + iptables -t nat -D OUTPUT -p udp --dport 53 -j CLASH_DNS + iptables -t nat -D PREROUTING -p udp --dport 53 -j DNAT --to "127.0.0.1:$dns_port" if [ -f /usr/sbin/ip6tables ] && [ "${ipv6}" -eq 1 ]; then ip6tables -t mangle -D PREROUTING -j MARK --set-mark "$PROXY_FWMARK" 2>/dev/null @@ -554,12 +611,19 @@ remove_mark(){ iptables -t mangle -F clash 2>/dev/null iptables -t mangle -X clash 2>/dev/null + + iptables -t nat -F CLASH_DNS 2>/dev/null + iptables -t nat -X CLASH_DNS 2>/dev/null + ipset destroy localnetwork 2>/dev/null fi - + /etc/init.d/dnsmasq restart >/dev/null 2>&1 } +del_list() { + sh /usr/share/clash/del_servers.sh >/dev/null 2>&1 +} stop(){ #=========================================================================================================================== @@ -570,6 +634,7 @@ stop(){ ipv6=$(uci get clash.config.ipv6 2>/dev/null) core=$(uci get clash.config.core 2>/dev/null) + if [ "${lang}" == "en" ] || [ $lang == "auto" ];then echo "Stopping Client..." >$REAL_LOG elif [ "${lang}" == "zh_cn" ];then @@ -638,6 +703,7 @@ stop(){ elif [ "${lang}" == "zh_cn" ];then echo "重启 Dnsmasq 程序" >$REAL_LOG fi + del_list >/dev/null 2>&1 revert_dns >/dev/null 2>&1 sleep 1 diff --git a/package/jsda/luci-app-clash/root/usr/share/clash/core_download.sh b/package/jsda/luci-app-clash/root/usr/share/clash/core_download.sh index 37636ce54c..7493685535 100755 --- a/package/jsda/luci-app-clash/root/usr/share/clash/core_download.sh +++ b/package/jsda/luci-app-clash/root/usr/share/clash/core_download.sh @@ -10,7 +10,7 @@ rm -rf /tmp/clash.tar.gz >/dev/null 2>&1 fi echo '' >/tmp/clash_update.txt 2>/dev/null -if [ /usr/share/clash/core_down_complete ];then +if [ -f /usr/share/clash/core_down_complete ];then rm -rf /usr/share/clash/core_down_complete 2>/dev/null fi diff --git a/package/jsda/luci-app-clash/root/usr/share/clash/del_servers.sh b/package/jsda/luci-app-clash/root/usr/share/clash/del_servers.sh new file mode 100755 index 0000000000..e89d2331e7 --- /dev/null +++ b/package/jsda/luci-app-clash/root/usr/share/clash/del_servers.sh @@ -0,0 +1,19 @@ +#!/bin/bash /etc/rc.common +. /lib/functions.sh + +del_address(){ +countt=$(grep -c '' /usr/share/clashbackup/address.list) +count_nums=1 +while [[ $count_nums -le $countt ]] +do +line=$(sed -n "$count_nums"p /usr/share/clashbackup/address.list) +check_addr=$(grep -F "$line" "/usr/share/clash/server.list") +line_no=$(grep -n "$check_addr" /usr/share/clash/server.list |awk -F ':' '{print $1}') +if [ ! -z $check_addr ];then +sed -i "${line_no}d" /usr/share/clash/server.list +fi +count_nums=$(( $count_nums + 1)) +done +rm -rf /usr/share/clashbackup/address.list >/dev/null 2>&1 +} +del_address >/dev/null 2>&1 \ No newline at end of file diff --git a/package/jsda/luci-app-clash/root/usr/share/clash/geoip.sh b/package/jsda/luci-app-clash/root/usr/share/clash/geoip.sh new file mode 100755 index 0000000000..fbf938c73b --- /dev/null +++ b/package/jsda/luci-app-clash/root/usr/share/clash/geoip.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +Key=$(uci get clash.config.license_key 2>/dev/null) +if [ -f /var/run/geoip_down_complete ];then + rm -rf /var/run/geoip_down_complete 2>/dev/null +fi +echo '' >/tmp/geoip_update.txt 2>/dev/null +wget -c4 --no-check-certificate --timeout=300 --user-agent="Mozilla" "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key="$Key"&suffix=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 + +sleep 2 +touch /var/run/geoip_down_complete >/dev/null 2>&1 +sleep 2 +rm -rf /var/run/geoip_update >/dev/null 2>&1 +echo "" > /tmp/geoip_update.txt >/dev/null 2>&1 + +if pidof clash >/dev/null; then +/etc/init.d/clash restart 2>/dev/null +fi + +fi + diff --git a/package/jsda/luci-app-clash/root/usr/share/clash/list.sh b/package/jsda/luci-app-clash/root/usr/share/clash/list.sh index d049b69dcd..008c6bda92 100755 --- a/package/jsda/luci-app-clash/root/usr/share/clash/list.sh +++ b/package/jsda/luci-app-clash/root/usr/share/clash/list.sh @@ -1,4 +1,40 @@ -#!/bin/sh +#!/bin/bash /etc/rc.common +. /lib/functions.sh + +dnsforwader=$(uci get clash.config.dnsforwader 2>/dev/null) + +add_address(){ +servers_get() +{ + local section="$1" + config_get "server" "$section" "server" "" + echo "$server" >>/tmp/server.conf +} +config_load clash +config_foreach servers_get "servers" + +count=$(grep -c '' /tmp/server.conf) +count_num=1 +while [[ $count_num -le $count ]] +do +line=$(sed -n "$count_num"p /tmp/server.conf) +check_addr=$(grep -F "$line" "/usr/share/clash/server.list") +if [ -z $check_addr ];then +echo $line >>/usr/share/clashbackup/address.list +fi +count_num=$(( $count_num + 1)) +done +cat /usr/share/clashbackup/address.list /usr/share/clash/server.list > /usr/share/clash/me.list +rm -rf /usr/share/clash/server.list +mv /usr/share/clash/me.list /usr/share/clash/server.list +chmod 755 /usr/share/clash/server.list +rm -rf /tmp/server.conf >/dev/null 2>&1 +} +if [ "${dnsforwader}" -eq 1 ];then + add_address >/dev/null 2>&1 +fi + + enable_list=$(uci get clash.config.cus_list 2>/dev/null) if [ $enable_list -eq 1 ];then diff --git a/package/jsda/luci-app-clash/root/usr/share/clash/luci_version b/package/jsda/luci-app-clash/root/usr/share/clash/luci_version index c514bd85c2..b2e46d1851 100644 --- a/package/jsda/luci-app-clash/root/usr/share/clash/luci_version +++ b/package/jsda/luci-app-clash/root/usr/share/clash/luci_version @@ -1 +1 @@ -1.4.6 +1.4.8 diff --git a/package/jsda/luci-app-clash/root/usr/share/clash/proxy.sh b/package/jsda/luci-app-clash/root/usr/share/clash/proxy.sh index 4b7bf681a2..147d7f51da 100755 --- a/package/jsda/luci-app-clash/root/usr/share/clash/proxy.sh +++ b/package/jsda/luci-app-clash/root/usr/share/clash/proxy.sh @@ -1,11 +1,13 @@ #!/bin/bash /etc/rc.common . /lib/functions.sh +create_config(){ + REAL_LOG="/usr/share/clash/clash_real.txt" lang=$(uci get luci.main.lang 2>/dev/null) config_type=$(uci get clash.config.config_type 2>/dev/null) create=$(uci get clash.config.create 2>/dev/null) -load_from=$(uci get clash.config.loadfrom 2>/dev/null) +load_from=$(uci get clash.config.loadfrom 2>/dev/null) if [ "$load_from" == "sub" ];then @@ -14,7 +16,6 @@ elif [ "$load_from" == "upl" ];then load="/usr/share/clash/config/upload/config.yaml" fi - if [ "${create}" -eq 1 ];then if [ $lang == "en" ] || [ $lang == "auto" ];then @@ -36,23 +37,22 @@ CFG_FILE="/etc/config/clash" DNS_FILE="/usr/share/clash/dns.yaml" PROVIDER_FILE="/tmp/yaml_provider.yaml" - - - servcount=$( grep -c "config servers" $CFG_FILE 2>/dev/null) gcount=$( grep -c "config groups" $CFG_FILE 2>/dev/null) - if [ $servcount -eq 0 ] || [ $gcount -eq 0 ];then + scount=$( grep -c "config servers" $CFG_FILE 2>/dev/null) + pcount=$( grep -c "config provider" $CFG_FILE 2>/dev/null) + if [ $gcount -eq 0 ];then if [ $lang == "en" ] || [ $lang == "auto" ];then - echo "No servers or group. Aborting Operation .." >$REAL_LOG + echo "No policy group found. Aborting Operation .." >$REAL_LOG sleep 2 echo "Clash for OpenWRT" >$REAL_LOG elif [ $lang == "zh_cn" ];then - echo "找不到代理或策略组。中止操作..." >$REAL_LOG + echo "找不到策略组。中止操作..." >$REAL_LOG sleep 2 echo "Clash for OpenWRT" >$REAL_LOG fi exit 0 fi -sleep 2 + sleep 2 @@ -113,6 +113,19 @@ EOF } +if [ $pcount -gt 0 ];then +config_load "clash" +config_foreach yml_proxy_provider_set "provider" +fi + +if [ -f $PROVIDER_FILE ];then +sed -i "1i\ " $PROVIDER_FILE 2>/dev/null +sed -i "2i\proxy-provider:" $PROVIDER_FILE 2>/dev/null +#echo "proxy-provider:" >$PROVIDER_FILE +rm -rf /tmp/Proxy_Provider + +fi + servers_set() { @@ -353,32 +366,32 @@ EOF } - -config_load "clash" -config_foreach yml_proxy_provider_set "provider" - -if [ -f $PROVIDER_FILE ];then -sed -i "1i\ " $PROVIDER_FILE 2>/dev/null -sed -i "2i\proxy-provider:" $PROVIDER_FILE 2>/dev/null -#echo "proxy-provider:" >$PROVIDER_FILE -rm -rf /tmp/Proxy_Provider - -fi - - +if [ $scount -gt 0 ];then config_load clash config_foreach servers_set "servers" +fi +if [ -z "${scount}" ] || [ "${scount}" -eq 0 ];then +cat >> "$SERVER_FILE" <<-EOF +- name: Shadowsocks + type: ss + server: 127.0.0.1 + port: 1080 + cipher: aes-256-gcm + password: "12345" +EOF +fi -if [ "$(ls -l $SERVER_FILE|awk '{print $5}')" -ne 0 ]; then sed -i "1i\ " $SERVER_FILE 2>/dev/null sed -i "2i\Proxy:" $SERVER_FILE 2>/dev/null egrep '^ {0,}-' $SERVER_FILE |grep name: |awk -F 'name: ' '{print $2}' |sed 's/,.*//' >$Proxy_Group 2>&1 + sed -i "s/^ \{0,\}/ - /" $Proxy_Group 2>/dev/null + yml_servers_add() { @@ -482,21 +495,21 @@ yml_groups_set() if [ "$( grep -c "config provider" $CFG_FILE )" -ne 0 ];then - echo " use: $group_name" >>$GROUP_FILE - - config_foreach set_proxy_provider "provider" "$group_name" + echo " use: $group_name" >>$GROUP_FILE + + config_foreach set_proxy_provider "provider" "$group_name" - if [ "$set_group" -eq 1 ]; then - sed -i "/^ \{0,\}proxies: ${group_name}/c\ proxies:" $GROUP_FILE - else - sed -i "/proxies: ${group_name}/d" $GROUP_FILE 2>/dev/null - fi + if [ "$set_group" -eq 1 ]; then + sed -i "/^ \{0,\}proxies: ${group_name}/c\ proxies:" $GROUP_FILE + else + sed -i "/proxies: ${group_name}/d" $GROUP_FILE 2>/dev/null + fi - if [ "$set_proxy_provider" -eq 1 ]; then - sed -i "/^ \{0,\}use: ${group_name}/c\ use:" $GROUP_FILE - else - sed -i "/use: ${group_name}/d" $GROUP_FILE 2>/dev/null - fi + if [ "$set_proxy_provider" -eq 1 ]; then + sed -i "/^ \{0,\}use: ${group_name}/c\ use:" $GROUP_FILE + else + sed -i "/use: ${group_name}/d" $GROUP_FILE 2>/dev/null + fi fi @@ -562,7 +575,9 @@ EOF cat $DNS_FILE >> $TEMP_FILE 2>/dev/null +if [ -f $SERVER_FILE ];then cat $SERVER_FILE >> $TEMP_FILE 2>/dev/null +fi cat $GROUP_FILE >> $TEMP_FILE 2>/dev/null @@ -599,8 +614,9 @@ if pidof clash >/dev/null; then fi fi -fi + rm -rf $SERVER_FILE - fi +} +create_config >/dev/null 2>&1