ctdb: Drop configuration file ctdbd.conf
[samba.git] / ctdb / config / functions
index 68149c6399e0626eac7114b70219fb0b9a7e66c5..30afcdec9623eb23a27073756612cf48f33870cc 100755 (executable)
@@ -11,14 +11,13 @@ export CTDB_BASE
 # 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
@@ -32,67 +31,48 @@ fi
 #######################################
 # 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
 }
 
 ##############################################################
@@ -171,16 +151,18 @@ ctdb_check_args ()
 # 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
 }
 
 ######################################################
@@ -250,6 +232,43 @@ ctdb_get_ip_address ()
     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
@@ -300,7 +319,9 @@ program_stack_traces ()
 # 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"
 }
 
 ######################################################
@@ -592,7 +613,7 @@ drop_all_public_ips ()
        # 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 ()
@@ -697,10 +718,21 @@ interface_monitor ()
 
 ########################################################
 # 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
@@ -723,15 +755,19 @@ ctdb_counter_get () {
 
 ########################################################
 
-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}\""
 }
 
 ##################################################################
@@ -739,9 +775,11 @@ ctdb_setup_service_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 ()
@@ -778,48 +816,8 @@ service_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 ()
 {
@@ -1009,10 +1007,6 @@ update_tickles ()
 # 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"
 }