home *** CD-ROM | disk | FTP | other *** search
- #! /bin/sh
- # checkgroups - check active file for missing or extra newsgroups or groups
- # with incorrect moderation status, and update the newsgroups file.
- # stdin must a checkgroups news article, sends mail to $NEWSMASTER.
-
- # =()<. ${NEWSCONFIG-@<NEWSCONFIG>@}>()=
- . ${NEWSCONFIG-/var/lib/news/bin/config}
- export NEWSCTL NEWSBIN NEWSARTS
- PATH=$NEWSCTL/bin:$NEWSBIN:$NEWSPATH ; export PATH
- desc=/tmp/cg$$d
- hiers=/tmp/cg$$h
- canact=/tmp/cg$$a
- newact=/tmp/cg$$n
- diffs=/tmp/cg$$df
- actgrps=/tmp/cg$$ag
- newgrps=/tmp/cg$$ng
- samegrps=/tmp/cg$$sg
- addgrps=/tmp/cg$$ad
- remgrps=/tmp/cg$$rm
- sameact=/tmp/cg$$sa
- samenew=/tmp/cg$$sn
- modchng=/tmp/cg$$mc
-
- umask $NEWSUMASK
- trap 'rm -f /tmp/cg$$*; exit' 0 1 2 15
-
- # behead stdin (checkgroups article) & ignore lines that don't fit the syntax
- # (should just be able to reject tabless lines, but Bitnet buggers that).
- # ignore signatures and initial !mod lines.
- ngalpha='-_+a-zA-Z0-9'
- sed -n -e '1,/^$/d' -e '1{/^!mod$/d;}' -e '/^-- $/,$d' \
- -e "/^[$ngalpha][ ][ ]*/p" \
- -e "/^[$ngalpha][$ngalpha.]*[$ngalpha][ ][ ]*/p" \
- >$desc
-
- # generate list of hierarchies affected
- sed 's/\..*//' $desc | sort -u >$hiers
-
- # backup newsgroups before updating it
- cp $NEWSCTL/newsgroups $NEWSCTL/newsgroups.bac || { exit 1; }
- # toss out old newsgroups rubbish
- hierlist="`cat $hiers`" # message is assumed authoritative for these
- hierpat="` echo $hierlist | tr ' ' , `" # one more time, with commas
- (gngp -av "$hierpat" $NEWSCTL/newsgroups.bac
- # add new newsgroups rubbish
- cat $desc) >$NEWSCTL/newsgroups
-
- # canonicalise active file & select interesting hierarchies
- awk '{
- modstat = $4
- if (modstat != "y" && modstat != "m")
- modstat = "y"
- print $1, modstat
- }' $NEWSCTL/active | gngp -a "$hierpat" | sort >$canact
-
- # canonicalise body into an active-file-like thing
- awk '
- /Moderated/ { print $1, "m" } # TODO: " (Moderated)$"? as per B 2.11.19
- !/Moderated/ { print $1, "y" }
- ' $desc | sort >$newact
-
- # what's different? first, what groups have vanished or appeared?
- sed 's/ .*//' $canact >$actgrps
- sed 's/ .*//' $newact >$newgrps
- comm -12 $actgrps $newgrps >$samegrps
- comm -23 $actgrps $newgrps >$remgrps
- comm -13 $actgrps $newgrps >$addgrps
- if test -s $remgrps; then
- echo
- echo 'obsolete groups:'
- cat $remgrps
- fi >$diffs
- if test -s $addgrps; then
- echo
- echo 'new groups:'
- cat $addgrps
- fi >>$diffs
-
- # next, what surviving groups have changed moderation status?
- join $samegrps $canact >$sameact
- join $samegrps $newact >$samenew
- comm -13 $sameact $samenew >$modchng
- if test -s $modchng; then
- echo
- echo 'groups needing moderation status changed to that shown:'
- cat $modchng
- fi >>$diffs
-
- if test -s $diffs; then
- (echo "Subject: possible active file problems"; echo;
- echo "If you believe this checkgroups control message, the following"
- echo "differences may reflect groups that should be added, deleted,"
- echo "or have their moderation status(es) changed:"
- cat $diffs) | mail "$NEWSMASTER"
- fi
- exit 0 ## end of new one
-