Switch from luci-lib-json to luci-lib-jsonc
Apart from replacing a patch for the former by two patches for latter, this involved minimal adaptations of the lua scripts in the following packages: * gluon-announce * gluon-announced * gluon-mesh-batman-adv-core * gluon-status-page
This commit is contained in:
		
							parent
							
								
									4405f39869
								
							
						
					
					
						commit
						15a80aaffd
					
				| @ -11,7 +11,7 @@ include $(INCLUDE_DIR)/package.mk | ||||
| define Package/gluon-announce | ||||
|   SECTION:=gluon | ||||
|   CATEGORY:=Gluon | ||||
|   DEPENDS:=+gluon-core +luci-lib-json +lua-ethtool-stats | ||||
|   DEPENDS:=+gluon-core +luci-lib-jsonc +lua-ethtool-stats | ||||
|   TITLE:=Lua scripts announcing various information | ||||
| endef | ||||
| 
 | ||||
|  | ||||
| @ -1,10 +1,9 @@ | ||||
| #!/usr/bin/lua | ||||
| 
 | ||||
| local announce = require 'gluon.announce' | ||||
| local json = require 'luci.json' | ||||
| local json = require 'luci.jsonc' | ||||
| local ltn12 = require 'luci.ltn12' | ||||
| 
 | ||||
| local announce_dir = '/lib/gluon/announce/' .. arg[1] .. '.d' | ||||
| 
 | ||||
| encoder = json.Encoder(announce.collect_dir(announce_dir)) | ||||
| ltn12.pump.all(encoder:source(), ltn12.sink.file(io.stdout)) | ||||
| print(json.stringify(announce.collect_dir(announce_dir))) | ||||
|  | ||||
| @ -3,7 +3,6 @@ | ||||
| module('gluon.announce', package.seeall) | ||||
| 
 | ||||
| fs = require 'nixio.fs' | ||||
| json = require 'luci.json' | ||||
| uci = require('luci.model.uci').cursor() | ||||
| util = require 'luci.util' | ||||
| 
 | ||||
| @ -16,7 +15,7 @@ local function collect_entry(entry) | ||||
| end | ||||
| 
 | ||||
| function collect_dir(dir) | ||||
| 	local ret = { [json.null] = true } | ||||
| 	local ret = { [{}] = true } | ||||
| 
 | ||||
| 	for entry in fs.dir(dir) do | ||||
| 		if entry:sub(1, 1) ~= '.' then | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| local announce = require 'gluon.announce' | ||||
| local deflate = require 'deflate' | ||||
| local json = require 'luci.json' | ||||
| local json = require 'luci.jsonc' | ||||
| 
 | ||||
| 
 | ||||
| local function collect(type) | ||||
| @ -12,7 +12,7 @@ module('gluon.announced', package.seeall) | ||||
| 
 | ||||
| function handle_request(query) | ||||
|   if query:match('^nodeinfo$') then | ||||
|     return json.encode(collect('nodeinfo')) | ||||
|     return json.stringify(collect('nodeinfo')) | ||||
|   end | ||||
| 
 | ||||
|   local m = query:match('^GET ([a-z ]+)$') | ||||
| @ -27,7 +27,7 @@ function handle_request(query) | ||||
|     end | ||||
| 
 | ||||
|     if next(data) then | ||||
|       return deflate.compress(json.encode(data)) | ||||
|       return deflate.compress(json.stringify(data)) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
| @ -22,7 +22,7 @@ function batadv() | ||||
|     if mac1 ~= nil and mac1 == mac2 then | ||||
|       ifaddress = ifname2address(ifname) | ||||
|       if interfaces[ifaddress] == nil then | ||||
|         interfaces[ifaddress] = { neighbours = { [json.null] = true } } | ||||
|         interfaces[ifaddress] = { neighbours = { [{}] = true } } | ||||
|       end | ||||
| 
 | ||||
