mirror of
				https://github.com/Ysurac/openmptcprouter-feeds.git
				synced 2025-03-09 15:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			76 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
 |