/**
  * @param $msg
  * @param $listener_id
  * @param $rewrite_prev_values
  * @param string $source
  * @param int $station_id
  * @param null $source_info
  * @return int
  * @var $synchronization Synchronization
  */
 public static function addNew($msg, $listener_id, $rewrite_prev_values, $source = '', $station_id = 0, $source_info = null)
 {
     $synchronization = new Synchronization();
     $listener_id_from_master = $synchronization->getListenerId();
     $parseMessage = new ParseMessage(LoggerFactory::getFileLogger('parse_message'), $msg);
     $message_obj = new ListenerLogTemp();
     $message_obj->listener_id = $listener_id;
     $message_obj->station_id_code = $parseMessage->getStationIdCode();
     $message_obj->message = $msg;
     $message_obj->measuring_timestamp = $parseMessage->getMeasuringTimestamp();
     $message_obj->is_processed = 0;
     $message_obj->is_processing = 0;
     if ($listener_id_from_master === $listener_id and $listener_id != 0) {
         $message_obj->from_master = 1;
     } else {
         $message_obj->from_master = 0;
     }
     $message_obj->source = $source;
     $message_obj->source_info = $source_info;
     if ($synchronization->isProcessed()) {
         $message_obj->synchronization_mode = $synchronization->isMaster() ? 'master' : ($synchronization->isSlave() ? 'slave' : 'none');
     } else {
         $message_obj->synchronization_mode = 'none';
     }
     $message_obj->rewrite_prev_values = $rewrite_prev_values;
     $message_obj->save();
     return $message_obj->temp_log_id;
 }
Example #2
0
 protected function listenDLTorrentTemp($cycle = 1)
 {
     $this->_logger->log(__METHOD__, array('cycle' => $cycle));
     $this->_connector->setParams(array('timeout' => 60));
     ListenerProcess::addComment($this->listener->listener_id, 'comment', 'Opening COM connection');
     $messages = null;
     $process = $this;
     $logger = $process->_logger;
     $this->_connector->onReceiveMessage = function ($message) use(&$process, &$logger) {
         //            $logger->log(__METHOD__ . ' New message', array('message' => $message, 'listener_id' => $process->listener->listener_id, 'overwrite' => $process->settings->overwrite_data_on_listening));
         //
         //            $messageId = ListenerLogTemp::addNew($message, $process->listener->listener_id, $process->settings->overwrite_data_on_listening, 'datalogger');
         //
         //            ListenerProcess::addComment($process->listener->listener_id, 'comment', 'got msg #' . $messageId);
         $logger->log(__METHOD__ . ' New message', array('message' => $message, 'listener_id' => $process->listener->listener_id, 'overwrite' => $process->settings->overwrite_data_on_listening));
         if (is_null(SMSCommand::setResponse($message))) {
             $this->_logger->log(__METHOD__ . ' Message type: ' . 'default');
             $messageId = ListenerLogTemp::addNew($message, $process->listener->listener_id, $process->settings->overwrite_data_on_listening, 'datalogger');
             ListenerProcess::addComment($process->listener->listener_id, 'comment', 'got msg #' . $messageId);
         } else {
             $this->_logger->log(__METHOD__ . ' Message type: ' . 'sms command');
         }
     };
     $result = $this->_connector->readData($messages);
     $this->_logger->log(__METHOD__ . ' Complete listen datalogger.', array('cycle' => $cycle, 'result' => $result));
 }
 protected function listenTemp()
 {
     $this->_logger->log(__CLASS__ . ' ' . __METHOD__ . ' Start listen.', array('source' => $this->source));
     $messages = null;
     $process = $this;
     $logger = $process->_logger;
     $this->_connector->onReceiveMessage = function ($message, $station_id, $source_info) use(&$process, &$logger) {
         $logger->log(__CLASS__ . ' ' . __METHOD__ . ' New message', array('message' => $message, 'listener_id' => $process->listener->listener_id, 'overwrite' => $process->settings->overwrite_data_on_listening));
         $messageId = ListenerLogTemp::addNew($message, $process->listener->listener_id, $process->settings->overwrite_data_on_listening, 'server', 0, $source_info);
         ListenerProcess::addComment($process->listener->listener_id, 'comment', 'got msg #' . $messageId);
     };
     $this->_connector->readData($messages);
     $this->_logger->log(__CLASS__ . ' ' . __METHOD__ . ' Complete listen.', array('source' => $this->source));
 }
