Scripts to automating daily tasks http://gitea.open6hosting.com/Open6Hosting/smartos-bin
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

194 líneas
4.0 KiB

  1. #!/usr/bin/bash
  2. DATE=`date +%Y%m%d`
  3. usage()
  4. {
  5. echo "Usage: $0 [ -s hostname ] [ -z UUID ] [ -b backupzone ] [ -i idbackupzone ]" >&2
  6. exit 1
  7. }
  8. while getopts ":s:z:b:i:" opt;
  9. do
  10. case "$opt" in
  11. s)
  12. SOURCEGZ=$OPTARG
  13. ;;
  14. z)
  15. UUID=$OPTARG
  16. ;;
  17. b)
  18. BACKUPZ=$OPTARG
  19. ;;
  20. i)
  21. IDBACKUPZ=$OPTARG
  22. ;;
  23. \?)
  24. echo "Error: Invalid Option: -${OPTARG}" >&2
  25. usage
  26. ;;
  27. :)
  28. echo "Error: -${OPTARG} requires an argument."
  29. usage
  30. ;;
  31. *)
  32. usage
  33. ;;
  34. esac
  35. done
  36. shift $((OPTIND -1 ))
  37. if [ -z ${SOURCEGZ} ] || [ -z "${UUID}" ] || [ -z ${BACKUPZ} ] || [ -z ${IDBACKUPZ} ]; then
  38. usage
  39. fi
  40. # functions
  41. check_err()
  42. {
  43. STATUS=$?
  44. if [ ${STATUS} -ne 0 ]; then
  45. echo "Unexpected error: ${STATUS}"
  46. exit ${STATUS}
  47. fi
  48. }
  49. check_snap()
  50. {
  51. ZONE=$1
  52. echo "Checking for local snapshot of ${ZONE}..."
  53. zfs list -t snapshot zones/${ZONE}@${DATE} 2>/dev/null 1>&2
  54. }
  55. check_remote_snap()
  56. {
  57. DATASET=$1
  58. echo "Checking for an existing remote snapshot of ${DATASET}..."
  59. ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs list zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET}@${DATE} 2>/dev/null 1>&2
  60. }
  61. check_remote_dataset()
  62. {
  63. DATASET=$1
  64. echo "Checking for an existing remote dataset of ${DATASET}..."
  65. ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs list zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET} 2>/dev/null 1>&2
  66. }
  67. create_snap()
  68. {
  69. DS=$1
  70. echo "Creating snapshot of ${DS}..."
  71. zfs snapshot zones/${DS}@${DATE}
  72. check_err
  73. echo "done."
  74. }
  75. delete_local_snap()
  76. {
  77. DATASET=$1
  78. echo "Deleting local snapshot zones/${DATASET}@${DATE}..."
  79. zfs destroy zones/${DATASET}@${DATE}
  80. check_err
  81. echo "done."
  82. }
  83. delete_remote_dataset()
  84. {
  85. DATASET=$1
  86. echo "Deleting remote dataset ${DATASET} on ${BACKUPZ}..."
  87. ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs destroy -r zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET} 2>/dev/null 1>&2
  88. check_err
  89. echo "done."
  90. }
  91. delete_remote_snap()
  92. {
  93. DATASET=$1
  94. echo "Deleting remote snapshot zones/${DATASET}@${DATE} on ${BACKUPZ}..."
  95. ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs destroy -r zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET}@${DATE} 2>/dev/null 1>&2
  96. check_err
  97. echo "done."
  98. }
  99. send_snap ()
  100. {
  101. DATASET=$1
  102. echo "Sending snapshot to ${BACKUPZ}..."
  103. zfs send zones/${DATASET}@${DATE} | ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs receive -F zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET}
  104. check_err
  105. echo "done."
  106. }
  107. # main
  108. echo "---
  109. BACKUP_ZONE: ${IDBACKUPZ}
  110. BACKUP_ZONE_IP: ${BACKUPZ}
  111. UUID to backup: ${UUID}
  112. DATE of backup: ${DATE}
  113. ---"
  114. check_snap ${UUID}
  115. if [ $? -ne 0 ]; then
  116. echo "There is no snapshot available of ${UUID}"
  117. create_snap ${UUID}
  118. else
  119. echo "Snapshot of ${UUID} already available"
  120. echo "done."
  121. fi
  122. check_remote_dataset ${UUID}
  123. if [ $? -eq 0 ]; then
  124. delete_remote_dataset ${UUID}
  125. else
  126. echo "There is no remote dataset of ${UUID}"
  127. echo "done."
  128. fi
  129. send_snap ${UUID}
  130. check_remote_snap ${UUID}
  131. if [ $? -eq 0 ]; then
  132. delete_remote_snap ${UUID}
  133. else
  134. echo "There is no remote snapshot of ${UUID}"
  135. echo "done."
  136. fi
  137. check_snap ${UUID}
  138. if [ $? -eq 0 ]; then
  139. delete_local_snap ${UUID}
  140. fi
  141. # we check this UUID for additional datasets
  142. echo "Looking for addtional children datasets in ${UUID}..."
  143. DATASET=`vmadm get ${UUID} | json datasets.0 | sed 's/zones\///' | tr -d '\n'`
  144. echo "done."
  145. if [ ! -z "${DATASET}" ]; then
  146. echo "Finded children dataset: ${DATASET}"
  147. check_snap ${DATASET}
  148. if [ $? -ne 0 ]; then
  149. create_snap ${DATASET}
  150. else
  151. echo "Snapshot of ${DATASET} already available"
  152. echo "Skipping create snapshot..."
  153. fi
  154. send_snap ${DATASET}
  155. else
  156. echo "No children datasets finded."
  157. fi
  158. # we send the config
  159. echo "Sending config to ${BACKUPZ}..."
  160. zonecfg -z ${UUID} export | ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ "cat >/data/${SOURCEGZ}/${UUID}/${UUID}.cfg"
  161. check_err
  162. echo "done."