1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00
samba-mirror/ctdb/config/events.d/05.system
Martin Schwenke b208ae73d1 ctdb-scripts: Avoid shellcheck warning SC2154 (unassigned variables)
SC2154: VAR is referenced but not assigned.

Change ctdb_setup_service_state_dir(), ctdb_get_pnn() and
ctdb_get_ip_address() to print the value so it can be assigned to a
variable.  The performance gain from avoiding the sub-shells when
calling these functions is close to zero.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
2016-07-21 02:24:26 +02:00

176 lines
4.6 KiB
Bash
Executable File

#!/bin/sh
# ctdb event script for checking local file system utilization
[ -n "$CTDB_BASE" ] || \
CTDB_BASE=$(d=$(dirname "$0") ; cd -P "$d" ; dirname "$PWD")
. "${CTDB_BASE}/functions"
loadconfig
service_state_dir=$(ctdb_setup_service_state_dir "system-monitoring") || exit $?
validate_percentage ()
{
case "$1" in
"") return 1 ;; # A failure that doesn't need a warning
[0-9]|[0-9][0-9]|100) return 0 ;;
*) echo "WARNING: ${1} is an invalid percentage${2:+ in \"}${2}${2:+\"} check"
return 1
esac
}
check_thresholds ()
{
_thing="$1"
_thresholds="$2"
_usage="$3"
_unhealthy_callout="$4"
case "$_thresholds" in
*:*)
_warn_threshold="${_thresholds%:*}"
_unhealthy_threshold="${_thresholds#*:}"
;;
*)
_warn_threshold="$_thresholds"
_unhealthy_threshold=""
esac
_t=$(echo "$_thing" | sed -e 's@/@SLASH_@g' -e 's@ @_@g')
_cache="${service_state_dir}/cache_${_t}"
if validate_percentage "$_unhealthy_threshold" "$_thing" ; then
if [ "$_usage" -ge "$_unhealthy_threshold" ] ; then
echo "ERROR: ${_thing} utilization ${_usage}% >= threshold ${_unhealthy_threshold}%"
eval "$_unhealthy_callout"
echo "$_usage" >"$_cache"
exit 1
fi
fi
if validate_percentage "$_warn_threshold" "$_thing" ; then
if [ "$_usage" -ge "$_warn_threshold" ] ; then
if [ -r "$_cache" ] ; then
read _prev <"$_cache"
else
_prev=""
fi
if [ "$_usage" != "$_prev" ] ; then
echo "WARNING: ${_thing} utilization ${_usage}% >= threshold ${_warn_threshold}%"
echo "$_usage" >"$_cache"
fi
else
if [ -r "$_cache" ] ; then
echo "NOTICE: ${_thing} utilization ${_usage}% < threshold ${_warn_threshold}%"
fi
rm -f "$_cache"
fi
fi
}
set_monitor_filsystem_usage_defaults ()
{
_fs_defaults_cache="${service_state_dir}/cache_monitor_filsystem_usage_defaults"
if [ ! -r "$_fs_defaults_cache" ] ; then
# Determine filesystem for each database directory, generate
# an entry to warn at 90%, de-duplicate entries, put all items
# on 1 line (so the read below gets everything)
for _t in "${CTDB_DBDIR:-${CTDB_VARDIR}}" \
"${CTDB_DBDIR_PERSISTENT:-${CTDB_VARDIR}/persistent}" \
"${CTDB_DBDIR_STATE:-${CTDB_VARDIR}/state}" ; do
df -kP "$_t" | awk 'NR == 2 { printf "%s:90\n", $6 }'
done | sort -u | xargs >"$_fs_defaults_cache"
fi
read CTDB_MONITOR_FILESYSTEM_USAGE <"$_fs_defaults_cache"
}
monitor_filesystem_usage ()
{
if [ -z "$CTDB_MONITOR_FILESYSTEM_USAGE" ] ; then
set_monitor_filsystem_usage_defaults
fi
# Check each specified filesystem, specified in format
# <fs_mount>:<fs_warn_threshold>[:fs_unhealthy_threshold]
for _fs in $CTDB_MONITOR_FILESYSTEM_USAGE ; do
_fs_mount="${_fs%%:*}"
_fs_thresholds="${_fs#*:}"
if [ ! -d "$_fs_mount" ]; then
echo "WARNING: Directory ${_fs_mount} does not exist"
continue
fi
# Get current utilization
_fs_usage=$(df -kP "$_fs_mount" | \
sed -n -e 's@.*[[:space:]]\([[:digit:]]*\)%.*@\1@p')
if [ -z "$_fs_usage" ] ; then
echo "WARNING: Unable to get FS utilization for ${_fs_mount}"
continue
fi
check_thresholds "Filesystem ${_fs_mount}" \
"$_fs_thresholds" \
"$_fs_usage"
done
}
dump_memory_info ()
{
get_proc "meminfo"
ps auxfww
set_proc "sysrq-trigger" "m"
}
monitor_memory_usage ()
{
# Defaults
if [ -z "$CTDB_MONITOR_MEMORY_USAGE" ] ; then
CTDB_MONITOR_MEMORY_USAGE=80
fi
if [ -z "$CTDB_MONITOR_SWAP_USAGE" ] ; then
CTDB_MONITOR_SWAP_USAGE=25
fi
_meminfo=$(get_proc "meminfo")
# Intentional word splitting here
# shellcheck disable=SC2046
set -- $(echo "$_meminfo" | awk '
$1 == "MemAvailable:" { memavail += $2 }
$1 == "MemFree:" { memfree += $2 }
$1 == "Cached:" { memfree += $2 }
$1 == "Buffers:" { memfree += $2 }
$1 == "MemTotal:" { memtotal = $2 }
$1 == "SwapFree:" { swapfree = $2 }
$1 == "SwapTotal:" { swaptotal = $2 }
END {
if (memavail != 0) { memfree = memavail ; }
if (memtotal != 0) { print int((memtotal - memfree) / memtotal * 100) ; } else { print 0 ; }
if (swaptotal != 0) { print int((swaptotal - swapfree) / swaptotal * 100) ; } else { print 0 ; }
}')
_mem_usage="$1"
_swap_usage="$2"
check_thresholds "System memory" \
"$CTDB_MONITOR_MEMORY_USAGE" \
"$_mem_usage" \
dump_memory_info
check_thresholds "System swap" \
"$CTDB_MONITOR_SWAP_USAGE" \
"$_swap_usage" \
dump_memory_info
}
case "$1" in
monitor)
monitor_filesystem_usage
monitor_memory_usage
;;
esac
exit 0