Example #4
0
 public function actionImportMessage()
 {
     if (It::isGuest()) {
         print json_encode(array('errors' => array('Sign in first.'), 'ok' => 0));
         CApplication::end();
     }
     $message = isset($_POST['message']) ? trim($_POST['message']) : null;
     if ($message) {
         $st = time();
         $settings = Settings::model()->find();
         ListenerLogTemp::addNew($message, 0, $settings->overwrite_data_on_import, 'import', 0);
         //			ListenerLog::addNew($message, 0, $settings->overwrite_data_on_import, 'import', 0);
         print json_encode(array('ok' => 1));
     } else {
         print json_encode(array('ok' => 0));
     }
     CApplication::end();
 }
 public function run()
 {
     ListenerProcess::addComment($this->listener->listener_id, 'comment', 'going to start listening for SMS messages, source= ' . $this->source);
     $this->_connector->onReceiveMessages = function ($messages) {
         ListenerProcess::addComment($this->listener->listener_id, 'comment', 'found ' . count($messages) . ' messages at modem');
     };
     $this->_connector->onReceiveMessage = function ($message, $stationId) {
         $this->_logger->log(__CLASS__ . ' ' . __METHOD__ . ' Found message at modem: ' . $message);
         /**
          * if message is not response by sms command
          * then use default function
          */
         if (is_null(SMSCommand::setResponse($message))) {
             $this->_logger->log(__CLASS__ . ' ' . __METHOD__ . ' Message type: ' . 'default');
             //                $messageId = ListenerLog::addNew($message, $this->listener->listener_id, $this->settings->overwrite_data_on_listening, $stationId);
             $messageId = ListenerLogTemp::addNew($message, $this->listener->listener_id, $this->settings->overwrite_data_on_listening, $stationId);
             ListenerProcess::addComment($this->listener->listener_id, 'comment', 'Found message at modem, message id:' . $messageId . ', message: ' . $message);
         } else {
             $this->_logger->log(__CLASS__ . ' ' . __METHOD__ . ' Message type: ' . 'sms command');
         }
     };
     $i = 0;
     $SMSCOMPort = new SMSCOMPort();
     // For send sms command
     //$SMSCOMPort->COM;
     //$com = yii::app()->params['com_for_send_sms_command'];
     if ($this->source == $SMSCOMPort->COM) {
         ListenerProcess::addComment($this->listener->listener_id, 'sms_command', 'going to start send SMS command, source= ' . $this->source);
         while (true) {
             if ($this->synchronization->isMaster()) {
                 $this->grabModemMessages($i++);
                 $this->sendSMSByModem($i);
             }
             sleep(20);
         }
     } else {
         while (true) {
             if ($this->synchronization->isMaster()) {
                 $this->grabModemMessages($i++);
             }
             sleep(20);
         }
     }
 }
 /**
  * @var $stationForm configForm
  * **/
 public function run($args)
 {
     //        error_reporting(null);
     ini_set('display_errors', 1);
     $this->_logger = LoggerFactory::getFileLogger('GenerateMessageCommand');
     //        $this->_logger = LoggerFactory::getConsoleLogger();
     $this->_logger->log('start');
     //       $args:
     //       $args[0] AWS01
     //       $args[1] "sensors:TS1;TS2;"
     $station_id_code = false;
     if (preg_match('/^([A-Z,a-z,0-9]{4,5})$/', $args[0], $matchesStations)) {
         $station_id_code = $matchesStations[1];
     } else {
         $this->_logger->log(' Station ID can contain only Letters (A-Z) and Figures (1-9), and must be of 4(rain) or 5(AWS) chars length.');
     }
     $sensor_id_codes = array();
     if (isset($args[1])) {
         if (preg_match("/^sensors:([A-Za-z1-9;]+)/", $args[1], $matchesSensors)) {
             $sensor_id_code = explode(';', $matchesSensors[1]);
             $sensor_id_codes = array_values($sensor_id_code);
             $sensor_id_codes_count = count($sensor_id_codes);
             for ($i = 0; $i < $sensor_id_codes_count; $i++) {
                 if (!preg_match('/^([A-Z,a-z]{2})([1-9]{1})$/', $sensor_id_codes[$i], $matches)) {
                     unset($sensor_id_codes[$i]);
                     $this->_logger->log('Sensor ID should contain two letters and 1 digit. Ex.: TP1');
                 }
             }
             $sensor_id_codes = array_values($sensor_id_codes);
         }
     }
     $station = Station::getStationByCode($station_id_code, array('sensors.handler', 'sensors.features.metric'));
     //            $sql = "SELECT `t1`.`station_sensor_id`, `t1`.`sensor_id_code`,  `t2`.`handler_id_code`, `t3`.`feature_code`, `t4`.`code` AS `metric_code`
     //                            FROM `".StationSensor::model()->tableName()."` `t1`
     //                            LEFT JOIN `".SensorDBHandler::model()->tableName()."`      `t2` ON `t2`.`handler_id` = `t1`.`handler_id`
     //                            LEFT JOIN `".StationSensorFeature::model()->tableName()."` `t3` ON `t3`.`sensor_id`  = `t1`.`station_sensor_id`
     //                            LEFT JOIN `".RefbookMetric::model()->tableName()."`        `t4` ON `t4`.`metric_id`  = `t3`.`metric_id`
     //                            WHERE `t1`.`station_id` = '".$station_id."' AND `t1`.`station_sensor_id` IN (".implode(',',$sensor_id).")";
     //            $res = Yii::app()->db->createCommand($sql)->queryAll();
     if ($station) {
         TimezoneWork::set($station->timezone_id);
         $sensors = array();
         foreach ($station->sensors as $key => $sensor) {
             if (in_array($sensor->sensor_id_code, $sensor_id_codes) || count($sensor_id_codes) == 0) {
                 if (!isset($sensors[$sensor->station_sensor_id])) {
                     $sensors[$sensor->station_sensor_id] = array('station_sensor_id' => $sensor->station_sensor_id, 'sensor_id_code' => $sensor->sensor_id_code, 'handler_id_code' => $sensor->handler->handler_id_code);
                 }
                 foreach ($sensor->features as $feature) {
                     if (is_object($feature->metric)) {
                         $sensors[$sensor->station_sensor_id]['features'][$feature->feature_code] = $feature->metric->code;
                     }
                 }
             }
         }
         $i = time();
         $messages[$i]['timestamp'] = $i;
         $this->_logger->log(__METHOD__ . ': sensors ' . print_r($sensors['sensor_id_code'], 1));
         foreach ($messages as $key => $value) {
             if ($station->station_type === 'rain') {
                 $messages[$key]['parts'][] = 'D';
                 $messages[$key]['parts'][] = $station->station_id_code;
                 $messages[$key]['parts'][] = date('ymd', $key);
                 $messages[$key]['parts'][] = date('Hi', $key);
                 $messages[$key]['parts'][] = str_pad(rand(100, 135), 3, "0", STR_PAD_LEFT);
                 $messages[$key]['parts'][] = '00';
             } else {
                 $messages[$key]['parts'][] = 'D';
                 $messages[$key]['parts'][] = $station->station_id_code;
                 $messages[$key]['parts'][] = date('ymd', $key);
                 $messages[$key]['parts'][] = date('Hi', $key);
                 $messages[$key]['parts'][] = '00';
             }
             $sensors_values = array();
             if ($sensors) {
                 foreach ($sensors as $k1 => $v1) {
                     $handler = SensorHandler::create($v1['handler_id_code']);
                     $random_value = $handler->getRandomValue($v1['features']);
                     $sensors_values[] = $v1['sensor_id_code'] . $random_value;
                 }
                 shuffle($sensors_values);
                 foreach ($sensors_values as $k1 => $v1) {
                     $messages[$key]['parts'][] = $v1;
                 }
             }
             $crc = It::prepareCRC(implode('', $messages[$key]['parts']));
             $messages[$key]['parts'][] = $crc;
             array_push($messages[$key]['parts'], '$');
             array_unshift($messages[$key]['parts'], '@');
         }
         $messages_display = array();
         $messages_copy = array();
         foreach ($messages as $key => $value) {
             $messages_display[] = implode(' ', $value['parts']);
             $messages_copy[] = implode('', $value['parts']);
         }
         $this->_logger->log(__METHOD__ . ': $messages_copy ' . print_r($messages_copy, 1));
         foreach ($messages_copy as $msg) {
             ListenerLogTemp::addNew($msg, 0, 1, 'import', 0);
         }
     } else {
         $this->_logger->log(__METHOD__ . ': has no stations like ' . $args[0]);
     }
 }
 protected function listenPollingTemp($cycle = 1)
 {
     $this->_logger->log(__CLASS__ . ' ' . __METHOD__, array('cycle' => $cycle));
     $this->_connector->setParams(array('timeout' => 60));
     // 1min
     ListenerProcess::addComment($this->listener->listener_id, 'comment', 'Start polling');
     $messages = null;
     $process = $this;
     $logger = $process->_logger;
     $this->_connector->onReceiveMessage = function ($message, $stationId) use(&$process, &$logger) {
         $logger->log(__CLASS__ . ' ' . __METHOD__ . ' New message', array('message' => $message, 'listener_id' => $process->listener->listener_id, 'overwrite' => $process->settings->overwrite_data_on_listening));
         $messageId = ListenerLogTemp::addNew($message, $process->listener->listener_id, $process->settings->overwrite_data_on_listening, 'poller', $stationId);
         ListenerProcess::addComment($process->listener->listener_id, 'comment', 'got msg #' . $messageId);
     };
     $result = $this->_connector->readData($messages);
     $this->_logger->log(__CLASS__ . ' ' . __METHOD__ . ' Complete listen datalogger.', array('cycle' => $cycle, 'result' => $result));
     return $result;
 }
