192 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| source "$(dirname "$0")/lib/ulib/ulib" || exit 1
 | |
| urequire DEFAULTS
 | |
| 
 | |
| function display_help() {
 | |
|     uecho "$scriptname: faire une sauvegarde des fichiers
 | |
| 
 | |
| USAGE
 | |
|     $scriptname [options]
 | |
| 
 | |
| OPTIONS
 | |
|     -l  Lister les profils de sauvegarde disponibles.
 | |
|     -p  Spécifier le profil de sauvegarde à effectuer. Par défaut, toutes les
 | |
|         sauvegardes sont effectuées.
 | |
|     -u USER
 | |
|         Faire le sauvegarde pour l'utilisateur \$USER. Cette option n'est valide
 | |
|         que pour l'utilisateur root.
 | |
|     -n  Afficher ce qui doit être fait plutôt que de le faire
 | |
|     -H  Arrêter la machine après une sauvegarde REUSSIE."
 | |
| }
 | |
| 
 | |
| action=getargs
 | |
| profile=
 | |
| HOMEDIR="$HOME"
 | |
| fake_maybe=
 | |
| halt=
 | |
| lockfile="$TMPDIR/ubackup.lock"
 | |
| parse_opts "${PRETTYOPTS[@]}" \
 | |
|     --help '$exit_with display_help' \
 | |
|     -l,--list action=list \
 | |
|     -p:,--profile: profile= \
 | |
|     -u:,--user: user= \
 | |
|     -n,--fake fake_maybe=echo \
 | |
|     -H,--halt halt=1 \
 | |
|     --backup action=backup \
 | |
|     --lockfile: lockfile= \
 | |
|     @ args -- "$@" && set -- "${args[@]}" || die "$args"
 | |
| 
 | |
| if [ -n "$user" ]; then
 | |
|     if is_root; then
 | |
|         eval "HOMEDIR=~$user"
 | |
|     else
 | |
|         die "L'option -u n'est supportée que pour l'utilisateur root"
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| function __set_defaults() {
 | |
|     local HOME="$HOMEDIR"
 | |
|     set_defaults ubackup
 | |
| }
 | |
| __set_defaults
 | |
| 
 | |
| if [ "$action" == "list" ]; then
 | |
|     echo "${BACKUPS[*]}"
 | |
|     exit 0
 | |
| elif [ "$action" == "getargs" ]; then
 | |
|     # mettre un verrou pour empêcher les opérations de sauvegarde simultanées
 | |
|     if [ -f "$lockfile" ]; then
 | |
|         if [ "$(<"$lockfile")" != "$$" ]; then
 | |
|             die "Une sauvegarde est en cours. Impossible de continuer.
 | |
| Si ce message est erroné, supprimez manuellement $lockfile"
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     # n'installer le trap de cleanup qu'après avoir testé qu'une sauvegarde n'était pas en cours.
 | |
|     autoclean "$lockfile"
 | |
|     echo "$$" >"$lockfile"
 | |
| 
 | |
|     # arguments pour la sauvegarde
 | |
|     args=()
 | |
|     if [ -n "$profile" ]; then
 | |
|         backups=("$profile")
 | |
|     else
 | |
|         backups=("${BACKUPS[@]}")
 | |
|     fi
 | |
|     for backup in "${backups[@]}"; do
 | |
|         if [ "$backup" == "DEFAULT" ]; then
 | |
|             backup=
 | |
|         fi
 | |
|         destdir="${backup:+${backup}_}DESTDIR"; destdir="${!destdir}"
 | |
|         vgname="${backup:+${backup}_}VGNAME"; vgname="${!vgname}"
 | |
|         lvname="${backup:+${backup}_}LVNAME"; lvname="${!lvname}"
 | |
|         configdir="${backup:+${backup}_}CONFIGDIR"; configdir="${!configdir:-$HOMEDIR/etc}"
 | |
|         includes="${backup:+${backup}_}INCLUDES"; includes="${!includes}"
 | |
|         excludes="${backup:+${backup}_}EXCLUDES"; excludes="${!excludes}"
 | |
|         script="${backup:+${backup}_}SCRIPT"; script="${!script}"
 | |
|         mount="${backup:+${backup}_}MOUNT"; mount="${!mount:-$scriptdir/lib/backup.mount}"
 | |
|         umount="${backup:+${backup}_}UMOUNT"; umount="${!umount:-$scriptdir/lib/backup.umount}"
 | |
| 
 | |
|         destdir="$(abspath "$destdir" "$configdir")"
 | |
|         [ -d "$destdir" ] || die "$destdir: répertoire de sauvegarde inexistant"
 | |
|         configdir="$(abspath "$configdir")"
 | |
|         [ -n "$includes" ] && includes="$(abspath "$includes" "$configdir")"
 | |
