From e46e9da61bca5b49712b97c9175f720dd5f77f68 Mon Sep 17 00:00:00 2001
From: Maniack Crudelis <maniack_crudelis@yahoo.fr>
Date: Sat, 10 Dec 2016 17:02:31 +0100
Subject: [PATCH] Gestions d'erreurs du conteneur

---
 sub_scripts/lxc_launcher.sh    | 50 ++++++++++++++++-------
 sub_scripts/testing_process.sh | 75 +++++++++++++++++++++++-----------
 2 files changed, 87 insertions(+), 38 deletions(-)
 mode change 100644 => 100755 sub_scripts/testing_process.sh

diff --git a/sub_scripts/lxc_launcher.sh b/sub_scripts/lxc_launcher.sh
index a46e926..f38861d 100755
--- a/sub_scripts/lxc_launcher.sh
+++ b/sub_scripts/lxc_launcher.sh
@@ -23,25 +23,47 @@ LXC_INIT () {
 LXC_START () {
 	if [ "$no_lxc" -eq 0 ]
 	then
-		# Démarrage de la machine
-		sudo lxc-start -n $LXC_NAME -d | tee -a "$RESULT" 2>&1
-		for i in `seq 1 10`
-		do	# Vérifie que la machine est accessible en ssh avant de commencer. Il lui faut le temps de démarrer.
-			echo -n .
-			if ssh $ARG_SSH $LXC_NAME "exit 0" > /dev/null 2>&1; then
-				break
+		for i in `seq 1 3`
+		do	# Tente jusqu'à 3 fois de démarrer le conteneur
+			# Démarrage de la machine
+			sudo lxc-start -n $LXC_NAME -d | tee -a "$RESULT" 2>&1
+			for j in `seq 1 10`
+			do	# Vérifie que la machine est accessible en ssh avant de commencer. Il lui faut le temps de démarrer.
+				echo -n .
+				if ssh $ARG_SSH $LXC_NAME "exit 0" > /dev/null 2>&1; then
+					break
+				fi
+				sleep 1
+			done
+			failstart=0
+			sudo lxc-ls -f | grep $LXC_NAME | sed 's/-     NO//'
+			if [ $(sudo lxc-info --name $LXC_NAME | grep -c "STOPPED") -ne 0 ]; then
+				ECHO_FORMAT "Le conteneur n'a pas démarré correctement...\n" "lred" "bold"
+				failstart=1
+				if [ "$i" -ne 3 ]; then
+					echo "Redémarrage du conteneur..."
+				fi
+				LXC_STOP
+			elif ssh $ARG_SSH $LXC_NAME "ping -q -c 2 security.debian.org > /dev/null 2>&1; exit \$?"; then	# Si le conteneur a démarré, test sa connectivité.
+				ECHO_FORMAT "Le conteneur ne parvient pas à accéder à internet...\n" "lred" "bold"
+				failstart=1
+				if [ "$i" -ne 3 ]; then
+					echo "Redémarrage du conteneur..."
+				fi
+				LXC_STOP
+			else
+				break	# Sort de la boucle for si le démarrage est réussi
+			fi
+			if [ "$i" -eq 3 ] && [ "$failstart" -eq 1 ]; then	# Si le dernier démarrage est encore en erreur, stoppe le test
+				ECHO_FORMAT "Le conteneur a rencontré des erreurs 3 fois de suite...\nSi le problème persiste, utilisez le script lxc_check.sh pour vérifier et réparer le conteneur." "lred" "bold"
+				return 1
 			fi
-			sleep 1
 		done
-		sudo lxc-ls -f | grep $LXC_NAME | sed 's/-     NO//'
-		if [ $(sudo lxc-info --name $LXC_NAME | grep -c "STOPPED") -ne 0 ]; then
-			ECHO_FORMAT "Le conteneur n'a pas démarré correctement...\nSi le problème persiste, utilisez le script lxc_check.sh pour vérifier et réparer le conteneur." "lred" "bold"
-			return 1
-		fi
 		scp -rq "$APP_CHECK" "$LXC_NAME": >> "$RESULT" 2>&1
 		ssh $ARG_SSH $LXC_NAME "$1 > /dev/null 2>> debug_output.log; exit \$?" >> "$RESULT" 2>&1	# Exécute la commande dans la machine LXC
+		returncode=$?
 		sudo cat "/var/lib/lxc/$LXC_NAME/rootfs/home/pchecker/debug_output.log" >> "$OUTPUTD" # Récupère le contenu du OUTPUTD distant pour le réinjecter dans le local
-		return "$?"
+		return $returncode
 	else	# Sinon exécute la commande directement.
 		eval "$1" > /dev/null 2>> "$OUTPUTD"
 	fi
diff --git a/sub_scripts/testing_process.sh b/sub_scripts/testing_process.sh
old mode 100644
new mode 100755
index 5f45eda..3c16160
--- a/sub_scripts/testing_process.sh
+++ b/sub_scripts/testing_process.sh
@@ -42,23 +42,27 @@ CHECK_URL () {
 		fi
 		echo -e "$IP_CURL $DOMAIN #package_check\n$IP_CURL $SOUS_DOMAIN #package_check" | sudo tee -a /etc/hosts > /dev/null	# Renseigne le hosts pour le domain à tester, pour passer directement sur localhost
 		curl_error=0
-		for i in 0 1
+		http503=0
+		i=1
+		while [ "$i" -ne 3 ]	# Tant que i vaut 1 ou 2, les tests continuent.
 		do	# 2 passes, pour effectuer un test avec le / final, et un autre sans.
-			if [ "$i" -eq 0 ]; then	# Test sans / final.
+			if [ "$i" -eq 1 ]; then	# Test sans / final.
 				if [ "${CHECK_PATH:${#CHECK_PATH}-1}" == "/" ]	# Si le dernier caractère est un /
 				then
 					MOD_CHECK_PATH="${CHECK_PATH:0:${#CHECK_PATH}-1}"	# Supprime le /
 				else
 					MOD_CHECK_PATH=$CHECK_PATH
 				fi
+				i=2	# La prochaine boucle passera au 2e test
 			fi
-			if [ "$i" -eq 1 ]; then	# Test avec / final.
+			if [ "$i" -eq 2 ]; then	# Test avec / final.
 				if [ "${CHECK_PATH:${#CHECK_PATH}-1}" != "/" ]	# Si le dernier caractère n'est pas un /
 				then
 					MOD_CHECK_PATH="$CHECK_PATH/"	# Ajoute / à la fin du path
 				else
 					MOD_CHECK_PATH=$CHECK_PATH
 				fi
+				i=3	# La prochaine boucle terminera les tests
 			fi
 			rm -f "$script_dir/url_output"	# Supprime le précédent fichier html si il est encore présent
 			curl -LksS -w "%{http_code};%{url_effective}\n" $SOUS_DOMAIN$MOD_CHECK_PATH -o "$script_dir/url_output" > "$script_dir/curl_print"
@@ -76,6 +80,19 @@ CHECK_URL () {
 				then	# Le code d'erreur 401 fait exception, si il y a 401 c'est en général l'application qui le renvoi. Donc l'install est bonne.
 					curl_error=1
 				fi
+				if [ "${HTTP_CODE}" = "503" ]
+				then	# Le code d'erreur 503 indique que la ressource est temporairement indisponible. On va le croire pour cette fois et lui donner une autre chance.
+					curl_error=0
+					ECHO_FORMAT "Service temporairement indisponible...\n" "lyellow" "bold"
+					http503=$(( $http503 + 1 ))
+					if [ $http503 -eq 3 ]; then
+						curl_error=1	# Après 3 erreurs 503, le code est considéré définitivement comme une erreur
+					else
+						i=$(( $i - 1 ))	# La boucle est décrémenté de 1 pour refaire le même test.
+						sleep 1 # Attend 1 seconde pour laisser le temps au service de se mettre en place.
+						continue	# Retourne en début de boucle pour recommencer le test
+					fi
+				fi
 			fi
 			URL_TITLE=$(grep "<title>" "$script_dir/url_output" | cut -d '>' -f 2 | cut -d '<' -f1)
 			ECHO_FORMAT "Titre de la page: $URL_TITLE\n" "white"
@@ -333,16 +350,20 @@ CHECK_UPGRADE () {
 	# Installation de l'app
 	SETUP_APP
 	LOG_EXTRACTOR
-	ECHO_FORMAT "\nUpgrade sur la même version du package...\n" "white" "bold"
-	# Upgrade de l'app
-	COPY_LOG 1
-	LXC_START "sudo yunohost --debug app upgrade $APPID -f \"$APP_PATH_YUNO\""
-	YUNOHOST_RESULT=$?
-	COPY_LOG 2
-	LOG_EXTRACTOR
-	# Test l'accès à l'app
-	CHECK_URL
-	tnote=$((tnote+1))
+	if [ "$YUNOHOST_RESULT" -ne 0 ]; then
+		ECHO_FORMAT "\nInstallation échouée...\n" "lred" "bold"
+	else
+		ECHO_FORMAT "\nUpgrade sur la même version du package...\n" "white" "bold"
+		# Upgrade de l'app
+		COPY_LOG 1
+		LXC_START "sudo yunohost --debug app upgrade $APPID -f \"$APP_PATH_YUNO\""
+		YUNOHOST_RESULT=$?
+		COPY_LOG 2
+		LOG_EXTRACTOR
+		# Test l'accès à l'app
+		CHECK_URL
+		tnote=$((tnote+1))
+	fi
 	if [ "$YUNOHOST_RESULT" -eq 0 ] && [ "$curl_error" -eq 0 ]; then
 		ECHO_FORMAT "--- SUCCESS ---\n" "lgreen" "bold"
 		note=$((note+1))
@@ -403,14 +424,18 @@ CHECK_BACKUP_RESTORE () {
 		# Installation de l'app
 		SETUP_APP
 		LOG_EXTRACTOR
-		ECHO_FORMAT "\nBackup de l'application...\n" "white" "bold"
-		# Backup de l'app
-		COPY_LOG 1
-		LXC_START "sudo yunohost --debug backup create -n Backup_test --apps $APPID --hooks $BACKUP_HOOKS"
-		YUNOHOST_RESULT=$?
-		COPY_LOG 2
-		LOG_EXTRACTOR
-		tnote=$((tnote+1))
+		if [ "$YUNOHOST_RESULT" -ne 0 ]; then
+			ECHO_FORMAT "\nInstallation échouée...\n" "lred" "bold"
+		else
+			ECHO_FORMAT "\nBackup de l'application...\n" "white" "bold"
+			# Backup de l'app
+			COPY_LOG 1
+			LXC_START "sudo yunohost --debug backup create -n Backup_test --apps $APPID --hooks $BACKUP_HOOKS"
+			YUNOHOST_RESULT=$?
+			COPY_LOG 2
+			LOG_EXTRACTOR
+			tnote=$((tnote+1))
+		fi
 		if [ "$YUNOHOST_RESULT" -eq 0 ]; then
 			ECHO_FORMAT "--- SUCCESS ---\n" "lgreen" "bold"
 			note=$((note+1))
@@ -735,9 +760,11 @@ CHECK_COMMON_ERROR () {
 	LOG_EXTRACTOR
 	if [ "$1" == "incorrect_path" ] || [ "$1" == "port_already_use" ]; then
 		# Test l'accès à l'app
-		CHECK_URL
-		if [ "$curl_error" -ne 0 ]; then
-			YUNOHOST_RESULT=$curl_error
+		if [ "$YUNOHOST_RESULT" -eq 0 ]; then	# Test l'url si l'installation à réussie.
+			CHECK_URL
+			if [ "$curl_error" -ne 0 ]; then
+				YUNOHOST_RESULT=$curl_error
+			fi
 		fi
 	fi
 	tnote=$((tnote+1))