NetBSD/gnu/dist/sendmail/contrib/buildvirtuser

188 lines
5.5 KiB
Plaintext
Raw Normal View History

2001-01-04 15:21:36 +03:00
#!/usr/bin/perl -w
# Copyright (c) 1999-2002 Gregory Neil Shapiro. All Rights Reserved.
2001-01-04 15:21:36 +03:00
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the author nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# Id: buildvirtuser,v 1.5 2002/02/08 08:10:59 gshapiro Exp
2001-01-04 15:21:36 +03:00
=head1 NAME
buildvirtuser - Build virtusertable support from a directory of files
=head1 SYNOPSIS
buildvirtuser [-f]
2001-01-04 15:21:36 +03:00
=head1 DESCRIPTION
buildvirtuser will build /etc/mail/virtusertable.db and /etc/mail/virthosts
based on the contents of the directory /etc/mail/virtusers/. That
directory should contain one file per virtual domain with the filename
matching the virtual domain name and the contents containing a list of
usernames on the left and the actual address for that username on the
right. An empty left column translates to the default for that domain.
2001-02-28 06:57:37 +03:00
Blank lines and lines beginning with '#' are ignored. Occurrences of
$DOMAIN in the file are replaced by the current domain being processed.
Occurrences of $LHS in the right hand side are replaced by the address on
the left hand side.
2001-01-04 15:21:36 +03:00
The -f option forces the database to be rebuilt regardless of whether
any file changes were detected.
2001-01-04 15:21:36 +03:00
=head1 CONFIGURATION
In order to function properly, sendmail must be configured to use these
files with:
FEATURE(`virtusertable')dnl
VIRTUSER_DOMAIN_FILE(`/etc/mail/virthosts')dnl
If a new domain is added (i.e., by adding a new file to
/etc/mail/virtusers/), the sendmail daemon must be restarted for the change
to take affect.
=head1 EXAMPLES
Here are some example files from the /etc/mail/virtusers/ directory:
=head2 /etc/mail/virtusers/bsdunix.org:
# Services
2001-02-28 06:57:37 +03:00
MAILER-DAEMON gshapiro+bounce.$DOMAIN@gshapiro.net
postmaster gshapiro+$LHS.$DOMAIN@gshapiro.net
webmaster gshapiro+$LHS.$DOMAIN@gshapiro.net
2001-01-04 15:21:36 +03:00
# Defaults
error:nouser No such user
# Users
2001-02-28 06:57:37 +03:00
gshapiro gshapiro+$DOMAIN@gshapiro.net
2001-01-04 15:21:36 +03:00
bob robert@smtp.org
=head2 /etc/mail/virtusers/smtp.org:
# Defaults
2001-02-28 06:57:37 +03:00
gshapiro+$DOMAIN@gshapiro.net
2001-01-04 15:21:36 +03:00
# Users
john john@wookie.org
nancy n@milter.com
=head1 AUTHOR
Gregory Neil Shapiro E<lt>F<gshapiro@gshapiro.net>E<gt>
=cut
2001-02-28 06:57:37 +03:00
use strict;
use Getopt::Std;
2001-02-28 06:57:37 +03:00
2001-01-04 15:21:36 +03:00
my $makemap = "/usr/sbin/makemap";
my $dbtype = "hash";
my $maildir = "/etc/mail";
my $virthosts = "$maildir/virthosts";
my $newvirthosts = "$maildir/virthosts.new";
my $virts = "$maildir/virtusers";
my $newvirt = "$maildir/virtusertable.new.db";
my $virt = "$maildir/virtusertable.db";
my %virt = ();
my $newest = 0;
2001-02-28 06:57:37 +03:00
my ($lhs, $domain, $key, $value);
my $opts = {};
getopts('f', $opts) || die "Usage: $0 [-f]\n";
2001-01-04 15:21:36 +03:00
opendir(VIRTS, $virts) || die "Could not open directory $virts: $!\n";
my @virts = grep { -f "$virts/$_" } readdir(VIRTS);
closedir(VIRTS) || die "Could not close directory $virts: $!\n";
foreach $domain (@virts)
{
open(DOMAIN, "$virts/$domain") || die "Could not open file $virts/$domain: $!\n";
my $line = 0;
my $mtime = (stat(DOMAIN))[9] || 0;
if ($mtime > $newest)
{
$newest = $mtime;
}
LINE: while (<DOMAIN>)
{
chomp;
$line++;
next LINE if /^#/;
next LINE if /^$/;
if (m/^([^\t ]*)[\t ]+(.*)$/)
{
if (defined($1))
{
2001-02-28 06:57:37 +03:00
$lhs = "$1";
2001-01-04 15:21:36 +03:00
$key = "$1\@$domain";
}
else
{
2001-02-28 06:57:37 +03:00
$lhs = "";
2001-01-04 15:21:36 +03:00
$key = "\@$domain";
}
$value = $2;
}
else
{
die "Bogus line $line in $virts/$domain\n";
}
2001-02-28 06:57:37 +03:00
# Variable subsitution
$key =~ s/\$DOMAIN/$domain/g;
$value =~ s/\$DOMAIN/$domain/g;
$value =~ s/\$LHS/$lhs/g;
2001-01-04 15:21:36 +03:00
$virt{$key} = $value;
}
close(DOMAIN) || die "Could not close $virts/$domain: $!\n";
}
my $virtmtime = (stat($virt))[9] || 0;
if ($opts->{f} || $virtmtime < $newest)
2001-01-04 15:21:36 +03:00
{
print STDOUT "Rebuilding $virt\n";
# logger -s -t ${prog} -p mail.info "Rebuilding ${basedir}/virtusertable"
open(MAKEMAP, "|$makemap $dbtype $newvirt") || die "Could not start makemap: $!\n";
foreach $key (keys %virt)
{
print MAKEMAP "$key\t\t$virt{$key}\n";
}
close(MAKEMAP) || die "Could not close makemap ($?): $!\n";
rename($newvirt, $virt) || die "Could not rename $newvirt to $virt: $!\n";
open(VIRTHOST, ">$newvirthosts") || die "Could not open file $newvirthosts: $!\n";
foreach $domain (sort @virts)
{
print VIRTHOST "$domain\n";
}
close(VIRTHOST) || die "Could not close $newvirthosts: $!\n";
rename($newvirthosts, $virthosts) || die "Could not rename $newvirthosts to $virthosts: $!\n";
}
exit 0;