L'ensemble des scripts et bibliothèques bash utilisés pour maintenir l'infrastructure du Tetalab. Ce socle Bash est une version légère et adaptée du socle Bash essentiellement développé par Emmanuel Confrère, éminent DBA Calédonien.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

294 lines
9.8 KiB

#!/bin/bash
#------------------------------------------------------------------------------------------------------------------
# Script : expl_transfert_dir.sh
# Auteur : Doug Le Tough
# Date : 22-07-2017
# Version : 1.0.0
# Objet : Permet le transfert de répertoire entre VM
#
#------------------------------------------------------------------------------------------------------------------
# Mise a jour :
#
# 1.0.0 22/07/2017 - Doug Le Tough - Cre : Mise en production
#
#------------------------------------------------------------------------------------------------------------------
# Dependances : Aucune
#
#
#------------------------------------------------------------------------------------------------------------------
# Liste des options et arguments:
#
# @OPT: o:src_host:src_host:1/1::::
# @OPT: o:dst_host:dst_host:1/1::::
# @OPT: o:src_dir:src_dir:1/1::::
# @OPT: o:dst_dir:dst_dir:1/1::::
# @OPT: f:create:create:1/1:false:::
# @OPT: f:dst_user:dst_user:1/1:asr:::
# @OPT: f:dst_group:dst_group:1/1:asr:::
# @OPT: f:dst_mode:dst_mode:1/1:755:::
#
#------------------------------------------------------------------------------------------------------------------
# Liste des erreurs:
#
# 2 | erreur | stop | ${ERROR}
#
#------------------------------------------------------------------------------------------------------------------
##
## Syntaxe :
## --------
##
## prompt> expl_transfert_dir.sh -src_host <VM1> -dst_host <VM2> -src_dir <DIR1> -dst_dir <DIR2> [-create true] [-dst_user <USER>] [-dst_group <GROUP>] [-dst_mode <MODE>]
##
## ex: expl_transfert_dir.sh -src_host marian -dst_host jimmy -src_dir /etc/httpd -dst_dir /home/doug -create true -dst_user doug -dst_group wheel -dst_mode 644
##
## Prérequis:
## ----------
## - Le script doit être executé par l'utilisateur asr sur sousetsuken
##
## Fonctionnement:
## ---------------
## Récupère sur sousetsuken depuis src_host le contenu du répertoire src_dir et le copie dans le répertoire
## dst_dir sur dst_host.
##
## Si l'option facultative -create est positionnée à true, le répertoire de destination sera créé.
## Par défaut cette option vaut false.
##
## Si le répertoire de destination n'existe pas et si l'option -create ne vaut pas true, le script remontera
## une erreur.
##
## Si le répertoire de destination existe et l'option -create vaut true, le transfert aura lieu normalement.
##
## Tous les noms de répertoires doivent être des chemins absolus.
##
## Les options -dst_user, -dst_group et -dst_mode permettent de gérer les droits et permissions sur le
## répertoire copié
##
##
## ATTENTION:
## - Le script transfert LE CONTENU du répertoire source
## - Le script modifie les droits et permissions du répertoire de destination, soyez prudent lorsque le répertoire
## existe déjà.
##
#------------------------------------------------------------------------------------------------------------------
# Initialisation de l'environement
#------------------------------------------------------------------------------------------------------------------
if [ "${USER}" != "asr" ]; then
ERROR="Seul l'utilisateur asr peut utiliser ce script"
echo -e "\033[91m${ERROR}\033[0m"
exit 1
fi
source /etc/profile.d/tetalab.sh
if [ ! -f ${NC_EXPL_CFG}/init.conf ]; then
echo "Le fichier d'initialisation du socle \${NC_EXPL_CFG}/init.conf n'éxiste pas !"
echo "Arrêt du script par sécurité"
exit 250
fi
source ${NC_EXPL_CFG}/init.conf
#------------------------------------------------------------------------------------------------------------------
# Fonctions
#------------------------------------------------------------------------------------------------------------------
function check_hosts
{
for HOST in ${src_host} ${dst_host}
do
if [ $(host ${HOST} | grep "Host ${HOST} not found: 3(NXDOMAIN)" | wc -l) -eq 1 ]; then
ERROR="${HOST} n'est pas un nom d'hôte valide"
fct_erreur 2
fi
done
}
function check_dirs
{
fct_message "Vérification du répertoire source ${src_dir} sur ${src_host}" -color jaune
ssh ${src_host} "sudo find ${ROOT_SRC_DIR} -maxdepth 1 -type d -name ${BASE_SRC_DIR} >/dev/null 2>&1"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Le répertoire ${src_host}:${src_dir} n'existe pas"
fct_erreur 2
fi
if [ $(ssh ${src_host} "sudo find ${ROOT_SRC_DIR} -maxdepth 1 -type d -name ${BASE_SRC_DIR}" | wc -l) -eq 0 ]; then
ERROR="Le répertoire ${src_host}:${src_dir} n'existe pas"
fct_erreur 2
fi
if [ "${create}" != "true" ]; then
fct_message "Vérification du répertoire destination ${dst_dir} sur ${dst_host}" -color jaune
ssh ${dst_host} "sudo find ${ROOT_DST_DIR} -maxdepth 1 -type d -name ${BASE_DST_DIR} >/dev/null 2>&1"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Le répertoire ${dst_host}:${dst_dir} n'existe pas"
fct_erreur 2
fi
if [ $(ssh ${dst_host} "sudo find ${ROOT_DST_DIR} -maxdepth 1 -type d -name ${BASE_DST_DIR} | wc -l") -eq 0 ]; then
ERROR="Le répertoire ${dst_host}:${dst_dir} n'existe pas"
fct_erreur 2
fi
fi
}
function check_user
{
if [ ! $(ssh ${dst_host} "sudo cat /etc/passwd | grep -E "^${dst_user}\:" | wc -l") -eq 1 ]; then
ERROR="L'utilisateur ${dst_user} n'existe pas sur ${dst_host}"
fct_erreur 2
fi
}
function check_group
{
if [ ! $(ssh ${dst_host} "sudo cat /etc/group | grep -E "^${dst_group}\:" | wc -l") -eq 1 ]; then
ERROR="Le groupe ${dst_group} n'existe pas sur ${dst_host}"
fct_erreur 2
fi
}
function create_dst_dir
{
fct_message "Création du répertoire de destination ${dst_host}:${dst_dir}" -color jaune
ssh ${dst_host} "sudo mkdir -p ${dst_dir}"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création du répertoire de destination"
fct_erreur 2
fi
}
function get_src_archive
{
fct_message "Création de l'archive /tmp/${ARCHIVE_NAME} du répertoire du répertoire ${src_host}:${src_dir}" -color jaune
ssh ${src_host} "sudo tar -C ${src_dir} -czf /tmp/${ARCHIVE_NAME} ./"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création de l'archive du répertoire source (1)"
fct_message ${ERROR} -color rouge
fct_erreur 3
fct_erreur 1
fi
ssh ${src_host} "sudo chown asr: /tmp/${ARCHIVE_NAME}"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création de l'archive du répertoire source (2)"
fct_message ${ERROR} -color rouge
fct_erreur 3
fct_erreur 1
fi
fct_message "Récupération de l'archive /tmp/${ARCHIVE_NAME} depuis ${src_host}" -color jaune
scp -q ${src_host}:/tmp/${ARCHIVE_NAME} /tmp
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la récupération de l'archive du répertoire source"
fct_message ${ERROR} -color rouge
fct_erreur 3
fct_erreur 1
fi
}
function cp_archive
{
fct_message "Copie de l'archive locale /tmp/${ARCHIVE_NAME} vers ${dst_host}:/tmp/${ARCHIVE_NAME}" -color jaune
scp -q /tmp/${ARCHIVE_NAME} ${dst_host}:/tmp/${ARCHIVE_NAME}
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la copie de l'archive"
fct_message ${ERROR} -color rouge
fct_erreur 3
fct_erreur 1
fi
}
function untar_archive
{
fct_message "Décompression de l'archive /tmp/${ARCHIVE_NAME} vers ${dst_host}:${dst_dir}" -color jaune
ssh ${dst_host} "sudo tar -C ${dst_dir} -xzf /tmp/${ARCHIVE_NAME}"
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la décompression de l'archive"
fct_message ${ERROR} -color rouge
fct_erreur 3
fct_erreur 1
fi
}
function set_rights
{
fct_message "Application des droits ${dst_user}:${dst_group} sur ${dst_host}:${dst_dir}" -color jaune
ssh ${dst_host} "sudo chown -R ${dst_user}:${dst_group} ${dst_dir}"
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'application des droits"
fct_message ${ERROR} -color rouge
fct_erreur 3
fct_erreur 1
fi
}
function set_permissions
{
fct_message "Application des permission ${dst_mode} sur ${dst_host}:${dst_dir}" -color jaune
ssh ${dst_host} "sudo chmod -R ${dst_mode} ${dst_dir}"
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'application des permissions"
fct_message ${ERROR} -color rouge
fct_erreur 3
fct_erreur 1
fi
}
function rm_archives
{
fct_message "Suppression de l'archive /tmp/${ARCHIVE_NAME} sur ${src_host}" -color jaune
ssh ${src_host} "sudo rm -Rf /tmp/${ARCHIVE_NAME}"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la suppression de l'archive"
fct_erreur 2
fi
fct_message "Suppression de l'archive locale /tmp/${ARCHIVE_NAME}" -color jaune
sudo rm -Rf /tmp/${ARCHIVE_NAME}
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la suppression de l'archive"
fct_erreur 2
fi
fct_message "Suppression de l'archive /tmp/${ARCHIVE_NAME} sur ${dst_host}" -color jaune
ssh ${dst_host} "sudo rm -Rf /tmp/${ARCHIVE_NAME}"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la suppression de l'archive"
fct_erreur 2
fi
}
#------------------------------------------------------------------------------------------------------------------
# Traitement
#------------------------------------------------------------------------------------------------------------------
ROOT_SRC_DIR=$(dirname ${src_dir})
BASE_SRC_DIR=$(basename ${src_dir})
ROOT_DST_DIR=$(dirname ${dst_dir})
BASE_DST_DIR=$(basename ${dst_dir})
# Génère une chaine aléatoire
RND=$(dd if=/dev/urandom bs=3 count=40 2>/dev/null | md5sum | cut -d' ' -f1)
# Le nom de l'archive contenant les documents à récupérer
ARCHIVE_NAME=${RND}.tgz
check_hosts
check_dirs
check_user
check_group
if [ "${create}" == "true" ]; then
create_dst_dir
fi
get_src_archive
cp_archive
untar_archive
set_rights
set_permissions
rm_archives
fct_erreur 0