home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Unix System Administration Handbook 1997 October
/
usah_oct97.iso
/
news
/
cnews.tar
/
inject
/
injnews
< prev
next >
Wrap
Text File
|
1994-09-08
|
5KB
|
160 lines
#! /bin/sh
# injnews [-debug k] [-x site] [-ANV] - `sensible' news injection interface:
# censor locally-posted article on stdin; munge the article, enforce
# feeble attempts at Usenet security, generate lots of silly headers.
#
# It could be faster; the alternative is casting a lot of local policy in C.
# =()<. ${NEWSCONFIG-@<NEWSCONFIG>@}>()=
. ${NEWSCONFIG-/etc/news/bin/config}
PATH=$NEWSCTL/bin:$NEWSBIN/inject:$NEWSBIN:$NEWSPATH; export PATH
debug='' # flags
exclusion=''
autopost=no; export autopost
relayopts=-i; export relayopts # redirect stdout to log
badsites=; export badsites # export to pnews
input=/tmp/in$$in # uncensored input; save on error
inhdrs=/tmp/in$$hdr # generated by tear: headers
inbody=/tmp/in$$body # generated by tear: body
censart=/tmp/in$$cens # censored input
outfile=/tmp/in$$out # relaynews stdout
rmlist="$input $inhdrs $inbody $censart $outfile"
umask $NEWSUMASK
# process arguments: for options, cat headers onto $input; cat files onto $input
# save input in dead.article, then clean up
savecleanup="test ! -f $HOME/dead.article -o -w $HOME/dead.article &&
cat $input >>$HOME/dead.article &&
{ echo $0: article in $HOME/dead.article >&2; rm -f $rmlist; }; exit 1"
justcleanup="rm -f $rmlist; exit 0" # normal exit - no dead.article
trap "$savecleanup" 0 1 2 3 15
### option processing ###
while :
do
case $# in
0) break ;; # arguments exhausted
esac
case "$1" in
# peculiar to C news
-debug) shift; debug="$1" ;;
-A) autopost=yes ;; # wait for free space
-N) justfilter=yes; trap "$justcleanup" 0 1 2 3 15 ;;
-V) relayopts= ;; # verbose: don't redirect stdout (or stderr)
# useful standard option
-x) shift; badsites="$badsites$1!" ;; # you're welcome, erik (B 2.11)
*) # bad option or a file name
echo "usage: $0 [-debug k] [-x site] [-ANV]" >&2
exit 1
;;
esac
shift # pass option
done
### beat up article on stdin ###
cat >$input # **
if
case "$justfilter" in # ** pnews takes 3.2 seconds
yes) pnews /tmp/in$$ <$input ;; # output in $inhdrs & $inbody
*) pnews /tmp/in$$ <$input >$censart ;; # output in $inhdrs & $inbody
esac
then :
else exit $? # clean up; pnews will have complained
fi
# to post or to mail? that is the question; whether 'tis nobler in the mind
# to suffer the slings and arrows of outrageous mailers - Bill Shakespeare
ngs=` awk '
# a dreadful hack around all.all.ctl
/^Control:/ { print "control"; ngs=""; exit }
/^Newsgroups:/ { ngs=$2 } # save for END
END { if (ngs != "") print ngs }
' $inhdrs `
case "$ngs" in # any Newsgroups:?
'') exit 1 ;; # nope: pnews will have already complained
,*|*,|*,,*)
echo "$0: illegal null newsgroup(s) in \`$ngs'" >&2
exit 1 ;;
*[\ \ ]*)
echo "$0: illegal whitespace in \`$ngs'" >&2
exit 1 ;;
esac
# look up groups in active, to determine disposition of this message.
# n, x and (unapproved) m flags are dealt with on the spot; if none are
# seen, the article is posted normally.
# POLICY: what happens to = groups; how are m articles mailed?
actflag="` actflag $ngs `" # ** takes 0.4 seconds
case "$actflag" in
'')
echo "$0: $ngs: no groups in active file" >&2
exit 1
;;
[nx]*)
# TODO: deal better when only some groups are n or x.
set $actflag
ng="$2"
echo "$0: sorry, $ng may not be posted to locally." >&2
exit 1
;;
m*)
if grep -s '^Approved:[ ]' $inhdrs >/dev/null; then
: # just post normally
else
case "$justfilter" in
yes) ;;
*)
set $actflag
ng="$2"
# unApproved article: mail to a moderator.
moderator="` modroute $ng `"
echo "mailing your article to $moderator"
mail "$moderator" <$censart
;;
esac
trap "$justcleanup" 0 # normal exit - no dead.article
exit 0
fi
;;
y|*) # * matches garbage flags, to be cautious.
# okay
;;
esac
### if the article was mailed, that happened above; posting will follow ###
# to get here, we must have seen no n, x, nor (unapproved) m flags.
# <$censart is used rather than a pipe to work around a bug in the 4.2 sh
# which made it sometimes return the wrong exit status (that of anne.jones).
# may not use "exec" or sh will leave /tmp/sh* files from here docs in /tmp.
if
case "$justfilter" in
yes) : ;;
*)
# relayopts="$relayopts -s -d ''$debug" \
PATH=$NEWSCTL/bin:$NEWSBIN/input:$NEWSBIN:$NEWSPATH
newsspool -g 0 <$censart # TODO: pass relayopts
;;
esac
then
# POLICY: warn the user about missing sys file?
if test ! -f $NEWSCTL/sys; then
echo "$0: $NEWSCTL/sys missing; your news can't leave this machine" >&2
fi
trap "$justcleanup" 0 # normal exit - no dead.article
exit 0
else
exit $? # trap 0 may cleanup, make dead.article
fi