configuration_functions.sh 5.7 KB

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