From c142ce22def7ae64f6435b97b74308c3a07835f3 Mon Sep 17 00:00:00 2001 From: f0o Date: Sun, 11 Oct 2015 07:11:29 +0000 Subject: [PATCH 1/7] Added Clickatell and PlaySMS Transports --- doc/Extensions/Alerting.md | 34 ++++++++++++++++++ includes/alerts/transport.clickatell.php | 45 ++++++++++++++++++++++++ includes/alerts/transport.playsms.php | 39 ++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 includes/alerts/transport.clickatell.php create mode 100644 includes/alerts/transport.playsms.php diff --git a/doc/Extensions/Alerting.md b/doc/Extensions/Alerting.md index fe4e51dab..3e1efa761 100644 --- a/doc/Extensions/Alerting.md +++ b/doc/Extensions/Alerting.md @@ -18,6 +18,8 @@ Table of Content: - [Pushover](#transports-pushover) - [Boxcar](#transports-boxcar) - [Pushbullet](#transports-pushbullet) + - [Clickatell](#transports-clickatell) + - [PlaySMS](#transports-playsms) - [Entities](#entities) - [Devices](#entity-devices) - [BGP Peers](#entity-bgppeers) @@ -372,6 +374,38 @@ $config['alert']['transports']['pushbullet'] = 'MYFANCYACCESSTOKEN'; ``` ~~ +## Clickatell + +Clickatell provides a REST-API requiring an Authorization-Token and at least one Cellphone number. +Please consult Clickatell's documentation regarding number formating. +Here an example using 3 numbers, any amount of numbers is supported: + +~~ +```php +$config['alert']['transports']['clickatell']['token'] = 'MYFANCYACCESSTOKEN'; +$config['alert']['transports']['clickatell']['to'][] = '+1234567890'; +$config['alert']['transports']['clickatell']['to'][] = '+1234567891'; +$config['alert']['transports']['clickatell']['to'][] = '+1234567892'; +``` +~~ + +## PlaySMS + +PlaySMS is an OpenSource SMS-Gateway that can be used via their HTTP-API using a Username and WebService-Token. +Please consult PlaySMS's documentation regarding number formating. +Here an example using 3 numbers, any amount of numbers is supported: + +~~ +```php +$config['alert']['transports']['playsms']['url'] = 'https://localhost/index.php?app=ws'; +$config['alert']['transports']['playsms']['user'] = 'user1'; +$config['alert']['transports']['playsms']['token'] = 'MYFANCYACCESSTOKEN'; +$config['alert']['transports']['playsms']['to'][] = '+1234567890'; +$config['alert']['transports']['playsms']['to'][] = '+1234567891'; +$config['alert']['transports']['playsms']['to'][] = '+1234567892'; +``` +~~ + # Entities Entities as described earlier are based on the table and column names within the database, if you are unsure of what the entity is you want then have a browse around inside MySQL using `show tables` and `desc `. diff --git a/includes/alerts/transport.clickatell.php b/includes/alerts/transport.clickatell.php new file mode 100644 index 000000000..a8d423487 --- /dev/null +++ b/includes/alerts/transport.clickatell.php @@ -0,0 +1,45 @@ +/* Copyright (C) 2015 Daniel Preussker + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + +/** + * Clickatell REST-API Transport + * @author f0o + * @copyright 2015 f0o, LibreNMS + * @license GPL + * @package LibreNMS + * @subpackage Alerts + */ + +$data = array("text" => $obj['title'], "to" => $opts['to']); +$data = json_encode($data); +$curl = curl_init('https://api.clickatell.com/rest/message'); + +curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); +curl_setopt($curl, CURLOPT_POSTFIELDS, $data); +curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); +curl_setopt($curl, CURLOPT_HTTPHEADER, array( + 'Content-Type: application/json', + 'Content-Length: '.strlen($data), + 'Authorization: Bearer '.$opts['token'], +)); + +$ret = curl_exec($curl); +$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); +if( $code > 202 ) { + if( $debug ) { + var_dump($ret); + } + return false; +} +return true; diff --git a/includes/alerts/transport.playsms.php b/includes/alerts/transport.playsms.php new file mode 100644 index 000000000..d271fda9d --- /dev/null +++ b/includes/alerts/transport.playsms.php @@ -0,0 +1,39 @@ +/* Copyright (C) 2015 Daniel Preussker + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + +/** + * PlaySMS API Transport + * @author f0o + * @copyright 2015 f0o, LibreNMS + * @license GPL + * @package LibreNMS + * @subpackage Alerts + */ + +$data = array("msg" => $obj['title'], "to" => implode(',',$opts['to']), "h" => $opts['token'], "u" => $opts['user']); +$url = $opts['url'].'&'.http_build_query($data); +$curl = curl_init($url); + +curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET"); +curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + +$ret = curl_exec($curl); +$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); +if( $code > 202 ) { + if( $debug ) { + var_dump($ret); + } + return false; +} +return true; From 4c3d80951bf20951a0b1c2f6455ea15c61edd90d Mon Sep 17 00:00:00 2001 From: f0o Date: Tue, 20 Oct 2015 19:27:26 +0000 Subject: [PATCH 2/7] Added op=pv --- includes/alerts/transport.playsms.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/alerts/transport.playsms.php b/includes/alerts/transport.playsms.php index d271fda9d..f2fa71cab 100644 --- a/includes/alerts/transport.playsms.php +++ b/includes/alerts/transport.playsms.php @@ -21,8 +21,8 @@ * @subpackage Alerts */ -$data = array("msg" => $obj['title'], "to" => implode(',',$opts['to']), "h" => $opts['token'], "u" => $opts['user']); -$url = $opts['url'].'&'.http_build_query($data); +$data = array("u" => $opts['user'], "h" => $opts['token'], "to" => implode(',',$opts['to']), "msg" => $obj['title'],); +$url = $opts['url'].'&op=pv&'.http_build_query($data); $curl = curl_init($url); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET"); From aa7cd385fb6c70ca58f93c2f8869ab934c642496 Mon Sep 17 00:00:00 2001 From: f0o Date: Tue, 20 Oct 2015 19:40:11 +0000 Subject: [PATCH 3/7] Added Optional `from` parameter --- doc/Extensions/Alerting.md | 2 +- includes/alerts/transport.playsms.php | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/Extensions/Alerting.md b/doc/Extensions/Alerting.md index 3e1efa761..c4ffcafac 100644 --- a/doc/Extensions/Alerting.md +++ b/doc/Extensions/Alerting.md @@ -400,9 +400,9 @@ Here an example using 3 numbers, any amount of numbers is supported: $config['alert']['transports']['playsms']['url'] = 'https://localhost/index.php?app=ws'; $config['alert']['transports']['playsms']['user'] = 'user1'; $config['alert']['transports']['playsms']['token'] = 'MYFANCYACCESSTOKEN'; +$config['alert']['transports']['playsms']['from'] = '+1234567892'; //Optional $config['alert']['transports']['playsms']['to'][] = '+1234567890'; $config['alert']['transports']['playsms']['to'][] = '+1234567891'; -$config['alert']['transports']['playsms']['to'][] = '+1234567892'; ``` ~~ diff --git a/includes/alerts/transport.playsms.php b/includes/alerts/transport.playsms.php index f2fa71cab..812ae4ffe 100644 --- a/includes/alerts/transport.playsms.php +++ b/includes/alerts/transport.playsms.php @@ -21,7 +21,10 @@ * @subpackage Alerts */ -$data = array("u" => $opts['user'], "h" => $opts['token'], "to" => implode(',',$opts['to']), "msg" => $obj['title'],); +$data = array("u" => $opts['user'], "h" => $opts['token'], "to" => implode(',',$opts['to']), "msg" => $obj['title']); +if (!empty($opts['from'])) { + $data["from"] = $opts['from']; +} $url = $opts['url'].'&op=pv&'.http_build_query($data); $curl = curl_init($url); From 71a072d1363154b26c0fba3b8bb0fe515f4ff814 Mon Sep 17 00:00:00 2001 From: f0o Date: Tue, 20 Oct 2015 20:10:59 +0000 Subject: [PATCH 4/7] Fixes to clickatell --- includes/alerts/transport.clickatell.php | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/includes/alerts/transport.clickatell.php b/includes/alerts/transport.clickatell.php index a8d423487..638ac332d 100644 --- a/includes/alerts/transport.clickatell.php +++ b/includes/alerts/transport.clickatell.php @@ -21,22 +21,19 @@ * @subpackage Alerts */ -$data = array("text" => $obj['title'], "to" => $opts['to']); -$data = json_encode($data); -$curl = curl_init('https://api.clickatell.com/rest/message'); +$data = array("api_id" => $opts['api_id'], "user" => $opts['user'], "password" => $opts['password'], "to" => $opts['to'], "text" => $obj['title']); +if (!empty($opts['from'])) { + $data['from'] = $opts['from']; +} +$url = 'https://api.clickatell.com/http/sendmsg?'.http_build_query($data); +$curl = curl_init($url); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); -curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); -curl_setopt($curl, CURLOPT_HTTPHEADER, array( - 'Content-Type: application/json', - 'Content-Length: '.strlen($data), - 'Authorization: Bearer '.$opts['token'], -)); $ret = curl_exec($curl); $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); -if( $code > 202 ) { +if( $code > 200 ) { if( $debug ) { var_dump($ret); } From ff228779b98e97b3ec2ed0a4705430f929e99a20 Mon Sep 17 00:00:00 2001 From: f0o Date: Tue, 20 Oct 2015 20:32:22 +0000 Subject: [PATCH 5/7] Fix cliackatell's to --- includes/alerts/transport.clickatell.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/alerts/transport.clickatell.php b/includes/alerts/transport.clickatell.php index 638ac332d..02d1f5a91 100644 --- a/includes/alerts/transport.clickatell.php +++ b/includes/alerts/transport.clickatell.php @@ -21,7 +21,7 @@ * @subpackage Alerts */ -$data = array("api_id" => $opts['api_id'], "user" => $opts['user'], "password" => $opts['password'], "to" => $opts['to'], "text" => $obj['title']); +$data = array("api_id" => $opts['api_id'], "user" => $opts['user'], "password" => $opts['password'], "to" => implode(',',$opts['to']), "text" => $obj['title']); if (!empty($opts['from'])) { $data['from'] = $opts['from']; } From 1b5eabb919c32dc45e0e063c1816b560c0eb759b Mon Sep 17 00:00:00 2001 From: f0o Date: Sat, 21 Nov 2015 16:03:09 +0000 Subject: [PATCH 6/7] Added VictorOps transport --- includes/alerts/transport.victorops.php | 57 +++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 includes/alerts/transport.victorops.php diff --git a/includes/alerts/transport.victorops.php b/includes/alerts/transport.victorops.php new file mode 100644 index 000000000..7e1fd622a --- /dev/null +++ b/includes/alerts/transport.victorops.php @@ -0,0 +1,57 @@ +/* Copyright (C) 2015 Daniel Preussker + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + +/** + * VictorOps Generic-API Transport - Based on PagerDuty transport + * @author f0o + * @author laf + * @copyright 2015 f0o, laf, LibreNMS + * @license GPL + * @package LibreNMS + * @subpackage Alerts + */ + +$url = $opts['url']; + +$protocol = array( + 'entity_id' => ($obj['id'] ? $obj['id'] : $obj['uid']), + 'state_start_time' => strtotime($obj['timestamp']), + 'monitoring_tool' => 'librenms', +); +if( $obj['state'] == 0 ) { + $protocol['message_type'] = 'recovery'; +} +elseif( $obj['state'] == 2 ) { + $protocol['message_type'] = 'acknowledgement'; +} +elseif ($obj['state'] == 1) { + $protocol['message_type'] = 'critical'; +} + +foreach( $obj['faults'] as $fault=>$data ) { + $protocol['state_message'] .= $data['string']; +} + +$curl = curl_init(); +curl_setopt($curl, CURLOPT_URL, $url ); +curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); +curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type'=> 'application/json')); +curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($protocol)); +$ret = curl_exec($curl); +$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); +if( $code != 200 ) { + var_dump("VictorOps returned Error, retry later"); //FIXME: propper debuging + return false; +} +return true; From 430ef48b3901b7899ad09f0b861cc99b5f5dc996 Mon Sep 17 00:00:00 2001 From: f0o Date: Sat, 21 Nov 2015 16:23:08 +0000 Subject: [PATCH 7/7] Added victorops docs --- doc/Extensions/Alerting.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/doc/Extensions/Alerting.md b/doc/Extensions/Alerting.md index c4ffcafac..d87d30a11 100644 --- a/doc/Extensions/Alerting.md +++ b/doc/Extensions/Alerting.md @@ -20,6 +20,7 @@ Table of Content: - [Pushbullet](#transports-pushbullet) - [Clickatell](#transports-clickatell) - [PlaySMS](#transports-playsms) + - [VictorOps](#transports-victorops) - [Entities](#entities) - [Devices](#entity-devices) - [BGP Peers](#entity-bgppeers) @@ -406,6 +407,22 @@ $config['alert']['transports']['playsms']['to'][] = '+1234567891'; ``` ~~ +## VictorOps + +VictorOps provide a webHook url to make integration extremely simple. To get the URL required login to your VictorOps account and go to: + +Settings -> Integrations -> REST Endpoint -> Enable Integration. + +The URL provided will have $routing_key at the end, you need to change this to something that is unique to the system sending the alerts such as librenms. I.e: + +`https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms` + +~~ +```php +$config['alert']['transports']['victorops']['url'] = 'https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms'; +``` +~~ + # Entities Entities as described earlier are based on the table and column names within the database, if you are unsure of what the entity is you want then have a browse around inside MySQL using `show tables` and `desc `.