diff options
| -rw-r--r-- | README.md | 1 | ||||
| -rw-r--r-- | apt-panopticommon.lua | 35 | ||||
| -rwxr-xr-x | apt-panopticon.lua | 14 | ||||
| -rwxr-xr-x | laggers | 3 | ||||
| -rwxr-xr-x | update_apt-panopticon | 12 |
5 files changed, 49 insertions, 16 deletions
| @@ -55,6 +55,7 @@ installed - | |||
| 55 | * lua-rrd | 55 | * lua-rrd |
| 56 | * LuaSocket, on Debian based systems it'll be in the lua-socket package. | 56 | * LuaSocket, on Debian based systems it'll be in the lua-socket package. |
| 57 | * md5sum and sha256, on Debian based systems they'll be in the coreutils package. | 57 | * md5sum and sha256, on Debian based systems they'll be in the coreutils package. |
| 58 | * timeout, on Debian based systems it'll be in the coreutils package. | ||
| 58 | * rrdtool | 59 | * rrdtool |
| 59 | * xz, on Debian based systems it'll be in the xz-utils package. | 60 | * xz, on Debian based systems it'll be in the xz-utils package. |
| 60 | 61 | ||
diff --git a/apt-panopticommon.lua b/apt-panopticommon.lua index da1fc3d..a2def5a 100644 --- a/apt-panopticommon.lua +++ b/apt-panopticommon.lua | |||
| @@ -134,7 +134,7 @@ APT.parseArgs = function(args) | |||
| 134 | local arg = {} | 134 | local arg = {} |
| 135 | local sendArgs = "" | 135 | local sendArgs = "" |
| 136 | -- A special test to disable IPv6 tests if IPv6 isn't available. | 136 | -- A special test to disable IPv6 tests if IPv6 isn't available. |
| 137 | if 1 == APT.exe('ip -6 addr | grep inet6 | grep " global"'):Do().status then | 137 | if 1 == APT.exe('ip -6 addr | grep inet6 | grep " global"'):timeout():Do().status then |
| 138 | table.insert(args, '--tests=-IPv6') | 138 | table.insert(args, '--tests=-IPv6') |
| 139 | end | 139 | end |
| 140 | if 0 ~= #(args) then | 140 | if 0 ~= #(args) then |
| @@ -529,7 +529,7 @@ APT.tested = function(prot, test, host) | |||
| 529 | end | 529 | end |
| 530 | 530 | ||
| 531 | APT.exe = function(c) | 531 | APT.exe = function(c) |
| 532 | local exe = {status = 0, result = '', log = true, cmd = c .. ' '} | 532 | local exe = {status = 0, result = '', log = true, cmd = c .. ' ', command = c} |
| 533 | 533 | ||
| 534 | function exe:log() | 534 | function exe:log() |
| 535 | self.log = true | 535 | self.log = true |
| @@ -543,6 +543,16 @@ APT.exe = function(c) | |||
| 543 | end | 543 | end |
| 544 | return self | 544 | return self |
| 545 | end | 545 | end |
| 546 | function exe:timeout(c) | ||
| 547 | -- timeout returns a status of - command status if --preserve-status; "128+9" (actually 137) if --kill-after ends up being done; 124 if it had to TERM; command status if all went well. | ||
| 548 | -- --kill-after means "send KILL after TERM fails. | ||
| 549 | if nil == c then | ||
| 550 | self.cmd = 'timeout --kill-after=10.0 --foreground -v 42.0s ' .. self.cmd | ||
| 551 | else | ||
| 552 | self.cmd = 'timeout --kill-after=10.0 --foreground -v ' .. c .. ' ' .. self.cmd | ||
| 553 | end | ||
| 554 | return self | ||
| 555 | end | ||
| 546 | function exe:also(c) | 556 | function exe:also(c) |
| 547 | if nil == c then c = '' else c = ' ' .. c end | 557 | if nil == c then c = '' else c = ' ' .. c end |
| 548 | self.cmd = self.cmd .. ';' .. c .. ' ' | 558 | self.cmd = self.cmd .. ';' .. c .. ' ' |
| @@ -579,17 +589,28 @@ APT.exe = function(c) | |||
| 579 | I'm getting 7168 or 0. No idea what the fuck that is. | 589 | I'm getting 7168 or 0. No idea what the fuck that is. |
| 580 | local ok, rslt, status = os.execute(s) | 590 | local ok, rslt, status = os.execute(s) |
| 581 | ]] | 591 | ]] |
| 582 | local f = APT.readCmd(self.cmd .. ' ; echo "$?"', 'r') | 592 | local f = APT.readCmd(self.cmd, 'r') |
| 583 | -- The last line will be the command's returned status, collect everything else in result. | 593 | -- The last line will be the command's returned status, collect everything else in result. |
| 584 | self.status = '' -- Otherwise the result starts with 0. | 594 | self.status = '' -- Otherwise the result starts with 0. |
| 595 | self.result = '\n' | ||
| 596 | for i,l in ipairs(f) do | ||
| 597 | self.result = self.result .. l .. "\n" | ||
| 598 | end | ||
| 599 | f = APT.readCmd('echo "$?"', 'r') | ||
| 585 | for i,l in ipairs(f) do | 600 | for i,l in ipairs(f) do |
| 586 | self.result = self.result .. self.status .. "\n" | 601 | self.status = tonumber(l) |
| 587 | self.status = l | 602 | if (137 == self.status) or (124 == self.status) then |
| 603 | print("timeout killed " .. self.status .. ' ' .. self.command) | ||
| 604 | E("timeout killed " .. self.status .. ' ' .. self.command) | ||
| 605 | elseif (0 ~= self.status) then | ||
| 606 | print("status |" .. self.status .. '| ' .. self.command) | ||
| 607 | E("status |" .. self.status .. '| ' .. self.command) | ||
| 608 | end | ||
| 588 | end | 609 | end |
| 589 | self.status = tonumber(self.status) | ||
| 590 | return self | 610 | return self |
| 591 | end | 611 | end |
| 592 | function exe:fork() | 612 | function exe:fork(host) |
| 613 | if nil ~= host then self.cmd = self.cmd .. '; r=$?; if [ $r -ge 124 ]; then echo "$r ' .. host .. ' failed forked command ' .. string.gsub(self.cmd, '"', "'") .. '"; fi' end | ||
| 593 | self.cmd = '{ ' .. self.cmd .. '; } &' | 614 | self.cmd = '{ ' .. self.cmd .. '; } &' |
| 594 | if true == self.log then D(" forking - <code>" .. self.cmd .. "</code>") end | 615 | if true == self.log then D(" forking - <code>" .. self.cmd .. "</code>") end |
| 595 | os.execute(self.cmd) | 616 | os.execute(self.cmd) |
diff --git a/apt-panopticon.lua b/apt-panopticon.lua index 8fd39e5..93243a4 100755 --- a/apt-panopticon.lua +++ b/apt-panopticon.lua | |||
| @@ -330,7 +330,7 @@ checkHEAD = function (host, URL, r, retry, sanity) | |||
| 330 | 'curl -I --retry 0 -s --path-as-is --connect-timeout ' .. APT.options.timeout.value .. ' --max-redirs 0 ' .. APT.IPv46 .. ' ' .. | 330 | 'curl -I --retry 0 -s --path-as-is --connect-timeout ' .. APT.options.timeout.value .. ' --max-redirs 0 ' .. APT.IPv46 .. ' ' .. |
| 331 | IP .. ' ' .. '-o /dev/null -D results/"HEADERS_' .. fname .. '" ' .. | 331 | IP .. ' ' .. '-o /dev/null -D results/"HEADERS_' .. fname .. '" ' .. |
| 332 | hdr .. ' -w "#%{http_code} %{ssl_verify_result} %{url_effective}\\n" ' .. PU.scheme .. '://' .. host .. PU.path .. ' >>results/"STATUS_' .. fname .. '"' | 332 | hdr .. ' -w "#%{http_code} %{ssl_verify_result} %{url_effective}\\n" ' .. PU.scheme .. '://' .. host .. PU.path .. ' >>results/"STATUS_' .. fname .. '"' |
| 333 | ):Nice():log():Do().status | 333 | ):timeout(APT.options.maxtime.value * 2.0):Nice():log():Do().status |
| 334 | if 0 < r then | 334 | if 0 < r then |
| 335 | APT.tested(PU.scheme, 'Redirects', host) | 335 | APT.tested(PU.scheme, 'Redirects', host) |
| 336 | else | 336 | else |
| @@ -356,7 +356,7 @@ checkHEAD = function (host, URL, r, retry, sanity) | |||
| 356 | if 0 ~= status then | 356 | if 0 ~= status then |
| 357 | local msg = curlStatus[status] | 357 | local msg = curlStatus[status] |
| 358 | if nil == msg then msg = "UNKNOWN CURL STATUS CODE!" end | 358 | if nil == msg then msg = "UNKNOWN CURL STATUS CODE!" end |
| 359 | if (28 == status) or (7 == status) then | 359 | if (128+9 == status) or (124 == status) or (28 == status) or (7 == status) then |
| 360 | T(spcd .. spcd .. "TIMEOUT " .. timeouts + 1 .. ", retry " .. retry + 1 .. ' ' .. APT.lnk(URL), PU.scheme, sanity, host) | 360 | T(spcd .. spcd .. "TIMEOUT " .. timeouts + 1 .. ", retry " .. retry + 1 .. ' ' .. APT.lnk(URL), PU.scheme, sanity, host) |
| 361 | timeouts = timeouts + 1 | 361 | timeouts = timeouts + 1 |
| 362 | else | 362 | else |
| @@ -447,7 +447,7 @@ checkHEAD = function (host, URL, r, retry, sanity) | |||
| 447 | local pth = path:match('^(.*/pool/).*$') | 447 | local pth = path:match('^(.*/pool/).*$') |
| 448 | if nil ~= pth then table.insert(APT.results[PU.scheme].redirects, pu.host .. "/" .. pth) else E(spcd .. spcd .. 'Odd redirect path ' .. path) end | 448 | if nil ~= pth then table.insert(APT.results[PU.scheme].redirects, pu.host .. "/" .. pth) else E(spcd .. spcd .. 'Odd redirect path ' .. path) end |
| 449 | I(spcd .. spcd .. "Now checking redirected host " .. u .. ' for ' .. APT.lnk(URL) .. arw .. APT.lnk(location), host) | 449 | I(spcd .. spcd .. "Now checking redirected host " .. u .. ' for ' .. APT.lnk(URL) .. arw .. APT.lnk(location), host) |
| 450 | APT.exe(downloadLock .. "REDIR-" .. check .. ".log.txt" .. " ./apt-panopticon.lua " .. extraArgs .. ' ' .. pu.host .. "/" .. path .. " " .. file):Nice():log():fork() | 450 | APT.exe(downloadLock .. "REDIR-" .. check .. ".log.txt" .. " ./apt-panopticon.lua " .. extraArgs .. ' ' .. pu.host .. "/" .. path .. " " .. file):timeout(APT.options.maxtime.value * 2.0):Nice():log():fork(pu.host) |
| 451 | D(spcd .. 'logging to ' .. APT.logName(pu.host, nil, file)[2]) | 451 | D(spcd .. 'logging to ' .. APT.logName(pu.host, nil, file)[2]) |
| 452 | APT.tested(PU.scheme, 'Redirects', host) | 452 | APT.tested(PU.scheme, 'Redirects', host) |
| 453 | end | 453 | end |
| @@ -534,7 +534,7 @@ checkHost = function (orig, host, path, ip, file) | |||
| 534 | else | 534 | else |
| 535 | if orig == host then | 535 | if orig == host then |
| 536 | I("Testing mirror " .. orig .. "" .. file) | 536 | I("Testing mirror " .. orig .. "" .. file) |
| 537 | APT.exe("./apt-panopticon.lua " .. sendArgs .. " -o " .. orig .. path .. " " .. file):Nice():log():fork() | 537 | APT.exe("./apt-panopticon.lua " .. sendArgs .. " -o " .. orig .. path .. " " .. file):timeout(APT.options.maxtime.value * 2.0):Nice():log():fork(orig) |
| 538 | D('logging to ' .. APT.logName(ph.host, nil, file)[2]) | 538 | D('logging to ' .. APT.logName(ph.host, nil, file)[2]) |
| 539 | else D("checkHost " .. orig .. arw .. host) end | 539 | else D("checkHost " .. orig .. arw .. host) end |
| 540 | end | 540 | end |
| @@ -618,7 +618,7 @@ local downloads = function(host, URL, meta, release, list) | |||
| 618 | end | 618 | end |
| 619 | end | 619 | end |
| 620 | f:close() | 620 | f:close() |
| 621 | APT.exe(cm):Nice():log():fork() | 621 | APT.exe(cm):timeout(APT.options.maxtime.value * 2.0):Nice():log():fork(host) |
| 622 | D('logging to <a href="' .. log .. '">' .. log .. '</a>, with <a href="' .. files .. '">these files</a>') | 622 | D('logging to <a href="' .. log .. '">' .. log .. '</a>, with <a href="' .. files .. '">these files</a>') |
| 623 | end | 623 | end |
| 624 | 624 | ||
| @@ -1129,9 +1129,9 @@ if 0 < #arg then | |||
| 1129 | APT.allpairs(ips, | 1129 | APT.allpairs(ips, |
| 1130 | function(k, v) | 1130 | function(k, v) |
| 1131 | if v == "A" then | 1131 | if v == "A" then |
| 1132 | if APT.testing("IPv4") then APT.exe('./apt-panopticon.lua ' .. sendArgs .. ' -4 ' .. pu.host .. path .. ' ' .. k .. ' ' .. file):Nice():log():fork() end | 1132 | if APT.testing("IPv4") then APT.exe('./apt-panopticon.lua ' .. sendArgs .. ' -4 ' .. pu.host .. path .. ' ' .. k .. ' ' .. file):timeout(APT.options.maxtime.value * 2.0):Nice():log():fork(pu.host) end |
| 1133 | elseif v == "AAAA" then | 1133 | elseif v == "AAAA" then |
| 1134 | if APT.testing("IPv6") then APT.exe('./apt-panopticon.lua ' .. sendArgs .. ' -6 ' .. APT.IPv46 .. ' ' .. pu.host .. path .. ' ' .. k .. ' ' .. file):Nice():log():fork() end | 1134 | if APT.testing("IPv6") then APT.exe('./apt-panopticon.lua ' .. sendArgs .. ' -6 ' .. APT.IPv46 .. ' ' .. pu.host .. path .. ' ' .. k .. ' ' .. file):timeout(APT.options.maxtime.value * 2.0):Nice():log():fork(pu.host) end |
| 1135 | end | 1135 | end |
| 1136 | D('logging to ' .. APT.logName(pu.host, k, file)[2]) | 1136 | D('logging to ' .. APT.logName(pu.host, k, file)[2]) |
| 1137 | end | 1137 | end |
| @@ -0,0 +1,3 @@ | |||
| 1 | #!/bin/bash | ||
| 2 | echo "apt-panopticon processes still running -" | ||
| 3 | ps ax -o pid,args --sort args | grep -E 'apt-panopticon\.lua | curl | dig ' | grep -v -E 'flock -n |grep -E |sh -c |timeout -k ' | ||
diff --git a/update_apt-panopticon b/update_apt-panopticon index 8edb43d..abbc154 100755 --- a/update_apt-panopticon +++ b/update_apt-panopticon | |||
| @@ -14,18 +14,26 @@ fi | |||
| 14 | # Check if the lock file still exists. | 14 | # Check if the lock file still exists. |
| 15 | if [ -f apt-panopticon.lock ] ; then | 15 | if [ -f apt-panopticon.lock ] ; then |
| 16 | # Check if it's still running. | 16 | # Check if it's still running. |
| 17 | ps ax -eo pid,args | grep "luajit ./apt-panopticon.lua" | grep -v "grep luajit ./apt-panopticon.lua" | while read line ; do touch apt-panopticon.running ; exit ; done | 17 | ps ax -eo pid,args | grep "apt-panopticon.lua" | grep -v "grep apt-panopticon.lua" | while read line ; do touch apt-panopticon.running ; exit ; done |
| 18 | if [ -f apt-panopticon.running ] ; then | 18 | if [ -f apt-panopticon.running ] ; then |
| 19 | echo "Previous apt-panopticon still running, exiting." | 19 | echo "Previous apt-panopticon still running, exiting." |
| 20 | echo "Previous apt-panopticon still running, exiting." | ||
| 21 | ./laggers | ||
| 20 | rm apt-panopticon.running | 22 | rm apt-panopticon.running |
| 21 | exit 1 | 23 | exit 1 |
| 22 | fi | 24 | fi |
| 23 | echo "Crashed apt-panopticon detected, removing stale lock file." | 25 | echo "Crashed apt-panopticon detected, removing stale lock file." |
| 26 | echo "Crashed apt-panopticon detected, removing stale lock file." | ||
| 27 | ./laggers | ||
| 24 | rm apt-panopticon.lock | 28 | rm apt-panopticon.lock |
| 25 | fi | 29 | fi |
| 26 | 30 | ||
| 27 | rm ../results; ln -s apt-panopticon/results_old ../results | 31 | rm ../results; ln -s apt-panopticon/results_old ../results |
| 28 | flock -n apt-panopticon.lock ./apt-panopticon.lua && rm apt-panopticon.lock | 32 | flock -n apt-panopticon.lock ionice -c3 nice -n 19 timeout --kill-after=20.0 --foreground -v 8.5m ./apt-panopticon.lua && rm apt-panopticon.lock |
| 33 | if [ -f apt-panopticon.lock ] ; then | ||
| 34 | echo "apt-panopticon timed out." | ||
| 35 | ./laggers | ||
| 36 | fi | ||
| 29 | rm ../results; ln -s apt-panopticon/results ../results | 37 | rm ../results; ln -s apt-panopticon/results ../results |
| 30 | 38 | ||
| 31 | chown -R www-data:www-data * | 39 | chown -R www-data:www-data * |
