diff options
author | Jo-Philipp Wich <jo@mein.io> | 2018-11-14 09:53:15 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2018-11-14 20:46:04 +0100 |
commit | aa2e0e2488f52b2b0acd1746ee13c7f51377f757 (patch) | |
tree | 94cc94453abdc693e4499af528c6d662143a3d64 /applications/luci-app-opkg/luasrc/controller/opkg.lua | |
parent | 520a6add526fe6ed0a0da4ce42070e2456e71fa2 (diff) |
applications: add luci-app-opkg
Add a new luci-app-opkg which is a feature-complete replacement for the
builtin opkg functionality of luci-mod-system using mostly client side
JavaScript to reduce the amount of server side processing.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'applications/luci-app-opkg/luasrc/controller/opkg.lua')
-rw-r--r-- | applications/luci-app-opkg/luasrc/controller/opkg.lua | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/applications/luci-app-opkg/luasrc/controller/opkg.lua b/applications/luci-app-opkg/luasrc/controller/opkg.lua new file mode 100644 index 000000000..74aa16618 --- /dev/null +++ b/applications/luci-app-opkg/luasrc/controller/opkg.lua @@ -0,0 +1,100 @@ +-- Copyright 2018 Jo-Philipp Wich <jo@mein.io> +-- Licensed to the public under the Apache License 2.0. + +module("luci.controller.opkg", package.seeall) + +function index() + entry({"admin", "system", "opkg"}, template("opkg"), _("Software"), 30) + entry({"admin", "system", "opkg", "list"}, call("action_list")).leaf = true + entry({"admin", "system", "opkg", "exec"}, post("action_exec")).leaf = true + entry({"admin", "system", "opkg", "statvfs"}, call("action_statvfs")).leaf = true + entry({"admin", "system", "opkg", "config"}, post_on({ data = true }, "action_config")).leaf = true +end + +function action_list(mode) + local cmd + + if mode == "installed" then + cmd = { "/bin/cat", "/usr/lib/opkg/status" } + else + cmd = { "/bin/sh", "-c", [[find /tmp/opkg-lists/ -type f '!' -name '*.sig' | xargs -r gzip -cd]] } + end + + luci.http.prepare_content("text/plain; charset=utf-8") + luci.sys.process.exec(cmd, luci.http.write) +end + +function action_exec(command, package) + local sys = require "luci.sys" + local cmd = { "/bin/opkg", "--force-removal-of-dependent-packages", "--force-overwrite" } + local pkg = luci.http.formvalue("package") + + if luci.http.formvalue("autoremove") == "true" then + cmd[#cmd + 1] = "--autoremove" + end + + cmd[#cmd + 1] = command + + if pkg then + cmd[#cmd + 1] = pkg + end + + luci.http.prepare_content("application/json") + luci.http.write_json(sys.process.exec(cmd, true, true)) +end + +function action_statvfs() + local fs = require "nixio.fs" + + luci.http.prepare_content("application/json") + luci.http.write_json(fs.statvfs("/") or {}) +end + +function action_config() + local fs = require "nixio.fs" + local js = require "luci.jsonc" + local data = luci.http.formvalue("data") + + if data then + data = js.parse(data) + + if not data then + luci.http.status(400, "Bad Request") + return + end + + local file, content + for file, content in pairs(data) do + if type(content) ~= "string" or + (file ~= "opkg.conf" and not file:match("^opkg/[^/]+%.conf$")) + then + luci.http.status(400, "Bad Request") + return + end + + local path = "/etc/%s" % file + if not fs.access(path, "w") then + luci.http.status(403, "Permission denied") + return + end + + fs.writefile(path, content:gsub("\r\n", "\n")) + end + + luci.http.status(204, "Saved") + else + local rv = { ["opkg.conf"] = fs.readfile("/etc/opkg.conf") } + local entries = fs.dir("/etc/opkg") + if entries then + local entry + for entry in entries do + if entry:match("%.conf$") then + rv["opkg/%s" % entry] = fs.readfile("/etc/opkg/%s" % entry) + end + end + end + + luci.http.prepare_content("application/json") + luci.http.write_json(rv) + end +end |