diff options
| -rw-r--r-- | apt-panopticommon.lua | 38 | ||||
| -rwxr-xr-x | apt-panopticon-report-RRD.lua | 6 | ||||
| -rwxr-xr-x | apt-panopticon-report-email-web.lua | 201 | ||||
| -rwxr-xr-x | apt-panopticon.lua | 103 | 
4 files changed, 292 insertions, 56 deletions
| diff --git a/apt-panopticommon.lua b/apt-panopticommon.lua index e73e69e..37b43e4 100644 --- a/apt-panopticommon.lua +++ b/apt-panopticommon.lua | |||
| @@ -53,7 +53,7 @@ APT.options = | |||
| 53 | "DNSRR", | 53 | "DNSRR", | 
| 54 | "Protocol", | 54 | "Protocol", | 
| 55 | "URLSanity", | 55 | "URLSanity", | 
| 56 | "Integrity", | 56 | -- "Integrity", | 
| 57 | "Updated", | 57 | "Updated", | 
| 58 | }, | 58 | }, | 
| 59 | }, | 59 | }, | 
| @@ -411,6 +411,7 @@ local E = APT.E | |||
| 411 | local C = APT.C | 411 | local C = APT.C | 
| 412 | 412 | ||
| 413 | 413 | ||
| 414 | APT.debians = {} | ||
| 414 | APT.mirrors = {} | 415 | APT.mirrors = {} | 
| 415 | 416 | ||
| 416 | APT.testing = function(t, host) | 417 | APT.testing = function(t, host) | 
| @@ -498,6 +499,7 @@ APT.padResults = function(results) | |||
| 498 | if nil == tests.Integrity then tests.Integrity = {errors = c; warnings = c; timeouts = c} end | 499 | if nil == tests.Integrity then tests.Integrity = {errors = c; warnings = c; timeouts = c} end | 
| 499 | if nil == tests.Protocol then tests.Protocol = {errors = c; warnings = c; timeouts = c} end | 500 | if nil == tests.Protocol then tests.Protocol = {errors = c; warnings = c; timeouts = c} end | 
| 500 | if nil == tests.Updated then tests.Updated = {errors = c; warnings = c; timeouts = c} end | 501 | if nil == tests.Updated then tests.Updated = {errors = c; warnings = c; timeouts = c} end | 
| 502 | if nil == tests.redirects then tests.redirects = {} end | ||
| 501 | if nil == tests.URLSanity then tests.URLSanity = {errors = c; warnings = c; timeouts = c} end | 503 | if nil == tests.URLSanity then tests.URLSanity = {errors = c; warnings = c; timeouts = c} end | 
| 502 | results[v] = tests | 504 | results[v] = tests | 
| 503 | end | 505 | end | 
| @@ -517,23 +519,25 @@ APT.collate = function(l, host, ip, results) | |||
| 517 | if ("speed" == k) and (nil ~= results.speed) then | 519 | if ("speed" == k) and (nil ~= results.speed) then | 
| 518 | if v.min < results.speed.min then results.speed.min = v.min end | 520 | if v.min < results.speed.min then results.speed.min = v.min end | 
| 519 | if v.max > results.speed.max then results.speed.max = v.max end | 521 | if v.max > results.speed.max then results.speed.max = v.max end | 
| 520 | else | 522 | elseif 'IPs' ~= k then | 
| 521 | for i, u in pairs(v) do | 523 | for i, u in pairs(v) do | 
| 522 | if "table" == type(u) then | 524 | if 'redirects' ~= i then | 
| 523 | for h, t in pairs(u) do | 525 | if "table" == type(u) then | 
| 526 | for h, t in pairs(u) do | ||
| 527 | local a = results[k] | ||
| 528 | if nil == a then results[k] = {i = {}}; a = results[k] end | ||
| 529 | a = a[i] | ||
| 530 | if nil == a then results[k][i] = {h = {}}; a = results[k][i] end | ||
| 531 | a = a[h] | ||
| 532 | if nil == a then a = 0 end | ||
| 533 | results[k][i][h] = a + t | ||
| 534 | end | ||
| 535 | else | ||
| 524 | local a = results[k] | 536 | local a = results[k] | 
| 525 | if nil == a then results[k] = {i = {}}; a = results[k] end | 537 | if nil == a then a = 0; results[k] = {} else a = a[i] end | 
| 526 | a = a[i] | ||
| 527 | if nil == a then results[k][i] = {h = {}}; a = results[k][i] end | ||
| 528 | a = a[h] | ||
| 529 | if nil == a then a = 0 end | 538 | if nil == a then a = 0 end | 
| 530 | results[k][i][h] = a + t | 539 | results[k][i] = a + u | 
| 531 | end | 540 | end | 
| 532 | else | ||
| 533 | local a = results[k] | ||
| 534 | if nil == a then a = 0; results[k] = {} else a = a[i] end | ||
| 535 | if nil == a then a = 0 end | ||
| 536 | results[k][i] = a + u | ||
| 537 | end | 541 | end | 
| 538 | end | 542 | end | 
| 539 | end | 543 | end | 
| @@ -546,14 +550,14 @@ APT.collate = function(l, host, ip, results) | |||
| 546 | end | 550 | end | 
| 547 | return results | 551 | return results | 
| 548 | end | 552 | end | 
| 549 | APT.collateAll = function(l, host, func) | 553 | APT.collateAll = function(hosts, l, host, func) | 
| 550 | results = {} | 554 | results = {} | 
| 551 | local f = l .. "/" .. host .. ".lua" | 555 | local f = l .. "/" .. host .. ".lua" | 
| 552 | if APT.checkFile(f) then | 556 | if APT.checkFile(f) then | 
| 553 | results = loadfile(f)() | 557 | results = loadfile(f)() | 
| 554 | results = APT.padResults(results) | 558 | results = APT.padResults(results) | 
| 555 | if nil ~= func then func(results) end | 559 | if nil ~= func then func(results) end | 
| 556 | local v = APT.mirrors[host] | 560 | local v = hosts[host] | 
| 557 | if nil ~= v then | 561 | if nil ~= v then | 
| 558 | local IPs = results.IPs | 562 | local IPs = results.IPs | 
| 559 | if nil == IPs then W('No IPs for ' .. host .. ' in ' .. l) else | 563 | if nil == IPs then W('No IPs for ' .. host .. ' in ' .. l) else | 
| @@ -662,7 +666,7 @@ APT.updateRRD = function(results, host, ip) | |||
| 662 | end | 666 | end | 
| 663 | 667 | ||
| 664 | APT.doRRD = function(l, k, v, o) | 668 | APT.doRRD = function(l, k, v, o) | 
| 665 | APT.collateAll(l, k, | 669 | APT.collateAll(APT.mirrors, l, k, | 
| 666 | function(results, ip) | 670 | function(results, ip) | 
| 667 | APT.createRRD(k, ip, o) | 671 | APT.createRRD(k, ip, o) | 
| 668 | APT.updateRRD(results, k, ip) | 672 | APT.updateRRD(results, k, ip) | 
| diff --git a/apt-panopticon-report-RRD.lua b/apt-panopticon-report-RRD.lua index e703659..6a4a032 100755 --- a/apt-panopticon-report-RRD.lua +++ b/apt-panopticon-report-RRD.lua | |||
| @@ -15,3 +15,9 @@ APT.html = false | |||
| 15 | for k, v in APT.orderedPairs(APT.mirrors) do | 15 | for k, v in APT.orderedPairs(APT.mirrors) do | 
| 16 | APT.doRRD('results', k, v) | 16 | APT.doRRD('results', k, v) | 
| 17 | end | 17 | end | 
| 18 | |||
| 19 | APT.debians = loadfile("results/debians.lua")() | ||
| 20 | APT.html = false | ||
| 21 | for k, v in APT.orderedPairs(APT.debians) do | ||
| 22 | APT.doRRD('results', k, v) | ||
| 23 | end | ||
| diff --git a/apt-panopticon-report-email-web.lua b/apt-panopticon-report-email-web.lua index 9faf476..23608d3 100755 --- a/apt-panopticon-report-email-web.lua +++ b/apt-panopticon-report-email-web.lua | |||
| @@ -12,11 +12,12 @@ local arg, sendArgs = APT.parseArgs({...}) | |||
| 12 | 12 | ||
| 13 | local results = {} | 13 | local results = {} | 
| 14 | APT.mirrors = loadfile("results/mirrors.lua")() | 14 | APT.mirrors = loadfile("results/mirrors.lua")() | 
| 15 | APT.debians = loadfile("results/debians.lua")() | ||
| 15 | 16 | ||
| 16 | local revDNS = function(dom, IP) | 17 | local revDNS = function(hosts, dom, IP) | 
| 17 | if "deb.devuan.org" ~= dom then | 18 | if "deb.devuan.org" ~= dom then | 
| 18 | if nil ~= APT.mirrors["deb.devuan.org"] then | 19 | if nil ~= hosts["deb.devuan.org"] then | 
| 19 | if nil ~= APT.mirrors["deb.devuan.org"].IPs["deb.roundr.devuan.org"][IP] then | 20 | if nil ~= hosts["deb.devuan.org"].IPs["deb.roundr.devuan.org"][IP] then | 
| 20 | if APT.html then | 21 | if APT.html then | 
| 21 | return "<font color='purple'><b>DNS-RR</b></font>" | 22 | return "<font color='purple'><b>DNS-RR</b></font>" | 
| 22 | else | 23 | else | 
| @@ -25,7 +26,7 @@ local revDNS = function(dom, IP) | |||
| 25 | end | 26 | end | 
| 26 | end | 27 | end | 
| 27 | else | 28 | else | 
| 28 | for k, v in pairs(APT.mirrors) do | 29 | for k, v in pairs(hosts) do | 
| 29 | if "deb.devuan.org" ~= k then | 30 | if "deb.devuan.org" ~= k then | 
| 30 | local IPs = v.IPs | 31 | local IPs = v.IPs | 
| 31 | for i, u in pairs(IPs) do | 32 | for i, u in pairs(IPs) do | 
| @@ -44,12 +45,12 @@ local revDNS = function(dom, IP) | |||
| 44 | end | 45 | end | 
| 45 | 46 | ||
| 46 | local faulty = "" | 47 | local faulty = "" | 
| 47 | local status = function(host, results, typ) | 48 | local status = function(hosts, host, results, typ) | 
| 48 | local result = "" | 49 | local result = "" | 
| 49 | local e = 0 | 50 | local e = 0 | 
| 50 | local w = 0 | 51 | local w = 0 | 
| 51 | local t = 0 | 52 | local t = 0 | 
| 52 | local s = nil ~= APT.mirrors[host].Protocols[typ] | 53 | local s = nil ~= hosts[host].Protocols[typ] | 
| 53 | local to = results.timeout | 54 | local to = results.timeout | 
| 54 | if not APT.search(APT.protocols, typ) then s = true end | 55 | if not APT.search(APT.protocols, typ) then s = true end | 
| 55 | if nil ~= results[typ] then | 56 | if nil ~= results[typ] then | 
| @@ -57,7 +58,7 @@ local status = function(host, results, typ) | |||
| 57 | w = results[typ].warnings | 58 | w = results[typ].warnings | 
| 58 | t = results[typ].timeouts | 59 | t = results[typ].timeouts | 
| 59 | for k, v in pairs(results[typ]) do | 60 | for k, v in pairs(results[typ]) do | 
| 60 | if "table" == type(v) then | 61 | if ("table" == type(v)) and ('redirects' ~= k) then | 
| 61 | if 0 <= v.errors then e = e + v.errors else to = true end | 62 | if 0 <= v.errors then e = e + v.errors else to = true end | 
| 62 | if 0 <= v.warnings then w = w + v.warnings else to = true end | 63 | if 0 <= v.warnings then w = w + v.warnings else to = true end | 
| 63 | if 0 <= v.timeouts then t = t + v.timeouts else to = true end | 64 | if 0 <= v.timeouts then t = t + v.timeouts else to = true end | 
| @@ -139,31 +140,49 @@ local logCount = function(domain, ip) | |||
| 139 | local nm = "LOG_" .. domain | 140 | local nm = "LOG_" .. domain | 
| 140 | local log = "" | 141 | local log = "" | 
| 141 | local extra = "" | 142 | local extra = "" | 
| 143 | local errors = 0 | ||
| 144 | local warnings = 0 | ||
| 145 | local timeouts = 0 | ||
| 142 | if nil ~= ip then nm = nm .. "_" .. ip end | 146 | if nil ~= ip then nm = nm .. "_" .. ip end | 
| 143 | nm = nm .. ".html" | 147 | nm = nm .. ".html" | 
| 144 | local rfile, e = io.open("results/" .. nm, "r") | 148 | local rfile, e = io.open("results/" .. nm, "r") | 
| 145 | if nil ~= rfile then | 149 | if nil ~= rfile then | 
| 146 | local errors = 0 | ||
| 147 | local warnings = 0 | ||
| 148 | local timeouts = 0 | ||
| 149 | for l in rfile:lines() do | 150 | for l in rfile:lines() do | 
| 150 | if nil ~= l:match("><b>ERROR ") then errors = errors + 1 end | 151 | if nil ~= l:match("><b>ERROR ") then errors = errors + 1 end | 
| 151 | if nil ~= l:match("><b>WARNING ") then warnings = warnings + 1 end | 152 | if nil ~= l:match("><b>WARNING ") then warnings = warnings + 1 end | 
| 152 | if nil ~= l:match("><b>TIMEOUT ") then timeouts = timeouts + 1 end | 153 | if nil ~= l:match("><b>TIMEOUT ") then timeouts = timeouts + 1 end | 
| 153 | end | 154 | end | 
| 154 | rfile:close() | 155 | rfile:close() | 
| 155 | if APT.html then | 156 | end | 
| 156 | if nil == ip then | 157 | if APT.html then | 
| 157 | log = "<a href='" .. nm .. "'>" .. domain .. "</a>" | 158 | if nil == ip then | 
| 158 | else | 159 | log = "<a href='" .. nm .. "'>" .. domain .. "</a>" | 
| 159 | log = "<a href='" .. nm .. "'>" .. ip .. "</a>" | 160 | else | 
| 160 | end | 161 | log = "<a href='" .. nm .. "'>" .. ip .. "</a>" | 
| 161 | end | 162 | end | 
| 162 | log = log .. APT.plurals(errors, warnings, timeouts) | ||
| 163 | end | 163 | end | 
| 164 | log = log .. APT.plurals(errors, warnings, timeouts) | ||
| 164 | return log | 165 | return log | 
| 165 | end | 166 | end | 
| 166 | 167 | ||
| 168 | local redirs = function(hosts, host) | ||
| 169 | local results = APT.collateAll(hosts, 'results', host) | ||
| 170 | local rdr = {} | ||
| 171 | local redirs = '' | ||
| 172 | for p, pt in pairs(APT.protocols) do | ||
| 173 | if 0 ~= #(results[pt].redirects) then | ||
| 174 | table.sort(results[pt].redirects) | ||
| 175 | for r, rd in pairs(results[pt].redirects) do | ||
| 176 | rdr[rd] = rd | ||
| 177 | end | ||
| 178 | end | ||
| 179 | end | ||
| 180 | for r, rd in pairs(rdr) do | ||
| 181 | redirs = redirs .. ',   ' .. rd | ||
| 182 | end | ||
| 183 | if '' ~= redirs then redirs = '<br>\n     (Redirects some packages to - ' .. redirs:sub(3) .. ')' end | ||
| 184 | return redirs | ||
| 185 | end | ||
| 167 | 186 | ||
| 168 | APT.html = false | 187 | APT.html = false | 
| 169 | local email, e = io.open("results/Report-email.txt", "w+") | 188 | local email, e = io.open("results/Report-email.txt", "w+") | 
| @@ -183,16 +202,16 @@ if nil == email then C("opening mirrors file - " .. e) else | |||
| 183 | "[skip] means that the test hasn't been written yet.\n\n") | 202 | "[skip] means that the test hasn't been written yet.\n\n") | 
| 184 | for k, v in APT.orderedPairs(APT.mirrors) do | 203 | for k, v in APT.orderedPairs(APT.mirrors) do | 
| 185 | email:write(k .. "....\n") | 204 | email:write(k .. "....\n") | 
| 186 | local results = APT.collateAll('results', k) | 205 | local results = APT.collateAll(APT.mirrors, 'results', k) | 
| 187 | local ftp = "[skip]" | 206 | local ftp = "[skip]" | 
| 188 | local http = status(k, results, "http") | 207 | local http = status(APT.mirrors, k, results, "http") | 
| 189 | local https = status(k, results, "https") | 208 | local https = status(APT.mirrors, k, results, "https") | 
| 190 | local rsync = "[skip]" | 209 | local rsync = "[skip]" | 
| 191 | local dns = "" | 210 | local dns = "" | 
| 192 | local protocol = status(k, results, "Protocol") | 211 | local protocol = status(APT.mirrors, k, results, "Protocol") | 
| 193 | local sanity = status(k, results, "URLSanity") | 212 | local sanity = status(APT.mirrors, k, results, "URLSanity") | 
| 194 | local integrity = status(k, results, "Integrity") | 213 | local integrity = status(APT.mirrors, k, results, "Integrity") | 
| 195 | local updated = status(k, results, "Updated") | 214 | local updated = status(APT.mirrors, k, results, "Updated") | 
| 196 | 215 | ||
| 197 | -- DNS-RR test. | 216 | -- DNS-RR test. | 
| 198 | if ("deb.devuan.org" ~= k) and (nil ~= APT.mirrors["deb.devuan.org"]) then | 217 | if ("deb.devuan.org" ~= k) and (nil ~= APT.mirrors["deb.devuan.org"]) then | 
| @@ -347,7 +366,7 @@ if nil == web then C("opening mirrors file - " .. e) else | |||
| 347 | "<th>Protocol</th><th>URL sanity</th><th>Integrity</th><th>Updated</th><th colspan='2'>Speed range</th></tr>\n" | 366 | "<th>Protocol</th><th>URL sanity</th><th>Integrity</th><th>Updated</th><th colspan='2'>Speed range</th></tr>\n" | 
| 348 | ) | 367 | ) | 
| 349 | for k, v in APT.orderedPairs(APT.mirrors) do | 368 | for k, v in APT.orderedPairs(APT.mirrors) do | 
| 350 | local results = APT.collateAll('results', k) | 369 | local results = APT.collateAll(APT.mirrors, 'results', k) | 
| 351 | local active = "" | 370 | local active = "" | 
| 352 | if "yes" == v.Active then | 371 | if "yes" == v.Active then | 
| 353 | web:write(" <tr><th>" .. k .. "</th> ") | 372 | web:write(" <tr><th>" .. k .. "</th> ") | 
| @@ -356,14 +375,14 @@ if nil == web then C("opening mirrors file - " .. e) else | |||
| 356 | web:write(" <tr style='background-color:dimgrey'><th>" .. k .. "</th> ") | 375 | web:write(" <tr style='background-color:dimgrey'><th>" .. k .. "</th> ") | 
| 357 | end | 376 | end | 
| 358 | local ftp = "[<font color='grey'><b>skip</b></font>]" | 377 | local ftp = "[<font color='grey'><b>skip</b></font>]" | 
| 359 | local http = status(k, results, "http") | 378 | local http = status(APT.mirrors, k, results, "http") | 
| 360 | local https = status(k, results, "https") | 379 | local https = status(APT.mirrors, k, results, "https") | 
| 361 | local rsync = "[<font color='grey'><b>skip</b></font>]" | 380 | local rsync = "[<font color='grey'><b>skip</b></font>]" | 
| 362 | local dns = "" | 381 | local dns = "" | 
| 363 | local protocol = status(k, results, "Protocol") | 382 | local protocol = status(APT.mirrors, k, results, "Protocol") | 
| 364 | local sanity = status(k, results, "URLSanity") | 383 | local sanity = status(APT.mirrors, k, results, "URLSanity") | 
| 365 | local integrity = status(k, results, "Integrity") | 384 | local integrity = status(APT.mirrors, k, results, "Integrity") | 
| 366 | local updated = status(k, results, "Updated") | 385 | local updated = status(APT.mirrors, k, results, "Updated") | 
| 367 | local rate = v.Rate | 386 | local rate = v.Rate | 
| 368 | if nil ~= rate then updated = updated .. ' ' .. rate end | 387 | if nil ~= rate then updated = updated .. ' ' .. rate end | 
| 369 | local min = tonumber(results.speed.min) | 388 | local min = tonumber(results.speed.min) | 
| @@ -434,14 +453,14 @@ if nil == web then C("opening mirrors file - " .. e) else | |||
| 434 | n[l] = {} | 453 | n[l] = {} | 
| 435 | for i, u in pairs(w) do | 454 | for i, u in pairs(w) do | 
| 436 | local log = logCount(k, i) | 455 | local log = logCount(k, i) | 
| 437 | if "" == log then n[l][i] = u else n[l][log .. " " .. revDNS(k, i)] = u end | 456 | if "" == log then n[l][i] = u else n[l][log .. " " .. revDNS(APT.mirrors, k, i)] = u end | 
| 438 | end | 457 | end | 
| 439 | else | 458 | else | 
| 440 | local log = logCount(k, l) | 459 | local log = logCount(k, l) | 
| 441 | if "" == log then n[l] = w else n[log .. " " .. revDNS(k, l)] = w end | 460 | if "" == log then n[l] = w else n[log .. " " .. revDNS(APT.mirrors, k, l)] = w end | 
| 442 | end | 461 | end | 
| 443 | end | 462 | end | 
| 444 | m[log .. " DNS entries -"] = n | 463 | m[log .. " DNS entries -" .. redirs(APT.mirrors, k)] = n | 
| 445 | end | 464 | end | 
| 446 | web:write( "<p>This lists each mirror, and the DNS entries for that mirror.   " .. | 465 | web:write( "<p>This lists each mirror, and the DNS entries for that mirror.   " .. | 
| 447 | "The links point to the testing log files for " .. logCount("apt-panopticon") .. " for each domain name / IP combination that was tested.   " .. | 466 | "The links point to the testing log files for " .. logCount("apt-panopticon") .. " for each domain name / IP combination that was tested.   " .. | 
| @@ -453,8 +472,118 @@ if nil == web then C("opening mirrors file - " .. e) else | |||
| 453 | ) | 472 | ) | 
| 454 | web:write(APT.dumpTableHTML(m, "", "")) | 473 | web:write(APT.dumpTableHTML(m, "", "")) | 
| 455 | web:write( "\n<br>\n<br>\n<h2>==== graphs: ====</h2>\n" .. | 474 | web:write( "\n<br>\n<br>\n<h2>==== graphs: ====</h2>\n" .. | 
| 456 | "<img src='speed.png'>\n<br>\n<p><a href='../apt-panopticon_cgp/'>More graphs.</a> with greater detail.</p><hr>\n\n" .. | 475 | "<img src='speed.png'>\n<br>\n<p><a href='../apt-panopticon_cgp/'>More graphs.</a> with greater detail.</p><hr>\n\n") | 
| 457 | "<p>The <a href='Report-email.txt'>email report</a>.   " .. | 476 | |
| 477 | results = {} | ||
| 478 | m = {} | ||
| 479 | faulty = "" | ||
| 480 | web:write( "<hr>\n<h2>==== Debian mirror status ====</h2>\n" .. | ||
| 481 | "<p>NOTE - This is not fully probing the Debian mirrors, we just collect some data from any redirects to other servers.   " .. | ||
| 482 | "So this isn't a full set of tests.</p>\n" .. | ||
| 483 | "<p><font style='background-color:red; color:black'>EXPERIMENTAL CODE - this is even more experimental than the rest.</font></p>\n" .. | ||
| 484 | "<table>\n<tr><th></th><th>FTP</th><th>HTTP</th><th>HTTPS</th><th>RSYNC</th><th>DNS round robin</th>" .. | ||
| 485 | "<th>Protocol</th><th>URL sanity</th><th>Integrity</th><th>Updated</th><th colspan='2'>Speed range</th></tr>\n") | ||
| 486 | for k, v in APT.orderedPairs(APT.debians) do | ||
| 487 | local results = APT.collateAll(APT.debians, 'results', k) | ||
| 488 | local active = "" | ||
| 489 | if "yes" == v.Active then | ||
| 490 | web:write(" <tr><th>" .. k .. "</th> ") | ||
| 491 | else | ||
| 492 | if nil == v.Active then active = 'nil' else active = v.Active end | ||
| 493 | web:write(" <tr style='background-color:dimgrey'><th>" .. k .. "</th> ") | ||
| 494 | end | ||
| 495 | local ftp = "[<font color='grey'><b>skip</b></font>]" | ||
| 496 | local http = status(APT.debians, k, results, "http") | ||
| 497 | local https = status(APT.debians, k, results, "https") | ||
| 498 | local rsync = "[<font color='grey'><b>skip</b></font>]" | ||
| 499 | local dns = "" | ||
| 500 | local protocol = status(APT.debians, k, results, "Protocol") | ||
| 501 | local sanity = status(APT.debians, k, results, "URLSanity") | ||
| 502 | local integrity = status(APT.debians, k, results, "Integrity") | ||
| 503 | local updated = status(APT.debians, k, results, "Updated") | ||
| 504 | local rate = v.Rate | ||
| 505 | if nil ~= rate then updated = updated .. ' ' .. rate end | ||
| 506 | local min = tonumber(results.speed.min) | ||
| 507 | local max = tonumber(results.speed.max) | ||
| 508 | local spd = '' | ||
| 509 | |||
| 510 | -- DNS-RR test. | ||
| 511 | if ("deb.devuan.org" ~= k) and (nil ~= APT.debians["deb.devuan.org"]) then | ||
| 512 | for l, w in pairs(APT.debians[k].IPs) do | ||
| 513 | if type(w) == "table" then | ||
| 514 | for i, u in pairs(w) do | ||
| 515 | if nil ~= APT.debians["deb.devuan.org"].IPs["deb.roundr.devuan.org"][i] then | ||
| 516 | local log = logCount("deb.devuan.org", i) | ||
| 517 | if "" ~= log then | ||
| 518 | if "" == dns then dns = " " else dns = dns .. "   " end | ||
| 519 | dns = dns .. logCount("deb.devuan.org", i) | ||
| 520 | else | ||
| 521 | if "" == dns then dns = " " else dns = dns .. "   " end | ||
| 522 | dns = dns .. "<font color='maroon'><b>" .. i .. "</b></font>" | ||
| 523 | end | ||
| 524 | end | ||
| 525 | end | ||
| 526 | else | ||
| 527 | if nil ~= APT.debians["deb.devuan.org"].IPs["deb.roundr.devuan.org"][l] then | ||
| 528 | local log = logCount("deb.devuan.org", l) | ||
| 529 | if "" ~= log then | ||
| 530 | if "" == dns then dns = " " else dns = dns .. "   " end | ||
| 531 | dns = dns .. log | ||
| 532 | else | ||
| 533 | if "" == dns then dns = " " else dns = dns .. "   " end | ||
| 534 | dns = dns .. "<font color='maroon'><b>" .. l .. "</b></font>" | ||
| 535 | end | ||
| 536 | end | ||
| 537 | end | ||
| 538 | end | ||
| 539 | if "" == dns then dns = "[<font color='grey'><b>no</b></font>]" end | ||
| 540 | |||
| 541 | if 0 == max then | ||
| 542 | spd = '<td></td><td></td>' | ||
| 543 | else | ||
| 544 | spd = string.format('<td align="right">%d -></td><td align="right">%d</td>', min, max) | ||
| 545 | end | ||
| 546 | end | ||
| 547 | |||
| 548 | web:write("<td>" .. ftp .. " </td><td>" .. http .. " </td><td>" .. https .. " </td><td>" .. rsync .. " </td><td>" .. dns .. | ||
| 549 | " </td><td>" .. protocol .. " </td><td>" .. sanity .. | ||
| 550 | " </td><td>" .. integrity .. " </td><td>" .. updated .. " </td>" .. spd .. "</tr>\n") | ||
| 551 | if "" ~= active then | ||
| 552 | web:write("<tr><td style='background-color:dimgrey'>" .. active .. "</td></tr>\n") | ||
| 553 | end | ||
| 554 | end | ||
| 555 | web:write( "</table>\n<br>\n\n") | ||
| 556 | |||
| 557 | web:write( "<br>\n<br>\n<h2>==== Debian DNS and logs: ====</h2>\n") | ||
| 558 | |||
| 559 | for k, v in pairs(APT.debians) do | ||
| 560 | local log = k | ||
| 561 | local n = {} | ||
| 562 | log = logCount(k) | ||
| 563 | APT.debians[k].Protocols = nil | ||
| 564 | APT.debians[k].FQDN = nil | ||
| 565 | APT.debians[k].Active = nil | ||
| 566 | APT.debians[k].Rate = nil | ||
| 567 | APT.debians[k].BaseURL = nil | ||
| 568 | APT.debians[k].Country = nil | ||
| 569 | APT.debians[k].Bandwidth = nil | ||
| 570 | for l, w in pairs(APT.debians[k].IPs) do | ||
| 571 | if type(w) == "table" then | ||
| 572 | n[l] = {} | ||
| 573 | for i, u in pairs(w) do | ||
| 574 | local log = logCount(k, i) | ||
| 575 | if "" == log then n[l][i] = u else n[l][log .. " " .. revDNS(APT.debians, k, i)] = u end | ||
| 576 | end | ||
| 577 | else | ||
| 578 | local log = logCount(k, l) | ||
| 579 | if "" == log then n[l] = w else n[log .. " " .. revDNS(APT.debians, k, l)] = w end | ||
| 580 | end | ||
| 581 | end | ||
| 582 | m[log .. " DNS entries -" .. redirs(APT.mirrors, k)] = n | ||
| 583 | end | ||
| 584 | web:write(APT.dumpTableHTML(m, "", "")) | ||
| 585 | |||
| 586 | web:write( "<hr>\n<hr>\n<p>The <a href='Report-email.txt'>email report</a>.   " .. | ||
| 458 | "All <a href='../results'>the logs and other output</a>.   " .. | 587 | "All <a href='../results'>the logs and other output</a>.   " .. | 
| 459 | "You can get the <a href='https://sledjhamr.org/cgit/apt-panopticon/about/'>source code here</a>.</p>\n") | 588 | "You can get the <a href='https://sledjhamr.org/cgit/apt-panopticon/about/'>source code here</a>.</p>\n") | 
| 460 | local status, whn = APT.execute('TZ="GMT" ls -l1 --time-style="+%s" results/stamp | cut -d " " -f 6-6') | 589 | local status, whn = APT.execute('TZ="GMT" ls -l1 --time-style="+%s" results/stamp | cut -d " " -f 6-6') | 
| diff --git a/apt-panopticon.lua b/apt-panopticon.lua index 13adead..b2827b4 100755 --- a/apt-panopticon.lua +++ b/apt-panopticon.lua | |||
| @@ -376,6 +376,8 @@ checkHEAD = function (host, URL, r, retry, sanity) | |||
| 376 | local extraArgs = sendArgs .. ' -o -r ' | 376 | local extraArgs = sendArgs .. ' -o -r ' | 
| 377 | if 'https' == pu.scheme then extraArgs = extraArgs .. ' --tests=-http' end | 377 | if 'https' == pu.scheme then extraArgs = extraArgs .. ' --tests=-http' end | 
| 378 | if 'http' == pu.scheme then extraArgs = extraArgs .. ' --tests=-https' end | 378 | if 'http' == pu.scheme then extraArgs = extraArgs .. ' --tests=-https' end | 
| 379 | local pth = path:match('^(.*/pool/).*$') | ||
| 380 | if nil ~= pth then table.insert(APT.results[PU.scheme].redirects, pu.host .. "/" .. pth) else E('Odd redirect path ' .. path) end | ||
| 379 | I(" Now checking redirected host " .. u) | 381 | I(" Now checking redirected host " .. u) | 
| 380 | APT.fork("ionice -c3 nice -n 19 " .. downloadLock .. "REDIR-" .. check .. ".log.txt" .. " ./apt-panopticon.lua " .. extraArgs .. ' ' .. pu.host .. "/" .. path .. " " .. file) | 382 | APT.fork("ionice -c3 nice -n 19 " .. downloadLock .. "REDIR-" .. check .. ".log.txt" .. " ./apt-panopticon.lua " .. extraArgs .. ' ' .. pu.host .. "/" .. path .. " " .. file) | 
| 381 | D('logging to ' .. APT.logName(pu.host, nil, file)[2]) | 383 | D('logging to ' .. APT.logName(pu.host, nil, file)[2]) | 
| @@ -422,12 +424,10 @@ local checkFiles = function (host, ip, path, file) | |||
| 422 | end | 424 | end | 
| 423 | end | 425 | end | 
| 424 | end | 426 | end | 
| 425 | |||
| 426 | for i, s in pairs(referenceDebs) do | 427 | for i, s in pairs(referenceDebs) do | 
| 427 | if checkTimeouts(host, "http", ip .. path .. "/" .. s) then return end | 428 | if checkTimeouts(host, "http", ip .. path .. "/" .. s) then return end | 
| 428 | if checkTimeouts(host, "https", ip .. path .. "/" .. s) then return end | 429 | if checkTimeouts(host, "https", ip .. path .. "/" .. s) then return end | 
| 429 | end | 430 | end | 
| 430 | |||
| 431 | for i, s in pairs(referenceDevs) do | 431 | for i, s in pairs(referenceDevs) do | 
| 432 | if checkTimeouts(host, "http", ip .. path .. "/" .. s) then return end | 432 | if checkTimeouts(host, "http", ip .. path .. "/" .. s) then return end | 
| 433 | if checkTimeouts(host, "https", ip .. path .. "/" .. s) then return end | 433 | if checkTimeouts(host, "https", ip .. path .. "/" .. s) then return end | 
| @@ -994,7 +994,7 @@ if 0 < #arg then | |||
| 994 | rfile:close() | 994 | rfile:close() | 
| 995 | end | 995 | end | 
| 996 | 996 | ||
| 997 | if APT.origin and APT.options.referenceSite.value ~= pu.host then | 997 | if APT.origin and (not APT.redir) and (APT.options.referenceSite.value ~= pu.host) then | 
| 998 | os.execute('sleep 1') -- Wait for things to start up before checking for them. | 998 | os.execute('sleep 1') -- Wait for things to start up before checking for them. | 
| 999 | while 0 < APT.checkExes(downloadLock .. "Release-" .. pu.host .. ".log.txt") do os.execute("sleep 10") end | 999 | while 0 < APT.checkExes(downloadLock .. "Release-" .. pu.host .. ".log.txt") do os.execute("sleep 10") end | 
| 1000 | while 0 < APT.checkExes(downloadLock .. "Packages-" .. pu.host .. ".log.txt") do os.execute("sleep 10") end | 1000 | while 0 < APT.checkExes(downloadLock .. "Packages-" .. pu.host .. ".log.txt") do os.execute("sleep 10") end | 
| @@ -1038,6 +1038,103 @@ else | |||
| 1038 | os.execute('sleep 1') -- Wait for things to start up before checking for them. | 1038 | os.execute('sleep 1') -- Wait for things to start up before checking for them. | 
| 1039 | while 1 <= APT.checkExes("apt-panopticon.lua " .. sendArgs) do os.execute("sleep 10") end | 1039 | while 1 <= APT.checkExes("apt-panopticon.lua " .. sendArgs) do os.execute("sleep 10") end | 
| 1040 | 1040 | ||
| 1041 | local APT_args = APT.args | ||
| 1042 | local APT_logFile = APT.logFile | ||
| 1043 | local debians = {} | ||
| 1044 | local srvs = io.popen('ls -1 results/*.lua') | ||
| 1045 | for l in srvs:lines() do | ||
| 1046 | local hst = l:sub(9, -5) | ||
| 1047 | if (l:find('_') == nil) and (nil == APT.mirrors[hst]) then | ||
| 1048 | local ips = loadfile(l)().IPs | ||
| 1049 | if nil ~= ips then | ||
| 1050 | debians[hst] = {Country = '', FDQN = hst, Active = 'yes', Rate = '', BaseURL = hst, Protocols = {http = true, https = true}, Bandwidth = '', IPs = ips} | ||
| 1051 | local baseFiles = {} | ||
| 1052 | local IPfiles = {} | ||
| 1053 | for i, a in pairs(ips) do | ||
| 1054 | IPfiles[i] = {} | ||
| 1055 | if type(a) == 'table' then | ||
| 1056 | for j, b in pairs(a) do | ||
| 1057 | IPfiles[i][j] = {} | ||
| 1058 | end | ||
| 1059 | else | ||
| 1060 | end | ||
| 1061 | end | ||
| 1062 | local files = io.popen('ls -1 results/LOG_' .. hst .. '_*.html') | ||
| 1063 | for ll in files:lines() do | ||
| 1064 | local dn = false | ||
| 1065 | for i, a in pairs(ips) do | ||
| 1066 | if type(a) == 'table' then | ||
| 1067 | for j, b in pairs(a) do | ||
| 1068 | if nil ~= ll:match('(results/LOG_' .. hst .. '_' .. j .. '_.*)') then | ||
| 1069 | table.insert(IPfiles[i][j], ll) | ||
| 1070 | dn = true | ||
| 1071 | end | ||
| 1072 | end | ||
| 1073 | else | ||
| 1074 | if nil ~= ll:match('(results/LOG_' .. hst .. '_' .. i .. '_.*)') then | ||
| 1075 | table.insert(IPfiles[i], ll) | ||
| 1076 | dn = true | ||
| 1077 | end | ||
| 1078 | end | ||
| 1079 | end | ||
| 1080 | if not dn then table.insert(baseFiles, ll) end | ||
| 1081 | end | ||
| 1082 | |||
| 1083 | APT.logOpen(hst) | ||
| 1084 | APT.logFile:write('<h1>Note log lines will be out of order, this is a bunch of other log files combined.</h1>\n') | ||
| 1085 | for i, f in pairs(baseFiles) do | ||
| 1086 | f = f:sub(9, -1) | ||
| 1087 | APT.logFile:write('<hr>\n<hr>\n<h2><a href="' .. f .. '">' .. f .. '</a></h2>\n') | ||
| 1088 | for l in io.lines('results/' .. f) do | ||
| 1089 | if l:match('^' .. os.date('%a %b %d ') .. '.*$') then APT.logFile:write(l .. '\n') end | ||
| 1090 | end | ||
| 1091 | end | ||
| 1092 | APT.logPost() | ||
| 1093 | APT.args = APT_args | ||
| 1094 | APT.logFile = APT_logFile | ||
| 1095 | |||
| 1096 | for ip, a in pairs(IPfiles) do | ||
| 1097 | if nil == a[1] then | ||
| 1098 | for i, f in pairs(a) do | ||
| 1099 | if not APT.logOpen(hst, i) then print('PROBLEM OPENING LOG FILE ' .. hst .. ' ' .. i) end | ||
| 1100 | APT.logFile:write('<h1>Note log lines will be out of order, this is a bunch of other log files combined.</h1>\n') | ||
| 1101 | for j, g in pairs(f) do | ||
| 1102 | g = g:sub(9, -1) | ||
| 1103 | APT.logFile:write('<hr>\n<hr>\n<h2><a href="' .. g .. '">' .. g .. '</a></h2>\n') | ||
| 1104 | for l in io.lines('results/' .. g) do | ||
| 1105 | if l:match('^' .. os.date('%a %b %d ') .. '.*$') then APT.logFile:write(l .. '\n') end | ||
| 1106 | end | ||
| 1107 | end | ||
| 1108 | APT.logPost() | ||
| 1109 | APT.args = APT_args | ||
| 1110 | APT.logFile = APT_logFile | ||
| 1111 | end | ||
| 1112 | else | ||
| 1113 | if not APT.logOpen(hst, ip) then print('PROBLEM OPENING LOG FILE ' .. hst .. ' ' .. ip) end | ||
| 1114 | APT.logFile:write('<h1>Note log lines will be out of order, this is a bunch of other log files combined.</h1>\n') | ||
| 1115 | for i, f in pairs(a) do | ||
| 1116 | f = f:sub(9, -1) | ||
| 1117 | APT.logFile:write('<hr>\n<hr>\n<h2><a href="' .. f .. '">' .. f .. '</a></h2>\n') | ||
| 1118 | for l in io.lines('results/' .. f) do | ||
| 1119 | if l:match('^' .. os.date('%a %b %d ') .. '.*$') then APT.logFile:write(l .. '\n') end | ||
| 1120 | end | ||
| 1121 | end | ||
| 1122 | APT.logPost() | ||
| 1123 | APT.args = APT_args | ||
| 1124 | APT.logFile = APT_logFile | ||
| 1125 | end | ||
| 1126 | end | ||
| 1127 | |||
| 1128 | end | ||
| 1129 | end | ||
| 1130 | end | ||
| 1131 | local file, e = io.open("results/debians.lua", "w+") | ||
| 1132 | if nil == file then C("opening debians file - " .. e) else | ||
| 1133 | file:write(APT.dumpTable(debians, "", "debians") .. "\nreturn debians\n") | ||
| 1134 | file:close() | ||
| 1135 | end | ||
| 1136 | |||
| 1137 | |||
| 1041 | for k, v in pairs(APT.mirrors) do | 1138 | for k, v in pairs(APT.mirrors) do | 
| 1042 | local f = 'results/' .. k .. '.lua' | 1139 | local f = 'results/' .. k .. '.lua' | 
| 1043 | if APT.checkFile(f) then | 1140 | if APT.checkFile(f) then | 
