Files
server/opt/psa/admin/sbin/mailmng
2026-01-07 20:52:11 +01:00

469 lines
11 KiB
Bash
Executable File

#!/bin/bash
### Copyright 1999-2025. WebPros International GmbH. All rights reserved.
#
#
# Plesk script
#
#default values
product_default_conf()
{
PRODUCT_ROOT_D=/opt/psa
PRODUCT_RC_D=/etc/init.d
PRODUCT_ETC_D=/opt/psa/etc
PLESK_LIBEXEC_DIR=/usr/lib/plesk-9.0
HTTPD_VHOSTS_D=/var/www/vhosts
HTTPD_CONF_D=/etc/apache2
HTTPD_INCLUDE_D=/etc/apache2/conf-enabled
HTTPD_BIN=/usr/sbin/apache2
HTTPD_LOG_D=/var/log/apache2
HTTPD_SERVICE=apache2
QMAIL_ROOT_D=/var/qmail
PLESK_MAILNAMES_D=/var/qmail/mailnames
RBLSMTPD=/usr/sbin/rblsmtpd
NAMED_RUN_ROOT_D=/var/named/run-root
WEB_STAT=/usr/bin/webalizer
MYSQL_VAR_D=/var/lib/mysql
MYSQL_BIN_D=/usr/bin
MYSQL_SOCKET=/var/run/mysqld/mysqld.sock
PGSQL_DATA_D=/var/lib/postgresql/16/main
PGSQL_CONF_D=/etc/postgresql/16/main
PGSQL_BIN_D=/usr/lib/postgresql/16/bin
DUMP_D=/var/lib/psa/dumps
DUMP_TMP_D=/tmp
MAILMAN_ROOT_D=/usr/lib/mailman
MAILMAN_VAR_D=/var/lib/mailman
PYTHON_BIN=/usr/bin/python2
GPG_BIN=/usr/bin/gpg
TAR_BIN=/usr/lib/plesk-9.0/sw-tar
AWSTATS_ETC_D=/etc/awstats
AWSTATS_BIN_D=/usr/lib/cgi-bin
AWSTATS_TOOLS_D=/usr/share/awstats/tools
AWSTATS_DOC_D=/usr/share/awstats
OPENSSL_BIN=/usr/bin/openssl
LIB_SSL_PATH=/lib/libssl.so
LIB_CRYPTO_PATH=/lib/libcrypto.so
CLIENT_PHP_BIN=/opt/psa/bin/php-cli
SNI_SUPPORT=true
APS_DB_DRIVER_LIBRARY=/usr/lib/x86_64-linux-gnu/sw/libmysqlserver.so.2.0
SA_MAX_MAIL_SIZE=256000
}
# echo message to product log, also to console in debug mode
p_echo()
{
if [ -n "$product_log" ] ; then
echo "$@" >> "$product_log" 2>&1
fi
if [ -n "$PLESK_INSTALLER_DEBUG" -o -n "$PLESK_INSTALLER_VERBOSE" -o -z "$product_log" ] ; then
echo "$@" >&2
fi
}
# same as p_echo, but without new line
pnnl_echo()
{
p_echo -n "$@"
}
echo_try()
{
msg="$*"
pnnl_echo " Trying to $msg... "
}
suc()
{
p_echo "done"
}
get_default_locale()
{
# Note that CentOS 7 typically doesn't have C.UTF-8
for lc in "C.UTF-8" "en_US.UTF-8" "C"; do
if [ -z "`LC_ALL=$lc locale 2>&1 >/dev/null`" ]; then
echo "$lc"
return 0
fi
done
echo "C"
}
call_optional_function()
{
local type_output="`LC_ALL=C type \"$1\" 2>/dev/null | head -n 1`"
case "$type_output" in
*function)
"$@"
;;
*)
return 0
;;
esac
}
### Copyright 1999-2025. WebPros International GmbH. All rights reserved.
#
# Support for runtime patching of shell scripts (including utilities and package scripts).
#
# --- Service functions ---
# Load and apply a patch in a relatively safe way
rp_safe_load_patch()
{
local patch_file="$1"
echo_try "load shell patch '$patch_file'"
/bin/sh -n "$RP_BASEDIR/$patch_file" &&
{
. "$RP_BASEDIR/$patch_file"
RP_LOADED_PATCHES="$RP_LOADED_PATCHES $patch_file"
} &&
suc
}
# Apply patches specific to the current context (e.g., depending on utility basename or package name)
# This is currently not implemented. This may be overriden by "spark".
rp_patch_runtime_context_specific()
{
:
}
# --- Main entry points ---
rp_patch_runtime()
{
# List of loaded patch files
RP_LOADED_PATCHES=
local RP_BASEDIR="$PRODUCT_BOOTSTRAPPER_DIR/rp"
[ -d "$RP_BASEDIR" ] || return 0
if [ -r "$RP_BASEDIR/spark" ]; then
rp_safe_load_patch "spark"
fi
call_optional_function rp_patch_runtime_context_specific "$@"
}
### Copyright 1999-2025. WebPros International GmbH. All rights reserved.
# vim:ft=sh
initial_conf()
{
PRODNAME="psa"
PRODUCT_NAME="psa"
product=${PRODNAME}
PRODUCT_FULL_NAME="Plesk"
product_etc="/etc/${PRODNAME}"
prod_conf_t="/etc/psa/psa.conf"
support_contact="https://support.plesk.com/"
conceived_os_vendor=Ubuntu
conceived_os_version="24.04"
clients_group="psacln"
clients_GID="10001"
services_group="psaserv"
services_GID="10003"
product_suff="saved_by_${product}".`date "+%m.%d;%H:%M"`
product_suffo="saved_by_${product}"
# plesk default password
PRODUCT_DEFAULT_PASSWORD="setup"
}
read_conf()
{
[ -n "$prod_conf_t" ] || prod_conf_t=/etc/psa/psa.conf
if [ -s $prod_conf_t ]; then
tmp_var=`perl -e 'undef $/; $_=<>; s/#.*$//gm;
s/^\s*(\S+)\s*/$1=/mg;
print' $prod_conf_t`
eval $tmp_var
else
if ! is_product_installation; then
p_echo "Unable to find product configuration file: $prod_conf_t. Default values will be used."
return 1
fi
fi
return 0
}
### Copyright 1999-2025. WebPros International GmbH. All rights reserved.
# vim:ft=sh:
#set_params
set_common_params()
{
common_var=0
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
LANG="`get_default_locale`"
export PATH LANG
unset GREP_OPTIONS
umask 022
ulimit -n 65535 2>/dev/null
get_product_versions
certificate_file="$PRODUCT_ETC_D/httpsd.pem"
services="/etc/services"
crontab="/usr/bin/crontab"
SYSTEM_RC_D="/etc/init.d"
PLESK_LIBEXEC_DIR="/usr/lib/plesk-9.0"
PLESK_DB_DIR="/var/lib/plesk"
PRODUCT_BOOTSTRAPPER_DIR="`printf "/opt/psa/bootstrapper/pp%s-bootstrapper" "$product_this_version"`"
AUTOGENERATED_CONFIGS="#ATTENTION!\n#\n#DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY,\n#SO ALL YOUR CHANGES WILL BE LOST THE NEXT TIME THE FILE IS GENERATED.\n"
AUTOGENERATED_CONFIGS_UPGRADE="#ATTENTION!\n#\n#DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY,\n#SO ALL YOUR CHANGES WILL BE LOST AFTER YOU UPGRADE PLESK.\n"
PRODUCT_LOGS_D="/var/log/plesk"
sendmail="/usr/sbin/sendmail"
ps="ps axw"
ifconfig="/sbin/ifconfig -a"
machine="linux"
if [ -f /etc/debian_version ]; then
linux_distr="debian"
else
linux_distr="redhat"
fi
dummy_home="/"
if [ -x /usr/sbin/nologin ]; then
dummy_shell="/usr/sbin/nologin"
else
dummy_shell="/bin/false"
fi
rp_patch_runtime
}
get_product_versions()
{
# Don't use global variables set elsewhere in this code. Use substitutions if needed.
local prod_root_d="/opt/psa"
product_name="psa"
if [ -z "$product_this_version" ]; then
# 1. Try to fetch version from file created by bootstrapper (should be 3-component).
product_this_version="`cat "/var/lock/plesk-target-version" 2>/dev/null`"
# 2. Fallback to $PRODUCT_ROOT_D/version (should be 3-component).
if [ -z "$product_this_version" -a -r "$prod_root_d/version" ]; then
product_this_version="`awk '{ print $1 }' "$prod_root_d/version"`"
fi
# 3. Fallback to hardcoded version (2-component). This may cause some other code to fail.
if [ -z "$product_this_version" ]; then
product_this_version="18.0"
echo "Unable to determine \$product_this_version, will use less precise value '$product_this_version'" >&2
fi
fi
product_version="$product_this_version"
if [ -z "$product_prev_version" ]; then
if [ -r "$prod_root_d/version.upg" ]; then
product_prev_version=`awk '{ print $1 }' "$prod_root_d/version.upg"`
elif [ -r "$prod_root_d/version" ]; then
product_prev_version=`awk '{ print $1 }' "$prod_root_d/version"`
else
product_prev_version="$product_this_version"
fi
fi
}
# Clean installation of the product is being performed
is_product_installation()
{
[ "X$do_upgrade" != "X1" -a ! -s "/opt/psa/version.upg" ]
}
### Copyright 1999-2025. WebPros International GmbH. All rights reserved.
### This is a compatibility wrapper for legacy monolithic mailmng.
### Serves only to avoid breaking any third-party code. Plesk does not and
### must not use this utility.
###
### Since this is a compatibility wrapper, adding *new* commands to it is not
### necessarry and even bad, since this will slow down the transition.
# --- command and utility definitions ---
MAILMNG_CORE_COMMANDS="
--add-mailname
--remove-mailname
--rename-mailname
--add-mailbox
--remove-mailbox
--set-password
--add-alias
--remove-alias
--add-domain
--remove-domain
--rename-domain
--turn-on-domain
--turn-off-domain
--add-domain-alias
--del-domain-alias
--rename-domain-alias
--get-mailbox-size
--set-mailbox-disk-quota
--set-domain-disk-quota
"
MAILMNG_BLACK_WHITE_COMMANDS="
--add-badmailfrom
--remove-badmailfrom
--add-whitelist
--remove-whitelist
"
MAILMNG_DOMAIN_COMMANDS="
--set-bounce
--set-catchall
--set-reject
--unset-reject
--set-domain-key
--remove-domain-key
--add-domain-to-sender-transport
--remove-domain-from-sender-transport
--remove-sender-transport
"
MAILMNG_MAILNAME_COMMANDS="
--add-redirect
--remove-redirect
--set-autoresponder
--reset-autoresponder
--list-attachments
--add-attachment
--remove-attachment
"
MAILMNG_SERVER_COMMANDS="
--set-maps-protection
--update-spf
--features
--set-max-letter-size
--get-max-letter-size
--set-mail-params
--get-mailbox-size-limit
--add-recipient-address-mapper
"
MAILMNG_SERVICE_COMMANDS="
--start-service
--stop-service
--restart-service
--reload-service
--status-service
"
HELP_COMMANDS="
-h
--help
--help-commands
--help-legacy
--help-stdin
"
DROPPED_COMMANDS="
--add-blacklist --remove-blacklist
--add-handler --update-handler --remove-handler --disable-handler --enable-handler --check-handler
--without-restart
--start-smtpd --stop-smtpd --restart-smtpd --status-smtpd
--start-qmail-send --stop-qmail-send
--start-maild --stop-maild --restart-maild --status-maild
--start-milter --stop-milter --restart-milter --status-milter
"
UTILITIES="
mailmng-black-white
mailmng-core
mailmng-domain
mailmng-mailname
mailmng-server
mailmng-service
"
# --- initialization ---
product_log="/dev/stderr"
product_problems_log="$product_log"
problems_occured=0
bootstrapper_mode_file="/tmp/pp-bootstrapper-mode.flag"
product_default_conf
initial_conf
set_common_params
read_conf
command="$1"
# --- help ---
usage()
{
if [ -n "$*" ]; then
echo "ERROR: $*" >&2
echo >&2
fi
echo "Usage: mailmng <COMMAND> <COMMAND OPTIONS...>" >&2
echo >&2
echo "WARNING: you are using legacy mailmng compatibility wrapper." >&2
echo "Please use one of the following utilities instead in the future: `echo \"$UTILITIES\" | sed -e 's/^/ /'`" >&2
echo "This wrapper suppresses any supplied STDIN. If you're getting errors like" >&2
echo "'Failed to read and parse session mail data from STDIN.' then you should use one of the" >&2
echo "utilities mentioned above and supply valid STDIN. See also --help-stdin option." >&2
echo "Next time consider using Plesk CLI utilities or API instead of relying on its internals." >&2
exit 2
}
[ -n "$command" ] || usage
for cmd in $HELP_COMMANDS; do
if [ "$cmd" = "$command" ]; then
usage
fi
done
for cmd in $DROPPED_COMMANDS; do
if [ "$cmd" = "$command" ]; then
if [ -f "$bootstrapper_mode_file" ]; then
echo "Command '$0 $@' was skipped as it is not supported anymore." >&2
exit 0
else
usage "$command command is no longer supported. Please use other equivalents available among Plesk mail utilities."
fi
fi
done
# --- proxy call to appropriate utility ---
for utility in $UTILITIES; do
eval "commands=$`echo $utility | tr 'a-z-' 'A-Z_'`_COMMANDS"
for cmd in $commands; do
if [ "$cmd" = "$command" ]; then
exec "$PRODUCT_ROOT_D/admin/sbin/$utility" "$@" < /dev/null
fi
done
done
usage "Unknown command: $command"