]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
snapshot-20020111
authorWietse Venema <wietse@porcupine.org>
Fri, 11 Jan 2002 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 06:27:48 +0000 (06:27 +0000)
postfix/HISTORY
postfix/RELEASE_NOTES
postfix/conf/post-install
postfix/conf/postfix-script
postfix/postfix-install
postfix/src/global/mail_version.h
postfix/src/master/mail_flow.c

index 7e0bd641d1f9f0f12b4b63a592eba17f2d9a53f5..0bbafeadb7a49a6ad6ce1aee63a52ef82604b79b 100644 (file)
@@ -5944,6 +5944,11 @@ Apologies for any names omitted.
        non-blocking pipe. File:  master/master_flow.c.  Report:
        Hamish Marson.
 
+20020111
+
+       Feedback: feedback, bugfixes, and brain-dead shell workarounds
+       for the install scripts by Victor Duchovny and Simon Mudd.
+
 Open problems:
 
        Low: don't do user@domain and @domain lookups in
index a99f392cbaa47406f3c53c817eaefb49c4bdeffa..cdfc8924dbd440859d307b87e4bb367e6dbce282 100644 (file)
@@ -1,3 +1,17 @@
+Incompatible changes with snapshot-20020111
+===========================================
+
+Another revision of installation procedures. The command line
+interface of the post-install script has changed; see embedded
+documentation.  The postfix-files file with information about
+Postfix files and directories now contains $name variables rather
+than directory names, user names and group names. You can now change
+parameters such as mail_owner and setgid_group after installing
+Postfix, and apply the correct file/directory ownerships and
+permissions by executing the post-install script as:
+
+    post-install set-permissions config_directory=/etc/postfix
+
 Incompatible changes with snapshot-20020110
 ===========================================
 
@@ -5,10 +19,10 @@ The INSTALL.sh installation procedure is replaced by a postfix-install
 script that either installs Postfix on the local system (as root)
 or that builds a package (as non-root) for distribution to other
 systems. This script creates a file $config_directory/postfix-files
-with ownership and permissions of Postfix files/directories.  The
-$config_directory/post-install script applies the finishing touch:
-it sets file/directory ownership and permissions, edits existing
-configuration files, and creates missing queue directories.
+with ownership and permissions of Postfix files/directories.  A
+new $config_directory/post-install script applies the finishing
+touch:  it sets file/directory ownership and permissions, edits
+existing configuration files, and creates missing queue directories.
 
 Incompatible changes with snapshot-20020106
 ===========================================
index e639dcedec57e11f863aa57e0fc53a6819be6219..72cf1b953a90f7995c726f836308432728b2eff4 100644 (file)
@@ -9,7 +9,7 @@
 # SUMMARY
 #      Postfix post-installation script
 # SYNOPSIS
-#      post-install [options] config_directory
+#      post-install [name=value] command ...
 # DESCRIPTION
 #      The post-install script performs the finishing touch of a Postfix
 #      installation, after the executable programs and configuration
 #      create missing queue directories.
 # .PP
 #      Arguments
-# .IP -create
+# .IP create-missing
 #      Create missing queue directories with ownerships and permissions
 #      according to the contents of $config_directory/postfix-files.
 #
 #      This is required at Postfix start-up time.
-# .IP -set-permissions
+# .IP set-permissions
 #      Set all file/directory ownerships and permissions according to the 
-#      contents of $config_directory/postfix-files. Implies -create.
+#      contents of $config_directory/postfix-files. Implies create-missing.
 #
 #      This is required when installing Postfix from a pre-built package.
-# .IP -upgrade-permissions
+# .IP upgrade-permissions
 #      Update ownership and permission of selected files/directories as
-#      specified in $config_directory/postfix-files. Implies -create.
+#      specified in $config_directory/postfix-files. Implies create-missing.
 #
 #      This is required when installing Postfix from source code, while
 #      Postfix was already installed on the machine.
-# .IP -upgrade-configuration
+# .IP upgrade-configuration
 #      Edit the installed main.cf and master.cf files, in order to account 
 #      for missing services and to fix deprecated parameter settings. 
 #
 #      This is required when Postfix was already installed on the machine.
