#!/bin/bash

#
# ScoDoc 8: install third-party software necessary for our installation
# starting for a minimal Debian (Buster, 10.0) install.
#
# E. Viennet, Jun 2008, Apr 2009, Sept 2011, Sept 2013, Nov 2013, Mar 2017, Jul 2017, 
# Jun 2019, Oct 2019, Dec 2020, Jul 2021
#

set -euo pipefail

# Le répertoire de ce script:
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"

source "$SCRIPT_DIR/config.sh"
source "$SCRIPT_DIR/utils.sh"

check_uid_root "$0"

cd "$SCODOC_DIR" || die "can't cd $SCODOC_DIR"

# ------------ Safety checks
if [ "${debian_version}" != "11" ]
then
   echo "Version du systeme Linux Debian incompatible"
   exit 1
fi

if [ "$(arch)" != "x86_64" ]
then
   echo "Version du systeme Linux Debian incompatible (pas X86 64 bits)"
   exit 1
fi

# ------------ Unix user
check_create_scodoc_user

# --- Create empty .../var/ subdir
echo "Creating empty local directories..."
for d in var var/scodoc var/scodoc/archives var/scodoc/photos var/scodoc/tmp var/scodoc/config var/scodoc/config/version var/scodoc/config/depts var/scodoc/config/logos
do
    [ -d "$d" ] || mkdir "$d" || die "can't create $d subdirectory"
done

# ------------ Permissions & directories
change_scodoc_file_ownership
set_scodoc_var_dir

