295 lines
9.8 KiB
Bash
Executable File
295 lines
9.8 KiB
Bash
Executable File
#!/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
|