From 150ccc0662a4c76d4d60d0b3b4e805996fd6ec13 Mon Sep 17 00:00:00 2001 From: Christian Kruse Date: Tue, 4 Mar 2014 12:46:05 +0100 Subject: [PATCH 1/6] add option to avoid repmgrd started upon installation Now repmgr.repmgrd.default has another option: REPMGRD_ENABLED. Valid values are either yes or no. --- debian/repmgr.repmgrd.default | 4 ++++ debian/repmgr.repmgrd.init | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/debian/repmgr.repmgrd.default b/debian/repmgr.repmgrd.default index bd57bf6a..c966e7ca 100644 --- a/debian/repmgr.repmgrd.default +++ b/debian/repmgr.repmgrd.default @@ -2,6 +2,10 @@ # default settings for repmgrd. This file is source by /bin/sh from # /etc/init.d/repmgrd +# disable repmgrd by default so it won't get started upon installation +# valid values: yes/no +REPMGRD_ENABLED=no + # Options for repmgrd REPMGRD_OPTS="" diff --git a/debian/repmgr.repmgrd.init b/debian/repmgr.repmgrd.init index 11bd2dee..3ee82e50 100644 --- a/debian/repmgr.repmgrd.init +++ b/debian/repmgr.repmgrd.init @@ -26,6 +26,12 @@ fi test -x $REPMGRD_BIN || exit 0 +case "$REPMGRD_ENABLE" in + [Nn]*) + exit 0 + ;; +esac + case "$1" in start) start-stop-daemon --start --quiet --make-pidfile --pidfile $REPMGRD_PIDFILE --exec $REPMGRD_BIN $REPMGRD_OPTS From 50b9022a417c5eeb904e179131530cb0b1b75479 Mon Sep 17 00:00:00 2001 From: Christian Kruse Date: Tue, 4 Mar 2014 12:59:23 +0100 Subject: [PATCH 2/6] fix: don't use Windows newlines --- debian/repmgr.repmgrd.default | 36 ++++++------ debian/repmgr.repmgrd.init | 108 +++++++++++++++++----------------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/debian/repmgr.repmgrd.default b/debian/repmgr.repmgrd.default index c966e7ca..1eb55921 100644 --- a/debian/repmgr.repmgrd.default +++ b/debian/repmgr.repmgrd.default @@ -1,18 +1,18 @@ -#!/bin/sh -# default settings for repmgrd. This file is source by /bin/sh from -# /etc/init.d/repmgrd - -# disable repmgrd by default so it won't get started upon installation -# valid values: yes/no -REPMGRD_ENABLED=no - -# Options for repmgrd -REPMGRD_OPTS="" - -# repmgrd binary -REPMGR_BIN="/usr/bin/repmgr" - -# pid file -REPMGR_PIDFILE="/var/run/repmgrd.pid" - - +#!/bin/sh +# default settings for repmgrd. This file is source by /bin/sh from +# /etc/init.d/repmgrd + +# disable repmgrd by default so it won't get started upon installation +# valid values: yes/no +REPMGRD_ENABLED=no + +# Options for repmgrd +REPMGRD_OPTS="" + +# repmgrd binary +REPMGR_BIN="/usr/bin/repmgr" + +# pid file +REPMGR_PIDFILE="/var/run/repmgrd.pid" + + diff --git a/debian/repmgr.repmgrd.init b/debian/repmgr.repmgrd.init index 3ee82e50..2473c2c9 100644 --- a/debian/repmgr.repmgrd.init +++ b/debian/repmgr.repmgrd.init @@ -1,54 +1,54 @@ -#!/bin/sh -### BEGIN INIT INFO -# Provides: repmgrd -# Required-Start: $local_fs $remote_fs $network $syslog $postgresql -# Required-Stop: $local_fs $remote_fs $network $syslog $postgresql -# Should-Start: $syslog $postgresql -# Should-Start: $syslog $postgresql -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Start/stop repmgrd -### END INIT INFO - -set -e - -if test -f /etc/default/repmgrd; then - . /etc/default/repmgrd -fi - -if [ -z "$REPMGRD_BIN" ]; then - REPMGRD_BIN="/usr/bin/repmgrd" -fi - -if [ -z "$REPMGRD_PIDFILE" ]; then - REPMGRD_PIDFILE="/var/run/repmgrd.pid" -fi - -test -x $REPMGRD_BIN || exit 0 - -case "$REPMGRD_ENABLE" in - [Nn]*) - exit 0 - ;; -esac - -case "$1" in - start) - start-stop-daemon --start --quiet --make-pidfile --pidfile $REPMGRD_PIDFILE --exec $REPMGRD_BIN $REPMGRD_OPTS - ;; - - stop) - start-stop-daemon --stop --oknodo --quiet --pidfile $REPMGRD_PIDFILE - ;; - - restart) - $0 stop && $0 start || exit 1 - ;; - - *) - echo "Usage: $0 {start|stop|restart}" - exit 1 - ;; -esac - -exit 0 +#!/bin/sh +### BEGIN INIT INFO +# Provides: repmgrd +# Required-Start: $local_fs $remote_fs $network $syslog $postgresql +# Required-Stop: $local_fs $remote_fs $network $syslog $postgresql +# Should-Start: $syslog $postgresql +# Should-Start: $syslog $postgresql +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start/stop repmgrd +### END INIT INFO + +set -e + +if test -f /etc/default/repmgrd; then + . /etc/default/repmgrd +fi + +if [ -z "$REPMGRD_BIN" ]; then + REPMGRD_BIN="/usr/bin/repmgrd" +fi + +if [ -z "$REPMGRD_PIDFILE" ]; then + REPMGRD_PIDFILE="/var/run/repmgrd.pid" +fi + +test -x $REPMGRD_BIN || exit 0 + +case "$REPMGRD_ENABLE" in + [Nn]*) + exit 0 + ;; +esac + +case "$1" in + start) + start-stop-daemon --start --quiet --make-pidfile --pidfile $REPMGRD_PIDFILE --exec $REPMGRD_BIN $REPMGRD_OPTS + ;; + + stop) + start-stop-daemon --stop --oknodo --quiet --pidfile $REPMGRD_PIDFILE + ;; + + restart) + $0 stop && $0 start || exit 1 + ;; + + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 + ;; +esac + +exit 0 From 90ecb2b1074e932e9a15e0d2338591b5ca9864be Mon Sep 17 00:00:00 2001 From: Christian Kruse Date: Tue, 4 Mar 2014 15:32:48 +0100 Subject: [PATCH 3/6] fix: check return values of freopen() Some compiles complain about not checking the return value of freopen(), so we check it --- log.c | 9 ++++++++- repmgrd.c | 33 +++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/log.c b/log.c index be083b57..bde662db 100644 --- a/log.c +++ b/log.c @@ -144,7 +144,14 @@ bool logger_init(t_configuration_options *opts, const char* ident, const char* l if (*opts->logfile) { - freopen(opts->logfile, "a", stderr); + FILE *fd; + fd = freopen(opts->logfile, "a", stderr); + + if (fd == NULL) + { + fprintf(stderr, "error reopening stderr to '%s': %s", + opts->logfile, strerror(errno)); + } } return true; diff --git a/repmgrd.c b/repmgrd.c index 93c52f9f..49fce10d 100644 --- a/repmgrd.c +++ b/repmgrd.c @@ -179,6 +179,7 @@ main(int argc, char **argv) int optindex; int c, ret; bool daemonize = false; + FILE *fd; char standby_version[MAXVERSIONSTR], *ret_ver; @@ -248,8 +249,19 @@ main(int argc, char **argv) terminate(ERR_BAD_CONFIG); } - freopen("/dev/null", "r", stdin); - freopen("/dev/null", "w", stdout); + fd = freopen("/dev/null", "r", stdin); + if (fd == NULL) + { + fprintf(stderr, "error reopening stdin to '/dev/null': %s", + strerror(errno)); + } + + fd = freopen("/dev/null", "w", stdout); + if (fd == NULL) + { + fprintf(stderr, "error reopening stdout to '/dev/null': %s", + strerror(errno)); + } logger_init(&local_options, progname, local_options.loglevel, local_options.logfacility); if (verbose) @@ -257,7 +269,13 @@ main(int argc, char **argv) if (log_type == REPMGR_SYSLOG) { - freopen("/dev/null", "w", stderr); + fd = freopen("/dev/null", "w", stderr); + + if (fd == NULL) + { + fprintf(stderr, "error reopening stderr to '/dev/null': %s", + strerror(errno)); + } } snprintf(repmgr_schema, MAXLEN, "%s%s", DEFAULT_REPMGR_SCHEMA_PREFIX, local_options.cluster_name); @@ -365,7 +383,14 @@ main(int argc, char **argv) if (*local_options.logfile) { - freopen(local_options.logfile, "a", stderr); + FILE *fd; + fd = freopen(local_options.logfile, "a", stderr); + if (fd == NULL) + { + fprintf(stderr, "error reopening stderr to '%s': %s", + local_options.logfile, strerror(errno)); + } + } update_registration(); From 98c7635fb5edcbd60c9a9a366853eb75fec68828 Mon Sep 17 00:00:00 2001 From: Christian Kruse Date: Tue, 4 Mar 2014 17:58:36 +0100 Subject: [PATCH 4/6] fixing more compiler warnings --- repmgrd.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/repmgrd.c b/repmgrd.c index 49fce10d..88a883ff 100644 --- a/repmgrd.c +++ b/repmgrd.c @@ -1366,6 +1366,7 @@ do_daemonize() { char *ptr, path[MAXLEN]; pid_t pid = fork(); + int ret; switch (pid) { @@ -1414,7 +1415,12 @@ do_daemonize() *path = '/'; } - chdir(path); + ret = chdir(path); + if (ret != 0) + { + log_err("Error changing directory to '%s': %s", path, + strerror(errno)); + } break; @@ -1430,6 +1436,7 @@ check_and_create_pid_file(const char *pid_file) FILE *fd; char buff[MAXLEN]; pid_t pid; + size_t nread; if (stat(pid_file, &st) != -1) { @@ -1443,7 +1450,14 @@ check_and_create_pid_file(const char *pid_file) exit(ERR_BAD_CONFIG); } - fread(buff, MAXLEN - 1, 1, fd); + nread = fread(buff, MAXLEN - 1, 1, fd); + + if (nread == 0 && ferror(fd)) + { + log_err("Error reading PID file '%s', giving up...\n", pid_file); + exit(ERR_BAD_CONFIG); + } + fclose(fd); pid = atoi(buff); From 7e55ce737dd97111430601405893d72998e4c468 Mon Sep 17 00:00:00 2001 From: Warren Moore Date: Wed, 5 Mar 2014 16:49:56 +0000 Subject: [PATCH 5/6] fix: store the master connection user name on standby follow --- repmgr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/repmgr.c b/repmgr.c index aaf8b4cf..53a35d82 100644 --- a/repmgr.c +++ b/repmgr.c @@ -1494,6 +1494,7 @@ do_standby_follow(void) */ strncpy(runtime_options.host, PQhost(master_conn), MAXLEN); strncpy(runtime_options.masterport, PQport(master_conn), MAXLEN); + strncpy(runtime_options.username, PQuser(master_conn), MAXLEN); PQfinish(master_conn); log_info(_("%s Changing standby's master\n"),progname); From fed5c7765387993ed2f64afbe3f048d1d9a276ef Mon Sep 17 00:00:00 2001 From: Christian Kruse Date: Thu, 6 Mar 2014 15:23:22 +0100 Subject: [PATCH 6/6] various improvements and bugfixes in the init script --- debian/repmgr.repmgrd.default | 14 ++--- debian/repmgr.repmgrd.init | 99 ++++++++++++++++++++++++++--------- 2 files changed, 80 insertions(+), 33 deletions(-) diff --git a/debian/repmgr.repmgrd.default b/debian/repmgr.repmgrd.default index 1eb55921..182a278d 100644 --- a/debian/repmgr.repmgrd.default +++ b/debian/repmgr.repmgrd.default @@ -1,4 +1,3 @@ -#!/bin/sh # default settings for repmgrd. This file is source by /bin/sh from # /etc/init.d/repmgrd @@ -6,13 +5,14 @@ # valid values: yes/no REPMGRD_ENABLED=no -# Options for repmgrd -REPMGRD_OPTS="" +# Options for repmgrd (required) +#REPMGRD_OPTS="--config_file /path/to/repmgr.conf" + +# User to run repmgrd as +#REPMGRD_USER=postgres # repmgrd binary -REPMGR_BIN="/usr/bin/repmgr" +#REPMGR_BIN=/usr/bin/repmgr # pid file -REPMGR_PIDFILE="/var/run/repmgrd.pid" - - +#REPMGR_PIDFILE=/var/run/repmgrd.pid diff --git a/debian/repmgr.repmgrd.init b/debian/repmgr.repmgrd.init index 2473c2c9..bf7eb73b 100644 --- a/debian/repmgr.repmgrd.init +++ b/debian/repmgr.repmgrd.init @@ -1,53 +1,100 @@ #!/bin/sh ### BEGIN INIT INFO # Provides: repmgrd -# Required-Start: $local_fs $remote_fs $network $syslog $postgresql -# Required-Stop: $local_fs $remote_fs $network $syslog $postgresql -# Should-Start: $syslog $postgresql -# Should-Start: $syslog $postgresql +# Required-Start: $local_fs $remote_fs $network $syslog postgresql +# Required-Stop: $local_fs $remote_fs $network $syslog postgresql +# Should-Start: $syslog postgresql # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop repmgrd +# Description: Enable repmgrd replication management and monitoring daemon for PostgreSQL ### END INIT INFO set -e -if test -f /etc/default/repmgrd; then - . /etc/default/repmgrd -fi +DESC="PostgreSQL replication management and monitoring daemon" +NAME=repmgrd -if [ -z "$REPMGRD_BIN" ]; then - REPMGRD_BIN="/usr/bin/repmgrd" -fi +REPMGRD_ENABLED=no +REPMGRD_OPTS= +REPMGRD_USER=postgres +REPMGRD_BIN=/usr/bin/repmgrd +REPMGRD_PIDFILE=/var/run/repmgrd.pid -if [ -z "$REPMGRD_PIDFILE" ]; then - REPMGRD_PIDFILE="/var/run/repmgrd.pid" -fi +# Read configuration variable file if it is present +[ -r /etc/default/$NAME ] && . /etc/default/$NAME test -x $REPMGRD_BIN || exit 0 -case "$REPMGRD_ENABLE" in - [Nn]*) +case "$REPMGRD_ENABLED" in + [Yy]*) + break + ;; + *) exit 0 ;; esac +# Define LSB log_* functions. +. /lib/lsb/init-functions + +if [ -z "$REPMGRD_OPTS" ] +then + log_warning_msg "Not starting $NAME, REPMGRD_OPTS not set in /etc/default/$NAME" + exit 0 +fi + +do_start() +{ + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # other if daemon could not be started or a failure occured + start-stop-daemon --start --quiet --chuid $REPMGRD_USER --make-pidfile --pidfile $REPMGRD_PIDFILE --exec $REPMGRD_BIN -- $REPMGRD_OPTS +} + +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # other if daemon could not be stopped or a failure occurred + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $REPMGRD_PIDFILE --exec $REPMGRD_BIN +} + case "$1" in - start) - start-stop-daemon --start --quiet --make-pidfile --pidfile $REPMGRD_PIDFILE --exec $REPMGRD_BIN $REPMGRD_OPTS - ;; + start) + log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_progress_msg "already started" + log_end_msg 0 ;; + *) log_end_msg 1 ;; + esac - stop) - start-stop-daemon --stop --oknodo --quiet --pidfile $REPMGRD_PIDFILE ;; + stop) + log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0) log_end_msg 0 ;; + 1) log_progress_msg "already stopped" + log_end_msg 0 ;; + *) log_end_msg 1 ;; + esac - restart) - $0 stop && $0 start || exit 1 ;; - - *) - echo "Usage: $0 {start|stop|restart}" - exit 1 + restart|force-reload) + $0 stop + $0 start + ;; + status) + status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $? + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2 + exit 3 ;; esac