# bash -xv upgrade_iredadmin.sh
#!/usr/bin/env bash
# Purpose: Upgrade iRedAdmin from old release.
# Works with both iRedAdmin open source edition or iRedAdmin-Pro.
# USAGE:
#
# # cd /path/to/iRedAdmin-xxx/tools/
# # bash upgrade_iredadmin.sh
#
# Notes:
#
# * it uses sql username 'root' by default to connect to sql database. If you
# are using a remote SQL database which you don't have root privilege,
# please specify the sql username on command line with 'SQL_IREDADMIN_USER'
# parameter like this:
#
# SQL_IREDADMIN_USER='iredadmin' bash upgrade_iredadmin.sh
#
# * it reads sql password for given sql user from /root/.my.cnf by default.
# if you use a different file, please specify the file on command line with
# 'MY_CNF' parameter like this:
#
# MY_CNF='/root/.my.cnf-iredadmin' SQL_IREDADMIN_USER='iredadmin' bash upgrade_iredadmin.sh
export LC_ALL='C'
+ export LC_ALL=C
+ LC_ALL=C
export IRA_HTTPD_USER='iredadmin'
+ export IRA_HTTPD_USER=iredadmin
+ IRA_HTTPD_USER=iredadmin
export IRA_HTTPD_GROUP='iredadmin'
+ export IRA_HTTPD_GROUP=iredadmin
+ IRA_HTTPD_GROUP=iredadmin
export SYS_ROOT_USER='root'
+ export SYS_ROOT_USER=root
+ SYS_ROOT_USER=root
# If you don't have root privilege, use another sql user instead.
export SQL_IREDADMIN_USER="${SQL_IREDADMIN_USER:=root}"
+ export SQL_IREDADMIN_USER=root
+ SQL_IREDADMIN_USER=root
export MY_CNF="${MY_CNF:=/root/.my.cnf}"
+ export MY_CNF=/root/.my.cnf
+ MY_CNF=/root/.my.cnf
export CMD_MYSQL="mysql --defaults-file=${MY_CNF} -u ${SQL_IREDADMIN_USER}"
+ export 'CMD_MYSQL=mysql --defaults-file=/root/.my.cnf -u root'
+ CMD_MYSQL='mysql --defaults-file=/root/.my.cnf -u root'
# Check OS to detect some necessary info.
export KERNEL_NAME="$(uname -s | tr '[a-z]' '[A-Z]')"
++ uname -s
++ tr '[a-z]' '[A-Z]'
+ export KERNEL_NAME=LINUX
+ KERNEL_NAME=LINUX
export NGINX_PID_FILE='/var/run/nginx.pid'
+ export NGINX_PID_FILE=/var/run/nginx.pid
+ NGINX_PID_FILE=/var/run/nginx.pid
export NGINX_SNIPPET_CONF='/etc/nginx/templates/iredadmin.tmpl'
+ export NGINX_SNIPPET_CONF=/etc/nginx/templates/iredadmin.tmpl
+ NGINX_SNIPPET_CONF=/etc/nginx/templates/iredadmin.tmpl
export NGINX_SNIPPET_CONF2='/etc/nginx/templates/iredadmin-subdomain.tmpl'
+ export NGINX_SNIPPET_CONF2=/etc/nginx/templates/iredadmin-subdomain.tmpl
+ NGINX_SNIPPET_CONF2=/etc/nginx/templates/iredadmin-subdomain.tmpl
# iRedMail-0.9.7
export NGINX_SNIPPET_CONF3='/etc/nginx/conf.d/default.conf'
+ export NGINX_SNIPPET_CONF3=/etc/nginx/conf.d/default.conf
+ NGINX_SNIPPET_CONF3=/etc/nginx/conf.d/default.conf
export USE_SYSTEMD='NO'
+ export USE_SYSTEMD=NO
+ USE_SYSTEMD=NO
if which systemctl &>/dev/null; then
export USE_SYSTEMD='YES'
export SYSTEMD_SERVICE_DIR='/lib/systemd/system'
export SYSTEMD_SERVICE_DIR2='/etc/systemd/system'
export SYSTEMD_SERVICE_USER_DIR='/etc/systemd/system/multi-user.target.wants/'
fi
+ which systemctl
+ export USE_SYSTEMD=YES
+ USE_SYSTEMD=YES
+ export SYSTEMD_SERVICE_DIR=/lib/systemd/system
+ SYSTEMD_SERVICE_DIR=/lib/systemd/system
+ export SYSTEMD_SERVICE_DIR2=/etc/systemd/system
+ SYSTEMD_SERVICE_DIR2=/etc/systemd/system
+ export SYSTEMD_SERVICE_USER_DIR=/etc/systemd/system/multi-user.target.wants/
+ SYSTEMD_SERVICE_USER_DIR=/etc/systemd/system/multi-user.target.wants/
# Python.
export CMD_PYTHON3='/usr/bin/python3'
+ export CMD_PYTHON3=/usr/bin/python3
+ CMD_PYTHON3=/usr/bin/python3
export CMD_PIP3='/usr/bin/pip3'
+ export CMD_PIP3=/usr/bin/pip3
+ CMD_PIP3=/usr/bin/pip3
# uwsgi
export CMD_UWSGI='/usr/bin/uwsgi'
+ export CMD_UWSGI=/usr/bin/uwsgi
+ CMD_UWSGI=/usr/bin/uwsgi
if [ X"${KERNEL_NAME}" == X"LINUX" ]; then
export DISTRO_VERSION=$(awk -F'"' '/^VERSION_ID=/ {print $2}' /etc/os-release)
if [ -f /etc/redhat-release ]; then
# RHEL/CentOS
export DISTRO='RHEL'
export CMD_UWSGI='/usr/sbin/uwsgi'
if [ X"${DISTRO_VERSION}" == X'8' ]; then
# CentOS 8 doesn't have uwsgi package, we will install it with pip3.
export CMD_UWSGI='/usr/local/bin/uwsgi'
fi
export HTTPD_RC_SCRIPT_NAME='httpd'
export CRON_SPOOL_DIR='/var/spool/cron'
if [[ -L /opt/www/iredadmin ]]; then
export HTTPD_SERVERROOT='/opt/www'
else
export HTTPD_SERVERROOT='/var/www'
fi
elif [ -f /etc/lsb-release ]; then
# Ubuntu
export DISTRO='UBUNTU'
export HTTPD_RC_SCRIPT_NAME='apache2'
export CRON_SPOOL_DIR='/var/spool/cron/crontabs'
if [ -L /opt/www/iredadmin ]; then
export HTTPD_SERVERROOT='/opt/www'
else
export HTTPD_SERVERROOT='/usr/share/apache2'
fi
elif [ -f /etc/debian_version ]; then
# Debian
export DISTRO='DEBIAN'
export HTTPD_RC_SCRIPT_NAME='apache2'
export CRON_SPOOL_DIR='/var/spool/cron/crontabs'
if [ -L /opt/www/iredadmin ]; then
export HTTPD_SERVERROOT='/opt/www'
else
export HTTPD_SERVERROOT='/usr/share/apache2'
fi
elif [ -f /etc/SuSE-release ]; then
# openSUSE
export DISTRO='SUSE'
export HTTPD_SERVERROOT='/srv/www'
export HTTPD_RC_SCRIPT_NAME='apache2'
export CRON_SPOOL_DIR='/var/spool/cron'
else
echo "<<< ERROR >>> Cannot detect Linux distribution name. Exit."
echo "Please contact support@iredmail.org to solve it."
exit 255
fi
elif [ X"${KERNEL_NAME}" == X'FREEBSD' ]; then
export DISTRO='FREEBSD'
export SYSRC='/usr/sbin/sysrc'
export CMD_PYTHON3='/usr/local/bin/python3'
export CMD_PIP3='/usr/local/bin/pip3'
export CMD_UWSGI='/usr/local/bin/uwsgi'
export CRON_SPOOL_DIR='/var/cron/tabs'
export NGINX_SNIPPET_CONF='/usr/local/etc/nginx/templates/iredadmin.tmpl'
export NGINX_SNIPPET_CONF2='/usr/local/etc/nginx/templates/iredadmin-subdomain.tmpl'
export NGINX_SNIPPET_CONF3='/usr/local/etc/nginx/conf.d/default.conf'
if [ -L /opt/www/iredadmin ]; then
export HTTPD_SERVERROOT='/opt/www'
else
export HTTPD_SERVERROOT='/usr/local/www'
fi
if [ -f /usr/local/etc/rc.d/apache24 ]; then
export HTTPD_RC_SCRIPT_NAME='apache24'
else
export HTTPD_RC_SCRIPT_NAME='apache22'
fi
elif [ X"${KERNEL_NAME}" == X'OPENBSD' ]; then
export CMD_PYTHON3='/usr/local/bin/python3'
export CMD_PIP3='/usr/local/bin/pip3'
export CMD_UWSGI='/usr/local/bin/uwsgi'
export DISTRO='OPENBSD'
export CRON_SPOOL_DIR='/var/cron/tabs'
if [[ -h /opt/www/iredadmin ]]; then
export HTTPD_SERVERROOT='/opt/www'
else
export HTTPD_SERVERROOT='/var/www'
fi
else
echo "Cannot detect Linux/BSD distribution. Exit."
echo "Please contact author iRedMail team <support@iredmail.org> to solve it."
exit 255
fi
+ '[' XLINUX == XLINUX ']'
++ awk '-F"' '/^VERSION_ID=/ {print $2}' /etc/os-release
+ export DISTRO_VERSION=18.04
+ DISTRO_VERSION=18.04
+ '[' -f /etc/redhat-release ']'
+ '[' -f /etc/lsb-release ']'
+ export DISTRO=UBUNTU
+ DISTRO=UBUNTU
+ export HTTPD_RC_SCRIPT_NAME=apache2
+ HTTPD_RC_SCRIPT_NAME=apache2
+ export CRON_SPOOL_DIR=/var/spool/cron/crontabs
+ CRON_SPOOL_DIR=/var/spool/cron/crontabs
+ '[' -L /opt/www/iredadmin ']'
+ export HTTPD_SERVERROOT=/usr/share/apache2
+ HTTPD_SERVERROOT=/usr/share/apache2
export CRON_FILE_ROOT="${CRON_SPOOL_DIR}/${SYS_ROOT_USER}"
+ export CRON_FILE_ROOT=/var/spool/cron/crontabs/root
+ CRON_FILE_ROOT=/var/spool/cron/crontabs/root
# Optional argument to set the directory which stores iRedAdmin.
if [ $# -gt 0 ]; then
if [ -d ${1} ]; then
export HTTPD_SERVERROOT="${1}"
fi
if echo ${HTTPD_SERVERROOT} | grep '/iredadmin/*$' > /dev/null; then
export HTTPD_SERVERROOT="$(dirname ${HTTPD_SERVERROOT})"
fi
fi
+ '[' 0 -gt 0 ']'
# iRedAdmin directory and config file.
export IRA_ROOT_DIR="${HTTPD_SERVERROOT}/iredadmin"
+ export IRA_ROOT_DIR=/usr/share/apache2/iredadmin
+ IRA_ROOT_DIR=/usr/share/apache2/iredadmin
export IRA_CONF_PY="${IRA_ROOT_DIR}/settings.py"
+ export IRA_CONF_PY=/usr/share/apache2/iredadmin/settings.py
+ IRA_CONF_PY=/usr/share/apache2/iredadmin/settings.py
export IRA_CUSTOM_CONF_PY="${IRA_ROOT_DIR}/custom_settings.py"
+ export IRA_CUSTOM_CONF_PY=/usr/share/apache2/iredadmin/custom_settings.py
+ IRA_CUSTOM_CONF_PY=/usr/share/apache2/iredadmin/custom_settings.py
enable_service() {
srv="$1"
echo "* Enable service: ${srv}"
if [ X"${DISTRO}" == X'RHEL' ]; then
if [ X"${USE_SYSTEMD}" == X'YES' ]; then
systemctl enable $srv
else
chkconfig --level 345 $srv on
fi
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
if [ X"${USE_SYSTEMD}" == X'YES' ]; then
systemctl enable $srv
else
update-rc.d $srv defaults
fi
elif [ X"${DISTRO}" == X'FREEBSD' ]; then
${SYSRC} -f /etc/rc.conf.local ${srv}_enable=YES
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
rcctl enable $srv
fi
}
restart_service() {
srv="$1"
if [ X"${KERNEL_NAME}" == X'LINUX' ]; then
if [ X"${USE_SYSTEMD}" == X'YES' ]; then
systemctl restart ${srv}
else
service ${srv} restart
fi
elif [ X"${KERNEL_NAME}" == X'FREEBSD' ]; then
service ${srv} restart
elif [ X"${KERNEL_NAME}" == X'OPENBSD' ]; then
rcctl restart ${srv}
fi
if [ X"$?" != X'0' ]; then
echo "Failed, please restart service manually and check its log file."
fi
}
restart_web_service()
{
export web_service="${HTTPD_RC_SCRIPT_NAME}"
if [ -f ${NGINX_PID_FILE} ]; then
if [ -n "$(cat ${NGINX_PID_FILE})" ]; then
export web_service="iredadmin"
fi
fi
echo "* Restarting ${web_service} service."
if [ X"${KERNEL_NAME}" == X'LINUX' ]; then
# The uwsgi script on CentOS 6 has problem with 'restart' action,
# 'stop' with few seconds sleep fixes it.
if [ X"${DISTRO}" == X'RHEL' -a X"${web_service}" == X'uwsgi' ]; then
service ${web_service} stop
sleep 5
service ${web_service} start
else
service ${web_service} restart
fi
elif [ X"${KERNEL_NAME}" == X'FREEBSD' ]; then
service ${web_service} restart
elif [ X"${KERNEL_NAME}" == X'OPENBSD' ]; then
rcctl restart ${web_service}
fi
if [ X"$?" != X'0' ]; then
echo "Failed, please restart Apache web server or 'iredadmin' (if you're running Nginx as web server) manually."
fi
}
check_mlmmjadmin_installation()
{
if [ ! -e /opt/mlmmjadmin ]; then
echo "<<< ERROR >>> No mlmmjadmin installation found (/opt/mlmmjadmin)."
echo "<<< ERROR >>> Please follow iRedMail upgrade tutorials to the latest"
echo "<<< ERROR >>> stable release first, then come back to upgrade iRedAdmin-Pro."
echo "<<< ERROR >>> mlmmj and mlmmjadmin was first introduced in iRedMail-0.9.8."
echo "<<< ERROR >>> https://docs.iredmail.org/iredmail.releases.html"
exit 255
fi
}
install_pkg()
{
echo "Install package(s): $@"
if [ X"${DISTRO}" == X'RHEL' ]; then
yum -y install $@
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
apt-get install -y $@
elif [ X"${DISTRO}" == X'FREEBSD' ]; then
cd /usr/ports/$@ && make install clean
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
pkg_add -r $@
else
echo "<< ERROR >> Please install package(s) manually: $@"
fi
}
has_python_module()
{
mod="$1"
${CMD_PYTHON3} -c "import $mod" &>/dev/null
if [ X"$?" == X'0' ]; then
echo 'YES'
else
echo 'NO'
fi
}
add_missing_parameter()
{
# Usage: add_missing_parameter VARIABLE DEFAULT_VALUE [COMMENT]
var="${1}"
value="${2}"
shift 2
comment="$@"
if ! grep "^${var}" ${IRA_CONF_PY} &>/dev/null; then
if [ ! -z "${comment}" ]; then
echo "# ${comment}" >> ${IRA_CONF_PY}
fi
if [ X"${value}" == X'True' -o X"${value}" == X'False' ]; then
echo "${var} = ${value}" >> ${IRA_CONF_PY}
else
# Value must be quoted as string.
echo "${var} = '${value}'" >> ${IRA_CONF_PY}
fi
fi
}
# Remove all single quote and double quotes in string.
strip_quotes()
{
# Read input from stdin
str="$(cat <&0)"
value="$(echo ${str} | tr -d '"' | tr -d "'")"
echo "${value}"
}
get_iredadmin_setting()
{
var="${1}"
value="$(grep "^${var}" ${IRA_CONF_PY} | awk '{print $NF}' | strip_quotes)"
echo "${value}"
}
check_dot_my_cnf()
{
if egrep '^backend.*(mysql|ldap)' ${IRA_CONF_PY} &>/dev/null; then
if [ ! -f ${MY_CNF} ]; then
echo "<<< ERROR >>> File ${MY_CNF} not found."
echo "<<< ERROR >>> Please add mysql root user and password in it like below, then run this script again."
cat <<EOF
[client]
host=127.0.0.1
port=3306
user=${SQL_IREDADMIN_USER}
password="plain_password"
EOF
exit 255
fi
# Check MySQL connection
${CMD_MYSQL} -e "SHOW DATABASES" &>/dev/null
if [ X"$?" != X'0' ]; then
echo "<<< ERROR >>> MySQL user name '${SQL_IREDADMIN_USER}' or password is incorrect in ${MY_CNF}, please double check."
exit 255
fi
fi
}
check_mlmmjadmin_installation
+ check_mlmmjadmin_installation
+ '[' '!' -e /opt/mlmmjadmin ']'
check_dot_my_cnf
+ check_dot_my_cnf
+ egrep '^backend.*(mysql|ldap)' /usr/share/apache2/iredadmin/settings.py
+ '[' '!' -f /root/.my.cnf ']'
+ mysql --defaults-file=/root/.my.cnf -u root -e 'SHOW DATABASES'
+ '[' X0 '!=' X0 ']'
echo "* Detected Linux/BSD distribution: ${DISTRO}"
+ echo '* Detected Linux/BSD distribution: UBUNTU'
* Detected Linux/BSD distribution: UBUNTU
echo "* HTTP server root: ${HTTPD_SERVERROOT}"
+ echo '* HTTP server root: /usr/share/apache2'
* HTTP server root: /usr/share/apache2
if [ -L ${IRA_ROOT_DIR} ]; then
export IRA_ROOT_REAL_DIR="$(readlink ${IRA_ROOT_DIR})"
echo "* Found iRedAdmin directory: ${IRA_ROOT_DIR}, symbol link of ${IRA_ROOT_REAL_DIR}"
else
echo "<<< ERROR >>> Directory (${IRA_ROOT_DIR}) is not a symbol link created by iRedMail. Exit."
exit 255
fi
+ '[' -L /usr/share/apache2/iredadmin ']'
++ readlink /usr/share/apache2/iredadmin
+ export IRA_ROOT_REAL_DIR=iRedAdmin-1.0
+ IRA_ROOT_REAL_DIR=iRedAdmin-1.0
+ echo '* Found iRedAdmin directory: /usr/share/apache2/iredadmin, symbol link of iRedAdmin-1.0'
* Found iRedAdmin directory: /usr/share/apache2/iredadmin, symbol link of iRedAdmin-1.0
# Copy config file
if [ -f ${IRA_CONF_PY} ]; then
echo "* Found iRedAdmin config file: ${IRA_CONF_PY}"
else
echo "<<< ERROR >>> Cannot find a valid config file (settings.py)."
exit 255
fi
+ '[' -f /usr/share/apache2/iredadmin/settings.py ']'
+ echo '* Found iRedAdmin config file: /usr/share/apache2/iredadmin/settings.py'
* Found iRedAdmin config file: /usr/share/apache2/iredadmin/settings.py
# Check whether current directory is iRedAdmin
PWD="$(pwd)"
++ pwd
+ PWD=/root/iRedAdmin-1.1/tools
if ! echo ${PWD} | grep 'iRedAdmin-.*/tools' >/dev/null; then
echo "<<< ERROR >>> Cannot find new version of iRedAdmin in current directory. Exit."
exit 255
fi
+ grep 'iRedAdmin-.*/tools'
+ echo /root/iRedAdmin-1.1/tools
# Copy current directory to Apache server root
dir_new_version="$(dirname ${PWD})"
++ dirname /root/iRedAdmin-1.1/tools
+ dir_new_version=/root/iRedAdmin-1.1
name_new_version="$(basename ${dir_new_version})"
++ basename /root/iRedAdmin-1.1
+ name_new_version=iRedAdmin-1.1
NEW_IRA_ROOT_DIR="${HTTPD_SERVERROOT}/${name_new_version}"
+ NEW_IRA_ROOT_DIR=/usr/share/apache2/iRedAdmin-1.1
if [ -d ${NEW_IRA_ROOT_DIR} ]; then
COPY_FILES="${dir_new_version}/*"
COPY_DEST_DIR="${NEW_IRA_ROOT_DIR}"
#echo "<<< ERROR >>> Directory exist: ${NEW_IRA_ROOT_DIR}. Exit."
#exit 255
else
COPY_FILES="${dir_new_version}"
COPY_DEST_DIR="${HTTPD_SERVERROOT}"
fi
+ '[' -d /usr/share/apache2/iRedAdmin-1.1 ']'
+ COPY_FILES=/root/iRedAdmin-1.1
+ COPY_DEST_DIR=/usr/share/apache2
echo "* Copying new version to ${NEW_IRA_ROOT_DIR}"
+ echo '* Copying new version to /usr/share/apache2/iRedAdmin-1.1'
* Copying new version to /usr/share/apache2/iRedAdmin-1.1
cp -rf ${COPY_FILES} ${COPY_DEST_DIR}
+ cp -rf /root/iRedAdmin-1.1 /usr/share/apache2
# Copy old config files
echo "* Copy ${IRA_CONF_PY}."
+ echo '* Copy /usr/share/apache2/iredadmin/settings.py.'
* Copy /usr/share/apache2/iredadmin/settings.py.
cp -p ${IRA_CONF_PY} ${NEW_IRA_ROOT_DIR}/
+ cp -p /usr/share/apache2/iredadmin/settings.py /usr/share/apache2/iRedAdmin-1.1/
if [ -f ${IRA_CUSTOM_CONF_PY} ]; then
echo "* Copy ${IRA_CUSTOM_CONF_PY}."
cp -p ${IRA_CUSTOM_CONF_PY} ${NEW_IRA_ROOT_DIR}
fi
+ '[' -f /usr/share/apache2/iredadmin/custom_settings.py ']'
# Copy hooks.py. It's ok if missing.
if [ -f ${IRA_ROOT_DIR}/hooks.py ]; then
echo "* Copy ${IRA_ROOT_DIR}/hooks.py."
cp -p ${IRA_ROOT_DIR}/hooks.py ${NEW_IRA_ROOT_DIR}/ &>/dev/null
fi
+ '[' -f /usr/share/apache2/iredadmin/hooks.py ']'
# Copy custom files under 'tools/'. It's ok if missing.
cp -p ${IRA_ROOT_DIR}/tools/*.custom ${NEW_IRA_ROOT_DIR}/tools/ &>/dev/null
+ cp -p '/usr/share/apache2/iredadmin/tools/*.custom' /usr/share/apache2/iRedAdmin-1.1/tools/
cp -p ${IRA_ROOT_DIR}/tools/*.last-time ${NEW_IRA_ROOT_DIR}/tools/ &>/dev/null
+ cp -p '/usr/share/apache2/iredadmin/tools/*.last-time' /usr/share/apache2/iRedAdmin-1.1/tools/
# Template file renamed
if [ -f "${IRA_ROOT_DIR}/tools/notify_quarantined_recipients.custom.html" ]; then
echo "* Copy ${IRA_ROOT_DIR}/tools/notify_quarantined_recipients.custom.html"
cp -f ${IRA_ROOT_DIR}/tools/notify_quarantined_recipients.custom.html \
${NEW_IRA_ROOT_DIR}/tools/notify_quarantined_recipients.html.custom
fi
+ '[' -f /usr/share/apache2/iredadmin/tools/notify_quarantined_recipients.custom.html ']'
# Copy favicon.ico and brand logo image.
for var in 'BRAND_FAVICON' 'BRAND_LOGO'; do
if grep "^${var}\>" ${IRA_CONF_PY} &>/dev/null; then
_file=$(grep "^${var}\>" ${IRA_CONF_PY} | awk '{print $NF}' | tr -d '"' | tr -d "'")
echo "* Copy file ${IRA_ROOT_DIR}/static/${_file}"
cp -f ${IRA_ROOT_DIR}/static/${_file} ${NEW_IRA_ROOT_DIR}/static/
fi
done
+ for var in 'BRAND_FAVICON' 'BRAND_LOGO'
+ grep '^BRAND_FAVICON\>' /usr/share/apache2/iredadmin/settings.py
+ for var in 'BRAND_FAVICON' 'BRAND_LOGO'
+ grep '^BRAND_LOGO\>' /usr/share/apache2/iredadmin/settings.py
# iredadmin is now ran as a standalone uwsgi instance, we don't need uwsgi
# daemon service anymore.
_uwsgi_confs='
/etc/uwsgi.d/iredadmin.ini
/etc/uwsgi-available/iredadmin.ini
/etc/uwsgi/apps-enabled/iredadmin.ini &>/dev/null
/etc/uwsgi/apps-available/iredadmin.ini &>/dev/null
/usr/local/etc/uwsgi/iredadmin.ini
/etc/uwsgi-enabled/iredadmin.ini &>/dev/null
/etc/uwsgi-available/iredadmin.ini &>/dev/null
'
+ _uwsgi_confs='
/etc/uwsgi.d/iredadmin.ini
/etc/uwsgi-available/iredadmin.ini
/etc/uwsgi/apps-enabled/iredadmin.ini &>/dev/null
/etc/uwsgi/apps-available/iredadmin.ini &>/dev/null
/usr/local/etc/uwsgi/iredadmin.ini
/etc/uwsgi-enabled/iredadmin.ini &>/dev/null
/etc/uwsgi-available/iredadmin.ini &>/dev/null
'
for f in ${_uwsgi_confs}; do
rm -f ${f} &>/dev/null
done
+ for f in ${_uwsgi_confs}
+ rm -f /etc/uwsgi.d/iredadmin.ini
+ for f in ${_uwsgi_confs}
+ rm -f /etc/uwsgi-available/iredadmin.ini
+ for f in ${_uwsgi_confs}
+ rm -f /etc/uwsgi/apps-enabled/iredadmin.ini
+ for f in ${_uwsgi_confs}
+ rm -f '&>/dev/null'
+ for f in ${_uwsgi_confs}
+ rm -f /etc/uwsgi/apps-available/iredadmin.ini
+ for f in ${_uwsgi_confs}
+ rm -f '&>/dev/null'
+ for f in ${_uwsgi_confs}
+ rm -f /usr/local/etc/uwsgi/iredadmin.ini
+ for f in ${_uwsgi_confs}
+ rm -f /etc/uwsgi-enabled/iredadmin.ini
+ for f in ${_uwsgi_confs}
+ rm -f '&>/dev/null'
+ for f in ${_uwsgi_confs}
+ rm -f /etc/uwsgi-available/iredadmin.ini
+ for f in ${_uwsgi_confs}
+ rm -f '&>/dev/null'
# Remove 'uwsgi_XXX' from /etc/rc.conf on FreeBSD.
if [[ X"${DISTRO}" == X'FREEBSD' ]]; then
${SYSRC} -x uwsgi_enable &>/dev/null
${SYSRC} -x uwsgi_profiles &>/dev/null
${SYSRC} -x uwsgi_iredadmin_flags &>/dev/null
fi
+ [[ XUBUNTU == X\F\R\E\E\B\S\D ]]
# Update Nginx template file
export _restart_nginx='NO'
+ export _restart_nginx=NO
+ _restart_nginx=NO
for f in ${NGINX_SNIPPET_CONF} ${NGINX_SNIPPET_CONF2} ${NGINX_SNIPPET_CONF3}; do
if [[ -f ${f} ]]; then
if grep 'unix:.*iredadmin.socket' ${f} &>/dev/null; then
export _restart_nginx='YES'
perl -pi -e 's#uwsgi_pass unix:.*iredadmin.socket;#uwsgi_pass 127.0.0.1:7791;#g' ${f}
fi
fi
done
+ for f in ${NGINX_SNIPPET_CONF} ${NGINX_SNIPPET_CONF2} ${NGINX_SNIPPET_CONF3}
+ [[ -f /etc/nginx/templates/iredadmin.tmpl ]]
+ for f in ${NGINX_SNIPPET_CONF} ${NGINX_SNIPPET_CONF2} ${NGINX_SNIPPET_CONF3}
+ [[ -f /etc/nginx/templates/iredadmin-subdomain.tmpl ]]
+ for f in ${NGINX_SNIPPET_CONF} ${NGINX_SNIPPET_CONF2} ${NGINX_SNIPPET_CONF3}
+ [[ -f /etc/nginx/conf.d/default.conf ]]
if [[ X"${_restart_nginx}" == X'YES' ]]; then
restart_service nginx
fi
+ [[ XNO == X\Y\E\S ]]
# Update uwsgi ini config file
if [ -d ${NEW_IRA_ROOT_DIR}/rc_scripts/uwsgi ]; then
perl -pi -e 's#^chdir = (.*)#chdir = $ENV{HTTPD_SERVERROOT}/iredadmin#g' ${NEW_IRA_ROOT_DIR}/rc_scripts/uwsgi/*.ini
fi
+ '[' -d /usr/share/apache2/iRedAdmin-1.1/rc_scripts/uwsgi ']'
+ perl -pi -e 's#^chdir = (.*)#chdir = $ENV{HTTPD_SERVERROOT}/iredadmin#g' /usr/share/apache2/iRedAdmin-1.1/rc_scripts/uwsgi/debian.ini /usr/share/apache2/iRedAdmin-1.1/rc_scripts/uwsgi/freebsd.ini /usr/share/apache2/iRedAdmin-1.1/rc_scripts/uwsgi/openbsd.ini /usr/share/apache2/iRedAdmin-1.1/rc_scripts/uwsgi/rhel7.ini /usr/share/apache2/iRedAdmin-1.1/rc_scripts/uwsgi/rhel8.ini
# Copy rc script or systemd service file
if [ X"${USE_SYSTEMD}" == X'YES' ]; then
echo "* Remove existing systemd service files."
rm -f ${SYSTEMD_SERVICE_DIR}/iredadmin.service &>/dev/null
rm -f ${SYSTEMD_SERVICE_DIR2}/iredadmin.service &>/dev/null
rm -f ${SYSTEMD_SERVICE_USER_DIR}/iredadmin.service &>/dev/null
echo "* Copy systemd service file: ${SYSTEMD_SERVICE_DIR}/iredadmin.service."
if [ X"${DISTRO}" == X'RHEL' ]; then
cp -f ${NEW_IRA_ROOT_DIR}/rc_scripts/systemd/rhel${DISTRO_VERSION}.service ${SYSTEMD_SERVICE_DIR}/iredadmin.service
perl -pi -e 's#/opt/www#$ENV{HTTPD_SERVERROOT}#g' ${SYSTEMD_SERVICE_DIR}/iredadmin.service
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
cp -f ${NEW_IRA_ROOT_DIR}/rc_scripts/systemd/debian.service ${SYSTEMD_SERVICE_DIR}/iredadmin.service
perl -pi -e 's#/opt/www#$ENV{HTTPD_SERVERROOT}#g' ${SYSTEMD_SERVICE_DIR}/iredadmin.service
fi
chmod -R 0644 ${SYSTEMD_SERVICE_DIR}/iredadmin.service
systemctl daemon-reload &>/dev/null
else
if [ X"${DISTRO}" == X"FREEBSD" ]; then
cp ${NEW_IRA_ROOT_DIR}/rc_scripts/iredadmin.freebsd /usr/local/etc/rc.d/iredadmin
perl -pi -e 's#/opt/www#$ENV{HTTPD_SERVERROOT}#g' /usr/local/etc/rc.d/iredadmin
# Remove 'uwsgi_iredadmin_flags=' in /etc/rc.conf.local
if [ -f /etc/rc.conf.local ]; then
perl -pi -e 's#^uwsgi_iredadminflags=.*##g' /etc/rc.conf.local
fi
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
cp ${NEW_IRA_ROOT_DIR}/rc_scripts/iredadmin.openbsd ${DIR_RC_SCRIPTS}/iredadmin
perl -pi -e 's#/opt/www#$ENV{HTTPD_SERVERROOT}#g' /etc/rc.d/iredadmin
cp -f ${NEW_IRA_ROOT_DIR}/rc_scripts/iredadmin.openbsd /etc/rc.d/iredadmin
chmod 0755 /etc/rc.d/iredadmin
# Remove 'uwsgi_flags=' in /etc/rc.conf.local
if [ -f /etc/rc.conf.local ]; then
perl -pi -e 's#^uwsgi_flags=.*iredadmin.*##g' /etc/rc.conf.local
fi
fi
fi
+ '[' XYES == XYES ']'
+ echo '* Remove existing systemd service files.'
* Remove existing systemd service files.
+ rm -f /lib/systemd/system/iredadmin.service
+ rm -f /etc/systemd/system/iredadmin.service
+ rm -f /etc/systemd/system/multi-user.target.wants//iredadmin.service
+ echo '* Copy systemd service file: /lib/systemd/system/iredadmin.service.'
* Copy systemd service file: /lib/systemd/system/iredadmin.service.
+ '[' XUBUNTU == XRHEL ']'
+ '[' XUBUNTU == XDEBIAN -o XUBUNTU == XUBUNTU ']'
+ cp -f /usr/share/apache2/iRedAdmin-1.1/rc_scripts/systemd/debian.service /lib/systemd/system/iredadmin.service
+ perl -pi -e 's#/opt/www#$ENV{HTTPD_SERVERROOT}#g' /lib/systemd/system/iredadmin.service
+ chmod -R 0644 /lib/systemd/system/iredadmin.service
+ systemctl daemon-reload
# Set owner and permission.
chown -R ${IRA_HTTPD_USER}:${IRA_HTTPD_GROUP} ${NEW_IRA_ROOT_DIR}
+ chown -R iredadmin:iredadmin /usr/share/apache2/iRedAdmin-1.1
chmod -R 0555 ${NEW_IRA_ROOT_DIR}
+ chmod -R 0555 /usr/share/apache2/iRedAdmin-1.1
chmod 0400 ${NEW_IRA_ROOT_DIR}/settings.py
+ chmod 0400 /usr/share/apache2/iRedAdmin-1.1/settings.py
echo "* Removing old symbol link ${IRA_ROOT_DIR}"
+ echo '* Removing old symbol link /usr/share/apache2/iredadmin'
* Removing old symbol link /usr/share/apache2/iredadmin
rm -f ${IRA_ROOT_DIR}
+ rm -f /usr/share/apache2/iredadmin
echo "* Creating symbol link ${IRA_ROOT_DIR} to ${NEW_IRA_ROOT_DIR}"
+ echo '* Creating symbol link /usr/share/apache2/iredadmin to /usr/share/apache2/iRedAdmin-1.1'
* Creating symbol link /usr/share/apache2/iredadmin to /usr/share/apache2/iRedAdmin-1.1
cd ${HTTPD_SERVERROOT}
+ cd /usr/share/apache2
ln -s ${name_new_version} iredadmin
+ ln -s iRedAdmin-1.1 iredadmin
# Add missing setting parameters.
if grep 'amavisd_enable_logging.*True.*' ${IRA_CONF_PY} &>/dev/null; then
add_missing_parameter 'amavisd_enable_policy_lookup' True 'Enable per-recipient spam policy, white/blacklist.'
else
add_missing_parameter 'amavisd_enable_policy_lookup' False 'Enable per-recipient spam policy, white/blacklist.'
fi
+ grep 'amavisd_enable_logging.*True.*' /usr/share/apache2/iredadmin/settings.py
+ add_missing_parameter amavisd_enable_policy_lookup True 'Enable per-recipient spam policy, white/blacklist.'
+ var=amavisd_enable_policy_lookup
+ value=True
+ shift 2
+ comment='Enable per-recipient spam policy, white/blacklist.'
+ grep '^amavisd_enable_policy_lookup' /usr/share/apache2/iredadmin/settings.py
if ! grep '^iredapd_' ${IRA_CONF_PY} &>/dev/null; then
add_missing_parameter 'iredapd_enabled' True 'Enable iRedAPD integration.'
# Get iredapd db password from /opt/iredapd/settings.py.
if [ -f /opt/iredapd/settings.py ]; then
grep '^iredapd_db_' /opt/iredapd/settings.py >> ${IRA_CONF_PY}
perl -pi -e 's#iredapd_db_server#iredapd_db_host#g' ${IRA_CONF_PY}
else
# Check backend.
if egrep '^backend.*pgsql' ${IRA_CONF_PY} &>/dev/null; then
export IREDAPD_DB_PORT='5432'
else
export IREDAPD_DB_PORT='3306'
fi
add_missing_parameter 'iredapd_db_host' '127.0.0.1'
add_missing_parameter 'iredapd_db_port' ${IREDAPD_DB_PORT}
add_missing_parameter 'iredapd_db_name' 'iredapd'
add_missing_parameter 'iredapd_db_user' 'iredapd'
add_missing_parameter 'iredapd_db_password' 'password'
fi
fi
+ grep '^iredapd_' /usr/share/apache2/iredadmin/settings.py
perl -pi -e 's#iredapd_db_server#iredapd_db_host#g' ${IRA_CONF_PY}
+ perl -pi -e s#iredapd_db_server#iredapd_db_host#g /usr/share/apache2/iredadmin/settings.py
if ! grep '^fail2ban_' ${IRA_CONF_PY} &>/dev/null; then
# Try to get password of SQL user `fail2ban`.
if egrep '^backend.*(mysql|ldap)' ${IRA_CONF_PY} &>/dev/null; then
_my_cnf='/root/.my.cnf-fail2ban'
if [ -f ${_my_cnf} ]; then
_host="$(grep '^host=' ${_my_cnf} | awk -F'host=' '{print $2}' | strip_quotes)"
_port="$(grep '^port=' ${_my_cnf} | awk -F'port=' '{print $2}' | strip_quotes)"
_user="$(grep '^user=' ${_my_cnf} | awk -F'user=' '{print $2}' | strip_quotes)"
_password="$(grep '^password=' ${_my_cnf} | awk -F'password=' '{print $2}' | strip_quotes)"
[ X"${_host}" == X'' ] && _host='127.0.0.1'
[ X"${_port}" == X'' ] && _port='3306'
fi
elif egrep '^backend.*pgsql' ${IRA_CONF_PY} &>/dev/null; then
# Absolute path to ~/.pgpass
# - RHEL: /var/lib/pgsql/.pgpass
# - Debian/Ubuntu: /var/lib/postgresql/.pgpass
# - FreeBSD: /var/db/postgres/.pgpass
# - OpenBSD: /var/postgresql/.pgpass
for dir in \
/var/lib/pgsql \
/var/lib/postgresql \
/var/db/postgres \
/var/postgresql; do
_pgpass="${dir}/.pgpass"
if [ -f ${_pgpass} ]; then
if grep ':fail2ban:' ${_pgpass} &>/dev/null; then
_host="127.0.0.1"
_port="5432"
_user="fail2ban"
_password="$(grep ':fail2ban:' ${_pgpass} | awk -F':' '{print $NF}')"
break
fi
fi
done
fi
if [ X"${_host}" != X'' ] && \
[ X"${_port}" != X'' ] && \
[ X"${_user}" != X'' ] && \
[ X"${_password}" != X'' ]; then
echo "* Enable Fail2ban SQL integration."
add_missing_parameter 'fail2ban_enabled' 'True'
add_missing_parameter 'fail2ban_db_host' "${_host}"
add_missing_parameter 'fail2ban_db_port' "${_port}"
add_missing_parameter 'fail2ban_db_name' "fail2ban"
add_missing_parameter 'fail2ban_db_user' "${_user}"
add_missing_parameter 'fail2ban_db_password' "${_password}"
fi
fi
+ grep '^fail2ban_' /usr/share/apache2/iredadmin/settings.py
+ egrep '^backend.*(mysql|ldap)' /usr/share/apache2/iredadmin/settings.py
+ _my_cnf=/root/.my.cnf-fail2ban
+ '[' -f /root/.my.cnf-fail2ban ']'
+ '[' X '!=' X ']'
# FreeBSD uses /var/run/log for syslog.
if [ X"${DISTRO}" == X'FREEBSD' ]; then
add_missing_parameter 'SYSLOG_SERVER' '/var/run/log'
fi
+ '[' XUBUNTU == XFREEBSD ']'
#
# Enable mlmmj integration
#
if [ -e /opt/mlmmjadmin ]; then
echo "* Enable mlmmj integration."
# Force to use backend `bk_none`.
perl -pi -e 's#^(backend_api).*#${1} = "bk_none"#g' /opt/mlmmjadmin/settings.py
if egrep '^backend.*(ldap)' ${IRA_CONF_PY} &>/dev/null; then
perl -pi -e 's#^(backend_cli).*#${1} = "bk_iredmail_ldap"#g' /opt/mlmmjadmin/settings.py
else
perl -pi -e 's#^(backend_cli).*#${1} = "bk_iredmail_sql"#g' /opt/mlmmjadmin/settings.py
fi
# Add parameter `mlmmjadmin_api_auth_token` if missing
if ! grep '^mlmmjadmin_api_auth_token' ${IRA_CONF_PY} >/dev/null; then
# Get first api auth token
token=$(grep '^api_auth_tokens' /opt/mlmmjadmin/settings.py | awk -F"[=\']" '{print $3}' | tr -d '\n')
echo -e "\nmlmmjadmin_api_auth_token = '${token}'" >> ${IRA_CONF_PY}
fi
echo "* Restarting service: mlmmjadmin."
restart_service mlmmjadmin
fi
+ '[' -e /opt/mlmmjadmin ']'
+ echo '* Enable mlmmj integration.'
* Enable mlmmj integration.
+ perl -pi -e 's#^(backend_api).*#${1} = "bk_none"#g' /opt/mlmmjadmin/settings.py
+ egrep '^backend.*(ldap)' /usr/share/apache2/iredadmin/settings.py
+ perl -pi -e 's#^(backend_cli).*#${1} = "bk_iredmail_sql"#g' /opt/mlmmjadmin/settings.py
+ grep '^mlmmjadmin_api_auth_token' /usr/share/apache2/iredadmin/settings.py
+ echo '* Restarting service: mlmmjadmin.'
* Restarting service: mlmmjadmin.
+ restart_service mlmmjadmin
+ srv=mlmmjadmin
+ '[' XLINUX == XLINUX ']'
+ '[' XYES == XYES ']'
+ systemctl restart mlmmjadmin
+ '[' X0 '!=' X0 ']'
# Change old parameter names to the new ones:
#
# - ADDITION_USER_SERVICES -> ADDITIONAL_ENABLED_USER_SERVICES
# - LDAP_SERVER_NAME -> LDAP_SERVER_PRODUCT_NAME
perl -pi -e 's#ADDITION_USER_SERVICES#ADDITIONAL_ENABLED_USER_SERVICES#g' ${IRA_CONF_PY}
+ perl -pi -e s#ADDITION_USER_SERVICES#ADDITIONAL_ENABLED_USER_SERVICES#g /usr/share/apache2/iredadmin/settings.py
perl -pi -e 's#LDAP_SERVER_NAME#LDAP_SERVER_PRODUCT_NAME#g' ${IRA_CONF_PY}
+ perl -pi -e s#LDAP_SERVER_NAME#LDAP_SERVER_PRODUCT_NAME#g /usr/share/apache2/iredadmin/settings.py
# Remove deprecated setting: ENABLE_SELF_SERVICE, it's now a per-domain setting.
perl -pi -e 's#^(ENABLE_SELF_SERVICE.*)##g' ${IRA_CONF_PY}
+ perl -pi -e 's#^(ENABLE_SELF_SERVICE.*)##g' /usr/share/apache2/iredadmin/settings.py
# Dependent packages.
export REQUIRED_PKGS=""
+ export REQUIRED_PKGS=
+ REQUIRED_PKGS=
export PIP3_MODS=""
+ export PIP3_MODS=
+ PIP3_MODS=
# Python modules.
export PKG_PY_PIP='python3-pip'
+ export PKG_PY_PIP=python3-pip
+ PKG_PY_PIP=python3-pip
export PKG_PY_LDAP='python3-ldap'
+ export PKG_PY_LDAP=python3-ldap
+ PKG_PY_LDAP=python3-ldap
export PKG_PY_MYSQL='python3-pymysql'
+ export PKG_PY_MYSQL=python3-pymysql
+ PKG_PY_MYSQL=python3-pymysql
export PKG_PY_PGSQL='python3-psycopg2'
+ export PKG_PY_PGSQL=python3-psycopg2
+ PKG_PY_PGSQL=python3-psycopg2
export PKG_PY_JSON='python3-simplejson'
+ export PKG_PY_JSON=python3-simplejson
+ PKG_PY_JSON=python3-simplejson
export PKG_PY_DNS='python3-dnspython'
+ export PKG_PY_DNS=python3-dnspython
+ PKG_PY_DNS=python3-dnspython
export PKG_PY_REQUESTS='python3-requests'
+ export PKG_PY_REQUESTS=python3-requests
+ PKG_PY_REQUESTS=python3-requests
export PKG_PY_JINJA='python3-jinja2'
+ export PKG_PY_JINJA=python3-jinja2
+ PKG_PY_JINJA=python3-jinja2
# Python modules installed with pip3: uwsgi.
if [ X"${DISTRO}" == X'RHEL' ]; then
if [ X"${DISTRO_VERSION}" == X'7' ]; then
export PKG_PY_MYSQL='python36-PyMySQL'
export PKG_PY_JSON='python36-simplejson'
export PKG_PY_JINJA='python36-jinja2'
export REQUIRED_PKGS="${REQUIRED_PKGS} uwsgi uwsgi-plugin-python36 uwsgi-plugin-syslog"
else
if [ ! -x ${CMD_UWSGI} ]; then
export REQUIRED_PKGS="${REQUIRED_PKGS} python3-devel python3-pip"
export PIP3_MODS="${PIP3_MODS} uwsgi"
fi
fi
export PKG_PY_DNS='python3-dns'
elif [ X"${DISTRO}" == X'DEBIAN' -o X"${DISTRO}" == X'UBUNTU' ]; then
export REQUIRED_PKGS="${REQUIRED_PKGS} uwsgi-core uwsgi-plugin-python3"
if [ X"${DISTRO_VERSION}" == X'9' ]; then
export PKG_PY_LDAP='python3-pyldap'
else
export PKG_PY_LDAP='python3-ldap'
fi
elif [ X"${DISTRO}" == X'OPENBSD' ]; then
export PKG_PY_PIP='py3-pip'
export PKG_PY_JSON='py3-simplejson'
export PKG_PY_DNS='py3-dnspython'
export PKG_PY_REQUESTS='py3-requests'
export PKG_PY_JINJA='py3-jinja2'
if [ ! -x ${CMD_UWSGI} ]; then
export PIP3_MODS="${PIP3_MODS} uwsgi"
fi
elif [ X"${DISTRO}" == X'FREEBSD' ]; then
export PKG_PY_PIP='devel/py-pip'
export PKG_UWSGI="www/uwsgi"
export PKG_PY_JSON='devel/py-simplejson'
export PKG_PY_DNS='dns/py-dnspython'
export PKG_PY_REQUESTS='www/py-requests'
export PKG_PY_JINJA='devel/py-Jinja2'
if [ ! -x ${CMD_UWSGI} ]; then
export REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_UWSGI}"
fi
fi
+ '[' XUBUNTU == XRHEL ']'
+ '[' XUBUNTU == XDEBIAN -o XUBUNTU == XUBUNTU ']'
+ export 'REQUIRED_PKGS= uwsgi-core uwsgi-plugin-python3'
+ REQUIRED_PKGS=' uwsgi-core uwsgi-plugin-python3'
+ '[' X18.04 == X9 ']'
+ export PKG_PY_LDAP=python3-ldap
+ PKG_PY_LDAP=python3-ldap
echo "* Check and install required packages."
+ echo '* Check and install required packages.'
* Check and install required packages.
if egrep '^backend.*ldap' ${IRA_CONF_PY} &>/dev/null; then
[ X"$(has_python_module ldap)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_LDAP}"
[ X"$(has_python_module pymysql)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_MYSQL}"
elif egrep '^backend.*mysql' ${IRA_CONF_PY} &>/dev/null; then
[ X"$(has_python_module pymysql)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_MYSQL}"
elif egrep '^backend.*pgsql' ${IRA_CONF_PY} &>/dev/null; then
[ X"$(has_python_module psycopg2)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_PGSQL}"
fi
+ egrep '^backend.*ldap' /usr/share/apache2/iredadmin/settings.py
+ egrep '^backend.*mysql' /usr/share/apache2/iredadmin/settings.py
++ has_python_module pymysql
++ mod=pymysql
++ /usr/bin/python3 -c 'import pymysql'
++ '[' X0 == X0 ']'
++ echo YES
+ '[' XYES == XNO ']'
[ X"$(has_python_module pip)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_PIP}"
++ has_python_module pip
++ mod=pip
++ /usr/bin/python3 -c 'import pip'
++ '[' X0 == X0 ']'
++ echo YES
+ '[' XYES == XNO ']'
[ X"$(has_python_module simplejson)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_JSON}"
++ has_python_module simplejson
++ mod=simplejson
++ /usr/bin/python3 -c 'import simplejson'
++ '[' X0 == X0 ']'
++ echo YES
+ '[' XYES == XNO ']'
[ X"$(has_python_module dns)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_DNS}"
++ has_python_module dns
++ mod=dns
++ /usr/bin/python3 -c 'import dns'
++ '[' X0 == X0 ']'
++ echo YES
+ '[' XYES == XNO ']'
[ X"$(has_python_module requests)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_REQUESTS}"
++ has_python_module requests
++ mod=requests
++ /usr/bin/python3 -c 'import requests'
++ '[' X0 == X0 ']'
++ echo YES
+ '[' XYES == XNO ']'
if [ X"$(has_python_module web)" == X'NO' ]; then
PIP3_MODS="${PIP3_MODS} web.py>=0.61"
else # Verify module version.
_webpy_ver=$(${CMD_PYTHON3} -c "import web; print(web.__version__)")
if echo ${_webpy_ver} | grep '^0\.[45]' &>/dev/null; then
PIP3_MODS="${PIP3_MODS} web.py>=0.61"
fi
fi
++ has_python_module web
++ mod=web
++ /usr/bin/python3 -c 'import web'
++ '[' X0 == X0 ']'
++ echo YES
+ '[' XYES == XNO ']'
++ /usr/bin/python3 -c 'import web; print(web.__version__)'
+ _webpy_ver=0.51
+ grep '^0\.[45]'
+ echo 0.51
+ PIP3_MODS=' web.py>=0.61'
[ X"$(has_python_module jinja2)" == X'NO' ] && REQUIRED_PKGS="${REQUIRED_PKGS} ${PKG_PY_JINJA}"
++ has_python_module jinja2
++ mod=jinja2
++ /usr/bin/python3 -c 'import jinja2'
++ '[' X0 == X0 ']'
++ echo YES
+ '[' XYES == XNO ']'
if [ X"${REQUIRED_PKGS}" != X'' ]; then
install_pkg ${REQUIRED_PKGS}
if [ X"$?" != X'0' ]; then
echo "Package installation failed, please check console output and fix it manually."
exist 255
fi
fi
+ '[' 'X uwsgi-core uwsgi-plugin-python3' '!=' X ']'
+ install_pkg uwsgi-core uwsgi-plugin-python3
+ echo 'Install package(s): uwsgi-core' uwsgi-plugin-python3
Install package(s): uwsgi-core uwsgi-plugin-python3
+ '[' XUBUNTU == XRHEL ']'
+ '[' XUBUNTU == XDEBIAN -o XUBUNTU == XUBUNTU ']'
+ apt-get install -y uwsgi-core uwsgi-plugin-python3
Reading package lists... Done
Building dependency tree
Reading state information... Done
uwsgi-core is already the newest version (2.0.15-10.2ubuntu2.1).
uwsgi-plugin-python3 is already the newest version (2.0.15-10.2ubuntu2.1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+ '[' X0 '!=' X0 ']'
if [ X"${PIP3_MODS}" != X'' ]; then
${CMD_PIP3} install -U ${PIP3_MODS}
if [ X"$?" != X'0' ]; then
echo "Package installation failed, please check console output and fix it manually."
exist 255
fi
fi
+ '[' 'X web.py>=0.61' '!=' X ']'
+ /usr/bin/pip3 install -U 'web.py>=0.61'
The directory '/home/USERNAME/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/USERNAME/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting web.py>=0.61
Requirement already up-to-date: cheroot in /usr/local/lib/python3.6/dist-packages (from web.py>=0.61)
Requirement already up-to-date: more-itertools>=2.6 in /usr/local/lib/python3.6/dist-packages (from cheroot->web.py>=0.61)
Requirement already up-to-date: jaraco.functools in /usr/local/lib/python3.6/dist-packages (from cheroot->web.py>=0.61)
Requirement already up-to-date: six>=1.11.0 in /usr/local/lib/python3.6/dist-packages (from cheroot->web.py>=0.61)
Installing collected packages: web.py
Found existing installation: web.py 0.51
Uninstalling web.py-0.51:
Successfully uninstalled web.py-0.51
Successfully installed web.py-0.62
+ '[' X0 '!=' X0 ']'
#------------------------------------------
# Add new SQL tables, drop deprecated ones.
#
export ira_db_host="$(get_iredadmin_setting 'iredadmin_db_host')"
++ get_iredadmin_setting iredadmin_db_host
++ var=iredadmin_db_host
+++ strip_quotes
+++ awk '{print $NF}'
+++ grep '^iredadmin_db_host' /usr/share/apache2/iredadmin/settings.py
++++ cat
+++ str='"127.0.0.1"'
++++ tr -d \'
++++ tr -d '"'
++++ echo '"127.0.0.1"'
+++ value=127.0.0.1
+++ echo 127.0.0.1
++ value=127.0.0.1
++ echo 127.0.0.1
+ export ira_db_host=127.0.0.1
+ ira_db_host=127.0.0.1
export ira_db_port="$(get_iredadmin_setting 'iredadmin_db_port')"
++ get_iredadmin_setting iredadmin_db_port
++ var=iredadmin_db_port
+++ strip_quotes
+++ awk '{print $NF}'
+++ grep '^iredadmin_db_port' /usr/share/apache2/iredadmin/settings.py
++++ cat
+++ str=3306
++++ tr -d \'
++++ tr -d '"'
++++ echo 3306
+++ value=3306
+++ echo 3306
++ value=3306
++ echo 3306
+ export ira_db_port=3306
+ ira_db_port=3306
export ira_db_name="$(get_iredadmin_setting 'iredadmin_db_name')"
++ get_iredadmin_setting iredadmin_db_name
++ var=iredadmin_db_name
+++ strip_quotes
+++ awk '{print $NF}'
+++ grep '^iredadmin_db_name' /usr/share/apache2/iredadmin/settings.py
++++ cat
+++ str='"iredadmin"'
++++ tr -d \'
++++ tr -d '"'
++++ echo '"iredadmin"'
+++ value=iredadmin
+++ echo iredadmin
++ value=iredadmin
++ echo iredadmin
+ export ira_db_name=iredadmin
+ ira_db_name=iredadmin
export ira_db_user="$(get_iredadmin_setting 'iredadmin_db_user')"
++ get_iredadmin_setting iredadmin_db_user
++ var=iredadmin_db_user
+++ strip_quotes
+++ awk '{print $NF}'
+++ grep '^iredadmin_db_user' /usr/share/apache2/iredadmin/settings.py
++++ cat
+++ str='"iredadmin"'
++++ tr -d \'
++++ tr -d '"'
++++ echo '"iredadmin"'
+++ value=iredadmin
+++ echo iredadmin
++ value=iredadmin
++ echo iredadmin
+ export ira_db_user=iredadmin
+ ira_db_user=iredadmin
export ira_db_password="$(get_iredadmin_setting 'iredadmin_db_password')"
---------lines removed for security
#
# Update sql tables
#
psql_conn="psql -h ${ira_db_host} \
-p ${ira_db_port} \
-U ${ira_db_user} \
-d ${ira_db_name}"
+ psql_conn='psql -h 127.0.0.1 -p 3306 -U iredadmin -d iredadmin'
if egrep '^backend.*(mysql|ldap)' ${IRA_CONF_PY} &>/dev/null; then
echo "* Check SQL tables, and add missed ones - if there's any"
${CMD_MYSQL} ${ira_db_name} -e "SOURCE ${IRA_ROOT_DIR}/SQL/iredadmin.mysql"
${CMD_MYSQL} ${ira_db_name} -e "ALTER TABLE log MODIFY COLUMN msg TEXT;"
# Add column `tracking.id`.
${CMD_MYSQL} ${ira_db_name} -e "DESC tracking \G" | grep 'Field: id' &>/dev/null
if [ X"$?" != X'0' ]; then
${CMD_MYSQL} ${ira_db_name} -e "ALTER TABLE tracking ADD COLUMN id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY;"
fi
# Set column `id` to `PRIMARY KEY`
_tables='deleted_mailboxes updatelog log tracking'
for _table in ${_tables}; do
${CMD_MYSQL} ${ira_db_name} -e "DESC ${_table}" | grep '^id.*PRI.*auto_increment' &>/dev/null
if [ X"$?" != X'0' ]; then
${CMD_MYSQL} ${ira_db_name} -e "ALTER TABLE ${_table} ADD PRIMARY KEY (id)"
fi
done
elif egrep '^backend.*pgsql' ${IRA_CONF_PY} &>/dev/null; then
export PGPASSWORD="${ira_db_password}"
# Allow log.msg to store long text.
${psql_conn} <<EOF
ALTER TABLE log ALTER COLUMN msg TYPE TEXT;
EOF
# SQL table: tracking.
${psql_conn} -c '\d' | grep '\<tracking\>' &>/dev/null
if [ X"$?" != X'0' ]; then
echo "* [SQL] Add new table: iredadmin.tracking."
${psql_conn} <<EOF
CREATE TABLE tracking (
id SERIAL PRIMARY KEY,
k VARCHAR(50) NOT NULL,
v TEXT,
time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE UNIQUE INDEX idx_tracking_k ON tracking (k);
EOF
fi
# Set column `tracking.id` to `PRIMARY KEY`
# SQL table: domain_ownership.
${psql_conn} -c '\d' | grep '\<domain_ownership\>' &>/dev/null
if [ X"$?" != X'0' ]; then
echo "* [SQL] Add new table: iredadmin.domain_ownership."
${psql_conn} <<EOF
CREATE TABLE domain_ownership (
id SERIAL PRIMARY KEY,
admin VARCHAR(255) NOT NULL DEFAULT '',
domain VARCHAR(255) NOT NULL DEFAULT '',
alias_domain VARCHAR(255) NOT NULL DEFAULT '',
verify_code VARCHAR(100) NOT NULL DEFAULT '',
verified INT2 NOT NULL DEFAULT 0,
message TEXT,
last_verify TIMESTAMP NULL DEFAULT NULL,
expire INT DEFAULT 0
);
CREATE UNIQUE INDEX idx_ownership_1 ON domain_ownership (admin, domain, alias_domain);
CREATE INDEX idx_ownership_2 ON domain_ownership (verified);
EOF
fi
# SQL table: newsletter_subunsub_confirms.
${psql_conn} -c '\d' | grep '\<newsletter_subunsub_confirms\>' &>/dev/null
if [ X"$?" != X'0' ]; then
echo "* [SQL] Add new table: iredadmin.newsletter_subunsub_confirms."
_sql="$(cat ${IRA_ROOT_DIR}/SQL/snippets/newsletter_subunsub_confirms.pgsql)"
${psql_conn} <<EOF
${_sql}
EOF
unset _sql
fi
# SQL table: settings.
${psql_conn} -c '\d' | grep '\<settings\>' &>/dev/null
if [ X"$?" != X'0' ]; then
echo "* [SQL] Add new table: iredadmin.settings."
_sql="$(cat ${IRA_ROOT_DIR}/SQL/snippets/settings.pgsql)"
${psql_conn} <<EOF
${_sql}
EOF
unset _sql
fi
fi
+ egrep '^backend.*(mysql|ldap)' /usr/share/apache2/iredadmin/settings.py
+ echo '* Check SQL tables, and add missed ones - if there'\''s any'
* Check SQL tables, and add missed ones - if there's any
+ mysql --defaults-file=/root/.my.cnf -u root iredadmin -e 'SOURCE /usr/share/apache2/iredadmin/SQL/iredadmin.mysql'
+ mysql --defaults-file=/root/.my.cnf -u root iredadmin -e 'ALTER TABLE log MODIFY COLUMN msg TEXT;'
+ grep 'Field: id'
+ mysql --defaults-file=/root/.my.cnf -u root iredadmin -e 'DESC tracking \G'
+ '[' X0 '!=' X0 ']'
+ _tables='deleted_mailboxes updatelog log tracking'
+ for _table in ${_tables}
+ grep '^id.*PRI.*auto_increment'
+ mysql --defaults-file=/root/.my.cnf -u root iredadmin -e 'DESC deleted_mailboxes'
+ '[' X0 '!=' X0 ']'
+ for _table in ${_tables}
+ grep '^id.*PRI.*auto_increment'
+ mysql --defaults-file=/root/.my.cnf -u root iredadmin -e 'DESC updatelog'
+ '[' X0 '!=' X0 ']'
+ for _table in ${_tables}
+ grep '^id.*PRI.*auto_increment'
+ mysql --defaults-file=/root/.my.cnf -u root iredadmin -e 'DESC log'
+ '[' X0 '!=' X0 ']'
+ for _table in ${_tables}
+ grep '^id.*PRI.*auto_increment'
+ mysql --defaults-file=/root/.my.cnf -u root iredadmin -e 'DESC tracking'
+ '[' X0 '!=' X0 ']'
#------------------------------
# Cron job.
#
[[ -d ${CRON_SPOOL_DIR} ]] || mkdir -p ${CRON_SPOOL_DIR} &>/dev/null
+ [[ -d /var/spool/cron/crontabs ]]
if [[ ! -f ${CRON_FILE_ROOT} ]]; then
touch ${CRON_FILE_ROOT} &>/dev/null
chmod 0600 ${CRON_FILE_ROOT} &>/dev/null
fi
+ [[ ! -f /var/spool/cron/crontabs/root ]]
# cron job: clean up database.
if ! grep 'iredadmin/tools/cleanup_db.py' ${CRON_FILE_ROOT} &>/dev/null; then
cat >> ${CRON_FILE_ROOT} <<EOF
# iRedAdmin: Clean up sql database.
1 * * * * ${CMD_PYTHON3} ${IRA_ROOT_DIR}/tools/cleanup_db.py &>/dev/null
EOF
fi
+ grep iredadmin/tools/cleanup_db.py /var/spool/cron/crontabs/root
# cron job: clean up database.
if ! grep 'iredadmin/tools/delete_mailboxes.py' ${CRON_FILE_ROOT} &>/dev/null; then
cat >> ${CRON_FILE_ROOT} <<EOF
# iRedAdmin: Remove mailboxes which are scheduled to be removed.
1 3 * * * ${CMD_PYTHON3} ${IRA_ROOT_DIR}/tools/delete_mailboxes.py
EOF
fi
+ grep iredadmin/tools/delete_mailboxes.py /var/spool/cron/crontabs/root
echo "* Replace py2 by py3 in cron jobs."
+ echo '* Replace py2 by py3 in cron jobs.'
* Replace py2 by py3 in cron jobs.
perl -pi -e 's#(.*) python (.*/iredadmin/tools/.*)#${1} $ENV{CMD_PYTHON3} ${2}#' ${CRON_FILE_ROOT}
+ perl -pi -e 's#(.*) python (.*/iredadmin/tools/.*)#${1} $ENV{CMD_PYTHON3} ${2}#' /var/spool/cron/crontabs/root
perl -pi -e 's#(.*) python2 (.*/iredadmin/tools/.*)#${1} $ENV{CMD_PYTHON3} ${2}#' ${CRON_FILE_ROOT}
+ perl -pi -e 's#(.*) python2 (.*/iredadmin/tools/.*)#${1} $ENV{CMD_PYTHON3} ${2}#' /var/spool/cron/crontabs/root
perl -pi -e 's#(.*)/usr/bin/python (.*/iredadmin/tools/.*)#${1}$ENV{CMD_PYTHON3} ${2}#' ${CRON_FILE_ROOT}
+ perl -pi -e 's#(.*)/usr/bin/python (.*/iredadmin/tools/.*)#${1}$ENV{CMD_PYTHON3} ${2}#' /var/spool/cron/crontabs/root
perl -pi -e 's#(.*)/usr/bin/python2 (.*/iredadmin/tools/.*)#${1}$ENV{CMD_PYTHON3} ${2}#' ${CRON_FILE_ROOT}
+ perl -pi -e 's#(.*)/usr/bin/python2 (.*/iredadmin/tools/.*)#${1}$ENV{CMD_PYTHON3} ${2}#' /var/spool/cron/crontabs/root
perl -pi -e 's#(.*)/usr/local/bin/python (.*/iredadmin/tools/.*)#${1}$ENV{CMD_PYTHON3} ${2}#' ${CRON_FILE_ROOT}
+ perl -pi -e 's#(.*)/usr/local/bin/python (.*/iredadmin/tools/.*)#${1}$ENV{CMD_PYTHON3} ${2}#' /var/spool/cron/crontabs/root
perl -pi -e 's#(.*)/usr/local/bin/python2 (.*/iredadmin/tools/.*)#${1}$ENV{CMD_PYTHON3} ${2}#' ${CRON_FILE_ROOT}
+ perl -pi -e 's#(.*)/usr/local/bin/python2 (.*/iredadmin/tools/.*)#${1}$ENV{CMD_PYTHON3} ${2}#' /var/spool/cron/crontabs/root
echo "* Clean up."
+ echo '* Clean up.'
* Clean up.
cd ${NEW_IRA_ROOT_DIR}/
+ cd /usr/share/apache2/iRedAdmin-1.1/
rm -f settings.pyc settings.pyo tools/settings.py
+ rm -f settings.pyc settings.pyo tools/settings.py
if [[ -f ${NEW_IRA_ROOT_DIR}/libs/form_utils.py ]]; then
# Not a trial license.
cd ${NEW_IRA_ROOT_DIR}
find . -name '*.so' | xargs rm -f {}
cd - &>/dev/null
fi
+ [[ -f /usr/share/apache2/iRedAdmin-1.1/libs/form_utils.py ]]
+ cd /usr/share/apache2/iRedAdmin-1.1
+ xargs rm -f '{}'
+ find . -name '*.so'
+ cd -
# Delete all sessions to force admins to re-login.
cd ${NEW_IRA_ROOT_DIR}/tools/
+ cd /usr/share/apache2/iRedAdmin-1.1/tools/
${CMD_PYTHON3} delete_sessions.py
+ /usr/bin/python3 delete_sessions.py
* Delete all existing sessions to force all admins to re-login.
echo "* iRedAdmin has been successfully upgraded."
+ echo '* iRedAdmin has been successfully upgraded.'
* iRedAdmin has been successfully upgraded.
restart_web_service
+ restart_web_service
+ export web_service=apache2
+ web_service=apache2
+ '[' -f /var/run/nginx.pid ']'
+ echo '* Restarting apache2 service.'
* Restarting apache2 service.
+ '[' XLINUX == XLINUX ']'
+ '[' XUBUNTU == XRHEL -a Xapache2 == Xuwsgi ']'
+ service apache2 restart
+ '[' X0 '!=' X0 ']'
# Enable and restart service
enable_service iredadmin
+ enable_service iredadmin
+ srv=iredadmin
+ echo '* Enable service: iredadmin'
* Enable service: iredadmin
+ '[' XUBUNTU == XRHEL ']'
+ '[' XUBUNTU == XDEBIAN -o XUBUNTU == XUBUNTU ']'
+ '[' XYES == XYES ']'
+ systemctl enable iredadmin
Created symlink /etc/systemd/system/multi-user.target.wants/iredadmin.service -> /lib/systemd/system/iredadmin.service.
restart_service iredadmin
+ restart_service iredadmin
+ srv=iredadmin
+ '[' XLINUX == XLINUX ']'
+ '[' XYES == XYES ']'
+ systemctl restart iredadmin
+ '[' X0 '!=' X0 ']'
echo "* Upgrading completed."
+ echo '* Upgrading completed.'
* Upgrading completed.
cat <<EOF
<<< NOTE >>> If iRedAdmin doesn't work as expected, please post your issue in
<<< NOTE >>> our online support forum: http://www.iredmail.org/forum/
EOF
+ cat
<<< NOTE >>> If iRedAdmin doesn't work as expected, please post your issue in
<<< NOTE >>> our online support forum: http://www.iredmail.org/forum/
/root/iRedAdmin-1.1/tools#