install_postfix_advanced.sh: add support for update postfix configuration - not only initial install.
This commit is contained in:
parent
15d4247fb3
commit
a277586090
@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
working_dir="$(dirname $(realpath $0))"
|
||||
conf_file="${working_dir}/conf//install_postfix_advanced.conf"
|
||||
conf_file="${working_dir}/conf/install_postfix_advanced.conf"
|
||||
|
||||
|
||||
_TLS_CERT_DIR=/etc/postfix/ssl
|
||||
@ -11,14 +11,15 @@ _TLS_KEY_FILE="${_TLS_CERT_DIR}/mailserver.key"
|
||||
|
||||
_TLS_CA_FILE=/etc/ssl/certs/ca-certificates.crt
|
||||
|
||||
postfix_master_cf="/etc/postfix/master.cf"
|
||||
postfix_conf_dir="/etc/postfix"
|
||||
postfix_master_cf="${postfix_conf_dir}/master.cf"
|
||||
postfix_spool_dir="/var/spool/postfix"
|
||||
|
||||
postgrey_socket_dir="${postfix_spool_dir}/postgrey"
|
||||
postgrey_socket_file="${postgrey_socket_dir}/postgrey.sock"
|
||||
|
||||
|
||||
tmp_err_msg=$(mktemp)
|
||||
log_file=$(mktemp)
|
||||
backup_date="$(date +%Y-%m-%d-%H%M)"
|
||||
|
||||
# -------------
|
||||
@ -27,7 +28,7 @@ backup_date="$(date +%Y-%m-%d-%H%M)"
|
||||
clean_up() {
|
||||
|
||||
# Perform program exit housekeeping
|
||||
rm -f $tmp_err_msg
|
||||
rm -f $log_file
|
||||
exit $1
|
||||
}
|
||||
|
||||
@ -120,7 +121,11 @@ trap clean_up SIGHUP SIGINT SIGTERM
|
||||
# --- Some default settings
|
||||
# -------------
|
||||
|
||||
# - Default Values
|
||||
# -
|
||||
DEFAULT_ADMIN_EMAIL="argus@oopen.de"
|
||||
DEFAULT_IS_RELAY_HOST=false
|
||||
DEFAULT_IS_SYMPA_LIST_SERVER=no
|
||||
|
||||
|
||||
# - Is this a systemd system?
|
||||
@ -141,10 +146,6 @@ echo ""
|
||||
# -
|
||||
detect_os_1
|
||||
|
||||
# - Default Values
|
||||
# -
|
||||
#_IS_RELAY_HOST=false
|
||||
|
||||
# - Read Configuration File if exists
|
||||
# -
|
||||
if [[ -f "$conf_file" ]]; then
|
||||
@ -152,8 +153,12 @@ if [[ -f "$conf_file" ]]; then
|
||||
fi
|
||||
|
||||
[[ -z "$_ADMIN_EMAIL" ]] && _ADMIN_EMAIL="$DEFAULT_ADMIN_EMAIL"
|
||||
[[ -z "$_IS_SYMPA_LIST_SERVER" ]] && _IS_SYMPA_LIST_SERVER="$DEFAULT_IS_SYMPA_LIST_SERVER"
|
||||
[[ -z "$_IS_RELAY_HOST" ]] && _IS_RELAY_HOST=$DEFAULT_IS_RELAY_HOST
|
||||
|
||||
|
||||
echo ""
|
||||
echo "_IS_RELAY_HOST: $_IS_RELAY_HOST"
|
||||
echo ""
|
||||
|
||||
# -------------
|
||||
# --- Set default values for some non existent variables (i.e. no configuration file is present)
|
||||
@ -166,7 +171,7 @@ if [[ -z "$_HOSTNAME" ]] ; then
|
||||
fi
|
||||
|
||||
|
||||
clear
|
||||
#clear
|
||||
echo -e "\033[21G\033[32mInstallation script for Postfix basic mailsystem \033[m"
|
||||
echo
|
||||
|
||||
@ -264,6 +269,8 @@ echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "How will this Mailserver be used?"
|
||||
echo ""
|
||||
echo "_IS_RELAY_HOST: $_IS_RELAY_HOST"
|
||||
echo ""
|
||||
if [[ -n "$_IS_RELAY_HOST" ]]; then
|
||||
if $_IS_RELAY_HOST ; then
|
||||
echo "[1] Complete Mailserver (with mailboxes)"
|
||||
@ -339,6 +346,42 @@ if $IS_RELAY_HOST ; then
|
||||
|
||||
done
|
||||
|
||||
IS_SYMPA_LIST_SERVER=""
|
||||
echo ""
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Are Sympa List Services provided? - [yes/no]"
|
||||
echo ""
|
||||
|
||||
echononl "Sympa List Server? [$_IS_SYMPA_LIST_SERVER]: "
|
||||
read IS_SYMPA_LIST_SERVER
|
||||
if [[ -z "${IS_SYMPA_LIST_SERVER}" ]] ; then
|
||||
IS_SYMPA_LIST_SERVER=false
|
||||
fi
|
||||
IS_SYMPA_LIST_SERVER=${IS_SYMPA_LIST_SERVER,,}
|
||||
|
||||
while [[ "$IS_SYMPA_LIST_SERVER" != "yes" && "$IS_SYMPA_LIST_SERVER" != "true" \
|
||||
&& "$IS_SYMPA_LIST_SERVER" != "no" && "$IS_SYMPA_LIST_SERVER" != "false" ]]; do
|
||||
|
||||
echo -e "\n\t\033[33m\033[1mWrong value was given!!\033[m\n"
|
||||
|
||||
echononl "Sympa List Server? [$_IS_SYMPA_LIST_SERVER]: "
|
||||
read IS_SYMPA_LIST_SERVER
|
||||
if [[ -z "${IS_SYMPA_LIST_SERVER}" ]] ; then
|
||||
IS_SYMPA_LIST_SERVER=false
|
||||
fi
|
||||
IS_SYMPA_LIST_SERVER=${IS_SYMPA_LIST_SERVER,,}
|
||||
|
||||
done
|
||||
|
||||
if [[ "$IS_SYMPA_LIST_SERVER" = 'yes' || "$IS_SYMPA_LIST_SERVER" = 'true' ]] ; then
|
||||
IS_SYMPA_LIST_SERVER=true
|
||||
else
|
||||
IS_SYMPA_LIST_SERVER=false
|
||||
fi
|
||||
|
||||
else
|
||||
IS_SYMPA_LIST_SERVER=false
|
||||
fi
|
||||
|
||||
|
||||
@ -380,6 +423,8 @@ if $IS_RELAY_HOST ; then
|
||||
echo -e "\tConfigure as relay host?..........: \033[33m\033[1m$IS_RELAY_HOST\033[m"
|
||||
echo -e "\tConfigure as complete mailserver..: false"
|
||||
echo ""
|
||||
echo -e "\tConfigure as sympa list server?...: $IS_SYMPA_LIST_SERVER"
|
||||
echo ""
|
||||
echo -e "\tSupport Cyrus SASL authentication.: $SASL_AUTH_ENABLED"
|
||||
else
|
||||
echo -e "\tConfigure as relay host?..........: $IS_RELAY_HOST"
|
||||
@ -419,6 +464,7 @@ fi
|
||||
if $IS_RELAY_HOST ; then
|
||||
cat << EOF >> $conf_file
|
||||
_SASL_AUTH_ENABLED=$SASL_AUTH_ENABLED
|
||||
_IS_SYMPA_LIST_SERVER=$IS_SYMPA_LIST_SERVER
|
||||
EOF
|
||||
fi
|
||||
if [[ $? -ne 0 ]]; then
|
||||
@ -436,12 +482,12 @@ fi
|
||||
# - Synchronise package index files with the repository
|
||||
# -
|
||||
echononl " Synchronise package index files with the repository.."
|
||||
apt-get update > "$tmp_err_msg" 2>&1
|
||||
apt-get update > "$log_file" 2>&1
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
|
||||
@ -504,12 +550,12 @@ if [[ "$os_dist" = "debian" ]] && [[ $os_version -ne 10 ]] ; then
|
||||
if aptitude search $_pkg | grep " $_pkg " | grep -e "^i" > /dev/null 2>&1 ; then
|
||||
echo_skipped
|
||||
else
|
||||
DEBIAN_FRONTEND=noninteractive apt-get -y install $_pkg > /dev/null 2> $tmp_err_msg
|
||||
DEBIAN_FRONTEND=noninteractive apt-get -y install $_pkg > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -518,17 +564,17 @@ if [[ "$os_dist" = "debian" ]] && [[ $os_version -ne 10 ]] ; then
|
||||
# postgrey as tcp/ip socket
|
||||
#
|
||||
#perl -i -n -p -e "s#^(\s*)(POSTGREY_OPTS=.*)#\#\1\2\nPOSTGREY_OPTS=\"--inet=127.0.0.1:10023 --delay=149 --auto-whitelist-clients=3 --lookup-by-subnet\"#" \
|
||||
# /etc/default/postgrey > $tmp_err_msg 2>&1
|
||||
# /etc/default/postgrey > $log_file 2>&1
|
||||
|
||||
# postgrey as unix socket
|
||||
#
|
||||
perl -i -n -p -e "s#^(\s*)(POSTGREY_OPTS=.*)#\#\1\2\nPOSTGREY_OPTS=\"--unix=/var/spool/postfix/postgrey/postgrey.sock --delay=149 --auto-whitelist-clients=3 --lookup-by-subnet\"#" \
|
||||
/etc/default/postgrey > $tmp_err_msg 2>&1
|
||||
/etc/default/postgrey > $log_file 2>&1
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
echononl " Create /etc/postgrey/whitelist_clients.local (additional whitelist entries)"
|
||||
@ -552,12 +598,12 @@ EOF
|
||||
if [[ -d "${postgrey_socket_dir}" ]]; then
|
||||
echo_skipped
|
||||
else
|
||||
mkdir "${postgrey_socket_dir}" > /dev/null 2> $tmp_err_msg
|
||||
mkdir "${postgrey_socket_dir}" > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
|
||||
echononl "\tcontinue anyway [yes/no]: "
|
||||
read OK
|
||||
@ -572,12 +618,12 @@ EOF
|
||||
fi
|
||||
|
||||
echononl " Set ownership on directory '${postgrey_socket_dir}'.."
|
||||
chown -R postgrey:postgrey ${postgrey_socket_dir} 2> $tmp_err_msg
|
||||
chown -R postgrey:postgrey ${postgrey_socket_dir} 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
|
||||
echononl "\tcontinue anyway [yes/no]: "
|
||||
read OK
|
||||
@ -592,12 +638,12 @@ EOF
|
||||
|
||||
echononl " Enable Postgrey service at boot time.."
|
||||
if $systemd_exists ; then
|
||||
systemctl enable networking >/dev/null 2> $tmp_err_msg
|
||||
systemctl enable networking >/dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -607,20 +653,20 @@ EOF
|
||||
|
||||
echononl " Restart postrey daemon"
|
||||
if $systemd_exists ; then
|
||||
systemctl restart postgrey > /dev/null 2> $tmp_err_msg
|
||||
systemctl restart postgrey > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
/etc/init.d/postgrey restart > /dev/null 2> $tmp_err_msg
|
||||
/etc/init.d/postgrey restart > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -635,18 +681,18 @@ else
|
||||
if aptitude search $_pkg | grep " $_pkg " | grep -e "^i" > /dev/null 2>&1 ; then
|
||||
echo_skipped
|
||||
else
|
||||
DEBIAN_FRONTEND=noninteractive apt-get -y install $_pkg > /dev/null 2> $tmp_err_msg
|
||||
DEBIAN_FRONTEND=noninteractive apt-get -y install $_pkg > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
fi
|
||||
|
||||
echononl " Add entry for 'tumgreyspf' at end of file '$postfix_master_cf"
|
||||
if ! $(grep -iq -E "^\s*tumgreyspf\s+" 2>/dev/null $postfix_master_cf) ; then
|
||||
cat <<EOF >> /etc/postfix/master.cf 2> $tmp_err_msg
|
||||
cat <<EOF >> $postfix_master_cf 2> $log_file
|
||||
|
||||
# This is tumgreyspf, an external policy checker for the postfix mail server.
|
||||
# It can optionally greylist and/or use spfquery to check SPF records to
|
||||
@ -666,7 +712,7 @@ EOF
|
||||
|
||||
echononl " Create configuration file for whitelisting: /etc/tumgreyspf/disable.conf"
|
||||
if [[ ! -f /etc/tumgreyspf/disable.conf ]] ; then
|
||||
cat <<EOF > "/etc/tumgreyspf/disable.conf" 2> $tmp_err_msg
|
||||
cat <<EOF > "/etc/tumgreyspf/disable.conf" 2> $log_file
|
||||
SPFSEEDONLY=0
|
||||
GREYLISTTIME=300
|
||||
CHECKERS=
|
||||
@ -676,7 +722,7 @@ EOF
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -685,21 +731,21 @@ EOF
|
||||
_failed=false
|
||||
echononl " Whitelist tor hidde service '127.0.0.25'.."
|
||||
if [[ ! -d "/var/lib/tumgreyspf/config/client_address/127/0/0/" ]] ; then
|
||||
mkdir -p /var/lib/tumgreyspf/config/client_address/127/0/0/ 2> $tmp_err_msg
|
||||
mkdir -p /var/lib/tumgreyspf/config/client_address/127/0/0/ 2> $log_file
|
||||
if [[ $? -ne 0 ]]; then
|
||||
_failed=true
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -L /var/lib/tumgreyspf/config/client_address/127/0/0/25 ]]; then
|
||||
ln -s /etc/tumgreyspf/disable.conf /var/lib/tumgreyspf/config/client_address/127/0/0/25 2>> $tmp_err_msg
|
||||
ln -s /etc/tumgreyspf/disable.conf /var/lib/tumgreyspf/config/client_address/127/0/0/25 2>> $log_file
|
||||
fi
|
||||
if [[ $? -ne 0 ]]; then
|
||||
_failed=true
|
||||
fi
|
||||
if $_failed ; then
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
@ -714,7 +760,7 @@ EOF
|
||||
_setup_file="/etc/tumgreyspf/default.conf"
|
||||
echononl " Setup defaults for tumgreyspf: $_setup_key .."
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=" "$_setup_file") ; then
|
||||
cat <<EOF >> "$_setup_file" 2> $tmp_err_msg
|
||||
cat <<EOF >> "$_setup_file" 2> $log_file
|
||||
|
||||
# Added by script $(basename $0) at $(date +%Y-%m-%d)
|
||||
$_setup_key = $_setup_val
|
||||
@ -723,17 +769,17 @@ EOF
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
else
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=\s*0$" "$_setup_file") ; then
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $tmp_err_msg
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -745,7 +791,7 @@ EOF
|
||||
_setup_file="/etc/tumgreyspf/default.conf"
|
||||
echononl " Setup defaults for tumgreyspf: $_setup_key .."
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=" "$_setup_file") ; then
|
||||
cat <<EOF >> "$_setup_file" 2> $tmp_err_msg
|
||||
cat <<EOF >> "$_setup_file" 2> $log_file
|
||||
|
||||
# Added by script $(basename $0) at $(date +%Y-%m-%d)
|
||||
$_setup_key = $_setup_val
|
||||
@ -754,17 +800,17 @@ EOF
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
else
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=\s*${_setup_val/}$" "$_setup_file") ; then
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $tmp_err_msg
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -776,7 +822,7 @@ EOF
|
||||
_setup_file="/etc/tumgreyspf/default.conf"
|
||||
echononl " Setup defaults for tumgreyspf: $_setup_key .."
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=" "$_setup_file") ; then
|
||||
cat <<EOF >> "$_setup_file" 2> $tmp_err_msg
|
||||
cat <<EOF >> "$_setup_file" 2> $log_file
|
||||
|
||||
# Added by script $(basename $0) at $(date +%Y-%m-%d)
|
||||
$_setup_key = $_setup_val
|
||||
@ -785,17 +831,17 @@ EOF
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
else
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=\s*${_setup_val/}$" "$_setup_file") ; then
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $tmp_err_msg
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -807,7 +853,7 @@ EOF
|
||||
_setup_file="/etc/tumgreyspf/default.conf"
|
||||
echononl " Setup defaults for tumgreyspf: $_setup_key .."
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=" "$_setup_file") ; then
|
||||
cat <<EOF >> "$_setup_file" 2> $tmp_err_msg
|
||||
cat <<EOF >> "$_setup_file" 2> $log_file
|
||||
|
||||
# Added by script $(basename $0) at $(date +%Y-%m-%d)
|
||||
$_setup_key = $_setup_val
|
||||
@ -816,17 +862,17 @@ EOF
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
else
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=\s*${_setup_val/}$" "$_setup_file") ; then
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $tmp_err_msg
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -838,7 +884,7 @@ EOF
|
||||
_setup_file="/etc/tumgreyspf/default.conf"
|
||||
echononl " Setup defaults for tumgreyspf: $_setup_key .."
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=" "$_setup_file") ; then
|
||||
cat <<EOF >> "$_setup_file" 2> $tmp_err_msg
|
||||
cat <<EOF >> "$_setup_file" 2> $log_file
|
||||
|
||||
# Added by script $(basename $0) at $(date +%Y-%m-%d)
|
||||
$_setup_key = $_setup_val
|
||||
@ -847,17 +893,17 @@ EOF
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
else
|
||||
if ! $(grep -iq -E "^\s*${_setup_key}\s*=\s*${_setup_val/}$" "$_setup_file") ; then
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $tmp_err_msg
|
||||
perl -i -n -p -e "s/(\s*${_setup_key}.*)/#\1\n${_setup_key} = $_setup_val/" "$_setup_file" 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -876,23 +922,23 @@ _pkg="postfwd"
|
||||
if aptitude search $_pkg | grep " $_pkg " | grep -e "^i" > /dev/null 2>&1 ; then
|
||||
echo_skipped
|
||||
else
|
||||
DEBIAN_FRONTEND=noninteractive apt-get -y install $_pkg > /dev/null 2> $tmp_err_msg
|
||||
DEBIAN_FRONTEND=noninteractive apt-get -y install $_pkg > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
fi
|
||||
|
||||
echononl " Adjust /etc/default/postfwd"
|
||||
perl -i -n -p -e "s#^(\s*)(STARTUP=.*)#\#\1\2\nSTARTUP=1#" \
|
||||
/etc/default/postfwd > $tmp_err_msg 2>&1
|
||||
/etc/default/postfwd > $log_file 2>&1
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
_file="/etc/postfix/postfwd.wl-nets"
|
||||
@ -1325,39 +1371,39 @@ fi
|
||||
|
||||
echononl " Enable Postfix firewall daemon at boot time .."
|
||||
if $systemd_exists ; then
|
||||
systemctl enable postfwd > /dev/null 2> $tmp_err_msg
|
||||
systemctl enable postfwd > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
update-rc.d postfwd defaults > /dev/null 2> $tmp_err_msg
|
||||
update-rc.d postfwd defaults > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
fi
|
||||
|
||||
echononl " Restart Postfix firewall daemon 'postfwd'.."
|
||||
if $systemd_exists ; then
|
||||
systemctl restart postfwd > /dev/null 2> $tmp_err_msg
|
||||
systemctl restart postfwd > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
/etc/init.d/postfwd restart > /dev/null 2> $tmp_err_msg
|
||||
/etc/init.d/postfwd restart > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -1387,6 +1433,21 @@ cat <<EOF > /etc/postfix/main.cf
|
||||
# Disable backwards compatibility
|
||||
compatibility_level = 2
|
||||
|
||||
# With "smtputf8_enable = yes", Postfix requires that non-ASCII address information
|
||||
# is encoded in UTF-8 and will reject other encodings such as ISO-8859. It is not
|
||||
# practical for Postfix to support multiple encodings at the same time. There is no
|
||||
# problem with RFC 2047 encodings such as "=?ISO-8859-1?Q?text?=", because those use
|
||||
# only characters from the ASCII characterset.
|
||||
#smtputf8_enable = no
|
||||
EOF
|
||||
if $IS_SYMPA_LIST_SERVER ; then
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
smtputf8_enable = no
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
|
||||
|
||||
# Debian specific: Specifying a file name will cause the first
|
||||
# line of that file to be used as the name. The Debian default
|
||||
@ -1579,6 +1640,15 @@ sender_canonical_maps = btree:/etc/postfix/sender_canonical
|
||||
transport_maps =
|
||||
btree:/etc/postfix/transport
|
||||
btree:/etc/postfix/relay_domains
|
||||
EOF
|
||||
|
||||
if $IS_SYMPA_LIST_SERVER ; then
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
regexp:/etc/postfix/sympa_transport
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
|
||||
## - The maximal time a message is queued before it is sent back as
|
||||
## - undeliverable. Defaults to 5d (5 days)
|
||||
@ -1622,10 +1692,31 @@ prepend_delivered_header =
|
||||
# ============ Relay parameters ============
|
||||
|
||||
relayhost =
|
||||
|
||||
EOF
|
||||
|
||||
if $IS_SYMPA_LIST_SERVER ; then
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
sympa_destination_recipient_limit = 1
|
||||
|
||||
sympabounce_destination_recipient_limit = 1
|
||||
|
||||
relay_domains =
|
||||
\$mydestination
|
||||
btree:/etc/postfix/relay_domains
|
||||
btree:/etc/postfix/sympa_domains
|
||||
|
||||
EOF
|
||||
else
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
relay_domains =
|
||||
\$mydestination
|
||||
btree:/etc/postfix/relay_domains
|
||||
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
|
||||
# ============ TLS parameters ============
|
||||
|
||||
@ -1915,6 +2006,15 @@ virtual_mailbox_domains =
|
||||
## - manipulations see the ADDRESS_REWRITING_README document.
|
||||
## -
|
||||
virtual_alias_maps =
|
||||
EOF
|
||||
|
||||
if $IS_SYMPA_LIST_SERVER ; then
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
regexp:/etc/postfix/sympa_virtual_aliases
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
## - mailman
|
||||
#hash:/var/lib/mailman/data/virtual-mailman
|
||||
|
||||
@ -2140,7 +2240,19 @@ cat <<EOF >> /etc/postfix/main.cf
|
||||
# The time limit for all external commands is controlled by command_time_limit
|
||||
#
|
||||
#
|
||||
EOF
|
||||
|
||||
if [[ -n "$(which postfwd)" ]] ; then
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
127.0.0.1:10040_time_limit = 3600
|
||||
EOF
|
||||
else
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
#127.0.0.1:10040_time_limit = 3600
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
|
||||
|
||||
# smtpd_delay_reject (default: yes)
|
||||
@ -2390,6 +2502,34 @@ smtpd_end_of_data_restrictions =
|
||||
check_policy_service inet:127.0.0.1:10040
|
||||
|
||||
EOF
|
||||
|
||||
if [[ -n "$(which opendkim)" ]] ; then
|
||||
cat <<EOF >> /etc/postfix/main.cf
|
||||
|
||||
# ======= Milter configuration =======
|
||||
|
||||
# OpenDKIM
|
||||
|
||||
milter_default_action = accept
|
||||
|
||||
# Postfix ≥ 2.6 milter_protocol = 6, Postfix ≤ 2.5 milter_protocol = 2
|
||||
milter_protocol = 6
|
||||
|
||||
# Note:
|
||||
# We will sign AFTER sending through AmaVIS, just befor sending out. So
|
||||
# set 'smtpd_milters =' to an emty string here and add to localhost:10025
|
||||
# section in master.cf: 'smtpd_milters=local:/opendkim/opendkim.sock'
|
||||
#
|
||||
# If you want sign mails before sending through AmaVIS, set
|
||||
# 'smtpd_milters = local:/opendkim/opendkim.sock' here and add to
|
||||
# localhost:10025 section in master.cf: 'smtpd_milters='
|
||||
#
|
||||
#smtpd_milters = local:/opendkim/opendkim.sock
|
||||
smtpd_milters =
|
||||
non_smtpd_milters = local:/opendkim/opendkim.sock
|
||||
EOF
|
||||
|
||||
|
||||
echo_ok
|
||||
|
||||
|
||||
@ -2408,12 +2548,12 @@ fi
|
||||
|
||||
echononl " Backup existing file '/etc/aliases'"
|
||||
if [[ -f /etc/aliases ]] ; then
|
||||
mv /etc/aliases "/etc/aliases.$backup_date" > $tmp_err_msg 2>&1
|
||||
mv /etc/aliases "/etc/aliases.$backup_date" > $log_file 2>&1
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -2624,7 +2764,7 @@ if [[ ! -f /etc/postfix/transport ]]; then
|
||||
cat <<EOF > /etc/postfix/transport
|
||||
# - Force sending through IPv4
|
||||
# -
|
||||
# - Take care your master.cf file (/etc/postfix/master.cf) contains:
|
||||
# - Take care your master.cf file ($postfix_master_cf) contains:
|
||||
# -
|
||||
# - smtp-ipv4-only unix - - n - - smtp
|
||||
# - -o inet_protocols=ipv4
|
||||
@ -2633,7 +2773,7 @@ if [[ ! -f /etc/postfix/transport ]]; then
|
||||
|
||||
# - Force sending through IPv6
|
||||
# -
|
||||
# - Take care your master.cf file (/etc/postfix/master.cf) contains:
|
||||
# - Take care your master.cf file ($postfix_master_cf) contains:
|
||||
# -
|
||||
# - smtp-ipv6-only unix - - n - - smtp
|
||||
# - -o inet_protocols=ipv6
|
||||
@ -2745,29 +2885,8 @@ if [[ ! -f "$_file" ]]; then
|
||||
/\(envelope-from <>\)/ REJECT Possible SPAM - Header-Spamschutzregel RECIEV-1001
|
||||
|
||||
/^Reply-To: .+\@inx1and1\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1001
|
||||
/^Reply-To: .+\@ppe-healthcare-europe\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1002
|
||||
/^Reply-To: .+\@testbedarf.shop/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1003
|
||||
/^Reply-To: .+\@acieu\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1004
|
||||
/^Reply-To: .+\@acievents\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1005
|
||||
/^Reply-To: .+\@dokpotenz\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1006
|
||||
/^Reply-To: .+\@doktorapo\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1007
|
||||
/^Reply-To: .+\@sendelope.eu/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1008
|
||||
/^Reply-To: .+\@team-de-luxe\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1009
|
||||
/^Reply-To: .+\@klickensiejetzt\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1010
|
||||
/^Reply-To: .+\@podiumskate\..+/ REJECT Possible SPAM - Header-Spamschutzregel REPLY-1011
|
||||
|
||||
/^From:.*<>/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1001
|
||||
/^From: .+\@inx1and1\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1002
|
||||
/^From: .+\@ppe-healthcare-europe\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1003
|
||||
/^From: .+\@testbedarf.shop/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1004
|
||||
/^From: .+\@acieu\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1005
|
||||
/^From: .+\@acievents\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1006
|
||||
/^From: .+\@dokpotenz\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1007
|
||||
/^From: .+\@doktorapo\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1008
|
||||
/^From: .+\@sendelope.eu/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1009
|
||||
/^From: .+\@team-de-luxe\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1010
|
||||
/^From: .+\@klickensiejetzt\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1011
|
||||
/^From: .+\@podiumskate\..+/ REJECT Possible SPAM - Header-Spamschutzregel FROM-1012
|
||||
|
||||
/^Date: .* 19[0-9][0-9]/ REJECT Date from the past. Fix your system clock. - Header-Spamschutzregel DATE-1001
|
||||
/^Date: .* 200[0-9]/ REJECT Date from the past. Fix your system clock. - Header-Spamschutzregel DATE-1002
|
||||
@ -2828,6 +2947,56 @@ else
|
||||
fi
|
||||
|
||||
|
||||
if $IS_SYMPA_LIST_SERVER ; then
|
||||
|
||||
_file_name=sympa_domains
|
||||
echononl "\tCreate (empty) file \"$_file_name\".."
|
||||
if [ -f "${postfix_conf_dir}/$_file_name" ];then
|
||||
echo_skipped
|
||||
else
|
||||
touch ${postfix_conf_dir}/$_file_name > /dev/null 2>&1
|
||||
if [ "$?" = "0" ]; then
|
||||
echo_ok
|
||||
echononl "\tCreate concerning db-file \"${postfix_conf_dir}/${_file_name}.db\".."
|
||||
postmap btree:${postfix_conf_dir}/$_file_name > /dev/null 2>&1
|
||||
if [ "$?" = "0" ]; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
fi
|
||||
else
|
||||
echo_failed
|
||||
fi
|
||||
fi
|
||||
|
||||
_file_name=sympa_transport
|
||||
echononl "\tCreate (empty) file \"$_file_name\".."
|
||||
if [ -f "${postfix_conf_dir}/$_file_name" ];then
|
||||
echo_skipped
|
||||
else
|
||||
touch ${postfix_conf_dir}/$_file_name >> $_log_file 2>&1
|
||||
if [ "$?" = "0" ]; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
fi
|
||||
fi
|
||||
|
||||
_file_name=sympa_virtual_aliases
|
||||
echononl "\tCreate (empty) file \"$_file_name\".."
|
||||
if [ -f "${postfix_conf_dir}/$_file_name" ];then
|
||||
echo_skipped
|
||||
else
|
||||
touch ${postfix_conf_dir}/$_file_name >> $_log_file 2>&1
|
||||
if [ "$?" = "0" ]; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if ! $IS_RELAY_HOST ; then
|
||||
## - Create Directory '/var/vmail' for virtual mailboxes
|
||||
@ -2896,12 +3065,12 @@ else
|
||||
|
||||
echononl " Backup existing file '/etc/postfix/sasl/smtpd.conf'"
|
||||
if [[ -f /etc/postfix/sasl/smtpd.conf ]] ; then
|
||||
mv /etc/postfix/sasl/smtpd.conf "/etc/postfix/sasl/smtpd.conf.$backup_date" > $tmp_err_msg 2>&1
|
||||
mv /etc/postfix/sasl/smtpd.conf "/etc/postfix/sasl/smtpd.conf.$backup_date" > $log_file 2>&1
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
@ -2932,12 +3101,12 @@ fi
|
||||
## - and port 465 (smtps)
|
||||
## -
|
||||
echononl " Backup file \"${postfix_master_cf}\""
|
||||
cp -a $postfix_master_cf "${postfix_master_cf}.$backup_date" > /dev/null 2> $tmp_err_msg
|
||||
cp -a $postfix_master_cf "${postfix_master_cf}.$backup_date" > /dev/null 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $tmp_err_msg)"
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
|
||||
if grep -iq -E "^submission\s+" $postfix_master_cf > /dev/null 2>&1 ; then
|
||||
@ -3055,6 +3224,115 @@ else
|
||||
fi
|
||||
|
||||
|
||||
echononl " Adjust $postfix_master_cf. Set DKIM after sending throuh AmaVIS.."
|
||||
if [[ -n "$(which opendkim)" ]] ; then
|
||||
|
||||
_found=false
|
||||
_changed=false
|
||||
tmp_master_file="/tmp/postfix_master.cf"
|
||||
|
||||
> $tmp_master_file
|
||||
|
||||
while IFS='' read -r _line || [[ -n $_line ]] ; do
|
||||
|
||||
if $_found && ! echo "$_line" | grep -i -q -E "^\s*-o" 2> /dev/null ; then
|
||||
echo " -o smtpd_milters=local:/opendkim/opendkim.sock" >> "$tmp_master_file"
|
||||
_changed=true
|
||||
_found=false
|
||||
fi
|
||||
|
||||
if $_found && echo "$_line" | grep -i -q -E "^\s*-o\s+smtpd_milters=\s*" ; then
|
||||
_found=false
|
||||
fi
|
||||
|
||||
if echo "$_line" | grep -i -q -E "^\s*(127.0.0.1|localhost):10025\s+inet\s+" 2> /dev/null ; then
|
||||
_found=true
|
||||
fi
|
||||
|
||||
echo "$_line" >> "$tmp_master_file"
|
||||
|
||||
done < "$postfix_master_cf"
|
||||
|
||||
if $_changed ; then
|
||||
cp $tmp_master_file $postfix_master_cf 2> $log_file
|
||||
postfix_needs_restart=true
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
warn "Postfix (master.cf) seems already be configured."
|
||||
echononl " Delete previosly saved file '$postfix_master_cf'.."
|
||||
rm ${postfix_master_cf}.$backup_date 2> $log_file
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat $log_file)"
|
||||
fi
|
||||
fi
|
||||
rm -f $tmp_master_file
|
||||
else
|
||||
echo_skipped
|
||||
fi
|
||||
|
||||
|
||||
echononl " Adjust $postfix_master_cf to play with dovecot lda"
|
||||
if [[ -x "/usr/local/dovecot/libexec/dovecot/dovecot-lda" ]] ; then
|
||||
|
||||
|
||||
## - /etc/postfix/master.cf
|
||||
## -
|
||||
## - add line
|
||||
## - dovecot unix - n n - - pipe
|
||||
## - flags=drhu user=vmail:vmail argv=/usr/local/dovecot/libexec/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop}
|
||||
if ! grep -e dovecot-lda $postfix_master_cf > /dev/null ; then
|
||||
cp -a "$postfix_master_cf" "${postfix_master_cf}.$backup_date"
|
||||
echo -e "\ndovecot unix - n n - - pipe\n flags=drhu user=vmail:vmail argv=/usr/local/dovecot/libexec/dovecot/dovecot-lda -f \${sender} -d \${user}@\${nexthop}" >> $postfix_master_cf
|
||||
if [[ $? -eq 0 ]] ; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "Configuring $postfix_master_cf for use with dovecot-lda failed"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
fi
|
||||
|
||||
|
||||
echononl "\tAdd transport declaration for sympa domains to file master.cf"
|
||||
if $IS_SYMPA_LIST_SERVER ; then
|
||||
|
||||
if grep -q -e "^sympa\ " ${postfix_master_cf} 2>> /dev/null ; then
|
||||
echo_skipped
|
||||
else
|
||||
cat <<EOF >> ${postfix_master_cf}
|
||||
|
||||
sympa unix - n n - - pipe
|
||||
flags=FR user=sympa argv=${SYMPA_LIBEXEC_DIR}/queue \${recipient}
|
||||
sympabounce unix - n n - - pipe
|
||||
flags=FR user=sympa argv=${SYMPA_LIBEXEC_DIR}/bouncequeue \${user}
|
||||
|
||||
EOF
|
||||
|
||||
if [ "$?" = "0" ]; then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "Adding transport declaration for sympa domains to \"${postfix_master_cf}\" failed!"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
fi
|
||||
|
||||
|
||||
## - restart postfix
|
||||
## -
|
||||
echononl " Restart postfix"
|
||||
@ -3114,7 +3392,12 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "$(which amavisd-new)" ]] ; then
|
||||
|
||||
warn "You have to run \033[1minstall_amavis.sh\033[m script to continue the configuration."
|
||||
|
||||
fi
|
||||
|
||||
|
||||
rm $tmp_err_msg
|
||||
echo ""
|
||||
clean_up 0
|
||||
|
Loading…
Reference in New Issue
Block a user