diff --git a/src/common/confs/init-lua.conf b/src/common/confs/init-lua.conf index ffd9f13aa..bdcd80529 100644 --- a/src/common/confs/init-lua.conf +++ b/src/common/confs/init-lua.conf @@ -1,164 +1,136 @@ 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" -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 phase started") --- Start init phase -local logger = clogger:new("INIT") -local datastore = cdatastore:new() -logger:log(ngx.NOTICE, "init phase started") - --- Remove previous data from the datastore -logger:log(ngx.NOTICE, "deleting old keys from datastore ...") -datastore:flush_lru() -local data_keys = {"^plugin", "^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 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") + -- Remove previous data from the datastore + logger:log(ngx.NOTICE, "deleting old keys from datastore ...") + datastore:flush_lru() + local data_keys = { "^plugin", "^misc_" } + for i, key in pairs(data_keys) do + local ok, err = datastore:delete_all(key) if not ok then - logger:log(ngx.ERR, plugin) - else - local ok, err = datastore:set("plugin_" .. plugin.id, plugin, nil, true) - 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 + logger:log(ngx.ERR, "can't delete " .. key .. " from datastore : " .. err) + return false end + logger:log(ngx.INFO, "deleted " .. key .. " from datastore") end -end -local ok, err = datastore:set("plugins", plugins, nil, true) -if not ok then - logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) - return false -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() -local all_variables = {} -for line in io.lines("/etc/nginx/variables.env") do - local variable, value = line:match("^([^=]+)=(.*)$") - all_variables[variable] = value -end -local ok, variables = helpers.load_variables(all_variables, plugins) -if not ok then - logger:log(ngx.ERR, "error while loading variables : " .. variables) - return false -end -local ok, err = datastore:set("variables", variables, nil, true) -if not ok then - logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) - return false -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 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)) --- 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") - -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", order, nil, true) -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) + -- 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_obj) + logger:log(ngx.ERR, plugin) else - local ok, ret = helpers.call_plugin(plugin_obj, "init") + local ok, err = datastore:set("plugin_" .. plugin.id, plugin, nil, true) 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) + logger:log(ngx.ERR, "can't save " .. plugin.id .. " into datastore : " .. err) else - logger:log(ngx.NOTICE, plugin_id .. ":init() call successful : " .. ret.msg) + table.insert(plugins, plugin) + logger:log(ngx.NOTICE, "loaded plugin " .. plugin.id .. " v" .. plugin.version) 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") + local ok, err = datastore:set("plugins", plugins, nil, true) + if not ok then + logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) + return false + end -logger:log(ngx.NOTICE, "init phase ended") + -- 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() + local all_variables = {} + for line in io.lines("/etc/nginx/variables.env") do + local variable, value = line:match("^([^=]+)=(.*)$") + all_variables[variable] = value + end + local ok, variables = helpers.load_variables(all_variables, plugins) + if not ok then + logger:log(ngx.ERR, "error while loading variables : " .. variables) + return false + end + local ok, err = datastore:set("variables", variables, nil, true) + if not ok then + logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) + return false + 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 + + 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", order, nil, true) + 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 phase ended") } diff --git a/src/common/confs/init-stream-lua.conf b/src/common/confs/init-stream-lua.conf index 2bad47ad2..3598f5bb1 100644 --- a/src/common/confs/init-stream-lua.conf +++ b/src/common/confs/init-stream-lua.conf @@ -1,138 +1,136 @@ 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" -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") --- 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 ...") -datastore:flush_lru() -local data_keys = {"^plugin", "^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 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") + -- Remove previous data from the datastore + logger:log(ngx.NOTICE, "deleting old keys from datastore ...") + datastore:flush_lru() + local data_keys = { "^plugin", "^misc_" } + for i, key in pairs(data_keys) do + local ok, err = datastore:delete_all(key) if not ok then - logger:log(ngx.ERR, plugin) - else - local ok, err = datastore:set("plugin_" .. plugin.id, plugin, true) - 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 + logger:log(ngx.ERR, "can't delete " .. key .. " from datastore : " .. err) + return false end + logger:log(ngx.INFO, "deleted " .. key .. " from datastore") end -end -local ok, err = datastore:set("plugins", plugins, nil, true) -if not ok then - logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) - return false -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() -local all_variables = {} -for line in io.lines("/etc/nginx/variables.env") do - local variable, value = line:match("^([^=]+)=(.*)$") - all_variables[variable] = value -end -local ok, variables = helpers.load_variables(all_variables, plugins) -if not ok then - logger:log(ngx.ERR, "error while loading variables : " .. variables) - return false -end -local ok, err = datastore:set("variables", variables, nil, true) -if not ok then - logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) - return false -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 - -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", order, nil, true) -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) + -- 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_obj) + logger:log(ngx.ERR, plugin) else - local ok, ret = helpers.call_plugin(plugin_obj, "init") + local ok, err = datastore:set("plugin_" .. plugin.id, plugin, true) 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) + logger:log(ngx.ERR, "can't save " .. plugin.id .. " into datastore : " .. err) else - logger:log(ngx.NOTICE, plugin_id .. ":init() call successful : " .. ret.msg) + table.insert(plugins, plugin) + logger:log(ngx.NOTICE, "loaded plugin " .. plugin.id .. " v" .. plugin.version) 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") + local ok, err = datastore:set("plugins", plugins, nil, true) + if not ok then + logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) + return false + end -logger:log(ngx.NOTICE, "init-stream phase ended") + -- 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() + local all_variables = {} + for line in io.lines("/etc/nginx/variables.env") do + local variable, value = line:match("^([^=]+)=(.*)$") + all_variables[variable] = value + end + local ok, variables = helpers.load_variables(all_variables, plugins) + if not ok then + logger:log(ngx.ERR, "error while loading variables : " .. variables) + return false + end + local ok, err = datastore:set("variables", variables, nil, true) + if not ok then + logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) + return false + 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 + + 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", order, nil, true) + 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") } diff --git a/src/common/confs/init-worker-lua.conf b/src/common/confs/init-worker-lua.conf index 443a74e2c..f2a3edf86 100644 --- a/src/common/confs/init-worker-lua.conf +++ b/src/common/confs/init-worker-lua.conf @@ -1,120 +1,116 @@ lua_shared_dict worker_lock 16k; init_worker_by_lua_block { + -- Our timer function + local ready_work = function(premature) + -- Libs + local helpers = require "bunkerweb.helpers" + local cjson = require "cjson" --- Our timer function -local ready_work = function(premature) + -- Instantiate objects + local logger = require "bunkerweb.logger":new("INIT-WORKER") + local datastore = require "bunkerweb.datastore":new() - -- Libs - local helpers = require "bunkerweb.helpers" - local cjson = require "cjson" - - -- Instantiate objects - local logger = require "bunkerweb.logger":new("INIT-WORKER") - local datastore = require "bunkerweb.datastore":new() - - -- Don't go further we are in loading state - local is_loading, err = require "bunkerweb.utils".get_variable("IS_LOADING", false) - if not is_loading then - logger:log(ngx.ERR, "utils.get_variable() failed : " .. err) - return - elseif is_loading == "yes" then - return - end - - -- Instantiate lock - local lock = require "resty.lock":new("worker_lock", {timeout = 10}) - if not lock then - logger:log(ngx.ERR, "lock:new() failed : " .. err) - return - end - - -- Acquire lock - local elapsed, err = lock:lock("ready") - if elapsed == nil then - logger:log(ngx.ERR, "lock:lock() failed : " .. err) - return - end - - -- Check if work is done - local ok, err = datastore:get("misc_ready") - if not ok and err ~= "not found" then - logger:log(ngx.ERR, "datastore:get() failed : " .. err) - local ok, err = lock:unlock() - if not ok then - logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + -- Don't go further we are in loading state + local is_loading, err = require "bunkerweb.utils".get_variable("IS_LOADING", false) + if not is_loading then + logger:log(ngx.ERR, "utils.get_variable() failed : " .. err) + return + elseif is_loading == "yes" then + return end - return - end - if ok then - local ok, err = lock:unlock() - if not ok then - logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + + -- Instantiate lock + local lock = require "resty.lock":new("worker_lock", { timeout = 10 }) + if not lock then + logger:log(ngx.ERR, "lock:new() failed : " .. err) + return end - return - end - logger:log(ngx.INFO, "init_worker phase started") - - -- Get plugins order - local order, err = datastore:get("plugins_order", true) - if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) - local ok, err = lock:unlock() - if not ok then - logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + -- Acquire lock + local elapsed, err = lock:lock("ready") + if elapsed == nil then + logger:log(ngx.ERR, "lock:lock() failed : " .. err) + return end - return - end - -- Call init_worker() methods - logger:log(ngx.INFO, "calling init_worker() methods of plugins ...") - for i, plugin_id in ipairs(order.init_worker) 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.INFO, err) - else - -- Check if plugin has init_worker method - if plugin_lua.init_worker ~= 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_worker") - if not ok then - logger:log(ngx.ERR, ret) - elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":init_worker() call failed : " .. ret.msg) - else - logger:log(ngx.INFO, plugin_id .. ":init_worker() call successful : " .. ret.msg) - end - end + -- Check if work is done + local ok, err = datastore:get("misc_ready") + if not ok and err ~= "not found" then + logger:log(ngx.ERR, "datastore:get() failed : " .. err) + local ok, err = lock:unlock() + if not ok then + logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + end + return + end + if ok then + local ok, err = lock:unlock() + if not ok then + logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + end + return + end + + logger:log(ngx.INFO, "init_worker phase started") + + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + local ok, err = lock:unlock() + if not ok then + logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + end + return + end + + -- Call init_worker() methods + logger:log(ngx.INFO, "calling init_worker() methods of plugins ...") + for i, plugin_id in ipairs(order.init_worker) 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.INFO, err) else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method init_worker() is not defined") + -- Check if plugin has init_worker method + if plugin_lua.init_worker ~= 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_worker") + if not ok then + logger:log(ngx.ERR, ret) + elseif not ret.ret then + logger:log(ngx.ERR, plugin_id .. ":init_worker() call failed : " .. ret.msg) + else + logger:log(ngx.INFO, plugin_id .. ":init_worker() call successful : " .. ret.msg) + end + end + else + logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method init_worker() is not defined") + end end end + logger:log(ngx.INFO, "called init_worker() methods of plugins") + + -- End + local ok, err = datastore:set("misc_ready", "ok") + if not ok then + logger:log(ngx.ERR, "datastore:set() failed : " .. err) + end + local ok, err = lock:unlock() + if not ok then + logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + end + logger:log(ngx.INFO, "init phase ended") + logger:log(ngx.NOTICE, "BunkerWeb is ready to fool hackers ! 🚀") end - logger:log(ngx.INFO, "called init_worker() methods of plugins") - - -- End - local ok, err = datastore:set("misc_ready", "ok") - if not ok then - logger:log(ngx.ERR, "datastore:set() failed : " .. err) - end - local ok, err = lock:unlock() - if not ok then - logger:log(ngx.ERR, "lock:unlock() failed : " .. err) - end - logger:log(ngx.INFO, "init phase ended") - logger:log(ngx.NOTICE, "BunkerWeb is ready to fool hackers ! 🚀") - -end - --- Start timer -ngx.timer.at(5, ready_work) + -- Start timer + ngx.timer.at(5, ready_work) } diff --git a/src/common/confs/server-http/access-lua.conf b/src/common/confs/server-http/access-lua.conf index a45f57488..8d6edc844 100644 --- a/src/common/confs/server-http/access-lua.conf +++ b/src/common/confs/server-http/access-lua.conf @@ -1,120 +1,119 @@ access_by_lua_block { + local class = require "middleclass" + local clogger = require "bunkerweb.logger" + local helpers = require "bunkerweb.helpers" + local utils = require "bunkerweb.utils" + local cdatastore = require "bunkerweb.datastore" + local cclusterstore = require "bunkerweb.clusterstore" + local cjson = require "cjson" -local class = require "middleclass" -local clogger = require "bunkerweb.logger" -local helpers = require "bunkerweb.helpers" -local utils = require "bunkerweb.utils" -local cdatastore = require "bunkerweb.datastore" -local cclusterstore = require "bunkerweb.clusterstore" -local cjson = require "cjson" - --- Don't process internal requests -local logger = clogger:new("ACCESS") -if ngx.req.is_internal() then - logger:log(ngx.INFO, "skipped access phase because request is internal") - return true -end - --- Start access phase -local datastore = cdatastore:new() -logger:log(ngx.INFO, "access phase started") - --- Fill ctx -logger:log(ngx.INFO, "filling ngx.ctx ...") -local ok, ret, errors, ctx = helpers.fill_ctx() -if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) -elseif errors then - for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + -- Don't process internal requests + local logger = clogger:new("ACCESS") + if ngx.req.is_internal() then + logger:log(ngx.INFO, "skipped access phase because request is internal") + return true end -end -logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") --- Process bans as soon as possible -if ctx.bw.is_whitelisted ~= "yes" then - local banned, reason, ttl = utils.is_banned(ctx.bw.remote_addr) - if banned == nil then - logger:log(ngx.ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) - elseif banned then - logger:log(ngx.WARN, "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") - return ngx.exit(utils.get_deny_status(ctx)) - else - logger:log(ngx.INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") - end -end + -- Start access phase + local datastore = cdatastore:new() + logger:log(ngx.INFO, "access phase started") --- Get plugins order -local order, err = datastore:get("plugins_order", true) -if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) - return -end - --- Call access() methods -logger:log(ngx.INFO, "calling access() methods of plugins ...") -local status = nil -local redirect = nil -for i, plugin_id in ipairs(order.access) 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.INFO, err) - else - -- Check if plugin has access method - if plugin_lua.access ~= nil then - -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) - if not ok then - logger:log(ngx.ERR, plugin_obj) - else - local ok, ret = helpers.call_plugin(plugin_obj, "access") - if not ok then - logger:log(ngx.ERR, ret) - elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":access() call failed : " .. ret.msg) - else - logger:log(ngx.INFO, plugin_id .. ":access() call successful : " .. ret.msg) - end - if ret.status then - if ret.status == utils.get_deny_status(ctx) then - ctx.bw.reason = plugin_id - logger:log(ngx.WARN, "denied access from " .. plugin_id .. " : " .. ret.msg) - else - logger:log(ngx.NOTICE, plugin_id .. " returned status " .. tostring(ret.status) .. " : " .. ret.msg) - end - status = ret.status - break - elseif ret.redirect then - logger:log(ngx.NOTICE, plugin_id .. " redirect to " .. ret.redirect .. " : " .. ret.msg) - redirect = ret.redirect - break - end - end - else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method access() is not defined") + -- Fill ctx + logger:log(ngx.INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = helpers.fill_ctx() + if not ok then + logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + elseif errors then + for i, error in ipairs(errors) do + logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end -end -logger:log(ngx.INFO, "called access() methods of plugins") + logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") --- Save ctx -ngx.ctx = ctx + -- Process bans as soon as possible + if ctx.bw.is_whitelisted ~= "yes" then + local banned, reason, ttl = utils.is_banned(ctx.bw.remote_addr) + if banned == nil then + logger:log(ngx.ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) + elseif banned then + logger:log(ngx.WARN, + "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") + return ngx.exit(utils.get_deny_status(ctx)) + else + logger:log(ngx.INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") + end + end -logger:log(ngx.INFO, "access phase ended") + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + return + end --- Return status if needed -if status then - return ngx.exit(status) -end + -- Call access() methods + logger:log(ngx.INFO, "calling access() methods of plugins ...") + local status = nil + local redirect = nil + for i, plugin_id in ipairs(order.access) 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.INFO, err) + else + -- Check if plugin has access method + if plugin_lua.access ~= nil then + -- New call + local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + if not ok then + logger:log(ngx.ERR, plugin_obj) + else + local ok, ret = helpers.call_plugin(plugin_obj, "access") + if not ok then + logger:log(ngx.ERR, ret) + elseif not ret.ret then + logger:log(ngx.ERR, plugin_id .. ":access() call failed : " .. ret.msg) + else + logger:log(ngx.INFO, plugin_id .. ":access() call successful : " .. ret.msg) + end + if ret.status then + if ret.status == utils.get_deny_status(ctx) then + ctx.bw.reason = plugin_id + logger:log(ngx.WARN, "denied access from " .. plugin_id .. " : " .. ret.msg) + else + logger:log(ngx.NOTICE, plugin_id .. " returned status " .. tostring(ret.status) .. " : " .. ret.msg) + end + status = ret.status + break + elseif ret.redirect then + logger:log(ngx.NOTICE, plugin_id .. " redirect to " .. ret.redirect .. " : " .. ret.msg) + redirect = ret.redirect + break + end + end + else + logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method access() is not defined") + end + end + end + logger:log(ngx.INFO, "called access() methods of plugins") --- Redirect if needed -if redirect then - return ngx.redirect(redirect) -end + -- Save ctx + ngx.ctx = ctx -return true + logger:log(ngx.INFO, "access phase ended") -} \ No newline at end of file + -- Return status if needed + if status then + return ngx.exit(status) + end + + -- Redirect if needed + if redirect then + return ngx.redirect(redirect) + end + + return true +} diff --git a/src/common/confs/server-http/header-lua.conf b/src/common/confs/server-http/header-lua.conf index 82c2c12aa..871f499fe 100644 --- a/src/common/confs/server-http/header-lua.conf +++ b/src/common/confs/server-http/header-lua.conf @@ -1,71 +1,69 @@ header_filter_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" -local class = require "middleclass" -local clogger = require "bunkerweb.logger" -local helpers = require "bunkerweb.helpers" -local cdatastore = require "bunkerweb.datastore" -local cjson = require "cjson" + -- Start set phase + local logger = clogger:new("HEADER") + local datastore = cdatastore:new() + logger:log(ngx.INFO, "header phase started") --- Start set phase -local logger = clogger:new("HEADER") -local datastore = cdatastore:new() -logger:log(ngx.INFO, "header phase started") - --- Fill ctx -logger:log(ngx.INFO, "filling ngx.ctx ...") -local ok, ret, errors, ctx = helpers.fill_ctx() -if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) -elseif errors then - for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) - end -end -logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") - --- Get plugins order -local order, err = datastore:get("plugins_order", true) -if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) - return -end - --- Call header() methods -logger:log(ngx.INFO, "calling header() methods of plugins ...") -for i, plugin_id in ipairs(order.header) 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.INFO, err) - else - -- Check if plugin has header method - if plugin_lua.header ~= nil then - -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) - if not ok then - logger:log(ngx.ERR, plugin_obj) - else - local ok, ret = helpers.call_plugin(plugin_obj, "header") - if not ok then - logger:log(ngx.ERR, ret) - elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":header() call failed : " .. ret.msg) - else - logger:log(ngx.INFO, plugin_id .. ":header() call successful : " .. ret.msg) - end - end - else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method header() is not defined") + -- Fill ctx + logger:log(ngx.INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = helpers.fill_ctx() + if not ok then + logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + elseif errors then + for i, error in ipairs(errors) do + logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end -end -logger:log(ngx.INFO, "called header() methods of plugins") + logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") --- Save ctx -ngx.ctx = ctx + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + return + end -return true + -- Call header() methods + logger:log(ngx.INFO, "calling header() methods of plugins ...") + for i, plugin_id in ipairs(order.header) 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.INFO, err) + else + -- Check if plugin has header method + if plugin_lua.header ~= nil then + -- New call + local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + if not ok then + logger:log(ngx.ERR, plugin_obj) + else + local ok, ret = helpers.call_plugin(plugin_obj, "header") + if not ok then + logger:log(ngx.ERR, ret) + elseif not ret.ret then + logger:log(ngx.ERR, plugin_id .. ":header() call failed : " .. ret.msg) + else + logger:log(ngx.INFO, plugin_id .. ":header() call successful : " .. ret.msg) + end + end + else + logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method header() is not defined") + end + end + end + logger:log(ngx.INFO, "called header() methods of plugins") -} \ No newline at end of file + -- Save ctx + ngx.ctx = ctx + + return true +} diff --git a/src/common/confs/server-http/log-lua.conf b/src/common/confs/server-http/log-lua.conf index 67d6f57a0..29ec7d702 100644 --- a/src/common/confs/server-http/log-lua.conf +++ b/src/common/confs/server-http/log-lua.conf @@ -1,76 +1,74 @@ log_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" -local class = require "middleclass" -local clogger = require "bunkerweb.logger" -local helpers = require "bunkerweb.helpers" -local cdatastore = require "bunkerweb.datastore" -local cjson = require "cjson" + -- Start log phase + local logger = clogger:new("LOG") + local datastore = cdatastore:new() + logger:log(ngx.INFO, "log phase started") --- Start log phase -local logger = clogger:new("LOG") -local datastore = cdatastore:new() -logger:log(ngx.INFO, "log phase started") - --- Fill ctx -logger:log(ngx.INFO, "filling ngx.ctx ...") -local ok, ret, errors, ctx = helpers.fill_ctx() -if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) -elseif errors then - for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) - end -end -logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") - --- Get plugins order -local order, err = datastore:get("plugins_order", true) -if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) - return -end - --- Call log() methods -logger:log(ngx.INFO, "calling log() methods of plugins ...") -for i, plugin_id in ipairs(order.log) 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.INFO, err) - else - -- Check if plugin has log method - if plugin_lua.log ~= nil then - -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) - if not ok then - logger:log(ngx.ERR, plugin_obj) - else - local ok, ret = helpers.call_plugin(plugin_obj, "log") - if not ok then - logger:log(ngx.ERR, ret) - elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":log() call failed : " .. ret.msg) - else - logger:log(ngx.INFO, plugin_id .. ":log() call successful : " .. ret.msg) - end - end - else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method log() is not defined") + -- Fill ctx + logger:log(ngx.INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = helpers.fill_ctx() + if not ok then + logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + elseif errors then + for i, error in ipairs(errors) do + logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end -end -logger:log(ngx.INFO, "called log() methods of plugins") + logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") --- Display reason at info level -if ctx.reason then - logger:log(ngx.INFO, "client was denied with reason : " .. ctx.reason) -end + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + return + end --- Save ctx -ngx.ctx = ctx + -- Call log() methods + logger:log(ngx.INFO, "calling log() methods of plugins ...") + for i, plugin_id in ipairs(order.log) 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.INFO, err) + else + -- Check if plugin has log method + if plugin_lua.log ~= nil then + -- New call + local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + if not ok then + logger:log(ngx.ERR, plugin_obj) + else + local ok, ret = helpers.call_plugin(plugin_obj, "log") + if not ok then + logger:log(ngx.ERR, ret) + elseif not ret.ret then + logger:log(ngx.ERR, plugin_id .. ":log() call failed : " .. ret.msg) + else + logger:log(ngx.INFO, plugin_id .. ":log() call successful : " .. ret.msg) + end + end + else + logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method log() is not defined") + end + end + end + logger:log(ngx.INFO, "called log() methods of plugins") -logger:log(ngx.INFO, "log phase ended") + -- Display reason at info level + if ctx.reason then + logger:log(ngx.INFO, "client was denied with reason : " .. ctx.reason) + end + -- Save ctx + ngx.ctx = ctx + + logger:log(ngx.INFO, "log phase ended") } \ No newline at end of file diff --git a/src/common/confs/server-http/set-lua.conf b/src/common/confs/server-http/set-lua.conf index 0a0a61754..b09953ec4 100644 --- a/src/common/confs/server-http/set-lua.conf +++ b/src/common/confs/server-http/set-lua.conf @@ -1,86 +1,84 @@ set $dummy_set ""; set_by_lua_block $dummy_set { + local class = require "middleclass" + local clogger = require "bunkerweb.logger" + local helpers = require "bunkerweb.helpers" + local cdatastore = require "bunkerweb.datastore" + local ccachestore = require "bunkerweb.cachestore" + local cjson = require "cjson" -local class = require "middleclass" -local clogger = require "bunkerweb.logger" -local helpers = require "bunkerweb.helpers" -local cdatastore = require "bunkerweb.datastore" -local ccachestore = require "bunkerweb.cachestore" -local cjson = require "cjson" - --- Don't process internal requests -local logger = clogger:new("SET") -if ngx.req.is_internal() then - logger:log(ngx.INFO, "skipped set phase because request is internal") - return true -end - --- Start set phase -local datastore = cdatastore:new() -logger:log(ngx.INFO, "set phase started") - --- Update cachestore only once and before any other code -local cachestore = ccachestore:new() -local ok, err = cachestore.cache:update() -if not ok then - logger:log(ngx.ERR, "can't update cachestore : " .. err) -end - --- Fill ctx -logger:log(ngx.INFO, "filling ngx.ctx ...") -local ok, ret, errors, ctx = helpers.fill_ctx() -if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) -elseif errors then - for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + -- Don't process internal requests + local logger = clogger:new("SET") + if ngx.req.is_internal() then + logger:log(ngx.INFO, "skipped set phase because request is internal") + return true end -end -logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") --- Get plugins order -local order, err = datastore:get("plugins_order", true) -if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) - return -end + -- Start set phase + local datastore = cdatastore:new() + logger:log(ngx.INFO, "set phase started") --- Call set() methods -logger:log(ngx.INFO, "calling set() methods of plugins ...") -for i, plugin_id in ipairs(order.set) 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.INFO, err) - else - -- Check if plugin has set method - if plugin_lua.set ~= nil then - -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) - if not ok then - logger:log(ngx.ERR, plugin_obj) - else - local ok, ret = helpers.call_plugin(plugin_obj, "set") - if not ok then - logger:log(ngx.ERR, ret) - elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":set() call failed : " .. ret.msg) - else - logger:log(ngx.INFO, plugin_id .. ":set() call successful : " .. ret.msg) - end - end - else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method set() is not defined") + -- Update cachestore only once and before any other code + local cachestore = ccachestore:new() + local ok, err = cachestore.cache:update() + if not ok then + logger:log(ngx.ERR, "can't update cachestore : " .. err) + end + + -- Fill ctx + logger:log(ngx.INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = helpers.fill_ctx() + if not ok then + logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + elseif errors then + for i, error in ipairs(errors) do + logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end -end -logger:log(ngx.INFO, "called set() methods of plugins") + logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") --- Save ctx -ngx.ctx = ctx + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + return + end -return true + -- Call set() methods + logger:log(ngx.INFO, "calling set() methods of plugins ...") + for i, plugin_id in ipairs(order.set) 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.INFO, err) + else + -- Check if plugin has set method + if plugin_lua.set ~= nil then + -- New call + local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + if not ok then + logger:log(ngx.ERR, plugin_obj) + else + local ok, ret = helpers.call_plugin(plugin_obj, "set") + if not ok then + logger:log(ngx.ERR, ret) + elseif not ret.ret then + logger:log(ngx.ERR, plugin_id .. ":set() call failed : " .. ret.msg) + else + logger:log(ngx.INFO, plugin_id .. ":set() call successful : " .. ret.msg) + end + end + else + logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method set() is not defined") + end + end + end + logger:log(ngx.INFO, "called set() methods of plugins") -} \ No newline at end of file + -- Save ctx + ngx.ctx = ctx + + return true +} diff --git a/src/common/confs/server-stream/log-stream-lua.conf b/src/common/confs/server-stream/log-stream-lua.conf index 1a3b8818f..73d434dc3 100644 --- a/src/common/confs/server-stream/log-stream-lua.conf +++ b/src/common/confs/server-stream/log-stream-lua.conf @@ -1,76 +1,74 @@ log_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" -local class = require "middleclass" -local clogger = require "bunkerweb.logger" -local helpers = require "bunkerweb.helpers" -local cdatastore = require "bunkerweb.datastore" -local cjson = require "cjson" + -- Start log phase + local logger = clogger:new("LOG") + local datastore = cdatastore:new() + logger:log(ngx.INFO, "log phase started") --- Start log phase -local logger = clogger:new("LOG") -local datastore = cdatastore:new() -logger:log(ngx.INFO, "log phase started") - --- Fill ctx -logger:log(ngx.INFO, "filling ngx.ctx ...") -local ok, ret, errors, ctx = helpers.fill_ctx() -if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) -elseif errors then - for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) - end -end -logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") - --- Get plugins order -local order, err = datastore:get("plugins_order", true) -if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) - return -end - --- Call log_stream() methods -logger:log(ngx.INFO, "calling log_stream() methods of plugins ...") -for i, plugin_id in ipairs(order.log_stream) 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.INFO, err) - else - -- Check if plugin has log_stream method - if plugin_lua.log_stream ~= nil then - -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) - if not ok then - logger:log(ngx.ERR, plugin_obj) - else - local ok, ret = helpers.call_plugin(plugin_obj, "log_stream") - if not ok then - logger:log(ngx.ERR, ret) - elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":log_stream() call failed : " .. ret.msg) - else - logger:log(ngx.INFO, plugin_id .. ":log_stream() call successful : " .. ret.msg) - end - end - else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method log_stream() is not defined") + -- Fill ctx + logger:log(ngx.INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = helpers.fill_ctx() + if not ok then + logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + elseif errors then + for i, error in ipairs(errors) do + logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end -end -logger:log(ngx.INFO, "called log_stream() methods of plugins") + logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") --- Display reason at info level -if ctx.reason then - logger:log(ngx.INFO, "client was denied with reason : " .. ctx.reason) -end + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + return + end --- Save ctx -ngx.ctx = ctx + -- Call log_stream() methods + logger:log(ngx.INFO, "calling log_stream() methods of plugins ...") + for i, plugin_id in ipairs(order.log_stream) 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.INFO, err) + else + -- Check if plugin has log_stream method + if plugin_lua.log_stream ~= nil then + -- New call + local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + if not ok then + logger:log(ngx.ERR, plugin_obj) + else + local ok, ret = helpers.call_plugin(plugin_obj, "log_stream") + if not ok then + logger:log(ngx.ERR, ret) + elseif not ret.ret then + logger:log(ngx.ERR, plugin_id .. ":log_stream() call failed : " .. ret.msg) + else + logger:log(ngx.INFO, plugin_id .. ":log_stream() call successful : " .. ret.msg) + end + end + else + logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method log_stream() is not defined") + end + end + end + logger:log(ngx.INFO, "called log_stream() methods of plugins") -logger:log(ngx.INFO, "log phase ended") + -- Display reason at info level + if ctx.reason then + logger:log(ngx.INFO, "client was denied with reason : " .. ctx.reason) + end -} \ No newline at end of file + -- Save ctx + ngx.ctx = ctx + + logger:log(ngx.INFO, "log phase ended") +} diff --git a/src/common/confs/server-stream/preread-stream-lua.conf b/src/common/confs/server-stream/preread-stream-lua.conf index 26090595c..9337845f8 100644 --- a/src/common/confs/server-stream/preread-stream-lua.conf +++ b/src/common/confs/server-stream/preread-stream-lua.conf @@ -1,104 +1,104 @@ preread_by_lua_block { -ngx.ctx -local class = require "middleclass" -local clogger = require "bunkerweb.logger" -local helpers = require "bunkerweb.helpers" -local utils = require "bunkerweb.utils" -local cdatastore = require "bunkerweb.datastore" -local cclusterstore = require "bunkerweb.clusterstore" -local cjson = require "cjson" + ngx.ctx + local class = require "middleclass" + local clogger = require "bunkerweb.logger" + local helpers = require "bunkerweb.helpers" + local utils = require "bunkerweb.utils" + local cdatastore = require "bunkerweb.datastore" + local cclusterstore = require "bunkerweb.clusterstore" + local cjson = require "cjson" --- Start preread phase -local logger = clogger:new("PREREAD") -local datastore = cdatastore:new() -logger:log(ngx.INFO, "preread phase started") + -- Start preread phase + local logger = clogger:new("PREREAD") + local datastore = cdatastore:new() + logger:log(ngx.INFO, "preread phase started") --- Fill ctx -logger:log(ngx.INFO, "filling ngx.ctx ...") -local ok, ret, errors, ctx = helpers.fill_ctx() -if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) -elseif errors then - for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) - end -end -logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") - --- Process bans as soon as possible -if ctx.bw.is_whitelisted ~= "yes" then - local banned, reason, ttl = utils.is_banned(ctx.bw.remote_addr) - if banned == nil then - logger:log(ngx.ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) - elseif banned then - logger:log(ngx.WARN, "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") - return ngx.exit(utils.get_deny_status()) - else - logger:log(ngx.INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") - end -end - --- Get plugins order -local order, err = datastore:get("plugins_order", true) -if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) - return -end - --- Call preread() methods -logger:log(ngx.INFO, "calling preread() methods of plugins ...") -local status = nil -for i, plugin_id in ipairs(order.preread) 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.INFO, err) - else - -- Check if plugin has preread method - if plugin_lua.preread ~= nil then - -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) - if not ok then - logger:log(ngx.ERR, plugin_obj) - else - local ok, ret = helpers.call_plugin(plugin_obj, "preread") - if not ok then - logger:log(ngx.ERR, ret) - elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":preread() call failed : " .. ret.msg) - else - logger:log(ngx.INFO, plugin_id .. ":preread() call successful : " .. ret.msg) - end - if ret.status then - if ret.status == utils.get_deny_status(ctx) then - ctx.bw.reason = plugin_id - logger:log(ngx.WARN, "denied preread from " .. plugin_id .. " : " .. ret.msg) - else - logger:log(ngx.NOTICE, plugin_id .. " returned status " .. tostring(ret.status) .. " : " .. ret.msg) - end - status = ret.status - break - end - end - else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method preread() is not defined") + -- Fill ctx + logger:log(ngx.INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = helpers.fill_ctx() + if not ok then + logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + elseif errors then + for i, error in ipairs(errors) do + logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end -end -logger:log(ngx.INFO, "called preread() methods of plugins") + logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") --- Save ctx -ngx.ctx = ctx + -- Process bans as soon as possible + if ctx.bw.is_whitelisted ~= "yes" then + local banned, reason, ttl = utils.is_banned(ctx.bw.remote_addr) + if banned == nil then + logger:log(ngx.ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) + elseif banned then + logger:log(ngx.WARN, + "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") + return ngx.exit(utils.get_deny_status()) + else + logger:log(ngx.INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") + end + end -logger:log(ngx.INFO, "preread phase ended") + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + return + end --- Return status if needed -if status then - return ngx.exit(status) -end + -- Call preread() methods + logger:log(ngx.INFO, "calling preread() methods of plugins ...") + local status = nil + for i, plugin_id in ipairs(order.preread) 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.INFO, err) + else + -- Check if plugin has preread method + if plugin_lua.preread ~= nil then + -- New call + local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + if not ok then + logger:log(ngx.ERR, plugin_obj) + else + local ok, ret = helpers.call_plugin(plugin_obj, "preread") + if not ok then + logger:log(ngx.ERR, ret) + elseif not ret.ret then + logger:log(ngx.ERR, plugin_id .. ":preread() call failed : " .. ret.msg) + else + logger:log(ngx.INFO, plugin_id .. ":preread() call successful : " .. ret.msg) + end + if ret.status then + if ret.status == utils.get_deny_status(ctx) then + ctx.bw.reason = plugin_id + logger:log(ngx.WARN, "denied preread from " .. plugin_id .. " : " .. ret.msg) + else + logger:log(ngx.NOTICE, plugin_id .. " returned status " .. tostring(ret.status) .. " : " .. ret.msg) + end + status = ret.status + break + end + end + else + logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method preread() is not defined") + end + end + end + logger:log(ngx.INFO, "called preread() methods of plugins") -return true + -- Save ctx + ngx.ctx = ctx -} \ No newline at end of file + logger:log(ngx.INFO, "preread phase ended") + + -- Return status if needed + if status then + return ngx.exit(status) + end + + return true +}