#!/bin/bash
PROGNAME=`basename $0`
VERSION="Version 1.0,"
AUTHOR="Guillaume Coré <g@fridim.org>"
 
ST_OK=0
ST_WR=1
ST_CR=2
ST_UK=3
ST_FINAL=$ST_UK

print_version() {
    echo "$VERSION $AUTHOR"
} 

print_help() {
    print_version $PROGNAME $VERSION
    echo ""
    echo "$PROGNAME is a Nagios plugin to monitor Galera cluster status."
    echo ""
    echo "$PROGNAME -u USER -p PASSWORD [-H HOST] [-P PORT] [-w SIZE] [-c SIZE] [-f FLOAT] [-0]"
    echo ""
    echo "Options:"
    echo "  u)"
    echo "    MySQL user."
    echo "  p)"
    echo "    MySQL password."
    echo "  H)"
    echo "    MySQL host. Default is localhost."
    echo "  P)"
    echo "    MySQL port. Default is 3306."
    echo "  w)"
    echo "    Sets minimum number of nodes in the cluster when WARNING is raised. (default is same as critical)."
    echo "  c)"
    echo "    Sets minimum number of nodes in the cluster when CRITICAL is raised. (default is 2)."
    echo "  f)"
    echo "    Sets critical value of wsrep_flow_control_paused (default is 0.1)."
    echo "  0)"
    echo "    Rise CRITICAL if the node is not primary"
    exit $ST_UK
}

# default values
crit=2
port='3306'
mysqlhost='localhost'
fcp=0.1

while getopts “hvu:p:H:P:w:c:f:0” OPTION; do
    case $OPTION in
        h)
            print_help
            exit $ST_UK
            ;;
        v)
            print_version $PROGNAME $VERSION
            exit $ST_UK
            ;;
        u)
            mysqluser=$OPTARG
            ;;
        p)
            password=$OPTARG
            ;;
        H)
            mysqlhost=$OPTARG
            ;;
        P)
            port=$OPTARG
            ;;
        w)
            warn=$OPTARG
            ;;
        c)
            crit=$OPTARG
            ;;
        f)
            fcp=$OPTARG
            ;;
        0)
            primary='TRUE'
            ;;
        ?)
            echo "Unknown argument: $1"
            print_help
            exit $ST_UK
            ;;
    esac
done

if [ -z "$warn" ]; then
    warn=$crit
fi

# MANDATORY args
if [ -z "$mysqluser" ]; then
  echo "argument -u missing"
  print_help
  exit $ST_UK
fi

if [ -z "$password" ]; then
  echo "argument -p missing"
  print_help
  exit $ST_UK
fi

r1=$(mysql -h$mysqlhost -P$port -u$mysqluser -p$password -e "show status like 'wsrep_cluster_size'"|grep wsrep_cluster_size|cut -f 2)
r2=$(mysql -h$mysqlhost -P$port -u$mysqluser -p$password -e "show status like 'wsrep_cluster_status'"|grep wsrep_cluster_status|cut -f 2)
r3=$(mysql -h$mysqlhost -P$port -u$mysqluser -p$password -e "show status like 'wsrep_flow_control_paused'"|grep wsrep_flow_control_paused|cut -f 2)

if [ -z "$r3" ]; then
  echo "UNKNOWN: wsrep_flow_control_paused is empty"
  ST_FINAL=$ST_UK
fi

if [ $(echo "$r3 > $fcp" | bc) = 1 ]; then
  echo "CRITICAL: wsrep_flow_control_paused is > $fcp"
  ST_FINAL=$ST_CR
fi

if [ "$primary" = 'TRUE' ]; then
  if [ "$r2" != 'Primary' ]; then
    echo "CRITICAL: node is not primary"
    ST_FINAL=$ST_CR
  fi
fi

if [ $r1 -gt $warn ]; then
  echo "OK: number of NODES = $r1"
  ST_FINAL=${ST_FINAL-$ST_OK}
elif [ $r1 -le $crit ]; then
  echo "CRITICAL: number of NODES = $r1"
  ST_FINAL=$ST_CR
elif [ $r1 -le $warn ]; then
  echo "WARNING: number of NODES = $r1"
  ST_FINAL=${ST_FINAL-$ST_WR}
fi

exit $ST_FINAL
