#!/bin/bash
#
# Timothy Brooks 2012 <brooks@cern.ch>
#
# try - keep attempting a command until it returns 0
#
VERSION=1.0

PROG="try"

while getopts "vhd:j:t:" opt; do
  #echo opt: ${opt} arg: ${OPTARG}
  case $opt in
    h)
      PERIOD="NULL"
      break ;;
    v)
      echo ${PROG} ${VERSION}
      exit ;;
    t)
      PERIOD=${OPTARG} ;;
    \?)
      echo "Invalid option: -${OPTARG}" >&2
      PID="NULL"
      break ;;
    :)
      echo "Option -${OPTARG} requires an argument." >&2
      PID="NULL"
      break ;;
  esac
done

function execute {
    $*
    RET=$?
    echo ===== Returned $RET
}

if [ -z "$PERIOD" ]; then
  PERIOD=30
fi

if [ "$PERIOD" == "NULL" ]; then     # print usage message if we still don't have a period
  echo "usage: ${PROG} [options] " >&2
  echo "" >&2
  echo "options:" >&2
  echo "  -v                    show program's version number and exit" >&2
  echo "  -h                    show this help message and exit" >&2
  echo "  -p PERIOD             retry period" >&2
  exit 0
fi

all=("$@")
cmd=${all[@]:${OPTIND} - 1}

execute ${cmd}
while [ $RET -ne 0 ]
do
    sleep ${PERIOD}
    execute ${cmd}
done
