helper_functions.sh 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. # Helper functions that are used in multiple other functions
  2. # get user input
  3. prompt_confirm() {
  4. while true; do
  5. read -rs -n 1 -p "${1:-Continue?} [y/n]: " REPLY
  6. case $REPLY in
  7. [yY]) echo -e "\e[32m[Yes]\e[0m"; return 0 ;;
  8. [nN]) echo -e "\e[32m[No]\e[0m"; return 1 ;;
  9. *) echo -e "\e[31m[Invalid Input]\e[0m"
  10. esac
  11. done
  12. }
  13. # Displays green checkmark or red [failed] to indicate if a step successfully ran or failed
  14. exit_response() {
  15. if [[ $? != 0 ]]; then
  16. echo -e " \e[31m[failed]\e[0m"
  17. return 1
  18. else
  19. echo -e " \e[32m\xE2\x9C\x94\e[0m"
  20. return 0
  21. fi
  22. }
  23. # insert item into array
  24. # thanks to http://cfajohnson.com/shell/?2013-01-08_bash_array_manipulation
  25. insert() {
  26. local arrayname=${1:?Arrayname required} val=$2 num=${3:-1}
  27. local array
  28. eval "array=( \"\${$arrayname[@]}\" )"
  29. [ $num -lt 0 ] && num=0 #? Should this be an error instead?
  30. array=( "${array[@]:0:num}" "$val" "${array[@]:num}" )
  31. eval "$arrayname=( \"\${array[@]}\" )"
  32. }
  33. # check if array contains element, only returning for exact matches
  34. elementInArray () {
  35. local e match="$1"; shift
  36. for e; do
  37. [[ "$e" == "$match" ]] && return 0
  38. done
  39. return 1
  40. }
  41. # make sure the chosen domain is valid. Currently the regex is limited. Subdomains with less than 3 characters are considered invalid. Need to fix.
  42. validate_fqdn() {
  43. # on macOS validation requires gnu grep (brew install grep)
  44. [[ `which ggrep` ]] && g=g
  45. local domain
  46. domain=$1
  47. unset fqdn_is_valid invalid_fqdn existing_domains
  48. for conf_file in $(ls "${CONF_DIR}"/nginx/conf.d);do
  49. existing_domains+=( ${conf_file%.conf*} )
  50. done
  51. validate_fqdn=$(echo $1 | ${g}grep -P "(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)")
  52. if elementInArray "${domain}" "${existing_domains[@]}" && [[ -z $reconfigure ]];then
  53. echo -e "\n\e[3m$domain is already in use\e[0m\n"
  54. elif [[ $validate_fqdn ]];then
  55. fqdn_is_valid=1
  56. else
  57. echo -e "\n\e[3m$domain is not a valid domain\e[0m\n"
  58. fi
  59. }
  60. # remove services from relevant arrays in dockerbunker.env after they have been installed/destroyed/configured/started etc..
  61. remove_from_WEB_SERVICES() {
  62. for key in "${!WEB_SERVICES[@]}";do
  63. if [[ "$key" =~ "${PROPER_NAME}" ]];then
  64. unset WEB_SERVICES["$key"]
  65. fi
  66. done
  67. sed -i '/WEB_SERVICES/d' "${ENV_DIR}/dockerbunker.env"
  68. declare -p WEB_SERVICES >> "${ENV_DIR}/dockerbunker.env"
  69. }
  70. remove_from_CONFIGURED_SERVICES() {
  71. CONFIGURED_SERVICES=("${CONFIGURED_SERVICES[@]/"${PROPER_NAME}"}");
  72. for key in "${!CONFIGURED_SERVICES[@]}";do
  73. if [[ "${CONFIGURED_SERVICES[$key]}" == "" ]];then
  74. unset CONFIGURED_SERVICES[$key]
  75. if [[ -z "${CONFIGURED_SERVICES[@]}" ]];then
  76. unset ${CONFIGURED_SERVICES[@]}
  77. fi
  78. fi
  79. sed -i '/CONFIGURED_SERVICES/d' "${ENV_DIR}/dockerbunker.env"
  80. declare -p CONFIGURED_SERVICES >> "${ENV_DIR}/dockerbunker.env"
  81. done
  82. }
  83. remove_from_STATIC_SITES() {
  84. STATIC_SITES=("${STATIC_SITES[@]/"${SERVICE_DOMAIN[0]}"}");
  85. for key in "${!STATIC_SITES[@]}";do
  86. if [[ "${STATIC_SITES[$key]}" == "" ]];then
  87. unset STATIC_SITES[$key]
  88. if [[ -z "${STATIC_SITES[@]}" ]];then
  89. unset ${STATIC_SITES[@]}
  90. fi
  91. fi
  92. sed -i '/STATIC_SITES/d' "${ENV_DIR}/dockerbunker.env"
  93. declare -p STATIC_SITES >> "${ENV_DIR}/dockerbunker.env"
  94. done
  95. }
  96. remove_from_INSTALLED_SERVICES() {
  97. INSTALLED_SERVICES=("${INSTALLED_SERVICES[@]/"${PROPER_NAME}"}");
  98. for key in "${!INSTALLED_SERVICES[@]}";do
  99. if [[ "${INSTALLED_SERVICES[$key]}" == "" ]];then
  100. unset INSTALLED_SERVICES[$key]
  101. if [[ -z "${INSTALLED_SERVICES[@]}" ]];then
  102. unset ${INSTALLED_SERVICES[@]}
  103. fi
  104. fi
  105. sed -i '/INSTALLED_SERVICES/d' "${ENV_DIR}/dockerbunker.env"
  106. declare -p INSTALLED_SERVICES >> "${ENV_DIR}/dockerbunker.env"
  107. done
  108. }
  109. remove_from_STOPPED_SERVICES() {
  110. STOPPED_SERVICES=("${STOPPED_SERVICES[@]/"${PROPER_NAME}"}");
  111. for key in "${!STOPPED_SERVICES[@]}";do
  112. if [[ "${STOPPED_SERVICES[$key]}" == "" ]];then
  113. unset STOPPED_SERVICES[$key]
  114. if [[ -z "${STOPPED_SERVICES[@]}" ]];then
  115. unset ${STOPPED_SERVICES[@]}
  116. fi
  117. fi
  118. done
  119. sed -i '/STOPPED_SERVICES/d' "${ENV_DIR}/dockerbunker.env"
  120. declare -p STOPPED_SERVICES >> "${ENV_DIR}/dockerbunker.env"
  121. }
  122. remove_from_CONTAINERS_IN_DOCKERBUNKER_NETWORK() {
  123. for container in ${add_to_network[@]};do
  124. CONTAINERS_IN_DOCKERBUNKER_NETWORK=("${CONTAINERS_IN_DOCKERBUNKER_NETWORK[@]/"$container"}");
  125. for key in "${!CONTAINERS_IN_DOCKERBUNKER_NETWORK[@]}";do
  126. if [[ "${CONTAINERS_IN_DOCKERBUNKER_NETWORK[$key]}" == "" ]];then
  127. unset CONTAINERS_IN_DOCKERBUNKER_NETWORK[$key]
  128. if [[ -z "${CONTAINERS_IN_DOCKERBUNKER_NETWORK[@]}" ]];then
  129. unset ${CONTAINERS_IN_DOCKERBUNKER_NETWORK[@]}
  130. fi
  131. fi
  132. done
  133. sed -i '/CONTAINERS_IN_DOCKERBUNKER_NETWORK/d' "${ENV_DIR}/dockerbunker.env"
  134. declare -p CONTAINERS_IN_DOCKERBUNKER_NETWORK >> "${ENV_DIR}/dockerbunker.env" 2>/dev/null
  135. done
  136. }
  137. collectAllImageNamesFromDockerComposeFile() {
  138. unset IMAGES
  139. for i in $(grep "image:" ${SERVICE_HOME}/docker-compose.yml | awk '{print $NF}');do IMAGES+=( \"$i\" );done
  140. }
  141. collectImageNamesAndCorrespondingSha256() {
  142. [[ $DOCKER_COMPOSE ]] && collectAllImageNamesFromDockerComposeFile
  143. for image in ${IMAGES[@]};do
  144. image=${image//\"}
  145. tag=${image#*:}
  146. image=${image%%:*}
  147. sha256=$(\
  148. docker images --no-trunc \
  149. | grep $image \
  150. | grep $tag \
  151. | awk '{for (i=1;i<=NF;i++){if ($i ~/^sha256/) {print $i}}}' \
  152. | awk -F":" '{print $NF}'\
  153. )
  154. declare -gA test IMAGES_AND_SHA256
  155. IMAGES_AND_SHA256[$image]+=$sha256
  156. done
  157. }
  158. say_done() {
  159. echo -e "\n\e[1mDone.\e[0m"
  160. }