⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanlogs

📁 早期freebsd实现
💻
字号:
#! /bin/sh##  $Revision: 1.21 $##  Summarize INN log files.##  Optional arguments:##	norotate	Do not rotate logfiles##  =()<. @<_PATH_SHELLVARS>@>()=. /var/spool/news/data/innshellvars##  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=${NEWSLIB}/nn/Log##  Where nntpsend, if used, writes its log information.NNTPSEND=${MOST_LOGS}/nntpsend.log##  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.critSYSLOG_ERR=${MOST_LOGS}/news.errSYSLOG_NOTICE=${MOST_LOGS}/news.noticeSYSLOGS="${SYSLOG_CRIT} ${SYSLOG_ERR} ${SYSLOG_NOTICE}"##  Where tally control and unwanted processors are found.TALLY_CONTROL=${NEWSBIN}/tally.controlTALLY_UNWANTED=${NEWSBIN}/tally.unwantedUNWANTED_LOG=${MOST_LOGS}/unwanted.logCONTROL_LOG=${MOST_LOGS}/control.logCONTROL_DATA=test -f ${MOST_LOGS}/newgroup.log && CONTROL_DATA=${MOST_LOGS}/newgroup.logtest -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}"test -n "${NNTPSEND}" -a -f "${NNTPSEND}" && LOGS="${LOGS} ${NNTPSEND}"test -n "${CONTROL_DATA}" && LOGS="${LOGS} ${CONTROL_LOG}"for F in checkgroups default ihave newgroup rmgroup sendme \	 sendsys senduuname version miscctl; do    test -f ${MOST_LOGS}/${F}.log && LOGS="${LOGS} ${MOST_LOGS}/${F}.log"donePROGNAME=scanlogsLOCK=${LOCKS}/LOCK.${PROGNAME}##  Set defaults.ROTATE=true##  Parse JCL.for Ido    case "X$I" in    Xnonn)	# Ignore this.	;;    Xnorotate)	ROTATE=false	;;    *)	echo "Unknown flag ${I}" 1>&2	exit 1	;;    esacdone##  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}    ctlinnd -s pause "Flushing log and syslog files" 2>&1    ctlinnd -s flushlogs 2>&1 || {	echo 'Cannot flush logs.'	rm -f ${LOCK}	exit 1    }    ##  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    ##  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 ${NNTPSEND} ; 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}    ${TALLY_UNWANTED} <${LOG}.old    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}	    ;;	*)	    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} ${OLD}/${BASE}		mv ${F}.new ${F}	    fi	    ;;	esac    done    cd ${HERE}    ##  Truncate logs from send-nntp and/or send-uucp.    if [ -s ${MOST_LOGS}/send-nntp.log ] ; then	${COMPRESS} <${MOST_LOGS}/send-nntp.log >${OLD}/send-nntp.1${Z}	cat /dev/null >${MOST_LOGS}/send-nntp.log    fi    if [ -s ${MOST_LOGS}/send-uucp.log ] ; then	${COMPRESS} <${MOST_LOGS}/send-uucp.log >${OLD}/send-uucp.1${Z}	cat /dev/null >${MOST_LOGS}/send-uucp.log    fielse    ##  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>&1fi####  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}.0if [ -s ${OLD_SYSLOG} ] ; then    echo Syslog critical messages:    cat ${OLD_SYSLOG}    echo ---------    echo ''firm -f ${OLD_SYSLOG}##  Display error log.BASE=`basename ${ERRLOG}`OLD_ERRLOG=${OLD}/${BASE}.0if [ -s ${OLD_ERRLOG} ] ; then    echo Error log:    cat ${OLD_ERRLOG}    echo ---------    echo ''firm -f ${OLD_ERRLOG}##  Display expire log messagesBASE=`basename ${EXPLOG}`OLD_EXPLOG=${OLD}/${BASE}.0if [ -s ${OLD_EXPLOG} ] ; then    echo Expire messages:    cat ${OLD_EXPLOG}    echo ---------    echo ''firm -f ${OLD_EXPLOG}##  Scan for various problems in articles we were offered or sent.BASE=`basename ${LOG}`OLD_LOG=${OLD}/${BASE}.0if [ -f ${OLD_LOG} ]; then    ${AWK} '$4 == "-" || $4 == "j" { print }' <${OLD_LOG} >${PROBS}    ${AWK} '$4 == "-" { print $5; }' ${PROBS} \	    | sort | uniq -c | sort -nr | ${SED} ${TOP}q >${T}    if [ -s ${T} ] ; then	echo Top ${TOP} sites sending bad articles:	cat ${T}	echo ''    fi    ${AWK} '$4 == "j" { print $5; }' ${PROBS} \	    | sort | uniq -c | sort -nr | ${SED} ${TOP}q >${T}    if [ -s ${T} ] ; then	echo Top ${TOP} sites sending junked "(unwanted)" articles:	cat ${T}	echo ''    fi    ${EGREP} '437 Unwanted distribution' ${PROBS} | ${SED} 's/.*"\(.*\)".*/\1/' \	    | sort | uniq -c | sort -nr | ${SED} ${TOP}q >${T}    if [ -s ${T} ] ; then	echo Top ${TOP} unwanted distributions by number of articles:	cat ${T}	echo ''    fi    ${EGREP} '437 Unapproved for' ${PROBS} | ${SED} 's/.*"\(.*\)".*/\1/' \	    | sort | uniq -c | sort -nr | ${SED} ${TOP}q >${T}    if [ -s ${T} ] ; then	echo Top ${TOP} supposedly-moderated groups with unmoderated postings:	cat ${T}	echo ''    fi    ${EGREP} '437 Unwanted newsgroup' ${PROBS} | ${SED} 's/.*"\(.*\)".*/\1/' \	    | sort | uniq -c | sort -nr | ${SED} ${TOP}q >${T}    if [ -s ${T} ] ; then	echo Top ${TOP} unwanted newsgroups:	cat ${T}	echo ''    fi    ##  Your egrep may complain about this regular expression being too long;    ##  if so, complain to your vendor and try GNU egrep.    P1='No body|EOF in headers|"Message-ID"|No colon-space in '    P2='Missing ".*" header|Linecount|Bad Date|Too old'    ${EGREP} "${P1}|${P2}" ${PROBS} \	    | ${SED} -e 's/.*437 //' \		-e 's/Linecount.*/Linecount wrong/' -e 's/Too old.*/Too old/' \	    | sort | uniq -c | sort -nr | ${SED} ${TOP}q >${T}    if [ -s ${T} ] ; then	echo Top ${TOP} general message problems:	cat ${T}	echo ''    fi    ${EGREP} "${P1}|${P2}" ${PROBS} | ${AWK} '{print $5}' \	    | sort | uniq -c | sort -nr | ${SED} ${TOP}q >${T}    if [ -s ${T} ] ; then	echo Top ${TOP} sites sending news with bad headers:	cat ${T}	echo ''    fi    rm -f ${PROBS}firm -f ${OLD_LOG}##  Summarize syslog informationBASE=`basename ${SYSLOG_NOTICE}`OLD_SYSLOG=${OLD}/${BASE}.0if [ -s ${OLD_SYSLOG} ] ; then    echo Syslog summary:    ##  Portable work-around some debugging syslogs.    ${SED} -e 's/{news.[a-z]*} //' <${OLD_SYSLOG} | ${AWK} -f ${NEWSLIB}/innlog.awk    echo ---------    echo ''firm -f ${OLD_SYSLOG}##  Compress and rotate the logs.if ${ROTATE} ; then    cd ${OLD}    for F in ${LOGS} ; do	##  Skip if file doesn't exist.	BASE=`basename ${F}`	test -f ${BASE} || continue	##  Compress the file.	${COMPRESS} <${BASE} >${BASE}.0${Z} && rm -f ${BASE}	chmod 0440 ${BASE}.0${Z}	##  Do rotation.	EXT=${CYCLES}	rm -f ${BASE}.${CYCLES}${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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -