2022-04-17 13:27:31 +08:00
|
|
|
module("luci.controller.fileassistant", package.seeall)
|
|
|
|
|
|
|
|
function index()
|
2023-06-14 23:15:20 +08:00
|
|
|
entry({"admin", "nas"}, firstchild(), _("NAS") , 45).dependent = false
|
2022-04-17 13:34:25 +08:00
|
|
|
|
2023-06-14 23:15:20 +08:00
|
|
|
entry({"admin", "nas"}, firstchild(), "NAS", 44).dependent = false
|
2022-04-17 13:27:31 +08:00
|
|
|
|
|
|
|
local page
|
2023-06-14 23:15:20 +08:00
|
|
|
page = entry({"admin", "nas", "fileassistant"}, template("fileassistant"), _("文件助手"), 1)
|
2022-04-17 13:27:31 +08:00
|
|
|
page.i18n = "base"
|
|
|
|
page.dependent = true
|
2022-04-17 13:34:25 +08:00
|
|
|
page.acl_depends = { "luci-app-fileassistant" }
|
2022-04-17 13:27:31 +08:00
|
|
|
|
2023-06-14 23:15:20 +08:00
|
|
|
page = entry({"admin", "nas", "fileassistant", "list"}, call("fileassistant_list"), nil)
|
2022-04-17 13:27:31 +08:00
|
|
|
page.leaf = true
|
|
|
|
|
2023-06-14 23:15:20 +08:00
|
|
|
page = entry({"admin", "nas", "fileassistant", "open"}, call("fileassistant_open"), nil)
|
2022-04-17 13:27:31 +08:00
|
|
|
page.leaf = true
|
|
|
|
|
2023-06-14 23:15:20 +08:00
|
|
|
page = entry({"admin", "nas", "fileassistant", "delete"}, call("fileassistant_delete"), nil)
|
2022-04-17 13:27:31 +08:00
|
|
|
page.leaf = true
|
|
|
|
|
2023-06-14 23:15:20 +08:00
|
|
|
page = entry({"admin", "nas", "fileassistant", "rename"}, call("fileassistant_rename"), nil)
|
2022-04-17 13:27:31 +08:00
|
|
|
page.leaf = true
|
|
|
|
|
2023-06-14 23:15:20 +08:00
|
|
|
page = entry({"admin", "nas", "fileassistant", "upload"}, call("fileassistant_upload"), nil)
|
2022-04-17 13:27:31 +08:00
|
|
|
page.leaf = true
|
|
|
|
|
2023-06-14 23:15:20 +08:00
|
|
|
page = entry({"admin", "nas", "fileassistant", "install"}, call("fileassistant_install"), nil)
|
2022-04-17 13:27:31 +08:00
|
|
|
page.leaf = true
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
function list_response(path, success)
|
|
|
|
luci.http.prepare_content("application/json")
|
|
|
|
local result
|
|
|
|
if success then
|
|
|
|
local rv = scandir(path)
|
|
|
|
result = {
|
|
|
|
ec = 0,
|
|
|
|
data = rv
|
|
|
|
}
|
|
|
|
else
|
|
|
|
result = {
|
|
|
|
ec = 1
|
|
|
|
}
|
|
|
|
end
|
|
|
|
luci.http.write_json(result)
|
|
|
|
end
|
|
|
|
|
|
|
|
function fileassistant_list()
|
|
|
|
local path = luci.http.formvalue("path")
|
|
|
|
list_response(path, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
function fileassistant_open()
|
|
|
|
local path = luci.http.formvalue("path")
|
|
|
|
local filename = luci.http.formvalue("filename")
|
|
|
|
local io = require "io"
|
|
|
|
local mime = to_mime(filename)
|
|
|
|
|
|
|
|
file = path..filename
|
|
|
|
|
|
|
|
local download_fpi = io.open(file, "r")
|
|
|
|
luci.http.header('Content-Disposition', 'inline; filename="'..filename..'"' )
|
|
|
|
luci.http.prepare_content(mime)
|
|
|
|
luci.ltn12.pump.all(luci.ltn12.source.file(download_fpi), luci.http.write)
|
|
|
|
end
|
|
|
|
|
|
|
|
function fileassistant_delete()
|
|
|
|
local path = luci.http.formvalue("path")
|
|
|
|
local isdir = luci.http.formvalue("isdir")
|
|
|
|
path = path:gsub("<>", "/")
|
|
|
|
path = path:gsub(" ", "\ ")
|
|
|
|
local success
|
|
|
|
if isdir then
|
|
|
|
success = os.execute('rm -r "'..path..'"')
|
|
|
|
else
|
|
|
|
success = os.remove(path)
|
|
|
|
end
|
|
|
|
list_response(nixio.fs.dirname(path), success)
|
|
|
|
end
|
|
|
|
|
|
|
|
function fileassistant_rename()
|
|
|
|
local filepath = luci.http.formvalue("filepath")
|
|
|
|
local newpath = luci.http.formvalue("newpath")
|
|
|
|
local success = os.execute('mv "'..filepath..'" "'..newpath..'"')
|
|
|
|
list_response(nixio.fs.dirname(filepath), success)
|
|
|
|
end
|
|
|
|
|
|
|
|
function fileassistant_install()
|
|
|
|
local filepath = luci.http.formvalue("filepath")
|
|
|
|
local isdir = luci.http.formvalue("isdir")
|
|
|
|
local ext = filepath:match(".+%.(%w+)$")
|
|
|
|
filepath = filepath:gsub("<>", "/")
|
|
|
|
filepath = filepath:gsub(" ", "\ ")
|
|
|
|
local success
|
|
|
|
if isdir == "1" then
|
|
|
|
success = false
|
|
|
|
elseif ext == "ipk" then
|
|
|
|
success = installIPK(filepath)
|
|
|
|
else
|
|
|
|
success = false
|
|
|
|
end
|
|
|
|
list_response(nixio.fs.dirname(filepath), success)
|
|
|
|
end
|
|
|
|
|
|
|
|
function installIPK(filepath)
|
|
|
|
luci.sys.exec('opkg --force-depends install "'..filepath..'"')
|
|
|
|
luci.sys.exec('rm -rf /tmp/luci-*')
|
|
|
|
return true;
|
|
|
|
end
|
|
|
|
|
|
|
|
function fileassistant_upload()
|
|
|
|
local filecontent = luci.http.formvalue("upload-file")
|
|
|
|
local filename = luci.http.formvalue("upload-filename")
|
|
|
|
local uploaddir = luci.http.formvalue("upload-dir")
|
|
|
|
local filepath = uploaddir..filename
|
|
|
|
|
|
|
|
local fp
|
|
|
|
luci.http.setfilehandler(
|
|
|
|
function(meta, chunk, eof)
|
|
|
|
if not fp and meta and meta.name == "upload-file" then
|
|
|
|
fp = io.open(filepath, "w")
|
|
|
|
end
|
|
|
|
if fp and chunk then
|
|
|
|
fp:write(chunk)
|
|
|
|
end
|
|
|
|
if fp and eof then
|
|
|
|
fp:close()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
)
|
|
|
|
|
|
|
|
list_response(uploaddir, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
function scandir(directory)
|
|
|
|
local i, t, popen = 0, {}, io.popen
|
|
|
|
|
|
|
|
local pfile = popen("ls -lh \""..directory.."\" | egrep '^d' ; ls -lh \""..directory.."\" | egrep -v '^d|^l'")
|
|
|
|
for fileinfo in pfile:lines() do
|
|
|
|
i = i + 1
|
|
|
|
t[i] = fileinfo
|
|
|
|
end
|
|
|
|
pfile:close()
|
|
|
|
pfile = popen("ls -lh \""..directory.."\" | egrep '^l' ;")
|
|
|
|
for fileinfo in pfile:lines() do
|
|
|
|
i = i + 1
|
|
|
|
linkindex, _, linkpath = string.find(fileinfo, "->%s+(.+)$")
|
|
|
|
local finalpath;
|
|
|
|
if string.sub(linkpath, 1, 1) == "/" then
|
|
|
|
finalpath = linkpath
|
|
|
|
else
|
|
|
|
finalpath = nixio.fs.realpath(directory..linkpath)
|
|
|
|
end
|
|
|
|
local linktype;
|
|
|
|
if not finalpath then
|
|
|
|
finalpath = linkpath;
|
|
|
|
linktype = 'x'
|
|
|
|
elseif nixio.fs.stat(finalpath, "type") == "dir" then
|
|
|
|
linktype = 'z'
|
|
|
|
else
|
|
|
|
linktype = 'l'
|
|
|
|
end
|
|
|
|
fileinfo = string.sub(fileinfo, 2, linkindex - 1)
|
|
|
|
fileinfo = linktype..fileinfo.."-> "..finalpath
|
|
|
|
t[i] = fileinfo
|
|
|
|
end
|
|
|
|
pfile:close()
|
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
|
|
|
MIME_TYPES = {
|
|
|
|
["txt"] = "text/plain";
|
|
|
|
["conf"] = "text/plain";
|
|
|
|
["ovpn"] = "text/plain";
|
|
|
|
["log"] = "text/plain";
|
|
|
|
["js"] = "text/javascript";
|
|
|
|
["json"] = "application/json";
|
|
|
|
["css"] = "text/css";
|
|
|
|
["htm"] = "text/html";
|
|
|
|
["html"] = "text/html";
|
|
|
|
["patch"] = "text/x-patch";
|
|
|
|
["c"] = "text/x-csrc";
|
|
|
|
["h"] = "text/x-chdr";
|
|
|
|
["o"] = "text/x-object";
|
|
|
|
["ko"] = "text/x-object";
|
|
|
|
|
|
|
|
["bmp"] = "image/bmp";
|
|
|
|
["gif"] = "image/gif";
|
|
|
|
["png"] = "image/png";
|
|
|
|
["jpg"] = "image/jpeg";
|
|
|
|
["jpeg"] = "image/jpeg";
|
|
|
|
["svg"] = "image/svg+xml";
|
|
|
|
|
|
|
|
["zip"] = "application/zip";
|
|
|
|
["pdf"] = "application/pdf";
|
|
|
|
["xml"] = "application/xml";
|
|
|
|
["xsl"] = "application/xml";
|
|
|
|
["doc"] = "application/msword";
|
|
|
|
["ppt"] = "application/vnd.ms-powerpoint";
|
|
|
|
["xls"] = "application/vnd.ms-excel";
|
|
|
|
["odt"] = "application/vnd.oasis.opendocument.text";
|
|
|
|
["odp"] = "application/vnd.oasis.opendocument.presentation";
|
|
|
|
["pl"] = "application/x-perl";
|
|
|
|
["sh"] = "application/x-shellscript";
|
|
|
|
["php"] = "application/x-php";
|
|
|
|
["deb"] = "application/x-deb";
|
|
|
|
["iso"] = "application/x-cd-image";
|
|
|
|
["tgz"] = "application/x-compressed-tar";
|
|
|
|
|
|
|
|
["mp3"] = "audio/mpeg";
|
|
|
|
["ogg"] = "audio/x-vorbis+ogg";
|
|
|
|
["wav"] = "audio/x-wav";
|
|
|
|
|
|
|
|
["mpg"] = "video/mpeg";
|
|
|
|
["mpeg"] = "video/mpeg";
|
|
|
|
["avi"] = "video/x-msvideo";
|
|
|
|
}
|
|
|
|
|
|
|
|
function to_mime(filename)
|
|
|
|
if type(filename) == "string" then
|
|
|
|
local ext = filename:match("[^%.]+$")
|
|
|
|
|
|
|
|
if ext and MIME_TYPES[ext:lower()] then
|
|
|
|
return MIME_TYPES[ext:lower()]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
return "application/octet-stream"
|
2022-04-17 13:34:25 +08:00
|
|
|
end
|