|       interfaces[ifaddress].neighbours[mac1] = { tq = tonumber(tq) | ||||
|  | ||||
| @ -49,5 +49,5 @@ return { | ||||
|   wireless = nil_table(wireless), | ||||
|   tunnel = nil_table(tunnel), | ||||
|   other = nil_table(other), | ||||
|   [json.null] = true | ||||
|   [{}] = true | ||||
| } | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| local json = require 'luci.json' | ||||
| local json = require 'luci.jsonc' | ||||
| local ltn12 = require 'luci.ltn12' | ||||
| local nixio = require 'nixio' | ||||
| local site = require 'gluon.site_config' | ||||
| @ -11,8 +11,8 @@ if not fastd_sock:connect(socket_path) then | ||||
|   return nil | ||||
| end | ||||
| 
 | ||||
| local decoder = json.Decoder() | ||||
| ltn12.pump.all(ltn12.source.file(fastd_sock), decoder:sink()) | ||||
| local decoder = json.new() | ||||
| ltn12.pump.all(ltn12.source.file(fastd_sock), function(chunk) decoder:parse(chunk) end) | ||||
| 
 | ||||
| local status = decoder:get() | ||||
| 
 | ||||
| @ -27,7 +27,7 @@ local function peer_connection(config) | ||||
|         established = peer.connection.established/1000 | ||||
|       } | ||||
|     else | ||||
|       return json.null | ||||
|       return function()end -- nil | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
| @ -12,7 +12,7 @@ define Package/gluon-status-page | ||||
|   SECTION:=gluon | ||||
|   CATEGORY:=Gluon | ||||
|   TITLE:=Adds a status page showing information about the node. | ||||
|   DEPENDS:=+gluon-core +uhttpd +gluon-neighbour-info +gluon-announce +libiwinfo-lua | ||||
|   DEPENDS:=+gluon-core +uhttpd +gluon-neighbour-info +gluon-announce +libiwinfo-lua +luci-lib-jsonc | ||||
| endef | ||||
| 
 | ||||
| define Package/gluon-status-page/description | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #!/usr/bin/lua | ||||
| 
 | ||||
| local json = require 'luci.json' | ||||
| local json = require 'luci.jsonc' | ||||
| local nixio = require 'nixio' | ||||
| 
 | ||||
| function neighbours() | ||||
| @ -25,7 +25,7 @@ io.write("Access-Control-Allow-Origin: *\n") | ||||
| io.write("Content-type: text/event-stream\n\n") | ||||
| 
 | ||||
| while true do | ||||
|   local neighbours = json.encode(neighbours()) | ||||
|   local neighbours = json.stringify(neighbours()) | ||||
|   io.write("data: " .. neighbours .. "\n\n") | ||||
|   io.flush() | ||||
|   nixio.nanosleep(1, 0) | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #!/usr/bin/lua | ||||
| 
 | ||||
| util = require 'luci.util' | ||||
| json = require 'luci.json' | ||||
| json = require 'luci.jsonc' | ||||
| nixio = require 'nixio' | ||||
| iwinfo = require 'iwinfo' | ||||
| 
 | ||||
| @ -45,7 +45,7 @@ io.write("Access-Control-Allow-Origin: *\n") | ||||
| io.write("Content-type: text/event-stream\n\n") | ||||
| 
 | ||||
| while true do | ||||
|   local stations = json.encode(get_stations(iw, ifname)) | ||||
|   local stations = json.stringify(get_stations(iw, ifname)) | ||||
|   io.write("data: " .. stations .. "\n\n") | ||||
|   io.flush() | ||||
|   nixio.nanosleep(0, 150e6) | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #!/usr/bin/lua | ||||
| 
 | ||||
| local announce = require 'gluon.announce' | ||||
| local json = require 'luci.json' | ||||
| local json = require 'luci.jsonc' | ||||
| local util = require 'luci.util' | ||||
| local nixio = require 'nixio' | ||||
| 
 | ||||
| @ -11,7 +11,7 @@ io.write("Access-Control-Allow-Origin: *\n") | ||||
| io.write("Content-type: text/event-stream\n\n") | ||||
| 
 | ||||
| while true do | ||||
|   local data = json.encode(announce.collect_dir(announce_dir)) | ||||
|   local data = json.stringify(announce.collect_dir(announce_dir)) | ||||
|   io.write("data: " .. data .. "\n\n") | ||||
|   io.flush() | ||||
|   nixio.nanosleep(1, 0) | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #!/usr/bin/lua | ||||
| 
 | ||||
| util = require 'luci.util' | ||||
| json = require 'luci.json' | ||||
| json = require 'luci.jsonc' | ||||
| fs = require 'nixio.fs' | ||||
| 
 | ||||
