#!/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="DJB"
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__
#.
syntax highlighted by Code2HTML, v. 0.9.1