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 |