# ------------ LOCALES
locname="en_US.UTF-8"
outname=$(echo ${locname//-/} | tr '[A-Z]' '[a-z]')
if [ "$(locale -a | grep -E -i ^${outname}$ | wc -l)" -lt 1 ]
then
    echo adding $locname
    echo "$locname ${locname##*.}" >> /etc/locale.gen
    /usr/sbin/locale-gen --keep-existing 
fi

# ------------ AJOUT DES PAQUETS DEBIAN NECESSAIRES
apt-get update
apt-get -y install gcc
apt-get -y install python3-dev
apt-get -y install python3-venv
apt-get -y install python3-pip
apt-get install -y python3-wheel
apt-get -y install libpq-dev
apt-get -y install libcrack2-dev
apt-get -y install postgresql
apt-get -y install redis
apt-get -y install curl
apt-get -y install graphviz

systemctl start redis

# ------------ CREATION DU VIRTUALENV
echo "Creating python3 virtualenv..."
python3 -m venv venv || die "can't create Python 3 virtualenv"

# ------------ INSTALL DES PAQUETS PYTHON (3.7)
# ScoDoc8 uses pip in our env
source venv/bin/activate
# pip install --upgrade pip => bug [Errno 39] Directory not empty: '_internal'
pip install wheel
pip install -r requirements-3.9.txt

# ------------
SCODOC_RELEASE=$(cat VERSION)
SVERSION=$(curl --silent http://scodoc.iutv.univ-paris13.fr/scodoc-installmgr/version?mode=install\&release="$SCODOC_RELEASE")
echo "$SVERSION" > "${SCODOC_VERSION_DIR}/scodoc.sn"


# ------------ POSTFIX
echo 
echo "ScoDoc a besoin de pouvoir envoyer des messages par mail."
echo -n "Voulez vous configurer la messagerie (tres recommande) ? (y/n) [y] "
read -r ans
if [ "$(norm_ans "$ans")" != 'N' ]
then
    apt-get -y install postfix
fi

# ------------ CONFIG FIREWALL (non teste en Debian 10)
echo 
echo "Le firewall aide a proteger votre serveur d'intrusions indesirables."
echo -n "Voulez vous configurer un firewall minimal (ufw) ? (y/n) [n] "
read -r ans
if [ "$(norm_ans "$ans")" = 'Y' ]
then
    echo 'Installation du firewall IP ufw (voir documentation Debian)'
    echo '   on autorise les connexions ssh et https'
    apt-get -y install ufw
    ufw default deny incoming
    ufw default allow outgoing
    ufw allow ssh
    ufw allow https
    yes | ufw enable
fi

# --- POSTGRESQL
# --- Ensure postgres user "scodoc" ($POSTGRES_USER) exists
init_postgres_user


# --- XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX ---
echo
echo "WARNING: version ScoDoc8 expérimentale"
echo "Ne pas utiliser en production !"
echo
echo "Pour lancer le serveur de développement: voir README"
exit 0
# --- XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX ---

# Nota: after this point, the network _may_ be unreachable 
# (if firewall config is wrong)

# ------------ CONFIG NGINX
a2enmod ssl
a2enmod proxy
a2enmod proxy_http
a2enmod rewrite

echo 
echo "La configuration du serveur web va modifier votre installation Apache pour supporter ScoDoc."
echo -n "Voulez vous configurer le serveur web Apache maintenant (tres conseille) ? (y/n) [y] "
read -r ans
if [ "$(norm_ans "$ans")" != 'N' ]
then
    echo "Configuration d'Apache"
    server_name=""
    while [ -z "$server_name" ]
    do
        echo "Le nom de votre serveur doit normalement etre connu dans le DNS."
	echo -n "Nom complet de votre serveur (exemple: notes.univ.fr): "
	read -r server_name
    done
    # --- CERTIFICATS AUTO-SIGNES
    echo 
    echo "Il est possible d'utiliser des certificats cryptographiques"
    echo "auto-signes, qui ne seront pas reconnus comme de confiance"
    echo "par les navigateurs, mais offrent une certaine securite."
    echo -n 'Voulez vous generer des certificats ssl auto-signes ? (y/n) [y] '
    read -r ans
    if [ "$(norm_ans "$ans")" != 'N' ]
    then
        # attention: utilise dans scodoc-site-ssl.orig
	    ssl_dir=/etc/apache2/scodoc-ssl 
    	if [ ! -e $ssl_dir ]
	    then
            mkdir $ssl_dir
	    fi
	    /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf $ssl_dir/apache.pem
        cert_status=$?
    else
        cert_status=-1
    fi
    # ---
    echo 'generation de /etc/apache2/sites-available/scodoc-site-ssl'
    cat "$SCODOC_DIR"/tools/etc/scodoc-site-ssl-apache2.4.orig | sed -e "s:YOUR\.FULL\.HOST\.NAME:$server_name:g" > /etc/apache2/sites-available/scodoc-site-ssl.conf
    echo 'activation du site...'
    a2ensite scodoc-site-ssl

    echo 'Remplacement du site Apache par defaut (sic ! old saved as .bak)'
    fn=/etc/apache2/sites-available/000-default.conf
    if [ -e $fn ]
    then
       mv $fn $fn.bak
    fi
    cp "$SCODOC_DIR"/tools/etc/scodoc-site.orig $fn

    if [ -z "$(grep Listen /etc/apache2/ports.conf | grep 443)" ]
    then
      echo 'adding port 443'
      echo 'Listen 443' >> /etc/apache2/ports.conf
    fi

    echo 'configuring Apache proxy'
    mv /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-available/proxy.conf.bak
    cat > /etc/apache2/mods-available/proxy.conf <<EOF
<IfModule mod_proxy.c>
# Proxy config for ScoDoc default installation
ProxyRequests Off
  <ProxyMatch http://localhost:8080>
          Order deny,allow
          Allow from all
  </ProxyMatch>
</IfModule>
EOF

fi

systemctl restart apache2

# ------------ CONFIG SERVICE SCODOC
echo 
echo "Installer le service scodoc permet de lancer automatiquement le serveur au demarrage."
echo -n "Voulez vous installer le service scodoc ? (y/n) [y] "
read ans
if [ "$(norm_ans "$ans")" != 'N' ]
then
    # ScoDoc 7.19+ uses systemd
    $SCODOC_DIR/tools/configure_systemd.sh
fi


# ------------ CONFIG MISE A JOUR HEBDOMADAIRE
echo
echo -n "Mises a jour hebdomadaires (tres recommande) ? (y/n) [y] "
read ans
if [ "$(norm_ans "$ans")" != 'N' ]
then
    cp "$SCODOC_DIR"/tools/etc/scodoc-updater.service /etc/systemd/system
    cp "$SCODOC_DIR"/tools/etc/scodoc-updater.timer /etc/systemd/system
    systemctl enable scodoc-updater.timer
    systemctl start scodoc-updater.timer
fi

# ------------ THE END
echo
echo "Installation terminee."
echo
echo "Vous pouvez maintenant creer la base d'utilisateurs avec ./create_user_db.sh"
echo "puis creer un departement avec  ./create_dept.sh"
echo "Ou bien restaurer vos donnees a partir d'une ancienne installation a l'aide du script restore_scodoc_data.sh"
echo "(voir https://scodoc.org/MigrationDonneesScoDoc/)"
echo


if [ "${cert_status}" != 0 ]
then
    echo "Attention: le serveur Web Apache n'a pas de certificat."
    echo "Il est probable qu'il ne fonctionne pas."
    echo "Installez vos certificats ou generez provisoirement des certificats autosignes"
    echo "avec la commande: /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf $ssl_dir/apache.pem"
    echo
fi