From: Alan J. Pippin <alan@pippins.net>
Date: Mon, 3 Feb 2020 20:32:38 +0000 (-0700)
Subject: Added support to replicate and restore from multiple backup pools
X-Git-Url: http://git.pippins.net/%7Blink_activity%7D?a=commitdiff_plain;h=7efa74b7c3ad633378498822fe408b3d2da2dcca;p=zfs-ubuntu%2F.git

Added support to replicate and restore from multiple backup pools

Change-Id: Ia3d0207cc0b5f551b5a464b73411c310c4fe3e0a
---

diff --git a/.gitignore b/.gitignore
index 60fa576..d4d52a6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
 zfs-scripts.conf
+*.swp
+*~
diff --git a/zfs-replicate b/zfs-replicate
index b3f7cff..9dfd9f8 100755
--- a/zfs-replicate
+++ b/zfs-replicate
@@ -18,6 +18,13 @@ remote=$1
 remote_fs=$2
 remote_pool=${2%%/*}
 
+# get the backup pool from the command line or the config file if not specified
+if [[ -n $3 ]]; then
+    backup_pool=$3
+else
+    backup_pool=${backup_pool%% *} # use the first backup pool if none specified
+fi
+
 # Setup our cleanup and exit trap
 cleanup() {
   if [[ -e "$local_list" ]]; then
diff --git a/zfs-replicate-all b/zfs-replicate-all
index 456e835..66949df 100755
--- a/zfs-replicate-all
+++ b/zfs-replicate-all
@@ -89,6 +89,14 @@ snapshot_age() {
   fi
 }
 
+# Replicate every zfs filesystem specified in the config file
+echo "$date ZFS replicate started" >> $logfile
+echo "$date ZFS replicate started" | tee -a $mylogfile
+
+# Loop over each backup pool
+backup_pools=$backup_pool
+for backup_pool in $backup_pools; do
+
 # Import the local backup pool if needed and the option is given to do so, else error out
 zpool list -H "$backup_pool" >/dev/null 2>&1
 if [ $? != 0 ]; then
@@ -113,15 +121,20 @@ fi
 current_backup_marker=@current-backup-${backup_pool_guid}
 previous_backup_marker=@previous-backup-${backup_pool_guid}
 
-# Auto snapshot every zfs filesystem on the system specified below
-echo "$date ZFS replicate started" >> $logfile
-echo "$date ZFS replicate started" | tee -a $mylogfile
-
 # 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
+  if [[ $filesystem =~ ':' ]]; then
+    dst_pool=${filesystem%%:*}
+    filesystem=${filesystem#*:} # remove src_pool from string
+  else
+    dst_pool=$backup_pool
+  fi
+  # Only backup filesystems that are specified to go this backup_pool
+  if [[ $backup_pool == $dst_pool ]]; then
+    age=`snapshot_age $filesystem`
+    echo $filesystem $age >> $tmpfile
+  fi
 done
 sorted_filesystems=`cat $tmpfile | sort -n -k 2 | awk '{ print $1 }'`
 rm -f $tmpfile
@@ -129,7 +142,7 @@ rm -f $tmpfile
 # Replicate the sorted filesystems
 for filesystem in $sorted_filesystems; do
   echo "-> Replicating $remote:$filesystem to ${backup_pool}/${filesystem}" | tee -a $mylogfile
-  replicate $remote $filesystem
+  replicate $remote $filesystem $backup_pool
 done
 
 # Export the local pool if told to do so
@@ -145,6 +158,8 @@ if [[ $import_export_backup_pool == 1 ]]; then
   fi
 fi
 
+done
+
 # All done
 echo `date` ZFS replicate complete >> $logfile
 echo `date` ZFS replicate complete | tee -a $mylogfile
diff --git a/zfs-restore-all b/zfs-restore-all
index 3931190..dbe09a1 100755
--- a/zfs-restore-all
+++ b/zfs-restore-all
@@ -30,6 +30,12 @@ echo `date` ZFS restore started
 
 # For each filesystem we are supposed to restore, do it
 for filesystem in $filesystems_to_replicate; do
+  if [[ $filesystem =~ ':' ]]; then
+      src_pool=${filesystem%%:*}
+      filesystem=${filesystem#*:} # remove src_pool from string
+  else
+      src_pool=${backup_pool%% *} # use the first backup pool if none specified
+  fi
   dst_pool=${filesystem%%/*}
   dst_fs=${filesystem#*/}
   # Check to make sure the dst filesystem does not exist
@@ -43,7 +49,7 @@ for filesystem in $filesystems_to_replicate; do
     if [ $? == 0 ]; then
       # This filesystem matches our restore pool pattern 
       echo `date` Restoring $filesystem to $remote
-      zfs-restore $backup_pool $filesystem $dst_pool $dst_fs $remote
+      zfs-restore $src_pool $filesystem $dst_pool $dst_fs $remote
     fi
   else
     echo "-I- Filesystem already exists on destination. Skipping: $filesystem"
diff --git a/zfs-scripts.conf.dist b/zfs-scripts.conf.dist
index 019ae87..e213658 100644
--- a/zfs-scripts.conf.dist
+++ b/zfs-scripts.conf.dist
@@ -32,6 +32,7 @@ ssh="ssh"
 remote=
 
 # specify the name of the local pool to store the $remote's snapshots into
+# multiple pools can be specified by separating with a space
 backup_pool=
 
 # import backup pool before replication and export backup pool after replication
@@ -55,7 +56,7 @@ throttle_enable=0
 throttle_opt="-v -M 10"
 
 # Specify the list of filesystems to replicate from the $remote to the $backup_pool (1 per line)
-# The format of each line should be: pool/filesystem
+# The format of each line should be: pool/filesystem OR dst_pool:src_pool/filesystem
 filesystems_to_replicate="
 "
 
diff --git a/zfs-scrub b/zfs-scrub
index fe94f81..50813fc 100755
--- a/zfs-scrub
+++ b/zfs-scrub
@@ -34,7 +34,7 @@ do
   # Import the local pool if needed and option was given to do so, else error out
   zpool list -H "$i" >/dev/null 2>&1
   if [ $? != 0 ]; then
-    if [[ $import_export_backup_pool == 1 ]] && [[ "$i" =~ "$backup_pool" ]]; then
+    if [[ $import_export_backup_pool == 1 ]] && [[ "$backup_pool" =~ "$i" ]]; then
       zpool import $i
       if [ $? != 0 ]; then
         fatal_and_exit "-E- unable to import the pool $i"
@@ -84,7 +84,7 @@ do
   # do this so we can check its status to see if it repaired any errors or not
   zpool list -H "$i" >/dev/null 2>&1
   if [ $? != 0 ]; then
-    if [[ $import_export_backup_pool == 1 ]] && [[ "$i" =~ "$backup_pool" ]]; then
+    if [[ $import_export_backup_pool == 1 ]] && [[ "$backup_pool" =~ "$i" ]]; then
       zpool import $i
       if [ $? != 0 ]; then
         fatal_and_exit "-E- unable to import the pool $i"
@@ -103,7 +103,7 @@ do
   fi 
 
   # Export the local pool if told to do so
-  if [[ $import_export_backup_pool == 1 ]] && [[ "$i" =~ "$backup_pool" ]]; then
+  if [[ $import_export_backup_pool == 1 ]] && [[ "$backup_pool" =~ "$i" ]]; then
     # Don't export the pool if there is a currently running zfs-replicate operation
     ps -ef | grep -q "zfs-replicate" | grep -v grep
     if [ $? != 0 ]; then