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