#!/bin/bash

warn=50
crit=100
DEBUG=""

while [ "$1" ]; do
  case "$1" in
    -w)
        warn=$2
    	shift
    	;;
    -c)
        crit=$2
        shift
        ;;
    -d|-D)
        DBNAME=$2
        shift
        ;;
    -u|-U)
        DBUSER="-U $2"
        shift
        ;;
    -h|-H)
    	HOST="$2"
    	shift
    	;;
    --debug)
    	DEBUG=1
    	;;
  esac
  shift
done

if [ -z "$HOST" -o -z "$DBNAME" ]; then
  echo "Not ehough parameters!"
  echo "Usage: $0 -H primary_hostname -d db_name [-u username] [-w warn] [-c critical]"
  exit 1
fi

SERVER1="$DBUSER $DBNAME"
SERVER2="-h $HOST $DBUSER $DBNAME"

debug() {
  if [ ! -z "$DEBUG" ]; then
    echo "$@" 1>&2
  fi
}
select1() {
  debug "1: $@"
  psql -At $SERVER1 -c "$@" 
}
select2() {
  debug "2: $@"
  psql -At $SERVER2 -c "$@"
}

TABLES=`select1 \
  "SELECT table_name FROM information_schema.tables
   WHERE table_catalog='osteo' AND table_type='BASE TABLE' AND
     table_schema NOT IN ('pg_catalog', 'information_schema', 'bucardo');" \
  `
sum=0
state=""
script_start=`date +%s.%N`
for table in $TABLES; do
  start=`date +%s.%N`
  pkey=`select1 \
   "SELECT column_name FROM information_schema.table_constraints c
      LEFT JOIN information_schema.key_column_usage k
        ON c.constraint_name=k.constraint_name
           AND c.table_catalog=k.table_catalog
           AND c.table_name=k.table_name
    WHERE constraint_type='PRIMARY KEY' AND c.table_catalog='$DBNAME'
          AND c.table_name='$table';"`
  # multicolumn key?
  pkey="`echo "$pkey" | xargs echo | sed 's/^.* .*$//'`"
  if [ "$pkey" ]; then
    row1=`select1 "SELECT max($pkey) FROM $table;"`
    if [ -z "$row1" ]; then
      row1=0
    fi
    row2=`select2 "SELECT max($pkey) FROM $table;"`
    if [ -z "$row2" ]; then
      row2=0
    fi
  else
    row1=`select1 "SELECT count(*) FROM $table;"`
    row2=`select2 "SELECT count(*) FROM $table;"`
  fi
  end=`date +%s.%N`
  len=`echo $end $start - p | dc`
  diff=`echo $row2 $row1 - p | dc 2>/dev/null`
  debug "$len $table $row1 $row2 $diff"
  if [ "$diff" = "" ]; then
    if [ ! "$row1" = "$row2" ]; then
      state="$state $table=X"
      diff="100"
    fi
  elif [ ! "$diff" = 0 ]; then
    state="$state $table=$diff"
  fi
  sum=$((sum+diff))
done
script_end=`date +%s.%N`
script_time=`echo $script_end $script_start - p | dc`

perfdata="diffsum=$sum time=$script_time"
if [ $sum -lt $warn ]; then
  echo "OK $perfdata$state|$perfdata"
  exit 0
elif [ $sum -lt $crit ]; then
  echo "WARNING $perfdata$state|$perfdata"
  exit 1
else
  echo "CRITICAL $perfdata$state|$perfdata"
  exit 2
fi
