Cdiff functions.ksh
*** /workspace/du105637/oscposthot/webrev/usr/src/cmd/ha-services/gds-agents/PostgreSQL/functions.ksh- Tue Apr 22 05:14:55 2008
--- functions.ksh Tue Apr 22 04:42:23 2008
*** 18,32 ****
#
# CDDL HEADER END
#
#
! # Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
! #ident "%Z%%M% %I% %E% SMI"
PKG=SUNWscPostgreSQL
METHOD=`basename $0`
TASK_COMMAND=""
--- 18,32 ----
#
# CDDL HEADER END
#
#
! # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
! # ident "%Z%%M% %I% %E% SMI"
PKG=SUNWscPostgreSQL
METHOD=`basename $0`
TASK_COMMAND=""
*** 55,64 ****
--- 55,72 ----
ZLOGIN=/usr/sbin/zlogin
TEST=/usr/bin/test
PING=/usr/sbin/ping
SED=/usr/bin/sed
IFCONFIG=/usr/sbin/ifconfig
+ SSH=/usr/bin/ssh
+ SSH_AGENT=/usr/bin/ssh-agent
+ PKILL=/usr/bin/pkill
+ WC=/usr/bin/wc
+ SLEEP=/usr/bin/sleep
+ TOUCH=/usr/bin/touch
+ CHOWN=/usr/bin/chown
+ CP=/usr/bin/cp
get_fmri_parameters ()
{
# extract the smf properties, you need to call your agent commands
*** 257,266 ****
--- 265,311 ----
SCUSER=${SCUSER}
SCTABLE=${SCTABLE}
SCPASS=${SCPASS}
NOCONRET=${NOCONRET}
+ # The following parameters need to be configured only if logfile shipping is configured to ship
+ # the PosgreSQL WAL logs between a designated primary and a designated standby resource.
+ # They need to be configured only on the primary.
+
+ # STDBY_RS The resource name of the PostgreSQL standby resource.
+ # STDBY_RG The resource group name of the PostgreSQL standby resource group.
+ # STDBY_USER User which is the owner of the standby postgres database.
+ # STDBY_HOST Resolvable name of the standby host or the standby zone,
+ # this name has to be reachable via ssh.
+ # STDBY_PARFILE The standbys postgres parameter file to get the rest of the necessary parameters.
+ # STDBY_PING The number of of packets the primary uses to ping the standby host. If this variable is
+ # empty, it will be set to 5 packets.
+ # ROLECHG_RS The rolechangers resource name.
+ # SSH_PASSDIR A directory where the ssh passphrase is stored in a the file <resourcename>-phrase.
+ # This parameter is needed only if you configured WAL file shipping and secured your
+ # ssh key with a passphrase.
+ # Leave it undefined if the passprase is empty.
+ #
+ # If you configure the logfile shipping in a shared nothing topology, do not set the LH parameter.
+ #
+ # Configure the following paramters on the primary host.
+
+ STDBY_RS=${STDBY_RS}
+ STDBY_RG=${STDBY_RG}
+ STDBY_USER=${STDBY_USER}
+ STDBY_HOST=${STDBY_HOST}
+ STDBY_PARFILE=${STDBY_PARFILE}
+ STDBY_PING=${STDBY_PING}
+ #
+ # Configure the following paramter on the standby host.
+ #
+ ROLECHG_RS=${ROLECHG_RS}
+ #
+ # Configure the following parameter on both hosts.
+ #
+ SSH_PASSDIR=${SSH_PASSDIR}
+
EOF
if [ $? -ne 0 ]
then
${ECHO} "ERROR: could not create the temporary parameter file ${pfile_tmp}"
return 1
*** 835,844 ****
--- 880,978 ----
else
debug_message "Function: validate - NOCONRET OK"
fi
fi
fi;;
+
+ STDBY_HOST)
+
+ # Test the standby host variable and the neccessary other variables if the standby
+ # host variable is not set.
+
+ if [ -n "${STDBY_HOST}" ]; then
+ if ! ${GETENT} hosts ${STDBY_HOST} >/dev/null 2>&1
+ then
+
+ # SCMSGS
+ # @explanation
+ # The host specified in the STDBY_HOST variable is not
+ # resolvable.
+ # @user_action
+ # Add the host to one of your configured name services,
+ # so it can get listed with getent.
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "Function: validate - The standby host %s is not resolvable" \
+ "${STDBY_HOST}"
+ rc_validate=1
+
+ else
+ debug_message "Function: validate - STDBY_HOST resolvable"
+ fi
+
+ # Test if all the other standby related variables are set.
+ # There will be no other validation, because it may be that the necessary
+ # resources are not up right now, and then the validation will fail without
+ # a valid reason which is related to the parameter configuration.
+
+ if [ -z "${STDBY_RS}" ]
+ then
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "Function: validate: The %s variable is not set, but it is required" \
+ "STDBY_RS"
+ rc_validate=1
+ else
+ debug_message "Function: validate - STDBY_RS OK"
+ fi
+
+ if [ -z "${STDBY_RG}" ]
+ then
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "Function: validate: The %s variable is not set, but it is required" \
+ "STDBY_RG"
+ rc_validate=1
+ else
+ debug_message "Function: validate - STDBY_RG OK"
+ fi
+
+ if [ -z "${STDBY_USER}" ]
+ then
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "Function: validate: The %s variable is not set, but it is required" \
+ "STDBY_USER"
+ rc_validate=1
+ else
+ debug_message "Function: validate - STDBY_USER OK"
+ fi
+
+ if [ -z "${STDBY_PARFILE}" ]
+ then
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "Function: validate: The %s variable is not set, but it is required" \
+ "STDBY_PARFILE"
+ rc_validate=1
+ else
+ debug_message "Function: validate - STDBY_PARFILE OK"
+ fi
+
+ if [ -n "${STDBY_PING}" ]
+ then
+ if ! let x=${STDBY_PING} >/dev/null 2>&1
+ then
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "Function: validate: The STDBY_PING value of %s is not numeric" \
+ "${STDBY_PING}"
+ rc_validate=1
+ else
+ debug_message "Function: validate - STDBY_PING OK"
+ fi
+ else
+ # set a default of 5 packets
+ STDBY_PING=5
+ debug_message "Function: validate - STDBY_PING OK, it was set to 5 packets"
+ fi
+
+ fi;;
esac
done
debug_message "Function: validate - End"
return ${rc_validate}
*** 1102,1111 ****
--- 1236,1246 ----
# Start PostgreSQL
#
debug_message "Function: start_pgs - Begin"
${SET_DEBUG}
+ SECONDS=0
# construct the necessary redirection and source variables
set_shell_specifics
*** 1132,1151 ****
# remove the logfile, before creating it to survive potential noclobber settings
${RM} ${LOGFILE} 2>/dev/null
! #
# Start PostgreSql, the postmaster searches for databases in the directory of the PGDATA variable,
# and it will listen on the port of the PGORT varaible. The logfile will be stored in the file name
# contained in the PGLOGFILE variable.
# The postmaster is started via the pg_ctl utility.
#
if [ -z "${SMF_FMRI}" ]
then
! ${SU} - ${USER} -c " ${ENVSC} ${TASK_COMMAND} ${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl start -l ${PGLOGFILE} ${OUTPUT}" > /dev/null
rc_start_command=$?
else
# start under the right user in an smf manifest you source a ksh script, regardless of the users login shell
--- 1267,1390 ----
# remove the logfile, before creating it to survive potential noclobber settings
${RM} ${LOGFILE} 2>/dev/null
! do_start=0
!
! # start an ssh-agent and store the decrypted private key if SSH_PASSDIR is configured
!
!
! if [ -n "${SSH_PASSDIR}" ]
! then
!
! ${CP} -p ${SSH_PASSDIR}/${RESOURCE}-phrase /tmp/${RESOURCE}-phrase
!
! if [ -z "${SMF_FMRI}" ]
! then
! ${CHOWN} ${USER} /tmp/${RESOURCE}-phrase
! ${SU} ${USER} -c " ${TASK_COMMAND} ${MYDIR}/${MYNAME} -R ${RESOURCE} -G ${RESOURCEGROUP} -P ${PARFILE} start_ssh_agent "> /dev/null 2>&1
! if [ ${?} -ne 0 ]
! then
! do_start=1
! fi
! else
! ${MYDIR}/${MYNAME} -R ${RESOURCE} -G ${RESOURCEGROUP} -P ${PARFILE} start_ssh_agent > /dev/null 2>&1
! if [ ${?} -ne 0 ]
! then
! do_start=1
! fi
! fi
!
! ${RM} /tmp/${RESOURCE}-phrase
!
!
! # store the SSH_AUTH_SOCK value in the SOCK variable
!
! SOCK=
! if [ ${do_start} -eq 0 ]
! then
! SOCK=`${GREP} SSH_AUTH_SOCK /tmp/${RESOURCE}-ssh`
! SOCK="${ENV} ${SOCK}"
! fi
! fi
!
! # If a standby host is configured, check if the standby host is available and configured/acting
! # as a standby. If everything is ok continue with the startup. If not, do not start the PostgreSQL
! # resource.
!
! if [ -n "${STDBY_HOST}" ] && [ ${do_start} -eq 0 ]
! then
!
! if ${PING} ${STDBY_HOST} ${STDBY_PING} >/dev/null 2>&1
! then
! debug_message "Function: start_pgs - the host ${STDBY_HOST} is accessible"
!
! # As the PostgreSQL user perform a check on the standby host, to determine if it
! # is configured as a primary, it runs as a primary, or it runs as a standby database.
!
! if [ -z "${SMF_FMRI}" ]
! then
!
! ${SU} ${USER} -c " ${TASK_COMMAND} ${SOCK} ${SSH} ${STDBY_USER}@${STDBY_HOST} ${MYDIR}/${MYNAME} -R ${STDBY_RS} -G ${STDBY_RG} -P ${STDBY_PARFILE} check_stdby "> /dev/null 2>&1
! if [ ${?} -ne 0 ]
! then
! do_start=1
! fi
! else
! ${SOCK} ${SSH} ${STDBY_USER}@${STDBY_HOST} ${MYDIR}/${MYNAME} -R ${STDBY_RS} -G ${STDBY_RG} -P ${STDBY_PARFILE} check_stdby ${OUTPUT} >/dev/null 2>&1
! if [ ${?} -ne 0 ]
! then
! do_start=1
! fi
!
! fi
! if [ $do_start -ne 0 ]
! then
! # SCMSGS
! # @explanation
! # The PostgreSQL resource on the standby host is not
! # configured as a standby or acting as a primary.
! # @user_action
! # Consult the logs on the standby host and insure, that
! # the standby host is configured as a standby database,
! # if it is running as a primary, reconfigure and restart it.
! scds_syslog -p daemon.err -t $(syslog_tag) -m \
! "Function: start_pgs - resource %s on host %s is not configured/running as a standby database" \
! "${STDBY_RS}" "${STDBY_HOST}"
! else
! debug_message "Function: start_pgs - the resource ${STDBY_RS} on host ${STDBY_HOST} is configured/running as a standby database"
! fi
!
! else
! # SCMSGS
! # @explanation
! # The standby host is not up and running.
! # @user_action
! # Consult the logs on the standby host and insure, that
! # the standby host is answering on ping requests of the primary host.
! scds_syslog -p daemon.err -t $(syslog_tag) -m \
! "Function: start_pgs - the standby host %s is not answering on ping" \
! "${STDBY_HOST}"
! do_start=1
! fi
! fi
!
! # continue on the start process
!
! if [ ${do_start} -eq 0 ]
! then
!
# Start PostgreSql, the postmaster searches for databases in the directory of the PGDATA variable,
# and it will listen on the port of the PGORT varaible. The logfile will be stored in the file name
# contained in the PGLOGFILE variable.
# The postmaster is started via the pg_ctl utility.
#
if [ -z "${SMF_FMRI}" ]
then
! ${SU} ${USER} -c " ${ENVSC} ${TASK_COMMAND} ${SOCK} ${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl start -l ${PGLOGFILE} ${OUTPUT}" > /dev/null
rc_start_command=$?
else
# start under the right user in an smf manifest you source a ksh script, regardless of the users login shell
*** 1152,1165 ****
if [ -n "${ENVSCRIPT}" ]
then
. ${ENVSCRIPT}
fi
! ${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl start -l ${PGLOGFILE} >${LOGFILE} 2>&1
rc_start_command=$?
fi
debug_message "Function: start_pgs - End"
return ${rc_start_command}
}
stop_pgs()
--- 1391,1444 ----
if [ -n "${ENVSCRIPT}" ]
then
. ${ENVSCRIPT}
fi
! ${SOCK} ${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl start -l ${PGLOGFILE} >${LOGFILE} 2>&1
rc_start_command=$?
fi
+ # if an ssh-agent was started, remember the postmaster pid in /tmp/${RESOURCE}-pid
+
+ if [ -n "${SOCK}" ] && [ ${rc_start_command} -eq 0 ]
+ then
+ START_TIMEOUT=`${SCHA_RESOURCE_GET} -O START_TIMEOUT -R ${RESOURCE} -G ${RESOURCEGROUP}`
+ MAX_START=`expr ${START_TIMEOUT} \* 70 \/ 100`
+
+ # give PostgreSQL a chance to construct the ${PGDATA}/postmaster pid, it is
+ # done asynchronously
+
+ PID_LINES=0
+ while [ ${SECONDS} -lt ${MAX_START} ] && [ ${PID_LINES} -eq 0 ]
+ do
+ if [ -f ${PGDATA}/postmaster.pid ]
+ then
+ PID_LINES=`${WC} -l ${PGDATA}/postmaster.pid|${AWK} '{print $1}'`
+ fi
+ ${SLEEP} 2
+ done
+
+ ${RM} /tmp/${RESOURCE}-pid 2>/dev/null
+ ${HEAD} -1 ${PGDATA}/postmaster.pid >/tmp/${RESOURCE}-pid
+ fi
+ else
+ rc_start_command=1
+
+ # disable the pmf tag and run a sleep in the background, to assure, that there will be a valid pmftag during the start phase
+
+ START_TIMEOUT=`${SCHA_RESOURCE_GET} -O START_TIMEOUT -R ${RESOURCE} -G ${RESOURCEGROUP}`
+ sleep ${START_TIMEOUT} &
+ ${PMFADM} -s ${RESOURCEGROUP},${RESOURCE},0.svc
+
+ # As a workaround until RFE 6629606 is implemented, kill the gds_svc start method
+ # to speed up the transition into START_FAILED.
+ # If gds_svc_start gets killed the resource transition into START_FAILED and does not
+ # wait until the start_timeout expires.
+
+ ${PKILL} -u root -f "gds_svc_start .*-R ${RESOURCE} " >/dev/null
+ fi
+
debug_message "Function: start_pgs - End"
return ${rc_start_command}
}
stop_pgs()
*** 1213,1223 ****
"stop_pgs: Stop PostgreSQL with the option %s " \
"fast"
if [ -z "${SMF_FMRI}" ]
then
! ${SU} - ${USER} -c " ${ENVSC} ${TASK_COMMAND} ${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl stop -m fast ${OUTPUT}" > /dev/null
rc_stop_command=$?
else
# stop under the right user in a smf manifest
--- 1492,1502 ----
"stop_pgs: Stop PostgreSQL with the option %s " \
"fast"
if [ -z "${SMF_FMRI}" ]
then
! ${SU} ${USER} -c " ${ENVSC} ${TASK_COMMAND} ${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl stop -m fast ${OUTPUT}" > /dev/null
rc_stop_command=$?
else
# stop under the right user in a smf manifest
*** 1230,1251 ****
rc_stop_command=$?
fi
# Determine if postgres is really stopped, if not perform an immediate shutdown.
# The server is specified by the triple user, PGPORT and the PGDATA variable.
! # The immediate shutdown stop the server processes without disconnecting the clients.
if ${PS} -u ${USER} -o pid,ppid |${GREP} -w ${pgrspid}>/dev/null
then
scds_syslog -p daemon.notice -t $(syslog_tag) -m \
"stop_pgs: Stop PostgreSQL with the option %s " \
"immediate"
if [ -z "${SMF_FMRI}" ]
then
! ${SU} - ${USER} -c "${ENVSC} ${TASK_COMMAND} ${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl stop -m immediate ${OUTPUT_APP}" > /dev/null
rc_stop_command=$?
else
# stop under the right user in a smf manifest
--- 1509,1535 ----
rc_stop_command=$?
fi
# Determine if postgres is really stopped, if not perform an immediate shutdown.
# The server is specified by the triple user, PGPORT and the PGDATA variable.
! # The immediate shutdown stops the server processes without disconnecting the clients.
! # The immediate shutdown will be performd only, if the postgres database is not configured as
! # a standby database, because then an immediate shutdown will not succeed in a standby configuration.
+
+ if [ ! -f ${PGDATA}/recovery.conf ]
+ then
if ${PS} -u ${USER} -o pid,ppid |${GREP} -w ${pgrspid}>/dev/null
then
scds_syslog -p daemon.notice -t $(syslog_tag) -m \
"stop_pgs: Stop PostgreSQL with the option %s " \
"immediate"
if [ -z "${SMF_FMRI}" ]
then
! ${SU} ${USER} -c "${ENVSC} ${TASK_COMMAND} ${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl stop -m immediate ${OUTPUT_APP}" > /dev/null
rc_stop_command=$?
else
# stop under the right user in a smf manifest
*** 1256,1265 ****
--- 1540,1552 ----
${LIBPATH} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/pg_ctl stop -m immediate >>${LOGFILE} 2>&1
rc_stop_command=$?
fi
fi
+ else
+ debug_message "Function: stop_pgs - It is a standby database, do not stop with immediate"
+ fi
# determine if postgres is really stopped, if not kill the parent of the postmaster with -9
if ${PS} -u ${USER} -o pid,ppid |${GREP} -w ${pgrspid}>/dev/null
then
*** 1275,1284 ****
--- 1562,1616 ----
${KILL} -9 ${pgrspid}
rc_stop_command=$?
fi
+ if [ -n "${SSH_PASSDIR}" ]
+ then
+ # stop the ssh-agent
+
+ SSH_PID=
+ if [ -f /tmp/${RESOURCE}-ssh ]
+ then
+ debug_message "Function: stop_pgs - stop the ssh agent"
+
+ # source /tmp/${RESOURCE}-ssh to get the variable SSH_AGENT_PID
+
+ . /tmp/${RESOURCE}-ssh
+
+ SSH_PID="${ENV} SSH_AGENT_PID=${SSH_AGENT_PID}"
+
+ if [ -z "${SMF_FMRI}" ]
+ then
+ ${SU} ${USER} -c "${TASK_COMMAND} ${SSH_PID} ${SSH_AGENT} -k ${OUTPUT_APP}"
+ rc_stop_command=$?
+ else
+ ${SSH_PID} ${SSH_AGENT} -k >>${LOGFILE}
+ rc_stop_command=$?
+ fi
+
+ # if the ssh-agent process is still there, kill it with -9
+
+ if ${PS} -p ${SSH_AGENT_PID} >/dev/null 2>&1
+ then
+ debug_message "Function: stop_pgs - The ssh-agent ${SSH_AGENT_PID} survived his stop request, kill it with -9"
+ ${KILL} -9 ${SSH_AGENT_PID}
+ fi
+ else
+ # SCMSGS
+ # @explanation
+ # It can not be determined which ssh agent is working for the user/database,
+ # it is now killed by PMF using the configured stop signal.
+ # @user_action
+ # None
+ scds_syslog -p daemon.notice -t $(syslog_tag) -m \
+ "stop_pgs: Allow pmf to stop the remaining ssh-agent for the user %s" \
+ "${USER}"
+ fi
+
+ fi
+
debug_message "Function: stop_pgs - End"
return ${rc_stop_command}
}
check_pgs()
*** 1300,1309 ****
--- 1632,1658 ----
# The Project will be derived according to the call method,
# either from the smf service or from the cluster resource / resource group
srm_function ${USER}
+ # determine the parent postmaster pid
+
+ pgrspid=""
+ if [ -f ${PGDATA}/postmaster.pid ]
+ then
+ pgrspid=`${HEAD} -1 ${PGDATA}/postmaster.pid`
+ else
+
+ # the pid store is created only if a ssh passphrase is defined
+ # in this case get the pid from /tmp/${RESOURCE}-pid
+
+ if [ -n "${SSH_PASSDIR}" ]
+ then
+ pgrspid=`${CAT} /tmp/${RESOURCE}-pid`
+ fi
+ fi
+
# Determine if the gds start process is already completed, or the database start is far enough to allow connections
# The criteria is the existence of the postmaster.pid file in the PGDATA directory.
# As long as the GDS start is not complete, probe error messages will be suppressed.
wait_for_online=0
*** 1311,1323 ****
${PGREP} -u root -f "gds_svc_start .*-R ${RESOURCE} " >/dev/null
if [ ${?} -eq 0 ]
then
debug_message "Function: check_pgs - wait for online detected"
wait_for_online=1
! if [ -f ${PGDATA}/postmaster.pid ]
then
- pgrspid=`${HEAD} -1 ${PGDATA}/postmaster.pid`
if ! ${PS} -u ${USER} -o pid,ppid |${GREP} -w ${pgrspid}>/dev/null
then
debug_message "Function: check_pgs - wait for online detected, postmaster is not running"
rc_check_command=100
else
--- 1660,1671 ----
${PGREP} -u root -f "gds_svc_start .*-R ${RESOURCE} " >/dev/null
if [ ${?} -eq 0 ]
then
debug_message "Function: check_pgs - wait for online detected"
wait_for_online=1
! if [ -n "${pgrspid}" ]
then
if ! ${PS} -u ${USER} -o pid,ppid |${GREP} -w ${pgrspid}>/dev/null
then
debug_message "Function: check_pgs - wait for online detected, postmaster is not running"
rc_check_command=100
else
*** 1327,1338 ****
debug_message "Function: check_pgs - wait for online detected, postmaster pid file ${PGDATA}/postmaster.pid not found"
rc_check_command=100
fi
fi
! if [ ${rc_check_command} -ne 0 ]
then
debug_message "Function: check_pgs - End"
return ${rc_check_command}
fi
# construct the necessary environment variables
--- 1675,1755 ----
debug_message "Function: check_pgs - wait for online detected, postmaster pid file ${PGDATA}/postmaster.pid not found"
rc_check_command=100
fi
fi
! # If a passphrase is defined a ssh agent is running together with the PostgreSQL deamon
! # each of the daemons satisfies pmf/smf, so we have to check manually for the processes to run.
! # If either the ssh-agent or the PostgreSQL daemons are not running, exit with 100.
! # This has to be done, because pmf/smf will not trigger a restart if only one of the process trees are gone.
!
! if [ -n "${SSH_PASSDIR}" ] && [ -n "${pgrspid}" ]
then
+
+ if ! ${PS} -u ${USER} -o pid,ppid |${GREP} -w ${pgrspid}>/dev/null
+ then
+ # SCMSGS
+ # @explanation
+ # The PostgreSQL process is not running.
+ # @user_action
+ # None
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "check_pgs: The PostgreSQL process %s is not running" \
+ "${pgrspid}"
+ rc_check_command=100
+ return ${rc_check_command}
+
+ fi
+
+ # Determine if the necessary ssh-agent is running. If PostgreSQL is running
+ # without the ssh-agent, the replication is not working, so we have to return 100
+
+ if [ -f /tmp/${RESOURCE}-ssh ]
+ then
+
+ sshpid=`${GREP} SSH_AGENT_PID /tmp/${RESOURCE}-ssh|${AWK} -F= '{print $2}'`
+ if ! ${PS} -u ${USER} -o pid,ppid |${GREP} -w ${sshpid}>/dev/null
+ then
+ # SCMSGS
+ # @explanation
+ # The ssh-agent process associated with the PostgreSQL database
+ # is not running.
+ # @user_action
+ # None
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "check_pgs: The ssh-agent process %s is not running" \
+ "${sshpid}"
+ rc_check_command=100
+ return ${rc_check_command}
+ fi
+
+ else
+
+ # SCMSGS
+ # @explanation
+ # The file /tmp/<resourcename>-ssh containing the necessary information to manage
+ # the ssh-agent together with the PostgreSQL database is unavailable.
+ # @user_action
+ # None
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "check_pgs: The ssh-agent information file %s is unavailable" \
+ "/tmp/${RESOURCE}-ssh"
+ rc_check_command=100
+ return ${rc_check_command}
+
+ fi
+
+ fi
+
+ # If there is no postmaster.pid during wait for online, or the database will not
+ # accept updates, because it is configured as a standby database, terminate the probe.
+ # To trigger an early exit of the probe, it is enough, that a recover.conf exists in $PGDATA.
+ # So effectively the agent relies on process monitoring if a database is configured as a standby database.
+
+
+ if [ ${rc_check_command} -ne 0 ] || [ -f ${PGDATA}/recovery.conf ]
+ then
debug_message "Function: check_pgs - End"
return ${rc_check_command}
fi
# construct the necessary environment variables
*** 1374,1384 ****
# check if the catalog of the postgres database is accessible
debug_message "Function: check_pgs - check if the database catalog is accessible with ${SCDB} "
! ${SU} - ${USER} -c "${OPEN_BRACKET} ${TASK_COMMAND} ${LIBPATH} $HOST ${PASSWORD} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/psql -d ${SCDB} -U ${SCUSER} -c \"${DBCAT}\" ${CAT_OUTPUT} ${CLOSE_BRACKET} ${CAT_ERRPUT} " >/dev/null
rc_check_command=$?
# Return ${NOCONRET} if the connect fails, otherwise proceed with the check
if [ ${rc_check_command} -ne 0 ]
--- 1791,1801 ----
# check if the catalog of the postgres database is accessible
debug_message "Function: check_pgs - check if the database catalog is accessible with ${SCDB} "
! ${SU} ${USER} -c "${OPEN_BRACKET} ${TASK_COMMAND} ${LIBPATH} $HOST ${PASSWORD} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/psql -d ${SCDB} -U ${SCUSER} -c \"${DBCAT}\" ${CAT_OUTPUT} ${CLOSE_BRACKET} ${CAT_ERRPUT} " >/dev/null
rc_check_command=$?
# Return ${NOCONRET} if the connect fails, otherwise proceed with the check
if [ ${rc_check_command} -ne 0 ]
*** 1431,1441 ****
if [ ${rc_check_command} -eq 0 ]
then
debug_message "Function: check_pgs - manipulate the table ${SCTABLE}"
! ${SU} - ${USER} -c "${OPEN_BRACKET} ${TASK_COMMAND} ${LIBPATH} $HOST ${PASSWORD} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/psql -d ${SCDB} -U ${SCUSER} -c \"${DBTRUNC};${DBINS};${DBSEL}\" ${TBL_OUTPUT} ${CLOSE_BRACKET} ${TBL_ERRPUT} " >/dev/null
rc_check_command=$?
# Return ${NOCONRET} if the connect fails, otherwise proceed with the check
if [ ${rc_check_command} -ne 0 ]
--- 1848,1858 ----
if [ ${rc_check_command} -eq 0 ]
then
debug_message "Function: check_pgs - manipulate the table ${SCTABLE}"
! ${SU} ${USER} -c "${OPEN_BRACKET} ${TASK_COMMAND} ${LIBPATH} $HOST ${PASSWORD} ${ENV} ${DATA} ${ENV} ${PORT} ${PGROOT}/bin/psql -d ${SCDB} -U ${SCUSER} -c \"${DBTRUNC};${DBINS};${DBSEL}\" ${TBL_OUTPUT} ${CLOSE_BRACKET} ${TBL_ERRPUT} " >/dev/null
rc_check_command=$?
# Return ${NOCONRET} if the connect fails, otherwise proceed with the check
if [ ${rc_check_command} -ne 0 ]
*** 1467,1477 ****
# specified table failed.
# @user_action
# None
scds_syslog -p daemon.err -t $(syslog_tag) -m \
"check_pgs: The test database manipulation failed for database %s, user %s and table %s" \
! "${SCDB}" "${SCUSER}" "$SCTABLE}"
fi
rc_check_command=100
debug_message "Function: check_pgs - manipulation of the table ${SCTABLE} failed"
--- 1884,1894 ----
# specified table failed.
# @user_action
# None
scds_syslog -p daemon.err -t $(syslog_tag) -m \
"check_pgs: The test database manipulation failed for database %s, user %s and table %s" \
! "${SCDB}" "${SCUSER}" "${SCTABLE}"
fi
rc_check_command=100
debug_message "Function: check_pgs - manipulation of the table ${SCTABLE} failed"
*** 1483,1488 ****
--- 1900,1998 ----
fi
fi
debug_message "Function: check_pgs - End"
return ${rc_check_command}
+ }
+
+ check_stdby()
+ {
+ #
+ # Check if the current postgres database is configured or running as a standby database.
+ # This function is called from the start command of the remote host.
+ # The error messages are processed by scds_syslog, and they are transported via
+ # standard out to the remote host.
+ #
+ # This function will generate up to two error messages in the postgres logfile.
+
+ debug_message "Function: check_stdby - Begin"
+ ${SET_DEBUG}
+
+ rc_check_stdby_command=0
+ if [ -f ${PGDATA}/recovery.conf ]
+ then
+
+ # We are running as the PostgreSQL user, so exporting the environment is sufficient.
+
+ export PGPORT
+
+ # The variable PASSWORD is set to the database user login password.
+
+ if [ -n "${SCPASS}" ]
+ then
+ export PGPASSWORD=${SCPASS}
+ fi
+
+ if [ -n "${PGHOST}" ]
+ then
+ export PGHOST
+ fi
+ export PGPORT
+ export LD_LIBRARY_PATH
+
+ # check the database if it accepts inserts
+
+ ${PGROOT}/bin/psql -d ${SCDB} -U ${SCUSER} -c "insert into ${SCTABLE} (sccol) values('standby test');" >/dev/null 2>&1
+ if [ ${?} -eq 0 ]
+ then
+ # SCMSGS
+ # @explanation
+ # The database is running as a primary database, but is configured to be a standby.
+ # @user_action
+ # If you want to start the old primary database, reload the primary and restart
+ # the standby database.
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "check_stdby: The database in %s is not running as a standby database, reload the primary and restart the standby database." \
+ "${PGDATA}"
+ rc_check_stdby_command=1
+
+ else
+
+ # Check if the rolchanger is currently doing his work.
+
+ if [ -f /tmp/${ROLECHG_RS}_rolechg.lck ]
+ then
+
+ # SCMSGS
+ # @explanation
+ # The database is running as a standby database, but is currently reconfigured to run as a primary.
+ # @user_action
+ # If you want to start the old primary database, reload the primary and restart
+ # the standby database.
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "check_stdby: The database in %s is reconfigured to run as a primary database, reload the primary and restart the standby database." \
+ "${PGDATA}"
+ rc_check_stdby_command=1
+ else
+ debug_message "Function: check_stdby - the database in ${PGDATA} is configured or running as a standby database"
+ fi
+
+ fi
+
+ else
+
+ # SCMSGS
+ # @explanation
+ # The database is not configured as a standby database.
+ # @user_action
+ # Create an appropriate recovery.conf command, reload the primary
+ # and restart the standby database.
+ scds_syslog -p daemon.err -t $(syslog_tag) -m \
+ "check_stdby: The database in %s is not configured as a standby database, create the recovery.conf command" \
+ "${PGDATA}"
+ rc_check_stdby_command=1
+
+ fi
+
+ debug_message "Function: check_stdby - End"
+ return ${rc_check_stdby_command}
}