/** * @return Scalr_Messaging_SnmpConverter */ static function getInstance() { if (self::$instance === null) { self::$instance = new Scalr_Messaging_SnmpConverter(); } return self::$instance; }
/** * Send message to instance * @param Scalr_Messaging_Msg $message * @return Scalr_Messaging_Msg */ public function SendMessage(Scalr_Messaging_Msg $message, $isEventNotice = false, $delayed = false) { if ($this->farmId) { if ($this->GetFarmObject()->Status == FARM_STATUS::TERMINATED) { $this->Db->Execute("UPDATE messages SET status = ? WHERE messageid = ?", array(MESSAGE_STATUS::FAILED, $message->messageId)); return; } } $logger = Logger::getLogger('DBServer'); $serializer = Scalr_Messaging_XmlSerializer::getInstance(); $cryptoTool = Scalr_Messaging_CryptoTool::getInstance(); $rawMessage = $serializer->serialize($message); // Add message to database $this->Db->Execute("INSERT INTO messages SET\r\n\t\t\t\t`messageid`\t= ?,\r\n\t\t\t\t`server_id`\t= ?,\r\n\t\t\t\t`message`\t= ?,\r\n\t\t\t\t`type`\t\t= 'out',\r\n\t\t\t\t`message_name` = ?,\r\n\t\t\t\t`handle_attempts` = ?,\r\n\t\t\t\t`message_version` = ?,\r\n\t\t\t\t`dtlasthandleattempt` = NOW()\r\n\t\t\tON DUPLICATE KEY UPDATE handle_attempts = handle_attempts+1, dtlasthandleattempt = NOW() \r\n\t\t\t", array($message->messageId, $this->serverId, $rawMessage, $message->getName(), $delayed ? '0' : '1', $this->IsSupported("0.5") ? 2 : 1)); if ($this->platform == SERVER_PLATFORMS::RDS) { $logger->info("RDS platform doesn't support messaging. Skipping..."); $this->Db->Execute("UPDATE messages SET status = ? WHERE messageid = ?", array(MESSAGE_STATUS::UNSUPPORTED, $message->messageId)); return $message; } if ($delayed) { return $message; } if ($this->IsSupported("0.5") && !$isEventNotice) { if (!$this->remoteIp) { return; } // Put access data and reserialize message $pl = PlatformFactory::NewPlatform($this->platform); $pl->PutAccessData($this, $message); $rawMessage = $serializer->serialize($message); $cryptoKey = $this->GetKey(true); $encMessage = $cryptoTool->encrypt($rawMessage, $cryptoKey); list($signature, $timestamp) = $cryptoTool->sign($encMessage, $cryptoKey); try { $ctrlPort = $this->GetProperty(SERVER_PROPERTIES::SZR_CTRL_PORT); if (!$ctrlPort) { $ctrlPort = 8013; } // Prepare request $request = new HttpRequest("http://{$this->remoteIp}:{$ctrlPort}/control", HTTP_METH_POST); $request->setOptions(array('timeout' => 4, 'connecttimeout' => 4)); $request->setHeaders(array("Date" => $timestamp, "X-Signature" => $signature)); $request->setRawPostData($encMessage); // Send request $request->send(); // Process response if ($request->getResponseCode() == 201) { $logger->info(sprintf("[FarmID: %s] Sending message '%s' via REST to server '%s' (server_id: %s) complete", $this->farmId, $message->getName(), $this->remoteIp, $this->serverId)); $this->Db->Execute("UPDATE messages SET status = ?, message = '' WHERE messageid = ?", array(MESSAGE_STATUS::HANDLED, $message->messageId)); } 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, $request->getResponseCode(), $request->getResponseStatus())); } } catch (HttpException $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 %s", $message->getName(), $message->messageId, $this->remoteIp, $this->serverId, $request->getResponseCode(), $msg))); } else { $logger->fatal(sprintf("Cannot deliver message '%s' (message_id: %s) via REST" . " to server '%s' (server_id: %s). Error: %s %s", $message->getName(), $message->messageId, $this->remoteIp, $this->serverId, $request->getResponseCode(), $msg)); } return false; } } else { if ($this->remoteIp) { $community = $this->Db->GetOne("SELECT hash FROM farms WHERE id=?", array($this->farmId)); $snmpClient = new Scalr_Net_Snmp_Client(); $snmpClient->connect($this->remoteIp, 162, $community); $converter = Scalr_Messaging_SnmpConverter::getInstance(); $trap = $converter->convert($message, $isEventNotice); $res = $snmpClient->sendTrap($trap); Logger::getLogger('DBServer')->info("[FarmID: {$this->farmId}] Sending message " . $message->getName() . " via SNMP ({$trap}) to '{$this->serverId}' ('{$this->remoteIp}') complete ({$res})"); } } return $message; }