Added support to replicate and restore from multiple backup pools
authorAlan J. Pippin <alan@pippins.net>
Mon, 3 Feb 2020 20:32:38 +0000 (13:32 -0700)
committerAlan J. Pippin <ajp@pippins.net>
Mon, 3 Feb 2020 20:52:44 +0000 (13:52 -0700)
Change-Id: Ia3d0207cc0b5f551b5a464b73411c310c4fe3e0a

.gitignore
zfs-replicate
zfs-replicate-all
zfs-restore-all
zfs-scripts.conf.dist
zfs-scrub

index 60fa5760b64ddd3643ff092b57e98f25d58900ba..d4d52a63fecf50f7d516e762aa70b91fe9aad401 100644 (file)
@@ -1 +1,3 @@
 zfs-scripts.conf
+*.swp
+*~
index b3f7cffd16d31dc3bbfa44df3ce5b7cdd2840b5f..9dfd9f8cbef7997e28bb6bd9ce72d164ce812250 100755 (executable)
@@ -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
index 456e835ebe4072f44c1df740523bc8165cee1a1f..66949dfaa0c3a4b299dc79c0d4c14f3fa123c688 100755 (executable)
@@ -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
index 3931190f753d21b821ceb92975187d1a3856d858..dbe09a1d57c9a761afb166d6659ec901ac90cb68 100755 (executable)
@@ -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"
index 019ae870353bcf9fbc442d316ce974e2df75c28f..e2136582acac52a56632420a36d0188fe0ae1e6c 100644 (file)
@@ -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="
 "
 
index fe94f81de80c4233556e25ab770a07264ad5dc47..50813fce69192f9dbbed769914f574c098bdba20 100755 (executable)
--- 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