werk.feub.net

Icon

Mémo de Fabien Amann à propos de Mac, Fedora et caetera

Script de sauvegarde type snapshot

Il y a de cela un petit moment j’avais publié le script de sauvegarde que j’utilisais. Celui-ci propose un menu afin de choisir quoi sauvegarder. Je le trouvais plus souple pour des sauvegardes ponctuelles, faîtes à la main. Depuis il a évolué, il s’est simplifié. Bien que je l’utilise toujours, j’ai décidé de mettre en place un script plus automatisé côté serveur (clavicogyre est en général lancé depuis la station) et qui me donne une sauvegarde plus globale de type snapshot, un peu à la manière de Time Machine sur Macsans l’aspect graphique.

Le principe

Le principe n’est pas nouveau, il s’agit de faire une sauvegarde rsync avec les options récursifs (-r), archives (-a) et suppression (–delete) dans un répertoire current. Lorsque la tâche est terminée, on fait une copie cp avec les options liens durs (-l) et archives (-a) du contenu de current au même niveau vers un répertoire qui porte la date du jour. Et voilà. Lors de la prochaine sauvegarde, rsync va ajouter les nouveaux fichiers, mettre à jour ceux modifiés et supprimer ceux qui ont été supprimés dans current. L’historisation dans les répertoires avec la date permet de remonter vers différentes versions d’un fichier quant au répertoire current, il dispose toujours de l’image à jour des fichiers.

Le script

Voici le script que j’utilise :

#!/bin/bash
 
#======================================================================
# snapshot_backup.sh - Script de sauvegarde de type snapshot
#======================================================================
# by fabien a. [fabien@feub.net]
# http://werk.feub.net/
#======================================================================
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not,
#  - write to the Free Software
#               Foundation, Inc.,
#               51 Franklin Street,
#               Fifth Floor,
#               Boston, MA  02110-1301
#               USA.
#               - See http://www.gnu.org/licenses/gpl.html
#======================================================================
 
#======================================================================
# VARIABLES
#======================================================================
 
SOURCE="/rep/source/"
CIBLE="/rep/cible/"
 
DATE=`date +%Y%m%d-%H%M`
LOG="/rep/du/log/snapshot_rsync-${DATE}.log"
 
REP_A_SVG="etc usr bin home"
 
MAIL_DEST="toto@tata.net"
MAIL_SUBJECT="[snapshot] du `date +%D` à `date +%H:%M` "
 
VER="0.9"
 
#======================================================================
# EXECUTION
#======================================================================
 
echo "======================================================================"  | tee -a $LOG
echo "snapshot_backup.sh v.$VER" | tee -a $LOG
echo "http://werk.feub.net/" | tee -a $LOG
echo "----------------------------------------------------------------------" | tee -a $LOG
 
#======================================================================
# SYNCHRONISATION
#======================================================================
 
echo "Début de la sauvegarde le `date +%D` à `date +%H:%M` " | tee -a $LOG
echo "----------------------------------------------------------------------" | tee -a $LOG
for REP in $REP_A_SVG ;  do
    echo "    *    Sauvegarde de  $REP" | tee -a $LOG
    rsync -vrap --delete ${SOURCE}$REP $CIBLE/current | tee -a $LOG
done;
 
echo "----------------------------------------------------------------------" | tee -a $LOG
 
#======================================================================
# SNAPSHOT
#======================================================================
 
cp -val $CIBLE/current $CIBLE/$DATE | tee -a $LOG
 
echo "Fin de la sauvegarde le `date +%D` à `date +%H:%M` " | tee -a $LOG
echo "======================================================================" | tee -a $LOG
 
 
#======================================================================
# ENVOI EMAIL LOG
#======================================================================
 
/bin/mail -s "$MAIL_SUBJECT" $MAIL_DEST < $LOG
wait
 
exit 0

Cette technique permet d’avoir des sauvegardes historisées tout en gagnant beaucoup de place grâce aux copies en liens durs (hardlinks).

script : vérifier que rTorrent est lancé

