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") }