/** * Выполнение <code>nslookup</code> для лейбла. * * @param string $label * @return void * @access public * @static */ public static function exec($label) { DEBUG && printf("NslookupWorker::exec(%s): begin\n", $label); $redis = RKS::getInstance(); // получение свединей о лейбле из кэша Redis $data = $redis->hGetAll('hosts:data:' . $label); DEBUG && printf("NslookupWorker::exec(): Redis->hGetAll('host:data:%s')\n%s\n", $label, var_export($data, true)); if (!$data) { DEBUG && printf("NslookupWorker::exec(): host '%s' not ready\n", $label); return; } // поиск адреса $addr = SystemNslookupWrapper::exec($data['fqdn']); DEBUG && printf("NslookupWorker::exec(): addr = %s\n", var_export($addr, true)); $data_out = ['addr' => $addr, 'status' => $addr ? (int) $data['status'] : HostStatuses::NXDOMAIN]; if (HostStatuses::NXDOMAIN == $data_out['status'] && HostStatuses::NXDOMAIN != $data['status'] || HostStatuses::NXDOMAIN != $data_out['status'] && HostStatuses::NXDOMAIN == $data['status']) { DB::open(); DBQueries::dataPush($data['id'], $data_out['status'], 0); DB::close(); } DEBUG && printf("NslookupWorker::exec(): Redis->hMset('host:data:%s', %s)\n", $label, var_export($data_out, true)); // запись сведений в кэш Redis $redis->hMset('hosts:data:' . $label, $data_out); DEBUG && (print "NslookupWorker::exec(): end\n\n"); }
/** * Заполнение слотов, выделяемых Воркерам. * * @access protected * @static */ protected static function recalcSlots() { DEBUG && (print "Master::recalcSlots(): begin\n"); if (Config::$fork_threads) { DEBUG && printf("Master::recalcSlots(): preconfigured size = %d\n", Config::$fork_threads); if (count(static::$pid_slots) != Config::$fork_threads) { static::$pid_slots = range(1, Config::$fork_threads); } } else { $cnt = min(32, count(RKS::getInstance()->sMembers('hosts:enabled'))); DEBUG && printf("Master::recalcSlots(): dynamic size = %d\n", $cnt); static::$pid_slots = range(1, $cnt); RKS::close(); } DEBUG && (print "Master::recalcSlots(): end\n\n"); }
/** * Деактивация хоста. * * @param string $label Лейбл деактивируемого хоста. * @access public * @static */ public static function cmdDisable($label) { // первичная проверка аргументов if (!preg_match('~^[a-z0-9-]{3,48}$~', $label)) { fwrite(STDERR, "Label contains invalid characters. Only [a-z0-9-]{3,48} allowed.\n"); exit(1); } // подключение к СУБД DB::open(); // поиск лейбла в базе хостов $res = DBQueries::hostByLabel($label); if (0 == $res->num_rows) { fwrite(STDERR, spinrtf("Host with label '%s' was not found.\n", $label)); exit(1); } if (1 < $res->num_rows) { fwrite(STDERR, sprintf("Fatal: Expected 1 row, has %d\n", $res->num_rows)); exit(1); } /* @var $host \Ganzal\Lulz\Pinger\Assets\Host */ $host = $res->fetch_object('\\Ganzal\\Lulz\\Pinger\\Assets\\Host'); if (0 == $host->host_enabled) { fwrite(STDERR, "Host is already disabled.\n"); } else { // обновление статуса в таблице хостов $res = DBQueries::hostXXable($host->host_id, 0); // отсечка о прекращении сбора данных DBQueries::dataPush($host->host_id, HostStatuses::DISABLED, 0); /* @var $redis \Redis */ $redis = RKS::getInstance(); // обновление статуса в кэше Redis. // удаление лейбла из списка hosts:enabled отключает будущие пинги. // удаление из всех пулов queue:* так как не известно где он может быть. $redis->sRemove("hosts:enabled", $label); $redis->sRemove("queue:ping:ok", $label); $redis->sRemove("queue:ping:prefailed", $label); $redis->sRemove("queue:ping:failed", $label); $redis->sRemove("queue:nslookup", $label); $redis->hMset('hosts:data:' . $label, ['state' => '', 'status' => '']); fwrite(STDERR, "Host successfully disabled.\n"); } exit(0); }
/** * Выполнение <code>ping</code> для лейбла. * * @param string $label * @return void * @access public * @static */ public static function exec($label) { DEBUG && printf("PingWorker::exec(%s): begin\n", $label); $redis = RKS::getInstance(); // получение свединей о лейбле из кэша Redis $data = $redis->hGetAll('hosts:data:' . $label); DEBUG && printf("PingWorker::exec(): Redis->hGetAll('host:data:%s')\n%s\n", $label, var_export($data, true)); $status = HostStatuses::UNKNOWN; if (!$data || HostStatuses::NXDOMAIN == $data['status']) { DEBUG && printf("PingWorker::exec(): host '%s' not ready\n", $label); if ($data && isset($data['id']) && isset($data['status'])) { DBQueries::dataPush($data['id'], HostStatuses::NXDOMAIN, 0); } return; } // получение статуса хоста if (0 != $data['addr']) { if (!$data['state']) { $data['state'] = 0; } switch ($data['state'] & 0x3) { case 0: $timeout = Config::$ping_timeout_fail; case 2: $timeout = Config::$ping_timeout_prefail; case 3: default: $timeout = Config::$ping_timeout_ok; } $success = SystemPingWrapper::exec($data['addr'], $timeout); DEBUG && printf("PingWorker::exec(): success = %s\n", var_export($success, true)); $status = $success ? HostStatuses::PINGABLE : HostStatuses::UNPINGABLE; } DEBUG && printf("PingWorker::exec(): status = %s\n", var_export($status, true)); // вычисление состояния хоста switch ($status) { case HostStatuses::PINGABLE: $state = 1; break; case HostStatuses::UNPINGABLE: default: $state = 0; } DEBUG && printf("PingWorker::exec(): state = %s\n", var_export($state, true)); $data_out = ['state' => 0xff & ($data['state'] << 1 | $state), 'status' => $status]; DEBUG && printf("PingWorker::exec(): Redis->hMset('host:data:%s', %s)\n", $label, var_export($data_out, true)); // запись статистики в кэш Redis $redis->hMSet('hosts:data:' . $label, $data_out); // запись статистики в БД DBQueries::dataPush($data['id'], $data_out['status'], $data_out['state']); DEBUG && (print "PingWorker::exec(): end\n\n"); }