home *** CD-ROM | disk | FTP | other *** search
- #! /bin/sh
- # @(#)getmap.sh 1.15 2/5/89 14:13:35
- #
- # Copyright (C) 1988 Ronald S. Karr and Landon Curt Noll
- #
- # See the file COPYING, distributed with smail, for restriction
- # and warranty information.
-
- # getmap - unshar usenet map articles into the UNSHAR_MAP_DIR directory
- #
- # usage: getmap [-m mapdir] [-w workdir] [-b batchfile] [-u username]
- #
- # -m mapdir - 'mapdir' is where maps are unpacked,
- # by default 'mapdir' is $UNSHAR_MAP_DIR
- # -w workdir - where logs and default batch files are kept,
- # by default 'workdir' is 'mapdir'/work
- # -b batch - 'batch' is a file of filenames to unshar,
- # '-' impiles read filenames from stdin,
- # by default 'batch' is 'workdir'/batch
- # -u username - errors are Emailed to 'username' rather than
- # Posmaster, the username '-' imples that
- # the errors should be written to standard error
- # -n newsgroups - allowed newsgroups for articles
- #
- # unsharmap errors will be emailed to the postmaster.
- #
- # default files:
- # $UNSHAR_MAP_DIR - maps are unpacked here
- # $UNSHAR_MAP_DIR/work/getmap.log - log of getmap activity and errors
- # $UNSHAR_MAP_DIR/work/getmap.err - like getmap.log + skipped lines
- # removed if no major unshar errors
- # $UNSHAR_MAP_DIR/work/batch - default list of artciles to unshar
- # batch.work - tmp copy of batch work, normally
- # $UNSHAR_MAP_DIR/work/batch.work,
- # ignored if "-w -"
-
- # locations and constants
- #
- PATH="/usr/bin:/bin:/usr/local/bin"
- UTIL_BIN="/usr/spool/maps/bin"
- UNSHAR_MAP_DIR="/usr/spool/maps"
- UNSHAR=$UTIL_BIN/unsharmap
-
- # set defaults value for location that can change by option
- #
- MAPDIR=$UNSHAR_MAP_DIR
- WORKDIR=$MAPDIR/work
- BATCH=$WORKDIR/batch
- USERNAME=postmaster
- NEWSGROUPS=comp.mail.maps:sub.config.maps
-
- # parse args
- #
- PROG=$0
- USAGE="usage: $PROG [-m mapdir] [-w workdir] [-b batch] [-u username]"
- set -- `getopt -n $PROG -q m:w:b:u:n: $*`
- if [ $? != 0 ]; then
- echo $USAGE 1>&2
- exit 1
- fi
- for i in $*; do
- case $i in
- -m) MAPDIR=$2; shift 2;;
- -w) WORKDIR=$2; shift 2;;
- -b) BATCH=$2; shift 2;;
- -u) USERNAME=$2; shift 2;;
- -n) NEWSGROUPS=$2; shift 2;;
- --) shift; break;;
- esac
- done
- if [ "$#" -ne 0 ]; then
- echo $USAGE 1>&2
- exit 2
- fi
- if [ "$BATCH" = "-" ]; then # catch stdin case
- BATCH=
- fi
- if [ "$USERNAME" = "-" ]; then # catch the cat errors to stderr case
- REPORT="cat 1>&2"
- else
- REPORT="/usr/local/lib/sendmail -i -t"
- fi
-
- # set locations now that we have the flags
- #
- LOG=$WORKDIR/getmap.log
- ERROR_LOG=$WORKDIR/getmap.err
- REBUILD=$WORKDIR/getmap.rebuild
-
- # be sure the working file does not exist, unless we read from stdin
- #
- if [ ! -z "$BATCH" ]; then
- BATCH_TMP="$BATCH".work
- if [ -f "$BATCH_TMP" ]; then
- echo "$PROG: working batch file $BATCH_TMP exists" 1>&2
- echo "$PROG: remove $BATCH_TMP by hand if stale" 1>&2
- exit 3
- fi
- fi
-
- # setup log files
- #
- if [ ! -z "$BATCH" ]; then
- BATCH_MSG="$PROG: starting work on $BATCH at `date`"
- else
- BATCH_MSG="$PROG: starting work on [stdin] at `date`"
- fi
- echo "$BATCH_MSG" > $ERROR_LOG
- if [ "$?" -ne 0 ]; then
- echo "$PROG: can not clear $ERROR_LOG" 1>&2
- exit 4
- fi
- touch $LOG 2>/dev/null
- if [ "$?" -ne 0 ]; then
- echo "$PROG: can not write to $LOG" 1>&2
- echo "$PROG: can not write to $LOG" >> $ERROR_LOG
- (if [ "$USERNAME" != "-" ]; then
- echo "To: $USERNAME"
- echo "Subject: getmap error"
- echo ""
- echo ""
- fi
- echo "getmap error log follows -----"
- cat $ERROR_LOG
- echo "end of getmap error log =====") | eval "$REPORT"
- exit 5
- fi
-
-
- # save the batch file, if not from stdin
- #
- if [ ! -z "$BATCH" ]; then
- # do nothing if no batch file or no work in the batch file
- if [ ! -f "$BATCH" -o ! -s "$BATCH" ]; then
- echo "$PROG: no work in $BATCH" >> $LOG
- rm -f $ERROR_LOG
- exit 0
- fi
- mv $BATCH $BATCH_TMP
- if [ "$?" -ne 0 ]; then
- echo "$PROG: could not move $BATCH to $BATCH_TMP" 1>&2
- echo "$PROG: could not move $BATCH to $BATCH_TMP" >> $ERROR_LOG
- (if [ "$USERNAME" != "-" ]; then
- echo "To: $USERNAME"
- echo "Subject: getmap error"
- echo ""
- echo ""
- fi
- echo "getmap error log follows -----"
- cat $ERROR_LOG
- echo "end of getmap error log =====") | eval "$REPORT"
- cat $ERROR_LOG >> $LOG
- exit 6
- fi
-
- # if work from stdin, prep a file to be used to save a copy
- #
- else
- BATCH_TMP=$WORKDIR/getmap.in$$
- cat /dev/null > $BATCH_TMP
- if [ "$?" -ne 0 ]; then
- echo "$PROG: could not clear $BATCH_TMP to hold a copy of [stdin]" 1>&2
- echo "$PROG: could not clear $BATCH_TMP to hold a copy of [stdin]" >> $ERROR_LOG
- (if [ "$USERNAME" != "-" ]; then
- echo "To: $USERNAME"
- echo "Subject: getmap error"
- echo ""
- echo ""
- fi
- echo "getmap error log follows -----"
- cat $ERROR_LOG
- echo "end of getmap error log =====") | eval "$REPORT"
- cat $ERROR_LOG >> $LOG
- exit 7
- fi
- fi
-
- # process the map artcile files
- #
- if [ ! -z "$BATCH" ]; then
- $UNSHAR -d $MAPDIR -n $NEWSGROUPS < $BATCH_TMP >> $ERROR_LOG
- STATUS=$?
- else
- tee -a $BATCH_TMP | $UNSHAR -d $MAPDIR >> $ERROR_LOG
- STATUS=$?
- fi
-
- # note if we unpacked anything
- if [ -s "$BATCH_TMP" ]; then
- touch $REBUILD
- fi
-
- # log the activity
- #
- cat $ERROR_LOG >> $LOG
-
- # post processing - look for errors to report
- #
- if [ "$STATUS" -ne 0 ]; then
- # form the mail message header
- (if [ "$USERNAME" != "-" ]; then
- echo "To: $USERNAME"
- echo "Subject: getmap error"
- echo ""
- echo ""
- fi
- echo "getmap error log follows -----"
- cat $ERROR_LOG
- echo "end of getmap error log ====="
- echo ""
- echo ""
- if [ ! -z "$BATCH" ]; then
- echo "$BATCH_TMP work queue follows -----"
- cat $BATCH_TMP
- echo "end of $BATCH_TMP work queue ====="
- else
- echo "[stdin] work queue follows -----"
- cat $BATCH_TMP
- echo "end of [stdin] work queue ====="
- fi) | eval "$REPORT"
- else
- rm -f $ERROR_LOG # no error, so remove the error log
- fi
- rm -f $BATCH_TMP
-
- exit 0
-