-# .IP -upgrade-source
-#      Short-hand for -upgrade-permissions -upgrade-configuration.
+# .IP upgrade-source
+#      Short-hand for upgrade-permissions upgrade-configuration.
 #
 #      This is recommended when upgrading Postfix from source code.
-# .IP -upgrade-package
-#      Short-hand for -set-permissions -upgrade-configuration.
+# .IP upgrade-package
+#      Short-hand for set-permissions upgrade-configuration.
 #
 #      This is recommended when upgrading Postfix from a pre-built package.
-# .IP -first-install-reminder
+# .IP first-install-reminder
 #      Remind the user that they still need to configure main.cf and the
 #      aliases file, and that newaliases needs to be run.
 #
 #      This is recommended when Postfix is installed for the first time.
-# .IP config_directory
-#      Directory with Postfix configuration files. This must be an absolute
-#      pathname.
+# .IP config_directory=pathname
+#      Absolute pathname of the directory with Postfix configuration files.
+#      This information must be specified if it is not given via the 
+#      process environment. 
+# .IP command_directory=pathname
+#      Absolute pathname of the directory with the postconf command.
+#      This information must be specified if it is not given via the 
+#      process environment, and if the directory is not a standard
+#      system directory.
 # SEE ALSO
-#      postfix-install(1) Postfix primary installation script for installation
-#      from source code, or for building a package for distribution to other
-#      systems.
+#      postfix-install(1) Postfix primary installation script.
 # FILES
 #      $config_directory/main.cf, Postfix installation configuration.
 #      $config_directory/postfix-files, permissions and ownerships.
@@ -87,32 +91,36 @@ umask 022
 
 PATH=/bin:/usr/bin:/usr/sbin:/usr/etc:/sbin:/etc:/usr/contrib/bin:/usr/gnu/bin:/usr/ucb:/usr/bsd
 SHELL=/bin/sh
+IFS="  
+"
 
-USAGE="usage: $0 [options] config_directory
+USAGE="Usage: $0 [name=value] command
+    create-missing          Create missing queue directories.
+    upgrade-source          Use when upgrading from source.
+    upgrade-package         Use when upgrading from pre-built package.
+    first-install-reminder  Remind of mandatory configuration steps.
+    config_directory=path   Specify an absolute path name.
+    command_directory=path  Specify an absolute path name."
 
-    -upgrade-source         Use when upgrading from source.
+# Process command-line options and parameter settings. Work around
+# brain damaged shells. "name=value command" should not make the
+# name=value setting permanent.
 
-    -upgrade-package        Use when upgrading from pre-built package.
-
-    -first-install-reminder Remind of mandatory configuration steps.
-
-    config_directory        Must be an absolute path name."
-
-# Process command-line settings
+create=; set_perms=; upgrade_perms=; upgrade_conf=; first_install_reminder=
 
 for arg
 do
     case $arg in
