#!/bin/sh
# $Id: clockspeed-conf.in,v 1.6 2003/04/16 12:38:59 patrick Exp $
# Author: Patrick Atamaniuk <atamaniuk at frobs.net>
#
# see man 8 clockspeed-conf
#
# environment tunables:
#CLOCKSPEED_INSTALLATION="DJB"
#CLOCKSPEED_INSTALLATION="FreeBSD_PORT"
#CLOCKSPEED_INSTALLATION="custom"
# set ETCDIR to conf-home/etc (e.g. /etc/clockspeed/
# and BINDIR to path to clockspeed (e.g. /usr/local/bin)
# and optionally ADJUSTFILE if not ETCDIR/adjust
# and optionally ATTOFILE if not ETCDIR/atto
#ADJUST_LOGDIR  defaults to main
#VA=yes   shortcut for 'ADJUST_LOGDIR=clockspeed-adjust'
#
[ -z "${CLOCKSPEED_INSTALLATION}" ] && CLOCKSPEED_INSTALLATION="FreeBSD_PORT"

PATH=/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/command:${PATH}
VERSION=0.4.5
REVISION=0
usage() {
	echo
	echo "clockspeed-conf-${VERSION}_${REVISION}:"
	echo 'Usage: clockspeed-conf acct logacct DIR proto server-ip'
	echo 'proto: tai | ntp'
	echo 'e.g. clockspeed-conf clockspeed log /var/service/clockspeed ntp `dnsip ntps1-0.some.provider.moon`'
	echo
	exit 99
}

clockspeed_installwarn() {
    echo
    echo 'cannot find clockspeed on default location,'
    echo $1
    echo 'please set environment CLOCKSPEED_INSTALLATION'
    echo '(and ETCDIR and BINDIR) to appropriate values.'
    echo
    exit 99
}



if [ -z "${PREFIX}" ]; then
	PREFIX="/usr/local"
fi


##########################################
#get commandline parameters
[ -z "$1" ] && usage
ACCT="$1"
if ! id ${ACCT} >/dev/null; then echo;echo "${ACCT}: no such account"; usage; fi

[ -z "$2" ] && usage
LOGACCT="$2"
if ! id ${LOGACCT} >/dev/null; then echo;echo "${LOGACCT}: no such account"; usage; fi

[ -z "$3" ] && usage
INSTBASE="$3"

[ -z "$4" ] && usage
PROTO="$4"
case ${PROTO} in
  tai*)
	SYNCPROG="taiclock"
	;;
  ntp*|sntp*)
	SYNCPROG="sntpclock"
	;;
  *)
	echo ${PROTO} ': invalid protocol'
	usage
esac

[ -z "$5" ] && usage
SERVER="$5"
##########################################
#
# set default directory name for multilog
[ -z "${ADJUST_LOGDIR}" ] && ADJUST_LOGDIR="main"
# but if VA is defined, log to verbose named directory
[ -n "${VA}" ] && ADJUST_LOGDIR="clockspeed-adjust"


##########################################
#look for chown, we need full path in clockspeed-adjust/run script
CHOWN=`which chown`
while [ -z "${CHOWN}" ]; do
  echo -n 'Cannot locate binary "chown", please give full path:'
  read CHOWN
  if [ ! -f ${CHOWN} ]; then CHOWN=""; fi
done
##########################################


##########################################
case ${CLOCKSPEED_INSTALLATION} in
    FreeBSD_PORT)
        ETCDIR="${PREFIX}/etc/clockspeed"
	BINDIR="${PREFIX}/bin"
	;;
    DJB)
        ETCDIR="${PREFIX}/clockspeed/etc"
	BINDIR="${PREFIX}/clockspeed/bin"
	ADJUSTFILE="${PREFIX}/clockspeed/adjust"
	;;
    custom)
        # we expect ETCDIR and BINDIR from environment !!!
        ;;
esac

[ -z "${ADJUSTFILE}" ] && ADJUSTFILE="${ETCDIR}/adjust"
[ -z "${ATTOFILE}" ] && ATTOFILE="${ETCDIR}/atto"
CLOCKSPEED="${BINDIR}/clockspeed"
SNTPCLOCK="${BINDIR}/${SYNCPROG}"
CLOCKVIEW="${BINDIR}/clockview"
CLOCKADD="${BINDIR}/clockadd"

if [ ! -d "${BINDIR}" ]; then clockspeed_installwarn "BINDIR not properly set"; fi
if [ ! -x "${BINDIR}/clockspeed" ]; then clockspeed_installwarn "clockspeed not found in BINDIR"; fi
if [ ! -d "${ETCDIR}" ]; then clockspeed_installwarn "ETCDIR not properly set"; fi