Example #8
0
 public function run_process_base()
 {
     $this->_logger->log(__METHOD__);
     $this->_logger->log(__METHOD__ . ' role none; ');
     $this->_logger->log(__METHOD__ . ' find  messages, that have been received in a base mode');
     $criteria = new CDbCriteria();
     $criteria->condition = "is_processed = 0 and is_processing = 0";
     $criteria->condition .= " and synchronization_mode = 'none'";
     $criteria->order = "temp_log_id asc";
     $criteria->limit = 100;
     /** @var array|ListenerLogTemp[] $logs */
     $logs = ListenerLogTemp::model()->findAll($criteria);
     $this->_logger->log(__METHOD__ . '[' . getmypid() . '] PrepareCommand...  found ' . count($logs) . ' unprocessed messages');
     $this->_logger->log(__METHOD__ . ' Create records for forwarding');
     // Forwarding messages
     $processForwardedMessages = new ProcessForwardedMessages($this->_logger);
     $this->_logger->log(__METHOD__ . ' Create records for forwarding');
     foreach ($logs as $log) {
         // Create records for forwarding
         $processForwardedMessages->saveNewForwardedMessage($log);
         $log->is_processing = 1;
         $log->save();
         // run processing of message
         // $log - from ListenerLogTemp model
         $process_obj = new ProcessMessage($this->_logger, $log);
         $process_obj->run();
         // update message as "is processed"
         $log->is_processed = 1;
         $log->is_processing = 0;
         $log->save();
     }
     $this->_logger->log(__METHOD__ . ' sent Forwarded Messages');
     $processForwardedMessages->forwardMessages(10);
     //find slave messages
     $this->_logger->log(__METHOD__ . ' find  messages, that have been received in a Salve mode');
     $criteria = new CDbCriteria();
     $criteria->condition = "is_processed = 0 and is_processing = 0";
     $criteria->condition .= ' and from_master = 1';
     $criteria->condition .= " and synchronization_mode = 'slave'";
     $criteria->order = "temp_log_id asc";
     $criteria->limit = 100;
     $logs = ListenerLogTemp::model()->findAll($criteria);
     $this->_logger->log(__METHOD__ . '[' . getmypid() . '] PrepareCommand...  found ' . count($logs) . ' unprocessed messages');
     foreach ($logs as $log) {
         $log->is_processing = 1;
         $log->save();
         // run processing of message
         // $log - from ListenerLogTemp model
         $process_obj = new ProcessMessage($this->_logger, $log);
         $process_obj->run();
         // update message as "is processed"
         $log->is_processed = 1;
         $log->is_processing = 0;
         $log->save();
     }
     //find master messages
     $this->_logger->log(__METHOD__ . ' find  messages, that have been received in a Master mode');
     $criteria = new CDbCriteria();
     $criteria->condition = "is_processed = 0 and is_processing = 0";
     $criteria->condition .= " and from_master = 0";
     $criteria->condition .= " and synchronization_mode = 'master'";
     $criteria->order = "temp_log_id asc";
     $criteria->limit = 100;
     /** @var array|ListenerLogTemp[] $logs */
     $logs = ListenerLogTemp::model()->findAll($criteria);
     $this->_logger->log(__METHOD__ . '[' . getmypid() . '] PrepareCommand...  found ' . count($logs) . ' unprocessed messages');
     // Forwarding messages
     $processForwardedMessages = new ProcessForwardedMessages($this->_logger);
     $processForwardedSlaveMessages = new ProcessForwardedSlaveMessages($this->_logger);
     $this->_logger->log(__METHOD__ . ' Create records for forwarding');
     $this->_logger->log(__METHOD__ . ' Create records for slave forwarding');
     foreach ($logs as $log) {
         // Create records for forwarding
         if ($this->synchronization->isMaster()) {
             $processForwardedMessages->saveNewForwardedMessage($log);
             $processForwardedSlaveMessages->saveNewForwardedSlaveMessage($log);
             $log->is_processing = 1;
             $log->save();
             // run processing of message
             // $log - from ListenerLogTemp model
             $process_obj = new ProcessMessage($this->_logger, $log);
             $process_obj->run();
             // update message as "is processed"
             $log->is_processed = 1;
             $log->is_processing = 0;
             $log->save();
         }
     }
 }
