bll@seer (Brad Lanam) (06/02/90)
Somebody was looking for a comp.mail.maps unbatcher. Here's my
version. It implements most of the functionality of uuhosts and some
support for smail. I would appreciate any comments on how to improve it.
print "Just another perl novice\n";
-- Brad
--
Until the next disk seek...
-- Brad Lanam ...!uunet!seeker!seer!bll bll@seer
======================================================================
The cron entries I use:
0 11 * * * /bin/nice -19 /usr/local/bin/perl /u1/smail/uuhosts.pl -unbatch
0 13 * * 0 /bin/nice -19 /usr/local/bin/perl /u1/smail/uuhosts.pl -smail
0 14 * * 0 /bin/nice -19 /usr/local/bin/perl /u1/smail/uuhosts.pl -index
echo extracting uuhosts.pl
sed 's/^X//' >uuhosts.pl <<'__END_OF_uuhosts.pl__'
X#!/usr/local/bin/perl
X#
X# unbatch.pl
X#
X# map unbatcher
X# creates smail "paths" database
X# makes uuhost index
X# uuhost program.
X#
X#
X
X#
X# change these to match your system.
X#
X$MAPS = '/u1/maps';
X$SPOOL = '/usr/spool/news/comp/mail/maps';
X$PATHDIR = '/u1/smail';
X$NICE = '/bin/nice -19';
X$MAIL = '/bin/mail -s "Updated Maps" news';
X$compress = 'y';
X
X#
X# You might need to change some of this.
X#
X$workIndex = $MAPS . '/WorkIndex';
X$index = $MAPS . '/Index';
X$unbatch = $PATHDIR . '/unbatch.pl';
X$mkpath = $PATHDIR . '/mkpath.sh';
X$pathalias = '/usr/local/bin/pathalias -c';
X$pathWork = $PATHDIR . '/paths.work';
X$paths = $PATHDIR . '/paths';
X
X$batch = $MAPS . '/Batch';
X$workBatch = $MAPS . '/Batch.working';
X$ranFile = $MAPS . '/MapsMade';
X
X
X#
X# used to sort name/map-file pairs for the uuhost
X# command.
X#
X
Xsub byMapName {
X ($nameA, $mapA) = split (/\t/, $a);
X ($nameB, $mapB) = split (/\t/, $b);
X
X if ($mapA lt $mapB) {
X return -1;
X }
X elsif ($mapA gt $mapB) {
X return 1;
X }
X else {
X if ($nameA lt $nameB) {
X return -1;
X }
X elsif ($nameA gt $nameB) {
X return 1;
X }
X }
X
X return 0;
X}
X
X#
X# main
X#
X
X#
X# initial setup
X#
Xif ($ARGV[0] eq '-setup') {
X open (BATCH_FH, ">$batch") || die "Couldn't open file $batch";
X foreach $map (<${SPOOL}/[0-9]*>) {
X printf BATCH_FH "$map\n";
X }
X close (BATCH_FH);
X system ("$NICE perl $unbatch -unbatch");
X exit 0;
X}
X#
X# unbatches maps listed in $MAPS/Batch
X#
Xelsif ($ARGV[0] eq '-unbatch') {
X if (! -r "$batch") {
X exit 0;
X }
X
X chdir ($MAPS);
X rename ("$batch", "$workBatch");
X open (MAIL_FH, "| $MAIL");
X open (BATCH_FH, "<$workBatch");
X
X while (<BATCH_FH>) {
X $fname = $_;
X chop $fname;
X open (MAP_FH, "<$fname");
X
X while (<MAP_FH>) {
X if (/^cat << 'SHAR_EOF' > (.*)$/o) {
X $mapName = $1;
X print MAIL_FH "$mapName\n";
X open (NEWMAP_FH, ">$MAPS/$mapName");
X
X while (<MAP_FH>) {
X if (! /^SHAR_EOF$/o) {
X print NEWMAP_FH $_;
X }
X else {
X close (NEWMAP_FH);
X last;
X }
X }
X last;
X }
X }
X close (MAP_FH);
X }
X close (BATCH_FH);
X close (MAIL_FH);
X unlink ("$workBatch");
X
X if ($compress eq 'y') {
X if (-e 'README') {
X system ("$NICE compress -f README");
X }
X system ("$NICE compress -f [a-z]*.*[a-z0-9]");
X }
X open (TEMP_FH, ">$ranFile") && close (TEMP_FH);
X exit 0;
X}
X#
X# Create an index to be used by the "uuhost" portion.
X#
Xelsif ($ARGV[0] eq '-index') {
X chdir ($MAPS);
X open (INDEX_FH, "|sort -o $workIndex");
X
X foreach $map (<[a-z]*.*[a-zA-Z0-9]>) {
X if ($compress eq 'y') {
X open (MAP_FH, "$NICE zcat $map |");
X }
X else {
X open (MAP_FH, "< $map");
X }
X
X ($map = $map) =~ s/\.Z$//o;
X
X while (<MAP_FH>) {
X if (/^#N[\t\ ]+/o) {
X s/^#N[\t\ ]+//o;
X tr/A-Z/a-z/;
X @names = split (/[,\ \t\n]+/);
X foreach $name (@names) {
X print INDEX_FH "$name\t$map\n";
X }
X }
X }
X close (MAP_FH);
X }
X
X close (INDEX_FH);
X unlink ($index);
X rename ($workIndex, $index);
X exit 0;
X}
X#
X# Create the smail "paths" database.
X#
Xelsif ($ARGV[0] eq '-smail') {
X if (! -r $ranFile) {
X exit 0;
X }
X
X unlink ("$ranFile");
X chdir $MAPS;
X foreach $map (<[a-z]*>) {
X $flist .= $map . ' ';
X }
X
X if ($compress eq 'y') {
X system ("$NICE $mkpath zcat $flist");
X }
X else {
X system ("$NICE $mkpath cat $flist");
X }
X
X if (! -z $pathWork) { # don't move new one in if we screw up.
X unlink ($paths);
X rename ($pathWork, $paths);
X chmod 0644, "$paths";
X }
X exit 0;
X}
X#
X# More smail support.
X#
Xelsif ($ARGV[0] eq '-path') {
X while (<STDIN>) {
X s/(.*)\t(.*)\t(.*)/\2\t\3\t\1/o;
X tr/A-Z/a-z/;
X print;
X }
X exit 0;
X}
X#
X# "uuhosts" command.
X#
Xelse {
X chdir ($MAPS);
X $temp = `look $ARGV[0] $index`;
X if ($temp eq '') {
X print "No host(s) named $ARGV[0] found\n";
X exit 0;
X }
X @list = split (/\n/, $temp);
X @list = sort byMapName @list;
X ($name, $file) = split (/\t/, @list[0]);
X $lastFile = '';
X
X foreach $line (@list) {
X ($name, $file) = split (/\t/, $line);
X
X if ($lastFile ne $file) {
X close (MAP_FH);
X if ($compress eq 'y') {
X open (MAP_FH, "zcat $file.Z |");
X }
X else {
X open (MAP_FH, "< $file");
X }
X }
X
X $state = 0;
X while (<MAP_FH>) {
X if (/^#N\t/o) {
X if ($state == 1) {
X print "\n";
X last;
X }
X }
X
X if (/^#N.+$name/) {
X $state = 1;
X print "($file)\n";
X }
X
X if ($state == 1) {
X s/^#N/#Name /o;
X s/^#F/#Forwarded-By /o;
X s/^#S/#System-CPU-OS /o;
X s/^#O/#Organization /o;
X s/^#C/#Contact /o;
X s/^#E/#Email-Address /o;
X s/^#T/#Telephone /o;
X s/^#P/#Postal-Address /o;
X s/^#L/#Latitude-Longitude/o;
X s/^#R/#Remarks /o;
X s/^#W/#Written-by /o;
X s/^#U/#USENET /o;
X print;
X }
X }
X }
X close (MAP_FH);
X}
__END_OF_uuhosts.pl__
echo extracting mkpath.sh
sed 's/^X//' >mkpath.sh <<'__END_OF_mkpath.sh__'
X:
X#!/bin/sh
X#
X#
XNICE="/bin/nice -19"
XPATHDIR="/u1/smail"
XPATH=/bin:/usr/bin:/usr/local/bin
Xexport PATH
X
Xzcat=$1
Xshift
X
X$NICE $zcat $* |
X$NICE pathalias -a zehntel -c |
X$NICE perl $PATHDIR/uuhosts.pl -path |
X$NICE sort -o $PATHDIR/paths.work
__END_OF_mkpath.sh__
echo extracting uuhosts
sed 's/^X//' >uuhosts <<'__END_OF_uuhosts__'
X:
X#!/bin/sh
X#
XPATHDIR="/u1/smail"
XPATH=/bin:/usr/bin:/usr/local/bin
Xexport PATH
X
Xperl $PATHDIR/uuhosts.pl $* | ${PAGER-/usr/local/bin/less}
__END_OF_uuhosts__
exit 0