Scripts to automating daily tasks http://gitea.open6hosting.com/Open6Hosting/smartos-bin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 line
3.2 KiB

  1. #!/bin/bash
  2. usage()
  3. {
  4. echo "Usage: $0 [ -z UUID ] [ -h hostname ] [ -p port ] [ -k KEY ] [ -n name ] [ -d dir ]" >&2
  5. exit 1
  6. }
  7. while getopts "z:h:p:k:n:d:" opt;
  8. do
  9. case "$opt" in
  10. z)
  11. UUID=$OPTARG
  12. ;;
  13. h)
  14. HOSTNAME=$OPTARG
  15. ;;
  16. n)
  17. NAME=$OPTARG
  18. ;;
  19. p)
  20. PORT=$OPTARG
  21. ;;
  22. k)
  23. KEY=$OPTARG
  24. ;;
  25. d)
  26. DIR=$OPTARG
  27. ;;
  28. \?)
  29. echo "Error: Invalid Option: -${OPTARG}" >&2
  30. usage
  31. ;;
  32. :)
  33. echo "Error: -${OPTARG} requires an argument."
  34. usage
  35. ;;
  36. *)
  37. usage
  38. ;;
  39. esac
  40. done
  41. shift $((OPTIND-1))
  42. if [ -z "${UUID}" ] || [ -z "${HOSTNAME}" ] || [ -z ${PORT} ] || [ -z ${KEY} ] || [ -z "${NAME}" ] || [ -z "${DIR}" ]; then
  43. usage
  44. fi
  45. SSH="ssh -i $KEY -p ${PORT} -o StrictHostKeyChecking=no"
  46. DSTDIR="${DIR}/${NAME}"
  47. #################
  48. # functions
  49. #################
  50. create_snap()
  51. {
  52. DATASET=$1
  53. echo "Creating snapshot of ${DATASET}..."
  54. /usr/sbin/zfs snapshot zones/${DATASET}@`date +%Y%m%d`
  55. check_err
  56. echo "...done."
  57. }
  58. send_snap()
  59. {
  60. DATASET=$1
  61. echo "Sending snapshot of ${DATASET}..."
  62. # taking care for additional datasets
  63. SLASH=`echo ${DATASET} | grep -c '/'`
  64. if [ ${SLASH} -ne 0 ]; then
  65. RENAME=`echo ${DATASET} | sed 's/\//-/'`
  66. /usr/sbin/zfs send zones/${DATASET}@`date +%Y%m%d` | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${UUID}/${RENAME}.zfs bs=4M"
  67. else
  68. /usr/sbin/zfs send zones/${DATASET}@`date +%Y%m%d` | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${DATASET}/${DATASET}.zfs bs=4M"
  69. fi
  70. check_err
  71. echo "...done."
  72. }
  73. check_snap()
  74. {
  75. ZONE=$1
  76. echo "Checking for snapshot of ${ZONE}..."
  77. zfs list -t snapshot zones/${ZONE}@`date +%Y%m%d` 2>/dev/null 1>&2
  78. }
  79. check_err()
  80. {
  81. STATUS=$?
  82. if [ ${STATUS} -ne 0 ]; then
  83. echo "Unexpected error: ${STATUS}"
  84. exit ${STATUS}
  85. fi
  86. }
  87. send_config()
  88. {
  89. echo "Sending config to ${HOSTNAME}..."
  90. zonecfg -z ${UUID} export | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${UUID}/${UUID}.cfg"
  91. check_err
  92. echo "...done."
  93. }
  94. create_dir()
  95. {
  96. echo "Creating directory at ${HOSTNAME}..."
  97. ${SSH} ${HOSTNAME} mkdir -p ${DSTDIR}/${UUID}
  98. check_err
  99. echo "...done."
  100. }
  101. check_multidataset()
  102. {
  103. echo "Looking for addtional children datasets in ${UUID}..."
  104. DATASET=`vmadm get ${UUID} | json datasets.0 | sed 's/zones\///' | tr -d '\n'`
  105. echo "...done."
  106. if [ ! -z "${DATASET}" ]; then
  107. echo "Finded children dataset: ${DATASET}"
  108. check_snap ${DATASET}
  109. if [ $? -ne 0 ]; then
  110. create_snap ${DATASET}
  111. else
  112. echo "Snapshot of ${DATASET} already available"
  113. echo "Skipping create snapshot..."
  114. fi
  115. send_snap ${DATASET}
  116. else
  117. echo "No children datasets finded."
  118. fi
  119. }
  120. #################
  121. # main
  122. #################
  123. echo "---
  124. BACKUP_SERVER: ${HOSTNAME}
  125. UUID to backup: ${UUID}
  126. ---"
  127. create_dir ${UUID}
  128. check_snap ${UUID}
  129. if [ $? -ne 0 ]; then
  130. create_snap ${UUID}
  131. else
  132. echo "Snapshot of ${UUID} already available"
  133. echo "...done."
  134. fi
  135. send_snap ${UUID}
  136. check_multidataset
  137. send_config