aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rwxr-xr-xapt-panopticon-report-email.lua8
-rwxr-xr-xapt-panopticon-report-web.lua36
-rwxr-xr-xapt-panopticon.lua155
3 files changed, 117 insertions, 82 deletions
diff --git a/apt-panopticon-report-email.lua b/apt-panopticon-report-email.lua
index c102b81..53db16f 100755
--- a/apt-panopticon-report-email.lua
+++ b/apt-panopticon-report-email.lua
@@ -234,8 +234,10 @@ if nil == file then C("opening mirrors file - " .. e) else
234 results = collate(k, i, results) 234 results = collate(k, i, results)
235 end 235 end
236 end 236 end
237 local ftp = "[skip]"
237 local http = status(k, results, "http") 238 local http = status(k, results, "http")
238 local https = status(k, results, "https") 239 local https = status(k, results, "https")
240 local rsync = "[skip]"
239 local dns = "" 241 local dns = ""
240 local protocol = status(k, results, "Protocol") 242 local protocol = status(k, results, "Protocol")
241 local sanity = "[skip]" 243 local sanity = "[skip]"
@@ -275,8 +277,10 @@ if nil == file then C("opening mirrors file - " .. e) else
275 dns = " DNS-RR: " .. dns 277 dns = " DNS-RR: " .. dns
276 end 278 end
277 279
278 file:write( " http: " .. http .. " https: " .. https .. dns .. "\n" .. 280 file:write( " ftp: " .. ftp .. " http: " .. http .. " https: " .. https .." rsync: " .. rsync .. "\n" ..
279 " Protocol: " .. protocol .. " URL-sanity: " .. sanity .. " Integrity: " .. integrity .. " Updated: " .. updated .. "\n") 281 " " .. dns .. "\n" ..
282 " Protocol: " .. protocol .. " URL-sanity: " .. sanity .. " Integrity: " .. integrity .. "\n" ..
283 " Updated: " .. updated .. "\n")
280 end 284 end
281 file:write( "\n==== faulty mirrors: ====\n" .. faulty) 285 file:write( "\n==== faulty mirrors: ====\n" .. faulty)
282 file:write( "\n---- END MIRROR-STATUS ----\n\n" .. 286 file:write( "\n---- END MIRROR-STATUS ----\n\n" ..
diff --git a/apt-panopticon-report-web.lua b/apt-panopticon-report-web.lua
index 61102c8..fb41341 100755
--- a/apt-panopticon-report-web.lua
+++ b/apt-panopticon-report-web.lua
@@ -155,24 +155,27 @@ local status = function(host, results, typ)
155 local e = 0 155 local e = 0
156 local w = 0 156 local w = 0
157 local s = nil ~= mirrors[host].Protocols[typ] 157 local s = nil ~= mirrors[host].Protocols[typ]
158 local to = false
158 if ('http' ~= typ) and ('https' ~= typ) and ('ftp' ~= typ) and ('rsync' ~= typ) then s = true end 159 if ('http' ~= typ) and ('https' ~= typ) and ('ftp' ~= typ) and ('rsync' ~= typ) then s = true end
159 if nil ~= results[typ] then 160 if nil ~= results[typ] then
160 e = results[typ].errors 161 e = results[typ].errors
161 w = results[typ].warnings 162 w = results[typ].warnings
163--[[
162 for k, v in pairs(results[typ]) do 164 for k, v in pairs(results[typ]) do
163 if "table" == type(v) then 165 if "table" == type(v) then
164 e = e + v.errors 166 if 0 <= v.errors then e = e + v.errors else to = true end
165 w = w + v.warnings 167 if 0 <= v.warnings then w = w + v.warnings else to = true end
166 end 168 end
167 end 169 end
170]]
168 else 171 else
169 for k, v in pairs(results) do 172 for k, v in pairs(results) do
170 if "table" == type(v) then 173 if "table" == type(v) then
171 for i, u in pairs(v) do 174 for i, u in pairs(v) do
172 if "table" == type(u) then 175 if "table" == type(u) then
173 if typ == i then 176 if typ == i then
174 e = e + u.errors 177 if 0 <= u.errors then e = e + u.errors else to = true end
175 w = w + u.warnings 178 if 0 <= u.warnings then w = w + u.warnings else to = true end
176 end 179 end
177 end 180 end
178 end 181 end
@@ -180,18 +183,24 @@ local status = function(host, results, typ)
180 end 183 end
181 end 184 end
182 185
183 if 0 < e then 186 if to then
187 if s then
188 result = "[<font color='blue'><b>TIMEOUT</b></font>]"
189 else
190 result = "[<font color='darkblue'><b>TIMEOUT *</b></font>]"
191 end
192 elseif 0 < e then
184 if s then 193 if s then
185 result = "[<font color='red'><b>FAILED</b></font>]" 194 result = "[<font color='red'><b>FAILED</b></font>]"
186 else 195 else
187 result = "[<font color='darkred'><b>FAILED</b></font>]" 196 result = "[<font color='darkred'><b>FAILED *</b></font>]"
188 end 197 end
189 faulty = faulty .. host .. " (" .. typ .. ")<br>\n" 198 faulty = faulty .. host .. " (" .. typ .. ")<br>\n"
190 else 199 else
191 if s then 200 if s then
192 result = "[<font color='lime'><b>OK</b></font>]" 201 result = "[<font color='lime'><b>OK</b></font>]"
193 else 202 else
194 result = "[<font color='darkgreen'><b>OK</b></font>]" 203 result = "[<font color='darkgreen'><b>OK *</b></font>]"
195 end 204 end
196 end 205 end
197 return result .. plurals(e, w) 206 return result .. plurals(e, w)
@@ -258,7 +267,7 @@ end
258local file, e = io.open("results/Report-web.html", "w+") 267local file, e = io.open("results/Report-web.html", "w+")
259if nil == file then C("opening mirrors file - " .. e) else 268if nil == file then C("opening mirrors file - " .. e) else
260 file:write( "<html><head><title>apt-panopticon results</title>\n" .. 269 file:write( "<html><head><title>apt-panopticon results</title>\n" ..
261 '</head><body bgcolor="black" text="white" alink="red" link="blue" vlink="purple">' .. 270 '</head><body bgcolor="black" text="white">' ..
262 "<h1>Welcome to the apt-panopticon results page.</h1>\n" .. 271 "<h1>Welcome to the apt-panopticon results page.</h1>\n" ..
263 "<p>This is the status of the mirror servers in the Devuan package mirror network.</p>\n" .. 272 "<p>This is the status of the mirror servers in the Devuan package mirror network.</p>\n" ..
264 "<p>The full list of Devuan package mirrors is available at the URL: " .. 273 "<p>The full list of Devuan package mirrors is available at the URL: " ..
@@ -269,21 +278,25 @@ if nil == file then C("opening mirrors file - " .. e) else
269 278
270 "<p>[<font color='red'><b>FAILED</b></font>] or [<font color='lime'><b>OK</b></font>]" .. 279 "<p>[<font color='red'><b>FAILED</b></font>] or [<font color='lime'><b>OK</b></font>]" ..
271 " means the tested thing is supported for that mirror.</p>\n" .. 280 " means the tested thing is supported for that mirror.</p>\n" ..
272 "<p>[<font color='darkred'><b>FAILED</b></font>] or [<font color='darkgreen'><b>OK</b></font>]" .. 281 "<p>[<font color='darkred'><b>FAILED *</b></font>] or [<font color='darkgreen'><b>OK *</b></font>]" ..
273 " means the tested thing is unsupported for that mirror, but might have been tested anyway.</p>\n" .. 282 " means the tested thing is unsupported for that mirror, but might have been tested anyway.</p>\n" ..
283 "<p>[<font color='blue'><b>TIMEOUT</b></font>] or [<font color='darkblue'><b>TIMEOUT</b></font>]" ..
284 " means the server had too many timeouts, and tests where aborted, so there is no result for this test.</p>" ..
274 "<p>The DNS round robin (DNS-RR) column shows the IPs for that mirror, or [<font color='grey'><b>no</b></font>] if it isn't part of the DNS-RR. &nbsp; " .. 285 "<p>The DNS round robin (DNS-RR) column shows the IPs for that mirror, or [<font color='grey'><b>no</b></font>] if it isn't part of the DNS-RR. &nbsp; " ..
275 "The IPs link to the testing log for that IP accessed via the DNS-RR. &nbsp; " .. 286 "The IPs link to the testing log for that IP accessed via the DNS-RR. &nbsp; " ..
276 "deb.devuan.org is the DNS-RR itself, so it doesn't get tested directly.</p>\n" .. 287 "deb.devuan.org is the DNS-RR itself, so it doesn't get tested directly.</p>\n" ..
277 "<p>The time in the Updated column is how often the mirror updates itself.</p>" .. 288 "<p>The time in the Updated column is how often the mirror updates itself.</p>" ..
278 "<p>Mirrors with a <font style='background-color:dimgrey'>grey background</font> are not active.</p>\n" .. 289 "<p>Mirrors with a <font style='background-color:dimgrey'>grey background</font> are not active (though may be usable as part of the DNS-RR).</p>\n" ..
279 "<p>[<font color='grey'><b>skip</b></font>] means that the test hasn't been written yet.</p>\n" .. 290 "<p>[<font color='grey'><b>skip</b></font>] means that the test hasn't been written yet.</p>\n" ..
280 "<tr><th></th><th>FTP</th><th>HTTP</th><th>HTTPS</th><th>RSYNC</th><th>DNS round robin</th><th>Protocol</th><th>URL sanity</th><th>Integrity</th><th>Updated</th></tr>\n" 291 "<tr><th></th><th>FTP</th><th>HTTP</th><th>HTTPS</th><th>RSYNC</th><th>DNS round robin</th><th>Protocol</th><th>URL sanity</th><th>Integrity</th><th>Updated</th></tr>\n"
281 ) 292 )
282 for k, v in orderedPairs(mirrors) do 293 for k, v in orderedPairs(mirrors) do
283 local results = loadfile("results/" .. k .. ".lua")() 294 local results = loadfile("results/" .. k .. ".lua")()
295 local active = ""
284 if "yes" == v.Active then 296 if "yes" == v.Active then
285 file:write(" <tr><th>" .. k .. "</th> ") 297 file:write(" <tr><th>" .. k .. "</th> ")
286 else 298 else
299 if nil == v.Active then active = 'nil' else active = v.Active end
287 file:write(" <tr style='background-color:dimgrey'><th>" .. k .. "</th> ") 300 file:write(" <tr style='background-color:dimgrey'><th>" .. k .. "</th> ")
288 end 301 end
289 local IPs = v.IPs 302 local IPs = v.IPs
@@ -343,6 +356,9 @@ if nil == file then C("opening mirrors file - " .. e) else
343 file:write("<td>" .. ftp .. "&nbsp;</td><td>" .. http .. "&nbsp;</td><td>" .. https .. "&nbsp;</td><td>" .. rsync .. "&nbsp;</td><td>" .. dns .. 356 file:write("<td>" .. ftp .. "&nbsp;</td><td>" .. http .. "&nbsp;</td><td>" .. https .. "&nbsp;</td><td>" .. rsync .. "&nbsp;</td><td>" .. dns ..
344 "&nbsp;</td><td>" .. protocol .. "&nbsp;</td><td>" .. sanity .. 357 "&nbsp;</td><td>" .. protocol .. "&nbsp;</td><td>" .. sanity ..
345 "&nbsp;</td><td>" .. integrity .. "&nbsp;</td><td>" .. updated .. "</td></tr>\n") 358 "&nbsp;</td><td>" .. integrity .. "&nbsp;</td><td>" .. updated .. "</td></tr>\n")
359 if "" ~= v.Active then
360 file:write("<tr><td style='background-color:dimgrey'>" .. active .. "</td></tr>\n")
361 end
346 end 362 end
347 file:write( "</table>\n<br>\n<h2>==== faulty mirrors: ====</h2>\n" .. faulty) 363 file:write( "</table>\n<br>\n<h2>==== faulty mirrors: ====</h2>\n" .. faulty)
348 file:write( "<br>\n<br>\n<h2>==== DNS and logs: ====</h2>\n") 364 file:write( "<br>\n<br>\n<h2>==== DNS and logs: ====</h2>\n")
diff --git a/apt-panopticon.lua b/apt-panopticon.lua
index d66e32d..5d9ed82 100755
--- a/apt-panopticon.lua
+++ b/apt-panopticon.lua
@@ -756,7 +756,7 @@ local getMirrors = function ()
756 local host = "" 756 local host = ""
757 local m = {} 757 local m = {}
758 local active = true 758 local active = true
759 local URL = "https://" .. options.referenceSite.value .. "/mirror_list.txt" 759 local URL = "http://" .. options.referenceSite.value .. "/mirror_list.txt"
760 I("getting mirrors.") 760 I("getting mirrors.")
761 local p, c, h = http.request(URL) 761 local p, c, h = http.request(URL)
762 if nil == p then E(c .. " fetching " .. URL) else 762 if nil == p then E(c .. " fetching " .. URL) else
@@ -766,7 +766,8 @@ local getMirrors = function ()
766 d = string.lower(d) 766 d = string.lower(d)
767 if "FQDN" == t then 767 if "FQDN" == t then
768 if "" ~= host then 768 if "" ~= host then
769 if active then mirrors[host] = m end 769-- if active then mirrors[host] = m end
770 mirrors[host] = m
770 m = {} 771 m = {}
771 active = true 772 active = true
772 end 773 end
@@ -780,15 +781,16 @@ local getMirrors = function ()
780 prot[w] = true; 781 prot[w] = true;
781 end 782 end
782 m[t] = prot 783 m[t] = prot
783 elseif "Active" == t and nil == d:find("yes", 1, true) then 784 elseif "Active" == t and nil == d:sub(1, 3):find("yes", 1, true) then
784 W("Mirror " .. host .. " is not active - " .. d, "", "", host) 785 W("Mirror " .. host .. " is not active - " .. d, "", "", host)
785 active = false 786 active = false
787 m[t] = d
786-- TODO - Should do some input validation on BaseURL, and everything else. 788-- TODO - Should do some input validation on BaseURL, and everything else.
787 else 789 else
788 m[t] = d 790 m[t] = d
789 end 791 end
790 end 792 end
791 if "" ~= host and active then 793 if "" ~= host --[[and active]] then
792 mirrors[host] = m 794 mirrors[host] = m
793 end 795 end
794 end 796 end
@@ -933,88 +935,90 @@ if 0 < #arg then
933 end 935 end
934 936
935 if testing("Integrity") or testing("Updated") then 937 if testing("Integrity") or testing("Updated") then
936 if origin and (options.roundRobin.value ~= pu.host) then 938 if 4 > (totalTimeouts) then
937 while 0 < checkExes(downloadLock .. "META-" .. pu.host .. ".lock") do os.execute("sleep 10") end 939 if origin and (options.roundRobin.value ~= pu.host) then
938 os.execute("rm -f results/" .. pu.host .. ".curl; rm results/curl-" .. "META-" .. pu.host .. ".lock") 940 while 0 < checkExes(downloadLock .. "META-" .. pu.host .. ".lock") do os.execute("sleep 10") end
939 for i, n in pairs(releases) do 941 os.execute("rm -f results/" .. pu.host .. ".curl; rm results/curl-" .. "META-" .. pu.host .. ".lock")
940 for l, o in pairs(releaseFiles) do 942 for i, n in pairs(releases) do
941 if repoExists(i .. o) then 943 for l, o in pairs(releaseFiles) do
942 postDownload(pu.host, n, o) 944 if repoExists(i .. o) then
945 postDownload(pu.host, n, o)
946 end
943 end 947 end
944 end
945 948
946 os.execute('sort -k 3 results/' .. pu.host .. '/merged/dists/' .. n .. '/Release >results/' .. pu.host .. '/merged/dists/' .. n .. '/Release.SORTED') 949 os.execute('sort -k 3 results/' .. pu.host .. '/merged/dists/' .. n .. '/Release >results/' .. pu.host .. '/merged/dists/' .. n .. '/Release.SORTED')
947 if options.referenceSite.value == pu.host then 950 if options.referenceSite.value == pu.host then
948 execute('diff -U 0 results_old/pkgmaster.devuan.org/merged/dists/' .. n .. '/Release.SORTED ' .. 951 execute('diff -U 0 results_old/pkgmaster.devuan.org/merged/dists/' .. n .. '/Release.SORTED ' ..
949 'results/pkgmaster.devuan.org/merged/dists/' .. n .. '/Release.SORTED ' .. 952 'results/pkgmaster.devuan.org/merged/dists/' .. n .. '/Release.SORTED ' ..
950 '| grep -v "@@" | grep "^+" | grep "Packages.xz$" | cut -c 77- >results/NEW_Release_' .. n .. '.txt') 953 '| grep -v "@@" | grep "^+" | grep "Packages.xz$" | cut -c 77- >results/NEW_Release_' .. n .. '.txt')
951 else 954 else
952-- TODO - compare to the pkgmaster copy. 955-- TODO - compare to the pkgmaster copy.
953 end 956 end
954 957
955 local dfile, e = io.open('results/NEW_Release_' .. n .. '.txt', "r") 958 local dfile, e = io.open('results/NEW_Release_' .. n .. '.txt', "r")
956 if nil == dfile then W("opening results/NEW_Release_" .. n .. " file - " .. e) else 959 if nil == dfile then W("opening results/NEW_Release_" .. n .. " file - " .. e) else
957 local diff = dfile:read("*a") 960 local diff = dfile:read("*a")
958 if "" ~= diff then 961 if "" ~= diff then
959 downloads(pu.host, pu.path, n, diff) 962 downloads(pu.host, pu.path, n, diff)
963 end
960 end 964 end
961 end
962 965
963 end 966 end
964 967
965 downloads(pu.host, pu.path, "", "") 968 downloads(pu.host, pu.path, "", "")
966 while 0 < checkExes(downloadLock .. "META-" .. pu.host .. ".lock") do os.execute("sleep 10") end 969 while 0 < checkExes(downloadLock .. "META-" .. pu.host .. ".lock") do os.execute("sleep 10") end
967 os.execute("rm -f results/" .. pu.host .. ".curl; rm results/curl-" .. "META-" .. pu.host .. ".lock") 970 os.execute("rm -f results/" .. pu.host .. ".curl; rm results/curl-" .. "META-" .. pu.host .. ".lock")
968 971
969 for i, n in pairs(releases) do 972 for i, n in pairs(releases) do
970 local dfile, e = io.open('results/NEW_Release_' .. n .. '.txt', "r") 973 local dfile, e = io.open('results/NEW_Release_' .. n .. '.txt', "r")
971 if nil == dfile then W("opening results/NEW_Release_" .. n .. ".txt file - " .. e) else 974 if nil == dfile then W("opening results/NEW_Release_" .. n .. ".txt file - " .. e) else
972 local diff = dfile:read("*a") 975 local diff = dfile:read("*a")
973 for l in diff:gmatch("\n*([^\n]+)\n*") do 976 for l in diff:gmatch("\n*([^\n]+)\n*") do
974 postDownload(pu.host, n, "/" .. l) 977 postDownload(pu.host, n, "/" .. l)
978 end
979 end
980 if options.referenceSite.value == pu.host then
981 -- In case it wasn't dealt with already.
982 os.execute('touch results/NEW_Packages_' .. n .. '.test.txt')
975 end 983 end
976 end 984 end
977 if options.referenceSite.value == pu.host then
978 -- In case it wasn't dealt with already.
979 os.execute('touch results/NEW_Packages_' .. n .. '.test.txt')
980 end
981 end
982 985
983 986
984 for i, n in pairs(releases) do 987 for i, n in pairs(releases) do
985 local nfile, e = io.open('results/NEW_Packages_' .. n .. '.test.txt', "r") 988 local nfile, e = io.open('results/NEW_Packages_' .. n .. '.test.txt', "r")
986 if nil == nfile then W("opening results/NEW_Packages_" .. n .. ".test.txt file - " .. e) else 989 if nil == nfile then W("opening results/NEW_Packages_" .. n .. ".test.txt file - " .. e) else
987 for l in nfile:lines() do 990 for l in nfile:lines() do
988 local p = l:match('(pool/.*%.deb)') 991 local p = l:match('(pool/.*%.deb)')
989 if nil ~= p then 992 if nil ~= p then
990 downloads(pu.host, pu.path, nil, p) 993 downloads(pu.host, pu.path, nil, p)
994 end
991 end 995 end
992 end 996 end
993 end 997 end
994 end 998 downloads(pu.host, pu.path, nil, "")
995 downloads(pu.host, pu.path, nil, "") 999 while 0 < checkExes(downloadLock .. "META-" .. pu.host .. ".lock") do os.execute("sleep 10") end
996 while 0 < checkExes(downloadLock .. "META-" .. pu.host .. ".lock") do os.execute("sleep 10") end 1000 for i, n in pairs(releases) do
997 for i, n in pairs(releases) do 1001 local nfile, e = io.open('results/NEW_Packages_' .. n .. '.test.txt', "r")
998 local nfile, e = io.open('results/NEW_Packages_' .. n .. '.test.txt', "r") 1002 if nil == nfile then W("opening results/NEW_Packages_" .. n .. ".test.txt file - " .. e) else
999 if nil == nfile then W("opening results/NEW_Packages_" .. n .. ".test.txt file - " .. e) else 1003 for l in nfile:lines() do
1000 for l in nfile:lines() do 1004 local v, p, sz, m, sha = l:match(' | (.+) | (pool/.+%.deb) | (%d.+) | (%x.+) | (%x.+) |')
1001 local v, p, sz, m, sha = l:match(' | (.+) | (pool/.+%.deb) | (%d.+) | (%x.+) | (%x.+) |') 1005 if nil ~= p then
1002 if nil ~= p then 1006 local status, fsz = execute('ls -l results/' .. pu.host .. "/merged/" .. p .. ' | cut -d " " -f 5-5')
1003 local status, fsz = execute('ls -l results/' .. pu.host .. "/merged/" .. p .. ' | cut -d " " -f 5-5') 1007 if testing("Integrity") then
1004 if testing("Integrity") then 1008 if sz ~= fsz:sub(2, -2) then -- The sub bit is to slice off the EOLs at each end.
1005 if sz ~= fsz:sub(2, -2) then -- The sub bit is to slice off the EOLs at each end. 1009 E('Package size mismatch - results/' .. pu.host .. "/merged/" .. p, 'http', 'Integrity', pu.host)
1006 E('Package size mismatch - results/' .. pu.host .. "/merged/" .. p, 'http', 'Integrity', pu.host) 1010 print('|' .. sz .. '~=' .. fsz:sub(2, -2) .. '|')
1007 print('|' .. sz .. '~=' .. fsz:sub(2, -2) .. '|') 1011 else
1008 else 1012 local status, fm = execute('md5sum results/' .. pu.host .. "/merged/" .. p .. ' | cut -d " " -f 1')
1009 local status, fm = execute('md5sum results/' .. pu.host .. "/merged/" .. p .. ' | cut -d " " -f 1') 1013 if m ~= fm:sub(2, -2) then E('Package MD5 sum mismatch - results/' .. pu.host .. "/merged/" .. p, 'http', 'Integrity', pu.host) end
1010 if m ~= fm:sub(2, -2) then E('Package MD5 sum mismatch - results/' .. pu.host .. "/merged/" .. p, 'http', 'Integrity', pu.host) end 1014 local status, fsha = execute('sha256sum results/' .. pu.host .. "/merged/" .. p .. ' | cut -d " " -f 1')
1011 local status, fsha = execute('sha256sum results/' .. pu.host .. "/merged/" .. p .. ' | cut -d " " -f 1') 1015 if sha ~= fsha:sub(2, -2) then E('Package SHA256 sum mismatch - results/' .. pu.host .. "/merged/" .. p, 'http', 'Integrity', pu.host) end
1012 if sha ~= fsha:sub(2, -2) then E('Package SHA256 sum mismatch - results/' .. pu.host .. "/merged/" .. p, 'http', 'Integrity', pu.host) end 1016 end
1013 end 1017 end
1014 end 1018 if testing("Updated") then
1015 if testing("Updated") then 1019 if sz ~= fsz:sub(2, -2) then
1016 if sz ~= fsz:sub(2, -2) then 1020 E('Package size mismatch - results/' .. pu.host .. "/merged/" .. p, 'http', 'Updated', pu.host)
1017 E('Package size mismatch - results/' .. pu.host .. "/merged/" .. p, 'http', 'Updated', pu.host) 1021 end
1018 end 1022 end
1019 end 1023 end
1020 end 1024 end
@@ -1022,6 +1026,17 @@ if 0 < #arg then
1022 end 1026 end
1023 end 1027 end
1024 1028
1029 else
1030 for k, v in pairs{"ftp", "http", "https", "rsync"} do
1031 if testing(v) then
1032 local tests = results[v]
1033 if testing("Integrity") then tests.Integrity = {errors = -1; warnings = -1} end
1034 if testing("Protocol") then tests.Protocol = {errors = -1; warnings = -1} end
1035 if testing("Updated") then tests.Updated = {errors = -1; warnings = -1} end
1036 if testing("URLSanity") then tests.URLSanity = {errors = -1; warnings = -1} end
1037 results[v] = tests
1038 end
1039 end
1025 end 1040 end
1026 end 1041 end
1027 1042