[exim-cvs] cvs commit: exim/exim-src/util README mkcdb.pl

Góra strony
Delete this message
Reply to this message
Autor: Philip Hazel
Data:  
Dla: exim-cvs
Temat: [exim-cvs] cvs commit: exim/exim-src/util README mkcdb.pl
ph10 2005/05/24 12:20:40 BST

  Added files:
    exim-src/util        README mkcdb.pl 
  Log:
  Put DPC's mkcdb script (with tabs removed) into the util directory, and
  also created a README file for that directory.


  Revision  Changes    Path
  1.1       +35 -0     exim/exim-src/util/README (new)
  1.1       +93 -0     exim/exim-src/util/mkcdb.pl (new)


Index: README
====================================================================
$Cambridge: exim/exim-src/util/README,v 1.1 2005/05/24 11:20:40 ph10 Exp $

The "util" directory in the Exim distribution
---------------------------------------------

This directory contains some small scripts that people have contributed which
may be useful to others. They are probably not usable immediately without at
least some minor editing. Take them as starting points.

cramtest.pl
-----------

A Perl script to help with debugging CRAM-MD5 authentication.

logargs.sh
----------

A shell script to interpose between a caller and Exim, to find out what command
line arguments it is trying to use.

mkcdb.pl
--------

A Perl script for a converting flat file into a format that is suitable for
processing by cdbmake into a cdb file. It has some advantages over the
cdbmake-12 awk script.

unknownuser.sh
--------------

This is historical, dating to the time when people tried to send back a helpful
message when an incoming message's recipient was unknown. It recalls a
different age...

====

  Index: mkcdb.pl
  ====================================================================
  #!/usr/bin/perl -wT
  # $Cambridge: exim/exim-src/util/mkcdb.pl,v 1.1 2005/05/24 11:20:40 ph10 Exp $
  #
  # Create cdb file from flat alias file. DPC: 15/10/98.
  # Args:      source  (may be relative or absolute)
  #            target  (may be relative or absolute. Default = source)
  # Generates: target.cdb
  #            target.tmp
  #
  # Little Perl script to convert flat file into CDB file. Two advantages over
  # cdbmake-12 awk script that is distributed with CDB:
  #  1) Handles 'dpc22:dpc22@hermes' as well as 'dpc22 dpc22@hermes'
  #  2) Perl works with arbitary length strings: awk chokes at 1,024 chars
  #
  # Cambridge: hermes/src/admin/mkcdb,v 1.9 2005/02/15 18:14:12 fanf2 Exp


use strict;

$ENV{'PATH'} = "";
umask(022);

my $CDB = '/opt/cdb/bin/cdbmake';

my $prog = $0;
$prog =~ s|(.*/)?([^/]+)|$2|;

  my $source;
  my $target;
  if (@ARGV == 1) {
      $source = shift(@ARGV);
      $target = $source;
  } elsif (@ARGV == 2) {
      $source = shift(@ARGV);
      $target = shift(@ARGV);
  } else {
      die("$prog: usage: <source> [<target>]\n");
  }
  # trust the invoker ?!
  $source =~ /(.*)/;
  $source = $1;
  $target =~ /(.*)/;
  $target = $1;


  open(SOURCE, "< ${source}")
      or die("$prog: open < $source: $!\n");


  open(PIPE, "| $CDB $target.cdb $target.tmp")
      or die("$prog: open | $CDB $target: $!\n");


  sub add_item ($$) {
      my $key = shift;
      my $val = shift;
      printf PIPE ("+%d,%d:%s->%s\n", length($key), length($val), $key, $val);
  }


  sub add_line ($) {
      my $line = shift;
      if ($line =~ /^([^\s:]+)\s*:\s*(.*)$/s) {   # key : values
          add_item($1,$2);
          return;
      }
      if ($line =~ /^(\S+)\s+(.*)$/s) {       # key: values
          add_item($1,$2);
          return;
      }
      if ($line =~ /^(\S+)$/s) {              # key (empty value)
          add_item($1,'');
          return;
      }
      warn "$prog: unrecognized item: $line";
  }


  my $data;
  while(<SOURCE>) {
      next if /^#/ or /^\s*$/;
      m/^(\s*)(\S.*)\s+$/s;
      if (length($1) == 0) {
              add_line($data) if defined $data;
              $data = $2;
      } else {
              $data .= " $2";
      }
  }
  add_line($data) if defined $data;
  print PIPE "\n";


  close(SOURCE)
      or die("$prog: close < $source: $!\n");
  close(PIPE)
      or die($! ? "$prog: close | $CDB $target: $!\n"
             : "$prog: close | $CDB $target: exited $?\n");


exit 0;