1#!/bin/sh
2#	$NetBSD$
3#
4
5# To view the formatted manual page of this file, type:
6#	POSTFIXSOURCE/mantools/srctoman - post-install | nroff -man
7
8#++
9# NAME
10#	post-install
11# SUMMARY
12#	Postfix post-installation script
13# SYNOPSIS
14#	postfix post-install [name=value] command ...
15# DESCRIPTION
16#	The post-install script performs the finishing touch of a Postfix
17#	installation, after the executable programs and configuration
18#	files are installed. Usage is one of the following:
19# .IP o
20#	While installing Postfix from source code on the local machine, the
21#	script is run by the postfix-install script to update selected file
22#	or directory permissions and to update Postfix configuration files.
23# .IP o
24#	While installing Postfix from a pre-built package, the script is run
25#	by the package management procedure to set all file or directory
26#	permissions and to update Postfix configuration files.
27# .IP o
28#	The script can be used to change installation parameter settings such
29#	as mail_owner or setgid_group after Postfix is already installed.
30# .IP o
31#	The script can be used to upgrade configuration files and to upgrade
32#	file/directory permissions of a secondary Postfix instance.
33# .IP o
34#	At Postfix start-up time, the script is run from "postfix check" to
35#	create missing queue directories.
36# .PP
37#	The post-install script is controlled by installation parameters.
38#	Specific parameters are described at the end of this document.
39#	All installation parameters must be specified ahead of time via
40#	one of the methods described below.
41#
42#	Arguments
43# .IP create-missing
44#	Create missing queue directories with ownerships and permissions
45#	according to the contents of $daemon_directory/postfix-files, using
46#	the mail_owner and setgid_group parameter settings from the command
47#	line, process environment or from the installed main.cf file.
48#
49#	This is required at Postfix start-up time.
50# .IP set-permissions
51#	Set all file/directory ownerships and permissions according to the
52#	contents of $daemon_directory/postfix-files, using the mail_owner
53#	and setgid_group parameter settings from the command line, process
54#	environment or from the installed main.cf file. Implies create-missing.
55#
56#	This is required when installing Postfix from a pre-built package,
57#	or when changing the mail_owner or setgid_group installation parameter
58#	settings after Postfix is already installed.
59# .IP upgrade-permissions
60#	Update ownership and permission of existing files/directories as
61#	specified in $daemon_directory/postfix-files, using the mail_owner
62#	and setgid_group parameter settings from the command line, process
63#	environment or from the installed main.cf file. Implies create-missing.
64#
65#	This is required when upgrading an existing Postfix instance.
66# .IP upgrade-configuration
67#	Edit the installed main.cf and master.cf files, in order to account
68#	for missing services and to fix deprecated parameter settings.
69#
70#	This is required when upgrading an existing Postfix instance.
71# .IP upgrade-source
72#	Short-hand for: upgrade-permissions upgrade-configuration.
73#
74#	This is recommended when upgrading Postfix from source code.
75# .IP upgrade-package
76#	Short-hand for: set-permissions upgrade-configuration.
77#
78#	This is recommended when upgrading Postfix from a pre-built package.
79# .IP first-install-reminder
80#	Remind the user that they still need to configure main.cf and the
81#	aliases file, and that newaliases still needs to be run.
82#
83#	This is recommended when Postfix is installed for the first time.
84# MULTIPLE POSTFIX INSTANCES
85# .ad
86# .fi
87#	Multiple Postfix instances on the same machine can share command and
88#	daemon program files but must have separate configuration and queue
89#	directories.
90#
91#	To create a secondary Postfix installation on the same machine,
92#	copy the configuration files from the primary Postfix instance to
93#	a secondary configuration directory and execute:
94#
95#	postfix post-install config_directory=secondary-config-directory \e
96# .in +4
97#		queue_directory=secondary-queue-directory \e
98# .br
99#		create-missing
100# .PP
101#	This creates secondary Postfix queue directories, sets their access
102#	permissions, and saves the specified installation parameters to the
103#	secondary main.cf file.
104#
105#	Be sure to list the secondary configuration directory in the
106#	alternate_config_directories parameter in the primary main.cf file.
107#
108#	To upgrade a secondary Postfix installation on the same machine,
109#	execute:
110#
111#	postfix post-install config_directory=secondary-config-directory \e
112# .in +4
113#		upgrade-permissions upgrade-configuration
114# INSTALLATION PARAMETER INPUT METHODS
115# .ad
116# .fi
117#	Parameter settings can be specified through a variety of
118#	mechanisms.  In order of decreasing precedence these are:
119# .IP "command line"
120#	Parameter settings can be given as name=value arguments on
121#	the post-install command line. These have the highest precedence.
122#	Settings that override the installed main.cf file are saved.
123# .IP "process environment"
124#	Parameter settings can be given as name=value environment
125#	variables.
126#	Settings that override the installed main.cf file are saved.
127# .IP "installed configuration files"
128#	If a parameter is not specified via the command line or via the
129#	process environment, post-install will attempt to extract its
130#	value from the already installed Postfix main.cf configuration file.
131#	These settings have the lowest precedence.
132# INSTALLATION PARAMETER DESCRIPTION
133# .ad
134# .fi
135#	The description of installation parameters is as follows:
136# .IP config_directory
137#	The directory for Postfix configuration files.
138# .IP daemon_directory
139#	The directory for Postfix daemon programs. This directory
140#	should not be in the command search path of any users.
141# .IP command_directory
142#	The directory for Postfix administrative commands. This
143#	directory should be in the command search path of adminstrative users.
144# .IP queue_directory
145#	The directory for Postfix queues.
146# .IP data_directory
147#	The directory for Postfix writable data files (caches, etc.).
148# .IP sendmail_path
149#	The full pathname for the Postfix sendmail command.
150#	This is the Sendmail-compatible mail posting interface.
151# .IP newaliases_path
152#	The full pathname for the Postfix newaliases command.
153#	This is the Sendmail-compatible command to build alias databases
154#	for the Postfix local delivery agent.
155# .IP mailq_path
156#	The full pathname for the Postfix mailq command.
157#	This is the Sendmail-compatible command to list the mail queue.
158# .IP mail_owner
159#	The owner of the Postfix queue. Its numerical user ID and group ID
160#	must not be used by any other accounts on the system.
161# .IP setgid_group
162#	The group for mail submission and for queue management commands.
163#	Its numerical group ID must not be used by any other accounts on the
164#	system, not even by the mail_owner account.
165# .IP html_directory
166#	The directory for the Postfix HTML files.
167# .IP manpage_directory
168#	The directory for the Postfix on-line manual pages.
169# .IP sample_directory
170#	The directory for the Postfix sample configuration files.
171#	This feature is obsolete as of Postfix 2.1.
172# .IP readme_directory
173#	The directory for the Postfix README files.
174# SEE ALSO
175#	postfix-install(1) Postfix primary installation script.
176# FILES
177#	$config_directory/main.cf, Postfix installation parameters.
178#	$daemon_directory/postfix-files, installation control file.
179#	$config_directory/install.cf, obsolete configuration file.
180# LICENSE
181# .ad
182# .fi
183#	The Secure Mailer license must be distributed with this software.
184# AUTHOR(S)
185#	Wietse Venema
186#	IBM T.J. Watson Research
187#	P.O. Box 704
188#	Yorktown Heights, NY 10598, USA
189#--
190
191umask 022
192
193PATH=/bin:/usr/bin:/usr/sbin:/usr/etc:/sbin:/etc:/usr/contrib/bin:/usr/gnu/bin:/usr/ucb:/usr/bsd
194SHELL=/bin/sh
195IFS=" 	
196"
197BACKUP_IFS="$IFS"
198debug=:
199#debug=echo
200MOST_PARAMETERS="command_directory daemon_directory data_directory
201    html_directory mail_owner mailq_path manpage_directory
202    newaliases_path queue_directory readme_directory sample_directory
203    sendmail_path setgid_group"
204NON_SHARED="config_directory queue_directory data_directory"
205
206USAGE="Usage: $0 [name=value] command
207    create-missing          Create missing queue directories.
208    upgrade-source          When installing or upgrading from source code.
209    upgrade-package         When installing or upgrading from pre-built package.
210    first-install-reminder  Remind of mandatory first-time configuration steps.
211    name=value              Specify an installation parameter".
212
213# Process command-line options and parameter settings. Work around
214# brain damaged shells. "IFS=value command" should not make the
215# IFS=value setting permanent. But some broken standard allows it.
216
217create=; set_perms=; upgrade_perms=; upgrade_conf=; first_install_reminder=
218obsolete=; keep_list=;
219
220for arg
221do
222    case $arg in
223                *=*) IFS= eval $arg; IFS="$BACKUP_IFS";;
224     create-missing) create=1;;
225	  set-perm*) create=1; set_perms=1;;
226      upgrade-perm*) create=1; upgrade_perms=1;;
227      upgrade-conf*) upgrade_conf=1;;
228     upgrade-source) create=1; upgrade_conf=1; upgrade_perms=1;;
229    upgrade-package) create=1; upgrade_conf=1; set_perms=1;;
230     first-install*) first_install_reminder=1;;
231		  *) echo "$0: Error: $USAGE" 1>&2; exit 1;;
232    esac
233    shift
234done
235
236# Sanity checks.
237
238test -n "$create$upgrade_conf$first_install_reminder" || {
239    echo "$0: Error: $USAGE" 1>&2
240    exit 1
241}
242
243# Bootstrapping problem.
244
245if [ -n "$command_directory" ]
246then
247    POSTCONF="$command_directory/postconf"
248else
249    POSTCONF="postconf"
250fi
251
252$POSTCONF -d mail_version >/dev/null 2>/dev/null || {
253    echo $0: Error: no $POSTCONF command found. 1>&2
254    echo Re-run this command as $0 command_directory=/some/where. 1>&2
255    exit 1
256}
257
258# Also used to require license etc. files only in the default instance.
259
260def_config_directory=`$POSTCONF -d -h config_directory` || exit 1
261test -n "$config_directory" ||
262    config_directory="$def_config_directory"
263
264test -d "$config_directory" || {
265    echo $0: Error: $config_directory is not a directory. 1>&2
266    exit 1
267}
268
269# If this is a secondary instance, don't touch shared files.
270# XXX Solaris does not have "test -e".
271
272instances=`test ! -f $def_config_directory/main.cf || 
273    $POSTCONF -c $def_config_directory -h multi_instance_directories | 
274	sed 's/,/ /'` || exit 1
275
276update_shared_files=1
277for name in $instances
278do
279    case "$name" in
280    "$def_config_directory") ;;
281    "$config_directory") update_shared_files=; break;;
282    esac
283done
284
285test -f $daemon_directory/postfix-files || {
286    echo $0: Error: $daemon_directory/postfix-files is not a file. 1>&2
287    exit 1
288}
289
290# SunOS5 fmt(1) truncates lines > 1000 characters.
291
292fake_fmt() {
293    sed '
294    :top
295	/^\(  *\)\([^ ][^ ]*\)  */{
296	    s//\1\2\
297\1/
298	    P
299	    D
300	    b top
301	}
302    ' | fmt
303}
304
305case `uname -s` in
306HP-UX*) FMT=cat;;
307SunOS*) FMT=fake_fmt;;
308     *) FMT=fmt;;
309esac
310
311# If a parameter is not set via the command line or environment,
312# try to use settings from installed configuration files.
313
314# Extract parameter settings from the obsolete install.cf file, as
315# a transitional aid.
316
317grep setgid_group $config_directory/main.cf >/dev/null 2>&1 || {
318    test -f $config_directory/install.cf  && {
319        for name in sendmail_path newaliases_path mailq_path setgid manpages
320        do
321	eval junk=\$$name
322        case "$junk" in
323        "") eval unset $name;;
324        esac
325	   eval : \${$name="\`. $config_directory/install.cf; echo \$$name\`"} \
326		|| exit 1
327        done
328        : ${setgid_group=$setgid}
329        : ${manpage_directory=$manpages}
330    }
331}
332
333# Extract parameter settings from the installed main.cf file.
334
335test -f $config_directory/main.cf && {
336    for name in $MOST_PARAMETERS
337    do
338	eval junk=\$$name
339        case "$junk" in
340        "") eval unset $name;;
341        esac
342        eval : \${$name=\`$POSTCONF -c $config_directory -h $name\`} || exit 1
343    done
344}
345
346# Sanity checks
347
348case $manpage_directory in
349 no) echo $0: Error: manpage_directory no longer accepts \"no\" values. 1>&2
350     echo Try again with \"$0 manpage_directory=/pathname ...\". 1>&2; exit 1;;
351esac
352
353case $setgid_group in
354 no) echo $0: Error: setgid_group no longer accepts \"no\" values. 1>&2
355     echo Try again with \"$0 setgid_group=groupname ...\" 1>&2; exit 1;;
356esac
357
358for path in "$daemon_directory" "$command_directory" "$queue_directory" \
359    "$sendmail_path" "$newaliases_path" "$mailq_path" "$manpage_directory"
360do
361   case "$path" in
362   /*) ;;
363    *) echo $0: Error: \"$path\" should be an absolute path name. 1>&2; exit 1;;
364   esac
365done
366
367for path in "$html_directory" "$readme_directory"
368do
369   case "$path" in
370   /*) ;;
371   no) ;;
372    *) echo $0: Error: \"$path\" should be \"no\" or an absolute path name. 1>&2; exit 1;;
373   esac
374done
375
376# Find out what parameters were not specified via command line,
377# via environment, or via installed configuration files.
378
379missing=
380for name in $MOST_PARAMETERS
381do
382    eval test -n \"\$$name\" || missing="$missing $name"
383done
384
385# All parameters must be specified at this point.
386
387test -n "$non_interactive" -a -n "$missing" && {
388    cat <<EOF | ${FMT} 1>&2
389$0: Error: some required installation parameters are not defined.
390
391- Either the parameters need to be given in the $config_directory/main.cf
392file from a recent Postfix installation,
393
394- Or the parameters need to be specified through the process
395environment.
396
397- Or the parameters need to be specified as name=value arguments
398on the $0 command line,
399
400The following parameters were missing:
401
402    $missing
403
404EOF
405    exit 1
406}
407
408POSTCONF="$command_directory/postconf"
409
410# Save settings, allowing command line/environment override.
411
412override=
413for name in $MOST_PARAMETERS
414do
415    eval test \"\$$name\" = \"`$POSTCONF -c $config_directory -h $name`\" || {
416	override=1
417	break
418    }
419done
420
421test -n "$override" && {
422    $POSTCONF -c $config_directory -e \
423	"daemon_directory = $daemon_directory" \
424	"command_directory = $command_directory" \
425	"queue_directory = $queue_directory" \
426	"data_directory = $data_directory" \
427	"mail_owner = $mail_owner" \
428	"setgid_group = $setgid_group" \
429	"sendmail_path = $sendmail_path" \
430	"mailq_path = $mailq_path" \
431	"newaliases_path = $newaliases_path" \
432	"html_directory = $html_directory" \
433	"manpage_directory = $manpage_directory" \
434	"sample_directory = $sample_directory" \
435	"readme_directory = $readme_directory" \
436    || exit 1
437}
438
439# Use file/directory status information in $daemon_directory/postfix-files.
440
441test -n "$create" && {
442    exec <$daemon_directory/postfix-files || exit 1
443    while IFS=: read path type owner group mode flags junk
444    do
445	IFS="$BACKUP_IFS"
446	set_permission=
447	# Skip comments. Skip shared files, if updating a secondary instance.
448	case $path in
449	[$]*) case "$update_shared_files" in
450	      1) $debug keep non-shared or shared $path;;
451	      *) non_shared=
452		 for name in $NON_SHARED
453		 do
454		     case $path in
455		     "\$$name"*) non_shared=1; break;;
456		     esac
457		 done
458		 case "$non_shared" in
459		  1) $debug keep non-shared $path;;
460		  *) $debug skip shared $path; continue;;
461		 esac;;
462	      esac;;
463	   *) continue;;
464	esac
465	# Skip hard links and symbolic links.
466	case $type in
467	[hl]) continue;;
468	[df]) ;;
469	   *) echo unknown type $type for $path in $daemon_directory/postfix-files1>&2; exit 1;;
470	esac
471	# Expand $name, and canonicalize null fields.
472	for name in path owner group flags
473	do
474	    eval junk=\${$name}
475	    case $junk in
476	    [$]*) eval $name=$junk;;
477	       -) eval $name=;;
478	       *) ;;
479	    esac
480	done
481	# Skip uninstalled files.
482	case $path in
483	no|no/*) continue;;
484	esac
485	# Pick up the flags.
486	case $flags in *u*) upgrade_flag=1;; *) upgrade_flag=;; esac
487	case $flags in *c*) create_flag=1;; *) create_flag=;; esac
488	case $flags in *r*) recursive="-R";; *) recursive=;; esac
489	case $flags in *o*) obsolete_flag=1;; *) obsolete_flag=;; esac
490	case $flags in *[1i]*) test ! -r "$path" -a "$config_directory" != \
491				"$def_config_directory" && continue;; esac
492	# Flag obsolete objects. XXX Solaris 2..9 does not have "test -e".
493	if [ -n "$obsolete_flag" ]
494	then
495	    test -r $path -a "$type" != "d" && obsolete="$obsolete $path"
496	    continue;
497	else
498	    keep_list="$keep_list $path"
499	fi
500	# Create missing directories with proper owner/group/mode settings.
501	if [ -n "$create" -a "$type" = "d" -a -n "$create_flag" -a ! -d "$path" ]
502	then
503	    mkdir $path || exit 1
504	    set_permission=1
505	# Update all owner/group/mode settings.
506	elif [ -n "$set_perms" ]
507	then
508	    set_permission=1
509	# Update obsolete owner/group/mode settings.
510	elif [ -n "$upgrade_perms" -a -n "$upgrade_flag" ]
511	then
512	    set_permission=1
513	fi
514	test -n "$set_permission" && {
515	    chown $recursive $owner $path || exit 1
516	    test -z "$group" || chgrp $recursive $group $path || exit 1
517	    # Don't "chmod -R"; queue file status is encoded in mode bits.
518	    if [ "$type" = "d" -a -n "$recursive" ]
519	    then
520		find $path -type d -exec chmod $mode "{}" ";"
521	    else
522		chmod $mode $path
523	    fi || exit 1
524	}
525    done
526    IFS="$BACKUP_IFS"
527}
528
529# Upgrade existing Postfix configuration files if necessary.
530
531test -n "$upgrade_conf" && {
532
533    # Postfix 2.0.
534    # Add missing relay service to master.cf.
535
536    grep '^relay' $config_directory/master.cf >/dev/null || {
537	echo Editing $config_directory/master.cf, adding missing entry for relay service
538	cat >>$config_directory/master.cf <<EOF || exit 1
539relay	  unix	-	-	n	-	-	smtp
540EOF
541    }
542
543    # Postfix 1.1.
544    # Add missing flush service to master.cf.
545
546    grep '^flush.*flush' $config_directory/master.cf >/dev/null || {
547	echo Editing $config_directory/master.cf, adding missing entry for flush service
548	cat >>$config_directory/master.cf <<EOF || exit 1
549flush     unix  -       -       n       1000?   0       flush
550EOF
551    }
552
553    # Postfix 2.1.
554    # Add missing trace service to master.cf.
555
556    grep 'trace.*bounce' $config_directory/master.cf >/dev/null || {
557	echo Editing $config_directory/master.cf, adding missing entry for trace service
558	cat >>$config_directory/master.cf <<EOF || exit 1
559trace	  unix	-	-	n	-	0	bounce
560EOF
561    }
562
563    # Postfix 2.1.
564    # Add missing verify service to master.cf.
565
566    grep '^verify.*verify' $config_directory/master.cf >/dev/null || {
567	echo Editing $config_directory/master.cf, adding missing entry for verify service
568	cat >>$config_directory/master.cf <<EOF || exit 1
569verify	  unix	-	-	n	-	1	verify
570EOF
571    }
572
573    # Postfix 2.1.
574    # Fix verify service process limit.
575
576    grep '^verify.*[ 	]0[ 	]*verify' \
577	$config_directory/master.cf >/dev/null && {
578	    echo Editing $config_directory/master.cf, setting verify process limit to 1
579	    ed $config_directory/master.cf <<EOF || exit 1
580/^verify.*[ 	]0[ 	]*verify/
581s/\([ 	]\)0\([ 	]\)/\11\2/
582p
583w
584q
585EOF
586    }
587
588    # Postfix 1.1.
589    # Change privileged pickup service into unprivileged.
590
591    grep "^pickup[ 	]*fifo[ 	]*n[ 	]*n" \
592	$config_directory/master.cf >/dev/null && {
593	    echo Editing $config_directory/master.cf, making the pickup service unprivileged
594	    ed $config_directory/master.cf <<EOF || exit 1
595/^pickup[ 	]*fifo[ 	]*n[ 	]*n/
596s/\(n[ 	]*\)n/\1-/
597p
598w
599q
600EOF
601    }
602
603    # Postfix 1.1.
604    # Change private cleanup and flush services into public.
605
606    for name in cleanup flush
607    do
608	grep "^$name[ 	]*unix[ 	]*[-y]" \
609	    $config_directory/master.cf >/dev/null && {
610		echo Editing $config_directory/master.cf, making the $name service public
611	    ed $config_directory/master.cf <<EOF || exit 1
612/^$name[ 	]*unix[ 	]*[-y]/
613s/[-y]/n/
614p
615w
616q
617EOF
618	}
619    done
620
621    # Postfix 2.2.
622    # File systems have improved since Postfix came out, and all we
623    # require now is that defer and deferred are hashed because those
624    # can contain lots of files.
625
626    found=`$POSTCONF -c $config_directory -h hash_queue_names`
627    missing=
628    (echo "$found" | grep defer >/dev/null)  || missing="$missing defer"
629    (echo "$found" | grep deferred>/dev/null)|| missing="$missing deferred"
630    test -n "$missing" && {
631	echo fixing main.cf hash_queue_names for missing $missing
632	$POSTCONF -c $config_directory -e hash_queue_names="$found$missing" ||
633	    exit 1
634    }
635
636    # Turn on safety nets for new features that could bounce mail that
637    # would be accepted by a previous Postfix version.
638
639    # [The "unknown_local_recipient_reject_code = 450" safety net,
640    # introduced with Postfix 2.0 and deleted after Postfix 2.3.]
641
642    # Postfix 2.0.
643    # Add missing proxymap service to master.cf.
644
645    grep '^proxymap.*proxymap' $config_directory/master.cf >/dev/null || {
646	echo Editing $config_directory/master.cf, adding missing entry for proxymap service
647	cat >>$config_directory/master.cf <<EOF || exit 1
648proxymap  unix	-	-	n	-	-	proxymap
649EOF
650    }
651
652    # Postfix 2.1.
653    # Add missing anvil service to master.cf.
654
655    grep '^anvil.*anvil' $config_directory/master.cf >/dev/null || {
656	echo Editing $config_directory/master.cf, adding missing entry for anvil service
657	cat >>$config_directory/master.cf <<EOF || exit 1
658anvil	  unix	-	-	n	-	1	anvil
659EOF
660    }
661
662    # Postfix 2.2.
663    # Add missing scache service to master.cf.
664
665    grep '^scache.*scache' $config_directory/master.cf >/dev/null || {
666	echo Editing $config_directory/master.cf, adding missing entry for scache service
667	cat >>$config_directory/master.cf <<EOF || exit 1
668scache	  unix	-	-	n	-	1	scache
669EOF
670    }
671
672    # Postfix 2.2.
673    # Add missing discard service to master.cf.
674
675    grep '^discard.*discard' $config_directory/master.cf >/dev/null || {
676	echo Editing $config_directory/master.cf, adding missing entry for discard service
677	cat >>$config_directory/master.cf <<EOF || exit 1
678discard	  unix	-	-	n	-	-	discard
679EOF
680    }
681
682    # Postfix 2.2.
683    # Update the tlsmgr fifo->unix service.
684
685    grep "^tlsmgr[ 	]*fifo[ 	]" \
686	$config_directory/master.cf >/dev/null && {
687	    echo Editing $config_directory/master.cf, updating the tlsmgr from fifo to unix service
688	    ed $config_directory/master.cf <<EOF || exit 1
689/^tlsmgr[ 	]*fifo[ 	]/
690s/fifo/unix/
691s/[0-9][0-9]*/&?/
692p
693w
694q
695EOF
696    }
697
698    # Postfix 2.2.
699    # Add missing tlsmgr service to master.cf.
700
701    grep '^tlsmgr.*tlsmgr' $config_directory/master.cf >/dev/null || {
702	echo Editing $config_directory/master.cf, adding missing entry for tlsmgr service
703	cat >>$config_directory/master.cf <<EOF || exit 1
704tlsmgr    unix  -       -       n       1000?   1       tlsmgr
705EOF
706    }
707
708    # Postfix 2.2.
709    # Add missing retry service to master.cf.
710
711    grep '^retry.*error' $config_directory/master.cf >/dev/null || {
712	echo Editing $config_directory/master.cf, adding missing entry for retry service
713	cat >>$config_directory/master.cf <<EOF || exit 1
714retry     unix  -       -       n       -       -       error
715EOF
716    }
717
718    # Postfix 2.5.
719    # Add missing proxywrite service to master.cf.
720
721    grep '^proxywrite.*proxymap' $config_directory/master.cf >/dev/null || {
722	echo Editing $config_directory/master.cf, adding missing entry for proxywrite service
723	cat >>$config_directory/master.cf <<EOF || exit 1
724proxywrite unix -       -       n       -       1       proxymap
725EOF
726    }
727
728    # Postfix 2.5.
729    # Fix a typo in the default master.cf proxywrite entry.
730
731    grep '^proxywrite.*-[ 	]*proxymap' $config_directory/master.cf >/dev/null && {
732	echo Editing $config_directory/master.cf, setting proxywrite process limit to 1
733	    ed $config_directory/master.cf <<EOF || exit 1
734/^proxywrite.*-[ 	]*proxymap/
735s/-\([ 	]*proxymap\)/1\1/
736p
737w
738q
739EOF
740    }
741
742    # Postfix 2.8.
743    # Add missing postscreen service to master.cf.
744
745    grep '^#*smtp.*postscreen' $config_directory/master.cf >/dev/null || {
746	echo Editing $config_directory/master.cf, adding missing entry for postscreen TCP service
747	cat >>$config_directory/master.cf <<EOF || exit 1
748#smtp      inet  n       -       n       -       1       postscreen
749EOF
750    }
751
752    # Postfix 2.8.
753    # Add missing smtpd (unix-domain) service to master.cf.
754
755    grep '^#*smtpd.*smtpd' $config_directory/master.cf >/dev/null || {
756	echo Editing $config_directory/master.cf, adding missing entry for smtpd unix-domain service
757	cat >>$config_directory/master.cf <<EOF || exit 1
758#smtpd     pass  -       -       n       -       -       smtpd
759EOF
760    }
761
762    # Postfix 2.8.
763    # Add temporary dnsblog (unix-domain) service to master.cf.
764
765    grep '^#*dnsblog.*dnsblog' $config_directory/master.cf >/dev/null || {
766	echo Editing $config_directory/master.cf, adding missing entry for dnsblog unix-domain service
767	cat >>$config_directory/master.cf <<EOF || exit 1
768#dnsblog   unix  -       -       n       -       0       dnsblog
769EOF
770    }
771
772    # Postfix 2.8.
773    # Add tlsproxy (unix-domain) service to master.cf.
774
775    grep '^#*tlsproxy.*tlsproxy' $config_directory/master.cf >/dev/null || {
776	echo Editing $config_directory/master.cf, adding missing entry for tlsproxy unix-domain service
777	cat >>$config_directory/master.cf <<EOF || exit 1
778#tlsproxy  unix  -       -       n       -       0       tlsproxy
779EOF
780    }
781
782    # Report (but do not remove) obsolete files.
783
784    test -n "$obsolete" && {
785	cat <<EOF | ${FMT}
786
787    Note: the following files or directories still exist but are
788    no longer part of Postfix:
789
790    $obsolete
791
792EOF
793    }
794
795}
796
797# A reminder if this is the first time Postfix is being installed.
798
799test -n "$first_install_reminder" && {
800
801    ALIASES=`$POSTCONF -c $config_directory -h alias_database | sed 's/^[^:]*://'`
802    NEWALIASES_PATH=`$POSTCONF -c $config_directory -h newaliases_path`
803    cat <<EOF | ${FMT}
804
805    Warning: you still need to edit myorigin/mydestination/mynetworks
806    parameter settings in $config_directory/main.cf.
807
808    See also http://www.postfix.org/STANDARD_CONFIGURATION_README.html
809    for information about dialup sites or about sites inside a
810    firewalled network.
811
812    BTW: Check your $ALIASES file and be sure to set up aliases
813    that send mail for root and postmaster to a real person, then
814    run $NEWALIASES_PATH.
815
816EOF
817
818}
819
820exit 0
821