#!/bin/bash
###
# Author: Maël Jeuffrard
# Date: 13/03/2019
# Desc: Installation et Configuration de la ZClef de Zaclys
###
# Pas d'instructions particulières, les principaux paramètres sont à définir dans les variables ci-dessous.
# La Zclef étant encore en version bêta l'installation en une seule fois n'étais pas possible.
# Ne connaissant pas le publique visé, j'ai pris le parti de simplifier l'execution du script plutôt que son contenu.
# J'ai donc fait le choix de mettre un menu, pour effectuer les différentes étapes de façon simple.
# Par peur de noyer un eventuel novice, quasiment toutes les sorties sont redirigées dans /dev/null.
# Le script n'est donc que très peu verbeux.
# Bien qu'il soit possible qu'il fonctionne sur Ubuntu, je n'ai testé ce script que sur une Debian 9.
###

rsa_key_path="$HOME/.ssh/rsa_zclef"                                     # Path complet de la clef privée. Ne pas remplacer $HOME par "~" car cette variable est utilisé dans le fstab
rsa_key_size="4096"                                                     # Taille de la clef SSH
rsa_key_type="rsa"                                                      # Type de clef SSH
server_hostname="sshfs.zaclys.com"                                      # Nom DNS du serveur
server_ip=$(host $server_hostname | awk '/has address/ { print $4 }')   # IP du serveur selon le nom dns
server_port="22"                                                        # Port du serveur à utiliser
package_list="sshfs ssh"                                                # Liste des paquets necessaires qui seront installés
fuse_conf="/etc/fuse.conf"                                              # Fichier de configuration de fuse
mount_point="/media/zclef"                                              # Point de montage de la Zclef

# Vérification de la distribution
if [ ! $(lsb_release -is) == Debian ]; then
  echo "[ Erreur ] Ce script n'est compatible qu'avec Debian"
  exit 1
fi

function gen_key {

if [ $USER == "root" ]; then
  echo "[ Erreur ] La génération du certificat ne doit pas être faites en ROOT"
  exit 1
fi

if [ -f $rsa_key_path ]; then
  echo "[ Erreur ] Le fichier $rsa_key_path exste déjà. Merci de le supprimmer/renommer puis de relancer ce script"
  exit 1
fi

ssh-keygen -t $rsa_key_type -b $rsa_key_size -N "" -f "$rsa_key_path" > /dev/null 2>&1
if [ -f $rsa_key_path ]; then
  echo "|------------------------------------------------------------------------|"
  echo "| Le certificat à bien été créé!                                         |"
  echo "| Merci de transmettre le fichier $rsa_key_path                          |"
  echo "| à l'équipe zaclys en utilisant le formulaire suivant:                  |"
  echo "| https://nas.zaclys.com/Contact,99,contact_c_msg:Laboratoire+projet+NAS |"
  echo "|------------------------------------------------------------------------|"
fi
exit
}

function requirement {
# Test si l'utilisateur courant est ROOT
if [[ $EUID -ne 0 ]]; then
   echo "[ Erreur ] Cette partie de l'installation doit être lancée en tant que ROOT"
   exit 1
fi

# Test la présence des package de la variable $package_list et les installe si ce n'est pas le cas.
for package in $package_list; do
if ! dpkg -s $package > /dev/null 2>&1 ; then
  apt install $package -y
fi
if [ $? == 1 ]; then
  echo "[ Erreur ] Impossible d'installer le package $package."
  exit 1
fi
done

# Test de connexion au serveur $server_hostname sur le port $server_port
if ! nc -z -w 5 $server_hostname $server_port > /dev/null 2>&1 ; then
  echo "[ Erreur ] La connexion au serveur à échouée. Veuillez vérifier votre parfeu sortant."
  exit 1
fi

# Configuration de fuse. Utilisation combinée de grep et sed pour éviter tout doublon.
if [ -f $fuse_conf ];then
  if grep "user_allow_other" $fuse_conf > /dev/null 2>&1 ; then
    sed -i '/user_allow_other/s/^#//g' $fuse_conf
  else
    echo "user_allow_other" >> $fuse_conf
  fi
else
  echo "[ Erreur ] Le fichier $fuse_conf est introuvable"
  exit 1
fi

# Création du point de montage
if [ -d $mount_point ] ; then
  mkdir -m 777 -p $mount_point
fi

# Confirmation que les prérequis sont validés.
echo "|------------------------------------------------------------------|"
echo "| La vérification des prérequis et l'installation des dépandances  |"
echo "| on été validés avec succès.                                      |"
echo "| Si vous avez reçu le mail avec votre identifiant,                |"
echo "| vous pouvez maintenant procéder à l'installation (Choix 3)       |"
echo "|------------------------------------------------------------------|"
main
}

