#!/bin/sh
-# Sample Postfix installation script. Run this from the top-level
-# Postfix source directory.
+# Postfix installation script. Run from the top-level Postfix source directory.
#
-# Usage: sh INSTALL.sh [-upgrade] name=value ...
+# Usage: sh INSTALL.sh [-non-interactive] name=value ...
+#
+# Non-interective mode uses settings from /etc/postfix/main.cf (or
+# from /etc/postfix/install.cf when upgrading from a < 2002 release).
PATH=/bin:/usr/bin:/usr/sbin:/usr/etc:/sbin:/etc:/usr/contrib/bin:/usr/gnu/bin:/usr/ucb:/usr/bsd
umask 022
for arg
do
case $arg in
- *=*) IFS= eval $arg;;
-"-upgrade") upgrade=1;;
- *) echo Error: usage: $0 [-upgrade] name=value ... 1>&2; exit 1;;
+ *=*) IFS= eval $arg;;
+-non-interactive) non_interactive=1;;
+ *) echo Error: usage: $0 [-non-interactive] name=value ... 1>&2
+ exit 1;;
esac
done
# Discourage old habits.
-test -z "$upgrade" -a ! -t 0 && {
- echo Error: for non-interactive installation, run: \"$0 -upgrade\" 1>&2
+test -z "$non_interactive" -a ! -t 0 && {
+ echo Error: for non-interactive installation, run: \"$0 -non-interactive\" 1>&2
exit 1
}
-test -z "$upgrade" && cat <<EOF
+test -z "$non_interactive" && cat <<EOF
Warning: this script replaces existing sendmail or Postfix programs.
Make backups if you want to be able to recover.
# Find out the location of configuration files.
-test -z "$upgrade" && for name in install_root tempdir config_directory
+test -z "$non_interactive" && for name in install_root tempdir config_directory
do
while :
do
if [ -f $CONFIG_DIRECTORY/main.cf ]
then
- conf=$CONFIG_DIRECTORY
+ conf="-c $CONFIG_DIRECTORY"
else
- conf=conf
+ conf="-d"
fi
# Do not destroy parameter settings from environment or command line.
for name in daemon_directory command_directory queue_directory mail_owner \
setgid_group sendmail_path newaliases_path mailq_path manpage_path
do
- eval : \${$name=\`bin/postconf -c $conf -h $name\`} || kill $$
+ eval : \${$name=\`bin/postconf $conf -h $name\`} || kill $$
done
# Grandfathering: if not in main.cf, get defaults from obsolete install.cf file.
-grep setgid_group $CONFIG_DIRECTORY/main.cf 2>&1 >/dev/null || {
+grep setgid_group $CONFIG_DIRECTORY/main.cf >/dev/null 2>&1 || {
if [ -f $CONFIG_DIRECTORY/install.cf ]
then
. $CONFIG_DIRECTORY/install.cf
setgid_group=${setgid-$setgid_group}
manpage_path=${manpages-$manpage_path}
- elif [ ! -t 0 -a -z "$install_root" ]
+ elif [ -n "$non_interactive" ]
then
- echo \"make upgrade\" requires the $CONFIG_DIRECTORY/main.cf 1>&2
+ echo Error: \"make upgrade\" requires the $CONFIG_DIRECTORY/main.cf 1>&2
echo file from a sufficiently recent Postfix installation. 1>&2
echo 1>&2
echo Use \"make install\" instead. 1>&2
# Override default settings.
-test -z "$upgrade" && for name in daemon_directory command_directory \
+test -z "$non_interactive" && for name in daemon_directory command_directory \
queue_directory sendmail_path newaliases_path mailq_path mail_owner \
setgid_group manpage_path
do
compare_or_replace a+r,go-w conf/$file $CONFIG_DIRECTORY/$file || exit 1
done
else
- cp `censored_ls conf/*` $CONFIG_DIRECTORY || exit 1
- chmod a+r,go-w $CONFIG_DIRECTORY/* || exit 1
-
+ for file in `cd conf; censored_ls * | grep -v postfix-script`
+ do
+ compare_or_replace a+r,go-w conf/$file $CONFIG_DIRECTORY/$file || exit 1
+ done
test -z "$install_root" && need_config=1
fi
if ((dot = strchr(name, '.')) == 0) {
if ((domain = mail_conf_lookup_eval(VAR_MYDOMAIN)) == 0)
msg_warn("My hostname %s is not a fully qualified name - set %s or %s in %s/%s",
- name, VAR_MYHOSTNAME, VAR_MYDOMAIN,
- var_config_dir, MAIN_CONF_FILE);
+ name, VAR_MYHOSTNAME, VAR_MYDOMAIN,
+ var_config_dir, MAIN_CONF_FILE);
else
name = concatenate(name, ".", domain, (char *) 0);
}
struct passwd *pwd;
if ((pwd = getpwnam(var_default_privs)) == 0)
- msg_fatal("%s:%s: unknown user name value: %s",
- MAIN_CONF_FILE, VAR_DEFAULT_PRIVS, var_default_privs);
+ msg_fatal("file %s/%s: parameter %s: unknown user name value: %s",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_DEFAULT_PRIVS, var_default_privs);
if ((var_default_uid = pwd->pw_uid) == 0)
- msg_fatal("%s:%s: privileged user is not allowed: %s",
- MAIN_CONF_FILE, VAR_DEFAULT_PRIVS, var_default_privs);
+ msg_fatal("file %s/%s: parameter %s: user %s has privileged user ID",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_DEFAULT_PRIVS, var_default_privs);
if ((var_default_gid = pwd->pw_gid) == 0)
- msg_fatal("%s:%s: privileged group is not allowed: %s",
- MAIN_CONF_FILE, VAR_DEFAULT_PRIVS, var_default_privs);
+ msg_fatal("file %s/%s: parameter %s: user %s has privileged group ID",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_DEFAULT_PRIVS, var_default_privs);
}
/* check_mail_owner - lookup owner user attributes and validate */
struct passwd *pwd;
if ((pwd = getpwnam(var_mail_owner)) == 0)
- msg_fatal("%s:%s: unknown user name value: %s",
- MAIN_CONF_FILE, VAR_MAIL_OWNER, var_mail_owner);
+ msg_fatal("file %s/%s: parameter %s: unknown user name value: %s",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_MAIL_OWNER, var_mail_owner);
if ((var_owner_uid = pwd->pw_uid) == 0)
- msg_fatal("%s:%s: privileged user is not allowed: %s",
- MAIN_CONF_FILE, VAR_MAIL_OWNER, var_mail_owner);
+ msg_fatal("file %s/%s: parameter %s: user %s has privileged user ID",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_MAIL_OWNER, var_mail_owner);
if ((var_owner_gid = pwd->pw_gid) == 0)
- msg_fatal("%s:%s: privileged group is not allowed: %s",
- MAIN_CONF_FILE, VAR_MAIL_OWNER, var_mail_owner);
+ msg_fatal("file %s/%s: parameter %s: user %s has privileged group ID",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_MAIL_OWNER, var_mail_owner);
/*
* This detects only some forms of sharing. Enumerating the entire
*/
if ((pwd = getpwuid(var_owner_uid)) != 0
&& strcmp(pwd->pw_name, var_mail_owner) != 0)
- msg_fatal("%s:%s: %s is sharing the user ID with %s",
- MAIN_CONF_FILE, VAR_MAIL_OWNER, var_mail_owner, pwd->pw_name);
+ msg_fatal("file %s/%s: parameter %s: user %s has same user ID as %s",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_MAIL_OWNER, var_mail_owner, pwd->pw_name);
}
/* check_sgid_group - lookup setgid group attributes and validate */
struct group *grp;
if ((grp = getgrnam(var_sgid_group)) == 0)
- msg_fatal("%s:%s: unknown group name: %s",
- MAIN_CONF_FILE, VAR_SGID_GROUP, var_sgid_group);
+ msg_fatal("file %s/%s: parameter %s: unknown group name: %s",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_SGID_GROUP, var_sgid_group);
if ((var_sgid_gid = grp->gr_gid) == 0)
- msg_fatal("%s:%s: privileged group is not allowed: %s",
- MAIN_CONF_FILE, VAR_SGID_GROUP, var_sgid_group);
+ msg_fatal("file %s/%s: parameter %s: group %s has privileged group ID",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_SGID_GROUP, var_sgid_group);
/*
* This detects only some forms of sharing. Enumerating the entire group
*/
if ((grp = getgrgid(var_sgid_gid)) != 0
&& strcmp(grp->gr_name, var_sgid_group) != 0)
- msg_fatal("%s:%s: group %s is sharing the group ID with %s",
- MAIN_CONF_FILE, VAR_SGID_GROUP, var_sgid_group, grp->gr_name);
+ msg_fatal("file %s/%s: parameter %s: group %s has same group ID as %s",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_SGID_GROUP, var_sgid_group, grp->gr_name);
+}
+
+/* check_overlap - disallow UID or GID sharing */
+
+static void check_overlap(void)
+{
+ if (strcmp(var_default_privs, var_mail_owner) == 0)
+ msg_fatal("file %s/%s: parameters %s and %s specify the same user %s",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
+ var_default_privs);
+ if (var_default_uid == var_owner_uid)
+ msg_fatal("file %s/%s: parameters %s and %s: users %s and %s have the same user ID: %ld",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
+ var_default_privs, var_mail_owner,
+ (long) var_owner_uid);
+ if (var_default_gid == var_owner_gid)
+ msg_fatal("file %s/%s: parameters %s and %s: users %s and %s have the same group ID: %ld",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
+ var_default_privs, var_mail_owner,
+ (long) var_owner_gid);
+ if (var_default_gid == var_sgid_gid)
+ msg_fatal("file %s/%s: parameters %s and %s: user %s and group %s have the same group ID: %ld",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_DEFAULT_PRIVS, VAR_SGID_GROUP,
+ var_default_privs, var_sgid_group,
+ (long) var_sgid_gid);
+ if (var_owner_gid == var_sgid_gid)
+ msg_fatal("file %s/%s: parameters %s and %s: user %s and group %s have the same group ID: %ld",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_MAIL_OWNER, VAR_SGID_GROUP,
+ var_mail_owner, var_sgid_group,
+ (long) var_sgid_gid);
}
/* mail_params_init - configure built-in parameters */
get_mail_conf_str_table(first_str_defaults);
if (!msg_syslog_facility(var_syslog_facility))
- msg_fatal("unknown %s configuration parameter value: %s",
+ msg_fatal("file %s/%s: parameter %s: unrecognized value: %s",
+ var_config_dir, MAIN_CONF_FILE,
VAR_SYSLOG_FACILITY, var_syslog_facility);
/*
* the domain.
*/
get_mail_conf_str_fn_table(function_str_defaults);
- if (!valid_hostname(var_myhostname, DO_GRIPE)
- || !valid_hostname(var_mydomain, DO_GRIPE))
- msg_fatal("main.cf configuration error: bad %s or %s parameter value",
- VAR_MYHOSTNAME, VAR_MYDOMAIN);
+ if (!valid_hostname(var_myhostname, DO_GRIPE))
+ msg_fatal("file %s/%s: parameter %s: bad parameter value: %s",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_MYHOSTNAME, var_myhostname);
+ if (!valid_hostname(var_mydomain, DO_GRIPE))
+ msg_fatal("file %s/%s: parameter %s: bad parameter value: %s",
+ var_config_dir, MAIN_CONF_FILE,
+ VAR_MYDOMAIN, var_mydomain);
/*
* Variables that are needed by almost every program.
check_default_privs();
check_mail_owner();
check_sgid_group();
-
- /*
- * Discourage UID or GID sharing.
- */
- if (var_default_uid == var_owner_uid)
- msg_fatal("%s: %s and %s must not have the same user ID",
- MAIN_CONF_FILE, VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER);
- if (var_default_gid == var_owner_gid)
- msg_fatal("%s: %s and %s must not have the same group ID",
- MAIN_CONF_FILE, VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER);
- if (var_default_gid == var_sgid_gid)
- msg_fatal("%s: %s and %s must not have the same group ID",
- MAIN_CONF_FILE, VAR_DEFAULT_PRIVS, VAR_SGID_GROUP);
- if (var_owner_gid == var_sgid_gid)
- msg_fatal("%s: %s and %s must not have the same group ID",
- MAIN_CONF_FILE, VAR_MAIL_OWNER, VAR_SGID_GROUP);
+ check_overlap();
/*
* Variables whose defaults are determined at runtime, after other
* One more sanity check.
*/
if ((cp = verp_delims_verify(var_verp_delims)) != 0)
- msg_fatal("%s or %s configuration problem: %s",
+ msg_fatal("file %s/%s: parameters %s and %s: %s",
+ var_config_dir, MAIN_CONF_FILE,
VAR_VERP_DELIMS, VAR_VERP_FILTER, cp);
}