#!/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:recursive:recursive:1/1:false::: # @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 -dst_host -src_dir -dst_dir [-recursive true] [-create true] [-dst_user ] [-dst_group ] [-dst_mode ] ## ## ex: expl_transfert_dir.sh -src_host marian -dst_host jimmy -src_dir /etc/httpd -dst_dir /home/doug -recursive true -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 -recursive est positionnée à true, la récupération sera récursive. ## Par défaut cette option vaut false. ## ## 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é ## #------------------------------------------------------------------------------------------------------------------ # 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 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 TAR_OPTIONS="--no-recursive" if [ "${recursive}" == "true" ]; then fct_message " * Option d'archivage récursif activée" TAR_OPTIONS="" fi ssh ${src_host} "sudo tar -C ${ROOT_SRC_DIR} ${TAR_OPTIONS} -czf /tmp/${ARCHIVE_NAME} ${BASE_SRC_DIR}" 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 if [ "${create}" == "true" ]; then create_dst_dir fi get_src_archive cp_archive untar_archive set_rights set_permissions rm_archives fct_erreur 0