'sanitize_search_string'));
get_filter_request_var('filter', FILTER_CALLBACK, array('options' => 'sanitize_search_string'));
global $disable_log_rotation, $local_db_cnn_id;
switch (get_request_var('action')) {
case 'save':
save_settings();
break;
case 'search':
settings_search();
break;
case 'send_test':
email_test();
break;
default:
display_settings();
break;
}
function display_settings() {
global $config, $settings, $tabs;
top_header();
html_start_box(__('Cacti Settings'), '100%', '', '3', 'left', '');
validate_settings_filter();
print '
| ';
print '';
print ' |
';
html_end_box();
/* set the default settings category */
if (!isset_request_var('tab')) {
/* there is no selected tab; select the first one */
if (isset($_SESSION['sess_settings_tab'])) {
$current_tab = $_SESSION['sess_settings_tab'];
} else {
$current_tab = array_keys($tabs);
$current_tab = $current_tab[0];
}
} else {
$current_tab = get_request_var('tab');
}
// If the tab no longer exists, use the first
if (!isset($tabs[$current_tab])) {
$current_tab = array_keys($tabs);
$current_tab = $current_tab[0];
}
$_SESSION['sess_settings_tab'] = $current_tab;
set_request_var('tab', $current_tab);
$data_collectors = db_fetch_cell('SELECT COUNT(*) FROM poller WHERE disabled=""');
if ($data_collectors > 1) {
set_config_option('boost_rrd_update_enable', 'on');
set_config_option('boost_redirect', 'on');
}
$system_tabs = array(
'general',
'path',
'snmp',
'poller',
'data',
'visual',
'authentication',
'boost',
'spikes',
'mail'
);
/* draw the categories tabs on the top of the page */
print "";
print "";
form_start('settings.php', 'form_settings');
if ($config['poller_id'] > 1 && $current_tab == 'path') {
$suffix = ' [' . __('NOTE: Path Settings on this Tab are only saved locally!') . ']';
} else {
$suffix = '';
}
html_start_box(__('Cacti Settings (%s)%s', $tabs[$current_tab], $suffix), '100%', true, '3', 'center', '');
$form_array = array();
// Remove log rotation is disabled by package maintainer
if (isset($disable_log_rotation) && $disable_log_rotation == true) {
unset($settings['path']['logrotate_enabled']);
unset($settings['path']['logrotate_frequency']);
unset($settings['path']['logrotate_retain']);
}
// RRDtool is not required for remote data collectors
if ($config['poller_id'] > 1) {
$settings['path']['path_rrdtool']['method'] = 'other';
}
if (isset($settings[$current_tab])) {
foreach ($settings[$current_tab] as $field_name => $field_array) {
$form_array += array($field_name => $field_array);
if ((isset($field_array['items'])) && (is_array($field_array['items']))) {
foreach ($field_array['items'] as $sub_field_name => $sub_field_array) {
if (config_value_exists($sub_field_name)) {
$form_array[$field_name]['items'][$sub_field_name]['form_id'] = 1;
}
if ($current_tab == 'path' && is_remote_path_setting($field_name)) {
$form_array[$field_name]['items'][$sub_field_name]['value'] = db_fetch_cell_prepared('SELECT value
FROM settings
WHERE name = ?',
array($sub_field_name), '', true, $local_db_cnn_id);
} else {
$form_array[$field_name]['items'][$sub_field_name]['value'] = db_fetch_cell_prepared('SELECT value
FROM settings
WHERE name = ?',
array($sub_field_name));
}
}
} else {
if (config_value_exists($field_name)) {
$form_array[$field_name]['form_id'] = 1;
}
if ($current_tab == 'path' && is_remote_path_setting($field_name)) {
$form_array[$field_name]['value'] = db_fetch_cell_prepared('SELECT value
FROM settings
WHERE name = ?',
array($field_name), '', true, $local_db_cnn_id);
} else {
$form_array[$field_name]['value'] = db_fetch_cell_prepared('SELECT value
FROM settings
WHERE name = ?',
array($field_name));
}
}
}
}
// Cache this setting as on large systems
// this query runs long
if ($current_tab == 'spikes') {
if (!isset($_SESSION['sk_templates'])) {
$spikekill_templates = array_rekey(
db_fetch_assoc('SELECT DISTINCT gt.id, gt.name
FROM graph_templates AS gt
INNER JOIN graph_templates_item AS gti
ON gt.id=gti.graph_template_id
INNER JOIN data_template_rrd AS dtr
ON gti.task_item_id=dtr.id
WHERE gti.local_graph_id=0 AND data_source_type_id IN (3,2)
ORDER BY name'),
'id', 'name'
);
$_SESSION['sk_templates'] = $spikekill_templates;
} else {
$spikekill_templates = $_SESSION['sk_templates'];
}
$form_array['spikekill_templates']['array'] = $spikekill_templates;
}
draw_edit_form(
array(
'config' => array('no_form_tag' => true),
'fields' => $form_array
)
);
html_end_box(true, true);
form_hidden_box('tab', $current_tab, '');
form_save_button('', 'save');
print '
';
?>
array(
'filter' => FILTER_DEFAULT,
'pageset' => true,
'default' => ''
)
);
validate_store_request_vars($filters, 'sess_settings');
/* ================= input validation ================= */
}
function settings_search() {
global $settings;
validate_settings_filter();
$filter = get_request_var('filter');
$response = array(
'tabs' => array(),
'rows' => array(),
'spacers' => array()
);
$last_spacer = '';
$tabs = array();
$spacers = array();
foreach($settings as $tab => $page) {
foreach($page as $field_name => $field_array) {
if ($field_array['method'] == 'spacer') {
$last_spacer = $field_name;
} elseif ($field_array['method'] != 'hidden') {
$friendly_key = false;
$description_key = false;
if (isset($field_array['friendly_name'])) {
if (stristr($field_array['friendly_name'], $filter) !== false) {
$friendly_key = true;
} else {
$friendly_key = false;
}
} else {
$friendly_key = false;
}
if (isset($field_array['description'])) {
if (stristr($field_array['description'], $filter) !== false) {
$description_key = true;
} else {
$description_key = false;
}
} else {
$description_key = false;
}
if ($friendly_key !== false || $description_key !== false) {
$tabs[] = $tab;
$response['rows'][] = $field_name;
if ($last_spacer != '') {
$spacers[] = $last_spacer;
}
}
}
}
}
if (cacti_sizeof($tabs)) {
$response['tabs'] = array_values(array_unique($tabs, SORT_STRING));
}
if (cacti_sizeof($spacers)) {
$response['spacers'] = array_values(array_unique($spacers, SORT_STRING));
}
print json_encode($response);
}
function save_settings() {
global $config, $settings;
$errors = array();
$inserts = array();
foreach ($settings[get_request_var('tab')] as $field_name => $field_array) {
if (($field_array['method'] == 'header') || ($field_array['method'] == 'spacer' )){
/* do nothing */
} elseif ($field_array['method'] == 'checkbox') {
if (isset_request_var($field_name)) {
$inserts[] = '(' . db_qstr($field_name) . ', "on")';
db_execute_prepared("REPLACE INTO settings
(name, value)
VALUES (?, 'on')",
array($field_name));
} else {
$inserts[] = '(' . db_qstr($field_name) . ', "")';
db_execute_prepared("REPLACE INTO settings
(name, value)
VALUES (?, '')",
array($field_name));
}
} elseif ($field_array['method'] == 'checkbox_group') {
foreach ($field_array['items'] as $sub_field_name => $sub_field_array) {
if (isset_request_var($sub_field_name)) {
$inserts[] = '(' . db_qstr($field_name) . ', "on")';
db_execute_prepared("REPLACE INTO settings
(name, value)
VALUES (?, 'on')",
array($sub_field_name));
} else {
$inserts[] = '(' . db_qstr($field_name) . ', "on")';
db_execute_prepared("REPLACE INTO settings
(name, value)
VALUES (?, '')",
array($sub_field_name));
}
}
} elseif ($field_array['method'] == 'dirpath') {
if (get_nfilter_request_var($field_name) != '' && !is_dir(get_nfilter_request_var($field_name))) {
$_SESSION['sess_error_fields'][$field_name] = $field_name;
$_SESSION['sess_field_values'][$field_name] = get_nfilter_request_var($field_name);
$errors[8] = 8;
} else {
if (get_request_var('tab') == 'path' && is_remote_path_setting($field_name)) {
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, get_nfilter_request_var($field_name)), true, $local_db_cnn_id);
} else {
$inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(get_nfilter_request_var($field_name)) . ')';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, get_nfilter_request_var($field_name)));
}
}
} elseif ($field_array['method'] == 'filepath') {
if (isset($field_array['file_type']) &&
$field_array['file_type'] == 'binary' &&
get_nfilter_request_var($field_name) != '' &&
file_exists(get_nfilter_request_var($field_name)) === false) {
$_SESSION['sess_error_fields'][$field_name] = $field_name;
$_SESSION['sess_field_values'][$field_name] = get_nfilter_request_var($field_name);
$errors[36] = 36;
} else {
$continue = true;
if ($field_name == 'path_cactilog') {
$extension = pathinfo(get_nfilter_request_var($field_name), PATHINFO_EXTENSION);
if ($extension != 'log') {
$_SESSION['sess_error_fields'][$field_name] = $field_name;
$_SESSION['sess_field_values'][$field_name] = get_nfilter_request_var($field_name);
$errors[9] = 9;
$continue = false;
}
} elseif (get_nfilter_request_var($field_name) != '' && !is_valid_pathname(get_nfilter_request_var($field_name))) {
$_SESSION['sess_error_fields'][$field_name] = $field_name;
$_SESSION['sess_field_values'][$field_name] = get_nfilter_request_var($field_name);
$errors[36] = 36;
}
if ($continue) {
if (get_request_var('tab') == 'path' && is_remote_path_setting($field_name)) {
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, get_nfilter_request_var($field_name)), true, $local_db_cnn_id);
} else {
$inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(get_nfilter_request_var($field_name)) . ')';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, get_nfilter_request_var($field_name)));
}
}
}
} elseif ($field_array['method'] == 'textbox_password') {
if (get_nfilter_request_var($field_name) != get_nfilter_request_var($field_name . '_confirm')) {
$_SESSION['sess_error_fields'][$field_name] = $field_name;
$_SESSION['sess_field_values'][$field_name] = get_nfilter_request_var($field_name);
$errors[4] = 4;
break;
} elseif (!isempty_request_var($field_name)) {
$inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(get_nfilter_request_var($field_name)) . ')';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, get_nfilter_request_var($field_name)));
}
} elseif ((isset($field_array['items'])) && (is_array($field_array['items']))) {
foreach ($field_array['items'] as $sub_field_name => $sub_field_array) {
if (isset_request_var($sub_field_name)) {
$inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(get_nfilter_request_var($sub_field_name)) . ')';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($sub_field_name, get_nfilter_request_var($sub_field_name)));
}
}
} elseif ($field_array['method'] == 'drop_multi') {
if (isset_request_var($field_name)) {
if (is_array(get_nfilter_request_var($field_name))) {
$inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(implode(',', get_nfilter_request_var($field_name))) . ')';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, implode(',', get_nfilter_request_var($field_name))));
} else {
$inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(get_nfilter_request_var($field_name)) . ')';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, get_nfilter_request_var($field_name)));
}
} else {
$inserts[] = '(' . db_qstr($field_name) . ', "")';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, "")',
array($field_name));
}
} elseif (isset_request_var($field_name)) {
if ($field_array['method'] == 'textbox' && isset($field_array['filter'])) {
if (isset($field_array['options'])) {
$value = filter_var(get_nfilter_request_var($field_name), $field_array['filter'], $field_array['options']);
} else {
$value = filter_var(get_nfilter_request_var($field_name), $field_array['filter']);
}
if ($value === false) {
$_SESSION['sess_error_fields'][$field_name] = $field_name;
$_SESSION['sess_field_values'][$field_name] = get_nfilter_request_var($field_name);
$errors[3] = 3;
continue;
}
}
if (is_array(get_nfilter_request_var($field_name))) {
$inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(implode(',', get_nfilter_request_var($field_name))) . ')';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, implode(',', get_nfilter_request_var($field_name))));
} else {
$inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(get_nfilter_request_var($field_name)) . ')';
db_execute_prepared('REPLACE INTO settings
(name, value)
VALUES (?, ?)',
array($field_name, get_nfilter_request_var($field_name)));
}
}
if ($field_name == 'auth_method') {
if (get_nfilter_request_var($field_name) == '2') {
db_execute('TRUNCATE TABLE user_auth_cache');
}
}
}
if (isset_request_var('log_verbosity')) {
if (!isset_request_var('selective_debug')) {
$inserts[] = '("selective_debug", "")';
db_execute('REPLACE INTO settings
(name, value)
VALUES ("selective_debug", "")');
}
if (!isset_request_var('selective_plugin_debug')) {
$inserts[] = '("selective_plugin_debug", "")';
db_execute('REPLACE INTO settings
(name, value)
VALUES ("selective_plugin_debug", "")');
}
}
// Disable template user from being able to login
if (isset_request_var('user_template')) {
db_execute_prepared('UPDATE user_auth
SET enabled=""
WHERE id = ?',
array(get_nfilter_request_var('user_template')));
}
// Update snmpcache
snmpagent_global_settings_update();
api_plugin_hook_function('global_settings_update');
$gone_time = read_config_option('poller_interval') * 2;
$pollers = array_rekey(
db_fetch_assoc('SELECT
id,
UNIX_TIMESTAMP() - UNIX_TIMESTAMP(last_status) AS last_polled
FROM poller
WHERE id > 1
AND disabled=""'),
'id', 'last_polled'
);
if (get_request_var('tab') == 'path' && $config['poller_id'] > 1) {
raise_message('poller_paths');
}
if (cacti_sizeof($errors) == 0) {
if (cacti_sizeof($pollers) && $config['poller_id'] == 1) {
$sql = 'INSERT INTO settings
(name, value)
VALUES ' . implode(', ', $inserts) . '
ON DUPLICATE KEY UPDATE value=VALUES(value)';
foreach($pollers as $p => $t) {
if ($t > $gone_time) {
raise_message('poller_' . $p, __('Settings save to Data Collector %d skipped due to heartbeat.', $p), MESSAGE_LEVEL_WARN);
} else {
$rcnn_id = poller_connect_to_remote($p);
if ($rcnn_id) {
if (db_execute($sql, false, $rcnn_id) === false) {
$rcnn_id = false;
}
}
// check if we still have rcnn_id, if it's now become false, we had a problem
if (!$rcnn_id) {
raise_message('poller_' . $p, __('Settings save to Data Collector %d Failed.', $p), MESSAGE_LEVEL_ERROR);
}
}
}
raise_message(42);
} else {
raise_message(1);
}
} else {
raise_message(35);
foreach($errors as $error) {
raise_message($error);
}
}
/* reset local settings cache so the user sees the new settings */
kill_session_var('sess_config_array');
if (isset_request_var('header') && get_nfilter_request_var('header') == 'false') {
header('Location: settings.php?header=false&tab=' . get_request_var('tab'));
} else {
header('Location: settings.php?tab=' . get_request_var('tab'));
}
}