/**
  * Выполнение <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");
 }
Exemple #2
0
 /**
  * Заполнение слотов, выделяемых Воркерам.
  * 
  * @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");
 }