I've noticed that there is nothing in my /tmp/luci-modulecache directory. Digging into it it looks like because both the expected uid and mode of the files doesn't match, so for security reasons they're long being loaded or saved by ccache.lua (from the luci-lib-core package). I'm not sure how far back this has been broken but I it appears to have been quite some time, possibly years? I've included a patch which updates the checks to use the right newer function name / structure name. It decreases page load times by about 10-15% on my bcm2708 (raspberrypi). I can create a ticket if you'd prefer. The patch is against the luci-0.11 branch but should apply to trunk as well. Signed-off-by: Bryan Mayland <bmayland@leoninedev.com>
87 lines
1.8 KiB
Lua
87 lines
1.8 KiB
Lua
--[[
|
|
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$
|
|
]]--
|
|
|
|
local io = require "io"
|
|
local fs = require "nixio.fs"
|
|
local util = require "luci.util"
|
|
local nixio = require "nixio"
|
|
local debug = require "debug"
|
|
local string = require "string"
|
|
local package = require "package"
|
|
|
|
local type, loadfile = type, loadfile
|
|
|
|
|
|
module "luci.ccache"
|
|
|
|
function cache_ondemand(...)
|
|
if debug.getinfo(1, 'S').source ~= "=?" then
|
|
cache_enable(...)
|
|
end
|
|
end
|
|
|
|
function cache_enable(cachepath, mode)
|
|
cachepath = cachepath or "/tmp/luci-modulecache"
|
|
mode = mode or "r--r--r--"
|
|
|
|
local loader = package.loaders[2]
|
|
local uid = nixio.getuid()
|
|
|
|
if not fs.stat(cachepath) then
|
|
fs.mkdir(cachepath)
|
|
end
|
|
|
|
local function _encode_filename(name)
|
|
local encoded = ""
|
|
for i=1, #name do
|
|
encoded = encoded .. ("%2X" % string.byte(name, i))
|
|
end
|
|
return encoded
|
|
end
|
|
|
|
local function _load_sane(file)
|
|
local stat = fs.stat(file)
|
|
if stat and stat.uid == uid and stat.modestr == mode then
|
|
return loadfile(file)
|
|
end
|
|
end
|
|
|
|
local function _write_sane(file, func)
|
|
if nixio.getuid() == uid then
|
|
local fp = io.open(file, "w")
|
|
if fp then
|
|
fp:write(util.get_bytecode(func))
|
|
fp:close()
|
|
fs.chmod(file, mode)
|
|
end
|
|
end
|
|
end
|
|
|
|
package.loaders[2] = function(mod)
|
|
local encoded = cachepath .. "/" .. _encode_filename(mod)
|
|
local modcons = _load_sane(encoded)
|
|
|
|
if modcons then
|
|
return modcons
|
|
end
|
|
|
|
-- No cachefile
|
|
modcons = loader(mod)
|
|
if type(modcons) == "function" then
|
|
_write_sane(encoded, modcons)
|
|
end
|
|
return modcons
|
|
end
|
|
end
|