1#!/bin/sh 2# $NetBSD$ 3# 4 5#++ 6# NAME 7# postfix-wrapper 1 8# SUMMARY 9# trivial but useful multi-instance manager 10# SYNOPSIS 11# postfix command 12# DESCRIPTION 13# Postfix versions 2.6 and later provide support for multiple 14# Postfix instances. Instances share executable files and 15# documentation, but have their own directories for configuration, 16# queue and data files. In many cases different instances 17# have different myhostname and inet_interfaces settings, 18# though this is not always necessary. 19# 20# This command implements a trivial Postfix multi-instance 21# manager. It simply applies commands such as "postfix start" 22# to all the applicable Postfix instances. 23# MANAGING MULTIPLE INSTANCES 24# .ad 25# .fi 26# To hook the postfix-wrapper multi-instance manager into 27# Postfix, see the POSTFIX-WRAPPER INITIALIZATION section 28# below. To create a new Postfix instance, see the CREATING 29# A NEW POSTFIX INSTANCE section below. 30# 31# To start, stop, get status, etc., with multiple Postfix 32# instances, use: 33# 34# .nf 35# # postfix command 36# .fi 37# 38# For example, to find out what Postfix instances are configured: 39# 40# .nf 41# # postfix status 42# .fi 43# 44# The postfix(1) command invokes the postfix-wrapper command. 45# This in turn applies the postfix(1) command to the default 46# Postfix instance, and to each instance specified with the 47# default main.cf file's multi_instance_directories parameter 48# value. 49# 50# The postfix-wrapper command will start, stop, reload, etc., 51# only Postfix instances that have "multi_instance_enable = 52# yes" in their main.cf files. When an instance is disabled, 53# postfix-wrapper replaces "start" commands by "check" so 54# that problems will still be reported. 55# 56# The startup order is taken from the multi_instance_directories 57# parameter; the default instance is prepended to the list. 58# The startup order is used for all postfix(1) commands, 59# except for commands that stop Postfix instances. In those 60# cases the order is reversed. 61# MANAGING INDIVIDUAL INSTANCES 62# .ad 63# .fi 64# To manage an individual Postfix instance, use: 65# 66# .nf 67# # postfix -c /path/to/config_directory command 68# .fi 69# 70# This is also needed to manage the default Postfix instance, 71# after you turn on multi-instance support. 72# 73# To use the Postfix sendmail command with a non-default 74# Postfix instance, use: 75# 76# .nf 77# # sendmail -C /path/to/config_directory ... 78# .fi 79# 80# Note 1: that's capital C, not lower-case c. 81# 82# Note 2: only the default Postfix instance will check or 83# update the shared Postfix files, including the executable 84# files and documentation. 85# POSTFIX-WRAPPER INITIALIZATION 86# .ad 87# .fi 88# To hook this program into Postfix, execute the command 89# shown below. 90# 91# This command should be entered as one line. 92# 93# In the example, replace /etc/postfix with the default Postfix 94# configuration directory, and replace /usr/libexec/postfix 95# with the daemon directory pathname of the default Postfix 96# instance. 97# 98# .nf 99# # postconf -c /etc/postfix -e 100# "multi_instance_enable=yes" 101# "multi_instance_wrapper=/usr/libexec/postfix/postfix-wrapper" 102# .fi 103# CREATING A NEW POSTFIX INSTANCE 104# .ad 105# .fi 106# To create a Postfix instance called "postfix-test", start 107# with generic main.cf and master.cf files and customize the 108# locations of the queue and data directories with the commands 109# shown below. The last command updates main.cf and creates 110# any directories that Postfix will need. 111# 112# Each command below should be entered as one line. 113# 114# In the example, replace /etc/postfix with the default Postfix 115# configuration directory, and replace /usr/libexec/postfix 116# with the daemon directory pathname of the default Postfix 117# instance. 118# 119# .nf 120# # mkdir /etc/postfix-test 121# # cp /usr/libexec/postfix/main.cf /etc/postfix-test 122# # cp /usr/libexec/postfix/master.cf /etc/postfix-test 123# # postconf -c /etc/postfix-test -e 124# "multi_instance_name=postfix-test" 125# # postfix -c /etc/postfix post-install 126# "config_directory=/etc/postfix-test" 127# "queue_directory=/var/spool/postfix-test" 128# "data_directory=/var/lib/postfix-test" 129# create-missing 130# .fi 131# 132# Register this Postfix instance with the default instance. 133# This command should be entered as one line. 134# 135# .nf 136# # postconf -e "multi_instance_directories=`postconf 137# -h multi_instance_directories` /etc/postfix-test" 138# .fi 139# 140# Edit the myhostname and inet_interfaces main.cf parameters, 141# so that they will not conflict with the default Postfix 142# instance, and change whatever else needs to be changed. 143# 144# Test the instance with: 145# 146# .nf 147# # postfix -c /etc/postfix-test start 148# # postfix -c /etc/postfix-test status 149# [ other tests ... ] 150# .fi 151# 152# When everything is working satisfactorily, enable start/stop/etc. 153# by the multi-instance manager: 154# 155# .nf 156# # postconf -c /etc/postfix-test -e multi_instance_enable=yes 157# DIAGNOSTICS 158# .ad 159# .fi 160# When an operation fails, the affected Postfix instance logs 161# a message, and the multi-instance manager skips to the next 162# instance. 163# BUGS 164# Support for the multi_instance_group feature is not implemented. 165# SEE ALSO 166# postfix(1) Postfix control program 167# postfix-wrapper(5) multi-instance manager API 168# postmulti(1) full-blown multi-instance manager 169# LICENSE 170# .ad 171# .fi 172# The Secure Mailer license must be distributed with this software. 173# AUTHOR(S) 174# Wietse Venema 175# IBM T.J. Watson Research 176# P.O. Box 704 177# Yorktown Heights, NY 10598, USA 178#-- 179 180# Sanity checks. 181 182: ${command_directory?"do not invoke this command directly"} 183: ${daemon_directory?"do not invoke this command directly"} 184 185# Readability. 186 187POSTCONF=$command_directory/postconf 188POSTFIX=$command_directory/postfix 189 190# Canonicalize the instance directory list. The list is specified 191# in startup order. 192 193instance_dirs=`$POSTCONF -h multi_instance_directories | sed 's/,/ /'` || 194 exit 1 195 196case "$1" in 197 stop|quick-stop|abort|drain) 198 all_dirs= 199 for dir in $config_directory $instance_dirs 200 do 201 all_dirs="$dir $all_dirs" 202 done;; 203 *) all_dirs="$config_directory $instance_dirs";; 204esac 205 206# Execute the command on all applicable instances. When a Postfix 207# instance is disabled, replace "postfix start" by "postfix check" 208# so that problems will still be reported. 209 210err=0 211for dir in $all_dirs 212do 213 case "$1" in 214 start) 215 test "`$POSTCONF -c $dir -h multi_instance_enable`" = yes || { 216 $POSTFIX -c $dir check || err=$? 217 continue 218 };; 219 stop|abort|drain|flush|reload) 220 test "`$POSTCONF -c $dir -h multi_instance_enable`" = yes || 221 continue;; 222 esac 223 $POSTFIX -c $dir "$@" || err=$? 224done 225 226exit $err 227