diff --git a/alerts.php b/alerts.php
index 458fc330ab..fe27ea604b 100755
--- a/alerts.php
+++ b/alerts.php
@@ -247,7 +247,7 @@ function ExtTransports($obj) {
global $config;
$tmp = false; //To keep scrutinizer from naging because it doesnt understand eval
foreach( $config['alert']['transports'] as $transport=>$opts ) {
- if( ($opts === true || !empty($opts)) && file_exists($config['install_dir']."/includes/alerts/transport.".$transport.".php") ) {
+ if( ($opts === true || !empty($opts)) && $opts != false && file_exists($config['install_dir']."/includes/alerts/transport.".$transport.".php") ) {
echo $transport." => ";
eval('$tmp = function($obj,$opts) { global $config; '.file_get_contents($config['install_dir']."/includes/alerts/transport.".$transport.".php").' };');
$tmp = $tmp($obj,$opts);
diff --git a/doc/Extensions/Alerting.md b/doc/Extensions/Alerting.md
index a542be682d..f763f32b35 100644
--- a/doc/Extensions/Alerting.md
+++ b/doc/Extensions/Alerting.md
@@ -139,6 +139,8 @@ $config['alert']['admins'] = true; //Include Adminstrators into alert-contacts
## E-Mail
+> You can configure these options within the WebUI now, please avoid setting these options within config.php
+
E-Mail transport is enabled with adding the following to your `config.php`:
```php
$config['alert']['transports']['mail'] = true;
@@ -165,6 +167,8 @@ $config['alert']['default_mail'] = ''; //Default ema
## API
+> You can configure these options within the WebUI now, please avoid setting these options within config.php
+
API transports definitions are a bit more complex than the E-Mail configuration.
The basis for configuration is `$config['alert']['transports']['api'][METHOD]` where `METHOD` can be `get`,`post` or `put`.
This basis has to contain an array with URLs of each API to call.
@@ -180,6 +184,8 @@ $config['alert']['transports']['api']['get'][] = "https://api.thirdparti.es/issu
## Nagios Compatible
+> You can configure these options within the WebUI now, please avoid setting these options within config.php
+
The nagios transport will feed a FIFO at the defined location with the same format that nagios would.
This allows you to use other Alerting-Systems to work with LibreNMS, for example [Flapjack](http://flapjack.io).
```php
@@ -188,6 +194,8 @@ $config['alert']['transports']['nagios'] = "/path/to/my.fifo"; //Flapjack expect
## IRC
+> You can configure these options within the WebUI now, please avoid setting these options within config.php
+
The IRC transports only works together with the LibreNMS IRC-Bot.
Configuration of the LibreNMS IRC-Bot is described [here](https://github.com/librenms/librenms/blob/master/doc/Extensions/IRC-Bot.md).
```php
@@ -196,6 +204,8 @@ $config['alert']['transports']['irc'] = true;
## Slack
+> You can configure these options within the WebUI now, please avoid setting these options within config.php
+
The Slack transport will POST the alert message to your Slack Incoming WebHook, you are able to specify multiple webhooks along with the relevant options to go with it. All options are optional, the only required value is for url, without this then no call to Slack will be made. Below is an example of how to send alerts to two channels with different customised options:
```php
@@ -207,6 +217,8 @@ $config['alert']['transports']['slack'][] = array('url' => "https://hooks.slack.
## HipChat
+> You can configure these options within the WebUI now, please avoid setting these options within config.php
+
The HipChat transport requires the following:
__room_id__ = HipChat Room ID
@@ -252,6 +264,8 @@ $config['alert']['transports']['hipchat'][] = array("url" => "https://api.hipcha
## PagerDuty
+> You can configure these options within the WebUI now, please avoid setting these options within config.php
+
Enabling PagerDuty transports is almost as easy as enabling email-transports.
All you need is to create a Service with type Generic API on your PagerDuty dashboard.
diff --git a/doc/Support/Configuration.md b/doc/Support/Configuration.md
index 99d0eac664..9d6095859c 100644
--- a/doc/Support/Configuration.md
+++ b/doc/Support/Configuration.md
@@ -215,6 +215,8 @@ Arrays of subnets to exclude in auto discovery mode.
#### Email configuration
+> You can configure these options within the WebUI now, please avoid setting these options within config.php
+
```php
$config['email_backend'] = 'mail';
$config['email_from'] = NULL;
diff --git a/html/form_new_config.php b/html/form_new_config.php
new file mode 100644
index 0000000000..6f45a3d6c4
--- /dev/null
+++ b/html/form_new_config.php
@@ -0,0 +1,99 @@
+
+ *
+ * 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. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+enable_debug();
+
+include_once("../includes/defaults.inc.php");
+include_once("../config.php");
+include_once("../includes/definitions.inc.php");
+include_once("includes/functions.inc.php");
+include_once("../includes/functions.php");
+include_once("includes/authenticate.inc.php");
+
+if (!$_SESSION['authenticated']) { echo("unauthenticated"); exit; }
+
+$new_conf_type = $_POST['new_conf_type'];
+$new_conf_name = $_POST['new_conf_name'];
+$new_conf_desc = $_POST['new_conf_desc'];
+
+if(empty($new_conf_name))
+{
+ echo("You haven't specified a config name");
+ exit;
+}
+elseif(empty($new_conf_desc))
+{
+ echo("You haven't specified a config description");
+ exit;
+}
+elseif(empty($_POST['new_conf_single_value']) && empty($_POST['new_conf_multi_value']))
+{
+ echo("You haven't specified a config value");
+ exit;
+}
+
+$db_inserted = '0';
+
+if($new_conf_type == 'Single')
+{
+ $new_conf_type = 'single';
+ $new_conf_value = $_POST['new_conf_single_value'];
+ $db_inserted = add_config_item($new_conf_name,$new_conf_value,$new_conf_type,$new_conf_desc);
+}
+elseif($new_conf_type == 'Single Array')
+{
+ $new_conf_type = 'single-array';
+ $new_conf_value = $_POST['new_conf_single_value'];
+ $db_inserted = add_config_item($new_conf_name,$new_conf_value,$new_conf_type,$new_conf_desc);
+}
+elseif($new_conf_type == 'Standard Array' || $new_conf_type == 'Multi Array')
+{
+ if($new_conf_type == 'Standard Array')
+ {
+ $new_conf_type = 'array';
+ }
+ elseif($new_conf_type == 'Multi Array')
+ {
+ $new_conf_type = 'multi-array';
+ }
+ else
+ {
+ # $new_conf_type is invalid so clear values so we don't create any config
+ $new_conf_value = '';
+ }
+ $new_conf_value = nl2br($_POST['new_conf_multi_value']);
+ $values = explode('
',$new_conf_value);
+ foreach ($values as $item)
+ {
+ $new_conf_value = trim($item);
+ $db_inserted = add_config_item($new_conf_name,$new_conf_value,$new_conf_type,$new_conf_desc);
+ }
+}
+else
+{
+ echo('Bad config type!');
+ $db_inserted = 0;
+ exit;
+}
+
+if($db_inserted == 1)
+{
+ echo('Your new config item has been added');
+}
+else
+{
+ echo('An error occurred adding your config item to the database');
+}
+
+?>
diff --git a/html/forms/config-item-disable.inc.php b/html/forms/config-item-disable.inc.php
new file mode 100644
index 0000000000..e44f6afdc0
--- /dev/null
+++ b/html/forms/config-item-disable.inc.php
@@ -0,0 +1,48 @@
+
+ *
+ * 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. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+// FUA
+
+if(!is_numeric($_POST['config_id']))
+{
+ echo('error with data');
+ exit;
+}
+else
+{
+ if($_POST['state'] == 'true')
+ {
+ $state = 1;
+ }
+ elseif($_POST['state'] == 'false')
+ {
+ $state = 0;
+ }
+ else
+ {
+ $state = 0;
+ }
+ $update = dbUpdate(array('config_disabled' => $state), 'config', '`config_id` = ?', array($_POST['config_id']));
+ if(!empty($update) || $update == '0')
+ {
+ echo('success');
+ exit;
+ }
+ else
+ {
+ echo('error');
+ exit;
+ }
+}
+
diff --git a/html/forms/config-item-update.inc.php b/html/forms/config-item-update.inc.php
new file mode 100644
index 0000000000..9ba7957861
--- /dev/null
+++ b/html/forms/config-item-update.inc.php
@@ -0,0 +1,37 @@
+
+ *
+ * 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. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+// FUA
+
+if(!is_numeric($_POST['config_id']) || empty($_POST['data']))
+{
+ echo('error with data');
+ exit;
+}
+else
+{
+ $data = mres($_POST['data']);
+ $update = dbUpdate(array('config_value' => "$data"), 'config', '`config_id` = ?', array($_POST['config_id']));
+ if(!empty($update) || $update == '0')
+ {
+ echo('success');
+ exit;
+ }
+ else
+ {
+ echo('error');
+ exit;
+ }
+}
+
diff --git a/html/forms/config-item.inc.php b/html/forms/config-item.inc.php
new file mode 100644
index 0000000000..1a481b64a3
--- /dev/null
+++ b/html/forms/config-item.inc.php
@@ -0,0 +1,108 @@
+
+ *
+ * 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. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+if(is_admin() === false) {
+ $response = array('status'=>'error','message'=>'Need to be admin');
+ echo _json_encode($response);
+ exit;
+}
+
+$action = mres($_POST['action']);
+$config_group = mres($_POST['config_group']);
+$config_sub_group = mres($_POST['config_sub_group']);
+$config_name = mres($_POST['config_name']);
+$config_value = mres($_POST['config_value']);
+$config_extra = mres($_POST['config_extra']);
+$config_room_id = mres($_POST['config_room_id']);
+$config_from = mres($_POST['config_from']);
+$status = 'error';
+$message = 'Error with config';
+
+if ($action == 'remove' || $action == 'remove-slack' || $action == 'remove-hipchat') {
+ $config_id = mres($_POST['config_id']);
+ if (empty($config_id)) {
+ $message = 'No config id passed';
+ } else {
+ if (dbDelete('config', '`config_id`=?', array($config_id))) {
+ if ($action == 'remove-slack') {
+ dbDelete('config', "`config_name` LIKE 'alert.transports.slack.$config_id.%'");
+ } elseif ($action == 'remove-hipchat') {
+ dbDelete('config', "`config_name` LIKE 'alert.transports.hipchat.$config_id.%'");
+ }
+ $status = 'ok';
+ $message = 'Config item removed';
+ } else {
+ $message = 'General error, could not remove config';
+ }
+ }
+} elseif ($action == 'add-slack') {
+ if (empty($config_value)) {
+ $message = 'No Slack url provided';
+ } else {
+ $config_id = dbInsert(array('config_name' => 'alert.transports.slack.', 'config_value' => $config_value, 'config_group' => $config_group, 'config_sub_group' => $config_sub_group, 'config_default'=>$config_value, 'config_descr'=>'Slack Transport'), 'config');
+ if ($config_id > 0) {
+ dbUpdate(array('config_name' => 'alert.transports.slack.'.$config_id.'.url'), 'config', 'config_id=?', array($config_id));
+ $status = 'ok';
+ $message = 'Config item created';
+ $extras = explode('\n',$config_extra);
+ foreach ($extras as $option) {
+ list($k,$v) = explode("=", $option,2);
+ if (!empty($k) || !empty($v)) {
+ dbInsert(array('config_name' => 'alert.transports.slack.'.$config_id.'.'.$k, 'config_value' => $v, 'config_group' => $config_group, 'config_sub_group' => $config_sub_group, 'config_default'=>$v, 'config_descr'=>'Slack Transport'), 'config');
+ }
+ }
+ } else {
+ $message = 'Could not create config item';
+ }
+ }
+} elseif ($action == 'add-hipchat') {
+ if (empty($config_value) || empty($config_room_id) || empty($config_from)) {
+ $message = 'No hipchat url, room id or from provided';
+ } else {
+ $config_id = dbInsert(array('config_name' => 'alert.transports.hipchat.', 'config_value' => $config_value, 'config_group' => $config_group, 'config_sub_group' => $config_sub_group, 'config_default'=>$config_value, 'config_descr'=>'Hipchat Transport'), 'config');
+ if ($config_id > 0) {
+ dbUpdate(array('config_name' => 'alert.transports.hipchat.'.$config_id.'.url'), 'config', 'config_id=?', array($config_id));
+ dbInsert(array('config_name' => 'alert.transports.hipchat.'.$config_id.'.room_id', 'config_value' => $config_room_id, 'config_group' => $config_group, 'config_sub_group' => $config_sub_group, 'config_default'=>$config_room_id, 'config_descr'=>'Hipchat URL'), 'config');
+ dbInsert(array('config_name' => 'alert.transports.hipchat.'.$config_id.'.from', 'config_value' => $config_from, 'config_group' => $config_group, 'config_sub_group' => $config_sub_group, 'config_default'=>$config_from, 'config_descr'=>'Hipchat From'), 'config');
+ $status = 'ok';
+ $message = 'Config item created';
+ $extras = explode('\n',$config_extra);
+ foreach ($extras as $option) {
+ list($k,$v) = explode("=", $option,2);
+ if (!empty($k) || !empty($v)) {
+ dbInsert(array('config_name' => 'alert.transports.hipchat.'.$config_id.'.'.$k, 'config_value' => $v, 'config_group' => $config_group, 'config_sub_group' => $config_sub_group, 'config_default'=>$v, 'config_descr'=>'Hipchat '.$v), 'config');
+ }
+ }
+ } else {
+ $message = 'Could not create config item';
+ }
+ }
+} else {
+
+ if (empty($config_group) || empty($config_sub_group) || empty($config_name) || empty($config_value)) {
+ $message = 'Missing config name or value';
+ } else {
+ $config_id = dbInsert(array('config_name' => $config_name, 'config_value' => $config_value, 'config_group' => $config_group, 'config_sub_group' => $config_sub_group, 'config_default'=>$config_value, 'config_descr'=>'API Transport'), 'config');
+ if ($config_id > 0) {
+ dbUpdate(array('config_name'=>$config_name.$config_id),'config','config_id=?',array($config_id));
+ $status = 'ok';
+ $message = 'Config item created';
+ } else {
+ $message = 'Could not create config item';
+ }
+ }
+}
+
+$response = array('status'=>$status,'message'=>$message, 'config_id'=>$config_id);
+echo _json_encode($response);
diff --git a/html/forms/update-config-item.inc.php b/html/forms/update-config-item.inc.php
new file mode 100644
index 0000000000..4c8cc5545f
--- /dev/null
+++ b/html/forms/update-config-item.inc.php
@@ -0,0 +1,62 @@
+
+ *
+ * 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. Please see LICENSE.txt at the top level of
+ * the source code distribution for details.
+ */
+
+if(is_admin() === false) {
+ die('ERROR: You need to be admin');
+}
+
+$config_id = mres($_POST['config_id']);
+$action = mres($_POST['action']);
+$config_type = mres($_POST['config_type']);
+
+$status = 'error';
+
+if (!is_numeric($config_id)) {
+ $message = 'ERROR: No alert selected';
+} elseif ($action == 'update-textarea') {
+ $extras = explode(PHP_EOL,$_POST['config_value']);
+ foreach ($extras as $option) {
+ list($k,$v) = explode("=", $option,2);
+ if (!empty($k) || !empty($v)) {
+ if ($config_type == 'slack') {
+ $db_id[] = dbInsert(array('config_name' => 'alert.transports.slack.'.$config_id.'.'.$k, 'config_value' => $v, 'config_group' => 'alerting', 'config_sub_group' => 'transports', 'config_default'=>$v, 'config_descr'=>'Slack Transport'), 'config');
+ } elseif ($config_type == 'hipchat') {
+ $db_id[] = dbInsert(array('config_name' => 'alert.transports.hipchat.'.$config_id.'.'.$k, 'config_value' => $v, 'config_group' => 'alerting', 'config_sub_group' => 'transports', 'config_default'=>$v, 'config_descr'=>'Hipchat Transport'), 'config');
+ }
+ }
+ }
+ $db_inserts = implode(",",$db_id);
+ if (!empty($db_inserts)) {
+ if ($config_type == 'slack') {
+ dbDelete('config',"(`config_name` LIKE 'alert.transports.slack.$config_id.%' AND `config_name` != 'alert.transports.slack.$config_id.url' AND `config_id` NOT IN ($db_inserts))");
+ } elseif ($config_type == 'hipchat') {
+ dbDelete('config',"(`config_name` LIKE 'alert.transports.hipchat.$config_id.%' AND (`config_name` != 'alert.transports.hipchat.$config_id.url' AND `config_name` != 'alert.transports.hipchat.$config_id.room_id' AND `config_name` != 'alert.transports.hipchat.$config_id.from') AND `config_id` NOT IN ($db_inserts))");
+ }
+ }
+ $message = 'Config item has been updated:';
+ $status = 'ok';
+} else {
+ $state = mres($_POST['config_value']);
+ $update = dbUpdate(array('config_value' => $state), 'config', '`config_id`=?', array($config_id));
+ if(!empty($update) || $update == '0')
+ {
+ $message = 'Alert rule has been updated.';
+ $status = 'ok';
+ } else {
+ $message = 'ERROR: Alert rule has not been updated.';
+ }
+}
+
+$response = array('status'=>$status,'message'=>$message);
+echo _json_encode($response);
diff --git a/html/images/pd_connect_button.png b/html/images/pd_connect_button.png
new file mode 100644
index 0000000000..a03220b835
Binary files /dev/null and b/html/images/pd_connect_button.png differ
diff --git a/html/includes/functions.inc.php b/html/includes/functions.inc.php
index 68324611cf..d7fe5b3232 100644
--- a/html/includes/functions.inc.php
+++ b/html/includes/functions.inc.php
@@ -774,7 +774,65 @@ function clean_bootgrid($string) {
$output = str_replace(array("\r","\n"), "", $string);
$output = addslashes($output);
return $output;
+}
+//Insert new config items
+function add_config_item($new_conf_name,$new_conf_value,$new_conf_type,$new_conf_desc) {
+ if (dbInsert(array('config_name' => $new_conf_name, 'config_value' => $new_conf_value, 'config_default' => $new_conf_value, 'config_type' => $new_conf_type, 'config_desc' => $new_conf_desc, 'config_group' => '500_Custom Settings', 'config_sub_group' => '01_Custom settings', 'config_hidden' => '0', 'config_disabled' => '0'), 'config')) {
+ $db_inserted = 1;
+ } else {
+ $db_inserted = 0;
+ }
+ return($db_inserted);
+}
+
+function get_config_by_group($group) {
+ $group = array($group);
+ $items = array();
+ foreach (dbFetchRows("SELECT * FROM `config` WHERE `config_group` = '?'", array($group)) as $config_item) {
+ $val = $config_item['config_value'];
+ if (filter_var($val,FILTER_VALIDATE_INT)) {
+ $val = (int) $val;
+ } elseif (filter_var($val,FILTER_VALIDATE_FLOAT)) {
+ $val = (float) $val;
+ } elseif (filter_var($val,FILTER_VALIDATE_BOOLEAN)) {
+ $val =(boolean) $val;
+ }
+ if ($val === TRUE) {
+ $config_item += array('config_checked'=>'checked');
+ }
+ $items[$config_item['config_name']] = $config_item;
+ }
+ return $items;
+}
+
+function get_config_like_name($name) {
+ $name = array($name);
+ $items = array();
+ foreach (dbFetchRows("SELECT * FROM `config` WHERE `config_name` LIKE '%?%'", array($name)) as $config_item) {
+ $items[$config_item['config_name']] = $config_item;
+ }
+ return $items;
+}
+
+function get_config_by_name($name) {
+ $config_item = dbFetchRow("SELECT * FROM `config` WHERE `config_name` = ?", array($name));
+ return $config_item;
+}
+
+function set_config_name($name,$config_value) {
+ return dbUpdate(array('config_value' => $config_value), 'config', '`config_name`=?', array($name));
+}
+
+function get_url() {
+ // http://stackoverflow.com/questions/2820723/how-to-get-base-url-with-php
+ // http://stackoverflow.com/users/184600/ma%C4%8Dek
+ return sprintf(
+ "%s://%s%s",
+ isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
+ $_SERVER['SERVER_NAME'],
+ $_SERVER['REQUEST_URI']
+ );
}
function alert_details($details) {
diff --git a/html/pages/device/health/mempool.inc.php b/html/pages/device/health/mempool.inc.php
index 2b4e5fcc82..6630c31476 100644
--- a/html/pages/device/health/mempool.inc.php
+++ b/html/pages/device/health/mempool.inc.php
@@ -13,7 +13,7 @@ foreach (dbFetchRows("SELECT * FROM `mempools` WHERE device_id = ?", array($devi
{
if (!is_integer($i/2)) { $row_colour = $list_colour_a; } else { $row_colour = $list_colour_b; }
- if ($config['memcached']['enable'])
+ if ($config['memcached']['enable'] === TRUE)
{
$state = $memcache->get('mempool-'.$mempool['mempool_id'].'-state');
if($debug) { print_r($state); }
diff --git a/html/pages/device/overview/generic/sensor.inc.php b/html/pages/device/overview/generic/sensor.inc.php
index bda3d04bd1..6194c37c00 100644
--- a/html/pages/device/overview/generic/sensor.inc.php
+++ b/html/pages/device/overview/generic/sensor.inc.php
@@ -14,7 +14,7 @@ if (count($sensors))
"); + print_r($config); + echo(""); + } + } else { + include("includes/error-no-perm.inc.php"); + } +} ?> diff --git a/html/pages/settings/alerting.inc.php b/html/pages/settings/alerting.inc.php new file mode 100644 index 0000000000..ca2473635b --- /dev/null +++ b/html/pages/settings/alerting.inc.php @@ -0,0 +1,894 @@ + + * + * 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. Please see LICENSE.txt at the top level of + * the source code distribution for details. + */ + +$no_refresh = TRUE; + +?> + + + + + + + + + + + + + + + + +'; + +?> + + diff --git a/includes/defaults.inc.php b/includes/defaults.inc.php index 83b9073d14..9a8105e090 100644 --- a/includes/defaults.inc.php +++ b/includes/defaults.inc.php @@ -191,65 +191,6 @@ $config['autodiscovery']['nets-exclude'][] = "169.254.0.0/16"; $config['autodiscovery']['nets-exclude'][] = "224.0.0.0/4"; $config['autodiscovery']['nets-exclude'][] = "240.0.0.0/4"; -// Mailer backend Settings - -$config['email_backend'] = 'mail'; // Mail backend. Allowed: "mail" (PHP's built-in), "sendmail", "smtp". -$config['email_from'] = NULL; // Mail from. Default: "ProjectName"