Home | History | Annotate | Line # | Download | only in dist
      1  1.1      tron #!/bin/sh
      2  1.1      tron 
      3  1.1      tron # To view the formatted manual page of this file, type:
      4  1.1      tron #	POSTFIXSOURCE/mantools/srctoman - postfix-install | nroff -man
      5  1.1      tron 
      6  1.1      tron #++
      7  1.1      tron # NAME
      8  1.1      tron #	postfix-install 1
      9  1.1      tron # SUMMARY
     10  1.1      tron #	Postfix installation procedure
     11  1.1      tron # SYNOPSIS
     12  1.1      tron #	sh postfix-install [options] [name=value] ...
     13  1.1      tron # DESCRIPTION
     14  1.1      tron #	The postfix-install script is to be run from the top-level
     15  1.1      tron #	Postfix source directory. It implements the following operations:
     16  1.1      tron # .IP o
     17  1.1      tron #	Install or upgrade Postfix from source code. This requires
     18  1.1      tron #	super-user privileges.
     19  1.1      tron # .IP o
     20  1.1      tron #	Build a package that can be distributed to other systems, in order
     21  1.1      tron #	to install or upgrade Postfix elsewhere. This requires no super-user
     22  1.1      tron #	privileges. To complete the installation after unpacking the
     23  1.1      tron #	package, execute as super-user the post-install script in the Postfix
     24  1.1      tron #	configuration directory.
     25  1.1      tron # .PP
     26  1.1      tron #	The postfix-install script is controlled by installation parameters.
     27  1.1      tron #	Specific parameters are described at the end of this document.
     28  1.1      tron #
     29  1.1      tron #	By default, postfix-install asks the user for installation
     30  1.1      tron #	parameter settings. Most settings are stored in the installed
     31  1.1      tron #	main.cf file. Stored settings are used as site-specific defaults
     32  1.1      tron #	when the postfix-install script is run later.
     33  1.1      tron #
     34  1.1      tron #	The names of Postfix files and directories, as well as their
     35  1.1      tron #	ownerships and permissions, are stored in the postfix-files file
     36  1.1      tron #	in the Postfix configuration directory. This information is used
     37  1.1      tron #	by the post-install script (also in the configuration directory)
     38  1.1      tron #	for creating missing queue directories when Postfix is started,
     39  1.1      tron #	and for setting correct ownership and permissions when Postfix
     40  1.1      tron #	is installed from a pre-built package or from source code.
     41  1.1      tron #
     42  1.1      tron #	Arguments
     43  1.7  christos # .IP -keep-build-mtime
     44  1.7  christos #	When installing files preserve new file's mtime timestamps.
     45  1.7  christos #	Otherwise, mtimes will be set to the time that postfix-install
     46  1.7  christos #	is run.
     47  1.1      tron # .IP -non-interactive
     48  1.1      tron #	Do not ask the user for parameter settings. Installation parameters
     49  1.1      tron #	are specified via one of the non-interactive methods described
     50  1.1      tron #	below.
     51  1.1      tron # .IP -package
     52  1.1      tron #	Build a ready-to-install package. This requires that a
     53  1.1      tron #	non-default install_root parameter is specified.
     54  1.1      tron # INSTALLATION PARAMETER INPUT METHODS
     55  1.1      tron # .ad
     56  1.1      tron # .fi
     57  1.1      tron #	Parameter settings can be specified through a variety of
     58  1.1      tron #	mechanisms.  In order of decreasing precedence these are:
     59  1.1      tron # .IP "interactive mode"
     60  1.1      tron #	By default, postfix-install will ask the user for installation
     61  1.1      tron #	parameter settings. These settings have the highest precedence.
     62  1.1      tron # .IP "command line"
     63  1.1      tron #	Parameter settings can be given as name=value arguments on
     64  1.6  christos #	the postfix-install command line. This mode will replace
     65  1.6  christos #	the string MAIL_VERSION at the end of a configuration
     66  1.6  christos #	parameter value with the Postfix release version (Postfix
     67  1.6  christos #	3.0 and later).
     68  1.1      tron # .IP "process environment"
     69  1.1      tron #	Parameter settings can be given as name=value environment
     70  1.6  christos #	variables. Environment parameters can also be specified on
     71  1.6  christos #	the make(1) command line as "make install name=value ...".
     72  1.6  christos #	This mode will replace the string MAIL_VERSION at the end
     73  1.6  christos #	of a configuration parameter value with the Postfix release
     74  1.6  christos #	version (Postfix 3.0 and later).
     75  1.1      tron # .IP "installed configuration files"
     76  1.1      tron #	If a parameter is not specified via the command line or via the
     77  1.1      tron #	process environment, postfix-install will attempt to extract its
     78  1.1      tron #	value from an already installed Postfix main.cf configuration file.
     79  1.1      tron # .IP "built-in defaults"
     80  1.1      tron #	These settings have the lowest precedence.
     81  1.1      tron # INSTALLATION PARAMETER DESCRIPTION
     82  1.1      tron # .ad
     83  1.1      tron # .fi
     84  1.1      tron #	The description of installation parameters and their built-in
     85  1.1      tron #	default settings is as follows:
     86  1.1      tron # .IP install_root
     87  1.1      tron #	Prefix that is prepended to the pathnames of installed files.
     88  1.1      tron #	Specify this ONLY when creating pre-built packages for distribution to
     89  1.1      tron #	other systems. The built-in default is "/", the local root directory.
     90  1.1      tron #	This parameter setting is not recorded in the installed main.cf file.
     91  1.1      tron # .IP tempdir
     92  1.1      tron #	Directory for scratch files while installing Postfix.
     93  1.1      tron #	You must have write permission in this directory.
     94  1.1      tron #	The built-in default directory name is the current directory.
     95  1.1      tron #	This parameter setting is not recorded in the installed main.cf file.
     96  1.1      tron # .IP config_directory
     97  1.1      tron #	The final destination directory for Postfix configuration files.
     98  1.1      tron #	The built-in default directory name is /etc/postfix.
     99  1.1      tron #	This parameter setting is not recorded in the installed main.cf file
    100  1.1      tron #	and can be changed only by recompiling Postfix.
    101  1.1      tron # .IP data_directory
    102  1.1      tron #	The final destination directory for Postfix-writable data files such
    103  1.1      tron #	as caches. This directory should not be shared with non-Postfix
    104  1.2      tron #	software. The built-in default directory name is /var/db/postfix.
    105  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    106  1.1      tron # .IP daemon_directory
    107  1.1      tron #	The final destination directory for Postfix daemon programs. This
    108  1.1      tron #	directory should not be in the command search path of any users.
    109  1.1      tron #	The built-in default directory name is /usr/libexec/postfix.
    110  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    111  1.1      tron # .IP command_directory
    112  1.1      tron #	The final destination directory for Postfix administrative commands.
    113  1.8  christos #	This directory should be in the command search path of administrative
    114  1.1      tron #	users. The built-in default directory name is system dependent.
    115  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    116  1.1      tron # .IP html_directory
    117  1.5      tron #	The final destination directory for the Postfix HTML files.
    118  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    119  1.1      tron # .IP queue_directory
    120  1.1      tron #	The final destination directory for Postfix queues.
    121  1.1      tron #	The built-in default directory name is /var/spool/postfix.
    122  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    123  1.1      tron # .IP sendmail_path
    124  1.1      tron #	The final destination pathname for the Postfix sendmail command.
    125  1.1      tron #	This is the Sendmail-compatible mail posting interface.
    126  1.1      tron #	The built-in default pathname is system dependent.
    127  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    128  1.1      tron # .IP newaliases_path
    129  1.1      tron #	The final destination pathname for the Postfix newaliases command.
    130  1.1      tron #	This is the Sendmail-compatible command to build alias databases
    131  1.1      tron #	for the Postfix local delivery agent.
    132  1.1      tron #	The built-in default pathname is system dependent.
    133  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    134  1.1      tron # .IP mailq_path
    135  1.1      tron #	The final destination pathname for the Postfix mailq command.
    136  1.1      tron #	This is the Sendmail-compatible command to list the mail queue.
    137  1.1      tron #	The built-in default pathname is system dependent.
    138  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    139  1.1      tron # .IP mail_owner
    140  1.1      tron #	The owner of the Postfix queue. Its numerical user ID and group ID
    141  1.1      tron #	must not be used by any other accounts on the system.
    142  1.1      tron #	The built-in default account name is postfix.
    143  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    144  1.1      tron # .IP setgid_group
    145  1.1      tron #	The group for mail submission and for queue management commands.
    146  1.1      tron #	Its numerical group ID must not be used by any other accounts on the
    147  1.1      tron #	system, not even by the mail_owner account.
    148  1.1      tron #	The built-in default group name is postdrop.
    149  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    150  1.1      tron # .IP manpage_directory
    151  1.5      tron #	The final destination directory for the Postfix on-line manual pages.
    152  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    153  1.1      tron # .IP sample_directory
    154  1.5      tron #	The final destination directory for the Postfix sample configuration
    155  1.5      tron #	files. This parameter is obsolete as of Postfix version 2.1.
    156  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    157  1.6  christos # .IP meta_directory
    158  1.6  christos #	The final destination directory for non-executable files
    159  1.6  christos #	that are shared among multiple Postfix instances, such
    160  1.6  christos #	as postfix-files, dynamicmaps.cf, as well as the multi-instance
    161  1.6  christos #	template files main.cf.proto and master.cf.proto. This
    162  1.6  christos #	directory should contain only Postfix-related files.
    163  1.1      tron # .IP readme_directory
    164  1.5      tron #	The final destination directory for the Postfix README files.
    165  1.1      tron #	This parameter setting is recorded in the installed main.cf file.
    166  1.6  christos # .IP shlib_directory
    167  1.6  christos #	The final destination directory for Postfix shared-library
    168  1.6  christos #	files, and the default directory for Postfix database plugin
    169  1.6  christos #	files with a relative pathname in the file dynamicmaps.cf.
    170  1.6  christos #	This directory should contain only Postfix-related files.
    171  1.6  christos #	The shlib_directory parameter built-in default value is
    172  1.6  christos #	specified at compile time.  If you change this at installation
    173  1.6  christos #	time, then additional configuration will be required with
    174  1.6  christos #	ldconfig(1) or equivalent.
    175  1.1      tron # SEE ALSO
    176  1.1      tron #	post-install(1) post-installation procedure
    177  1.1      tron # FILES
    178  1.1      tron #	$config_directory/main.cf, Postfix installation configuration.
    179  1.9  christos #	$config_directory/makedefs.out, Postfix 'make makefiles' options.
    180  1.6  christos #	$meta_directory/postfix-files, installation control file.
    181  1.1      tron #	$config_directory/install.cf, obsolete configuration file.
    182  1.1      tron # LICENSE
    183  1.1      tron # .ad
    184  1.1      tron # .fi
    185  1.1      tron #	The Secure Mailer license must be distributed with this software.
    186  1.1      tron # AUTHOR(S)
    187  1.1      tron #	Wietse Venema
    188  1.1      tron #	IBM T.J. Watson Research
    189  1.1      tron #	P.O. Box 704
    190  1.1      tron #	Yorktown Heights, NY 10598, USA
    191  1.6  christos #
    192  1.6  christos #	Wietse Venema
    193  1.6  christos #	Google, Inc.
    194  1.6  christos #	111 8th Avenue
    195  1.6  christos #	New York, NY 10011, USA
    196  1.9  christos #
    197  1.9  christos #	Wietse Venema
    198  1.9  christos #	porcupine.org
    199  1.9  christos #	Amawalk, NY 10501, USA
    200  1.1      tron #--
    201  1.1      tron 
    202  1.1      tron # Initialize.
    203  1.1      tron # By now, shells must have functions. Ultrix users must use sh5 or lose.
    204  1.1      tron 
    205  1.1      tron umask 022
    206  1.1      tron PATH=/bin:/usr/bin:/usr/sbin:/usr/etc:/sbin:/etc:/usr/contrib/bin:/usr/gnu/bin:/usr/ucb:/usr/bsd
    207  1.1      tron SHELL=/bin/sh
    208  1.1      tron IFS=" 	
    209  1.1      tron "
    210  1.1      tron BACKUP_IFS="$IFS"
    211  1.1      tron 
    212  1.5      tron # This script uses outputs from Postfix and non-Postfix commands.
    213  1.5      tron # Override all LC_* settings and LANG for robustness.
    214  1.5      tron LC_ALL=C; export LC_ALL
    215  1.5      tron 
    216  1.6  christos if [ -n "$SHLIB_ENV_VAR" ]; then
    217  1.6  christos     junk="${SHLIB_ENV_VAL}"
    218  1.6  christos     eval export "$SHLIB_ENV_VAR=\$junk"
    219  1.6  christos fi
    220  1.6  christos 
    221  1.1      tron USAGE="Usage: $0 [name=value] [option]
    222  1.7  christos     -keep-build-mtime       Preserve build-time file mtime timestamps.
    223  1.1      tron     -non-interactive        Do not ask for installation parameters.
    224  1.1      tron     -package                Build a ready-to-install package.
    225  1.1      tron     name=value              Specify an installation parameter".
    226  1.1      tron 
    227  1.1      tron # Process command-line options and parameter settings. Work around
    228  1.1      tron # brain damaged shells. "IFS=value command" should not make the
    229  1.1      tron # IFS=value setting permanent. But some broken standard allows it.
    230  1.1      tron 
    231  1.1      tron for arg
    232  1.1      tron do
    233  1.1      tron     case $arg in
    234  1.6  christos *[" 	"]*) echo "$0: Error: argument contains whitespace: '$arg'"; exit 1;;
    235  1.6  christos 	*=*) IFS= eval $arg; IFS="$BACKUP_IFS";;
    236  1.6  christos   -non-int*) non_interactive=1;;
    237  1.6  christos    -package) need_install_root=install_root;;
    238  1.7  christos -keep-build-mtime)
    239  1.7  christos              keep_build_mtime=1;;
    240  1.6  christos 	  *) echo "$0: Error: $USAGE" 1>&2; exit 1;;
    241  1.1      tron     esac
    242  1.1      tron     shift
    243  1.1      tron done
    244  1.1      tron 
    245  1.1      tron # Sanity checks.
    246  1.1      tron 
    247  1.1      tron test -z "$non_interactive" -a ! -t 0 && {
    248  1.1      tron     echo $0: Error: for non-interactive use, run: \"$0 -non-interactive\" 1>&2
    249  1.1      tron     exit 1
    250  1.1      tron }
    251  1.1      tron 
    252  1.1      tron test -x bin/postconf || {
    253  1.1      tron     echo $0: Error: no bin/postconf file. Did you forget to run \"make\"? 1>&2
    254  1.1      tron     exit 1
    255  1.1      tron }
    256  1.1      tron 
    257  1.6  christos CONFIG_PARAMS="command_directory daemon_directory data_directory \
    258  1.6  christos html_directory mail_owner mailq_path manpage_directory newaliases_path \
    259  1.6  christos queue_directory readme_directory sendmail_path setgid_group shlib_directory \
    260  1.6  christos meta_directory"
    261  1.6  christos 
    262  1.6  christos # Expand the string MAIL_VERSION at the end of "make install" etc.
    263  1.6  christos # name=value command-line arguments (and consequently, in environment
    264  1.6  christos # settings), for consistency with "make makefiles".
    265  1.6  christos 
    266  1.6  christos # Note that MAIL_VERSION) does not anchor the match at the end.
    267  1.6  christos 
    268  1.6  christos for name in $CONFIG_PARAMS sample_directory install_root tempdir
    269  1.6  christos do
    270  1.6  christos     eval junk=\$$name
    271  1.6  christos     case "$junk" in
    272  1.6  christos     *MAIL_VERSION*) 
    273  1.6  christos 	case "$mail_version" in
    274  1.6  christos 	"") mail_version="`bin/postconf -dhx mail_version`" || exit 1
    275  1.6  christos 	esac
    276  1.6  christos 	val=`echo "$junk" | sed 's/MAIL_VERSION$/'"$mail_version/g"` || exit 1
    277  1.6  christos 	case "$val" in
    278  1.6  christos 	*MAIL_VERSION*)
    279  1.6  christos 	   echo "MAIL_VERSION not at end of parameter value: $junk" 1>&2; exit 1
    280  1.6  christos 	esac
    281  1.6  christos 	eval ${name}='"$val"'
    282  1.6  christos     esac
    283  1.6  christos done
    284  1.6  christos 
    285  1.1      tron case `uname -s` in
    286  1.1      tron HP-UX*) FMT=cat;;
    287  1.1      tron      *) FMT=fmt;;
    288  1.1      tron esac
    289  1.1      tron 
    290  1.1      tron # Disclaimer.
    291  1.1      tron 
    292  1.1      tron test -z "$non_interactive" && cat <<EOF | ${FMT}
    293  1.1      tron 
    294  1.1      tron     Warning: if you use this script to install Postfix locally,
    295  1.1      tron     this script will replace existing sendmail or Postfix programs.
    296  1.1      tron     Make backups if you want to be able to recover.
    297  1.1      tron 
    298  1.1      tron     Before installing files, this script prompts you for some
    299  1.1      tron     definitions.  Most definitions will be remembered, so you have
    300  1.1      tron     to specify them only once. All definitions should have a
    301  1.1      tron     reasonable default value.
    302  1.1      tron EOF
    303  1.1      tron 
    304  1.1      tron # The following shell functions replace files/symlinks while minimizing
    305  1.1      tron # the time that a file does not exist, and avoid copying over files
    306  1.1      tron # in order to not disturb running programs. That is certainly desirable
    307  1.1      tron # when upgrading Postfix on a live machine. It also avoids surprises
    308  1.1      tron # when building a Postfix package for distribution to other systems.
    309  1.1      tron 
    310  1.1      tron compare_or_replace() {
    311  1.1      tron     mode=$1
    312  1.1      tron     owner=$2
    313  1.1      tron     group=$3
    314  1.1      tron     src=$4
    315  1.1      tron     dst=$5
    316  1.1      tron     (cmp $src $dst >/dev/null 2>&1 && echo Skipping $dst...) || {
    317  1.1      tron 	echo Updating $dst...
    318  1.1      tron 	rm -f $tempdir/junk || exit 1
    319  1.7  christos 	# Not: "cp -p" which preserves ownership.
    320  1.1      tron 	cp $src $tempdir/junk || exit 1
    321  1.7  christos 	test -z "$keep_build_mtime" || touch -r $src $tempdir/junk || exit 1
    322  1.1      tron 	mv -f $tempdir/junk $dst || exit 1
    323  1.1      tron 	test -z "$owner" || chown $owner $dst || exit 1
    324  1.1      tron 	test -z "$group" || chgrp $group $dst || exit 1
    325  1.1      tron 	chmod $mode $dst || exit 1
    326  1.1      tron     }
    327  1.1      tron }
    328  1.1      tron 
    329  1.6  christos myreadlink() {
    330  1.6  christos     ls -ld -- "$@" 2>/dev/null | awk '
    331  1.6  christos 	/->/ { print $NF; next } 
    332  1.6  christos 	{ exit(1) }  
    333  1.6  christos     '
    334  1.6  christos }
    335  1.6  christos 
    336  1.1      tron compare_or_symlink() {
    337  1.6  christos     case $1 in
    338  1.6  christos     /*) dest=`echo $1 | sed '
    339  1.1      tron 	    s;^'$install_root';;
    340  1.1      tron 	    s;/\./;/;g
    341  1.1      tron 	    s;//*;/;g
    342  1.1      tron 	    s;^/;;
    343  1.1      tron 	'`
    344  1.1      tron 	link=`echo $2 | sed '
    345  1.1      tron 	    s;^'$install_root';;
    346  1.1      tron 	    s;/\./;/;g
    347  1.1      tron 	    s;//*;/;g
    348  1.1      tron 	    s;^/;;
    349  1.1      tron 	    s;/[^/]*$;/;
    350  1.1      tron 	    s;[^/]*/;../;g
    351  1.1      tron 	    s;$;'$dest';
    352  1.1      tron 	'`
    353  1.6  christos 	;;
    354  1.6  christos      *) link=$1
    355  1.6  christos 	;;
    356  1.6  christos     esac
    357  1.6  christos     (test $link = "`myreadlink $2`" >/dev/null 2>&1 && echo Skipping $2...) || {
    358  1.6  christos 	echo Updating $2...
    359  1.6  christos 	# We create the symlink in place instead of using mv because:
    360  1.6  christos 	# 1) some systems cannot move symlinks between file systems;
    361  1.6  christos 	# 2) we cannot use mv to replace a symlink-to-directory;
    362  1.6  christos 	# 3) "ln -n" is not in POSIX, therefore it's not portable.
    363  1.6  christos 	# rm+ln is less atomic but this affects compatibility symlinks only.
    364  1.6  christos 	rm -f $2 && ln -sf $link $2 || exit 1
    365  1.1      tron     }
    366  1.1      tron }
    367  1.1      tron 
    368  1.1      tron compare_or_hardlink() {
    369  1.1      tron     (cmp $1 $2 >/dev/null 2>&1 && echo Skipping $2...) || {
    370  1.1      tron 	echo Updating $2...
    371  1.1      tron 	rm -f $2 || exit 1
    372  1.1      tron 	ln $1 $2 || exit 1
    373  1.1      tron     }
    374  1.1      tron }
    375  1.1      tron 
    376  1.1      tron check_parent() {
    377  1.1      tron     for path
    378  1.1      tron     do
    379  1.1      tron 	dir=`echo $path|sed -e 's/[/][/]*[^/]*$//' -e 's/^$/\//'`
    380  1.1      tron 	test -d $dir || mkdir -p $dir || exit 1
    381  1.1      tron     done
    382  1.1      tron }
    383  1.1      tron 
    384  1.7  christos # How to suppress newlines in echo.
    385  1.1      tron 
    386  1.1      tron case `echo -n` in
    387  1.1      tron "") n=-n; c=;;
    388  1.1      tron  *) n=; c='\c';;
    389  1.1      tron esac
    390  1.1      tron 
    391  1.1      tron # Prompts.
    392  1.1      tron 
    393  1.1      tron install_root_prompt="the prefix for installed file names. Specify
    394  1.1      tron this ONLY if you are building ready-to-install packages for
    395  1.3      tron distribution to OTHER machines. See PACKAGE_README for instructions."
    396  1.1      tron 
    397  1.1      tron tempdir_prompt="a directory for scratch files while installing
    398  1.1      tron Postfix.  You must have write permission in this directory."
    399  1.1      tron 
    400  1.1      tron config_directory_prompt="the final destination directory for
    401  1.1      tron installed Postfix configuration files."
    402  1.1      tron 
    403  1.1      tron data_directory_prompt="the final destination directory for
    404  1.1      tron Postfix-writable data files such as caches or random numbers.  This
    405  1.1      tron directory should not be shared with non-Postfix software."
    406  1.1      tron 
    407  1.1      tron daemon_directory_prompt="the final destination directory for
    408  1.1      tron installed Postfix daemon programs.  This directory should not be
    409  1.1      tron in the command search path of any users."
    410  1.1      tron 
    411  1.1      tron command_directory_prompt="the final destination directory for
    412  1.1      tron installed Postfix administrative commands.  This directory should
    413  1.8  christos be in the command search path of administrative users."
    414  1.1      tron 
    415  1.1      tron queue_directory_prompt="the final destination directory for Postfix
    416  1.1      tron queues."
    417  1.1      tron 
    418  1.1      tron sendmail_path_prompt="the final destination pathname for the
    419  1.1      tron installed Postfix sendmail command. This is the Sendmail-compatible
    420  1.1      tron mail posting interface."
    421  1.1      tron 
    422  1.1      tron newaliases_path_prompt="the final destination pathname for the
    423  1.1      tron installed Postfix newaliases command.  This is the Sendmail-compatible
    424  1.1      tron command to build alias databases for the Postfix local delivery
    425  1.1      tron agent."
    426  1.1      tron 
    427  1.1      tron mailq_path_prompt="the final destination pathname for the installed
    428  1.1      tron Postfix mailq command.  This is the Sendmail-compatible mail queue
    429  1.1      tron listing command."
    430  1.1      tron 
    431  1.1      tron mail_owner_prompt="the owner of the Postfix queue. Specify an
    432  1.1      tron account with numerical user ID and group ID values that are not
    433  1.1      tron used by any other accounts on the system."
    434  1.1      tron 
    435  1.1      tron setgid_group_prompt="the group for mail submission and for queue
    436  1.1      tron management commands.  Specify a group name with a numerical group
    437  1.1      tron ID that is not shared with other accounts, not even with the Postfix
    438  1.1      tron mail_owner account. You can no longer specify \"no\" here."
    439  1.1      tron 
    440  1.5      tron manpage_directory_prompt="the final destination directory for the
    441  1.5      tron Postfix on-line manual pages. You can no longer specify \"no\"
    442  1.5      tron here."
    443  1.1      tron 
    444  1.5      tron readme_directory_prompt="the final destination directory for the Postfix
    445  1.1      tron README files. Specify \"no\" if you do not want to install these files."
    446  1.1      tron 
    447  1.5      tron html_directory_prompt="the final destination directory for the Postfix
    448  1.1      tron HTML files. Specify \"no\" if you do not want to install these files."
    449  1.1      tron 
    450  1.6  christos shlib_directory_prompt="the final destination directory for Postfix
    451  1.6  christos shared-library files."
    452  1.6  christos 
    453  1.6  christos meta_directory_prompt="the final destination directory for
    454  1.6  christos non-executable files that are shared among multiple Postfix instances,
    455  1.6  christos such as postfix-files, dynamicmaps.cf, as well as the multi-instance
    456  1.6  christos template files main.cf.proto and master.cf.proto."
    457  1.6  christos 
    458  1.1      tron # Default settings, just to get started.
    459  1.1      tron 
    460  1.1      tron : ${install_root=/}
    461  1.1      tron : ${tempdir=`pwd`}
    462  1.4      tron : ${config_directory=`bin/postconf -c conf -h -d config_directory`}
    463  1.1      tron 
    464  1.1      tron # Find out the location of installed configuration files.
    465  1.1      tron 
    466  1.1      tron test -z "$non_interactive" && for name in install_root tempdir config_directory
    467  1.1      tron do
    468  1.1      tron     while :
    469  1.1      tron     do
    470  1.1      tron 	echo
    471  1.1      tron 	eval echo Please specify \$${name}_prompt | ${FMT}
    472  1.1      tron 	eval echo \$n "$name: [\$$name]\  \$c"
    473  1.1      tron 	read ans
    474  1.1      tron 	case $ans in
    475  1.1      tron 	"") break;;
    476  1.1      tron 	 *) case $ans in
    477  1.1      tron 	    /*) eval $name=$ans; break;;
    478  1.1      tron 	     *) echo; echo $0: Error: $name should be an absolute path name. 1>&2;;
    479  1.1      tron 	    esac;;
    480  1.1      tron 	esac
    481  1.1      tron     done
    482  1.1      tron done
    483  1.1      tron 
    484  1.1      tron # In case some systems special-case pathnames beginning with //.
    485  1.1      tron 
    486  1.1      tron case $install_root in
    487  1.1      tron /) install_root=
    488  1.1      tron esac
    489  1.1      tron 
    490  1.1      tron test -z "$need_install_root" || test -n "$install_root" || {
    491  1.1      tron     echo $0: Error: invalid package root directory: \"install_root=/\" 1>&2
    492  1.1      tron     exit 1
    493  1.1      tron }
    494  1.1      tron 
    495  1.1      tron CONFIG_DIRECTORY=$install_root$config_directory
    496  1.1      tron 
    497  1.1      tron # If a parameter is not set via the command line or environment,
    498  1.1      tron # try to use settings from installed configuration files.
    499  1.1      tron 
    500  1.1      tron # Extract parameter settings from the obsolete install.cf file, as
    501  1.1      tron # a transitional aid.
    502  1.1      tron 
    503  1.1      tron grep setgid_group $CONFIG_DIRECTORY/main.cf >/dev/null 2>&1 || {
    504  1.1      tron     test -f $CONFIG_DIRECTORY/install.cf && {
    505  1.1      tron 	for name in sendmail_path newaliases_path mailq_path setgid manpages
    506  1.1      tron 	do
    507  1.1      tron 	    eval junk=\$$name
    508  1.1      tron 	    case "$junk" in
    509  1.1      tron 	    "") eval unset $name;;
    510  1.1      tron 	    esac
    511  1.1      tron 	    eval : \${$name="\`. $CONFIG_DIRECTORY/install.cf; echo \$$name\`"} \
    512  1.1      tron 		|| exit 1
    513  1.1      tron 	done
    514  1.1      tron 	: ${setgid_group=$setgid}
    515  1.1      tron 	: ${manpage_directory=$manpages}
    516  1.1      tron     }
    517  1.1      tron }
    518  1.1      tron 
    519  1.1      tron # Extract parameter settings from the installed main.cf file.
    520  1.1      tron 
    521  1.1      tron test -f $CONFIG_DIRECTORY/main.cf && {
    522  1.1      tron     for name in $CONFIG_PARAMS sample_directory
    523  1.1      tron     do
    524  1.1      tron 	eval junk=\$$name
    525  1.1      tron 	case "$junk" in
    526  1.1      tron 	"") eval unset $name;;
    527  1.1      tron 	esac
    528  1.9  christos 	eval : \${$name=\`bin/postconf -qc $CONFIG_DIRECTORY -hx $name\`} ||
    529  1.1      tron 	    exit 1
    530  1.1      tron     done
    531  1.1      tron }
    532  1.1      tron 
    533  1.1      tron # Use built-in defaults as the final source of parameter settings.
    534  1.1      tron 
    535  1.1      tron for name in $CONFIG_PARAMS sample_directory
    536  1.1      tron do
    537  1.1      tron     eval junk=\$$name
    538  1.1      tron     case "$junk" in
    539  1.1      tron     "") eval unset $name;;
    540  1.1      tron     esac
    541  1.6  christos     eval : \${$name=\`bin/postconf -c conf -d -hx $name\`} || exit 1
    542  1.1      tron done
    543  1.1      tron 
    544  1.1      tron # Override settings manually.
    545  1.1      tron 
    546  1.1      tron test -z "$non_interactive" && for name in $CONFIG_PARAMS
    547  1.1      tron do
    548  1.1      tron     while :
    549  1.1      tron     do
    550  1.1      tron 	echo
    551  1.1      tron 	eval echo Please specify \$${name}_prompt | ${FMT}
    552  1.1      tron 	eval echo \$n "$name: [\$$name]\  \$c"
    553  1.1      tron 	read ans
    554  1.1      tron 	case $ans in
    555  1.1      tron 	"") break;;
    556  1.1      tron 	 *) eval $name=$ans; break;;
    557  1.1      tron 	esac
    558  1.1      tron     done
    559  1.1      tron done
    560  1.1      tron 
    561  1.1      tron # Sanity checks
    562  1.1      tron 
    563  1.1      tron case "$setgid_group" in
    564  1.1      tron  no) (echo $0: Error: the setgid_group parameter no longer accepts 
    565  1.1      tron      echo \"no\" values. Try again with \"setgid_group=groupname\" on the 
    566  1.1      tron      echo command line or execute \"make install\" and specify setgid_group
    567  1.1      tron      echo interactively.) | ${FMT} 1>&2
    568  1.1      tron      exit 1;;
    569  1.1      tron esac
    570  1.1      tron 
    571  1.1      tron case "$manpage_directory" in
    572  1.1      tron  no) (echo $0: Error: the manpage_directory parameter no longer accepts 
    573  1.1      tron      echo \"no\" values.  Try again with \"manpage_directory=/path/name\" 
    574  1.1      tron      echo on the command line or execute \"make install\" and specify
    575  1.1      tron      echo manpage_directory interactively.) | ${FMT} 1>&2
    576  1.1      tron      exit 1;;
    577  1.1      tron esac
    578  1.1      tron 
    579  1.6  christos for path in "$html_directory" "$readme_directory" "$shlib_directory"
    580  1.1      tron do
    581  1.1      tron    case "$path" in
    582  1.1      tron    /*) ;;
    583  1.1      tron    no) ;;
    584  1.1      tron     *) echo $0: Error: \"$path\" should be \"no\" or an absolute path name. 1>&2
    585  1.1      tron        exit 1;;
    586  1.1      tron    esac
    587  1.1      tron done
    588  1.1      tron 
    589  1.1      tron for path in "$daemon_directory" "$data_directory" "$command_directory" "$queue_directory" \
    590  1.6  christos     "$sendmail_path" "$newaliases_path" "$mailq_path" "$manpage_directory" \
    591  1.6  christos     "$meta_directory"
    592  1.1      tron do
    593  1.1      tron    case "$path" in
    594  1.1      tron    /*) ;;
    595  1.1      tron     *) echo $0: Error: \"$path\" should be an absolute path name. 1>&2; exit 1;;
    596  1.1      tron    esac
    597  1.1      tron done
    598  1.1      tron 
    599  1.1      tron for path in mailq_path newaliases_path sendmail_path
    600  1.1      tron do
    601  1.1      tron     eval test -d $install_root\$$path && {
    602  1.1      tron 	echo $0: Error: \"$path\" specifies a directory. 1>&2
    603  1.1      tron 	exit 1
    604  1.1      tron     }
    605  1.1      tron done
    606  1.1      tron 
    607  1.1      tron for path in command_directory config_directory daemon_directory data_directory \
    608  1.6  christos     manpage_directory queue_directory shlib_directory html_directory \
    609  1.6  christos     readme_directory meta_directory
    610  1.1      tron do
    611  1.6  christos    case "$path" in
    612  1.6  christos    no) ;;
    613  1.6  christos     *) eval test -f $install_root\$$path && {
    614  1.1      tron 	echo $0: Error: \"$path\" specifies a regular file. 1>&2
    615  1.1      tron 	exit 1
    616  1.6  christos    };;
    617  1.6  christos    esac
    618  1.6  christos done
    619  1.6  christos 
    620  1.6  christos # Don't allow space or tab in parameter settings.
    621  1.6  christos 
    622  1.6  christos for name in $CONFIG_PARAMS sample_directory
    623  1.6  christos do
    624  1.6  christos     eval junk=\$$name
    625  1.6  christos     case "$junk" in
    626  1.6  christos *"[ 	]"*) echo "$0: Error: $name value contains whitespace: '$junk'" 1>&2
    627  1.6  christos 	     exit 1;;
    628  1.6  christos     esac
    629  1.1      tron done
    630  1.1      tron 
    631  1.1      tron test -d $tempdir || mkdir -p $tempdir || exit 1
    632  1.1      tron 
    633  1.1      tron trap "rm -f $tempdir/junk" 0 1 2 3 15
    634  1.1      tron 
    635  1.1      tron ( rm -f $tempdir/junk && touch $tempdir/junk ) || {
    636  1.1      tron     echo $0: Error: you have no write permission to $tempdir. 1>&2
    637  1.1      tron     echo Specify an alternative directory for scratch files. 1>&2
    638  1.1      tron     exit 1
    639  1.1      tron }
    640  1.1      tron 
    641  1.1      tron test -z "$install_root" && {
    642  1.1      tron 
    643  1.1      tron     chown root $tempdir/junk >/dev/null 2>&1 || {
    644  1.1      tron 	echo Error: you have no permission to change file ownership. 1>&2
    645  1.1      tron 	exit 1
    646  1.1      tron     }
    647  1.1      tron 
    648  1.1      tron     chown "$mail_owner" $tempdir/junk >/dev/null 2>&1 || {
    649  1.1      tron 	echo $0: Error: \"$mail_owner\" needs an entry in the passwd file. 1>&2
    650  1.1      tron 	echo Remember, \"$mail_owner\" needs a dedicated user and group id. 1>&2
    651  1.1      tron 	exit 1
    652  1.1      tron     }
    653  1.1      tron 
    654  1.1      tron     chgrp "$setgid_group" $tempdir/junk >/dev/null 2>&1 || {
    655  1.1      tron 	echo $0: Error: \"$setgid_group\" needs an entry in the group file. 1>&2
    656  1.1      tron 	echo Remember, \"$setgid_group\" needs a dedicated group id. 1>&2
    657  1.1      tron 	exit 1
    658  1.1      tron     }
    659  1.1      tron 
    660  1.1      tron }
    661  1.1      tron 
    662  1.1      tron rm -f $tempdir/junk || exit 1
    663  1.1      tron 
    664  1.1      tron trap 0 1 2 3 15
    665  1.1      tron 
    666  1.1      tron # Avoid clumsiness.
    667  1.1      tron 
    668  1.1      tron DAEMON_DIRECTORY=$install_root$daemon_directory
    669  1.1      tron COMMAND_DIRECTORY=$install_root$command_directory
    670  1.1      tron QUEUE_DIRECTORY=$install_root$queue_directory
    671  1.1      tron SENDMAIL_PATH=$install_root$sendmail_path
    672  1.1      tron HTML_DIRECTORY=$install_root$html_directory
    673  1.1      tron MANPAGE_DIRECTORY=$install_root$manpage_directory
    674  1.1      tron README_DIRECTORY=$install_root$readme_directory
    675  1.6  christos SHLIB_DIRECTORY=$install_root$shlib_directory
    676  1.6  christos META_DIRECTORY=$install_root$meta_directory
    677  1.1      tron 
    678  1.1      tron # Avoid repeated tests for existence of these; default permissions suffice.
    679  1.1      tron 
    680  1.1      tron test -d $DAEMON_DIRECTORY || mkdir -p $DAEMON_DIRECTORY || exit 1
    681  1.1      tron test -d $COMMAND_DIRECTORY || mkdir -p $COMMAND_DIRECTORY || exit 1
    682  1.6  christos test -d $QUEUE_DIRECTORY || mkdir -p $QUEUE_DIRECTORY || exit 1
    683  1.6  christos test "$shlib_directory" = "no" -o -d $SHLIB_DIRECTORY ||
    684  1.6  christos 	mkdir -p $SHLIB_DIRECTORY || exit 1
    685  1.1      tron test "$html_directory" = "no" -o -d $HTML_DIRECTORY || 
    686  1.1      tron 	mkdir -p $HTML_DIRECTORY || exit 1
    687  1.1      tron test "$readme_directory" = "no" -o -d $README_DIRECTORY || 
    688  1.1      tron 	mkdir -p $README_DIRECTORY || exit 1
    689  1.6  christos test -d $META_DIRECTORY || mkdir -p $META_DIRECTORY || exit 1
    690  1.1      tron 
    691  1.1      tron # Upgrade or first-time installation?
    692  1.1      tron 
    693  1.1      tron if [ -f $CONFIG_DIRECTORY/main.cf ]
    694  1.1      tron then
    695  1.1      tron     post_install_options="upgrade-source"
    696  1.1      tron else
    697  1.1      tron     post_install_options="first-install"
    698  1.1      tron fi
    699  1.1      tron 
    700  1.1      tron # Install files, using information from the postfix-files file.
    701  1.1      tron 
    702  1.6  christos exec < meta/postfix-files || exit 1
    703  1.1      tron while IFS=: read path type owner group mode flags junk
    704  1.1      tron do
    705  1.1      tron     IFS="$BACKUP_IFS"
    706  1.1      tron 
    707  1.1      tron     # Skip comments.
    708  1.1      tron 
    709  1.1      tron     case $path in
    710  1.1      tron     [$]*) ;;
    711  1.1      tron        *) continue;;
    712  1.1      tron     esac
    713  1.1      tron 
    714  1.1      tron     # Skip over files that ought to be removed.
    715  1.1      tron     # Leave it up to post-install to report them to the user.
    716  1.1      tron 
    717  1.1      tron     case $flags in
    718  1.1      tron     *o*) continue
    719  1.1      tron     esac
    720  1.1      tron 
    721  1.1      tron     # Skip over files that must be preserved.
    722  1.1      tron 
    723  1.1      tron     case $flags in
    724  1.1      tron     *p*) eval test -f $install_root$path && {
    725  1.1      tron 	    eval echo "Skipping $install_root$path..."
    726  1.1      tron 	    continue
    727  1.1      tron 	 };;
    728  1.1      tron     esac
    729  1.1      tron 
    730  1.1      tron     # Save source path before it is clobbered.
    731  1.1      tron 
    732  1.1      tron     case $type in
    733  1.1      tron     [hl]) eval source=$owner;;
    734  1.1      tron     esac
    735  1.1      tron 
    736  1.1      tron     # If installing from source code, apply special permissions or ownership.
    737  1.1      tron     # If building a package, don't apply special permissions or ownership.
    738  1.1      tron 
    739  1.1      tron     case $install_root in
    740  1.1      tron     "") case $owner in
    741  1.1      tron 	[$]*) eval owner=$owner;;
    742  1.1      tron 	root) owner=;;
    743  1.1      tron 	esac
    744  1.1      tron 	case $group in
    745  1.1      tron 	[$]*) eval group=$group;;
    746  1.1      tron 	   -) group=;;
    747  1.1      tron 	esac;;
    748  1.1      tron      *) case $mode in
    749  1.1      tron 	[1-7]755) mode=755;;
    750  1.1      tron 	esac
    751  1.1      tron 	owner=
    752  1.1      tron 	group=;;
    753  1.1      tron     esac
    754  1.1      tron 
    755  1.1      tron 
    756  1.1      tron     case $type in
    757  1.1      tron 
    758  1.1      tron      # Create/update directory.
    759  1.1      tron 
    760  1.1      tron      d) eval path=$install_root$path
    761  1.1      tron 	test "$path" = "${install_root}no" -o -d $path || {
    762  1.1      tron 	    mkdir -p $path || exit 1
    763  1.1      tron 	    test -z "$owner" || chown $owner $path || exit 1
    764  1.1      tron 	    test -z "$group" || chgrp $group $path || exit 1
    765  1.1      tron 	    chmod $mode $path || exit 1
    766  1.1      tron 	}
    767  1.1      tron 	continue;;
    768  1.1      tron 
    769  1.1      tron      # Create/update regular file.
    770  1.1      tron 
    771  1.1      tron      f) echo $path | (IFS=/ read prefix file; IFS="$BACKUP_IFS"
    772  1.1      tron 	case $prefix in
    773  1.6  christos 	'$shlib_directory')
    774  1.6  christos 	    compare_or_replace $mode "$owner" "$group" lib/$file \
    775  1.6  christos 		    $SHLIB_DIRECTORY/$file || exit 1;;
    776  1.6  christos 	'$meta_directory')
    777  1.6  christos 	    compare_or_replace $mode "$owner" "$group" meta/$file \
    778  1.6  christos 		$META_DIRECTORY/$file || exit 1;;
    779  1.1      tron 	'$daemon_directory')
    780  1.1      tron 	    compare_or_replace $mode "$owner" "$group" libexec/$file \
    781  1.1      tron 		$DAEMON_DIRECTORY/$file || exit 1;;
    782  1.1      tron 	'$command_directory')
    783  1.1      tron 	    compare_or_replace $mode "$owner" "$group" bin/$file \
    784  1.1      tron 		$COMMAND_DIRECTORY/$file || exit 1;;
    785  1.1      tron 	'$config_directory')
    786  1.1      tron 	    compare_or_replace $mode "$owner" "$group" conf/$file \
    787  1.1      tron 		$CONFIG_DIRECTORY/$file || exit 1;;
    788  1.1      tron 	'$sendmail_path')
    789  1.1      tron 	    check_parent $SENDMAIL_PATH || exit 1
    790  1.1      tron 	    compare_or_replace $mode "$owner" "$group" bin/sendmail \
    791  1.1      tron 		$SENDMAIL_PATH || exit 1;;
    792  1.1      tron 	'$html_directory')
    793  1.1      tron 	    test "$html_directory" = "no" ||
    794  1.1      tron 		compare_or_replace $mode "$owner" "$group" html/$file \
    795  1.1      tron 		    $HTML_DIRECTORY/$file || exit 1;;
    796  1.1      tron 	'$manpage_directory')
    797  1.1      tron 	    check_parent $MANPAGE_DIRECTORY/$file || exit 1
    798  1.1      tron 	    compare_or_replace $mode "$owner" "$group" man/$file \
    799  1.1      tron 		$MANPAGE_DIRECTORY/$file || exit 1;;
    800  1.1      tron 	'$readme_directory')
    801  1.1      tron 	    test "$readme_directory" = "no" ||
    802  1.1      tron 		compare_or_replace $mode "$owner" "$group" README_FILES/$file \
    803  1.1      tron 		    $README_DIRECTORY/$file || exit 1;;
    804  1.6  christos 	 *) echo $0: Error: unknown entry $path in meta/postfix-files 1>&2
    805  1.1      tron 	    exit 1;;
    806  1.1      tron 	esac) || exit 1
    807  1.1      tron 	continue;;
    808  1.1      tron 
    809  1.1      tron      # Hard link. Skip files that are not installed.
    810  1.1      tron 
    811  1.1      tron      h) eval echo $path | (
    812  1.1      tron 	    IFS=/ read prefix file; IFS="$BACKUP_IFS"
    813  1.1      tron 	    test "$prefix" = "no" || (
    814  1.1      tron 		eval dest_path=$install_root$path
    815  1.1      tron 		check_parent $dest_path || exit 1
    816  1.1      tron 		eval source_path=$install_root$source
    817  1.1      tron 		compare_or_hardlink $source_path $dest_path || exit 1
    818  1.1      tron 	    )
    819  1.1      tron 	) || exit 1
    820  1.1      tron 	continue;;
    821  1.1      tron 
    822  1.1      tron      # Symbolic link. Skip files that are not installed.
    823  1.1      tron 
    824  1.1      tron      l) eval echo $path | (
    825  1.1      tron 	    IFS=/ read prefix file; IFS="$BACKUP_IFS"
    826  1.1      tron 	    test "$prefix" = "no" || (
    827  1.1      tron 		eval dest_path=$install_root$path
    828  1.1      tron 		check_parent $dest_path || exit 1
    829  1.1      tron 		eval source_path=$install_root$source
    830  1.1      tron 		compare_or_symlink $source_path $dest_path || exit 1
    831  1.1      tron 	    )
    832  1.1      tron 	) || exit 1
    833  1.1      tron 	continue;;
    834  1.1      tron 
    835  1.6  christos      *) echo $0: Error: unknown type $type for $path in meta/postfix-files 1>&2
    836  1.1      tron 	exit 1;;
    837  1.1      tron     esac
    838  1.1      tron 
    839  1.6  christos done
    840  1.6  christos # More (solaris9) shell brain damage!
    841  1.6  christos IFS="$BACKUP_IFS"
    842  1.1      tron 
    843  1.1      tron # Save the installation parameters to main.cf even when they haven't
    844  1.1      tron # changed from their current default. Defaults can change between
    845  1.1      tron # Postfix releases, and software should not suddenly be installed in
    846  1.1      tron # the wrong place when Postfix is being upgraded.
    847  1.1      tron 
    848  1.6  christos case "$mail_version" in
    849  1.6  christos "") mail_version="`bin/postconf -dhx mail_version`" || exit 1
    850  1.6  christos esac
    851  1.6  christos 
    852  1.6  christos # Undo MAIL_VERSION expansion at the end of a parameter value. If
    853  1.6  christos # someone really wants the expanded mail version in main.cf, then
    854  1.6  christos # we're sorry.
    855  1.6  christos 
    856  1.6  christos for name in $CONFIG_PARAMS sample_directory
    857  1.6  christos do
    858  1.6  christos     eval junk=\$$name
    859  1.6  christos     case "$junk" in
    860  1.6  christos     *"$mail_version"*) 
    861  1.6  christos 	case "$pattern" in
    862  1.6  christos 	"") pattern=`echo "$mail_version" | sed 's/\./\\\\./g'` || exit 1
    863  1.6  christos 	esac
    864  1.6  christos 	val=`echo "$junk" | sed "s/$pattern"'$/${mail_version}/g'` || exit 1
    865  1.6  christos 	eval ${name}='"$val"'
    866  1.6  christos     esac
    867  1.6  christos done
    868  1.6  christos 
    869  1.9  christos bin/postconf -qc $CONFIG_DIRECTORY -e \
    870  1.1      tron     "daemon_directory = $daemon_directory" \
    871  1.1      tron     "data_directory = $data_directory" \
    872  1.1      tron     "command_directory = $command_directory" \
    873  1.1      tron     "queue_directory = $queue_directory" \
    874  1.1      tron     "mail_owner = $mail_owner" \
    875  1.1      tron     "setgid_group = $setgid_group" \
    876  1.1      tron     "sendmail_path = $sendmail_path" \
    877  1.1      tron     "mailq_path = $mailq_path" \
    878  1.1      tron     "newaliases_path = $newaliases_path" \
    879  1.1      tron     "html_directory = $html_directory" \
    880  1.1      tron     "manpage_directory = $manpage_directory" \
    881  1.1      tron     "sample_directory = $sample_directory" \
    882  1.1      tron     "readme_directory = $readme_directory" \
    883  1.6  christos     "shlib_directory = $shlib_directory" \
    884  1.6  christos     "meta_directory = $meta_directory" \
    885  1.1      tron || exit 1
    886  1.1      tron 
    887  1.1      tron # If Postfix is being installed locally from source code, do the
    888  1.1      tron # post-install processing now.
    889  1.1      tron 
    890  1.6  christos # The unexpansion above may have side effects on exported variables.
    891  1.6  christos # It does not matter because bin/postfix below will override them.
    892  1.6  christos 
    893  1.1      tron test -n "$install_root" || {
    894  1.1      tron     bin/postfix post-install $post_install_options || exit 1
    895  1.1      tron }
    896