bw - add init_workers phase to support incoming features

This commit is contained in:
fl0ppy-d1sk 2024-02-29 17:33:49 +01:00
parent 375b31e84c
commit 5f097741eb
No known key found for this signature in database
GPG key ID: 93EE47CC3D061500
3 changed files with 83 additions and 4 deletions

View file

@ -787,6 +787,7 @@ utils.get_phases = function()
"log_stream",
"log_default",
"timer",
"init_workers"
}
end

View file

@ -1,8 +1,84 @@
lua_shared_dict worker_lock 16k;
init_worker_by_lua_block {
-- Libs
local helpers = require "bunkerweb.helpers"
local utils = require "bunkerweb.utils"
local ngx = ngx
local ERR = ngx.ERR
local INFO = ngx.INFO
local worker = ngx.worker
local worker_id = worker.id
local worker_pid = worker.pid
local timer_at = ngx.timer.at
local require_plugin = helpers.require_plugin
local new_plugin = helpers.new_plugin
local call_plugin = helpers.call_plugin
local get_variable = utils.get_variable
local tostring = tostring
local time = os.time
local randomseed = math.randomseed
-- Instantiate objects
local logger = require "bunkerweb.logger":new("INIT-WORKERS-" .. tostring(worker_id()))
local datastore = require "bunkerweb.datastore":new()
-- Random seed
math.randomseed(os.time() + ngx.worker.pid())
randomseed(time() + worker_pid())
-- Don't go further we are in loading state
local is_loading, err = get_variable("IS_LOADING", false)
if not is_loading then
logger:log(ERR, "utils.get_variable() failed : " .. err)
return
elseif is_loading == "yes" then
return
end
logger:log(INFO, "init_workers phase started")
-- Get plugins order
local order, err = datastore:get("plugins_order", true)
if not order then
logger:log(ERR, "can't get plugins order from datastore : " .. err)
return
end
-- Call init_workers() methods
logger:log(INFO, "calling init_workers() methods of plugins ...")
for i, plugin_id in ipairs(order.init_workers) do
-- Require call
local plugin_lua, err = require_plugin(plugin_id)
if plugin_lua == false then
logger:log(ERR, err)
elseif plugin_lua == nil then
logger:log(INFO, err)
else
-- Check if plugin has init_worker method
if plugin_lua.init_workers ~= nil then
-- New call
local ok, plugin_obj = new_plugin(plugin_lua)
if not ok then
logger:log(ERR, plugin_obj)
else
local ok, ret = call_plugin(plugin_obj, "init_workers")
if not ok then
logger:log(ERR, ret)
elseif not ret.ret then
logger:log(ERR, plugin_id .. ":init_workers() call failed : " .. ret.msg)
else
logger:log(INFO, plugin_id .. ":init_workers() call successful : " .. ret.msg)
end
end
else
logger:log(INFO, "skipped execution of " .. plugin_id .. " because method init_workers() is not defined")
end
end
end
logger:log(INFO, "called init_workers() methods of plugins")
-- End
logger:log(INFO, "init_workers phase ended")
-- Our timer function
local ready_work = function(premature)
@ -26,9 +102,10 @@ init_worker_by_lua_block {
local new_plugin = helpers.new_plugin
local call_plugin = helpers.call_plugin
local tostring = tostring
local get_variable = utils.get_variable
-- Don't go further we are in loading state
local is_loading, err = utils.get_variable("IS_LOADING", false)
local is_loading, err = get_variable("IS_LOADING", false)
if not is_loading then
logger:log(ERR, "utils.get_variable() failed : " .. err)
return
@ -194,5 +271,5 @@ init_worker_by_lua_block {
end
-- Start timer
ngx.timer.at(5, ready_work)
timer_at(5, ready_work)
}

View file

@ -43,5 +43,6 @@
],
"log_stream": ["badbehavior", "bunkernet"],
"log_default": ["badbehavior", "bunkernet", "errors", "misc", "metrics"],
"timer": ["metrics"]
"timer": ["metrics"],
"init_workers": []
}