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; } } }
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); }
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; } } }
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()); }
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]); }
/** * 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; }