Files
2026-05-12 17:21:52 +08:00

655 lines
28 KiB
Bash

#!/usr/bin/env bash
# Author: Zhang Huangbin <zhb _at_ iredmail.org>
#---------------------------------------------------------------------
# This file is part of iRedMail, which is an open source mail server
# solution for Red Hat(R) Enterprise Linux, CentOS, Debian and Ubuntu.
#
# iRedMail is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# iRedMail is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with iRedMail. If not, see <http://www.gnu.org/licenses/>.
#---------------------------------------------------------------------
install_all()
{
ALL_PKGS=''
PIP3_MODULES=''
ENABLED_SERVICES=''
DISABLED_SERVICES=''
# Specify version numbers while installing Python modules with pip.
PIP_VERSION_PYTHON_LDAP='>=3.3.1'
PIP_VERSION_REQUESTS='>=2.24.0'
PIP_VERSION_PYMYSQL='>=0.10.0'
PIP_VERSION_PSYCOPG2='>=2.8.5'
PIP_VERSION_PYCURL='>=7.43.0.5'
# OpenBSD only
if [ X"${DISTRO}" == X'OPENBSD' ]; then
PKG_SCRIPTS=''
OB_PKG_POSTFIX_FLAVOR="stable"
if [[ "${BACKEND}" == "PGSQL" ]]; then
# Workaround.
#
# postfix-3.7-sasl2-pgsql doesn't work with PostgreSQL. For example,
# `postmap` command always get `core dump` error like this:
#
# # postmap -q "<email>" pgsql:/etc/postfix/pgsql/virtual_mailbox_maps.cf
# postmap(76889) in free(): bogus pointer (double free?) 0x80
# Abort trap (core dumped)
OB_PKG_POSTFIX_FLAVOR="stable"
fi
OB_PKG_PHP_VER="%${OB_PHP_VERSION}"
OB_PKG_OPENLDAP_SERVER_VER='-2.6.10v0'
OB_PKG_OPENLDAP_CLIENT_VER='-2.6.10v0'
OB_UWSGI_VERSION='2.0.31'
fi
# Install PHP if there's a web server running -- php is too popular.
if [ X"${WEB_SERVER}" == X'NGINX' ]; then
export IREDMAIL_USE_PHP='YES'
fi
# Enable rsyslog on Linux.
if [ X"${KERNEL_NAME}" == X'LINUX' ]; then
ENABLED_SERVICES="${ENABLED_SERVICES} rsyslog"
DISABLED_SERVICES="${DISABLED_SERVICES} exim sendmail"
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} rsyslog firewalld"
ENABLED_SERVICES="${ENABLED_SERVICES} firewalld"
fi
fi
# Switch to php:8.2 on CentOS/Rocky/Alma 9.
if [ X"${DISTRO}" == X'RHEL' -a X"${DISTRO_VERSION}" == X'9' ]; then
# If `dnf module enable` failed, please follow command output to
# remove installed php and reset module 'php'.
dnf module enable -y php:8.2
dnf module switch-to -y php:8.2
fi
# Python 3.
if [ X"${DISTRO}" == X'RHEL' ]; then
# `python3` is 3.6. `python3-*` packages are bulit for Python 3.6.
ALL_PKGS="${ALL_PKGS} python3 python3-pip python3-pip-wheel python3-requests"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} python3-setuptools python3-pip python3-wheel python3-requests"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} py3-setuptools py3-pip py3-wheel py3-requests"
fi
# uwsgi.
# Required by mlmmjadmin, iredadmin.
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} uwsgi-logger-syslog uwsgi-plugin-python3 python3-passlib"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} uwsgi uwsgi-plugin-python3 python3-passlib"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} py3-passlib"
PIP3_MODULES="${PIP3_MODULES} ${PKG_MISC_DIR}/uwsgi-${OB_UWSGI_VERSION}.tar.gz"
fi
# Postfix.
ENABLED_SERVICES="${ENABLED_SERVICES} ${POSTFIX_RC_SCRIPT_NAME}"
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} postfix cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain"
# pcre support is required and available in iRedMail yum repo.
ALL_PKGS="${ALL_PKGS} postfix-pcre"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} postfix-ldap"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} postfix-mysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} postfix-pgsql"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
# libsasl2-modules is required for sasl auth (used by relay host which
# requires sasl auth)
ALL_PKGS="${ALL_PKGS} postfix postfix-pcre libsasl2-modules"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} postfix--sasl2-ldap%${OB_PKG_POSTFIX_FLAVOR}"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} postfix--sasl2-mysql%${OB_PKG_POSTFIX_FLAVOR}"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} postfix--sasl2-pgsql%${OB_PKG_POSTFIX_FLAVOR}"
fi
# Backend: OpenLDAP, MySQL, PGSQL and extra packages.
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
# OpenLDAP server & client.
ENABLED_SERVICES="${ENABLED_SERVICES} ${OPENLDAP_RC_SCRIPT_NAME} ${MYSQL_RC_SCRIPT_NAME}"
if [ X"${DISTRO}" == X'RHEL' ]; then
# openldap-servers is available in EPEL.
# openldap-clients is available in BaseOS repo.
ALL_PKGS="${ALL_PKGS} openldap-servers openldap-clients mariadb-server"
# Perl module
ALL_PKGS="${ALL_PKGS} perl-DBD-MariaDB"
# Python driver.
ALL_PKGS="${ALL_PKGS} python3-ldap"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} slapd ldap-utils postfix-ldap libnet-ldap-perl mariadb-server mariadb-client"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} openldap-server${OB_PKG_OPENLDAP_SERVER_VER}"
PKG_SCRIPTS="${PKG_SCRIPTS} ${OPENLDAP_RC_SCRIPT_NAME}"
ALL_PKGS="${ALL_PKGS} mariadb-server mariadb-client p5-ldap p5-DBD-MariaDB"
PKG_SCRIPTS="${PKG_SCRIPTS} ${MYSQL_RC_SCRIPT_NAME}"
fi
elif [ X"${BACKEND}" == X'MYSQL' ]; then
# MySQL server & client.
ENABLED_SERVICES="${ENABLED_SERVICES} ${MYSQL_RC_SCRIPT_NAME}"
if [ X"${DISTRO}" == X'RHEL' ]; then
# Install MySQL client
ALL_PKGS="${ALL_PKGS} mariadb"
if [ X"${USE_EXISTING_MYSQL}" != X'YES' ]; then
ALL_PKGS="${ALL_PKGS} mariadb-server"
fi
# Perl module
ALL_PKGS="${ALL_PKGS} perl-DBD-MariaDB"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
# MySQL server and client.
ALL_PKGS="${ALL_PKGS} mariadb-client"
if [ X"${USE_EXISTING_MYSQL}" != X'YES' ]; then
ALL_PKGS="${ALL_PKGS} mariadb-server"
fi
ALL_PKGS="${ALL_PKGS} postfix-mysql"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} mariadb-client"
if [ X"${USE_EXISTING_MYSQL}" != X'YES' ]; then
ALL_PKGS="${ALL_PKGS} mariadb-server p5-DBD-MariaDB"
PKG_SCRIPTS="${PKG_SCRIPTS} ${MYSQL_RC_SCRIPT_NAME}"
fi
fi
elif [ X"${BACKEND}" == X'PGSQL' ]; then
ENABLED_SERVICES="${ENABLED_SERVICES} ${PGSQL_RC_SCRIPT_NAME}"
# PGSQL server & client.
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} postgresql-server postgresql-contrib perl-DBD-Pg"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
# postgresql-contrib provides extension 'dblink' used in Roundcube password plugin.
ALL_PKGS="${ALL_PKGS} postgresql postgresql-client postgresql-contrib postfix-pgsql libdbd-pg-perl"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} postgresql-client postgresql-server postgresql-contrib p5-DBD-Pg"
PKG_SCRIPTS="${PKG_SCRIPTS} ${PGSQL_RC_SCRIPT_NAME}"
fi
fi
# PHP
if [ X"${IREDMAIL_USE_PHP}" == X'YES' ]; then
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} php-cli php-common php-fpm php-gd php-xml php-mysqlnd php-ldap php-pgsql php-mbstring php-pecl-apcu php-intl php-json php-pecl-zip"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
# Debian 9
ALL_PKGS="${ALL_PKGS} php-cli php-fpm php-json php-gd php-curl mcrypt php-intl php-xml php-mbstring php-zip"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} php-ldap php-mysql"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} php-mysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} php-pgsql"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} php${OB_PKG_PHP_VER} php-bz2${OB_PKG_PHP_VER} php-imap${OB_PKG_PHP_VER} php-gd${OB_PKG_PHP_VER} php-intl${OB_PKG_PHP_VER} php-zip${OB_PKG_PHP_VER}"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} php-ldap${OB_PKG_PHP_VER} php-pdo_mysql${OB_PKG_PHP_VER}"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} php-pdo_mysql${OB_PKG_PHP_VER}"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} php-pdo_pgsql${OB_PKG_PHP_VER}"
fi
fi
# Nginx
if [ X"${WEB_SERVER}" == X'NGINX' ]; then
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} nginx"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} nginx-full"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} nginx"
PKG_SCRIPTS="${PKG_SCRIPTS} ${NGINX_RC_SCRIPT_NAME} ${PHP_FPM_RC_SCRIPT_NAME}"
fi
ENABLED_SERVICES="${ENABLED_SERVICES} ${NGINX_RC_SCRIPT_NAME} ${PHP_FPM_RC_SCRIPT_NAME}"
fi
# Dovecot.
ENABLED_SERVICES="${ENABLED_SERVICES} ${DOVECOT_RC_SCRIPT_NAME}"
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} dovecot dovecot-pigeonhole"
if [ X"${BACKEND}" == X'OPENLDAP' -o X"${BACKEND}" == X'MYSQL' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-mysql"
elif [ X"${BACKEND}" == X'PGSQL' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-pgsql"
fi
# We use Dovecot SASL auth instead of saslauthd
DISABLED_SERVICES="${DISABLED_SERVICES} saslauthd"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-managesieved dovecot-sieve"
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-ldap dovecot-mysql"
elif [ X"${BACKEND}" == X'MYSQL' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-mysql"
elif [ X"${BACKEND}" == X'PGSQL' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-pgsql"
fi
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-- dovecot-pigeonhole--"
PKG_SCRIPTS="${PKG_SCRIPTS} ${DOVECOT_RC_SCRIPT_NAME}"
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-ldap-- dovecot-mysql--"
elif [ X"${BACKEND}" == X'MYSQL' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-mysql--"
elif [ X"${BACKEND}" == X'PGSQL' ]; then
ALL_PKGS="${ALL_PKGS} dovecot-postgresql--"
fi
DISABLED_SERVICES="${DISABLED_SERVICES} saslauthd"
fi
# Amavisd-new, ClamAV, Altermime.
ENABLED_SERVICES="${ENABLED_SERVICES} ${CLAMAV_CLAMD_SERVICE_NAME} ${AMAVISD_RC_SCRIPT_NAME}"
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} amavis spamassassin altermime perl-Mail-SPF lz4 clamav clamav-update clamav-server clamav-server-systemd"
ENABLED_SERVICES="${ENABLED_SERVICES} clamav-freshclam"
# RHEL uses service name 'clamd@amavisd' instead of clamd.
DISABLED_SERVICES="${DISABLED_SERVICES} clamd spamassassin"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} amavisd-new libcrypt-openssl-rsa-perl libmail-dkim-perl clamav-freshclam clamav-daemon spamassassin altermime arj nomarch cpio lzop cabextract p7zip-full rpm libmail-spf-perl unrar-free pax lrzip gpg-agent libdbd-mysql-perl"
# Ubuntu 24.04, 26.04
[[ X"${DISTRO}" == X'UBUNTU' ]] && ALL_PKGS="${ALL_PKGS} libclamunrar12"
ENABLED_SERVICES="${ENABLED_SERVICES} ${CLAMAV_FRESHCLAMD_RC_SCRIPT_NAME}"
DISABLED_SERVICES="${DISABLED_SERVICES} spamassassin spamd clamav-clamonacc"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} rpm2cpio amavisd-new amavisd-new-utils p5-Mail-SPF p5-libwww p5-Mail-SpamAssassin clamav unrar altermime"
PKG_SCRIPTS="${PKG_SCRIPTS} ${CLAMAV_CLAMD_SERVICE_NAME} ${CLAMAV_FRESHCLAMD_RC_SCRIPT_NAME} ${AMAVISD_RC_SCRIPT_NAME}"
fi
# mlmmj: mailing list manager
ALL_PKGS="${ALL_PKGS} mlmmj"
# mlmmjadmin: RESTful API server used to manage mlmmj.
if [ X"${DISTRO}" == X'RHEL' ]; then
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
ALL_PKGS="${ALL_PKGS} python3-ldap python3-PyMySQL"
fi
if [ X"${BACKEND}" == X'MYSQL' ]; then
ALL_PKGS="${ALL_PKGS} python3-PyMySQL"
fi
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} python3-psycopg2"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
if [ X"${DISTRO}" == X'DEBIAN' -a X"${DISTRO_VERSION}" == X'9' ]; then
# Debian 9. `pyldap` is a fork of python-ldap.
ALL_PKGS="${ALL_PKGS} python3-pyldap"
else
ALL_PKGS="${ALL_PKGS} python3-ldap"
fi
ALL_PKGS="${ALL_PKGS} python3-pymysql"
fi
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} python3-pymysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} python3-psycopg2"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} py3-sqlalchemy py3-dnspython py3-pymysql"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} py3-ldap py3-mysqlclient"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} py3-mysqlclient"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} py3-psycopg2"
PKG_SCRIPTS="${PKG_SCRIPTS} mlmmjadmin"
fi
# Roundcube
if [ X"${USE_ROUNDCUBE}" == X'YES' ]; then
if [ X"${DISTRO}" == X'RHEL' ]; then
[[ X"${DISTRO_CODENAME}" == X'rhel' ]] && ALL_PKGS="${ALL_PKGS} php-enchant"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
ALL_PKGS="${ALL_PKGS} php-ldap"
fi
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} php-pspell${OB_PKG_PHP_VER} php-intl${OB_PKG_PHP_VER}"
fi
fi
# SOGo
if [ X"${USE_SOGO}" == X'YES' ]; then
ENABLED_SERVICES="${ENABLED_SERVICES} ${SOGO_RC_SCRIPT_NAME} ${MEMCACHED_RC_SCRIPT_NAME}"
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} sogo sogo-activesync libwbxml sogo-ealarms-notify sogo-tool"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} sope49-gdl1-mysql sope49-ldap"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} sope49-gdl1-mysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} sope49-gdl1-postgresql"
if [ X"${BACKEND}" == X'OPENLDAP' -o X"${BACKEND}" == X'MYSQL' ]; then
ALL_PKGS="${ALL_PKGS} mysql-libs"
fi
${FETCH_CMD} \
-O /etc/pki/rpm-gpg/sogo-nightly \
https://keys.openpgp.org/vks/v1/by-fingerprint/74FFC6D72B925A34B5D356BDF8A27B36A6E2EAE9
if [ X"$?" != X'0' ]; then
ECHO_ERROR "Failed in import GPG key for SOGo yum repository."
ECHO_ERROR "Please try to import it manually with command below:"
ECHO_ERROR "wget -O /etc/pki/rpm-gpg/sogo-nightly https://keys.openpgp.org/vks/v1/by-fingerprint/74FFC6D72B925A34B5D356BDF8A27B36A6E2EAE9"
exit 255
fi
# Copy yum repo file
ECHO_INFO "Add yum repo for SOGo: ${YUM_REPOS_DIR}/sogo.repo."
cat > ${YUM_REPOS_DIR}/sogo.repo <<EOF
[SOGo]
name=SOGo Groupware
baseurl=${SOGO_PKG_MIRROR}/nightly/${SOGO_VERSION}/rhel/\$releasever/\$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/sogo-nightly
EOF
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} memcached sogo sogo-activesync"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} sope4.9-gdl1-mysql"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} sope4.9-gdl1-mysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} sope4.9-gdl1-postgresql"
ECHO_INFO "Add apt repo for SOGo."
if [ X"${DISTRO}" == X'DEBIAN' ]; then
echo "${SOGO_DEBIAN_APT_REPO}" > /etc/apt/sources.list.d/sogo-nightly.list
elif [ X"${DISTRO}" == X'UBUNTU' ]; then
echo "${SOGO_UBUNTU_APT_REPO}" > /etc/apt/sources.list.d/sogo-nightly.list
fi
ECHO_DEBUG "Add GPG key for SOGo apt repo."
wget -q -O /tmp/sogo-nightly "https://keys.openpgp.org/vks/v1/by-fingerprint/74FFC6D72B925A34B5D356BDF8A27B36A6E2EAE9" >/dev/null
gpg --dearmor /tmp/sogo-nightly
mv /tmp/sogo-nightly.gpg /etc/apt/trusted.gpg.d/
rm -f /tmp/sogo-nightly
ECHO_INFO "Resynchronizing the package index files (apt update) ..."
${APTGET} update
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} sogo memcached--"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} sope-mysql"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} sope-mysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} sope-postgres"
PKG_SCRIPTS="${PKG_SCRIPTS} ${MEMCACHED_RC_SCRIPT_NAME} ${SOGO_RC_SCRIPT_NAME}"
fi
fi
# iRedAPD. Requires Python-3.
# Don't append service name 'iredapd' to ${ENABLED_SERVICES} since we don't
# have RC script ready in this stage.
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} python3-sqlalchemy python3-setuptools python3-dns python3-six python3-python-multipart"
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
ALL_PKGS="${ALL_PKGS} python3-ldap python3-PyMySQL"
fi
if [ X"${BACKEND}" == X'MYSQL' ]; then
ALL_PKGS="${ALL_PKGS} python3-PyMySQL"
fi
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} python3-psycopg2"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} python3-sqlalchemy python3-dnspython python3-multipart"
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
if [ X"${DISTRO}" == X'DEBIAN' -a X"${DISTRO_VERSION}" == X'9' ]; then
# pyldap is a fork of python-ldap.
ALL_PKGS="${ALL_PKGS} python3-pyldap"
else
ALL_PKGS="${ALL_PKGS} python3-ldap"
fi
ALL_PKGS="${ALL_PKGS} python3-pymysql"
fi
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} python3-pymysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} python3-psycopg2"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} py3-sqlalchemy py3-dnspython py3-multipart"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} py3-ldap py3-mysqlclient py3-pymysql"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} py3-mysqlclient py3-pymysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} py3-psycopg2"
PKG_SCRIPTS="${PKG_SCRIPTS} iredapd"
fi
# OpenBSD: List postfix as last startup script.
export PKG_SCRIPTS="${PKG_SCRIPTS} ${POSTFIX_RC_SCRIPT_NAME}"
# iRedAdmin.
# Force install all dependent packages to help customers install iRedAdmin-Pro.
# web.py, dnspython, requests, jinja2, mysqldb or pymysql, simplejson.
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} python3-jinja2 python3-PyMySQL python3-dns python3-simplejson python3-more-itertools"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} python3-jinja2 python3-netifaces python3-bcrypt python3-dnspython python3-simplejson python3-more-itertools"
if [ X"${BACKEND}" == X'OPENLDAP' ]; then
if [ X"${DISTRO}" == X'DEBIAN' -a X"${DISTRO_VERSION}" == X'9' ]; then
# Debian 9. `pyldap` is a fork of python-ldap.
ALL_PKGS="${ALL_PKGS} python3-pyldap"
else
ALL_PKGS="${ALL_PKGS} python3-ldap"
fi
ALL_PKGS="${ALL_PKGS} python3-pymysql"
fi
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} python3-pymysql"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} python3-psycopg2"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} py3-jinja2 py3-flup py3-bcrypt py3-curl py3-netifaces py3-dnspython py3-simplejson py3-more-itertools"
[ X"${BACKEND}" == X'OPENLDAP' ] && ALL_PKGS="${ALL_PKGS} py3-ldap py3-mysqlclient"
[ X"${BACKEND}" == X'MYSQL' ] && ALL_PKGS="${ALL_PKGS} py3-mysqlclient"
[ X"${BACKEND}" == X'PGSQL' ] && ALL_PKGS="${ALL_PKGS} py3-psycopg2"
fi
# Fail2ban. Install fail2ban and geoip.
if [ X"${USE_FAIL2BAN}" == X'YES' ]; then
ENABLED_SERVICES="${ENABLED_SERVICES} fail2ban"
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} fail2ban"
DISABLED_SERVICES="${DISABLED_SERVICES} shorewall gamin gamin-python"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} fail2ban geoip-bin geoip-database"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
# No port for fail2ban. Install from source tarball with pip later.
# rc script will be generated from sample file later.
ALL_PKGS="${ALL_PKGS} py3-pip geolite2-country geolite2-city"
fi
fi
# netdata
# Note: netdata installer will generate rc/systemd script and enable the
# service automatically.
if [ X"${USE_NETDATA}" == X'YES' ]; then
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} curl libmnl libuuid lm_sensors nc zlib iproute"
ALL_PKGS="${ALL_PKGS} python3-pyyaml"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} zlib1g libuuid1 libmnl0 curl lm-sensors netcat-openbsd"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
# netdata doesn't work on OpenBSD
:
fi
fi
# Misc packages & services.
if [ X"${DISTRO}" == X'RHEL' ]; then
ALL_PKGS="${ALL_PKGS} unzip bzip2 acl patch tmpwatch crontabs dos2unix logwatch lz4"
ENABLED_SERVICES="${ENABLED_SERVICES} crond"
[[ ${DISTRO_VERSION} == X'9' ]] && ALL_PKGS="${ALL_PKGS} rsyslog rsyslog-logrotate"
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
ALL_PKGS="${ALL_PKGS} bzip2 acl patch cron tofrodos logwatch unzip bsdutils rsyslog"
ENABLED_SERVICES="${ENABLED_SERVICES} cron"
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
ALL_PKGS="${ALL_PKGS} bzip2 lz4 unzip--"
fi
# Firewall
if [ X"${DISTRO}" == X'DEBIAN' ]; then
ALL_PKGS="${ALL_PKGS} nftables"
[[ ${USE_NFTABLES} == "YES" ]] && ENABLED_SERVICES="${ENABLED_SERVICES} nftables"
elif [ X"${DISTRO}" == X'UBUNTU' ]; then
# Disable ufw service.
export DISABLED_SERVICES="${DISABLED_SERVICES} ufw"
# Use nftables since Ubuntu 20.04.
ALL_PKGS="${ALL_PKGS} nftables"
ENABLED_SERVICES="${ENABLED_SERVICES} nftables"
fi
export ALL_PKGS ENABLED_SERVICES DISABLED_SERVICES PKG_SCRIPTS
# Install all packages.
install_all_pkgs()
{
eval ${install_pkg} ${ALL_PKGS} | tee ${PKG_INSTALL_LOG}
if [ -f ${RUNTIME_DIR}/.pkg_install_failed ]; then
ECHO_ERROR "Installation failed, please check the terminal output."
ECHO_ERROR "If you're not sure what the problem is, try to get help in iRedMail"
ECHO_ERROR "forum: https://forum.iredmail.org/"
exit 255
fi
}
# Enable/Disable services.
enable_all_services()
{
if [ X"${DISTRO}" == X'RHEL' ]; then
if [ -f /usr/lib/systemd/system/clamd\@.service ]; then
if ! grep '\[Install\]' /usr/lib/systemd/system/clamd\@.service &>/dev/null; then
echo '[Install]' >> /usr/lib/systemd/system/clamd\@.service
echo 'WantedBy=multi-user.target' >> /usr/lib/systemd/system/clamd\@.service
fi
fi
fi
# Enable/Disable services.
if [ X"${DISTRO}" == X'OPENBSD' ]; then
for srv in ${PKG_SCRIPTS}; do
service_control enable ${srv}
done
else
service_control enable ${ENABLED_SERVICES}
service_control disable ${DISABLED_SERVICES}
fi
cat >> ${TIP_FILE} <<EOF
* Enabled services: ${ENABLED_SERVICES}
EOF
}
after_package_installation()
{
pip_args=''
if [ X"${PIP_MIRROR_SITE}" != X'' -a X"${PIP_TRUSTED_HOST}" != X'' ]; then
pip_args="-i ${PIP_MIRROR_SITE} --trusted-host ${PIP_TRUSTED_HOST}"
fi
if [ X"${PIP3_MODULES}" != X'' ]; then
ECHO_INFO "Installing required Python-3 modules with pip3:${PIP3_MODULES}"
${CMD_PIP3} install ${pip_args} -U --break-system-packages ${PIP3_MODULES} 2>&1 | tee ${RUNTIME_DIR}/pip3.log
fi
if [ X"${DISTRO}" == X'OPENBSD' ]; then
# Create symbol links for php.
if [ X"${IREDMAIL_USE_PHP}" == X'YES' ]; then
ln -sf /usr/local/bin/php-${OB_PHP_VERSION} /usr/local/bin/php >> ${INSTALL_LOG} 2>&1
ln -sf /usr/local/bin/php-config-${OB_PHP_VERSION} /usr/local/bin/php-config >> ${INSTALL_LOG} 2>&1
ln -sf /usr/local/bin/phpize-${OB_PHP_VERSION} /usr/local/bin/phpize >> ${INSTALL_LOG} 2>&1
ln -sf /usr/local/bin/php-fpm-${OB_PHP_VERSION} /usr/local/bin/php-fpm >> ${INSTALL_LOG} 2>&1
fi
ECHO_DEBUG "Create symbol link: /usr/local/bin/python${PYTHON_VERSION} -> /usr/local/bin/python3"
if [ ! -e /usr/local/bin/python3 ]; then
ln -sf /usr/local/bin/python${PYTHON_VERSION} /usr/local/bin/python3
fi
# Fail2ban.
if [ X"${USE_FAIL2BAN}" == X'YES' ]; then
# https://github.com/fail2ban/fail2ban/wiki/How-to-install-or-upgrade-fail2ban-manually
ECHO_INFO "Installing Fail2ban from source tarball, please wait for a moment."
cd ${PKG_MISC_DIR}
tar zxf fail2ban-${FAIL2BAN_VERSION}.tar.gz
cd fail2ban-${FAIL2BAN_VERSION}
bash fail2ban-2to3 &>${RUNTIME_DIR}/fail2ban-2to3.log
python3 setup.py install --without-tests &> ${RUNTIME_DIR}/fail2ban_install.log
cd .. && rm -rf fail2ban-${FAIL2BAN_VERSION}
fi
# Required by uwsgi applications.
update_sysctl_param kern.seminfo.semmni 1024
update_sysctl_param kern.seminfo.semmns 1200
update_sysctl_param kern.seminfo.semmnu 60
update_sysctl_param kern.seminfo.semmsl 120
update_sysctl_param kern.seminfo.semopm 200
fi
echo 'export status_after_package_installation="DONE"' >> ${STATUS_FILE}
}
# Do not run them with 'check_status_before_run', so that we can always
# install missed packages and enable/disable new services while re-run
# iRedMail installer.
install_all_pkgs
enable_all_services
check_status_before_run after_package_installation
}