# CTDB_VARDIR is used elsewhere
# shellcheck disable=SC2034
CTDB_VARDIR="/usr/local/var/lib/ctdb"
-ctdb_rundir="/usr/local/var/run/ctdb"
CTDB="${CTDB:-/usr/local/bin/ctdb}"
# Only (and always) override these variables in test code
if [ -z "$CTDB_SCRIPT_VARDIR" ] ; then
- CTDB_SCRIPT_VARDIR="/usr/local/var/lib/ctdb/state"
+ CTDB_SCRIPT_VARDIR="/usr/local/var/lib/ctdb/scripts"
fi
if [ -z "$CTDB_SYS_ETCDIR" ] ; then
#######################################
# pull in a system config file, if any
-rewrite_ctdb_options ()
+load_system_config ()
{
- case "$CTDB_DBDIR" in
- tmpfs|tmpfs:*)
- _opts_defaults="mode=700"
- # Get any extra options specified after colon
- if [ "$CTDB_DBDIR" = "tmpfs" ] ; then
- _opts=""
- else
- _opts="${CTDB_DBDIR#tmpfs:}"
- fi
- # It is OK to repeat mount options - last value wins.
- # CTDB_DBDIR_TMPFS_OPTIONS is used by ctdbd_wrapper
- # shellcheck disable=SC2034
- CTDB_DBDIR_TMPFS_OPTIONS="${_opts_defaults}${_opts:+,}${_opts}"
+ if [ -z "$1" ] ; then
+ return
+ fi
- CTDB_DBDIR="${ctdb_rundir}/CTDB_DBDIR"
- ;;
- *)
- # shellcheck disable=SC2034
- CTDB_DBDIR_TMPFS_OPTIONS=""
- esac
+ if [ -f "${CTDB_SYS_ETCDIR}/sysconfig/$1" ]; then
+ . "${CTDB_SYS_ETCDIR}/sysconfig/$1"
+ elif [ -f "${CTDB_SYS_ETCDIR}/default/$1" ]; then
+ . "${CTDB_SYS_ETCDIR}/default/$1"
+ fi
}
-_loadconfig() {
-
- if [ -z "$1" ] ; then
- foo="${service_config:-${service_name}}"
- if [ -n "$foo" ] ; then
- loadconfig "$foo"
- return
+# load_script_options [ component script ]
+# script is an event script name relative to a component
+# component is currently ignored
+load_script_options ()
+{
+ if [ $# -eq 2 ] ; then
+ _script="$2"
+ elif [ $# -eq 0 ] ; then
+ _script=""
+ else
+ die "usage: load_script_options [ component script ]"
fi
- fi
-
- if [ "$1" != "ctdb" ] ; then
- loadconfig "ctdb"
- fi
- if [ -z "$1" ] ; then
- return
- fi
+ _options="${CTDB_BASE}/script.options"
- if [ -f "${CTDB_SYS_ETCDIR}/sysconfig/$1" ]; then
- . "${CTDB_SYS_ETCDIR}/sysconfig/$1"
- elif [ -f "${CTDB_SYS_ETCDIR}/default/$1" ]; then
- . "${CTDB_SYS_ETCDIR}/default/$1"
- elif [ -f "${CTDB_BASE}/sysconfig/$1" ]; then
- . "${CTDB_BASE}/sysconfig/$1"
- fi
+ if [ -r "$_options" ] ; then
+ . "$_options"
+ fi
- if [ "$1" = "ctdb" ] ; then
- _config="${CTDBD_CONF:-${CTDB_BASE}/ctdbd.conf}"
- if [ -r "$_config" ] ; then
- . "$_config"
+ if [ -n "$_script" ] ; then
+ _s="${CTDB_BASE}/events.d/${_script}"
+ else
+ _s="${0%.script}"
fi
- rewrite_ctdb_options
- fi
-}
+ _options="${_s}.options"
-loadconfig () {
- _loadconfig "$@"
+ if [ -r "$_options" ] ; then
+ . "$_options"
+ fi
}
##############################################################
# determine on what type of system (init style) we are running
detect_init_style()
{
- # only do detection if not already set:
- [ -z "$CTDB_INIT_STYLE" ] || return
+ # only do detection if not already set:
+ if [ -n "$CTDB_INIT_STYLE" ] ; then
+ return
+ fi
- if [ -x /sbin/startproc ]; then
- CTDB_INIT_STYLE="suse"
- elif [ -x /sbin/start-stop-daemon ]; then
- CTDB_INIT_STYLE="debian"
- else
- CTDB_INIT_STYLE="redhat"
- fi
+ if [ -x /sbin/startproc ]; then
+ CTDB_INIT_STYLE="suse"
+ elif [ -x /sbin/start-stop-daemon ]; then
+ CTDB_INIT_STYLE="debian"
+ else
+ CTDB_INIT_STYLE="redhat"
+ fi
}
######################################################
cat "$_ip_addr_file"
}
+# Cached retrieval of database options for use by event scripts.
+#
+# If the variables are already set then they should not be overwritten
+# - this should only happen during event script testing.
+ctdb_get_db_options ()
+{
+ _db_opts_file="${CTDB_SCRIPT_VARDIR}/db_options.cache"
+
+ if [ ! -f "$_db_opts_file" ] ; then
+ {
+ ctdb_translate_option "database" \
+ "volatile database directory" \
+ "CTDB_DBDIR"
+ ctdb_translate_option "database" \
+ "persistent database directory" \
+ "CTDB_DBDIR_PERSISTENT"
+ ctdb_translate_option "database" \
+ "state database directory" \
+ "CTDB_DBDIR_STATE"
+ } >"$_db_opts_file"
+ fi
+
+ . "$_db_opts_file"
+}
+
+ctdb_translate_option ()
+{
+ _section="$1"
+ _opt="$2"
+ _variable="$3"
+
+ # ctdb-config already prints an error if something goes wrong
+ _t=$("${CTDB_HELPER_BINDIR}/ctdb-config" get "$_section" "$_opt") || \
+ exit $?
+ echo "${_variable}=\"${_t}\""
+}
+
######################################################
# wrapper around /proc/ settings to allow them to be hooked
# for testing
# Ensure $service_name is set
assert_service_name ()
{
- [ -n "$service_name" ] || die "INTERNAL ERROR: \$service_name not set"
+ # service_name is set by the event script
+ # shellcheck disable=SC2154
+ [ -n "$service_name" ] || die "INTERNAL ERROR: \$service_name not set"
}
######################################################
# shellcheck disable=SC2034
while read _ip _x ; do
drop_ip "$_ip"
- done <"${CTDB_PUBLIC_ADDRESSES:-${CTDB_BASE}/public_addresses}"
+ done <"${CTDB_BASE}/public_addresses"
}
flush_route_cache ()
########################################################
# Simple counters
-_ctdb_counter_common () {
- _service_name="${1:-${service_name:-${script_name}}}"
- _counter_file="${CTDB_SCRIPT_VARDIR}/failcount/${_service_name}"
- mkdir -p "${_counter_file%/*}" # dirname
+_ctdb_counter_common ()
+{
+ [ $# -le 1 ] || die "usage: _ctdb_counter_common [name]"
+
+ if [ $# -eq 1 ] ; then
+ _counter_name="${1}.failcount"
+ else
+ _counter_name="failcount"
+ fi
+
+ if [ -z "$script_state_dir" ] ; then
+ die "ctdb_counter_* functions need ctdb_setup_state_dir()"
+ fi
+
+ _counter_file="${script_state_dir}/${_counter_name}"
}
# Some code passes an argument
# shellcheck disable=SC2120
########################################################
-ctdb_setup_service_state_dir ()
+# ctdb_setup_state_dir <type> <name>
+# Sets/creates script_state_dir)
+ctdb_setup_state_dir ()
{
- _s="${1:-${service_name}}"
+ [ $# -eq 2 ] || die "usage: ctdb_setup_state_dir <type> <name>"
- _service_state_dir="${CTDB_SCRIPT_VARDIR}/service_state/${_s}"
- mkdir -p "$_service_state_dir" ||
- die "Error creating state dir \"${_service_state_dir}\""
+ _type="$1"
+ _name="$2"
- echo "$_service_state_dir"
+ script_state_dir="${CTDB_SCRIPT_VARDIR}/${_type}/${_name}"
+
+ mkdir -p "$script_state_dir" || \
+ die "Error creating script state dir \"${script_state_dir}\""
}
##################################################################
_ctdb_service_reconfigure_common ()
{
- _d="${CTDB_SCRIPT_VARDIR}/service_status/${service_name}"
- mkdir -p "$_d"
- _ctdb_service_reconfigure_flag="$_d/reconfigure"
+ if [ -z "$script_state_dir" ] ; then
+ die "ctdb_service_*_reconfigure() needs ctdb_setup_state_dir()"
+ fi
+
+ _ctdb_service_reconfigure_flag="${script_state_dir}/need_reconfigure"
}
ctdb_service_needs_reconfigure ()
:
}
-##################################################################
-# Does CTDB manage this service?
-
-ctdb_compat_managed_service ()
-{
- if [ "$1" = "yes" -a "$2" = "$service_name" ] ; then
- CTDB_MANAGED_SERVICES="$CTDB_MANAGED_SERVICES $2"
- fi
-}
-
-is_ctdb_managed_service ()
-{
- assert_service_name
-
- # $t is used just for readability and to allow better accurate
- # matching via leading/trailing spaces
- t=" $CTDB_MANAGED_SERVICES "
-
- # Return 0 if "<space>$service_name<space>" appears in $t
- if [ "${t#* ${service_name} }" != "${t}" ] ; then
- return 0
- fi
-
- # If above didn't match then update $CTDB_MANAGED_SERVICES for
- # backward compatibility and try again.
- ctdb_compat_managed_service "$CTDB_MANAGES_VSFTPD" "vsftpd"
- ctdb_compat_managed_service "$CTDB_MANAGES_SAMBA" "samba"
- ctdb_compat_managed_service "$CTDB_MANAGES_WINBIND" "winbind"
- ctdb_compat_managed_service "$CTDB_MANAGES_HTTPD" "apache2"
- ctdb_compat_managed_service "$CTDB_MANAGES_HTTPD" "httpd"
- ctdb_compat_managed_service "$CTDB_MANAGES_ISCSI" "iscsi"
- ctdb_compat_managed_service "$CTDB_MANAGES_CLAMD" "clamd"
- ctdb_compat_managed_service "$CTDB_MANAGES_NFS" "nfs"
-
- t=" $CTDB_MANAGED_SERVICES "
-
- # Return 0 if "<space>$service_name<space>" appears in $t
- [ "${t#* ${service_name} }" != "${t}" ]
-}
-
# Default service_start() and service_stop() functions.
-
+
# These may be overridden in an eventscript.
service_start ()
{
# load a site local config file
########################################################
-[ -n "$CTDB_RC_LOCAL" -a -x "$CTDB_RC_LOCAL" ] && {
- . "$CTDB_RC_LOCAL"
-}
-
[ -x "${CTDB_BASE}/rc.local" ] && {
. "${CTDB_BASE}/rc.local"
}