-                -create) create=1;;
-             -set-perm*) create=1; set_perms=1;;
-         -upgrade-perm*) create=1; upgrade_perms=1;;
-         -upgrade-conf*) upgrade_conf=1;;
-        -upgrade-source) create=1; upgrade_conf=1; upgrade_perms=1;;
-       -upgrade-package) create=1; upgrade_conf=1; set_perms=1;;
-        -first-install*) first_install_reminder=1;;
-                     /*) config_dir=$1;;
-                     "") break;;
-                      *) echo "Error: $USAGE" 1>&2; exit 1;;
+                *=*) SAVED_IFS="$IFS"; IFS= eval $arg; IFS="$SAVED_IFS";;
+     create-missing) create=1;;
+         set-perm*) create=1; set_perms=1;;
+      upgrade-perm*) create=1; upgrade_perms=1;;
+      upgrade-conf*) upgrade_conf=1;;
+     upgrade-source) create=1; upgrade_conf=1; upgrade_perms=1;;
+    upgrade-package) create=1; upgrade_conf=1; set_perms=1;;
+     first-install*) first_install_reminder=1;;
+                "") break;;
+                 *) echo "Error: $USAGE" 1>&2; exit 1;;
     esac
     shift
 done
@@ -124,18 +132,19 @@ test -n "$create$upgrade_conf$first_install_reminder" || {
     exit 1
 }
 
-test -n "$config_dir" || {
-    echo "Error: $USAGE" 1>&2
+test -n "$config_directory" || {
+    echo "Error: no config_directory parameter setting." 1>&2
+    echo "$USAGE" 1>&2
     exit 1
 }
 
-test -d "$config_dir" || {
-    echo Error: $config_dir is not a directory. 1>&2
+test -d "$config_directory" || {
+    echo Error: $config_directory is not a directory. 1>&2
     exit 1
 }
 
-test -f $config_dir/postfix-files || {
-    Error: $config_dir/postfix-files is not a file. 1>&2
+test -f $config_directory/postfix-files || {
+    Error: $config_directory/postfix-files is not a file. 1>&2
     exit 1
 }
 
@@ -150,37 +159,63 @@ else
     CHATTR=echo
 fi
 
-# Use file/directory status information in $config_dir/postfix-files.
+# Bootstrapping problem.
+
+if [ -n "$command_directory" ]
+then
+    POSTCONF="$command_directory/postconf"
+else
+    POSTCONF="postconf"
+fi
+
+# Settings from main.cf must override command line or environment settings.
+
+for name in daemon_directory command_directory queue_directory mail_owner \
+    setgid_group sendmail_path newaliases_path mailq_path manpage_path
+do
+    eval $name=\`$POSTCONF -c $config_directory -h $name\` || kill $$
+done
+
+POSTCONF="$command_directory/postconf"
+
+# Use file/directory status information in $config_directory/postfix-files.
 
 test -n "$create" && {
-    IFS=:
-    while read path type owner group mode upgrade_flag create_flag junk
+    while IFS=: read path type owner group mode upgrade_flag create_flag junk
     do
        set_permission=
        case $path in
-       /*) # Create missing directories with proper owner/group/mode settings.
-           if [ -n "$create" -a "$type" = "d" -a -n "$create_flag" -a ! -d "$path" ]
-           then
-               mkdir $path || exit 1
-               $CHATTR $path >/dev/null 2>/dev/null
-               set_permission=1
-           # Update all owner/group/mode settings.
-           elif [ -n "$set_perms" ]
-           then
-               set_permission=1
-           # Update obsolete owner/group/mode settings.
-           elif [ -n "$upgrade_perms" -a -n "$upgrade_flag" ]
-           then
-               set_permission=1
-           fi
-           test -n "$set_permission" && {
-               chown $owner $path || exit 1
-               test -z "$group" || chgrp $group $path || exit 1
-               chmod $mode $path || exit 1
-           }
-           ;;
+       [$]*) eval path=$path;;
+         /*) ;;
+          *) continue;;
+       esac
+       case $owner in
+       [$]*) eval owner=$owner;;
        esac
-    done <$config_dir/postfix-files
+       case $group in
+       [$]*) eval group=$group;;
+       esac
+       # Create missing directories with proper owner/group/mode settings.
+       if [ -n "$create" -a "$type" = "d" -a -n "$create_flag" -a ! -d "$path" ]
+       then
+           mkdir $path || exit 1
+           $CHATTR $path >/dev/null 2>/dev/null
+           set_permission=1
+       # Update all owner/group/mode settings.
+       elif [ -n "$set_perms" ]
+       then
+           set_permission=1
+       # Update obsolete owner/group/mode settings.
+       elif [ -n "$upgrade_perms" -a -n "$upgrade_flag" ]
+       then
+           set_permission=1
+       fi
+       test -n "$set_permission" && {
+           chown $owner $path || exit 1
+           test -z "$group" || chgrp $group $path || exit 1
+           chmod $mode $path || exit 1
+       }
+    done <$config_directory/postfix-files
 }
 
 # Upgrade existing Postfix configuration files if necessary.
@@ -189,9 +224,9 @@ test -n "$upgrade_conf" && {
 
     # Add missing flush service to master.cf.
 
-    grep 'flush.*flush' $config_dir/master.cf >/dev/null || {
-       echo Editing $config_dir/master.cf, adding missing entry for flush service
-       cat >>$config_dir/master.cf <<EOF
+    grep 'flush.*flush' $config_directory/master.cf >/dev/null || {
+       echo Editing $config_directory/master.cf, adding missing entry for flush service
+       cat >>$config_directory/master.cf <<EOF
 flush     unix  -       -       n       1000?   0       flush
 EOF
     }
@@ -199,9 +234,9 @@ EOF
     # Change privileged pickup service into unprivileged.
 
     grep "^pickup[     ]*fifo[         ]*n[    ]*n" \
-       $config_dir/master.cf >/dev/null && {
-           echo Editing $config_dir/master.cf, making the pickup service unprivileged
-           ed $config_dir/master.cf <<EOF
+       $config_directory/master.cf >/dev/null && {
+           echo Editing $config_directory/master.cf, making the pickup service unprivileged
+           ed $config_directory/master.cf <<EOF
 /^pickup[      ]*fifo[         ]*n[    ]*n/
 s/\(n[         ]*\)n/\1-/
 p
@@ -215,9 +250,9 @@ EOF
     for name in cleanup flush
     do
        grep "^$name[   ]*unix[         ]*-" \
-           $config_dir/master.cf >/dev/null && {
-               echo Editing $config_dir/master.cf, making the $name service public
-           ed $config_dir/master.cf <<EOF
+           $config_directory/master.cf >/dev/null && {
+               echo Editing $config_directory/master.cf, making the $name service public
+           ed $config_directory/master.cf <<EOF
 /^$name[       ]*unix[         ]*-/
 s/-/n/
 p
@@ -236,7 +271,7 @@ EOF
     # If you don't want slow mailq, be sure to hash defer and deferred,
     # because those two directories can contain lots of files.
 
-    found=`bin/postconf -c $config_dir -h hash_queue_names`
+    found=`$POSTCONF -c $config_directory -h hash_queue_names`
     missing=
     (echo "$found" | grep active >/dev/null) || missing="$missing active"
     (echo "$found" | grep bounce >/dev/null) || missing="$missing bounce"
@@ -246,7 +281,7 @@ EOF
     (echo "$found" | grep deferred>/dev/null)|| missing="$missing deferred"
     test -n "$missing" && {
        echo fixing main.cf hash_queue_names for missing $missing
-       bin/postconf -c $config_dir -e hash_queue_names="$found$missing"
+       $POSTCONF -c $config_directory -e hash_queue_names="$found$missing"
     }
 
 }
@@ -255,12 +290,12 @@ EOF
 
 test -n "$first_install_reminder" && {
 
-    ALIASES=`postconf -h alias_database | sed 's/^[^:]*://'`
-    NEWALIASES_PATH=`postconf -h newaliases_path`
+    ALIASES=`$POSTCONF -h alias_database | sed 's/^[^:]*://'`
+    NEWALIASES_PATH=`$POSTCONF -h newaliases_path`
     cat <<EOF 1>&2
 
     Warning: you still need to edit myorigin/mydestination/mynetworks
-    parameter settings in $config_dir/main.cf.
+    parameter settings in $config_directory/main.cf.
 
     See also http://www.postfix.org/faq.html for information about
     dialup sites or about sites inside a firewalled network.
index fe669cf0328472e546425007b29dbbfaeb9f819c..9b53a4d62d7da419edc50236f840b9cbdf2db04b 100644 (file)
@@ -164,7 +164,7 @@ check)
                \( -perm -020 -o -perm -002 \) -type f \
                -exec $WARN group or other writable: {} \;
 
-       $SHELL $config_directory/post-install -create $config_directory || {
+       $SHELL $config_directory/post-install create-missing || {
                $WARN unable to create missing queue directories
                exit 1
        }
index acb1d38b031dd3303dc00c722a9cfb7e7c6dca26..a1663237b1d8f8c5e4815688fd54f5d728075363 100644 (file)
 umask 022
 PATH=/bin:/usr/bin:/usr/sbin:/usr/etc:/sbin:/etc:/usr/contrib/bin:/usr/gnu/bin:/usr/ucb:/usr/bsd
 SHELL=/bin/sh
+IFS="  
+"
 
-# Process command-line options and parameter settings.
+# Process command-line options and parameter settings. Work around
+# brain damaged shells. "name=value command" should not make the
+# name=value setting permanent.
 
 for arg
 do
     case $arg in
-             *=*) IFS= eval $arg;;
+             *=*) SAVED_IFS="$IFS"; IFS= eval $arg; IFS="$SAVED_IFS";;
 -non-interactive) non_interactive=1;;
                *) echo Error: usage: $0 [-non-interactive] name=value ... 1>&2
                  exit 1;;
@@ -509,26 +513,26 @@ cat <<EOF >$CONFIG_DIRECTORY/postfix-files || exit 1
 #      update=update owner/group/mode (upgrade mode).
 #      create=create missing directory.
 #
-$config_directory:d:root::755:u
-$daemon_directory:d:root::755:u
-$queue_directory:d:root::755:u
+\$config_directory:d:root::755:u
+\$daemon_directory:d:root::755:u
+\$queue_directory:d:root::755:u:c
 EOF
 
 # Generate instructions only for queue subdirectories.
 
 for dir in active bounce corrupt defer deferred flush incoming private saved
 do
-    echo $queue_directory/$dir:d:$mail_owner::700:u:c \
+    echo \$queue_directory/$dir:d:\$mail_owner::700:u:c \
        >>$CONFIG_DIRECTORY/postfix-files || exit 1
 done
 
-echo $queue_directory/maildrop:d:$mail_owner:$setgid_group:730:u:c \
+echo \$queue_directory/maildrop:d:\$mail_owner:\$setgid_group:730:u:c \
     >>$CONFIG_DIRECTORY/postfix-files || exit 1
 
-echo $queue_directory/public:d:$mail_owner:$setgid_group:710:u:c \
+echo \$queue_directory/public:d:\$mail_owner:\$setgid_group:710:u:c \
     >>$CONFIG_DIRECTORY/postfix-files || exit 1
 
-echo $queue_directory/pid:d:root::755:u:c \
+echo \$queue_directory/pid:d:root::755:u:c \
     >>$CONFIG_DIRECTORY/postfix-files || exit 1
 
 # Install daemon programs.
@@ -536,7 +540,7 @@ echo $queue_directory/pid:d:root::755:u:c \
 for file in `censored_ls libexec`
 do
     compare_or_replace $EXE libexec/$file $DAEMON_DIRECTORY/$file || exit 1
-    echo $daemon_directory/$file:f:root::755 \
+    echo \$daemon_directory/$file:f:root::755 \
        >>$CONFIG_DIRECTORY/postfix-files || exit 1
 done
 
@@ -545,7 +549,7 @@ done
 for file in `censored_ls bin | grep '^post' | egrep -v '^post(drop|queue)$'`
 do
     compare_or_replace $EXE bin/$file $COMMAND_DIRECTORY/$file || exit 1
-    echo $command_directory/$file:f:root::755 \
+    echo \$command_directory/$file:f:root::755 \
        >>$CONFIG_DIRECTORY/postfix-files || exit 1
 done
 
@@ -557,7 +561,7 @@ then
     for file in postdrop postqueue
     do
        compare_or_replace $EXE bin/$file $COMMAND_DIRECTORY/$file || exit 1
-       echo $command_directory/$file:f:root:postdrop:1755 \
+       echo \$command_directory/$file:f:root:\$setgid_group:1755 \
            >>$CONFIG_DIRECTORY/postfix-files || exit 1
     done
 else
@@ -565,7 +569,7 @@ else
     do
        compare_or_replace 2$EXE bin/$file $COMMAND_DIRECTORY/$file postdrop \
            || exit 1
-       echo $command_directory/$file:f:root:postdrop:1755 \
+       echo \$command_directory/$file:f:root:\$setgid_group:1755 \
            >>$CONFIG_DIRECTORY/postfix-files || exit 1
     done
 fi
@@ -577,9 +581,9 @@ test -f bin/sendmail && {
     compare_or_symlink $SENDMAIL_PATH $NEWALIASES_PATH
     compare_or_symlink $SENDMAIL_PATH $MAILQ_PATH
 cat <<EOF >>$CONFIG_DIRECTORY/postfix-files || exit 1
-$sendmail_path:f:root::755
-$newaliases_path:f:root::755
-$mailq_path:f:root::755
+\$sendmail_path:f:root::755
+\$newaliases_path:f:root::755
+\$mailq_path:f:root::755
 EOF
 }
 
@@ -596,19 +600,19 @@ else
     do
        compare_or_replace 644 conf/$file $CONFIG_DIRECTORY/$file || exit 1
     done
-    test -z "$install_root" && need_config="-create -first-install"
+    test -z "$install_root" && need_config="create-missing first-install"
 fi
 
 for file in `censored_ls conf | egrep -v 'postfix-script|post-install'`
 do
-    echo $config_directory/$file:f:root::644 \
+    echo \$config_directory/$file:f:root::644 \
        >>$CONFIG_DIRECTORY/postfix-files || exit 1
 done
 
 for file in postfix-script post-install
 do
     compare_or_replace $EXE conf/$file $CONFIG_DIRECTORY/$file || exit 1
-    echo $config_directory/$file:f:root::755 \
+    echo \$config_directory/$file:f:root::755 \
        >>$CONFIG_DIRECTORY/postfix-files || exit 1
 done
 
@@ -635,7 +639,7 @@ bin/postconf -c $CONFIG_DIRECTORY -e \
  for file in `censored_ls man?/*`
  do
      compare_or_replace 644 $file $MANPAGE_PATH/$file || exit 1
-     echo "$manpage_path/$file:f:root::644" \
+     echo \$manpage_path/$file:f:root::644 \
        >>$CONFIG_DIRECTORY/postfix-files || exit 1
  done)
 
@@ -645,4 +649,6 @@ bin/postconf -c $CONFIG_DIRECTORY -e \
 
 test -n "$install_root" && exit 0
 
-${SHELL} conf/post-install ${need_config-"-upgrade-source"} $config_directory
+export command_directory config_directory
+
+${SHELL} conf/post-install ${need_config-"upgrade-source"}
index 38e8247876369e3a070a7a0ad2c26ce254fde4eb..df5fbc85683519e32ac8a625906b84a50542b90a 100644 (file)
@@ -15,7 +15,7 @@
   * Version of this program.
   */
 #define VAR_MAIL_VERSION       "mail_version"
