diff options
author | gshapiro <gshapiro@FreeBSD.org> | 2001-01-21 22:17:06 +0000 |
---|---|---|
committer | gshapiro <gshapiro@FreeBSD.org> | 2001-01-21 22:17:06 +0000 |
commit | 167a83e7b8733416154f871e39e86ba77eb1554d (patch) | |
tree | 4f725bdbff499cf7343d2eaeec15f8a0f0926140 /contrib/sendmail/contrib/buildvirtuser | |
parent | f84ac9120cb7d9f087e5dcb863c4bf25ba2985e6 (diff) | |
download | FreeBSD-src-167a83e7b8733416154f871e39e86ba77eb1554d.zip FreeBSD-src-167a83e7b8733416154f871e39e86ba77eb1554d.tar.gz |
Import sendmail 8.11.2
Diffstat (limited to 'contrib/sendmail/contrib/buildvirtuser')
-rwxr-xr-x | contrib/sendmail/contrib/buildvirtuser | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/contrib/sendmail/contrib/buildvirtuser b/contrib/sendmail/contrib/buildvirtuser new file mode 100755 index 0000000..e544828 --- /dev/null +++ b/contrib/sendmail/contrib/buildvirtuser @@ -0,0 +1,167 @@ +#!/usr/bin/perl -w + +# Copyright (c) 1999-2000 Gregory Neil Shapiro. All Rights Reserved. +# +# 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.1.2.1 2000/10/26 22:51:03 gshapiro Exp $ + +=head1 NAME + +buildvirtuser - Build virtusertable support from a directory of files + +=head1 SYNOPSIS + + buildvirtuser + +=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. +Blank lines and lines beginning with '#' are ignored. + +=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 + MAILER-DAEMON gshapiro+MAILER-DAEMON.bsdunix.org@gshapiro.net + postmaster gshapiro+postmaster.bsdunix.org@gshapiro.net + webmaster gshapiro+webmaster.bsdunix.org@gshapiro.net + + # Defaults + error:nouser No such user + + # Users + gshapiro gshapiro+bsdunix.org@gshapiro.net + bob robert@smtp.org + +=head2 /etc/mail/virtusers/smtp.org: + + # Defaults + gshapiro+smtp.org@gshapiro.net + + # Users + john john@wookie.org + nancy n@milter.com + +=head1 AUTHOR + +Gregory Neil Shapiro E<lt>F<gshapiro@gshapiro.net>E<gt> + +=cut + +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; + +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)) + { + $key = "$1\@$domain"; + } + else + { + $key = "\@$domain"; + } + $value = $2; + } + else + { + die "Bogus line $line in $virts/$domain\n"; + } + $virt{$key} = $value; + } + close(DOMAIN) || die "Could not close $virts/$domain: $!\n"; +} + +my $virtmtime = (stat($virt))[9] || 0; +if ($virtmtime < $newest) +{ + 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; |