diff --git a/configdata.c b/configdata.c index 0bf55a01..82affc49 100644 --- a/configdata.c +++ b/configdata.c @@ -23,7 +23,7 @@ /* * Parsed configuration settings are stored here */ -t_configuration_options config_file_options = T_CONFIGURATION_OPTIONS_INITIALIZER; +t_configuration_options config_file_options; /* @@ -132,7 +132,12 @@ struct ConfigFileSetting config_file_settings[] = * logging settings * ================ */ - /* log_level */ + + /* + * log_level + * NOTE: the default for "log_level" is set in log.c and does not need + * to be initialised here + */ { "log_level", CONFIG_STRING, @@ -491,7 +496,7 @@ struct ConfigFileSetting config_file_settings[] = CONFIG_INT, { .intptr = &config_file_options.reconnect_attempts }, { .intdefault = DEFAULT_RECONNECTION_ATTEMPTS }, - { .intminval = 1 }, + { .intminval = 0 }, {}, {} }, @@ -501,7 +506,7 @@ struct ConfigFileSetting config_file_settings[] = CONFIG_INT, { .intptr = &config_file_options.reconnect_interval }, { .intdefault = DEFAULT_RECONNECTION_INTERVAL }, - { .intminval = 1 }, + { .intminval = 0 }, {}, {} }, @@ -522,7 +527,7 @@ struct ConfigFileSetting config_file_settings[] = CONFIG_INT, { .intptr = &config_file_options.degraded_monitoring_timeout }, { .intdefault = DEFAULT_DEGRADED_MONITORING_TIMEOUT }, - { .intminval = 1 }, + { .intminval = -1 }, {}, {} }, diff --git a/configfile-scan.l b/configfile-scan.l index 3e8012ce..b33716ef 100644 --- a/configfile-scan.l +++ b/configfile-scan.l @@ -40,11 +40,11 @@ static sigjmp_buf *CONF_flex_fatal_jmp; static char *CONF_scanstr(const char *s); static int CONF_flex_fatal(const char *msg); -static bool ProcessConfigFile(const char *base_dir, const char *config_file, const char *calling_file, bool strict, KeyValueList *contents, t_configuration_options *options, ConfigFileSetting *settings, ItemList *error_list, ItemList *warning_list); +static bool ProcessConfigFile(const char *base_dir, const char *config_file, const char *calling_file, bool strict, KeyValueList *contents, ItemList *error_list, ItemList *warning_list); -static bool ProcessConfigFp(FILE *fp, const char *config_file, const char *calling_file, const char *base_dir, KeyValueList *contents, t_configuration_options *options, ConfigFileSetting *settings, ItemList *error_list, ItemList *warning_list); +static bool ProcessConfigFp(FILE *fp, const char *config_file, const char *calling_file, const char *base_dir, KeyValueList *contents, ItemList *error_list, ItemList *warning_list); -static bool ProcessConfigDirectory(const char *base_dir, const char *includedir, const char *calling_file, KeyValueList *contents, t_configuration_options *options, ConfigFileSetting *settings, ItemList *error_list, ItemList *warning_list); +static bool ProcessConfigDirectory(const char *base_dir, const char *includedir, const char *calling_file, KeyValueList *contents, ItemList *error_list, ItemList *warning_list); static char *AbsoluteConfigLocation(const char *base_dir, const char *location, const char *calling_file); @@ -98,16 +98,11 @@ STRING \'([^'\\\n]|\\.|\'\')*\' %% -extern bool -ProcessRepmgrConfigFileOld(const char *config_file, const char *base_dir, t_configuration_options *options, ItemList *error_list, ItemList *warning_list) -{ - return ProcessConfigFile(base_dir, config_file, NULL, true, NULL, options, NULL, error_list, warning_list); -} extern bool ProcessRepmgrConfigFile(const char *config_file, const char *base_dir, ItemList *error_list, ItemList *warning_list) { - return ProcessConfigFile(base_dir, config_file, NULL, true, NULL, NULL, NULL, error_list, warning_list); + return ProcessConfigFile(base_dir, config_file, NULL, true, NULL, error_list, warning_list); } @@ -116,11 +111,11 @@ ProcessPostgresConfigFile(const char *config_file, const char *base_dir, KeyValu { printf("ProcessPostgresConfigFile(): base: %s file: %s\n", base_dir, config_file); - return ProcessConfigFile(base_dir, config_file, NULL, true, contents, NULL, NULL, error_list, warning_list); + return ProcessConfigFile(base_dir, config_file, NULL, true, contents, error_list, warning_list); } static bool -ProcessConfigFile(const char *base_dir, const char *config_file, const char *calling_file, bool strict, KeyValueList *contents, t_configuration_options *options, ConfigFileSetting *settings, ItemList *error_list, ItemList *warning_list) +ProcessConfigFile(const char *base_dir, const char *config_file, const char *calling_file, bool strict, KeyValueList *contents, ItemList *error_list, ItemList *warning_list) { char *abs_path; bool success = true; @@ -159,7 +154,7 @@ ProcessConfigFile(const char *base_dir, const char *config_file, const char *cal } else { - success = ProcessConfigFp(fp, abs_path, calling_file, base_dir, contents, options, settings, error_list, warning_list); + success = ProcessConfigFp(fp, abs_path, calling_file, base_dir, contents, error_list, warning_list); } free(abs_path); @@ -168,7 +163,7 @@ ProcessConfigFile(const char *base_dir, const char *config_file, const char *cal } static bool -ProcessConfigFp(FILE *fp, const char *config_file, const char *calling_file, const char *base_dir, KeyValueList *contents, t_configuration_options *options, ConfigFileSetting *settings, ItemList *error_list, ItemList *warning_list) +ProcessConfigFp(FILE *fp, const char *config_file, const char *calling_file, const char *base_dir, KeyValueList *contents, ItemList *error_list, ItemList *warning_list) { volatile bool OK = true; volatile YY_BUFFER_STATE lex_buffer = NULL; @@ -252,7 +247,7 @@ ProcessConfigFp(FILE *fp, const char *config_file, const char *calling_file, con * processed immediately. */ if (!ProcessConfigDirectory(base_dir, opt_value, config_file, - contents, options, settings, + contents, error_list, warning_list)) OK = false; yy_switch_to_buffer(lex_buffer); @@ -262,7 +257,7 @@ ProcessConfigFp(FILE *fp, const char *config_file, const char *calling_file, con else if (base_dir != NULL && strcasecmp(opt_name, "include_if_exists") == 0) { if (!ProcessConfigFile(base_dir, opt_value, config_file, - false, contents, options, settings, + false, contents, error_list, warning_list)) OK = false; @@ -273,7 +268,7 @@ ProcessConfigFp(FILE *fp, const char *config_file, const char *calling_file, con else if (base_dir != NULL && strcasecmp(opt_name, "include") == 0) { if (!ProcessConfigFile(base_dir, opt_value, config_file, - true, contents, options, settings, + true, contents, error_list, warning_list)) OK = false; @@ -290,17 +285,7 @@ ProcessConfigFp(FILE *fp, const char *config_file, const char *calling_file, con opt_name, opt_value); } - - if (options != NULL) - { - parse_configuration_item_old(options, - error_list, - warning_list, - opt_name, - opt_value); - } - - if (1) //options == NULL && contents == NULL) + else { parse_configuration_item(error_list, warning_list, @@ -376,7 +361,7 @@ cleanup: * See ProcessConfigFp for further details. */ static bool -ProcessConfigDirectory(const char *base_dir, const char *includedir, const char *calling_file, KeyValueList *contents, t_configuration_options *options, ConfigFileSetting *settings, ItemList *error_list, ItemList *warning_list) +ProcessConfigDirectory(const char *base_dir, const char *includedir, const char *calling_file, KeyValueList *contents, ItemList *error_list, ItemList *warning_list) { char *directory; DIR *d; @@ -477,7 +462,7 @@ ProcessConfigDirectory(const char *base_dir, const char *includedir, const char for (i = 0; i < num_filenames; i++) { if (!ProcessConfigFile(base_dir, filenames[i], calling_file, - true, contents, options, settings, + true, contents, error_list, warning_list)) { status = false; diff --git a/configfile.c b/configfile.c index 726ee07f..9a2cc89e 100644 --- a/configfile.c +++ b/configfile.c @@ -35,10 +35,7 @@ static bool config_file_provided = false; bool config_file_found = false; -static void parse_config_old(bool terse); static void parse_config(bool terse); - -static void _parse_config_old(t_configuration_options *options, ItemList *error_list, ItemList *warning_list); static void _parse_config(ItemList *error_list, ItemList *warning_list); static void _parse_line(char *buf, char *name, char *value); @@ -66,186 +63,6 @@ progname(void) return _progname; } -void -load_config_old(const char *config_file, bool verbose, bool terse, t_configuration_options *options, char *argv0) -{ - struct stat stat_config; - - /* - * If a configuration file was provided, check it exists, otherwise emit - * an error and terminate. We assume that if a user explicitly provides a - * configuration file, they'll want to make sure it's used and not fall - * back to any of the defaults. - */ - if (config_file != NULL && config_file[0] != '\0') - { - strncpy(config_file_path, config_file, MAXPGPATH); - canonicalize_path(config_file_path); - - /* relative path supplied - convert to absolute path */ - if (config_file_path[0] != '/') - { - PQExpBufferData fullpath; - char *pwd = NULL; - - initPQExpBuffer(&fullpath); - - /* - * we'll attempt to use $PWD to derive the effective path; getcwd() - * will likely resolve symlinks, which may result in a path which - * isn't permanent (e.g. if filesystem mountpoints change). - */ - pwd = getenv("PWD"); - - if (pwd != NULL) - { - appendPQExpBufferStr(&fullpath, pwd); - } - else - { - /* $PWD not available - fall back to getcwd() */ - char cwd[MAXPGPATH] = ""; - - if (getcwd(cwd, MAXPGPATH) == NULL) - { - log_error(_("unable to execute getcwd()")); - log_detail("%s", strerror(errno)); - - termPQExpBuffer(&fullpath); - exit(ERR_BAD_CONFIG); - } - - appendPQExpBufferStr(&fullpath, cwd); - } - - appendPQExpBuffer(&fullpath, - "/%s", config_file_path); - - log_debug("relative configuration file converted to:\n \"%s\"", - fullpath.data); - - strncpy(config_file_path, fullpath.data, MAXPGPATH); - - termPQExpBuffer(&fullpath); - - canonicalize_path(config_file_path); - } - - - if (stat(config_file_path, &stat_config) != 0) - { - log_error(_("provided configuration file \"%s\" not found"), - config_file); - log_detail("%s", strerror(errno)); - exit(ERR_BAD_CONFIG); - } - - - if (verbose == true) - { - log_notice(_("using provided configuration file \"%s\""), config_file); - } - - config_file_provided = true; - config_file_found = true; - } - - - /*----------- - * If no configuration file was provided, attempt to find a default file - * in this order: - * - location provided by packager - * - current directory - * - /etc/repmgr.conf - * - default sysconfdir - * - * here we just check for the existence of the file; parse_config() will - * handle read errors etc. - * - *----------- - */ - if (config_file_provided == false) - { - /* packagers: if feasible, patch configuration file path into "package_conf_file" */ - char package_conf_file[MAXPGPATH] = ""; - char my_exec_path[MAXPGPATH] = ""; - char sysconf_etc_path[MAXPGPATH] = ""; - - /* 1. location provided by packager */ - if (package_conf_file[0] != '\0') - { - if (verbose == true) - fprintf(stdout, _("INFO: checking for package configuration file \"%s\"\n"), package_conf_file); - - if (stat(package_conf_file, &stat_config) == 0) - { - strncpy(config_file_path, package_conf_file, MAXPGPATH); - config_file_found = true; - goto end_search; - } - } - - /* 2 "./repmgr.conf" */ - log_verbose(LOG_INFO, _("looking for configuration file in current directory\n")); - - maxpath_snprintf(config_file_path, "./%s", CONFIG_FILE_NAME); - canonicalize_path(config_file_path); - - if (stat(config_file_path, &stat_config) == 0) - { - config_file_found = true; - goto end_search; - } - - /* 3. "/etc/repmgr.conf" */ - if (verbose == true) - fprintf(stdout, _("INFO: looking for configuration file in /etc\n")); - - maxpath_snprintf(config_file_path, "/etc/%s", CONFIG_FILE_NAME); - if (stat(config_file_path, &stat_config) == 0) - { - config_file_found = true; - goto end_search; - } - - /* 4. default sysconfdir */ - if (find_my_exec(argv0, my_exec_path) < 0) - { - fprintf(stderr, _("ERROR: %s: could not find own program executable\n"), argv0); - exit(EXIT_FAILURE); - } - - get_etc_path(my_exec_path, sysconf_etc_path); - - if (verbose == true) - fprintf(stdout, _("INFO: looking for configuration file in \"%s\"\n"), sysconf_etc_path); - - maxpath_snprintf(config_file_path, "%s/%s", sysconf_etc_path, CONFIG_FILE_NAME); - if (stat(config_file_path, &stat_config) == 0) - { - config_file_found = true; - goto end_search; - } - -end_search: - if (verbose == true) - { - if (config_file_found == true) - { - fprintf(stdout, _("INFO: configuration file found at: \"%s\"\n"), config_file_path); - } - else - { - fprintf(stdout, _("INFO: no configuration file provided or found\n")); - } - } - } - - parse_config_old(terse); - - return; -} - void load_config(const char *config_file, bool verbose, bool terse, char *argv0) { @@ -427,33 +244,6 @@ end_search: } -static void -parse_config_old(bool terse) -{ - /* Collate configuration file errors here for friendlier reporting */ - static ItemList config_errors = {NULL, NULL}; - static ItemList config_warnings = {NULL, NULL}; - - _parse_config_old(&config_file_options, &config_errors, &config_warnings); - - /* errors found - exit after printing details, and any warnings */ - if (config_errors.head != NULL) - { - exit_with_config_file_errors(&config_errors, &config_warnings, terse); - } - - if (terse == false && config_warnings.head != NULL) - { - log_warning(_("the following problems were found in the configuration file:")); - - print_item_list(&config_warnings); - } - - return; -} - - - static void parse_config(bool terse) { @@ -513,7 +303,8 @@ _parse_config(ItemList *error_list, ItemList *warning_list) case CONFIG_STRING: { memset((char *)setting->val.strptr, 0, setting->maxval.strmaxlen); - strncpy((char *)setting->val.strptr, setting->defval.strdefault, setting->maxval.strmaxlen); + if (setting->defval.strdefault != NULL) + strncpy((char *)setting->val.strptr, setting->defval.strdefault, setting->maxval.strmaxlen); break; } case CONFIG_FAILOVER_MODE: @@ -581,7 +372,6 @@ _parse_config(ItemList *error_list, ItemList *warning_list) config_ok = ProcessRepmgrConfigFile(config_file_path, base_directory, error_list, warning_list); - /* * Perform some more complex checks which the file processing step can't do, * including checking for required parameters and sanity-checking parameters @@ -850,637 +640,6 @@ parse_configuration_item(ItemList *error_list, ItemList *warning_list, const cha } } -/* - * This creates a parsed representation of the configuration file in a location provided - * by the caller. - */ -static void -_parse_config_old(t_configuration_options *options, ItemList *error_list, ItemList *warning_list) -{ - FILE *fp; - char base_directory[MAXPGPATH]; - - /* - * Clear lists pointing to allocated memory - */ - - clear_event_notification_list(&options->event_notifications); - tablespace_list_free(options); - - /* Initialize configuration options with sensible defaults */ - - /*----------------- - * node information - *----------------- - */ - options->node_id = UNKNOWN_NODE_ID; - memset(options->node_name, 0, sizeof(options->node_name)); - memset(options->conninfo, 0, sizeof(options->conninfo)); - memset(options->replication_user, 0, sizeof(options->replication_user)); - memset(options->data_directory, 0, sizeof(options->data_directory)); - memset(options->config_directory, 0, sizeof(options->data_directory)); - memset(options->pg_bindir, 0, sizeof(options->pg_bindir)); - memset(options->repmgr_bindir, 0, sizeof(options->repmgr_bindir)); - options->replication_type = REPLICATION_TYPE_PHYSICAL; - - /*------------- - * log settings - * - * NOTE: the default for "log_level" is set in log.c and does not need - * to be initialised here - *------------- - */ - memset(options->log_facility, 0, sizeof(options->log_facility)); - memset(options->log_file, 0, sizeof(options->log_file)); - options->log_status_interval = DEFAULT_LOG_STATUS_INTERVAL; - - /*----------------------- - * standby clone settings - *------------------------ - */ - options->use_replication_slots = false; - memset(options->pg_basebackup_options, 0, sizeof(options->pg_basebackup_options)); - memset(options->restore_command, 0, sizeof(options->restore_command)); - options->tablespace_mapping.head = NULL; - options->tablespace_mapping.tail = NULL; - memset(options->recovery_min_apply_delay, 0, sizeof(options->recovery_min_apply_delay)); - options->recovery_min_apply_delay_provided = false; - memset(options->archive_cleanup_command, 0, sizeof(options->archive_cleanup_command)); - options->use_primary_conninfo_password = false; - memset(options->passfile, 0, sizeof(options->passfile)); - - /*------------------------- - * standby promote settings - *------------------------- - */ - options->promote_check_timeout = DEFAULT_PROMOTE_CHECK_TIMEOUT; - options->promote_check_interval = DEFAULT_PROMOTE_CHECK_INTERVAL; - - /*------------------------ - * standby follow settings - *------------------------ - */ - options->primary_follow_timeout = DEFAULT_PRIMARY_FOLLOW_TIMEOUT; - options->standby_follow_timeout = DEFAULT_STANDBY_FOLLOW_TIMEOUT; - - /*------------------------ - * standby switchover settings - *------------------------ - */ - options->shutdown_check_timeout = DEFAULT_SHUTDOWN_CHECK_TIMEOUT; - options->standby_reconnect_timeout = DEFAULT_STANDBY_RECONNECT_TIMEOUT; - options->wal_receive_check_timeout = DEFAULT_WAL_RECEIVE_CHECK_TIMEOUT; - - /*------------------------ - * node rejoin settings - *------------------------ - */ - - options->node_rejoin_timeout = DEFAULT_NODE_REJOIN_TIMEOUT; - - /*------------------------ - * node check settings - *------------------------ - */ - options->archive_ready_warning = DEFAULT_ARCHIVE_READY_WARNING; - options->archive_ready_critical = DEFAULT_ARCHIVE_READY_CRITICAL; - options->replication_lag_warning = DEFAULT_REPLICATION_LAG_WARNING; - options->replication_lag_critical = DEFAULT_REPLICATION_LAG_CRITICAL; - - /*------------- - * witness settings - *------------- - */ - options->witness_sync_interval = DEFAULT_WITNESS_SYNC_INTERVAL; - - /*----------------- - * repmgrd settings - *----------------- - */ - options->failover = FAILOVER_MANUAL; - memset(options->location, 0, sizeof(options->location)); - strncpy(options->location, DEFAULT_LOCATION, sizeof(options->location)); - options->priority = DEFAULT_PRIORITY; - memset(options->promote_command, 0, sizeof(options->promote_command)); - memset(options->follow_command, 0, sizeof(options->follow_command)); - options->monitor_interval_secs = DEFAULT_MONITORING_INTERVAL; - /* default to 6 reconnection attempts at intervals of 10 seconds */ - options->reconnect_attempts = DEFAULT_RECONNECTION_ATTEMPTS; - options->reconnect_interval = DEFAULT_RECONNECTION_INTERVAL; - options->monitoring_history = false; - options->degraded_monitoring_timeout = -1; - options->async_query_timeout = DEFAULT_ASYNC_QUERY_TIMEOUT; - options->primary_notification_timeout = DEFAULT_PRIMARY_NOTIFICATION_TIMEOUT; - options->repmgrd_standby_startup_timeout = -1; /* defaults to "standby_reconnect_timeout" if not set */ - memset(options->repmgrd_pid_file, 0, sizeof(options->repmgrd_pid_file)); - options->standby_disconnect_on_failover = false; - options->sibling_nodes_disconnect_timeout = DEFAULT_SIBLING_NODES_DISCONNECT_TIMEOUT; - options->connection_check_type = CHECK_PING; - options->primary_visibility_consensus = false; - memset(options->failover_validation_command, 0, sizeof(options->failover_validation_command)); - options->election_rerun_interval = DEFAULT_ELECTION_RERUN_INTERVAL; - - options->child_nodes_check_interval = DEFAULT_CHILD_NODES_CHECK_INTERVAL; - options->child_nodes_disconnect_min_count = DEFAULT_CHILD_NODES_DISCONNECT_MIN_COUNT; - options->child_nodes_connected_min_count = DEFAULT_CHILD_NODES_CONNECTED_MIN_COUNT; - options->child_nodes_connected_include_witness = DEFAULT_CHILD_NODES_CONNECTED_INCLUDE_WITNESS; - options->child_nodes_disconnect_timeout = DEFAULT_CHILD_NODES_DISCONNECT_TIMEOUT; - memset(options->child_nodes_disconnect_command, 0, sizeof(options->child_nodes_disconnect_command)); - - /*------------------------- - * service command settings - *------------------------- - */ - memset(options->pg_ctl_options, 0, sizeof(options->pg_ctl_options)); - memset(options->service_start_command, 0, sizeof(options->service_start_command)); - memset(options->service_stop_command, 0, sizeof(options->service_stop_command)); - memset(options->service_restart_command, 0, sizeof(options->service_restart_command)); - memset(options->service_reload_command, 0, sizeof(options->service_reload_command)); - memset(options->service_promote_command, 0, sizeof(options->service_promote_command)); - - /*--------------------------------- - * repmgrd service command settings - *--------------------------------- - */ - memset(options->repmgrd_service_start_command, 0, sizeof(options->repmgrd_service_start_command)); - memset(options->repmgrd_service_stop_command, 0, sizeof(options->repmgrd_service_stop_command)); - - /*---------------------------- - * event notification settings - *---------------------------- - */ - memset(options->event_notification_command, 0, sizeof(options->event_notification_command)); - memset(options->event_notifications_orig, 0, sizeof(options->event_notifications_orig)); - options->event_notifications.head = NULL; - options->event_notifications.tail = NULL; - - /*---------------- - * barman settings - * --------------- - */ - memset(options->barman_host, 0, sizeof(options->barman_host)); - memset(options->barman_server, 0, sizeof(options->barman_server)); - memset(options->barman_config, 0, sizeof(options->barman_config)); - - /*------------------- - * rsync/ssh settings - * ------------------ - */ - memset(options->rsync_options, 0, sizeof(options->rsync_options)); - memset(options->ssh_options, 0, sizeof(options->ssh_options)); - strncpy(options->ssh_options, DEFAULT_SSH_OPTIONS, sizeof(options->ssh_options)); - - /*--------------------------- - * undocumented test settings - *--------------------------- - */ - options->promote_delay = 0; - - /* - * If no configuration file available (user didn't specify and none found - * in the default locations), return with default values - */ - if (config_file_found == false) - { - log_verbose(LOG_NOTICE, - _("no configuration file provided and no default file found - " - "continuing with default values")); - return; - } - - - /* - * A configuration file has been found, either provided by the user or - * found in one of the default locations. Sanity check whether we - * can open it, and fail with an error about the nature of the file - * (provided or default) if not. We do this here rather than having - * to teach the configuration file parser the difference. - */ - - fp = fopen(config_file_path, "r"); - - if (fp == NULL) - { - if (config_file_provided) - { - log_error(_("unable to open provided configuration file \"%s\"; terminating"), - config_file_path); - } - else - { - log_error(_("unable to open default configuration file \"%s\"; terminating"), - config_file_path); - } - - exit(ERR_BAD_CONFIG); - } - - fclose(fp); - - - strncpy(base_directory, config_file_path, MAXPGPATH); - canonicalize_path(base_directory); - get_parent_directory(base_directory); - - // XXX fail here if processing issue found - (void) ProcessRepmgrConfigFileOld(config_file_path, base_directory, options, error_list, warning_list); - - /* check required parameters */ - if (options->node_id == UNKNOWN_NODE_ID) - { - item_list_append(error_list, _("\"node_id\": required parameter was not found")); - } - - if (!strlen(options->node_name)) - { - item_list_append(error_list, _("\"node_name\": required parameter was not found")); - } - - if (!strlen(options->data_directory)) - { - item_list_append(error_list, _("\"data_directory\": required parameter was not found")); - } - - if (!strlen(options->conninfo)) - { - item_list_append(error_list, _("\"conninfo\": required parameter was not found")); - } - else - { - /* - * Basic sanity check of provided conninfo string; this will catch any - * invalid parameters (but not values). - */ - char *conninfo_errmsg = NULL; - - if (validate_conninfo_string(options->conninfo, &conninfo_errmsg) == false) - { - PQExpBufferData error_message_buf; - initPQExpBuffer(&error_message_buf); - - appendPQExpBuffer(&error_message_buf, - _("\"conninfo\": %s (provided: \"%s\")"), - conninfo_errmsg, - options->conninfo); - - item_list_append(error_list, error_message_buf.data); - termPQExpBuffer(&error_message_buf); - } - } - - /* set values for parameters which default to other parameters */ - - /* - * From 4.1, "repmgrd_standby_startup_timeout" replaces "standby_reconnect_timeout" - * in repmgrd; fall back to "standby_reconnect_timeout" if no value explicitly provided - */ - if (options->repmgrd_standby_startup_timeout == -1) - { - options->repmgrd_standby_startup_timeout = options->standby_reconnect_timeout; - } - - /* add warning about changed "barman_" parameter meanings */ - if ((options->barman_host[0] == '\0' && options->barman_server[0] != '\0') || - (options->barman_host[0] != '\0' && options->barman_server[0] == '\0')) - { - item_list_append(error_list, - _("use \"barman_host\" for the hostname of the Barman server")); - item_list_append(error_list, - _("use \"barman_server\" for the name of the [server] section in the Barman configuration file")); - - } - - /* other sanity checks */ - - if (options->archive_ready_warning >= options->archive_ready_critical) - { - item_list_append(error_list, - _("\"archive_ready_critical\" must be greater than \"archive_ready_warning\"")); - } - - if (options->replication_lag_warning >= options->replication_lag_critical) - { - item_list_append(error_list, - _("\"replication_lag_critical\" must be greater than \"replication_lag_warning\"")); - } - - if (options->standby_reconnect_timeout < options->node_rejoin_timeout) - { - item_list_append(error_list, - _("\"standby_reconnect_timeout\" must be equal to or greater than \"node_rejoin_timeout\"")); - } -} - - -void -parse_configuration_item_old(t_configuration_options *options, ItemList *error_list, ItemList *warning_list, const char *name, const char *value) -{ - if (strcmp(name, "node_id") == 0) - { - options->node_id = repmgr_atoi(value, name, error_list, MIN_NODE_ID); - } - else if (strcmp(name, "node_name") == 0) - { - if (strlen(value) < sizeof(options->node_name)) - strncpy(options->node_name, value, sizeof(options->node_name)); - else - item_list_append_format(error_list, - _("value for \"node_name\" must contain fewer than %lu characters"), - sizeof(options->node_name)); - } - else if (strcmp(name, "conninfo") == 0) - { - strncpy(options->conninfo, value, MAXLEN); - } - else if (strcmp(name, "replication_user") == 0) - { - if (strlen(value) < sizeof(options->replication_user)) - strncpy(options->replication_user, value, sizeof(options->replication_user)); - else - item_list_append_format(error_list, - _("value for \"replication_user\" must contain fewer than %lu characters"), - sizeof(options->replication_user)); - } - else if (strcmp(name, "data_directory") == 0) - { - strncpy(options->data_directory, value, MAXPGPATH); - canonicalize_path(options->data_directory); - } - else if (strcmp(name, "config_directory") == 0) - { - strncpy(options->config_directory, value, MAXPGPATH); - canonicalize_path(options->config_directory); - } - - else if (strcmp(name, "pg_bindir") == 0) - strncpy(options->pg_bindir, value, MAXPGPATH); - else if (strcmp(name, "repmgr_bindir") == 0) - strncpy(options->repmgr_bindir, value, MAXPGPATH); - - else if (strcmp(name, "replication_type") == 0) - { - if (strcmp(value, "physical") == 0) - options->replication_type = REPLICATION_TYPE_PHYSICAL; - else - item_list_append(error_list, _("value for \"replication_type\" must be \"physical\"")); - } - - /* log settings */ - else if (strcmp(name, "log_level") == 0) - strncpy(options->log_level, value, MAXLEN); - else if (strcmp(name, "log_facility") == 0) - strncpy(options->log_facility, value, MAXLEN); - else if (strcmp(name, "log_file") == 0) - strncpy(options->log_file, value, MAXLEN); - else if (strcmp(name, "log_status_interval") == 0) - options->log_status_interval = repmgr_atoi(value, name, error_list, 0); - - /* standby clone settings */ - else if (strcmp(name, "use_replication_slots") == 0) - options->use_replication_slots = parse_bool(value, name, error_list); - else if (strcmp(name, "pg_basebackup_options") == 0) - strncpy(options->pg_basebackup_options, value, MAXLEN); - else if (strcmp(name, "restore_command") == 0) - strncpy(options->restore_command, value, MAXLEN); - else if (strcmp(name, "tablespace_mapping") == 0) - tablespace_list_append(&options->tablespace_mapping, value); - - else if (strcmp(name, "recovery_min_apply_delay") == 0) - { - parse_time_unit_parameter(name, value, options->recovery_min_apply_delay, error_list); - options->recovery_min_apply_delay_provided = true; - } - else if (strcmp(name, "archive_cleanup_command") == 0) - strncpy(options->archive_cleanup_command, value, MAXLEN); - else if (strcmp(name, "use_primary_conninfo_password") == 0) - options->use_primary_conninfo_password = parse_bool(value, name, error_list); - else if (strcmp(name, "passfile") == 0) - strncpy(options->passfile, value, sizeof(options->passfile)); - - /* standby promote settings */ - else if (strcmp(name, "promote_check_timeout") == 0) - options->promote_check_timeout = repmgr_atoi(value, name, error_list, 1); - - else if (strcmp(name, "promote_check_interval") == 0) - options->promote_check_interval = repmgr_atoi(value, name, error_list, 1); - - /* standby follow settings */ - else if (strcmp(name, "primary_follow_timeout") == 0) - options->primary_follow_timeout = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "standby_follow_timeout") == 0) - options->standby_follow_timeout = repmgr_atoi(value, name, error_list, 0); - - /* standby switchover settings */ - else if (strcmp(name, "shutdown_check_timeout") == 0) - options->shutdown_check_timeout = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "standby_reconnect_timeout") == 0) - options->standby_reconnect_timeout = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "wal_receive_check_timeout") == 0) - options->wal_receive_check_timeout = repmgr_atoi(value, name, error_list, 0); - - /* node rejoin settings */ - else if (strcmp(name, "node_rejoin_timeout") == 0) - options->node_rejoin_timeout = repmgr_atoi(value, name, error_list, 0); - - /* node check settings */ - else if (strcmp(name, "archive_ready_warning") == 0) - options->archive_ready_warning = repmgr_atoi(value, name, error_list, 1); - else if (strcmp(name, "archive_ready_critical") == 0) - options->archive_ready_critical = repmgr_atoi(value, name, error_list, 1); - else if (strcmp(name, "replication_lag_warning") == 0) - options->replication_lag_warning = repmgr_atoi(value, name, error_list, 1); - else if (strcmp(name, "replication_lag_critical") == 0) - options->replication_lag_critical = repmgr_atoi(value, name, error_list, 1); - - /* repmgrd settings */ - else if (strcmp(name, "failover") == 0) - { - if (strcmp(value, "manual") == 0) - { - options->failover = FAILOVER_MANUAL; - } - else if (strcmp(value, "automatic") == 0) - { - options->failover = FAILOVER_AUTOMATIC; - } - else - { - item_list_append(error_list, - _("value for \"failover\" must be \"automatic\" or \"manual\"\n")); - } - } - else if (strcmp(name, "location") == 0) - strncpy(options->location, value, sizeof(options->location)); - else if (strcmp(name, "priority") == 0) - options->priority = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "promote_command") == 0) - strncpy(options->promote_command, value, sizeof(options->promote_command)); - else if (strcmp(name, "follow_command") == 0) - strncpy(options->follow_command, value, sizeof(options->follow_command)); - else if (strcmp(name, "reconnect_attempts") == 0) - options->reconnect_attempts = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "reconnect_interval") == 0) - options->reconnect_interval = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "monitor_interval_secs") == 0) - options->monitor_interval_secs = repmgr_atoi(value, name, error_list, 1); - else if (strcmp(name, "monitoring_history") == 0) - options->monitoring_history = parse_bool(value, name, error_list); - else if (strcmp(name, "degraded_monitoring_timeout") == 0) - options->degraded_monitoring_timeout = repmgr_atoi(value, name, error_list, -1); - else if (strcmp(name, "async_query_timeout") == 0) - options->async_query_timeout = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "primary_notification_timeout") == 0) - options->primary_notification_timeout = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "repmgrd_standby_startup_timeout") == 0) - options->repmgrd_standby_startup_timeout = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "repmgrd_pid_file") == 0) - strncpy(options->repmgrd_pid_file, value, MAXPGPATH); - else if (strcmp(name, "standby_disconnect_on_failover") == 0) - options->standby_disconnect_on_failover = parse_bool(value, name, error_list); - else if (strcmp(name, "sibling_nodes_disconnect_timeout") == 0) - options->sibling_nodes_disconnect_timeout = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "connection_check_type") == 0) - { - if (strcasecmp(value, "ping") == 0) - { - options->connection_check_type = CHECK_PING; - } - else if (strcasecmp(value, "connection") == 0) - { - options->connection_check_type = CHECK_CONNECTION; - } - else if (strcasecmp(value, "query") == 0) - { - options->connection_check_type = CHECK_QUERY; - } - else - { - item_list_append(error_list, - _("value for \"connection_check_type\" must be \"ping\", \"connection\" or \"query\"\n")); - } - } - else if (strcmp(name, "primary_visibility_consensus") == 0) - options->primary_visibility_consensus = parse_bool(value, name, error_list); - else if (strcmp(name, "failover_validation_command") == 0) - strncpy(options->failover_validation_command, value, sizeof(options->failover_validation_command)); - else if (strcmp(name, "election_rerun_interval") == 0) - options->election_rerun_interval = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "child_nodes_check_interval") == 0) - options->child_nodes_check_interval = repmgr_atoi(value, name, error_list, 1); - else if (strcmp(name, "child_nodes_disconnect_min_count") == 0) - options->child_nodes_disconnect_min_count = repmgr_atoi(value, name, error_list, -1); - else if (strcmp(name, "child_nodes_connected_min_count") == 0) - options->child_nodes_connected_min_count = repmgr_atoi(value, name, error_list, -1); - else if (strcmp(name, "child_nodes_connected_include_witness") == 0) - options->child_nodes_connected_include_witness = parse_bool(value, name, error_list); - else if (strcmp(name, "child_nodes_disconnect_timeout") == 0) - options->child_nodes_disconnect_timeout = repmgr_atoi(value, name, error_list, 0); - else if (strcmp(name, "child_nodes_disconnect_command") == 0) - snprintf(options->child_nodes_disconnect_command, sizeof(options->child_nodes_disconnect_command), "%s", value); - - /* witness settings */ - else if (strcmp(name, "witness_sync_interval") == 0) - options->witness_sync_interval = repmgr_atoi(value, name, error_list, 1); - - /* service settings */ - else if (strcmp(name, "pg_ctl_options") == 0) - strncpy(options->pg_ctl_options, value, sizeof(options->pg_ctl_options)); - else if (strcmp(name, "service_start_command") == 0) - strncpy(options->service_start_command, value, sizeof(options->service_start_command)); - else if (strcmp(name, "service_stop_command") == 0) - strncpy(options->service_stop_command, value, sizeof(options->service_stop_command)); - else if (strcmp(name, "service_restart_command") == 0) - strncpy(options->service_restart_command, value, sizeof(options->service_restart_command)); - else if (strcmp(name, "service_reload_command") == 0) - strncpy(options->service_reload_command, value, sizeof(options->service_reload_command)); - else if (strcmp(name, "service_promote_command") == 0) - strncpy(options->service_promote_command, value, sizeof(options->service_promote_command)); - - /* repmgrd service settings */ - else if (strcmp(name, "repmgrd_service_start_command") == 0) - strncpy(options->repmgrd_service_start_command, value, sizeof(options->repmgrd_service_start_command)); - else if (strcmp(name, "repmgrd_service_stop_command") == 0) - strncpy(options->repmgrd_service_stop_command, value, sizeof(options->repmgrd_service_stop_command)); - - - /* event notification settings */ - else if (strcmp(name, "event_notification_command") == 0) - strncpy(options->event_notification_command, value, sizeof(options->event_notification_command)); - else if (strcmp(name, "event_notifications") == 0) - { - /* store unparsed value for comparison when reloading config */ - strncpy(options->event_notifications_orig, value, sizeof(options->event_notifications_orig)); - parse_event_notifications_list(&options->event_notifications, value); - } - - /* barman settings */ - else if (strcmp(name, "barman_host") == 0) - strncpy(options->barman_host, value, sizeof(options->barman_host)); - else if (strcmp(name, "barman_server") == 0) - strncpy(options->barman_server, value, sizeof(options->barman_server)); - else if (strcmp(name, "barman_config") == 0) - strncpy(options->barman_config, value, sizeof(options->barman_config)); - - /* rsync/ssh settings */ - else if (strcmp(name, "rsync_options") == 0) - strncpy(options->rsync_options, value, sizeof(options->rsync_options)); - else if (strcmp(name, "ssh_options") == 0) - strncpy(options->ssh_options, value, sizeof(options->ssh_options)); - - /* undocumented settings for testing */ - else if (strcmp(name, "promote_delay") == 0) - options->promote_delay = repmgr_atoi(value, name, error_list, 1); - - /* - * Following parameters have been deprecated or renamed from 3.x - - * issue a warning - */ - else if (strcmp(name, "cluster") == 0) - { - item_list_append(warning_list, - _("parameter \"cluster\" is deprecated and will be ignored")); - } - else if (strcmp(name, "node") == 0) - { - item_list_append(warning_list, - _("parameter \"node\" has been renamed to \"node_id\"")); - } - else if (strcmp(name, "upstream_node") == 0) - { - item_list_append(warning_list, - _("parameter \"upstream_node\" has been removed; use \"--upstream-node-id\" when cloning a standby")); - } - else if (strcmp(name, "loglevel") == 0) - { - item_list_append(warning_list, - _("parameter \"loglevel\" has been renamed to \"log_level\"")); - } - else if (strcmp(name, "logfacility") == 0) - { - item_list_append(warning_list, - _("parameter \"logfacility\" has been renamed to \"log_facility\"")); - } - else if (strcmp(name, "logfile") == 0) - { - item_list_append(warning_list, - _("parameter \"logfile\" has been renamed to \"log_file\"")); - } - else if (strcmp(name, "master_reponse_timeout") == 0) - { - item_list_append(warning_list, - _("parameter \"master_reponse_timeout\" has been removed; use \"async_query_timeout\" instead")); - } - else if (strcmp(name, "retry_promote_interval_secs") == 0) - { - item_list_append(warning_list, - _("parameter \"retry_promote_interval_secs\" has been removed; use \"primary_notification_timeout\" instead")); - } - else - { - log_warning(_("%s/%s: unknown name/value pair provided; ignoring"), name, value); - } - -} bool diff --git a/configfile.h b/configfile.h index 01574846..44bf9ece 100644 --- a/configfile.h +++ b/configfile.h @@ -244,67 +244,6 @@ typedef struct /* Declare the main configfile structure for client applications */ extern t_configuration_options config_file_options; - -/* - * The following will initialize the structure with a minimal set of options; - * actual defaults are set in parse_config() before parsing the configuration file - */ - -#define T_CONFIGURATION_OPTIONS_INITIALIZER { \ - /* node information */ \ - UNKNOWN_NODE_ID, "", "", "", "", "", "", "", REPLICATION_TYPE_PHYSICAL, \ - /* log settings */ \ - "", "", "", DEFAULT_LOG_STATUS_INTERVAL, \ - /* standby clone settings */ \ - false, "", "", { NULL, NULL }, "", false, "", false, "", \ - /* standby promote settings */ \ - DEFAULT_PROMOTE_CHECK_TIMEOUT, DEFAULT_PROMOTE_CHECK_INTERVAL, \ - /* standby follow settings */ \ - DEFAULT_PRIMARY_FOLLOW_TIMEOUT, \ - DEFAULT_STANDBY_FOLLOW_TIMEOUT, \ - /* standby switchover settings */ \ - DEFAULT_SHUTDOWN_CHECK_TIMEOUT, \ - DEFAULT_STANDBY_RECONNECT_TIMEOUT, \ - DEFAULT_WAL_RECEIVE_CHECK_TIMEOUT, \ - /* node rejoin settings */ \ - DEFAULT_NODE_REJOIN_TIMEOUT, \ - /* node check settings */ \ - DEFAULT_ARCHIVE_READY_WARNING, DEFAULT_ARCHIVE_READY_CRITICAL, \ - DEFAULT_REPLICATION_LAG_WARNING, DEFAULT_REPLICATION_LAG_CRITICAL, \ - /* witness settings */ \ - DEFAULT_WITNESS_SYNC_INTERVAL, \ - /* repmgrd settings */ \ - FAILOVER_MANUAL, DEFAULT_LOCATION, DEFAULT_PRIORITY, "", "", \ - DEFAULT_MONITORING_INTERVAL, \ - DEFAULT_RECONNECTION_ATTEMPTS, \ - DEFAULT_RECONNECTION_INTERVAL, \ - false, -1, \ - DEFAULT_ASYNC_QUERY_TIMEOUT, \ - DEFAULT_PRIMARY_NOTIFICATION_TIMEOUT, \ - -1, "", false, DEFAULT_SIBLING_NODES_DISCONNECT_TIMEOUT, \ - CHECK_PING, true, "", DEFAULT_ELECTION_RERUN_INTERVAL, \ - DEFAULT_CHILD_NODES_CHECK_INTERVAL, \ - DEFAULT_CHILD_NODES_DISCONNECT_MIN_COUNT, \ - DEFAULT_CHILD_NODES_CONNECTED_MIN_COUNT, \ - DEFAULT_CHILD_NODES_CONNECTED_INCLUDE_WITNESS, \ - DEFAULT_CHILD_NODES_DISCONNECT_TIMEOUT, "", \ - /* service settings */ \ - "", "", "", "", "", "", \ - /* repmgrd service settings */ \ - "", "", \ - /* event notification settings */ \ - "", "", { NULL, NULL }, \ - /* barman settings */ \ - "", "", "", \ - /* rsync/ssh settings */ \ - "", "", \ - /* undocumented test settings */ \ - 0 \ -} - -extern t_configuration_options config_file_options; - - typedef struct { char slot[MAXLEN]; @@ -369,12 +308,8 @@ typedef struct void set_progname(const char *argv0); const char *progname(void); -void load_config_old(const char *config_file, bool verbose, bool terse, t_configuration_options *options, char *argv0); void load_config(const char *config_file, bool verbose, bool terse, char *argv0); - bool reload_config(t_server_type server_type); - -void parse_configuration_item_old(t_configuration_options *options, ItemList *error_list, ItemList *warning_list, const char *name, const char *value); void parse_configuration_item(ItemList *error_list, ItemList *warning_list, const char *name, const char *value); bool parse_recovery_conf(const char *data_dir, t_recovery_conf *conf); @@ -409,8 +344,6 @@ char *print_event_notification_list(EventNotificationList *list); extern bool modify_auto_conf(const char *data_dir, KeyValueList *items); -extern bool ProcessRepmgrConfigFileOld(const char *config_file, const char *base_dir, t_configuration_options *options, ItemList *error_list, ItemList *warning_list); - extern bool ProcessRepmgrConfigFile(const char *config_file, const char *base_dir, ItemList *error_list, ItemList *warning_list); extern bool ProcessPostgresConfigFile(const char *config_file, const char *base_dir, KeyValueList *contents, ItemList *error_list, ItemList *warning_list);