mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-22 22:56:29 +00:00
Remove old configuration handling code
This expunges two large and cumbersome sets of if/else statements and the T_CONFIGURATION_OPTIONS_INITIALIZER macro, all of which needed to be kept in sync when adding/modifying configuration file parameters.
This commit is contained in:
15
configdata.c
15
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 },
|
||||
{},
|
||||
{}
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
|
||||
845
configfile.c
845
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
|
||||
|
||||
67
configfile.h
67
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);
|
||||
|
||||
Reference in New Issue
Block a user