Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tous,
Aujourd'hui je vous propose un petit script pour les utilisateurs de Puppet.
Tout d'abord le Filebucket sous Puppet est un système de "backup" où il place les fichiers que Puppet remplace. On va donc pouvoir les parcourir, afficher le contenu ou les restaurer (où on le souhaite).
Les fichiers sont stockés dans une arborescence un peu spéciale basée sur le md5 du fichier. D'où l'utilité d'un script pour se faciliter la vie.
J'utilise la configuration du Filebucket de Puppet par défaut, il stock les fichiers sur l'agent dans /var/lib/puppet/clientbucket.
La partie recherche des fichiers (fonction get_files) n'est pas de moi, elle permettait de sortir une liste de tous les fichiers, je l'ai juste améliorée pour que l'on puisse y faire une recherche.
Le script va vous permettre de :
Rechercher les fichier dans le filebucket (tous, recherche par date / recherche par filepath ou les deux)
Afficher le contenu d'un ou plusieurs fichiers
Restaurer un ou plusieurs fichiers
Et tout ça avec un joli menu
Je n'ai pas mis de 'clear' au début de chaque menus, tout simplement parce qu'il peut-être utile pour copier le md5 d'avoir le résultat de la recherche sous les yeux (et tous les utilisateurs ne savent pas forcément qu'il y a toujours le scrollback buffer ^^).
Si vous avez des améliorations à apporter n'hésitez pas !
PS : Je n'ai absolument ajouté aucun commentaires pour expliquer mon code, ce que je ferais quand j'aurais un peu plus de temps !
#!/bin/bash
#
# Author: soukki44
#
# This script is used to search files in the Puppet's Filebucket,
# restore them or just print their content.
#
# You can modify this script but please credit if you redistribute
#
# There is not warranty that this script will work for you. The Puppet's
# configuration that has been used is the default one. The filebucket is
# stored on the agent in '/var/lib/puppet/clientbucket'.
# get_files function is used to look for files stored in the filebucket
function get_files() {
path=$1
timesearch=$2
temp_file=/tmp/$$.tmp
trap "rm -f ${temp_file} >/dev/null 2>&1" EXIT INT
find $(puppet config print clientbucketdir) -name paths | while read path_file
do
md5=$(dirname ${path_file} | awk -F'/' '{printf "%s", $NF}')
location=$(cat ${path_file} | awk '{ printf "%s", $0 }')
bucket_time=$(stat --printf="%y" ${path_file})
printf "%s\t%s\t%s\n" "${bucket_time}" "${md5}" "${location}" >> ${temp_file}
done
if [ $path != "none" ]; then
if [ $timesearch != "none" ]; then
cat ${temp_file} | sort | grep $path | grep $timesearch
else
cat ${temp_file} | sort | grep $path
fi
elif [ $timesearch != "none" ];then
cat ${temp_file} | sort | grep $timesearch
else
cat ${temp_file} | sort
fi
echo -e "\nTerminé!\n"
read -p "Appuyer sur une touche pour continuer..."
menu
}
# Function get_content is used to print the content of a file
function get_content () {
read -p "Veuillez entrer le md5 du fichier à afficher: " md5
puppet filebucket get -l -b /var/lib/puppet/clientbucket $md5
read -r -p "${1:-Voulez-vous en afficher un autre? [y/N]} " response
case $response in
[oyOY])
get_content
;;
*)
menu
;;
esac
}
# Function restore is used to restore a file
function restore () {
for i in $(seq 1 ${n}); do
read -p "Veuillez entrer le md5 du fichier que vous souhaitez restaurer: " md5
read -p "Veuillez entrer le chemin complet (avec nom du fichier) de restauration (ex /tmp/apache2.conf): " path
puppet filebucket restore -l -b /var/lib/puppet/clientbucket $path $md5
done
echo -e "\nTerminé!\n"
read -r -p "${1:-Voulez-vous en restaurer un autre? [y/N]} " response
case $response in
[oyOY])
restore
;;
*)
printf "\33c"
menu
;;
esac
}
# Secondary menu for choosing wich way to call the get_files function
function menu_list() {
printf "\33c"
echo -e "\n\033[33m*** Recherche dans le Filebucket *** :\033[00m"
echo -e "\n\033[1;32m 1 -\033[0m Rechercher tous les fichiers"
echo -e "\033[1;32m 2 -\033[0m Rechercher à partir du chemin d'un fichier"
echo -e "\033[1;32m 3 -\033[0m Rechercher à partir du chemin d'un fichier et d'une date"
echo -e "\033[1;32m 9 -\033[0m Retour au menu\n"
echo "Entrez le numéro correspondant à votre choix: "
while :
do
read CHOIX
case $CHOIX in
1)get_files none none;;
2)
read -p "Veuillez entrer le chemin complet vers le fichier: " path
get_files $path none
;;
3)
read -p "Veuillez entrer le chemin complet vers le fichier: " path
read -p "Veuillez entrer la date (format yyy-mm-dd): " timesearch
get_files $path $timesearch
;;
9)
printf "\33c"
menu
;;
*)echo "Entrez le numéro correspondant à votre choix: ";;
esac
done
}
# Function to exit the script
function quitter() {
exit
}
# The menu
function menu() {
echo -e "\n\033[33m*** Que voulez-vous faire ? *** :\033[00m"
echo -e "\n\033[1;32m 1 -\033[0m Lister les fichiers dans le filebucket (permet de récupérer le md5)"
echo -e "\033[1;32m 2 -\033[0m Afficher le contenu d'un fichier dans le filebucket (md5 obligatoire)"
echo -e "\033[1;32m 3 -\033[0m Restaurer un fichier depuis le filebucket (md5 obligatoire)"
echo -e "\033[1;32m 9 -\033[0m Quitter le script\n"
echo "Entrez le numéro correspondant à votre choix: "
while :
do
read CHOIX
case $CHOIX in
1)menu_list;;
2)get_content;;
3)restore;;
9)quitter;;
*)echo "Entrez le numéro correspondant à votre choix: ";;
esac
done
}
# When we launch the script ( not in menu() because we don't want to print this everytime)
function welcome() {
printf "\33c"
echo -e "\n \033[1;31m--------------------------------\033[00m "
echo -e " \033[1;31m| Puppet Filebucket tools |\033[00m "
echo -e " \033[1;31m--------------------------------\033[00m \n"
menu
}
welcome
# eof
Dernière modification par Linuz (29-10-2014 11:22:02)
Hors ligne
Merci pour ta contribution, il y a juste un petit détail qui me gène au niveau du case:
case $response in
[yY][oO]|[yY])
j ai pas trop compris ton "[yY][oO]|[yY])", un simple "[oyOY])" n'aurait pas suffit ?
Enfin, comme tu es l'auteur, met toujours ton nom dans le script, genre "#author: Soukki44", enfin tu adaptes. Pour éviter que quelqu'un pompe ton code et réclame que tu n'en es pas l'auteur étant donné que le forum est pleinement accessible, ca vaut toujours la peine de le mettre
Bonne continuation.
Hors ligne
En effet tu as raison . C'était un bout de code que j'ai récupéré d'un vieux script perdu dans mon arborescence C'est modifié merci !
J'ai aussi ajouté le "#author: Soukki44".
Merci du conseil
Dernière modification par Linuz (28-10-2014 16:51:50)
Hors ligne
Tu peux également remplacer clear par
printf "\33c"
Et profiter du echo -e pour mettre des \n pour éviter des lignes du genre
echo ""
Utiliser des logiciels propriétaires, c'est comme les plats préparés, on est incapable de dire les conservateurs qu'ils contiennent, on dira toujours que c'est bon, mais ça ne remplacera jamais le repas fait maison par sa maman.
]:D #! Crunchbang & Archlinux GNU/Linux User ]:D
Hors ligne
Tu peux également remplacer clear par
printf "\33c"
Haha je n'utilise même pas les astuces que je donne ^^'. C'est modifié.
Et profiter du echo -e pour mettre des \n pour éviter des lignes du genre
echo ""
En effet, je n'y avais même pas pensé ! Merci .
J'en ai profité pour corriger mon indentation qui était un peu n'importe quoi par 2 espaces.
Dernière modification par Linuz (29-10-2014 12:15:34)
Hors ligne
Haha je n'utilise même pas les astuces que je donne ^^'. C'est modifié.
Oui j'avais trouvé le truc tellement sympa en python que j'ai testé avec bash et printf.
Utiliser des logiciels propriétaires, c'est comme les plats préparés, on est incapable de dire les conservateurs qu'ils contiennent, on dira toujours que c'est bon, mais ça ne remplacera jamais le repas fait maison par sa maman.
]:D #! Crunchbang & Archlinux GNU/Linux User ]:D
Hors ligne
Pages : 1