#!/bin/bash
#
# Copyright 2011, Hortonworks Inc.  All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

err=0;

function check_disks {

  for m in `awk '$3~/ext3/ {printf" %s ",$2}' /etc/fstab` ; do
    fsdev=""
    fsdev=`awk -v m=$m '$2==m {print $1}' /proc/mounts`;
    if [ -z "$fsdev" -a "$m" != "/mnt" ] ; then
      msg_="$msg_ $m(u)"
    else
      msg_="$msg_`awk -v m=$m '$2==m { if ( $4 ~ /^ro,/ ) {printf"%s(ro)",$2 } ; }' /proc/mounts`"
    fi
  done

  if [ -z "$msg_" ] ; then
    echo "disks ok" ; exit 0
  else
    echo "$msg_" ; exit 2
  fi

}

function check_taskcontroller {
  if [ "TODO-SECURITY-ENABLED" == "true" ]; then
    perm=`stat -c %a:%U:%G TODO-TASK-BIN-EXE 2>/dev/null`
    if [ $? -eq 0 ] && [ "$perm" == "6050:root:hadoop" ] ; then
      echo "taskcontroller ok"
    else
      echo 'check taskcontroller' ; exit 1
    fi
  fi
}

function check_jetty {
  hname=`hostname`
  jmx=`curl -s -S -m 5 "http://$hname:50060/jmx?qry=Hadoop:service=TaskTracker,name=ShuffleServerMetrics" 2>/dev/null` ;
  if [ $? -eq 0 ] ; then
    e=`echo $jmx | awk '/shuffle_exceptions_caught/ {printf"%d",$2}'` ;
    e=${e:-0} # no jmx servlet ?
    if [ $e -gt 10 ] ; then
      echo "check jetty: shuffle_exceptions=$e" ; exit 1
    else
      echo "jetty ok"
    fi
  else
    echo "check jetty: ping failed" ; exit 1
  fi
}

function check_link {
  snmp=/usr/bin/snmpwalk
  if [ -e $snmp ] ; then
    $snmp -t 5 -Oe  -Oq  -Os -v 1 -c public localhost if | \
    awk ' {
      split($1,a,".") ;
      if ( a[1] == "ifIndex" ) { ifIndex[a[2]] = $2 }
      if ( a[1] == "ifDescr" ) { ifDescr[a[2]] = $2 }
      if ( a[1] == "ifType" ) { ifType[a[2]] = $2 }
      if ( a[1] == "ifSpeed" ) { ifSpeed[a[2]] = $2 }
      if ( a[1] == "ifAdminStatus" ) { ifAdminStatus[a[2]] = $2 }
      if ( a[1] == "ifOperStatus" ) { ifOperStatus[a[2]] = $2 }
    }
    END {
      up=0;
      for (i in ifIndex ) {
      if ( ifType[i] == 6 && ifAdminStatus[i] == 1 && ifOperStatus[i] == 1 && ifSpeed[i] == 1000000000 ) {
      up=i;
      }
      }
      if ( up == 0 ) { print "check link" ; exit 2 }
      else { print ifDescr[up],"ok" }
    }'
    exit $? ;
  fi
}

# Run all checks
# Disabled 'check_link' for now... 
for check in disks taskcontroller jetty; do
  msg=`check_${check}` ;
  if [ $? -eq 0 ] ; then
    ok_msg="$ok_msg$msg,"
  else
    err_msg="$err_msg$msg,"
  fi
done

if [ ! -z "$err_msg" ] ; then
  echo -n "ERROR $err_msg "
fi
if [ ! -z "$ok_msg" ] ; then
  echo -n "OK: $ok_msg"
fi

echo

# Success!
exit 0
