# Shared init functions used by SysV and systemd init systems build_ctdb_options () { maybe_set () { # If the 2nd arg is null then return - don't set anything. # Else if the 3rd arg is set and it doesn't match the 2nd arg # then return [ -z "$2" -o \( -n "$3" -a "$3" != "$2" \) ] && return val="'$2'" case "$1" in --*) sep="=" ;; -*) sep=" " ;; esac # For these options we're only passing a value-less flag. [ -n "$3" ] && { val="" sep="" } CTDB_OPTIONS="${CTDB_OPTIONS}${CTDB_OPTIONS:+ }${1}${sep}${val}" } [ -z "$CTDB_RECOVERY_LOCK" ] && { echo "No recovery lock specified. Starting CTDB without split brain prevention" } maybe_set "--reclock" "$CTDB_RECOVERY_LOCK" # build up CTDB_OPTIONS variable from optional parameters maybe_set "--logfile" "$CTDB_LOGFILE" maybe_set "--nlist" "$CTDB_NODES" maybe_set "--socket" "$CTDB_SOCKET" maybe_set "--public-addresses" "$CTDB_PUBLIC_ADDRESSES" maybe_set "--public-interface" "$CTDB_PUBLIC_INTERFACE" maybe_set "--dbdir" "$CTDB_DBDIR" maybe_set "--dbdir-persistent" "$CTDB_DBDIR_PERSISTENT" maybe_set "--event-script-dir" "$CTDB_EVENT_SCRIPT_DIR" maybe_set "--transport" "$CTDB_TRANSPORT" maybe_set "-d" "$CTDB_DEBUGLEVEL" maybe_set "--notification-script" "$CTDB_NOTIFY_SCRIPT" maybe_set "--start-as-disabled" "$CTDB_START_AS_DISABLED" "yes" maybe_set "--start-as-stopped " "$CTDB_START_AS_STOPPED" "yes" maybe_set "--no-recmaster" "$CTDB_CAPABILITY_RECMASTER" "no" maybe_set "--no-lmaster" "$CTDB_CAPABILITY_LMASTER" "no" maybe_set "--lvs --single-public-ip" "$CTDB_LVS_PUBLIC_IP" maybe_set "--script-log-level" "$CTDB_SCRIPT_LOG_LEVEL" maybe_set "--log-ringbuf-size" "$CTDB_LOG_RINGBUF_SIZE" maybe_set "--syslog" "$CTDB_SYSLOG" "yes" maybe_set "--max-persistent-check-errors" "$CTDB_MAX_PERSISTENT_CHECK_ERRORS" } check_tdb () { local PDBASE=$1 test x"$TDBTOOL_HAS_CHECK" = x"1" && { # # Note tdbtool always exits with 0 # local OK=`/usr/bin/tdbtool $PDBASE check | grep "Database integrity is OK" | wc -l` test x"$OK" = x"1" || { return 1; } return 0; } /usr/bin/tdbdump $PDBASE >/dev/null 2>/dev/null || { return $?; } return 0; } check_persistent_databases () { PERSISTENT_DB_DIR="${CTDB_DBDIR:-/var/lib/ctdb}/persistent" mkdir -p $PERSISTENT_DB_DIR 2>/dev/null local ERRCOUNT=$CTDB_MAX_PERSISTENT_CHECK_ERRORS test -z "$ERRCOUNT" && { ERRCOUNT="0" } test x"$ERRCOUNT" != x"0" && { return 0; } if test -x /usr/bin/tdbtool ; then HAVE_TDBTOOL=1 else HAVE_TDBTOOL=0 fi if test x"$HAVE_TDBTOOL" = x"1" ; then TDBTOOL_HAS_CHECK=`echo "help" | /usr/bin/tdbtool | grep check | wc -l` else TDBTOOL_HAS_CHECK=0 fi if test -x /usr/bin/tdbdump ; then HAVE_TDBDUMP=1 else HAVE_TDBDUMP=0 fi if test x"$HAVE_TDBDUMP" = x"0" -a x"$TDBTOOL_HAS_CHECK" = x"0" ; then echo "WARNING: Cannot check persistent databases since" echo "neither 'tdbdump' nor 'tdbtool check' is available." echo "Consider installing tdbtool or at least tdbdump!" return 0 fi if test x"$HAVE_TDBDUMP" = x"1" -a x"$TDBTOOL_HAS_CHECK" = x"0" ; then if test x"$HAVE_TDBTOOL" = x"0"; then echo "WARNING: 'tdbtool' is not available. Using 'tdbdump' to" echo "check the persistent databases." echo "Consider installing a recent 'tdbtool' for better checks!" else echo "WARNING: The installed 'tdbtool' does not offer the 'check'" echo "subcommand. Using 'tdbdump' for persistent database checks." echo "Consider updating 'tdbtool' for better checks!" fi fi for PDBASE in `ls $PERSISTENT_DB_DIR/*.tdb.[0-9] 2>/dev/null`; do check_tdb $PDBASE || { echo "Persistent database $PDBASE is corrupted! CTDB will not start." return 1 } done } set_ctdb_variables () { # set any tunables from the config file set | grep ^CTDB_SET_ | cut -d_ -f3- | while read v; do varname=`echo $v | cut -d= -f1` value=`echo $v | cut -d= -f2` ctdb setvar $varname $value || RETVAL=1 done || exit 1 } wait_until_ready () { _timeout="${1:-10}" # default is 10 seconds _count=0 while ! ctdb ping >/dev/null 2>&1 ; do if [ $_count -ge $_timeout ] ; then return 1 fi sleep 1 _count=$(($_count + 1)) done } drop_all_public_ips() { [ -z "$CTDB_PUBLIC_ADDRESSES" ] && { return } cat $CTDB_PUBLIC_ADDRESSES | while read IP IFACE REST; do ip addr del $IP dev $IFACE >/dev/null 2>/dev/null done }