'sanitize_search_string']); gfrv('filter', FILTER_CALLBACK, ['options' => 'sanitize_search_string']); global $disable_log_rotation, $local_db_cnn_id; switch (grv('action')) { case 'save': save_settings(); break; case 'search': settings_search(); break; case 'send_test': email_test(); break; default: display_settings(); break; } function display_settings() : void { global $settings, $tabs, $local_db_cnn_id, $disable_log_rotation; top_header(); html_start_box(__('Cacti Settings'), '100%', true, 3, 'left', ''); validate_settings_filter(); print '
'; print '
' . __('Search') . '
'; print '
'; print '
'; print '
'; html_end_box(false, true); // set the default settings category if (!isrv('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 = grv('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; srv('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 = [ 'general', 'path', 'logging', 'snmp', 'poller', 'data', 'visual', 'authentication', 'boost', 'spikes', 'mail' ]; // draw the categories tabs on the top of the page print '
'; print "
'; print '
'; print "'; ?> [ 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ] ]; validate_store_request_vars($filters, 'sess_settings'); // ================= input validation ================= } function settings_search() : void { global $settings; validate_settings_filter(); $filter = grv('filter'); $response = [ 'tabs' => [], 'rows' => [], 'spacers' => [] ]; $last_spacer = ''; $tabs = []; $spacers = []; 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() : void { global $settings, $local_db_cnn_id; $errors = []; $inserts = []; require_once(CACTI_PATH_LIBRARY . '/CactiSettings.php'); // Build a snapshot of posted values keyed by setting name using Cacti's // request-var helpers (gnrv) instead of touching $_POST directly. Only // fields declared in the active tab are forwarded; the validator already // ignores unknown keys so no behavior changes. $tab = (string) grv('tab'); $snapshot = []; if (isset($settings[$tab]) && is_array($settings[$tab])) { foreach ($settings[$tab] as $field_name => $field_array) { if (!is_string($field_name)) { continue; } $snapshot[$field_name] = gnrv($field_name); if (isset($field_array['items']) && is_array($field_array['items'])) { foreach ($field_array['items'] as $sub_name => $sub_def) { if (is_string($sub_name)) { $snapshot[$sub_name] = gnrv($sub_name); } } } } } $violations = CactiSettings::validate($snapshot, $settings); if (cacti_sizeof($violations) > 0) { foreach ($violations as $name => $message) { $_SESSION['sess_error_fields'][$name] = $name; $_SESSION['sess_field_values'][$name] = isset($snapshot[$name]) && is_scalar($snapshot[$name]) ? $snapshot[$name] : ''; raise_message( 'cacti_settings_' . $name, __esc('Setting \'%s\': %s', $name, $message), MESSAGE_LEVEL_ERROR ); } header('Location: settings.php?tab=' . urlencode($tab)); exit; } foreach ($settings[grv('tab')] as $field_name => $field_array) { if (($field_array['method'] == 'header') || ($field_array['method'] == 'spacer')) { // do nothing } elseif ($field_array['method'] == 'checkbox') { if (isrv($field_name)) { $inserts[] = '(' . db_qstr($field_name) . ', "on")'; db_execute_prepared("REPLACE INTO settings (name, value) VALUES (?, 'on')", [$field_name]); } else { $inserts[] = '(' . db_qstr($field_name) . ', "")'; db_execute_prepared("REPLACE INTO settings (name, value) VALUES (?, '')", [$field_name]); } } elseif ($field_array['method'] == 'checkbox_group') { foreach ($field_array['items'] as $sub_field_name => $sub_field_array) { if (isrv($sub_field_name)) { $inserts[] = '(' . db_qstr($field_name) . ', "on")'; db_execute_prepared("REPLACE INTO settings (name, value) VALUES (?, 'on')", [$sub_field_name]); } else { $inserts[] = '(' . db_qstr($field_name) . ', "on")'; db_execute_prepared("REPLACE INTO settings (name, value) VALUES (?, '')", [$sub_field_name]); } } } elseif ($field_array['method'] == 'dirpath') { if (gnrv($field_name) != '' && !is_dir(gnrv($field_name))) { $_SESSION['sess_error_fields'][$field_name] = $field_name; $_SESSION['sess_field_values'][$field_name] = gnrv($field_name); $errors[8] = 8; } else { if (grv('tab') == 'path' && is_remote_path_setting($field_name)) { db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, gnrv($field_name)], true, $local_db_cnn_id); } else { $inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(gnrv($field_name)) . ')'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, gnrv($field_name)]); } } } elseif ($field_array['method'] == 'filepath') { if (isset($field_array['file_type']) && $field_array['file_type'] == 'binary' && gnrv($field_name) != '' && file_exists(gnrv($field_name)) === false) { $_SESSION['sess_error_fields'][$field_name] = $field_name; $_SESSION['sess_field_values'][$field_name] = gnrv($field_name); $errors[36] = 36; } else { $continue = true; if ($field_name == 'path_cactilog' || $field_name == 'path_stderrlog' || $field_name == 'path_boost_log') { $extension = pathinfo(gnrv($field_name), PATHINFO_EXTENSION); if ($extension != 'log') { $_SESSION['sess_error_fields'][$field_name] = $field_name; $_SESSION['sess_field_values'][$field_name] = gnrv($field_name); $errors[9] = 9; $continue = false; } } elseif (gnrv($field_name) != '' && !is_valid_pathname(gnrv($field_name))) { $_SESSION['sess_error_fields'][$field_name] = $field_name; $_SESSION['sess_field_values'][$field_name] = gnrv($field_name); $errors[36] = 36; } if ($continue) { if (grv('tab') == 'path' && is_remote_path_setting($field_name)) { db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, gnrv($field_name)], true, $local_db_cnn_id); } else { $inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(gnrv($field_name)) . ')'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, gnrv($field_name)]); } } } } elseif ($field_array['method'] == 'textbox_password') { if (isrv($field_name . '_confirm') && gnrv($field_name) != gnrv($field_name . '_confirm')) { $_SESSION['sess_error_fields'][$field_name] = $field_name; $_SESSION['sess_field_values'][$field_name] = gnrv($field_name); $errors[4] = 4; break; } if (!ierv($field_name)) { $inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(gnrv($field_name)) . ')'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, gnrv($field_name)]); } } elseif ((isset($field_array['items'])) && (is_array($field_array['items']))) { foreach ($field_array['items'] as $sub_field_name => $sub_field_array) { if (isrv($sub_field_name)) { $inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(gnrv($sub_field_name)) . ')'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$sub_field_name, gnrv($sub_field_name)]); } } } elseif ($field_array['method'] == 'drop_multi') { if (isrv($field_name)) { if (is_array(gnrv($field_name))) { $inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(implode(',', gnrv($field_name))) . ')'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, implode(',', gnrv($field_name))]); } else { $inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(gnrv($field_name)) . ')'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, gnrv($field_name)]); } } else { $inserts[] = '(' . db_qstr($field_name) . ', "")'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, "")', [$field_name]); } } elseif (isrv($field_name)) { if ($field_array['method'] == 'textbox' && isset($field_array['filter'])) { if (isset($field_array['options'])) { $value = filter_var(gnrv($field_name), $field_array['filter'], $field_array['options']); } else { $value = filter_var(gnrv($field_name), $field_array['filter']); } if ($value === false) { $_SESSION['sess_error_fields'][$field_name] = $field_name; $_SESSION['sess_field_values'][$field_name] = gnrv($field_name); $errors[3] = 3; continue; } } if (is_array(gnrv($field_name))) { $inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(implode(',', gnrv($field_name))) . ')'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, implode(',', gnrv($field_name))]); } else { $inserts[] = '(' . db_qstr($field_name) . ', ' . db_qstr(gnrv($field_name)) . ')'; db_execute_prepared('REPLACE INTO settings (name, value) VALUES (?, ?)', [$field_name, gnrv($field_name)]); } } if ($field_name == 'auth_method') { if (gnrv($field_name) == '2') { db_execute('TRUNCATE TABLE user_auth_cache'); } } } if (isrv('log_verbosity')) { if (!isrv('selective_debug')) { $inserts[] = '("selective_debug", "")'; db_execute('REPLACE INTO settings (name, value) VALUES ("selective_debug", "")'); } if (!isrv('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 (isrv('user_template')) { db_execute_prepared('UPDATE user_auth SET enabled="" WHERE id = ?', [gnrv('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 (POLLER_ID > 1) { if (grv('tab') == 'path') { raise_message('poller_paths'); } } if (cacti_sizeof($errors) == 0) { if (cacti_sizeof($pollers) && 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, __esc('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, __esc('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 (isrv('header') && gnrv('header') == 'false') { header('Location: settings.php?header=false&tab=' . grv('tab')); } else { header('Location: settings.php?tab=' . grv('tab')); } }