#!/bin/sh
######################################################################
#
# $Id: pmcf-builder,v 1.6 2012/01/07 08:01:13 mavrik Exp $
#
######################################################################
#
# Copyright 2003-2012 The WebJob Project, All Rights Reserved.
#
######################################################################
#
# Purpose: Download, compile, and verify a source archive.
#
######################################################################

IFS=' 	
'

PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/usr/ccs/bin:/usr/pkg/bin

BUILD_SYSTEM=`uname -s`

case "${BUILD_SYSTEM}" in
MINGW32*)
  PATH=${PATH}:/c/WINNT/system32:/c/WINDOWS/system32:/c/Perl/bin
  ;;
esac

PROGRAM=`basename "$0"`

######################################################################
#
# Cleanup
#
######################################################################

Cleanup()
{
  MY_KEEP_FLAG=$1
  MY_LIST=$2
  if [ ${MY_KEEP_FLAG} -eq 0 ] ; then
    rm -rf ${MY_LIST}
  fi
}

######################################################################
#
# Usage
#
######################################################################

Usage()
{
  echo 1>&2
  echo "Usage: ${PROGRAM} [-gksT] [-C cflags] [-U url] [-c cfg-file] [-d dsv-tree] [-h webjob-home] [-p pass] [-t tmp-tree] [-u user] -f pad-file" 1>&2
  echo 1>&2
  exit 1
}

######################################################################
#
# Punch in and go to work.
#
######################################################################

umask 77

######################################################################
#
# Process arguments and initialize variables.
#
######################################################################

while getopts "C:U:c:d:f:gh:kp:sTt:u:" OPTION ; do
  case ${OPTION} in
  C) CFLAGS="${OPTARG}" ;;
  U) BASE_URL="${OPTARG}" ;;
  c) CFG_FILE="${OPTARG}" ;;
  d) DSV_TREE="${OPTARG}" ;;
  f) PAD_FILE="${OPTARG}" ;;
  g) USE_GPG=Y ;;
  h) WEBJOB_HOME="${OPTARG}" ;;
  k) KEEP_BUILD_TREE=1 ;;
  p) BUILD_PASSWORD="${OPTARG}" ;;
  s) USE_SSL=Y ;;
  T) RUN_TESTS=Y ;;
  t) TMP_TREE="${OPTARG}" ;;
  u) BUILD_USERNAME="${OPTARG}" ;;
  *) Usage ;;
  esac
done

BASE_URL=${BASE_URL-http://webjob.sourceforge.net}

CFG_FILE=${CFG_FILE--}

DATE=`date "+%Y-%m-%d-%H%M%S"`

HOST=`hostname | awk -F. '{print $1}'`

HR="perl -e 'print qq(=-)x36,chr(10),shift,chr(10);'"

KEEP_BUILD_TREE=${KEEP_BUILD_TREE-0}

BUILD_PASSWORD=${BUILD_PASSWORD-builder}

TARGET_VERSION=1.6.0

case "${BUILD_SYSTEM}" in
MINGW32*)
  TMP_TREE=${TMP_TREE-/c/temp}
  ;;
*)
  TMP_TREE=${TMP_TREE-/tmp}
  ;;
esac

BUILD_USERNAME=${BUILD_USERNAME-builder}

USE_GPG=${USE_GPG-N}

USE_SSL=${USE_SSL-N}

WEBJOB_HOME=${WEBJOB_HOME-/usr/local/webjob}

PATH=${PATH}:${WEBJOB_HOME}/bin ; export PATH

if [ -n "${CFLAGS}" ] ; then
  export CFLAGS
fi

if [ ! -d ${TMP_TREE} ] ; then
  mkdir -p ${TMP_TREE}
  if [ $? -ne 0 ] ; then
    echo "${PROGRAM}: Error='Unable to create tmp tree (${TMP_TREE}).'" 1>&2
    exit 2
  fi
fi
TMP_TREE=`( cd ${TMP_TREE} && pwd )`
if [ -z "${TMP_TREE}" ] ; then
  echo "${PROGRAM}: Error='Unable to access tmp tree (${TMP_TREE}).'" 1>&2
  exit 2
fi

if [ -z "${PAD_FILE}" ] ; then
  Usage
else
  TGZ_FILE=`basename "${PAD_FILE}" .pad`
  case "${BUILD_SYSTEM}" in
  MINGW32*)
    SRC_NAME=`basename "${TGZ_FILE}" .tgz.exe`
    ;;
  *)
    SRC_NAME=`basename "${TGZ_FILE}" .tgz`
    ;;
  esac
  APP_NAME=`echo ${SRC_NAME} | sed 's/-.*$//;'`
  BUILD_NAME=${APP_NAME}-${DATE}-$$
  BUILD_TREE=${TMP_TREE}/${BUILD_NAME}
  SRC_TREE=${BUILD_TREE}/${SRC_NAME}
  DST_TREE=${BUILD_TREE}/webjob
fi

CONFIGURE_OPTS="--prefix=${DST_TREE} --with-server-side --with-all-tools"
if [ "${USE_SSL}"X = "N"X ] ; then
  CONFIGURE_OPTS="${CONFIGURE_OPTS} --without-ssl"
fi

MAKE_TARGETS=all
if [ "${RUN_TESTS}"X = "Y"X ] ; then
  MAKE_TARGETS="${MAKE_TARGETS} test"
fi
MAKE_TARGETS="${MAKE_TARGETS} install"

if [ -d ${BUILD_TREE} ] ; then
  Cleanup "0" "${BUILD_TREE}"
fi

mkdir -p ${BUILD_TREE}
if [ $? -ne 0 ] ; then
  echo "${PROGRAM}: Error='Unable to make build tree (${BUILD_TREE}).'" 1>&2
  Cleanup "${KEEP_BUILD_TREE}" "${BUILD_TREE}"
  exit 2
fi

######################################################################
#
# Build the PaD command.
#
######################################################################

case "${BUILD_SYSTEM}" in
MINGW32*)
  DEPLOY="
{
  ${HR} 'Deploying...' ;
  tar -C ${BUILD_TREE} -zxf ${BUILD_TREE}/${TGZ_FILE} ;
}"
 ;;
*)
  DEPLOY="
{
  ${HR} 'Deploying...' ;
  gunzip -c %payload | ( cd ${BUILD_TREE} && tar -xf - ) ;
}"
 ;;
esac

COMPILE="
{
  ${HR} 'Compiling...' ;
  ( cd ${SRC_TREE} && ./configure ${CONFIGURE_OPTS} && make ${MAKE_TARGETS} ) 2>&1 ;
}"

VERIFY="
{
  ${HR} 'Verifying...' ;
  ${DST_TREE}/bin/${APP_NAME} 2>&1 ;
  ${DST_TREE}/bin/${APP_NAME} --version ;
}"

FINISH="
{
  ${HR} 'Finishing...' ;
}"

PAD_COMMAND="
{
  ${DEPLOY} && ${COMPILE} && ${VERIFY} ; ${FINISH} ;
}"

case "${BUILD_SYSTEM}" in
MINGW32*)
  TempDirectory=`echo ${BUILD_TREE} | sed 's,^/\([A-Za-z]\),\1:,; s,/,\\\\,g;'`
  DsvCertificateTree=`echo ${DSV_TREE-${WEBJOB_HOME}/dsv} | sed 's,^/\([A-Za-z]\),\1:,; s,/,\\\\,g;'`
  cat > ${BUILD_TREE}/pmcf-pad-command << EOF
#!/bin/sh
PATH=\${PATH}:/c/WINNT/system32:/c/WINDOWS/system32:/c/Perl/bin
${PAD_COMMAND}
EOF
  PAD_COMMAND="copy %payload ${TempDirectory} && c:\msys\1.0\bin\sh --login ${BUILD_TREE}/pmcf-pad-command"
 ;;
*)
  TempDirectory=${BUILD_TREE}
  DsvCertificateTree=${DSV_TREE-${WEBJOB_HOME}/dsv}
 ;;
esac

######################################################################
#
# Locate webjob (webjob or webjob-<host>), and check its version.
#
######################################################################

OLD_IFS=${IFS}
IFS=:
for DIR in ${PATH} ; do
  TARGET_WEBJOB=${DIR}/webjob
  if [ -x ${TARGET_WEBJOB} ] ; then
    WEBJOB=${TARGET_WEBJOB}
    break;
  fi
  TARGET_WEBJOB=${DIR}/webjob-${HOST}
  if [ -x ${TARGET_WEBJOB} ] ; then
    WEBJOB=${TARGET_WEBJOB}
    break;
  fi
done
IFS=${OLD_IFS}

ACTUAL_VERSION=`${WEBJOB} --version | awk '{print $2}'`
case "${ACTUAL_VERSION}" in
1.[6-9].*)
  : # This version is good enough to continue.
  ;;
*)
  echo "${PROGRAM}: Error='This script requires webjob ${TARGET_VERSION} or higher.'" 1>&2
  Cleanup "${KEEP_BUILD_TREE}" "${BUILD_TREE}"
  exit 2
  ;;
esac

######################################################################
#
# Download the source archive and execute the PaD command.
#
######################################################################

${WEBJOB} -e -f ${CFG_FILE} ${PAD_FILE} ${PAD_COMMAND} << EOF
URLGetURL=${BASE_URL}/cgi-bin/nph-webjob.cgi
URLPutURL=${BASE_URL}/cgi-bin/nph-webjob.cgi
ClientId=${BUILD_USERNAME}
URLUsername=${BUILD_USERNAME}
URLPassword=${BUILD_PASSWORD}
URLAuthType=basic
TempDirectory=${TempDirectory}
OverwriteExecutable=Y
UnlinkOutput=N
UnlinkExecutable=N
UploadOnGetFailure=Y
GetTimeLimit=300
RunTimeLimit=1800
PutTimeLimit=300
GetHookEnable=${USE_GPG}
GetHookSuffix=.gpg
GetHookCommandLine=gpg --batch --decrypt --output %tp %vp #> /dev/null 2>&1
GetHookStatus=0
DsvVerifySignature=Y
DsvCertificateTree=${DsvCertificateTree}
EOF

######################################################################
#
# Shutdown and go home.
#
######################################################################

Cleanup "${KEEP_BUILD_TREE}" "${BUILD_TREE}"

