Software /
code /
clix
Changeset
106:c33848e79bfc
clix.adhoc: Run Ad-hoc commands
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 15 Feb 2013 20:46:10 +0100 |
parents | 105:a074eaacefe7 |
children | 107:67ff8f55db4a |
files | clix/adhoc.lua |
diffstat | 1 files changed, 84 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /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 +