コード例 #1
0
 function handle($queue, Scalr_Messaging_Msg $message, $rawMessage, $type = 'xml')
 {
     $this->logger->info(sprintf("Received message '%s' from server '%s'", $message->getName(), $message->getServerId()));
     try {
         $this->db->Execute("INSERT INTO messages SET\n                messageid = ?,\n                message = ?,\n                server_id = ?,\n                dtadded = NOW(),\n                type = ?,\n                ipaddress = ?,\n                message_name = ?,\n                message_format = ?\n            ", array($message->messageId, $rawMessage, $message->getServerId(), "in", $_SERVER['REMOTE_ADDR'], $message->getName(), $type));
     } catch (Exception $e) {
         // Message may be already delivered.
         // urlopen issue on scalarizr side:
         // QueryEnvError: <urlopen error [Errno 4] Interrupted system call>
         if (strpos($e->getMessage(), 'Duplicate entry') === false) {
             throw $e;
         }
     }
 }
コード例 #2
0
ファイル: JsonSerializer.php プロジェクト: rickb838/scalr
 function serialize(Scalr_Messaging_Msg $msg, $options = array())
 {
     $retval = new stdClass();
     $retval->name = $msg->getName();
     $retval->id = $msg->messageId;
     $retval->body = new stdClass();
     $retval->meta = new stdClass();
     $meta = (array) $msg->meta;
     unset($msg->meta);
     $this->walkSerialize($msg, $retval->body, 'underScope');
     $this->walkSerialize($meta, $retval->meta, 'underScope');
     return @json_encode($retval);
 }
コード例 #3
0
 function handle($queue, Scalr_Messaging_Msg $message, $rawMessage)
 {
     $this->logger->info(sprintf("Received message '%s' from server '%s'", $message->getName(), $message->getServerId()));
     try {
         $this->db->Execute("INSERT INTO messages SET\n\t\t\t\tmessageid = ?,\n\t\t\t\tmessage = ?,\n\t\t\t\tserver_id = ?,\n\t\t\t\tdtlasthandleattempt = NOW(),\n\t\t\t\ttype = ?,\n\t\t\t\tisszr = ?\n\t\t\t", array($message->messageId, $rawMessage, $message->getServerId(), "in", 1));
     } catch (Exception $e) {
         // Message may be already delivered.
         // urlopen issue on scalarizr side:
         // QueryEnvError: <urlopen error [Errno 4] Interrupted system call>
         if (strpos($e->getMessage(), 'Duplicate entry') === false) {
             throw $e;
         }
     }
 }
コード例 #4
0
ファイル: XmlSerializer.php プロジェクト: rickb838/scalr
 function serialize(Scalr_Messaging_Msg $msg, $options = array())
 {
     $doc = new DOMDocument('1.0', 'utf-8');
     $doc->loadXML(sprintf('<message id="%s" name="%s"><meta /><body /></message>', $msg->messageId, $msg->getName()));
     $metaEl = $doc->getElementsByTagName("meta")->item(0);
     $this->walkSerialize($msg->meta, $metaEl, $doc);
     $bodyEl = $doc->getElementsByTagName("body")->item(0);
     $body = array();
     foreach (get_object_vars($msg) as $k => $v) {
         if (in_array($k, $this->msgClassProperties)) {
             continue;
         }
         $body[$k] = $v;
     }
     $this->walkSerialize($body, $bodyEl, $doc);
     return trim($doc->saveXML());
 }
コード例 #5
0
 function convert(Scalr_Messaging_Msg $msg, $isEventNotice = false)
 {
     $msgName = $msg->getName();
     if (!array_key_exists($msgName, $this->trapMap)) {
         throw new Scalr_Messaging_SnmpConverterException(sprintf("There is no SNMP trap for message class '%s'", $msgName));
     }
     $vars = $this->extractVars($msg);
     if (in_array($msgName, $this->eventNoticeMessages) || $isEventNotice) {
         $vars = array_merge($vars, $this->extractEventNotice($msg));
     }
     $extractMethod = "extract{$msgName}";
     if (method_exists($this, $extractMethod)) {
         $vars = array_merge($vars, $this->{$extractMethod}($msg));
     }
     $search = array();
     $replace = array();
     foreach ($this->getTrapVars($isEventNotice ? "__IntEventNotice" : $msgName) as $var => $holder) {
         $search[] = $holder;
         $replace[] = $vars[$var];
     }
     return str_replace($search, $replace, $this->trapMap[$isEventNotice ? "__IntEventNotice" : $msgName]);
 }
