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