#!/bin/sh
# (c) Copyright 1996 James H. Lowe, Jr.
#
#$Id: shak_admin_v 1.11 1997/01/10 00:24:07 jhl Exp $
#

if [ "$shak_rootonly0" = yes -a \( "$SHAK_REALLOGIN" != root -o "$SHAK_USERLOGIN" != root \) ]; then
      echo "shak_admin: you must be root to perform admin functions." 1>&2
      exit 1
fi

case  $SHAK_indexfilesecure in
   yes) userpattern='${SHAK_USERLOGIN}'
        ;;
     *) userpattern='[^:]*'
        ;;
esac

TMPFILE_OUT="${shak_tmpbasename}.shak_admin1.$$"
umask 077

if [ "$shak_debug" -ge "2" ]; then
	set -vx
fi

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

set -- `$shak_getopt o:s:x: $* 2>$TMPFILEOPT`

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

exclusive=0
mode=0
setstatus=0
setstate=0
setactive=0



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
  -o)
      mode=1
      setactive=1
      exclusive="` expr $exclusive + 1 `"
      shift;
      shak_filespec="$1"
      shift;
      ;;
  -x)
      mode=2
      setstatus=1
      shift;
      exclusive="` expr $exclusive + 1 `"
      shak_filespec="$1"
      shift;
      ;;
  -s)
      mode=3
      setstate=1
      exclusive="` expr $exclusive + 1 `"
      shift;
      shak_filespec="$1"
      shift;
      ;;
  --)
      shift
      break;
      ;;
  esac
done

case $exclusive in
	1) :
	   ;;
	*) exit 1
	   echo "shak_admin: Invalid args" 1>&2
	   ;;
esac

if [ $setstatus = 1 -o $setstate = 1 -o $setactive = 1 ]; then
	echo "$shak_filespec" | egrep  -l -e '^[0-9][0-9]*:[0-9][0-9]*:[0-9][0-9]*-.*$' -e '^[0-9][0-9]*:[0-9][0-9]*-.*$' 1>/dev/null
	if [ $? -ne 0 ]; then
		echo "shak_admin : invalid file specification  $shak_filespec" 1>&2
		echo "shak_admin :     example form    0004:2-1" 1>&2
		exit 2
	fi
	shakuservalue="`echo "$shak_filespec" | sed -e 's/^.*-//'`"
	SHAK_TAPENUMBER="`echo "$shak_filespec" | sed -e 's/^\([^:]*\):.*/\1/'`"
	FILE_NUMBER="`echo "$shak_filespec" | sed -e 's/^[^:]*:\([^:-]*\).*/\1/'`"
	SHAK_TAPENUMBER="`echo $SHAK_TAPENUMBER | awk '{ printf ("%04s\n",$1) }'`"

	SHAK_INDEXFILE="`${SHAK_LIBPATH}/shak_indexfile`"

	if [ ! $? -eq 0 ]; then
		echo "shak_admin: Invalid indexfile file name." 1>&2
		exit 1
	fi
	export SHAK_INDEXFILE
	FFIND="`sickdelay=$delay_readfile ${SHAK_LIBPATH}/shak_remsh ${SHAK_REMSH} ${SHAK_INDEXHOST} "ls ${SHAK_INDEXFILE} 2>/dev/null"`"
	if [ "$FFIND" ]; then
		:
	else
		echo "shak_admin: indexfile $SHAK_INDEXFILE not found." 1>&2
		exit 2
	fi


	SHAK_TAPEHOST=$SHAK_INDEXHOST
        SHAK_TAPEDEVICE=/dev/null	
	export SHAK_TAPEHOST
	export SHAK_TAPENUMBER
        export SHAK_TAPEDEVICE 
	if [ "$SHAK_devicesecure" = "yes" ]; then
              ${SHAK_LIBPATH}/shak_waitlock 5
              retval=$?
              if [ $retval -eq 0 ]; then
                       :
              else
                    exit $retval
              fi
        fi

	${SHAK_LIBPATH}/shak_makenewindex
	if [ ! $? -eq 0 ]; then
		echo "shak_admin: internal error while moving index file: ${SHAK_LIBPATH}" 1>&2
		echo "shak_admin: manual fixing may be required." 1>&2
		exit 1
	fi


	case $mode in
		1)
        		${SHAK_LIBPATH}/shak0_read_file ${SHAK_INDEXHOST} ${SHAK_INDEXFILE}.bak </dev/null |
			sed -e "s@\(^File ${FILE_NUMBER}:"'.*\):[^:]*\(:'"$userpattern"':[^:]*:[^:]*:[^:]*:[^:]*\)__SHAK__$@'"\1:${shakuservalue}\2__SHAK__"@ |
			tee $TMPFILE_OUT |
		        ${SHAK_LIBPATH}/shak0_append_file ${SHAK_INDEXHOST} ${SHAK_INDEXFILE}
			;;			
		2)
        		${SHAK_LIBPATH}/shak0_read_file ${SHAK_INDEXHOST} ${SHAK_INDEXFILE}.bak </dev/null |
			sed -e "s@\(^File ${FILE_NUMBER}:"'.*:[^:]*:[^:]*:'"$userpattern"':[^:]*\):[^:]*\(:[^:]*:[^:]*\)__SHAK__$@'"\1:${shakuservalue}\2__SHAK__"@ |
			tee $TMPFILE_OUT |
		        ${SHAK_LIBPATH}/shak0_append_file ${SHAK_INDEXHOST} ${SHAK_INDEXFILE}
			;;
		3)
        		${SHAK_LIBPATH}/shak0_read_file ${SHAK_INDEXHOST} ${SHAK_INDEXFILE}.bak </dev/null |
			sed -e "s@\(^File ${FILE_NUMBER}:"'.*:[^:]*:[^:]*:'"$userpattern"':[^:]*:[^:]*\):[^:]*\(:[^:]*\)__SHAK__$@'"\1:${shakuservalue}\2__SHAK__"@ |
			tee $TMPFILE_OUT |
		        ${SHAK_LIBPATH}/shak0_append_file ${SHAK_INDEXHOST} ${SHAK_INDEXFILE}
			;;

	esac

        diff="`${SHAK_LIBPATH}/shak0_read_file ${SHAK_INDEXHOST} ${SHAK_INDEXFILE}.bak </dev/null  | diff - $TMPFILE_OUT | wc -l`"

#	if [ $diff -eq 0 ]; then
#		echo "shak_admin: index header not changed." 1>&2
#	fi
	if [ $diff -ne 4 -a $diff -ne 0 ]; then
		echo "shak_admin: internal error, race condition realized or other error" 1>&2
		echo "shak_admin: ${SHAK_INDEXFILE} may require manual fixing." 1>&2
        	${SHAK_LIBPATH}/shak0_read_file ${SHAK_INDEXHOST} ${SHAK_INDEXFILE}.bak </dev/null  | diff - $TMPFILE_OUT 1>&2
		/bin/rm  "$TMPFILE_OUT"
	        ( trap '' 1 2 15; "${SHAK_LIBPATH}/shak_unlock" ) &	
		exit 3
	fi
	/bin/rm "$TMPFILE_OUT"
	( trap '' 1 2 15; "${SHAK_LIBPATH}/shak_unlock" ) &	
	exit 0
fi

exit 1
