# Ramon Maceiras PimenTech 1999
# reprise code (changement architecture)

# pour utiliser ces fonctions
# il faut definir :
# ERROR_LOG : le fichier de trace
# DEBUG : le niveau de debug
# NOM_MODULE : le nom du programme
# Defines

SH=sh
GZIP="gzip"
COMPRESS="compress"
BASENAME="basename"
MAIL="mail"
ECHO="echo"
RSH="rsh"
MKDIR="mkdir"
CAT="cat"
TAIL="tail"
GREP="grep"
PS="ps -edf"
AWK="awk"
DATE="date"
CP="cp"
MV="mv"
LS="ls"
RM="rm"
TAR="tar"
FOLD="fold"
CUT="cut"
DIRNAME="dirname"
CONSOLE="/dev/console"
TOUCH="touch"
MKDIR="mkdir"
HOSTNAME="hostname"
NumProc="$$" # pid

############################
# mise en place de la trace
if [ -z "${DEBUG}" ]
then 
  DEBUG=0
fi

${MKDIR} -p -m 777 `${DIRNAME} ${ERROR_LOG}` 2>/dev/null
ERR="$?"
if [ ${ERR} -ne 0 ] # en cas d'erreur on switche sur la console
then
  ${ECHO} "ATTENTION!!! : $0 NE PEUT PAS ECRIRE LE REPERTOIRE DE TRACE -> ERROR_LOG=${CONSOLE}"
  ERROR_LOG=${CONSOLE}
fi

${TOUCH} ${ERROR_LOG}
ERR="$?"
if [ ${ERR} -ne 0 ] # en cas d'erreur on switche sur la console
then
  ${ECHO} "ATTENTION!!! : $0 NE PEUT PAS ECRIRE LE FICHIER DE TRACE -> ERROR_LOG=${CONSOLE}"
  ERROR_LOG=${CONSOLE}
fi
###########################

# gestion des erreurs :
error()
{
  MESSAGE="$1"

  ${ECHO} "`${DATE}`, error : ${MESSAGE}" >> ${ERROR_LOG}

  if [ ${DEBUG} -ge 3 ] 
  then
    ${ECHO} "`${DATE}`, error : ${MESSAGE}"
  fi
}

message() 
{
  MESSAGE="$1" 
  DEBUG_LEVEL="$2"
  if [ -z "${DEBUG_LEVEL}" ]
  then
    DEBUG_LEVEL=${DEBUG}
  fi

  if [ ${DEBUG} -ge ${DEBUG_LEVEL} ]
  then
    ${ECHO} "`${DATE}`, message : ${MESSAGE}" >> ${ERROR_LOG}
    if [ ${DEBUG} -ge 3 ] 
    then
      ${ECHO} "`${DATE}`, message : ${MESSAGE}"
    fi
  fi
}

execute () 
{
  CMD="$1"
  ${ECHO} "$CMD 2> /dev/null ; exit \$?" | ${SH}
  ERR="$?"

  MESSAGE_ON_FAIL="$2"
  if [ -z "${MESSAGE_ON_FAIL}" ]
  then
    MESSAGE_ON_FAIL="${CMD} failed -> ${ERR}"
  fi
  MESSAGE_ON_SUCCESS="$3"
  if [ -z "${MESSAGE_ON_SUCCESS}" ]
  then
    MESSAGE_ON_SUCCESS="${CMD} succeded"
  fi
  DEBUG_LEVEL="$4"
  if [ -z "${DEBUG_LEVEL}" ]
  then
    DEBUG_LEVEL=${DEBUG}
  fi

  if [ ${ERR} -eq 0 ] 
  then 
    message "${MESSAGE_ON_SUCCESS}" "${DEBUG_LEVEL}"
  else
    error "${MESSAGE_ON_FAIL}"
  fi
}

execute_and_get () 
{
  CMD="$1"
  CMD_OUT="`${ECHO} \"$CMD 2> /dev/null ; exit \\$?\" | ${SH}`"
  ERR="$?"

  MESSAGE_ON_FAIL="$2"
  if [ -z "${MESSAGE_ON_FAIL}" ]
  then
    MESSAGE_ON_FAIL="${CMD} failed -> ${ERR}"
  fi
  MESSAGE_ON_SUCCESS="$3"
  if [ -z "${MESSAGE_ON_SUCCESS}" ]
  then
    MESSAGE_ON_SUCCESS="${CMD} succeded -> CMD_OUT=${CMD_OUT}"
  fi
  DEBUG_LEVEL="$4"
  if [ -z "${DEBUG_LEVEL}" ]
  then
    DEBUG_LEVEL=${DEBUG}
  fi

  if [ ${ERR} -eq 0 ] 
  then 
    message "${MESSAGE_ON_SUCCESS}" "${DEBUG_LEVEL}"
  else
    error "${MESSAGE_ON_FAIL}"
  fi
}

# locking

lock()
{
  LOCK_FILE="$1"
  # S'il y a un traitement en cours, on arrete
  if [ -f ${LOCK_FILE} ]
  then
    # Traitement de l'envoi deja actif
    execute_and_get "${AWK} -F\" \" '{print \$10}' ${LOCK_FILE}" "" "" 1
    Num=${CMD_OUT}
    # Verification que ce process est toujours actif
    execute_and_get "$PS | $GREP ${NOM_MODULE} | $GREP ${Num} | $GREP -v grep | $GREP ${Num}" "" "" 1
    Proc_Actif=${CMD_OUT}

    if [ ! -z "${Proc_Actif}" ]
      then
        # Si oui, cas normal
	message "Traitement ${Num} en cours. Arret de ${NumProc}" 1
	exit 0
    fi
  fi
 
  # Marquage pour empecher un autre traitement de debuter
  execute "${ECHO} \"`${DATE}` | Process : ${NumProc} en cours\" > ${LOCK_FILE}" \
	  "Creation du verrou ${LOCK_FILE} impossible" \
          "Creation du verrou ${LOCK_FILE} ok" 1

  if [ ${ERR} -ne 0 ] 
  then 
    exit 1
  fi
}

unlock() 
{
  LOCK_FILE="$1"

  execute "${RM} -rf ${LOCK_FILE}" \
          "Suppression du verrou  ${LOCK_FILE} impossible" \
          "Fin de traitement ${NumProc}" 1
}




