aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rwxr-xr-xapt-panopticon.lua56
1 files changed, 40 insertions, 16 deletions
diff --git a/apt-panopticon.lua b/apt-panopticon.lua
index cd1bca0..ed08c66 100755
--- a/apt-panopticon.lua
+++ b/apt-panopticon.lua
@@ -48,6 +48,12 @@ options =
48-- "Updated", 48-- "Updated",
49 }, 49 },
50 }, 50 },
51 timeout =
52 {
53 typ = "number",
54 help = "",
55 value = 15,
56 },
51 reports = 57 reports =
52 { 58 {
53 typ = "table", 59 typ = "table",
@@ -389,6 +395,7 @@ local nlst = function (u)
389end 395end
390 396
391local timeouts = 0; 397local timeouts = 0;
398local totalTimeouts = 0
392checkHEAD = function (host, URL, r, retry) 399checkHEAD = function (host, URL, r, retry)
393 if nil == r then r = 0 end 400 if nil == r then r = 0 end
394 if nil == retry then retry = 0 end 401 if nil == retry then retry = 0 end
@@ -399,13 +406,17 @@ checkHEAD = function (host, URL, r, retry)
399 check = "Redirecting to" 406 check = "Redirecting to"
400 end 407 end
401 if 0 < retry then 408 if 0 < retry then
402 os.execute("sleep " .. math.random(1, 4)) 409 os.execute("sleep " .. math.random(1, 3))
403 check = "Retry " .. retry .. " " .. check 410 check = "Retry " .. retry .. " " .. check
404 end 411 end
405 if 2 <= timeouts then 412 if 2 <= timeouts then
406 E("too many timeouts! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host) 413 E("too many timeouts! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host)
407 return 414 return
408 end 415 end
416 if 4 <= (totalTimeouts) then
417 E("Way too many timeouts!", PU.scheme, "", host)
418 return
419 end
409 if 20 <= r then 420 if 20 <= r then
410 E("too many redirects! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host) 421 E("too many redirects! " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host)
411 return 422 return
@@ -442,7 +453,7 @@ checkHEAD = function (host, URL, r, retry)
442 end 453 end
443 IP = '--connect-to "' .. pu.host .. '::' .. PU.host .. ':"' 454 IP = '--connect-to "' .. pu.host .. '::' .. PU.host .. ':"'
444 end 455 end
445 local cmd = 'curl -I --retry 0 -s --path-as-is --connect-timeout 15 --max-redirs 0 ' .. IP .. ' ' .. '-o /dev/null -D results/"HEADERS_' .. fname .. '" ' .. 456 local cmd = 'ionice -c3 nice -n 19 curl -I --retry 0 -s --path-as-is --connect-timeout ' .. options.timeout.value .. ' --max-redirs 0 ' .. IP .. ' ' .. '-o /dev/null -D results/"HEADERS_' .. fname .. '" ' ..
446 hdr .. ' -w "#%{http_code} %{ssl_verify_result} %{url_effective}\\n" ' .. PU.scheme .. '://' .. host .. PU.path .. ' >>results/"STATUS_' .. fname .. '"' 457 hdr .. ' -w "#%{http_code} %{ssl_verify_result} %{url_effective}\\n" ' .. PU.scheme .. '://' .. host .. PU.path .. ' >>results/"STATUS_' .. fname .. '"'
447 local status, result = execute(cmd) 458 local status, result = execute(cmd)
448 os.execute('cat results/"HEADERS_' .. fname .. '" >>results/"STATUS_' .. fname .. '" 2>/dev/null; rm results/"HEADERS_' .. fname .. '" 2>/dev/null') 459 os.execute('cat results/"HEADERS_' .. fname .. '" >>results/"STATUS_' .. fname .. '" 2>/dev/null; rm results/"HEADERS_' .. fname .. '" 2>/dev/null')
@@ -479,7 +490,7 @@ checkHEAD = function (host, URL, r, retry)
479 E(" " .. code .. " " .. cstr .. ". " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host) 490 E(" " .. code .. " " .. cstr .. ". " .. check .. " " .. host .. " -> " .. URL, PU.scheme, "", host)
480 else 491 else
481 I(" " .. code .. " " .. cstr .. ". " .. check .. " " .. host .. " -> " .. URL) 492 I(" " .. code .. " " .. cstr .. ". " .. check .. " " .. host .. " -> " .. URL)
482 timeouts = timeouts - 1 -- Backoff the timeouts count if we managed to get through. 493-- timeouts = timeouts - 1 -- Backoff the timeouts count if we managed to get through.
483 if nil ~= location then 494 if nil ~= location then
484 pu = url.parse(location, defaultURL) 495 pu = url.parse(location, defaultURL)
485 if (pu.scheme ~= PU.scheme) then 496 if (pu.scheme ~= PU.scheme) then
@@ -515,31 +526,44 @@ checkHEAD = function (host, URL, r, retry)
515 end 526 end
516end 527end
517 528
529local checkTimeouts = function(host, scheme, URL)
530 if testing(scheme) then
531 totalTimeouts = totalTimeouts + timeouts; timeouts = 0
532 checkHEAD(host, scheme .. "://" .. URL)
533 if 4 <= (totalTimeouts) then
534 E("Way too many timeouts!", scheme, "", host)
535 return true
536 end
537 end
538 return false
539end
540
518local checkFiles = function (host, ip, path, file) 541local checkFiles = function (host, ip, path, file)
542 timeouts = 0
519 if nil == path then path = "" end 543 if nil == path then path = "" end
520 if nil ~= file then 544 if nil ~= file then
521 if "redir" == ip then ip = host end 545 if "redir" == ip then ip = host end
522 I(" Checking IP for file " .. host .. " -> " .. ip .. " " .. path .. " " .. file) 546 I(" Checking IP for file " .. host .. " -> " .. ip .. " " .. path .. " " .. file)
523 if testing("http", host) then checkHEAD(host, "http://" .. ip .. path .. "/" .. file) end 547 if checkTimeouts(host, "http", ip .. path .. "/" .. file) then return end
524 if testing("https", host) then checkHEAD(host, "https://" .. ip .. path .. "/" .. file) end 548 if checkTimeouts(host, "https", ip .. path .. "/" .. file) then return end
549-- if testing("http", host) then checkHEAD(host, "http://" .. ip .. path .. "/" .. file); if checkTimeouts(host, "http" ) then return end; end
550-- if testing("https", host) then checkHEAD(host, "https://" .. ip .. path .. "/" .. file); if checkTimeouts(host, "https") then return end; end
525 else 551 else
526 I(" Checking IP " .. host .. " -> " .. ip .. " " .. path) 552 I(" Checking IP " .. host .. " -> " .. ip .. " " .. path)
527 for i, s in pairs(referenceDevs) do 553 for i, s in pairs(referenceDevs) do
528 local t = timeouts; timeouts = 0 554 if checkTimeouts(host, "http", ip .. path .. "/" .. s) then return end
529 if testing("http", host) then checkHEAD(host, "http://" .. ip .. path .. "/" .. s) end 555 if checkTimeouts(host, "https", ip .. path .. "/" .. s) then return end
530 t = t + timeouts; timeouts = 0 556-- if testing("http", host) then checkHEAD(host, "http://" .. ip .. path .. "/" .. s); if checkTimeouts(host, "http" ) then return end; end
531 if testing("https", host) then checkHEAD(host, "https://" .. ip .. path .. "/" .. s) end 557-- if testing("https", host) then checkHEAD(host, "https://" .. ip .. path .. "/" .. s); if checkTimeouts(host, "https") then return end; end
532 if 4 <= (t + timeouts) then return end
533 end 558 end
534 559
535 for i, s in pairs(releases) do 560 for i, s in pairs(releases) do
536 for j, k in pairs(releaseFiles) do 561 for j, k in pairs(releaseFiles) do
537 if repoExists(s .. k) then 562 if repoExists(s .. k) then
538 local t = timeouts; timeouts = 0 563 if checkTimeouts(host, "http", ip .. path .. "/merged/dists/" .. s .. k) then return end
539 if testing("http", host) then checkHEAD(host, "http://" .. ip .. path .. "/merged/dists/" .. s .. k) end 564 if checkTimeouts(host, "https", ip .. path .. "/merged/dists/" .. s .. k) then return end
540 t = t + timeouts; timeouts = 0 565-- if testing("http", host) then checkHEAD(host, "http://" .. ip .. path .. "/merged/dists/" .. s .. k); if checkTimeouts(host, "http" ) then return end; end
541 if testing("https", host) then checkHEAD(host, "https://" .. ip .. path .. "/merged/dists/" .. s .. k) end 566-- if testing("https", host) then checkHEAD(host, "https://" .. ip .. path .. "/merged/dists/" .. s .. k); if checkTimeouts(host, "https") then return end; end
542 if 4 <= (t + timeouts) then return end
543 end 567 end
544 end 568 end
545 end 569 end
@@ -726,7 +750,7 @@ if 0 ~= #args then
726 end 750 end
727 end 751 end
728 else 752 else
729 options[option].value = a 753 options[option].value = a:sub(e + 1, -1)
730 end 754 end
731 option = "" 755 option = ""
732 end 756 end