|
|
|
@ -1,158 +1,157 @@
|
|
|
|
|
init_by_lua_block {
|
|
|
|
|
|
|
|
|
|
local class = require "middleclass"
|
|
|
|
|
local clogger = require "bunkerweb.logger"
|
|
|
|
|
local helpers = require "bunkerweb.helpers"
|
|
|
|
|
local cdatastore = require "bunkerweb.datastore"
|
|
|
|
|
local cjson = require "cjson"
|
|
|
|
|
|
|
|
|
|
-- Start init phase
|
|
|
|
|
local logger = clogger:new("INIT-STREAM")
|
|
|
|
|
local datastore = cdatastore:new()
|
|
|
|
|
logger:log(ngx.NOTICE, "init-stream phase started")
|
|
|
|
|
|
|
|
|
|
-- Purge cache
|
|
|
|
|
local cachestore = require "bunkerweb.cachestore":new()
|
|
|
|
|
local ok, err = cachestore:purge()
|
|
|
|
|
local class = require "middleclass"
|
|
|
|
|
local clogger = require "bunkerweb.logger"
|
|
|
|
|
local helpers = require "bunkerweb.helpers"
|
|
|
|
|
local cdatastore = require "bunkerweb.datastore"
|
|
|
|
|
local cjson = require "cjson"
|
|
|
|
|
|
|
|
|
|
-- Start init phase
|
|
|
|
|
local logger = clogger:new("INIT")
|
|
|
|
|
local datastore = cdatastore:new()
|
|
|
|
|
logger:log(ngx.NOTICE, "init-stream phase started")
|
|
|
|
|
|
|
|
|
|
-- Remove previous data from the datastore
|
|
|
|
|
logger:log(ngx.NOTICE, "deleting old keys from datastore ...")
|
|
|
|
|
local data_keys = {"^plugin", "^variable_", "^api_", "^misc_"}
|
|
|
|
|
for i, key in pairs(data_keys) do
|
|
|
|
|
local ok, err = datastore:delete_all(key)
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't purge cachestore : " .. err)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Remove previous data from the datastore
|
|
|
|
|
logger:log(ngx.NOTICE, "deleting old keys from datastore ...")
|
|
|
|
|
local data_keys = {"^plugin_", "^variable_", "^plugins$", "^api_", "^misc_"}
|
|
|
|
|
for i, key in pairs(data_keys) do
|
|
|
|
|
local ok, err = datastore:delete_all(key)
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't delete " .. key .. " from datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.INFO, "deleted " .. key .. " from datastore")
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "deleted old keys from datastore")
|
|
|
|
|
|
|
|
|
|
-- Load variables into the datastore
|
|
|
|
|
logger:log(ngx.NOTICE, "saving variables into datastore ...")
|
|
|
|
|
local file = io.open("/etc/nginx/variables.env")
|
|
|
|
|
if not file then
|
|
|
|
|
logger:log(ngx.ERR, "can't open /etc/nginx/variables.env file")
|
|
|
|
|
logger:log(ngx.ERR, "can't delete " .. key .. " from datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
file:close()
|
|
|
|
|
for line in io.lines("/etc/nginx/variables.env") do
|
|
|
|
|
local variable, value = line:match("^([^=]+)=(.*)$")
|
|
|
|
|
local ok, err = datastore:set("variable_" .. variable, value)
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save variable " .. variable .. " into datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.INFO, "saved variable " .. variable .. "=" .. value .. " into datastore")
|
|
|
|
|
logger:log(ngx.INFO, "deleted " .. key .. " from datastore")
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "deleted old keys from datastore")
|
|
|
|
|
|
|
|
|
|
-- Load variables into the datastore
|
|
|
|
|
logger:log(ngx.NOTICE, "saving variables into datastore ...")
|
|
|
|
|
local file = io.open("/etc/nginx/variables.env")
|
|
|
|
|
if not file then
|
|
|
|
|
logger:log(ngx.ERR, "can't open /etc/nginx/variables.env file")
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
file:close()
|
|
|
|
|
for line in io.lines("/etc/nginx/variables.env") do
|
|
|
|
|
local variable, value = line:match("^([^=]+)=(.*)$")
|
|
|
|
|
local ok, err = datastore:set("variable_" .. variable, value)
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save variable " .. variable .. " into datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "saved variables into datastore")
|
|
|
|
|
|
|
|
|
|
-- Set API values into the datastore
|
|
|
|
|
logger:log(ngx.NOTICE, "saving API values into datastore ...")
|
|
|
|
|
local value, err = datastore:get("variable_USE_API")
|
|
|
|
|
logger:log(ngx.INFO, "saved variable " .. variable .. "=" .. value .. " into datastore")
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "saved variables into datastore")
|
|
|
|
|
|
|
|
|
|
-- Purge cache
|
|
|
|
|
local cachestore = require "bunkerweb.cachestore":new(false, true)
|
|
|
|
|
local ok, err = cachestore:purge()
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't purge cachestore : " .. err)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Set API values into the datastore
|
|
|
|
|
logger:log(ngx.NOTICE, "saving API values into datastore ...")
|
|
|
|
|
local value, err = datastore:get("variable_USE_API")
|
|
|
|
|
if not value then
|
|
|
|
|
logger:log(ngx.ERR, "can't get variable USE_API from the datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
if value == "yes" then
|
|
|
|
|
local value, err = datastore:get("variable_API_WHITELIST_IP")
|
|
|
|
|
if not value then
|
|
|
|
|
logger:log(ngx.ERR, "can't get variable USE_API from the datastore : " .. err)
|
|
|
|
|
logger:log(ngx.ERR, "can't get variable API_WHITELIST_IP from the datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
if value == "yes" then
|
|
|
|
|
local value, err = datastore:get("variable_API_WHITELIST_IP")
|
|
|
|
|
if not value then
|
|
|
|
|
logger:log(ngx.ERR, "can't get variable API_WHITELIST_IP from the datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
local whitelists = {}
|
|
|
|
|
for whitelist in value:gmatch("%S+") do
|
|
|
|
|
table.insert(whitelists, whitelist)
|
|
|
|
|
end
|
|
|
|
|
local ok, err = datastore:set("api_whitelist_ip", cjson.encode(whitelists))
|
|
|
|
|
local whitelists = {}
|
|
|
|
|
for whitelist in value:gmatch("%S+") do
|
|
|
|
|
table.insert(whitelists, whitelist)
|
|
|
|
|
end
|
|
|
|
|
local ok, err = datastore:set("api_whitelist_ip", cjson.encode(whitelists))
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save API whitelist_ip to datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.INFO, "saved API whitelist_ip into datastore")
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "saved API values into datastore")
|
|
|
|
|
|
|
|
|
|
-- Load plugins into the datastore
|
|
|
|
|
logger:log(ngx.NOTICE, "saving plugins into datastore ...")
|
|
|
|
|
local plugins = {}
|
|
|
|
|
local plugin_paths = {"/usr/share/bunkerweb/core", "/etc/bunkerweb/plugins"}
|
|
|
|
|
for i, plugin_path in ipairs(plugin_paths) do
|
|
|
|
|
local paths = io.popen("find -L " .. plugin_path .. " -maxdepth 1 -type d ! -path " .. plugin_path)
|
|
|
|
|
for path in paths:lines() do
|
|
|
|
|
local ok, plugin = helpers.load_plugin(path .. "/plugin.json")
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save API whitelist_ip to datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.INFO, "saved API whitelist_ip into datastore")
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "saved API values into datastore")
|
|
|
|
|
|
|
|
|
|
-- Load plugins into the datastore
|
|
|
|
|
logger:log(ngx.NOTICE, "saving plugins into datastore ...")
|
|
|
|
|
local plugins = {}
|
|
|
|
|
local plugin_paths = {"/usr/share/bunkerweb/core", "/etc/bunkerweb/plugins"}
|
|
|
|
|
for i, plugin_path in ipairs(plugin_paths) do
|
|
|
|
|
local paths = io.popen("find -L " .. plugin_path .. " -maxdepth 1 -type d ! -path " .. plugin_path)
|
|
|
|
|
for path in paths:lines() do
|
|
|
|
|
local ok, plugin = helpers.load_plugin(path .. "/plugin.json")
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, plugin)
|
|
|
|
|
else
|
|
|
|
|
local ok, err = datastore:set("plugin_" .. plugin.id, cjson.encode(plugin))
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save " .. plugin.id .. " into datastore : " .. err)
|
|
|
|
|
else
|
|
|
|
|
table.insert(plugins, plugin)
|
|
|
|
|
logger:log(ngx.NOTICE, "loaded plugin " .. plugin.id .. " v" .. plugin.version)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
local ok, err = datastore:set("plugins", cjson.encode(plugins))
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save plugins into datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
logger:log(ngx.NOTICE, "saving plugins order into datastore ...")
|
|
|
|
|
local ok, order = helpers.order_plugins(plugins)
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't compute plugins order : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
for phase, id_list in pairs(order) do
|
|
|
|
|
logger:log(ngx.NOTICE, "plugins order for phase " .. phase .. " : " .. cjson.encode(id_list))
|
|
|
|
|
end
|
|
|
|
|
local ok, err = datastore:set("plugins_order", cjson.encode(order))
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save plugins order into datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "saved plugins order into datastore")
|
|
|
|
|
|
|
|
|
|
-- Call init() method
|
|
|
|
|
logger:log(ngx.NOTICE, "calling init() methods of plugins ...")
|
|
|
|
|
for i, plugin_id in ipairs(order["init"]) do
|
|
|
|
|
-- Require call
|
|
|
|
|
local plugin_lua, err = helpers.require_plugin(plugin_id)
|
|
|
|
|
if plugin_lua == false then
|
|
|
|
|
logger:log(ngx.ERR, err)
|
|
|
|
|
elseif plugin_lua == nil then
|
|
|
|
|
logger:log(ngx.NOTICE, err)
|
|
|
|
|
logger:log(ngx.ERR, plugin)
|
|
|
|
|
else
|
|
|
|
|
-- Check if plugin has init method
|
|
|
|
|
if plugin_lua.init ~= nil then
|
|
|
|
|
-- New call
|
|
|
|
|
local ok, plugin_obj = helpers.new_plugin(plugin_lua)
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, plugin_obj)
|
|
|
|
|
else
|
|
|
|
|
local ok, ret = helpers.call_plugin(plugin_obj, "init")
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, ret)
|
|
|
|
|
elseif not ret.ret then
|
|
|
|
|
logger:log(ngx.ERR, plugin_id .. ":init() call failed : " .. ret.msg)
|
|
|
|
|
else
|
|
|
|
|
logger:log(ngx.NOTICE, plugin_id .. ":init() call successful : " .. ret.msg)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
local ok, err = datastore:set("plugin_" .. plugin.id, cjson.encode(plugin))
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save " .. plugin.id .. " into datastore : " .. err)
|
|
|
|
|
else
|
|
|
|
|
logger:log(ngx.NOTICE, "skipped execution of " .. plugin.id .. " because method init() is not defined")
|
|
|
|
|
table.insert(plugins, plugin)
|
|
|
|
|
logger:log(ngx.NOTICE, "loaded plugin " .. plugin.id .. " v" .. plugin.version)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "called init() methods of plugins")
|
|
|
|
|
|
|
|
|
|
logger:log(ngx.NOTICE, "init-stream phase ended")
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
local ok, err = datastore:set("plugins", cjson.encode(plugins))
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save plugins into datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
logger:log(ngx.NOTICE, "saving plugins order into datastore ...")
|
|
|
|
|
local ok, order = helpers.order_plugins(plugins)
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't compute plugins order : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
for phase, id_list in pairs(order) do
|
|
|
|
|
logger:log(ngx.NOTICE, "plugins order for phase " .. phase .. " : " .. cjson.encode(id_list))
|
|
|
|
|
end
|
|
|
|
|
local ok, err = datastore:set("plugins_order", cjson.encode(order))
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, "can't save plugins order into datastore : " .. err)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "saved plugins order into datastore")
|
|
|
|
|
|
|
|
|
|
-- Call init() method
|
|
|
|
|
logger:log(ngx.NOTICE, "calling init() methods of plugins ...")
|
|
|
|
|
for i, plugin_id in ipairs(order["init"]) do
|
|
|
|
|
-- Require call
|
|
|
|
|
local plugin_lua, err = helpers.require_plugin(plugin_id)
|
|
|
|
|
if plugin_lua == false then
|
|
|
|
|
logger:log(ngx.ERR, err)
|
|
|
|
|
elseif plugin_lua == nil then
|
|
|
|
|
logger:log(ngx.NOTICE, err)
|
|
|
|
|
else
|
|
|
|
|
-- Check if plugin has init method
|
|
|
|
|
if plugin_lua.init ~= nil then
|
|
|
|
|
-- New call
|
|
|
|
|
local ok, plugin_obj = helpers.new_plugin(plugin_lua)
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, plugin_obj)
|
|
|
|
|
else
|
|
|
|
|
local ok, ret = helpers.call_plugin(plugin_obj, "init")
|
|
|
|
|
if not ok then
|
|
|
|
|
logger:log(ngx.ERR, ret)
|
|
|
|
|
elseif not ret.ret then
|
|
|
|
|
logger:log(ngx.ERR, plugin_id .. ":init() call failed : " .. ret.msg)
|
|
|
|
|
else
|
|
|
|
|
logger:log(ngx.NOTICE, plugin_id .. ":init() call successful : " .. ret.msg)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
logger:log(ngx.NOTICE, "skipped execution of " .. plugin.id .. " because method init() is not defined")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
logger:log(ngx.NOTICE, "called init() methods of plugins")
|
|
|
|
|
|
|
|
|
|
logger:log(ngx.NOTICE, "init-stream phase ended")
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|