Whamcloud - gitweb
land b1_5 onto HEAD
[fs/lustre-release.git] / lustre / scripts / lc_mon.sh
diff --git a/lustre/scripts/lc_mon.sh b/lustre/scripts/lc_mon.sh
new file mode 100755 (executable)
index 0000000..ac4be84
--- /dev/null
@@ -0,0 +1,139 @@
+#!/bin/sh
+
+# Given one or more Lustre objects, create a mon configuration file
+# naming the mon watches based on the Lustre object names 
+# For each Lustre object, the script will create two mon watches
+# The first watch sets a trap, and the second watch clears the 
+# trap if Lustre is healthy.
+
+# This may be more fun in Perl due to the need to support a list
+# of objects
+
+# (plus we could use a Perl format for this goop)
+
+MONBASEDIR=${MONBASEDIR:-/usr/local/lib/mon}
+MONCFGDIR=${MONCFGDIR:-/etc/mon}
+TD=`date +%y_%m%d_%S`
+TMPMONCFG=${TD}-mon.cfg
+# Determines how often we will check Lustre health
+CHECKINTERVAL="3m"
+# Determines how quickly we must clear the trap
+TRAPINTERVAL="6m"
+ALERTSCRIPT=${ALERTSCRIPT:-"fail_lustre.alert"}
+TRAPSCRIPT=${TRAPSCRIPT:-"lustre.mon.trap"}
+
+# We will assume all inputs are Lustre objects
+# file locations and timeouts correct to taste
+# Correct to taste
+print_header() {
+    cat >> $TMPMONCFG <<-EOF
+       cfbasedir     = $MONCFGDIR
+       alertdir      = $MONBASEDIR/alert.d
+       mondir        = $MONBASEDIR/mon.d
+       statedir      = $MONBASEDIR/state.d
+       logdir        = $MONBASEDIR/log.d
+       dtlogfile     = $MONBASEDIR/log.d/downtime.log
+       maxprocs      = 20 
+       histlength    = 100 
+       randstart     = 60s
+       authtype      = getpwnam
+EOF
+}
+
+# Tabs should be preserved in the config file
+# $1 object name
+# we do not set a period, it is assumed monitor is always active
+
+print_trap_rec() {
+    cat >> $TMPMONCFG <<EOF
+#
+watch ${1}-obj
+    service ${1}_ser
+    description triggers heartbeat failure if trap springs on $1
+    traptimeout $TRAPINTERVAL
+    period 
+       alert $ALERTSCRIPT
+
+# end ${1}-obj
+
+EOF
+
+}
+
+print_trap_send() {
+    cat >> $TMPMONCFG <<EOF
+#
+watch ${1}-mon
+    service ${1}_mon_ser
+    description clears trap for $1
+    interval $CHECKINTERVAL
+    monitor $TRAPSCRIPT ${1}-obj ${1}_ser ${1}
+    period
+       alert $ALERTSCRIPT
+# end ${1}-mon
+EOF
+
+}
+
+usage() {
+    echo "$0 -n <node> -n <node> -o <Lustre object> -o <Lustre object>...."
+    echo "Creates the /etc/mon/mon.cf file to monitor Lustre objects"
+    exit 1
+}
+
+
+# Start of script
+
+if [ $# -eq 0 ];then
+    usage
+fi
+
+# This script should work for any number of hosts
+# 
+HOSTCNT=0
+OBJCNT=0
+
+declare -a HOSTS
+declare -a OBJS
+
+while getopts "n:o:" opt; do
+    case $opt in 
+       n) HOSTS[HOSTCNT]=$OPTARG
+           HOSTCNT=$(( HOSTCNT + 1 ))
+           ;;
+       o) OBJS[OBJCNT]=$OPTARG
+           OBJCNT=$(( OBJCNT + 1 ))
+           ;;
+       *) usage
+           ;;
+    esac
+done
+
+echo "Found $HOSTCNT hosts"
+echo "Found $OBJCNT Lustre objects"
+
+# First create the host groups
+# we assume 
+# each object will have two watches defined
+# each object hostgroup will have all objects
+
+# Create the file with the declared goop
+print_header
+
+for obj in ${OBJS[@]}
+do
+    echo "hostgroup ${obj}-obj ${HOSTS[@]}" >> $TMPMONCFG
+    echo "hostgroup ${obj}-mon ${HOSTS[@]}" >> $TMPMONCFG
+    echo "#" >> $TMPMONCFG
+done
+    
+# create the monitors
+
+for obj in ${OBJS[@]}
+do
+    print_trap_send $obj
+    print_trap_rec $obj
+done
+
+echo "Mon config completed - new mon config is $TMPMONCFG"
+exit 0
\ No newline at end of file