Pour la gestion de mes torrents, j’utilise rTorrent, j’ai eu l’occasion d’en parler dans ce billet et celui-ci. Il s’agit d’un daemon très stable, mais pour des raisons X ou Y (genre redémarrage de la machine), j’oublie de le lancer. Pour palier à cela, j’ai écrit ce petit script qui vérifie que le programme est bien démarré, sinon il va tenter de le faire. Si tel est le cas, un email est envoyé pour signaler que rTorrent a été redémarré. Le tout est loggé.

# Fichier de log
LOGPATH="/home/fabien/bin/log/check_rtorrent.log"
# Email
EMAIL="fabien@feub.net"
SUBJECT="[check] rTorrent"
# Si pas de fichier de log, on le crée
if [ ! -f $LOGPATH ]
then
touch $LOGPATH
fi
echo -n $(date) " : Vérification que rTorrent est lancé..." >> $LOGPATH
if /sbin/pidof rtorrent
then
echo "en fonctionnement : OK" >> $LOGPATH
else
echo -n "non démarré..." >> $LOGPATH
echo -n "démarrage..." >> $LOGPATH
/home/fabien/bin/btlaunch.sh
echo "en fonctionnement : OK" >> $LOGPATH
mail -s "$SUBJECT" "$EMAIL" < $LOGPATH
fi

Télécharger check_rtorrent.sh

Pour automatiser cela, je l’ajoute dans mon crontab pour qu’il vérifie toutes les 5 minutes :

$ crontab -e
*/5 * * * * /home/fabien/bin/check_rtorrent.sh

Montages automatiques : version AppleScript

Dans un article précédent, il était question de monter des partages NFS automatiquement à l’aide de l’Utilitaire d’annuaire. Voici une méthode utilisant un script AppleScript qui a le double avantage de monter les volumes sur le bureau (cela peut-être un désavantage suivant l’utilisation) et elle permet de monter d’autres types de partage, Samba par exemple.

Le script

Voici le script que j’utilise. J’ai toujours mes trois montages NFS et un SMB (pour un petit NAS) :

on run
tell application "Finder"
try
mount volume "nfs://edoras/home/fabien"
on error
display dialog "Erreur de montage NFS de /home/fabien" & return & ¬
"Vérifier que le serveur est disponible." buttons  default button 1
end try
try
mount volume "nfs://edoras/data1"
on error
display dialog "Erreur de montage NFS de /data1" & return & ¬
"Vérifier que le serveur est disponible." buttons  default button 1
end try
try
mount volume "nfs://edoras/backup"
on error
display dialog "Erreur de montage NFS de /backup" & return & return & ¬
"Vérifier que le serveur est disponible." buttons  default button 1
end try
try
mount volume "smb://rohan"
on error
display dialog "Erreur de montage SMB de /rohan" & return & return & ¬
"Vérifier que le NAS est disponible." buttons  default button 1
end try
end tell
end run

Lire la suite +

clavicogyre ver 1.5

Je publie le petit script de backup maison que j’utilise depuis plusieurs années. Simple, à base de rsync au travers d’SSH, il propose un petit menu pour ne sauvegarder que certaines partie de votre home (Images, Documents, Musique, etc), et possède l’option –delete de rsync facultative :

#!/bin/bash
 
#======================================================================
# CLAVICOGYRE - Script de backup
#======================================================================
# by fabien a. [fabien@feub.net]
# http://feub.net/
#======================================================================
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, 
#  - write to the Free Software
#		Foundation, Inc.,
#		51 Franklin Street,
#		Fifth Floor,
#		Boston, MA  02110-1301
#		USA.
#		- See http://www.gnu.org/licenses/gpl.html
#======================================================================
 
# Numero de version
VERSION="ver 1.5.02 (01/08/2008)"
 
# Chemin vers le serveur
SSHPATH="utilisateur@serveur:"
 
