-#! /bin/sh
-# fixscript will replace this line with code to load innshellvars
-
-## $Revision: 7770 $
-## Summarize INN log files.
-## Optional arguments:
-## norotate Do not rotate logfiles
-
-## If you get an error from this line:
-## sh -c 'egrep "`ls /etc`" /dev/null'
-## then get a better egrep, like the FSF one.
-
-## Directory where old log files are kept.
-OLD=${MOST_LOGS}/OLD
-## If you want to archive the active file, enable this line.
-ACTIVEFILE=${ACTIVE}
-## Number of lines of error in each category to report.
-TOP=${TOP-20}
-## NN log file.
-NN=${PATHETC}/nn/Log
-
-## Where these programs, if used, write their logs.
-## We also have to find innfeed's log file.
-INNFEEDLOG=`${AWK} '{gsub(/:|#/, " & ")} {if ($1 == "log-file" && $2 == ":") print $3}' ${PATHETC}/innfeed.conf`
-INNFEED=
-for F in "${INNFEEDLOG}" ; do
- test -f "${MOST_LOGS}/${F}" && INNFEED="${INNFEED} ${MOST_LOGS}/${F}"
-done
-test -z "${INNFEED}" && test -f ${MOST_LOGS}/innfeed.log && INNFEED="${MOST_LOGS}/innfeed.log"
-
-
-## Where nntpsend, if used, writes its log information.
-NNTPSEND=${MOST_LOGS}/nntpsend.log
-SENDNNTP=${MOST_LOGS}/send-nntp.log
-SENDUUCP=${MOST_LOGS}/send-uucp.log
-LIVEFILES="${INNFEED} ${NNTPSEND} ${SENDNNTP} ${SENDUUCP}"
-## Where news.daily places expire output, unless noexplog was used.
-EXPLOG=${MOST_LOGS}/expire.log
-
-## If you divide your news syslog into separate files, list them here.
-SYSLOG_CRIT=${MOST_LOGS}/news.crit
-SYSLOG_ERR=${MOST_LOGS}/news.err
-SYSLOG_NOTICE=${MOST_LOGS}/news.notice
-SYSLOGS="${SYSLOG_CRIT} ${SYSLOG_ERR} ${SYSLOG_NOTICE}"
-
-## Where tally control and unwanted processors are found.
-TALLY_CONTROL=${PATHBIN}/tally.control
-TALLY_UNWANTED=${PATHBIN}/tally.unwanted
-UNWANTED_LOG=${MOST_LOGS}/unwanted.log
-CONTROL_LOG=${MOST_LOGS}/control.log
-CONTROL_DATA=
-test -f ${MOST_LOGS}/newgroup.log && CONTROL_DATA=${MOST_LOGS}/newgroup.log
-test -f ${MOST_LOGS}/rmgroup.log \
- && CONTROL_DATA="${CONTROL_DATA} ${MOST_LOGS}/rmgroup.log"
-
-## Build up the list of log files to process.
-LOGS="${ERRLOG} ${EXPLOG} ${LOG} ${ACTIVEFILE} ${SYSLOGS} ${UNWANTED_LOG}"
-
-for F in ${LIVEFILES} ; do
- test -n "${F}" -a -f "${F}" && LOGS="${LOGS} ${F}"
-done
-
-test -n "${CONTROL_DATA}" && LOGS="${LOGS} ${CONTROL_LOG}"
-for F in checkgroups default ihave newgroup rmgroup sendme sendsys \
- senduuname version miscctl badcontrol failedpgp badpgp; do
- test -f ${MOST_LOGS}/${F}.log && LOGS="${LOGS} ${MOST_LOGS}/${F}.log"
-done
-
-PROGNAME=scanlogs
-LOCK=${LOCKS}/LOCK.${PROGNAME}
-
-## Set defaults.
-ROTATE=true
-
-## Parse JCL.
-for I
-do
- case "X${I}" in
- Xnonn)
- # Ignore this.
- ;;
- Xnorotate)
- ROTATE=false
- ;;
- *)
- echo "Unknown flag ${I}" 1>&2
- exit 1
- ;;
- esac
-done
-
-## Make sure every log exists.
-for F in ${LOGS} ; do
- test ! -f ${F} && touch ${F}
-done
-
-## Temporary files.
-T=${TMPDIR}/scan$$
-PROBS=${TMPDIR}/scanlog$$
-trap "rm -f ${T} ${PROBS}; exit 0" 0 1 2 3 15
-
-## Rotate the logs?
-if ${ROTATE} ; then
- ## Lock out others.
- shlock -p $$ -f ${LOCK} || {
- echo "$0: Locked by `cat ${LOCK}`"
- exit 1
- }
- trap "rm -f ${T} ${PROBS} ${LOCK}; exit 0" 1 2 3 15
-
- HERE=`pwd`
- cd ${MOST_LOGS}
- test ! -d ${OLD} && mkdir ${OLD}
-
- ctlinnd -s logmode
- PAUSED=false
- ctlinnd -s pause "Flushing log and syslog files" 2>&1 && PAUSED=true
- OUTPUT=`ctlinnd flushlogs 2>&1`
- if [ "$OUTPUT" != "Ok" -a "$OUTPUT" != "In debug mode" ]; then
- echo "$OUTPUT"
- echo 'Cannot flush logs.'
- rm -f ${LOCK}
- exit 1
- fi
-
- ## Make sure these .old files exist, in case innd is down.
- for F in ${LOG} ${ERRLOG} ${EXPLOG} ; do
- if [ ! -f ${F}.old ]; then
- rm -f ${F}.old
- cp ${F} ${F}.old
- cat /dev/null >${F}
- fi
- done
-
- ## Copy syslog files, truncating old inode since syslog has it open.
- for F in ${SYSLOGS}; do
- rm -f ${F}.old
- cp ${F} ${F}.old
- cat /dev/null >${F}
- done
- ctlinnd -s logmode
-
- ## Make a copy of the active file.
- if [ -n ${ACTIVEFILE} ] ; then
- BASE=`basename ${ACTIVEFILE}`
- rm -f ${OLD}/${BASE}.old
- cp ${ACTIVEFILE} ${OLD}/${BASE}.old
- fi
-
- ## These are live files, so use link rather than copy.
- for F in ${LIVEFILES} ; do
- if [ -f ${F} ]; then
- rm -f ${F}.old ${F}.new
- ln ${F} ${F}.old
- touch ${F}.new
- chmod 0660 ${F}.new
- mv ${F}.new ${F}
- fi
- done
-
- ## Tally control messages if we logged them.
- test -n "${CONTROL_DATA}" && cat ${CONTROL_DATA} | ${TALLY_CONTROL}
-
- ${PAUSED} && ctlinnd -s go "Flushing log and syslog files" 2>&1
-
- cd ${OLD}
- for F in ${LOGS}; do
- ## Process the current (just-flushed) log
- BASE=`basename ${F}`
- rm -f ${OLD}/${BASE}
- case ${F} in
- ${SYSLOG_CRIT}|${ERRLOG}|${EXPLOG}|${LOG}|${SYSLOG_NOTICE})
- ## Make a link that can be deleted (since if not rotating
- ## we delete the copy that is made in ${TMPDIR}).
- mv ${F}.old ${OLD}/${BASE}
- rm -f ${OLD}/${BASE}.0
- ln ${OLD}/${BASE} ${OLD}/${BASE}.0
- ;;
- ${ACTIVEFILE})
- mv ${BASE}.old ${OLD}/${BASE}
- ;;
- ${SYSLOG_ERR})
- mv ${F}.old ${OLD}/${BASE}
- ;;
- ${UNWANTED_LOG})
- ## Rotate and compress the file.
- BASE=`basename ${F}`
- if [ ! -f ${BASE} -a -f ../${BASE} ]; then
- cp ../${BASE} ${BASE}
- chmod 0440 ${BASE}
- fi
- if [ -f ${BASE} ]; then
- ${LOG_COMPRESS} <${BASE} >${BASE}.0${Z} && rm -f ${BASE}
- chmod 0440 ${BASE}.0${Z}
-
- ## Do rotation.
- if [ X${LOGCYCLES} = X ]; then
- LOGCYCLES=3
- fi
- EXT=${LOGCYCLES}
- rm -f ${BASE}.${LOGCYCLES}${Z}
- while [ ${EXT} -gt 0 ] ; do
- NEXT=${EXT}
- EXT=`expr ${EXT} - 1`
- test -f ${BASE}.${EXT}${Z} \
- && rm -f ${BASE}.${NEXT}${Z} \
- && mv ${BASE}.${EXT}${Z} ${BASE}.${NEXT}${Z}
- done
- fi
- ## Innreport assumes where unwanted.log exists, so leave it
- ## and process later.
- ;;
- *)
- if [ -f ${F}.old ]; then
- mv ${F}.old ${OLD}/${BASE}
- else
- rm -f ${OLD}/${BASE} ${F}.new
- touch ${F}.new
- chmod 0660 ${F}.new
- ln ${F} ${F}.old
- mv ${F}.new ${F}
- mv ${F}.old ${OLD}/${BASE}
- fi
- ;;
- esac
- done
- cd ${HERE}
-else
- ## Don't use the real OLD directory, instead use TMPDIR
- OLD=${TMPDIR}
-
- ## Make a snapshot of what we need for below.
- ctlinnd -s pause "Snapshot log and syslog files" 2>&1
- for F in ${SYSLOG_CRIT} ${ERRLOG} ${EXPLOG} ${LOG} ${SYSLOG_NOTICE} ; do
- BASE=`basename ${F}`
- rm -f ${OLD}/${BASE}.0
- cp ${F} ${OLD}/${BASE}.0
- done
- ctlinnd -s go "Snapshot log and syslog files" 2>&1
-fi
-
-##
-## We now (finally!) have copies of the log files where we need them.
-##
-
-## Display syslog critical messages.
-BASE=`basename ${SYSLOG_CRIT}`
-OLD_SYSLOG=${OLD}/${BASE}.0
-if [ -s ${OLD_SYSLOG} ] ; then
- echo Syslog critical messages:
- cat ${OLD_SYSLOG}
- echo ---------
- echo ''
-fi
-rm -f ${OLD_SYSLOG}
-
-## Display error log.
-BASE=`basename ${ERRLOG}`
-OLD_ERRLOG=${OLD}/${BASE}.0
-if [ -s ${OLD_ERRLOG} ] ; then
- echo Error log:
- cat ${OLD_ERRLOG}
- echo ---------
- echo ''
-fi
-rm -f ${OLD_ERRLOG}
-
-## Scan for various problems in articles we were offered or sent...
-BASE=`basename ${LOG}`
-OLD_LOG=${OLD}/${BASE}.0
-
-## and summarize syslog information.
-BASE=`basename ${SYSLOG_NOTICE}`
-OLD_SYSLOG=${OLD}/${BASE}.0
-if [ -s ${OLD_SYSLOG} -o -s ${OLD_LOG} ] ; then
- ${PATHBIN}/innreport -f ${PATHETC}/innreport.conf ${OLD_SYSLOG} ${OLD_LOG}
- echo ---------
- echo ''
-fi
-rm -f ${OLD_LOG} ${OLD_SYSLOG}
-if ${ROTATE} ; then
- BASE=`basename ${UNWANTED_LOG}`
- if [ -f ${UNWANTED_LOG}.old ]; then
- mv ${UNWANTED_LOG}.old ${OLD}/${BASE}
- else
- rm -f ${OLD}/${BASE}
- cp ${UNWANTED_LOG} ${OLD}/${BASE}
- chmod 0660 ${OLD}/${BASE}
- fi
-fi
-
-OLD_SYSLOG=${OLD}/${EXPLOG}.0
-rm -f ${EXPLOG}
-
-## Compress and rotate the logs.
-if ${ROTATE} ; then
- cd ${OLD}
- if [ X${LOGCYCLES} = X ]; then
- LOGCYCLES=3
- fi
- for F in ${LOGS} ; do
- ## Skip if it's unwanted.log, since it's already rotated
- if [ ${F} = ${UNWANTED_LOG} ]; then
- continue
- fi
- ## Skip if file doesn't exist.
- BASE=`basename ${F}`
- test -f ${BASE} || continue
-
- ## Compress the file.
- ${LOG_COMPRESS} <${BASE} >${BASE}.0${Z} && rm -f ${BASE}
- chmod 0440 ${BASE}.0${Z}
-
- ## Do rotation.
- EXT=${LOGCYCLES}
- rm -f ${BASE}.${LOGCYCLES}${Z}
- while [ ${EXT} -gt 0 ] ; do
- NEXT=${EXT}
- EXT=`expr ${EXT} - 1`
- test -f ${BASE}.${EXT}${Z} \
- && rm -f ${BASE}.${NEXT}${Z} \
- && mv ${BASE}.${EXT}${Z} ${BASE}.${NEXT}${Z}
- done
- done
-
- ## Remove lock.
- rm -f ${LOCK}
-fi
-
-## All done.
-exit 0