functions 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #!/usr/bin/env bash
  2. #
  3. # Zammad backup script functions
  4. #
  5. function get_zammad_dir () {
  6. ZAMMAD_DIR="$(echo ${BACKUP_SCRIPT_PATH} | sed -e 's#/contrib/backup.*##g')"
  7. }
  8. function get_backup_date () {
  9. TIMESTAMP="$(date +'%Y%m%d%H%M%S')"
  10. if [ "${DEBUG}" == "yes" ]; then
  11. echo "timestamp is ${TIMESTAMP}"
  12. fi
  13. }
  14. function delete_old_backups () {
  15. test -d ${BACKUP_DIR} && find ${BACKUP_DIR}/*_zammad_*.gz -type f -mtime +${HOLD_DAYS} -delete
  16. }
  17. function get_db_credentials () {
  18. DB_ADAPTER="$(grep 'adapter:' < ${ZAMMAD_DIR}/config/database.yml | sed -e 's/.*adapter:\(\| \)//g')"
  19. DB_NAME="$(grep 'database:' < ${ZAMMAD_DIR}/config/database.yml | sed -e 's/.*database:\(\| \) //g')"
  20. DB_USER="$(grep 'username:' < ${ZAMMAD_DIR}/config/database.yml | sed -e 's/.*username:\(\| \)//g')"
  21. DB_PASS="$(grep 'password:' < ${ZAMMAD_DIR}/config/database.yml | sed -e 's/.*password:\(\| \)//g')"
  22. if [ "${DEBUG}" == "yes" ]; then
  23. echo "adapter=${DB_ADAPTER} dbname=${DB_NAME} dbuser=${DB_USER} dbpass=${DB_PASS}"
  24. fi
  25. }
  26. function backup_dir_create () {
  27. test -d ${BACKUP_DIR} || mkdir -p ${BACKUP_DIR}
  28. if [ "${DEBUG}" == "yes" ]; then
  29. echo "backup dir is ${BACKUP_DIR}"
  30. fi
  31. }
  32. function backup_files () {
  33. echo "creating file backup..."
  34. tar -C / -czf ${BACKUP_DIR}/${TIMESTAMP}_zammad_files.tar.gz --exclude='tmp' ${ZAMMAD_DIR#/}
  35. ln -sfn ${BACKUP_DIR}/${TIMESTAMP}_zammad_files.tar.gz ${BACKUP_DIR}/latest_zammad_files.tar.gz
  36. }
  37. function backup_db () {
  38. if [ "${DB_ADAPTER}" == "mysql2" ]; then
  39. echo "creating mysql backup..."
  40. mysqldump --opt --single-transaction -u${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${BACKUP_DIR}/${TIMESTAMP}_zammad_db.mysql.gz
  41. ln -sfn ${BACKUP_DIR}/${TIMESTAMP}_zammad_db.mysql.gz ${BACKUP_DIR}/latest_zammad_db.mysql.gz
  42. elif [ "${DB_ADAPTER}" == "postgresql" ]; then
  43. echo "creating postgresql backup..."
  44. su -c "pg_dump --no-privileges --no-owner -c ${DB_NAME} | \
  45. gzip > /tmp/${TIMESTAMP}_zammad_db.psql.gz" postgres
  46. mv /tmp/${TIMESTAMP}_zammad_db.psql.gz ${BACKUP_DIR}
  47. ln -sfn ${BACKUP_DIR}/${TIMESTAMP}_zammad_db.psql.gz ${BACKUP_DIR}/latest_zammad_db.psql.gz
  48. else
  49. echo "DB ADAPTER not found. if its sqlite backup is already saved in the filebackup"
  50. fi
  51. }
  52. function check_database_config_exists () {
  53. if [ -f ${ZAMMAD_DIR}/config/database.yml ]; then
  54. get_db_credentials
  55. else
  56. echo -e "${ZAMMAD_DIR}/config/database.yml is missing. is Zammad configured yet? \nAborting..."
  57. exit 1
  58. fi
  59. }
  60. function restore_warning () {
  61. if [ -n "${1}" ]; then
  62. CHOOSE_RESTORE="yes"
  63. else
  64. echo -e "The restore will delete your current config and database! \nBe sure to have a backup available! \n"
  65. echo -e "Enter 'yes' if you want to proceed!"
  66. read -p 'Restore?: ' CHOOSE_RESTORE
  67. fi
  68. if [ "${CHOOSE_RESTORE}" != "yes" ]; then
  69. echo "Restore aborted!"
  70. exit 1
  71. fi
  72. }
  73. function get_restore_dates () {
  74. RESTORE_FILE_DATES="$(find ${BACKUP_DIR} -type f -iname '*_zammad_files.tar.gz' | sed -e "s#${BACKUP_DIR}/##g" -e "s#_zammad_files.tar.gz##g" | sort)"
  75. if [ "${DB_ADAPTER}" == "postgresql" ]; then
  76. DB_FILE_EXT="psql"
  77. elif [ "${DB_ADAPTER}" == "mysql2" ]; then
  78. DB_FILE_EXT="mysql"
  79. fi
  80. RESTORE_DB_DATES="$(find ${BACKUP_DIR} -type f -iname "*_zammad_db.${DB_FILE_EXT}.gz" | sed -e "s#${BACKUP_DIR}/##g" -e "s#_zammad_db.${DB_FILE_EXT}.gz##g" | sort)"
  81. }
  82. function choose_restore_date () {
  83. if [ -n "${1}" ]; then
  84. RESTORE_FILE_DATE="${1}"
  85. else
  86. echo -e "Enter file date to restore: \n${RESTORE_FILE_DATES}"
  87. read -p 'File date: ' RESTORE_FILE_DATE
  88. fi
  89. if [ ! -f "${BACKUP_DIR}/${RESTORE_FILE_DATE}_zammad_files.tar.gz" ];then
  90. echo -e "File ${BACKUP_DIR}/${RESTORE_FILE_DATE}_zammad_files.tar.gz does not exist! \nRestore aborted!"
  91. exit 1
  92. fi
  93. if [ -n "${1}" ]; then
  94. RESTORE_DB_DATE="${1}"
  95. else
  96. echo -e "Enter db date to restore: \n${RESTORE_DB_DATES}"
  97. read -p 'DB date: ' RESTORE_DB_DATE
  98. fi
  99. if [ ! -f "${BACKUP_DIR}/${RESTORE_DB_DATE}_zammad_db.${DB_FILE_EXT}.gz" ];then
  100. echo -e "File ${BACKUP_DIR}/${RESTORE_DB_DATE}_zammad_db.${DB_FILE_EXT}.gz does not exist! \nRestore aborted!"
  101. exit 1
  102. fi
  103. }
  104. function detect_initcmd () {
  105. if [ -n "$(which systemctl 2> /dev/null)" ]; then
  106. INIT_CMD="systemctl"
  107. elif [ -n "$(which initctl 2> /dev/null)" ]; then
  108. INIT_CMD="initctl"
  109. else
  110. function sysvinit () {
  111. service $2 $1
  112. }
  113. INIT_CMD="sysvinit"
  114. fi
  115. if [ "${DOCKER}" == "yes" ]; then
  116. INIT_CMD="initctl"
  117. fi
  118. if [ "${DEBUG}" == "yes" ]; then
  119. echo "INIT CMD = ${INIT_CMD}"
  120. fi
  121. }
  122. function start_zammad () {
  123. echo "# Starting Zammad"
  124. ${INIT_CMD} start zammad
  125. }
  126. function stop_zammad () {
  127. echo "# Stopping Zammad"
  128. ${INIT_CMD} stop zammad
  129. }
  130. function restore_zammad () {
  131. if ! command -v zammad > /dev/null; then
  132. # See #3160 for the reasons of this :>
  133. restore_files
  134. fi
  135. if [ "${DB_ADAPTER}" == "postgresql" ]; then
  136. echo "# Checking requirements"
  137. if ! id "zammad" &> /dev/null; then
  138. echo "# ERROR: User 'zammad' is not present, but should be by default! #"
  139. echo "# Restoration was NOT successful, exiting ..."
  140. exit 1
  141. fi
  142. echo "# ... Dropping current database ${DB_NAME}"
  143. # This step is only needed for some pgsql dumps, as they don't provide a drop table statement which will cause
  144. # relation errors during restoration (as on package installation there's always an initialized database)
  145. if command -v zammad > /dev/null; then
  146. zammad config:set DISABLE_DATABASE_ENVIRONMENT_CHECK=1
  147. zammad run rake db:drop
  148. zammad config:set DISABLE_DATABASE_ENVIRONMENT_CHECK=0
  149. else
  150. ${ZAMMAD_DIR}/bin/rake db:drop
  151. fi
  152. echo "# ... Creating database ${DB_NAME} for owner ${DB_USER}"
  153. if command -v zammad > /dev/null; then
  154. # We'll skip this part for docker installations
  155. su -c "psql -c \"CREATE DATABASE ${DB_NAME} OWNER ${DB_USER};\"" postgres
  156. else
  157. ${ZAMMAD_DIR}/bin/rake db:create
  158. fi
  159. echo "# Restoring PostgrSQL DB"
  160. zcat ${BACKUP_DIR}/${RESTORE_DB_DATE}_zammad_db.${DB_FILE_EXT}.gz | su -c "psql -d ${DB_NAME}" zammad
  161. elif [ "${DB_ADAPTER}" == "mysql2" ]; then
  162. echo "# Restoring MySQL DB"
  163. zcat ${BACKUP_DIR}/${RESTORE_DB_DATE}_zammad_db.${DB_FILE_EXT}.gz | mysql -u${DB_USER} -p${DB_PASS} ${DB_NAME}
  164. fi
  165. if command -v zammad > /dev/null; then
  166. # See #3160 for the reasons of this :>
  167. restore_files
  168. fi
  169. # Ensure all data is loaded from the restored database and not the cache of the previous system state
  170. echo "# Clearing Cache ..."
  171. if command -v zammad > /dev/null; then
  172. zammad run rails r "Cache.clear"
  173. else
  174. ${ZAMMAD_DIR}/bin/rails r "Cache.clear"
  175. fi
  176. }
  177. function restore_files () {
  178. echo "# Restoring Files"
  179. tar -C / --overwrite -xzf ${BACKUP_DIR}/${RESTORE_FILE_DATE}_zammad_files.tar.gz
  180. echo "# Ensuring correct file rights ..."
  181. chown -R zammad:zammad ${ZAMMAD_DIR}
  182. }
  183. function start_backup_message () {
  184. echo -e "\n# Zammad backup started - $(date)!\n"
  185. }
  186. function start_restore_message () {
  187. echo -e "\n# Zammad restored started - $(date)!\n"
  188. }
  189. function finished_backup_message () {
  190. echo -e "\n# Zammad backuped successfully - $(date)!\n"
  191. }
  192. function finished_restore_message () {
  193. echo -e "\n# Zammad restored successfully - $(date)!\n"
  194. }