X-Git-Url: http://git.pippins.net/embedvideo/.git/static/gitweb.js?a=blobdiff_plain;f=zfs-replicate-wrapper;fp=zfs-replicate-wrapper;h=d699c792e424197ecfb61ab9ac1952282b5915b0;hb=984d48e66a916fd9ba533ae19b43aafd449dad77;hp=0000000000000000000000000000000000000000;hpb=028d60e078bc5fe362314a86c3436255e7020dd4;p=zfs-nexenta%2F.git diff --git a/zfs-replicate-wrapper b/zfs-replicate-wrapper new file mode 100755 index 0000000..d699c79 --- /dev/null +++ b/zfs-replicate-wrapper @@ -0,0 +1,110 @@ +#!/bin/bash + +# Author: Alan J. Pippin +# Description: This script calls zfs-replicate for each filesystem needing +# to be backed up, or replicated, to another ZFS pool. + +# Setup some default values +zfsreplicate="/etc/bin/zfs-replicate" +logfile_parser="/etc/bin/zfs-log-parser" +logfile="/var/log/zfs/zfs-replicate.log" +remote="tank.pippins.net" +local_pool=backups +mailto=root@pippins.net +date=`date` +starttime=`date +%s` +zfs=/usr/sbin/zfs + +# Specify the list of filesystems to replicate +filesystems_to_replicate=' +naspool/www +naspool/git +' + +# Specify the maximum run time in minutes that this script can run +maxruntime=240 + +# This function checks to see if our runtime has exceeded our stoptime +timeexceeded() { + currenttime=`date +%s` + elapsedtime=$(($currenttime - $starttime)) + stoptime=$(($maxruntime*60)) + if [[ $elapsedtime -gt $stoptime ]]; then + #echo "$elapsedtime > $stoptime" + return 1 + fi + #echo "$elapsedtime < $stoptime" + return 0 +} + +# This function cleanup and exit trap +cleanup_and_exit() { + #echo "cleanup and exit" + rm -rf "$lockdir" + exit 0 +} +trap cleanup_and_exit INT + +# This function executes the replicate command and checks the stoptime +replicate() { + $zfsreplicate $* >> $logfile 2>&1 + timeexceeded + if [ $? == 1 ]; then + cleanup_and_exit + fi +} + +# This function obtains the date a given snapshot was created in epoch seconds +snapshot_age() { + snapshot=${local_pool}/${1}${previous_backup_marker} + $zfs list -t snapshot ${snapshot} > /dev/null 2>&1 + if [ $? == 0 ]; then + $zfs get creation ${snapshot} > /dev/null 2>&1 + if [ $? == 0 ]; then + snap_creation=`$zfs get creation ${snapshot} | grep $1 | awk '{ print $3" "$4" "$5" "$6" "$7 }'` + snap_age=`date -d "$snap_creation" +%s` + echo "$snap_age" + else + echo "0" + fi + else + echo "0" + fi +} + +# Obtain the zpool guid for the local pool +local_pool_guid=`zpool get guid $local_pool 2>&1 | grep $local_pool | awk '{ print $3 }'` +zpool get guid $local_pool > /dev/null 2>&1 +if [ $? != 0 ]; then + echo >&2 "-E- Unable to extract the guid for the local pool: $local_pool" + exit 1 +fi + +# Setup our backup marker names +current_backup_marker=@current-backup-${local_pool_guid} +previous_backup_marker=@previous-backup-${local_pool_guid} + +# Auto snapshot every zfs filesystem on the system specified below +echo "$date ZFS replicate started" >> $logfile + +# Sort the filesystems to replicate by the oldest backup first +tmpfile=`tempfile` +for filesystem in $filesystems_to_replicate; do + age=`snapshot_age $filesystem` + echo $filesystem $age >> $tmpfile +done +sorted_filesystems=`cat $tmpfile | sort -n -k 2 | awk '{ print $1 }'` +rm -f $tmpfile + +# Replicate the sorted filesystems +for filesystem in $sorted_filesystems; do + echo "-> Replicating $remote:$filesystem to ${local_pool}/${filesystem}" + replicate $remote $filesystem +done + +# All done +echo `date` ZFS replicate complete >> $logfile + +# Parse the log file and extract our backup stats +$logfile_parser "$logfile" "$date" >> $logfile +