home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume28 / bmw-5 / part01 / bmwmail < prev    next >
Text File  |  1994-07-09  |  5KB  |  218 lines

  1. #! /usr/bin/perl
  2. #
  3. # bmwmail - send a message to the mailing list
  4. #
  5. #
  6.  
  7. $USAGE = "$0 <listname>\n";
  8. # This program expects a mail-format message on standard input.
  9.  
  10. if ($#ARGV != 0) { die ("$USAGE"); }
  11.  
  12. $LISTNAME = $ARGV[0];
  13. $LISTNAME =~ tr/A-Z/a-z/;  # Convert everything to lower case for now.
  14.  
  15. %GLOBALS = ();
  16.  
  17. ## We need to set the hostname.  You this is done by querying hostname and
  18. ## domainname.  You can override this here or set your FQDN global explicitly
  19. ## in the bmw.cf file.
  20.  
  21. $HOSTNAME = `hostname`; chop($HOSTNAME);
  22. $DOMAINNAME = `domainname`; chop($DOMAINNAME);
  23.  
  24. ## Path to bmw.cf - CHANGE THIS FOR YOUR SYSTEM
  25. #$BMWCF = "/etc/bmw.cf";
  26. $BMWCF = "/home/bmw/bmw.cf";
  27.  
  28. ## Process the config file and learn about all the globals.
  29. ## FORMAT OF CONFIG FILE:
  30. ##   Each line of the config file should have the format
  31. ##     <globalname> = <value>
  32. ##   for example,
  33. ##     BASEDIR = /usr/local/lib/bmw
  34. ##
  35. ## I now set the defaults.  You should override these in your bmw.cf file.
  36. ##
  37. $GLOBALS{'SENDMAIL'} = "/usr/lib/sendmail";
  38. $GLOBALS{'SENDMAILOPTS'} = "";
  39. $GLOBALS{'ENCODE'} = "/usr/bin/uuencode";
  40. $GLOBALS{'COMPRESS'} = "/bin/gzip";
  41. $GLOBALS{'COMPSUFFIX'} = ".gz";
  42. $GLOBALS{'ARCDIR'} = "/home/ftp/pub/lists";
  43. $GLOBALS{'ARCOWNER'} = "ftp";
  44. $GLOBALS{'OWNER'} = "postmaster";
  45. $GLOBALS{'DEBUG'} = 0;
  46. $GLOBALS{'LOG'} = 0;
  47. $GLOBALS{'MAXGETS'} = 5;
  48. $GLOBALS{'PREFERFTP'} = 0;
  49. $GLOBALS{'TRACE'} = 0;
  50. $GLOBALS{'BASEDIR'} = "/home/bmw";
  51. $GLOBALS{'FQDN'} = $HOSTNAME . "." . $DOMAINNAME;
  52. $GLOBALS{'DIGEST'} = 0;
  53. $GLOBALS{'TMPDIR'} = "/var/tmp";
  54. $GLOBALS{'USER'} = "bmw";
  55. $GLOBALS{'GROUP'} = "bin";
  56.  
  57.  
  58. @VALIDGLOBALS = ("SENDMAIL", "SENDMAILOPTS", "TMPDIR", "ENCODE",
  59.                  "COMPRESS", "COMPSUFFIX", "ARCDIR", "ARCOWNER",
  60.                  "OWNER", "DEBUG", "LOG", "MAXGETS", "PREFERFTP",
  61.                  "TRACE", "BASEDIR", "FQDN", "DIGEST", "USER", "GROUP");
  62.  
  63.  
  64.  
  65. sub validGlobal {
  66. ## Determine if the string is a valid global reference.
  67.   local($s) = @_;
  68.   local($i);
  69.   for ($i=0; $i<=$#VALIDGLOBALS; $i++) {
  70.     if ($s eq $VALIDGLOBALS[$i]) { return 1; }
  71.   }
  72.   return 0;
  73. }
  74.  
  75.  
  76.  
  77. ## Load the globals from the cf file.
  78. if (-e $BMWCF) {
  79.   local($lno) = 0;
  80.   local(@LINE);
  81.   open(CF, "<$BMWCF") || die "Cannot open $BMWCF: $!\n";
  82.   while (<CF>) {
  83.     $lno++;
  84.     chop;
  85.     tr/\t //d;
  86.     @LINE = split("=");
  87.     if (!$LINE[0]) { die "ERROR in $BMWCF line $lno; $_\n"; }
  88.     $LINE[0] =~ tr/a-z/A-Z/;
  89.     if (!&validGlobal($LINE[0])) {
  90.       die "ERROR in $BMWCF line $lno; Unknown global \"$LINE[0]\"\n";
  91.     }
  92. ## Good.  We have a valid global
  93.     $GLOBALS{$LINE[0]} = $LINE[1];
  94.   }
  95. }
  96. else {
  97.   die "$BMWCF does not exist!\n";
  98. }
  99.  
  100. if ($GLOBALS{'DEBUG'}) {
  101.   local($key);
  102.   foreach $key (keys %GLOBALS) {
  103.     print "$key = $GLOBALS{$key}",$LF;
  104.   }
  105. }
  106.  
  107.  
  108. ## Internal global values.  Do not fiddle with these without good reason.
  109. $VERSION = "5.0";
  110. $LISTDIR = $GLOBALS{'BASEDIR'} . "/$LISTNAME";
  111. $DIGESTFILE = "$LISTDIR/digest";
  112. $TOCFILE = "$LISTDIR/digesttoc";
  113. $LOGFILE = "$LISTDIR/log";
  114. $MESSAGE = "$LISTDIR/message";
  115. $HELP = $GLOBALS{'BASEDIR'} . "/help";
  116.  
  117. $TMPFILE = $GLOBALS{'TMPDIR'} . "/bmw$$";
  118. $REPLYFILE = "$TMPFILE.reply";
  119. $TMPLOGFILE = "$TMPFILE.log";
  120.  
  121. $LISTOWNER = "$LISTNAME-owner";
  122. $LISTREQUEST = "$LISTNAME-request";
  123.  
  124. @ERRORS = ();
  125. %LOCKS = ();
  126.  
  127. ##
  128. ## Exit routines.  These make sure everything is cleaned up.
  129. ##
  130. sub finish {
  131.   local($rc) = @_;
  132.   local($i);
  133.   system("rm -f $TMPFILE $REPLYFILE");
  134.   if ($#ERRORS > -1) {
  135.     open(T, ">$TMPFILE");
  136.     print T "From: $LISTOWNER\n";
  137.     print T "Subject: Errors from $LISTREQUEST\n";
  138.     print T "To: $LISTOWNER\n\n";
  139.     for ($i = 0; $i <= $#ERRORS; $i++) {
  140.       print T $ERRORS[$i],$LF;
  141.     }
  142.     close(T);
  143.     system("cat $TMPFILE | $GLOBALS{'SENDMAIL'} \'$LISTOWNER\'");
  144.     system("rm -f $TMPFILE")
  145.   }
  146.   exit($rc);
  147. }
  148.  
  149.  
  150. sub DIE {
  151.   local($msg) = @_;
  152.   print STDERR "$msg",$LF;
  153.   $ERRORS[$#ERRORS+1] = $msg;
  154.   local($key);
  155.   foreach $key (keys %LOCKS) {
  156.     system("rm -f $key");
  157.   }
  158.   &finish(-1);
  159. }
  160.  
  161.  
  162. # Test for things that must exist.
  163.  
  164. &DIE("$LISTDIR does not exist!\n") if (! -d $LISTDIR);
  165.  
  166. $FQDN = $GLOBALS{'FQDN'};
  167.  
  168. $DATE = `date`; chop($DATE);
  169.  
  170. @TEXT = ();
  171.  
  172. $LISTADDR = "$LISTNAME@$FQDN (The $LISTNAME mailing list)";
  173. $MAILADDR = "$LISTNAME-mail";
  174.  
  175. $MAILCMD = "$GLOBALS{'SENDMAIL'} $MAILADDR";
  176.  
  177. open(T,">$TMPFILE") || &DIE("$TMPFILE: $!\n");
  178.  
  179. shift;
  180.  
  181. $HEADERS = 1;
  182. $l = 0;
  183. while (<>)
  184. {
  185.   if ($HEADERS)
  186.   {
  187.     $l = length;
  188.     if ($l > 1)
  189.     {
  190.       if (!/^Reply-To:/ && !/^Errors-To:/)
  191.       {
  192.         print T $_;
  193.       }
  194.     }
  195.     else
  196.     {
  197.       print T "Reply-To: $LISTADDR\n";
  198.       print T "Errors-To: $LISTOWNER@$FQDN\n";
  199.       print T "X-bmw: Black Marble Wombat Version $VERSION\n";
  200.       print T $_;
  201.       $HEADERS = 0;
  202.     }
  203.   }
  204.   else
  205.   {
  206.     print T $_;
  207.   }
  208. }
  209.  
  210. close(T);
  211.  
  212. #open(T,"<$TMPFILE");
  213. #while (<T>) { print "3 " . $_; }
  214. #close(T);
  215. system("cat $TMPFILE | $MAILCMD");
  216.  
  217. &finish();
  218.