function install {

if [ $USER == "root" ]; then
  echo "[ Erreur ] Cette étape ne doit pas être faites en ROOT"
  exit 1
fi

# Ajout du FingerPrint
ssh-keyscan -H $server_ip >> ~/.ssh/known_hosts 2> /dev/null
ssh-keyscan -H $server_hostname >> ~/.ssh/known_hosts 2> /dev/null

# Ajout de l'entrée dans le fstab
echo -e "\n Entrez maintenant le nom d'utilisateur fourni par l'équipe Zaclys:"
read zclef_user

echo -e "# ZClef\n$zclef_user@$server_hostname:/zclef     $mount_point     fuse.sshfs     rw,user,port=$server_port,allow_other,reconnect,transform_symlinks,_netdev,BatchMode=yes,identityfile=$rsa_key_path  0 0" > /tmp/fstab.tmp

echo -e "\n Pour configurer le montage automatique,\n merci d'entrer maintenant le mot de passe root:"
su -c "cat /tmp/fstab.tmp >> /etc/fstab"

mount $mount_point
if [ $? == 1 ]; then
  echo "[ Erreur ] Impossible de monter la zclef."
  exit 1
fi

echo "|-------------------------------------------------------------------------------------------|"
echo "| L'installation s'est déroulée avec succès.                                                |"
echo "| Vous pouvez maintenant profiter de votre ZClef dans votre explorateur de fichier habituel |"
echo "|-------------------------------------------------------------------------------------------|"

exit
}


function main {

echo "|--------------------------------------------------------------------------------------|"
echo "| Ce script va vous aider à préparer la configuration et l'installation                |"
echo "| de votre ZClef.                                                                      |"
echo "| Compte tenu du status encore \"Bêta\" de ce service, cette installation                |"
echo "| devra se faire en plusieurs étapes.                                                  |"
echo "| 1. Générer une paire de clefs (Certificats) (Choix 1)                                |"
echo "| 2. Envoyer ce dernier à l'équipe Zaclys                                              |"
echo "| 3. Attendre la réponse qui contient la validation ainsi que votre nom d'utilisateur  |"
echo "| 4. Préparer l'ordinateur à l'utilisation de la ZClef (Choix 2)                       |"
echo "| 5. Terminer l'installation (Choix 3)                                                 |"
echo "|--------------------------------------------------------------------------------------|"
echo ""

PS3="Votre choix : "

select item in "Générer le certificat [Utilisateur]" "Préparer l'ordinateur [Root]" "Terminer l'installation [Utilisateur]" "Quitter"
  do
    echo -e "\nVous avez choisi l'option $REPLY : $item\n"
    case $REPLY in
      1)
        # Appel de la fonction gen_key
        gen_key
        ;;
      2)
        # Appel de la fonction requirement
        requirement
        ;;
      3)
        # Installation et tests finaux
        install
        ;;
      4)
        exit 0
        ;;
      *)
        echo -e "\nRéponse incorrect. Recommencez svp.\n"
        ;;
    esac
  done
}
main
