#!/bin/bash
#
# test_mysql_status
#
# Steuerung ueber Environment:
#   ULSNAME: ULS-Hostname
#   ULSSECTION: Section im ULS
#   MYSQL_SOCKET: Socket zur DB - wenn Socket gesetzt, wird Host und Port ignoriert
#   MYSQL_HOST: oder Host
#   MYSQL_PORT: und Port, wenn abweichend von 3306
#   MYSQL_USER: User zur DB
#   MYSQL_PASSWORD: Password zur DB
#   MYSQL_STATUS_CONF: optionale Datei mit Konfiguration ueber Umfang
#
###################################################################################
#
if [[ -z "$MYSQL_USER" ]]
 then
  if [[ -f /etc/uls/mysql.conf ]]
   then
    . /etc/uls/mysql.conf
  else
    echo "/etc/uls/mysql.conf not found."
    exit 0
  fi
fi
#
unset D S U
#
while getopts d:Su:? op
 do
  case "$op" in
    d) D="-d $OPTARG";;
    S) S="-S";;
    u) U="-u $OPTARG";;
    *) echo "usage: $0 [-d storepath] [-S|-u ulsserver]"
       exit 1;;
  esac
done
shift $(( $OPTIND - 1 ))
#
. `dirname $0`/uls_header $1
#
callmysql()
{ if [[ -n "$MYSQL_SOCKET" ]]
   then
    mysql $2 -B -S "$MYSQL_SOCKET" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "$1"
  elif [[ -n "$MYSQL_PORT" ]]
   then
    mysql $2 -B -h "$MYSQL_HOST" -P "$MYSQL_PORT"  -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "$1"
  elif [[ -n "$MYSQL_HOST" ]]
   then
    mysql $2 -B -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "$1"
  else
    mysql $2 -B -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "$1"
  fi
}
#
CONF="${MYSQL_STATUS_CONF:-/etc/uls/mysql_status.conf}"
if [[ ! -f "$CONF" ]]
 then
  echo "Error: no config file found."
  exit 0
fi
#
if [[ -n "$MYSQL_SOCKET" ]]
 then
  SAVESTATUS=/dev/shm/uls.mysql.${MYSQL_SOCKET//\//_}.status.last
else
  SAVESTATUS=/dev/shm/uls.mysql.$MYSQL_HOST.status.last
fi
#
export LANG=C
export LC_CTYPE=en_US.UTF-8
#
( L=`callmysql "select @@character_set_client" -N`
  echo "L;;;;;;$L;"
  echo "D;$DT;${ULSNAME:-${ULSHOSTNAME:-`hostname`}};${ULSSECTION:-MySQL};"
  ( if [[ -f $SAVESTATUS ]]
     then
      cat $SAVESTATUS
    else
      callmysql "show /*!50000 GLOBAL */ status" -N
      sleep 10
    fi
    echo "MAGIC7348576"
    if callmysql "show /*!50000 GLOBAL */ status" -N >$SAVESTATUS
     then
      echo "MAGIC73485ON"
    else
      echo "MAGIC73485OF"
    fi
    cat $SAVESTATUS
    echo "MAGIC7348576"
    grep -v '^ *#' /etc/uls/mysql_status.conf
  ) | awk '
function flformat(f)
{ if( f < 0.0000001 )
    d = 0
  else
  { d = 4 - log(f)/2.3
    if( d < 0 )
     d = 0
  }
  return sprintf("%0.*f", d, f)
}
BEGIN { C = 0 }
/MAGIC73485ON/ { print "V;;;;Status;Database;Available;" }
/MAGIC73485OF/ { print "V;;;;Status;Database;Down;" }
/MAGIC7348576/ { if( ++C == 2 )
                   s = w1["Uptime"] - w0["Uptime"]
               }
NF >= 2 { if( C == 2 )
          { m = ($3 == "") ? "t" : $3
            if( $4 == "" )
            { e = "#"
              f = 1
            }
            else
            { if( split($4, g, ":") > 1 )
                f = g[2]
              else
                f = 1
              e = g[1]
              if( e == "" )
                e = "#"
            }
            for( a in w1 )
            { if( a ~ "^"$2"$" )
              { if( w1[a] ~ "^[-+]?[0-9]+$" )
                { if( m ~ "t" )
                  { if( f == 1 )
                      print "V;;;;Status:" $1 ";" a ";" w1[a] ";" e
                    else
                      print "V;;;;Status:" $1 ";" a ";" flformat(w1[a]/f) ";" e
                  }
                  if( m ~ "d" )
                  { if( f == 1 )
                      print "V;;;;Status:" $1 ";D-" a ";" w1[a] - w0[a] ";" e
                    else
                      print "V;;;;Status:" $1 ";D-" a ";" flformat((w1[a] - w0[a])/f) ";" e
                  }
                  if( m ~ "s" && s > 0 )
                  { if( f == 1 )
                      print "V;;;;Status:" $1 ";" a "/s;" flformat((w1[a] - w0[a])/s) ";" e "/s"
                    else
                      print "V;;;;Status:" $1 ";" a "/s;" flformat((w1[a] - w0[a])/f/s) ";" e "/s"
                  }
                  if( m ~ "u" && w1["Uptime"] > 0 )
                  { if( f == 1 )
                      print "V;;;;Status:" $1 ";" a "/uptime;" flformat(w1[a]/w1["Uptime"]) ";" e "/s"
                    else
                      print "V;;;;Status:" $1 ";" a "/uptime;" flformat(w1[a]/f/w1["Uptime"]) ";" e "/s"
                  }
                }
                else if( w1[a] != "" )
                  print "V;;;;Status:" $1 ";" a ";" w1[a] "; "
              }
            }
          }
          else if( C == 1 && $2 != "NULL" )
            w1[$1] = $2
          else if( $2 != "NULL" )
            w0[$1] = $2
        }
') | send_test_tab $D $S $U
