#!/bin/sh
#
# modelo_script.sh
# Comentario descritivo do programa
# incluindo revisor/data de alteracao
# Se for um script agendado, incluir sintaxe do cron
#

#=====! Opcoes e atributos configuraveis do script !=====
MAX_RETENCAO=500
MAIL_TO=operador@dominio

PROG=`basename $0`
DIR_PROG=`dirname $0`; DIR_PROG=`cd $DIR_PROG; pwd`
SCRIPT=`echo $PROG | sed 's/\.sh$//'`
USERNAME=`id | sed 's/^uid=[0-9]*(//; s/).*//'`

DIR_LOG=$DIR_PROG/log
LOG=$DIR_LOG/$SCRIPT.log
TMP_PID=/var/tmp/$SCRIPT.pid
TMP_LOG=/var/tmp/${SCRIPT}_$$.log
TMP_TRUNC=/var/tmp/${SCRIPT}_$$.trunc
TMP_MAIL=/var/tmp/cab_mail_$$.txt


##### fn_fim_script #####

fn_fim_script()
{
	# Retencao de log: Preserva no maximo MAX_RETENCAO linhas anteriores no log
	if [ `cat $LOG 2> /dev/null | wc -l` -gt $MAX_RETENCAO ]; then
		echo "##### $PROG: Preservadas apenas as $MAX_RETENCAO ultimas linhas\n" > $TMP_TRUNC
		tail -$MAX_RETENCAO $LOG >> $TMP_TRUNC
		mv $TMP_TRUNC $LOG
	fi

	# Envia o arquivo de LOG corrente por email e o anexa ao LOG cumulativo
	if [ -f $TMP_LOG ]; then
		cat > $TMP_MAIL <<EOT
Subject: Resultado do script $PROG

EOT
		cat $TMP_LOG >> $LOG
		cat $TMP_MAIL $TMP_LOG | mail $MAIL_TO
	fi

	# Remove arquivos temporarios
	rm -f $TMP_PID $TMP_LOG $TMP_TRUNC $TMP_MAIL
}


##### fn_erro #####

fn_erro()
{
	SAIR=$1
	shift
	case $SAIR in
		[sSyY]*|1)
			echo "$PROG ERRO : $*" >&2
			[ -f $TMP_LOG ] && echo "##### $PROG ERRO : $*" >> $TMP_LOG
			fn_fim_script
			exit 1 ;;
		*)
			echo "$PROG Aviso: $*" >&2
			echo "##### $PROG Aviso: $*" >> $TMP_LOG  ;;
	esac
} # fn_erro


##### fn_trap #####

fn_trap()
{
	fn_erro N "Script interrompido em `date`"
	fn_fim_script
	exit 2
} # fn_trap


########## Programa Principal ##########

# Garante a execucao de apenas uma instancia do script
if [ -s $TMP_PID ]; then
	PID=`cat $TMP_PID`
	if ps -p $PID 2> /dev/null >&2; then
		echo "$PROG: Outra instancia em execucao PID=$PID em `date`" >&2
		exit 3
	fi
fi
echo $$ > $TMP_PID

# Pre-condicoes
[ "$USERNAME" = "admin" ] || fn_erro S "Execute este script como admin."
[ -d $DIR_LOG ] || mkdir $DIR_LOG

# Impede a interrupcao por HANGUP (1), INTERRUPT (2) e TERMINATE (15)
trap "fn_trap" 1 2 15

(
cat <<EOT

======================================================================
$PROG INICIO: `date`
----------------------------------------------------------------------
EOT


... aqui_entram_seus_comandos ...

cat <<EOT
----------------------------------------------------------------------
$PROG TERMINO: `date`
======================================================================

EOT
) >> $TMP_LOG 2>&1

fn_fim_script
exit 0

#fim