aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rwxr-xr-xmirror-checker.lua61
1 files changed, 46 insertions, 15 deletions
diff --git a/mirror-checker.lua b/mirror-checker.lua
index aea816e..01082d9 100755
--- a/mirror-checker.lua
+++ b/mirror-checker.lua
@@ -130,14 +130,28 @@ dumpTableSub = function (table, space)
130 end 130 end
131 return r 131 return r
132end 132end
133local log = function(v, t, s, test, host) 133
134local ip = ""
135local results = {}
136
137local log = function(v, t, s, prot, test, host)
134 local x = "" 138 local x = ""
135 if nil ~= test then x = x .. test end 139 if nil == prot then prot = "" end
140 if nil ~= test then x = x .. test else test = "" end
136 if nil ~= host then 141 if nil ~= host then
137 if #x > 0 then x = x .. " " end 142 if #x > 0 then x = x .. " " end
138 x = x .. host 143 x = x .. host
139 end 144 end
140 if #x > 0 then t = t .. "(" .. x .. ")" end 145 if #x > 0 then
146 t = t .. "(" .. x .. ")"
147 if "" == test then
148 if v == 0 then results[prot].errors = results[prot].errors + 1 end
149 if v == 1 then results[prot].warnings = results[prot].warnings + 1 end
150 else
151 if v == 0 then results[prot][test].errors = results[prot][test].errors + 1 end
152 if v == 1 then results[prot][test].warnings = results[prot][test].warnings + 1 end
153 end
154 end
141 if v <= verbosity then 155 if v <= verbosity then
142 if 3 <= verbosity then t = os.date() .. " " .. t end 156 if 3 <= verbosity then t = os.date() .. " " .. t end
143 print(t .. ": " .. s) 157 print(t .. ": " .. s)
@@ -149,8 +163,8 @@ local log = function(v, t, s, test, host)
149end 163end
150local D = function(s) log(3, "DEBUG ", s) end 164local D = function(s) log(3, "DEBUG ", s) end
151local I = function(s) log(2, "INFO ", s) end 165local I = function(s) log(2, "INFO ", s) end
152local W = function(s, t, h) log(1, "WARNING ", s, t, h) end 166local W = function(s, p, t, h) log(1, "WARNING ", s, p, t, h) end
153local E = function(s, t, h) log(0, "ERROR ", s, t, h) end 167local E = function(s, p, t, h) log(0, "ERROR ", s, p, t, h) end
154local C = function(s) log(-1, "CRITICAL", s) end 168local C = function(s) log(-1, "CRITICAL", s) end
155 169
156local mirrors = {} 170local mirrors = {}
@@ -231,15 +245,15 @@ checkHEAD = function (host, URL, r, retry)
231 check = "Retry " .. retry .. " " .. check 245 check = "Retry " .. retry .. " " .. check
232 end 246 end
233 if 3 < timeouts then 247 if 3 < timeouts then
234 E("too many timeouts! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, host) 248 E("too many timeouts! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host)
235 return 249 return
236 end 250 end
237 if 20 < r then 251 if 20 < r then
238 E("too many redirects! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, host) 252 E("too many redirects! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host)
239 return 253 return
240 end 254 end
241 if 4 < retry then 255 if 4 < retry then
242 E("too many retries! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, host) 256 E("too many retries! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host)
243 return 257 return
244 end 258 end
245 D(PU.scheme .. " :// " .. check .. " " .. host .. " -> " .. URL) 259 D(PU.scheme .. " :// " .. check .. " " .. host .. " -> " .. URL)
@@ -256,13 +270,13 @@ checkHEAD = function (host, URL, r, retry)
256 local p, c, h, s = htp.request{method = "HEAD", redirect = false, url = URL, headers = hd, protocol = "any", options = "all"} 270 local p, c, h, s = htp.request{method = "HEAD", redirect = false, url = URL, headers = hd, protocol = "any", options = "all"}
257 if nil == s then s = "" end 271 if nil == s then s = "" end
258 if nil == p then 272 if nil == p then
259 E(" " .. c .. " " .. s .. "! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, host) 273 E(" " .. c .. " " .. s .. "! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host)
260 -- So far the only errors are "timeout", "Network is unreachable", and "closed", and I suspect "closed" is due to saturating my bandwidth. 274 -- So far the only errors are "timeout", "Network is unreachable", and "closed", and I suspect "closed" is due to saturating my bandwidth.
261 if "timeout" == c then timeouts = timeouts + 1 end 275 if "timeout" == c then timeouts = timeouts + 1 end
262 if ("closed" == c) or ("Network is unreachable" == c) or ("timeout" == c) then checkHEAD(host, URL, r, retry + 1, timeouts) end 276 if ("closed" == c) or ("Network is unreachable" == c) or ("timeout" == c) then checkHEAD(host, URL, r, retry + 1, timeouts) end
263 else 277 else
264 if ("4" == tostring(c):sub(1, 1)) or ("5" == tostring(c):sub(1, 1)) then 278 if ("4" == tostring(c):sub(1, 1)) or ("5" == tostring(c):sub(1, 1)) then
265 E(" " .. c .. " " .. s .. ". " .. check .. " " .. host .. " -> " .. URL, PU.scheme, host) 279 E(" " .. c .. " " .. s .. ". " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host)
266 else 280 else
267 I(" " .. c .. " " .. s .. ". " .. check .. " " .. host .. " -> " .. URL) 281 I(" " .. c .. " " .. s .. ". " .. check .. " " .. host .. " -> " .. URL)
268 timeouts = timeouts - 1 -- Backoff the timeouts count if we managed to get through. 282 timeouts = timeouts - 1 -- Backoff the timeouts count if we managed to get through.
@@ -271,12 +285,12 @@ checkHEAD = function (host, URL, r, retry)
271 if nil ~= l then 285 if nil ~= l then
272 pu = url.parse(l, defaultURL) 286 pu = url.parse(l, defaultURL)
273 if (pu.scheme ~= PU.scheme) then 287 if (pu.scheme ~= PU.scheme) then
274 if testing("Protocol") then W(" protocol changed during redirect! " .. check .. " " .. host .. " -> " .. URL .. " -> " .. l, PU.scheme, host) end 288 if testing("Protocol") then W(" protocol changed during redirect! " .. check .. " " .. host .. " -> " .. URL .. " -> " .. l, PU.scheme, "Protocol", host) end
275 if (pu.host == host) and pu.path == PU.path then D("Not testing protocol change " .. URL .. " -> " .. l); return end 289 if (pu.host == host) and pu.path == PU.path then D("Not testing protocol change " .. URL .. " -> " .. l); return end
276 end 290 end
277 291
278 if l == URL then 292 if l == URL then
279 E(" redirect loop! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, host) 293 E(" redirect loop! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, PU.scheme, host)
280 elseif nil == pu.host then 294 elseif nil == pu.host then
281 I(" relative redirect. " .. check .. " " .. host .. " -> " .. URL .. " -> " .. l) 295 I(" relative redirect. " .. check .. " " .. host .. " -> " .. URL .. " -> " .. l)
282 checkHEAD(host, PU.scheme .. "://" .. PU.host .. l, r + 1) 296 checkHEAD(host, PU.scheme .. "://" .. PU.host .. l, r + 1)
@@ -541,15 +555,27 @@ if 0 < #arg then
541 end 555 end
542 local pu = url.parse("http://" .. arg[1]) 556 local pu = url.parse("http://" .. arg[1])
543 if nil ~= arg[2] then 557 if nil ~= arg[2] then
544 logFile, e = io.open("results/mirror-checker-lua_" .. pu.host .. "_" .. arg[2] .. ".log", "a+") 558 logFile, e = io.open("results/" .. pu.host .. "_" .. arg[2] .. ".log", "a+")
545 else 559 else
546 logFile, e = io.open("results/mirror-checker-lua_" .. pu.host .. ".log", "a+") 560 logFile, e = io.open("results/" .. pu.host .. ".log", "a+")
547 end 561 end
548 if nil == logFile then C("opening log file - " .. e); return end 562 if nil == logFile then C("opening log file - " .. e); return end
549 I("Starting tests for " ..arg[1] .. " with these tests - " .. table.concat(options.tests.value, ", ")) 563 I("Starting tests for " ..arg[1] .. " with these tests - " .. table.concat(options.tests.value, ", "))
550 mirrors = loadfile("results/mirrors.lua")() 564 mirrors = loadfile("results/mirrors.lua")()
551 if nil ~= arg[2] then I(" Using IP " .. arg[2]) end 565 if nil ~= arg[2] then I(" Using IP " .. arg[2]); ip = arg[2] end
552 if nil ~= arg[3] then I(" Using file " .. arg[3]); end 566 if nil ~= arg[3] then I(" Using file " .. arg[3]); end
567
568 for k, v in pairs{"ftp", "http", "https", "rsync"} do
569 if testing(v) then
570 local tests = {errors = 0; warnings = 0}
571 if testing("Integrity") then tests.Integrity = {errors = 0; warnings = 0} end
572 if testing("Protocol") then tests.Protocol = {errors = 0; warnings = 0} end
573 if testing("Updated") then tests.Updated = {errors = 0; warnings = 0} end
574 if testing("URL-Sanity") then tests.URL_Sanity = {errors = 0; warnings = 0} end
575 results[v] = tests
576 end
577 end
578
553 if testing("Integrity") or testing("Updated") then 579 if testing("Integrity") or testing("Updated") then
554 if nil == arg[3] then 580 if nil == arg[3] then
555 if not keep then execute("rm -fr results/" .. pu.host) end 581 if not keep then execute("rm -fr results/" .. pu.host) end
@@ -568,6 +594,11 @@ if 0 < #arg then
568 checkHost(pu.host, pu.host, pu.path, arg[2], arg[3]) 594 checkHost(pu.host, pu.host, pu.path, arg[2], arg[3])
569 end 595 end
570 logFile:close() 596 logFile:close()
597 local rfile, e = io.open("results/" .. pu.host .. "_" .. ip .. ".lua", "w+")
598 if nil == rfile then C("opening results file - " .. e) else
599 rfile:write(dumpTable(results, "", "results") .. "\nreturn results\n")
600 rfile:close()
601 end
571else 602else
572 if not keep then os.execute("rm -f results/*.log") end 603 if not keep then os.execute("rm -f results/*.log") end
573 os.execute("rm -f results/*.check") 604 os.execute("rm -f results/*.check")