parent
cfc0f60042
commit
db41024c89
|
@ -0,0 +1,227 @@
|
|||
<?php
|
||||
/* Icinga Web 2 | (c) 2016 Icinga Development Team | GPLv2+ */
|
||||
|
||||
namespace Icinga\Module\Monitoring\Command\Transport;
|
||||
|
||||
use Icinga\Application\Logger;
|
||||
use Icinga\Module\Monitoring\Command\IcingaCommand;
|
||||
use Icinga\Module\Monitoring\Command\Renderer\IcingaApiCommandRenderer;
|
||||
use Icinga\Module\Monitoring\Exception\CommandTransportException;
|
||||
use Icinga\Module\Monitoring\Web\Rest\RestRequest;
|
||||
|
||||
/**
|
||||
* Command transport over Icinga 2's REST API
|
||||
*/
|
||||
class ApiCommandTransport implements CommandTransportInterface
|
||||
{
|
||||
/**
|
||||
* Transport identifier
|
||||
*/
|
||||
const TRANSPORT = 'api';
|
||||
|
||||
/**
|
||||
* API host
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $host;
|
||||
|
||||
/**
|
||||
* API password
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $password;
|
||||
|
||||
/**
|
||||
* API port
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $port = 5665;
|
||||
|
||||
/**
|
||||
* Command renderer
|
||||
*
|
||||
* @var IcingaApiCommandRenderer
|
||||
*/
|
||||
protected $renderer;
|
||||
|
||||
/**
|
||||
* API username
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $username;
|
||||
|
||||
/**
|
||||
* Create a new API command transport
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->renderer = new IcingaApiCommandRenderer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the name of the Icinga application object
|
||||
*
|
||||
* @param string $app
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setApp($app)
|
||||
{
|
||||
$this->renderer->setApp($app);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the API host
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getHost()
|
||||
{
|
||||
return $this->host;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the API host
|
||||
*
|
||||
* @param string $host
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setHost($host)
|
||||
{
|
||||
$this->host = $host;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the API password
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getPassword()
|
||||
{
|
||||
return $this->password;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the API password
|
||||
*
|
||||
* @param string $password
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setPassword($password)
|
||||
{
|
||||
$this->password = $password;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the API port
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getPort()
|
||||
{
|
||||
return $this->port;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the API port
|
||||
*
|
||||
* @param int $port
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setPort($port)
|
||||
{
|
||||
$this->port = (int) $port;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the API username
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUsername()
|
||||
{
|
||||
return $this->username;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the API username
|
||||
*
|
||||
* @param string $username
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setUsername($username)
|
||||
{
|
||||
$this->username = $username;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get URI for endpoint
|
||||
*
|
||||
* @param string $endpoint
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getUriFor($endpoint)
|
||||
{
|
||||
return sprintf('https://%s:%u/v1/%s', $this->getHost(), $this->getPort(), $endpoint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the Icinga command over the Icinga 2 API
|
||||
*
|
||||
* @param IcingaCommand $command
|
||||
* @param int|null $now
|
||||
*
|
||||
* @throws CommandTransportException
|
||||
*/
|
||||
public function send(IcingaCommand $command, $now = null)
|
||||
{
|
||||
$command = $this->renderer->render($command);
|
||||
Logger::debug(
|
||||
'Sending Icinga command "%s" to the API "%s:%u"',
|
||||
$command->getEndpoint(),
|
||||
$this->getHost(),
|
||||
$this->getPort()
|
||||
);
|
||||
$response = RestRequest::post($this->getUriFor($command->getEndpoint()))
|
||||
->authenticateWith($this->getUsername(), $this->getPassword())
|
||||
->sendJson()
|
||||
->noStrictSsl()
|
||||
->setPayload($command->getData())
|
||||
->send();
|
||||
if (isset($response['error'])) {
|
||||
throw new CommandTransportException(
|
||||
'Can\'t send external Icinga command: %u %s',
|
||||
$response['error'],
|
||||
$response['status']
|
||||
);
|
||||
}
|
||||
$result = array_pop($response['results']);
|
||||
|
||||
if ($result['code'] < 200 || $result['code'] >= 300) {
|
||||
throw new CommandTransportException(
|
||||
'Can\'t send external Icinga command: %u %s',
|
||||
$result['code'],
|
||||
$result['status']
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue