#! /bin/sh ## $Revision: 1.10 $ ## SH script to send UUCP batches out. By Mike Cooper and Rich $alz. ## Based on B News sendbatch 1.22 10/29/89. ## =()<. @<_PATH_SHELLVARS>@>()= . /usr/lib/news/innshellvars ## Place to run a df, and amount of space needed. UUSPOOL=/usr/spool/uucp SPOOLFREE=20000 ## Program names and flags. Most can be set on the command-line. C7= COMP= COMPFLAGS= COMPRESS=/usr/bin/compress ECHO= ## Not a config param since this is the remote rnews. RNEWS=rnews UUX=uux UUXFLAGS="- -r -n -gd" ## Desired size of each batch, total number of bytes we want to queue. DEFBYTES=50000 BYTESQUEUED=1000000000 PROG=`basename $0` LOCK=${LOCKS}/LOCK.${PROGNAME} ## Go to where the action is. cd ${BATCH} ## Loop over command line. for SITE do ## Is this a flag? case "${SITE}" in -s*) DEFBYTES=`expr "${SITE}" : '-s\(.*\)'` continue ;; -m*) BYTESQUEUED=`expr "${SITE}" : '-m\(.*\)'` continue ;; +m) BYTESQUEUED='' continue ;; -p*) BYTESPERRUN=`expr "${SITE}" : '-p\(.*\)'` continue ;; +p) BYTESPERRUN='' continue ;; -r*) RNEWS=`expr "${SITE}" : '-r\(.*\)'` continue ;; -U*) UUX=`expr "${SITE}" : '-U\(.*\)'` continue ;; -u*) UUXFLAGS=`expr "${SITE}" : '-u\(.*\)'` continue ;; -c7) COMP="; exec ${COMPRESS} ${COMPFLAGS} | $LIB/encode" ECHO="echo '#! c7unbatch'" continue ;; -c) COMP="; exec ${COMPRESS} ${COMPFLAGS}" ECHO="echo '#! cunbatch'" continue ;; -g) # AKL COMP="; exec /bin/gzip" ECHO="echo '#! gunbatch'" continue ;; +c) COMP='' C7='' ECHO='' COMPFLAGS='' continue ;; -[bBC]*) COMPFLAGS="${COMPFLAGS} ${SITE}" continue ;; -o*) ECHO=`expr "${SITE}" : '-o\(.*\)'` RNEWS='cunbatch' continue ;; +o) ECHO='' RNEWS=rnews continue ;; -D*) UUSPOOL=`expr "${SITE}" : '-D\(.*\)'` continue ;; +D) UUSPOOL='' continue ;; -f*) SPOOLFREE=`expr "${SITE}" : '-f\(.*\)'` continue ;; esac test -z "${BYTESPERRUN}" && BYTESPERRUN=${BYTESQUEUED} ## We have a site; lock it. LOCK=${LOCKS}/LOCK.${SITE} trap 'rm -f ${LOCK} ; exit 1' 1 2 3 15 shlock -p $$ -f ${LOCK} || { echo "${PROG}: ${SITE} Locked by `cat ${LOCK}`." continue } ## Flush the batchfile. BATCHFILE=${BATCH}/${SITE}.uucp if [ -f ${SITE}.work ] ; then cat ${SITE}.work >>${BATCHFILE} rm -f ${SITE}.work fi mv ${SITE} ${SITE}.work ctlinnd -s -t30 flush ${SITE} || { echo "${PROG}: Can't flush ${SITE}." rm -f ${LOCK} continue } cat ${SITE}.work >>${BATCHFILE} rm -f ${SITE}.work if [ ! -s ${BATCHFILE} ] ; then echo "${PROG}: No articles for ${SITE}." rm -f ${LOCK} continue fi ## Check free space on the partition? if [ -n "${UUSPOOL}" ] ; then FREE=`(cd ${UUSPOOL}; df . | ${AWK} ' $6 == "'${UUSPOOL}'" { print $4 ; exit } $1 == "'${UUSPOOL}'" && NF == 7 { print $4 ; exit } $2 == "'${UUSPOOL}'" { print $5 ; exit } $1 == "'${UUSPOOL}'" { print $3 ; exit } ')` # if [ -n "${FREE}" -a "${FREE}" -lt ${SPOOLFREE} ] ; then # if [ -n "${FREE}" -a "${FREE}" -lt "${SPOOLFREE}" ] ; then # echo "${PROG}: No space on ${UUSPOOL} for ${SITE} (${FREE})." # rm -f ${LOCK} # continue # fi fi ## Check the host's queue size? QUEUE=0 if [ -n "${BYTESQUEUED}" ] ; then if [ -d /usr/spool/uucp/${SITE} ] ; then # Get queue size from directory size QUEUE=`du -s "/usr/spool/uucp/${SITE}" \ | ${AWK} '{ printf("%s000\n", $1); }'` else ## Get queue size from uuq command. QUEUE=`uuq -l -s${SITE} | ${AWK} '{print $4; exit }'` fi test -z "${QUEUE}" && QUEUE=0 if [ "${QUEUE}" -gt ${BYTESQUEUED} ] ; then echo "${PROG}: ${SITE} has ${QUEUE} bytes queued." rm -f ${LOCK} continue fi fi ## Set how many bytes we can queue this time. if [ -z "${BYTESQUEUED}" ] ; then BATCHBYTES=${BYTESPERRUN} else BATCHBYTES=`expr ${BYTESQUEUED} - "${QUEUE}"` test ${BATCHBYTES} -gt ${BYTESPERRUN} && BATCHBYTES=${BYTESPERRUN} fi # Say how big each batch should be. Assume 50% compression. if [ -n "${COMP}" ] ; then MAXBYTES=`expr ${DEFBYTES} \* 2` else MAXBYTES=${DEFBYTES} fi ## Assemble uux command to have batcher(1) run. if [ -f ${SITE}.cmd ] ; then UUXCOM="`cat ${SITE}.cmd`" elif [ -n "${ECHO}" -o -n "${COMP}" ]; then UUXCOM="( ${ECHO} ${COMP} ) | ${UUX} - ${UUXFLAGS} ${SITE}!${RNEWS}" else UUXCOM="${UUX} - ${UUXFLAGS} ${SITE}!${RNEWS}" fi ## Create batches. if [ ${BATCHBYTES} -gt 0 ] ; then ${NEWSBIN}/batcher -B ${BATCHBYTES} -b ${MAXBYTES} -p "${UUXCOM}" \ ${SITE} ${BATCHFILE} fi rm -f ${LOCK} done