123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- #!/bin/bash
- #
- # .---. . .
- # | | |
- # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
- # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
- # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
- #
- # Freedom in the Cloud
- #
- # Initial reading of the configuration file, typically called freedombone.cfg
- #
- # License
- # =======
- #
- # Copyright (C) 2014-2016 Bob Mottram <bob@freedombone.net>
- #
- # This program is free software: you can redistribute it and/or modify
- # it under the terms of the GNU Affero General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU Affero General Public License for more details.
- #
- # You should have received a copy of the GNU Affero General Public License
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- configuration_variables=(FRIENDS_MIRRORS_SERVER
- FRIENDS_MIRRORS_SSH_PORT
- FRIENDS_MIRRORS_PASSWORD
- MY_MIRRORS_PASSWORD
- SYSTEM_TYPE
- SSL_PROTOCOLS
- SSL_CIPHERS
- SSH_CIPHERS
- SSH_MACS
- SSH_KEX
- SSH_HOST_KEY_ALGORITHMS
- SSH_PASSWORDS
- REFRESH_GPG_KEYS_HOURS
- GPG_KEYSERVER
- ENABLE_SOCIAL_KEY_MANAGEMENT
- MY_USERNAME
- DOMAIN_NAME
- DEFAULT_DOMAIN_NAME
- DEFAULT_DOMAIN_CODE
- EMAIL_DOMAIN_CODE
- XMPP_DOMAIN_CODE
- NAMESERVER1
- NAMESERVER2
- NAMESERVER3
- NAMESERVER4
- NAMESERVER5
- NAMESERVER6
- GET_IP_ADDRESS_URL
- DDNS_PROVIDER
- DDNS_USERNAME
- DDNS_PASSWORD
- LOCAL_NETWORK_STATIC_IP_ADDRESS
- ROUTER_IP_ADDRESS
- CPU_CORES
- WEBSERVER_LOG_LEVEL
- ROUTE_THROUGH_TOR
- MY_NAME
- MY_EMAIL_ADDRESS
- INSTALLING_ON_BBB
- SSH_PORT
- INSTALLED_WITHIN_DOCKER
- GPG_ENCRYPT_STORED_EMAIL
- MY_GPG_PUBLIC_KEY
- MY_GPG_PRIVATE_KEY
- MY_GPG_PUBLIC_KEY_ID
- USB_DRIVE
- MAX_PHP_MEMORY
- ONION_ONLY
- DEFAULT_LANGUAGE
- MINIMAL_INSTALL
- LETSENCRYPT_SERVER
- WIFI_INTERFACE
- WIFI_SSID
- WIFI_TYPE
- WIFI_PASSPHRASE
- WIFI_HOTSPOT
- WIFI_NETWORKS_FILE
- DEFAULT_SEARCH
- SEARCH_ENGINE_PASSWORD
- PROJECT_WEBSITE
- PROJECT_REPO
- GPGIT_REPO
- GPGIT_COMMIT
- NGINX_ENSITE_REPO
- NGINX_ENSITE_REPO
- NGINX_ENSITE_COMMIT
- CLEANUP_MAILDIR_COMMIT
- CLEANUP_MAILDIR_REPO
- INADYN_REPO
- INADYN_COMMIT
- DH_KEYLENGTH
- WIFI_CHANNEL
- IPV6_NETWORK
- HWRNG_TYPE
- ENABLE_BATMAN
- PUBLIC_MAILING_LIST)
-
- function get_completion_param {
- param_name="$1"
-
- if [ ${#param_name} -gt 0 ]; then
- if [ $COMPLETION_FILE ]; then
- if [ -f $COMPLETION_FILE ]; then
- if grep -q "${param_name}:" $COMPLETION_FILE; then
- param_value=$(cat $COMPLETION_FILE | grep "${param_name}:" | head -n 1 | awk -F ':' '{print $2}')
- echo "$param_value"
- return
- fi
- fi
- fi
- fi
- echo ""
- }
-
- function set_completion_param {
- param_name="$1"
- param_value="$2"
-
- if [ ! $COMPLETION_FILE ]; then
- COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
- fi
- if [ ${#COMPLETION_FILE} -eq 0 ]; then
- COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
- fi
-
- if [ ${#param_name} -gt 0 ]; then
- if [ ${#param_value} -gt 0 ]; then
- if [ -f $COMPLETION_FILE ]; then
- if grep -q "${param_name}:" $COMPLETION_FILE; then
- sed -i "s|${param_name}:.*|${param_name}:${param_value}|g" $COMPLETION_FILE
- else
- echo "${param_name}:${param_value}" >> $COMPLETION_FILE
- fi
- else
- echo "${param_name}:${param_value}" > $COMPLETION_FILE
- fi
- fi
- fi
- }
-
- function mark_completed {
- param_name="$1"
-
- if [ ! $COMPLETION_FILE ]; then
- COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
- fi
- if [ ${#COMPLETION_FILE} -eq 0 ]; then
- COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
- fi
-
- if [ ${#param_name} -gt 0 ]; then
- if [ -f $COMPLETION_FILE ]; then
- if ! grep -Fxq "${param_name}" $COMPLETION_FILE; then
- echo "${param_name}" >> $COMPLETION_FILE
- fi
- else
- echo "${param_name}" > $COMPLETION_FILE
- fi
- fi
- }
-
- function is_completed {
- param_name="$1"
-
- if [ ! $COMPLETION_FILE ]; then
- COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
- fi
- if [ ${#COMPLETION_FILE} -eq 0 ]; then
- COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
- fi
-
- if [ ${#param_name} -gt 0 ]; then
- if [ -f $COMPLETION_FILE ]; then
- if grep -Fxq "${param_name}" $COMPLETION_FILE; then
- echo "1"
- return
- fi
- fi
- fi
- echo "0"
- }
-
- function read_config_param {
- param_name="$1"
-
- if [ ${#param_name} -gt 0 ]; then
- if [ $CONFIGURATION_FILE ]; then
- if [ -f $CONFIGURATION_FILE ]; then
- if grep -q "${param_name}=" $CONFIGURATION_FILE; then
- param_value=$(cat $CONFIGURATION_FILE | grep "${param_name}=" | head -n 1 | awk -F '=' '{print $2}')
- if [[ "${param_value}" != *" "* ]]; then
- export ${param_name}=${param_value}
- else
- export ${param_name}="${param_value}"
- fi
- fi
- fi
- fi
- fi
- }
-
- function config_param_exists {
- param_name="$1"
-
- if [ ${#param_name} -gt 0 ]; then
- if [ $CONFIGURATION_FILE ]; then
- if [ -f $CONFIGURATION_FILE ]; then
- if grep -q "${param_name}=" $CONFIGURATION_FILE; then
- param_value=$(cat $CONFIGURATION_FILE | grep "${param_name}=" | head -n 1 | awk -F '=' '{print $2}')
- if [ ${#param_value} -gt 0 ]; then
- echo "1"
- return
- fi
- fi
- fi
- fi
- fi
- echo "0"
- }
-
- function write_config_param {
- param_name="$1"
- param_value="$2"
-
- if [ ! $CONFIGURATION_FILE ]; then
- CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
- fi
- if [ ${#CONFIGURATION_FILE} -eq 0 ]; then
- CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
- fi
-
- if [ ${#param_name} -gt 0 ]; then
- if [ ${#param_value} -gt 0 ]; then
- if [ -f $CONFIGURATION_FILE ]; then
- if grep -q "${param_name}=" $CONFIGURATION_FILE; then
- sed -i "s|${param_name}=.*|${param_name}=${param_value}|g" $CONFIGURATION_FILE
- else
- echo "${param_name}=${param_value}" >> $CONFIGURATION_FILE
- fi
- else
- echo "${param_name}=${param_value}" > $CONFIGURATION_FILE
- fi
- fi
- fi
- }
-
- function remove_config_param {
- param_name="$1"
-
- if [ ${#param_name} -gt 0 ]; then
- if [ $CONFIGURATION_FILE ]; then
- if [ -f $CONFIGURATION_FILE ]; then
- if grep -q "${param_name}=" $CONFIGURATION_FILE; then
- sed -i "/${param_name}=/d" $CONFIGURATION_FILE
- fi
- fi
- fi
- fi
- }
-
- function remove_completion_param {
- param_name="$1"
-
- if [ ${#param_name} -gt 0 ]; then
- if [ $COMPLETION_FILE ]; then
- if [ -f $COMPLETION_FILE ]; then
- if grep -Fxq "${param_name}" $COMPLETION_FILE; then
- sed -i "/${param_name}/d" $COMPLETION_FILE
- fi
- if grep -q "${param_name}:" $COMPLETION_FILE; then
- sed -i "/${param_name}:/d" $COMPLETION_FILE
- fi
- fi
- fi
- fi
- }
-
- function save_configuration_values {
- for v in "${configuration_variables[@]}"
- do
- write_config_param "$v" "${!v}"
- done
- }
-
- function read_configuration_values {
- # if not installing on a Beaglebone then use sdb as the USB drive by default
- if [ ! $INSTALLING_ON_BBB ]; then
- if [[ $USB_DRIVE == /dev/sda1 ]]; then
- USB_DRIVE=/dev/sdb1
- fi
- fi
-
- if [ -f $CONFIGURATION_FILE ]; then
- read_repo_servers
-
- # Ensure that a copy of the config exists for upgrade purposes
- if [[ $CONFIGURATION_FILE != "/root/${PROJECT_NAME}.cfg" ]]; then
- cp $CONFIGURATION_FILE /root/${PROJECT_NAME}.cfg
- fi
-
- for v in "${configuration_variables[@]}"
- do
- read_config_param "$v"
- done
-
- if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
- read_config_param "DEBIAN_REPO"
- CHECK_MESSAGE=$"Check your internet connection, /etc/network/interfaces and /etc/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."
- fi
- fi
- }
-
- function read_configuration {
- if [[ $INSTALLING_FROM_CONFIGURATION_FILE == "yes" ]]; then
- if [ ! -f $CONFIGURATION_FILE ]; then
- echo $"The configuration file $CONFIGURATION_FILE was not found"
- exit 8935
- fi
- fi
-
- read_configuration_values
- }
-
- function check_system_type {
- if [ ${#SYSTEM_TYPE} -eq 0 ]; then
- echo $'Unknown system type'
- exit 763572
- fi
- echo "System type: $SYSTEM_TYPE"
- }
-
- # check that domain names are valid and that they are unique for each app
- function check_domains {
- specified_domains=$(cat $CONFIGURATION_FILE | grep "_DOMAIN_NAME" | uniq)
- domains_array=($specified_domains)
- checked_domains=()
-
- for d in "${domains_array[@]}"
- do
- domain_param=$(echo "$d" | awk -F '=' '{print $1}')
- if [[ "$domain_param" != "DEFAULT_DOMAIN_NAME" ]]; then
- domain_value=$(echo "$d" | awk -F '=' '{print $2}')
- if [[ "$domain_value" != "${PROJECT_NAME}.local" ]]; then
- item_in_array "${domain_value}" "${checked_domains[@]}"
- if [[ $? != 0 ]]; then
- # test that this is a valid domain name
- function_check test_domain_name
- test_domain_name "$domain_value"
- # add it to the list of domains
- checked_domains+=("$domain_value")
- else
- echo $"Domain ${domain_value} collides with another app. The domain for each app should be unique."
- exit 673925
- fi
- fi
- fi
- done
- }
-
- # NOTE: deliberately no exit 0
|