zmact61@tsun4.doc.ic.ac.uk.doc.ic.ac.uk (D Spinellis) (01/23/90)
In article <6062@cps3xx.UUCP> pantz@mth.msu.edu (Tzu-Hsi Pan) writes: > >I'm interested in setting up a bridge such that mailing list members >can receive news from a particular USENET news group and they can also >post news to USENET thru the bridge. The following script provides the USENET to mailing list function. It connects to a host running nntp and automatically creates a digest of all articles that appeared in the newsgroup since the last time it was run together with instructions to forward it to a list. Change the actual script in order to configure it for your needs. The output of the script needs to be piped to sh, so you will probably run it with a crontab entry like: 30 03 * * * /usr/local/bin/newsgate | sh There must be more comprehensive and sophisticated programs available. This script however works and is very easy to configure. There is a feature for adding articles local to the digest. The whole script needs named pipes. Diomidis #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # newsgate # This archive created: Mon Jan 22 20:18:55 1990 export PATH; PATH=/bin:$PATH echo shar: extracting "'newsgate'" '(3209 characters)' if test -f 'newsgate' then echo shar: will not over-write existing file "'newsgate'" else sed 's/^X//' << \SHAR_EOF > 'newsgate' X#!/bin/sh X# Create a news digest from a newsgroups list using an nntp server. X# The output of the command can be fed to sh to mail the digest off. X# X# (C) Copyright 1989 Diomidis Spinellis. All rights reserved. X# X# Redistribution and use in source and binary forms are permitted X# provided that the above copyright notice and this paragraph are X# duplicated in all such forms. X# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR X# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED X# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. X XNEWSGATESPOOL=/usr/local/spool/digest X# The nntp host XHOST=uunet.uu.net X X# Groups to digest XGROUPS="comp.sources.unix comp.sources.misc alt.sources" X X# Where the numbers of the last articles forwarded are kept XLAST=$NEWSGATESPOOL/last X X# Local messages. Automatically erased after used. X# Each local article must be terminated with 78i- (A line of 78 -) XLOCAL=$NEWSGATESPOOL/local X X# Digest number XNUMBERFILE=$NEWSGATESPOOL/nf XNUMBER=`cat $NUMBERFILE 2>/dev/null || echo 1` X X# People who receive the digest. Must be comma separated. XRECEIVERS='user1@foo.bar, user2@bar.foo, user3@foo.bar, X user4, user5@foobar' XSRECEIVERS=`echo $RECEIVERS | sed -e 's/,//g'` X X# We need this so that telnet does not see a file close. Xrm -f cmds cmds1 X/usr/etc/mknod cmds p X/usr/etc/mknod cmds1 p X X# Ask for the articles available in the groups we are interested in X( X for i in $GROUPS X do X echo group $i X done X echo quit X) >cmds & X# Feed nntp with them and create nntp commands to print each article X( X # This is the list of articles already used. They are refixed by HHH X cat $LAST 2>/dev/null || X # If file does not exist initialise to 0 X for i in $GROUPS X do X echo "HHH $i 0" X done X # Make it zero longth so we can append the new ones X cp /dev/null $LAST X # This will print the available articles prefixed by 211 X telnet gould nntp <cmds 2>/dev/null X) | X/bin/awk ' X# Already sent X/^HHH/ { X last[$2] = $3 X} X# Articles available X/^211/ { X if (last[$5] > $3) X first = last[$5] + 1 X else X first = $3 X print "group", $5 X for (i = first; i < $4; i++) X print "article", i X # Update the last file X print "HHH", $5, $4 >>"'$LAST'" X} XEND { X print "quit" X} X' >cmds1 & X X# Now get the articles and create the batch Xtelnet gould nntp <cmds1 2>/dev/null | Xsed -n -e ' X# Do not print anything that comes of telnet after connection is closed X/^205.*closing connection\. Goodbye\.$/q X# Print only some items from the header X/^220.*Article retrieved; head and body follow\.$/,/^$/ { X /^From/p X /^Subject/p X /^Date/p X /^Newsgroups/p X} X# Print all the body X/^$/,/^\./p X' | X( Xcat <<EOF X#!/bin/sh X/usr/lib/sendmail -i "$SRECEIVERS" <<\END_SOURCES XDate: `date` XTo: $RECEIVERS XFrom: Source Digest <source@foo.bar> XSubject: The Source Groups Digest $NUMBER X XThis digest contains all articles posted in the USENET newsgroups Xcomp.sources.misc, comp.sources.unix and alt.sources. X X------------------------------------------------------------------------------ X`cat $LOCAL` X XEOF Xsed -e 's/^\./------------------------------------------------------------------------------/' Xecho END_SOURCES X) X Xexpr $NUMBER + 1 >$NUMBERFILE Xrm -f cmds cmds1 Xcp /dev/null $LOCAL SHAR_EOF if test 3209 -ne "`wc -c < 'newsgate'`" then echo shar: error transmitting "'newsgate'" '(should have been 3209 characters)' fi fi # end of overwriting check # End of shell archive exit 0 -- Diomidis Spinellis Internet: dds@cc.ic.ac.uk Department of Computing BITNET: dds@cc.ic.ac.uk Imperial College UUCP: ...!cernvax!cc.imperial.ac.uk!dds London SW7 2BZ JANET: dds@uk.ac.ic.cc