#!/bin/bash # Includes . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } # Configurable stuff # Other globals NAME_FMTSTR="%-25s" PRETTY_CONNECTION_STATUS_FMTSTR="%-10s" PRETTY_ROLES_FMTSTR="%-19s" PRETTY_DISK_STATUSES_FMTSTR="%-21s" # Last displayed format size-less to avoid trailing spaces. PRETTY_REPLICATON_STATUS_FMTSTR="%s" main() { local MY_ARGS local PROGNAME MODE # Defaults for options MODE=standalone # Process options special_opts_handler() { case $1 in --nagios) MODE=nagios ;; *) return 1 ;; esac } miniade_process_options --help-handler=help --special-opts-handler=special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments [ $# = 0 ] || miniade_bad_usage # Sanity checks and derivations # Guts ${MODE//-/_} } help() { local PROGNAME miniade_get_progname PROGNAME echo "Usage: $PROGNAME [ ] [ --nagios ]" exit 0 } standalone() { HAD_WORD_PEER=false while read LINE; do #echo "LINE=$LINE" if [ "X$LINE" = X ]; then PRETTY_CONNECTION_STATUS=$(if [ "X$REMOTE_ROLE" = X ]; then echo StandAlone; else echo Connected; fi) PRETTY_ROLES=$(if [ $PRETTY_CONNECTION_STATUS = Connected ]; then echo $LOCAL_ROLE/$REMOTE_ROLE; else echo $LOCAL_ROLE/Unknown; fi) PRETTY_DISK_STATUSES=$(if [ $PRETTY_CONNECTION_STATUS = Connected ]; then echo "$LOCAL_DISK_STATUS/$REMOTE_DISK_STATUS"; else echo $LOCAL_DISK_STATUS/Unknown; fi) case $REPLICATON_STATUS in "") PRETTY_REPLICATON_STATUS=NotEstablished ;; Established) PRETTY_REPLICATON_STATUS=$REPLICATON_STATUS ;; SyncSource) PRETTY_REPLICATON_STATUS="$REPLICATON_STATUS($DONE%/$FINISHES)" ;; SyncTarget) PRETTY_REPLICATON_STATUS="$REPLICATON_STATUS($DONE%/$FINISHES)" ;; *) PRETTY_REPLICATON_STATUS=Unknown ;; esac printf "$NAME_FMTSTR $PRETTY_CONNECTION_STATUS_FMTSTR $PRETTY_ROLES_FMTSTR $PRETTY_DISK_STATUSES_FMTSTR $PRETTY_REPLICATON_STATUS_FMTSTR\\n" "$NAME:" "$PRETTY_CONNECTION_STATUS" "$PRETTY_ROLES" "$PRETTY_DISK_STATUSES" "$PRETTY_REPLICATON_STATUS" #echo NAME= LOCAL_ROLE= REMOTE_ROLE= LOCAL_DISK_STATUS= REMOTE_DISK_STATUS= REPLICATON_STATUS= HAD_WORD_PEER=false else for WORD in $LINE; do #echo "WORD=$WORD" case $WORD in role:*) { $HAD_WORD_PEER && REMOTE_ROLE=${WORD#*:}; } || LOCAL_ROLE=${WORD#*:} ;; peer) HAD_WORD_PEER=true ;; disk:*) LOCAL_DISK_STATUS=${WORD#*:} ;; peer-disk:*) REMOTE_DISK_STATUS=${WORD#*:} ;; replication:*) REPLICATON_STATUS=${WORD#*:} ;; done:*) DONE=${WORD#*:} FINISHES=$(grep -A 3 "^ *$(readlink /dev/$NAME | sed 's/drbd//'):" /proc/drbd | sed -nr 's/.*finish: (.*) speed:.*/\1/p') ;; *) NAME=$WORD ;; esac done fi done < <(drbdadm status) } nagios() { local LINE ALL_RC RC DEVICE CONNECTED PRISEC UTDUTD ESTABLISHED ALL_RC=0 while read DEVICE CONNECTED PRISEC UTDUTD ESTABLISHED; do RC=0 DEVICE=${DEVICE%:} miniade_debug 10 "nagios: DEVICE=$DEVICE, CONNECTED=$CONNECTED, PRISEC=$PRISEC, UTDUTD=$UTDUTD, ESTABLISHED=$ESTABLISHED" [ $RC -ge 2 ] || [ $CONNECTED = Connected ] || RC=2 [ $RC -ge 1 ] || [[ $PRISEC =~ (Primary/Secondary|Secondary/Primary) ]] || RC=1 [ $RC -ge 1 ] || [ "X$UTDUTD" = "XUpToDate/UpToDate" ] || RC=1 [ $RC -ge 2 ] || [ $ESTABLISHED = Established ] || RC=2 [ $ALL_RC -ge $RC ] || ALL_RC=$RC done < <(standalone) exit $ALL_RC } main "$@"