Bonjour à tous !

J'utilise depuis quelques temps un script pour faire des snapshots ZFS automatiquement. C'est cool, ca marche bien, mais comme les améliorations sont toujours possible, je me suis dit que partager ce truc ici pouvait être productif (et peut-être même servir à certains).

Donc voilà, vos commentaires, suggestions et patches sont les bienvenus :)

(Et oui, je sais, c'est pas très bien codé :p)
# ZFS automatic snapshots
## Backups
@hourly /root/tools/bin/zfs_autosnapshot backup hourly
@daily /root/tools/bin/zfs_autosnapshot backup daily
@weekly /root/tools/bin/zfs_autosnapshot backup weekly
@monthly /root/tools/bin/zfs_autosnapshot backup monthly
## Cleaning
@hourly /root/tools/bin/zfs_autosnapshot clean

#!/bin/sh

################################################################################
# Variables
################################################################################

# Configuration
#
# KEEP_DAYS : number of hourly snapshots to keep
# KEEP_DAYS : number of daily snapshots to keep
# KEEP_DAYS : number of weekly snapshots to keep
KEEP_HOURS=25
KEEP_DAYS=8
KEEP_WEEKS=5
KEEP_MONTHS=13

# Datasets to backup (recursively)
DATASETS="
tank/home/users
tank/jails
tank/local
tank/log
tank/logs
tank/mails
tank/obj
"

# Common vars
SCRIPTNAME=$0

################################################################################
# Functions
################################################################################

# usage functions
usage() {
cat << EOF
usage: $SCRIPTNAME command [options]
 command could be one of : backup clean help
EOF
exit 1
}

usage_backup() {
cat << EOF
usage: $SCRIPTNAME backup basis
 basis could be one of : hourly daily weekly monthly
EOF
exit 1
}

# backup function
backup() {
case $BASIS in
        hourly)
                for DATASET in $DATASETS
                do
                        /sbin/zfs snapshot -r $data...@autoh`date '+%Y%m%d_%H:%M'`
                done
        ;;
        daily)
                for DATASET in $DATASETS
                do
                        /sbin/zfs snapshot -r $data...@autod`date '+%Y%m%d'`
                done
        ;;
        weekly)
                for DATASET in $DATASETS
                do
                        /sbin/zfs snapshot -r $data...@autow`date '+%Y%m%d'`
                done
        ;;
        monthly)
                for DATASET in $DATASETS
                do
                        /sbin/zfs snapshot -r $data...@autom`date '+%Y%m'`
                done
        ;;
        *)
                echo "$BASIS : Not supported" && usage_backup
        ;;
esac
}

# cleaning function
# removes all expired snapshots according to KEEP_* variables
clean() {
for BASIS in HOURLY DAILY WEEKLY MONTHLY
do
case $BASIS in
        HOURLY)
                /sbin/zfs list -t snapshot\
                | grep AutoH\
                | grep `date -v-${KEEP_HOURS}H '+%Y%m%d_%H:%M'`\
                | awk '{print $1}'\
                | while read OLDFS; do /sbin/zfs destroy $OLDFS ;done
        ;;
        DAILY)
                /sbin/zfs list -t snapshot\
                | grep AutoD\
                | grep `date -v-${KEEP_DAYS}d '+%Y%m%d'`\
                | awk '{print $1}'\
                | while read OLDFS; do /sbin/zfs destroy $OLDFS ;done
        ;;
        WEEKLY)
                /sbin/zfs list -t snapshot\
                | grep AutoW\
                | grep `date -v-${KEEP_WEEKS}w '+%Y%m%d'`\
                | awk '{print $1}'\
                | while read OLDFS; do /sbin/zfs destroy $OLDFS ;done
        ;;
        MONTHLY)
                /sbin/zfs list -t snapshot\
                | grep AutoM\
                | grep `date -v-${KEEP_MONTHS}m '+%Y%m'`\
                | awk '{print $1}'\
                | while read OLDFS; do /sbin/zfs destroy $OLDFS ;done
        ;;
esac
done
}

case $1 in
        backup)
                BASIS=$2
                [ -z "$BASIS" ] && usage_backup
                backup
        ;;
        clean)  clean;;
        *)
                usage
        ;;
esac

_______________________________________________
Liste de diffusion du FRsAG
http://www.frsag.org/

Répondre à