ソースを参照

Merge remote-tracking branch 'origin/announce.d'

Matthias Schiffer 9 年 前
コミット
3725f7bca3

+ 25 - 7
package/gluon-announce/files/usr/lib/lua/gluon/announce.lua

@@ -10,24 +10,42 @@ local function collect_entry(entry)
 	if fs.stat(entry, 'type') == 'dir' then
 		return collect_dir(entry)
 	else
-		return setfenv(loadfile(entry), _M)()
+		return loadfile(entry)
 	end
 end
 
 function collect_dir(dir)
-	local ret = { [{}] = true }
+	local fns = {}
 
 	for entry in fs.dir(dir) do
 		if entry:sub(1, 1) ~= '.' then
-			local ok, val = pcall(collect_entry, dir .. '/' .. entry)
+			collectgarbage()
+			local fn, err = collect_entry(dir .. '/' .. entry)
+
+			if fn then
+				fns[entry] = fn
+			else
+				io.stderr:write(err, '\n')
+			end
+		end
+	end
+
+	return function ()
+		local ret = { [{}] = true }
+
+		for k, v in pairs(fns) do
+			collectgarbage()
+			local ok, val = pcall(setfenv(v, _M))
+
 			if ok then
-				ret[entry] = val
+				ret[k] = val
 			else
 				io.stderr:write(val, '\n')
 			end
 		end
-	end
 
-	return ret
-end
+		collectgarbage()
 
+		return ret
+	end
+end

+ 23 - 6
package/gluon-announced/files/usr/lib/lua/gluon/announced.lua

@@ -1,21 +1,29 @@
 local announce = require 'gluon.announce'
 local deflate = require 'deflate'
 local json = require 'luci.jsonc'
+local nixio = require 'nixio'
+local fs = require 'nixio.fs'
 
+local memoize = {}
 
-local function collect(type)
-  return announce.collect_dir('/lib/gluon/announce/' .. type .. '.d')
+nixio.chdir('/lib/gluon/announce/')
+
+for dir in fs.glob('*.d') do
+  local name = dir:sub(1, -3)
+  memoize[name] = announce.collect_dir(dir)
 end
 
+local function collect(type)
+  return memoize[type] and memoize[type]()
+end
 
 module('gluon.announced', package.seeall)
 
 function handle_request(query)
-  if query:match('^nodeinfo$') then
-    return json.stringify(collect('nodeinfo'))
-  end
+  collectgarbage()
 
   local m = query:match('^GET ([a-z ]+)$')
+  local ret
   if m then
     local data = {}
 
@@ -27,7 +35,16 @@ function handle_request(query)
     end
 
     if next(data) then
-      return deflate.compress(json.stringify(data))
+      ret = deflate.compress(json.stringify(data))
+    end
+  elseif query:match('^[a-z]+$') then
+    local ok, data = pcall(collect, query)
+    if ok then
+      ret = json.stringify(data)
     end
   end
+
+  collectgarbage()
+
+  return ret
 end