#! /bin/sh # inews [-p] [-d k] [-x site] [-hMD] [-t subj] [-n ng] [-e exp] [-F ref] \ # [-d dist] [-a mod] [-f from] [-o org] [-C ng] [file...] - inject news: # # pseudo-inews that posts by mailing the message, so that whatever # fancy processing the mailer does to generate a return address # takes place. # # The mailer normally ends up invoking a "usenet" transport agent # which would either call a real inews or post via nntp, as appropriate. # # Checks for moderators and suchlike are assumed to take place when the # message is actually posted on the real news server. # # Jean-Francois Lamy (lamy@ai.toronto.edu) 88-02-11 #NEWSCTL=${NEWSCTL-/usr/lib/news} #NEWSBIN=${NEWSBIN-/usr/lib/newsbin} #NEWSARTS=${NEWSARTS-/usr/spool/news} NEWSCTL=/local/share/news NEWSBIN=/local/lib/news NEWSARTS=/var/spool/news PATH=$NEWSBIN:$NEWSCTL:$NEWSBIN/relay:/bin:/usr/bin:/usr/ucb; export PATH allowed=sandra\|rayan\|lamy # tailor: local news admin (may be "") hdrspresent=no whoami=/tmp/cn$$who # just created to determine effective uid input=/tmp/cn$$in # uncensored input censart=/tmp/cn$$cens # censored input rmlist="$input $whoami $censart" egrep=egrep # figure out where to mail the message. We mail even if we are on the # news server, in order to garantee proper return addresses servaddr=nntp umask 2 trap '' 1 2 15 # ignore signals to avoid losing articles # "inews -p": invoke rnews case "$1" in -p) shift exec rnews $* # rnews, bailing out at or near line 1 ;; esac # parse arguments for options, cat headers onto $input; cat files onto $input >$input while : do case $# in 0) break ;; # arguments exhausted esac case "$1" in -debug) shift; debug="$1" ;; # peculiar to C news -x) shift; exclusion="-x $1" ;; # you're welcome, erik (2.11) -h) hdrspresent=yes ;; -M) # TODO: what's this *really* do? dunno, find out ;; -D) # obsolete, undocumented: meant "don't check for recordings". # last present in B 2.10.1, invoked by readnews for followups. ;; -t) shift; echo "Subject: $1" >>$input ;; -n) shift; echo "Newsgroups: $1" >>$input ;; -e) shift; echo "Expires: $1" >>$input ;; -F) # undocumented in B 2.10.1, documented in B 2.11. shift; echo "References: $1" >>$input ;; -d) shift; echo "Distribution: $1" >>$input ;; -a) shift; echo "Approved: $1" >>$input ;; # pass next options as environment variables to client.censor -f) shift; PASSEDFROM="$1" ;; # complex due to Sender: -o) shift; ORGANIZATION="$1"; export ORGANIZATION ;; -[cC]) # megakludge-o-rama # first, permit only to super-users >$whoami whoever = "`ls -l $whoami | awk '{print $3}'`" case $whoever in root|$allowed) : a winner ;; *) echo "$0: $1 restricted to super-users " >&2 exit 1 ;; esac rm -f $whoami case "$1" in -C) cat <>$input # generate -C header Newsgroups: $ng Subject: newgroup $2 Control: newgroup $2 Approved: $whoever@`hostname`.`domainname` created by inews -C ! shift ;; -c) cat <>$input # generate -c header Newsgroups: $ng Subject: $2 Control: $2 Approved: $whoever@`hostname`.`domainname` created by inews -c. ! shift ;; esac ;; -*) echo "$0: bad option $1" >&2 exit 1 ;; *) case "$hdrspresent" in no) echo "" >>$input; hdrspresent=yes ;; esac cat "$1" >>$input # is a filename; append file fileseen=yes ;; esac shift # pass option or filename (any value was done above) done # if no files named, read stdin case "$fileseen" in yes) ;; *) case "$hdrspresent" in no) echo "" >>$input; hdrspresent=yes ;; esac # capture incoming news in case inews fails if cat >>$input; then : far out else echo "$0: lost news; cat returned status $?" >&2 exit 1 fi ;; esac ( # trivial censoring, before passing on to mailer. # The Newsgroups: line is turned into a To: line. ORGANIZATION=${ORGANIZATION=`cat ${NEWSCTL}/organi?ation`} awk "BEGIN { subject = 0; body = 0; skipping = 0 ; newsgroups = 0; distribution = 0; organization = 0; } body == 1 { print; next } /^[A-Za-z-]*:[ ]*$/ { next } /^$|^[ ][ \t]*$/ { if (!body) { if (!organization) print \"Organization: $ORGANIZATION\"; if (!newsgroups) print \"To: $groups\"; if (!subject) print \"Subject: (none)\"; } print; body = 1; next } /^Organization:/ { organization = 1; skipping = 0; print; next } /^Newsgroups:/ { \$1 = \"To:\" ; newsgroups = 1; skipping = 0; print; next } /^Distribution:/ { distribution = 1; skipping = 0; print; next } /^Subject:/ { subject = 1; skipping = 0; print; next } /^To:|^Cc:|^X-To:/ { skipping = 1; next } /^From |^Return-Path:/ { skipping = 1; next } /^Apparently-To:/ { skipping = 1; next } /^[ ]/ { if (skipping) next } { print } " <$input >$censart if test -r $HOME/.signature; then echo "-- " >>$censart sed 5q $HOME/.signature >>$censart # glue on first bit of signature fi if /usr/lib/sendmail -t ${PASSEDFROM+-f"$PASSEDFROM"} <$censart then rm -f $rmlist # far out, it worked exit 0 else status=$? echo\ "$0: could not send article to server; sendmail returned status $status" >&2 echo "$0: processed news article can be found in $input" >&2 exit $status fi ) &