gam@netcom.UUCP (Gordon Moffett) (11/27/90)
My query for a shell script to respool UUCP mail for a site gone dead had gotten a few responses, but all refering to Lenny Tropiano's "uureroute.c" posted recently, which expected *you* to provide the new path names, *you* to provide the UUCP job names, etc .... A computer should be expected to do better than that :-)! I had sent a copy of this shell script I was speaking of to our neighbor, amdahl, when I had originally gotten it, and got it back from them -- here it is. You just recalculate your pathalias database, run this shell script for a given site, and see the mail get rerouted to new paths. The usage is quite simple: "reroute <sitename>", like "reroute claris" or whatever. It expects to be run by 'root', and uses the id(1) program to determine that. I call it "reroute" the author called it "nukeq", you can name it whatever you like. Here is the author's original message. Note the caveats! But I have used it several times and it works beautifully. (There was a bug in the reference to the $user environment variable which is fixed here). When he talks about "smail" he is refering to smail 2.5. But I have used it with smail 3.1 without any problems. Smail 3.1 appears to ignore the -R flag, perhaps it should be taken out if you're running 3.1 Subject: Re: Rerouting spooled UUCP mail? Date: 11 Jan 90 20:18:08 EST (Thu) From: uunet!wang.COM!fitz (Tom Fitzgerald) > I need a tool to take UUCP jobs queued up for one site (which is dead) > and move them to another site's UUCP queue. Here's what I use. It makes some assumptions: - You're using HDB. If not, you'll have to screw with the filename pattern matching and directories. - You're using SMAIL. If not, you'll have to have some other mailer that accepts header lines in the message without modifying them, and you'll have to find some way of simulating SMAIL's -R (aggressive-rerouting) option. - You've already rebuilt the 'paths' file so that the dead node is missing from all paths. - You're logged in as root (needless to say). It's also got these flaky aspects: - It's dangerous as hell. I wrote it, and it scares me. Save a copy of all mail, and make sure the result is what you wanted before you let a uucico start up. - If any mail is queued for a user on the dead system (or for a user that can _only_ be reached via the dead system) it will not be rerouted. - Results in a doubled "Recieved:" line in the header. - More flakinesses are mentioned in the script itself. If you haven't given up yet, here it is. Good luck. ----------------------------------------------------------------------------- # Remail all of the mail queued for a particular system. Run as # # nukeq <sysname> # # Does nothing unless the paths files have been rebuilt so that all # final destinations in the mail messages are now reached through a # different neighbor. Otherwise mail will just be requeued for the # same system again. # # Doesn't fix the requestor field in the new X file, so errors in mailing # further along the line will probably be returned to the person who ran # nukeq rather then the person who originally sent the mail. # # The destinations are aggressively rerouted on the assumption that the # old path is irrelevant to the new first-hop. This may result in mail # sent to an incorrect system with the same name as the correct system. # # If uucico starts up while this thing is running, the world will come # to an end. if [ `id|sed 's/^uid=\([0-9]*\).*$/\1/'` -ne 0 ] then echo Not superuser, no can do. exit fi if [ $# -ne 1 ] then echo Need a system name exit fi sysname=$1 cd /usr/spool/uucp/$sysname for cfile in C.* do ( echo Doing C-file $cfile # For each C-file # Grab the line describing the D file read type source dest sender opts data mode notify || { echo $cfile is empty, skipping... continue } if [ "$type" != "S" -o "$source" != "$data" \ -o "$sender" != "$notify" -o "$opts" != "-" ] then echo $cfile has invalid line 1, skipping... continue fi case $dest in D.*) ;; *) echo $cfile line 1 isn\'t a Dfile, skipping... continue ;; esac dfile=$source echo D-file is $dfile # Grab the line describing the X file read type source dest sender opts data mode notify || { echo $cfile missing line 2, skipping... continue } if [ "$type" != "S" -o "$source" != "$data" \ -o "$sender" != "$notify" -o "$opts" != "-" ] then echo $cfile has invalid line 2, skipping... continue fi case $dest in X.*) ;; *) echo $cfile line 2 isn\'t an Xfile, skipping... continue ;; esac xfile=$source echo X-file is $xfile # Make sure the X-file was the last line in the C-file read type if [ -n "$type" ] then echo $cfile has more than 2 lines, skipping... continue fi # Read the xfile looking for the destinations dests=`egrep '^C rmail ' < $xfile | sed 's/^C rmail //'` if [ `echo $dests | wc -w` -eq 0 ] then echo $cfile isn\'t an rmail job, skipping... continue fi # Build newdests, which is the same as dests for users on # machines other than the one being nuked, and is $sysname!user # for users on the same system (this will result in mail being # queued back onto the same system again). newdests='' for user in $dests do if [ -n "`echo $user | grep !`" ] then newdests="$newdests $user" else newdests="$newdests $sysname!$user" fi done # echo Rerouting to $newdests # Re-send the mail, using aggressive rerouting smail -R -v $newdests < $dfile # And kill off the old message rm $cfile $dfile $xfile echo Done ) < $cfile done exit
mattc@ncr-sd.SanDiego.NCR.COM (Matt Costello) (11/28/90)
Here is another shell script to reroute mail queued up in an outgoing UUCP spool directory. It performs the same function as the script posted by Gordon Moffett <gam@netcom.UUCP> but it uses "uustat -s system" so it doesn't mess around in the bowels of UUCP. This makes it a whole lot simpler and safer. Just change the shell procedure definition for mail() to match what your MTA needs. ---------------------------- snip here ---------------------------- #!/bin/sh # uureroute.sh host # # This is a Honey DanBer specific routine to reroute all mail queued up # for a specific host. It needs to be run as "root" since uucp will not # allow itself to remove others requests. # if [ $# = 0 ] then echo "Usage: uureroute host" 1>&2 exit 2 fi for system do if cd /usr/spool/uucp/$system then : "all okay" else echo "$0: nothing queued for $system" 1>&2 fi uustat -s $system | \ awk ' BEGIN { print "set -ex" print "mail() /usr/lib/mail/smail -R1 $*" } /^[a-z]/ { jobid = $1 ; datafile = $7 } /^ / { if ( $5 != "rmail" ) next dest = "" for ( i = 6; i <= NF; i++ ) { if ($i ~ /@/) { n = split( $i, ary, "@" ); dest = "" dest " '$system'!" ary[1] } else { dest = "" dest " '$system'!" $i } } printf "mail %s < %s && uustat -k %s\n", \ dest, datafile, jobid } ' | /bin/sh done ---------------------------- snip here ---------------------------- -- Matthew Costello <Matthew.Costello@SanDiego.NCR.COM> +1 619 485 2926 uunet!ncrlnk!ncr-sd!mattc