# Chemins
PHOTOS_SOURCE="$HOME/lightroom/"
PHOTOS_CIBLE="$SSHPATH/home/fabien/Images/Photos"
PICTURES_SOURCE="$HOME/Pictures/"
PICTURES_CIBLE="$SSHPATH/home/fabien/Images"
DOCS_SOURCE="$HOME/Documents/"
DOCS_CIBLE="$SSHPATH/home/fabien/Documents"
MUSIC_SOURCE="$HOME/Music/iTunes/iTunes Music/"
MUSIC_CIBLE="$SSHPATH/backup/Musique"
WWW_SOURCE="$HOME/www/"
WWW_CIBLE="$SSHPATH/home/fabien/www"
DEV_SOURCE="$HOME/Dev/"
DEV_CIBLE="$SSHPATH/home/fabien/Dev"
BIN_SOURCE="$HOME/bin/"
BIN_CIBLE="$SSHPATH/home/fabien/Backup/bin"
RESSOURCES_SOURCE="$HOME/Resources/"
RESSOURCES_CIBLE="$SSHPATH/home/fabien/Resources"
 
# Date d'execution du script
JOUR=$(date+%d) 	## + %d permet d'extraire le jour
MOIS=$(date+%m)	## +%m permet d'extraire le mois
ANNEE=$(date+%Y) 	## +%y permet d'extraire l'annee
HEURE=$(date+%H)	## +%H permet d'extraire l'heure
MINUTES=$(date+%M)	## +%M permet d'extraire les minutes
 
# Envoi du log par email
#MAIL_DEST="adresse@email.net"
#MAIL_SUJET="[Backup] du $ANNEE-$MOIS-$JOUR a $HEUR:$MINUTES"
 
# Rapport
RAPPORT="$HOME/Desktop/$ANNEE$MOIS$JOUR-clavicogyre-backup.log"
 
# Les options sont :
# v : verbose
# r : rursif
# u : update seulement
# p : prerve les permissions
# a : copie en tant qu'archive
# t : prerve la date
# --delete : supprime ce qui a ete supprime (copie stricte)
 
# Fonctions
backup() {
 
	SOURCE="$1"
	CIBLE="$2"
 
	echo "Backup $SOURCE ...."
	echo "" >> $RAPPORT
	echo "----------------------------------" >> $RAPPORT
	echo Backup du dossier ${1} du $JOUR'/'$MOIS \
              a $HEURE'h'$MINUTES >> $RAPPORT
	echo "----------------------------------" >> $RAPPORT
 
	# Si option delete
	if [ "$3" = "DEL" ]
	then
		echo "L'option --delete est activee, etes-vous sur? (O/[n])"
		read ACTDEL
 
		if [ "$ACTDEL" = "O" ]
		then
			OPTDEL="--delete"
			echo "Option --delete ON" >> $RAPPORT
		else
			OPTDEL=""
			echo "Option --delete OFF" >> $RAPPORT
		fi
	else
		OPTDEL=""
		echo "option --delete OFF" >> $RAPPORT
	fi	
 
	# rsync
	rsync -vrupatz --exclude-from=$HOME/bin/rsync_exclude.txt \
               $OPTDEL -e ssh "${SOURCE}" "${CIBLE}" | tee -a $RAPPORT 2>&1
 
	echo "" >> $RAPPORT
 
	echo "Fin du backup."
	echo "Un fichier de log se trouve ici : "
	echo $RAPPORT
	echo "----------------------------------"
}
 
# On efface l'ecran
clear
 
echo "CLAVICOGYRE : SCRIPT DE BACKUP - $VERSION"
 
# Demande du repertoire a sauvegarder
echo "----------------------------------"
echo "Repertoire a sauvegarder : "
echo "=== 1) Photos (Lightroom)"
echo "=== 2) Pictures"
echo "=== 3) Documents"
echo "=== 4) Music"
echo "=== 5) www"
echo "=== 6) Dev"
echo "=== 7) bin"
echo "=== 8) Resources"
echo "----------------------------------------------"
echo -n "L'ajout de 'strict' ajoutera l'option --delete de rsync "
echo -n "et effectuera ainsi une copie conforme."
echo -n "ATTENTION : a utiliser avec parcimonie, les fichiers"
echo "supprimes seront supprimes sur la sauvergarde egalement."
echo "Exemple : 2 strict"
echo "fera une copie stricte du dossier Documents."
echo "----------------------------------"
echo -n "---> choix : "
read REP
tput clear
 
case "$REP" in
"1" )
	backup $PHOTOS_SOURCE $PHOTOS_CIBLE;;
"1 strict" )
	backup $PHOTOS_SOURCE $PHOTOS_CIBLE "DEL";;
