| 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
 
 
  |