#!/bin/sh SLEEP=10 PRINT=false EXIT_ON_ERROR=false WATCH=false MYSQL_HOST="localhost" COMPARE_TYPE="eq" COMMAND="" COMMAND_NOK="" usage() { printf "$0 [options] \n" printf " -H Mysql host\n" printf " -u Mysql user\n" printf " -d Mysql database\n" printf " -t eq, lt or gt, defaults to eq\n" printf " -n How often to run sql query\n" printf " -c Command to run when target is reached\n" printf " -l Command to run when target is no longer reached, but has been reached\n" printf " -w Watch mode, this will stop the program from exiting when target is reached,\n" printf " but continue to run command each time criteria is triggered. \n" printf " -p Print the current value for each check\n" printf " -e Exit on error\n" } while getopts "H:u:d:c:t:n:l:pewh" opt; do case ${opt} in H ) MYSQL_HOST="$OPTARG" ;; u ) MYSQL_USER="$OPTARG" ;; d ) MYSQL_DATABASE="$OPTARG" ;; t ) COMPARE_TYPE="$OPTARG" ;; n ) SLEEP="$OPTARG" ;; c ) COMMAND="$OPTARG" ;; l ) COMMAND_NOK="$OPTARG" ;; p ) PRINT=true ;; w ) WATCH=true ;; e ) EXIT_ON_ERROR=true ;; h ) usage exit 0 ;; \? ) echo "Invalid option: $OPTARG" 1>&2 exit 1 ;; : ) echo "Option -$OPTARG requires an argument." 1>&2 exit 1 ;; esac done shift $((OPTIND -1)) if [ -z "$1" ]; then echo "Error: argument is missing." >&2 usage exit 1 fi QUERY="$1" if [ -z "$2" ]; then echo "Error: argument is missing." >&2 usage exit 1 fi TARGET="$2" if [ -z "$MYSQL_HOST" ]; then echo "Error: -H argument is missing." >&2 usage exit 1 fi if [ -z "$MYSQL_USER" ]; then echo "Error: -u argument is missing." >&2 usage exit 1 fi if [ -z "$MYSQL_DATABASE" ]; then echo "Error: -d argument is missing." >&2 usage exit 1 fi read -s -p "Enter password: " MYSQL_PWD echo export MYSQL_PWD TARGET_OK=false while true; do RESULT=$(mysql -u"$MYSQL_USER" -h"$MYSQL_HOST" "$MYSQL_DATABASE" -e "$QUERY" --batch --silent) if [ ! "$?" = "0" ]; then tput setaf 1 >&2 echo "[$(date)]: MySQL Error!" tput sgr0 if [ "$EXIT_ON_ERROR" = true ]; then exit 1 fi TARGET_OK=false sleep $SLEEP continue fi if [ "$PRINT" = true ]; then echo "[$(date)]: ${RESULT}" fi _TARGET_OK=false if [ "$COMPARE_TYPE" = "eq" ]; then if [ "$RESULT" = "$TARGET" ]; then _TARGET_OK=true SIGN_OK="=" SIGN_NOK="=" fi elif [ "$COMPARE_TYPE" = "lt" ]; then if (( RESULT < TARGET )); then _TARGET_OK=true SIGN_OK=">" SIGN_NOK="<" fi elif [ "$COMPARE_TYPE" = "gt" ]; then if (( RESULT > TARGET )); then _TARGET_OK=true SIGN_OK="<" SIGN_NOK=">" fi fi if [ "$_TARGET_OK" = true ]; then if [ "$TARGET_OK" = false ]; then if [ "$PRINT" = true ]; then printf "[$(date)]: Target " tput setaf 2 printf "OK " tput sgr0 tput sitm printf "$TARGET " tput ritm printf "$SIGN_OK " tput bold printf "$RESULT\n" tput sgr0 fi if [ ! "$COMMAND" = "" ]; then sh -c "$COMMAND" fi fi TARGET_OK=true if [ "$WATCH" = false ]; then break fi else if [ "$TARGET_OK" = true ]; then if [ "$PRINT" = true ]; then printf "[$(date)]: Target " tput setaf 1 printf "NOK " tput sgr0 tput sitm printf "$TARGET " tput ritm printf "$SIGN_NOK " tput bold printf "$RESULT\n" tput sgr0 fi if [ ! "$COMMAND_NOK" = "" ]; then sh -c "$COMMAND_NOK" fi fi TARGET_OK=false fi sleep $SLEEP done unset MYSQL_PWD