[CachetBridge] Add new bridge (#1034)
* Fix issue with CachetAPI Pagination Fixing issue that only the oldest 20 entries were shown. _Background:_ _Cachet has a, lets call it odd, system of pagination. On the first page you see the incidents first created, so they are not what you want to see. But on the last page you can have 1 or 20 of the newest incidents. So you have to take the incidents from the last page (call it Pmax) and combine them with the incidents from Pmax - 1._
This commit is contained in:
parent
ca9c2abb60
commit
4c58768d4d
1 changed files with 134 additions and 0 deletions
134
bridges/CachetBridge.php
Normal file
134
bridges/CachetBridge.php
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class CachetBridge extends BridgeAbstract {
|
||||||
|
const NAME = 'Cachet Bridge';
|
||||||
|
const URI = 'https://cachethq.io/';
|
||||||
|
const DESCRIPTION = 'Returns status updates from any Cachet installation';
|
||||||
|
const MAINTAINER = 'klimplant';
|
||||||
|
const PARAMETERS = array(
|
||||||
|
array(
|
||||||
|
'host' => array(
|
||||||
|
'name' => 'Cachet installation',
|
||||||
|
'type' => 'text',
|
||||||
|
'required' => true,
|
||||||
|
'title' => 'The URL of the Cachet installation',
|
||||||
|
'exampleValue' => 'https://demo.cachethq.io/',
|
||||||
|
), 'additional_info' => array(
|
||||||
|
'name' => 'Additional Timestamps',
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'title' => 'Whether to include the given timestamps'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
const CACHE_TIMEOUT = 300;
|
||||||
|
|
||||||
|
private $componentCache = [];
|
||||||
|
|
||||||
|
public function getURI() {
|
||||||
|
return $this->getInput('host') === null ? 'https://cachethq.io/' : $this->getInput('host');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the ping request to the cache API
|
||||||
|
*
|
||||||
|
* @param string $ping
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
private function validatePing($ping) {
|
||||||
|
$ping = json_decode($ping);
|
||||||
|
if ($ping === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $ping->data === 'Pong!';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the component name of a cachat component
|
||||||
|
*
|
||||||
|
* @param integer $id
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function getComponentName($id) {
|
||||||
|
if ($id === 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (array_key_exists($id, $this->componentCache)) {
|
||||||
|
return $this->componentCache[$id];
|
||||||
|
}
|
||||||
|
|
||||||
|
$component = getContents($this->getURI() . '/api/v1/components/' . $id);
|
||||||
|
$component = json_decode($component);
|
||||||
|
if ($component === null) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return $component->data->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function collectData() {
|
||||||
|
$ping = getContents(urljoin($this->getURI(), '/api/v1/ping'));
|
||||||
|
if (!$this->validatePing($ping)) {
|
||||||
|
returnClientError('Provided URI is invalid!');
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = urljoin($this->getURI(), '/api/v1/incidents?sort=id&order=desc');
|
||||||
|
$incidents = getContents($url);
|
||||||
|
$incidents = json_decode($incidents);
|
||||||
|
if ($incidents === null) {
|
||||||
|
returnClientError('/api/v1/incidents returned no valid json');
|
||||||
|
}
|
||||||
|
|
||||||
|
usort($incidents->data, function ($a, $b) {
|
||||||
|
$timeA = strtotime($a->updated_at);
|
||||||
|
$timeB = strtotime($b->updated_at);
|
||||||
|
return $timeA > $timeB ? -1 : 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
foreach ($incidents->data as $incident) {
|
||||||
|
|
||||||
|
if (isset($incident->permalink)) {
|
||||||
|
$permalink = $incident->permalink;
|
||||||
|
} else {
|
||||||
|
$permalink = urljoin($this->getURI(), '/incident/' . $incident->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
$title = $incident->human_status . ': ' . $incident->name;
|
||||||
|
$message = '';
|
||||||
|
if ($this->getInput('additional_info')) {
|
||||||
|
if (isset($incident->occurred_at)) {
|
||||||
|
$message .= 'Occurred at: ' . $incident->occurred_at . "\r\n";
|
||||||
|
}
|
||||||
|
if (isset($incident->scheduled_at)) {
|
||||||
|
$message .= 'Scheduled at: ' . $incident->scheduled_at . "\r\n";
|
||||||
|
}
|
||||||
|
if (isset($incident->created_at)) {
|
||||||
|
$message .= 'Created at: ' . $incident->created_at . "\r\n";
|
||||||
|
}
|
||||||
|
if (isset($incident->updated_at)) {
|
||||||
|
$message .= 'Updated at: ' . $incident->updated_at . "\r\n\r\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$message .= $incident->message;
|
||||||
|
$content = nl2br($message);
|
||||||
|
$componentName = $this->getComponentName($incident->component_id);
|
||||||
|
$uidOrig = $permalink . $incident->created_at;
|
||||||
|
$uid = hash('sha512', $uidOrig);
|
||||||
|
$timestamp = strtotime($incident->created_at);
|
||||||
|
$categories = [];
|
||||||
|
$categories[] = $incident->human_status;
|
||||||
|
if ($componentName !== '') {
|
||||||
|
$categories[] = $componentName;
|
||||||
|
}
|
||||||
|
|
||||||
|
$item = [];
|
||||||
|
$item['uri'] = $permalink;
|
||||||
|
$item['title'] = $title;
|
||||||
|
$item['timestamp'] = $timestamp;
|
||||||
|
$item['content'] = $content;
|
||||||
|
$item['uid'] = $uid;
|
||||||
|
$item['categories'] = $categories;
|
||||||
|
|
||||||
|
$this->items[] = $item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue