freedombone-utils-config 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  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-2016 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=(FRIENDS_MIRRORS_SERVER
  31. FRIENDS_MIRRORS_SSH_PORT
  32. FRIENDS_MIRRORS_PASSWORD
  33. MY_MIRRORS_PASSWORD
  34. SYSTEM_TYPE
  35. SSL_PROTOCOLS
  36. SSL_CIPHERS
  37. SSH_CIPHERS
  38. SSH_MACS
  39. SSH_KEX
  40. SSH_HOST_KEY_ALGORITHMS
  41. SSH_PASSWORDS
  42. REFRESH_GPG_KEYS_HOURS
  43. GPG_KEYSERVER
  44. ENABLE_SOCIAL_KEY_MANAGEMENT
  45. MY_USERNAME
  46. DOMAIN_NAME
  47. DEFAULT_DOMAIN_NAME
  48. DEFAULT_DOMAIN_CODE
  49. EMAIL_DOMAIN_CODE
  50. XMPP_DOMAIN_CODE
  51. NAMESERVER1
  52. NAMESERVER2
  53. NAMESERVER3
  54. NAMESERVER4
  55. NAMESERVER5
  56. NAMESERVER6
  57. GET_IP_ADDRESS_URL
  58. DDNS_PROVIDER
  59. DDNS_USERNAME
  60. DDNS_PASSWORD
  61. LOCAL_NETWORK_STATIC_IP_ADDRESS
  62. ROUTER_IP_ADDRESS
  63. CPU_CORES
  64. WEBSERVER_LOG_LEVEL
  65. ROUTE_THROUGH_TOR
  66. MY_NAME
  67. MY_EMAIL_ADDRESS
  68. INSTALLING_ON_BBB
  69. SSH_PORT
  70. INSTALLED_WITHIN_DOCKER
  71. GPG_ENCRYPT_STORED_EMAIL
  72. MY_GPG_PUBLIC_KEY
  73. MY_GPG_PRIVATE_KEY
  74. MY_GPG_PUBLIC_KEY_ID
  75. USB_DRIVE
  76. MAX_PHP_MEMORY
  77. ONION_ONLY
  78. DEFAULT_LANGUAGE
  79. MINIMAL_INSTALL
  80. LETSENCRYPT_SERVER
  81. WIFI_INTERFACE
  82. WIFI_SSID
  83. WIFI_TYPE
  84. WIFI_PASSPHRASE
  85. WIFI_HOTSPOT
  86. WIFI_NETWORKS_FILE
  87. DEFAULT_SEARCH
  88. SEARCH_ENGINE_PASSWORD
  89. PROJECT_WEBSITE
  90. PROJECT_REPO
  91. GPGIT_REPO
  92. GPGIT_COMMIT
  93. NGINX_ENSITE_REPO
  94. NGINX_ENSITE_REPO
  95. NGINX_ENSITE_COMMIT
  96. CLEANUP_MAILDIR_COMMIT
  97. CLEANUP_MAILDIR_REPO
  98. INADYN_REPO
  99. INADYN_COMMIT
  100. DH_KEYLENGTH
  101. WIFI_CHANNEL
  102. IPV6_NETWORK
  103. HWRNG_TYPE
  104. ENABLE_BATMAN
  105. PUBLIC_MAILING_LIST
  106. SOCIALINSTANCE)
  107. function get_completion_param {
  108. param_name="$1"
  109. if [ ${#param_name} -gt 0 ]; then
  110. if [ $COMPLETION_FILE ]; then
  111. if [ -f $COMPLETION_FILE ]; then
  112. if grep -q "${param_name}:" $COMPLETION_FILE; then
  113. param_value=$(cat $COMPLETION_FILE | grep "${param_name}:" | head -n 1 | awk -F ':' '{print $2}')
  114. echo "$param_value"
  115. return
  116. fi
  117. fi
  118. fi
  119. fi
  120. echo ""
  121. }
  122. function set_completion_param {
  123. param_name="$1"
  124. param_value="$2"
  125. if [ ! $COMPLETION_FILE ]; then
  126. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  127. fi
  128. if [ ${#COMPLETION_FILE} -eq 0 ]; then
  129. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  130. fi
  131. if [ ${#param_name} -gt 0 ]; then
  132. if [ ${#param_value} -gt 0 ]; then
  133. if [ -f $COMPLETION_FILE ]; then
  134. if grep -q "${param_name}:" $COMPLETION_FILE; then
  135. sed -i "s|${param_name}:.*|${param_name}:${param_value}|g" $COMPLETION_FILE
  136. else
  137. echo "${param_name}:${param_value}" >> $COMPLETION_FILE
  138. fi
  139. else
  140. echo "${param_name}:${param_value}" > $COMPLETION_FILE
  141. fi
  142. fi
  143. fi
  144. }
  145. function mark_completed {
  146. param_name="$1"
  147. if [ ! $COMPLETION_FILE ]; then
  148. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  149. fi
  150. if [ ${#COMPLETION_FILE} -eq 0 ]; then
  151. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  152. fi
  153. if [ ${#param_name} -gt 0 ]; then
  154. if [ -f $COMPLETION_FILE ]; then
  155. if ! grep -Fxq "${param_name}" $COMPLETION_FILE; then
  156. echo "${param_name}" >> $COMPLETION_FILE
  157. fi
  158. else
  159. echo "${param_name}" > $COMPLETION_FILE
  160. fi
  161. fi
  162. }
  163. function is_completed {
  164. param_name="$1"
  165. if [ ! $COMPLETION_FILE ]; then
  166. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  167. fi
  168. if [ ${#COMPLETION_FILE} -eq 0 ]; then
  169. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  170. fi
  171. if [ ${#param_name} -gt 0 ]; then
  172. if [ -f $COMPLETION_FILE ]; then
  173. if grep -Fxq "${param_name}" $COMPLETION_FILE; then
  174. echo "1"
  175. return
  176. fi
  177. fi
  178. fi
  179. echo "0"
  180. }
  181. function read_config_param {
  182. param_name="$1"
  183. if [ ${#param_name} -gt 0 ]; then
  184. if [ $CONFIGURATION_FILE ]; then
  185. if [ -f $CONFIGURATION_FILE ]; then
  186. if grep -q "${param_name}=" $CONFIGURATION_FILE; then
  187. param_value=$(cat $CONFIGURATION_FILE | grep "${param_name}=" | head -n 1 | awk -F '=' '{print $2}')
  188. if [[ "${param_value}" != *" "* ]]; then
  189. export ${param_name}=${param_value}
  190. else
  191. export ${param_name}="${param_value}"
  192. fi
  193. fi
  194. fi
  195. fi
  196. fi
  197. }
  198. function config_param_exists {
  199. param_name="$1"
  200. if [ ${#param_name} -gt 0 ]; then
  201. if [ $CONFIGURATION_FILE ]; then
  202. if [ -f $CONFIGURATION_FILE ]; then
  203. if grep -q "${param_name}=" $CONFIGURATION_FILE; then
  204. param_value=$(cat $CONFIGURATION_FILE | grep "${param_name}=" | head -n 1 | awk -F '=' '{print $2}')
  205. if [ ${#param_value} -gt 0 ]; then
  206. echo "1"
  207. return
  208. fi
  209. fi
  210. fi
  211. fi
  212. fi
  213. echo "0"
  214. }
  215. function write_config_param {
  216. param_name="$1"
  217. param_value="$2"
  218. if [ ! $CONFIGURATION_FILE ]; then
  219. CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
  220. fi
  221. if [ ${#CONFIGURATION_FILE} -eq 0 ]; then
  222. CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
  223. fi
  224. if [ ${#param_name} -gt 0 ]; then
  225. if [ ${#param_value} -gt 0 ]; then
  226. if [ -f $CONFIGURATION_FILE ]; then
  227. if grep -q "${param_name}=" $CONFIGURATION_FILE; then
  228. sed -i "s|${param_name}=.*|${param_name}=${param_value}|g" $CONFIGURATION_FILE
  229. else
  230. echo "${param_name}=${param_value}" >> $CONFIGURATION_FILE
  231. fi
  232. else
  233. echo "${param_name}=${param_value}" > $CONFIGURATION_FILE
  234. fi
  235. fi
  236. fi
  237. }
  238. function remove_config_param {
  239. param_name="$1"
  240. if [ ${#param_name} -gt 0 ]; then
  241. if [ $CONFIGURATION_FILE ]; then
  242. if [ -f $CONFIGURATION_FILE ]; then
  243. if grep -q "${param_name}=" $CONFIGURATION_FILE; then
  244. sed -i "/${param_name}=/d" $CONFIGURATION_FILE
  245. fi
  246. fi
  247. fi
  248. fi
  249. }
  250. function remove_completion_param {
  251. param_name="$1"
  252. if [ ${#param_name} -gt 0 ]; then
  253. if [ $COMPLETION_FILE ]; then
  254. if [ -f $COMPLETION_FILE ]; then
  255. if grep -Fxq "${param_name}" $COMPLETION_FILE; then
  256. sed -i "/${param_name}/d" $COMPLETION_FILE
  257. fi
  258. if grep -q "${param_name}:" $COMPLETION_FILE; then
  259. sed -i "/${param_name}:/d" $COMPLETION_FILE
  260. fi
  261. fi
  262. fi
  263. fi
  264. }
  265. function save_configuration_values {
  266. for v in "${configuration_variables[@]}"
  267. do
  268. write_config_param "$v" "${!v}"
  269. done
  270. }
  271. function read_configuration_values {
  272. # if not installing on a Beaglebone then use sdb as the USB drive by default
  273. if [ ! $INSTALLING_ON_BBB ]; then
  274. if [[ $USB_DRIVE == /dev/sda1 ]]; then
  275. USB_DRIVE=/dev/sdb1
  276. fi
  277. fi
  278. if [ -f $CONFIGURATION_FILE ]; then
  279. read_repo_servers
  280. # Ensure that a copy of the config exists for upgrade purposes
  281. if [[ $CONFIGURATION_FILE != "/root/${PROJECT_NAME}.cfg" ]]; then
  282. cp $CONFIGURATION_FILE /root/${PROJECT_NAME}.cfg
  283. fi
  284. for v in "${configuration_variables[@]}"
  285. do
  286. read_config_param "$v"
  287. done
  288. if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
  289. read_config_param "DEBIAN_REPO"
  290. CHECK_MESSAGE=$"Check your internet connection, /etc/network/interfaces and /var/run/NetworkManager/resolv.conf, 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."
  291. fi
  292. fi
  293. }
  294. function read_configuration {
  295. if [[ $INSTALLING_FROM_CONFIGURATION_FILE == "yes" ]]; then
  296. if [ ! -f $CONFIGURATION_FILE ]; then
  297. echo $"The configuration file $CONFIGURATION_FILE was not found"
  298. exit 8935
  299. fi
  300. fi
  301. read_configuration_values
  302. }
  303. function check_system_type {
  304. if [ ${#SYSTEM_TYPE} -eq 0 ]; then
  305. echo $'Unknown system type'
  306. exit 763572
  307. fi
  308. echo "System type: $SYSTEM_TYPE"
  309. }
  310. # check that domain names are valid and that they are unique for each app
  311. function check_domains {
  312. specified_domains=$(cat $CONFIGURATION_FILE | grep "_DOMAIN_NAME" | uniq)
  313. domains_array=($specified_domains)
  314. checked_domains=()
  315. for d in "${domains_array[@]}"
  316. do
  317. domain_param=$(echo "$d" | awk -F '=' '{print $1}')
  318. if [[ "$domain_param" != "DEFAULT_DOMAIN_NAME" ]]; then
  319. domain_value=$(echo "$d" | awk -F '=' '{print $2}')
  320. if [[ "$domain_value" != "${PROJECT_NAME}.local" ]]; then
  321. item_in_array "${domain_value}" "${checked_domains[@]}"
  322. if [[ $? != 0 ]]; then
  323. # test that this is a valid domain name
  324. function_check test_domain_name
  325. test_domain_name "$domain_value"
  326. # add it to the list of domains
  327. checked_domains+=("$domain_value")
  328. else
  329. echo $"Domain ${domain_value} collides with another app. The domain for each app should be unique."
  330. exit 673925
  331. fi
  332. fi
  333. fi
  334. done
  335. }
  336. # NOTE: deliberately no exit 0