$value) {
$contact['endpoint_parameters'][$field] = $value;
}
$transport = $contact['contact_method'];
if ($transport === 'syscontact') {
//$readonly = TRUE;
$data = [
'name' => 'sysContact',
'docs' => $transport
];
} elseif (isset($config['transports'][$transport])) {
$data = $config['transports'][$transport];
} else {
$data = [
'name' => nicecase($transport) . ' (Missing)',
'docs' => $transport
];
}
if (isset($data['docs'])) {
// Known key in docs page (use if transport name is different with docs page)
$docs_link = OBSERVIUM_DOCS_URL . '/alerting_transports/#' . $data['docs'];
} else {
$docs_link = OBSERVIUM_DOCS_URL . '/alerting_transports/#' . str_replace(' ', '-', strtolower($data['name']));
}
if (!safe_count($data['parameters']['global'])) {
$data['parameters']['global'] = [];
} // Temporary until we separate "global" out.
// Plan: add defaults for transport types to global settings, which we use by default, then be able to override the settings via this GUI
// This needs supporting code in the transport to check for set variable and if not, use the global default
$form = [
'type' => 'horizontal',
'id' => 'update_contact_status',
'title' => 'Contact Information',
'space' => '5px',
//'fieldset' => array('edit' => ''),
];
$row = 0;
$form['row'][++$row]['contact_method'] = [
'type' => 'html',
//'fieldset' => 'edit',
'name' => 'Transport Method',
'class' => 'label',
'div_style' => 'padding-top: 5px;',
'readonly' => $readonly,
'value' => $data['name']];
$form['row'][++$row]['contact_doc'] = [
'type' => 'html',
'fieldset' => 'body',
'offset' => TRUE,
'html' => '
See documentation for this Transport (new page)'];
$form['row'][++$row]['contact_enabled'] = [
'type' => 'switch-ng',
//'fieldset' => 'edit',
'name' => 'Contact Status',
'size' => 'small',
'on-color' => 'success',
'off-color' => 'danger',
'on-text' => 'Enabled',
'off-text' => 'Disabled',
'readonly' => $readonly,
'value' => !$contact['contact_disabled']
];
$form['row'][++$row]['contact_descr'] = [
'type' => 'text',
//'fieldset' => 'edit',
'name' => 'Description',
'width' => '80%',
'readonly' => $readonly || $transport === 'syscontact',
'value' => $contact['contact_descr']
];
if (safe_count($data['parameters']['required']) || safe_count($data['parameters']['global'])) {
// Pseudo item, just for additional title
$form['row'][++$row]['contact_required'] = [
'type' => 'html',
//'fieldset' => 'edit',
'html' => '
'
];
// Temporary merge req & global
foreach (array_merge((array)$data['parameters']['required'], (array)$data['parameters']['global']) as $parameter => $param_data) {
switch ($param_data['type']) {
case 'enum-freeinput':
$form_param = [
'type' => 'tags',
//'fieldset' => 'edit',
'name' => $param_data['description'],
'width' => '100%',
'readonly' => $readonly,
'value' => $contact['endpoint_parameters'][$parameter],
'values' => $param_data['params']
];
break;
case 'bool':
case 'boolean':
// Boolean type is just select with true/false string
if (!isset($param_data['params'])) {
$param_data['params'] = ['' => 'Unset', 'true' => 'True', 'false' => 'False'];
}
// do not break here
case 'enum':
if (isset($contact['endpoint_parameters'][$parameter])) {
$value = $contact['endpoint_parameters'][$parameter];
if (isset($param_data['default']) &&
!(isset($param_data['params'][$value]) || in_array($value, (array)$param_data['params']))) {
$value = $param_data['default'];
}
} else {
$value = $param_data['default'];
}
$form_param = [
'type' => 'select',
//'fieldset' => 'edit',
'name' => $param_data['description'],
'width' => '80%',
'readonly' => $readonly,
'value' => $value,
'values' => $param_data['params']
];
break;
case 'textarea':
$form_param = [
'type' => 'textarea',
//'fieldset' => 'edit',
'name' => $param_data['description'],
'width' => '80%',
'rows' => 5,
'readonly' => $readonly,
'value' => $contact['endpoint_parameters'][$parameter]
];
// Prettify JSON
if (isset($param_data['format']) && $param_data['format'] === 'json' &&
$json = safe_json_decode($form_param['value'])) {
$form_param['value'] = safe_json_encode($json, JSON_PRETTY_PRINT);
}
break;
default:
$form_param = [
'type' => 'text',
//'fieldset' => 'edit',
'name' => $param_data['description'],
'width' => '80%',
'readonly' => $readonly,
'value' => $contact['endpoint_parameters'][$parameter]
];
}
$form['row'][++$row]['contact_endpoint_' . $parameter] = $form_param;
if (isset($param_data['tooltip'])) {
if (isset($param_data['tooltip_url'])) {
$tooltip_url = $param_data['tooltip_url'];
$tooltip_icon = 'info';
} else {
$tooltip_url = NULL;
$tooltip_icon = 'question';
}
$form['row'][$row]['tooltip_' . $parameter] = [
'type' => 'raw',
//'fieldset' => 'edit',
'readonly' => $readonly,
'html' => generate_tooltip_link($tooltip_url, get_icon($tooltip_icon), escape_html($param_data['tooltip']), NULL, ['target' => '_blank'])
];
}
}
}
if (safe_count($data['parameters']['optional'])) {
// Pseudo item, just for additional title
$form['row'][++$row]['contact_optional'] = [
'type' => 'html',
//'fieldset' => 'edit',
'html' => '
'
];
foreach ($data['parameters']['optional'] as $parameter => $param_data) {
switch ($param_data['type']) {
case 'enum-freeinput':
$form_param = [
'type' => 'tags',
//'fieldset' => 'edit',
'name' => $param_data['description'],
'width' => '100%',
'readonly' => $readonly,
'value' => $contact['endpoint_parameters'][$parameter],
'values' => $param_data['params']
];
break;
case 'bool':
case 'boolean':
// Boolean type is just select with true/false string
if (!isset($param_data['params'])) {
$param_data['params'] = ['' => 'Unset', 'true' => 'True', 'false' => 'False'];
}
// do not break here
case 'enum':
if (isset($contact['endpoint_parameters'][$parameter])) {
$value = $contact['endpoint_parameters'][$parameter];
if (isset($param_data['default']) &&
!(isset($param_data['params'][$value]) || in_array($value, (array)$param_data['params']))) {
$value = $param_data['default'];
}
} else {
$value = $param_data['default'];
}
$form_param = [
'type' => 'select',
//'fieldset' => 'edit',
'name' => $param_data['description'],
'width' => '80%',
'readonly' => $readonly,
'value' => $value,
'values' => $param_data['params']
];
break;
case 'textarea':
$form_param = [
'type' => 'textarea',
//'fieldset' => 'edit',
'name' => $param_data['description'],
'width' => '80%',
'rows' => 5,
'readonly' => $readonly,
'value' => $contact['endpoint_parameters'][$parameter]
];
// Prettify JSON
if (isset($param_data['format']) && $param_data['format'] === 'json' &&
$json = safe_json_decode($form_param['value'])) {
$form_param['value'] = safe_json_encode($json, JSON_PRETTY_PRINT);
}
break;
default:
$form_param = [
'type' => 'text',
//'fieldset' => 'edit',
'name' => $param_data['description'],
'width' => '80%',
'readonly' => $readonly,
'value' => $contact['endpoint_parameters'][$parameter]
];
}
$form['row'][++$row]['contact_endpoint_' . $parameter] = $form_param;
if (isset($param_data['tooltip'])) {
if (isset($param_data['tooltip_url'])) {
$tooltip_url = $param_data['tooltip_url'];
$tooltip_icon = 'info';
} else {
$tooltip_url = NULL;
$tooltip_icon = 'question';
}
$form['row'][$row]['tooltip_' . $parameter] = [
'type' => 'raw',
//'fieldset' => 'edit',
'readonly' => $readonly,
'html' => generate_tooltip_link($tooltip_url, get_icon($tooltip_icon), escape_html($param_data['tooltip']), NULL, ['target' => '_blank'])
];
}
}
}
// User defined templates
$message_template = '';
$message_custom = isset($contact['contact_message_custom']) && $contact['contact_message_custom'];
if ($message_custom) {
// user defined
$message_template = $contact['contact_message_template'];
} elseif (isset($data['notification']['message_template'])) {
// file-based template
// template can have tags (ie telegram)
if (str_contains($data['notification']['message_template'], '%')) {
//print_vars($data['notification']['message_template']);
$template = array_tag_replace(generate_transport_tags($transport, $contact['endpoint_parameters']), $data['notification']['message_template']);
$template = strtolower($template);
//print_vars($template);
} else {
$template = $data['notification']['message_template'];
}
$message_template = get_template('notification', $template);
// remove own comments
$message_template = preg_replace('!^\s*/\*[\*\s]+Observium\s.*?\*/(\s*\n)?!is', '', $message_template);
} elseif (isset($data['notification']['message_text'])) {
// definition-based template
$message_template = $data['notification']['message_text'];
}
if (strlen($message_template)) {
// Pseudo item, just for additional title
$form['row'][++$row]['message_title'] = [
'type' => 'html',
//'fieldset' => 'edit',
'html' => '
Notification parameters
'
];
$form['row'][++$row]['contact_message_custom'] = [
'type' => 'toggle',
'name' => 'Custom template',
'view' => 'toggle',
'size' => 'large',
'placeholder' => 'Set custom message, using Mustache formatting.',// : [Notification templates]('.OBSERVIUM_DOCS_URL.'/xxx/){target=_blank}',
//'width' => '250px',
'readonly' => $readonly,
'onchange' => "toggleAttrib('disabled', 'contact_message_template');",
'value' => $message_custom
];
$form['row'][++$row]['contact_message_template'] = [
'type' => 'textarea',
//'fieldset' => 'edit',
'name' => 'Template',
'rows' => 6,
'class' => 'text-monospace small',
//'style' => 'font-size: 12px;',
'width' => '500px',
//'placeholder' => '1-30. Default 10.',
'readonly' => $readonly,
'disabled' => !$message_custom,
'value' => $message_template
];
}
$form['row'][++$row]['action'] = [
'type' => 'submit',
'name' => 'Save Changes',
'icon' => 'icon-ok icon-white',
'right' => TRUE,
'class' => 'btn-primary',
'readonly' => $readonly,
'value' => 'contact_edit'
];
//print_vars($form);
print_form($form);
unset($form, $row);
?>
'Associated Alert Checkers', 'header-border' => TRUE]);
if (safe_count($assocs)) {
echo('
');
foreach ($assocs as $assoc) {
$alert_test = get_alert_test_by_id($assoc['alert_test_id']);
$assoc_exists[$assoc['alert_test_id']] = TRUE;
echo('
' . nicecase($alert_test['entity_type']) . ' |
' . escape_html($alert_test['alert_name']) . ' |
');
$form = [
'type' => 'simple',
//'userlevel' => 10, // Minimum user level for display form
'id' => 'delete_alert_checker_' . $assoc['alert_test_id'],
'style' => 'display:inline;',
];
$form['row'][0]['alert_test_id'] = [
'type' => 'hidden',
'value' => $assoc['alert_test_id']
];
$form['row'][0]['contact_id'] = [
'type' => 'hidden',
'value' => $contact['contact_id']
];
$form['row'][99]['action'] = [
'type' => 'submit',
//'icon_only' => TRUE, // hide button styles
'name' => '',
'icon' => 'icon-trash',
'readonly' => $transport === 'syscontact',
'class' => 'btn-xs btn-danger',
// confirmation dialog
'attribs' => ['data-toggle' => 'confirm', // Enable confirmation dialog
'data-confirm-placement' => 'left',
'data-confirm-content' => 'Delete associated checker "' . escape_html($alert_test['alert_name']) . '"?',
//'data-confirm-content' => ' Warning!
// This association will be deleted!'),
],
'value' => 'contact_alert_checker_delete'
];
print_form($form);
unset($form);
echo(' |
');
}
echo('
');
} else {
echo('
This contact is not currently associated with any Alert Checkers
');
}
// FIXME -- use NOT IN to mask already associated things.
$alert_tests = dbFetchRows('SELECT * FROM `alert_tests` ORDER BY `entity_type`, `alert_name`');
if (safe_count($alert_tests)) {
foreach ($alert_tests as $alert_test) {
if (!isset($assoc_exists[$alert_test['alert_test_id']])) {
$form_items['alert_checker_id'][$alert_test['alert_test_id']] = [
'name' => $alert_test['alert_name'],
'icon' => $config['entities'][$alert_test['entity_type']]['icon']
];
}
}
$form = [
'type' => 'simple',
//'userlevel' => 10, // Minimum user level for display form
'id' => 'associate_alert_check',
'style' => 'padding: 7px; margin: 0px;',
'right' => TRUE,
];
$form['row'][0]['type'] = [
'type' => 'hidden',
'value' => 'alert'
];
$form['row'][0]['alert_checker_id'] = [
'type' => 'select',
'name' => 'Associate Alert Checker',
'live-search' => FALSE,
'width' => '250px',
//'right' => TRUE,
'readonly' => $readonly,
'values' => $form_items['alert_checker_id'],
'value' => $vars['alert_checker_id']
];
$form['row'][0]['action'] = [
'type' => 'submit',
'name' => 'Associate',
'icon' => 'icon-plus-sign',
//'right' => TRUE,
'readonly' => $readonly,
'class' => 'btn-primary',
'value' => 'contact_alert_checker_add'
];
$box_close['footer_content'] = generate_form($form);
$box_close['footer_nopadding'] = TRUE;
unset($form, $form_items);
} else {
// print_warning('No unassociated alert checkers.');
}
echo generate_box_close($box_close);
// Syslog associations
$assoc_exists = [];
if ($transport === 'syscontact' && $config['email']['default_syscontact']) {
$assocs = dbFetchRows('SELECT * FROM `syslog_rules`
ORDER BY `la_severity`, `la_name` DESC');
} else {
$assocs = dbFetchRows('SELECT * FROM `alert_contacts_assoc` AS A
LEFT JOIN `syslog_rules` AS T ON T.`la_id` = A.`alert_checker_id`
WHERE `aca_type` = ? AND `contact_id` = ?
ORDER BY `la_severity`, `la_name` DESC', [ 'syslog', $contact['contact_id'] ]);
}
//r($assocs);
echo generate_box_open(['title' => 'Associated Syslog Rules', 'header-border' => TRUE]);
if (safe_count($assocs)) {
echo('
');
foreach ($assocs as $assoc) {
//$alert_test = get_alert_test_by_id($assoc['alert_checker_id']);
$assoc_exists[$assoc['la_id']] = TRUE;
echo('
' . get_icon('syslog-alerts') . ' ' . escape_html($assoc['la_name']) . ' |
' . escape_html($assoc['la_rule']) . ' |
');
$form = [
'type' => 'simple',
//'userlevel' => 10, // Minimum user level for display form
'id' => 'delete_syslog_checker_' . $assoc['la_id'],
'style' => 'display:inline;',
];
$form['row'][0]['la_id'] = [
'type' => 'hidden',
'value' => $assoc['la_id']
];
$form['row'][0]['contact_id'] = [
'type' => 'hidden',
'value' => $contact['contact_id']
];
$form['row'][99]['action'] = [
'type' => 'submit',
//'icon_only' => TRUE, // hide button styles
'name' => '',
'icon' => 'icon-trash',
'readonly' => $transport === 'syscontact',
'class' => 'btn-xs btn-danger',
// confirmation dialog
'attribs' => ['data-toggle' => 'confirm', // Enable confirmation dialog
'data-confirm-placement' => 'left',
'data-confirm-content' => 'Delete associated rule "' . escape_html($assoc['la_name']) . '"?',
//'data-confirm-content' => ' Warning!
// This association will be deleted!'),
],
'value' => 'contact_syslog_rule_delete'
];
print_form($form);
unset($form);
echo(' |
');
}
echo('
');
} else {
echo('
This contact is not currently associated with any Syslog Rules
');
}
$alert_tests = dbFetchRows('SELECT * FROM `syslog_rules` ORDER BY `la_severity`, `la_name`');
if (safe_count($alert_tests)) {
foreach ($alert_tests as $alert_test) {
if (!isset($assoc_exists[$alert_test['la_id']])) {
$form_items['la_id'][$alert_test['la_id']] = [
'name' => $alert_test['la_name'],
'subtext' => $alert_test['la_rule'],
'icon' => $config['icon']['syslog-alerts']
];
}
}
$form = [
'type' => 'simple',
//'userlevel' => 10, // Minimum user level for display form
'id' => 'contact_syslog_rule_add',
'style' => 'padding: 7px; margin: 0px;',
'right' => TRUE,
];
$form['row'][0]['type'] = [
'type' => 'hidden',
'value' => 'syslog'
];
$form['row'][0]['la_id'] = [
'type' => 'select',
'name' => 'Associate Syslog Rule',
'live-search' => FALSE,
'width' => '250px',
//'right' => TRUE,
'readonly' => $readonly,
'values' => $form_items['la_id'],
'value' => $vars['la_id']
];
$form['row'][0]['action'] = [
'type' => 'submit',
'name' => 'Associate',
'icon' => 'icon-plus-sign',
//'right' => TRUE,
'readonly' => $readonly,
'class' => 'btn-primary',
'value' => 'contact_syslog_rule_add'
];
$box_close['footer_content'] = generate_form($form);
$box_close['footer_nopadding'] = TRUE;
unset($form, $form_items);
} //else { print_warning('No unassociated syslog rules.'); }
echo generate_box_close($box_close);
echo('
');
} else {
print_error("Contact doesn't exist.");
}
// EOF