mirror of
https://github.com/bunkerity/bunkerized-nginx
synced 2023-12-13 21:30:18 +01:00
118 lines
3.7 KiB
Text
118 lines
3.7 KiB
Text
init_by_lua_block {
|
|
|
|
local logger = require "logger"
|
|
local datastore = require "datastore"
|
|
local plugins = require "plugins"
|
|
local utils = require "utils"
|
|
local cjson = require "cjson"
|
|
|
|
logger.log(ngx.NOTICE, "INIT", "Init phase started")
|
|
|
|
-- Remove previous data from the 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, "INIT", "Can't delete " .. key .. " from datastore : " .. err)
|
|
return false
|
|
end
|
|
logger.log(ngx.INFO, "INIT", "Deleted " .. key .. " from datastore")
|
|
end
|
|
|
|
-- Load variables into the datastore
|
|
local file = io.open("/etc/nginx/variables.env")
|
|
if not file then
|
|
logger.log(ngx.ERR, "INIT", "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("(.+)=(.*)")
|
|
ok, err = datastore:set("variable_" .. variable, value)
|
|
if not ok then
|
|
logger.log(ngx.ERR, "INIT", "Can't save variable " .. variable .. " into datastore")
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- Set default values into the datastore
|
|
ok, err = datastore:set("plugins", cjson.encode({}))
|
|
if not ok then
|
|
logger.log(ngx.ERR, "INIT", "Can't set default value for plugins into the datastore : " .. err)
|
|
return false
|
|
end
|
|
ok, err = utils.set_values()
|
|
if not ok then
|
|
logger.log(ngx.ERR, "INIT", "Error while setting default values : " .. err)
|
|
return false
|
|
end
|
|
|
|
-- API setup
|
|
local value, err = datastore:get("variable_USE_API")
|
|
if not value then
|
|
logger.log(ngx.ERR, "INIT", "Can't get variable USE_API from the datastore")
|
|
return false
|
|
end
|
|
if value == "yes" then
|
|
value, err = datastore:get("variable_API_WHITELIST_IP")
|
|
if not value then
|
|
logger.log(ngx.ERR, "INIT", "Can't get variable API_WHITELIST_IP from the datastore")
|
|
return false
|
|
end
|
|
local whitelists = { data = {}}
|
|
for whitelist in value:gmatch("%S+") do
|
|
table.insert(whitelists.data, whitelist)
|
|
end
|
|
ok, err = datastore:set("api_whitelist_ip", cjson.encode(whitelists))
|
|
if not ok then
|
|
logger.log(ngx.ERR, "INIT", "Can't save api_whitelist_ip to datastore : " .. err)
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- Load plugins into the datastore
|
|
local plugin_paths = {"/opt/bunkerweb/core", "/opt/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
|
|
plugin, err = plugins:load(path)
|
|
if not plugin then
|
|
logger.log(ngx.ERR, "INIT", "Error while loading plugin from " .. path .. " : " .. err)
|
|
return false
|
|
end
|
|
logger.log(ngx.NOTICE, "INIT", "Loaded plugin " .. plugin.id .. " v" .. plugin.version)
|
|
end
|
|
end
|
|
|
|
-- Call init method of plugins
|
|
local list, err = plugins:list()
|
|
if not list then
|
|
logger.log(ngx.ERR, "INIT", "Can't list loaded plugins : " .. err)
|
|
list = {}
|
|
end
|
|
for i, plugin in ipairs(list) do
|
|
local ret, plugin_lua = pcall(require, plugin.id .. "/" .. plugin.id)
|
|
if ret then
|
|
local plugin_obj = plugin_lua.new()
|
|
if plugin_obj.init ~= nil then
|
|
ok, err = plugin_obj:init()
|
|
if not ok then
|
|
logger.log(ngx.ERR, "INIT", "Plugin " .. plugin.id .. " failed on init() : " .. err)
|
|
else
|
|
logger.log(ngx.INFO, "INIT", "Successfull init() call for plugin " .. plugin.id .. " : " .. err)
|
|
end
|
|
else
|
|
logger.log(ngx.INFO, "INIT", "init() method not found in " .. plugin.id .. ", skipped execution")
|
|
end
|
|
else
|
|
if plugin_lua:match("not found") then
|
|
logger.log(ngx.INFO, "INIT", "can't require " .. plugin.id .. " : not found")
|
|
else
|
|
logger.log(ngx.ERR, "INIT", "can't require " .. plugin.id .. " : " .. plugin_lua)
|
|
end
|
|
end
|
|
end
|
|
|
|
logger.log(ngx.NOTICE, "INIT", "Init phase ended")
|
|
|
|
}
|