SHARE
TWEET

Untitled

a guest Jan 27th, 2013 67 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2. #
  3. # Author: Ryan Kernan
  4. # Date: September 23, 2011
  5. # Version: 1.1
  6. # Credits: Mike La Spina for the original concept and script http://blog.laspina.ca/
  7. #  
  8. # Mike La Spina - 1.1 added vars to support full paths on remote ssh executions
  9. # Mike La Spina - 1.2 added var symbol to last_snap_shost input parse.
  10. #
  11. # Function: Provides snapshot and send process which replicates ZFS file systems from a source to target server.
  12. # Maintains a runing snapshot archive for X days (X being the value of keep_snaps).
  13. #
  14. # The input format should conform to the following:
  15. # source zfspath, source host, dest host
  16. #
  17. # eg.
  18. #
  19. # pool/zfsstore,host1,host2
  20. #
  21. # Input parms:1
  22. # rep_list - a file name var of which the file contains a list of comma delimed zfs paths, source and target host names.
  23. # keep_snaps - Number of days to keep snaps for.
  24. # snap_list - temp file to list current snapshots.
  25. #
  26. #
  27. #
  28.  
  29. ZFS=/sbin/zfs
  30. DATE=/bin/date
  31. SSH=/usr/bin/ssh
  32.  
  33. PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin
  34.  
  35. rep_list=$1
  36. keep_snaps=7
  37. snap_list=snaplist.lst
  38.  
  39. if [ -e /tmp/zfs-rep.lock ];
  40. then
  41.         exit
  42. else
  43.         touch /tmp/zfs-rep.lock
  44. fi
  45.  
  46. #######################################################################################
  47. ####################################Function###########################################
  48. #######################################################################################
  49. #
  50. # Function parse the comma delimited input file and assign the field to the respective
  51. # variables for file system, pool and host names.
  52. #
  53. # Global output parms
  54. # zfspool
  55. # zfspath
  56. # shost
  57. # dhost
  58.  
  59. parse_rep_list() {
  60.  
  61.         rep_list_line=$1
  62.                 zfspool="$(echo $rep_list_line | cut -d/ -f1)"
  63.                 zfspath="$(echo $rep_list_line | cut -d, -f1)"
  64.                 shost="$(echo $rep_list_line | cut -d, -f2)"
  65.                 dhost="$(echo $rep_list_line | cut -d, -f3)"
  66.  
  67. }
  68.  
  69. #######################################################################################
  70. ####################################Function###########################################
  71. #######################################################################################
  72. #
  73. # Function issue zfs list commands and assign the variables the last snapshot names for
  74. # both the source and destination hosts.
  75. #
  76. # Global input parms
  77. # zfspath
  78. # shost
  79. # dhost
  80.  
  81. check_last_snap() {
  82.  
  83.         last_snap_dhost=""
  84.         last_snap_shost=""
  85.         last_snap_shost=$( $ZFS list -o name -t snapshot | grep $zfspath | tail -1 )
  86.         last_snap_dhost=$( $SSH -n $dhost $ZFS list -H -o name -r -t snapshot | grep $zfspath | tail -1 )
  87.         true
  88. }
  89.  
  90.  
  91. #######################################################################################
  92. ####################################Function###########################################
  93. #######################################################################################
  94. #
  95. # Function check if the destination $ZFS path exists and assign the result to the
  96. # variable dhost_fs_name.
  97. #
  98. # Global input parms
  99. # $zfspath
  100. # dhost
  101.  
  102. dhost_fs_exists() {
  103.  
  104.         dhost_fs_name=""
  105.         dhost_fs_name=$($SSH -n $dhost $ZFS list -o name -H $zfspath | tail -1)
  106.  
  107.         if [ "$dhost_fs_name" = "" ]
  108.         then
  109.                 echo $($DATE) "->" $zfspath file system does not exist on target host $dhost. >> replicate.log
  110.         fi
  111.  
  112. }
  113.  
  114. #######################################################################################
  115. ####################################Function###########################################
  116. #######################################################################################
  117. #
  118. # Function create a zfs path on the destination to allow the receive command
  119. # funtionallity then issue zfs snap and send to transfer the zfs object to the
  120. # destination host
  121. #
  122. # Global input parms
  123. # zfspath
  124. # dhost
  125.  
  126. dhost_create_fs() {
  127.  
  128.         $SSH -n $dhost $ZFS create -p $zfspath
  129.         $SSH -n $dhost $ZFS set mountpoint=none $zfspath
  130.         last_snap_shost=$( $ZFS list -o name -t snapshot -H | grep "$zfspath\@" | tail -1 )
  131.         echo $($DATE) "->" $last_snap_shost Initial replication start. >> replicate.log
  132.         $ZFS send -v -R $last_snap_shost | $SSH $dhost $ZFS recv -v -F -d $zfspool
  133.         echo $($DATE) "->" $last_snap_shost Initial replication end. >> replicate.log
  134.  
  135. }
  136.  
  137. #######################################################################################
  138. ####################################Function###########################################
  139. #######################################################################################
  140. #
  141. # Function Issue a snapshot for the source zfs path
  142. #
  143. # Global input parms
  144. # zfspath
  145.  
  146. create_fs_snap() {
  147.  
  148.         snap_date="$($DATE +%m-%d-%y-%H:%M)"
  149.         echo $($DATE) "->" $zfspath@$snap_date Snapshot creation start. >> replicate.log
  150.         $ZFS snapshot $zfspath@$snap_date
  151.         echo $($DATE) "->" $zfspath@$snap_date Snapshot creation end. >> replicate.log
  152.  
  153. }
  154.  
  155. #######################################################################################
  156. ####################################Function###########################################
  157. #######################################################################################
  158. #
  159. # Function create a zfs send/recv command set based on a the zfs path source
  160. # and target hosts for an established replication state. (aka incremental replication)
  161. #
  162. # Global input parms
  163. # zfspath
  164. # dhost
  165.  
  166. incr_repl_fs() {
  167.  
  168.         echo $($DATE) "->" $last_snap_dhost $last_snap_shost Incremental send start. >> replicate.log
  169.         $ZFS send -I $last_snap_dhost $last_snap_shost | $SSH $dhost $ZFS recv -d -F $zfspool >> replicate.log
  170.         echo $($DATE) "->" $last_snap_dhost $last_snap_shost Incremental send end. >> replicate.log
  171.  
  172. }
  173.  
  174. #######################################################################################
  175. ####################################Function###########################################
  176. #######################################################################################
  177. #
  178. # Function to clean up snapshots that are older than X days old X being the
  179. # value set by "keep_snaps" on both the source and destination hosts.
  180.  
  181. clean_snaps() {
  182.  
  183.         PreviousSnapDate=""
  184.         PreviousSnap=""
  185.         CurrentYear="$( $DATE +%y )"
  186.         CurrentMonth="$( $DATE +%m )"
  187.         CurrentDay="$( $DATE +%d )"
  188.  
  189.         if [ "$zfspath" != "" ]
  190.         then
  191.                 $ZFS list -o name -t snapshot | grep $zfspath\@ > $snap_list
  192.  
  193.                 while read snaps
  194.                 do
  195.  
  196.                 SnapDate=`echo $snaps | cut -d @ -f 2`
  197.                 SnapDay="$(echo $SnapDate | cut -d- -f2)"
  198.                 SnapMonth="$(echo $SnapDate | cut -d- -f1)"      
  199.                 SnapYear="$(echo $SnapDate | cut -d- -f3)"
  200.  
  201.                 SnapDate="$SnapMonth-$SnapDay-$SnapYear"
  202.                                
  203.                 if [ "$($DATE -v-${keep_snaps}d +%m-%d-%y)" = "$SnapDate" ]
  204.                 then
  205.                         echo "Destroying $SnapDate snapshot $snaps on $shost" >> replicate.log
  206.                         $ZFS destroy $snaps
  207.                         echo "Destroying $SnapDate snapshot $snaps on $dhost" >> replicate.log
  208.                         $SSH -n $dhost $ZFS destroy $snaps
  209.                 fi
  210.  
  211.                 done < $snap_list
  212.                 rm $snap_list
  213.         fi
  214. }
  215.  
  216. #######################################################################################
  217. #####################################Main Entery#######################################
  218. #######################################################################################
  219. #
  220. #
  221. # Init Global Parms
  222.  
  223. zfspath=""
  224. shost=""
  225. dhost=""
  226.  
  227. # Create the snapshots all at the same time
  228.  
  229. while read line
  230. do
  231.         parse_rep_list $line
  232.  
  233.         if [ "$zfspath" != "" ]
  234.         then
  235.                 create_fs_snap >> replicate.log         # Create a new snapshot of the path spec.
  236.         fi
  237.  
  238. done < $rep_list
  239.  
  240. # Send the snapshots to the remote and create the fs if required
  241.  
  242. while read line
  243. do
  244.  
  245.         parse_rep_list $line
  246.  
  247.         if [ "$zfspath" != "" ]
  248.         then
  249.                 dhost_fs_exists                                          # Test for the existence of our listed
  250.                                                                         # zfs file system path on the target host.
  251.  
  252.                 if [ "$dhost_fs_name" ]
  253.                 then
  254.                         check_last_snap >> replicate.log               # Get the start and stop snaps.
  255.                         incr_repl_fs >> replicate.log                  # Initiate a dif replication.
  256.                         clean_snaps                                    # Clean up any snapshots that are X days old.
  257.                 else
  258.                         dhost_create_fs >> replicate.log                        # Create a first time replication.
  259.                 fi
  260.           fi
  261.  
  262. done < $rep_list
  263.  
  264. rm /tmp/zfs-rep.lock
  265.  
  266. exit 0
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top