| io.write("Access-Control-Allow-Origin: *\n") | ||||
| @ -21,4 +21,4 @@ for _, line in ipairs(util.split(list)) do | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| io.write(json.encode(interfaces)) | ||||
| io.write(json.stringify(interfaces)) | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #!/usr/bin/lua | ||||
| 
 | ||||
| local announce = require 'gluon.announce' | ||||
| local json = require 'luci.json' | ||||
| local json = require 'luci.jsonc' | ||||
| local util = require 'luci.util' | ||||
| local nixio = require 'nixio' | ||||
| 
 | ||||
| @ -10,6 +10,6 @@ local announce_dir = '/lib/gluon/announce/nodeinfo.d/' | ||||
| io.write("Access-Control-Allow-Origin: *\n") | ||||
| io.write("Content-type: application/json\n\n") | ||||
| 
 | ||||
| local data = json.encode(announce.collect_dir(announce_dir)) | ||||
| local data = json.stringify(announce.collect_dir(announce_dir)) | ||||
| io.write(data) | ||||
| io.flush() | ||||
|  | ||||
| @ -4,7 +4,7 @@ local util = require("luci.util") | ||||
| local fs = require("nixio.fs") | ||||
| local ltn12 = require 'luci.ltn12' | ||||
| local sys = require("luci.sys") | ||||
| local json = require("luci.json") | ||||
| local json = require("luci.jsonc") | ||||
| local nixio = require 'nixio' | ||||
| local platform_info = require("platform_info") | ||||
| 
 | ||||
| @ -20,7 +20,7 @@ function neighbours(ifname) | ||||
|   local info = util.exec("gluon-neighbour-info -d ff02::2:1001 -p 1001 -r nodeinfo -t 3 -i " .. ifname) | ||||
|   local macs = {} | ||||
|   for _, line in ipairs(util.split(info)) do | ||||
|     local data = json.decode(line) | ||||
|     local data = json.parse(line) | ||||
|     if data then | ||||
|       local function add_macs(list) | ||||
|         if list then | ||||
| @ -93,8 +93,8 @@ local stat, fastd_status = pcall( | ||||
|     local fastd_sock = nixio.socket('unix', 'stream') | ||||
|     assert(fastd_sock:connect('/var/run/fastd.mesh_vpn.socket')) | ||||
| 
 | ||||
|     decoder = json.Decoder() | ||||
|     ltn12.pump.all(ltn12.source.file(fastd_sock), decoder:sink()) | ||||
|     decoder = json.new() | ||||
|     ltn12.pump.all(ltn12.source.file(fastd_sock), function(chunk) decoder:parse(chunk) end) | ||||
|     return decoder:get() | ||||
|   end | ||||
| ) | ||||
|  | ||||
| @ -1,36 +0,0 @@ | ||||
| From: Matthias Schiffer <mschiffer@universe-factory.net> | ||||
| Date: Thu, 4 Jun 2015 21:03:24 +0200 | ||||
| Subject: luci-lib-json: ignore null keys to allow encoding empty objects | ||||
| 
 | ||||
| There is currently no way to encode an empty object {}, as empty tables are | ||||
| encoded as empty lists []. | ||||
| 
 | ||||
