luci-app-commands: Allow executing without downloading on public links
authort123yh <t123yh@outlook.com>
Wed, 3 Aug 2016 10:19:04 +0000 (18:19 +0800)
committerJo-Philipp Wich <jo@mein.io>
Wed, 31 May 2017 22:45:09 +0000 (00:45 +0200)
Signed-off-by: t123yh <t123yh@outlook.com>
applications/luci-app-commands/luasrc/controller/commands.lua
applications/luci-app-commands/luasrc/view/commands.htm
applications/luci-app-commands/luasrc/view/commands_public.htm [new file with mode: 0644]
applications/luci-app-commands/po/en/commands.po
applications/luci-app-commands/po/zh-cn/commands.po

index 16528d11703d0f53daa9f2a5ddc20f8331f79046..ca91813b1774fa1d93ea8da88d35937e54d28549 100644 (file)
@@ -153,8 +153,8 @@ local function parse_cmdline(cmdid, args)
        end
 end
 
-function action_run(...)
-       local fs   = require "nixio.fs"
+function execute_command(callback, ...)
+       local fs = require "nixio.fs"
        local argv = parse_cmdline(...)
        if argv then
                local outfile = os.tmpname()
@@ -169,8 +169,8 @@ function action_run(...)
 
                local binary = not not (stdout:match("[%z\1-\8\14-\31]"))
 
-               luci.http.prepare_content("application/json")
-               luci.http.write_json({
+               callback({
+                       ok       = true,
                        command  = table.concat(argv, " "),
                        stdout   = not binary and stdout,
                        stderr   = stderr,
@@ -178,10 +178,41 @@ function action_run(...)
                        binary   = binary
                })
        else
-               luci.http.status(404, "No such command")
+               callback({
+                       ok       = false,
+                       code     = 404,
+                       reason   = "No such command"
+               })
+       end
+end
+
+function return_json(result)
+       if result.ok then
+               luci.http.prepare_content("application/json")
+               luci.http.write_json(result)
+       else
+               luci.http.status(result.code, result.reason)
        end
 end
 
+function action_run(...)
+       execute_command(return_json, ...)
+end
+
+function return_html(result)
+       if result.ok then
+               require("luci.template")
+               luci.template.render("commands_public", {
+                       exitcode = result.exitcode,
+                       stdout = result.stdout,
+                       stderr = result.stderr
+               })
+       else
+               luci.http.status(result.code, result.reason)
+       end
+
+end
+
 function action_download(...)
        local fs   = require "nixio.fs"
        local argv = parse_cmdline(...)
@@ -192,11 +223,11 @@ function action_download(...)
                        local name
                        if chunk:match("[%z\1-\8\14-\31]") then
                                luci.http.header("Content-Disposition", "attachment; filename=%s"
-                                                % fs.basename(argv[1]):gsub("%W+", ".") .. ".bin")
+                                       % fs.basename(argv[1]):gsub("%W+", ".") .. ".bin")
                                luci.http.prepare_content("application/octet-stream")
                        else
                                luci.http.header("Content-Disposition", "attachment; filename=%s"
-                                                % fs.basename(argv[1]):gsub("%W+", ".") .. ".txt")
+                                       % fs.basename(argv[1]):gsub("%W+", ".") .. ".txt")
                                luci.http.prepare_content("text/plain")
                        end
 
@@ -214,14 +245,24 @@ function action_download(...)
        end
 end
 
+
 function action_public(cmdid, args)
+       local disp = false
+       if string.sub(cmdid, -1) == "s" then
+               disp = true
+               cmdid = string.sub(cmdid, 1, -2)
+       end
        local uci = require "luci.model.uci".cursor()
        if cmdid and
-          uci:get("luci", cmdid) == "command" and
-          uci:get("luci", cmdid, "public") == "1"
-       then
-               action_download(cmdid, args)
-       else
-               luci.http.status(403, "Access to command denied")
+               uci:get("luci", cmdid) == "command" and
+               uci:get("luci", cmdid, "public") == "1"
+               then
+                       if disp then
+                               execute_command(return_html, cmdid, args)
+                       else
+                               action_download(cmdid, args)
+                       end
+               else
+                       luci.http.status(403, "Access to command denied")
+               end
        end
