
#!/bin/sh
# File	: log_sysload.sh
# By	: MaratenDeBoer.nl, 090114
# Subject	: Log system load by using uptime
#(0.2)		: Added uuencode & $LOAD15m
#(0.3)	: added -l $USERNAME at ssh
#(0.4,090128)	: added -s at mailx & chaged $CSV filename. Added comments, USAGE
#(0.5,090330)	: --week  & --day added. & compress $OUT after processing it
#(0.6,120215)	: Added .sh,${SSH} & mod. PGM echo -n
#(0.7,120216)	: Added Top1 process
#(0.8, 120412)	: Added more LOGging

PGM="`basename $0|cut -d\. -f1`"
HOSTNAME="`hostname|cut -d\. -f1`"
TMP="/tmp/${PGM}.$$"
DATI="`date +%d-%m-%Y' '%H:%M`"
DATE="`date +%Y-%m-%d`"
TIME="`date +%H:%M`"
LOG="${HOME}/log/${PGM}_${DATE}.log"
VERSION="0.7"
MAILTO="maarten.deboer@atos.net"
LOG="${HOME}/log/${PGM}.log"
OUT="${HOME}/data/${PGM}_${DATE}.out"
CSV="${PGM}_${DATE}.csv"
USERNAME="`whoami`"
MAIL=""
OUTDAY=""
OUTWEEK="1"
DOW=""
SSH="/usr/bin/ssh -n"

USAGE()
{
  echo "Usage: ${PGM} [-h] [-V] [-x] [--help] [--mail]"
  echo "  Version: ${VERSION}"
  echo "  options:"
  echo "    -h : this help"
  echo "    -V : Version"
  echo "    -x : set -x"
  echo "    --help  : this help"
  echo "    --mail  : do send mail"
  echo "    --day   : one file per day (default=${OUTDAY})"
  echo "    --week  : one file per week (default=${OUTWEEK})"
}

# Check options
while [ ${#} -gt 0 ]
  do
  case ${1} in
    --mail) MAIL=1 ;;
    --day) OUTDAY=1; OUTWEEK="" ;;
    --week) OUTWEEK=1; OUTDAY="" ;;
    -h | --help) USAGE; exit 1 ;;
    -V) echo "${PGM}: v${VERSION}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done


#HOSTS="nlxsl069 nlxsl104 nlxsl107 nlxsl114 nlxsl115 nlxsl167"
HOSTS="nlxfsd01 nlxfsd02 nlxfsd03"
#PATH=${PATH}:/opt/omni/bin:/opt/omni/sbin:/appl/tsu/bin/ssh
#PATH=${PATH}

if [ ${OUTDAY} ]; then
  DATE="`date +%Y-%m-%d`"
  OUT="${HOME}/data/${PGM}_${DATE}.out"
  CSV="${PGM}_${DATE}.csv"
  DOW="1"
  # If DOW=1 head will be put into OUT-file. For Dayly OUTs DOW need to be 1
fi
if [ ${OUTWEEK} ]; then
  WEEKNR="`date +%W`" 
  # Day of week (mon=1)
  DOW="`date +%u`" 
  OUT="${HOME}/data/${PGM}_wk${WEEKNR}.out"
  CSV="${PGM}_wk${WEEKNR}.csv"
fi

echo "Outputfile=${OUT}, CSV-file=${CSV}"

touch ${OUT}
echo "`date` ${PGM} v${VERSION} at ${HOSTNAME} started." > ${LOG}

H="`date +%H`"
M="`date +%M`"
# Header at first entry of the day / week
if [ "${H}" = "00" ] && [ "${M}" = "05" ] && [ "${DOW}" = "1" ]; then
  echo "Date; Time; Hostname; Load1m; Load5m ; Load15m; Hostname-2; " | tee -a $OUT
fi

echo -n "${DATE};${TIME};"|tee -a ${OUT}
for HOST in ${HOSTS}
do
  echo "Host ${HOST} ..."|tee -a ${LOG}
  # Get sysload (by uptime) of several servers
  LOAD="`${SSH} -l ${USERNAME} ${HOST} /usr/bin/uptime | awk -F\, '{print $4\";\"$5\";\"$6}'|cut -d: -f2`"
  # Change . into , (for EUR numbers)
  LOAD2="`echo ${LOAD} | sed -e 's/\./,/g'`"
  echo -n "${HOST};${LOAD2};" | tee -a $OUT
  PROCESS1="`${SSH} -l ${USERNAME} ${HOST} /bin/ps -eo pcpu,pid,args|sort -n|tail -1`"
  echo -n "${PROCESS1};"|tee -a ${OUT}
done

echo "" | tee -a ${OUT}
tail -1 ${OUT}|tee -a ${LOG}

# When --day; force DOW=7, so file will be processed.
if [ ${OUTDAY} ]; then
  DOW="7"
fi
# Process file (to CSV & mail) at the end of the day / week (23:50 at Sunday when --week)
if [ "${H}" = "23" ] && [ "${M}" = "50" ] && [ "${DOW}" = "7" ] || [ ${MAIL} ] ; then
  echo "Mailing to ${MAITO} ..."
  cat ${OUT}|/usr/bin/uuencode ${CSV}|mailx -s ":${HOSTNAME}: Systemload logging [${PGM} v${VERSION}]" ${MAILTO}
  gzip -f ${OUT}
fi

exit 0

