diff options
author | Steven Barth <steven@midlink.org> | 2008-08-22 20:04:04 +0000 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2008-08-22 20:04:04 +0000 |
commit | 4eead17501584a09679841d75d451b19a7c234d0 (patch) | |
tree | 351625bc0972a76f5f3987253adf13cdd438c6c6 | |
parent | 9c6a852939c4f16f5d82299ff7b3a10f15ac3db0 (diff) |
RPC part #2
-rw-r--r-- | libs/web/luasrc/dispatcher.lua | 4 | ||||
-rw-r--r-- | modules/rpc/luasrc/controller/rpc.lua | 37 | ||||
-rw-r--r-- | modules/rpc/luasrc/jsonrpc.lua | 86 |
3 files changed, 114 insertions, 13 deletions
diff --git a/libs/web/luasrc/dispatcher.lua b/libs/web/luasrc/dispatcher.lua index dc551916a..2de5ea4b1 100644 --- a/libs/web/luasrc/dispatcher.lua +++ b/libs/web/luasrc/dispatcher.lua @@ -171,7 +171,9 @@ function dispatch(request) if track.sysauth then require("luci.sauth") - local authen = authenticator[track.sysauth_authenticator] + local authen = type(track.sysauth_authenticator) == "function" + and track.sysauth_authenticator + or authenticator[track.sysauth_authenticator] local def = (type(track.sysauth) == "string") and track.sysauth local accs = def and {track.sysauth} or track.sysauth local sess = luci.http.getcookie("sysauth") diff --git a/modules/rpc/luasrc/controller/rpc.lua b/modules/rpc/luasrc/controller/rpc.lua index 41d4c59f0..dd00f63c3 100644 --- a/modules/rpc/luasrc/controller/rpc.lua +++ b/modules/rpc/luasrc/controller/rpc.lua @@ -14,18 +14,31 @@ $Id$ ]]-- module("luci.controller.rpc", package.seeall) -function index() - entry({"rpc", "uci"}, call("rpc_uci")).sysauth = "root" - entry({"rpc", "auth"}, call("rpc_auth")) +function index() + local authenticator = function(validator) + require "luci.jsonrpc" + require "luci.http" + luci.http.setfilehandler() + + local loginstat + + local server = {} + server.login = function(...) + loginstat = validator(...) + return loginstat + end + + luci.http.prepare_content("application/json") + luci.http.write(luci.jsonrpc.handle(server, luci.http.content())) + + return loginstat + end + + uci = entry({"rpc", "uci"}, call("rpc_uci")) + uci.sysauth = "root" + uci.sysauth_authenticator = authenticator end -function rpc_proxy(tbl, jsonrpc, method, params, id) - local res = {luci.util.copcall(tbl[function], ...)} - local stat = table.remove(res, 1) - - if not stat then - return nil, {code=-32602, message="Invalid params.", data=table.remove(res, 1)} - else - return res, nil - end +function rpc_uci() + luci.http.write("HELLO THAR!") end
\ No newline at end of file diff --git a/modules/rpc/luasrc/jsonrpc.lua b/modules/rpc/luasrc/jsonrpc.lua new file mode 100644 index 000000000..61524476a --- /dev/null +++ b/modules/rpc/luasrc/jsonrpc.lua @@ -0,0 +1,86 @@ +--[[ +LuCI - Lua Configuration Interface + +Copyright 2008 Steven Barth <steven@midlink.org> +Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net> + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +$Id$ +]]-- + +module("luci.jsonrpc", package.seeall) + +function resolve(mod, method) + local path = luci.util.split(value, ".") + + for j=1, #path-1 do + if not type(mod) == "table" then + break + end + mod = mod[path[j]] + if not mod then + break + end + end + mod = type(mod) == "table" and mod[path[#path]] or nil + if type(mod) == "function" then + return mod + end +end + +function handle(tbl, rawdata) + local stat, json = luci.util.copcall(luci.json.Decode, rawdata) + local response + local success = false + + if stat then + if type(json.method) == "string" + and (not json.params or type(json.params) == "table") then + if tbl[json.method] then + response = reply(json.jsonrpc, json.id, + proxy(resolve(tbl, json.method), unpack(json.params))) + else + response = reply(json.jsonrpc, json.id, + nil, {code=-32601, message="Method not found."}) + end + else + response = reply(json.jsonrpc, json.id, + nil, {code=-32600, message="Invalid request."}) + end + else + response = reply(json.jsonrpc, nil, + nil, {code=-32700, message="Parse error."}) + end + + return luci.json.Encode(response) +end + +function reply(jsonrpc, id, res, err) + require "luci.json" + id = id or luci.json.Null + + -- 1.0 compatibility + if jsonrpc ~= "2.0" then + jsonrpc = nil + res = res or luci.json.Null + err = err or luci.json.Null + end + + return {id=id, result=res, error=err, jsonrpc=jsonrpc} +end + +function proxy(method, ...) + local res = {luci.util.copcall(method, unpack(params))} + local stat = table.remove(res, 1) + + if not stat then + return nil, {code=-32602, message="Invalid params.", data=table.remove(res, 1)} + else + return (#res <= 1) and res[1] or res + end +end
\ No newline at end of file |