#!/bin/sh
######################################################################
#
# $Id: pad-script-guts,v 1.3 2004/03/13 17:26:28 mavrik Exp $
#
######################################################################
#
# Copyright 2002-2004 The WebJob Project, All Rights Reserved.
#
######################################################################
#
# PaD technology is part of The WebJob Project and is distributed
# under same terms and conditions as WebJob.
#
# WebJob is available at: http://webjob.sourceforge.net
#
######################################################################
IFS=' 	
'
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
PROGRAM=`basename "$0"`
XER_OK=0
XER_BootStrap=1
XER_ProcessArguments=2
XER_Suffix=3
XER_Basename=4
XER_Delimiter=5
XER_Extract=6
XER_Deliver=7
PaDBootStrap()
{
  PAD_DELIMITER=PAD_GUTS_DELIMITER
  PAD_MUTE=0
  PAD_PAYLOAD_TOKEN=%payload
  PAD_SUFFIX=.pad
  PAD_BASENAME=`basename "$0" ${PAD_SUFFIX}`
  PAD_PAYLOAD=`echo "$0" | sed "s/${PAD_SUFFIX}$//"`
}
PaDCheckBasename()
{
  BASENAME=$1
  SUFFIX=$2
  if [ "${BASENAME}" = "." -o "${BASENAME}" = ".." -o "${BASENAME}" = "${SUFFIX}" ] ; then
    ERROR="PaDCheckBasename(): Error='Invalid or missing basename.'"
    return 1
  fi
}
PaDCheckSuffix()
{
  BASENAME=$1
  PROGNAME=$2
  if [ "${BASENAME}" = ${PROGNAME} ] ; then
    ERROR="PaDCheckSuffix(): Error='Invalid or missing suffix.'"
    return 1
  fi
}
PaDDeliverPayload()
{
  PAYLOAD=$1 ; shift
  MUTE=$1 ; shift
  COMMAND_LINE="$*"
  if [ "${MUTE}" = "0" ] ; then
    echo "Delivering payload... ${COMMAND_LINE}" 1>&2
  fi
  trap "rm -f ${PAYLOAD} ; ERROR=\"PaDDeliverPayload(): Error='Caught a signal.'\" ; return 1" 1 2 15
  eval ${COMMAND_LINE}
  STATUS=$?
  if [ "${MUTE}" = "0" ] ; then
    echo "DeliveryStatus='${STATUS}'" 1>&2
  fi
  rm -f ${PAYLOAD}
}
PaDExtractPayload()
{
  PAYLOAD=$1
  MUTE=$2
  if [ "${MUTE}" = "0" ] ; then
    echo "Extracting payload..." 1>&2
  fi
  umask 22
  tail +${PAD_SKIP} $0 > ${PAYLOAD}
  if [ $? -ne 0 ] ; then
    ERROR="PaDExtractPayload(): Error='Failed to extract payload.'"
    rm -f ${PAYLOAD}
    return 1
  fi
}
PaDLocateDelimiter()
{
  DELIMITER=${1-PAD_GUTS_DELIMITER}
  MAX_LINES=${2-200}
  HEAD_COUNT=`head -${MAX_LINES} $0 | sed "/^${DELIMITER}$/q" | wc -l | awk '{print $1}'`
  GREP_COUNT=`head -${MAX_LINES} $0 | grep "^${DELIMITER}$" | wc -l | awk '{print $1}'`
  if [ ${GREP_COUNT} -lt 1 ] ; then
    ERROR="PaDLocateDelimiter(): Error='Missing PaD delimiter.'"
    return 1
  fi
  PAD_SKIP=`expr ${HEAD_COUNT} + 1`
}
PaDProcessArguments()
{
  if [ -n "$*" ] ; then
    PAD_COMMAND_LINE=`echo "$*" | sed "s!${PAD_PAYLOAD_TOKEN}!${PAD_PAYLOAD}!g"`
    if [ -z "${PAD_COMMAND_LINE}" ] ; then
      ERROR="PaDProcessArguments(): Error='Failed to initialize delivery command.'"
      return 1
    fi
  fi
}
PaDMain()
{
  PaDBootStrap
  if [ $? -ne 0 ] ; then
    echo "PaDMain(): ${ERROR-?}" 1>&2 ; return ${XER_BootStrap}
  fi
  PaDProcessArguments $*
  if [ $? -ne 0 ] ; then
    echo "PaDMain(): ${ERROR-?}" 1>&2 ; return ${XER_ProcessArguments}
  fi
  PaDCheckBasename "${PAD_BASENAME}" "${PAD_SUFFIX}"
  if [ $? -ne 0 ] ; then
    echo "PaDMain(): ${ERROR-?}" 1>&2 ; return ${XER_Basename}
  fi
  PaDCheckSuffix "${PAD_BASENAME}" "${PROGRAM}"
  if [ $? -ne 0 ] ; then
    echo "PaDMain(): ${ERROR-?}" 1>&2 ; return ${XER_Suffix}
  fi
  PaDLocateDelimiter "${PAD_DELIMITER}"
  if [ $? -ne 0 ] ; then
    echo "PaDMain(): ${ERROR-?}" 1>&2 ; return ${XER_Delimiter}
  fi
  PaDExtractPayload "${PAD_PAYLOAD}" "${PAD_MUTE}"
  if [ $? -ne 0 ] ; then
    echo "PaDMain(): ${ERROR-?}" 1>&2 ; return ${XER_Extract}
  fi
  if [ -n "${PAD_COMMAND_LINE}" ] ; then
    PaDDeliverPayload "${PAD_PAYLOAD}" "${PAD_MUTE}" "${PAD_COMMAND_LINE}"
    if [ $? -ne 0 ] ; then
      echo "PaDMain(): ${ERROR-?}" 1>&2 ; return ${XER_Deliver}
    fi
  fi
  return ${XER_OK}
}
PaDMain $* ; exit $?
