Created
January 8, 2017 18:34
-
-
Save titpetric/2f142e89eaa0f36ba4e4383b16d61474 to your computer and use it in GitHub Desktop.
Delete NGINX cached items with a PURGE with wildcard support
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Tit Petric, Monotek d.o.o., Tue 03 Jan 2017 06:54:56 PM CET | |
-- | |
-- Delete nginx cached assets with a PURGE request against an endpoint | |
-- supports extended regular expression PURGE requests (/upload/.*) | |
-- | |
function file_exists(name) | |
local f = io.open(name, "r") | |
if f~=nil then io.close(f) return true else return false end | |
end | |
function explode(d, p) | |
local t, ll | |
t={} | |
ll=0 | |
if(#p == 1) then return {p} end | |
while true do | |
l=string.find(p, d, ll, true) -- find the next d in the string | |
if l~=nil then -- if "not not" found then.. | |
table.insert(t, string.sub(p, ll, l-1)) -- Save it in our array. | |
ll=l+1 -- save just after where we found it for searching next time. | |
else | |
table.insert(t, string.sub(p, ll)) -- Save what's left in our array. | |
break -- Break at end, as it should be, according to the lua manual. | |
end | |
end | |
return t | |
end | |
function purge(filename) | |
if (file_exists(filename)) then | |
os.remove(filename) | |
end | |
end | |
function trim(s) | |
return (string.gsub(s, "^%s*(.-)%s*$", "%1")) | |
end | |
function exec(cmd) | |
local handle = io.popen(cmd) | |
local result = handle:read("*all") | |
handle:close() | |
return trim(result) | |
end | |
function list_files(cache_path, purge_upstream, purge_pattern) | |
local result = exec("/usr/bin/find " .. cache_path .. " -type f | /usr/bin/xargs --no-run-if-empty -n1000 /bin/grep -El -m 1 '^KEY: " .. purge_upstream .. purge_pattern .. "' 2>&1") | |
if result == "" then | |
return {} | |
end | |
return explode("\n", result) | |
end | |
if ngx ~= nil then | |
-- list all cached items matching upstream+request_uri (extended regex) | |
local files = list_files(ngx.var.lua_purge_path, ngx.var.lua_purge_upstream, ngx.var.request_uri) | |
ngx.header["Content-type"] = "text/plain; charset=utf-8" | |
ngx.header["X-Purged-Count"] = table.getn(files) | |
for k, v in pairs(files) do | |
purge(v) | |
end | |
ngx.say("OK") | |
ngx.exit(ngx.OK) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment