#!/bin/sh
######################################################################
#
# $Id: webjob-verify-binary,v 1.5 2012/01/07 08:01:24 mavrik Exp $
#
######################################################################
#
# Copyright 2008-2012 The WebJob Project, All Rights Reserved.
#
######################################################################
#
# Purpose: Verify a WebJob binary.
#
######################################################################

IFS=' 	
'

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

XER_OK=0
XER_Usage=1
XER_UnsupportedProcessor=2
XER_UnsupportedOs=3
XER_MissingFile=3
XER_FailedTestJob=4

######################################################################
#
# WvbMain
#
######################################################################

WvbMain()
{
  ####################################################################
  #
  # Punch in and go to work.
  #
  ####################################################################

  PROGRAM=`basename $0`

  ####################################################################
  #
  # Process command line arguments.
  #
  ####################################################################

  WEBJOB_CLIENT=${WEBJOB_CLIENTID-unknown}

  WEBJOB_HOME=

  WEBJOB_TEST_JOB=testenv

  WEBJOB_VERSION=

  while getopts "f:H:j:v:" OPTION ; do
    case "${OPTION}" in
    f)
      WEBJOB_CONFIG="${OPTARG}"
      ;;
    H)
      WEBJOB_HOME="${OPTARG}"
      ;;
    j)
      WEBJOB_TEST_JOB="${OPTARG}"
      ;;
    v)
      WEBJOB_VERSION="${OPTARG}"
      ;;
    *)
      WvbUsage
      ;;
    esac
  done

  if [ ${OPTIND} -le $# ] ; then
    WvbUsage
  fi

  if [ -z "${WEBJOB_VERSION}" ] ; then
    WvbUsage
  fi

  PATH=${PATH}:${WEBJOB_HOME-/usr/local/webjob}/bin ; export PATH

  if [ -z "${WEBJOB_CONFIG}" ] ; then
    WEBJOB_CONFIG=${WEBJOB_HOME}/etc/upload.cfg
  fi

  ####################################################################
  #
  # Determine the current webjob version. Set a flag if it's 1.9.0
  # (ds17) or higher. Older clients use slightly different syntax.
  #
  ####################################################################

  ${WEBJOB} --version | awk '{ split($2,a,"."); major=a[1]; minor=a[2]; patch=a[3]; len=length($3); s=substr($3,2,2); if (s=="ds"){ state=0 } else if (s=="rc") { state=1 } else if (s=="sr") { state=2 } else { state=3 } build=substr($3,4,len-4); version=(major*268435456)+(minor*1048576)+(patch*4096)+(state*1024)+build; if (version >= 277872657) { exit 0 } else { exit 1 } }'
  if [ $? -eq 0 ] ; then
    NO_UPLOAD=1
  else
    NO_UPLOAD=0
  fi

  ####################################################################
  #
  # Determine the OS and processor architecture.
  #
  ####################################################################

  WEBJOB_OS=`uname -s 2> /dev/null`

  WEBJOB_PROCESSOR=`uname -p 2> /dev/null`

  case "${WEBJOB_OS}" in
  AIX)
    WEBJOB_BINARY="webjob-${WEBJOB_VERSION}-aix"
    ;;
  FreeBSD)
    WEBJOB_BINARY="webjob-${WEBJOB_VERSION}-freebsd"
    ;;
  Darwin)
    case "${WEBJOB_PROCESSOR}" in
    i386)
      WEBJOB_BINARY="webjob-${WEBJOB_VERSION}-macos-i386"
      ;;
    powerpc)
      WEBJOB_BINARY="webjob-${WEBJOB_VERSION}-macos-ppc"
      ;;
    *)
      echo "${PROGRAM}: Error='Unsupported processor architecture (${WEBJOB_PROCESSOR}).'" 1>&2
      exit ${XER_UnsupportedProcessor}
      ;;
    esac
    ;;
  Linux)
    WEBJOB_BINARY="webjob-${WEBJOB_VERSION}-linux"
    ;;
  SunOS)
    case "${WEBJOB_PROCESSOR}" in
    i386)
      WEBJOB_BINARY="webjob-${WEBJOB_VERSION}-solaris-i386"
      ;;
    sparc)
      WEBJOB_BINARY="webjob-${WEBJOB_VERSION}-solaris-sparc"
      ;;
    *)
      echo "${PROGRAM}: Error='Unsupported processor architecture (${WEBJOB_PROCESSOR}).'" 1>&2
      exit ${XER_UnsupportedProcessor}
      ;;
    esac
    ;;
  *)
    echo "${PROGRAM}: Error='Unsupported OS (${WEBJOB_OS}).'" 1>&2
    exit ${XER_UnsupportedOs}
    ;;
  esac

  WEBJOB_PAD=${WEBJOB_BINARY}.pad

  ####################################################################
  #
  # Check for a deployed config file.
  #
  ####################################################################

  if [ ! -f ${WEBJOB_CONFIG} ] ; then
    echo "${PROGRAM}: Error='Unable to locate ${WEBJOB_CONFIG}. Job aborted (client=${WEBJOB_CLIENT}).'" 1>&2
    exit ${XER_MissingFile}
  fi

  ####################################################################
  #
  # Test the new binary with the existing config file.
  #
  ####################################################################

  if [ ${NO_UPLOAD} -eq 1 ] ; then
    webjob -e -f ${WEBJOB_CONFIG} --NoUpload ${WEBJOB_PAD} "{ chmod u+x %payload ; ./%payload -e -f ${WEBJOB_CONFIG} --NoUpload ${WEBJOB_TEST_JOB} ; }"
  else
    webjob -e -f ${WEBJOB_CONFIG} ${WEBJOB_PAD} "{ chmod u+x %payload ; ./%payload -e -f ${WEBJOB_CONFIG} ${WEBJOB_TEST_JOB} ; }"
  fi
  if [ $? -ne 0 ] ; then
    echo "${PROGRAM}: Error='Failed to run the test job. Job aborted (client=${WEBJOB_CLIENT}).'" 1>&2
    exit ${XER_FailedTestJob}
  fi

  ####################################################################
  #
  # Cleanup and go home.
  #
  ####################################################################

  exit ${XER_OK}
}


######################################################################
#
# WvbUsage
#
######################################################################

WvbUsage()
{
  echo 1>&2
  echo "Usage: ${PROGRAM} [-c config] [-H webjob-home] [-j test-job] -v version" 1>&2
  echo 1>&2
  exit ${XER_Usage}
}

WvbMain $*
