[comp.lang.perl] uuhosts in perl

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