appactive-gateway/nginx-plugin/etc/nginx/conf/lua/util/rule_checker.lua (85 lines of code) (raw):

local _M = {} _M._VERSION = '1.0' local cjson = require("cjson.safe") local sourceParser = require("util.source_parser") local tokenParser = require("util.token_parser") local ruleParser = require("util.rule_parser") local function doParseNewRule(ruleRawTable) local ruleParsed = { idSource = nil, idTransformer = nil, idUnitMapping = nil, } if ruleRawTable["idSource"] ~= nil then local idSource = sourceParser.doParseSource(ruleRawTable["idSource"]) if idSource == nil then ngx.log(ngx.ERR, "[check] token source error") return nil end ruleParsed.idSource = idSource else return nil end if ruleRawTable["idTransformer"] ~= nil then local idTransformer = tokenParser.doParseTransformer(ruleRawTable["idTransformer"]) if idTransformer == nil then ngx.log(ngx.ERR, "[check] token define error") return nil end ruleParsed.idTransformer = idTransformer else return nil end if ruleRawTable["idUnitMapping"] ~= nil then local idUnitMapping = ruleParser.doParseMapping(ruleRawTable["idUnitMapping"]) if idUnitMapping == nil then ngx.log(ngx.ERR, "[check] current rule error") return nil end ruleParsed.idUnitMapping = idUnitMapping else return nil end return ruleParsed end local function doParseRule(ruleRaw) local ruleParsed = {} local ruleDecoded = cjson.decode(ruleRaw) if ruleDecoded == nil then ngx.log(ngx.ERR, "[check] rule decode error") return nil end ruleParsed = doParseNewRule(ruleDecoded) if ruleParsed == nil then ngx.log(ngx.ERR, "[check] rule parse error") return nil end return ruleParsed end function _M.doCheckRule(ruleRawVersion, ruleKey, ruleRaw) if ruleRaw == "{}" then ngx.log(ngx.WARN, "[check] clean rule cache") package.loaded[ruleKey] = nil return nil end local ruleOldParsed = package.loaded[ruleKey] if ruleRaw == nil then return ruleOldParsed end if ruleOldParsed and ruleRawVersion ~= nil and ruleOldParsed.version == ruleRawVersion then return ruleOldParsed else ngx.log(ngx.INFO, "[check] using new rule:".. ruleKey) ruleRaw = string.gsub(ruleRaw, "%s", "") local ruleNewParsed = doParseRule(ruleRaw) if ruleNewParsed then ngx.log(ngx.WARN, "[check] parsed new rule") ruleNewParsed.version = ruleRawVersion package.loaded[ruleKey] = ruleNewParsed return ruleNewParsed else return ruleOldParsed end end end return _M