Example #9
0
 public function actionImportmsg()
 {
     $settings = Settings::model()->find();
     $log = new Import();
     $log->scenario = 'msg';
     $res = $log->prepareTypes();
     $source_types = $res['source_types'];
     $station_types = $res['station_types'];
     $station_timezones = $res['station_timezones'];
     if (Yii::app()->request->isPostRequest) {
         $lines = array();
         $counter = 0;
         foreach (preg_split("/(\r?\n)/", $_POST['Import']['import_data']) as $line) {
             $line = trim($line);
             if ($line) {
                 $lines[] = $line;
             }
         }
         if ($lines) {
             foreach ($lines as $line) {
                 $res = ListenerLogTemp::addNew($line, 0, $settings->overwrite_data_on_import, 'import', $_POST['Import']['source_type']);
             }
             $counter = count($lines);
             It::memStatus($counter . ' new message' . ($counter > 1 ? 's were' : ' was') . ' added to processing');
             $this->redirect($this->createUrl('admin/importmsg'));
         }
     }
     $this->render('import', array('form' => $log, 'source_types' => $source_types, 'settings' => $settings));
 }
 protected function listenESPTorrentTemp($attempt = 0)
 {
     $this->_logger->log(__CLASS__ . ' ' . __METHOD__, array('attempt' => $attempt));
     $timeout = 10;
     if ($attempt == 0) {
         ListenerProcess::addComment($this->listener->listener_id, 'comment', 'trying to connect with ' . $this->source);
     } else {
         ListenerProcess::addComment($this->listener->listener_id, 'comment', 'Trying to reconnect with ' . $this->source . '; attempt #' . $attempt . '/3');
     }
     $source_parts = explode(':', $this->source);
     // creates socket connection with IP:port
     $fp = @fsockopen($source_parts[0], $source_parts[1], $errno, $errstr, $timeout);
     if ($fp !== false) {
         $attempt = 0;
         ListenerProcess::addComment($this->listener->listener_id, 'connected', 'successfully');
         $message = '';
         while (!feof($fp)) {
             $res = fwrite($fp, ' ', 2);
             //print "\n try write: ".$res;
             $line = fread($fp, 8192);
             $line = trim($line);
             $occurances_dl = strpos($line, '$');
             if ($line != '') {
                 $message .= $line;
                 if ($occurances_dl !== false) {
                     $res = ListenerLogTemp::addNew($message, $this->listener->listener_id, $this->settings->overwrite_data_on_listening, 'datalogger');
                     ListenerProcess::addComment($this->listener->listener_id, 'comment', 'got msg #' . $res);
                     $message = '';
                 }
             }
         }
         ListenerProcess::addComment($this->listener->listener_id, 'stopped', 'can not receive data anymore - ESP is unreachable');
         fclose($fp);
     } else {
         ListenerProcess::addComment($this->listener->listener_id, 'cannot_connect', '[' . $errno . '] ' . $errstr);
     }
     if ($attempt < 3) {
         $attempt++;
         sleep(3);
     } else {
         ListenerProcess::addComment($this->listener->listener_id, 'comment', 'Three attempts to reconnect failed. Waiting for 2 minutes before trying to reconnect.');
         sleep(120);
         $attempt = 0;
     }
     return $this->listenESPTorrentTemp($attempt);
 }