コード例 #6
0
ファイル: class.DBServer.php プロジェクト: mheydt/scalr
 /**
  * Send message to instance
  * @param Scalr_Messaging_Msg $message
  * @return Scalr_Messaging_Msg
  */
 public function SendMessage(Scalr_Messaging_Msg $message, $isEventNotice = false, $delayed = false)
 {
     $startTime = microtime(true);
     if ($this->farmId && $message->getName() != 'BeforeHostTerminate') {
         if ($this->GetFarmObject()->Status == FARM_STATUS::TERMINATED) {
             $this->Db->Execute("UPDATE messages SET status = ? WHERE messageid = ?", array(MESSAGE_STATUS::FAILED, $message->messageId));
             return;
         }
     }
     // We don't need to send any messages other then it's own to the server that is not in Running state
     if ($message->serverId != $this->serverId && !in_array($this->status, array(SERVER_STATUS::RUNNING, SERVER_STATUS::TEMPORARY, SERVER_STATUS::IMPORTING))) {
         return;
     }
     // Ignore OLD messages (ami-scripts)
     if (!$this->IsSupported("0.5")) {
         return;
     }
     // Put access data and reserialize message
     $pl = PlatformFactory::NewPlatform($this->platform);
     $pl->PutAccessData($this, $message);
     $logger = \Scalr::getContainer()->logger('DBServer');
     $serializer = Scalr_Messaging_XmlSerializer::getInstance();
     $cryptoTool = \Scalr::getContainer()->srzcrypto($this->GetKey(true));
     if ($this->GetProperty(\SERVER_PROPERTIES::SZR_MESSAGE_FORMAT) == 'json') {
         $serializer = Scalr_Messaging_JsonSerializer::getInstance();
         $rawMessage = $serializer->serialize($message);
         $messageType = 'json';
     } else {
         $rawMessage = $serializer->serialize($message);
         $messageType = 'xml';
     }
     //$rawJsonMessage = @json_encode($message);
     $time = microtime(true) - $startTime;
     // Add message to database
     $this->Db->Execute("INSERT INTO messages SET\n                `messageid`             = ?,\n                `processing_time`       = ?,\n                `server_id`             = ?,\n                `event_server_id`       = ?,\n                `message`               = ?,\n                `type`                  = 'out',\n                `message_name`          = ?,\n                `handle_attempts`       = ?,\n                `message_version`       = ?,\n                `dtlasthandleattempt`   = NOW(),\n                `dtadded`               = NOW(),\n                `message_format`        = ?,\n                `event_id`              = ?\n            ON DUPLICATE KEY UPDATE handle_attempts = handle_attempts+1, dtlasthandleattempt = NOW()\n            ", array($message->messageId, $time, $this->serverId, $message->serverId, $rawMessage, $message->getName(), $delayed ? '0' : '1', 2, $messageType, isset($message->eventId) ? $message->eventId : ''));
     if ($delayed) {
         return $message;
     }
     $isVPC = false;
     if ($this->farmId) {
         if (DBFarm::LoadByID($this->farmId)->GetSetting(Entity\FarmSetting::EC2_VPC_ID)) {
             $isVPC = true;
         }
     }
     if (!$this->remoteIp && !$this->localIp && !$isVPC) {
         return;
     }
     $cryptoTool->setCryptoKey($this->GetKey(true));
     $encMessage = $cryptoTool->encrypt($rawMessage);
     $timestamp = date("c", time());
     $signature = $cryptoTool->sign($encMessage, null, $timestamp);
     try {
         $request = new Request();
         $request->setRequestMethod('POST');
         $ctrlPort = $this->getPort(self::PORT_CTRL);
         $requestHost = $this->getSzrHost() . ":{$ctrlPort}";
         if ($isVPC) {
             $routerFarmRoleId = $this->GetFarmRoleObject()->GetSetting(Scalr_Role_Behavior_Router::ROLE_VPC_SCALR_ROUTER_ID);
             if ($routerFarmRoleId) {
                 $routerRole = DBFarmRole::LoadByID($routerFarmRoleId);
             } else {
                 $routerRole = $this->GetFarmObject()->GetFarmRoleByBehavior(ROLE_BEHAVIORS::VPC_ROUTER);
             }
             if ($routerRole) {
                 // No public IP need to use proxy
                 if (!$this->remoteIp) {
                     $requestHost = $routerRole->GetSetting(Scalr_Role_Behavior_Router::ROLE_VPC_IP) . ":80";
                     $request->addHeaders(array("X-Receiver-Host" => $this->localIp, "X-Receiver-Port" => $ctrlPort));
                     // There is public IP, can use it
                 } else {
                     $requestHost = "{$this->remoteIp}:{$ctrlPort}";
                 }
             }
         }
         //Prepare request
         $request->setRequestUrl("http://{$requestHost}/control");
         $request->setOptions(array('timeout' => \Scalr::config('scalr.system.instances_connection_timeout'), 'connecttimeout' => \Scalr::config('scalr.system.instances_connection_timeout')));
         $request->addHeaders(array("Date" => $timestamp, "X-Signature" => $signature, 'X-Server-Id' => $this->serverId));
         if ($messageType == 'json') {
             $request->addHeaders(array('Content-type' => 'application/json'));
         }
         $request->append($encMessage);
         // Send request
         $response = \Scalr::getContainer()->srzhttp->sendRequest($request);
         // Process response
         if ($response->getResponseCode() == 201) {
             $logger->info(sprintf("[FarmID: %s] Sending message '%s' via REST to server '%s' (server_id: %s) completed", $this->farmId, $message->getName(), $this->remoteIp, $this->serverId));
             if (in_array($message->getName(), array('ExecScript'))) {
                 $this->Db->Execute("DELETE FROM messages WHERE messageid = ?", array($message->messageId));
             } else {
                 if ($messageType != 'json') {
                     $this->Db->Execute("UPDATE messages SET status = ?, message = '' WHERE messageid = ?", array(MESSAGE_STATUS::HANDLED, $message->messageId));
                 } else {
                     $this->Db->Execute("UPDATE messages SET status = ? WHERE messageid = ?", array(MESSAGE_STATUS::HANDLED, $message->messageId));
                 }
                 if (!empty($message->eventId)) {
                     $this->Db->Execute("UPDATE events SET msg_sent = msg_sent + 1 WHERE event_id = ?", array($message->eventId));
                 }
             }
         } else {
             $logger->warn(sprintf("[FarmID: %s] Cannot deliver message '%s' (message_id: %s) via REST" . " to server '%s' (server_id: %s). Error: %s %s", $this->farmId, $message->getName(), $message->messageId, $this->remoteIp, $this->serverId, $response->getResponseCode(), $response->getResponseStatus()));
         }
     } catch (http\Exception $e) {
         if (isset($e->innerException)) {
             $msg = $e->innerException->getMessage();
         } else {
             $msg = $e->getMessage();
         }
         if ($this->farmId) {
             $logger->warn(new FarmLogMessage($this->farmId, sprintf("Cannot deliver message '%s' (message_id: %s) via REST to server '%s' (server_id: %s). Error: %s", $message->getName(), $message->messageId, $this->remoteIp, $this->serverId, $msg), $this->serverId));
         } else {
             $logger->fatal(sprintf("Cannot deliver message '%s' (message_id: %s) via REST" . " to server '%s' (server_id: %s). Error: %s", $message->getName(), $message->messageId, $this->remoteIp, $this->serverId, $msg));
         }
         return false;
     }
     return $message;
 }