--[[ This is an output filter for HTML files It adds a banner for projects that are flagged as in the attic. It is invoked by the tlp vhosts if the following directory exists: /var/www/attic.apache.org/flagged/%{HTTP_HOST} See the tlp vhost definitions in https://github.com/apache/infrastructure-p6/blob/production/data/roles/tlpserver.yaml The mod_lua API is described here: https://httpd.apache.org/docs/current/mod/mod_lua.html#modifying_buckets How it works: For simplicity, we add the banner to the start of the page. This is not really valid HTML, but seems to work in most cases, and avoids having to find a better place to insert it. It does not work for some hosts, especially those that have a static menu bar with scrolling content. In such cases, the code looks for a specific tag (which should only occur once in any of the site pages, otherwise two banners may be added) and adds the banner either before or after it. The best location for this is found by trial and error: - download a copy of a page - move the banner from the start of the page (where it is added by default) and try it in various other parts of the page. - try the same in some other pages that have a different layout. - repeat until a suitable location is found and find a tag or other string that uniquely identifies it - add the host-specific processing to the filter along the lines of the existing host exceptions Note: This filter was introduced in April 2018, so not all projects in the Attic use this filter. Previously the project websites themselves were changed. ]]-- function output_filter(r) -- We only filter text/html types if not r.content_type:match("text/html") then return end -- get TLP part of hostname local host = r.hostname:match("^([^.]+)") -- create the customised banner local divstyle = 'font-size:x-large;padding:15px;color:white;background:red;z-index:99;' ; local astyle = 'color:white;text-decoration:underline' ; local div = ([[
This project has retired. For details please refer to its Attic page.
]]):format(divstyle, astyle, host) -- add header: -- special processing needed for some hosts if host == 'predictionio' or host == 'eagle' or host == 'metamodel' or host == 'mxnet' then coroutine.yield('') else coroutine.yield(div) end -- spit out the actual page while bucket ~= nil do -- special processing needed for hosts as above if host == 'predictionio' then local output = bucket:gsub('
', '
'..div, 1) coroutine.yield(output) elseif host == 'mxnet' then local output = bucket:gsub('
', div..'
', 1) coroutine.yield(output) elseif host == 'eagle' then local output = bucket:gsub('', ''..div, 1) coroutine.yield(output) elseif host == 'metamodel' then local output = bucket:gsub('', div..'', 1) coroutine.yield(output) else coroutine.yield(bucket) end end -- no need to add anything at the end of the content end