示例#1
0
 /**
  * Главный метод воркера Ping.
  * 
  * Выплняет в цикле пинг хостов и запись в кэш Redis.
  * 
  * @access public
  * @static
  */
 public static function main()
 {
     DEBUG && (print "PingWorker::main(): begin\n");
     // регистрация обработчика сигналов
     static::initSignalHandlers();
     // подключение к СУБД и кэшу Redis - оба используются
     DB::open();
     RKS::open();
     // объявление массива очередей
     $queue_lists = ['ok', 'prefailed', 'failed'];
     // итерация массива очередей
     foreach ($queue_lists as $queue_list) {
         DEBUG && printf("PingWorker::main(): begin queue '%s'\n", $queue_list);
         // итерация очереди
         while (static::$worker_loop) {
             // получение следующей записи из очереди
             $label = static::fetch($queue_list);
             // записей нет - выход из цикла очереди
             if (!$label) {
                 DEBUG && printf("NslookupWorker::main(): break loop '%s'\n", $queue_list);
                 break;
             }
             // выполнение процедур для лейбла
             static::exec($label);
         }
         DEBUG && printf("PingWorker::main(): end queue '%s'\n", $queue_list);
     }
     DB::close();
     RKS::close();
     DEBUG && (print "PingWorker::main(): end\n\n");
 }
示例#2
0
 /**
  * Сброс состояний и статусов хостов в кэше Redis и СУБД.
  * 
  * @param int $status
  * @access protected
  * @static
  */
 protected static function resetHostsStatuses($status)
 {
     DEBUG && printf("Master::resetHostsStatuses(%d): begin\n", $status);
     DB::open();
     $redis = RKS::getInstance();
     $hosts = $redis->sMembers('hosts:enabled');
     DEBUG && printf("Master::resetHostsStatuses(): Redis->sMembers('host:enabled')\n%s\n", var_export($hosts, true));
     foreach ($hosts as $label) {
         DEBUG && printf("Master::resetHostsStatuses(): begin label '%s'\n", $label);
         $data = $redis->hGetAll('hosts:data:' . $label);
         DEBUG && printf("Master::resetHostsStatuses(): Redis->hGetAll('host:data:%s')\n%s\n", $label, var_export($data, true));
         if (!$data || empty($data['addr'])) {
             DEBUG && printf("Master::resetHostsStatuses(): host '%s' not ready\n", $label);
             continue;
         }
         $data_out = ['state' => 0, 'status' => $status];
         DEBUG && printf("Master::resetHostsStatuses(): Redis->hMset('host:data:%s', %s)\n", $label, var_export($data_out, true));
         $redis->hMset('hosts:data:' . $label, $data_out);
         DBQueries::dataPush($data['id'], $status, 0);
         DEBUG && printf("Master::resetHostsStatuses(): end label '%s'\n", $label);
     }
     DB::close();
     DEBUG && (print "Master::resetHostsStatuses(): end\n\n");
 }
 /**
  * Выполнение <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");
 }