news@stl.stc.co.uk (News admin c/o dww) (05/01/89)
Back in 1985 someone at TRW wrote and posted to the net the program mvjunk,
which goes through the articles in 'junk' and puts them into the news
groups given in their Newsgroups: headers, creating any groups that don't
already exist. But the version we got had bugs, for example it did not
create the groups and directories properly. Despite that it was useful,
and eventually - last month - I got round to fixing the bugs, adding code
to create parent directories too, making it tell you what it was doing as
it did it, and adding a few comments to the code. No doubt improvements in
style and performance are possible, but I decided to leave the parts that
worked unchanged, and follow the original author's style in my mods.
I have tested it on Sun OS3.5 and VAX UNIX 4.2 - I know no reason why it
should not work on other flavours of UNIX, but nor do I give any guarantees.
Here it is - use as you wish, at your own risk of course.
Enjoy!
- - - - - - - - - - - Cut Here 8== - - - - - - - - - - - - - - - - - - - - - -
#!/bin/sh
# mvjunk.sh
#
# Move news files out of junk and into their proper directories,
# updating the active list and localgroups as we go.
# Unknown newsgroups found in junked articles are created by adding an
# entry to the active file and creating the directory. A newgroups
# article is also posted in case the group is required across the local net,
# and to put the group creation into the news logs.
#
# TRW Advanced Technology Facility STA 2-Jun-1985
#
# Modified 10/22/85-James M. Scardelis, SA, Warner Computer Systems
# to create newsgroups locally only.
#
# Modified April 1989 David Wright dww@stl.stc.co.uk
# to fix bugs in group creation and make directories include parents
#
# This program is in the public domain - do with it whatever you like.
#
# Be CAREFUL with that active list! Although we try to write out
# buffers as quickly as possible, conflicts can occur if someone else
# tries to use it at the same time this script is running!
#
# Actions taken and strange occurences are recorded in mvjunk-log.
# Set DISTRIB to cover your local net or organisation if you want any
# new groups found to be created across your net. The default is local only
DISTRIB=local
JUNK=/usr/spool/news/junk
SPOOL=/usr/spool/news
LIB=/usr/lib/news # See line 121
umask 22
chmod u+wr $LIB/active
cd $JUNK
if /bin/test -z "`ls`" ; then exit
fi
chmod u+wr *
for j in $JUNK/*
do
for group in `egrep '^Newsgroups:' $j | head -1 | \
sed 's;Newsgroups:[ ];;' | \
sed 's;,; ;g'`
do
echo "Found article $j for group $group"
echo "Found article $j for group $group" >> $LIB/mvjunk-log
l=`egrep '^Control:' $j`
if /bin/test -n "$l" ; then
GROUPDIR="control"
group="control"
else
GROUPDIR=`echo $group | sed 's;\.;\/;g'`
fi
#
cd $SPOOL
if /bin/test -d $GROUPDIR ; then
# Directory exists - work out number of the next article
cd $GROUPDIR
l=`ls`
if /bin/test -n "$l" ; then
a=`ls | sort -r -n`
for f in $a
do
if /bin/test -f "$f" ; then
article=`echo $f "+1" | bc`
break
fi
done
else
article=1
fi
else
# No directory for this group - create one, and set art.no = 1
# Create parent directories too if they don't exist already
dir=$SPOOL
for subdir in `echo $group | sed 's;\.; ;g'`
do
dir=${dir}/${subdir}
if /bin/test ! -d "$dir" ; then
echo "Creating directory $dir"
echo "Creating directory $dir">>$LIB/mvjunk-log
mkdir $dir
fi
done
article=1
fi
# Now we know where to put it, put it there,
# and update active file too
cd $SPOOL/$GROUPDIR
if /bin/test ! -d "$article" ; then
cp $j $SPOOL/$GROUPDIR/$article
chmod ugo+wr $SPOOL/$GROUPDIR/$article
chown news $SPOOL/$GROUPDIR/$article
chgrp news $SPOOL/$GROUPDIR/$article
the_date=`date`
entry=`egrep "^$group " $LIB/active`
if /bin/test -z "$entry" ; then
echo \
"Created $the_date to hold articles found in junk"|\
$LIB/inews -d $DISTRIB -C $group
echo "Created group $group at $the_date" \
>> $LIB/mvjunk-log
entry="$group 00001 00001 y"
echo $entry >> $LIB/active
echo \
"$group found in junk; created at $the_date" \
>> $LIB/localgroups
fi
entry="^$entry "
#
# There should be a way of passing shell variables into awk, but since
# we don't know how to do that we just hardwire it. Kludgy... no?
#
echo $article $entry $the_date | \
awk 'BEGIN { FS = " " } \
{ if ( NF != 11 ) printf "Munged active entry: %s\n",\
$0 >"/usr/lib/news/mvjunk-log" ; \
if ( length($1) > 5 ) printf "Field too large: %s\n",\
$0 >"/usr/lib/news/mvjunk-log" ; \
if ( length($3) > 5 ) printf "Field too large: %s\n",\
$0 >"/usr/lib/news/mvjunk-log" ; \
if ( length($4) > 5 ) printf "Field too large: %s\n",\
$0 >"/usr/lib/news/mvjunk-log" ; \
printf "/%s/s;%s;",$2,$3 ; \
for ( i = 5 - length($1) ; i > 0 ; i-- ) printf "0" ; \
print $1 ";" ; \
if ( length($4) < 5 ) { \
printf "s;%s;",$4 ; \
for ( i = 5 - length($1) ; i > 0 ; i-- ) printf "0" ; \
print $4 ";" \
} \
if ( $5 != "y" && $5 != "n" ) print "s;.$;y;" } \
END { printf "w\nq\n" }' | ed - $LIB/active
else
echo \
"Hey, there's a directory called $SPOOL/$GROUPDIR/$article!"
echo \
"Hey, there's a directory called $SPOOL/$GROUPDIR/$article!"\
>> $LIB/mvjunk-log
fi
done
if /bin/test -f $SPOOL/$GROUPDIR/$article ; then
/bin/rm -f $j # But my MOTHER lives in Hackensack!
else
echo "Couldn't find the article I just installed!"
echo "Couldn't find the article I just installed!" >> \
$LIB/mvjunk-log
fi
done
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -