diff --git a/phplib/Target.php b/phplib/Target.php index ead5b59..935c6f6 100644 --- a/phplib/Target.php +++ b/phplib/Target.php @@ -9,7 +9,7 @@ * @package FOO */ abstract class Target extends Element { - public static $TYPES = ['Null_Target', 'WebHook_Target', 'Jira_Target', 'Slack_Target']; + public static $TYPES = ['Null_Target', 'WebHook_Target', 'Jira_Target', 'Slack_Target', 'PagerDuty_Target']; public static $TABLE = 'search_targets'; public static $PKEY = 'target_id'; diff --git a/phplib/Target/PagerDuty.php b/phplib/Target/PagerDuty.php new file mode 100644 index 0000000..cd8cf71 --- /dev/null +++ b/phplib/Target/PagerDuty.php @@ -0,0 +1,76 @@ + [static::T_STR, null, ''] + ]; + } + + /** + * Create event. + * + * @param Alert An Alert object + * @param int $date The current date. + */ + public function process(Alert $alert, $date) { + $site = SiteFinder::getCurrent(); + $desc = [ + 'date' => sprintf('%s', gmdate(DATE_RSS, $alert['alert_date'])), + + ]; + + // Don't show the link if this event isn't persisted. + if(!$alert->isNew()) { + $desc['link_to_alert'] = sprintf('https://%s/alert/%d', $site['host'], $alert['alert_id']); + } + foreach($alert['content'] as $key=>$value) { + $desc[$key] = $value; + } + + $search = SearchFinder::getById($alert['search_id']); + + $ret = self::createEvent( + [ + 'service_key' => $this->obj['data']['service_key'], + 'event_type' => 'trigger', + 'client' => '411', + 'description' => sprintf('[%s] %s', $site['name'], $search['name']), + 'details' => json_encode($desc), + ] + ); + if(!$ret) { + throw new TargetException(sprintf('Failed to send Event:%d to PagerDuty', $alert['alert_id'])); + } + } + + /** + * Create a PagerDuty Event. + * @param mixed[] $event_data Event data. + * @return string|null The incident key or null. + */ + public static function createEvent($event_data) { + $curl = new \Curl\Curl; + $curl->setHeader('Content-type', 'application/json'); + $ret = $curl->post( + 'https://events.pagerduty.com/generic/2010-04-15/create_event.json', + json_encode($event_data) + ); + + if($curl->httpStatusCode != 200) { + throw new TargetException(sprintf('Remote server returned %d: %s: %s', $curl->httpStatusCode, $curl->httpErrorMessage, $ret)); + } + + return $ret->incident_key; + } +}