Ce script est codé .. hum ... en bash
Fonctionnalités:
- permet de lister les fichiers/répertoires important présent sur le système
- permet la sauvegarde dans une archive
- permet la sauvegarde via FTP de l'archive précédante
- auto-génération du fichier contenant les chemins vers les différents fichiers/répertoires important (à mettre à jour selon vos besoin)
- auto-sauvegarde de lui-même (il serait désastreux d'avoir tout sauvé sauf le script qui a fait le boulot pour vous
Utilisation:
- sh pix-save.sh
- ./pix-save.sh (nécessite de donner le droit d'exécution préalablement: chmod +x pix-save.sh)
Par défaut, l'exacution de ce script demande un utilisateur ROOT et affiche l'aide si aucun paramètre n'est précisé.
Paramètres:
- --help: affiche l'aide
- --check: vérifie la présence des fichiers/répertoires important
- --save: sauvegarde vos fichiers/répertoires dans une archive
- --save --ftp: sauvegarde vos fichiers/répertoires localement et via FTP
Configurations: voir début du script ...
Personnalisation:
Après le premier lancement du script (--check ou --save), celui-ci va auto-générer un fichier appelé 'pix-save.data'. Ce fichier peut être mis à jour pour ajouter/supprimer des chemins absolu vers des fichiers ou des répertoires importants. Vous avez aussi la possibilité de modifier directement le script au niveau de la fonction 'generate_save_list()' qui a pour but de générer ce fichier 'pix-save.data'.
Nom du script: PiX-SAVE
Version actuelle: 1.0
Date de sortie: 13/12/2007
Les +:
- rapide
- efficace (si on oublie pas d'ajouter des chemins ...)
- copie de l'archive sur une autre machine
- en francais
Copier-coller le code si dessous dans un fichier que vous nomerez: pix-save.sh
Vous n'avez plus qu'a l'exécuter
Code: Select all
#!/bin/bash
# by loopx
# 13/12/2007
############
#emplacement de ce script
THIS_PATH=$(pwd)
SCRIPT_NAME=$0
#Version
VERSION="1.0"
#Nom du fichier contenant la liste des fichiers/repertoires a sauvegarder
SAVE_LIST="pix-save.data"
#contient le chemin complet vers la liste des configs
SAVE_LIST_PATH=$THIS_PATH/$SAVE_LIST
#type d'archive 'tar' and 'tar.bz2'
ARCHIVE_TYPE="tar.bz2"
#emplacement du repertoire temporaire
TMP_PATH="/tmp/pix-save-tmp"
##############################################################################
#Permet d'afficher la date et l'heure
datetime() {
echo "Date et Heure:" $(date)
}
#Permet le nettoyage du sous repertoire 'pix-save'
remove_temporary_folder() {
echo
echo -n "> Suppression du répertoire temporaire '"$TMP_PATH"' ... "
rm -rf $TMP_PATH
if [ -e "$TMP_PATH" ]; then
echo "erreur"
echo " Il semble que '"$TMP_PATH"' n'a pu être supprimé ! :o"
else
echo "OK"
fi
}
#Permet de generer le fichier liste contenant les fichiers de configs les plus connus
#Il pourra etre modifie par apres (ou alors, modifier ce script)
generate_save_list() {
echo "> Generation de la liste de fichier de configurations par defaut dans '"$SAVE_LIST_PATH"'..."
echo "> N'hésitez pas à le modifier selon vos besoins..."
echo
touch $SAVE_LIST_PATH
if [ -e "$SAVE_LIST_PATH" ]; then
echo " Création du fichier: OK"
else
echo " !!! Création du fichier: KO (impossible de creer le fichier, permission refusee ???)"
exit 1
fi
#configuration système
echo /boot/grub/grub.conf >> $SAVE_LIST_PATH
echo /etc/apache2/ >> $SAVE_LIST_PATH
echo /etc/bind/ >> $SAVE_LIST_PATH
echo /etc/conf.d/ >> $SAVE_LIST_PATH
echo /etc/dhcp/dhcpd.conf >> $SAVE_LIST_PATH
echo /etc/exports >> $SAVE_LIST_PATH
echo /etc/firewall/ >> $SAVE_LIST_PATH
echo /etc/fstab >> $SAVE_LIST_PATH
echo /etc/group >> $SAVE_LIST_PATH
echo /etc/hosts >> $SAVE_LIST_PATH
echo /etc/laptop-mode/laptop-mode.conf >> $SAVE_LIST_PATH
echo /etc/lilo.conf >> $SAVE_LIST_PATH
echo /etc/make.conf >> $SAVE_LIST_PATH
echo /etc/modules.autoload.d/kernel-2.6 >> $SAVE_LIST_PATH
echo /etc/mplayer.conf >> $SAVE_LIST_PATH
echo /etc/named/ >> $SAVE_LIST_PATH
echo /etc/openvpn/ >> $SAVE_LIST_PATH
echo /etc/quagga/ >> $SAVE_LIST_PATH
echo /etc/rc.conf >> $SAVE_LIST_PATH
echo /etc/resolv.conf >> $SAVE_LIST_PATH
echo /etc/rsyncd.conf >> $SAVE_LIST_PATH
echo /etc/samba/ >> $SAVE_LIST_PATH
echo /etc/ssh/ >> $SAVE_LIST_PATH
echo /etc/vsftpd/ >> $SAVE_LIST_PATH
echo /etc/X11/xorg.conf >> $SAVE_LIST_PATH
echo /usr/src/linux/.config >> $SAVE_LIST_PATH
echo /root/script/ >> $SAVE_LIST_PATH
echo /var/www/localhost/ >> $SAVE_LIST_PATH
#configuration simple utilisateur
echo $(echo '$USER_HOME_PATH')"/.amsn/" >> $SAVE_LIST_PATH
echo $(echo '$USER_HOME_PATH')"/.kde/Autostart/" >> $SAVE_LIST_PATH
echo $(echo '$USER_HOME_PATH')"/.xbindkeysrc" >> $SAVE_LIST_PATH
echo $(echo '$USER_HOME_PATH')"/.xinitrc" >> $SAVE_LIST_PATH
echo $(echo '$USER_HOME_PATH')"/.Xmodmap" >> $SAVE_LIST_PATH
echo $(echo '$USER_HOME_PATH')"/startxgl" >> $SAVE_LIST_PATH
echo $(echo '$USER_HOME_PATH')"/workspace" >> $SAVE_LIST_PATH
echo " Génération: TERMINEE"
echo
}
#Vérifie la présence de la liste des fichiers/repertoires à sauvegarder; autogénération si introuvable
check_save_list() {
if [ ! -e "$SAVE_LIST_PATH" ]; then
echo "> Le fichier '$SAVE_LIST_PATH' est introuvable: AUTO-GENERATION requise..."
generate_save_list
else
echo "> Le fichier '$SAVE_LIST_PATH' existe déjà; il ne sera pas remplacé."
fi
echo
}
#Début d'action du script (--check, --save)
main() {
check_save_list
#récupérer le chemin vers le HOME de l'utilisateur principal
echo "> Vérification en cours ..."
echo
echo " Veuillez indiquer le chemin vers le répertoire simple utilisateur (optionnel, ex: '/home/loopx') :"
echo -n " > "
read USER_HOME_PATH
echo
#vérifier la saisie précédante
if [ -z $USER_HOME_PATH ]; then
echo "> Aucun répertoire utilisateur ne sera pris en compte"
echo
else
if [ -e $USER_HOME_PATH ]; then
echo "> Répertoire utilisateur validé"
echo
else
echo "!!! Répertoire utilisateur introuvable: '"$USER_HOME_PATH"' !"
exit 1
fi
fi
echo "> NOTE: les fichiers ci-dessous, qui ont été trouvé, feront partie de l'archive ..."
echo
#vérification de la présence des fichiers/répertoires
nb_found=0
nb_total=0
for FICHIER in $(cat $SAVE_LIST_PATH); do
#re-evaluate the variable for change $USER_HOME_PATH to /home/blabla
FICHIER=$(eval echo $FICHIER)
nb_total=$(( $nb_total + 1 ))
if [ -e $FICHIER ]; then
echo -e "\t***" $FICHIER "=> trouvé"
nb_found=$(( $nb_found + 1 ))
else
#on précise qu'un fichier est introuvable uniquement si c'est un check
if [ $STATE = "check" ]; then
echo -e "\t***" $FICHIER "=> pas trouvé"
fi
fi
done
echo
echo "=> En résumé:"
echo "===> "$nb_found"/"$nb_total" configurations à sauvegarder ..."
echo "=============================================>"
echo
#sauvegarde des fichiers/répertoires
if [ $STATE = "save" ]; then
echo
echo
echo "> NOTE: la liste précédente affiche les configurations trouvées. Si il en manque, veuillez mettre à jour le fichier '"$SAVE_LIST_PATH"'."
echo " Si vous désirer arrêter ce script maintenant, vous pouvez utiliser les touches CTRL+C ..."
echo
echo "> Copie en cours ..."
echo " Ou voulez-vous que l'archive soit créée ('/root' par défaut) ?"
echo -n " > "
read ARCHIVE_PATH
echo
#régler la valeur par défaut de ARCHIVE_PATH, la destination de l'archive contenant les sauvegardes
if [ -z $ARCHIVE_PATH ]; then
ARCHIVE_PATH="/root"
if [ -e $ARCHIVE_PATH ]; then
echo "> L'archive sera sauvegardée dans le répertoire '"$ARCHIVE_PATH"'..."
echo
else
echo "> '"$ARCHIVE_PATH"' n'existe pas! Utilisation du répertoire utilisateur de ROOT défini dans le shell ..."
echo
ARCHIVE_PATH=$HOME
if [ -e $ARCHIVE_PATH ]; then
echo "> L'archive sera sauvegardée dans le répertoire '"$ARCHIVE_PATH"'..."
echo
else
echo "!!! '"$ARCHIVE_PATH"', défini dans les variables d'environnement, est introuvable. Aucun répertoire valide n'a été trouvé pour le stockage de l'archive !"
exit 1
fi
fi
elif [ -e $ARCHIVE_PATH ]; then
echo "> L'archive sera sauvegardée dans le répertoire '"$ARCHIVE_PATH"'..."
echo
else
echo "!!! '"$ARCHIVE_PATH"' est introuvable !"
fi
#création du répertoire temporaire
echo -n "> Création du répertoire temporaire ... "
mkdir -p $TMP_PATH
#vérification du répertoire temporaire
if [ -e $TMP_PATH ]; then
echo "OK"
#vérification de la présence d'un ancien répertoire de configs
if [ -e "$TMP_PATH/files_to_save" ]; then
echo "> ATTENTION: un répertoire 'files_to_save' se trouvant dans '"$TMP_PATH"' à été trouvé."
echo " Ce répertoire ne devrait pas exister; il provient peut-être d'une ancienne sauvegarde..."
echo " Par sécurité, veuillez déplacer, ou supprimer, ce répertoire 'files_to_save' !"
echo "!!! '"$TMP_PATH"/files_to_save' ne doit pas exister lors de l'execution de ce script !"
exit 1
fi
mkdir -p $TMP_PATH/files_to_save
echo -n "> Creation du sous repertoire temporaire: '"$TMP_PATH"/files_to_save' ... "
if [ -e $TMP_PATH/files_to_save ]; then
echo "OK"
echo
else
echo "KO"
echo "!!! Impossible de créer le répertoire temporaire '"$TMP_PATH/files_to_save"' !"
exit 1
fi
else
echo " KO"
echo "!!! Impossible de créer le répertoire '"$TMP_PATH"' !"
exit 1
fi
echo "> Entrez le nom de l'archive (optionnel) :"
echo -n " > "
read ARCHIVE_NAME
echo
#régler le nom de l'archive par défaut (=nom du pc)
if [ -z $ARCHIVE_NAME ]; then
ARCHIVE_NAME="cfg-"$(hostname)
fi
echo "> Nom complet du fichier archive: '"$ARCHIVE_NAME"."$ARCHIVE_TYPE"'"
echo
echo
echo "> Sauvegarde en cours ..."
echo
#sauvegarde des fichiers/répertoires
nb_saved=0
for FICHIER in $(cat $SAVE_LIST_PATH); do
#re-evaluate the variable for change $USER_HOME_PATH to /home/blabla
FICHIER=$(eval echo $FICHIER)
if [ -e $FICHIER ]; then
nb_saved=$(( $nb_saved + 1 ))
echo -n -e $nb_saved"/"$nb_found"\t***" $FICHIER "=> en cours ... "
#copie des fichier/répertoires dans le répertoire temporaire
cp -r $FICHIER $TMP_PATH/files_to_save
echo "OK"
fi
done
echo
echo -n "> Je m'auto-sauvegarde :-) ... "$THIS_PATH/$SCRIPT_NAME" ... "
cp $THIS_PATH/$SCRIPT_NAME $TMP_PATH/files_to_save
echo "OK"
echo
#creation de l'archive
#cd $PATH_CONF
echo -n "> Création de l'archive "
if [ $ARCHIVE_TYPE = "tar" ]; then
echo -n "'TAR' ... "
#création de l'archive à l'aide de la commande TAR
tar cf $ARCHIVE_PATH/$ARCHIVE_NAME.$ARCHIVE_TYPE $TMP_PATH/files_to_save
elif [ $ARCHIVE_TYPE = "tar.bz2" ]; then
echo -n "'TAR.BZ2' ... "
#création de l'archive à l'aide de la commande TAR
tar cjf $ARCHIVE_PATH/$ARCHIVE_NAME.$ARCHIVE_TYPE $TMP_PATH/files_to_save
else
echo "!!! Format d'archive non supporté: "$ARCHIVE_TYPE
echo "Veuillez vérifier la configuration de ce script !"
remove_temporary_folder
exit 1
fi
echo "terminé"
echo
echo "> Vous trouverez l'archive ici: "$ARCHIVE_PATH/$ARCHIVE_NAME.$ARCHIVE_TYPE
echo
remove_temporary_folder
#sauvegarde via ftp
if [ $ARG2 = '--ftp' ]; then
echo
echo
echo "> Sauvegarde de l'archive via FTP en cours..."
echo
echo -n " > Vérification de la présence de 'FTP' ... "
if [ -e "/usr/bin/ftp" ] || [ -e "/usr/sbin/ftp" ] || [ -e "/bin/ftp" ] || [ -e "/sbin/ftp" ]; then
echo "trouvé"
else
echo "introuvable !"
echo "!!! Veuillez installer la commande FTP sur votre système !"
exit 1
fi
echo
echo -n -e "\t> Entrez le nom ou l'IP du serveur FTP distant: "
read HOST_NAME
echo
echo -n -e "\t> Entrez le nom d'utilisateur: "
read USER_NAME
echo
echo -n -e "\t> Entrez le chemin où l'archive sera copiée (optionnel): "
read FTP_PATH
echo
#vérification du chemin, utilisation du HOME si non spécifié
if [ -z $FTP_PATH ]; then
FTP_PATH="~"
fi
#se placer dans le répertoire ou se trouve l'archive
cd $ARCHIVE_PATH
#NE PAS METTRE DE TABULATION A CET ENDROIT!!! NI D'ESPACE A LA FIN DE CES LIGNE !!! (pour le ftp)
#Dans le cas contraire, vous obtiendrez des erreurs ...!!!
ftp -n $HOST_NAME <<End-of-Session
user $USER_NAME
binary
cd $FTP_PATH
put $ARCHIVE_NAME.$ARCHIVE_TYPE
bye
End-of-Session
echo
echo "> Fin de la session FTP, si aucune erreur ne s'ai produite, c'est que le fichier a correctement été transféré :-)"
fi
fi
}
#Aide l'utilisateur à composer correctement la ligne appelant ce script
help() {
echo "> Vous êtes perdu ? Pas de panique, lisez ce qui suit :"
echo
echo " Le script 'PiX-SAVE' à pour but d'automatiser la sauvegarde des fichiers ou répertoires sensible sur un système UNIX. "
echo
echo " Voici la liste complète des paramètres pris en compte :"
echo " '--help' : afficher ce message d'aide."
echo " '--check' : permet de scanner la liste des configurations dans l'unique but de savoir s'ils sont présents sur le système."
echo " '--save' : identique à '--check', mais va en faire une sauvegarde dans une archive local au système."
echo " '--save --ftp' : identique à '--save' mais permet la copie de l'archive sur un serveur FTP via l'utilisation de la commande 'ftp'."
}
###########################################################################
# DEBUT DU SCRIPT
###########################################################################
#le tag (généré par figlet)
echo " ____ ___ __ ____ ___ _______"
echo "| _ \(_) \/ / / ___| / \ \ / / ____|"
echo "| |_) | |\ /____\___ \ / _ \ \ / /| _|"
echo "| __/| |/ \_____|__) / ___ \ V / | |___"
echo "|_| |_/_/\_\ |____/_/ \_\_/ |_____|"
echo -e "\t= = > VERSION "$VERSION "< = ="
echo
#seul root peut executer ce script
if [ $(whoami) != root ]; then
echo "Désolé, vous devez être ROOT pour utiliser ce script"
exit 1
fi
echo -e "NOTE: ce script va s'auto-sauvegarder lors de l'archivage de vos configuration :-)"
sleep 1
echo
echo -e "\tCommande appelante:" $0 $1 $2
echo
echo
if [ -z "$1" ]; then
help
elif [ "$1" = "--check" ]; then
STATE="check"
main
elif [ "$1" = "--save" ]; then
STATE="save"
#récuperer le 2ème paramètre: il est invisible à partir d'une fonction
if [ -z $2 ]; then
ARG2="nothing"
else
ARG2=$2
fi
main
elif [ "$1" = "--help" ]; then
help
elif [ "$1" = "--generate-save-list" ]; then
check_save_list
else
echo "> Option incorrecte! Consultez l'aide pour de plus amples informations :"
echo " './pix-save.sh --help' pour afficher l'aide."
fi
echo
echo "A bientot ;-)"
J'espère que vous l'essaierez et que vous l'apprécierez
N'oubliez pas de me renvoyer vos impressions et vos remarques / bugs / fonctionnalités manquantes, je pourrais faire en sorte de l'améliorer un peu
IMPORTANT: lors du copier-coller, vérifié que les longues lignes n'ont pas été coupé en 2 ... cela poserais un problèmes syntaxique suivit peut être d'une erreur de logique ... De plus, à un endroit, il est indiqué qu'il ne faut absolument PAS mettre de tabulation ou d'espace pour respecter l'indentation. Si vous le faites, la fonctionalité FTP de ce script ne fonctionnera plus: erreur de syntaxe ou un truc du genre ... Donc, merci de vérifier à 2 fois avant de me dire que le script ne s'exécute même pas