##########################################
INSTCA="${INSTBASE}-adjust"
INSTCS="${INSTBASE}-speed"

echo "Installing clockadjust run to ${INSTCA}"
echo "Installing clockspeed run to ${INSTCS}"
echo "Expecting clockspeed in ${BINDIR}"
echo "Expecting atto file in ${ATTOFILE}"
echo "Expecting adjust pipe in ${ADJUSTFILE}"

mkdir -p ${INSTCA}


cat << __EOF__ > ${INSTCA}/run-adjust
#!/bin/sh
# generated by clockspeed-conf-${VERSION}_${REVISION}
#
# script to do the time measurements for clockspeed
# automatically - it runs forever
# based on Frank Tegtmeyer <fte at pobox.com>, based on an idea
# of Tim Goodwin

exec 2>&1

if [ \`id -u\` -eq 0 ]; then
	echo "MUST NOT RUN AS ROOT"
	sleep 600
	exit
fi

maximum_wait=\${MAXIMUM_WAIT}
sleep=\${INITIAL_WAIT}
server=\${SERVER_IP}

while true
do
   # wait a while
   echo Sleeping \$sleep seconds ...
   sleep \$sleep
   # get new measurement
   ${BINDIR}/${SYNCPROG} \${server} \\
	| tee "${ADJUSTFILE}" \\
	| ${CLOCKVIEW}
   [ -f ${ATTOFILE} ] && ${CLOCKVIEW} < "${ATTOFILE}"
   echo '----------------------'
   # double the time
   sleep=\`expr \$sleep + \$sleep\`
   # cut the value
   if [ \$sleep -gt \$maximum_wait ]
     then
     sleep=\$maximum_wait
   fi
done
#.
__EOF__

chmod 755 ${INSTCA}/run-adjust




cat << __EOF__ > ${INSTCA}/run
#!/bin/sh
# generated by clockspeed-conf-${VERSION}_${REVISION}
PATH="/command:${PREFIX}/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:sbin" export PATH
exec 2>&1
while [ ! -p "${ADJUSTFILE}" ]; do
  echo "Waiting for ${ADJUSTFILE}"
  sleep 10
done
chgrp ${ACCT}  "${ADJUSTFILE}"
chmod 0720  "${ADJUSTFILE}"
exec setuidgid ${ACCT} envdir ./env ./run-adjust
#.
__EOF__

chmod 700 ${INSTCA}/run



mkdir -p ${INSTCA}/env
[ ! -f ${INSTCA}/env/MAXIMUM_WAIT ] && echo "7884000" > ${INSTCA}/env/MAXIMUM_WAIT
[ ! -f ${INSTCA}/env/INITIAL_WAIT ] && echo "600" > ${INSTCA}/env/INITIAL_WAIT
[ ! -f ${INSTCA}/env/SERVER_IP ] && echo "${SERVER}" > ${INSTCA}/env/SERVER_IP



mkdir -p ${INSTCA}/log
mkdir -p ${INSTCA}/log/${ADJUST_LOGDIR}
${CHOWN} ${LOGACCT}  ${INSTCA}/log/${ADJUST_LOGDIR}

cat << __EOF__ > ${INSTCA}/log/run
#!/bin/sh
# generated by clockspeed-conf-${VERSION}_${REVISION}
PATH=/command:/usr/local/bin:\$PATH
exec setuidgid ${LOGACCT} multilog t s100000 n2 ./${ADJUST_LOGDIR}
__EOF__

chmod 700 ${INSTCA}/log/run
echo "Adjust logs into ${INSTCA}/log/${ADJUST_LOGDIR}"








mkdir -p ${INSTCS}

cat << __EOF__ > ${INSTCS}/run
#!/bin/sh
# generated by clockspeed-conf-${VERSION}_${REVISION}
exec 2>&1
envdir ./env /bin/sh -c '${SNTPCLOCK} \${SERVER_IP} | ${CLOCKADD}'
exec ${CLOCKSPEED}
__EOF__

chmod 700 ${INSTCS}/run

mkdir -p ${INSTCS}/env

[ ! -e ${INSTCS}/env/SERVER_IP ] && ln -s ${INSTCA}/env/SERVER_IP ${INSTCS}/env/SERVER_IP


cat << __EOF__
****************************************************
*
* Now check the scripts and environment settings in
* ${INSTCA}
* ${INSTCS}
* and make symlinks to your /service directory
*
****************************************************
__EOF__

#.
