mirror of
https://github.com/caiwx86/small-packages.git
synced 2026-10-29 16:45:13 +08:00
update 2026-05-10 09:48:30
This commit is contained in:
1 parent
95ac96413e
commit
0b362674f1
6244 files changed
+2992248
No files matched your search
@@ -0,0 +1,189 @@
|
||||
-- Copyright 2022 xiaobao <xiaobao@linkease.com>
|
||||
-- Licensed to the public under the MIT License
|
||||
|
||||
local http = require "luci.http"
|
||||
local nixio = require "nixio"
|
||||
local ltn12 = require "luci.ltn12"
|
||||
local table = require "table"
|
||||
local util = require "luci.util"
|
||||
|
||||
module("luci.controller.istore_backend", package.seeall)
|
||||
|
||||
local BLOCKSIZE = 2048
|
||||
local ISTOREOS_PORT = 3038
|
||||
|
||||
function index()
|
||||
entry({"istore"}, call("istore_backend")).leaf=true
|
||||
end
|
||||
|
||||
local function sink_socket(sock, io_err)
|
||||
if sock then
|
||||
return function(chunk, err)
|
||||
if not chunk then
|
||||
return 1
|
||||
else
|
||||
return sock:send(chunk)
|
||||
end
|
||||
end
|
||||
else
|
||||
return ltn12.sink.error(io_err or "unable to send socket")
|
||||
end
|
||||
end
|
||||
|
||||
local function session_retrieve(sid, allowed_users)
|
||||
local sdat = util.ubus("session", "get", { ubus_rpc_session = sid })
|
||||
if type(sdat) == "table" and
|
||||
type(sdat.values) == "table" and
|
||||
type(sdat.values.token) == "string" and
|
||||
(not allowed_users or
|
||||
util.contains(allowed_users, sdat.values.username))
|
||||
then
|
||||
return sid, sdat.values
|
||||
end
|
||||
return nil, nil
|
||||
end
|
||||
|
||||
local function get_session()
|
||||
local sid
|
||||
local key
|
||||
local sdat
|
||||
for _, key in ipairs({"sysauth_https", "sysauth_http", "sysauth"}) do
|
||||
sid = http.getcookie(key)
|
||||
if sid then
|
||||
sid, sdat = session_retrieve(sid, nil)
|
||||
if sid and sdat then
|
||||
return sid, sdat
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil, nil
|
||||
end
|
||||
|
||||
local function chunksource(sock, buffer)
|
||||
buffer = buffer or ""
|
||||
return function()
|
||||
local output
|
||||
local _, endp, count = buffer:find("^([0-9a-fA-F]+);?.-\r\n")
|
||||
while not count and #buffer <= 1024 do
|
||||
local newblock, code = sock:recv(1024 - #buffer)
|
||||
if not newblock then
|
||||
return nil, code
|
||||
end
|
||||
buffer = buffer .. newblock
|
||||
_, endp, count = buffer:find("^([0-9a-fA-F]+);?.-\r\n")
|
||||
end
|
||||
count = tonumber(count, 16)
|
||||
if not count then
|
||||
return nil, -1, "invalid encoding"
|
||||
elseif count == 0 then
|
||||
return nil
|
||||
elseif count + 2 <= #buffer - endp then
|
||||
output = buffer:sub(endp+1, endp+count)
|
||||
buffer = buffer:sub(endp+count+3)
|
||||
return output
|
||||
else
|
||||
output = buffer:sub(endp+1, endp+count)
|
||||
buffer = ""
|
||||
if count - #output > 0 then
|
||||
local remain, code = sock:recvall(count-#output)
|
||||
if not remain then
|
||||
return nil, code
|
||||
end
|
||||
output = output .. remain
|
||||
count, code = sock:recvall(2)
|
||||
else
|
||||
count, code = sock:recvall(count+2-#buffer+endp)
|
||||
end
|
||||
if not count then
|
||||
return nil, code
|
||||
end
|
||||
return output
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function istore_backend()
|
||||
local sock = nixio.connect("127.0.0.1", ISTOREOS_PORT)
|
||||
if not sock then
|
||||
http.status(500, "connect failed")
|
||||
return
|
||||
end
|
||||
local input = {}
|
||||
input[#input+1] = http.getenv("REQUEST_METHOD") .. " " .. http.getenv("REQUEST_URI") .. " HTTP/1.1"
|
||||
local req = http.context.request
|
||||
local start = "HTTP_"
|
||||
local start_len = string.len(start)
|
||||
local ctype = http.getenv("CONTENT_TYPE")
|
||||
if ctype then
|
||||
input[#input+1] = "Content-Type: " .. ctype
|
||||
end
|
||||
for k, v in pairs(req.message.env) do
|
||||
if string.sub(k, 1, start_len) == start and not string.find(k, "FORWARDED") then
|
||||
input[#input+1] = string.sub(k, start_len+1, string.len(k)) .. ": " .. v
|
||||
end
|
||||
end
|
||||
local sid, sdat = get_session()
|
||||
if sdat ~= nil then
|
||||
input[#input+1] = "X-Forwarded-Sid: " .. sid
|
||||
input[#input+1] = "X-Forwarded-Token: " .. sdat.token
|
||||
end
|
||||
-- input[#input+1] = "X-Forwarded-For: " .. http.getenv("REMOTE_HOST") ..":".. http.getenv("REMOTE_PORT")
|
||||
local num = tonumber(http.getenv("CONTENT_LENGTH")) or 0
|
||||
input[#input+1] = "Content-Length: " .. tostring(num)
|
||||
input[#input+1] = "\r\n"
|
||||
local source = ltn12.source.cat(ltn12.source.string(table.concat(input, "\r\n")), http.source())
|
||||
local ret = ltn12.pump.all(source, sink_socket(sock, "write sock error"))
|
||||
if ret ~= 1 then
|
||||
sock:close()
|
||||
http.status(500, "proxy error")
|
||||
return
|
||||
end
|
||||
|
||||
local linesrc = sock:linesource()
|
||||
local line, code, error = linesrc()
|
||||
if not line then
|
||||
sock:close()
|
||||
http.status(500, "response parse failed")
|
||||
return
|
||||
end
|
||||
|
||||
local protocol, status, msg = line:match("^([%w./]+) ([0-9]+) (.*)")
|
||||
if not protocol then
|
||||
sock:close()
|
||||
http.status(500, "response protocol error")
|
||||
return
|
||||
end
|
||||
num = tonumber(status) or 0
|
||||
http.status(num, msg)
|
||||
|
||||
local chunked = 0
|
||||
line = linesrc()
|
||||
while line and line ~= "" do
|
||||
local key, val = line:match("^([%w-]+)%s?:%s?(.*)")
|
||||
if key and key ~= "Status" then
|
||||
if key == "Transfer-Encoding" and val == "chunked" then
|
||||
chunked = 1
|
||||
end
|
||||
if key ~= "Connection" and key ~= "Transfer-Encoding" and key ~= "Content-Length" then
|
||||
http.header(key, val)
|
||||
end
|
||||
end
|
||||
line = linesrc()
|
||||
end
|
||||
if not line then
|
||||
sock:close()
|
||||
http.status(500, "parse header failed")
|
||||
return
|
||||
end
|
||||
|
||||
local body_buffer = linesrc(true)
|
||||
if chunked == 1 then
|
||||
ltn12.pump.all(chunksource(sock, body_buffer), http.write)
|
||||
else
|
||||
local body_source = ltn12.source.cat(ltn12.source.string(body_buffer), sock:blocksource())
|
||||
ltn12.pump.all(body_source, http.write)
|
||||
end
|
||||
|
||||
sock:close()
|
||||
end
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
local http = require "luci.http"
|
||||
|
||||
module("luci.controller.quickstart", package.seeall)
|
||||
|
||||
function index()
|
||||
if luci.sys.call("pgrep quickstart >/dev/null") == 0 then
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
entry({"admin", "quickstart"}, template("quickstart/home"), _("QuickStart"), 1).leaf = true
|
||||
entry({"admin", "network_guide"}, call("networkguide_index"), _("NetworkGuide"), 2)
|
||||
entry({"admin", "network_guide", "pages"}, call("quickstart_index", {index={"admin", "network_guide", "pages"}})).leaf = true
|
||||
if uci:get("quickstart", "main", "wifi_menu") == "1" then
|
||||
entry({"admin", "quickwifi"}, call("quickwifi_index"), _("Wireless"), 3)
|
||||
entry({"admin", "quickwifi", "pages"}, call("quickstart_index", {index={"admin", "quickwifi", "pages"}})).leaf = true
|
||||
end
|
||||
if nixio.fs.access("/usr/lib/lua/luci/view/quickstart/main_dev.htm") then
|
||||
entry({"admin", "quickstart_dev"}, call("quickstart_dev", {index={"admin", "quickstart_dev"}})).leaf = true
|
||||
end
|
||||
entry({"admin", "nas", "raid"}, call("quickstart_index", {index={"admin", "nas"}}), _("RAID"), 10).leaf = true
|
||||
entry({"admin", "nas", "smart"}, call("quickstart_index", {index={"admin", "nas"}}), _("S.M.A.R.T."), 11).leaf = true
|
||||
entry({"admin", "network", "interfaceconfig"}, call("quickstart_index", {index={"admin", "network"}}), _("NetworkPort"), 11).leaf = true
|
||||
|
||||
entry({"admin", "nas", "quickstart"}).dependent = false
|
||||
entry({"admin", "nas", "quickstart", "auto_setup"}, post("auto_setup"))
|
||||
entry({"admin", "nas", "quickstart", "setup_result"}, call("setup_result"))
|
||||
else
|
||||
entry({"admin", "quickstart"}, call("redirect_fallback")).leaf = true
|
||||
end
|
||||
end
|
||||
|
||||
function networkguide_index()
|
||||
luci.http.redirect(luci.dispatcher.build_url("admin", "network_guide", "pages", "network"))
|
||||
end
|
||||
|
||||
function quickwifi_index()
|
||||
luci.http.redirect(luci.dispatcher.build_url("admin", "quickwifi", "pages", "quickwifi"))
|
||||
end
|
||||
|
||||
function redirect_fallback()
|
||||
luci.http.redirect(luci.dispatcher.build_url("admin", "status"))
|
||||
end
|
||||
|
||||
local function vue_lang()
|
||||
local i18n = require("luci.i18n")
|
||||
local lang = i18n.translate("quickstart_vue_lang")
|
||||
if lang == "quickstart_vue_lang" or lang == "" then
|
||||
lang = "en"
|
||||
end
|
||||
return lang
|
||||
end
|
||||
|
||||
function quickstart_index(param)
|
||||
luci.template.render("quickstart/main", {prefix=luci.dispatcher.build_url(unpack(param.index)),lang=vue_lang()})
|
||||
end
|
||||
|
||||
function quickstart_dev(param)
|
||||
luci.template.render("quickstart/main_dev", {prefix=luci.dispatcher.build_url(unpack(param.index)),lang=vue_lang()})
|
||||
end
|
||||
|
||||
function auto_setup()
|
||||
local os = require "os"
|
||||
local fs = require "nixio.fs"
|
||||
local rshift = nixio.bit.rshift
|
||||
|
||||
-- json style
|
||||
-- local jsonc = require "luci.jsonc"
|
||||
-- local json_parse = jsonc.parse
|
||||
-- local req = json_parse(luci.http.content())
|
||||
-- local pkgs = ""
|
||||
-- for k, v in pairs(req.packages) do
|
||||
-- pkgs = pkgs .. " " .. luci.util.shellquote(v)
|
||||
-- end
|
||||
|
||||
-- form style
|
||||
local packages = luci.http.formvalue("packages")
|
||||
local pkgs = ""
|
||||
if type(packages) == "table" then
|
||||
if #packages > 0 then
|
||||
for k, v in pairs(packages) do
|
||||
pkgs = pkgs .. " " .. luci.util.shellquote(v)
|
||||
end
|
||||
end
|
||||
else
|
||||
if packages ~= nil and packages ~= "" then
|
||||
pkgs = luci.util.shellquote(packages)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local ret
|
||||
if pkgs == "" then
|
||||
ret = {
|
||||
success = 1,
|
||||
scope = "params",
|
||||
error = "Parameter 'packages' undefined!",
|
||||
}
|
||||
else
|
||||
local cmd = "/usr/libexec/quickstart/auto_setup.sh " .. pkgs
|
||||
cmd = "/etc/init.d/tasks task_add auto_setup " .. luci.util.shellquote(cmd)
|
||||
local r = os.execute(cmd .. " >/var/log/auto_setup.stdout 2>/var/log/auto_setup.stderr")
|
||||
local e = fs.readfile("/var/log/auto_setup.stderr")
|
||||
local o = fs.readfile("/var/log/auto_setup.stdout")
|
||||
|
||||
fs.unlink("/var/log/auto_setup.stderr")
|
||||
fs.unlink("/var/log/auto_setup.stdout")
|
||||
e = e or ""
|
||||
if r == 256 and e == "" then
|
||||
e = "os.execute exit code 1"
|
||||
end
|
||||
r = rshift(r,8)
|
||||
ret = {
|
||||
success = r,
|
||||
scope = "taskd",
|
||||
error = e,
|
||||
detail = o,
|
||||
}
|
||||
end
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json(ret)
|
||||
end
|
||||
|
||||
function setup_result()
|
||||
local fs = require "nixio.fs"
|
||||
local taskd = require "luci.model.tasks"
|
||||
local packages = nil
|
||||
local success = nil
|
||||
local failed = nil
|
||||
local status = taskd.status("auto_setup")
|
||||
local ret = {
|
||||
}
|
||||
if status.running or status.exit_code ~= 404 then
|
||||
local item
|
||||
local po = fs.readfile("/var/log/auto_setup.input") or ""
|
||||
for item in po:gmatch("[^\n]+") do
|
||||
if packages then
|
||||
packages[#packages+1] = item
|
||||
else
|
||||
packages = {item}
|
||||
end
|
||||
end
|
||||
local so = fs.readfile("/var/log/auto_setup.success") or ""
|
||||
for item in so:gmatch("[^\n]+") do
|
||||
if success then
|
||||
success[#success+1] = item
|
||||
else
|
||||
success = {item}
|
||||
end
|
||||
end
|
||||
local fo = fs.readfile("/var/log/auto_setup.failed") or ""
|
||||
for item in fo:gmatch("[^\n]+") do
|
||||
if failed then
|
||||
failed[#failed+1] = item
|
||||
else
|
||||
failed = {item}
|
||||
end
|
||||
end
|
||||
ret.success = 0
|
||||
ret.result = {
|
||||
ongoing = status.running,
|
||||
packages = packages,
|
||||
success = success,
|
||||
failed = failed,
|
||||
}
|
||||
else
|
||||
ret.success = 404
|
||||
ret.scope = "taskd"
|
||||
ret.error = "task not found"
|
||||
end
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json(ret)
|
||||
end
|
||||
@@ -0,0 +1,11 @@
|
||||
--- luci-app-quickstart/luasrc/controller/quickstart.lua
|
||||
+++ luci-app-quickstart/luasrc/controller/quickstart.lua
|
||||
@@ -5,7 +5,7 @@ module("luci.controller.quickstart", package.seeall)
|
||||
function index()
|
||||
entry({"admin", "nas"}, firstchild(), _("NAS") , 45).dependent = false
|
||||
if luci.sys.call("pgrep quickstart >/dev/null") == 0 then
|
||||
- entry({"admin", "quickstart"}, template("quickstart/home"), _("QuickStart"), 1).leaf = true
|
||||
+ entry({"admin", "quickstart"}, template("quickstart/home")).leaf = true
|
||||
entry({"admin", "network_guide"}, call("networkguide_index"), _("NetworkGuide"), 2)
|
||||
entry({"admin", "network_guide", "pages"}, call("quickstart_index", {index={"admin", "network_guide", "pages"}})).leaf = true
|
||||
if nixio.fs.access("/usr/lib/lua/luci/view/quickstart/main_dev.htm") then
|
||||
Reference in new issue
Block a user