#!/bin/bash


# Installation et configuration d'e-combox sous réserve d'acceptation de la licence
# Les fichiers incluant le docker-compose seront téléchargés dans /opt/e-comBox

# Couleurs
COLTITRE="\033[1;35m"   # Rose
COLPARTIE="\033[1;34m"  # Bleu
COLTXT="\033[0;37m"     # Gris
COLCHOIX="\033[1;33m"   # Jaune
COLDEFAUT="\033[0;33m"  # Brun-jaune
COLSAISIE="\033[1;32m"  # Vert
COLCMD="\033[1;37m"     # Blanc
COLSTOP="\033[1;31m"  # Rouge
COLINFO="\033[0;36m"    # Cyan


STOPPER()
{
        echo -e "$COLSTOP"
        echo -e "Vous avez décidé de ne pas continuer à installer et configurer e-comBox. Vous pouvez reprendre la procédure quand vous voulez."
	echo -e "$1"
        echo -e "$COLTXT"
        exit 1
}



POURSUIVRE()
{
        REPONSE=""
        while [ "$REPONSE" != "o" -a "$REPONSE" != "O" -a "$REPONSE" != "n" ]
        do
          echo -e "$COLTXT"
	  echo -e "Peut-on poursuivre (o par défaut) ? (${COLCHOIX}o/n${COLTXT}) $COLSAISIE\c"
	  read REPONSE
          if [ -z "$REPONSE" ]; then
	     REPONSE="o"
	  fi
        done
        if [ "$REPONSE" != "o" -a "$REPONSE" != "O" ]; then
	   STOPPER
	fi
}

initInstall ()
{
#Création du dossier d'installation de l'application s'il n'existe pas déjà
if [ ! -d "/opt/e-comBox" ]; then
	mkdir /opt/e-comBox
fi


# Téléchargement de la licence CeCILL
curl -fsSL https://gitlab.com/e-combox/e-comBox_scriptsLinux/raw/master/licenceCeCILL.txt -o /opt/e-comBox/licenceCeCILL.txt
echo -e ""
echo -e "$COLINFO"
echo -e "Vous devez maintenant lire et accepter les termes de la licence CeCILL avant d'installer et de pouvoir utiliser e-comBox."
echo -e "$COLCMD"
echo -e "Appuyer sur n'importe quelle touche pour lire la licence CeCILL."
echo -e ""
if [ ! -e /opt/e-comBox/licenceCeCILL.txt ]; then
   echo -e "$COLINFO"
   echo -e "Le fichier contenant les termes de la licence n'a pas pu être téléchargé et rangé dans le répertoire /opt/e-comBox."
   echo -e "Vérifiez la configuration de votre proxy pour l'outil curl."
   echo -e "Éventuellement, téléchargez le fichier par vos propres moyens via l'URL suivante https://gitlab.com/e-combox/e-comBox_setupWin10pro/raw/master/licence_e-comBox.rtf et rangez-le dans le dossier /opt/e-comBox."
   echo -e ""
   echo -e "Relancez-ensuite le script : bash /opt/e-comBox/configure_application.sh."
   echo -e ""
   echo -e "Appuyer sur n'importe quelle touche pour arrêter le script."
   read entree
   else
     read contenu
     more /opt/e-comBox/licenceCeCILL.txt
     echo -e "Acceptez-vous les termes de la licence CeCCILL (o par défaut) ? (${COLCHOIX}o/n${COLTXT}) $COLSAISIE\c"
     echo -e ""
     read saisie
     if [ "$saisie" = o ]; then
        installer
        else STOPPER
     fi
fi
}

