icinga2/contrib/IcingaConnection.class.php

117 lines
2.9 KiB
PHP

<?php
class IcingaConnection
{
private $_streamContext;
private $_stream;
private $_subscriptions;
private $_publications;
public function __construct()
{
$this->_subscriptions = array();
$this->_publications = array();
}
public function Connect($host, $port, $cafile, $cert)
{
$this->_streamContext = stream_context_create();
stream_context_set_option($this->_streamContext, 'ssl', 'cafile', $cafile);
stream_context_set_option($this->_streamContext, 'ssl', 'local_cert', $cert);
$this->_stream = stream_socket_client('ssl://' . $host . ':' . $port, $error, $errorString, 60, STREAM_CLIENT_CONNECT, $this->_streamContext);
if ($this->_stream === false)
return false;
$this->Publish('discovery::RegisterComponent');
$this->Publish('discovery::Welcome');
$this->Subscribe('discovery::NewComponent');
$this->Subscribe('discovery::RegisterComponent');
$this->Subscribe('discovery::Welcome');
$params = array(
'publications' => $this->_publications,
'subscriptions' => $this->_subscriptions
);
$this->SendMessage('discovery::RegisterComponent', $params);
$this->SendMessage('discovery::Welcome');
}
public function Subscribe($topic)
{
$this->_subscriptions[] = $topic;
}
public function Publish($topic)
{
$this->_publications[] = $topic;
}
public function SendMessage($topic, $params = array())
{
$message = array('jsonrpc' => '2.0', 'method' => $topic, 'params' => $params);
$messageStr = json_encode($message, JSON_FORCE_OBJECT);
fprintf($this->_stream, '%d:%s,', strlen($messageStr), $messageStr);
fflush($this->_stream);
}
public function ReadMessage()
{
$lenStr = '';
/* read netstring length (up until the first :) */
while (($chr = fread($this->_stream, 1)) != ':') {
if ($chr === false)
return false;
$lenStr .= $chr;
}
/* read data */
$messageStr = fread($this->_stream, (int)$lenStr);
if ($messageStr === false)
return false;
/* read trailing comma */
$comma = fread($this->_stream, 1);
if ($comma != ',')
return false;
return json_decode($messageStr, true);
}
}
$icinga = new IcingaConnection();
$icinga->Subscribe('delegation::ServiceStatus');
if ($icinga->Connect('localhost', 7777, 'ca.crt', 'icinga-c3.pem') === false)
return;
while (($message = $icinga->ReadMessage()) !== false) {
if ($message['method'] != 'delegation::ServiceStatus')
continue;
$params = $message['params'];
$now = time();
$next = $params['next_check'] - $now;
$states = array('ok', 'warning', 'critical', 'uncheckable', 'unknown');
$types = array('hard', 'soft');
echo 'Service: ' . $params['service'] .
', State: ' . $states[$params['state']] .
', State Type: ' . $types[$params['state_type']] .
', Attempt: ' . $params['current_attempt'] .
' (took ' . ($params['result']['schedule_end'] - $params['result']['schedule_start']) . ' seconds' .
', next check in ' . $next . ' seconds)' .
"\n";
}
?>