-#define DEF_MAIL_VERSION       "Snapshot-20020110"
+#define DEF_MAIL_VERSION       "Snapshot-20020111"
 extern char *var_mail_version;
 
 /* LICENSE
index 2ade8cfabdf59c25b08164dcb3b1f81f2a7e6adb..efb59885409a7ee61ed460102142645035a6bdf8 100644 (file)
@@ -44,6 +44,7 @@
 /* System library. */
 
 #include <sys_defs.h>
+#include <sys/stat.h>
 #include <unistd.h>
 #include <stdlib.h>
 
@@ -68,6 +69,7 @@ int     mail_flow_get(int len)
 {
     char   *myname = "mail_flow_get";
     char    buf[BUFFER_SIZE];
+    struct stat st;
     int     count;
     int     n = 0;
 
@@ -78,8 +80,14 @@ int     mail_flow_get(int len)
        msg_panic("%s: bad length %d", myname, len);
 
     /*
-     * Read and discard N bytes. XXX AIX read() returns 0 when the pipe is
-     * empty.
+     * Silence some wild claims.
+     */
+    if (fstat(MASTER_FLOW_WRITE, &st) < 0)
+       msg_fatal("fstat flow pipe write descriptor: %m");
+
+    /*
+     * Read and discard N bytes. XXX AIX read() can return 0 when an open
+     * pipe is empty.
      */
     for (count = len; count > 0; count -= n)
        if ((n = read(MASTER_FLOW_READ, buf, count > BUFFER_SIZE ?