3 # Author: Alan J. Pippin
4 # Description: This script calls zfs-replicate for each filesystem needing
5 # to be backed up, or replicated, to another ZFS pool.
7 # source our configuration
8 config="${0%/*}/zfs-scripts.conf"
9 [ -e "${config}.dist" ] && . ${config}.dist
10 [ -e "${config}" ] && . ${config}
12 # Setup some default values
13 logfile="$logdir/zfs-replicate.log"
14 mylogfile="$logdir/zfs-replicate-all.log"
18 # This function checks to see if our runtime has exceeded our stoptime
20 if [[ $maxruntime == 0 ]]; then
23 currenttime=`date +%s`
24 elapsedtime=$(($currenttime - $starttime))
25 stoptime=$(($maxruntime*60))
26 if [[ $elapsedtime -gt $stoptime ]]; then
27 #echo "$elapsedtime > $stoptime"
30 #echo "$elapsedtime < $stoptime"
34 # This function cleanup and exit trap
36 #echo "cleanup and exit"
40 trap cleanup_and_exit INT
42 # This function executes the replicate command and checks the stoptime
44 zfs-replicate $* >> $logfile 2>&1
51 # This function obtains the date a given snapshot was created in epoch seconds
53 snapshot=${local_pool}/${1}${previous_backup_marker}
54 $zfs list -t snapshot ${snapshot} > /dev/null 2>&1
56 $zfs get creation ${snapshot} > /dev/null 2>&1
58 snap_creation=`$zfs get creation ${snapshot} | grep $1 | awk '{ print $3" "$4" "$5" "$6" "$7 }'`
59 snap_age=`date -d "$snap_creation" +%s`
69 # Obtain the zpool guid for the local pool
70 local_pool_guid=`zpool get guid $local_pool 2>&1 | grep $local_pool | awk '{ print $3 }'`
71 zpool get guid $local_pool > /dev/null 2>&1
73 echo >&2 "-E- Unable to extract the guid for the local pool: $local_pool"
77 # Setup our backup marker names
78 current_backup_marker=@current-backup-${local_pool_guid}
79 previous_backup_marker=@previous-backup-${local_pool_guid}
81 # Auto snapshot every zfs filesystem on the system specified below
82 echo "$date ZFS replicate started" >> $logfile
83 echo "$date ZFS replicate started" | tee -a $mylogfile
85 # Sort the filesystems to replicate by the oldest backup first
87 for filesystem in $filesystems_to_replicate; do
88 age=`snapshot_age $filesystem`
89 echo $filesystem $age >> $tmpfile
91 sorted_filesystems=`cat $tmpfile | sort -n -k 2 | awk '{ print $1 }'`
94 # Replicate the sorted filesystems
95 for filesystem in $sorted_filesystems; do
96 echo "-> Replicating $remote:$filesystem to ${local_pool}/${filesystem}" | tee -a $mylogfile
97 replicate $remote $filesystem
101 echo `date` ZFS replicate complete >> $logfile
102 echo `data` ZFS replicate complete | tee -a $mylogfile
104 # Parse the log file and extract our backup stats
105 zfs-log-parser "$logfile" "$date" >> $logfile
106 zfs-log-parser "$logfile" "$date" | tee -a $mylogfile