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