#!/bin/sh
# (c) Copyright 1995 James H. Lowe, Jr.
#
#$Id: shak_run_v 1.50 1997/03/23 16:12:01 jhl Exp $
#

PROG_ARGS="$*"

unset SHAK_SHAKDATE_U
unset SHAK_TIME_T_U

if [ "$shak_mailflag" = "yes" -a "${shak_Q}" = 0 -a "${shak_no_run_user}" = 0 ]; then
	echo "${SHAK_HOST}:${SHAK_PID}:\"${PROG_ARGS}\"" |
	${SHAK_LIBPATH}/shak_mail $shak_mailuser "SHAK: shak_run: backup beginning. ${SHAK_PID}"
fi

TMPFILE_ENV="${shak_tmpbasename}run.config$$"
umask 077
>$TMPFILE_ENV
env | sed -e 's@=.*@@' >>$TMPFILE_ENV

if [ "$shak_debug" -ge "2" ]; then
	set -vx
fi
run_space_command=""
shak_stderrfile=""
# No. of days (rounded up) in 32-bit Unix epoch.
shak_outdated="24856"
type=fullu

TMPFILEOPT="${shak_tmpbasename}run.getopt$$"

shakargs=""
until [ $# = 0 ];
do
        case $1 in
		--filter-date)
			shift
			SHAK_SHAKDATE_U="$1"

			if [ "$SHAK_SHAKDATE_U" ]; then
			       	SHAK_TIME_T_U="`${SHAK_LIBPATH}/shak_mkstrtime "$SHAK_SHAKDATE_U"`"
			       	if [ $SHAK_TIME_T_U = "-1" ]; then
		                	echo "shak_run: invalid date: $SHAK_SHAKDATE_U" 1>&2
					exit 1 
        			fi
			else
				echo "shak_run: invalid date: $SHAK_SHAKDATE_U" 1>&2
				exit 1 
			fi
			shift
		        export SHAK_SHAKDATE_U
			export SHAK_TIME_T_U
			break
			;;
		--)
			break
			;;
		*) 	shakargs="$shakargs $1"
			shift
			;;
	esac
done

aftergetopt="`$shak_getopt bmMqo:t:h:r:T:x $shakargs 2>$TMPFILEOPT`"
set -- $aftergetopt "$@"

if [ $? != 0 ]; then
    /bin/rm -f $TMPFILEOPT
    echo "shak_run: invalid args" 1>&2
    exit 1
fi

grep '.' <$TMPFILEOPT
if [ "$?" = "0" ]; then
   /bin/rm -f $TMPFILEOPT
   echo "shak_run: invalid options." 1>&2
   exit 1
fi
/bin/rm -f $TMPFILEOPT

for i in $*; do
 case $1 in
  -b)
      shift;
      if [ $shak_batchmode -gt 0 ]; then
      	echo "shak_run: invalid args, batchmode designated twice." 1>&2
	exit 1
      fi
      shak_batchmode=1
      shak__batchmode=1
      export shak__batchmode
      ;; 

  -t) shift
      if [ $# -lt 1 ]; then
         echo "shak_run: invalid args" 1>&2
	 exit 1
      fi
      type=$1
      shift
      ;;
  -m) shift;
      if [ $# -lt 1 ]; then
         echo "shak_run: invalid args" 1>&2
	 exit 1
      fi
      shak_errmon=1
      shak_async=1
      ;;
  -M) shift;
      if [ "$shak_async" = "1" -a "$shak_errmon" = "1" ]; then
          shak_async=0
          shak_errmon=0
      fi  
      ;;
  -h) shift
      if [ $# -lt 1 ]; then
         echo "shak_run: invalid args" 1>&2
	 exit 1
      fi
      SHAK_BACKHOST="$1"
      shift
      ;;
  -o)
      shift;
      shak_outdated="$1"
      shift;
      ;;
  -r) shift
      if [ $# -lt 1 ]; then
         echo "shak_run: invalid args" 1>&2
	 exit 1
      fi
      shak_stderrfile="$1"
      shift
      ;;
  -T) shift
      if [ $# -lt 1 ]; then
         echo "shak_run: invalid args" 1>&2
	 exit 1
      fi
      run_space_command="$1"
      SHAK_DEFAULTTEST='t'
      shift
      ;;
  -x)
       shak_expert="1";
       shift;
       ;;
  --)
      shift
      break;
      ;;
  esac
done

