#!/bin/bash
# Скрипт читает данные из файла, которые пишет mysql-monitor и отдает их в monrun-формате.

INSTANCE=$1
CHECK=$2
OPTPARAM=$3

usage() {
	echo "Usage: $0 instance_name {slave_running|slave_behind|monitor_age|mysql_alive|checksum_active|checksum_errors}"
	exit 2
}

[ $# -lt 2 ] && usage

MONFILE=/var/spool/mysql-monitor/$INSTANCE
MONFILECHK=/tmp/mysql-simple-check-tables-$INSTANCE.status

if [ ! -f $MONFILE ]; then
	echo "2; Can't find monfile $MONFILE!"
	exit 2;
elif [ $((`date +%s` - `stat -c %Y $MONFILE`)) -ge 600 ]; then
	echo "2; Too old monfile. Check mysql-monitor is running!"
	exit 2;
fi

if ! grep -q '^alive: 1' $MONFILE; then
	echo "2;$INSTANCE is dead"
	exit 0
fi

case $CHECK in
	slave_running)
		if grep -q '^has_slave: 1' $MONFILE; then
            i_am_master=$(grep $(hostname -f) /etc/yandex-direct/db-config.json /etc/yandex-direct/sandbox-db-config.json /usr/share/partners/lib/DatabaseConfig.json /var/www/partner.yandex.ru/etc/conf/zk-db-config.json /usr/share/yandex/gorynych/config/gorynych/settings/20-databases.py.production /usr/share/yandex/int-constructor/configured_settings.py /etc/direct-moderate/db-config.json 2>/dev/null | head -n1)
            if [ x"$INSTANCE" = x"catalogia-media" ]; then
                i_am_master=$(sudo lfw $INSTANCE | grep write | grep -v '\-> X')
            fi

            if [ -n "$i_am_master" ]; then
                echo "0;OK - I am master";
            else
                grep -q '^slave_running: 1' $MONFILE && echo "0;OK" || echo "2;Failed ($INSTANCE)";
            fi
        else
            echo "0;OK - inapplicable";
        fi
	;;
	slave_behind)
		# Для standby баз, например, можно поднять максимальное отставание слейва до срабатывания мониторинга.
		MAXTIME="${OPTPARAM:-600}"
		if grep -q '^has_slave: 1' $MONFILE; then
			awk -v threshold=$MAXTIME '/slave_behind/ { time=$2; if (time > threshold) status=2; else if (time > threshold*0.7) status=1; else status=0; } END { print status";"time " seconds behind master" }' $MONFILE | sed "s/master/master ($INSTANCE)/";
		else
			echo "0;OK";
		fi
	;;
	monitor_age)
		[ $((`date +%s` - `stat -c %Y $MONFILE`)) -lt 600 ] && echo '0;OK' || echo "2;Failed ($INSTANCE)"
	;;
	mysql_alive)
		grep -q '^alive: 1' $MONFILE && echo '0;OK' || echo "2;Failed ($INSTANCE)"
	;;
	checksum_active)
		perl -lne '/checksum_active: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || $r == 1) ? "0;OK" : "2;Failed"}' $MONFILE | sed "s/Failed/Failed ($INSTANCE)/"
	;;

	checksum_errors)
		perl -lne '/checksum_errors: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || $r == 0) ? "0;OK" : "2;Failed"}' $MONFILE | sed "s/Failed/Failed ($INSTANCE)/"
	;;
	# https://st.yandex-team.ru/DIRECTADMIN-1821
	trx_max_age)
		perl -lne '/trx_max_age: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || $r < 14400 ) ? "0;OK" : "2;Failed"}' $MONFILE | sed "s/Failed/Failed ($INSTANCE)/"
	;;
	wsrep_cluster_size)
		perl -lne '/wsrep_cluster_size: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || $r > 1) ? "0;OK" : "1;Warning"}' $MONFILE | sed "s/Warning/Warning ($INSTANCE)/"
	;;
	wsrep_cluster_status)
		perl -lne '/wsrep_cluster_status: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || (lc $r) eq "primary") ? "0;OK" : "2;Failed"}' $MONFILE | sed "s/Failed/Failed ($INSTANCE)/"
	;;
	wsrep_connected)
		perl -lne '/wsrep_connected: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || (lc $r) eq "on") ? "0;OK" : "2;Failed"}' $MONFILE | sed "s/Failed/Failed ($INSTANCE)/"
	;;
	wsrep_local_state)
		perl -lne '/wsrep_local_state: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || $r == 4) ? "0;OK" : "2;Failed"}' $MONFILE | sed "s/Failed/Failed ($INSTANCE)/"
	;;
	wsrep_local_state_comment)
		perl -lne '/wsrep_local_state_comment: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || (lc $r) eq "synced") ? "0;OK" : "2;Failed"}' $MONFILE | sed "s/Failed/Failed ($INSTANCE)/"
	;;
	mysql_simple_check_tables)
		[ $((`date +%s` - `stat -c %Y $MONFILECHK`)) -lt 172800 ] && cat $MONFILECHK || echo "1;$MONFILECHK old or doesnt exist"
	;;
	rbac2_write_query_max_time)
		perl -lne '/rbac2_write_query_max_time: (\S+)/ && ($r = $1); END {printf "%s\n", (!defined($r) || $r < 15*60) ? "0;OK" : ($r < 3600 ? "1;Warning" : "2;Failed")}' $MONFILE | sed "s/Failed/Failed ($INSTANCE)/"
	;;
	*)
		usage
	;;
esac
