From 5014544e8f1bc2fea5be383a60904bd5b1ee9d16 Mon Sep 17 00:00:00 2001 From: onefang Date: Wed, 6 Nov 2019 16:26:01 +1000 Subject: Add a web page output generator. --- apt-panopticon-report-web.lua | 200 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100755 apt-panopticon-report-web.lua diff --git a/apt-panopticon-report-web.lua b/apt-panopticon-report-web.lua new file mode 100755 index 0000000..ece9e09 --- /dev/null +++ b/apt-panopticon-report-web.lua @@ -0,0 +1,200 @@ +#!/usr/bin/env luajit + +local args = {...} + +verbosity = -1 +local logFile + + +--[[ Ordered table iterator, allow to iterate on the natural order of the keys of a table. + From http://lua-users.org/wiki/SortedIteration + ]] +function __genOrderedIndex( t ) + local orderedIndex = {} + for key in pairs(t) do + table.insert( orderedIndex, key ) + end + table.sort( orderedIndex ) + return orderedIndex +end +function orderedNext(t, state) + -- Equivalent of the next function, but returns the keys in the alphabetic + -- order. We use a temporary ordered key table that is stored in the + -- table being iterated. + + local key = nil + --print("orderedNext: state = "..tostring(state) ) + if state == nil then + -- the first time, generate the index + t.__orderedIndex = __genOrderedIndex( t ) + key = t.__orderedIndex[1] + else + -- fetch the next value + for i = 1,table.getn(t.__orderedIndex) do + if t.__orderedIndex[i] == state then + key = t.__orderedIndex[i+1] + end + end + end + + if key then + return key, t[key] + end + + -- no more value to return, cleanup + t.__orderedIndex = nil + return +end +function orderedPairs(t) + -- Equivalent of the pairs() function on tables. Allows to iterate + -- in order + return orderedNext, t, nil +end + + +local results = {} + +local log = function(v, t, s, prot, test, host) + local x = "" + if nil == prot then prot = "" end + if nil ~= test then x = x .. test else test = "" end + if nil ~= host then + if #x > 0 then x = x .. " " end + x = x .. host + end + if #x > 0 then + t = t .. "(" .. x .. ")" + end + if v <= verbosity then + if 3 <= verbosity then t = os.date() .. " " .. t end + print(t .. ": " .. s) + end + if nil ~= logFile then + logFile:write(os.date() .. " " .. t .. ": " .. s .. "\n") + logFile:flush() + end +end +local D = function(s) log(3, "DEBUG ", s) end +local I = function(s) log(2, "INFO ", s) end +local W = function(s, p, t, h) log(1, "WARNING ", s, p, t, h) end +local E = function(s, p, t, h) log(0, "ERROR ", s, p, t, h) end +local C = function(s) log(-1, "CRITICAL", s) end + +local faulty = "" +local status = function(host, results, typ) + local result = "" + local e = 0 + local w = 0 + if nil ~= results[typ] then + e = results[typ].errors + w = results[typ].warnings + for k, v in pairs(results[typ]) do + if "table" == type(v) then + e = e + v.errors + w = w + v.warnings + end + end + else + for k, v in pairs(results) do + if "table" == type(v) then + for i, u in pairs(v) do + if "table" == type(u) then + if typ == i then + e = e + u.errors + w = w + u.warnings + end + end + end + end + end + end + + if 0 < e then result = e .. " error" end + if 1 == e then result = e .. " error" end + if 0 < w then + if 0 < e then result = result .. ", " end + if 1 == w then + result = result .. w .. " warning" + else + result = result .. w .. " warnings" + end + end + if "[OK]" ~= result then + if 0 < e then + result = "[FAILED] (" .. result .. ")" + faulty = faulty .. host .. " (" .. typ .. ")
\n" + elseif 0 < w then + result = "[OK] (" .. result .. ")" + else + result = "[OK]" + end + end + return result +end + +local collate = function(host, ip, results) + local f = "results/" .. host .. "_" .. ip .. ".lua" + local rfile, e = io.open(f, "r") + if nil == rfile then I("opening " .. f .. " file - " .. e) else + rfile:close() + local rs = loadfile(f)() + for k, v in pairs(rs) do + if "table" == type(v) then + for i, u in pairs(v) do + if "table" == type(u) then + for h, t in pairs(u) do + local a = results[k][h] + if nil == a then a = 0 end + results[k][h] = a + t + end + else + local a = results[k][i] + if nil == a then a = 0 end + results[k][i] = a + u + end + end + else + local a = results[k] + if nil == a then a = 0 end + results[k] = a + v + end + end + end + return results +end + + +local mirrors = loadfile("results/mirrors.lua")() + +local file, e = io.open("results/Report-web.html", "w+") +if nil == file then C("opening mirrors file - " .. e) else + file:write( "\n" .. + "" .. + "Check date: " .. os.date("!%a %b %d %T %Z %Y") .. "\n
\n") + for k, v in orderedPairs(mirrors) do + local results = loadfile("results/" .. k .. ".lua")() + file:write(" " .. k .. ".... ") + local IPs = v.IPs + for i, u in pairs(IPs) do + if "table" == type(u) then + for h, t in pairs(u) do + results = collate(k, h, results) + end + else + results = collate(k, i, results) + end + end +-- local http = status(k, results, "http") +-- local https = status(k, results, "https") + local dns = "[skip]" + local integrity = "[skip]" + local protocol = status(k, results, "Protocol") + local sanity = "[skip]" + local updated = "[skip]" + file:write(" DNS-RR: " .. dns .. " Integrity: " .. integrity .. " Protocol: " .. protocol .. " URL-sanity: " .. sanity .. " Updated: " .. updated .. "\n
\n") + end + file:write( "==== faulty mirrors: ====
\n
\n" .. faulty) + file:write( "\n
\nLast Failure: NOT WRITTEN YET
\n
") + file:write( "\n
\n\n\n") + file:close() +end -- cgit v1.1