# Require that --filter-date "date" is last option.
# So now check for it.

if [ $shak_errmon = 1 -a  "$shak_stderrfile" = "" ]; then
	shak_stderrfile="${shak_tmpbasename_a}${SHAK_USERLOGIN}.$$"
fi

export shak_stderrfile
export shak_outdated
export shak_batchmode
export shak_errmon
export shak_async
export run_space_command

if [ $shak_batchmode -gt 2 -a \( $type = "full" -o $shak_expert = "1" \) ]; then
   echo "shak_run: invalid args, only first backup in a batch may overwite a tape." 1>&2
   if [ $shak__batchmode = 1 ]; then
   	echo "${SHAK_HOST}:${SHAK_PID}:"$*"" |
   	${SHAK_LIBPATH}/shak_mail $shak_mailuser "SHAK: shak_run: ERROR: illegal backup type in batch mode."
   fi 
   exit 1
fi

if [ $# -eq 0 ]; then
   echo "shak_run: invalid args" 1>&2
   if [ $shak__batchmode = 1 ]; then
   	echo "${SHAK_HOST}:${SHAK_PID}:"$*"" |
   	${SHAK_LIBPATH}/shak_mail $shak_mailuser "SHAK: shak_run: ERROR: invalid arguments."
   fi
   exit 1
fi

if [ $shak_noindexfile = 1 ]; then
	case $type in
		full|fullu|0|diff|incr)
				shak_catcherror=0;
				export shak_catcherror
				;;
	esac
fi

if [ ! "$SHAK_BACKHOST" ]; then
  SHAK_BACKHOST=localhost
fi

name="$1"
shift
echo $name | egrep '^/|^\./' 1>/dev/null 
if [ $? -ne 0 ]; then
    name="`basename $name`"
    fullname0="${SHAK_USERPATH}/${name}"
else
    fullname0="$name"
fi

if [ -f /bin/hostname ]; then
   B="`/bin/hostname | sed -e 's/^\([^\.]*\)\..*/\1/'`"
else
   B="`hostname | sed -e 's/^\([^\.]*\)\..*/\1/'`"
fi

cmdhost="`echo $SHAK_BACKHOST | sed -e 's/^\([^\.]*\)\..*/\1/'`"
if [ "$cmdhost" = "$B" -o "$cmdhost" = "localhost" ]; then
 SHAK_BACKHOST="$B"
 if [ ! -r ${fullname0} ]; then
   echo " shak_run: ${fullname0} not found."
   exit 2
 fi
 if [ "$shak_nouserconfig" = "0" ]; then
   	TMPFILE="${shak_tmpbasename}run1$$"
   	${SHAK_LIBPATH}/shak_config  ${fullname0} $TMPFILE $TMPFILE_ENV
   	. $TMPFILE 
   	/bin/rm -f $TMPFILE $TMPFILE_ENV
   	. ${SHAK_LIBPATH}/shak_export
 fi
else
	SHAK_BACKHOST="`echo $SHAK_BACKHOST | sed -e 's/^\([^\.]*\)\..*/\1/'`"
fi
export SHAK_BACKHOST

/bin/rm -f $TMPFILE $TMPFILE_ENV

if [ $shak_batchmode -eq 1 ]; then
	export shak_batchmode
        SHAK_SHAKTYPE="$type"
        export SHAK_SHAKTYPE
	if [ "$shak_no_run_user" -gt "1" -o "$shak_Q" -eq "1" ]; then	
		:
	else
		${SHAK_LIBPATH}/shak_waitlock $shak_waittime
		retval=$?
		if [ $retval -eq 0 ]; then
			:
		else
			exit $retval
		fi
	fi
	
	if [ "$SHAK_TAPENUMBER" = "NULL" ]; then
		SHAK_TAPENUMBER="`${SHAK_LIBPATH}/shak_gettapenumber`"	
		if  [ $? -ne 0 ]; then
			echo "shak_run: error in shak_gettapenumber" 1>&2
			exit 1
		fi
		if [ "$SHAK_TAPENUMBER" = "$SHAK_tapenumber" ]; then    
			shak_verifyi=0
		else
			if [ "$shak_verifyi" -eq 1 ]; then
				echo "shak_run: incorrect tape loaded/specified or tape unspecified." 1>&2
				exit 1
			else
				SHAK_tapenumber="$SHAK_TAPENUMBER"
			fi
		fi
	fi 	
	export SHAK_TAPENUMBER
	${SHAK_LIBPATH}/shak_runbatch "${fullname0}" "$@"
	exit $?