installer ()
{
clear
echo -e "$COLTITRE"
echo "***************************************************"
echo "*     INSTALLATION DE E-COMBOX ET CONFIGURATION   *"
echo "*                DE SON ENVIRONNEMENT             *"
echo "***************************************************"

echo -e "$COLINFO"
echo -e "Création d'un fichier de log : /var/log/ecombox.log"
echo -e "$COLCMD"
echo "Configuration d'e-comBox le `date`" > /var/log/ecombox.log
echo "" >> /var/log/ecombox.log

echo -e "$COLINFO"
echo -e "Création d'un fichier de log : /var/log/ecombox-error.log"
echo -e "$COLCMD"
echo "Configuration d'e-comBox le `date`" > /var/log/ecombox-error.log
echo "" >> /var/log/ecombox.log



echo -e "$COLPARTIE"
echo -e "Configuration de l'adresse IP"

#Gestion des adresses IP
echo -e "$COLTXT"
echo -e "Saisissez l'adresse IP privée du serveur: $COLSAISIE\c"
read ADRESSE_IP_PRIVE

echo -e "$COLTXT"
echo -e "Si le serveur doit être accessible de l'extérieur, saisissez l'adresse IP publique ou un nom de domaine pleinement qualifié. C'est cette adresse IP ou ce nom de domaine qui apparaîtra au niveau de chaque site créé. $COLSAISIE\c"
echo -e "(Laisser vide et validez si le serveur ne sera pas accessible de l'extérieur. L'application e-comBox utilisera l'adresse IP privée) :" 
read ADRESSE_IP_PUBLIQUE


#Gestion du proxy
echo -e "$COLTXT"
echo -e "Passez-vous par un proxy pour vous connecter à internet (n par défaut) ? (${COLCHOIX}o/n${COLTXT}) ${COLSAISIE}\c "
read REPONSE
if [ -z "$REPONSE" ]; then
   REPONSE="n"
fi

if [ "$REPONSE" = "o" ]; then
   echo -e "$COLTXT"
   echo -e "Saisissez l'adresse du proxy : [${COLDEFAUT}${http_proxy}${COLTXT}] ${COLSAISIE}\c"
   echo -e "(Validez l'adresse du proxy proposée sinon saisir ip-proxy:port) :"
   read ADRESSE_PROXY
   if [ -z "$ADRESSE_PROXY" ]; then
      ADRESSE_PROXY="$http_proxy"
   fi
   if [ -z "$http_proxy" ]; then
      export http_proxy="$ADRESSE_PROXY"
      export https_proxy="$ADRESSE_PROXY"
   fi 
   echo -e "$COLTXT"
   echo -e "Saisissez les hôtes à ignorer par le proxy. $COLSAISIE\c"
   echo -e "(Saisir les hôtes à ignorer séparés par une virgule (les caractères spéciaux comme \".\" ou \"*\" sont acceptés) :"
   read NO_PROXY
fi

echo -e "$COLINFO"
echo -e "Vous vous apprêtez à utiliser les paramètres suivants:"
echo -e "IP privé :	$ADRESSE_IP_PRIVE"
echo -e "IP publique :	$ADRESSE_IP_PUBLIQUE"
echo -e "Proxy :	$ADRESSE_PROXY"
echo -e "No Proxy :	$NO_PROXY"
echo -e "$COLCMD"

echo "L'adresse IP privée est $ADRESSE_IP_PRIVE" >> /var/log/ecombox.log
echo "" >> /var/log/ecombox.log

POURSUIVRE

# Création du fichier config.json s'il n'existe pas
if [ ! -e ~/.docker ]; then
       mkdir ~/.docker
       echo -e "$COLDEFAUT"
fi

if [ ! -e ~/.docker/config.json ]; then
       echo -e "Création d'un fichier vide config.json"
       echo -e "$COLCMD\c"
       echo "" > ~/.docker/config.json
       chown -R $USER:docker ~/.docker
       chmod g+rw ~/.docker/config.json
fi

#Configuration du proxy pour GIT et pour Docker

if [ "$ADRESSE_PROXY" != "" ]; then
   echo -e "$COLDEFAUT"
   echo -e "Congiguration de GIT pour le proxy"
   echo -e "$COLCMD\c"
   git config --global http.proxy $ADRESSE_PROXY
   if [ ! -d "/etc/systemd/system/docker.service.d" ]; then
          mkdir /etc/systemd/system/docker.service.d
   fi
   echo -e "$COLDEFAUT"
   echo "Ajout des variables d'environnement à systemd (/etc/systemd/system/docker.service.d/http-proxy.conf)"
   echo -e "$COLCMD\c"
   echo "[Service]" > /etc/systemd/system/docker.service.d/http-proxy.conf
   echo "Environment=\"HTTP_PROXY=http://$ADRESSE_PROXY\"" >> /etc/systemd/system/docker.service.d/http-proxy.conf
   echo "Environment=\"HTTPS_PROXY=http://$ADRESSE_PROXY\"" >> /etc/systemd/system/docker.service.d/http-proxy.conf
   echo "Environment=\"NO_PROXY=$NO_PROXY\"" >> /etc/systemd/system/docker.service.d/http-proxy.conf
   echo ""
   echo -e "Redémarrage de Docker"
   systemctl daemon-reload
   systemctl restart docker
   echo -e "$COLDEFAUT"
   echo -e "Ajout des paramètres du Proxy dans ~/.docker/config.json après sauvegarde du fichier d'origine et du fichier actuel."
   echo -e "$COLCMD\c"
   echo "Ajout des paramètres du proxy $ADRESSE_PROXY et $NO_PROXY" >> /var/log/ecombox.log
   echo "" >> /var/log/ecombox.log
   # Sauvegarde du fichier config.json d'origine si ce n'est déjà fait
   if [ ! -e ~/.docker/config.json.ori ]; then
       cp ~/.docker/config.json ~/.docker/config.json.ori
   fi
   # Sauvegarde du fichier actuel
   cp ~/.docker/config.json ~/.docker/config.json.sauv
   # Ajout des paramètres du proxy au fichier config.json
   if [ `sed -n '$=' /root/.docker/config.json` = 1 ]; then
   sed -i "1i \ {\n\t\"proxies\": {\n\t  \"default\":\n\t  {\n\t\t\"httpProxy\": \"http:\/\/$ADRESSE_PROXY\",\n\t\t\"httpsProxy\": \"http:\/\/$ADRESSE_PROXY\",\n\t\t\"noProxy\": \"$NO_PROXY\"\n  }\n\t}\n}" ~/.docker/config.json
   else
    sed -i.bak "/\"proxies\": {/,10d" ~/.docker/config.json
    if [ `sed -n '$=' /root/.docker/config.json` = 2 ]; then
       sed -i "1a \ \t\"proxies\": {\n\t  \"default\":\n\t  {\n\t\t\"httpProxy\": \"http:\/\/$ADRESSE_PROXY\",\n\t\t\"httpsProxy\": \"http:\/\/$ADRESSE_PROXY\",\n\t\t\"noProxy\": \"$NO_PROXY\"\n  }\n\t}\n}" ~/.docker/config.json
       else
         sed -i.bak "1a \ \t\"proxies\": {\n\t  \"default\":\n\t  {\n\t\t\"httpProxy\": \"http:\/\/$ADRESSE_PROXY\",\n\t\t\"httpsProxy\": \"http:\/\/$ADRESSE_PROXY\",\n\t\t\"noProxy\": \"$NO_PROXY\"\n\t  }\n\t},\n" ~/.docker/config.json
       fi
    fi
     else
        echo -e "$COLINFO"
        echo -e "Aucun proxy configuré sur le système."
        echo -e "Les paramètres du proxy, s'ils existent, sont supprimés."
        echo -e "$COLCMD"
	echo "Aucun proxy configuré sur le système" >> /var/log/ecombox.log
        echo "" >> /var/log/ecombox.log
        git config --global --unset http.proxy
        if [ -f "/etc/systemd/system/docker.service.d/http-proxy.conf" ]; then
           rm -f /etc/systemd/system/docker.service.d/http-proxy.conf
           systemctl daemon-reload
           systemctl restart docker
        fi
        # Sauvegarde du fichier actuel
        cp ~/.docker/config.json ~/.docker/config.json.sauv
        # Suppression des paramètres du proxy du fichier config.json
        sed -i.bak "/\"proxies\": {/,9d" ~/.docker/config.json
        if [ `sed -n '$=' /root/.docker/config.json` = 1 ]; then
                echo "Le fichier config.json est supprimé"
                rm -rf ~/.docker/config.json
        fi
fi


# Création du réseau pour l'application

echo -e "$COLPARTIE"
echo -e "Création ou modification du réseau pour e-comBox"
echo -e "$COLCMD"

if ( docker network ls | grep bridge_e-combox ); then
   NET_ECB=`docker network inspect --format='{{range .IPAM.Config}}{{.Subnet}}{{end}}' bridge_e-combox`
   echo -e "$COLINFO"
   echo -e "Le système constate que le réseau $NET_ECB est déjà créé."
   echo -e "Si vous désirez modifier les paramètres de ce réseau, les sites existants seront supprimés."
   echo -e ""
   echo -e "Voulez-vous modifier le réseau ? $COLSAISIE\c"
   echo -e "(tapez oui pour modifier le réseau et SUPPRIMER les sites ou sur n'importe quel autre touche pour continuer)."
   read CONFIRM_RESEAU
   if [ "$CONFIRM_RESEAU" = "oui" ]; then
      docker rm -f $(docker ps -aq)
      docker volume rm $(docker volume ls -qf dangling=true)
      docker network rm bridge_e-combox
      echo -e "$COLSAISIE\n"
      echo "Saisissez le nouveau réseau sous la forme edresseIP/CIDR."
      read NET_ECB
      echo ""
      echo "$COLCMD"
      docker network create --subnet $NET_ECB bridge_e-combox
      echo -e "$COLINFO"
      echo -e "Le nouveau réseau $NET_ECB a été créé."
      else
        echo -e "$COLINFO" 
        echo -e "Vous avez décidé de ne pas modifier le réseau."
   fi
   else
	echo -e "$COLINFO"
        echo -e ""
        echo -e "Le réseau d'e-comBox sera défini par défaut à 192.168.97.0/24"
        echo -e "Voulez-vous changer ce paramétrage ? $COLSAISIE\c"
        echo -e "(tapez oui pour changer l'adresse IP du réseau créé par défaut ou sur n'importe quelle touche pour continuer sans changement)."
        read CONFIRM_RESEAU
        if [ "$CONFIRM_RESEAU" = "oui" ]; then
           echo -e "$COLSAISIE\n"
           echo "Saisissez l'adresse du réseau sous la forme adresseIP/CIDR."
           read NET_ECB
           echo -e ""
           echo -e "$COLCMD"
           docker network create --subnet $NET_ECB bridge_e-combox
           echo -e "$COLINFO"
           echo -e "Le réseau $NET_ECB a été créé."
           else
               NET_ECB=192.168.97.0/24
               echo -e ""
               echo -e "$COLCMD"
               docker network create --subnet $NET_ECB bridge_e-combox
               echo -e "$COLINFO"
               echo -e "Le réseau $NET_ECB a été créé."
       fi
 fi

echo -e "Le réseau $NET_ECB est utilisé." >> /var/log/ecombox.log
echo "" >> /var/log/ecombox.log

# Portainer

#Récupération de portainer
echo -e "$COLPARTIE"
echo -e "Récupération et configuration de Portainer"
echo -e "$COLCMD"

if [ ! -d "/opt/e-comBox" ]; then
	mkdir /opt/e-comBox
fi

if [ -d "/opt/e-comBox/e-comBox_portainer" ]; then
	echo -e "$COLDEFAUT"
	echo "Portainer existe et va être remplacé."
	echo -e "$COLCMD\c"
	echo -e "Portainer existe et va être remplacé." >> /var/log/ecombox.log
        echo "" >> /var/log/ecombox.log

        cd /opt/e-comBox/e-comBox_portainer
	docker-compose down
        cd ..
	rm -rf /opt/e-comBox/e-comBox_portainer
        docker volume rm e-combox_portainer_portainer-data
fi

cd /opt/e-comBox
git clone https://github.com/siollb/e-comBox_portainer.git 2>> /var/log/ecombox-error.log

#Configuration de l'adresse IP
echo -e "$COLDEFAUT"
echo "Mise à jour de /opt/e-comBox/e-comBox_portainer/.env."
echo -e "$COLCMD"

if [ "$ADRESSE_IP_PUBLIQUE" != "" ] ; then
	URL_UTILE=$ADRESSE_IP_PUBLIQUE
	else URL_UTILE=$ADRESSE_IP_PRIVE
fi

echo -e "$COLCMD\c"
echo "URL_UTILE=$URL_UTILE" > /opt/e-comBox/e-comBox_portainer/.env
echo ""



# Lancement de Portainer
echo -e "$COLPARTIE"
echo "Lancement de portainer"
echo -e "$COLCMD\c"
cd /opt/e-comBox/e-comBox_portainer/
#docker-compose up --build -d
docker-compose up -d 2>> /var/log/ecombox-error.log

if [ $? <> 0 ]; then
  echo -e "Portainer a été lancé." >> /var/log/ecombox.log
  echo "" >> /var/log/ecombox.log
  else
    echo -e "Portainer n'a pas pu être lancé." >> /var/log/ecombox.log
    echo "" >> /var/log/ecombox.log
fi

echo -e "$COLINFO"
echo "Portainer est accessible à l'URL suivante :"
echo -e "http://$URL_UTILE:8880"
echo -e "$COLCMD\n"

# Configuration de l'application

echo -e "$COLPARTIE"
echo -e "Suppression d'e-comBox si une version existe"
echo -e "$COLCMD"

if docker ps -a | grep e-combox; then
	docker rm -f e-combox 2>> /var/log/ecombox-error.log
	docker volume rm $(docker volume ls -qf dangling=true) 2>> /var/log/ecombox-error.log
	#docker image rm -f reseaucerta/e-combox:1.0
	echo -e "e-comBox existe et va être remplacée." >> /var/log/ecombox.log
        echo "" >> /var/log/ecombox.log
fi


# Récupération d'une éventuelle nouvelle version d'e-comBox
echo -e "$COLPARTIE"
echo "Récupération d'e-combox"
echo -e "$COLCMD\c"
echo -e ""

docker pull reseaucerta/e-combox:1.0 2>> /var/log/ecombox-error.log

# Lancement de e-comBox
echo -e "$COLPARTIE"
echo "Lancement et configuration de l'environnement de l'application e-comBox"
echo -e "$COLCMD\c"
echo -e ""
docker run -dit --name e-combox -v ecombox_data:/usr/local/apache2/htdocs/ -v ecombox_config:/etc/ecombox-conf --restart always -p 8888:80 --network bridge_e-combox reseaucerta/e-combox:1.0 2>> /var/log/ecombox-error.log

if [ $? <> 0 ]; then
  echo -e "e-comBox a été lancée." >> /var/log/ecombox.log
  echo "" >> /var/log/ecombox.log
  else  
    echo -e "e-comBox n'a pas pu être lancée." >> /var/log/ecombox.log
    echo "" >> /var/log/ecombox.log
fi

# Nettoyage des anciennes images si elles existent
echo -e "$COLPARTIE"
echo "Suppression éventuelle des images si elle ne sont associées à aucun site"
echo -e "$COLCMD\c"
echo -e ""
docker image rm $(docker images -q) 2>> /var/log/ecombox-error.log

if [ `docker images -qf dangling=true` ]; then
 docker rmi $(docker images -qf dangling=true) 2>> /var/log/ecombox-error.log
fi

# Arrêt des containers qui doivent être redémarrés après reconfiguration de l'environnement
echo -e "$COLDEFAUT"
echo "Arrêt des containers Prestashop, WooCommerce et Blog"

LIST_CONTAINERS=`docker ps -q -f name=prestashop && docker ps -q -f name=woocommerce && docker ps -q -f name=blog`

if [ -n "$LIST_CONTAINERS" ]; then
	docker stop $LIST_CONTAINERS
fi


# Configuration de l'API 
for fichier in /var/lib/docker/volumes/ecombox_data/_data/*.js /var/lib/docker/volumes/ecombox_data/_data/*.js.map
do
        sed -i -e "s/localhost:8880/$URL_UTILE:8880/g" $fichier
done

echo -e "$COLTITRE"
echo "***************************************************"
echo "*        FIN DE L'INSTALLATION DE E-COMBOX        *"
echo "***************************************************"

echo -e "$COLDEFAUT"
echo "Téléchargement du fichier contenant les identifiants d'accès et des scripts permettant de reconfigurer l'application si nécessaire"
echo -e "$COLCMD\c"

# Téléchargement du fichier contenant les identifiants d'accès et les scripts
curl -fsSL https://gitlab.com/e-combox/e-comBox_scriptsLinux/raw/master/e-comBox_identifiants_acces_applications.pdf -o /opt/e-comBox/e-comBox_identifiants_acces_applications.pdf
curl -fsSL https://gitlab.com/e-combox/e-comBox_scriptsLinux/raw/master/change_config_ip.sh -o /opt/e-comBox/change_config_ip.sh
curl -fsSL https://gitlab.com/e-combox/e-comBox_scriptsLinux/raw/master/configure_application.sh -o /opt/e-comBox/configure_application.sh
curl -fsSL https://gitlab.com/e-combox/e-comBox_scriptsLinux/raw/master/sync_pwd_portainer.sh -o /opt/e-comBox/sync_pwd_portainer.sh

echo -e "$COLINFO"
echo -e "L'application e-comBox est maintenant accessible à l'URL suivante :"
echo -e "http://$URL_UTILE:8888"
echo -e ""
echo -e "Les identifiants d'accès figurent dans le fichier /opt/e-comBox/e-comBox_identifiants_acces_applications.pdf."
echo -e ""
echo -e "La dernière étape vous donne la possibilité de configurer une authentification pour accéder à l'interface d'e-comBox."
echo -e ""
curl -fsSL https://gitlab.com/e-combox/e-comBox_scriptsLinux/raw/master/ajout_auth.sh -o /opt/e-comBox/ajout_auth.sh
curl -fsSL https://gitlab.com/e-combox/e-comBox_scriptsLinux/raw/master/suppr_auth.sh -o /opt/e-comBox/suppr_auth.sh
bash /opt/e-comBox/ajout_auth.sh

echo -e "$COLCMD"
}

initInstall
exit 0


