#!/bin/bash

BACKUP="backup_2020_05_13_06_47_53.zip"
ARCHIVE="apache-openmeetings-5.0.0-M5-SNAPSHOT.tar.gz"
DBCONNECTOR="mysql-connector-java-8.0.20.jar"
OMPATH="/opt/openmeetings"
USER="openmeetings"
GROUP="openmeetings"
TIMEZONE="Europe/Moscow"
DATABASE_TYPE="mysql"
DATABASE_HOST="localhost"
DATABASE_NAME="openmeetings"
DATABASE_USER="openmeetings"
DATABASE_PASSWORD="DATABASEPASSWORD"
DOMAIN="example.org"
# keystore have priority, if not defined or exist will try certificates
KEYSTORE="example.jks"
KEYSTORE_PASSWORD="openmeetings"
CERTIFICATE="example.org.crt"
CERTIFICATE_KEY="example.org.key"
CERTIFICATE_CHAIN="lets-encrypt-x3-cross-signed.pem"
PORT_HTTP="80"
PORT_HTTPS="443"
TURN_PASSWORD="SECRETTURNPASSWORD"
PATCHES=("openmeetings-5.0.0-M5-http2https.patch" "openmeetings-5.0.0-M5-acme_tiny.patch")

CURRENT=`pwd`
systemctl stop openmeetings && (
    if [[ -e "${OMPATH}" ]]; then
        rm -rf "${OMPATH}"
    fi
) && \
mkdir "${OMPATH}" && \
tar zxf "${ARCHIVE}" -C "${OMPATH}" --strip-components=1 && \
(
    if [[ "${KEYSTORE}" != "" && -f "${KEYSTORE}" ]]; then
        echo "installing keystore..." && \
        cp "${KEYSTORE}" "${OMPATH}/conf/${KEYSTORE}"
        sed -i "s/certificateKeystoreFile=\".*\"/certificateKeystoreFile=\"conf\/${KEYSTORE}\"/g" "${OMPATH}/conf/server.xml" && \
        sed -i "s/certificateKeystorePassword=\".*\"/certificateKeystorePassword=\"${KEYSTORE_PASSWORD}\"/g" "${OMPATH}/conf/server.xml"
    elif [[ -f "${CURRENT}/${CERTIFICATE}" && -f "${CURRENT}/${CERTIFICATE_KEY}" ]]; then
        echo "installing certificate and private key..." && \
        mkdir "${OMPATH}/ssl" && \
        cp "${CURRENT}/${CERTIFICATE}" "${OMPATH}/ssl/${CERTIFICATE}" && \
        cp "${CURRENT}/${CERTIFICATE_KEY}" "${OMPATH}/ssl/${CERTIFICATE_KEY}" && \
        sed -i "s/certificateKeystoreFile=\".*\"/certificateFile=\"ssl\/${CERTIFICATE}\"/g" "${OMPATH}/conf/server.xml" && \
        sed -i "s/certificateKeystorePassword=\".*\"/certificateKeyFile=\"ssl\/${CERTIFICATE_KEY}\"/g" "${OMPATH}/conf/server.xml" && \
        if [[ -f "${CURRENT}/${CERTIFICATE_CHAIN}" ]]; then
            echo "installing certificate chain..." && \
            cp "${CURRENT}/${CERTIFICATE_CHAIN}" "${OMPATH}/ssl/${CERTIFICATE_CHAIN}" && \
            sed -i "s/certificateKeystoreType=\".*\"/certificateChainFile=\"ssl\/${CERTIFICATE_CHAIN}\"/g" "${OMPATH}/conf/server.xml"
        else
            sed -i "s/certificateKeystoreType=\".*\"//g" conf/server.xml
        fi
    else
        echo "there are no keystore or certificates found, skipped"
        exit 0
    fi

    rm "${OMPATH}/conf/localhost.jks"
) && \
echo "installing database connector..." && \
cp "${DBCONNECTOR}" "${OMPATH}/webapps/openmeetings/WEB-INF/lib/${DBCONNECTOR}" && \
echo "setting permissions..." && \
chown -R "${USER}:${GROUP}" "${OMPATH}" && \
find "${OMPATH}" -type d -exec chmod 750 {} \; && \
find "${OMPATH}" -type f -exec chmod 640 {} \; && \
find "${OMPATH}" -type f -name '*.sh' -exec chmod 750 {} \; && \
cd "${OMPATH}" && \
(
    for PATCH in "${PATCHES[@]}"; do
        echo "applying patch ${PATCH}..." && \
        patch -p1 < "${CURRENT}/${PATCH}"
    done
) && \
echo "configuring settings..." && \
sed -i "s/\"5080\"/\"${PORT_HTTP}\"/g" conf/server.xml && \
sed -i "s/\"5443\"/\"${PORT_HTTPS}\"/g" conf/server.xml && \
sed -i "s/\"localhost\"/\"${DOMAIN}\"/g" conf/server.xml && \
sed -i "s/localhost_access_log/${DOMAIN}_access_log/" conf/server.xml
sed -i "s/p:turnUrl=\".*\"/p:turnUrl=\"${DOMAIN}\"/" webapps/openmeetings/WEB-INF/classes/applicationContext.xml && \
sed -i "s/p:turnSecret=\".*\"/p:turnSecret=\"${TURN_PASSWORD}\"/" webapps/openmeetings/WEB-INF/classes/applicationContext.xml && \
(
    if [[ "${BACKUP}" != "" && -f "${CURRENT}/${BACKUP}" ]]; then
        echo "preparing backup..." && \
        cp -f "${CURRENT}/${BACKUP}" "${OMPATH}/${BACKUP}" && \
        chown "${USER}:${GROUP}" "${OMPATH}/${BACKUP}" && \
        echo "starting backup restore..." && \
        sudo -u "${USER}" ./admin.sh -v -i -tz "${TIMEZONE}" --db-type "${DATABASE_TYPE}" --db-host "${DATABASE_HOST}" -db-name "${DATABASE_NAME}" --db-user "${DATABASE_USER}" --db-pass "${DATABASE_PASSWORD}" -file "${OMPATH}/${BACKUP}" --drop --skip-default-object && \
        rm "${OMPATH}/${BACKUP}"
    else
        echo "backup not found, importing skipped!"
    fi
) && \
systemctl start openmeetings && \
echo "SUCCESS: installation has been completed successfully!" || echo "ERROR: installation failed!"

cd "${CURRENT}"
