diff options
Diffstat (limited to 'heartbeat/pgagent')
-rwxr-xr-x | heartbeat/pgagent | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/heartbeat/pgagent b/heartbeat/pgagent new file mode 100755 index 0000000..b1e61b3 --- /dev/null +++ b/heartbeat/pgagent @@ -0,0 +1,139 @@ +#!/bin/sh +# +# High-Availability pgagent OCF resource agent +# +# Description: Starts/stops pgagent +# Author: Oleg Selin +# License: GNU General Public License (GPL) +# +# OCF parameters: +# OCF_RESKEY_connection_string +# OCF_RESKEY_user +# OCF_RESKEY_options +# +####################################################################### +# Initialization: +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +OCF_RESKEY_executable_default="`which pgagent`" +OCF_RESKEY_connection_string_default="user=postgres host=/var/run/postgresql" +OCF_RESKEY_user_default="postgres" +OCF_RESKEY_options_default="-r 1 -t 1" + +: ${OCF_RESKEY_executable="${OCF_RESKEY_executable_default}"} +: ${OCF_RESKEY_connection_string="${OCF_RESKEY_connection_string_default}"} +: ${OCF_RESKEY_user="${OCF_RESKEY_user_default}"} +: ${OCF_RESKEY_options="${OCF_RESKEY_options_default}"} + +pgagent_validate_all() { + check_binary pgagent + ocf_log debug "executable: '$OCF_RESKEY_executable'" + ocf_log debug "connection string: '$OCF_RESKEY_connection_string'" + ocf_log debug "user: '$OCF_RESKEY_user'" + ocf_log debug "options: '$OCF_RESKEY_options'" + if [ -z "$OCF_RESKEY_connection_string" ]; then + ocf_log err "Connection string is not configured!" + exit $OCF_ERR_CONFIGURED + fi + if [ -z "$OCF_RESKEY_user" ]; then + ocf_log err "User is not configured!" + exit $OCF_ERR_CONFIGURED + fi + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + if [ ! $? -eq 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist"; + return $OCF_ERR_CONFIGURED; + fi + return $OCF_SUCCESS +} + +pgagent_start() { + pgagent_validate_all + nohup su - $OCF_RESKEY_user -c "'$OCF_RESKEY_executable' $OCF_RESKEY_options '$OCF_RESKEY_connection_string'" > /dev/null 2>&1 & + sleep 1 + if pgagent_monitor; then + return $OCF_SUCCESS + fi + return $OCF_ERR_GENERIC +} + +pgagent_stop() { + pgagent_validate_all + pid=`pgrep -f -x -U $OCF_RESKEY_user "$OCF_RESKEY_executable $OCF_RESKEY_options $OCF_RESKEY_connection_string"` + if [ -n "$pid" ]; then + ocf_run kill $pid || return $OCF_ERR_GENERIC + fi + return $OCF_SUCCESS +} + +pgagent_monitor() { + if [ -z "$OCF_RESKEY_executable" ]; then + return $OCF_ERR_INSTALLED + fi + ocf_run pgrep -f -x -U "$OCF_RESKEY_user" "$OCF_RESKEY_executable $OCF_RESKEY_options $OCF_RESKEY_connection_string" || return $OCF_NOT_RUNNING + return $OCF_SUCCESS +} + +meta_data() { + cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="pgagent" version="1.0"> +<version>1.0</version> +<longdesc lang="en">This is a pgagent Resource Agent.</longdesc> +<shortdesc lang="en">Controls pgagent</shortdesc> +<parameters> +<parameter name="connection_string"> +<longdesc lang="en">Connection string for pgagent.</longdesc> +<shortdesc lang="en">pgagent connection string</shortdesc> +<content type="string" default="$OCF_RESKEY_connection_string_default" /> +</parameter> +<parameter name="user"> +<longdesc lang="en">User to run pgagent as.</longdesc> +<shortdesc lang="en">User to run pgagent</shortdesc> +<content type="string" default="$OCF_RESKEY_user_default" /> +</parameter> +<parameter name="options"> +<longdesc lang="en">Options for pgagent.</longdesc> +<shortdesc lang="en">pgagent run options, see pgagent --help for details</shortdesc> +<content type="string" default="$OCF_RESKEY_options_default" /> +</parameter> +</parameters> +<actions> +<action name="start" timeout="5s" /> +<action name="stop" timeout="5s" /> +<action name="monitor" timeout="20s" interval="10s" depth="0" /> +<action name="meta-data" timeout="5s" /> +<action name="validate-all" timeout="5s" /> +</actions> +</resource-agent> +END +} + +pgagent_usage() { + cat <<END +usage: $0 {start|stop|monitor|meta-data|validate-all} + +Expects to have a fully populated OCF RA-compliant environment set. +END +} + +case $__OCF_ACTION in +start) pgagent_start;; +stop) pgagent_stop;; +monitor) pgagent_monitor;; +validate-all) pgagent_validate_all;; +usage|help) pgagent_usage + exit $OCF_SUCCESS + ;; +meta-data) meta_data + exit $OCF_SUCCESS + ;; +*) pgagent_usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac +rc=$? +ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc" +exit $rc |