<%# Copyright 2012 Jo-Philipp Wich <jow@openwrt.org> Licensed to the public under the Apache License 2.0. -%> <% css = [[ .commandbox { height: 12em; width: 30%; float: left; height: 12em; margin: 5px; position: relative; } .commandbox h3 { font-size: 1.5em !important; line-height: 2em !important; margin: 0 !important; } .commandbox input[type="text"] { width: 50% !important; } .commandbox div { position: absolute; left: 0; bottom: 1.5em; } ]] -%> <%+header%> <script type="text/javascript" src="<%=resource%>/cbi.js"></script> <script type="text/javascript">//<![CDATA[ var stxhr = new XHR(); function command_run(id) { var args; var field = document.getElementById(id); if (field) args = encodeURIComponent(field.value); var legend = document.getElementById('command-rc-legend'); var output = document.getElementById('command-rc-output'); if (legend && output) { output.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' + '<%:Waiting for command to complete...%>' ; legend.parentNode.style.display = 'block'; legend.style.display = 'inline'; stxhr.get('<%=url('admin/system/commands/run')%>/' + id + (args ? '/' + args : ''), null, function(x, st) { if (st) { if (st.binary) st.stdout = '[<%:Binary data not displayed, download instead.%>]'; legend.style.display = 'none'; output.innerHTML = String.format( '<pre><strong># %h\n</strong>%h<span style="color:red">%h</span></pre>' + '<div class="alert-message warning">%s (<%:Code:%> %d)</div>', st.command, st.stdout, st.stderr, (st.exitcode == 0) ? '<%:Command successful%>' : '<%:Command failed%>', st.exitcode); } else { legend.style.display = 'none'; output.innerHTML = '<span class="error"><%:Failed to execute command!%></span>'; } location.hash = '#output'; } ); } } function command_download(id) { var args; var field = document.getElementById(id); if (field) args = encodeURIComponent(field.value); location.href = '<%=url('admin/system/commands/download')%>/' + id + (args ? '/' + args : ''); } function command_link(id) { var legend = document.getElementById('command-rc-legend'); var output = document.getElementById('command-rc-output'); var args; var field = document.getElementById(id); if (field) args = encodeURIComponent(field.value); if (legend && output) { var link = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '') + location.pathname.split(';')[0] + 'command/' + id + (args ? '/' + args : ''); 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 ); location.hash = '#output'; } } //]]></script> <% local uci = require "luci.model.uci".cursor() local commands = { } uci:foreach("luci", "command", function(s) commands[#commands+1] = s end) %> <form method="get" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>"> <div class="cbi-map"> <h2 name="content"><%:Custom Commands%></h2> <fieldset class="cbi-section"> <% local _, command; for _, command in ipairs(commands) do %> <div class="commandbox"> <h3><%=pcdata(command.name)%></h3> <p><%:Command:%> <code><%=pcdata(command.command)%></code></p> <% if command.param == "1" then %> <p><%:Arguments:%> <input type="text" id="<%=command['.name']%>" /></p> <% end %> <div> <input type="button" value="<%:Run%>" class="cbi-button cbi-button-apply" onclick="command_run('<%=command['.name']%>')" /> <input type="button" value="<%:Download%>" class="cbi-button cbi-button-download" onclick="command_download('<%=command['.name']%>')" /> <% if command.public == "1" then %> <input type="button" value="<%:Link%>" class="cbi-button cbi-button-link" onclick="command_link('<%=command['.name']%>')" /> <% end %> </div> </div> <% end %> <br style="clear:both" /><br /> <a name="output"></a> </fieldset> </div> <fieldset class="cbi-section" style="display:none"> <legend id="command-rc-legend"><%:Collecting data...%></legend> <span id="command-rc-output"></span> </fieldset> </form> <%+footer%>