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( "