| With this patch, encode() will ignore table fields with the key json.null (which | ||||
| doesn't make sense anyways). This allows adding a field with key json.null to | ||||
| force encoding it as an object. | ||||
| 
 | ||||
| Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net> | ||||
| 
 | ||||
| diff --git a/libs/luci-lib-json/luasrc/json.lua b/libs/luci-lib-json/luasrc/json.lua
 | ||||
| index 416b25f..f7b57f9 100644
 | ||||
| --- a/libs/luci-lib-json/luasrc/json.lua
 | ||||
| +++ b/libs/luci-lib-json/luasrc/json.lua
 | ||||
| @@ -149,11 +149,13 @@ function Encoder.parse_iter(self, obj)
 | ||||
|  		local first = true | ||||
|   | ||||
|  		for key, entry in pairs(obj) do | ||||
| -			first = first or self:put(",")
 | ||||
| -			first = first and false
 | ||||
| -			self:parse_string(tostring(key))
 | ||||
| -			self:put(":")
 | ||||
| -			self:dispatch(entry)
 | ||||
| +			if key ~= null then
 | ||||
| +				first = first or self:put(",")
 | ||||
| +				first = first and false
 | ||||
| +				self:parse_string(tostring(key))
 | ||||
| +				self:put(":")
 | ||||
| +				self:dispatch(entry)
 | ||||
| +			end
 | ||||
|  		end | ||||
|   | ||||
|  		self:put("}") | ||||
| @ -0,0 +1,32 @@ | ||||
| From: Jan-Philipp Litza <janphilipp@litza.de> | ||||
| Date: Sun, 30 Aug 2015 15:42:52 +0200 | ||||
| Subject: luci-lib-jsonc: Ignore non-string-or-number keys in tables | ||||
| 
 | ||||
| Previously, the following caused a segmentation fault: | ||||
| 
 | ||||
|     json.stringify({[{}] = true}) | ||||
| 
 | ||||
| This was caused by lua_tostring() returning NULL for anything but | ||||
| strings and numbers, letting json_object_object_add crash. | ||||
| 
 | ||||
| This patch makes jsonc ignore all keys which have no string | ||||
| representation altogether. | ||||
| 
 | ||||
| Signed-off-by: Jan-Philipp Litza <janphilipp@litza.de> | ||||
| 
 | ||||
| diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c
 | ||||
| index 49cb21f..827fde8 100644
 | ||||
| --- a/libs/luci-lib-jsonc/src/jsonc.c
 | ||||
| +++ b/libs/luci-lib-jsonc/src/jsonc.c
 | ||||
| @@ -286,8 +286,9 @@ static struct json_object * _lua_to_json(lua_State *L, int index)
 | ||||
|  			lua_pushvalue(L, -2); | ||||
|  			key = lua_tostring(L, -1); | ||||
|   | ||||
| -			json_object_object_add(obj, key,
 | ||||
| -								   _lua_to_json(L, lua_gettop(L) - 1));
 | ||||
| +			if (key)
 | ||||
| +				json_object_object_add(obj, key,
 | ||||
| +				                       _lua_to_json(L, lua_gettop(L) - 1));
 | ||||
|   | ||||
|  			lua_pop(L, 2); | ||||
|  		} | ||||
| @ -0,0 +1,38 @@ | ||||
| From: Jan-Philipp Litza <janphilipp@litza.de> | ||||
| Date: Sun, 30 Aug 2015 15:45:49 +0200 | ||||
| Subject: luci-lib-jsonc: allow encoding empty lists | ||||
| 
 | ||||
| To be consistent with the behavior of luci-lib-json, an empty Lua table | ||||
| should be encoded to an empty JSON list, not an empty JSON object. | ||||
| 
 | ||||
| To still allow encoding empty JSON objects, the usage of anything other | ||||
| than a number or a string as a key (for example an empty table or a | ||||
| function) can be used to force encoding as an object: | ||||
| 
 | ||||
|     json.stringify({})                  -- "[]" | ||||
|     json.stringify({[{}] = true})       -- "{}" | ||||
| 
 | ||||
| Signed-off-by: Jan-Philipp Litza <janphilipp@litza.de> | ||||
| 
 | ||||
| diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c
 | ||||
| index 827fde8..971fb12 100644
 | ||||
| --- a/libs/luci-lib-jsonc/src/jsonc.c
 | ||||
| +++ b/libs/luci-lib-jsonc/src/jsonc.c
 | ||||
| @@ -222,7 +222,7 @@ static int _lua_test_array(lua_State *L, int index)
 | ||||
|   | ||||
|  out: | ||||
|  		lua_pop(L, 2); | ||||
| -		return 0;
 | ||||
| +		return -1;
 | ||||
|  	} | ||||
|   | ||||
|  	/* check for holes */ | ||||
| @@ -254,7 +254,7 @@ static struct json_object * _lua_to_json(lua_State *L, int index)
 | ||||
|  	case LUA_TTABLE: | ||||
|  		max = _lua_test_array(L, index); | ||||
|   | ||||
| -		if (max > 0)
 | ||||
| +		if (max >= 0)
 | ||||
|  		{ | ||||
|  			obj = json_object_new_array(); | ||||
|   | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user