clix/adhoc.lua

Fri, 15 Feb 2013 20:46:10 +0100

author
Kim Alvefur <zash@zash.se>
date
Fri, 15 Feb 2013 20:46:10 +0100
changeset 108
c33848e79bfc
child 124
ff422623e0ba
permissions
-rw-r--r--

clix.adhoc: Run Ad-hoc commands

108
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local dataforms = require "util.dataforms";
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 -- TODO Cleanup, commit
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 return function (opts, arg)
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 if opts.short_help then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 print("Execute an Ad-Hoc Command");
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 return;
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 local function on_connect(conn)
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 if opts.node then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 conn:execute_command(opts.to or conn.host, opts.node, function(cmd)
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 conn:info("status: %s", cmd.status);
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local note = cmd.note;
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 if note then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 conn[note.attr.type or "info"](conn, note:get_text());
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 if cmd.status == "executing" then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 local data = {};
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 for i=1,#arg do
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 local k,v = arg[i]:match"^([^=]+)=(.*)";
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 if k and v then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 data[k] = v; --FIXME multiple
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 local command_form_layout = dataforms.from_stanza(cmd.form)
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 if opts.interactive then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 for i=1,#command_form_layout do
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 local item = command_form_layout[i];
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 if item.type ~= "hidden" and not data[item.name] then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 -- FIXME Current value isn't shown
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 io.stderr:write(item.label..": ");
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 if item.type:match"%-multi" then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 local t = { };
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 repeat
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 local line = io.read("*l");
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 if line and line ~= "" then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 t[#t+1] = line;
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 until not line or line == "";
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 if item.type == "text-multi" then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 t = table.concat(t, "\n");
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 data[item.name] = t;
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 --elseif item.type == "list-single" then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 --data[item.name] = { (io.read("*l")) };
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 else
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 data[item.name] = io.read("*l");
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 cmd:next(command_form_layout:form(data, "submit"));
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 elseif cmd.status == "completed" then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 if cmd.form then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 local command_form_layout = dataforms.from_stanza(cmd.form)
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 local data = command_form_layout:data(cmd.form);
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 for i, item in ipairs(command_form_layout) do
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 if item.type ~= "hidden" then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 print("== " .. item.name .. " ==")
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 print(data[item.name]);
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 conn:close();
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 else
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 conn:warn("unhandled command status: %s", tostring(cmd.status));
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 end);
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 else
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 conn:disco_items(opts.to or conn.host, "http://jabber.org/protocol/commands", function(items)
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 -- TODO It would be neat to be able to choose from this list
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 if items then
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 for i=1,#items do
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 print(items[i].name, items[i].node);
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 conn:close();
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 end);
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 clix_connect(opts, on_connect, {"adhoc"});
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 end
c33848e79bfc clix.adhoc: Run Ad-hoc commands
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84

mercurial