ingress-nginx-helm/rootfs/etc/nginx/lua/plugins.lua

56 lines
1.4 KiB
Lua
Raw Normal View History

local require = require
local ngx = ngx
local pairs = pairs
local ipairs = ipairs
2019-02-25 02:32:17 +00:00
local string_format = string.format
local new_tab = require "table.new"
local ngx_log = ngx.log
local INFO = ngx.INFO
local ERR = ngx.ERR
local pcall = pcall
2019-02-25 02:32:17 +00:00
local _M = {}
local MAX_NUMBER_OF_PLUGINS = 10000
-- TODO: is this good for a dictionary?
local plugins = new_tab(MAX_NUMBER_OF_PLUGINS, 0)
local function load_plugin(name)
local path = string_format("plugins.%s.main", name)
local ok, plugin = pcall(require, path)
if not ok then
ngx_log(ERR, string_format("error loading plugin \"%s\": %s", path, plugin))
return
end
plugins[name] = plugin
end
function _M.init(names)
for _, name in ipairs(names) do
load_plugin(name)
end
end
function _M.run()
local phase = ngx.get_phase()
for name, plugin in pairs(plugins) do
if plugin[phase] then
ngx_log(INFO, string_format("running plugin \"%s\" in phase \"%s\"", name, phase))
-- TODO: consider sandboxing this, should we?
-- probably yes, at least prohibit plugin from accessing env vars etc
-- but since the plugins are going to be installed by ingress-nginx
-- operator they can be assumed to be safe also
2019-02-25 02:32:17 +00:00
local ok, err = pcall(plugin[phase])
if not ok then
ngx_log(ERR, string_format("error while running plugin \"%s\" in phase \"%s\": %s",
name, phase, err))
2019-02-25 02:32:17 +00:00
end
end
end
end
return _M