
#!/bin/sh
# File  : chk_rc-diff.sh
# By    : Maarten.deBoer@AtosOrigin.com, 180501
# Subject       : Script to Check if RC file has been changed(diff)
#(0.2),180501,MdB	: Some updates
#(0.3),180502		: Changed from chk_rc-files.sh to chk_rc-diff.sh. Add INIT & FORCE
#(0.4),180502	: Added PURGE of RC-files /Filer
#(0.5),180502	: Added use FHOSTNAME in stead of FILER for name in DATADIR (so you can use IP-addresse in FILERS-file
#(0.6),180503	: Add echo at Creating new CR-file
#(0.7),180523	: Added MAIL=""
PGM="`basename $0|cut -d\. -f1`"
VER="0.7"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
FILERS="${HOME}/etc/filers"
SSH="/usr/bin/ssh -n"
HOSTNAME=`hostname |cut -d\. -f1`
MAILTO="maarten.deboer@atos.net"
MAIL=""
FILTER="[?]*"
INIT=""
FORCE=""
DIFFCNT=0
PURGECNT=10

DATADIR="/appl/dfm/rc-files"

USAGE()
{
  echo "Usage: ${PGM} [<options>]"
  echo "  Version: ${VER}"
  echo "  options        :"
  echo "    -f           : Filter "
  echo "    -h | --help  : this help"
  echo "    -m | --mail  : Mail result"
  echo "    -V           : Version"
  echo "    -x           : set -x"
  echo "    --initialize : Initialize (create new .rc-files)"
  echo "    --mailto     : change Mailto (${MAILTO})"
}
# Check options
while [ ${#} -gt 0 ]
  do
  case ${1} in
    --initialize) INIT=1 ;;
    --force) FORCE=1 ;;
    --mailto) MAILTO="${2}"; MAIL=1; shift ;;
    -f) FILTER="${2}" ; shift ;;
    -m | --mail) MAIL=1 ;;
    -h | --help) USAGE; exit 1 ;;
    -V) echo "${PGM}: v${VER}"; exit 2 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done

echo "`date` ${PGM} v${VER}  started"|tee -a ${LOG}
if [ ! -d ${DATADIR} ]; then
  echo "  NO data-dir (${DATADIR}) available. Exiting ..."|tee -a ${LOG}
  exit 3
fi

cd ${DATADIR}
mkdir .test
EC=${?}
if [ ${EC} -ne 0 ]; then
  echo "  NOT be able to create (test)dir in DATADIR (${DATADIR}). Exiting ..."|tee -a ${LOG}
  exit 4
else
  rmdir .test
fi
echo "`date` diff's of RC-files:" > ${TMP}
echo ${DIFFCNT} > ${TMP}.cnt

cat ${FILERS}|grep -v ^#|awk '{print $1}'|grep ${FILTER}| while read FILER REST
do  
  FHOSTNAME=`${SSH} ${FILER} "hostname"`
  echo "  ${FILER} (${FHOSTNAME}) ..."
  if [ ! -d ${FHOSTNAME} ]; then
    mkdir ${FHOSTNAME}
  fi
  DATI=`date +%Y-%m-%d-%H-%M-%S`
# Collect RC-file and save as one with Date&Time-stamp
  ${SSH} ${FILER} "rdfile /etc/rc" > ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}_${DATI}
  if [ ${INIT} ]; then
    if [ -f ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}.rc ] && [ ! ${FORCE} ]; then
      echo "  RC-file ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}.rc already exists. Please add option --force"|tee -a ${LOG} ${TMP}
    else
      echo "  Creating NEW RC-file ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}.rc (from ${FHOSTNAME}:/etc/rc)"|tee -a ${LOG}
      ${SSH} ${FILER} "rdfile /etc/rc" > ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}.rc
    fi  # -f
  fi  # INIT
# Check collected RC-file with current one
  if [ -f ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}.rc ]; then
    echo "  Check ${FILER}-RC with ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}_${DATI} ..."
    cat ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}.rc|grep -v ^# > ${TMP}.rc
    cat ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}_${DATI}|grep -v ^# > ${TMP}.dati
    diff ${TMP}.rc ${TMP}.dati > ${TMP}.diff
    EC=${?}
    if [ ${EC} -ne 0 ]; then
# Diff found.
      echo "  Diff in ${FHOSTNAME} RC-file:"|tee -a ${LOG} ${TMP}
      DIFFCNT=`cat ${TMP}.cnt`
      DIFFCNT=`expr ${DIFFCNT} + 1`
      cat ${TMP}.diff >> ${TMP}
      echo ${DIFFCNT} > ${TMP}.cnt
    fi  # EC

    rm ${TMP}.rc ${TMP}.dati ${TMP}.diff
  else  # -f
    echo "  NO current .rc-file for ${FHOSTNAME}"| tee -a ${LOG} ${TMP}
  fi  # -f
# Purge
  FILECNT=`ls -1 ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}_*|wc -l`
  CNT=`expr ${FILECNT} - ${PURGECNT}` 
  if [ ${CNT} -lt 0 ]; then
    CNT=0
  fi
  ls -1 ${DATADIR}/${FHOSTNAME}/${FHOSTNAME}_*|head -${CNT}|while read LINE
  do
    echo "  Purging ${LINE}"|tee -a ${LOG}
    rm -f ${LINE}
  done  # ls -1
done  # cat ${FILERS}

# Report space of DATADIR
echo "" >> ${TMP}
DIFFCNT=`cat ${TMP}.cnt`
echo "  ${DIFFCNT} diff('s) found."|tee -a ${TMP}
echo "" >> ${TMP}
echo "  Usage of ${DATADIR} = `df -h ${DATADIR}|grep '%'|grep -v Filesystem`" | tee -a ${TMP}

if [ ${MAIL} ]; then
  cat ${TMP}|mailx -s ":${HOSTNAME}: Check diff's of RC-files [${PGM} v${VER}]" ${MAILTO}
  echo "  Mailed to ${MAILTO}"|tee -a ${LOG}
fi  # MAIL

rm ${TMP} ${TMP}.cnt
echo "`date` ${PGM} v${VER} finished"|tee -a ${LOG}
exit 0

