#! /bin/sh
umask 022
: ${MAIL_CONFIG:?"do not invoke this command directly"}
: ${command_directory:?"do not invoke this command directly"}
: ${daemon_directory:?"do not invoke this command directly"}
USAGE="$0 -e create|destroy|import|deport|enable|disable|assign|init"
usage() { echo "$0: Error: Usage: $USAGE" >&2; exit 1; }
TAG="$MAIL_LOGTAG/postmulti-script"
fatal() { postlog -p fatal -t "$TAG" "$1"; exit 1; }
update_cfdirs() {
op=$1
dir=$2
alt=`postconf -h alternate_config_directories` || return 1
shift $ IFS="$IFS,"; set -- $alt; IFS="$BACKUP_IFS"
keep=
found=
for d in "$@"; do [ "$d" = "$dir" ] && found=1 || keep="$keep $d"; done
set -- "multi_instance_directories = $multi_instance_directories"
case $op in
add) test -n "$found" ||
set -- "$@" "alternate_config_directories =$keep $dir";;
del) test -n "$found" &&
set -- "$@" "alternate_config_directories =$keep";;
*) return 1;; esac
postconf -e "$@" || return 1
}
assign_names() {
test -n "$multi_instance_name" && {
test "$multi_instance_name" = "-" && multi_instance_name=
set -- "$@" "multi_instance_name = $multi_instance_name"
}
test -n "$multi_instance_group" && {
test "$multi_instance_group" = "-" && multi_instance_group=
set -- "$@" "multi_instance_group = $multi_instance_group"
}
test $}
BACKUP_IFS="$IFS"
action=
while getopts ":e:" opt
do
case $opt in
e) action="$OPTARG";;
*) usage;;
esac
done
shift `expr $OPTIND - 1`
case "$action" in
create|import|destroy|deport|enable|disable|assign|init) ;;
*) usage;;
esac
test $
case $action in
init)
postconf -e \
'multi_instance_wrapper = ${command_directory}/postmulti -p --' \
'multi_instance_enable = yes'
exit $? ;;
esac
: ${config_directory:?"Invalid empty target instance config_directory"}
case $action in
create|import)
test -f $config_directory/main.cf -a \
-f $config_directory/master.cf || {
test "$action" = "create" || {
test -f $config_directory/main.cf ||
fatal "'$config_directory' lacks a main.cf file"
test -f $config_directory/master.cf ||
fatal "'$config_directory' lacks a master.cf file"
}
test -d $config_directory ||
{ (umask 022; mkdir -p $config_directory) || exit 1; }
test -d $queue_directory ||
{ (umask 022; mkdir -p $queue_directory) || exit 1; }
test -d $data_directory ||
{ (umask 077; mkdir -p $data_directory) || exit 1; }
tmpdir=$config_directory/.tmp
(umask 077; mkdir -p $tmpdir) || exit 1
cp -p $daemon_directory/main.cf $tmpdir/main.cf || exit 1
SHARED_PARAMETERS="
command_directory
daemon_directory
mail_owner
setgid_group
sendmail_path
mailq_path
newaliases_path
html_directory
manpage_directory
sample_directory
readme_directory
"
shift $ comment_out=
for p in $SHARED_PARAMETERS; do
val=`postconf -nh $p` || exit 1
test -n "$val" && { set -- "$@" "$p = $val"; continue; }
comment_out="$comment_out $p"
done
test -n "$comment_out" && {
postconf -c $tmpdir - }
postconf -c $tmpdir -e \
"queue_directory = $queue_directory" \
"data_directory = $data_directory" \
"authorized_submit_users =" \
"master_service_disable = inet" \
"$@" || exit 1
cp -p $daemon_directory/master.cf $tmpdir/master.cf || exit 1
mv $tmpdir/main.cf $config_directory/main.cf || exit 1
mv $tmpdir/master.cf $config_directory/master.cf || exit 1
rmdir $tmpdir 2>/dev/null
}
assign_names || exit 1
update_cfdirs del $config_directory || exit 1
postfix -c $config_directory set-permissions || exit 1
;;
deport)
[ -f "$config_directory/main.cf" ] || {
update_cfdirs del $config_directory
exit $?
}
postfix -c "$config_directory" status >/dev/null 2>&1 &&
fatal "Instance '$config_directory' is not stopped"
update_cfdirs add $config_directory || exit 1
;;
destroy)
QUEUE_SUBDIRS="active bounce corrupt defer deferred flush hold \
incoming maildrop pid private public saved trace"
WARN="postlog -p warn -t $TAG"
[ -f "$config_directory/main.cf" ] ||
fatal "$config_directory/main.cf file not found"
postfix -c "$config_directory" status >/dev/null 2>&1 &&
fatal "Instance '$config_directory' is not stopped"
$DEBUG update_cfdirs del "$config_directory" || exit 1
postfix -c "$config_directory" /bin/sh -c "
for q in $QUEUE_SUBDIRS
do
$DEBUG rmdir -- \$q ||
$WARN \`pwd\`/\$q: please verify contents and remove by hand
done
"
postfix -c "$config_directory" /bin/sh -c "
for dir in \$data_directory \$queue_directory
do
$DEBUG rmdir -- \$dir ||
$WARN \$dir: please verify contents and remove by hand
done
"
$DEBUG rm -f -- "$config_directory/master.cf" "$config_directory/main.cf" 2>/dev/null
$DEBUG rmdir -- "$config_directory" ||
$WARN $config_directory: please verify contents and remove by hand
;;
enable)
postconf -c "$config_directory" -e \
"multi_instance_enable = yes" || exit 1;;
disable)
postconf -c "$config_directory" -e \
"multi_instance_enable = no" || exit 1;;
assign)
assign_names || exit 1;;
esac
exit 0