diff --git a/include/kernel-version.mk b/include/kernel-version.mk index b8192dd0c..0422c20b8 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -4,11 +4,11 @@ LINUX_RELEASE?=1 LINUX_VERSION-3.18 = .71 LINUX_VERSION-4.4 = .88 -LINUX_VERSION-4.9 = .51 +LINUX_VERSION-4.9 = .52 LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240 LINUX_KERNEL_HASH-4.4.88 = 144fe8dd773ec317fa06109b8d7bd04141bf1941daa03799fb4f437bbbb919b4 -LINUX_KERNEL_HASH-4.9.51 = 83faa66102d8a4c164857014c5304e08ca6c16f1697851862af17ba61378aa8a +LINUX_KERNEL_HASH-4.9.52 = ffdd034f1bf32fa41d1a66a347388c0dc4c3cff6f578a1e29d88b20fbae1048a ifdef KERNEL_PATCHVER LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) diff --git a/package/lean/default-settings/files/zzz-default-settings b/package/lean/default-settings/files/zzz-default-settings index 1e7e6086c..4e11b0aa3 100755 --- a/package/lean/default-settings/files/zzz-default-settings +++ b/package/lean/default-settings/files/zzz-default-settings @@ -47,7 +47,7 @@ sed -i '/set wireless.radio${devidx}.disabled/d' /lib/wifi/mac80211.sh wifi up sed -i '/DISTRIB_REVISION/d' /etc/openwrt_release -echo "DISTRIB_REVISION='R7.4 By Lean'" >> /etc/openwrt_release +echo "DISTRIB_REVISION='R7.4.1 By Lean'" >> /etc/openwrt_release sed -i '/DISTRIB_DESCRIPTION/d' /etc/openwrt_release echo "DISTRIB_DESCRIPTION='LEDE 17.01.2'" >> /etc/openwrt_release diff --git a/package/lean/luci-app-adbyby-plus/Makefile b/package/lean/luci-app-adbyby-plus/Makefile index c08b00b15..ad6623a4d 100644 --- a/package/lean/luci-app-adbyby-plus/Makefile +++ b/package/lean/luci-app-adbyby-plus/Makefile @@ -10,7 +10,7 @@ LUCI_DEPENDS:=+adbyby +wget +ipset +coreutils +coreutils-nohup +dnsmasq-full LUCI_PKGARCH:=all PKG_NAME:=luci-app-adbyby-plus PKG_VERSION:=2.0 -PKG_RELEASE:=19 +PKG_RELEASE:=20 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/package/lean/luci-app-adbyby-plus/luasrc/model/cbi/adbyby.lua b/package/lean/luci-app-adbyby-plus/luasrc/model/cbi/adbyby.lua index 694dbbb12..87b9971d4 100644 --- a/package/lean/luci-app-adbyby-plus/luasrc/model/cbi/adbyby.lua +++ b/package/lean/luci-app-adbyby-plus/luasrc/model/cbi/adbyby.lua @@ -70,7 +70,8 @@ o.description = translate(string.format("%s", Status)) o.description = translate(string.format("Lazy Rule:%s Video Rule:%sThird Party Subscription Rule:%d lines User-defined Rule:%d lines", DL, DV, math.abs(NR-NU), NR)) o.inputstyle = "reload" o.write = function() - SYS.call("/etc/init.d/adbyby restart") + SYS.call("nohup sh /usr/share/adbyby/adupdate.sh > /tmp/adupdate.log 2>&1 &") + SYS.call("sleep 4") HTTP.redirect(DISP.build_url("admin", "services", "adbyby")) end @@ -82,7 +83,6 @@ o.default = 0 o.rmempty = false o.description = translate(string.format("Adblock Plus Host List: %s Lines", ND)) - updatead = s:taboption("advanced", Button, "updatead", translate("Manually force updateAdblock Plus Host List"), translate("Note: It needs to download and convert the rules. The background process may takes 60-120 seconds to run. After completed it would automatically refresh, please do not duplicate click!")) updatead.inputtitle = translate("Manually force update") updatead.inputstyle = "apply" @@ -90,6 +90,11 @@ updatead.write = function() SYS.call("nohup sh /usr/share/adbyby/adblock.sh > /tmp/adupdate.log 2>&1 &") end +o = s:taboption("advanced", Flag, "update_source") +o.title = translate("Update adbyby rules form official website first") +o.default = 1 +o.rmempty = false + o = s:taboption("advanced", Flag, "block_ios") o.title = translate("Block Apple iOS OTA update") o.default = 0 diff --git a/package/lean/luci-app-adbyby-plus/po/zh-cn/adbyby.po b/package/lean/luci-app-adbyby-plus/po/zh-cn/adbyby.po index 045517d21..b0842860c 100644 --- a/package/lean/luci-app-adbyby-plus/po/zh-cn/adbyby.po +++ b/package/lean/luci-app-adbyby-plus/po/zh-cn/adbyby.po @@ -114,5 +114,12 @@ msgstr "Adblock Plus Host 列表:" msgid "Note: It needs to download and convert the rules. The background process may takes 60-120 seconds to run. After completed it would automatically refresh, please do not duplicate click!" msgstr "注意:需要下载并转换规则。后台进程可能需要60-120秒运行。完成后会自动刷新,请不要重复点击!" +msgid "No filter" +msgstr "不过滤" +msgid "Global filter" +msgstr "全局过滤" + +msgid "Update adbyby rules form official website first" +msgstr "优先从官方网站更新规则" diff --git a/package/lean/luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh b/package/lean/luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh index 2f47f35da..9f6bef759 100755 --- a/package/lean/luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh +++ b/package/lean/luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh @@ -1,8 +1,14 @@ #!/bin/sh -wget -t 1 -T 10 -O /tmp/lazy.txt http://update.adbyby.com/rule3/lazy.jpg -wget -t 1 -T 10 -O /tmp/video.txt http://update.adbyby.com/rule3/video.jpg -wget -t 1 -T 10 -O /tmp/user.action http://update.adbyby.com/rule3/user.action +update_source=$(uci get adbyby.@adbyby[0].update_source 2>/dev/null) + +rm -f /usr/share/adbyby/data/*.bak + +if [ $update_source -eq 1 ]; then + wget -t 1 -T 10 -O /tmp/lazy.txt http://update.adbyby.com/rule3/lazy.jpg + wget -t 1 -T 10 -O /tmp/video.txt http://update.adbyby.com/rule3/video.jpg + wget -t 1 -T 10 -O /tmp/user.action http://update.adbyby.com/rule3/user.action +fi [ ! -s "/tmp/lazy.txt" ] && wget --no-check-certificate -O /tmp/lazy.txt https://raw.githubusercontent.com/adbyby/xwhyc-rules/master/lazy.txt [ ! -s "/tmp/video.txt" ] && wget --no-check-certificate -O /tmp/video.txt https://raw.githubusercontent.com/adbyby/xwhyc-rules/master/video.txt diff --git a/package/lean/luci-app-kcptun/Makefile b/package/lean/luci-app-kcptun/Makefile new file mode 100644 index 000000000..fcdc65d47 --- /dev/null +++ b/package/lean/luci-app-kcptun/Makefile @@ -0,0 +1,35 @@ +# +# Copyright 2016-2017 Xingwang Liao +# Licensed to the public under the Apache License 2.0. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-kcptun +PKG_VERSION:=1.4.3 +PKG_RELEASE:=1 + +PKG_LICENSE:=Apache-2.0 +PKG_MAINTAINER:=Xingwang Liao + +LUCI_TITLE:=LuCI support for Kcptun +LUCI_DEPENDS:=+jshn +wget +luci-lib-jsonc +LUCI_PKGARCH:=all + +define Package/$(PKG_NAME)/conffiles +/etc/config/kcptun +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +define Package/$(PKG_NAME)/postinst +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + ( . /etc/uci-defaults/40_luci-kcptun ) && rm -f /etc/uci-defaults/40_luci-kcptun +fi +chmod 755 $${IPKG_INSTROOT}/etc/init.d/kcptun >/dev/null 2>&1 +$${IPKG_INSTROOT}/etc/init.d/kcptun enable >/dev/null 2>&1 +exit 0 +endef + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/lean/luci-app-kcptun/luasrc/controller/kcptun.lua b/package/lean/luci-app-kcptun/luasrc/controller/kcptun.lua new file mode 100644 index 000000000..736830a1f --- /dev/null +++ b/package/lean/luci-app-kcptun/luasrc/controller/kcptun.lua @@ -0,0 +1,120 @@ +-- Copyright 2016-2017 Xingwang Liao +-- Licensed to the public under the Apache License 2.0. + +module("luci.controller.kcptun", package.seeall) + +local http = require "luci.http" +local kcp = require "luci.model.kcptun" + +function index() + if not nixio.fs.access("/etc/config/kcptun") then + return + end + + entry({"admin", "services", "kcptun"}, + firstchild(), _("Kcptun Client")).dependent = false + + entry({"admin", "services", "kcptun", "settings"}, + cbi("kcptun/settings"), _("Settings"), 1) + + entry({"admin", "services", "kcptun", "servers"}, + arcombine(cbi("kcptun/servers"), cbi("kcptun/servers-detail")), + _("Server Manage"), 2).leaf = true + + entry({"admin", "services", "kcptun", "log"}, + template("kcptun/log_view"), _("Log"), 3) + + entry({"admin", "services", "kcptun", "status"}, call("action_status")) + + entry({"admin", "services", "kcptun", "check"}, call("action_check")).leaf = true + + entry({"admin", "services", "kcptun", "update"}, call("action_update")).leaf = true + + entry({"admin", "services", "kcptun", "log", "data"}, call("action_log_data")) + + entry({"admin", "services", "kcptun", "log", "clear"}, call("action_log_clear")).leaf = true +end + +local function http_write_json(content) + http.prepare_content("application/json") + http.write_json(content or { code = 1 }) +end + +function action_status() + local client_file = kcp.get_config_option("client_file") + + http_write_json({ + client = kcp.is_running(client_file) + }) +end + +function action_check(type) + local json = nil + if type == "kcptun" then + json = kcp.check_kcptun(http.formvalue("arch")) + elseif type == "luci" then + json = kcp.check_luci() + else + http.status(500, "Bad address") + return + end + + http_write_json(json) +end + +function action_update(type) + local json = nil + if type == "kcptun" then + local task = http.formvalue("task") + if task == "extract" then + json = kcp.extract_kcptun(http.formvalue("file"), http.formvalue("subfix")) + elseif task == "move" then + json = kcp.move_kcptun(http.formvalue("file")) + else + json = kcp.download_kcptun(http.formvalue("url")) + end + elseif type == "luci" then + json = kcp.update_luci(http.formvalue("url"), http.formvalue("save")) + else + http.status(500, "Bad address") + return + end + + http_write_json(json) +end + +function action_log_data() + local util = require "luci.util" + + local log_data = { } + + local enable_logging = kcp.get_config_option("enable_logging", "0") == "1" + + if enable_logging then + local client_log_file = kcp.get_current_log_file("client") + log_data.client = util.trim( + util.exec("tail -n 50 %s 2>/dev/null | sed 'x;1!H;$!d;x'" % client_log_file)) + end + + log_data.syslog = util.trim( + util.exec("logread | grep kcptun | tail -n 50 | sed 'x;1!H;$!d;x'")) + + http_write_json(log_data) +end + +function action_log_clear(type) + if type and type ~= "" then + local log_file = kcp.get_current_log_file(type) + + local fs = require "nixio.fs" + + if fs.access(log_file) then + fs.writefile(log_file, "") + else + http.status(404, "Not found") + return + end + end + + http_write_json({ code = 0 }) +end diff --git a/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/servers-detail.lua b/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/servers-detail.lua new file mode 100644 index 000000000..a9214b4e1 --- /dev/null +++ b/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/servers-detail.lua @@ -0,0 +1,182 @@ +-- Copyright 2016-2017 Xingwang Liao +-- Licensed to the public under the Apache License 2.0. + +local dsp = require "luci.dispatcher" + +local m, s, o +local sid = arg[1] + +local encrypt_methods = { + "aes", + "aes-128", + "aes-192", + "salsa20", + "blowfish", + "twofish", + "cast5", + "3des", + "tea", + "xtea", + "xor", + "none", +} + +local modes = { + "normal", + "fast", + "fast2", + "fast3", + "manual", +} + +m = Map("kcptun", "%s - %s" % { translate("Kcptun"), translate("Edit Server") }) +m.redirect = dsp.build_url("admin/services/kcptun/servers") + +if m.uci:get("kcptun", sid) ~= "servers" then + luci.http.redirect(m.redirect) + return +end + +s = m:section(NamedSection, sid, "servers") +s.anonymous = true +s.addremove = false + +o = s:option(Value, "alias", "%s (%s)" % { translate("Alias"), translate("optional") }) + +o = s:option(Value, "server_addr", translate("Server")) +o.datatype = "host" +o.rmempty = false + +o = s:option(Value, "server_port", translate("Server Port")) +o.datatype = "port" +o.placeholder = "29900" + +o = s:option(Value, "listen_addr", "%s (%s)" % { translate("Local Listen Host"), translate("optional") }, + translate("Local listen host.")) +o.datatype = "host" +o.placeholder = "0.0.0.0" + +o = s:option(Value, "listen_port", translate("Local Port"), translate("Local Listen Port.")) +o.datatype = "port" +o.placeholder = "12948" + +o = s:option(Value, "key", "%s (%s)" % { translate("Key"), translate("optional") }, + translate("Pre-shared secret for client and server.")) +o.password = true +o.placeholder = "it's a secret" + +o = s:option(Value, "crypt", translate("crypt"), translate("Encrypt Method")) +for _, v in ipairs(encrypt_methods) do + o:value(v, v:upper()) +end +o.default = "aes" + +o = s:option(ListValue, "mode", translate("mode"), translate("Embedded Mode")) +for _, v in ipairs(modes) do + o:value(v, v:upper()) +end +o.default = "fast" + +o = s:option(Flag, "nodelay", translate("nodelay"), translate("Enable nodelay Mode.")) +o:depends("mode", "manual") + +o = s:option(Value, "interval", translate("interval")) +o:depends("mode", "manual") +o.datatype = "uinteger" +o.placeholder = "50" + +o = s:option(ListValue, "resend", translate("resend")) +o:depends("mode", "manual") +o:value("0", translate("Off")) +o:value("1", translate("On")) +o:value("2", translate("2nd ACK")) + +o = s:option(Flag, "nc", translate("nc")) +o:depends("mode", "manual") + +o = s:option(Value, "mtu", "%s (%s)" % { translate("mtu"), translate("optional") }, + translate("Maximum transmission unit of UDP packets.")) +o.datatype = "range(64,9200)" +o.placeholder = "1350" + +o = s:option(Value, "sndwnd", "%s (%s)" % { translate("sndwnd"), translate("optional") }, + translate("Send Window Size(num of packets).")) +o.datatype = "min(1)" +o.default = "128" +o.placeholder = "128" + +o = s:option(Value, "rcvwnd", "%s (%s)" % { translate("rcvwnd"), translate("optional") }, + translate("Receive Window Size(num of packets).")) +o.datatype = "min(1)" +o.default = "512" +o.placeholder = "512" + +o = s:option(Value, "datashard", "%s (%s)" % { translate("datashard"), translate("optional") }, + translate("Reed-solomon Erasure Coding - datashard.")) +o.datatype = "uinteger" +o.placeholder = "10" + +o = s:option(Value, "parityshard", "%s (%s)" % { translate("parityshard"), translate("optional") }, + translate("Reed-solomon Erasure Coding - parityshard.")) +o.datatype = "uinteger" +o.placeholder = "3" + +o = s:option(Value, "dscp", "%s (%s)" % { translate("dscp"), translate("optional") }, translate("DSCP(6bit)")) +o.datatype = "uinteger" +o.placeholder = "0" + +o = s:option(Flag, "nocomp", translate("nocomp"), translate("Disable Compression?")) +o.enabled = "true" +o.disabled = "false" +o.rmempty = false + +o = s:option(Flag, "acknodelay", translate("acknodelay")) +o.enabled = "true" +o.disabled = "false" + +o = s:option(Value, "conn", "%s (%s)" %{ translate("conn"), translate("optional") }, + translate("Number of UDP connections to server.")) +o.datatype = "min(1)" +o.placeholder = "1" + +o = s:option(Value, "autoexpire", "%s (%s)" % { translate("autoexpire"), translate("optional") }, + translate("Auto expiration time(in seconds) for a single UDP connection, 0 to disable.")) +o.datatype = "uinteger" +o.placeholder = "0" + +o = s:option(Value, "scavengettl", "%s (%s)" % { translate("scavengettl"), translate("optional") }, + translate("How long an expired connection can live(in sec), -1 to disable.")) +o.datatype = "min(-1)" +o.placeholder = "600" + +o = s:option(Value, "sockbuf", "%s (%s)" % { translate("sockbuf"), translate("optional") }, + translate("Send/secv buffer size of udp sockets, default unit is MB.")) +o.datatype = "uinteger" +o.placeholder = "4" +o.cfgvalue = function(...) + local value = Value.cfgvalue(...) + + if value then + return tonumber(value) / 1024 / 1024 + end +end +o.write = function(self, section, value) + local number = tonumber(value) + if number then + Value.write(self, section, number * 1024 * 1024) + else + Value.remove(self, section) + end +end + +o = s:option(Value, "keepalive", "%s (%s)" % { translate("keepalive"), translate("optional") }, + translate("NAT keepalive interval to prevent your router from removing port mapping, default unit is seconds.")) +o.datatype = "uinteger" +o.placeholder = "10" + +o = s:option(Value, "snmpperiod", "%s (%s)" % { translate("snmpperiod"), + translate("optional") }, translate("SNMP collect period, in seconds")) +o.datatype = "min(1)" +o.placeholder = "60" + +return m diff --git a/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/servers.lua b/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/servers.lua new file mode 100644 index 000000000..9a44cac1e --- /dev/null +++ b/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/servers.lua @@ -0,0 +1,71 @@ +-- Copyright 2016-2017 Xingwang Liao +-- Licensed to the public under the Apache License 2.0. + +local dsp = require "luci.dispatcher" +local http = require "luci.http" + +local m, s, o + +local function get_ip_string(ip) + if ip and ip:find(":") then + return "[%s]" % ip + else + return ip or "" + end +end + +m = Map("kcptun", "%s - %s" % { translate("Kcptun"), translate("Server List") }) + +s = m:section(TypedSection, "servers") +s.anonymous = true +s.addremove = true +s.sortable = true +s.template = "cbi/tblsection" +s.extedit = dsp.build_url("admin/services/kcptun/servers/%s") +function s.create(...) + local sid = TypedSection.create(...) + if sid then + m.uci:save("kcptun") + http.redirect(s.extedit % sid) + return + end +end + +o = s:option(DummyValue, "alias", translate("Alias")) +function o.cfgvalue(self, section) + return Value.cfgvalue(self, section) or translate("None") +end + +o = s:option(DummyValue, "_server_address", translate("Server Address")) +function o.cfgvalue(self, section) + local server = m.uci:get("kcptun", section, "server_addr") or "?" + local server_port = m.uci:get("kcptun", section, "server_port") or "29900" + return "%s:%s" % { get_ip_string(server), server_port } +end + +o = s:option(DummyValue, "_listen_addres", translate("Listen Address")) +function o.cfgvalue(self, section) + local local_host = m.uci.get("kcptun", section, "listen_addr") or "0.0.0.0" + local local_port = m.uci.get("kcptun", section, "listen_port") or "12984" + return "%s:%s" % { get_ip_string(local_host), local_port } +end + +o = s:option(DummyValue, "crypt", translate("Encrypt Method")) +function o.cfgvalue(...) + local v = Value.cfgvalue(...) + return v and v:upper() or "?" +end + +o = s:option(DummyValue, "mode", translate("Embedded Mode")) +function o.cfgvalue(...) + local v = Value.cfgvalue(...) + return v and v:upper() or "?" +end + +o = s:option(DummyValue, "nocomp", translate("Disable Compression")) +function o.cfgvalue(...) + local v = Value.cfgvalue(...) + return v == "true" and translate("True") or translate("False") +end + +return m diff --git a/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/settings.lua b/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/settings.lua new file mode 100644 index 000000000..6d63eb5de --- /dev/null +++ b/package/lean/luci-app-kcptun/luasrc/model/cbi/kcptun/settings.lua @@ -0,0 +1,112 @@ +-- Copyright 2016-2017 Xingwang Liao +-- Licensed to the public under the Apache License 2.0. + +local uci = require "luci.model.uci".cursor() +local util = require "luci.util" +local sys = require "luci.sys" +local fs = require "nixio.fs" + +local m, s, o +local server_table = { } + +local function get_ip_string(ip) + if ip and ip:find(":") then + return "[%s]" % ip + else + return ip or "" + end +end + +uci:foreach("kcptun", "servers", function(s) + if s.alias then + server_table[s[".name"]] = s.alias + elseif s.server_addr and s.server_port then + server_table[s[".name"]] = "%s:%s" % { get_ip_string(s.server_addr), s.server_port } + end +end) + +m = Map("kcptun", "%s - %s" % { translate("Kcptun"), translate("Settings") }) +m:append(Template("kcptun/status")) + +s = m:section(NamedSection, "general", "general", translate("General Settings")) +s.anonymous = true +s.addremove = false + +o = s:option(ListValue, "server", translate("Server")) +o:value("", translate("Disable")) +for k, v in pairs(server_table) do + o:value(k, v) +end + +o = s:option(Value, "client_file", translate("Client File")) +o.rmempty = false + +o = s:option(ListValue, "daemon_user", translate("Run Daemon as User")) +for u in util.execi("cat /etc/passwd | cut -d ':' -f1") do + o:value(u) +end + +o = s:option(Flag, "enable_logging", translate("Enable Logging")) +o.rmempty = false + +o = s:option(Value, "log_folder", translate("Log Folder")) +o.datatype = "directory" +o.placeholder = "/var/log/kcptun" +o:depends("enable_logging", "1") +o.formvalue = function(...) + local v = (Value.formvalue(...) or ""):trim() + if v ~= "" then + v = string.gsub(v, "\\", "/") + if v:sub(1, 1) ~= "/" then + v = "/" .. v + end + + while v:sub(-1) == "/" do + v = v:sub(1, -2) + end + end + + return v +end +o.validate = function(self, value, section) + if value and not fs.stat(value) then + local res, code, msg = fs.mkdir(value) + if not res then + return nil, msg + end + end + return Value.validate(self, value, section) +end + +o = s:option(ListValue, "arch", translate("CPU Architecture"), + translate("The ARCH for checking updates." .. + " Note: Make sure OpenWrt/LEDE 'MIPS FPU Emulator' is enabled on MIPS/MIPSLE devices.")) +o:value("", translate("Auto")) +o:value("i386", "x86") +o:value("x86_64", "x86_64") +o:value("armv5", "ARMv5") +o:value("armv6", "ARMv6") +o:value("armv7", "ARMv7+") +o:value("ar71xx", "MIPS") +o:value("ramips", "MIPSLE") + +o = s:option(Button, "_check_kcptun", translate("Check Kcptun Update"), + translate("Make sure that the 'Client File' dictionary has enough space.")) +o.template = "kcptun/button" +o.inputstyle = "apply" +o.placeholder = translate("Check Kcptun Update") +o.btnclick = "check_update('kcptun', this);" +o.id = "_kcptun-check_kcptun" + +o = s:option(Flag, "save_config", translate("Save Config File"), + translate("Save config file while upgrade LuCI.")) + +o = s:option(Button, "_check_luci", translate("Check LuCI Update"), + translate("You may need to reload current page after update LuCI. Note that translation will not be updated.")) +o.template = "kcptun/button" +o.inputstyle = "apply" +o.placeholder = translate("Check LuCI Update") +o.btnclick = "check_update('luci', this);" +o.id = "_kcptun-check_luci" + +return m diff --git a/package/lean/luci-app-kcptun/luasrc/model/kcptun.lua b/package/lean/luci-app-kcptun/luasrc/model/kcptun.lua new file mode 100644 index 000000000..4484ff606 --- /dev/null +++ b/package/lean/luci-app-kcptun/luasrc/model/kcptun.lua @@ -0,0 +1,486 @@ +-- Copyright 2016-2017 Xingwang Liao +-- Licensed to the public under the Apache License 2.0. + +local fs = require "nixio.fs" +local sys = require "luci.sys" +local uci = require "luci.model.uci".cursor() +local util = require "luci.util" +local i18n = require "luci.i18n" + +module("luci.model.kcptun", package.seeall) + +local kcptun_api = "https://api.github.com/repos/xtaci/kcptun/releases/latest" +local luci_api = "https://api.github.com/repos/kuoruan/luci-app-kcptun/releases/latest" + +local wget = "/usr/bin/wget" +local wget_args = { "--no-check-certificate", "--quiet", "--timeout=10", "--tries=2" } +local command_timeout = 40 + +local function _unpack(t, i) + i = i or 1 + if t[i] ~= nil then + return t[i], _unpack(t, i + 1) + end +end + +local function exec(cmd, args, writer, timeout) + local os = require "os" + local nixio = require "nixio" + + local fdi, fdo = nixio.pipe() + local pid = nixio.fork() + + if pid > 0 then + fdo:close() + + if writer or timeout then + local starttime = os.time() + while true do + if timeout and os.difftime(os.time(), starttime) >= timeout then + nixio.kill(pid, nixio.const.SIGTERM) + return 1 + end + + if writer then + local buffer = fdi:read(2048) + if buffer and #buffer > 0 then + writer(buffer) + end + end + + local wpid, stat, code = nixio.waitpid(pid, "nohang") + + if wpid and stat == "exited" then + return code + end + + if not writer and timeout then + nixio.nanosleep(1) + end + end + else + local wpid, stat, code = nixio.waitpid(pid) + return wpid and stat == "exited" and code + end + elseif pid == 0 then + nixio.dup(fdo, nixio.stdout) + fdi:close() + fdo:close() + nixio.exece(cmd, args, nil) + nixio.stdout:close() + os.exit(1) + end +end + +local function compare_versions(ver1, comp, ver2) + local table = table + + local av1 = util.split(ver1, "[%.%-]", nil, true) + local av2 = util.split(ver2, "[%.%-]", nil, true) + + local max = table.getn(av1) + local n2 = table.getn(av2) + if (max < n2) then + max = n2 + end + + for i = 1, max, 1 do + local s1 = av1[i] or "" + local s2 = av2[i] or "" + + if comp == "~=" and (s1 ~= s2) then return true end + if (comp == "<" or comp == "<=") and (s1 < s2) then return true end + if (comp == ">" or comp == ">=") and (s1 > s2) then return true end + if (s1 ~= s2) then return false end + end + + return not (comp == "<" or comp == ">") +end + +local function auto_get_arch() + local arch = nixio.uname().machine or "" + + if arch == "mips" then + if fs.access("/usr/lib/os-release") then + arch = sys.exec("grep 'LEDE_BOARD' /usr/lib/os-release | grep -oE 'ramips|ar71xx'") + elseif fs.access("/etc/openwrt_release") then + arch = sys.exec("grep 'DISTRIB_TARGET' /etc/openwrt_release | grep -oE 'ramips|ar71xx'") + end + end + + return util.trim(arch) +end + +local function get_file_info(arch) + local file_tree = "" + local sub_version = "" + + if arch == "x86_64" then + file_tree = "amd64" + elseif arch == "ramips" then + file_tree = "mipsle" + elseif arch == "ar71xx" then + file_tree = "mips" + elseif arch:match("^i[%d]86$") then + file_tree = "386" + elseif arch:match("^armv[5-8]") then + file_tree = "arm" + sub_version = arch:match("[5-8]") + end + + return file_tree, sub_version +end + +local function get_api_json(url) + local jsonc = require "luci.jsonc" + + local output = { } + exec(wget, { "-O-", url, _unpack(wget_args) }, + function(chunk) output[#output + 1] = chunk end) + + local json_content = util.trim(table.concat(output)) + + if json_content == "" then + return { } + end + + return jsonc.parse(json_content) or { } +end + +function get_config_option(option, default) + return uci:get("kcptun", "general", option) or default +end + +function get_current_log_file(type) + local log_folder = get_config_option("log_folder", "/var/log/kcptun") + return "%s/%s.%s.log" % { log_folder, type, "general" } +end + +function is_running(client) + if client and client ~= "" then + local file_name = client:match(".*/([^/]+)$") or "" + if file_name ~= "" then + return sys.call("pidof %s >/dev/null" % file_name) == 0 + end + end + + return false +end + +function get_kcptun_version(file) + if file and file ~= "" then + if not fs.access(file, "rwx", "rx", "rx") then + fs.chmod(file, 755) + end + + local info = util.trim(sys.exec("%s -v 2>/dev/null" % file)) + + if info ~= "" then + local tb = util.split(info, "%s+", nil, true) + return tb[1] == "kcptun" and tb[3] or "" + end + end + + return "" +end + +function get_luci_version() + local ipkg = require "luci.model.ipkg" + + local package_name = "luci-app-kcptun" + local package_info = ipkg.info(package_name) or {} + + if next(package_info) ~= nil then + return package_info[package_name]["Version"] + end + return "" +end + +function check_kcptun(arch) + if not arch or arch == "" then + arch = auto_get_arch() + end + + local file_tree, sub_version = get_file_info(arch) + + if file_tree == "" then + return { + code = 1, + error = i18n.translate("Can't determine ARCH, or ARCH not supported. Please select manually.") + } + end + + local json = get_api_json(kcptun_api) + + if json.tag_name == nil then + return { + code = 1, + error = i18n.translate("Get remote version info failed.") + } + end + + local remote_version = json.tag_name:match("[^v]+") + + local client_file = get_config_option("client_file") + + local needs_update = compare_versions(get_kcptun_version(client_file), "<", remote_version) + local html_url, download_url + + if needs_update then + html_url = json.html_url + for _, v in ipairs(json.assets) do + if v.name and v.name:match("linux%-" .. file_tree) then + download_url = v.browser_download_url + break + end + end + end + + if needs_update and not download_url then + return { + code = 1, + version = remote_version, + html_url = html_url, + error = i18n.translate("New version found, but failed to get new version download url.") + } + end + + return { + code = 0, + update = needs_update, + version = remote_version, + url = { + html = html_url, + download = download_url + }, + type = file_tree .. sub_version + } +end + +function check_luci() + local json = get_api_json(luci_api) + + if json.tag_name == nil then + return { + code = 1, + error = i18n.translate("Get remote version info failed.") + } + end + + local remote_version = json.tag_name:match("[^v]+") + + local needs_update = compare_versions(get_luci_version(), "<", remote_version) + local html_url, luci_url + local i18n_urls = { } + + if needs_update then + html_url = json.html_url + for _, v in ipairs(json.assets) do + local n = v.name + if n then + if n:match("luci%-app%-kcptun") then + luci_url = v.browser_download_url + elseif n:match("luci%-i18n%-kcptun") then + i18n_urls[#i18n_urls + 1] = v.browser_download_url + end + end + end + end + + if needs_update and not luci_url then + return { + code = 1, + version = remote_version, + html_url = html_url, + error = i18n.translate("New version found, but failed to get new version download url.") + } + end + + return { + code = 0, + update = needs_update, + version = remote_version, + url = { + html = html_url, + luci = luci_url, + i18n = i18n_urls + } + } +end + +function download_kcptun(url) + if not url or url == "" then + return { + code = 1, + error = i18n.translate("Download url is required.") + } + end + + sys.call("/bin/rm -f /tmp/kcptun_download.*") + + local tmp_file = util.trim(util.exec("mktemp -u -t kcptun_download.XXXXXX")) + + local result = exec(wget, { + "-O", tmp_file, url, _unpack(wget_args) }, nil, command_timeout) == 0 + + if not result then + exec("/bin/rm", { "-f", tmp_file }) + return { + code = 1, + error = i18n.translatef("File download failed or timed out: %s", url) + } + end + + return { + code = 0, + file = tmp_file + } +end + +function extract_kcptun(file, subfix) + if not file or file == "" or not fs.access(file) then + return { + code = 1, + error = i18n.translate("File path required.") + } + end + + sys.call("/bin/rm -rf /tmp/kcptun_extract.*") + local tmp_dir = util.trim(util.exec("mktemp -d -t kcptun_extract.XXXXXX")) + + local output = { } + exec("/bin/tar", { "-C", tmp_dir, "-zxvf", file }, + function(chunk) output[#output + 1] = chunk end) + + local files = util.split(table.concat(output)) + + exec("/bin/rm", { "-f", file }) + + local new_file = nil + for _, f in pairs(files) do + if f:match("client_linux_%s" % subfix) then + new_file = tmp_dir .. "/" .. util.trim(f) + break + end + end + + if not new_file then + for _, f in pairs(files) do + if f:match("client_") then + new_file = tmp_dir .. "/" .. util.trim(f) + break + end + end + end + + if not new_file then + exec("/bin/rm", { "-rf", tmp_dir }) + return { + code = 1, + error = i18n.translatef("Can't find client in file: %s", file) + } + end + + return { + code = 0, + file = new_file + } +end + +function move_kcptun(file) + if not file or file == "" or not fs.access(file) then + sys.call("/bin/rm -rf /tmp/kcptun_extract.*") + return { + code = 1, + error = i18n.translate("Client file is required.") + } + end + + local version = get_kcptun_version(file) + if version == "" then + sys.call("/bin/rm -rf /tmp/kcptun_extract.*") + return { + code = 1, + error = i18n.translate("The client file is not suitable for current device. Please reselect ARCH.") + } + end + + local client_file = get_config_option("client_file", "/var/kcptun_client") + local client_file_bak + + if fs.access(client_file) then + client_file_bak = client_file .. ".bak" + exec("/bin/mv", { "-f", client_file, client_file_bak }) + end + + local result = exec("/bin/mv", { "-f", file, client_file }, nil, command_timeout) == 0 + + if not result or not fs.access(client_file) then + sys.call("/bin/rm -rf /tmp/kcptun_extract.*") + if client_file_bak then + exec("/bin/mv", { "-f", client_file_bak, client_file }) + end + return { + code = 1, + error = i18n.translatef("Can't move new file to path: %s", client_file) + } + end + + exec("/bin/chmod", { "755", client_file }) + + if client_file_bak then + exec("/bin/rm", { "-f", client_file_bak }) + end + + sys.call("/bin/rm -rf /tmp/kcptun_extract.*") + + uci:set("kcptun", "general", "client_file", client_file) + uci:commit("kcptun") + + return { code = 0 } +end + +function update_luci(url, save) + if not url or url == "" then + return { + code = 1, + error = i18n.translate("Download url is required.") + } + end + + sys.call("/bin/rm -f /tmp/luci_kcptun.*.ipk") + + local tmp_file = util.trim(util.exec("mktemp -u -t luci_kcptun.XXXXXX")) .. ".ipk" + + local result = exec("/usr/bin/wget", { + "-O", tmp_file, url, _unpack(wget_args) }, nil, command_timeout) == 0 + + if not result then + exec("/bin/rm", { "-f", tmp_file }) + return { + code = 1, + error = i18n.translatef("File download failed or timed out: %s", url) + } + end + + local opkg_args = { "--force-downgrade", "--force-reinstall" } + + if save ~= "true" then + opkg_args[#opkg_args + 1] = "--force-maintainer" + end + + result = exec("/bin/opkg", { "install", tmp_file, _unpack(opkg_args) }) == 0 + + if not result then + exec("/bin/rm", { "-f", tmp_file }) + return { + code = 1, + error = i18n.translate("Package update failed.") + } + end + + exec("/bin/rm", { "-f", tmp_file }) + exec("/bin/rm", { "-rf", "/tmp/luci-indexcache", "/tmp/luci-modulecache" }) + + return { code = 0 } +end diff --git a/package/lean/luci-app-kcptun/luasrc/view/kcptun/button.htm b/package/lean/luci-app-kcptun/luasrc/view/kcptun/button.htm new file mode 100644 index 000000000..14ffb09a1 --- /dev/null +++ b/package/lean/luci-app-kcptun/luasrc/view/kcptun/button.htm @@ -0,0 +1,19 @@ +<%# + Copyright 2017 Hsing-wang Liao + Licensed to the public under the Apache License 2.0. +-%> + +<%+cbi/valueheader%> + <% if self:cfgvalue(section) ~= false then %> + " type="button"<%= + attr("name", cbid) .. + attr("id", self.id or cbid) .. + attr("value", self.inputtitle or self.title) .. + ifattr(self.btnclick, "onclick", self.btnclick) .. + ifattr(self.placeholder, "placeholder") + %> /> + + <% else %> + - + <% end %> +<%+cbi/valuefooter%> diff --git a/package/lean/luci-app-kcptun/luasrc/view/kcptun/log_view.htm b/package/lean/luci-app-kcptun/luasrc/view/kcptun/log_view.htm new file mode 100644 index 000000000..b16c45a12 --- /dev/null +++ b/package/lean/luci-app-kcptun/luasrc/view/kcptun/log_view.htm @@ -0,0 +1,74 @@ +<%# + Copyright 2016-2017 Xingwang Liao + Licensed to the public under the Apache License 2.0. +-%> + +<% css = [[ + + #log_text { + padding: 10px; + text-align: left; + } + #log_text pre { + word-break: break-all; + margin: 0; + } + .description { + background-color: #33ccff; + } + +]] +%> + +<%+header%> + + + <%:Kcptun%> - <%:Log Data%> + + + + + + <%:Collecting data...%> + <%:Refresh every 5 seconds.%> + + + + + + + +<%+footer%> diff --git a/package/lean/luci-app-kcptun/luasrc/view/kcptun/status.htm b/package/lean/luci-app-kcptun/luasrc/view/kcptun/status.htm new file mode 100644 index 000000000..d799635fd --- /dev/null +++ b/package/lean/luci-app-kcptun/luasrc/view/kcptun/status.htm @@ -0,0 +1,258 @@ +<%# + Copyright 2016-2017 Xingwang Liao + Licensed to the public under the Apache License 2.0. +-%> + +<% +local kcp = require "luci.model.kcptun" +local dsp = require "luci.dispatcher" + +local client_file = kcp.get_config_option("client_file") +local client_version = kcp.get_kcptun_version(client_file) +local luci_version = kcp.get_luci_version() +-%> + + + <%:Running Status%> + + + <%:Client Version%> + + <% if client_version == "" then -%> + <%:Invalid Client File.%> + <% else -%> + <%=pcdata(client_version)%> + <%- end %> + + + <%:Client Status%><%:Collecting data...%> + <% if luci_version ~= "" then -%> + <%:LuCI Version%><%=pcdata(luci_version)%> + <% end -%> + + + + diff --git a/package/lean/luci-app-kcptun/po/templates/kcptun.pot b/package/lean/luci-app-kcptun/po/templates/kcptun.pot new file mode 100644 index 000000000..3f07759eb --- /dev/null +++ b/package/lean/luci-app-kcptun/po/templates/kcptun.pot @@ -0,0 +1,346 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +msgid "2nd ACK" +msgstr "" + +msgid "Alias" +msgstr "" + +msgid "Auto" +msgstr "" + +msgid "" +"Auto expiration time(in seconds) for a single UDP connection, 0 to disable." +msgstr "" + +msgid "CPU Architecture" +msgstr "" + +msgid "Can't determine ARCH, or ARCH not supported. Please select manually." +msgstr "" + +msgid "Can't find client in file: %s" +msgstr "" + +msgid "Can't move new file to path: %s" +msgstr "" + +msgid "Check Kcptun Update" +msgstr "" + +msgid "Check LuCI Update" +msgstr "" + +msgid "Clear Log File" +msgstr "" + +msgid "Click to Update" +msgstr "" + +msgid "Client File" +msgstr "" + +msgid "Client Status" +msgstr "" + +msgid "Client Version" +msgstr "" + +msgid "Client file is required." +msgstr "" + +msgid "Collecting data..." +msgstr "" + +msgid "DSCP(6bit)" +msgstr "" + +msgid "Disable" +msgstr "" + +msgid "Disable Compression" +msgstr "" + +msgid "Disable Compression?" +msgstr "" + +msgid "Download url is required." +msgstr "" + +msgid "Downloading..." +msgstr "" + +msgid "Edit Server" +msgstr "" + +msgid "Embedded Mode" +msgstr "" + +msgid "Enable Logging" +msgstr "" + +msgid "Enable nodelay Mode." +msgstr "" + +msgid "Encrypt Method" +msgstr "" + +msgid "Error get log data." +msgstr "" + +msgid "Extracting..." +msgstr "" + +msgid "False" +msgstr "" + +msgid "File download failed or timed out: %s" +msgstr "" + +msgid "File path required." +msgstr "" + +msgid "General Settings" +msgstr "" + +msgid "Get remote version info failed." +msgstr "" + +msgid "How long an expired connection can live(in sec), -1 to disable." +msgstr "" + +msgid "Invalid Client File." +msgstr "" + +msgid "Kcptun" +msgstr "" + +msgid "Kcptun Client" +msgstr "" + +msgid "Key" +msgstr "" + +msgid "Last 50 lines of log file:" +msgstr "" + +msgid "Last 50 lines of syslog:" +msgstr "" + +msgid "Listen Address" +msgstr "" + +msgid "Loading" +msgstr "" + +msgid "Local Listen Host" +msgstr "" + +msgid "Local Listen Port." +msgstr "" + +msgid "Local Port" +msgstr "" + +msgid "Local listen host." +msgstr "" + +msgid "Log" +msgstr "" + +msgid "Log Data" +msgstr "" + +msgid "Log Folder" +msgstr "" + +msgid "LuCI Version" +msgstr "" + +msgid "Make sure that the 'Client File' dictionary has enough space." +msgstr "" + +msgid "Maximum transmission unit of UDP packets." +msgstr "" + +msgid "Moving..." +msgstr "" + +msgid "" +"NAT keepalive interval to prevent your router from removing port mapping, " +"default unit is seconds." +msgstr "" + +msgid "New version found, but failed to get new version download url." +msgstr "" + +msgid "No Update Found" +msgstr "" + +msgid "No log data." +msgstr "" + +msgid "None" +msgstr "" + +msgid "Not Running" +msgstr "" + +msgid "Number of UDP connections to server." +msgstr "" + +msgid "Off" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Package update failed." +msgstr "" + +msgid "Pre-shared secret for client and server." +msgstr "" + +msgid "Processing..." +msgstr "" + +msgid "Receive Window Size(num of packets)." +msgstr "" + +msgid "Reed-solomon Erasure Coding - datashard." +msgstr "" + +msgid "Reed-solomon Erasure Coding - parityshard." +msgstr "" + +msgid "Refresh every 5 seconds." +msgstr "" + +msgid "Run Daemon as User" +msgstr "" + +msgid "Running" +msgstr "" + +msgid "Running Status" +msgstr "" + +msgid "SNMP collect period, in seconds" +msgstr "" + +msgid "Save Config File" +msgstr "" + +msgid "Save config file while upgrade LuCI." +msgstr "" + +msgid "Send Window Size(num of packets)." +msgstr "" + +msgid "Send/secv buffer size of udp sockets, default unit is MB." +msgstr "" + +msgid "Server" +msgstr "" + +msgid "Server Address" +msgstr "" + +msgid "Server List" +msgstr "" + +msgid "Server Manage" +msgstr "" + +msgid "Server Port" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "" +"The ARCH for checking updates. Note: Make sure OpenWrt/LEDE 'MIPS FPU " +"Emulator' is enabled on MIPS/MIPSLE devices." +msgstr "" + +msgid "" +"The client file is not suitable for current device. Please reselect ARCH." +msgstr "" + +msgid "True" +msgstr "" + +msgid "Update Success." +msgstr "" + +msgid "Update in progress. Are you sure to close window?" +msgstr "" + +msgid "" +"You may need to reload current page after update LuCI. Note that translation " +"will not be updated." +msgstr "" + +msgid "acknodelay" +msgstr "" + +msgid "autoexpire" +msgstr "" + +msgid "conn" +msgstr "" + +msgid "crypt" +msgstr "" + +msgid "datashard" +msgstr "" + +msgid "dscp" +msgstr "" + +msgid "interval" +msgstr "" + +msgid "keepalive" +msgstr "" + +msgid "mode" +msgstr "" + +msgid "mtu" +msgstr "" + +msgid "nc" +msgstr "" + +msgid "nocomp" +msgstr "" + +msgid "nodelay" +msgstr "" + +msgid "optional" +msgstr "" + +msgid "parityshard" +msgstr "" + +msgid "rcvwnd" +msgstr "" + +msgid "resend" +msgstr "" + +msgid "scavengettl" +msgstr "" + +msgid "sndwnd" +msgstr "" + +msgid "snmpperiod" +msgstr "" + +msgid "sockbuf" +msgstr "" diff --git a/package/lean/luci-app-kcptun/po/zh-cn/kcptun.po b/package/lean/luci-app-kcptun/po/zh-cn/kcptun.po new file mode 100644 index 000000000..6859c977e --- /dev/null +++ b/package/lean/luci-app-kcptun/po/zh-cn/kcptun.po @@ -0,0 +1,348 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +msgid "2nd ACK" +msgstr "2次 ACK 跨越重传" + +msgid "Alias" +msgstr "别名" + +msgid "Auto" +msgstr "自动" + +msgid "" +"Auto expiration time(in seconds) for a single UDP connection, 0 to disable." +msgstr "单个 UDP 连接的自动过期时间(秒),设置 0 来禁用" + +msgid "CPU Architecture" +msgstr "CPU 架构" + +msgid "Can't determine ARCH, or ARCH not supported. Please select manually." +msgstr "无法自动确定 ARCH,或者不支持该 ARCH,请手动重新选择。" + +msgid "Can't find client in file: %s" +msgstr "无法在文件中找到客户端:%s" + +msgid "Can't move new file to path: %s" +msgstr "无法移动新文件到:%s" + +msgid "Check Kcptun Update" +msgstr "检查 Kcptun 更新" + +msgid "Check LuCI Update" +msgstr "检查 LuCI 更新" + +msgid "Clear Log File" +msgstr "清理日志文件" + +msgid "Click to Update" +msgstr "点击更新" + +msgid "Client File" +msgstr "客户端文件" + +msgid "Client Status" +msgstr "客户端状态" + +msgid "Client Version" +msgstr "客户端版本" + +msgid "Client file is required." +msgstr "请指定客户端文件。" + +msgid "Collecting data..." +msgstr "正在收集数据..." + +msgid "DSCP(6bit)" +msgstr "DSCP(6bit)" + +msgid "Disable" +msgstr "禁用" + +msgid "Disable Compression" +msgstr "禁用压缩" + +msgid "Disable Compression?" +msgstr "是否禁用压缩?" + +msgid "Download url is required." +msgstr "请指定下载链接。" + +msgid "Downloading..." +msgstr "正在下载..." + +msgid "Edit Server" +msgstr "编辑服务端" + +msgid "Embedded Mode" +msgstr "内置模式" + +msgid "Enable Logging" +msgstr "启用日志记录" + +msgid "Enable nodelay Mode." +msgstr "启用 nodelay 模式" + +msgid "Encrypt Method" +msgstr "加密方式" + +msgid "Error get log data." +msgstr "获取日志数据失败。" + +msgid "Extracting..." +msgstr "正在解压..." + +msgid "False" +msgstr "否" + +msgid "File download failed or timed out: %s" +msgstr "文件下载失败或超时:%s" + +msgid "File path required." +msgstr "请指定文件路径。" + +msgid "General Settings" +msgstr "基本设置" + +msgid "Get remote version info failed." +msgstr "获取远程版本信息失败。" + +msgid "How long an expired connection can live(in sec), -1 to disable." +msgstr "过期连接保留多长时间(秒),设置 -1 来禁用" + +msgid "Invalid Client File." +msgstr "客户端文件配置有误" + +msgid "Kcptun" +msgstr "" + +msgid "Kcptun Client" +msgstr "Kcptun 客户端" + +msgid "Key" +msgstr "密码" + +msgid "Last 50 lines of log file:" +msgstr "日志文件的最新 50 行:" + +msgid "Last 50 lines of syslog:" +msgstr "系统日志的最新 50 行:" + +msgid "Listen Address" +msgstr "监听地址" + +msgid "Loading" +msgstr "正在加载..." + +msgid "Local Listen Host" +msgstr "本地监听地址" + +msgid "Local Listen Port." +msgstr "本地监听端口" + +msgid "Local Port" +msgstr "本地端口" + +msgid "Local listen host." +msgstr "本地监听主机" + +msgid "Log" +msgstr "日志" + +msgid "Log Data" +msgstr "日志数据" + +msgid "Log Folder" +msgstr "日志文件夹" + +msgid "LuCI Version" +msgstr "LuCI 版本" + +msgid "Make sure that the 'Client File' dictionary has enough space." +msgstr "请确保“客户端文件”所在的文件夹具有足够的空间。" + +msgid "Maximum transmission unit of UDP packets." +msgstr "UDP数据包的最大传输单元" + +msgid "Moving..." +msgstr "正在移动..." + +msgid "" +"NAT keepalive interval to prevent your router from removing port mapping, " +"default unit is seconds." +msgstr "NAT Keepalive 包间隔时间(秒), 防止路由器删除端口映射" + +msgid "New version found, but failed to get new version download url." +msgstr "发现新版本,但是获取下载地址失败。" + +msgid "No Update Found" +msgstr "未发现更新" + +msgid "No log data." +msgstr "无日志数据。" + +msgid "None" +msgstr "无" + +msgid "Not Running" +msgstr "未运行" + +msgid "Number of UDP connections to server." +msgstr "到服务端的UDP连接数量" + +msgid "Off" +msgstr "关闭" + +msgid "On" +msgstr "开启" + +msgid "Package update failed." +msgstr "软件包升级失败。" + +msgid "Pre-shared secret for client and server." +msgstr "客户端和服务端的通信密码" + +msgid "Processing..." +msgstr "正在操作..." + +msgid "Receive Window Size(num of packets)." +msgstr "接收窗口大小 (数据包数量)" + +msgid "Reed-solomon Erasure Coding - datashard." +msgstr "前向纠错 - datashard" + +msgid "Reed-solomon Erasure Coding - parityshard." +msgstr "前向纠错 - parityshard" + +msgid "Refresh every 5 seconds." +msgstr "每 5 秒刷新。" + +msgid "Run Daemon as User" +msgstr "以该用户启动" + +msgid "Running" +msgstr "运行中" + +msgid "Running Status" +msgstr "运行状态" + +msgid "SNMP collect period, in seconds" +msgstr "SNMP采集周期(秒)" + +msgid "Save Config File" +msgstr "保留配置文件" + +msgid "Save config file while upgrade LuCI." +msgstr "在更新 LuCI 时保留配置文件" + +msgid "Send Window Size(num of packets)." +msgstr "发送窗口大小 (数据包数量)" + +msgid "Send/secv buffer size of udp sockets, default unit is MB." +msgstr "发送/接收UDP数据包的缓冲区大小(MB)" + +msgid "Server" +msgstr "服务端地址" + +msgid "Server Address" +msgstr "服务端地址" + +msgid "Server List" +msgstr "服务端列表" + +msgid "Server Manage" +msgstr "服务端管理" + +msgid "Server Port" +msgstr "服务端端口" + +msgid "Settings" +msgstr "设置" + +msgid "" +"The ARCH for checking updates. Note: Make sure OpenWrt/LEDE 'MIPS FPU " +"Emulator' is enabled on MIPS/MIPSLE devices." +msgstr "" +"用于检查更新的 ARCH。注意: 在 MIPS/MIPSLE 设备上,请确保 OpenWrt/LEDE 的 " +"'MIPS FPU Emulator' 已经启用。" + +msgid "" +"The client file is not suitable for current device. Please reselect ARCH." +msgstr "客户端文件不适用于当前设备,请重新选择 ARCH。" + +msgid "True" +msgstr "是" + +msgid "Update Success." +msgstr "更新成功!" + +msgid "Update in progress. Are you sure to close window?" +msgstr "正在更新,确定关闭窗口?" + +msgid "" +"You may need to reload current page after update LuCI. Note that translation " +"will not be updated." +msgstr "更新 LuCI 之后你可能需要手动刷新当前页面。注意:翻译不会被更新" + +msgid "acknodelay" +msgstr "" + +msgid "autoexpire" +msgstr "" + +msgid "conn" +msgstr "" + +msgid "crypt" +msgstr "" + +msgid "datashard" +msgstr "" + +msgid "dscp" +msgstr "" + +msgid "interval" +msgstr "" + +msgid "keepalive" +msgstr "" + +msgid "mode" +msgstr "" + +msgid "mtu" +msgstr "" + +msgid "nc" +msgstr "" + +msgid "nocomp" +msgstr "" + +msgid "nodelay" +msgstr "" + +msgid "optional" +msgstr "可选" + +msgid "parityshard" +msgstr "" + +msgid "rcvwnd" +msgstr "" + +msgid "resend" +msgstr "" + +msgid "scavengettl" +msgstr "" + +msgid "sndwnd" +msgstr "" + +msgid "snmpperiod" +msgstr "" + +msgid "sockbuf" +msgstr "" diff --git a/package/lean/luci-app-kcptun/root/etc/config/kcptun b/package/lean/luci-app-kcptun/root/etc/config/kcptun new file mode 100644 index 000000000..8c9564ce3 --- /dev/null +++ b/package/lean/luci-app-kcptun/root/etc/config/kcptun @@ -0,0 +1,15 @@ + +config general 'general' + option server '' + option client_file '/var/kcptun_client' + option daemon_user 'root' + option enable_logging '1' + +config servers 'default' + option server_addr '' + option server_port '29900' + option listen_addr '0.0.0.0' + option listen_port '12948' + option crypt 'aes' + option mode 'fast' + option nocomp 'false' diff --git a/package/lean/luci-app-kcptun/root/etc/init.d/kcptun b/package/lean/luci-app-kcptun/root/etc/init.d/kcptun new file mode 100755 index 000000000..c8bc3dc34 --- /dev/null +++ b/package/lean/luci-app-kcptun/root/etc/init.d/kcptun @@ -0,0 +1,244 @@ +#!/bin/sh /etc/rc.common +# +# Copyright 2016-2017 Xingwang Liao +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +START=99 +USE_PROCD=1 + +KCPTUN=kcptun +CONFIG_FOLDER=/var/etc/$KCPTUN + +if [ -r /usr/share/libubox/jshn.sh ]; then + . /usr/share/libubox/jshn.sh +elif [ -r /lib/functions/jshn.sh ]; then + . /lib/functions/jshn.sh +else + logger -p daemon.err -t "$KCPTUN" \ + "Package required: jshn." + exit 1 +fi + +_log() { + local level="$1" + local msg="$2" + + logger -p "daemon.${level}" -t "$KCPTUN" "$msg" +} + +gen_client_config_file() { + local config_file="$1" + + json_init + json_add_string "remoteaddr" "${server_addr}:${server_port}" + json_add_string "localaddr" "${listen_addr}:${listen_port}" + + add_configs() { + local type="$1"; shift + local k v + + for k in "$@"; do + v="$(eval echo "\$$k")" + + if [ -n "$v" ]; then + if [ "$type" = "string" ]; then + json_add_string "$k" "$v" + elif [ "$type" = "int" ]; then + json_add_int "$k" "$v" + elif [ "$type" = "boolean" ]; then + if [ "$v" = "true" ]; then + json_add_boolean "$k" "1" + else + json_add_boolean "$k" "0" + fi + fi + fi + done + } + + add_configs "string" key crypt mode + add_configs "int" conn autoexpire mtu sndwnd rcvwnd datashard parityshard dscp \ + nodelay interval resend nc sockbuf keepalive scavengettl snmpperiod + add_configs "boolean" nocomp acknodelay + + if [ -n "$log_file" ]; then + json_add_string "log" "$log_file" + fi + + json_close_object + + json_dump -i >"$config_file" +} + +setup_iptables_chain() { + if ! ( iptables -nL "$KCPTUN" >/dev/null 2>&1 ); then + iptables -N "$KCPTUN" 2>/dev/null + fi + + iptables -C OUTPUT -j "$KCPTUN" 2>/dev/null || \ + iptables -A OUTPUT -j "$KCPTUN" 2>/dev/null + iptables -C INPUT -j "$KCPTUN" 2>/dev/null || \ + iptables -A INPUT -j "$KCPTUN" 2>/dev/null +} + +clear_iptables_chain() { + iptables -F "$KCPTUN" >/dev/null 2>&1 +} + +add_iptables_rule() { + local port="$1" + local type="$2" + + if [ "$type" = "client" ]; then + ( iptables -C "$KCPTUN" -p tcp --dport "$port" -m comment \ + --comment "$type" -j ACCEPT 2>/dev/null ) && return 0 + + iptables -A "$KCPTUN" -p tcp --dport "$port" -m comment \ + --comment "$type" -j ACCEPT 2>/dev/null + elif [ "$type" = "server" ]; then + ( iptables -C "$KCPTUN" -p udp --dport "$port" -m comment \ + --comment "$type" -j ACCEPT 2>/dev/null ) && return 0 + + iptables -A "$KCPTUN" -p udp --dport "$port" -m comment \ + --comment "$type" -j ACCEPT 2>/dev/null + fi +} + +validate_config_section() { + uci_validate_section "$KCPTUN" general "$1" \ + 'server:uciname' \ + 'client_file:string' \ + 'daemon_user:string:root' \ + 'enable_logging:bool:0' \ + 'log_folder:directory:/var/log/kcptun' +} + +validate_server_section() { + uci_validate_section "$KCPTUN" servers "$1" \ + 'server_addr:host' \ + 'server_port:port:29900' \ + 'listen_addr:host:0.0.0.0' \ + 'listen_port:port:12948' \ + 'key:string' \ + 'crypt:string:aes' \ + 'mode:or("normal","fast","fast2","fast3","manual"):fast' \ + 'conn:min(1)' \ + 'autoexpire:uinteger' \ + 'scavengettl:min(-1)' \ + 'mtu:range(64,9200)' \ + 'sndwnd:min(1)' \ + 'rcvwnd:min(1)' \ + 'datashard:uinteger' \ + 'parityshard:uinteger' \ + 'dscp:uinteger' \ + 'nocomp:or("true", "false")' \ + 'nodelay:bool' \ + 'interval:uinteger' \ + 'resend:range(0,2)' \ + 'nc:bool' \ + 'acknodelay:or("true", "false")' \ + 'sockbuf:uinteger' \ + 'keepalive:uinteger' \ + 'snmpperiod:min(1)' +} + +validate_client_file() { + local file="$1" + + if [ ! -f "$file" ]; then + return 1 + fi + + [ -x "$file" ] || chmod 755 "$file" + + ( $file -v 2>/dev/null | grep -q "$KCPTUN" ) +} + +start_kcptun_instance() { + local section="$1" + + if ! validate_config_section "$section" ; then + _log "err" "Config validate failed." + return 1 + fi + + if [ -z "$server" ] || [ "$server" = "nil" ]; then + _log "info" "No server selected, Client will stop." + return 0 + elif ! validate_server_section "$server"; then + _log "err" "Server config validation failed." + return 1 + elif [ -z "$server_addr" ] || [ -z "$listen_port" ]; then + _log "err" "Server config validation failed." + return 1 + fi + + if [ -z "$client_file" ]; then + _log "err" "Please set client file path, or use auto download." + return 1; + elif ! validate_client_file "$client_file"; then + _log "err" "Client file validation failed." + return 1 + fi + + is_ipv6_address() { + echo "$1" | grep -q ":" + } + + is_ipv6_address "$server_addr" && server_addr="[${server_addr}]" + is_ipv6_address "$listen_addr" && listen_addr="[${listen_addr}]" + + [ -d "$CONFIG_FOLDER" ] || mkdir -p "$CONFIG_FOLDER" + + log_file="" + if [ "$enable_logging" = "1" ]; then + mkdir -p "$log_folder" + chown -R "$daemon_user" "$log_folder" + log_file="${log_folder}/client.${section}.log" + fi + + local config_file=${CONFIG_FOLDER}/client.${section}.json + + if ! ( gen_client_config_file "$config_file" ); then + _log "err" "Can't create config file". + return 1 + fi + + add_iptables_rule "$listen_port" "client" + + procd_open_instance + procd_set_param command "$client_file" + procd_append_param command -c "$config_file" + procd_set_param respawn + procd_set_param user "$daemon_user" + procd_set_param file "$config_file" + procd_close_instance +} + +service_triggers() { + procd_add_reload_trigger "$KCPTUN" +} + +start_service() { + clear_iptables_chain + setup_iptables_chain + + config_load "$KCPTUN" + config_foreach start_kcptun_instance "general" +} + +stop_service() { + clear_iptables_chain +} diff --git a/package/lean/luci-app-kcptun/root/etc/uci-defaults/40_luci-kcptun b/package/lean/luci-app-kcptun/root/etc/uci-defaults/40_luci-kcptun new file mode 100755 index 000000000..c759ba19e --- /dev/null +++ b/package/lean/luci-app-kcptun/root/etc/uci-defaults/40_luci-kcptun @@ -0,0 +1,25 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@kcptun[-1] + add ucitrack kcptun + set ucitrack.@kcptun[-1].init=kcptun + commit ucitrack +EOF + +general=$(uci -q get kcptun.@general[-1]) + +if [ -z "$general" ]; then + uci -q add kcptun general +fi + +if [ ."$general" != ."general" ]; then + uci -q batch <<-EOF >/dev/null + rename kcptun.@general[-1]="general" + set kcptun.general.server="" + commit kcptun + EOF +fi + +rm -rf /tmp/luci-indexcache /tmp/luci-modulecache +exit 0 diff --git a/package/lean/luci-app-kuainiao/Makefile b/package/lean/luci-app-kuainiao/Makefile new file mode 100644 index 000000000..6e8319b3f --- /dev/null +++ b/package/lean/luci-app-kuainiao/Makefile @@ -0,0 +1,17 @@ +# Copyright (C) 2016 Openwrt.org +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for Kuainiao +LUCI_DEPENDS:=+kmod-ppp +openssl-util +wget +kmod-mppe +LUCI_PKGARCH:=all +PKG_VERSION:=1.0 +PKG_RELEASE:=3 + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + diff --git a/package/lean/luci-app-kuainiao/luasrc/controller/kuainiao.lua b/package/lean/luci-app-kuainiao/luasrc/controller/kuainiao.lua new file mode 100644 index 000000000..378517c42 --- /dev/null +++ b/package/lean/luci-app-kuainiao/luasrc/controller/kuainiao.lua @@ -0,0 +1,34 @@ +module("luci.controller.kuainiao", package.seeall) + +function index() + local fs = luci.fs or nixio.fs + if not fs.access("/etc/config/kuainiao") then + return + end + + local page = entry({"admin", "services", "kuainiao"}, cbi("kuainiao"), _("Kuai Niao"),201) + page.dependent = true + entry({"admin","services","kuainiao","status"},call("kuainiao_status")).leaf=true + entry({"admin","services","kuainiao","dwonstatus"},call("down_status")).leaf=true + entry({"admin","services","kuainiao","upstatus"},call("up_status")).leaf=true +end + +function kuainiao_status() +local e={} +e.running=luci.sys.exec("ps |grep -v grep |grep -w '/usr/bin/kuainiao' ") +luci.http.prepare_content("application/json") +luci.http.write_json(e) +end + +function up_status() +local e={} +e.upstatus=luci.sys.exec("cat /usr/share/kuainiao/kuainiao_up_state") +luci.http.prepare_content("application/json") +luci.http.write_json(e) +end +function down_status() +local e={} +e.dwonstatus=luci.sys.exec("cat /usr/share/kuainiao/kuainiao_down_state") +luci.http.prepare_content("application/json") +luci.http.write_json(e) +end diff --git a/package/lean/luci-app-kuainiao/luasrc/model/cbi/kuainiao.lua b/package/lean/luci-app-kuainiao/luasrc/model/cbi/kuainiao.lua new file mode 100644 index 000000000..3fec7cd00 --- /dev/null +++ b/package/lean/luci-app-kuainiao/luasrc/model/cbi/kuainiao.lua @@ -0,0 +1,59 @@ +#fork from https://github.com/zz090923610/thunder-fastNiao,thanks to zz090923610 +require("luci.sys") +require("luci.sys.zoneinfo") +require("luci.config") +local fs = require "nixio.fs" +local ut = require "luci.util" +local o=require"luci.model.network".init() +local sys = require "luci.sys" +local m,t,e +m = Map("kuainiao", translate("迅雷快鸟"),translate("迅雷快鸟是迅雷联合宽带运营商推出的一款致力于帮助用户解决宽带低、网速慢、上网体验差的专业级宽带加速软件。")) +m:section(SimpleSection).template = "kuainiao/kuainiao_status" +s = m:section(NamedSection, "base", "kuainiao", translate("首次使用请填写完帐号密码保存提交一次,之后再启用。")) +s.addremove = false +s:tab("base",translate("Basic Settings")) +s:tab("log",translate("快鸟日志")) +enabled = s:taboption("base",Flag, "enabled", translate("Enable")) +enabled.default=0 +enabled.rmempty = false +enable_down = s:taboption("base",Flag, "enable_down", translate("开启下行加速")) +enable_down.default=1 +enabled.rmempty = false +enable_down:depends("enabled",1) + +enable_up = s:taboption("base",Flag, "enable_up", translate("开启上行加速")) +enable_up.default=0 +enabled.rmempty = false +enable_up:depends("enabled",1) +local a +speed_wan=s:taboption("base",ListValue,"speed_wan",translate("指定加速的接口")) +for a,s in ipairs(o:get_networks())do +if s:name()~="loopback" and s:name()~="lan" then speed_wan:value(s:name())end +end +username = s:taboption("base",Value, "kuainiao_name", translate("迅雷快鸟帐号")) +username.datatype = "minlength(1)" +username.rmempty = false +password = s:taboption("base",Value, "kuainiao_passwd", translate("迅雷快鸟密码")) +password.password = true +password.datatype = "minlength(1)" +password.rmempty = false +kuainiao_config_pwd = s:taboption("base",Value, "kuainiao_config_pwd", translate("加密后密码(自动生成,勿修改)")) +kuainiao_config_pwd.password = true +kuainiao_config_pwd.datatype = "minlength(1)" +kuainiao_config_pwd.rmempty = true +--kuainiao_config_pwd.readonly=true +log=s:taboption("log",TextValue,"log") +log.rows=26 +log.wrap="off" +log.readonly=true +log.cfgvalue=function(t,t) +return nixio.fs.readfile("/var/log/kuainiao.log")or"" +end +log.write=function(log,log,log) +end +m:section(SimpleSection).template = "kuainiao/kuainiao_rsa" +local apply = luci.http.formvalue("cbi.apply") +if apply then + io.popen("luci_kuainiao_apply") +end +return m diff --git a/package/lean/luci-app-kuainiao/luasrc/view/kuainiao/kuainiao_rsa.htm b/package/lean/luci-app-kuainiao/luasrc/view/kuainiao/kuainiao_rsa.htm new file mode 100644 index 000000000..9d8c45871 --- /dev/null +++ b/package/lean/luci-app-kuainiao/luasrc/view/kuainiao/kuainiao_rsa.htm @@ -0,0 +1,25 @@ +<%# + Copyright (C) 2017 Jian Chang + Licensed to the public under the GNU General Public License v3. +-%> + + + + +<% include("cbi/map") %> + + diff --git a/package/lean/luci-app-kuainiao/luasrc/view/kuainiao/kuainiao_status.htm b/package/lean/luci-app-kuainiao/luasrc/view/kuainiao/kuainiao_status.htm new file mode 100644 index 000000000..93c28e579 --- /dev/null +++ b/package/lean/luci-app-kuainiao/luasrc/view/kuainiao/kuainiao_status.htm @@ -0,0 +1,38 @@ +<%# + Copyright 2017 Lede by stones +-%> + +<% include("cbi/map") %> + + + + <%:快鸟运行状态:%><%:Collecting data...%> + + + <%:下行提速状态:%><%:Collecting data...%> + + <%:上行提速状态:%><%:Collecting data...%> + \ No newline at end of file diff --git a/package/lean/luci-app-kuainiao/po/zh-cn/kuainiao.po b/package/lean/luci-app-kuainiao/po/zh-cn/kuainiao.po new file mode 100644 index 000000000..fc29d8849 --- /dev/null +++ b/package/lean/luci-app-kuainiao/po/zh-cn/kuainiao.po @@ -0,0 +1,4 @@ +msgid "Kuai Niao" +msgstr "迅雷快鸟" + + diff --git a/package/lean/luci-app-kuainiao/root/etc/config/kuainiao b/package/lean/luci-app-kuainiao/root/etc/config/kuainiao new file mode 100644 index 000000000..0c4db8d66 --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/etc/config/kuainiao @@ -0,0 +1,8 @@ + +config kuainiao 'base' + option kuainiao_name '' + option kuainiao_passwd '' + option speed_wan 'wan' + option enabled '0' + option enable_down '1' + option enable_up '0' diff --git a/package/lean/luci-app-kuainiao/root/etc/hotplug.d/iface/99-kuainiao b/package/lean/luci-app-kuainiao/root/etc/hotplug.d/iface/99-kuainiao new file mode 100755 index 000000000..2f42f3093 --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/etc/hotplug.d/iface/99-kuainiao @@ -0,0 +1,15 @@ +#!/bin/sh +. /lib/functions.sh + +enabled=`uci -q get kuainiao.base.enabled` +[ "enabled" -eq 1 ] || exit 0 +[ "$ACTION" = ifup ] && { + logger -t Thunder kuainiao has reloaded due to Device: $DEVICE Action: $ACTION ; + /etc/init.d/kuainiao stop && sleep 2; + /etc/init.d/kuainiao start; +} + +[ "$ACTION" = ifdown ] && { + logger -t Thunder KuaiNiao has stoped due to Device: $DEVICE Action: $ACTION ; + /etc/init.d/kuainiao stop; +} \ No newline at end of file diff --git a/package/lean/luci-app-kuainiao/root/etc/init.d/kuainiao b/package/lean/luci-app-kuainiao/root/etc/init.d/kuainiao new file mode 100755 index 000000000..29f7c8adb --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/etc/init.d/kuainiao @@ -0,0 +1,45 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 +START=99 +STOP=15 +SERVICE_WRITE_PID=1 +SERVICE_DAEMONIZE=1 +LOGFILE=/var/log/kuainiao.log + +start_service() +{ + procd_open_instance + procd_set_param command /usr/bin/kuainiao + procd_set_param respawn ${respawn_threshold:-5} ${respawn_timeout:-300} ${respawn_retry:-10} + procd_close_instance +} + +stop_service(){ + clean_log + pid_kuainiao=`ps | grep -v grep | grep -w "/usr/bin/kuainiao" |awk '{print $1}' 2>/dev/null` + [ -n "$pid_kuainiao" ] && { + for pid in $pid_kuainiao + do + echo "Stop service kuainiao PID: $pid" + kill $pid 2>/dev/null + for spid in `pgrep sleep` + do + ppid=`cat /proc/$spid/status | grep -w "PPid" | awk '{print $2}'` + [ "$ppid" -eq "$pid" ] && kill $spid 2>/dev/null && echo "Stop service kuainiao SPID: $spid" + done + done + } + echo "暂无加速信息" > /usr/share/kuainiao/kuainiao_down_state + echo "暂无加速信息" > /usr/share/kuainiao/kuainiao_up_state +} + +clean_log() { + [ -f "$LOGFILE" ] && { + logsnum=$(cat $LOGFILE | grep -c .) + if [ $logsnum -gt 300 ];then + rm -f $LOGFILE >/dev/null 2>&1 & + echo "$(date): 日志文件过长,清空处理!" >> $LOGFILE + fi + } +} diff --git a/package/lean/luci-app-kuainiao/root/etc/uci-defaults/luci-kuainiao b/package/lean/luci-app-kuainiao/root/etc/uci-defaults/luci-kuainiao new file mode 100755 index 000000000..b8b12cac8 --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/etc/uci-defaults/luci-kuainiao @@ -0,0 +1,9 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@kuainiao[-1] + add ucitrack kuainiao + set ucitrack.@kuainiao[-1].init=kuainiao + commit ucitrack +EOF +exit 0 \ No newline at end of file diff --git a/package/lean/luci-app-kuainiao/root/usr/bin/kuainiao b/package/lean/luci-app-kuainiao/root/usr/bin/kuainiao new file mode 100755 index 000000000..f5e520540 --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/usr/bin/kuainiao @@ -0,0 +1,606 @@ +#!/bin/sh +#2017/05/01 by kenney +#2017/07/19 update for lede by stones +. /lib/functions.sh + +LOGFILE=/var/log/kuainiao.log +down_state_file=/usr/share/kuainiao/kuainiao_down_state +up_state_file=/usr/share/kuainiao/kuainiao_up_state +version="0.4" +app_version="2.0.3.4" +protocolVersion=108 +sdkVersion=17550 +logmore=0 #打印更详细日志排查 + + +logmore(){ + data=$1 + [ "$logmore" -eq 1 ] && { + echo $(date): $data >> $LOGFILE + } +} + +log_down(){ + kuainiao_down_state=$1 + status=$2 + if [ "$status" -eq 1 ]; then + echo "$kuainiao_down_state" > $down_state_file + else + echo "$kuainiao_down_state" > $down_state_file + fi +} + +log_up(){ + kuainiao_up_state=$1 + status=$2 + if [ "$status" -eq 1 ]; then + echo "$kuainiao_up_state" > $up_state_file + else + echo "$kuainiao_up_state" > $up_state_file + fi +} + +#WAN接口IP判断 +get_bind_address(){ + ifname=$(uci -P /var/state get network.$kuainiao_config_wan.ifname 2>/dev/null) + [ $? -eq 1 ] && echo $(date): "获取网络 $kuainiao_config_wan 信息出错" >>$LOGFILE && echo >>$LOGFILE && return + logmore "ifname is $ifname" + ##wan_selected 所选接口IP + wan_selected=$(ifconfig $ifname 2>/dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2 2>/dev/null) + [ -z "$wan_selected" ] && echo $(date): "获取网络 $kuainiao_config_wan 接口 $ifname 信息出错" >>$LOGFILE && echo >>$LOGFILE && return + if [ "$wan_selected" != "0.0.0.0" ]; then + bind_address=$wan_selected + else + bind_address="" + fi +} + +#定义请求函数 +#bind_address='113.248.3.11' +get_http_req(){ + if [ -n "$bind_address" ]; then + HTTP_REQ="wget --bind-address=$bind_address --no-check-certificate -O - " + POST_ARG="--post-data=" + else + HTTP_REQ="wget --no-check-certificate -O - " + POST_ARG="--post-data=" + fi + kuainiao_HTTP_REQ=$HTTP_REQ + kuainiao_POST_ARG=$POST_ARG +} + +#数据mock + +generate_pwd_rsa_hex() +{ + # calculate passwd_md5 + logmore "Generating passwd md5" + passwd_md5=`echo -n "$kuainiao_config_pwd" | md5sum | tr -d " -"` + + if [ `echo -n "$passwd_md5" | wc -c` -ne 32 ]; then + logmore "md5sum should be 32 chars, exit." + exit 1 + fi + + logmore "Generating PWD RSA HEX" + #first, encoding passwd using rsa + a=`echo "$passwd_md5" | openssl rsautl -raw -pubin -inkey /etc/thunder.key -hexdump | tr [a-z] [A-Z]` + a=`echo $a | grep -o '00[0-9]0 \- \([A-Z0-9]\{2\}[- ]\)\{16\}' | sed 's/00[0-9]0 - //g' | tr -d " \-\n"` + echo -n "$a" + +} + +#pwd='702CFAF5824E4306516F488DEAFC2D24F76C82FA53BA3396F5615FDD32E4430E45B254E136056ED5F3C5B404A08E2178B51330999A4EC3C2D2989D554D7863BDE8F058F44808E6B65F4D071B5D5C7210210DA9ED8D729312CECA39E0F4516143E33C089F616ABE93E14D3224BEB311D3D6EF65A6CE265D3E4ABA285523F14320' + +get_device_sign(){ + ifname=$(uci get network.$kuainiao_config_wan.ifname 2>/dev/null) + wan_mac=$(ifconfig $ifname | grep 'HWaddr' | awk '{print $5}') + fake_device_id=$(echo -n "$wan_mac" | md5sum | cut -d ' ' -f1) + fake_device_id_tmp1=$(echo -n "$fake_device_id"com.xunlei.vip.swjsq68700d1872b772946a6940e4b51827e8af"" | openssl sha1 -hmac | awk '{print $2}') + devicesign="div100."${fake_device_id}$(echo -n "$fake_device_id_tmp1" | md5sum | cut -d ' ' -f1) +} + + +#verifyCode=$kuainiao_config_verifyCode +#verifyKey=$kuainiao_verifyKey + +#获取用户真实MAC地址 +get_mac_addr(){ + if [ -n "$bind_address" ]; then + ifname=$(uci get network.$kuainiao_config_wan.ifname 2>/dev/null) + peerid=$(ifconfig $ifname | grep 'HWaddr' | awk '{print $5}' | awk 'gsub(/:/, "")')004V + fi + #peerid='000C29212478004V' +} + + +#获取迅雷用户uid +get_xunlei_uid(){ + get_http_req + logmore "HTTP_REQ is $HTTP_REQ" + logmore "POST_ARG is $POST_ARG" + uname=$kuainiao_config_uname + #get_mac_addr + logmore "peerid is $peerid" + [ -z "$peerid" ] && exit 0 + #pwd=$generate_pwd_rsa_hex + pwd=$kuainiao_config_pwd + get_device_sign + logmore "devicesign is $devicesign" + ret=`$HTTP_REQ --header "User-Agent:android-async-http/xl-acc-sdk/version-1.6.1.177600" https://login.mobile.reg2t.sandai.net:443/ $POST_ARG"{\"userName\":\""$uname"\",\"businessType\":68,\"clientVersion\":\"$app_version\",\"appName\":\"ANDROID-com.xunlei.vip.swjsq\",\"isCompressed\":0,\"sequenceNo\":1000001,\"sessionID\":\"\",\"loginType\":0,\"rsaKey\":{\"e\":\"010001\",\"n\":\"AC69F5CCC8BDE47CD3D371603748378C9CFAD2938A6B021E0E191013975AD683F5CBF9ADE8BD7D46B4D2EC2D78AF146F1DD2D50DC51446BB8880B8CE88D476694DFC60594393BEEFAA16F5DBCEBE22F89D640F5336E42F587DC4AFEDEFEAC36CF007009CCCE5C1ACB4FF06FBA69802A8085C2C54BADD0597FC83E6870F1E36FD\"},\"cmdID\":1,\"verifyCode\":\"$verifyCode\",\"peerID\":\""$peerid"\",\"protocolVersion\":$protocolVersion,\"platformVersion\":1,\"passWord\":\""$pwd"\",\"extensionList\":\"\",\"verifyKey\":\"$verifyKey\",\"sdkVersion\":$sdkVersion,\"devicesign\":\""$devicesign"\"}"` + #判断是否登陆成功 + #echo $ret >>test.txt + logmore "........................" + logmore "ret is $ret" + logmore "........................" + session=`echo $ret|awk -F '"sessionID":' '{print $2}'|awk -F '[,}]' '{print $1}'|grep -oE "[A-F,0-9]{32}"` + logmore "session is $session" + #vcode=`echo $ret|awk -F '"errorDescUrl":' '{print $2}'|awk -F '}' '{print $1}'` + #vcode=`echo $vcode|sed 's/\\//g'` + errcode=`echo $ret|awk -F '"errorCode":' '{print $2}'|awk -F '[,}]' '{print $1}'` + logmore "errcode is $errcode" + if [ -z "$session" ]; then + if [ $errcode == 6 ];then + #kuainiao_vcodeimg_url="$vcode" + #kuainiao_verifyKey='F9F6FBE928911784D809EBF046ABE0A6A467583F3944507099EA54BC9B5DA7BD' + kuainiao_last_act="您的账号不安全,需要输入验证码! $(date "+%Y-%m-%d %H:%M:%S")" + + elif [ $errcode == 12 ];then + #kuainiao_vcodeimg_url="" + #kuainiao_verifyKey='' + kuainiao_last_act="登陆协议无效,请更新!$(date "+%Y-%m-%d %H:%M:%S")" + + elif [ $errcode == 3 ];then + #kuainiao_vcodeimg_url="" + #kuainiao_verifyKey='' + kuainiao_last_act="用户名密码错误,请检查!$(date "+%Y-%m-%d %H:%M:%S")" + + else + #kuainiao_vcodeimg_url="" + #kuainiao_verifyKey='' + kuainiao_last_act="迅雷账号登陆失败,请检查输入的用户名密码! $(date "+%Y-%m-%d %H:%M:%S")" + + fi + #echo "迅雷账号登陆失败,请检查输入的用户名密码!" + log_down "$kuainiao_last_act" 0 + + else + uid=`echo $ret|awk -F '"userID":' '{print $2}'|awk -F '[,}]' '{print $1}'` + kuainiao_config_uid=$uid + kuainiao_config_session=$session + kuainiao_last_act="迅雷快鸟已登陆成功!" + log_down "$kuainiao_last_act" 1 + fi + echo $(date): "$kuainiao_last_act" >> $LOGFILE +} + +#获取加速API +get_kuainiao_api(){ + portal=`$HTTP_REQ http://api.portal.swjsq.vip.xunlei.com:81/v2/queryportal` + portal_ip=`echo $portal|grep -oE '([0-9]{1,3}[\.]){3}[0-9]{1,3}'` + portal_port_temp=`echo $portal|grep -oE "port...[0-9]{1,5}"` + portal_port=`echo $portal_port_temp|grep -oE '[0-9]{1,5}'` + + logmore "portal is $portal" >> $LOGFILE + logmore "portal_ip is $portal_ip" >> $LOGFILE + logmore "portal_port_temp is $portal_port_temp" >> $LOGFILE + logmore "portal_port is $portal_port" >> $LOGFILE + + if [ -z "$portal_ip" ]; then + kuainiao_down_state="迅雷快鸟下行API获取失败,请检查网络环境,或稍后再试!" + echo $(date): "$kuainiao_down_state" >> $LOGFILE + log_down "$kuainiao_down_state" 0 + else + api_url="http://$portal_ip:$portal_port/v2" + kuainiao_config_api=$api_url + fi +} + +#获取上行加速API +get_kuainiao_upapi(){ + upportal=`$HTTP_REQ http://api.upportal.swjsq.vip.xunlei.com/v2/queryportal` + upportal_ip=`echo $upportal|grep -oE '([0-9]{1,3}[\.]){3}[0-9]{1,3}'` + upportal_port_temp=`echo $upportal|grep -oE "port...[0-9]{1,5}"` + upportal_port=`echo $upportal_port_temp|grep -oE '[0-9]{1,5}'` + + logmore "upportal is $upportal" + logmore "upportal_ip is $upportal_ip" + logmore "upportal_port_temp is $upportal_port_temp" + logmore "upportal_port is $upportal_port" + + if [ -z "$upportal_ip" ]; then + kuainiao_up_state="迅雷快鸟上行API获取失败,请检查网络环境,或稍后再试!" + #echo "迅雷快鸟服务API获取失败,请检查网络环境,或稍后再试!" + echo $(date): "$kuainiao_up_state" >> $LOGFILE + log_up "$kuainiao_up_state" 0 + else + upapi_url="http://$upportal_ip:$upportal_port/v2" + kuainiao_config_upapi=$upapi_url + fi + logmore "$(date): upapi_url is $upapi_url" +} + + +#检测快鸟加速信息 +get_bandwidth(){ + + logmore "api_url is $api_url" + logmore "peerid is $peerid" + if [ -n "$api_url" ]; then + [ -n "$portal_port_temp" ] && [ -n "$portal_port" ] && bandwidth + band=$width + logmore "band is $band" + can_upgrade=`echo $band|awk -F '"can_upgrade":' '{print $2}'|awk -F '[,}]' '{print $1}'` + logmore "can_upgrade is $can_upgrade" + kuainiao_can_upgrade=$can_upgrade + logmore "kuainiao_can_upgrade is $kuainiao_can_upgrade" + dial_account=`echo $band|awk -F '"dial_account":"' '{print $2}'|awk -F '[,}"]' '{print $1}'` + kuainiao_dial_account=$dial_account + logmore "kuainiao_dial_account is $kuainiao_dial_account" + #判断是否满足加速条件 + if [ "$can_upgrade" -eq 1 ]; then + #echo "迅雷快鸟可以加速~~~愉快的开始加速吧~~" + #获取加速详细信息 + old_downstream=`echo $band|awk -F '"bandwidth":' '{print $2}'|awk -F '"downstream":' '{print $2}'|awk -F '[,}]' '{print $1}'` + max_downstream=`echo $band|awk -F '"max_bandwidth":' '{print $2}'|awk -F '"downstream":' '{print $2}'|awk -F '[,}]' '{print $1}'` + down_state="下行可以加速" + kuainiao_old_downstream=$(expr $old_downstream / 1024) + kuainiao_max_downstream=$(expr $max_downstream / 1024) + logmore "kuainiao_old_downstream is $kuainiao_old_downstream" + logmore "kuainiao_max_downstream is $kuainiao_max_downstream" + else + down_state="下行不满足加速条件" + #echo "T_T 不能加速啊,不满足加速条件哦~~" + log_down "$down_state" 0 + fi + echo $(date): "$down_state" >> $LOGFILE + # kuainiao_down_state=$down_state + + fi +} + +#检测快鸟上行加速信息 +get_upbandwidth(){ + logmore "upapi_url is $upapi_url" + if [ -n "$upapi_url" ]; then + [ -n "$upportal_port_temp" ] && [ -n "$upportal_port" ] && upbandwidth + band=$upwidth + logmore "upwidth is $upwidth" + can_upgrade=`echo $band|awk -F '"can_upgrade":' '{print $2}'|awk -F '[,}]' '{print $1}'` + kuainiao_can_upupgrade=$can_upgrade + updial_account=`echo $band|awk -F '"dial_account":"' '{print $2}'|awk -F '[,}"]' '{print $1}'` + kuainiao_dial_upaccount=$updial_account + logmore "can_upgrade is $can_upgrade" + logmore "kuainiao_can_upupgrade is $kuainiao_can_upupgrade" + logmore "updial_account is $updial_account" + logmore "kuainiao_dial_upaccount is $kuainiao_dial_upaccount" + #判断是否满足加速条件 + if [ "$can_upgrade" -eq 1 ]; then + #echo "迅雷快鸟可以加速~~~愉快的开始加速吧~~" + #获取加速详细信息 + old_upstream=`echo $band|awk -F '"bandwidth":' '{print $2}'|awk -F '"upstream":' '{print $2}'|awk -F '[,}]' '{print $1}'` + max_upstream=`echo $band|awk -F '"max_bandwidth":' '{print $2}'|awk -F '"upstream":' '{print $2}'|awk -F '[,}]' '{print $1}'` + up_state="上行可以加速" + kuainiao_old_upstream=$(expr $old_upstream / 1024) + kuainiao_max_upstream=$(expr $max_upstream / 1024) + logmore "kuainiao_old_upstream is $kuainiao_old_upstream" + logmore "kuainiao_max_upstream is $kuainiao_max_upstream" + else + up_state="上行不满足加速条件" + log_up "$up_state" 0 + fi + echo "$(date): $up_state" >> $LOGFILE + kuainiao_up_state=$up_state + + fi +} + + +#检测试用加速信息 +query_try_info(){ + info=`$HTTP_REQ "$api_url/query_try_info?peerid=$peerid&userid=$uid&user_type=1&sessionid=$session"` + echo $info +} +##{"errno":0,"message":"","number_of_try":0,"richmessage":"","sequence":0,"timestamp":1455936922,"try_duration":10} + +query_try_upinfo(){ + info=`$HTTP_REQ "$upapi_url/query_try_info?peerid=$peerid&userid=$uid&client_type=android-uplink-2.3.3.9&client_version=andrioduplink-2.3.3.9&os=android-7.0.24DUK-AL20&sessionid=$session"` + echo $info +} +##{"errno":0,"exp_day_len":0,"is_exp_day":0,"message":"","number_of_try":1,"richmessage":"","sequence":268435461,"timestamp":1493469390,"try_duration":10} + +get_upgrade_down(){ + _ts=`date +%s`000 + ret=`$HTTP_REQ "$api_url/upgrade?peerid=$peerid&userid=$uid&user_type=1&sessionid=$kuainiao_config_session&dial_account=$dial_account&client_type=android-swjsq-$app_version&client_version=androidswjsq-$app_version&os=android-5.0.1.24SmallRice&time_and=$_ts"` + errcode=`echo $ret|awk -F '"errno":' '{print $2}'|awk -F '[,}"]' '{print $1}'` + if [ "$errcode" == "0" ]; then + down_state="$down_state (您的下行带宽已从$kuainiao_old_downstream M提升到$kuainiao_max_downstream M)" + log_down "$down_state" 1 + else + down_state="$down_state 下行带宽提升失败,请检查宽带账号是否绑定正确" + log_down "$down_state" 0 + fi + echo $(date): "$down_state" >> $LOGFILE + # kuainiao_down_state=$down_state +} + +get_upgrade_up(){ + _ts=`date +%s`000 + up_ret=`$HTTP_REQ --header "User-Agent:android-async-http/xl-acc-sdk/version-1.0.0.1" "$upapi_url/upgrade?peerid=$peerid&userid=$uid&client_type=android-uplink-2.3.3.9&client_version=andrioduplink-2.3.3.9&os=android-7.0.24DUK-AL20&sessionid=$session&user_type=1&dial_account=$updial_account"` + errcode=`echo $up_ret|awk -F '"errno":' '{print $2}'|awk -F '[,}"]' '{print $1}'` + if [ "$errcode" == "0" ] || [ "$errcode" == "812" ];then + up_state="$up_state (您的上行带宽已从$kuainiao_old_upstream M提升到$kuainiao_max_upstream M)" + log_up "$up_state" 1 + else + up_state="$up_state 上行带宽提升失败,请检查宽带账号是否绑定正确" + log_up "$up_state" 0 + fi + echo $(date): "$up_state" >> $LOGFILE + # kuainiao_up_state=$up_state + # echo "$kuainiao_up_state" > $up_state_file +} + +#迅雷快鸟上行加速心跳包 +keepalive_up(){ + _ts=`date +%s`000 + up_ret=`$HTTP_REQ --header "User-Agent:android-async-http/xl-acc-sdk/version-1.0.0.1" "$upapi_url/keepalive?peerid=$peerid&userid=$uid&client_type=android-uplink-2.3.3.9&client_version=andrioduplink-2.3.3.9&os=android-7.0.24DUK-AL20&sessionid=$session&user_type=1&dial_account=$kuainiao_dial_upaccount"` + errcode=`echo $up_ret|awk -F '"errno":' '{print $2}'|awk -F '[,}"]' '{print $1}'` + if [ "$errcode" != "0" ];then + #kuainiao_run_upid=0 + kuainiao_up_state="迅雷上行提速失效!$(date '+%Y-%m-%d %H:%M:%S')" + kuainiao_run_upstatus=0 + log_up "$kuainiao_up_state" 0 + else + #kuainiao_run_upid=$(expr $kuainiao_run_upid + 1) + kuainiao_up_state="您的上行带宽已从${kuainiao_old_upstream}M提升到${kuainiao_max_upstream}M $(date '+%Y-%m-%d %H:%M:%S')" + kuainiao_run_upstatus=1 + log_up "$kuainiao_up_state" 1 + fi +} + + +#检测提速带宽 +bandwidth(){ + [ "$logmore" -eq 1 ] && { + echo $(date): "bandwidth start" >> $LOGFILE + echo $(date): "peerid is $peerid" >> $LOGFILE + echo $(date): "uid is $uid" >> $LOGFILE + echo $(date): "session is $session" >> $LOGFILE + } + _ts=`date +%s`000 + width=`$HTTP_REQ "$api_url/bandwidth?peerid=$peerid&userid=$uid&user_type=1&sessionid=$session&dial_account=$dial_account&client_type=android-swjsq-$app_version&client_version=androidswjsq-$app_version&os=android-5.0.1.24SmallRice&time_and=$_ts"` + #echo $width +} +##{"bandwidth":{"downstream":51200,"upstream":0},"can_upgrade":1,"dial_account":"100001318645","errno":0,"max_bandwidth":{"downstream":102400,"upstream":0},"message":"","province":"bei_jing","province_name":"北京","richmessage":"","sequence":0,"sp":"cnc","sp_name":"联通","timestamp":1455936922} + +upbandwidth(){ + _ts=`date +%s`000 + upwidth=`$HTTP_REQ "$upapi_url/bandwidth?peerid=$peerid&userid=$uid&user_type=1&sessionid=$session&dial_account=$dial_account&client_type=android-swjsq-$app_version&client_version=androidswjsq-$app_version&os=android-5.0.1.24SmallRice&time_and=$_ts"` + #echo $upwidth +} + + +#迅雷快鸟下行加速心跳包 +keepalive_down(){ + _ts=`date +%s`000 + ret=`$HTTP_REQ "$api_url/keepalive?peerid=$peerid&userid=$uid&user_type=1&sessionid=$session&dial_account=$dial_account&client_type=android-swjsq-$app_version&client_version=androidswjsq-$app_version&os=android-5.0.1.24SmallRice&time_and=$_ts"` + errcode=`echo $ret|awk -F '"errno":' '{print $2}'|awk -F '[,}"]' '{print $1}'` + if [ "$errcode" != "0" ];then + #kuainiao_run_upid=0 + kuainiao_down_state="迅雷下行提速失效!"$(date "+%Y-%m-%d %H:%M:%S") + log_down "$kuainiao_down_state" 0 + kuainiao_run_status=0 + else + #kuainiao_run_upid=$(expr $kuainiao_run_upid + 1) + kuainiao_down_state="您的下行带宽已从${kuainiao_old_downstream}M提升到${kuainiao_max_downstream}M $(date '+%Y-%m-%d %H:%M:%S')" + log_down "$kuainiao_down_state" 1 + kuainiao_run_status=1 + + fi + echo $(date): "$kuainiao_down_state" >> $LOGFILE +} + +sigterm(){ + + [ "$kuainiao_can_upgrade" -eq 1 ] && kuainiao_recover + [ "$kuainiao_can_upupgrade" -eq 1 ] && kuainiao_uprecover + logmore "trap sigterm exit" + exit 0 + +} + +#快鸟加速注销 +kuainiao_recover(){ + _ts=`date +%s`000 + recover=`$HTTP_REQ "$api_url/recover?peerid=$peerid&userid=$uid&user_type=1&sessionid=$session&dial_account=$dial_account&client_type=android-swjsq-$app_version&client_version=androidswjsq-$app_version&os=android-5.0.1.24SmallRice&time_and=$_ts"` + #echo $recover + echo $(date): "快鸟下行带宽加速已注销" >> $LOGFILE +} + +kuainiao_uprecover(){ + _ts=`date +%s`000 + recover=`$HTTP_REQ "$upapi_url/recover?peerid=$peerid&userid=$uid&client_type=android-uplink-2.3.3.9&client_version=andrioduplink-2.3.3.9&os=android-7.0.24DUK-AL20&sessionid=$session&user_type=1&dial_account=$updial_account"` + #echo $recover + echo $(date): "快鸟上行带宽加速已注销" >> $LOGFILE +} + +#执行初始化 +kuainiao_init(){ + local kuainiao_last_act="" + local kuainiao_can_upgrade=0 + local kuainiao_can_upupgrade=0 + local kuainiao_down_state="" + local kuainiao_up_state="" +} + +##主逻辑 +trap 'sigterm' TERM +trap 'sigterm' INT + +kuainiao_init +config_load kuainiao +config_get_bool enabled base enabled 0 +config_get_bool kuainiao_downenable base enable_down 0 +config_get_bool kuainiao_upenable base enable_up 0 +config_get kuainiao_config_wan base speed_wan +config_get kuainiao_config_uname base kuainiao_name +config_get kuainiao_config_pwd base kuainiao_config_pwd + +[ "$enabled" -eq 0 ] || [ -z "$kuainiao_config_pwd" ] && exit 0 +[ "$kuainiao_downenable" -eq 0 ] && [ "$kuainiao_upenable" -eq 0 ] && exit 0 +[ -z "$kuainiao_config_uname" ] && exit 0 + +logmore "enabled is $enabled" +logmore "kuainiao_downenable is $kuainiao_downenable" +logmore "kuainiao_upenable is $kuainiao_upenable" +logmore "kuainiao_config_wan is $kuainiao_config_wan" +logmore "kuainiao_config_uname is $kuainiao_config_uname" +logmore "kuainiao_config_pwd is $kuainiao_config_pwd" + +if [ "$kuainiao_downenable" -eq 1 ] || [ "$kuainiao_upenable" -eq 1 ]; then + + logmore "启动延时 7s" + sleep 7s + + #登陆迅雷获取uid + logmore "get_bind_address start" + get_bind_address + logmore "bind_address is $bind_address" + logmore "get_mac_addr start" + get_mac_addr + logmore "peerid is $peerid" + logmore "get_xunlei_uid start" + get_xunlei_uid + logmore "get_xunlei_uid is done" + logmore "id is $uid" + #判断是否登陆成功 + if [ -n "$uid" ]; then + if [ "$kuainiao_downenable" -eq 1 ]; then + logmore "get_kuainiao_api is started......." + get_kuainiao_api + logmore "get_bandwidth is started......." + get_bandwidth + kuainiao_config_downstream=$(expr $old_downstream / 1024) + kuainiao_config_max_downstream=$(expr $max_downstream / 1024) + logmore "kuainiao_config_downstream is $kuainiao_config_downstream" + logmore "kuainiao_config_max_downstream is $kuainiao_config_max_downstream" + logmore "kuainiao_can_upgrade is $kuainiao_can_upgrade" + + if [ "$kuainiao_can_upgrade" -eq 1 ]; then + logmore "get_upgrade_down is started......." + get_upgrade_down + logmore "get_upgrade_down is done......." + sleep 1s + #keepalive_down + fi + fi + if [ "$kuainiao_upenable" -eq 1 ]; then + logmore "get_kuainiao_upapi start" + get_kuainiao_upapi + logmore "get_upbandwidth start" + get_upbandwidth + kuainiao_config_upstream=$(expr $old_upstream / 1024) + kuainiao_config_max_upstream=$(expr $max_upstream / 1024) + logmore "kuainiao_config_upstream is $kuainiao_config_upstream" + logmore "kuainiao_config_max_upstream is $kuainiao_config_max_upstream" + logmore "kuainiao_can_upupgrade is $kuainiao_can_upupgrade" + + if [ "$kuainiao_can_upupgrade" -eq 1 ]; then + logmore "get_upgrade_up start" + get_upgrade_up + sleep 1s + #keepalive_up + fi + fi + fi +fi + +# [ -z "$kuainiao_can_upgrade" ] && [ -z "$kuainiao_can_upupgrade" ] && { + # logmore "exit kuainiao...." + # sleep 7s + # echo "暂无加速信息" > $down_state_file + # echo "暂无加速信息" > $up_state_file + # exit 0 + +# } +while true; +do + sleep 295s + if [ "$kuainiao_downenable" -eq 1 ] && [ "$kuainiao_can_upgrade" -eq 1 ];then + keepalive_down + [ "$kuainiao_run_status" -eq 0 ] && restart_kuainiao + fi + if [ "$kuainiao_upenable" -eq 1 ] && [ "$kuainiao_can_upupgrade" -eq 1 ];then + keepalive_up + [ "$kuainiao_run_upstatus" -eq 0 ] && restart_kuainiao + fi +done + + +restart_kuainiao(){ + kuainiao_init + config_load kuainiao + config_get_bool enabled base enabled 0 + config_get_bool kuainiao_downenable base enable_down 0 + config_get_bool kuainiao_upenable base enable_up 0 + config_get kuainiao_config_wan base speed_wan + config_get kuainiao_config_uname base kuainiao_name + config_get kuainiao_config_pwd base kuainiao_config_pwd + + if [ "$kuainiao_downenable" -eq 1 ] || [ "$kuainiao_upenable" -eq 1 ]; then + logmore "启动延时 7s" + sleep 7s + + #登陆迅雷获取uid + logmore "get_bind_address start" + get_bind_address + logmore "bind_address is $bind_address" + logmore "get_mac_addr start" + get_mac_addr + logmore "peerid is $peerid" + logmore "get_xunlei_uid start" + get_xunlei_uid + logmore "get_xunlei_uid is done" + logmore "id is $uid" + #判断是否登陆成功 + if [ -n "$uid" ]; then + if [ "$kuainiao_downenable" -eq 1 ]; then + logmore "get_kuainiao_api is started......." + get_kuainiao_api + logmore "get_bandwidth is started......." + get_bandwidth + kuainiao_config_downstream=$(expr $old_downstream / 1024) + kuainiao_config_max_downstream=$(expr $max_downstream / 1024) + if [ "$kuainiao_can_upgrade" -eq 1 ]; then + [ "$logmore" -eq 1 ] && logmore "get_upgrade_down is started......." + get_upgrade_down + logmore "get_upgrade_down is done......." + sleep 1s + #keepalive_down + fi + fi + if [ "$kuainiao_upenable" -eq 1 ]; then + logmore "get_kuainiao_upapi start" + get_kuainiao_upapi + logmore "get_upbandwidth start" + get_upbandwidth + kuainiao_config_upstream=$(expr $old_upstream / 1024) + kuainiao_config_max_upstream=$(expr $max_upstream / 1024) + if [ "$kuainiao_can_upupgrade" -eq 1 ]; then + logmore "get_upgrade_up start" + get_upgrade_up + sleep 1s + #keepalive_up + fi + fi + fi + #add_kuainiao_cru + fi + [ -z "$kuainiao_can_upgrade" ] && [ -z "$kuainiao_can_upupgrade" ] && { + logmore "exit kuainiao...." + sleep 7s + echo "暂无加速信息" > $down_state_file + echo "暂无加速信息" > $up_state_file + exit 0 + } +} diff --git a/package/lean/luci-app-kuainiao/root/usr/bin/luci_kuainiao_apply b/package/lean/luci-app-kuainiao/root/usr/bin/luci_kuainiao_apply new file mode 100755 index 000000000..ce48ef893 --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/usr/bin/luci_kuainiao_apply @@ -0,0 +1,12 @@ +#!/bin/sh + +enabled=`uci get kuainiao.base.enabled` + +if [ "$enabled" -eq 0 ]; then + /etc/init.d/kuainiao stop + /etc/init.d/kuainiao disable +else + /etc/init.d/kuainiao stop + /etc/init.d/kuainiao start + /etc/init.d/kuainiao enable +fi \ No newline at end of file diff --git a/package/lean/luci-app-kuainiao/root/usr/share/kuainiao/kuainiao_down_state b/package/lean/luci-app-kuainiao/root/usr/share/kuainiao/kuainiao_down_state new file mode 100644 index 000000000..f01ccd0f0 --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/usr/share/kuainiao/kuainiao_down_state @@ -0,0 +1 @@ +暂无加速信息 \ No newline at end of file diff --git a/package/lean/luci-app-kuainiao/root/usr/share/kuainiao/kuainiao_up_state b/package/lean/luci-app-kuainiao/root/usr/share/kuainiao/kuainiao_up_state new file mode 100644 index 000000000..f01ccd0f0 --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/usr/share/kuainiao/kuainiao_up_state @@ -0,0 +1 @@ +暂无加速信息 \ No newline at end of file diff --git a/package/lean/luci-app-kuainiao/root/www/luci-static/resources/md5.js b/package/lean/luci-app-kuainiao/root/www/luci-static/resources/md5.js new file mode 100644 index 000000000..c1d09a94d --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/www/luci-static/resources/md5.js @@ -0,0 +1 @@ +var md5; md5 || (md5 = function(){function i(a,b){a[b>>5]|=128<>>9<<4)+14]=b;for(var c=1732584193,d=-271733879,e=-1732584194,f=271733878,g=0;a.length>g;g+=16){var h=c,i=d,j=e,o=f;c=k(c,d,e,f,a[g+0],7,-680876936),f=k(f,c,d,e,a[g+1],12,-389564586),e=k(e,f,c,d,a[g+2],17,606105819),d=k(d,e,f,c,a[g+3],22,-1044525330),c=k(c,d,e,f,a[g+4],7,-176418897),f=k(f,c,d,e,a[g+5],12,1200080426),e=k(e,f,c,d,a[g+6],17,-1473231341),d=k(d,e,f,c,a[g+7],22,-45705983),c=k(c,d,e,f,a[g+8],7,1770035416),f=k(f,c,d,e,a[g+9],12,-1958414417),e=k(e,f,c,d,a[g+10],17,-42063),d=k(d,e,f,c,a[g+11],22,-1990404162),c=k(c,d,e,f,a[g+12],7,1804603682),f=k(f,c,d,e,a[g+13],12,-40341101),e=k(e,f,c,d,a[g+14],17,-1502002290),d=k(d,e,f,c,a[g+15],22,1236535329),c=l(c,d,e,f,a[g+1],5,-165796510),f=l(f,c,d,e,a[g+6],9,-1069501632),e=l(e,f,c,d,a[g+11],14,643717713),d=l(d,e,f,c,a[g+0],20,-373897302),c=l(c,d,e,f,a[g+5],5,-701558691),f=l(f,c,d,e,a[g+10],9,38016083),e=l(e,f,c,d,a[g+15],14,-660478335),d=l(d,e,f,c,a[g+4],20,-405537848),c=l(c,d,e,f,a[g+9],5,568446438),f=l(f,c,d,e,a[g+14],9,-1019803690),e=l(e,f,c,d,a[g+3],14,-187363961),d=l(d,e,f,c,a[g+8],20,1163531501),c=l(c,d,e,f,a[g+13],5,-1444681467),f=l(f,c,d,e,a[g+2],9,-51403784),e=l(e,f,c,d,a[g+7],14,1735328473),d=l(d,e,f,c,a[g+12],20,-1926607734),c=m(c,d,e,f,a[g+5],4,-378558),f=m(f,c,d,e,a[g+8],11,-2022574463),e=m(e,f,c,d,a[g+11],16,1839030562),d=m(d,e,f,c,a[g+14],23,-35309556),c=m(c,d,e,f,a[g+1],4,-1530992060),f=m(f,c,d,e,a[g+4],11,1272893353),e=m(e,f,c,d,a[g+7],16,-155497632),d=m(d,e,f,c,a[g+10],23,-1094730640),c=m(c,d,e,f,a[g+13],4,681279174),f=m(f,c,d,e,a[g+0],11,-358537222),e=m(e,f,c,d,a[g+3],16,-722521979),d=m(d,e,f,c,a[g+6],23,76029189),c=m(c,d,e,f,a[g+9],4,-640364487),f=m(f,c,d,e,a[g+12],11,-421815835),e=m(e,f,c,d,a[g+15],16,530742520),d=m(d,e,f,c,a[g+2],23,-995338651),c=n(c,d,e,f,a[g+0],6,-198630844),f=n(f,c,d,e,a[g+7],10,1126891415),e=n(e,f,c,d,a[g+14],15,-1416354905),d=n(d,e,f,c,a[g+5],21,-57434055),c=n(c,d,e,f,a[g+12],6,1700485571),f=n(f,c,d,e,a[g+3],10,-1894986606),e=n(e,f,c,d,a[g+10],15,-1051523),d=n(d,e,f,c,a[g+1],21,-2054922799),c=n(c,d,e,f,a[g+8],6,1873313359),f=n(f,c,d,e,a[g+15],10,-30611744),e=n(e,f,c,d,a[g+6],15,-1560198380),d=n(d,e,f,c,a[g+13],21,1309151649),c=n(c,d,e,f,a[g+4],6,-145523070),f=n(f,c,d,e,a[g+11],10,-1120210379),e=n(e,f,c,d,a[g+2],15,718787259),d=n(d,e,f,c,a[g+9],21,-343485551),c=p(c,h),d=p(d,i),e=p(e,j),f=p(f,o)}return[c,d,e,f]}function j(a,b,c,d,e,f){return p(q(p(p(b,a),p(d,f)),e),c)}function k(a,b,c,d,e,f,g){return j(b&c|~b&d,a,b,e,f,g)}function l(a,b,c,d,e,f,g){return j(b&d|c&~d,a,b,e,f,g)}function m(a,b,c,d,e,f,g){return j(b^c^d,a,b,e,f,g)}function n(a,b,c,d,e,f,g){return j(c^(b|~d),a,b,e,f,g)}function p(a,b){var c=(a&65535)+(b&65535),d=(a>>16)+(b>>16)+(c>>16);return d<<16|c&65535}function q(a,b){return a<>>32-b}function r(a){for(var b=[],d=(1<e;e+=c)b[e>>5]|=(a.charCodeAt(e/c)&d)<e;e++)d+=c.charAt(b[e>>2]>>e%4*8+4&15)+c.charAt(b[e>>2]>>e%4*8&15);return d}var a=0,c=8;return function(a){return t(i(r(a),a.length*c))}}()); \ No newline at end of file diff --git a/package/lean/luci-app-kuainiao/root/www/luci-static/resources/rsa.js b/package/lean/luci-app-kuainiao/root/www/luci-static/resources/rsa.js new file mode 100644 index 000000000..0e012c300 --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/www/luci-static/resources/rsa.js @@ -0,0 +1 @@ +var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64padchar="=";function hex2b64(h){var i;var c;var ret="";for(i=0;i+3<=h.length;i+=3){c=parseInt(h.substring(i,i+3),16);ret+=b64map.charAt(c>>6)+b64map.charAt(c&63)}if(i+1==h.length){c=parseInt(h.substring(i,i+1),16);ret+=b64map.charAt(c<<2)}else{if(i+2==h.length){c=parseInt(h.substring(i,i+2),16);ret+=b64map.charAt(c>>2)+b64map.charAt((c&3)<<4)}}while((ret.length&3)>0){ret+=b64padchar}return ret}function b64tohex(s){var ret="";var i;var k=0;var slop;for(i=0;i>2);slop=v&3;k=1}else{if(k==1){ret+=int2char((slop<<2)|(v>>4));slop=v&15;k=2}else{if(k==2){ret+=int2char(slop);ret+=int2char(v>>2);slop=v&3;k=3}else{ret+=int2char((slop<<2)|(v>>4));ret+=int2char(v&15);k=0}}}}if(k==1){ret+=int2char(slop<<2)}return ret}function b64toBA(s){var h=b64tohex(s);var i;var a=new Array();for(i=0;2*i=0){var v=x*this[i++]+w[j]+c;c=Math.floor(v/67108864);w[j++]=v&67108863}return c}function am2(i,x,w,j,c,n){var xl=x&32767,xh=x>>15;while(--n>=0){var l=this[i]&32767;var h=this[i++]>>15;var m=xh*l+h*xl;l=xl*l+((m&32767)<<15)+w[j]+(c&1073741823);c=(l>>>30)+(m>>>15)+xh*h+(c>>>30);w[j++]=l&1073741823}return c}function am3(i,x,w,j,c,n){var xl=x&16383,xh=x>>14;while(--n>=0){var l=this[i]&16383;var h=this[i++]>>14;var m=xh*l+h*xl;l=xl*l+((m&16383)<<14)+w[j]+c;c=(l>>28)+(m>>14)+xh*h;w[j++]=l&268435455}return c}if(j_lm&&(navigator.appName=="Microsoft Internet Explorer")){BigInteger.prototype.am=am2;dbits=30}else{if(j_lm&&(navigator.appName!="Netscape")){BigInteger.prototype.am=am1;dbits=26}else{BigInteger.prototype.am=am3;dbits=28}}BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=((1<=0;--i){r[i]=this[i]}r.t=this.t;r.s=this.s}function bnpFromInt(x){this.t=1;this.s=(x<0)?-1:0;if(x>0){this[0]=x}else{if(x<-1){this[0]=x+this.DV}else{this.t=0}}}function nbv(i){var r=nbi();r.fromInt(i);return r}function bnpFromString(s,b){var k;if(b==16){k=4}else{if(b==8){k=3}else{if(b==256){k=8}else{if(b==2){k=1}else{if(b==32){k=5}else{if(b==4){k=2}else{this.fromRadix(s,b);return}}}}}}this.t=0;this.s=0;var i=s.length,mi=false,sh=0;while(--i>=0){var x=(k==8)?s[i]&255:intAt(s,i);if(x<0){if(s.charAt(i)=="-"){mi=true}continue}mi=false;if(sh==0){this[this.t++]=x}else{if(sh+k>this.DB){this[this.t-1]|=(x&((1<<(this.DB-sh))-1))<>(this.DB-sh))}else{this[this.t-1]|=x<=this.DB){sh-=this.DB}}if(k==8&&(s[0]&128)!=0){this.s=-1;if(sh>0){this[this.t-1]|=((1<<(this.DB-sh))-1)<0&&this[this.t-1]==c){--this.t}}function bnToString(b){if(this.s<0){return"-"+this.negate().toString(b)}var k;if(b==16){k=4}else{if(b==8){k=3}else{if(b==2){k=1}else{if(b==32){k=5}else{if(b==4){k=2}else{return this.toRadix(b)}}}}}var km=(1<0){if(p>p)>0){m=true;r=int2char(d)}while(i>=0){if(p>(p+=this.DB-k)}else{d=(this[i]>>(p-=k))&km;if(p<=0){p+=this.DB;--i}}if(d>0){m=true}if(m){r+=int2char(d)}}}return m?r:"0"}function bnNegate(){var r=nbi();BigInteger.ZERO.subTo(this,r);return r}function bnAbs(){return(this.s<0)?this.negate():this}function bnCompareTo(a){var r=this.s-a.s;if(r!=0){return r}var i=this.t;r=i-a.t;if(r!=0){return(this.s<0)?-r:r}while(--i>=0){if((r=this[i]-a[i])!=0){return r}}return 0}function nbits(x){var r=1,t;if((t=x>>>16)!=0){x=t;r+=16}if((t=x>>8)!=0){x=t;r+=8}if((t=x>>4)!=0){x=t;r+=4}if((t=x>>2)!=0){x=t;r+=2}if((t=x>>1)!=0){x=t;r+=1}return r}function bnBitLength(){if(this.t<=0){return 0}return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM))}function bnpDLShiftTo(n,r){var i;for(i=this.t-1;i>=0;--i){r[i+n]=this[i]}for(i=n-1;i>=0;--i){r[i]=0}r.t=this.t+n;r.s=this.s}function bnpDRShiftTo(n,r){for(var i=n;i=0;--i){r[i+ds+1]=(this[i]>>cbs)|c;c=(this[i]&bm)<=0;--i){r[i]=0}r[ds]=c;r.t=this.t+ds+1;r.s=this.s;r.clamp()}function bnpRShiftTo(n,r){r.s=this.s;var ds=Math.floor(n/this.DB);if(ds>=this.t){r.t=0;return}var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<>bs;for(var i=ds+1;i>bs}if(bs>0){r[this.t-ds-1]|=(this.s&bm)<>=this.DB}if(a.t>=this.DB}c+=this.s}else{c+=this.s;while(i>=this.DB}c-=a.s}r.s=(c<0)?-1:0;if(c<-1){r[i++]=this.DV+c}else{if(c>0){r[i++]=c}}r.t=i;r.clamp()}function bnpMultiplyTo(a,r){var x=this.abs(),y=a.abs();var i=x.t;r.t=i+y.t;while(--i>=0){r[i]=0}for(i=0;i=0){r[i]=0}for(i=0;i=x.DV){r[i+x.t]-=x.DV;r[i+x.t+1]=1}}if(r.t>0){r[r.t-1]+=x.am(i,x[i],r,2*i,0,1)}r.s=0;r.clamp()}function bnpDivRemTo(m,q,r){var pm=m.abs();if(pm.t<=0){return}var pt=this.abs();if(pt.t0){pm.lShiftTo(nsh,y);pt.lShiftTo(nsh,r)}else{pm.copyTo(y);pt.copyTo(r)}var ys=y.t;var y0=y[ys-1];if(y0==0){return}var yt=y0*(1<1)?y[ys-2]>>this.F2:0);var d1=this.FV/yt,d2=(1<=0){r[r.t++]=1;r.subTo(t,r)}BigInteger.ONE.dlShiftTo(ys,t);t.subTo(y,y);while(y.t=0){var qd=(r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);if((r[i]+=y.am(0,qd,r,j,0,ys))0){r.rShiftTo(nsh,r)}if(ts<0){BigInteger.ZERO.subTo(r,r)}}function bnMod(a){var r=nbi();this.abs().divRemTo(a,null,r);if(this.s<0&&r.compareTo(BigInteger.ZERO)>0){a.subTo(r,r)}return r}function Classic(m){this.m=m}function cConvert(x){if(x.s<0||x.compareTo(this.m)>=0){return x.mod(this.m)}else{return x}}function cRevert(x){return x}function cReduce(x){x.divRemTo(this.m,null,x)}function cMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r)}function cSqrTo(x,r){x.squareTo(r);this.reduce(r)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1){return 0}var x=this[0];if((x&1)==0){return 0}var y=x&3;y=(y*(2-(x&15)*y))&15;y=(y*(2-(x&255)*y))&255;y=(y*(2-(((x&65535)*y)&65535)))&65535;y=(y*(2-x*y%this.DV))%this.DV;return(y>0)?this.DV-y:-y}function Montgomery(m){this.m=m;this.mp=m.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<(m.DB-15))-1;this.mt2=2*m.t}function montConvert(x){var r=nbi();x.abs().dlShiftTo(this.m.t,r);r.divRemTo(this.m,null,r);if(x.s<0&&r.compareTo(BigInteger.ZERO)>0){this.m.subTo(r,r)}return r}function montRevert(x){var r=nbi();x.copyTo(r);this.reduce(r);return r}function montReduce(x){while(x.t<=this.mt2){x[x.t++]=0}for(var i=0;i>15)*this.mpl)&this.um)<<15))&x.DM;j=i+this.m.t;x[j]+=this.m.am(0,u0,x,i,0,this.m.t);while(x[j]>=x.DV){x[j]-=x.DV;x[++j]++}}x.clamp();x.drShiftTo(this.m.t,x);if(x.compareTo(this.m)>=0){x.subTo(this.m,x)}}function montSqrTo(x,r){x.squareTo(r);this.reduce(r)}function montMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0}function bnpExp(e,z){if(e>4294967295||e<1){return BigInteger.ONE}var r=nbi(),r2=nbi(),g=z.convert(this),i=nbits(e)-1;g.copyTo(r);while(--i>=0){z.sqrTo(r,r2);if((e&(1<0){z.mulTo(r2,g,r)}else{var t=r;r=r2;r2=t}}return z.revert(r)}function bnModPowInt(e,m){var z;if(e<256||m.isEven()){z=new Classic(m)}else{z=new Montgomery(m)}return this.exp(e,z)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function Arcfour(){this.i=0;this.j=0;this.S=new Array()}function ARC4init(key){var i,j,t;for(i=0;i<256;++i){this.S[i]=i}j=0;for(i=0;i<256;++i){j=(j+this.S[i]+key[i%key.length])&255;t=this.S[i];this.S[i]=this.S[j];this.S[j]=t}this.i=0;this.j=0}function ARC4next(){var t;this.i=(this.i+1)&255;this.j=(this.j+this.S[this.i])&255;t=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=t;return this.S[(t+this.S[this.i])&255]}Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;function prng_newstate(){return new Arcfour()}var rng_psize=256;var rng_state;var rng_pool;var rng_pptr;function rng_seed_int(x){rng_pool[rng_pptr++]^=x&255;rng_pool[rng_pptr++]^=(x>>8)&255;rng_pool[rng_pptr++]^=(x>>16)&255;rng_pool[rng_pptr++]^=(x>>24)&255;if(rng_pptr>=rng_psize){rng_pptr-=rng_psize}}function rng_seed_time(){rng_seed_int(new Date().getTime())}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;if(window.crypto&&window.crypto.getRandomValues){var ua=new Uint8Array(32);window.crypto.getRandomValues(ua);for(t=0;t<32;++t){rng_pool[rng_pptr++]=ua[t]}}if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t>>8;rng_pool[rng_pptr++]=t&255}rng_pptr=0;rng_seed_time()}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr=0&&n>0){var c=s.charCodeAt(i--);if(c<128){ba[--n]=c}else{if((c>127)&&(c<2048)){ba[--n]=(c&63)|128;ba[--n]=(c>>6)|192}else{ba[--n]=(c&63)|128;ba[--n]=((c>>6)&63)|128;ba[--n]=(c>>12)|224}}}ba[--n]=0;var rng=new SecureRandom();var x=new Array();while(n>2){x[0]=0;while(x[0]==0){rng.nextBytes(x)}ba[--n]=x[0]}ba[--n]=0;ba[--n]=0;return new BigInteger(ba)}function pkcs1pad3(s,n){if(n127)&&(c<2048)){ba[j++]=(c>>6)|192;ba[j++]=(c&63)|128}else{ba[j++]=(c>>12)|224;ba[j++]=((c>>6)&63)|128;ba[j++]=(c&63)|128}}}ba[j++]=0;var rng=new SecureRandom();var x=new Array();while(j0&&E.length>0){this.n=parseBigInt(N,16);this.e=parseInt(E,16)}else{alert("Invalid RSA public key")}}function RSADoPublic(x){return x.modPowInt(this.e,this.n)}function RSAEncrypt(text){var m=pkcs1pad3(text,(this.n.bitLength()+7)>>3);if(m==null){return null}var c=this.doPublic(m);if(c==null){return null}var h=c.toString(16);if((h.length&1)==0){return h}else{return"0"+h}}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt; \ No newline at end of file diff --git a/package/lean/luci-app-kuainiao/root/www/luci-static/resources/sha1.js b/package/lean/luci-app-kuainiao/root/www/luci-static/resources/sha1.js new file mode 100644 index 000000000..11014f81d --- /dev/null +++ b/package/lean/luci-app-kuainiao/root/www/luci-static/resources/sha1.js @@ -0,0 +1,202 @@ +/* + * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined + * in FIPS PUB 180-1 + * Version 2.1a Copyright Paul Johnston 2000 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for details. + */ + +/* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ +var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ +var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ + +/* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ +function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));} +function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));} +function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));} +function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));} +function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));} +function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));} + +/* + * Perform a simple self-test to see if the VM is working + */ +function sha1_vm_test() +{ + return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d"; +} + +/* + * Calculate the SHA-1 of an array of big-endian words, and a bit length + */ +function core_sha1(x, len) +{ + /* append padding */ + x[len >> 5] |= 0x80 << (24 - len % 32); + x[((len + 64 >> 9) << 4) + 15] = len; + + var w = Array(80); + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + var e = -1009589776; + + for(var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + var olde = e; + + for(var j = 0; j < 80; j++) + { + if(j < 16) w[j] = x[i + j]; + else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); + var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), + safe_add(safe_add(e, w[j]), sha1_kt(j))); + e = d; + d = c; + c = rol(b, 30); + b = a; + a = t; + } + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + e = safe_add(e, olde); + } + return Array(a, b, c, d, e); + +} + +/* + * Perform the appropriate triplet combination function for the current + * iteration + */ +function sha1_ft(t, b, c, d) +{ + if(t < 20) return (b & c) | ((~b) & d); + if(t < 40) return b ^ c ^ d; + if(t < 60) return (b & c) | (b & d) | (c & d); + return b ^ c ^ d; +} + +/* + * Determine the appropriate additive constant for the current iteration + */ +function sha1_kt(t) +{ + return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : + (t < 60) ? -1894007588 : -899497514; +} + +/* + * Calculate the HMAC-SHA1 of a key and some data + */ +function core_hmac_sha1(key, data) +{ + var bkey = str2binb(key); + if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz); + return core_sha1(opad.concat(hash), 512 + 160); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) +{ + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function rol(num, cnt) +{ + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* + * Convert an 8-bit or 16-bit string to an array of big-endian words + * In 8-bit function, characters >255 have their hi-byte silently ignored. + */ +function str2binb(str) +{ + var bin = Array(); + var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32); + return bin; +} + +/* + * Convert an array of big-endian words to a string + */ +function binb2str(bin) +{ + var str = ""; + var mask = (1 << chrsz) - 1; + for(var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask); + return str; +} + +/* + * Convert an array of big-endian words to a hex string. + */ +function binb2hex(binarray) +{ + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i++) + { + str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF); + } + return str; +} + +/* + * Convert an array of big-endian words to a base-64 string + */ +function binb2b64(binarray) +{ + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i += 3) + { + var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16) + | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 ) + | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; + else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); + } + } + return str; +} diff --git a/target/linux/generic/pending-4.9/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-4.9/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch index f3abf34a9..8168a885b 100644 --- a/target/linux/generic/pending-4.9/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch +++ b/target/linux/generic/pending-4.9/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch @@ -71,7 +71,7 @@ Signed-off-by: Tobias Wolf --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -5909,7 +5909,7 @@ static void __ref alloc_node_mem_map(str +@@ -5921,7 +5921,7 @@ static void __ref alloc_node_mem_map(str mem_map = NODE_DATA(0)->node_mem_map; #if defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) || defined(CONFIG_FLATMEM) if (page_to_pfn(mem_map) != pgdat->node_start_pfn)