12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- -- Copyright 2008 Steven Barth <steven@midlink.org>
- -- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- -- Licensed to the public under the Apache License 2.0.
- 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
|