-end
index 73b9e6a2ce5fa45c6f5be60b76ff4f01d6e666e5..f094e186d43346e61719bcdeba021f6b5ed0aa53 100644 (file)
 
                if (legend && output)
                {
-                       var link = location.protocol + '//' + location.hostname +
+                       var prefix = location.protocol + '//' + location.hostname +
                                   (location.port ? ':' + location.port : '') +
-                                          location.pathname.split(';')[0] + 'command/' +
-                                          id + (args ? '/' + args : '');
-
+                                          location.pathname.split(';')[0] + 'command/';
+                       var suffix = (args ? '/' + args : '');
+                       
+                       var link = prefix + id + suffix;
+                       var link_nodownload = prefix + id + "s" + suffix;
+                       
                        legend.style.display = 'none';
                        output.parentNode.style.display = 'block';
                        output.innerHTML = String.format(
-                               '<div class="alert-message"><%:Access command with%> <a href="%s">%s</a></div>',
-                               link, link
+                               '<div class="alert-message"><p><%:Download execution result%> <a href="%s">%s</a></p><p><%:Or display result%> <a href="%s">%s</a></p></div>',
+                               link, link, link_nodownload, link_nodownload
                        );
 
                        location.hash = '#output';
diff --git a/applications/luci-app-commands/luasrc/view/commands_public.htm b/applications/luci-app-commands/luasrc/view/commands_public.htm
new file mode 100644 (file)
index 0000000..f20799d
--- /dev/null
@@ -0,0 +1,50 @@
+<%#
+ Copyright 2016 t123yh <t123yh@outlook.com>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<% css = [[
+.alert-success {
+    color: #3c763d;
+    background-color: #dff0d8;
+    border-color: #d6e9c6;
+}
+
+.alert {
+    padding: 15px;
+    margin-bottom: 20px;
+    border: 1px solid transparent;
+    border-radius: 4px;
+}
+
+.alert-warning {
+    color: #8a6d3b;
+    background-color: #fcf8e3;
+    border-color: #faebcc;
+}
+]] -%>
+
+<%+header%>
+
+<% if exitcode == 0 then %>
+    <div class="alert alert-success" role="alert"> <%:Command executed successfully.%> </div>
+<% else %>
+    <div class="alert alert-warning" role="alert"> <%:Command exited with status code %> <%= exitcode %> </div>
+<% end %>
+
+<% if stdout ~= "" then %>
+    <h3><%:Standard Output%></h3>
+    <pre><%= stdout %></pre>
+<% end %>
+
+<% if stderr ~= "" then %>
+    <h3><%:Standard Error%></h3>
+    <pre><%= stderr %></pre>
+<% end %>
+
+<script>
+    <%# Display top bar on mobile devices -%>
+    document.getElementsByClassName('brand')[0].style.setProperty("display", "block", "important");
+</script>
+
+<%+footer%>
\ No newline at end of file
index 754a229c1af78f299704340c69a02e8493895117..c40994f344d64e0c2bf8386a159ed68737de7098 100644 (file)
@@ -11,9 +11,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "A short textual description of the configured command"
 
-msgid "Access command with"
-msgstr "Access command with"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -93,3 +90,21 @@ msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr "Waiting for command to complete..."
+
+msgid "Command executed successfully."
+msgstr "Command executed successfully."
+
+msgid "Command exited with status code "
+msgstr "Command exited with status code "
+
+msgid "Standard Output"
+msgstr "Standard Output"
+
+msgid "Standard Error"
+msgstr "Standard Error"
+
+msgid "Download execution result"
+msgstr "Download execution result"
+
+msgid "Or display result"
+msgstr "Or display result"
\ No newline at end of file
index 8b2b032b61def79f34ce727655fe4431419a7f3b..1d17fc3b324a88f6acb4cf17dfbd18c79e327da5 100644 (file)
@@ -14,9 +14,6 @@ msgstr ""
 msgid "A short textual description of the configured command"
 msgstr "简短描述命令用途"
 
-msgid "Access command with"
-msgstr "访问命令"
-
 msgid ""
 "Allow executing the command and downloading its output without prior "
 "authentication"
@@ -92,3 +89,21 @@ msgstr "此页面允许您配置自定义Shell命令,并可以从Web界面调
 
 msgid "Waiting for command to complete..."
 msgstr "等待命令执行完成... ..."
+
+msgid "Command executed successfully."
+msgstr "命令成功执行。"
+
+msgid "Command exited with status code "
+msgstr "命令退出,状态码:"
+
+msgid "Standard Output"
+msgstr "标准输出流"
+
+msgid "Standard Error"
+msgstr "标准错误流"
+
+msgid "Download execution result"
+msgstr "下载执行结果"
+
+msgid "Or display result"
+msgstr "显示执行结果"
\ No newline at end of file