# HG changeset patch # User Kim Alvefur # Date 1360957570 -3600 # Node ID c33848e79bfc627b46a8658457219c2a54793be7 # Parent a074eaacefe709dbca3c63c249d11db37e5a4751 clix.adhoc: Run Ad-hoc commands diff -r a074eaacefe7 -r c33848e79bfc clix/adhoc.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clix/adhoc.lua Fri Feb 15 20:46:10 2013 +0100 @@ -0,0 +1,84 @@ +local dataforms = require "util.dataforms"; + +-- TODO Cleanup, commit +return function (opts, arg) + if opts.short_help then + print("Execute an Ad-Hoc Command"); + return; + end + local function on_connect(conn) + if opts.node then + conn:execute_command(opts.to or conn.host, opts.node, function(cmd) + conn:info("status: %s", cmd.status); + local note = cmd.note; + if note then + conn[note.attr.type or "info"](conn, note:get_text()); + end + if cmd.status == "executing" then + local data = {}; + for i=1,#arg do + local k,v = arg[i]:match"^([^=]+)=(.*)"; + if k and v then + data[k] = v; --FIXME multiple + end + end + local command_form_layout = dataforms.from_stanza(cmd.form) + if opts.interactive then + for i=1,#command_form_layout do + local item = command_form_layout[i]; + if item.type ~= "hidden" and not data[item.name] then + -- FIXME Current value isn't shown + io.stderr:write(item.label..": "); + if item.type:match"%-multi" then + local t = { }; + repeat + local line = io.read("*l"); + if line and line ~= "" then + t[#t+1] = line; + end + until not line or line == ""; + if item.type == "text-multi" then + t = table.concat(t, "\n"); + end + data[item.name] = t; + --elseif item.type == "list-single" then + --data[item.name] = { (io.read("*l")) }; + else + data[item.name] = io.read("*l"); + end + end + end + end + cmd:next(command_form_layout:form(data, "submit")); + elseif cmd.status == "completed" then + if cmd.form then + local command_form_layout = dataforms.from_stanza(cmd.form) + local data = command_form_layout:data(cmd.form); + for i, item in ipairs(command_form_layout) do + if item.type ~= "hidden" then + print("== " .. item.name .. " ==") + print(data[item.name]); + end + end + + end + conn:close(); + else + conn:warn("unhandled command status: %s", tostring(cmd.status)); + end + end); + else + conn:disco_items(opts.to or conn.host, "http://jabber.org/protocol/commands", function(items) + -- TODO It would be neat to be able to choose from this list + if items then + for i=1,#items do + print(items[i].name, items[i].node); + end + end + conn:close(); + end); + end + end + clix_connect(opts, on_connect, {"adhoc"}); +end +