diff --git a/debian/repmgr.repmgrd.default b/debian/repmgr.repmgrd.default index bd57bf6a..182a278d 100644 --- a/debian/repmgr.repmgrd.default +++ b/debian/repmgr.repmgrd.default @@ -1,14 +1,18 @@ -#!/bin/sh -# default settings for repmgrd. This file is source by /bin/sh from -# /etc/init.d/repmgrd - -# Options for repmgrd -REPMGRD_OPTS="" - -# repmgrd binary -REPMGR_BIN="/usr/bin/repmgr" - -# pid file -REPMGR_PIDFILE="/var/run/repmgrd.pid" - - +# 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 (required) +#REPMGRD_OPTS="--config_file /path/to/repmgr.conf" + +# User to run repmgrd as +#REPMGRD_USER=postgres + +# 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 11bd2dee..bf7eb73b 100644 --- a/debian/repmgr.repmgrd.init +++ b/debian/repmgr.repmgrd.init @@ -1,48 +1,101 @@ -#!/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 "$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 +# 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 + +DESC="PostgreSQL replication management and monitoring daemon" +NAME=repmgrd + +REPMGRD_ENABLED=no +REPMGRD_OPTS= +REPMGRD_USER=postgres +REPMGRD_BIN=/usr/bin/repmgrd +REPMGRD_PIDFILE=/var/run/repmgrd.pid + +# Read configuration variable file if it is present +[ -r /etc/default/$NAME ] && . /etc/default/$NAME + +test -x $REPMGRD_BIN || exit 0 + +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) + 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) + 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|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 + +exit 0 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/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); diff --git a/repmgrd.c b/repmgrd.c index 93c52f9f..88a883ff 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(); @@ -1341,6 +1366,7 @@ do_daemonize() { char *ptr, path[MAXLEN]; pid_t pid = fork(); + int ret; switch (pid) { @@ -1389,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; @@ -1405,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) { @@ -1418,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);