configuration_functions.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # All functions used during configuration of a service
  2. # only relevant if the menu shows "Configure service", although the service has already been configured or installed. This should only happen if things are messed up.
  3. pre_configure_routine() {
  4. if [[ "${CONFIGURED_SERVICES[@]}" =~ ${PROPER_NAME} ]] || [[ -f "${ENV_DIR}/${SERVICE_NAME}" ]]|| [[ "${INSTALLED_SERVICES[@]}" =~ ${PROPER_NAME} ]];then
  5. prompt_confirm "Existing configuration found. Destroy containers and reconfigure?" && destroy || echo "Exiting..";exit
  6. fi
  7. [[ ${repoURL} ]] && add_submodule
  8. }
  9. # Ask the user what fqdn to use for the service
  10. set_domain() {
  11. echo ""
  12. [[ $INVALID ]] && echo -e "\nPlease enter a valid domain!\n"
  13. INVALID=
  14. while [[ -z $fqdn_is_valid ]];do
  15. if [[ -z "${SERVICE_DOMAIN[0]}" ]]; then
  16. read -p "${PROPER_NAME} Service Domain (FQDN): " SERVICE_DOMAIN
  17. else
  18. previous_domain=${SERVICE_DOMAIN[0]}
  19. unset SERVICE_DOMAIN
  20. read -p "${PROPER_NAME} Service Domain (FQDN): " -ei "${previous_domain}" SERVICE_DOMAIN
  21. fi
  22. validate_fqdn ${SERVICE_DOMAIN[0]}
  23. done
  24. INVALID=1
  25. echo ""
  26. if [[ $PROMPT_SSL ]];then
  27. configure_ssl
  28. fi
  29. }
  30. # Ask user for mx info. User has the option to set for the service that is being configured global mx environment variables or service specific. This creates mx.env (if it does not exist yet) or ${SERVICE_NAME}_mx.env respectively
  31. configure_mx() {
  32. echo ""
  33. prompt_confirm "Use global SMTP Settings?"
  34. if [[ $? == 1 ]];then
  35. SERVICE_SPECIFIC_MX="${SERVICE_NAME}_"
  36. else
  37. unset SERVICE_SPECIFIC_MX
  38. fi
  39. if [[ ( $SERVICE_SPECIFIC_MX && ! -f "${ENV_DIR}/${SERVICE_SPECIFIC_MX}mx.env" ) || ( -z $SERVICE_SPECIFIC_MX && ! -f "${ENV_DIR}/mx.env" ) ]];then
  40. echo -e "# \n# \e[4mSMTP Settings\e[0m"
  41. if [ "$MX_EMAIL" ]; then
  42. read -p "SMTP User: " -ei "$MX_EMAIL" MX_EMAIL
  43. else
  44. read -p "SMTP User: " -ei "" MX_EMAIL
  45. fi
  46. unset MX_PASSWORD
  47. while [[ -z ${MX_PASSWORD} ]];do
  48. if [ $VALIDATE ];then
  49. echo -e "\n\e[31m Password cannot be empty.\e[0m"
  50. fi
  51. stty_orig=`stty -g`
  52. stty -echo
  53. read -p "SMTP Password: " -ei "" MX_PASSWORD
  54. stty $stty_orig
  55. echo ""
  56. VALIDATE=1
  57. done
  58. unset VALIDATE
  59. invalid_mx=1
  60. while [[ $invalid_mx ]];do
  61. if [ -z "$MX_HOSTNAME" ]; then
  62. read -p "MX Hostname for email delivery (FQDN): " -ei "smtp.example.com" MX_HOSTNAME
  63. else
  64. read -p "MX Hostname for email delivery (FQDN): " -ei "$MX_HOSTNAME" MX_HOSTNAME
  65. fi
  66. # only verify mx hostname if `host` found
  67. if dpkg -l host &>/dev/null;then
  68. host -t mx ${MX_EMAIL#*@} | grep ${MX_HOSTNAME} >/dev/null \
  69. && unset invalid_mx \
  70. || echo -e "\n\e[31m${MX_HOSTNAME} not a valid mx entry for ${MX_EMAIL#*@}.\e[0m\n"
  71. else
  72. unset invalid_mx
  73. fi
  74. done
  75. cat <<-EOF >> "${ENV_DIR}/${SERVICE_SPECIFIC_MX}mx.env"
  76. #MX
  77. ## ------------------------------
  78. MX_HOSTNAME=${MX_HOSTNAME}
  79. MX_EMAIL=${MX_EMAIL}
  80. MX_PASSWORD="${MX_PASSWORD}"
  81. ## ------------------------------
  82. #/MX
  83. EOF
  84. fi
  85. }
  86. # Services that need to be connected to a fqdn will have the variable $PROMPT_SSL set. In that case this function asks if the user wants to get an SSL certificate from Let's Encrypt or keep using the self signed certificate that will be generated during configuration
  87. configure_ssl() {
  88. prompt_confirm "Use Letsencrypt instead of a self-signed certificate?"
  89. if [[ $? == 0 ]];then
  90. SSL_CHOICE="le"
  91. if [[ $LE_EMAIL ]]; then
  92. prompt_confirm "Use ${LE_EMAIL} for Let's Encrypt?"
  93. if [[ $? == 1 ]];then
  94. read -p "Enter E-mail Adress for Let's Encrypt: " LE_EMAIL
  95. if ! [[ $(grep ${LE_EMAIL} "${ENV_DIR}"/dockerbunker.env) ]];then
  96. prompt_confirm "Use this address globally for every future service configured to obtain a Let's Encrypt certificate?"
  97. if [[ $? == 0 && ! $(grep ${LE_EMAIL} "${ENV_DIR}"/dockerbunker.env) ]];then
  98. sed -i "s/LE_EMAIL=.*/LE_EMAIL="${LE_EMAIL}"/" "${ENV_DIR}"/dockerbunker.env
  99. fi
  100. fi
  101. fi
  102. else
  103. get_le_email
  104. fi
  105. else
  106. SSL_CHOICE="ss"
  107. fi
  108. }
  109. # Ask what email to use for Let's Encrypt
  110. get_le_email() {
  111. echo ""
  112. read -p "Existing E-mail Adress for letsencrypt: " -ei "" LE_EMAIL
  113. [[ -f ${SERVICE_ENV} ]] && sed -i "s/LE_EMAIL=.*/LE_EMAIL=${LE_EMAIL}/" ${SERVICE_ENV}
  114. }
  115. # Update dockerbunker.env to let dockerbunker know that the service is now configured, then offer a menu to choose further steps (setup/reconfigure/destroy)
  116. post_configure_routine() {
  117. if [[ ${STATIC} ]];then
  118. if ! [[ "${STATIC_SITES[@]}" =~ "${SERVICE_DOMAIN[0]}" ]];then
  119. STATIC_SITES+=( "${SERVICE_DOMAIN[0]}" )
  120. sed -i '/STATIC_SITES/d' "${ENV_DIR}/dockerbunker.env"
  121. declare -p STATIC_SITES >> "${ENV_DIR}/dockerbunker.env"
  122. fi
  123. else
  124. [[ ${SERVICE_DOMAIN[0]} ]] && ! elementInArray "${PROPER_NAME}" "${!WEB_SERVICES[@]}" && WEB_SERVICES+=( [${PROPER_NAME}]="${SERVICE_DOMAIN[0]}" )
  125. ! elementInArray "${PROPER_NAME}" "${CONFIGURED_SERVICES[@]}" && CONFIGURED_SERVICES+=( "${PROPER_NAME}" )
  126. for containers in ${add_to_network[@]};do
  127. [[ ( $container && ! "${CONTAINERS_IN_DOCKERBUNKER_NETWORK[@]}" =~ "${container}" ) ]] && CONTAINERS_IN_DOCKERBUNKER_NETWORK+=( "${container}" )
  128. done
  129. if [[ -f "${ENV_DIR}/dockerbunker.env" ]];then
  130. sed -i '/CONFIGURED_SERVICES/d' "${ENV_DIR}/dockerbunker.env"
  131. sed -i '/WEB_SERVICES/d' "${ENV_DIR}/dockerbunker.env"
  132. sed -i '/CONTAINERS_IN_DOCKERBUNKER_NETWORK/d' "${ENV_DIR}/dockerbunker.env"
  133. sed -i '/INSTALLED_SERVICES/d' "${ENV_DIR}/dockerbunker.env"
  134. declare -p CONFIGURED_SERVICES >> "${ENV_DIR}/dockerbunker.env"
  135. declare -p INSTALLED_SERVICES >> "${ENV_DIR}/dockerbunker.env"
  136. declare -p WEB_SERVICES >> "${ENV_DIR}/dockerbunker.env"
  137. declare -p CONTAINERS_IN_DOCKERBUNKER_NETWORK >> "${ENV_DIR}/dockerbunker.env" 2>/dev/null
  138. echo ""
  139. echo "Please run \"Setup service\" next."
  140. bash "${BASE_DIR}/data/services/${SERVICE_NAME}/${SERVICE_NAME}.sh"
  141. fi
  142. fi
  143. }