Fixed bug in running throttle command on remote machine instead of local
[zfs-ubuntu/.git] / zfs-replicate-all
index 8dc4a05baa8f2402419a0f876c21b0004e2fb136..62a0ce4d10f60a78cde674427c974341596c413a 100755 (executable)
@@ -15,6 +15,17 @@ mylogfile="$logdir/zfs-replicate-all.log"
 date=`date`
 starttime=`date +%s`
 
+# Make sure we aren't already running
+SCRIPT_NAME=${0##*/}
+PROCESS_LIST=`tempfile`
+ps -ef | grep -e "$SCRIPT_NAME" | grep -v grep | grep -v $$ | grep -v $PPID >> $PROCESS_LIST
+if [[ $? == 0 ]]; then
+   echo "$date Another $SCRIPT_NAME process is already running" >> $mylogfile
+   cat $PROCESS_LIST >> $mylogfile
+   exit 1
+fi
+[[ -e "$PROCESS_LIST" ]] && rm -f $PROCESS_LIST
+
 # This function checks to see if our runtime has exceeded our stoptime
 timeexceeded() { 
   if [[ $maxruntime == 0 ]]; then
@@ -39,6 +50,14 @@ cleanup_and_exit() {
 }
 trap cleanup_and_exit INT
 
+fatal_and_exit() {
+  # echo message to terminal
+  echo -e 2>&1 "$1"
+  # send email notification
+  echo -e "$1" | $mailx -s "zfs-replicate-all on $hostname failed" "$mailto"
+  exit 1
+}
+
 # This function executes the replicate command and checks the stoptime
 replicate() { 
   zfs-replicate $*  >> $logfile 2>&1
@@ -50,7 +69,7 @@ replicate() {
 
 # This function obtains the date a given snapshot was created in epoch seconds
 snapshot_age() {
-  snapshot=${local_pool}/${1}${previous_backup_marker}
+  snapshot=${backup_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
@@ -66,17 +85,29 @@ snapshot_age() {
   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
+# 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
-  echo >&2 "-E- Unable to extract the guid for the local pool: $local_pool"
-  exit 1
+  if [[ $import_export_backup_pool == 1 ]]; then
+    zpool import $backup_pool
+    if [ $? != 0 ]; then
+      fatal_and_exit "-E- unable to import the backup pool $backup_pool on $hostname" "$mailto"
+    fi
+  else 
+    fatal_and_exit "-E- The local backup pool on $hostname, '$backup_pool' doesn't seem to exist." "$mailto"
+  fi
+fi
+
+# Obtain the zpool guid for the local backup pool
+backup_pool_guid=`zpool get guid $backup_pool 2>&1 | grep $backup_pool | awk '{ print $3 }'`
+zpool get guid $backup_pool > /dev/null 2>&1
+if [ $? != 0 ]; then
+  fatal_and_exit "-E- Unable to extract the guid for the local backup pool on $hostname: $backup_pool" "$mailto"
 fi
 
 # Setup our backup marker names
-current_backup_marker=@current-backup-${local_pool_guid}
-previous_backup_marker=@previous-backup-${local_pool_guid}
+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
@@ -93,10 +124,22 @@ rm -f $tmpfile
 
 # Replicate the sorted filesystems
 for filesystem in $sorted_filesystems; do
-  echo "-> Replicating $remote:$filesystem to ${local_pool}/${filesystem}" | tee -a $mylogfile
+  echo "-> Replicating $remote:$filesystem to ${backup_pool}/${filesystem}" | tee -a $mylogfile
   replicate $remote $filesystem
 done
 
+# Export the local pool if told to do so
+if [[ $import_export_backup_pool == 1 ]]; then
+  # Don't export the pool if there is a currently running zfs-scrub operation
+  ps -ef | grep -q "zfs-scrub ${backup_pool}" | grep -v grep
+  if [ $? != 0 ]; then
+    zpool export $backup_pool
+    if [ $? != 0 ]; then
+      fatal_and_exit "-E- unable to export the local backup pool $backup_pool on $hostname" "$mailto"
+    fi
+  fi
+fi
+
 # All done
 echo `date` ZFS replicate complete >> $logfile
 echo `date` ZFS replicate complete | tee -a $mylogfile