pdo; $lockfile = __DIR__ . '/checker.lock'; $full = false; $results = []; if($argc == 2 && $argv[1] == "full") { $full = true; } echo "[CHECKER] Checking lockfile" . PHP_EOL; $fp = fopen($lockfile, 'c'); if(!flock($fp, LOCK_EX | LOCK_NB)) { echo "[CHECKER] Looks like another checker is running, exiting..." . PHP_EOL; exit(-1); } echo "[DB] Fetching hosts to check from database" . PHP_EOL; if ((($options['fullhour'] >= 0) && ($options['fullhour'] <= 23)) && date('H') == $options['fullhour'] || $full) { // check all hosts at full check hour or when argument 'full' passed echo "[CHECKER] Starting FULL check" . PHP_EOL; $STH = $pdo->query("SELECT `host`, `base32` FROM `hosts`"); } else { $STH = $pdo->query("SELECT `host`, `base32` FROM `hosts` WHERE `disabled` = '0'"); } $hosts = $STH->fetchAll(PDO::FETCH_KEY_PAIR); echo "[BOB] Starting session for checking" . PHP_EOL; $bob = new BOB($options); if ($bob->setnick()) { $bob->options(); $bob->newkeys(); $bob->intun(); $bob->start(); /* Sleep 10 seconds awaitng tunnels get built */ echo "[BOB] Session started, awaiting 10 seconds for tunnels" . PHP_EOL; sleep(10); } else { echo "[BOB] Stale session is found, using it" . PHP_EOL; $bob->getnick(); } /* Start async checker tasks */ try { Loop::run(function () use (&$results, $hosts, $options) { $pool = new DefaultPool($options['checkthreads']); $coroutines = []; foreach ($hosts as $host => $base32) { $coroutines[$host] = Amp\call(function () use ($pool, $base32, $options) { return yield $pool->enqueue(new App\Checker($base32, $options)); }); } $results = yield Amp\Promise\all($coroutines); return yield $pool->shutdown(); }); //} catch (Amp\TimeoutException $ex) { } catch (\Throwable $ex) { echo "[Checker] Exception: " . $ex . PHP_EOL; } echo "[BOB] Stopping session" . PHP_EOL; $bob->stop(); $bob->clear(); $bob = null; echo "[DB] Saving check results" . PHP_EOL; $i = 0; $pdo->beginTransaction(); foreach ($results as $host => $ts) { if($ts) { $pdo->exec("UPDATE `hosts` SET `last_seen` = FROM_UNIXTIME(" . $ts . "), `disabled` = 0, `hidden` = 0 WHERE `host` = '" . $host . "'"); $i++; } } $pdo->commit(); echo "[CHECKER] Unlocking and closing lockfile" . PHP_EOL; fclose($fp); echo "[CHECKER] Result: Total hosts: " . count($results) . ", Alive: " . $i . PHP_EOL;