#!/bin/sh

# ########################################################################
# This program is part of Percona Monitoring Plugins
# License: GPL License (see COPYING)
# Authors:
#  Baron Schwartz, Roman Vynar
# ########################################################################

# ########################################################################
# Redirect STDERR to STDOUT; Nagios doesn't handle STDERR.
# ########################################################################
exec 2>&1

# ########################################################################
# Set up constants, etc.
# ########################################################################
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

# ########################################################################
# Run the program.
# ########################################################################
main() {
   # Get options
   for o; do
      case "${o}" in
         -C)              shift; OPT_CHEK="${1}"; shift; ;;
         -c)              shift; OPT_CRIT="${1}"; shift; ;;
         --defaults-file) shift; OPT_DEFT="${1}"; shift; ;;
         -H)              shift; OPT_HOST="${1}"; shift; ;;
         -l)              shift; OPT_USER="${1}"; shift; ;;
         -L)              shift; OPT_LOPA="${1}"; shift; ;;
         -p)              shift; OPT_PASS="${1}"; shift; ;;
         -P)              shift; OPT_PORT="${1}"; shift; ;;
         -S)              shift; OPT_SOCK="${1}"; shift; ;;
         -w)              shift; OPT_WARN="${1}"; shift; ;;
         --version)       grep -A2 '^=head1 VERSION' "$0" | tail -n1; exit 0 ;;
         --help)          perl -00 -ne 'm/^  Usage:/ && print' "$0"; exit 0 ;;
         -*)              echo "Unknown option ${o}.  Try --help."; exit 1; ;;
      esac
   done
   OPT_CHEK="${OPT_CHEK:-states_count}"
   if [ -e '/etc/nagios/mysql.cnf' ]; then
      OPT_DEFT="${OPT_DEFT:-/etc/nagios/mysql.cnf}"
   fi
   if is_not_sourced; then
      if [ -n "$1" ]; then
         echo "WARN spurious command-line options: $@"
         exit 1
      fi
   fi

   # Get processlist into a temp file.
   local TEMP=$(mktemp -t "${0##*/}.XXXXXX") || exit $?
   trap "rm -f '${TEMP}' >/dev/null 2>&1" EXIT

   case "${OPT_CHEK}" in
      states_count)
         OPT_WARN=${OPT_WARN:-16}
         OPT_CRIT=${OPT_CRIT:-32}

        # Capture a number of types of states, add some together, take the max,
        # and compare to the threshold.
        mysql_exec 'SHOW PROCESSLIST\G' > "${TEMP}"
        if [ $? = 0 ]; then
           UNAUTH=$(count_mysql_processlist "${TEMP}" "User" "unauthenticated user")
           LOCKED1=$(count_mysql_processlist "${TEMP}" "State" "Locked")
           LOCKED2=$(count_mysql_processlist "${TEMP}" "State" "Waiting for .* lock")
           LOCKED3=$(count_mysql_processlist "${TEMP}" "State" "Table lock")
           LOCKED4=$(count_mysql_processlist "${TEMP}" "State" "Waiting for table flush")
           LOCKED5=$(count_mysql_processlist "${TEMP}" "State" "Waiting for tables")
           COPYIN=$(count_mysql_processlist "${TEMP}" "State" ".*opy.* to.* table.*")
           STATIS=$(count_mysql_processlist "${TEMP}" "State" "statistics")
           LOCKED=$((${LOCKED1:-0} + ${LOCKED2:-0} + ${LOCKED3:-0} + ${LOCKED4:-0} + ${LOCKED5:-0}))
           NOTE="${UNAUTH} unauthenticated, ${LOCKED} locked,"
           NOTE="${NOTE} ${COPYIN} copy to table, ${STATIS} statistics"
           MAX="$(max "${UNAUTH:-0}" "${LOCKED:-0}" "${COPYIN:-0}" "${STATIS:-0}")"
           if [ "${MAX:-0}" -gt "${OPT_CRIT}" ]; then
              NOTE="CRIT $NOTE"
           elif [ "${MAX:-0}" -gt "${OPT_WARN}" ]; then
              NOTE="WARN $NOTE"
           else
              NOTE="OK $NOTE"
           fi

           # Build the common perf data output for graph trending
           PERFDATA="processes=${MAX:-0};${OPT_WARN};${OPT_CRIT};0;"
           NOTE="$NOTE | $PERFDATA"
        else
           NOTE="UNK could not retrieve MySQL processlist"
        fi
        ;;
      max_user_conn)
         OPT_WARN=${OPT_WARN:-90}
         OPT_CRIT=${OPT_CRIT:-95}

         # Check if @@max_user_connections is set on MySQL
         MAX_USER_CONN=$(mysql_exec 'SELECT @@max_user_connections')
         if [ $? = 0 ]; then
            if [ ${MAX_USER_CONN:-0} -gt 0 ]; then
               # Capture a number of connections per user from the processlist, take the max,
               # and compare to the threshold.
               mysql_exec 'SHOW PROCESSLIST\G' > "${TEMP}"
               if [ $? = 0 ]; then
                  MAX_USER=$(cat ${TEMP}|grep User|awk '{print $2}'|sort|uniq -c|sort -n|tail -1)
                  CNT=$(echo ${MAX_USER} | awk '{print $1}')
                  USER=$(echo ${MAX_USER} | awk '{print $2}')
                  MAX=$(expr ${CNT} \* 100 / ${MAX_USER_CONN})
                  NOTE="User with max connections: ${USER} (${CNT}) = ${MAX}%"
                  if [ "${MAX:-0}" -gt "${OPT_CRIT}" ]; then
                     NOTE="CRIT $NOTE"
                  elif [ "${MAX:-0}" -gt "${OPT_WARN}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     