#######################################
# pull in a system config file, if any
-loadconfig() {
+_loadconfig() {
if [ -z "$1" ] ; then
foo="${service_config:-${service_name}}"
fi
}
+loadconfig () {
+ _loadconfig "$@"
+}
+
##############################################################
# determine on what type of system (init style) we are running
detect_init_style() {
######################################################
# simulate /sbin/service (niced) on platforms that don't have it
nice_service() {
+ _service_name="$1"
+ _op="$2"
+
# do nothing, when no service was specified
- [ -z "$1" ] && return
+ [ -z "$_service_name" ] && return
- nice service "$@"
+ if [ -x /sbin/service ]; then
+ nice /sbin/service "$_service_name" "$_op"
+ elif [ -x /etc/init.d/$_service_name ]; then
+ nice /etc/init.d/$_service_name "$_op"
+ elif [ -x /etc/rc.d/init.d/$_service_name ]; then
+ nice /etc/rc.d/init.d/$_service_name "$_op"
+ fi
}
######################################################
progname="$1"
prognum="$2"
version="$3"
- rpcinfo -u localhost $prognum $version > /dev/null || {
- echo "ERROR: $progname not responding to rpc requests"
- exit 1
- }
+
+ ctdb_check_rpc_out=$(rpcinfo -u localhost $prognum $version 2>&1)
+ if [ $? -ne 0 ] ; then
+ ctdb_check_rpc_out="ERROR: $progname failed RPC check:
+$ctdb_check_rpc_out"
+ echo "$ctdb_check_rpc_out"
+ return 1
+ fi
}
######################################################
continue
;;
*)
- [ -d "$d" ] || return 1
+ [ -d "${d}/." ] || return 1
esac
done
}
_failed=0
_killcount=0
- connfile="$CTDB_BASE/state/connections.$_IP"
+ connfile="$CTDB_VARDIR/state/connections.$_IP"
netstat -tn |egrep "^tcp.*[[:space:]]+$_IP:.*ESTABLISHED" | awk '{print $4" "$5}' > $connfile
netstat -tn |egrep "^tcp.*[[:space:]]+::ffff:$_IP:.*ESTABLISHED" | awk '{print $4" "$5}' >> $connfile
_failed=0
_killcount=0
- connfile="$CTDB_BASE/state/connections.$_IP"
+ connfile="$CTDB_VARDIR/state/connections.$_IP"
netstat -tn |egrep "^tcp.*[[:space:]]+$_IP:.*ESTABLISHED" | awk '{print $4" "$5}' > $connfile
netstat -tn |egrep "^tcp.*[[:space:]]+::ffff:$_IP:.*ESTABLISHED" | awk '{print $4" "$5}' >> $connfile
_failed=0
_killcount=0
- connfile="$CTDB_BASE/state/connections.$_IP"
+ connfile="$CTDB_VARDIR/state/connections.$_IP"
netstat -tn |egrep "^tcp.*[[:space:]]+$_IP:.*ESTABLISHED" | awk '{print $4" "$5}' > $connfile
netstat -tn |egrep "^tcp.*[[:space:]]+::ffff:$_IP:.*ESTABLISHED" | awk '{print $4" "$5}' >> $connfile
stop)
service nfsserver stop > /dev/null 2>&1
;;
+ restart)
+ echo 0 >/proc/fs/nfsd/threads
+ service nfsserver stop > /dev/null 2>&1
+ pkill -9 nfsd
+ service nfsserver start
+ ;;
esac
;;
rhel)
service nfs stop > /dev/null 2>&1
service nfslock stop > /dev/null 2>&1
;;
+ restart)
+ echo 0 >/proc/fs/nfsd/threads
+ service nfs stop > /dev/null 2>&1
+ service nfslock stop > /dev/null 2>&1
+ pkill -9 nfsd
+ service nfslock start
+ service nfs start
+ ;;
esac
;;
*)
stop)
service nfsserver stop > /dev/null 2>&1
;;
+ restart)
+ service nfsserver stop
+ service nfsserver start
+ ;;
esac
;;
rhel)
stop)
service nfslock stop > /dev/null 2>&1
;;
+ restart)
+ service nfslock stop
+ service nfslock start
+ ;;
esac
;;
*)
}
# better use delete_ip_from_iface() together with add_ip_to_iface
+# remove_ip should be removed in future
remove_ip() {
- # the ip tool will delete all secondary IPs if this is the primary.
- # To work around this _very_ annoying behaviour we have to keep a
- # record of the secondaries and re-add them afterwards. yuck
- secondaries=""
- if ip addr list dev $2 primary | grep -q "inet $1 " ; then
- secondaries=`ip addr list dev $2 secondary | grep " inet " | awk '{print $2}'`
- fi
- ip addr del $1 dev $2 >/dev/null 2>/dev/null || failed=1
- [ -z "$secondaries" ] || {
- for i in $secondaries; do
- if ip addr list dev $2 | grep -q "inet $i" ; then
- echo "kept secondary $i on dev $2"
- else
- echo "re-adding secondary address $i to dev $2"
- ip addr add $i dev $2 || failed=1
- fi
- done
- }
+ local _ip_maskbits=$1
+ local _iface=$2
+ local _ip=`echo "$_ip_maskbits" | cut -d '/' -f1`
+ local _maskbits=`echo "$_ip_maskbits" | cut -d '/' -f2`
+
+ delete_ip_from_iface "$_iface" "$_ip" "$_maskbits"
+ return $?
}
add_ip_to_iface()
local _iface=$1
local _ip=$2
local _maskbits=$3
- local _lockfile="$CTDB_BASE/state/interface_modify.$_iface.flock"
+ local _state_dir="$CTDB_VARDIR/state/interface_modify"
+ local _lockfile="$_state_dir/$_iface.flock"
+ local _readd_base="$_state_dir/$_iface.readd.d"
+
+ mkdir -p $_state_dir || {
+ ret=$?
+ echo "Failed to mkdir -p $_state_dir - $ret"
+ return $ret
+ }
test -f $_lockfile || {
touch $_lockfile
}
- flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh add "$_iface" "$_ip" "$_maskbits"
+ flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh add "$_iface" "$_ip" "$_maskbits" "$_readd_base"
return $?
}
local _iface=$1
local _ip=$2
local _maskbits=$3
- local _lockfile="$CTDB_BASE/state/interface_modify.$_iface.flock"
+ local _state_dir="$CTDB_VARDIR/state/interface_modify"
+ local _lockfile="$_state_dir/$_iface.flock"
+ local _readd_base="$_state_dir/$_iface.readd.d"
+
+ mkdir -p $_state_dir || {
+ ret=$?
+ echo "Failed to mkdir -p $_state_dir - $ret"
+ return $ret
+ }
test -f $_lockfile || {
touch $_lockfile
}
- flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh delete "$_iface" "$_ip" "$_maskbits"
+ flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh delete "$_iface" "$_ip" "$_maskbits" "$_readd_base"
+ return $?
+}
+
+setup_iface_ip_readd_script()
+{
+ local _iface=$1
+ local _ip=$2
+ local _maskbits=$3
+ local _readd_script=$4
+ local _state_dir="$CTDB_VARDIR/state/interface_modify"
+ local _lockfile="$_state_dir/$_iface.flock"
+ local _readd_base="$_state_dir/$_iface.readd.d"
+
+ mkdir -p $_state_dir || {
+ ret=$?
+ echo "Failed to mkdir -p $_state_dir - $ret"
+ return $ret
+ }
+
+ test -f $_lockfile || {
+ touch $_lockfile
+ }
+
+ flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh readd_script "$_iface" "$_ip" "$_maskbits" "$_readd_base" "$_readd_script"
return $?
}
echo "WARNING: less than $_limit consecutive failures ($_size) for $service_name, not unhealthy yet"
fi
}
+ctdb_check_counter_equal () {
+ _ctdb_counter_common
+
+ _limit=$1
+
+ # unary counting!
+ _size=$(stat -c "%s" "$_counter_file" 2>/dev/null || echo 0)
+ if [ $_size -eq $_limit ] ; then
+ return 1
+ fi
+ return 0
+}
+
########################################################
ctdb_spool_dir="/var/spool/ctdb"
ctdb_service_reconfigure ()
{
+ echo "Reconfiguring service \"$service_name\"..."
if [ -n "$service_reconfigure" ] ; then
eval $service_reconfigure
else
is_ctdb_managed_service ()
{
+ _service_name="${1:-${service_name}}"
+
t=" $CTDB_MANAGED_SERVICES "
ctdb_compat_managed_service "$CTDB_MANAGES_VSFTPD" "vsftpd"
ctdb_compat_managed_service "$CTDB_MANAGES_SAMBA" "samba"
ctdb_compat_managed_service "$CTDB_MANAGES_SCP" "scp"
- ctdb_compat_managed_service "$CTDB_MANAGES_WINDBIND" "windbind"
+ ctdb_compat_managed_service "$CTDB_MANAGES_WINBIND" "winbind"
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"
+ ctdb_compat_managed_service "$CTDB_MANAGES_NFS" "nfs-ganesha-gpfs"
- # Returns 0 if "<space>$service_name<space>" appears in $t
- [ "${t#* ${service_name} }" != "${t}" ]
+ # Returns 0 if "<space>$_service_name<space>" appears in $t
+ [ "${t#* ${_service_name} }" != "${t}" ]
}
ctdb_start_stop_service ()
{
- _active="$ctdb_active_dir/$service_name"
+ _service_name="${1:-${service_name}}"
+
+ [ "$event_name" = "monitor" ] || return 0
- if is_ctdb_managed_service ; then
+ _active="$ctdb_active_dir/$_service_name"
+ if is_ctdb_managed_service "$_service_name"; then
if ! [ -e "$_active" ] ; then
- echo "Starting service $service_name"
+ echo "Starting service $_service_name"
ctdb_service_start || exit $?
mkdir -p "$ctdb_active_dir"
touch "$_active"
exit 0
fi
- elif ! is_ctdb_managed_service ; then
+ else
if [ -e "$_active" ] ; then
- echo "Stopping service $service_name"
+ echo "Stopping service $_service_name"
ctdb_service_stop || exit $?
rm -f "$_active"
+ exit 0
fi
- exit 0
fi
}
ctdb_service_start ()
{
if [ -n "$service_start" ] ; then
- eval $service_start
+ eval $service_start || return $?
else
- service "$service_name" start
+ service "$service_name" start || return $?
fi
ctdb_counter_init
}
return 0;
}
+# iptables doesn't like being re-entered, so flock-wrap it.
+iptables()
+{
+ flock -w 30 /var/ctdb/iptables-ctdb.flock /sbin/iptables "$@"
+}
+
+########################################################
+# tickle handling
+########################################################
+
+# Temporary directory for tickles.
+tickledir="$CTDB_VARDIR/state/tickles"
+mkdir -p "$tickledir"
+
+update_tickles ()
+{
+ _port="$1"
+
+ mkdir -p "$tickledir" # Just in case
+
+ # Who am I?
+ _pnn=$(ctdb pnn) ; _pnn=${_pnn#PNN:}
+
+ # What public IPs do I hold?
+ _ips=$(ctdb -Y ip | awk -F: -v pnn=$_pnn '$3 == pnn {print $2}')
+
+ # IPs as a regexp choice
+ _ipschoice="($(echo $_ips | sed -e 's/ /|/g' -e 's/\./\\\\./g'))"
+
+ # Record connections to our public IPs in a temporary file
+ _my_connections="${tickledir}/${_port}.connections"
+ rm -f "$_my_connections"
+ netstat -tn |
+ awk -v destpat="^${_ipschoice}:${_port}\$" \
+ '$1 == "tcp" && $6 == "ESTABLISHED" && $4 ~ destpat {print $5, $4}' |
+ sort >"$_my_connections"
+
+ # Record our current tickles in a temporary file
+ _my_tickles="${tickledir}/${_port}.tickles"
+ rm -f "$_my_tickles"
+ for _i in $_ips ; do
+ ctdb -Y gettickles $_i $_port |
+ awk -F: 'NR > 1 { printf "%s:%s %s:%s\n", $2, $3, $4, $5 }'
+ done |
+ sort >"$_my_tickles"
+
+ # Add tickles for connections that we haven't already got tickles for
+ comm -23 "$_my_connections" "$_my_tickles" |
+ while read _src _dst ; do
+ ctdb addtickle $_src $_dst
+ done
+
+ # Remove tickles for connections that are no longer there
+ comm -13 "$_my_connections" "$_my_tickles" |
+ while read _src _dst ; do
+ ctdb deltickle $_src $_dst
+ done
+
+ rm -f "$_my_connections" "$_my_tickles"
+}
+
########################################################
# load a site local config file
########################################################
script_name="${0##*/}" # basename
service_name="$script_name" # default is just the script name
service_fail_limit=1
+event_name="$1"