mirror of
https://github.com/openwrt/luci.git
synced 2025-02-07 11:39:54 +00:00
Move classes required for Lua runtime support into a new `luci-lua-runtime` package. Also replace the `luci.http` and `luci.util` classes in `luci-lib-base` with stubbed versions interacting with the ucode based runtime environment. Finally merge `luci-base-ucode` into the remainders of `luci-base`. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
77 lines
1.6 KiB
Lua
77 lines
1.6 KiB
Lua
-- 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
|