home *** CD-ROM | disk | FTP | other *** search
- #! /bin/sh
- # Process spooled news.
-
- # =()<. ${NEWSCONFIG-@<NEWSCONFIG>@}>()=
- . ${NEWSCONFIG-/var/lib/news/bin/config}
-
- PATH=$NEWSCTL/bin:$NEWSBIN/input:$NEWSBIN/relay:$NEWSBIN:$NEWSPATH ; export PATH
- umask $NEWSUMASK
-
- # Should we be running on this machine at all?
- if test -r $NEWSCTL/server
- then
- me="`hostname`"
- server="`cat $NEWSCTL/server`"
- if test " $server" != " `hostname`"
- then
- exec rsh $server exec /bin/sh -c "PATH=$PATH exec newsrun $*"
- exit 2 # should never be reached
- fi
- fi
-
- # Options.
- hold=
- case "$1" in
- -h) hold=y ; shift ;;
- esac
-
- # Go to our base of operations.
- cd $NEWSARTS/in.coming
-
- # Consider what grades we should process, and check for work.
- sawstop=n
- stoppat='0\.'
- if test -r stop
- then
- pat="$stoppat"
- sawstop=y
- else
- pat='[0-9]'
- fi
- case "$1" in
- '') ;;
- *) pat="[$1]\." ;;
- esac
- if test " `ls | egrep \"^$pat\" | wc -l`" -eq 0
- then
- exit 0
- fi
-
- # Lock against others running.
- lock="$NEWSCTL/LOCKinput"
- ltemp="$NEWSCTL/L.$$"
- echo $$ >$ltemp
- trap "rm -f $ltemp ; exit 0" 0 1 2 15
- if newslock $ltemp $lock
- then
- trap "rm -f $ltemp $lock ; exit 0" 0 1 2 15
- else
- exit 0
- fi
-
- # Misc. setup.
- stale="`staleness`"
-
- # Master loop.
- while : # "while true", but : is faster
- do
- # Find some work. "sort -n" gets grades ordered right.
- them="`ls | egrep \"^$pat\" | sort -n | sed 50q`"
- if test " $them" = " " # if no work...
- then
- break # NOTE BREAK OUT
- fi
-
- # Check space. It is *probably* better to stop processing
- # when things get too full. (This test is actually a bit
- # inaccurate since the batches may be compressed, but it's
- # good enough to catch major space problems.)
- allsize=`sizeof $them`
- # decompressed + articles = maybe 5*compressed
- if test " `spacefor $allsize articles`" -gt 4 # lots of room
- then
- muchroom=y
- else
- muchroom=
- fi
-
- # Decompression etc.
- list=
- for f in $them
- do
- # If the stop file has come into existence, punch out to
- # the outer loop to process what we've got and then rethink.
- if test " $sawstop" = " n" -a -r stop
- then
- sawstop=y
- pat="$stoppat"
- break # NOTE BREAK OUT
- fi
-
- # Space check, if we're close.
- if test " $muchroom" != " y"
- then
- batchsize=`sizeof $f`
- # again, decompressed + articles = maybe 5*compressed
- if test " `spacefor $batchsize articles`" -le 4
- then
- # observe that list is always empty here
- exit 0 # just no room
- fi
- fi
-
- # Save a copy in hold if requested.
- if test " $hold" = " y" -a -d hold
- then
- ln $f hold/$f
- fi
-
- # Decompress if necessary.
- text=${f}.t
- case $f in
- *.Z) uncompress <$f >$text ;;
- *.7) c7decode <$f | uncompress >$text ;;
- *.t) text=$f ; : okay ;;
- *) uncompress <$f >$text 2>/dev/null ||
- { rm -f $text ; text=$f ; : okay ; } ;;
- esac || ln $f bad/$f
- if test " $f" != " $text"
- then
- rm -f $f
- fi
-
- # Empty batches need no processing.
- if test -s $text
- then
- list="$list $text"
- else
- rm -f $text
- fi
-
- # If we are tight on space, run things one at a time.
- if test " $muchroom" != " y" -a " $list" != " "
- then
- break # NOTE BREAK OUT
- fi
- done
-
- # Do it. -r redirects stdout and stderr into logs. -n makes
- # history entries for refused articles; this is right for
- # NNTP-feed sites and doesn't hurt uucp-feed sites unless
- # they refuse a good fraction of what they get. -u tells relaynews
- # to unlink the files that work.
- if test " $list" != " "
- then
- relaynews -r -n $stale -u $list
- doexplode
- # Deal with the leftovers, if any; mv 2> is simple and quick.
- mv $list bad 2>/dev/null
- # And just in case that didn't work...
- rm -f $list
- fi
- sleep 45 # give somebody else a shot at the lock
- done
-
- exit 0
-