#! /bin/sh ## $Revision: 1.20 $ ## Newgroup control-message handler PROG=newgroup ## Some shells don't pass in $* unless we explicitly pass it in here. ## =()<. @<_PATH_PARSECTL>@ "$@">()= . /usr/lib/news/parsecontrol "$@" ## Valid parameters and group name? case "$#" in 1|2) ;; *) ${WRITELOG} ${LOGFILE} "Unparseable newgroup by ${FROM}" <${ARTICLE} exit ;; esac case "$1" in *[\ \ /:]*) ${WRITELOG} ${LOGFILE} "Unsafe newgroup by ${FROM}" <${ARTICLE} exit ;; esac ## Make sure article is approved. ${SED} -e '/^$/q' <${ARTICLE} >${TEMP} grep '^Approved:' <${TEMP} >/dev/null 2>&1 || { rm -f ${TEMP} ${WRITELOG} ${LOGFILE} "Unapproved newgroup by ${FROM}" <${ARTICLE} exit } rm -f ${TEMP} case "$2" in [Mm]*) set $1 m ;; *) set $1 y ;; esac ## Kill the chefs; from . ## That is, turn "alt.foo.bar.bar.bar" into an "x" group. #case `echo $1 | awk -F. '{ # if (NF > 1 && $NF != "misc") { # if (NF > 5 || $NF == $(NF - 1) || $(NF - 1) == $(NF - 2)) { # print "bozo"; # } # } # }'` in #bozo*) # set $1 x # ;; #esac ## Compare group against active file. SUFFIX="" LINE=`grep "^$1 " <${ACTIVE} 2>/dev/null` case "${LINE}" in "") ## New group. WORD=created ;; "$1 "*" $2") ## Exact match; ignore it. exit ;; "$1 "*" ="*|"$1 "*" x"|"$1 "*" j") ${WRITELOG} ${LOGFILE} "Rejected special newsgroup ($1) by ${FROM}" \ <${ARTICLE} exit ;; *) case "$2" in m) WORD="made moderated" SUFFIX=" (Moderated)" ;; y) WORD="made unmoderated" ;; esac ;; esac case ${ACTION} in mail) P1=$1 P2=$2 export FROM WORD NEWSBIN P1 P2 ARTICLE ( echo "${FROM} requested that $1 be ${WORD}." echo 'To do this, type the following:' echo " ${NEWSBIN}/ctlinnd newgroup ${P1} ${P2} ${FROM}" echo '' echo 'The original article was:' cat ${ARTICLE} ) | ${WRITELOG} ${LOGFILE} "newgroup $1 $2 ${FROM}" exit ;; logit) ${WRITELOG} ${LOGFILE} "skipping newgroup $1 $2 ${FROM} (would be ${WORD})" \ <${ARTICLE} exit ;; esac ## Do the work. ctlinnd -s newgroup $1 $2 "${FROM}" ${WRITELOG} ${LOGFILE} "newgroup $1 $2 ${WORD} ${FROM}" <${ARTICLE} ## Get a description of the newsgroup; first from the article, and ## then from the newsgroups file. DESC=`${SED} <${ARTICLE} -n -e " :top /^For your newsgroups file:\$/b scan n b top :scan n /$1[ ]/ { p q } b scan"` test -z "${DESC}" && { DESC=`${EGREP} "^$1 " ${NEWSGROUPS} | ${SED} "s/[ ]*(Moderated)//"` test -z "${DESC}" && DESC="$1 ?" } DESC="${DESC}${SUFFIX}" ## Lock so we can update newsgroups LOCK=${LOCKS}/LOCK.newsgroups PID=$$ TRY=0 MAXTRY=60 export LOCK MAXTRY PID LOGFILE TRY while [ ${TRY} -lt ${MAXTRY} ]; do shlock -p ${PID} -f ${LOCK} && break sleep 2 TRY=`expr ${TRY} + 1` done ## If we got the lock, update the file; otherwise, give up. test ${TRY} -lt ${MAXTRY} || { echo "Newgroup cannot update newsgroups. Locked by" `cat ${LOCK}` 1>&2 exit } ${EGREP} -v "^$1[ ]" <${NEWSGROUPS} >${TEMP} cat ${TEMP} >${NEWSGROUPS} echo "${DESC}" >>${NEWSGROUPS} rm ${TEMP} ${LOCK} exit