freedombone-utils-config 12KB

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