freedombone-utils-config 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Initial reading of the configuration file, typically called freedombone.cfg
  12. #
  13. # License
  14. # =======
  15. #
  16. # Copyright (C) 2014-2018 Bob Mottram <bob@freedombone.net>
  17. #
  18. # This program is free software: you can redistribute it and/or modify
  19. # it under the terms of the GNU Affero General Public License as published by
  20. # the Free Software Foundation, either version 3 of the License, or
  21. # (at your option) any later version.
  22. #
  23. # This program is distributed in the hope that it will be useful,
  24. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  26. # GNU Affero General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU Affero General Public License
  29. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  30. configuration_variables=(SYSTEM_TYPE
  31. SSL_PROTOCOLS
  32. SSL_CIPHERS
  33. SSH_CIPHERS
  34. SSH_MACS
  35. SSH_KEX
  36. SSH_HOST_KEY_ALGORITHMS
  37. SSH_PASSWORDS
  38. REFRESH_GPG_KEYS_HOURS
  39. GPG_KEYSERVER
  40. ENABLE_SOCIAL_KEY_MANAGEMENT
  41. MY_USERNAME
  42. DOMAIN_NAME
  43. DEFAULT_DOMAIN_NAME
  44. DEFAULT_DOMAIN_CODE
  45. EMAIL_DOMAIN_CODE
  46. XMPP_DOMAIN_CODE
  47. NAMESERVER1
  48. NAMESERVER2
  49. NAMESERVER3
  50. NAMESERVER4
  51. NAMESERVER5
  52. NAMESERVER6
  53. GET_IP_ADDRESS_URL
  54. DDNS_PROVIDER
  55. DDNS_USERNAME
  56. DDNS_PASSWORD
  57. LOCAL_NETWORK_STATIC_IP_ADDRESS
  58. ROUTER_IP_ADDRESS
  59. CPU_CORES
  60. WEBSERVER_LOG_LEVEL
  61. ROUTE_THROUGH_TOR
  62. MY_NAME
  63. MY_EMAIL_ADDRESS
  64. INSTALLING_ON_BBB
  65. SSH_PORT
  66. INSTALLED_WITHIN_DOCKER
  67. GPG_ENCRYPT_STORED_EMAIL
  68. MY_GPG_PUBLIC_KEY
  69. MY_GPG_PRIVATE_KEY
  70. MY_GPG_PUBLIC_KEY_ID
  71. USB_DRIVE
  72. MAX_PHP_MEMORY
  73. ONION_ONLY
  74. DEFAULT_LANGUAGE
  75. MINIMAL_INSTALL
  76. LETSENCRYPT_SERVER
  77. WIFI_INTERFACE
  78. WIFI_SSID
  79. WIFI_TYPE
  80. WIFI_PASSPHRASE
  81. WIFI_HOTSPOT
  82. WIFI_NETWORKS_FILE
  83. DEFAULT_SEARCH
  84. SEARCH_ENGINE_PASSWORD
  85. PROJECT_WEBSITE
  86. PROJECT_REPO
  87. GPGIT_REPO
  88. GPGIT_COMMIT
  89. NGINX_ENSITE_REPO
  90. NGINX_ENSITE_REPO
  91. NGINX_ENSITE_COMMIT
  92. CLEANUP_MAILDIR_COMMIT
  93. CLEANUP_MAILDIR_REPO
  94. INADYN_REPO
  95. INADYN_COMMIT
  96. DH_KEYLENGTH
  97. WIFI_CHANNEL
  98. IPV6_NETWORK
  99. HWRNG_TYPE
  100. ENABLE_BATMAN
  101. PUBLIC_MAILING_LIST
  102. SOCIALINSTANCE)
  103. function get_completion_param {
  104. param_name="$1"
  105. if [ ${#param_name} -gt 0 ]; then
  106. if [ "$COMPLETION_FILE" ]; then
  107. if [ -f "$COMPLETION_FILE" ]; then
  108. if grep -q "${param_name}:" "$COMPLETION_FILE"; then
  109. param_value=$(grep "${param_name}:" "$COMPLETION_FILE" | head -n 1 | awk -F ':' '{print $2}')
  110. echo "$param_value"
  111. return
  112. fi
  113. fi
  114. fi
  115. fi
  116. echo ""
  117. }
  118. function set_completion_param {
  119. param_name="$1"
  120. param_value="$2"
  121. if [ ! "$COMPLETION_FILE" ]; then
  122. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  123. fi
  124. if [ ${#COMPLETION_FILE} -eq 0 ]; then
  125. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  126. fi
  127. if [ ${#param_name} -gt 0 ]; then
  128. if [ ${#param_value} -gt 0 ]; then
  129. if [ -f "$COMPLETION_FILE" ]; then
  130. if grep -q "${param_name}:" "$COMPLETION_FILE"; then
  131. sed -i "s|${param_name}:.*|${param_name}:${param_value}|g" "$COMPLETION_FILE"
  132. else
  133. echo "${param_name}:${param_value}" >> "$COMPLETION_FILE"
  134. fi
  135. else
  136. echo "${param_name}:${param_value}" > "$COMPLETION_FILE"
  137. fi
  138. fi
  139. fi
  140. }
  141. function mark_completed {
  142. param_name="$1"
  143. if [ ! "$COMPLETION_FILE" ]; then
  144. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  145. fi
  146. if [ ${#COMPLETION_FILE} -eq 0 ]; then
  147. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  148. fi
  149. if [ ${#param_name} -gt 0 ]; then
  150. if [ -f "$COMPLETION_FILE" ]; then
  151. if ! grep -Fxq "${param_name}" "$COMPLETION_FILE"; then
  152. echo "${param_name}" >> "$COMPLETION_FILE"
  153. fi
  154. else
  155. echo "${param_name}" > "$COMPLETION_FILE"
  156. fi
  157. fi
  158. }
  159. function is_completed {
  160. param_name="$1"
  161. if [ ! "$COMPLETION_FILE" ]; then
  162. COMPLETION_FILE="$HOME/${PROJECT_NAME}-completed.txt"
  163. fi
  164. if [ ${#COMPLETION_FILE} -eq 0 ]; then
  165. COMPLETION_FILE="$HOME/${PROJECT_NAME}-completed.txt"
  166. fi
  167. if [ ${#param_name} -gt 0 ]; then
  168. if [ -f "$COMPLETION_FILE" ]; then
  169. if grep -Fxq "${param_name}" "$COMPLETION_FILE"; then
  170. echo "1"
  171. return
  172. fi
  173. fi
  174. fi
  175. echo "0"
  176. }
  177. function read_config_param {
  178. param_name="$1"
  179. if [ ${#param_name} -gt 0 ]; then
  180. if [ "$CONFIGURATION_FILE" ]; then
  181. if [ -f "$CONFIGURATION_FILE" ]; then
  182. if grep -q "${param_name}=" "$CONFIGURATION_FILE"; then
  183. param_value=$(grep "${param_name}=" "$CONFIGURATION_FILE" | head -n 1 | awk -F '=' '{print $2}')
  184. export "${param_name}"="${param_value}"
  185. fi
  186. fi
  187. fi
  188. fi
  189. }
  190. function config_param_exists {
  191. param_name="$1"
  192. if [ ${#param_name} -gt 0 ]; then
  193. if [ "$CONFIGURATION_FILE" ]; then
  194. if [ -f "$CONFIGURATION_FILE" ]; then
  195. if grep -q "${param_name}=" "$CONFIGURATION_FILE"; then
  196. param_value=$(grep "${param_name}=" "$CONFIGURATION_FILE" | head -n 1 | awk -F '=' '{print $2}')
  197. if [ ${#param_value} -gt 0 ]; then
  198. echo "1"
  199. return
  200. fi
  201. fi
  202. fi
  203. fi
  204. fi
  205. echo "0"
  206. }
  207. function write_config_param {
  208. param_name="$1"
  209. param_value="$2"
  210. if [ ! "$CONFIGURATION_FILE" ]; then
  211. CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
  212. fi
  213. if [ ${#CONFIGURATION_FILE} -eq 0 ]; then
  214. CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
  215. fi
  216. if [ ${#param_name} -gt 0 ]; then
  217. if [ ${#param_value} -gt 0 ]; then
  218. if [ -f "$CONFIGURATION_FILE" ]; then
  219. if grep -q "${param_name}=" "$CONFIGURATION_FILE"; then
  220. sed -i "s|${param_name}=.*|${param_name}=${param_value}|g" "$CONFIGURATION_FILE"
  221. else
  222. echo "${param_name}=${param_value}" >> "$CONFIGURATION_FILE"
  223. fi
  224. else
  225. echo "${param_name}=${param_value}" > "$CONFIGURATION_FILE"
  226. fi
  227. fi
  228. fi
  229. }
  230. function remove_config_param {
  231. param_name="$1"
  232. if [ ${#param_name} -gt 0 ]; then
  233. if [ "$CONFIGURATION_FILE" ]; then
  234. if [ -f "$CONFIGURATION_FILE" ]; then
  235. if grep -q "${param_name}=" "$CONFIGURATION_FILE"; then
  236. sed -i "/${param_name}=/d" "$CONFIGURATION_FILE"
  237. fi
  238. fi
  239. fi
  240. fi
  241. }
  242. function remove_completion_param {
  243. param_name="$1"
  244. if [ ${#param_name} -gt 0 ]; then
  245. if [ "$COMPLETION_FILE" ]; then
  246. if [ -f "$COMPLETION_FILE" ]; then
  247. if grep -Fxq "${param_name}" "$COMPLETION_FILE"; then
  248. sed -i "/${param_name}/d" "$COMPLETION_FILE"
  249. fi
  250. if grep -q "${param_name}:" "$COMPLETION_FILE"; then
  251. sed -i "/${param_name}:/d" "$COMPLETION_FILE"
  252. fi
  253. fi
  254. fi
  255. fi
  256. }
  257. function save_configuration_values {
  258. # shellcheck disable=SC2068
  259. for v in ${configuration_variables[@]}
  260. do
  261. write_config_param "$v" "${!v}"
  262. done
  263. }
  264. function read_configuration_values {
  265. # if not installing on a Beaglebone then use sdb as the USB drive by default
  266. if [ ! "$INSTALLING_ON_BBB" ]; then
  267. if [[ $USB_DRIVE == /dev/sda1 ]]; then
  268. USB_DRIVE=/dev/sdb1
  269. fi
  270. fi
  271. if [ -f "$CONFIGURATION_FILE" ]; then
  272. # Ensure that a copy of the config exists for upgrade purposes
  273. if [[ $CONFIGURATION_FILE != "/root/${PROJECT_NAME}.cfg" ]]; then
  274. cp "$CONFIGURATION_FILE" "/root/${PROJECT_NAME}.cfg"
  275. fi
  276. # shellcheck disable=SC2068
  277. for v in ${configuration_variables[@]}
  278. do
  279. read_config_param "$v"
  280. done
  281. if grep -q "DEBIAN_REPO" "$CONFIGURATION_FILE"; then
  282. read_config_param "DEBIAN_REPO"
  283. # shellcheck disable=SC2034
  284. CHECK_MESSAGE=$"Check your internet connection, /etc/network/interfaces and /etc/resolvconf/resolv.conf.d/head, then delete $COMPLETION_FILE, run 'rm -fR /var/lib/apt/lists/* && apt-get update --fix-missing' and run this script again. If hash sum mismatches persist then try setting $DEBIAN_REPO to a different mirror and also change /etc/apt/sources.list."
  285. fi
  286. fi
  287. }
  288. function read_configuration {
  289. if [[ $INSTALLING_FROM_CONFIGURATION_FILE == "yes" ]]; then
  290. if [ ! -f "$CONFIGURATION_FILE" ]; then
  291. echo $"The configuration file $CONFIGURATION_FILE was not found"
  292. exit 8935
  293. fi
  294. fi
  295. read_configuration_values
  296. }
  297. function check_system_type {
  298. if [ ${#SYSTEM_TYPE} -eq 0 ]; then
  299. echo $'Unknown system type'
  300. exit 763572
  301. fi
  302. echo "System type: $SYSTEM_TYPE"
  303. }
  304. # check that domain names are valid and that they are unique for each app
  305. function check_domains {
  306. specified_domains=$(grep "_DOMAIN_NAME" "$CONFIGURATION_FILE" | uniq)
  307. domains_array=("$specified_domains")
  308. checked_domains=()
  309. # shellcheck disable=SC2068
  310. for d in ${domains_array[@]}
  311. do
  312. domain_param=$(echo "$d" | awk -F '=' '{print $1}')
  313. if [[ "$domain_param" != "DEFAULT_DOMAIN_NAME" ]]; then
  314. domain_value=$(echo "$d" | awk -F '=' '{print $2}')
  315. if [[ "$domain_value" != "${LOCAL_NAME}.local" ]]; then
  316. if ! item_in_array "${domain_value}" ${checked_domains[@]}; then
  317. # test that this is a valid domain name
  318. function_check test_domain_name
  319. test_domain_name "$domain_value"
  320. # add it to the list of domains
  321. checked_domains+=("$domain_value")
  322. else
  323. echo $"Domain ${domain_value} collides with another app. The domain for each app should be unique."
  324. exit 673925
  325. fi
  326. fi
  327. fi
  328. done
  329. }
  330. # NOTE: deliberately no exit 0