#!/bin/bash
#
# mount-encfs-dir.sh
#
# Programme pour monter graphiquement, grâce à Zenity, votre 
# répertoire chiffré encfs. Utile pour protéger les
# fichiers de votre clé USB.
#
# (Il faut installer l'outil "zenity" pour que ce programme 
# fonctionne graphiquement)
#
# License : GPL
#
# Auteur : Asher256
# Email  : contact@asher256.com
# Site   : http://blog.aher256.com
#

#============== VARIABLES A MODIFIER =================
# (Variables utiles pour personnaliser le script)

# Répertoire dans lequel le répertoire chiffré sera monté
mount_dir="fichiers"

# Répertoire contenant les fichiers chiffrés
encrypted_dir=".coffre"

# Répertoire de sauvegarde
save_dir="$HOME/.save_usb_stick"

# save_source_dir contient ce qui doit être sauvegardé
# dans save_dir (variable plus haut).
#
# Si vous mettez dans save_source_dir "$mount_dir", la 
# sauvegarde dans $save_dir ne sera PAS chiffrée 
# (recommandé, au cas où les données ne sont plus 
# accessibles pour une raison ou une autre). En 
# revanche, si vous mettrez "$encrypted_dir" dans
# save_source_dir, la sauvegarde sera chiffrée.
save_source_dir="$mount_dir"

#=====================================================

#
# Fonction pour Lancer la sauvegarde.
#
do_save() {
	# Supprimer l'ancienne savegarde
	rm -fr "$save_dir"
	mkdir -p "$save_dir"

	if [ "$DISPLAY" = "" ]; then
		# Sauvegarde texte
		while true; do
			echo -n "Voulez-vous sauvegarder vos données '$save_source_dir' dans '$save_dir' ? [y/n] "
			read response

			if [ "$response" = "y" ]; then
				echo "Sauvegarde en cours..."
				cp -Rf "$0" "$save_source_dir" "$save_dir"
				break
			else
				break
			fi
		done
	else
		# Sauvegarde graphique
		if zenity --question --text "Voulez-vous sauvegarder vos données '$save_source_dir' dans '$save_dir' ?"; then
			cp -Rvf "$0" "$save_source_dir" "$save_dir" | zenity --progress --pulsate --title="Sauvegarde" --text="Sauvegarde en cours..."
		fi
	fi
}

#
# Fonction pour lancer le montage du répertoire chiffré.
#
# $1 contient le mot de passe encfs (facultatif).
#
do_mount() {
	if [ "$1" != "" ]; then
		# Si le mot de passe est défini, l'utiliser !
		echo "$1" | encfs --stdinpass -v "`pwd`/$encrypted_dir/" "`pwd`/$mount_dir/"
	else
		# Si le mot de passe n'est pas défini, monter sans mot de passe (il sera
		# demandé par encfs).
		encfs "`pwd`/$encrypted_dir/" "`pwd`/$mount_dir/"
	fi
}

#
# Afficher un message (graphique ou texte, selon $DISPLAY)
# 
message() {
	if [ "$DISPLAY" = "" ]; then
		echo "$@"
	else
		zenity --info --title "Message du montage" --text "$*"
	fi
}

#
# Retourne vrai si le montage a déjà été effectué.
#
already_mounted() {
	if mount | grep "$(pwd)/$mount_dir" | grep encfs >/dev/null 2>&1; then
		return 0
	fi

	return 1
}

#
# Fonction principale (main) pour le texte
#
main_text() {
	if already_mounted; then
		echo "La partition chiffrée est déjà montée dans '$mount_dir'."
		echo
		echo "Appuyez sur la touche entrée pour la démonter..."
		read
		do_save
		fusermount -u "$mount_dir"
	else
		do_save

		# s'il n'est pas monté, faire le montage !
		if do_mount; then
			echo "Montage dans '$mount_dir' fait avec succès ! ;-)"
		else
			echo "Erreur lors du montage de '$encrypted_dir' dans '$mount_dir' !"
		fi
	fi
}

#
# Fonction principale (main) mais graphique avec Zenity
#
main_gui() {
	if ! which zenity >/dev/null; then
		echo "Le programme Zenity n'a pas été trouvé ! Tout se fera en mode texte..."
		echo
		main_text	
		exit 0
	fi

	if ! already_mounted; then
		title="Mot de passe de déchiffrement"
		label="Entrez votre mot de passe pour déchiffrer '$encrypted_dir' dans '$mount_dir' :"
		while true; do
			password=$(zenity --entry --hide-text --title "$title" --text "$label")
			if [ "$?" -eq "0" ]; then
				if [ "$password" = "" ]; then
					message "Vous devez entrer un mot de passe."
					continue
				fi

				# lancer le montage...
				if do_mount $password; then
					message "La partition a été montée avec succès !"
					do_save
					break
				else
					message "Erreur lors du montage de la partition..."
				fi
			else
				# l'utilisateur clique sur Annuler...
				break
			fi
		done
	else
		do_save

		if zenity --question --text "Voulez-vous démonter la partition chiffrée '$mount_dir' ?"; then
			result=$(fusermount -u "$mount_dir" 2>&1)
			if [ "$?" -ne "0" ]; then
				echo -e "Erreur lors du démontage de '$mount_dir'.\n\n$result" | zenity --text-info
			else
				message "Le démontage de '$mount_dir' a effectué avec succès !"
			fi
		fi
	fi
}

#
# Premiers tests
#
first_tests() {
	# le script se déplace au répertoire dans lequel il est
	cd `dirname $0` || exit 1

	# tests si nous sommes dans les bons répertoires
	if ! [ -d "$mount_dir" ]; then
		message "Le répertoire $(pwd)/$mount_dir n'a pas été trouvé !"
		exit 1
	fi

	if ! [ -d "$encrypted_dir" ]; then
		message "Le répertoire $(pwd)/$encrypted_dir n'a pas été trouvé !"
		exit 1
	fi
}

# Lancer l'opération de montage
first_tests
if [ "$DISPLAY" = "" ]; then
	main_text
else
	main_gui
fi

exit 0

