From afbd16610aa2cad86725e3c89c5195952a0cc203 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Thu, 23 Jul 2020 17:27:56 +0800 Subject: [PATCH 1/3] luci-app-oled: sync with upstream source --- .../ctcgfw/luci-app-oled/root/etc/init.d/oled | 41 +++++++++++++++---- .../luci-app-oled/src/Example_Code/Main.c | 6 +-- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/package/ctcgfw/luci-app-oled/root/etc/init.d/oled b/package/ctcgfw/luci-app-oled/root/etc/init.d/oled index 9f3a2a6fff..499df12787 100755 --- a/package/ctcgfw/luci-app-oled/root/etc/init.d/oled +++ b/package/ctcgfw/luci-app-oled/root/etc/init.d/oled @@ -11,7 +11,7 @@ start() { #crontab daemon cat /etc/crontabs/root | grep oled > /dev/null if [ $? -eq 1 ]; then - echo "*/15 * * * * /etc/init.d/oled restart &>/dev/null 2>&1" >> /etc/crontabs/root + echo "*/5 * * * * /etc/init.d/oled restart &>/dev/null 2>&1" >> /etc/crontabs/root fi date=$(uci get oled.@oled[0].date) @@ -40,15 +40,13 @@ start() { ps|grep netspeed|grep -v grep|awk '{print $1}'|xargs kill -9 rm -f /tmp/netspeed fi - nohup ${PROG} ${date} ${lanip} ${cputemp} ${cpufreq} ${netspeed} ${time} ${drawline} ${drawrect} ${fillrect} ${drawcircle} ${drawroundrect} ${fillroundrect} ${drawtriangle} ${filltriangle} ${displaybitmap} ${displayinvertnormal} ${drawbitmapeg} ${scroll} "${text}" "${netsource}" > /dev/null 2>&1 & + nohup ${PROG} ${date} ${lanip} ${cputemp} ${cpufreq} ${netspeed} ${time} ${drawline} ${drawrect} ${fillrect} ${drawcircle} ${drawroundrect} ${fillroundrect} ${drawtriangle} ${filltriangle} ${displaybitmap} ${displayinvertnormal} ${drawbitmapeg} ${scroll} "${text}" "${netsource}" 1 > /dev/null 2>&1 & } stop() { - kill `pgrep /usr/bin/oled` - sleep 1 + kill -2 `pgrep /usr/bin/oled` ps|grep netspeed|grep -v grep|awk '{print $1}'|xargs kill -9 - sleep 1 echo "oled exit..." } @@ -57,9 +55,36 @@ restart(){ pgrep -f ${PROG} >/dev/null if [ $? -eq 0 ]; then if [ $enabled -eq 1 ]; then - stop - sleep 1 - start + kill `pgrep /usr/bin/oled` + ps|grep netspeed|grep -v grep|awk '{print $1}'|xargs kill -9 + + date=$(uci get oled.@oled[0].date) + lanip=$(uci get oled.@oled[0].lanip) + cputemp=$(uci get oled.@oled[0].cputemp) + cpufreq=$(uci get oled.@oled[0].cpufreq) + netspeed=$(uci get oled.@oled[0].netspeed) + time=$(uci get oled.@oled[0].time) + drawline=$(uci get oled.@oled[0].drawline) + drawrect=$(uci get oled.@oled[0].drawrect) + fillrect=$(uci get oled.@oled[0].fillrect) + drawcircle=$(uci get oled.@oled[0].drawcircle) + drawroundrect=$(uci get oled.@oled[0].drawroundrect) + fillroundrect=$(uci get oled.@oled[0].fillroundrect) + drawtriangle=$(uci get oled.@oled[0].drawtriangle) + filltriangle=$(uci get oled.@oled[0].filltriangle) + displaybitmap=$(uci get oled.@oled[0].displaybitmap) + displayinvertnormal=$(uci get oled.@oled[0].displayinvertnormal) + drawbitmapeg=$(uci get oled.@oled[0].drawbitmapeg) + scroll=$(uci get oled.@oled[0].scroll) + text=$(uci get oled.@oled[0].text) + netsource=$(uci get oled.@oled[0].netsource) + if [ ${netspeed} -eq 1 ]; then + nohup /usr/sbin/netspeed ${netsource} >/dev/null 2>&1 & + else + ps|grep netspeed|grep -v grep|awk '{print $1}'|xargs kill -9 + rm -f /tmp/netspeed + fi + nohup ${PROG} ${date} ${lanip} ${cputemp} ${cpufreq} ${netspeed} ${time} ${drawline} ${drawrect} ${fillrect} ${drawcircle} ${drawroundrect} ${fillroundrect} ${drawtriangle} ${filltriangle} ${displaybitmap} ${displayinvertnormal} ${drawbitmapeg} ${scroll} "${text}" "${netsource}" 0 > /dev/null 2>&1 & else stop fi diff --git a/package/ctcgfw/luci-app-oled/src/Example_Code/Main.c b/package/ctcgfw/luci-app-oled/src/Example_Code/Main.c index af33036fad..9bf87e697e 100644 --- a/package/ctcgfw/luci-app-oled/src/Example_Code/Main.c +++ b/package/ctcgfw/luci-app-oled/src/Example_Code/Main.c @@ -60,7 +60,7 @@ int main(int argc, char* argv[]) int scroll=atoi(argv[18]); char *text=argv[19]; char *eth = argv[20]; - + int needinit=atoi(argv[21]); /* Initialize I2C bus and connect to the I2C Device */ @@ -77,9 +77,9 @@ int main(int argc, char* argv[]) /* Register the Alarm Handler */ signal(SIGALRM, ALARMhandler); signal(SIGINT, BreakDeal); - signal(SIGTERM, BreakDeal); + //signal(SIGTERM, BreakDeal); /* Run SDD1306 Initialization Sequence */ - display_Init_seq(); + if (needinit==1) {display_Init_seq();} /* Clear display */ clearDisplay(); From 537dc8b487d4b1ed3521e3dd51b605cfd3415a49 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Thu, 23 Jul 2020 17:33:32 +0800 Subject: [PATCH 2/3] luci-app-beardropper: add package --- CONTRIBUTED.md | 3 +- package/ctcgfw/luci-app-beardropper/Makefile | 22 + .../luasrc/controller/beardropper.lua | 19 + .../luasrc/model/cbi/beardropper/log.lua | 17 + .../luasrc/model/cbi/beardropper/setting.lua | 54 ++ .../luasrc/view/beardropper/status.htm | 22 + .../po/zh-cn/beardropper.po | 115 ++++ .../po/zh-tw/beardropper.po | 115 ++++ .../root/etc/config/beardropper | 18 + .../root/etc/init.d/beardropper | 46 ++ .../root/etc/uci-defaults/luci-beardropper | 12 + .../root/usr/sbin/beardropper | 517 ++++++++++++++++++ 12 files changed, 959 insertions(+), 1 deletion(-) create mode 100644 package/ctcgfw/luci-app-beardropper/Makefile create mode 100755 package/ctcgfw/luci-app-beardropper/luasrc/controller/beardropper.lua create mode 100644 package/ctcgfw/luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua create mode 100755 package/ctcgfw/luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua create mode 100755 package/ctcgfw/luci-app-beardropper/luasrc/view/beardropper/status.htm create mode 100755 package/ctcgfw/luci-app-beardropper/po/zh-cn/beardropper.po create mode 100644 package/ctcgfw/luci-app-beardropper/po/zh-tw/beardropper.po create mode 100644 package/ctcgfw/luci-app-beardropper/root/etc/config/beardropper create mode 100755 package/ctcgfw/luci-app-beardropper/root/etc/init.d/beardropper create mode 100755 package/ctcgfw/luci-app-beardropper/root/etc/uci-defaults/luci-beardropper create mode 100755 package/ctcgfw/luci-app-beardropper/root/usr/sbin/beardropper diff --git a/CONTRIBUTED.md b/CONTRIBUTED.md index 0653abdfd8..51940fab3c 100644 --- a/CONTRIBUTED.md +++ b/CONTRIBUTED.md @@ -54,7 +54,8 @@ luci-theme-argon-mod source: [Leo-Jo-My/luci-theme-argon-mod](https://github.com node-request source: [jerrykuku/node-request](https://github.com/jerrykuku/node-request).
luci-app-jd-dailybonus source: [jerrykuku/luci-app-jd-dailybonus](https://github.com/jerrykuku/luci-app-jd-dailybonus).
luci-app-oled source: [NateLol/luci-app-oled](https://github.com/NateLol/luci-app-oled).
-luci-theme-edge source: [garypang13/luci-theme-edge](https://github.com//garypang13/luci-theme-edge). +luci-theme-edge source: [garypang13/luci-theme-edge](https://github.com//garypang13/luci-theme-edge).
+luci-app-beardropper source: [NateLol/natelol](https://github.com/NateLol/natelol). ## License ### Depend on their own License. diff --git a/package/ctcgfw/luci-app-beardropper/Makefile b/package/ctcgfw/luci-app-beardropper/Makefile new file mode 100644 index 0000000000..bbdbdcc0e3 --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/Makefile @@ -0,0 +1,22 @@ +# +# Copyright (C) 2020 Nate Ding +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +LUCI_Title:=LuCI Support for BearDropper +LUCI_PKGARCH=all + +PKG_VERSION:=1.1 +PKG_RELEASE:=20200522 + +PKG_MAINTANINER:=Nate Ding +PKG_LICENSE:=GLPv3 +PKG_LICENSE_FILES:=LICENSE + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/ctcgfw/luci-app-beardropper/luasrc/controller/beardropper.lua b/package/ctcgfw/luci-app-beardropper/luasrc/controller/beardropper.lua new file mode 100755 index 0000000000..2c31a2ffc5 --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/luasrc/controller/beardropper.lua @@ -0,0 +1,19 @@ +module("luci.controller.beardropper", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/beardropper") then + return + end + entry({"admin", "services", "beardropper"}, alias("admin", "services", "beardropper", "setting"),_("BearDropper"), 20).dependent = true + entry({"admin", "services", "beardropper", "status"}, call("act_status")) + entry({"admin", "services", "beardropper", "setting"}, cbi("beardropper/setting"), _("Setting"), 30).leaf= true + entry({"admin", "services", "beardropper", "log"}, form("beardropper/log"),_("Log"), 40).leaf= true + --entry: +end + +function act_status() + local e={} + e.running = luci.sys.call("pgrep -f /usr/sbin/beardropper >/dev/null")==0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end \ No newline at end of file diff --git a/package/ctcgfw/luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua b/package/ctcgfw/luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua new file mode 100644 index 0000000000..c725bcdf04 --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua @@ -0,0 +1,17 @@ +f = SimpleForm("logview") +f.reset = false +f.submit = false +t = f:field(TextValue, "conf") +t.rmempty = true +t.rows = 20 +function t.cfgvalue() +local logs = luci.util.execi("logread | grep authpriv | grep beardropper") +local s = "" +for line in logs do +s = line .. "\n" .. s +end +return s +end +t.readonly="readonly" + +return f diff --git a/package/ctcgfw/luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua b/package/ctcgfw/luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua new file mode 100755 index 0000000000..2735200bfd --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua @@ -0,0 +1,54 @@ + +m = Map("beardropper", translate("BearDropper"), +translate("luci-app-beardropper, the LuCI app built with the elegant firewall rule generation on-the-fly script bearDropper.

Should you have any questions, please refer to the repo: ")..[[luci-app-beardropper]] +) +m:chain("luci") + +m:section(SimpleSection).template="beardropper/status" + +s = m:section(TypedSection, "beardropper", translate("")) +s.anonymous = true +s.addremove = false + +-- TABS +s:tab("options", translate("Options")) +s:tab("blocked", translate("Blocked IP")) + +o = s:taboption("options", Flag, "enabled",translate("Enabled")) +o.default = 0 + +-- OPTIONS +o = s:taboption("options", ListValue, "defaultMode", translate("Running Mode")) +o.default = "follow" +o:value("follow", translate("Follow")) +o:value("entire", translate("Entire")) +o:value("today", translate("Today")) +o:value("wipe", translate("Wipe")) + + +o = s:taboption("options", Value, "attemptCount", translate("Attempt Tolerance"), translate("failure attempts from a given IP required to trigger a ban")) + +o = s:taboption("options", Value, "attemptPeriod", translate("Attempt Cycle"), translate("time period during which attemptCount must be exceeded in order to trigger a ban
Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds")) + +o = s:taboption("options", Value, "banLength", translate("Ban Period"), translate("how long a ban exist once the attempt threshold is exceeded")) + +o = s:taboption("options", ListValue, "logLevel", translate("Log Level")) +o.default = "1" +o:value("0", translate("Silent")) +o:value("1", translate("Default")) +o:value("2", translate("Verbose")) +o:value("3", translate("Debug")) + + +o = s:taboption("blocked", Value, "blocked", translate("Blocked IP List")) +o.template="cbi/tvalue" +o.rows=40 +o.wrap="off" +o.readonly="true" +function o.cfgvalue(e, e) + return luci.sys.exec("cat /tmp/beardropper.bddb | awk /'=1/'| awk -F '=' '{print $1}' | awk '{print substr($0,6)}' | awk 'gsub(/_/,\":\",$0)'") +end + + + +return m diff --git a/package/ctcgfw/luci-app-beardropper/luasrc/view/beardropper/status.htm b/package/ctcgfw/luci-app-beardropper/luasrc/view/beardropper/status.htm new file mode 100755 index 0000000000..808b3a0080 --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/luasrc/view/beardropper/status.htm @@ -0,0 +1,22 @@ + + +
+

+ <%:Collecting data...%> +

+
\ No newline at end of file diff --git a/package/ctcgfw/luci-app-beardropper/po/zh-cn/beardropper.po b/package/ctcgfw/luci-app-beardropper/po/zh-cn/beardropper.po new file mode 100755 index 0000000000..bcffc10793 --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/po/zh-cn/beardropper.po @@ -0,0 +1,115 @@ +bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36 +msgid "Attempt Cycle" +msgstr "尝试登录时间段" + + +msgid "Setting" +msgstr "设置" + +msgid "Log" +msgstr "日志" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34 +msgid "Attempt Tolerance" +msgstr "最大尝试登录次数" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38 +msgid "Ban Period" +msgstr "封禁IP时长" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/controller/bearDropper.lua:7 +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:7 +msgid "BearDropper" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:20 +msgid "Blocked IP" +msgstr "屏蔽列表" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:52 +msgid "Blocked IP List" +msgstr "已屏蔽IP列表" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:20 +msgid "Collecting data..." +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:45 +msgid "Debug" +msgstr "调试" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:43 +msgid "Default" +msgstr "默认" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:22 +msgid "Enabled" +msgstr "启用" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:29 +msgid "Entire" +msgstr "已有记录" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:28 +msgid "Follow" +msgstr "后台监控" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:40 +msgid "Log Level" +msgstr "日志等级" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:10 +msgid "NOT RUNNING" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:19 +msgid "Options" +msgstr "选项" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:7 +msgid "RUNNING" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:26 +msgid "Running Mode" +msgstr "运行模式" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:42 +msgid "Silent" +msgstr "安静" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:30 +msgid "Today" +msgstr "仅今日" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:44 +msgid "Verbose" +msgstr "详细" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:31 +msgid "Wipe" +msgstr "清除所有" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34 +msgid "failure attempts from a given IP required to trigger a ban" +msgstr "尝试登录超过设定值次数的IP将被封禁" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38 +msgid "how long a ban exist once the attempt threshold is exceeded" +msgstr "IP将被封禁设定的时间" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:8 +msgid "" +"luci-app-beardropper, the LuCI app built with the elegant firewall rule " +"generation on-the-fly script bearDropper.

Should you have any " +"questions, please refer to the repo:" +msgstr "" +"luci-app-beardropper, 是一款能够在开启公网访问之后对潜在的ssh attack进行防御" +"的脚本.

如果你在使用中有任何问题,请到项目中提问: " + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36 +msgid "" +"time period during which attemptCount must be exceeded in order to trigger a " +"ban
Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds" +msgstr "" +"在设定的时间段内连续尝试失败
格式:1w2d3h4m5s代表1周2天3小时4分5秒" diff --git a/package/ctcgfw/luci-app-beardropper/po/zh-tw/beardropper.po b/package/ctcgfw/luci-app-beardropper/po/zh-tw/beardropper.po new file mode 100644 index 0000000000..00c1da72ea --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/po/zh-tw/beardropper.po @@ -0,0 +1,115 @@ +bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36 +msgid "Attempt Cycle" +msgstr "嘗試登錄時間段" + + +msgid "Setting" +msgstr "設置" + +msgid "Log" +msgstr "日誌" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34 +msgid "Attempt Tolerance" +msgstr "最大嘗試登錄次數" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38 +msgid "Ban Period" +msgstr "封禁IP時長" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/controller/bearDropper.lua:7 +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:7 +msgid "BearDropper" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:20 +msgid "Blocked IP" +msgstr "屏蔽列表" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:52 +msgid "Blocked IP List" +msgstr "已屏蔽IP列表" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:20 +msgid "Collecting data..." +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:45 +msgid "Debug" +msgstr "調試" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:43 +msgid "Default" +msgstr "默認" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:22 +msgid "Enabled" +msgstr "啟用" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:29 +msgid "Entire" +msgstr "已有記錄" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:28 +msgid "Follow" +msgstr "後臺監控" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:40 +msgid "Log Level" +msgstr "日誌等級" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:10 +msgid "NOT RUNNING" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:19 +msgid "Options" +msgstr "選項" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:7 +msgid "RUNNING" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:26 +msgid "Running Mode" +msgstr "運行模式" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:42 +msgid "Silent" +msgstr "安靜" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:30 +msgid "Today" +msgstr "僅今日" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:44 +msgid "Verbose" +msgstr "詳細" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:31 +msgid "Wipe" +msgstr "清除所有" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34 +msgid "failure attempts from a given IP required to trigger a ban" +msgstr "嘗試登錄超過設定值次數的IP將被封禁" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38 +msgid "how long a ban exist once the attempt threshold is exceeded" +msgstr "IP將被封禁設定的時間" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:8 +msgid "" +"luci-app-beardropper, the LuCI app built with the elegant firewall rule " +"generation on-the-fly script bearDropper.

Should you have any " +"questions, please refer to the repo:" +msgstr "" +"luci-app-beardropper, 是壹款能夠在開啟公網訪問之後對潛在的ssh attack進行防禦" +"的腳本.

如果妳在使用中有任何問題,請到項目中提問: " + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36 +msgid "" +"time period during which attemptCount must be exceeded in order to trigger a " +"ban
Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds" +msgstr "" +"在設定的時間段內連續嘗試失敗
格式:1w2d3h4m5s代表1周2天3小時4分5秒" diff --git a/package/ctcgfw/luci-app-beardropper/root/etc/config/beardropper b/package/ctcgfw/luci-app-beardropper/root/etc/config/beardropper new file mode 100644 index 0000000000..ec5d0d4e05 --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/root/etc/config/beardropper @@ -0,0 +1,18 @@ +config beardropper + option attemptCount '5' + option attemptPeriod '12h' + option banLength '1w' + option logFacility 'authpriv.notice' + option fileStateType 'bddb' + option fileStateTempPrefix '/tmp/beardropper' + option fileStatePersistPrefix '/etc/beardropper' + list firewallHookChain 'input_wan_rule:1' + list firewallHookChain 'forwarding_wan_rule:1' + option firewallTarget 'DROP' + list logRegex 's/[`$"\'\'']//g' + list logRegex '/has invalid shell, rejected$/d' + list logRegex '/^[A-Za-z ]+[0-9: ]+authpriv.warn dropbear\[.+([0-9]+\.){3}[0-9]+/p' + list logRegex '/^[A-Za-z ]+[0-9: ]+authpriv.info dropbear\[.+:\ Exit before auth:.*/p' + option defaultMode 'follow' + option enabled '1' + option logLevel '2' diff --git a/package/ctcgfw/luci-app-beardropper/root/etc/init.d/beardropper b/package/ctcgfw/luci-app-beardropper/root/etc/init.d/beardropper new file mode 100755 index 0000000000..a7c1c98dbc --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/root/etc/init.d/beardropper @@ -0,0 +1,46 @@ +#!/bin/sh /etc/rc.common +START=98 + +PROG=/usr/sbin/beardropper +SERVICE_DAEMONIZE=1 +SERVICE_WRITE_PID=1 + +getKids() { + egrep "^PPid: *$1$" /proc/[0-9]*/s*s 2>/dev/null | cut -f3 -d/ | xargs echo +} + +start() { + service_start ${PROG} -m follow + echo "beardropper started!" +} + +stop() { + #PID=`cat /var/run/bearDropper.pid` + #kill `getKids $PID` + kill -9 `pgrep -f /usr/sbin/beardropper` + sleep 1 + service_stop ${PROG} + echo "beardropper exit...." +} + +restart() { + enabled=$(uci get beardropper.@beardropper[0].enabled) + pgrep -f ${PROG} >/dev/null + if [ $? -eq 0 ];then #running + if [ $enabled -eq 1 ]; then + stop + sleep 1 + echo "beardropper is restarting..." + start + else + stop + fi + else + if [ $enabled -eq 1 ]; then + start + else + exit 0 + fi + fi + +} diff --git a/package/ctcgfw/luci-app-beardropper/root/etc/uci-defaults/luci-beardropper b/package/ctcgfw/luci-app-beardropper/root/etc/uci-defaults/luci-beardropper new file mode 100755 index 0000000000..b484337f27 --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/root/etc/uci-defaults/luci-beardropper @@ -0,0 +1,12 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@beardropper[-1] + add ucitrack beardropper + set ucitrack.@beardropper[-1].init=beardropper + commit ucitrack +EOF + +touch /tmp/beardropper.bddb +rm -rf /tmp/luci-* +exit 0 diff --git a/package/ctcgfw/luci-app-beardropper/root/usr/sbin/beardropper b/package/ctcgfw/luci-app-beardropper/root/usr/sbin/beardropper new file mode 100755 index 0000000000..d3015491fe --- /dev/null +++ b/package/ctcgfw/luci-app-beardropper/root/usr/sbin/beardropper @@ -0,0 +1,517 @@ +#!/bin/ash +# +# beardropper - dropbear log parsing ban agent for OpenWRT (Chaos Calmer rewrite of dropBrute.sh) +# http://github.com/robzr/bearDropper -- Rob Zwissler 11/2015 +# +# - lightweight, no dependencies, busybox ash + native OpenWRT commands +# - uses uci for configuration, overrideable via command line arguments +# - runs continuously in background (via init script) or periodically (via cron) +# - uses BIND time shorthand, ex: 1w5d3h1m8s is 1 week, 5 days, 3 hours, 1 minute, 8 seconds +# - Whitelist IP or CIDR entries (TBD) in uci config file +# - Records state file to tmpfs and intelligently syncs to persistent storage (can disable) +# - Persistent sync routines are optimized to avoid excessive writes (persistentStateWritePeriod) +# - Every run occurs in one of the following modes. If not specified, interval mode (24 hours) is +# the default when not specified (the init script specifies follow mode via command line) +# +# "follow" mode follows syslog to process entries as they happen; generally launched via init +# script. Responds the fastest, runs the most efficiently, but is always in memory. +# "interval" mode only processes entries going back the specified interval; requires +# more processing than today mode, but responds more accurately. Use with cron. +# "today" mode looks at log entries from the day it is being run, simple and lightweight, +# generally run from cron periodically (same simplistic behavior as dropBrute.sh) +# "entire" mode runs through entire contents of the syslog ring buffer +# "wipe" mode tears down the firewall rules and removes the state files + +# Load UCI config variable, or use default if not set +# Args: $1 = variable name (also uci option name), $2 = default_value +uciSection='beardropper.@[0]' +uciLoadVar () { + local getUci + getUci=`uci -q get ${uciSection}."$1"` || getUci="$2" + eval $1=\'$getUci\'; +} +uciLoad() { + local tFile=`mktemp` delim=" +" + [ "$1" = -d ] && { delim="$2"; shift 2; } + uci -q -d"$delim" get "$uciSection.$1" 2>/dev/null >$tFile + if [ $? = 0 ] ; then + sed -e s/^\'// -e s/\'$// <$tFile + else + while [ -n "$2" ]; do echo $2; shift; done + fi + rm -f $tFile +} + +# Common config variables - edit these in /etc/config/beardropper +# or they can be overridden at runtime with command line options +# +uciLoadVar defaultMode entire +uciLoadVar enabled 0 +uciLoadVar attemptCount 10 +uciLoadVar attemptPeriod 12h +uciLoadVar banLength 1w +uciLoadVar logLevel 1 +uciLoadVar logFacility authpriv.notice +uciLoadVar persistentStateWritePeriod -1 +uciLoadVar fileStateType bddb +uciLoadVar fileStateTempPrefix /tmp/beardropper +uciLoadVar fileStatePersistPrefix /etc/beardropper +firewallHookChains="`uciLoad -d \ firewallHookChain input_wan_rule:1 forwarding_wan_rule:1`" +uciLoadVar firewallTarget DROP + +# Not commonly changed, but changeable via uci or cmdline (primarily +# to enable multiple parallel runs with different parameters) +uciLoadVar firewallChain beardropper + +# Advanced variables, changeable via uci only (no cmdline), it is +# unlikely that these will need to be changed, but just in case... +# +uciLoadVar syslogTag "beardropper[$$]" +# how often to attempt to expire bans when in follow mode +uciLoadVar followModeCheckInterval 30m +uciLoadVar cmdLogread 'logread' # for tuning, ex: "logread -l250" +uciLoadVar cmdLogreadEba 'logread' # for "Exit before auth:" backscanning +uciLoadVar formatLogDate '%b %e %H:%M:%S %Y' # used to convert syslog dates +uciLoadVar formatTodayLogDateRegex '^%a %b %e ..:..:.. %Y' # filter for today mode + +# Begin functions +# +# Clear bddb entries from environment +bddbClear () { + local bddbVar + for bddbVar in `set | egrep '^bddb_[0-9_]*=' | cut -f1 -d= | xargs echo -n` ; do eval unset $bddbVar ; done + bddbStateChange=1 +} + +# Returns count of unique IP entries in environment +bddbCount () { set | egrep '^bddb_[0-9_]*=' | wc -l ; } + +# Loads existing bddb file into environment +# Arg: $1 = file, $2 = type (bddb/bddbz), $3 = +bddbLoad () { + local loadFile="$1.$2" fileType="$2" + if [ "$fileType" = bddb -a -f "$loadFile" ] ; then + . "$loadFile" + elif [ "$fileType" = bddbz -a -f "$loadFile" ] ; then + local tmpFile="`mktemp`" + zcat $loadFile > "$tmpFile" + . "$tmpFile" + rm -f "$tmpFile" + fi + bddbStateChange=0 +} + +# Saves environment bddb entries to file, Arg: $1 = file to save in +bddbSave () { + local saveFile="$1.$2" fileType="$2" + if [ "$fileType" = bddb ] ; then + set | egrep '^bddb_[0-9_]*=' | sed s/\'//g > "$saveFile" + elif [ "$fileType" = bddbz ] ; then + set | egrep '^bddb_[0-9_]*=' | sed s/\'//g | gzip -c > "$saveFile" + fi + bddbStateChange=0 +} + +# Set bddb record status=1, update ban time flag with newest +# Args: $1=IP Address $2=timeFlag +bddbEnableStatus () { + local record=`echo $1 | sed -e 's/\./_/g' -e 's/^/bddb_/'` + local newestTime=`bddbGetTimes $1 | sed 's/.* //' | xargs echo $2 | tr \ '\n' | sort -n | tail -1 ` + eval $record="1,$newestTime" + bddbStateChange=1 +} + +# Args: $1=IP Address +bddbGetStatus () { + bddbGetRecord $1 | cut -d, -f1 +} + +# Args: $1=IP Address +bddbGetTimes () { + bddbGetRecord $1 | cut -d, -f2- +} + +# Args: $1 = IP address, $2 [$3 ...] = timestamp (seconds since epoch) +bddbAddRecord () { + local ip="`echo "$1" | tr . _`" ; shift + local newEpochList="$@" status="`eval echo \\\$bddb_$ip | cut -f1 -d,`" + local oldEpochList="`eval echo \\\$bddb_$ip | cut -f2- -d, | tr , \ `" + local epochList=`echo $oldEpochList $newEpochList | xargs -n 1 echo | sort -un | xargs echo -n | tr \ ,` + [ -z "$status" ] && status=0 + eval "bddb_$ip"\=\"$status,$epochList\" + bddbStateChange=1 +} + +# Args: $1 = IP address +bddbRemoveRecord () { + local ip="`echo "$1" | tr . _`" + eval unset bddb_$ip + bddbStateChange=1 +} + +# Returns all IPs (not CIDR) present in records +bddbGetAllIPs () { + local ipRaw record + set | egrep '^bddb_[0-9_]*=' | tr \' \ | while read record ; do + ipRaw=`echo $record | cut -f1 -d= | sed 's/^bddb_//'` + if [ `echo $ipRaw | tr _ \ | wc -w` -eq 4 ] ; then + echo $ipRaw | tr _ . + fi + done +} + +# retrieve single IP record, Args: $1=IP +bddbGetRecord () { + local record + record=`echo $1 | sed -e 's/\./_/g' -e 's/^/bddb_/'` + eval echo \$$record +} + +isValidBindTime () { echo "$1" | egrep -q '^[0-9]+$|^([0-9]+[wdhms]?)+$' ; } + +# expands Bind time syntax into seconds (ex: 3w6d23h59m59s), Arg: $1=time string +expandBindTime () { + isValidBindTime "$1" || { logLine 0 "Error: Invalid time specified ($1)" >&2 ; exit 254 ; } + echo $((`echo "$1" | sed -e 's/w+*/*7d+/g' -e 's/d+*/*24h+/g' -e 's/h+*/*60m+/g' -e 's/m+*/*60+/g' \ + -e s/s//g -e s/+\$//`)) +} + +# Args: $1 = loglevel, $2 = info to log +logLine () { + [ $1 -gt $logLevel ] && return + shift + if [ "$logFacility" = "stdout" ] ; then echo "$@" + elif [ "$logFacility" = "stderr" ] ; then echo "$@" >&2 + else logger -t "$syslogTag" -p "$logFacility" "$@" + fi +} + +# extra validation, fails safe. Args: $1=log line +getLogTime () { + local logDateString=`echo "$1" | sed -n \ + 's/^[A-Z][a-z]* \([A-Z][a-z]* *[0-9][0-9]* *[0-9][0-9]*:[0-9][0-9]:[0-9][0-9] [0-9][0-9]*\) .*$/\1/p'` + date -d"$logDateString" -D"$formatLogDate" +%s || logLine 1 \ + "Error: logDateString($logDateString) malformed line ($1)" +} + +# extra validation, fails safe. Args: $1=log line +getLogIP () { + local logLine="$1" + local ebaPID=`echo "$logLine" | sed -n 's/^.*authpriv.info \(dropbear\[[0-9]*\]:\) Exit before auth:.*/\1/p'` + [ -n "$ebaPID" ] && logLine=`$cmdLogreadEba | fgrep "${ebaPID} Child connection from "` + echo "$logLine" | sed -n 's/^.*[^0-9]\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p' +} + +# Args: $1=IP +unBanIP () { + if iptables -C $firewallChain -s $ip -j "$firewallTarget" 2>/dev/null ; then + logLine 1 "Removing ban rule for IP $ip from iptables" + iptables -D $firewallChain -s $ip -j "$firewallTarget" + else + logLine 3 "unBanIP() Ban rule for $ip not present in iptables" + fi +} + +# Args: $1=IP +banIP () { + local ip="$1" x chain position + if ! iptables -nL $firewallChain >/dev/null 2>/dev/null ; then + logLine 1 "Creating iptables chain $firewallChain" + iptables -N $firewallChain + fi + for x in $firewallHookChains ; do + chain="${x%:*}" ; position="${x#*:}" + if [ $position -ge 0 ] && ! iptables -C $chain -j $firewallChain 2>/dev/null ; then + logLine 1 "Inserting hook into iptables chain $chain" + if [ $position = 0 ] ; then + iptables -A $chain -j $firewallChain + else + iptables -I $chain $position -j $firewallChain + fi ; fi + done + if ! iptables -C $firewallChain -s $ip -j "$firewallTarget" 2>/dev/null ; then + logLine 1 "Inserting ban rule for IP $ip into iptables chain $firewallChain" + iptables -A $firewallChain -s $ip -j "$firewallTarget" + else + logLine 3 "banIP() rule for $ip already present in iptables chain" + fi +} + +wipeFirewall () { + local x chain position + for x in $firewallHookChains ; do + chain="${x%:*}" ; position="${x#*:}" + if [ $position -ge 0 ] ; then + if iptables -C $chain -j $firewallChain 2>/dev/null ; then + logLine 1 "Removing hook from iptables chain $chain" + iptables -D $chain -j $firewallChain + fi ; fi + done + if iptables -nL $firewallChain >/dev/null 2>/dev/null ; then + logLine 1 "Flushing and removing iptables chain $firewallChain" + iptables -F $firewallChain 2>/dev/null + iptables -X $firewallChain 2>/dev/null + fi +} + +# review state file for expired records - we could add the bantime to +# the rule via --comment but I can't think of a reason why that would +# be necessary unless there is a bug in the expiration logic. The +# state db should be more resiliant than the firewall in practice. +# +bddbCheckStatusAll () { + local now=`date +%s` + bddbGetAllIPs | while read ip ; do + if [ `bddbGetStatus $ip` -eq 1 ] ; then + logLine 3 "bddbCheckStatusAll($ip) testing banLength:$banLength + bddbGetTimes:`bddbGetTimes $ip` vs. now:$now" + if [ $((banLength + `bddbGetTimes $ip`)) -lt $now ] ; then + logLine 1 "Ban expired for $ip, removing from iptables" + unBanIP $ip + bddbRemoveRecord $ip + else + logLine 3 "bddbCheckStatusAll($ip) not expired yet" + banIP $ip + fi + elif [ `bddbGetStatus $ip` -eq 0 ] ; then + local times=`bddbGetTimes $ip | tr , \ ` + local timeCount=`echo $times | wc -w` + local lastTime=`echo $times | cut -d\ -f$timeCount` + if [ $((lastTime + attemptPeriod)) -lt $now ] ; then + bddbRemoveRecord $ip + fi ; fi + saveState + done + loadState +} + +# Only used when status is already 0 and possibly going to 1, Args: $1=IP +bddbEvaluateRecord () { + local ip=$1 firstTime lastTime + local times=`bddbGetRecord $1 | cut -d, -f2- | tr , \ ` + local timeCount=`echo $times | wc -w` + local didBan=0 + + # 1: not enough attempts => do nothing and exit + # 2: attempts exceed threshold in time period => ban + # 3: attempts exceed threshold but time period is too long => trim oldest time, recalculate + while [ $timeCount -ge $attemptCount ] ; do + firstTime=`echo $times | cut -d\ -f1` + lastTime=`echo $times | cut -d\ -f$timeCount` + timeDiff=$((lastTime - firstTime)) + logLine 3 "bddbEvaluateRecord($ip) count=$timeCount timeDiff=$timeDiff/$attemptPeriod" + if [ $timeDiff -le $attemptPeriod ] ; then + bddbEnableStatus $ip $lastTime + logLine 2 "bddbEvaluateRecord($ip) exceeded ban threshold, adding to iptables" + banIP $ip + didBan=1 + fi + times=`echo $times | cut -d\ -f2-` + timeCount=`echo $times | wc -w` + done + [ $didBan = 0 ] && logLine 2 "bddbEvaluateRecord($ip) does not exceed threshhold, skipping" +} + +# Reads filtered log line and evaluates for action Args: $1=log line +processLogLine () { + local time=`getLogTime "$1"` + local ip=`getLogIP "$1"` + local status="`bddbGetStatus $ip`" + + if [ "$status" = -1 ] ; then + logLine 2 "processLogLine($ip,$time) IP is whitelisted" + elif [ "$status" = 1 ] ; then + if [ "`bddbGetTimes $ip`" -ge $time ] ; then + logLine 2 "processLogLine($ip,$time) already banned, ban timestamp already equal or newer" + else + logLine 2 "processLogLine($ip,$time) already banned, updating ban timestamp" + bddbEnableStatus $ip $time + fi + banIP $ip + elif [ -n "$ip" -a -n "$time" ] ; then + bddbAddRecord $ip $time + logLine 2 "processLogLine($ip,$time) Added record, comparing" + bddbEvaluateRecord $ip + else + logLine 1 "processLogLine($ip,$time) malformed line ($1)" + fi +} + +# Args, $1=-f to force a persistent write (unless lastPersistentStateWrite=-1) +saveState () { + local forcePersistent=0 + [ "$1" = "-f" ] && forcePersistent=1 + + if [ $bddbStateChange -gt 0 ] ; then + logLine 3 "saveState() saving to temp state file" + bddbSave "$fileStateTempPrefix" "$fileStateType" + logLine 3 "saveState() now=`date +%s` lPSW=$lastPersistentStateWrite pSWP=$persistentStateWritePeriod fP=$forcePersistent" + fi + if [ $persistentStateWritePeriod -gt 1 ] || [ $persistentStateWritePeriod -eq 0 -a $forcePersistent -eq 1 ] ; then + if [ $((`date +%s` - lastPersistentStateWrite)) -ge $persistentStateWritePeriod ] || [ $forcePersistent -eq 1 ] ; then + if [ ! -f "$fileStatePersist" ] || ! cmp -s "$fileStateTemp" "$fileStatePersist" ; then + logLine 2 "saveState() writing to persistent state file" + bddbSave "$fileStatePersistPrefix" "$fileStateType" + lastPersistentStateWrite="`date +%s`" + fi ; fi ; fi +} + +loadState () { + bddbClear + bddbLoad "$fileStatePersistPrefix" "$fileStateType" + bddbLoad "$fileStateTempPrefix" "$fileStateType" + logLine 2 "loadState() loaded `bddbCount` entries" +} + +printUsage () { + cat <<-_EOF_ + Usage: beardropper [-m mode] [-a #] [-b #] [-c ...] [-C ...] [-f ...] [-l #] [-j ...] [-p #] [-P #] [-s ...] + + Running Modes (-m) (def: $defaultMode) + follow constantly monitors log + entire processes entire log contents + today processes log entries from same day only + # interval mode, specify time string or seconds + wipe wipe state files, unhook and remove firewall chain + + Options + -a # attempt count before banning (def: $attemptCount) + -b # ban length once attempts hit threshold (def: $banLength) + -c ... firewall chain to record bans (def: $firewallChain) + -C ... firewall chains/positions to hook into (def: $firewallHookChains) + -f ... log facility (syslog facility or stdout/stderr) (def: $logFacility) + -j ... firewall target (def: $firewallTarget) + -l # log level - 0=off, 1=standard, 2=verbose (def: $logLevel) + -p # attempt period which attempt counts must happen in (def: $attemptPeriod) + -P # persistent state file write period (def: $persistentStateWritePeriod) + -s ... persistent state file prefix (def: $fileStatePersistPrefix) + -t ... temporary state file prefix (def: $fileStateTempPrefix) + + All time strings can be specified in seconds, or using BIND style + time strings, ex: 1w2d3h5m30s is 1 week, 2 days, 3 hours, etc... + + _EOF_ +} + +# Begin main logic +# +unset logMode +while getopts a:b:c:C:f:hj:l:m:p:P:s:t: arg ; do + case "$arg" in + a) attemptCount="$OPTARG" ;; + b) banLength="$OPTARG" ;; + c) firewallChain="$OPTARG" ;; + C) firewallHookChains="$OPTARG" ;; + f) logFacility="$OPTARG" ;; + j) firewallTarget="$OPTARG" ;; + l) logLevel="$OPTARG" ;; + m) logMode="$OPTARG" ;; + p) attemptPeriod="$OPTARG" ;; + P) persistentStateWritePeriod="$OPTARG" ;; + s) fileStatePersistPrefix="$OPTARG" ;; + s) fileStatePersistPrefix="$OPTARG" ;; + *) printUsage + exit 254 + esac + shift `expr $OPTIND - 1` +done +[ -z $logMode ] && logMode="$defaultMode" + +fileStateTemp="$fileStateTempPrefix.$fileStateType" +fileStatePersist="$fileStatePersistPrefix.$fileStateType" + +attemptPeriod=`expandBindTime $attemptPeriod` +banLength=`expandBindTime $banLength` +[ $persistentStateWritePeriod != -1 ] && persistentStateWritePeriod=`expandBindTime $persistentStateWritePeriod` +followModeCheckInterval=`expandBindTime $followModeCheckInterval` +exitStatus=0 + +# Here we convert the logRegex list into a sed -f file +fileRegex="/tmp/beardropper.$$.regex" +uciLoad logRegex 's/[`$"'\\\'']//g' '/has invalid shell, rejected$/d' \ + '/^[A-Za-z ]+[0-9: ]+authpriv.warn dropbear\[.+([0-9]+\.){3}[0-9]+/p' \ + '/^[A-Za-z ]+[0-9: ]+authpriv.info dropbear\[.+:\ Exit before auth:.*/p' > "$fileRegex" +lastPersistentStateWrite="`date +%s`" +loadState +bddbCheckStatusAll + +# main event loops + +if [ "$logMode" = follow ] ; then + logLine 1 "Running in follow mode" + readsSinceSave=0 lastCheckAll=0 worstCaseReads=1 tmpFile="/tmp/beardropper.$$.1" +# Verify if these do any good - try saving to a temp. Scope may make saveState useless. + trap "rm -f "$tmpFile" "$fileRegex" ; exit " SIGINT + [ $persistentStateWritePeriod -gt 1 ] && worstCaseReads=$((persistentStateWritePeriod / followModeCheckInterval)) + firstRun=1 + $cmdLogread -f | while read -t $followModeCheckInterval line || true ; do + if [ $firstRun -eq 1 ] ; then + trap "saveState -f" SIGHUP + trap "saveState -f; exit" SIGINT + firstRun=0 + fi + sed -nEf "$fileRegex" > "$tmpFile" <<-_EOF_ + $line + _EOF_ + line="`cat $tmpFile`" + [ -n "$line" ] && processLogLine "$line" + logLine 3 "ReadComp:$readsSinceSave/$worstCaseReads" + if [ $((++readsSinceSave)) -ge $worstCaseReads ] ; then + now="`date +%s`" + if [ $((now - lastCheckAll)) -ge $followModeCheckInterval ] ; then + bddbCheckStatusAll + lastCheckAll="$now" + saveState + readsSinceSave=0 + fi + fi + done +elif [ "$logMode" = entire ] ; then + logLine 1 "Running in entire mode" + $cmdLogread | sed -nEf "$fileRegex" | while read line ; do + processLogLine "$line" + saveState + done + loadState + bddbCheckStatusAll + saveState -f +elif [ "$logMode" = today ] ; then + logLine 1 "Running in today mode" + # merge the egrep into sed with -e /^$formatTodayLogDateRegex/!d + $cmdLogread | egrep "`date +\'$formatTodayLogDateRegex\'`" | sed -nEf "$fileRegex" | while read line ; do + processLogLine "$line" + saveState + done + loadState + bddbCheckStatusAll + saveState -f +elif isValidBindTime "$logMode" ; then + logInterval=`expandBindTime $logMode` + logLine 1 "Running in interval mode (reviewing $logInterval seconds of log entries)..." + timeStart=$((`date +%s` - logInterval)) + $cmdLogread | sed -nEf "$fileRegex" | while read line ; do + timeWhen=`getLogTime "$line"` + [ $timeWhen -ge $timeStart ] && processLogLine "$line" + saveState + done + loadState + bddbCheckStatusAll + saveState -f +elif [ "$logMode" = wipe ] ; then + logLine 2 "Wiping state files, unhooking and removing iptables chains" + wipeFirewall + if [ -f "$fileStateTemp" ] ; then + logLine 1 "Removing non-persistent statefile ($fileStateTemp)" + rm -f "$fileStateTemp" + fi + if [ -f "$fileStatePersist" ] ; then + logLine 1 "Removing persistent statefile ($fileStatePersist)" + rm -f "$fileStatePersist" + fi +else + logLine 0 "Error: invalid log mode ($logMode)" + exitStatus=254 +fi + +rm -f "$fileRegex" +exit $exitStatus From cca14e259a6e8245a26f008d411f91b1ed906c78 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Thu, 23 Jul 2020 17:36:33 +0800 Subject: [PATCH 3/3] luci-app-clash: sync with upstream source --- package/ntlf9t/luci-app-clash/Makefile | 9 ++--- .../luasrc/controller/clash.lua | 23 ----------- .../luasrc/model/cbi/clash/client/client.lua | 7 +--- .../model/cbi/clash/config/servers-config.lua | 20 +++------- .../luasrc/model/cbi/clash/update/update.lua | 16 ++------ .../luasrc/view/clash/update.htm | 12 +----- .../luasrc/view/clash/upload_core.htm | 3 +- .../luci-app-clash/root/etc/init.d/clash | 39 +----------------- .../share/clash/check_clashr_core_version.sh | 12 ------ .../root/usr/share/clash/core_download.sh | 40 +------------------ .../root/usr/share/clash/create/create.sh | 9 ++++- .../root/usr/share/clash/dashboard/index.html | 2 +- ...s => 1.bundle.3f7e8457ba9e97b6d7c9.min.js} | 4 +- .../js/bundle.3f7e8457ba9e97b6d7c9.min.js | 1 + .../js/bundle.4563da698059d88c08dc.min.js | 1 - ...08dc.css => main.3f7e8457ba9e97b6d7c9.css} | 2 +- .../root/usr/share/clash/iprules.sh | 8 ++-- .../root/usr/share/clash/luci_version | 2 +- ...497e7acca.js => 9.e5ebc45c57147750a8b7.js} | 2 +- .../clash/yacd/app.09d100e5dacbf4f76606.js | 2 - .../clash/yacd/app.2710ac87312332833aa4.js | 2 + ...> app.2710ac87312332833aa4.js.LICENSE.txt} | 0 ...5f5f9.css => app.bb773b8bdd4263de9ffd.css} | 2 +- .../yacd/core-js~app.36c6f0077ac1e602b325.js | 1 - .../yacd/core-js~app.4e0935a458133ffa9ca3.js | 1 + .../root/usr/share/clash/yacd/index.html | 2 +- .../yacd/proxies.77fef0018a8d1766e6eb.js | 1 - .../yacd/proxies.beaddeef3e0db08db953.js | 1 + .../root/usr/share/clash/yacd/report.html | 4 +- .../clash/yacd/rules.3ba17dd53c9d8bd8b221.css | 4 ++ .../clash/yacd/rules.664f8b737878361937cb.css | 1 - .../clash/yacd/rules.90faad053acc32c74a88.js | 1 + .../clash/yacd/rules.efd650d64b4afda8d49b.js | 1 - .../yacd/runtime.2f322c031bcb67b98af2.js | 1 - .../yacd/runtime.30479c2b09f71505cee3.js | 1 + .../vendors~rules.b2e93c21da80f9dc4a80.js | 1 + 36 files changed, 51 insertions(+), 187 deletions(-) delete mode 100755 package/ntlf9t/luci-app-clash/root/usr/share/clash/check_clashr_core_version.sh rename package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/{1.bundle.4563da698059d88c08dc.min.js => 1.bundle.3f7e8457ba9e97b6d7c9.min.js} (78%) create mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/bundle.3f7e8457ba9e97b6d7c9.min.js delete mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/bundle.4563da698059d88c08dc.min.js rename package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/{main.4563da698059d88c08dc.css => main.3f7e8457ba9e97b6d7c9.css} (99%) rename package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/{8.872bd111e9c497e7acca.js => 9.e5ebc45c57147750a8b7.js} (62%) delete mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/app.09d100e5dacbf4f76606.js create mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/app.2710ac87312332833aa4.js rename package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/{app.09d100e5dacbf4f76606.js.LICENSE.txt => app.2710ac87312332833aa4.js.LICENSE.txt} (100%) rename package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/{app.b814d6460bc4d015f5f9.css => app.bb773b8bdd4263de9ffd.css} (98%) delete mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/core-js~app.36c6f0077ac1e602b325.js create mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/core-js~app.4e0935a458133ffa9ca3.js delete mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/proxies.77fef0018a8d1766e6eb.js create mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/proxies.beaddeef3e0db08db953.js create mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/rules.3ba17dd53c9d8bd8b221.css delete mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/rules.664f8b737878361937cb.css create mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/rules.90faad053acc32c74a88.js delete mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/rules.efd650d64b4afda8d49b.js delete mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/runtime.2f322c031bcb67b98af2.js create mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/runtime.30479c2b09f71505cee3.js create mode 100644 package/ntlf9t/luci-app-clash/root/usr/share/clash/yacd/vendors~rules.b2e93c21da80f9dc4a80.js diff --git a/package/ntlf9t/luci-app-clash/Makefile b/package/ntlf9t/luci-app-clash/Makefile index 4ab20717dc..b08057703d 100644 --- a/package/ntlf9t/luci-app-clash/Makefile +++ b/package/ntlf9t/luci-app-clash/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-clash -PKG_VERSION:=v1.7.5.4 +PKG_VERSION:=v1.7.5.5 PKG_MAINTAINER:=frainzy1477 include $(INCLUDE_DIR)/package.mk @@ -117,7 +117,6 @@ define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/share/clash/yacd $(INSTALL_DIR) $(1)/etc/clash/clashtun $(INSTALL_DIR) $(1)/etc/clash/dtun - $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_DIR) $(1)/usr/share/clashbackup $(INSTALL_DIR) $(1)/usr/share/clash/create $(INSTALL_DIR) $(1)/etc/clash/provider @@ -145,10 +144,10 @@ define Package/$(PKG_NAME)/install $(INSTALL_BIN) ./root/usr/share/clash/clash.txt $(1)/usr/share/clash $(INSTALL_BIN) ./root/usr/share/clash/dashboard/index.html $(1)/etc/clash/dashboard - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/main.4563da698059d88c08dc.css $(1)/etc/clash/dashboard + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/main.3f7e8457ba9e97b6d7c9.css $(1)/etc/clash/dashboard $(INSTALL_BIN) ./root/usr/share/clash/dashboard/img/ffac0fa1d89f15922b4594863b8b32e9.png $(1)/etc/clash/dashboard/img - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/1.bundle.4563da698059d88c08dc.min.js $(1)/etc/clash/dashboard/js - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/bundle.4563da698059d88c08dc.min.js $(1)/etc/clash/dashboard/js + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/1.bundle.3f7e8457ba9e97b6d7c9.min.js $(1)/etc/clash/dashboard/js + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/bundle.3f7e8457ba9e97b6d7c9.min.js $(1)/etc/clash/dashboard/js $(INSTALL_BIN) ./root/usr/share/clash/yacd/* $(1)/usr/share/clash/yacd $(INSTALL_DATA) ./luasrc/clash.lua $(1)/usr/lib/lua/luci diff --git a/package/ntlf9t/luci-app-clash/luasrc/controller/clash.lua b/package/ntlf9t/luci-app-clash/luasrc/controller/clash.lua index af695ae742..bc545a57b5 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/controller/clash.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/controller/clash.lua @@ -178,9 +178,6 @@ local function check_core() return luci.sys.exec("sh /usr/share/clash/check_core_version.sh") end -local function check_clashr_core() - return luci.sys.exec("sh /usr/share/clash/check_clashr_core_version.sh") -end local function check_clashtun_core() return luci.sys.exec("sh /usr/share/clash/check_clashtun_core_version.sh") @@ -198,9 +195,6 @@ local function new_core_version() return luci.sys.exec("sed -n 1p /usr/share/clash/new_core_version") end -local function new_clashr_core_version() - return luci.sys.exec("sed -n 1p /usr/share/clash/new_clashr_core_version") -end local function new_clashtun_core_version() return luci.sys.exec("sed -n 1p /usr/share/clash/new_clashtun_core_version") @@ -233,18 +227,6 @@ local function clash_core() end -local function clashr_core() - if nixio.fs.access("/usr/bin/clash") then - local core=luci.sys.exec("/usr/bin/clash -v 2>/dev/null |awk -F ' ' '{print $2}'") - if core ~= "" then - return luci.sys.exec("/usr/bin/clash -v 2>/dev/null |awk -F ' ' '{print $2}'") - else - return luci.sys.exec("sed -n 1p /usr/share/clash/corer_version") - end - else - return "0" - end -end local function clashtun_core() @@ -333,11 +315,8 @@ function check_status() check_version = check_version(), check_core = check_core(), current_version = current_version(), - check_clashr_core = check_clashr_core(), new_version = new_version(), - new_clashr_core_version = new_clashr_core_version(), clash_core = clash_core(), - clashr_core = clashr_core(), check_dtun_core = check_dtun_core(), new_dtun_core = new_dtun_core(), clashtun_core = clashtun_core(), @@ -361,9 +340,7 @@ function action_status() new_core_version = new_core_version(), new_clashtun_core_version =new_clashtun_core_version(), new_version = new_version(), - new_clashr_core_version = new_clashr_core_version(), clash_core = clash_core(), - clashr_core = clashr_core(), dtun_core = dtun_core(), dash_pass = dash_pass(), clashtun_core = clashtun_core(), diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client/client.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client/client.lua index 60dd78193e..85d0af5b8d 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client/client.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client/client.lua @@ -18,16 +18,13 @@ o.default = "clashcore" if nixio.fs.access("/etc/clash/clash") then o:value("1", translate("Clash")) end -if nixio.fs.access("/usr/bin/clash") then -o:value("2", translate("Clashr")) -end if nixio.fs.access("/etc/clash/clashtun/clash") then o:value("3", translate("Clash(cTun)")) end if nixio.fs.access("/etc/clash/dtun/clash") then -o:value("4", translate("Clash(dTun)")) +o:value("4", translate("Clash(premium)")) end -o.description = translate("Select core, clashr support ssr while clash does not.") + o = s:option(ListValue, "g_rules", translate("Game Rules")) o.default = "0" diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/config/servers-config.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/config/servers-config.lua index ad8a36fbad..a88c1f0b6c 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/config/servers-config.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/config/servers-config.lua @@ -43,22 +43,9 @@ local encrypt_methods_ssr = { "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", - "aes-128-ofb", - "aes-192-ofb", - "aes-256-ofb", - "des-cfb", - "bf-cfb", - "cast5-cfb", "rc4-md5", - "chacha20", "chacha20-ietf", - "salsa20", - "camellia-128-cfb", - "camellia-192-cfb", - "camellia-256-cfb", - "idea-cfb", - "rc2-cfb", - "seed-cfb", + } @@ -68,6 +55,8 @@ local protocol_ssr = { "auth_sha1_v4", "auth_aes128_md5", "auth_aes128_sha1", + "auth_chain_a", + "auth_chain_b", } @@ -77,6 +66,8 @@ local obfs_ssr_list = { "http_simple", "http_post", "tls1.2_ticket_auth", + "tls1.2_ticket_fastauth", + "random_head", } m = Map(clash, translate("Edit Server")) @@ -201,6 +192,7 @@ o = s:option(ListValue, "udp", translate("udp")) o:value("true") o:value("false") o:depends("type", "ss") +o:depends("type", "ssr") o:depends("type", "vmess") o:depends("type", "socks5") o:depends("type", "trojan") diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/update/update.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/update/update.lua index f586b66606..22daeaf78d 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/update/update.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/update/update.lua @@ -26,11 +26,9 @@ o.description =''..font_red..bold_on..translate("Manually download, unzip and re .."
" ..translate("Dreamacro clash tun core (dtun) - (https://github.com/Dreamacro/clash/releases/tag/premium)") .."
" -..translate("comzyh clash tun core (ctun) - (https://github.com/comzyh/clash/releases)") -.."
" ..translate("Dreamacro clash core - (https://github.com/Dreamacro/clash/releases)") .."
" -..translate("Frainzy1477 clashr core - (https://github.com/frainzy1477/clashrdev/releases)") +..translate("comzyh clash tun core (ctun) - (https://github.com/comzyh/clash/releases)") .."
" ..translate("Frainzy1477 clash core - (https://github.com/frainzy1477/clash_dev/releases)") @@ -42,7 +40,6 @@ um.template = "clash/clash_dvalue" local dir, fd,dtun,ctun,cssr dir = "/etc/clash/" -cssr="/usr/bin/" dtun="/etc/clash/dtun/" ctun="/etc/clash/clashtun/" @@ -54,8 +51,6 @@ http.setfilehandler( if fp == "clash" then if meta and chunk then fd = nixio.open(dir .. meta.file, "w") end - elseif fp == "clashr" then - if meta and chunk then fd = nixio.open(cssr .. meta.file, "w") end elseif fp == "clashctun" then if meta and chunk then fd = nixio.open(ctun .. meta.file, "w") end elseif fp == "clashdtun" then @@ -78,10 +73,6 @@ http.setfilehandler( SYS.exec("chmod 755 /etc/clash/clash 2>&1 &") SYS.exec("rm -rf /usr/share/clash/core_version 2>/dev/null && /etc/clash/clash -v | awk -F ' ' '{print $2}' >> /usr/share/clash/core_version 2>/dev/null") um.value = translate("File saved to") .. ' "/etc/clash/'..meta.file..'"' - elseif fp == "clashr" then - SYS.exec("chmod 755 /usr/bin/clash 2>&1 &") - SYS.exec("rm -rf /usr/share/clash/corer_version 2>/dev/null && /usr/bin/clash -v | awk -F ' ' '{print $2}' >> /usr/share/clash/corer_version 2>/dev/null") - um.value = translate("File saved to") .. ' "/usr/bin/'..meta.file..'"' elseif fp == "clashctun" then SYS.exec("chmod 755 /etc/clash/clashtun/clash 2>&1 &") SYS.exec("rm -rf /usr/share/clash/tun_version 2>/dev/null && /etc/clash/clashtun/clash -v | awk -F ' ' '{print $2}' >> /usr/share/clash/tun_version 2>/dev/null") @@ -116,10 +107,9 @@ s.anonymous = true o = s:option(ListValue, "dcore", translate("Core Type")) o.default = "clashcore" o:value("1", translate("Clash")) -o:value("2", translate("Clashr")) o:value("3", translate("Clash(ctun)")) -o:value("4", translate("Clash(dtun)")) -o.description = translate("Select core, clashr support ssr while clash does not.") +o:value("4", translate("Clash(premium)")) + local cpu_model=SYS.exec("opkg status libc 2>/dev/null |grep 'Architecture' |awk -F ': ' '{print $2}' 2>/dev/null") diff --git a/package/ntlf9t/luci-app-clash/luasrc/view/clash/update.htm b/package/ntlf9t/luci-app-clash/luasrc/view/clash/update.htm index 0d82602c00..3b81f407fd 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/view/clash/update.htm +++ b/package/ntlf9t/luci-app-clash/luasrc/view/clash/update.htm @@ -13,14 +13,11 @@ clash <%:Collecting data...%> <%:Checking...%> - - clashr <%:Collecting data...%> <%:Checking...%> - clash(ctun) <%:Collecting data...%> <%:Checking...%> - clash(dtun) <%:Collecting data...%> <%:Checking...%> + clash(premium) <%:Collecting data...%> <%:Checking...%> luci-app-clash <%:Collecting data...%> <%:Checking...%> @@ -38,7 +35,6 @@ var version = document.getElementById('_version'); var core = document.getElementById('_core'); - var corer = document.getElementById('_corer'); var coretun = document.getElementById('_coretun'); var version_butt = document.getElementById('_versionbutt'); var core_butt = document.getElementById('_corebutt'); @@ -55,11 +51,6 @@ }else{ core.innerHTML = status.clash_core ? ''+status.clash_core+' ' : '<%:Checking...%>'; } - if(status.clashr_core==0){ - corer.innerHTML = status.clashr_core ? '<%:Not Installed%> ' : '<%:Checking...%>'; - }else{ - corer.innerHTML = status.clashr_core ? ''+status.clashr_core+' ' : '<%:Checking...%>'; - } if(status.clashtun_core==0){ coretun.innerHTML = status.clashtun_core ? '<%:Not Installed%> ' : '<%:Checking...%>'; }else{ @@ -83,7 +74,6 @@ if ( x && x.status == 200 ) { version_butt.innerHTML = status.current_version ? ''+status.new_version+' ' : '<%:Checking...%>'; core_butt.innerHTML = status.current_version ? ''+status.new_core_version+' ' : '<%:Checking...%>'; - corer_butt.innerHTML = status.current_version ? ''+status.new_clashr_core_version+' ' : '<%:Checking...%>'; coretun_butt.innerHTML = status.current_version ? ''+status.new_clashtun_core_version+' ' : '<%:Checking...%>'; coredtun_butt.innerHTML = status.current_version ? ''+status.new_dtun_core+' ' : '<%:Checking...%>'; diff --git a/package/ntlf9t/luci-app-clash/luasrc/view/clash/upload_core.htm b/package/ntlf9t/luci-app-clash/luasrc/view/clash/upload_core.htm index bff2304b7e..0359419ade 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/view/clash/upload_core.htm +++ b/package/ntlf9t/luci-app-clash/luasrc/view/clash/upload_core.htm @@ -1,9 +1,8 @@ <%+cbi/valueheader%> diff --git a/package/ntlf9t/luci-app-clash/root/etc/init.d/clash b/package/ntlf9t/luci-app-clash/root/etc/init.d/clash index ccc00760d8..679a6a0e0a 100644 --- a/package/ntlf9t/luci-app-clash/root/etc/init.d/clash +++ b/package/ntlf9t/luci-app-clash/root/etc/init.d/clash @@ -4,7 +4,6 @@ START=99 STOP=15 CLASH="/etc/clash/clash" -CLASHR="/usr/bin/clash" CLASHT="/etc/clash/clashtun/clash" CLASHD="/etc/clash/dtun/clash" CLASH_CONFIG="/etc/clash" @@ -455,22 +454,11 @@ if [ "${core}" -eq 1 ] && [ ! -f /etc/clash/clash ]; then echo "找不到/etc/clash/clash,请从更新页下载clash内核" >> $REAL_LOG fi - echo "Clash for OpenWRT" >$REAL_LOG - exit 0 -elif [ "${core}" -eq 2 ] && [ ! -f /usr/bin/clash ]; then - if [ "${lang}" == "en" ] || [ $lang == "auto" ];then - echo " $(date "+%Y-%m-%d %H:%M:%S") - clashr core not found in /usr/bin/clash download and install clashr from update page " >> /usr/share/clash/clash.txt - echo "clashr core not found, download and install clash from update page" >> $REAL_LOG - elif [ "${lang}" == "zh_cn" ];then - echo " $(date "+%Y-%m-%d %H:%M:%S") - 找不到/usr/bin/clash,请从更新页下载clashr内核" >> /usr/share/clash/clash.txt - echo "找不到/usr/bin/clash,请从更新页下载clashr内核" >> $REAL_LOG - fi - echo "Clash for OpenWRT" >$REAL_LOG exit 0 elif [ "${core}" -eq 3 ] && [ ! -f /etc/clash/clashtun/clash ]; then if [ "${lang}" == "en" ] || [ $lang == "auto" ];then - echo " $(date "+%Y-%m-%d %H:%M:%S") - clashr Tun core not found in /etc/clash/clashtun/clash " >> /usr/share/clash/clash.txt + echo " $(date "+%Y-%m-%d %H:%M:%S") - clash Tun core not found in /etc/clash/clashtun/clash " >> /usr/share/clash/clash.txt echo "clash Tun core not found in /etc/clash/clashtun/clash" >> $REAL_LOG elif [ "${lang}" == "zh_cn" ];then echo " $(date "+%Y-%m-%d %H:%M:%S") - 找不到/etc/clash/clashtun/clash, clash Tun内核" >> /usr/share/clash/clash.txt @@ -572,22 +560,6 @@ if [ -f $CONFIG_YAML ] && [ "$(ls -l $CONFIG_YAML|awk '{print int($5)}')" -ne yml_change >/dev/null 2>&1 - checktype=$(grep -c "type: ssr" /etc/clash/config.yaml 2>/dev/null) - if [ "${checktype}" -gt 0 ] && [ "${core}" -ne 2 ]; then - - if [ "${lang}" == "en" ] || [ $lang == "auto" ];then - echo "Clash Core does not Support Config, use clashr core" >$REAL_LOG - elif [ "${lang}" == "zh_cn" ];then - echo "Clash内核不支持你的配置,改用Clashr内核" >$REAL_LOG - fi - remove_mark >/dev/null 2>&1 - sleep 1 - echo "Clash for OpenWRT" >$REAL_LOG - exit 0 - fi - - - if [ ! -f /etc/clash/Country.mmdb ];then if [ "${lang}" == "en" ] || [ $lang == "auto" ];then echo "Cannot find Country.mmdb" >$REAL_LOG @@ -643,15 +615,6 @@ if [ -f $CONFIG_YAML ] && [ "$(ls -l $CONFIG_YAML|awk '{print int($5)}')" -ne elif [ "${lang}" == "zh_cn" ];then echo "Clash 计划任务,启动进程守护程序..." >$REAL_LOG fi - elif [ "$(uci get clash.config.core)" -eq 2 ];then - nohup $CLASHR -d "$CLASH_CONFIG" > /usr/share/clash/clash.txt 2>&1 & - - if [ "${lang}" == "en" ] || [ $lang == "auto" ];then - echo "Clashr Core Started Successfully " >$REAL_LOG - elif [ "${lang}" == "zh_cn" ];then - echo "Clashr 计划任务,启动进程守护程序..." >$REAL_LOG - fi - fi ln -s /usr/share/clash/yacd /www/luci-static/yacd 2>/dev/null diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/check_clashr_core_version.sh b/package/ntlf9t/luci-app-clash/root/usr/share/clash/check_clashr_core_version.sh deleted file mode 100755 index cfa271ea8c..0000000000 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/check_clashr_core_version.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -new_clashr_core_version=`curl -sL "https://github.com/frainzy1477/clashrdev/tags"| grep "/frainzy1477/clashrdev/releases/"| head -n 1| awk -F "/tag/" '{print $2}'| sed 's/\">//'` -if [ "$?" -eq "0" ]; then -rm -rf /usr/share/clash/new_clashr_core_version -if [ $new_clashr_core_version ]; then -echo $new_clashr_core_version > /usr/share/clash/new_clashr_core_version 2>&1 & >/dev/null -elif [ $new_clashr_core_version =="" ]; then -echo 0 > /usr/share/clash/new_clashr_core_version 2>&1 & >/dev/null -fi -fi - diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/core_download.sh b/package/ntlf9t/luci-app-clash/root/usr/share/clash/core_download.sh index 10c28b9d17..bf0ba1b36e 100755 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/core_download.sh +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/core_download.sh @@ -60,29 +60,6 @@ CLASHTUN=$(sed -n 1p /usr/share/clash/download_tun_version 2>/dev/null) fi fi - -if [ $CORETYPE -eq 2 ];then -if [ -f /usr/share/clash/download_corer_version ];then -rm -rf /usr/share/clash/download_corer_version -fi - if [ $lang == "zh_cn" ];then - echo " ${LOGTIME} - 正在检查最新版本。。" >$LOG_FILE - elif [ $lang == "en" ] || [ $lang == "auto" ];then - echo " ${LOGTIME} - Checking latest version.." >$LOG_FILE - fi -new_clashr_core_version=`wget -qO- "https://github.com/frainzy1477/clashrdev/tags"| grep "/frainzy1477/clashrdev/releases/"| head -n 1| awk -F "/tag/" '{print $2}'| sed 's/\">//'` - -if [ $new_clashr_core_version ]; then -echo $new_clashr_core_version > /usr/share/clash/download_corer_version 2>&1 & >/dev/null -elif [ $new_clashr_core_version =="" ]; then -echo 0 > /usr/share/clash/download_corer_version 2>&1 & >/dev/null -fi -sleep 5 -if [ -f /usr/share/clash/download_corer_version ];then -CLASHRVER=$(sed -n 1p /usr/share/clash/download_corer_version 2>/dev/null) -fi -fi - if [ $CORETYPE -eq 1 ];then if [ -f /usr/share/clash/download_core_version ];then rm -rf /usr/share/clash/download_core_version @@ -118,8 +95,6 @@ update(){ fi if [ $CORETYPE -eq 1 ];then wget --no-check-certificate https://github.com/frainzy1477/clash_dev/releases/download/"$CLASHVER"/clash-"$MODELTYPE".gz -O 2>&1 >1 /tmp/clash.gz - elif [ $CORETYPE -eq 2 ];then - wget --no-check-certificate https://github.com/frainzy1477/clashrdev/releases/download/"$CLASHRVER"/clashr-"$MODELTYPE".gz -O 2>&1 >1 /tmp/clash.gz elif [ $CORETYPE -eq 3 ];then wget --no-check-certificate https://github.com/frainzy1477/clashtun/releases/download/"$CLASHTUN"/clash-"$MODELTYPE".gz -O 2>&1 >1 /tmp/clash.gz elif [ $CORETYPE -eq 4 ];then @@ -155,19 +130,6 @@ update(){ echo " ${LOGTIME} - Clash Core Update Successful" >$LOG_FILE fi - - elif [ $CORETYPE -eq 2 ];then - rm -rf /usr/bin/clash >/dev/null 2>&1 - mv /tmp/clash /usr/bin/clash >/dev/null 2>&1 - rm -rf /usr/share/clash/corer_version >/dev/null 2>&1 - mv /usr/share/clash/download_corer_version /usr/share/clash/corer_version >/dev/null 2>&1 - - if [ $lang == "zh_cn" ];then - echo " ${LOGTIME} - Clashr内核更新成功!" >$LOG_FILE - elif [ $lang == "en" ] || [ $lang == "auto" ];then - echo " ${LOGTIME} - Clashr Core Update Successful" >>$LOG_FILE - fi - elif [ $CORETYPE -eq 3 ];then rm -rf /etc/clash/clashtun/clash >/dev/null 2>&1 mv /tmp/clash /etc/clash/clashtun/clash >/dev/null 2>&1 @@ -207,7 +169,7 @@ update(){ fi } -if [ $CORETYPE -eq 1 ] || [ $CORETYPE -eq 2 ] || [ $CORETYPE -eq 3 ] || [ $CORETYPE -eq 4 ]; then +if [ $CORETYPE -eq 1 ] || [ $CORETYPE -eq 3 ] || [ $CORETYPE -eq 4 ]; then update fi diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/create/create.sh b/package/ntlf9t/luci-app-clash/root/usr/share/clash/create/create.sh index 05a46f6b82..252ffd0e3b 100644 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/create/create.sh +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/create/create.sh @@ -622,10 +622,15 @@ cat >> "$SERVER_FILE" <<-EOF cipher: $cipher_ssr password: "$password" protocol: "$protocol" - protocolparam: "$protocolparam" + protocol-param: "$protocolparam" obfs: "$obfs_ssr" - obfsparam: "$obfsparam" + obfs-param: "$obfsparam" EOF + if [ ! -z "$udp" ]; then +cat >> "$SERVER_FILE" <<-EOF + udp: $udp +EOF + fi fi diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html index 0531841f76..019c07e7f0 100644 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html @@ -1 +1 @@ -Clash Dashboard
\ No newline at end of file +Clash
\ No newline at end of file diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.4563da698059d88c08dc.min.js b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.3f7e8457ba9e97b6d7c9.min.js similarity index 78% rename from package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.4563da698059d88c08dc.min.js rename to package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.3f7e8457ba9e97b6d7c9.min.js index c21463f3cd..fb56fa0eda 100644 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.4563da698059d88c08dc.min.js +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.3f7e8457ba9e97b6d7c9.min.js @@ -1,2 +1,2 @@ -/*! For license information please see 1.bundle.4563da698059d88c08dc.min.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(e,t,n){"use strict";e.exports=n(54)},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}n.d(t,"a",(function(){return r}))},,,,function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}}(),e.exports=n(55)},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){e.exports=n(58)()},function(e,t,n){"use strict";e.exports=n(62)},function(e,t,n){var r=n(38),o=n(88);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t,n){var r=n(85),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t,n){var r=n(39)(Object,"create");e.exports=r},function(e,t,n){var r=n(109);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(115);e.exports=function(e,t){var n=e.__data__;return r(t)?n["string"==typeof t?"string":"hash"]:n.map}},function(e,t,n){"use strict";function r(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r3?t.i-4:t.i:Array.isArray(e)?1:p(e)?2:h(e)?3:0}function s(e,t){return 2===l(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function c(e,t){return 2===l(e)?e.get(t):e[t]}function f(e,t,n){var r=l(e);2===r?e.set(t,n):3===r?(e.delete(t),e.add(n)):e[t]=n}function d(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}function p(e){return q&&e instanceof Map}function h(e){return K&&e instanceof Set}function m(e){return e.o||e.t}function v(e){if(Array.isArray(e))return e.slice();var t=te(e);delete t[J];for(var n=ee(t),r=0;r1&&(e.set=e.add=e.clear=e.delete=y),Object.freeze(e),t&&u(e,(function(e,t){return g(t,!0)}),!0))}function y(){r(2)}function b(e){return null==e||"object"!=typeof e||Object.isFrozen(e)}function w(e){var t=ne[e];return t||r(19,e),t}function S(e,t){ne[e]=t}function x(){return $}function _(e,t){t&&(w("Patches"),e.u=[],e.s=[],e.v=t)}function E(e){T(e),e.p.forEach(k),e.p=null}function T(e){e===$&&($=e.l)}function R(e){return $={p:[],l:$,h:e,m:!0,_:0}}function k(e){var t=e[J];0===t.i||1===t.i?t.j():t.g=!0}function C(e,t){t._=t.p.length;var n=t.p[0],o=void 0!==e&&e!==n;return t.h.O||w("ES5").S(t,e,o),o?(n[J].P&&(E(t),r(4)),i(e)&&(e=P(t,e),t.l||M(t,e)),t.u&&w("Patches").M(n[J],e,t.u,t.s)):e=P(t,n,[]),E(t),t.u&&t.v(t.u,t.s),e!==Q?e:void 0}function P(e,t,n){if(b(t))return t;var r=t[J];if(!r)return u(t,(function(o,i){return O(e,r,t,o,i,n)}),!0),t;if(r.A!==e)return t;if(!r.P)return M(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var o=4===r.i||5===r.i?r.o=v(r.k):r.o;u(o,(function(t,i){return O(e,r,o,t,i,n)})),M(e,o,!1),n&&e.u&&w("Patches").R(r,n,e.u,e.s)}return r.o}function O(e,t,n,r,a,u){if(o(a)){var l=P(e,a,u&&t&&3!==t.i&&!s(t.D,r)?u.concat(r):void 0);if(f(n,r,l),!o(l))return;e.m=!1}if(i(a)&&!b(a)){if(!e.h.N&&e._<1)return;P(e,a),t&&t.A.l||M(e,a)}}function M(e,t,n){void 0===n&&(n=!1),e.h.N&&e.m&&g(t,n)}function A(e,t){var n=e[J];return(n?m(n):e)[t]}function I(e){e.P||(e.P=!0,e.l&&I(e.l))}function N(e){e.o||(e.o=v(e.t))}function z(e,t,n){var r=p(t)?w("MapSet").T(t,n):h(t)?w("MapSet").F(t,n):e.O?function(e,t){var n=Array.isArray(e),r={i:n?1:0,A:t?t.A:x(),P:!1,I:!1,D:{},l:t,t:e,k:null,o:null,j:null,C:!1},o=r,i=re;n&&(o=[r],i=oe);var a=Proxy.revocable(o,i),u=a.revoke,l=a.proxy;return r.k=l,r.j=u,l}(t,n):w("ES5").J(t,n);return(n?n.A:x()).p.push(r),r}function L(e){return o(e)||r(22,e),function e(t){if(!i(t))return t;var n,r=t[J],o=l(t);if(r){if(!r.P&&(r.i<4||!w("ES5").K(r)))return r.t;r.I=!0,n=F(t,o),r.I=!1}else n=F(t,o);return u(n,(function(t,o){r&&c(r.t,t)===o||f(n,t,e(o))})),3===o?new Set(n):n}(e)}function F(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return v(e)}function j(){function e(e,t){var n=i[e];return n?n.enumerable=t:i[e]=n={configurable:!0,enumerable:t,get:function(){var t=this[J];return re.get(t,e)},set:function(t){var n=this[J];re.set(n,e,t)}},n}function t(e){for(var t=e.length-1;t>=0;t--){var o=e[t][J];if(!o.P)switch(o.i){case 5:r(o)&&I(o);break;case 4:n(o)&&I(o)}}}function n(e){for(var t=e.t,n=e.k,r=ee(n),o=r.length-1;o>=0;o--){var i=r[o];if(i!==J){var a=t[i];if(void 0===a&&!s(t,i))return!0;var u=n[i],l=u&&u[J];if(l?l.t!==a:!d(u,a))return!0}}var c=!!t[J];return r.length!==ee(t).length+(c?0:1)}function r(e){var t=e.k;if(t.length!==e.t.length)return!0;var n=Object.getOwnPropertyDescriptor(t,t.length-1);return!(!n||n.get)}var i={};S("ES5",{J:function(t,n){var r=Array.isArray(t),o=function(t,n){var r=te(n);t&&delete r.length,delete r[J];for(var o=ee(r),i=0;i1?r-1:0),u=1;u1?n-1:0),i=1;i=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}var i=w("Patches").$;return o(e)?i(e,t):this.produce(e,(function(e){return i(e,t.slice(n+1))}))},e}(),ae=new ie,ue=ae.produce,le=ae.produceWithPatches.bind(ae),se=ae.setAutoFreeze.bind(ae),ce=ae.setUseProxies.bind(ae),fe=ae.applyPatches.bind(ae),de=ae.createDraft.bind(ae),pe=ae.finishDraft.bind(ae);t.default=ue},,function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){var r=n(17).Symbol;e.exports=r},function(e,t,n){var r=n(119);e.exports=function(e){return null==e?"":r(e)}},,function(e,t,n){e.exports=function(){"use strict";var e="millisecond",t="second",n="minute",r="hour",o="day",i="week",a="month",u="quarter",l="year",s=/^(\d{4})-?(\d{1,2})-?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d{1,3})?$/,c=/\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,f=function(e,t,n){var r=String(e);return!r||r.length>=t?e:""+Array(t+1-r.length).join(n)+e},d={s:f,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),o=n%60;return(t<=0?"+":"-")+f(r,2,"0")+":"+f(o,2,"0")},m:function(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),r=e.clone().add(n,a),o=t-r<0,i=e.clone().add(n+(o?-1:1),a);return Number(-(n+(t-r)/(o?r-i:i-r))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(s){return{M:a,y:l,w:i,d:o,D:"date",h:r,m:n,s:t,ms:e,Q:u}[s]||String(s||"").toLowerCase().replace(/s$/,"")},u:function(e){return void 0===e}},p={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},h="en",m={};m[h]=p;var v=function(e){return e instanceof w},g=function(e,t,n){var r;if(!e)return h;if("string"==typeof e)m[e]&&(r=e),t&&(m[e]=t,r=e);else{var o=e.name;m[o]=e,r=o}return!n&&r&&(h=r),r||!n&&h},y=function(e,t){if(v(e))return e.clone();var n="object"==typeof t?t:{};return n.date=e,n.args=arguments,new w(n)},b=d;b.l=g,b.i=v,b.w=function(e,t){return y(e,{locale:t.$L,utc:t.$u,$offset:t.$offset})};var w=function(){function f(e){this.$L=this.$L||g(e.locale,null,!0),this.parse(e)}var d=f.prototype;return d.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(b.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var r=t.match(s);if(r)return n?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(t)}(e),this.init()},d.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},d.$utils=function(){return b},d.isValid=function(){return!("Invalid Date"===this.$d.toString())},d.isSame=function(e,t){var n=y(e);return this.startOf(t)<=n&&n<=this.endOf(t)},d.isAfter=function(e,t){return y(e)-1&&(t.__listeners[r]=t.__listeners[t.__listeners.length-1],t.__listeners.length--)}}},e.prototype.notify=function(){for(var e=0,t=this.__listeners;en.errorRetryCount)){var i=Math.min(o.retryCount||0,8),a=~~((Math.random()+.5)*(1<0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0));return Promise.all(l).then((function(){return f.get(r)}))}return Promise.resolve(f.get(r))},O=function(e,t,n){var r=m[e];if(e&&r)for(var o=0;o0));return[2,Promise.all(d).then((function(){return f.get(r)}))]}if(i)throw i;return[2,o]}}))}))};var A=E.Provider,I=function(){for(var e=this,t=[],n=0;n=1&&(o=t[0]),t.length>2?(i=t[1],a=t[2]):"function"==typeof t[1]?i=t[1]:"object"==typeof t[1]&&(a=t[1]);var s=f.serializeKey(o),c=s[0],g=s[1],y=s[2];a=Object.assign({},S,Object(r.useContext)(E),a),void 0===i&&(i=a.fetcher);var b=f.get(c)||a.initialData,w=f.get(y),_=Object(r.useRef)({data:!1,error:!1,isValidating:!1}),P=Object(r.useRef)({data:b,error:w,isValidating:!1}),A=Object(r.useState)(null)[1],I=Object(r.useCallback)((function(e){var t=!1;for(var n in e)P.current[n]=e[n],_.current[n]&&(t=!0);(t||a.suspense)&&A({})}),[]),N=Object(r.useRef)(!1),z=Object(r.useRef)(c),L=Object(r.useRef)({emit:function(e){for(var t=[],n=1;n=0&&(e[t]=e[e.length-1],e.pop()));m[c]&&((t=(e=m[c]).indexOf(o))>=0&&(e[t]=e[e.length-1],e.pop()));!k&&window.removeEventListener&&null!==i&&window.removeEventListener("online",i)}}}),[c,j]),C((function(){var t=null,n=function(){return T(e,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return P.current.error||!a.refreshWhenHidden&&!u()||!a.refreshWhenOffline&&!l()?[3,2]:[4,j({dedupe:!0})];case 1:e.sent(),e.label=2;case 2:return a.refreshInterval&&(t=setTimeout(n,a.refreshInterval)),[2]}}))}))};return a.refreshInterval&&(t=setTimeout(n,a.refreshInterval)),function(){t&&clearTimeout(t)}}),[a.refreshInterval,a.refreshWhenHidden,a.refreshWhenOffline,j]),a.suspense){var D=f.get(c)||b,B=f.get(y)||w;if(void 0===D&&void 0===B){if(d[c]||j(),d[c]&&"function"==typeof d[c].then)throw d[c];D=d[c]}if(void 0===D&&B)throw B;return{error:B,data:D,revalidate:j,mutate:F,isValidating:P.current.isValidating}}return Object(r.useMemo)((function(){var e={revalidate:j,mutate:F};return Object.defineProperties(e,{error:{get:function(){return _.current.error=!0,z.current===c?P.current.error:w},enumerable:!0},data:{get:function(){return _.current.data=!0,z.current===c?P.current.data:b},enumerable:!0},isValidating:{get:function(){return _.current.isValidating=!0,P.current.isValidating},enumerable:!0}}),e}),[j])},N=function(){for(var e=0,t=0,n=arguments.length;t=0;d--){var p=o[d];"."===p?l(o,d):".."===p?(l(o,d),f++):f&&(l(o,d),f--)}if(!s)for(;f--;f)o.unshift("..");!s||""===o[0]||o[0]&&u(o[0])||o.unshift("");var h=o.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};function c(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var f=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=c(t),o=c(n);return r!==t||o!==n?e(r,o):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var d=function(e,t){if(!e)throw new Error("Invariant failed")};function p(e){return"/"===e.charAt(0)?e:"/"+e}function h(e){return"/"===e.charAt(0)?e.substr(1):e}function m(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function v(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function g(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function y(e,t,n,r){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var i=t.indexOf("?");return-1!==i&&(n=t.substr(i),t=t.substr(0,i)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e)).state=t:(void 0===(o=Object(a.a)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=s(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var i="function"==typeof e?e(t,n):e;"string"==typeof i?"function"==typeof r?r(i,o):o(!0):o(!1!==i)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,r):n.push(r),f({action:"PUSH",location:r,index:t,entries:n})}}))},replace:function(e,t){var r=y(e,t,d(),w.location);c.confirmTransitionTo(r,"REPLACE",n,(function(e){e&&(w.entries[w.index]=r,f({action:"REPLACE",location:r}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t=200&&e<300}};l.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){l.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){l.headers[e]=r.merge(i)})),e.exports=l}).call(this,n(136))},function(e,t,n){"use strict";var r=n(7),o=n(138),i=n(41),a=n(140),u=n(143),l=n(144),s=n(45);e.exports=function(e){return new Promise((function(t,c){var f=e.data,d=e.headers;r.isFormData(f)&&delete d["Content-Type"];var p=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password||"";d.Authorization="Basic "+btoa(h+":"+m)}var v=a(e.baseURL,e.url);if(p.open(e.method.toUpperCase(),i(v,e.params,e.paramsSerializer),!0),p.timeout=e.timeout,p.onreadystatechange=function(){if(p&&4===p.readyState&&(0!==p.status||p.responseURL&&0===p.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in p?u(p.getAllResponseHeaders()):null,r={data:e.responseType&&"text"!==e.responseType?p.response:p.responseText,status:p.status,statusText:p.statusText,headers:n,config:e,request:p};o(t,c,r),p=null}},p.onabort=function(){p&&(c(s("Request aborted",e,"ECONNABORTED",p)),p=null)},p.onerror=function(){c(s("Network Error",e,null,p)),p=null},p.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),c(s(t,e,"ECONNABORTED",p)),p=null},r.isStandardBrowserEnv()){var g=n(145),y=(e.withCredentials||l(v))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;y&&(d[e.xsrfHeaderName]=y)}if("setRequestHeader"in p&&r.forEach(d,(function(e,t){void 0===f&&"content-type"===t.toLowerCase()?delete d[t]:p.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(p.withCredentials=!!e.withCredentials),e.responseType)try{p.responseType=e.responseType}catch(b){if("json"!==e.responseType)throw b}"function"==typeof e.onDownloadProgress&&p.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&p.upload&&p.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){p&&(p.abort(),c(e),p=null)})),void 0===f&&(f=null),p.send(f)}))}},function(e,t,n){"use strict";var r=n(139);e.exports=function(e,t,n,o,i){var a=new Error(e);return r(a,t,n,o,i)}},function(e,t,n){"use strict";var r=n(7);e.exports=function(e,t){t=t||{};var n={},o=["url","method","params","data"],i=["headers","auth","proxy"],a=["baseURL","url","transformRequest","transformResponse","paramsSerializer","timeout","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","maxContentLength","validateStatus","maxRedirects","httpAgent","httpsAgent","cancelToken","socketPath"];r.forEach(o,(function(e){void 0!==t[e]&&(n[e]=t[e])})),r.forEach(i,(function(o){r.isObject(t[o])?n[o]=r.deepMerge(e[o],t[o]):void 0!==t[o]?n[o]=t[o]:r.isObject(e[o])?n[o]=r.deepMerge(e[o]):void 0!==e[o]&&(n[o]=e[o])})),r.forEach(a,(function(r){void 0!==t[r]?n[r]=t[r]:void 0!==e[r]&&(n[r]=e[r])}));var u=o.concat(i).concat(a),l=Object.keys(t).filter((function(e){return-1===u.indexOf(e)}));return r.forEach(l,(function(r){void 0!==t[r]?n[r]=t[r]:void 0!==e[r]&&(n[r]=e[r])})),n}},function(e,t,n){"use strict";function r(e){this.message=e}r.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},r.prototype.__CANCEL__=!0,e.exports=r},,function(e,t){var n=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return n.test(e)}},function(e,t,n){"use strict";var r=n(34),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},u={};function l(e){return r.isMemo(e)?a:u[e.$$typeof]||o}u[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},u[r.Memo]=a;var s=Object.defineProperty,c=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,d=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=p(n);o&&o!==h&&e(t,o,r)}var a=c(n);f&&(a=a.concat(f(n)));for(var u=l(t),m=l(n),v=0;vO.length&&O.push(e)}function I(e,t,n){return null==e?0:function e(t,n,r,o){var u=typeof t;"undefined"!==u&&"boolean"!==u||(t=null);var l=!1;if(null===t)l=!0;else switch(u){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return r(o,t,""===n?"."+N(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var s=0;s