Script de duplication

De Wiki de Jordan LE NUFF
< Technique‎ | WordPress
Révision datée du 9 octobre 2020 à 09:37 par Jordan (discussion | contributions) (Page créée avec « ==Présentation== Cette page a pour objet de présenter un script que j'ai rédigé dans le but de dupliquer un site WordPress. ==Description== Ce script est à placer su… »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Sauter à la navigation Sauter à la recherche

Présentation

Cette page a pour objet de présenter un script que j'ai rédigé dans le but de dupliquer un site WordPress.

Description

Ce script est à placer sur un serveur servant d'intermédiaire. Ce serveur possédera les clés SSH nécessaires pour se connecter sans mot de passe aux serveurs contenant les CMS.

Il est interactif et nécessite les informations suivantes :

  • Serveur d'origine
    • Serveur à partir duquel il faut récupérer le CMS
  • Dossier d'origine
    • Dossier dans lequel se situe le fichier wp-config.php d'origine
  • Serveur cible
    • Serveur sur lequel il faut déployer le CMS
  • Dossier cible
    • Dossier dans dans lequel se situe le fichier wp-config.php cible

Détails importants

  • Le fichier de log est /data/logs/MEP_cms/MEP_CMS.log
  • Un contrôle est effectué pour vérifier si les dossiers d'origine et cible comportent les fichiers wp-config.php et index.php.
  • Un contrôle est effectué pour vérifier si les dossiers et serveurs d'origine et cible sont bien différents. Il est tout de même possible de déployer depuis et vers un même serveur, les dossiers devant être différents.
  • Un dossier temporaire stockant l'ensemble des fichiers nécessaires au déploiement est créé puis supprimé automatiquement sur le serveur intermédiaire à la fin du script.
  • Les sources et bases de données d'origine et cible sont sauvegardées dans le dossier /tmp de leur serveur respectif. Ils sont à supprimer une fois le déploiement validé uniquement !
    • La commande de suppression est fournie à la fin de l'exécution du script de déploiement.

Contenu du script

#!/bin/bash

########################################################

## Définition des variables
###########################

# Dossier et nom de fichier de log
log_file_path=/data/logs/MEP_cms
log_file_name=MEP_CMS.log

#Création du fichier de log
mkdir -p $log_file_path
log_file=$log_file_path/$log_file_name
echo `date +'%d/%m/%Y %T'`" : Début du script de déploiement "$(basename $BASH_SOURCE) >> $log_file

#Création dossier temporaire
temp_dir=$(mktemp -d /tmp/MEP_CMS_WP_XXX)

#Liste des serveurs à proposer :
declare -A servers
servers=( [myserverone]="PROD" [myservertwo]="PREPROD, REC, INT, DEV" )

#Fichiers dont la présence est à vérifier
files_to_check=(index.php wp-config.php)

#Paramètres à exporter/importer
declare -A arr_parameters_origin
arr_parameters_origin=( [DB_NAME]="" [DB_USER]="" [DB_PASSWORD]="" [DB_HOST]="" )
declare -A arr_parameters_target
arr_parameters_target=( [DB_NAME]="" [DB_USER]="" [DB_PASSWORD]="" [DB_HOST]="" )

#Initialisation des variables
server=""
value=""
str_dir_origin_child=""
str_dir_origin_parent=""
str_dir_target_child=""
str_dir_target_parent=""


########################################################

## Définition des fonctions
###########################

# Fonction à exécuter à chaque fin du script pour supprimer le dossier temporaire
function remove_temp_dir
{
	echo -e "\nSuppression du dossier temporaire"
	rm -rf ${temp_dir}
	if [[ $? == 0 ]]
	then
		echo "Dossier temporaire ${temp_dir} supprimé avec succès."
		echo -e "\nFin du script."
	else
		echo "Une erreur est survenue lors de la suppression du dossier temporaire ${temp_dir}."
		echo "Fin du script."
		exit 1
	fi
}
trap remove_temp_dir EXIT

# Fonction permettant de sélectionner un serveur
function select_server
{
	server=""
	msg=$1
	i=1
	lst_servers=()
	for key in "${!servers[@]}"
	do
		echo $i") "${key}" : "${servers[${key}]}
		lst_servers+=(${key})
		((i++))
	done
	echo ""
	read -p "Sélection (chiffre ou nom de serveur) : " choice

	if [[ ${choice} -gt 0 && ${choice} -le ${#servers[@]} ]]
	then
		server=${lst_servers[$(( ${choice} - 1 ))]}
	elif [[ " ${!servers[@]} " =~ " ${choice} " ]]
	then
		server=${choice}
	else
		echo -e "\n${msg} invalide !\n"
		echo `date +'%d/%m/%Y %T'`" : ${msg} invalide. Fin du script." >> $log_file 2>&1
		exit 1
	fi
	echo -e "\n${msg} : ${server}\n"
	echo `date +'%d/%m/%Y %T'`" : ${msg} ${server}." >> $log_file 2>&1
}

# Function pour vérifier si un dossier pointe vers un lien symbolique
function check_symlink
{
	server=$1
	endpoint=$2
	variable_name=$3
	value=""

	ssh ${server} test -L ${endpoint}
	if [[ $? != 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : Le dossier ${endpoint} sur le serveur ${server} n'est pas un lien symbolique, c'est parfait." >> $log_file 2>&1
	else
		# Récupération de la cible du lien symbolique
		value=$(ssh ${server} /usr/bin/readlink -f ${endpoint})
		if [[ $? == 0 && ${value} != "" ]]
		then
			if [[ ${value:0:1} == "/" ]]
			then
				eval "${variable_name}=${value}"
			else
				eval "${variable_name}_child=$(echo ${endpoint}|awk -F/ '{print $NF}')"
				eval "${variable_name}_parent=$(echo ${endpoint}|awk -F"${${variable_name}_child}" '{print $1}')"
				eval "${variable_name}_parent=${${variable_name}_parent%/}"
				eval "${variable_name}=${variable_name}_parent/${value}"
			fi
			echo `date +'%d/%m/%Y %T'`" : Remplacement du lien symbolique ${endpoint} par sa cible ${value} sur le serveur ${server}." >> $log_file 2>&1
			echo "Remplacement du lien symbolique ${endpoint} par sa cible ${value} sur le serveur ${server}."
			endpoint=${value}
		else
			echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors du remplacement du lien symbolique ${endpoint} par sa cible ${value} sur le serveur ${server}. Fin du script." >> $log_file 2>&1
			echo "Une erreur s'est produite lors du remplacement du lien symbolique ${endpoint} par sa cible ${value} sur le serveur ${server}. Fin du script."
			exit 1
		fi
	fi
}

# Fonction pour vérifier la présence d'un fichier ou dossier
function check_endpoint
{
	server=$1
	endpoint=$2
	origin_or_target=$4		# "source" or "cible" accepted only !
	file_or_folder=$3		# "fichier" or "dossier" accepted only !
	option=""
	value=""
	
	if [[ ${file_or_folder} == "file" ]]
	then
		option="-f"
	elif [[ ${file_or_folder} == "folder" ]]
	then
		option="-d"
	fi

	ssh ${server} test ${option} ${endpoint}
	if [[ $? == 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : Le ${file_or_folder} ${endpoint} ${origin_or_target} existe bien." >> $log_file 2>&1
	else
		echo `date +'%d/%m/%Y %T'`" : Le ${file_or_folder} ${endpoint} ${origin_or_target} n'existe pas. Fin du script." >> $log_file 2>&1
		echo "Le ${file_or_folder} ${endpoint} ${origin_or_target} n'existe pas. Fin du script."
		exit 1
	fi
}

# Fonction pour récupérer la valeur d'un paramètre dans un fichier wp-config.php
function get_parameter
{
	parameter=$1
	file=$2
	server=$3
	value=""
	
	value=$(ssh ${server} grep ${parameter} ${file}|awk -F[\'\"] '{print $4}')
	if [[ $? == 0 ]]
	then
		if [[ ${value} != "" ]]
		then
			echo `date +'%d/%m/%Y %T'`" : La valeur du paramètre ${parameter} dans le fichier ${file} sur le serveur ${server} a bien été récupérée." >> $log_file 2>&1
		else
			echo `date +'%d/%m/%Y %T'`" : La valeur du paramètre ${parameter} dans le fichier ${file} sur le serveur ${server} est nulle. Fin du script." >> $log_file 2>&1
			echo "La valeur du paramètre ${parameter} dans le fichier ${file} sur le serveur ${server} est nulle. Fin du script."
			exit 1
		fi
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de la récupération du paramètre ${parameter} dans le fichier ${file} sur le serveur ${server}. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors de la récupération du paramètre ${parameter} dans le fichier ${file} sur le serveur ${server}. Fin du script."
		exit 1
	fi
}

# Function simple de rapatriement de fichier
function scp_pull
{
	server=$1
	file_origin=$2
	file_local=$3
	
	scp -q ${server}:${file_origin} ${file_local}
	if [[ $? == 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : Le rapatriement du fichier ${file_origin} depuis le serveur ${server} vers ${file_local} s'est bien déroulé." >> $log_file 2>&1
		echo "Le rapatriement du fichier ${file_origin} depuis le serveur ${server} vers ${file_local} s'est bien déroulé."
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors du rapatriement du fichier ${file_origin} depuis le serveur ${server} vers ${file_local}. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors du rapatriement du fichier ${file_origin} depuis le serveur ${server} vers ${file_local}. Fin du script."
		exit 1
	fi
}

# Function simple d'envoi de fichier
function scp_push
{
	server=$1
	file_target=$2
	file_local=$3
	
	scp -q ${file_local} ${server}:${file_target}
	if [[ $? == 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : L'envoi du fichier ${file_local} vers ${file_target} sur le serveur ${server} s'est bien déroulé." >> $log_file 2>&1
		echo "L'envoi du fichier ${file_local} vers ${file_target} sur le serveur ${server} s'est bien déroulé."
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de l'envoi du fichier ${file_local} vers ${file_target} sur le serveur ${server}. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors de l'envoi du fichier ${file_local} vers ${file_target} sur le serveur ${server}. Fin du script."
		exit 1
	fi
}

# Fonction pour exporter la base de données et la rapatrier sur le serveur lançant le script (vmexploit02)
function export_and_pull
{
	server=$1
	directory=$2
	path=$3
	db_user=$4
	db_password=$5
	db_name=$6
	origin_or_target=$7		# "source" or "cible" accepted only !
	value=""

	value=$(ssh ${server} "mysqldump -u${db_user} -p${db_password} --add-drop-table ${db_name} | gzip > /tmp/${db_name}_${origin_or_target}.sql.gz")
	if [[ ${value} != 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : L'export de la base de données ${origin_or_target} ${db_name} sur le serveur ${server} s'est bien déroulé." >> $log_file 2>&1
		echo "L'export de la base de données ${origin_or_target} ${db_name} sur le serveur ${server} s'est bien déroulé."
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de l'export de la base de données ${origin_or_target} ${db_name} sur le serveur ${server}. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors de l'export de la base de données ${origin_or_target} ${db_name} sur le serveur ${server}. Fin du script."
		exit 1
	fi
	check_endpoint ${server} "/tmp/${db_name}_${origin_or_target}.sql.gz" "fichier" "${origin_or_target}"
	scp_pull ${server} "/tmp/${db_name}_${origin_or_target}.sql.gz" "${temp_dir}/${db_name}_${origin_or_target}.sql.gz"

	value=""
	value=$(ssh ${server} "tar -zcf /tmp/${directory}_${origin_or_target}.tar.gz -C ${path} ${directory}")
	if [[ ${value} != 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : La compression du dossier ${origin_or_target} ${path}/${directory} s'est bien déroulée." >> $log_file 2>&1
		echo "La compression du dossier ${origin_or_target} ${path}/${directory} s'est bien déroulée."
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de la compression du dossier ${origin_or_target} ${path}/${directory}. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors de la compression du dossier ${origin_or_target} ${path}/${directory}. Fin du script."
		exit 1
	fi
	check_endpoint ${server} "/tmp/${directory}_${origin_or_target}.tar.gz" "fichier" "${origin_or_target}"
	scp_pull ${server} "/tmp/${directory}_${origin_or_target}.tar.gz" "${temp_dir}/${directory}_${origin_or_target}.tar.gz"
}

function get_table_prefix
{
	server=$1
	directory=$2
	origin_or_target=$3		# "source" or "cible" accepted only !
	
	value=$(ssh ${server} 'grep ^\\\$table_prefix '${directory}'/wp-config.php'|awk -F[\'\"] '{print $2}')
	if [[ $? == 0 && ${value} != "" ]]
	then
		echo `date +'%d/%m/%Y %T'`" : Le préfixe des tables ${origin_or_target} est \"${value}\"." >> $log_file 2>&1
		echo "Le préfixe des tables ${origin_or_target} est \"${value}\"."
	else
		echo `date +'%d/%m/%Y %T'`" : Erreur lors de la récupération du préfixe des tables ${origin_or_target}. Fin du script." >> $log_file 2>&1
		echo "Erreur lors de la récupération du préfixe des tables ${origin_or_target}. Fin du script."
		exit 1
	fi
}

function get_url_option
{
	server=$1
	db_user=$2
	db_password=$3
	db_name=$4
	db_prefix=$5
	origin_or_target=$6		# "source" or "cible" accepted only !
	value=""
	
	value=$(ssh ${server} "mysql -u${db_user} -p${db_password} ${db_name} -N -e \"SELECT option_value FROM ${db_prefix}options WHERE option_name = 'siteurl'\"" | grep http | awk -F"//" '{print $2}')
	if [[ $? == 0 && ${value} != "" ]]
	then
		echo `date +'%d/%m/%Y %T'`" : L'URL ${origin_or_target} est \"${value}\"." >> $log_file 2>&1
		echo "L'URL ${origin_or_target} est \"${value}\"."
	else
		echo `date +'%d/%m/%Y %T'`" : Erreur lors de la récupération de l'URL ${origin_or_target}. Fin du script." >> $log_file 2>&1
		echo "Erreur lors de la récupération de l'URL ${origin_or_target}. Fin du script."
		exit 1
	fi
}


########################################################

## Saisie des paramètres
###########################

echo -e "\nProgramme de rafraîchissemnt de CMS"

# Choix du serveur d'origine
echo -e "\nVeuillez choisir un serveur source :"
select_server "Choix de serveur source"
str_server_origin=${server}

# Choix du dossier d'origine à récupérer
echo -e "\nVeuillez définir le dossier source à synchroniser :"
read -p "Choix dossier source : " str_dir_origin
str_dir_origin=${str_dir_origin%/}
echo `date +'%d/%m/%Y %T'`" : Choix de dossier source : $str_dir_origin." >> $log_file 2>&1

# Choix du serveur cible
echo -e "\nVeuillez choisir un serveur cible :"
select_server "Choix de serveur cible"
str_server_target=${server}

# Choix du dossier cible à récupérer
echo -e "\nVeuillez définir le dossier cible à synchroniser :"
read -p "Choix dossier cible : " str_dir_target
str_dir_target=${str_dir_target%/}
echo `date +'%d/%m/%Y %T'`" : Choix de dossier cible : $str_dir_target." >> $log_file 2>&1
echo ""


########################################################

## Vérifications
#########################
check_symlink ${str_server_origin} ${str_dir_origin} ${!str_dir_origin@}
check_symlink ${str_server_target} ${str_dir_target} ${!str_dir_target@}

str_dir_origin_child=$(echo ${str_dir_origin}|awk -F/ '{print $NF}')
str_dir_origin_parent=$(echo ${str_dir_origin}|awk -F"${str_dir_origin_child}" '{print $1}')
str_dir_origin_parent=${str_dir_origin_parent%/}
str_dir_target_child=$(echo ${str_dir_target}|awk -F/ '{print $NF}')
str_dir_target_parent=$(echo ${str_dir_target}|awk -F"${str_dir_target_child}" '{print $1}')
str_dir_target_parent=${str_dir_target_parent%/}

if [[ ${str_server_origin} == ${str_server_target} && ${str_dir_origin} == ${str_dir_target} ]]
then
	echo `date +'%d/%m/%Y %T'`" : Le déploiement ne peut pas se faire sur le même serveur ET dans le même dossier. Fin du script." >> $log_file 2>&1
	echo "Le déploiement ne peut pas se faire sur le même serveur ET dans le même dossier. Fin du script."
	exit 1
fi
echo `date +'%d/%m/%Y %T'`" : Vérification dossiers différents validée." >> $log_file 2>&1

check_endpoint ${str_server_origin} "${str_dir_origin}" "dossier" "source"
check_endpoint ${str_server_target} "${str_dir_target}" "dossier" "cible"

for file in "${files_to_check[@]}"
do
	check_endpoint ${str_server_origin} "${str_dir_origin}/$file" "fichier" "source"
	check_endpoint ${str_server_target} "${str_dir_target}/$file" "fichier" "cible"
done
echo `date +'%d/%m/%Y %T'`" : Vérification contenus dossiers validée." >> $log_file 2>&1


########################################################

## Traitement
#########################

# Récupération des informations de la base de données source
for param in ${!arr_parameters_origin[@]}
do
	get_parameter ${param} "${str_dir_origin}/wp-config.php" ${str_server_origin}
	arr_parameters_origin[${param}]=${value}
done

# Export de la base de données source
export_and_pull ${str_server_origin} ${str_dir_origin_child} ${str_dir_origin_parent} ${arr_parameters_origin[DB_USER]} ${arr_parameters_origin[DB_PASSWORD]} ${arr_parameters_origin[DB_NAME]} "source"
echo ""

# Récupération des informations de la base de données cible
for param in ${!arr_parameters_target[@]}
do
	get_parameter ${param} "${str_dir_target}/wp-config.php" ${str_server_target}
	arr_parameters_target[${param}]=${value}
done

# Export de la base de données cible pour sauvegarde
export_and_pull ${str_server_target} ${str_dir_target_child} ${str_dir_target_parent} ${arr_parameters_target[DB_USER]} ${arr_parameters_target[DB_PASSWORD]} ${arr_parameters_target[DB_NAME]} "cible"
echo ""

# Récupération du préfixe des tables source
get_table_prefix ${str_server_origin} ${str_dir_origin} "source"
str_table_prefix_origin=${value}

# Récupération du préfixe des tables cible
get_table_prefix ${str_server_target} ${str_dir_target} "cible"
str_table_prefix_target=${value}
echo ""

#Récupération du l'URL d'origine
get_url_option ${str_server_origin} ${arr_parameters_origin[DB_USER]} ${arr_parameters_origin[DB_PASSWORD]} ${arr_parameters_origin[DB_NAME]} ${str_table_prefix_origin} "source"
str_url_origin=${value}

#Récupération du l'URL cible
get_url_option ${str_server_target} ${arr_parameters_target[DB_USER]} ${arr_parameters_target[DB_PASSWORD]} ${arr_parameters_target[DB_NAME]} ${str_table_prefix_target} "cible"
str_url_target=${value}
echo ""

#Tranformation des URL dans le dump source
zcat ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz | sed -E 's@https?://'${str_url_origin}'@https://'${str_url_target}'@g;s@'${str_url_origin}'@'${str_url_target}'@g'| gzip > ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz
if [[ $? == 0 ]]
then
	#Vérification que les nombre de mots et nombre de lignes n'ont pas changé
	int_lines_dump_origin=$(zcat ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz|wc -l)
	int_lines_dump_import=$(zcat ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz|wc -l)
	int_words_dump_origin=$(zcat ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz|wc -w)
	int_words_dump_import=$(zcat ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz|wc -w)
	if [[ ${int_lines_dump_origin} == ${int_lines_dump_import} ]] && [[ ${int_words_dump_origin} == ${int_words_dump_import} ]]
	then
		echo `date +'%d/%m/%Y %T'`" : Le remplacement des URLs source par les URLs cible depuis le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz vers le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz s'est bien déroulé." >> $log_file 2>&1
		echo "Le remplacement des URLs source par les URLs cible depuis le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz vers le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz s'est bien déroulé."
	else
		echo `date +'%d/%m/%Y %T'`" : Des données ont été altérées lors du remplacement des URLs source par les URLs cible depuis le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz vers le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz. Fin du script." >> $log_file 2>&1
		echo "Des données ont été altérées lors du remplacement des URLs source par les URLs cible depuis le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz vers le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz. Fin du script."
		exit 1
	fi
else
	echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors du remplacement des URLs source par les URLs cible depuis le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz vers le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz. Fin du script." >> $log_file 2>&1
	echo "Une erreur s'est produite lors du remplacement des URLs source par les URLs cible depuis le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_source.sql.gz vers le fichier ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz. Fin du script."
	exit 1
fi
echo ""

#Décompression des fichier à importer
tar -zxf ${temp_dir}/${str_dir_origin_child}_source.tar.gz -C ${temp_dir}
if [[ $? == 0 ]]
then
	echo `date +'%d/%m/%Y %T'`" : L'extraction des fichiers source ${temp_dir}/${str_dir_origin_child}_source.tar.gz s'est bien déroulée." >> $log_file 2>&1
	echo "L'extraction des fichiers source ${temp_dir}/${str_dir_origin_child}_source.tar.gz s'est bien déroulée."
else
	echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de l'extraction des fichiers source ${temp_dir}/${str_dir_origin_child}_source.tar.gz. Fin du script." >> $log_file 2>&1
	echo "Une erreur s'est produite lors de l'extraction des fichiers source ${temp_dir}/${str_dir_origin_child}_source.tar.gz. Fin du script."
	exit 1
fi

#Modification du fichier de configuration source avec les valeurs de la configuration cible
for param in ${!arr_parameters_target[@]}
do
	sed -i -E "s/^(define.*'"${param}"' *, *)('|\")(.*)('|\")/\1'"${arr_parameters_target[${param}]}"'/" ${temp_dir}/${str_dir_origin_child}/wp-config.php
	if [[ $? == 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : La modification du paramètre ${param} s'est bien déroulée." >> $log_file 2>&1
		echo "La modification du paramètre ${param} s'est bien déroulée."
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de la modification du paramètre ${param} de '${arr_parameters_origin[${param}]}' en '${arr_parameters_target[${param}]}'. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors de la modification du paramètre ${param} de '${arr_parameters_origin[${param}]}' en '${arr_parameters_target[${param}]}'. Fin du script."
		exit 1
	fi
done

if [[ ${str_table_prefix_origin} != ${str_table_prefix_target} ]]
then
	sed -i -E "s/^(\\\$table_prefix *= *)'(.*)'/\1'"${str_table_prefix_origin}"'/" ${temp_dir}/${str_dir_origin_child}/wp-config.php
	if [[ $? == 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : La modification du paramètre \$table_prefix s'est bien déroulée." >> $log_file 2>&1
		echo "La modification du paramètre \$table_prefix s'est bien déroulée."
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de la modification du paramètre \$table_prefix de '${str_table_prefix_target}' en '${str_table_prefix_origin}'. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors de la modification du paramètre \$table_prefix de '${str_table_prefix_target}' en '${str_table_prefix_origin}'. Fin du script."
		exit 1
	fi
else
	echo `date +'%d/%m/%Y %T'`" : Les préfixes des tables sont les mêmes : \"${str_table_prefix_target}\"." >> $log_file 2>&1
	echo "Les préfixes des tables sont les mêmes : \"${str_table_prefix_target}\"."
fi
echo ""

#Tranformation des URL dans les fichiers source
find ${temp_dir}/${str_dir_origin_child} -type f -exec sed -i -E 's@https?://'${str_url_origin}'@https://'${str_url_target}'@g;s@'${str_url_origin}'@'${str_url_target}'@g' {} +
if [[ $? == 0 ]]
then
	echo `date +'%d/%m/%Y %T'`" : Le remplacement des URLs source par les URLs cible dans le dossier des fichiers source ${temp_dir}/${str_dir_origin_child} s'est bien déroulé." >> $log_file 2>&1
	echo "Le remplacement des URLs source par les URLs cible dans le dossier des fichiers source ${temp_dir}/${str_dir_origin_child} s'est bien déroulé."
else
	echo `date +'%d/%m/%Y %T'`" : Une erreur est survenue lors du remplacement des URLs source par les URLs cible dans le dossier des fichiers source ${temp_dir}/${str_dir_origin_child}. Fin du script." >> $log_file 2>&1
	echo "Une erreur est survenue lors du remplacement des URLs source par les URLs cible dans le dossier des fichiers source ${temp_dir}/${str_dir_origin_child}. Fin du script."
	exit 1
fi

# Suppression du cache
for dir in $(find ${temp_dir}/${str_dir_origin_child}/wp-content -maxdepth 1 -type d -name *cache*)
do
	rm -rf ${dir}
	if [[ $? == 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : La suppression du dossier de cache ${dir} s'est bien déroulée." >> $log_file 2>&1
		echo "La suppression du dossier de cache ${dir} s'est bien déroulée."
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de la suppression du dossier de cache ${dir}. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors de la suppression du dossier de cache ${dir}. Fin du script."
		exit 1
	fi
done

#Renommage du dossier à importer
if [[ ${str_dir_origin_child} != ${str_dir_target_child} ]]
then
	mv ${temp_dir}/${str_dir_origin_child} ${temp_dir}/${str_dir_target_child}
	if [[ $? == 0 ]]
	then
		echo `date +'%d/%m/%Y %T'`" : Le renommage du dossier ${temp_dir}/${str_dir_origin_child} en ${temp_dir}/${str_dir_target_child} s'est bien déroulé." >> $log_file 2>&1
		echo "Le renommage du dossier ${temp_dir}/${str_dir_origin_child} en ${temp_dir}/${str_dir_target_child} s'est bien déroulé."
	else
		echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors du renommage du dossier ${temp_dir}/${str_dir_origin_child} en ${temp_dir}/${str_dir_target_child}. Fin du script." >> $log_file 2>&1
		echo "Une erreur s'est produite lors du renommage du dossier ${temp_dir}/${str_dir_origin_child} en ${temp_dir}/${str_dir_target_child}. Fin du script."
		exit 1
	fi
fi

#Compression des fichiers à importer
tar -zcf ${temp_dir}/${str_dir_target_child}_import.tar.gz -C ${temp_dir} ${str_dir_target_child}
if [[ $? == 0 ]]
then
	echo `date +'%d/%m/%Y %T'`" : La compression du dossier ${temp_dir}/${str_dir_target_child} en ${temp_dir}/${str_dir_target_child}_import.tar.gz s'est bien déroulée." >> $log_file 2>&1
	echo "La compression du dossier ${temp_dir}/${str_dir_target_child} en ${temp_dir}/${str_dir_target_child}_import.tar.gz s'est bien déroulée."
else
	echo `date +'%d/%m/%Y %T'`" : Une erreur s'est produite lors de la compression du dossier ${temp_dir}/${str_dir_target_child} en ${temp_dir}/${str_dir_target_child}_import.tar.gz. Fin du script." >> $log_file 2>&1
	echo "Une erreur s'est produite lors de la compression du dossier ${temp_dir}/${str_dir_target_child} en ${temp_dir}/${str_dir_target_child}_import.tar.gz. Fin du script."
	exit 1
fi
echo ""

#Envoi des fichier sur le serveur cible
scp_push ${str_server_target} ${str_dir_target_parent}/${arr_parameters_target[DB_NAME]}_import.sql.gz ${temp_dir}/${arr_parameters_origin[DB_NAME]}_import.sql.gz
scp_push ${str_server_target} ${str_dir_target_parent}/${str_dir_target_child}_import.tar.gz ${temp_dir}/${str_dir_target_child}_import.tar.gz
echo ""

#Purge de la base de données
value=$(ssh ${str_server_target} "mysqldump -u${arr_parameters_target[DB_USER]} -p${arr_parameters_target[DB_PASSWORD]} --add-drop-table --no-data ${arr_parameters_target[DB_NAME]} | grep -E '^DROP|FOREIGN_KEY_CHECKS' | mysql -u${arr_parameters_target[DB_USER]} -p${arr_parameters_target[DB_PASSWORD]} ${arr_parameters_target[DB_NAME]}")
if [[ $? == 0 && ${value} == "" ]]
then
	echo `date +'%d/%m/%Y %T'`" : La purge des tables de la base de données ${arr_parameters_target[DB_NAME]} sur le serveur ${str_server_target} s'est bien déroulée." >> $log_file 2>&1
	echo "La purge des tables de la base de données ${arr_parameters_target[DB_NAME]} sur le serveur ${str_server_target} s'est bien déroulée."
else
	echo `date +'%d/%m/%Y %T'`" : Erreur lors de la purge des tables de la base de données ${arr_parameters_target[DB_NAME]} sur le serveur ${str_server_target}. Fin du script." >> $log_file 2>&1
	echo "Erreur lors de la purge des tables de la base de données ${arr_parameters_target[DB_NAME]} sur le serveur ${str_server_target}. Fin du script."
	exit 1
fi

#Import des données sur le serveur cible
value=$(ssh ${str_server_target} "gunzip < ${str_dir_target_parent}/${arr_parameters_target[DB_NAME]}_import.sql.gz | mysql -u${arr_parameters_target[DB_USER]} -p${arr_parameters_target[DB_PASSWORD]} ${arr_parameters_target[DB_NAME]}")
if [[ $? == 0 && ${value} == "" ]]
then
	echo `date +'%d/%m/%Y %T'`" : L'import des données dans la base de données ${arr_parameters_target[DB_NAME]} sur le serveur ${str_server_target} s'est bien déroulé." >> $log_file 2>&1
	echo "L'import des données dans la base de données ${arr_parameters_target[DB_NAME]} sur le serveur ${str_server_target} s'est bien déroulé."
else
	echo `date +'%d/%m/%Y %T'`" : Erreur lors de l'import des données dans la base de données ${arr_parameters_target[DB_NAME]} sur le serveur ${str_server_target}. Fin du script." >> $log_file 2>&1
	echo "Erreur lors de l'import des données dans la base de données ${arr_parameters_target[DB_NAME]} sur le serveur ${str_server_target}. Fin du script."
	exit 1
fi

#Suppression du dossier cible
ssh ${str_server_target} rm -rf ${str_dir_target}
if [[ $? == 0 && ${value} == "" ]]
then
	echo `date +'%d/%m/%Y %T'`" : La suppression du dossier ${str_dir_target} sur le serveur ${str_server_target} s'est bien déroulée." >> $log_file 2>&1
	echo "La suppression du dossier ${str_dir_target} sur le serveur ${str_server_target} s'est bien déroulée."
else
	echo `date +'%d/%m/%Y %T'`" : Erreur lors de la suppression du dossier ${str_dir_target} sur le serveur ${str_server_target}. Fin du script." >> $log_file 2>&1
	echo "Erreur lors de la suppression du dossier ${str_dir_target} sur le serveur ${str_server_target}. Fin du script."
	exit 1
fi

#Décompression des fichiers sur le serveur cible
value=$(ssh ${str_server_target} tar -zxf ${str_dir_target_parent}/${str_dir_target_child}_import.tar.gz -C ${str_dir_target_parent} --warning=no-timestamp)
if [[ $? == 0 && ${value} == "" ]]
then
	echo `date +'%d/%m/%Y %T'`" : La décompression des fichiers depuis ${str_dir_target_parent}/${str_dir_target_child}_import.tar.gz dans le dossier ${str_dir_target_parent} s'est bien déroulée." >> $log_file 2>&1
	echo "La décompression des fichiers depuis ${str_dir_target_parent}/${str_dir_target_child}_import.tar.gz dans le dossier ${str_dir_target_parent} s'est bien déroulée."
else
	echo `date +'%d/%m/%Y %T'`" : Erreur lors de la décompression des fichiers depuis ${str_dir_target_parent}/${str_dir_target_child}_import.tar.gz dans le dossier ${str_dir_target_parent}. Fin du script." >> $log_file 2>&1
	echo "Erreur lors de la décompression des fichiers depuis ${str_dir_target_parent}/${str_dir_target_child}_import.tar.gz dans le dossier ${str_dir_target_parent}. Fin du script."
	exit 1
fi

#Correction des droits sur les fichier sur le serveur cible
value=$(ssh ${str_server_target} chown -R www:www ${str_dir_target})
if [[ $? == 0 && ${value} == "" ]]
then
	echo `date +'%d/%m/%Y %T'`" : La correction des droits sur le dossier ${str_dir_target} s'est bien déroulée." >> $log_file 2>&1
	echo "La correction des droits sur le dossier ${str_dir_target} s'est bien déroulée."
else
	echo `date +'%d/%m/%Y %T'`" : Erreur lors de la correction des droits sur le dossier ${str_dir_target}. Fin du script." >> $log_file 2>&1
	echo "Erreur lors de la correction des droits sur le dossier ${str_dir_target}. Fin du script."
	exit 1
fi
echo ""

echo "Déploiement terminé : https://${str_url_target}"
echo ""
echo "Une fois le déploiement validé, penser à supprimer les fichiers :"
echo " - Serveur ${str_server_origin} : /tmp/${arr_parameters_origin[DB_NAME]}_source.sql.gz et /tmp/${str_dir_origin_child}_source.tar.gz."
echo "   Commande à passer :"
echo "      rm /tmp/${arr_parameters_origin[DB_NAME]}_source.sql.gz /tmp/${str_dir_origin_child}_source.tar.gz"
echo " - Serveur ${str_server_target} : ${str_dir_target_parent}/${str_dir_target_child}_import.tar.gz, ${str_dir_target_parent}/${arr_parameters_target[DB_NAME]}_import.sql.gz, /tmp/${arr_parameters_target[DB_NAME]}_cible.sql.gz et /tmp/${str_dir_target_child}_cible.tar.gz."
echo "   Commande à passer :"
echo "      rm ${str_dir_target_parent}/${str_dir_target_child}_import.tar.gz ${str_dir_target_parent}/${arr_parameters_target[DB_NAME]}_import.sql.gz /tmp/${arr_parameters_target[DB_NAME]}_cible.sql.gz /tmp/${str_dir_target_child}_cible.tar.gz"

########################################################

## Fin du script
##########################

Exemple d'utilisation

Putty icon.png Console SSH