Added a ubus module to lua
This commit is contained in:
parent
82685dab40
commit
f279c08267
1 changed files with 170 additions and 0 deletions
170
src/ubus.lua
Normal file
170
src/ubus.lua
Normal file
|
@ -0,0 +1,170 @@
|
|||
#!/usr/bin/lua
|
||||
-- WANT_JSON
|
||||
|
||||
local Ansible = require("ansible")
|
||||
local ubus = require("ubus")
|
||||
local json = require("dkjson")
|
||||
|
||||
function list(module)
|
||||
check_parameters(module, {"path"})
|
||||
local path = module:get_params()['path']
|
||||
|
||||
local conn = module:ubus_connect()
|
||||
|
||||
local list = {}
|
||||
|
||||
local namespaces = conn:objects()
|
||||
if not namespaces then
|
||||
module:fail_json({msg="Failed to enumerate ubus"})
|
||||
end
|
||||
|
||||
for _, n in ipairs(namespaces) do
|
||||
if not path or Ansible.contains(n, path) then
|
||||
local signatures = conn:signatures(n)
|
||||
if not signatures then
|
||||
module:fail_json({msg="Failed to enumerate ubus"})
|
||||
end
|
||||
list[n] = signatures
|
||||
end
|
||||
end
|
||||
|
||||
conn:close()
|
||||
module:exit_json({msg="Gathered local signatures", signatures=list})
|
||||
end
|
||||
|
||||
function call(module)
|
||||
check_parameters(module, {"path", "method", "message"})
|
||||
local p = module:get_params()
|
||||
local path = p["path"]
|
||||
if 1 ~= #path then
|
||||
module:fail_json({msg="Call only allows one path element, but zero or 2+ were given"})
|
||||
else
|
||||
path = path[1]
|
||||
end
|
||||
|
||||
local conn = module:ubus_connect()
|
||||
local res = module:ubus_call(conn, path, p['method'], p['message'])
|
||||
|
||||
conn:close()
|
||||
module:exit_json({msg=string.format("Called %s.%s(%s)", path, p['method'], json.encode(p['message'])), result=res, changed=true})
|
||||
end
|
||||
|
||||
function send(module)
|
||||
-- - send <type> [<message>] Send an event
|
||||
check_parameters(module, {"type", "message"})
|
||||
local p = module:get_params()
|
||||
|
||||
local conn = module:ubus_connect()
|
||||
|
||||
local res, status = conn:send(p["type"], p["message"])
|
||||
if not res then
|
||||
module:fail_json({msg="Failed to send event", status=status})
|
||||
end
|
||||
|
||||
conn:close()
|
||||
module:exit_json({msg="Event sent successfully", result=res, changed=true})
|
||||
end
|
||||
|
||||
function facts(module)
|
||||
check_parameters(module, {})
|
||||
|
||||
local conn = module:ubus_connect()
|
||||
|
||||
local facts = {}
|
||||
|
||||
local namespaces = conn:objects()
|
||||
for _,n in ipairs(namespaces) do
|
||||
if "network.device" == n
|
||||
or 1 == string.find(n, "network.interface.")
|
||||
or "network.wireless" == n then
|
||||
facts[n] = module:ubus_call(conn, n, "status", {})
|
||||
elseif "service" == n then
|
||||
-- list {}
|
||||
facts[n] = module:ubus_call(conn, n, "list", {})
|
||||
elseif "system" == n then
|
||||
-- board {}
|
||||
-- info {}
|
||||
local f = {}
|
||||
f["board"] = module:ubus_call(conn, n, "board", {})
|
||||
f["info"] = module:ubus_call(conn, n, "info", {})
|
||||
facts[n] = f
|
||||
elseif "uci" == n then
|
||||
-- configs {}
|
||||
-- foreach configs...
|
||||
local f = {}
|
||||
f["configs"] = module:ubus_call(conn, n, "configs", {})
|
||||
f["state"] = {}
|
||||
|
||||
for _,conf in ipairs(f["configs"]) do
|
||||
-- TODO: transform unnamed sections to their anonymous names
|
||||
f["state"]["conf"] = module:ubus_call( conn, n, "state", {config=conf})
|
||||
end
|
||||
facts[n] = f
|
||||
end
|
||||
end
|
||||
|
||||
conn:close()
|
||||
|
||||
module:exit_json({msg="All available facts gathered", ansible_facts=facts})
|
||||
end
|
||||
|
||||
function check_parameters(module, valid)
|
||||
local p = module:get_params()
|
||||
local i = 0
|
||||
for k,_ in pairs(p) do
|
||||
-- not a buildin command and not a valid entry
|
||||
if 1 ~= string.find(k, "_ansible")
|
||||
and k ~= "socket"
|
||||
and k ~= "timeout"
|
||||
and k ~= "command" then
|
||||
|
||||
i = i+1
|
||||
|
||||
if((not Ansible.contains(k, valid))) then
|
||||
module:fail_json({msg=string.format("Parameter %q invalid for command %s", k, p['command'])})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return i
|
||||
end
|
||||
|
||||
function main(arg)
|
||||
-- module models the ubus cli tools structure
|
||||
-- Usage: ubus [<options>] <command> [arguments...]
|
||||
-- Options:
|
||||
-- -s <socket>: Set the unix domain socket to connect to
|
||||
-- -t <timeout>: Set the timeout (in seconds) for a command to complete
|
||||
-- -S: Use simplified output (for scripts)
|
||||
-- -v: More verbose output
|
||||
--
|
||||
-- Commands:
|
||||
-- - list [<path>] List objects
|
||||
-- - call <path> <method> [<message>] Call an object method
|
||||
-- - send <type> [<message>] Send an event
|
||||
|
||||
local module = Ansible.new({
|
||||
command = { aliases = {"cmd"}, required=true , choices={"list", "call", "send", "facts"}},
|
||||
path = { type="list" },
|
||||
method = { type="str" },
|
||||
type = { type="str" },
|
||||
message = { type="jsonarg" },
|
||||
socket = { type="path" },
|
||||
timeout = { type="int"}
|
||||
})
|
||||
|
||||
module:parse(arg[1])
|
||||
|
||||
local p = module:get_params()
|
||||
|
||||
local dispatcher = {
|
||||
list = list,
|
||||
call = call,
|
||||
send = send,
|
||||
facts = facts
|
||||
}
|
||||
|
||||
dispatcher[p['command']](module)
|
||||
end
|
||||
|
||||
main(arg)
|
Loading…
Add table
Reference in a new issue