From 11d25e2aeff432fb6a7d558df8c03e350d781d1a Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Mon, 1 Oct 2018 17:30:49 +0900 Subject: [PATCH] Add configuration parameter "repmgr_bindir" This is to facilitate remote invocation of repmgr when the repmgr binary is located somewhere other than the PostgreSQL binary directory, as it cannot be assumed all package maintainers will install repmgr there. This parameter is optional; if not set (the default), repmgr will fall back to "pg_bindir" (if set). Addresses GitHub #246. --- HISTORY | 1 + configfile.c | 3 +++ configfile.h | 3 ++- doc/appendix-release-notes.sgml | 17 +++++++++++++++++ doc/quickstart.sgml | 25 ++++++++++++++++++------- repmgr-action-cluster.c | 4 ++-- repmgr-client-global.h | 1 + repmgr-client.c | 19 +++++++++++++++++-- repmgr.conf.sample | 6 +++++- 9 files changed, 66 insertions(+), 13 deletions(-) diff --git a/HISTORY b/HISTORY index cfd7c738..bad2bacd 100644 --- a/HISTORY +++ b/HISTORY @@ -2,6 +2,7 @@ repmgr: add parameter "shutdown_check_timeout" for use by "standby switchover"; GitHub #504 (Ian) repmgr: add "--node-id" option to "repmgr cluster cleanup"; GitHub #493 (Ian) + repmgr: add configuration file parameter "repmgr_bindir"; GitHub #246 (Ian) 4.1.1 2018-09-05 logging: explicitly log the text of failed queries as ERRORs to diff --git a/configfile.c b/configfile.c index d3fdddb7..2479acc6 100644 --- a/configfile.c +++ b/configfile.c @@ -288,6 +288,7 @@ _parse_config(t_configuration_options *options, ItemList *error_list, ItemList * 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; /*------------- @@ -490,6 +491,8 @@ _parse_config(t_configuration_options *options, ItemList *error_list, ItemList * } 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) { diff --git a/configfile.h b/configfile.h index 975c8f8e..ab2151d2 100644 --- a/configfile.h +++ b/configfile.h @@ -75,6 +75,7 @@ typedef struct char data_directory[MAXPGPATH]; char config_directory[MAXPGPATH]; char pg_bindir[MAXPGPATH]; + char repmgr_bindir[MAXPGPATH]; int replication_type; /* log settings */ @@ -171,7 +172,7 @@ typedef struct #define T_CONFIGURATION_OPTIONS_INITIALIZER { \ /* node information */ \ - UNKNOWN_NODE_ID, "", "", "", "", "", "", REPLICATION_TYPE_PHYSICAL, \ + UNKNOWN_NODE_ID, "", "", "", "", "", "", "", REPLICATION_TYPE_PHYSICAL, \ /* log settings */ \ "", "", "", DEFAULT_LOG_STATUS_INTERVAL, \ /* standby clone settings */ \ diff --git a/doc/appendix-release-notes.sgml b/doc/appendix-release-notes.sgml index a0bf21fe..6f582f98 100644 --- a/doc/appendix-release-notes.sgml +++ b/doc/appendix-release-notes.sgml @@ -37,6 +37,23 @@ + + + + + New parameter repmgr_bindir added, to facilitate remote invocation of repmgr + when the repmgr binary is located somewhere other than the PostgreSQL binary directory, as it + cannot be assumed all package maintainers will install &repmgr; there. + + + This parameter is optional; if not set (the default), &repmgr; will fall back + to (if set). + + + (GitHub #246). + + + diff --git a/doc/quickstart.sgml b/doc/quickstart.sgml index 03899743..5a8b68ef 100644 --- a/doc/quickstart.sgml +++ b/doc/quickstart.sgml @@ -237,13 +237,6 @@ server. See sections and for further details about repmgr.conf. - - - For Debian-based distributions we recommend explictly setting - to the directory where pg_ctl and other binaries - not in the standard path are located. For PostgreSQL 9.6 this would be /usr/lib/postgresql/9.6/bin/. - - @@ -262,6 +255,24 @@ + + + For Debian-based distributions we recommend explictly setting + to the directory where pg_ctl and other binaries + not in the standard path are located. For PostgreSQL 9.6 this would be /usr/lib/postgresql/9.6/bin/. + + + + + + If your distribution places the &repmgr; binaries in a location other than the + PostgreSQL installation directory, specify this with + to enable &repmgr; to perform operations (e.g. + repmgr cluster crosscheck) + on other nodes. + + + See the file repmgr.conf.sample diff --git a/repmgr-action-cluster.c b/repmgr-action-cluster.c index b41229f0..83fbfe47 100644 --- a/repmgr-action-cluster.c +++ b/repmgr-action-cluster.c @@ -999,7 +999,7 @@ build_cluster_matrix(t_node_matrix_rec ***matrix_rec_dest, int *name_length) */ appendPQExpBuffer(&command, "\"%s -d '%s' ", - make_pg_path(progname()), + make_repmgr_path(progname()), cell->node_info->conninfo); @@ -1182,7 +1182,7 @@ build_cluster_crosscheck(t_node_status_cube ***dest_cube, int *name_length) appendPQExpBuffer(&command, "%s -d '%s' --node-id=%i ", - make_pg_path(progname()), + make_repmgr_path(progname()), cell->node_info->conninfo, remote_node_id); diff --git a/repmgr-client-global.h b/repmgr-client-global.h index d2a4aa65..c424cd9d 100644 --- a/repmgr-client-global.h +++ b/repmgr-client-global.h @@ -231,6 +231,7 @@ extern int copy_remote_files(char *host, char *remote_user, char *remote_path, extern void print_error_list(ItemList *error_list, int log_level); extern char *make_pg_path(const char *file); +extern char *make_repmgr_path(const char *file); extern void get_superuser_connection(PGconn **conn, PGconn **superuser_conn, PGconn **privileged_conn); diff --git a/repmgr-client.c b/repmgr-client.c index 51005f3d..432bd7ad 100644 --- a/repmgr-client.c +++ b/repmgr-client.c @@ -2483,6 +2483,22 @@ make_pg_path(const char *file) } +char * +make_repmgr_path(const char *file) +{ + if (config_file_options.repmgr_bindir[0] != '\0') + { + maxlen_snprintf(path_buf, "%s%s", config_file_options.repmgr_bindir, file); + } + else + { + maxlen_snprintf(path_buf, "%s%s", pg_bindir, file); + } + + return path_buf; +} + + int copy_remote_files(char *host, char *remote_user, char *remote_path, char *local_path, bool is_directory, int server_version_num) @@ -2674,9 +2690,8 @@ make_remote_repmgr_path(PQExpBufferData *output_buf, t_node_info *remote_node_re { appendPQExpBuffer(output_buf, "%s -f %s ", - make_pg_path(progname()), + make_repmgr_path(progname()), remote_node_record->config_file); - } diff --git a/repmgr.conf.sample b/repmgr.conf.sample index 28296f40..b77ba5a2 100644 --- a/repmgr.conf.sample +++ b/repmgr.conf.sample @@ -147,7 +147,11 @@ # *NOTE* "pg_bindir" is only used when repmgr directly # executes PostgreSQL binaries; any user-defined scripts # *must* be specified with the full path - # + +#repmgr_bindir='' # Path to repmgr binary directory (location of the repmgr + # binary. Only needed if the repmgr executable is not in + # the system $PATH or the path defined in "pg_bindir". + #use_primary_conninfo_password=false # explicitly set "password" in recovery.conf's # "primary_conninfo" parameter using the value contained # in the environment variable PGPASSWORD