"2" )
	backup $PICTURES_SOURCE $PICTURES_CIBLE;;
"2 strict" )
	backup $PICTURES_SOURCE $PICTURES_CIBLE "DEL";;
"3" )
	backup $DOCS_SOURCE $DOCS_CIBLE;;
"3 strict" )
	backup $DOCS_SOURCE $DOCS_CIBLE "DEL";;
"4" )
	backup $MUSIC_SOURCE $MUSIC_CIBLE;;
"4 strict" )
	backup $MUSIC_SOURCE $MUSIC_CIBLE "DEL";;
"5" )
	backup $WWW_SOURCE $WWW_CIBLE;;
"5 strict" )
	backup $WWW_SOURCE $WWW_CIBLE "DEL";;
"6" )
	backup $DEV_SOURCE $DEV_CIBLE;;
"6 strict" )
	backup $DEV_SOURCE $DEV_CIBLE "DEL";;
"7" )
	backup $BIN_SOURCE $BIN_CIBLE;;
"7 strict" )
	backup $BIN_SOURCE $BIN_CIBLE "DEL";;
"8" )
	backup $RESSOURCES_SOURCE $RESSOURCES_CIBLE;;
"8 strict" )
	backup $RESSOURCES_SOURCE $RESSOURCES_CIBLE "DEL";;
* )
	echo "Aucun choix valide. Termine.";;
esac
 
echo "Fin du script."

Télécharger clavicogyre.sh

Note : les anti-slash \ ne sont pas à taper, ils indiquent que j’ai coupé les lignes pour que ça ne dépasse pas du cadre. Il s’agit d’une seule et même ligne.

Note 2 : Oui clavicogyre est une arme de Goldorak ;}

Réveiller son Mac à distance

Mon Mac se met en veille prolongée après un certain temps non utilisé. Pour des raisons diverses, j’aimerais pouvoir le réveiller à distance, par exemple lorsque je suis sur mon lieu de travail ou chez un ami via SSH pour récupérer un fichier, mais celui-ci ne se réveille pas lorsqu’il est endormi profondément le petit chenapan. Problème.

Les plus curieux connaîtront la case à cocher Réactiver lors d’un accès administrateur via le réseau Ethernet dans la partie Economiseur d’énergie des Préférences Systèmes :

energy
Préférences Système

Mais ceci n’est pas suffisant, la carte réseau à beau veiller, il faut lui donner le mot de passe magique pour lui faire réveiller le Mac. Voici comment implémenter cette fonction.
A noter que ceci ne fonctionne pas uniquement sur un Mac, toute machine pouvant interpréter PERL le pourra : Linux, Unix, même Windows en y installant un interpréteur PERL.

wakeonlan par José Pedro Oliveira

La solution nous vient de José Pedro Oliveira qui fournit un script PERL qui permet d’exploiter les fonctions WOL (Wake-on-lan) des interfaces réseaux (note : toutes les cartes ethernet ne sont pas WOL). Ce script, sobrement appelé wakeonlan est disponible en suivant ce lien : http://gsd.di.uminho.pt/jpo/software/wakeonlan/. Le récupérer et le désarchiver.
Il peut être utilisé tel quel à l’endroit où il a été désarchivé, mais pour plus de cohérence, plaçons-le – comme j’ai l’habitude de le faire – sous ~/bin ou pour les puristes sous /usr/local/bin.
Il ne reste plus qu’à utiliser la commande pour réveiller une machine distante, en renseignant son adresse IP et son identifiant MAC, de cette façon :

$  wakeonlan -i 192.168.1.1 xx:xx:xx:xx:xx:xx

La chaine xx:xx:xx:xx:xx:xx représente l’adresse MAC de l’interface distante, elle peut être trouvée avec la commande ifconfig. Cette commande retourne beaucoup d’informations, mais il suffit de chercher cette chaine composée de 6 octets et séparée par deux points (:).

Voici un exemple chez moi avec :

$ wakeonlan -i 192.168.1.3 00:14:ca:b2:33:e2

En image :

wakeonlan
wakeonlan PERL script

Voilà!
A noter que l’option -i 192.168.1.3 n’est pas nécessaire sur un réseau local.