|         [ -f "$includes" ] || die "$(ppath "$includes"): liste des fichiers à inclure inexistante"
 | |
|         [ -n "$excludes" ] && excludes="$(abspath "$excludes" "$configdir")"
 | |
|         [ -n "$script" ] && script="$(abspath "$script" "$configdir")"
 | |
|         [ -n "$mount" ] && mount="$(abspath "$mount" "$configdir")"
 | |
|         [ -n "$umount" ] && umount="$(abspath "$umount" "$configdir")"
 | |
| 
 | |
|         args=("${args[@]}" "$backup" "$destdir" "$vgname" "$lvname" "$includes" "$excludes" "$script" "$mount" "$umount")
 | |
|     done
 | |
| 
 | |
|     # ce script doit tourner en root
 | |
|     if is_root; then
 | |
|         action=backup
 | |
|         set -- "${args[@]}"
 | |
|     else
 | |
|         run_as_root --backup --lockfile "$lockfile" ${halt:+-H }${fake_maybe:+-n }"${args[@]}"
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| if [ "$action" == "backup" ]; then
 | |
|     no_error=1
 | |
|     function err_result() {
 | |
|         shift # STATUS
 | |
|         eerror "$*"
 | |
|         no_error=
 | |
|     }
 | |
| 
 | |
|     while [ -n "$*" ]; do
 | |
|         backup_name="$1"; shift
 | |
|         backup_destdir="$1"; shift
 | |
|         backup_vgname="$1"; shift
 | |
|         backup_lvname="$1"; shift
 | |
|         backup_includes="$1"; shift
 | |
|         backup_excludes="$1"; shift
 | |
|         backup_script="$1"; shift
 | |
|         backup_mount="$1"; shift
 | |
|         backup_umount="$1"; shift
 | |
| 
 | |
|         etitle "${backup_name:-DEFAULT}"
 | |
|         result="$("$backup_mount" "$backup_destdir" "$backup_vgname" "$backup_lvname")"
 | |
|         if [ $? -ne 0 ]; then
 | |
|             err_result $result
 | |
|         else
 | |
|             suffix="${backup_name:+-$backup_name}"
 | |
|             last="last$suffix"
 | |
| 
 | |
|             destdir="$backup_destdir"
 | |
|             mkdir -p "$destdir"
 | |
| 
 | |
|             # calculer les répertoires de destination et ceux à supprimer
 | |
|             eval "$("$scriptdir/plbck" -S "$suffix" -e "$destdir")"
 | |
| 
 | |
|             # sauvegarder
 | |
|             etitle -s "Sauvegarde dans $CURRENT${PREVIOUS:+ depuis $PREVIOUS}"
 | |
|             error=
 | |
|             if $fake_maybe rsync -aHAX --delete ${PREVIOUS:+--link-dest="$PREVIOUS"} \
 | |
|                 ${backup_excludes:+--delete-excluded --exclude-from="$backup_excludes"} \
 | |
|                 --include-from="$backup_includes" \
 | |
|                 / "$CURRENT"; then
 | |
|                 cwd="$(pwd)"
 | |
|                 cd "$destdir"
 | |
|                 [ -L "$last" ] && $fake_maybe /bin/rm -f "$last"
 | |
|                 $fake_maybe ln -s "$(basename "$CURRENT")" "$last"
 | |
|                 cd "$cwd"
 | |
| 
 | |
|                 [ -n "$backup_commands" ] && $fake_maybe source "$backup_commands"
 | |
|             else
 | |
|                 err_result 1 "Une erreur s'est produite pendant la sauvegarde. Arrêt des opération pour $backup_name"
 | |
|                 error=1
 | |
|             fi
 | |
|             eend
 | |
| 
 | |
|             # supprimer
 | |
|             if [ -z "$error" -a -n "${DELETES[*]}" ]; then
 | |
|                 etitle -s "Suppression des anciennes versions"
 | |
|                 for delete in "${DELETES[@]}"; do
 | |
|                     estep "$delete"
 | |
|                     $fake_maybe rm_maybe -rf "$delete"
 | |
|                 done
 | |
|                 eend
 | |
|             fi
 | |
| 
 | |
|             # démonter le répertoire
 | |
|             result="$("$backup_umount" $result)"
 | |
|             if [ $? -ne 0 ]; then
 | |
|                 err_result $result
 | |
|             fi
 | |
|         fi
 | |
|     done
 | |
| 
 | |
|     rm "$lockfile"
 | |
|     if [ -n "$no_error" -a -n "$halt" ]; then
 | |
|         $fake_maybe /sbin/shutdown -h now
 | |
|     fi
 | |
| 
 | |
| else
 | |
|     die "Action inconnue: $action"
 | |
| fi
 |