else
	case $type in
	  full)
	     SHAK_SHAKTYPE="full"
	     fullshak0name="${SHAK_LIBPATH}/shak.full"
	     ;;
	  fullu)
	     SHAK_SHAKTYPE="fullu"
	     fullshak0name="${SHAK_LIBPATH}/shak.diff"
	     ;;
	  diff)
	     SHAK_SHAKTYPE="diff"
	     fullshak0name="${SHAK_LIBPATH}/shak.diff"
	     ;;
	  diffs)
	     SHAK_SHAKTYPE="diffs"
	     fullshak0name="${SHAK_LIBPATH}/shak.diff"
	     ;;
	  incr)
	     SHAK_SHAKTYPE="incr"
	     fullshak0name="${SHAK_LIBPATH}/shak.diff"
	     ;;
	  incrs)
	     SHAK_SHAKTYPE="incrs"
	     fullshak0name="${SHAK_LIBPATH}/shak.diff"
	     ;;
	  0)
	     SHAK_SHAKTYPE="0"
	     case $shak_expert in
	     	0)	fullshak0name="${SHAK_LIBPATH}/shak.diff"
			;;
		
		*)	fullshak0name="${SHAK_LIBPATH}/shak.full"
			;;
	     esac
	     ;;
	  [1-9])
	     SHAK_SHAKTYPE="$type"
	     fullshak0name="${SHAK_LIBPATH}/shak.diff"
	     ;;
	  *)
	     echo "Usage: shak_run type backup_pgm" 1>&2
	     echo "   invalid backup 'type'" 1>&2
	     exit 2
	esac
	
	if [ "$shak_expert" -gt "0" ]; then
	    case $type in
	    	full)   SHAK_SHAKTYPE="full"
	    		;; 
	    	    0)  SHAK_SHAKTYPE="0"
	    		;;
		    *)  echo "shak_run: improper backup type or dump level."  1>&2
		        echo "shak_run: Must use full or 0 when using expert mode."  1>&2
			exit 2
		    	;;
	    esac
	    fullshak0name="${SHAK_LIBPATH}/shak.full"
	fi
	
	export SHAK_SHAKTYPE
	export SHAK_BACKHOST
	
	if [ "$shak_quickrun" = "1" ]; then

	        if [ "$SHAK_SHAKDATE_U" ]; then
	    	         SHAK_SHAKDATE="$SHAK_SHAKDATE_U"
       		         SHAK_SHAKDATEL="$SHAK_SHAKDATE_U"
        	fi
        	if [ "$SHAK_TIME_T_U" ]; then
               		 SHAK_TIME_T="$SHAK_TIME_T_U"
               		 SHAK_TIME_T_L="$SHAK_TIME_T_U"
        	fi

		if [ "$shak_debug_locks" = "yes" ]; then
			if [ "$shak_no_run_user" -gt "1" -o "$shak_Q" -eq "1" -o "$SHAK_devicesecure" != "yes" -o "$shak_batchmode" -ge 2 ]; then
				:
			else
				${SHAK_LIBPATH}/shak_waitlock $shak_waittime
				retval=$?
				if [ $retval -eq 0 ]; then
					:
				else
					exit $retval
				fi
			fi
		fi			
         	${SHAK_LIBPATH}/shak_rbk ${fullname0} "$@"
	  	exit $?
	fi
	
	${fullshak0name} ${fullname0} "$@"
	retval=$?
	if [ ! $retval -eq 0 ]; then
	   echo "shak_run: error" 1>&2
	   if [ "$shak_mailflag" = "yes" -a "${shak_Q}" = 0 -a "${shak_no_run_user}" = 0 ]; then
		echo "${SHAK_HOST}:${SHAK_PID}:\"${PROG_ARGS}\"" |
		${SHAK_LIBPATH}/shak_mail $shak_mailuser "SHAK: shak_run: ERROR: backup exit value: $retval"
	   fi
	   exit $retval
	fi
	if [ "$shak_mailflag" = "yes" -a "${shak_Q}" = 0 -a "${shak_no_run_user}" = 0 ]; then
		echo "${SHAK_HOST}:${SHAK_PID}:\"${PROG_ARGS}\"" |
		${SHAK_LIBPATH}/shak_mail $shak_mailuser "SHAK: shak_run: backup exit value: 0"
	fi
	exit 0
fi
