#!/bin/sh # $NetBSD: postfix-wrapper,v 1.1.1.1 2009/06/23 10:08:23 tron Exp $ # #++ # NAME # postfix-wrapper 1 # SUMMARY # trivial but useful multi-instance manager # SYNOPSIS # postfix command # DESCRIPTION # Postfix versions 2.6 and later provide support for multiple # Postfix instances. Instances share executable files and # documentation, but have their own directories for configuration, # queue and data files. In many cases different instances # have different myhostname and inet_interfaces settings, # though this is not always necessary. # # This command implements a trivial Postfix multi-instance # manager. It simply applies commands such as "postfix start" # to all the applicable Postfix instances. # MANAGING MULTIPLE INSTANCES # .ad # .fi # To hook the postfix-wrapper multi-instance manager into # Postfix, see the POSTFIX-WRAPPER INITIALIZATION section # below. To create a new Postfix instance, see the CREATING # A NEW POSTFIX INSTANCE section below. # # To start, stop, get status, etc., with multiple Postfix # instances, use: # # .nf # # postfix command # .fi # # For example, to find out what Postfix instances are configured: # # .nf # # postfix status # .fi # # The postfix(1) command invokes the postfix-wrapper command. # This in turn applies the postfix(1) command to the default # Postfix instance, and to each instance specified with the # default main.cf file's multi_instance_directories parameter # value. # # The postfix-wrapper command will start, stop, reload, etc., # only Postfix instances that have "multi_instance_enable = # yes" in their main.cf files. When an instance is disabled, # postfix-wrapper replaces "start" commands by "check" so # that problems will still be reported. # # The startup order is taken from the multi_instance_directories # parameter; the default instance is prepended to the list. # The startup order is used for all postfix(1) commands, # except for commands that stop Postfix instances. In those # cases the order is reversed. # MANAGING INDIVIDUAL INSTANCES # .ad # .fi # To manage an individual Postfix instance, use: # # .nf # # postfix -c /path/to/config_directory command # .fi # # This is also needed to manage the default Postfix instance, # after you turn on multi-instance support. # # To use the Postfix sendmail command with a non-default # Postfix instance, use: # # .nf # # sendmail -C /path/to/config_directory ... # .fi # # Note 1: that's capital C, not lower-case c. # # Note 2: only the default Postfix instance will check or # update the shared Postfix files, including the executable # files and documentation. # POSTFIX-WRAPPER INITIALIZATION # .ad # .fi # To hook this program into Postfix, execute the command # shown below. # # This command should be entered as one line. # # In the example, replace /etc/postfix with the default Postfix # configuration directory, and replace /usr/libexec/postfix # with the daemon directory pathname of the default Postfix # instance. # # .nf # # postconf -c /etc/postfix -e # "multi_instance_enable=yes" # "multi_instance_wrapper=/usr/libexec/postfix/postfix-wrapper" # .fi # CREATING A NEW POSTFIX INSTANCE # .ad # .fi # To create a Postfix instance called "postfix-test", start # with generic main.cf and master.cf files and customize the # locations of the queue and data directories with the commands # shown below. The last command updates main.cf and creates # any directories that Postfix will need. # # Each command below should be entered as one line. # # In the example, replace /etc/postfix with the default Postfix # configuration directory, and replace /usr/libexec/postfix # with the daemon directory pathname of the default Postfix # instance. # # .nf # # mkdir /etc/postfix-test # # cp /usr/libexec/postfix/main.cf /etc/postfix-test # # cp /usr/libexec/postfix/master.cf /etc/postfix-test # # postconf -c /etc/postfix-test -e # "multi_instance_name=postfix-test" # # postfix -c /etc/postfix post-install # "config_directory=/etc/postfix-test" # "queue_directory=/var/spool/postfix-test" # "data_directory=/var/lib/postfix-test" # create-missing # .fi # # Register this Postfix instance with the default instance. # This command should be entered as one line. # # .nf # # postconf -e "multi_instance_directories=`postconf # -h multi_instance_directories` /etc/postfix-test" # .fi # # Edit the myhostname and inet_interfaces main.cf parameters, # so that they will not conflict with the default Postfix # instance, and change whatever else needs to be changed. # # Test the instance with: # # .nf # # postfix -c /etc/postfix-test start # # postfix -c /etc/postfix-test status # [ other tests ... ] # .fi # # When everything is working satisfactorily, enable start/stop/etc. # by the multi-instance manager: # # .nf # # postconf -c /etc/postfix-test -e multi_instance_enable=yes # DIAGNOSTICS # .ad # .fi # When an operation fails, the affected Postfix instance logs # a message, and the multi-instance manager skips to the next # instance. # BUGS # Support for the multi_instance_group feature is not implemented. # SEE ALSO # postfix(1) Postfix control program # postfix-wrapper(5) multi-instance manager API # postmulti(1) full-blown multi-instance manager # LICENSE # .ad # .fi # The Secure Mailer license must be distributed with this software. # AUTHOR(S) # Wietse Venema # IBM T.J. Watson Research # P.O. Box 704 # Yorktown Heights, NY 10598, USA #-- # Sanity checks. : ${command_directory?"do not invoke this command directly"} : ${daemon_directory?"do not invoke this command directly"} # Readability. POSTCONF=$command_directory/postconf POSTFIX=$command_directory/postfix # Canonicalize the instance directory list. The list is specified # in startup order. instance_dirs=`$POSTCONF -h multi_instance_directories | sed 's/,/ /'` || exit 1 case "$1" in stop|quick-stop|abort|drain) all_dirs= for dir in $config_directory $instance_dirs do all_dirs="$dir $all_dirs" done;; *) all_dirs="$config_directory $instance_dirs";; esac # Execute the command on all applicable instances. When a Postfix # instance is disabled, replace "postfix start" by "postfix check" # so that problems will still be reported. err=0 for dir in $all_dirs do case "$1" in start) test "`$POSTCONF -c $dir -h multi_instance_enable`" = yes || { $POSTFIX -c $dir check || err=$? continue };; stop|abort|drain|flush|reload) test "`$POSTCONF -c $dir -h multi_instance_enable`" = yes || continue;; esac $POSTFIX -c $dir "$@" || err=$? done exit $err