--- /dev/null
+#!/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