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