#! /bin/sh # fixscript will replace this line with code to load innshellvars ## $Revision: 7435 $ ## News boot script. Runs as "news" user. Requires inndstart be ## setuid root. Run from rc.whatever as: ## su news -c /path/to/rc.news >/dev/console ## ## Or to stop INN: ## su news -c '/path/to/rc.news stop' waitforpid() { i=12 while [ $i -gt 0 ]; do kill -0 $1 2>/dev/null || break sleep 5 printf "." i=`expr $i - 1` done printf "\n" } case X"$1" in Xstop) # Stop cnfsstat (if running) if [ -f ${PATHRUN}/cnfsstat.pid ]; then kill `cat ${PATHRUN}/cnfsstat.pid` rm -f ${PATHRUN}/cnfsstat.pid fi # Stop innwatch (if running) if [ -f $WATCHPID ]; then kill `cat $WATCHPID` rm -f $WATCHPID fi printf "Stopping innd: " ${PATHBIN}/ctlinnd throttle 'rc.news stop' ${PATHBIN}/ctlinnd shutdown 'rc.news stop' # wait for innd to exit (up to 60 sec) pid=`cat ${SERVERPID} 2>/dev/null` if [ "$pid" != "" ]; then waitforpid $pid else printf "\n" fi # Turn off ovdb support procs, and close the DB environment if [ "$OVMETHOD" = "ovdb" -a -f ${PATHRUN}/ovdb_server.pid ]; then pid=`cat ${PATHRUN}/ovdb_server.pid 2>/dev/null` if [ "$pid" != "" ]; then printf "Stopping ovdb_server: " kill $pid waitforpid $pid fi fi if [ "$OVMETHOD" = "ovdb" -a -f ${PATHRUN}/ovdb_monitor.pid ]; then pid=`cat ${PATHRUN}/ovdb_monitor.pid 2>/dev/null` if [ "$pid" != "" ]; then printf "Stopping ovdb_monitor: " kill $pid waitforpid $pid fi fi if [ -f ${PATHBIN}/rc.news.local ]; then ${PATHBIN}/rc.news.local stop fi # Delete all of the PID files that we know about to avoid having them # stick around after a fresh start. rm -f ${PATHRUN}/cnfsstat.pid $WATCHPID $SERVERPID rm -f ${PATHRUN}/ovdb_server.pid ${PATHRUN}/ovdb_monitor.pid exit 0 ;; esac ## Pick ${INND} or ${INNDSTART} WHAT=${INNDSTART} MAIL="${MAILCMD} -s 'Boot-time Usenet warning on `hostname`' ${NEWSMASTER}" ## RFLAG is set below; set INNFLAGS in inn.conf(5) RFLAG="" ## Clean shutdown or already running? if [ -f ${SERVERPID} ] ; then if kill -0 `cat ${SERVERPID}` 2>/dev/null; then echo 'INND is running' exit 0 fi echo 'INND: PID file exists -- unclean shutdown!' RFLAG="-r" fi if [ ! -f ${PATHDB}/.news.daily ] ; then case `find ${PATHBIN}/innd -mtime +1 -print 2>/dev/null` in "") ;; *) echo 'No .news.daily file; need to run news.daily?' | eval ${MAIL} ;; esac else case `find ${PATHDB}/.news.daily -mtime +1 -print 2>/dev/null` in "") ;; *) echo 'Old .news.daily file; need to run news.daily?' | eval ${MAIL} ;; esac fi ## Active file recovery. if [ ! -s ${ACTIVE} ] ; then if [ -s ${NEWACTIVE} ] ; then mv ${NEWACTIVE} ${ACTIVE} else if [ -s ${OLDACTIVE} ] ; then cp ${OLDACTIVE} ${ACTIVE} else echo 'INND: No active file!' exit 1 fi fi RFLAG="-r" # You might want to rebuild the DBZ database, too: #cd ${PATHDB} \ # && makehistory -r \ # && mv history.n.dir history.dir \ # && mv history.n.index history.index \ # && mv history.n.hash history.hash fi ## Remove temporary batchfiles and lock files. ( cd ${BATCH} && rm -f bch* ) ( cd ${LOCKS} && rm -f LOCK* ) ( cd ${TEMPSOCKDIR} && rm -f ${TEMPSOCK} ) rm -f ${NEWSCONTROL} ${NNTPCONNECT} ${SERVERPID} ## Initialize ovdb. Must be done before starting innd. if [ "$OVMETHOD" = "ovdb" ]; then echo 'Starting ovdb.' ovdb_init || { echo "Can't initialize ovdb (check news.err for OVDB messages)" exit 1 } sleep 1 fi ## Start the show. echo 'Starting innd.' eval ${WHAT} ${RFLAG} ${INNFLAGS} # Gee, looks like lisp, doesn't it? ${DOINNWATCH} && { echo "Scheduled start of ${INNWATCH}." ( sleep 60 ; ${INNWATCH} ) > /dev/null & } ${DOCNFSSTAT} && { echo "Scheduled start of cnfsstat." ( sleep 60 ; ${PATHBIN}/cnfsstat -s -l -P ) > /dev/null & } RMFILE=${MOST_LOGS}/expire.rm for F in ${RMFILE} ${RMFILE}.*; do if [ -f $F -a -s $F ] ; then echo "Removing articles from pre-downtime expire run (${F})." ( echo 'System shut down during expire.' \ 'Unlinking articles listed in' echo ${F} ) | eval ${MAIL} ${PATHBIN}/expirerm ${F} fi done & # Run any additional local startup commands. if [ -f ${PATHBIN}/rc.news.local ] ; then ${PATHBIN}/rc.news.local start fi