| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435 | #!/bin/bash
#
# .---.                  .              .
# |                      |              |
# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
#
#                    Freedom in the Cloud
#
# Interactively creates a configuration file for use with the main
# freedombone command
#
# License
# =======
#
# Copyright (C) 2015 Bob Mottram <bob@robotics.uk.to>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
NO_OF_ARGS=$#
# Web site
FREEDOMBONE_WEBSITE="http://freedombone.uk.to"
# Contact details
FREEDOMBONE_BITMESSAGE="BM-2cWuhmBvVdfrHhLoZTdspCkKeiTorUesSL"
# Minimum number of characters in a password
MINIMUM_PASSWORD_LENGTH=10
# Different system variants which may be specified within
# the SYSTEM_TYPE option
VARIANT_FULL="full"
VARIANT_WRITER="writer"
VARIANT_CLOUD="cloud"
VARIANT_CHAT="chat"
VARIANT_MAILBOX="mailbox"
VARIANT_NONMAILBOX="nonmailbox"
VARIANT_SOCIAL="social"
VARIANT_MEDIA="media"
VARIANT_DEVELOPER="developer"
MY_USERNAME=
DEFAULT_DOMAIN_NAME=
DEFAULT_DOMAIN_CODE=
MY_EMAIL_ADDRESS=
SYSTEM_TYPE=
INSTALLING_ON_BBB=
DDNS_PROVIDER=
DDNS_USERNAME=
DDNS_PASSWORD=
MY_NAME=
LOCAL_NETWORK_STATIC_IP_ADDRESS=
ROUTER_IP_ADDRESS=
ENABLE_CJDNS=
ENABLE_BATMAN=
DEBIAN_REPO=
NAMESERVER1=
NAMESERVER2=
WIKI_TITLE=
WIKI_DOMAIN_NAME=
WIKI_CODE=
MY_BLOG_TITLE=
FULLBLOG_DOMAIN_NAME=
FULLBLOG_CODE=
OWNCLOUD_DOMAIN_NAME=
OWNCLOUD_CODE=
REDMATRIX_DOMAIN_NAME=
REDMATRIX_CODE=
MICROBLOG_DOMAIN_NAME=
MICROBLOG_CODE=
GIT_DOMAIN_NAME=
GIT_CODE=
MEDIAGOBLIN_DOMAIN_NAME=
MEDIAGOBLIN_CODE=
USB_DRIVE=/dev/sdb1
HWRNG_TYPE=
ENABLE_SOCIAL_KEY_MANAGEMENT=
CONFIGURATION_FILE=
function show_help {
  echo ''
  echo 'freedombone-config -f [config filename] -m [min password length]'
  echo ''
  echo 'Creates an inventory of remote backup locations'
  echo ''
  echo ''
  echo '  -h --help             Show help'
  echo '  -f --filename         Configuration file (usually freedombone.cfg)'
  echo '  -m --min              Minimum password length (characters)'
  echo '  -w --www              Freedombone web site'
  echo '  -b --bm               Freedombone support Bitmessage address'
  echo ''
  exit 0
}
# Get the commandline options
while [[ $# > 1 ]]
do
key="$1"
case $key in
    -h|--help)
    show_help
    ;;
    # Configuration filename
    -f|--filename)
    shift
    CONFIGURATION_FILE="$1"
    ;;
    # Minimum password length
    -m|--min)
    shift
    MINIMUM_PASSWORD_LENGTH="$1"
    ;;
    # Freedombone website
    -w|--www)
    shift
    FREEDOMBONE_WEBSITE="$1"
    ;;
    # Bitmessage address for support
    -b|--bm)
    shift
    FREEDOMBONE_BITMESSAGE="$1"
    ;;
    *)
    # unknown option
    ;;
esac
shift
done
function save_configuration_file {
  if [ ! $CONFIGURATION_FILE ]; then
      CONFIGURATION_FILE='freedombone.cfg'
  fi
  echo "MY_USERNAME=$MY_USERNAME" > $CONFIGURATION_FILE
  echo "DEFAULT_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME" >> $CONFIGURATION_FILE
  if [ $DEFAULT_DOMAIN_CODE ]; then
      echo "DEFAULT_DOMAIN_CODE=$DEFAULT_DOMAIN_CODE" >> $CONFIGURATION_FILE
  fi
  echo "SYSTEM_TYPE=$SYSTEM_TYPE" >> $CONFIGURATION_FILE
  echo "INSTALLING_ON_BBB=$INSTALLING_ON_BBB" >> $CONFIGURATION_FILE
  echo "USB_DRIVE=$USB_DRIVE" >> $CONFIGURATION_FILE
  echo "DDNS_PROVIDER=$DDNS_PROVIDER" >> $CONFIGURATION_FILE
  echo "DDNS_USERNAME=$DDNS_USERNAME" >> $CONFIGURATION_FILE
  echo "DDNS_PASSWORD=$DDNS_PASSWORD" >> $CONFIGURATION_FILE
  echo "MY_NAME=$MY_NAME" >> $CONFIGURATION_FILE
  echo "MY_EMAIL_ADDRESS=$MY_EMAIL_ADDRESS" >> $CONFIGURATION_FILE
  echo "LOCAL_NETWORK_STATIC_IP_ADDRESS=$LOCAL_NETWORK_STATIC_IP_ADDRESS" >> $CONFIGURATION_FILE
  echo "ROUTER_IP_ADDRESS=$ROUTER_IP_ADDRESS" >> $CONFIGURATION_FILE
  if [ $ENABLE_CJDNS ]; then
      echo "ENABLE_CJDNS=$ENABLE_CJDNS" >> $CONFIGURATION_FILE
  fi
  if [ $ENABLE_BATMAN ]; then
      echo "ENABLE_BATMAN=$ENABLE_BATMAN" >> $CONFIGURATION_FILE
  fi
  echo "DEBIAN_REPO=$DEBIAN_REPO" >> $CONFIGURATION_FILE
  echo "NAMESERVER1=$NAMESERVER1" >> $CONFIGURATION_FILE
  echo "NAMESERVER2=$NAMESERVER2" >> $CONFIGURATION_FILE
  if [ $WIKI_TITLE ]; then
      echo "WIKI_TITLE=$WIKI_TITLE" >> $CONFIGURATION_FILE
  fi
  if [ $WIKI_DOMAIN_NAME ]; then
      echo "WIKI_DOMAIN_NAME=$WIKI_DOMAIN_NAME" >> $CONFIGURATION_FILE
  fi
  if [ $WIKI_CODE ]; then
      echo "WIKI_CODE=$WIKI_CODE" >> $CONFIGURATION_FILE
  fi
  if [ $MY_BLOG_TITLE ]; then
      echo "MY_BLOG_TITLE=$MY_BLOG_TITLE" >> $CONFIGURATION_FILE
  fi
  if [ $FULLBLOG_DOMAIN_NAME ]; then
      echo "FULLBLOG_DOMAIN_NAME=$FULLBLOG_DOMAIN_NAME" >> $CONFIGURATION_FILE
  fi
  if [ $FULLBLOG_CODE ]; then
      echo "FULLBLOG_CODE=$FULLBLOG_CODE" >> $CONFIGURATION_FILE
  fi
  if [ $OWNCLOUD_DOMAIN_NAME ]; then
      echo "OWNCLOUD_DOMAIN_NAME=$OWNCLOUD_DOMAIN_NAME" >> $CONFIGURATION_FILE
  fi
  if [ $OWNCLOUD_CODE ]; then
      echo "OWNCLOUD_CODE=$OWNCLOUD_CODE" >> $CONFIGURATION_FILE
  fi
  if [ $REDMATRIX_DOMAIN_NAME ]; then
      echo "REDMATRIX_DOMAIN_NAME=$REDMATRIX_DOMAIN_NAME" >> $CONFIGURATION_FILE
  fi
  if [ $REDMATRIX_CODE ]; then
      echo "REDMATRIX_CODE=$REDMATRIX_CODE" >> $CONFIGURATION_FILE
  fi
  if [ $MICROBLOG_DOMAIN_NAME ]; then
      echo "MICROBLOG_DOMAIN_NAME=$MICROBLOG_DOMAIN_NAME" >> $CONFIGURATION_FILE
  fi
  if [ $MICROBLOG_CODE ]; then
      echo "MICROBLOG_CODE=$MICROBLOG_CODE" >> $CONFIGURATION_FILE
  fi
  if [ $GIT_DOMAIN_NAME ]; then
      echo "GIT_DOMAIN_NAME=$GIT_DOMAIN_NAME" >> $CONFIGURATION_FILE
  fi
  if [ $GIT_CODE ]; then
      echo "GIT_CODE=$GIT_CODE" >> $CONFIGURATION_FILE
  fi
  if [ $MEDIAGOBLIN_DOMAIN_NAME ]; then
      echo "MEDIAGOBLIN_DOMAIN_NAME=$MEDIAGOBLIN_DOMAIN_NAME" >> $CONFIGURATION_FILE
  fi
  if [ $MEDIAGOBLIN_CODE ]; then
      echo "MEDIAGOBLIN_CODE=$MEDIAGOBLIN_CODE" >> $CONFIGURATION_FILE
  fi
  if [ $HWRNG_TYPE ]; then
      echo "HWRNG_TYPE=$HWRNG_TYPE" >> $CONFIGURATION_FILE
  fi
  if [ $ENABLE_SOCIAL_KEY_MANAGEMENT ]; then
      echo "ENABLE_SOCIAL_KEY_MANAGEMENT=$ENABLE_SOCIAL_KEY_MANAGEMENT" >> $CONFIGURATION_FILE
  fi
}
# test a domain name to see if it's valid
function validate_domain_name {
  # count the number of dots in the domain name
  dots=${TEST_DOMAIN_NAME//[^.]}
  no_of_dots=${#dots}
  if (( no_of_dots > 3 )); then
      TEST_DOMAIN_NAME="The domain $TEST_DOMAIN_NAME has too many subdomains. It should be of the type w.x.y.z, x.y.z or y.z"
  fi
  if (( no_of_dots == 0 )); then
      TEST_DOMAIN_NAME="The domain $TEST_DOMAIN_NAME has no top level domain. It should be of the type w.x.y.z, x.y.z or y.z"
  fi
}
function interactive_gpg_from_remote {
  REMOTE_SERVERS_LIST=/home/$MY_USERNAME/keyshareservers.txt
  # get a list of remote servers
  freedombone-remote -u $MY_USERNAME -l $REMOTE_SERVERS_LIST -t "Remote server"
  if [ ! -f $REMOTE_SERVERS_LIST ]; then
      dialog --title "Encryption keys" --msgbox 'Error obtaining server list' 6 70
      return 1
  fi
  # check the number of entries in the file
  no_of_servers=$(cat $REMOTE_SERVERS_LIST | wc -l)
  if (( no_of_servers < 3 )); then
      dialog --title "Encryption keys" \
             --msgbox 'There must be at least three servers to recover the key' 6 70
      return 2
  fi
  # try to recover the key from the servers
  apt-get -y install libgfshare-bin gnupg
  freedombone-recoverkey -u $MY_USERNAME -l $REMOTE_SERVERS_LIST
  if [ ! "$?" = "0" ]; then
      dialog --title "Encryption keys" --msgbox 'Your key could not be recovered' 6 70
      return 3
  fi
  dialog --title "Encryption keys" --msgbox 'Your key has been recovered' 6 70
  return 0
}
function reconstruct_key {
    if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
        return
    fi
    cd /home/$MY_USERNAME/.gnupg_fragments
    no_of_shares=$(ls -afq keyshare.asc.* | wc -l)
    if (( no_of_shares < 4 )); then
        dialog --title "Encryption keys" --msgbox 'Not enough fragments to reconstruct the key' 6 70
        exit 7348
    fi
    apt-get -y install libgfshare-bin gnupg
    gfcombine /home/$MY_USERNAME/.gnupg_fragments/keyshare*
    if [ ! "$?" = "0" ]; then
        dialog --title "Encryption keys" --msgbox 'Unable to reconstruct the key' 6 70
        exit 7348
    fi
    KEYS_FILE=/home/$MY_USERNAME/.gnupg_fragments/keyshare.asc
    if [ ! -f $KEYS_FILE ]; then
        dialog --title "Encryption keys" --msgbox 'Unable to reconstruct the key' 6 70
    fi
    su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME
    if [ ! "$?" = "0" ]; then
        echo 'Unable to import gpg key'
        shred -zu $KEYS_FILE
        rm -rf /home/$MY_USERNAME/.tempgnupg
        exit 9654
    fi
    shred -zu $KEYS_FILE
    dialog --title "Encryption keys" --msgbox 'Key has been reconstructed' 6 70
}
function interactive_gpg_from_usb {
    dialog --title "Encryption keys" \
           --msgbox 'Plug in a USB drive containing a copy of your full key or key fragment' 6 70
  HOME_DIR=/home/$MY_USERNAME
  GPG_LOADING="yes"
  SSH_IMPORTED="no"
  GPG_CTR=0
  while [[ $GPG_LOADING == "yes" ]]
  do
      if [[ $INSTALLING_ON_BBB == "yes" ]]; then
          GPG_USB_DRIVE='/dev/sda1'
          if [ ! -b $GPG_USB_DRIVE ]; then
              if (( GPG_CTR > 0 )); then
                  reconstruct_key
                  return 0
              fi
              dialog --title "Encryption keys" --msgbox 'No USB drive found' 6 30
              exit 739836
          fi
      else
          GPG_USB_DRIVE='/dev/sdb1'
          if [ ! -b $GPG_USB_DRIVE ]; then
              GPG_USB_DRIVE='/dev/sdc1'
              if [ ! -b $GPG_USB_DRIVE ]; then
                  GPG_USB_DRIVE='/dev/sdd1'
                  if [ ! -b $GPG_USB_DRIVE ]; then
                      if (( GPG_CTR > 0 )); then
                          reconstruct_key
                          return 0
                      fi
                      dialog --title "Encryption keys" --msgbox 'No USB drive found' 6 30
                      exit 27852
                  fi
              fi
          fi
      fi
      GPG_USB_MOUNT='/mnt/usb'
      umount -f $GPG_USB_MOUNT
      if [ ! -d $GPG_USB_MOUNT ]; then
          mkdir -p $GPG_USB_MOUNT
      fi
      if [ -f /dev/mapper/encrypted_usb ]; then
          rm -rf /dev/mapper/encrypted_usb
      fi
      cryptsetup luksClose encrypted_usb
      cryptsetup luksOpen $GPG_USB_DRIVE encrypted_usb
      if [ "$?" = "0" ]; then
          GPG_USB_DRIVE=/dev/mapper/encrypted_usb
      fi
      mount $GPG_USB_DRIVE $GPG_USB_MOUNT
      if [ ! "$?" = "0" ]; then
          if (( GPG_CTR > 0 )); then
              rm -rf $GPG_USB_MOUNT
              reconstruct_key
              return 0
          fi
          dialog --title "Encryption keys" \
                 --msgbox "There was a problem mounting the USB drive to $GPG_USB_MOUNT" 6 70
          rm -rf $GPG_USB_MOUNT
          exit 74393
      fi
      if [ ! -d $GPG_USB_MOUNT/.gnupg ]; then
          if [ ! -d $GPG_USB_MOUNT/.gnupg_fragments ]; then
              if (( GPG_CTR > 0 )); then
                  umount -f $GPG_USB_MOUNT
                  rm -rf $GPG_USB_MOUNT
                  reconstruct_key
                  return 0
              fi
              dialog --title "Encryption keys" \
                     --msgbox "The directory $GPG_USB_MOUNT/.gnupg or $GPG_USB_MOUNT/.gnupg_fragments was not found" 6 70
              umount -f $GPG_USB_MOUNT
              rm -rf $GPG_USB_MOUNT
              exit 723814
          fi
      fi
      if [ -d $GPG_USB_MOUNT/.gnupg ]; then
          if [ ! -d $HOME_DIR/.gnupg ]; then
              mkdir $HOME_DIR/.gnupg
          fi
          cp -r $GPG_USB_MOUNT/.gnupg/* $HOME_DIR/.gnupg
          GPG_LOADING="no"
          dialog --title "Encryption keys" \
                 --msgbox "GPG Keyring loaded to $HOME_DIR" 6 70
      else
          if [ ! -d $HOME_DIR/.gnupg_fragments ]; then
              mkdir $HOME_DIR/.gnupg_fragments
          fi
          cp -r $GPG_USB_MOUNT/.gnupg_fragments/* $HOME_DIR/.gnupg_fragments
      fi
      if [[ $SSH_IMPORTED == "no" ]]; then
          if [ -d $GPG_USB_MOUNT/.ssh ]; then
              if [ ! -d $HOME_DIR/.ssh ]; then
                  mkdir $HOME_DIR/.ssh
              fi
              cp $GPG_USB_MOUNT/.ssh/* $HOME_DIR/.ssh
              dialog --title "Encryption keys" \
                     --msgbox "ssh keys imported" 6 70
              SSH_IMPORTED="yes"
          fi
      fi
      umount -f $GPG_USB_MOUNT
      rm -rf $GPG_USB_MOUNT
      if [[ $GPG_LOADING == "yes" ]]; then
          dialog --title "Encryption keys" \
                 --msgbox "Now remove the USB drive. Insert the next drive containing a key fragment, or select Ok to finish" 6 70
      fi
      GPG_CTR=$((GPG_CTR + 1))
  done
}
function interactive_gpg {
  GPG_CONFIGURED="no"
  while [[ $GPG_CONFIGURED != "yes" ]]
  do
      GPG_CONFIGURED="yes"
      data=$(tempfile 2>/dev/null)
      trap "rm -f $data" 0 1 2 5 15
      dialog --backtitle "Freedombone Configuration" \
          --radiolist "GPG/PGP keys for your system:" 13 70 3 \
          1 "Generate new keys (new user)" on \
          2 "Import keys from USB drive/s" off \
          3 "Retrieve keys from friends servers" off 2> $data
      sel=$?
      case $sel in
          1) exit 1;;
          255) exit 2;;
      esac
      case $(cat $data) in
          1) return;;
          2) interactive_gpg_from_usb
             return;;
          3) interactive_gpg_from_remote
             if [ ! "$?" = "0" ]; then
                 GPG_CONFIGURED="no"
             fi;;
      esac
  done
}
function interactive_configuration {
  # create a temporary copy of the configuration file
  # which can be used to pre-populate selections
  if [ -f $CONFIGURATION_FILE ]; then
      cp $CONFIGURATION_FILE temp.cfg
  fi
  FREEDNS_MESSAGE="Please enter the FreeDNS code for this domain.\n\nThe code can be found by going to https://freedns.afraid.org, selecting 'Dynamic DNS' and then opening 'Wget example'. The code will consist of letters and numbers and be between the ? and = characters."
  dialog --title "Freedombone" --msgbox "Welcome to the Freedombone interactive installer. Communications freedom is only a short time away.\n\nEnsure that you have your domain and dynamic DNS settings ready.\n\nFor more information please visit $FREEDOMBONE_WEBSITE or send a Bitmessage to $FREEDOMBONE_BITMESSAGE" 15 50
  data=$(tempfile 2>/dev/null)
  trap "rm -f $data" 0 1 2 5 15
  dialog --backtitle "Freedombone Configuration" \
      --radiolist "Type of Installation:" 17 40 9 \
      1 Full on \
      2 Writer off \
      3 Cloud off \
      4 Chat off \
      5 Mailbox off \
      6 Non-Mailbox off \
      7 Social off \
      8 Media off \
      9 Developer off 2> $data
  sel=$?
  case $sel in
      1) exit 1;;
      255) exit 1;;
  esac
  case $(cat $data) in
      1) SYSTEM_TYPE=$VARIANT_FULL;;
      2) SYSTEM_TYPE=$VARIANT_WRITER;;
      3) SYSTEM_TYPE=$VARIANT_CLOUD;;
      4) SYSTEM_TYPE=$VARIANT_CHAT;;
      5) SYSTEM_TYPE=$VARIANT_MAILBOX;;
      6) SYSTEM_TYPE=$VARIANT_NONMAILBOX;;
      7) SYSTEM_TYPE=$VARIANT_SOCIAL;;
      8) SYSTEM_TYPE=$VARIANT_MEDIA;;
      9) SYSTEM_TYPE=$VARIANT_DEVELOPER;;
  esac
  save_configuration_file
  data=$(tempfile 2>/dev/null)
  trap "rm -f $data" 0 1 2 5 15
  dialog --title "Select the user account to install as" \
      --backtitle "Freedombone Configuration" \
      --dselect "/home/$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')" 14 40 2> $data
  sel=$?
  case $sel in
      0) MY_USERNAME=$(cat $data | awk -F '/' '{print $3}');;
      1) exit 1;;
      255) exit 1;;
  esac
  if [ ! $MY_USERNAME ]; then
      echo 'No user account was selected'
      exit 64398
  fi
  if [[ $MY_USERNAME == '-f' ]]; then
      echo 'No user account was selected'
      exit 8347
  fi
  if [[ $MY_USERNAME == 'debian' ]]; then
      echo "Don't use the default debian user account"
      exit 9341
  fi
  if [ ! -d /home/$MY_USERNAME ]; then
      echo "The directory /home/$MY_USERNAME does not exist"
      exit 6437
  fi
  save_configuration_file
  if [[ $(grep "INSTALLING_ON_BBB" temp.cfg | awk -F '=' '{print $2}') == "yes" ]]; then
      dialog --title "Install Target" \
          --backtitle "Freedombone Configuration" \
          --yesno "\nAre you installing onto a Beaglebone Black?" 7 60
  else
      dialog --title "Install Target" \
          --backtitle "Freedombone Configuration" \
          --defaultno \
          --yesno "\nAre you installing onto a Beaglebone Black?" 7 60
  fi
  sel=$?
  case $sel in
      0) INSTALLING_ON_BBB="yes";;
      1) INSTALLING_ON_BBB="no";;
      255) exit 1;;
  esac
  if [[ $INSTALLING_ON_BBB == "yes" ]]; then
      USB_DRIVE=/dev/sda1
  fi
  save_configuration_file
  interactive_gpg
  data=$(tempfile 2>/dev/null)
  trap "rm -f $data" 0 1 2 5 15
  SOCIAL_KEY_STR="\nDo you wish to enable social key management, otherwise known as \"the unforgettable key\"?\n\nThis means that fragments of your GPG key will be included with any remote backups so that if you later lose your key then it can be reconstructed from your friends servers. If you select \"no\" then you can still do social key management, but offline using physical USB thumb drives, which is more secure but less convenient."
  if [[ $(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" temp.cfg | awk -F '=' '{print $2}') == "yes" ]]; then
      dialog --title "Social Key Management" \
             --backtitle "Freedombone Configuration" \
             --yesno "$SOCIAL_KEY_STR" 15 60
  else
      dialog --title "Social Key Management" \
             --backtitle "Freedombone Configuration" \
             --defaultno \
             --yesno "$SOCIAL_KEY_STR" 15 60
  fi
  sel=$?
  case $sel in
      0) ENABLE_SOCIAL_KEY_MANAGEMENT="yes";;
      255) exit 1;;
  esac
  save_configuration_file
  data=$(tempfile 2>/dev/null)
  trap "rm -f $data" 0 1 2 5 15
  if [[ $INSTALLING_ON_BBB == "no" ]]; then
      dialog --backtitle "Freedombone Configuration" \
          --radiolist "Type of Random Number Generator:" 10 40 3 \
          1 Haveged on \
          2 "Beaglebone built-in HRNG" off \
          3 OneRNG off 2> $data
  else
      dialog --backtitle "Freedombone Configuration" \
          --radiolist "Type of Random Number Generator:" 10 40 3 \
          1 Haveged off \
          2 "Beaglebone built-in HRNG" on \
          3 OneRNG off 2> $data
  fi
  sel=$?
  case $sel in
      1) exit 1;;
      255) exit 1;;
  esac
  case $(cat $data) in
      2) HWRNG_TYPE="beaglebone";;
      3) HWRNG_TYPE="onerng"
         dialog --title "OneRNG Device" \
                --msgbox "Please ensure that the OneRNG device is disconnected. You can reconnect it later during the installation" 8 60
         ;;
      255) exit 1;;
  esac
  save_configuration_file
  data=$(tempfile 2>/dev/null)
  trap "rm -f $data" 0 1 2 5 15
  dialog --backtitle "Freedombone Configuration" \
      --radiolist "Where to download Debian packages from:" 25 45 49 \
      1 "Australia" off \
      2 "Austria" off \
      3 "Belarus" off \
      4 "Belgium" off \
      5 "Bosnia and Herzegovina" off \
      6 "Brazil" off \
      7 "Bulgaria" off \
      8 "Canada" off \
      9 "Chile" off \
      10 "China" off \
      11 "Croatia" off \
      12 "Czech Republic" off \
      13 "Denmark" off \
      14 "El Salvador" off \
      15 "Estonia" off \
      16 "Finland" off \
      17 "France 1" off \
      18 "France 2" off \
      19 "Germany 1" off \
      20 "Germany 2" off \
      21 "Greece" off \
      22 "Hungary" off \
      23 "Iceland" off \
      24 "Iran" off \
      25 "Ireland" off \
      26 "Italy" off \
      27 "Japan" off \
      28 "Korea" off \
      29 "Lithuania" off \
      30 "Mexico" off \
      31 "Netherlands" off \
      32 "New Caledonia" off \
      33 "New Zealand" off \
      34 "Norway" off \
      35 "Poland" off \
      36 "Portugal" off \
      37 "Romania" off \
      38 "Russia" off \
      39 "Slovakia" off \
      40 "Slovenia" off \
      41 "Spain" off \
      42 "Sweden" off \
      43 "Switzerland" off \
      44 "Taiwan" off \
      45 "Thailand" off \
      46 "Turkey" off \
      47 "Ukraine" off \
      48 "United Kingdom" off \
      49 "United States" on 2> $data
  sel=$?
  case $sel in
      1) exit 1;;
      255) exit 1;;
  esac
  case $(cat $data) in
      1) DEBIAN_REPO='ftp.au.debian.org';;
      2) DEBIAN_REPO='ftp.at.debian.org';;
      3) DEBIAN_REPO='ftp.by.debian.org';;
      4) DEBIAN_REPO='ftp.be.debian.org';;
      5) DEBIAN_REPO='ftp.ba.debian.org';;
      6) DEBIAN_REPO='ftp.br.debian.org';;
      7) DEBIAN_REPO='ftp.bg.debian.org';;
      8) DEBIAN_REPO='ftp.ca.debian.org';;
      9) DEBIAN_REPO='ftp.cl.debian.org';;
      10) DEBIAN_REPO='ftp.cn.debian.org';;
      11) DEBIAN_REPO='ftp.hr.debian.org';;
      12) DEBIAN_REPO='ftp.cz.debian.org';;
      13) DEBIAN_REPO='ftp.dk.debian.org';;
      14) DEBIAN_REPO='ftp.sv.debian.org';;
      15) DEBIAN_REPO='ftp.ee.debian.org';;
      16) DEBIAN_REPO='ftp.fi.debian.org';;
      17) DEBIAN_REPO='ftp2.fr.debian.org';;
      18) DEBIAN_REPO='ftp.fr.debian.org';;
      19) DEBIAN_REPO='ftp2.de.debian.org';;
      20) DEBIAN_REPO='ftp.de.debian.org';;
      21) DEBIAN_REPO='ftp.gr.debian.org';;
      22) DEBIAN_REPO='ftp.hu.debian.org';;
      23) DEBIAN_REPO='ftp.is.debian.org';;
      24) DEBIAN_REPO='ftp.ir.debian.org';;
      25) DEBIAN_REPO='ftp.ie.debian.org';;
      26) DEBIAN_REPO='ftp.it.debian.org';;
      27) DEBIAN_REPO='ftp.jp.debian.org';;
      28) DEBIAN_REPO='ftp.kr.debian.org';;
      29) DEBIAN_REPO='ftp.lt.debian.org';;
      30) DEBIAN_REPO='ftp.mx.debian.org';;
      31) DEBIAN_REPO='ftp.nl.debian.org';;
      32) DEBIAN_REPO='ftp.nc.debian.org';;
      33) DEBIAN_REPO='ftp.nz.debian.org';;
      34) DEBIAN_REPO='ftp.no.debian.org';;
      35) DEBIAN_REPO='ftp.pl.debian.org';;
      36) DEBIAN_REPO='ftp.pt.debian.org';;
      37) DEBIAN_REPO='ftp.ro.debian.org';;
      38) DEBIAN_REPO='ftp.ru.debian.org';;
      39) DEBIAN_REPO='ftp.sk.debian.org';;
      40) DEBIAN_REPO='ftp.si.debian.org';;
      41) DEBIAN_REPO='ftp.es.debian.org';;
      42) DEBIAN_REPO='ftp.se.debian.org';;
      43) DEBIAN_REPO='ftp.ch.debian.org';;
      44) DEBIAN_REPO='ftp.tw.debian.org';;
      45) DEBIAN_REPO='ftp.th.debian.org';;
      46) DEBIAN_REPO='ftp.tr.debian.org';;
      47) DEBIAN_REPO='ftp.ua.debian.org';;
      48) DEBIAN_REPO='ftp.uk.debian.org';;
      49) DEBIAN_REPO='ftp.us.debian.org';;
      255) exit 1;;
  esac
  save_configuration_file
  data=$(tempfile 2>/dev/null)
  trap "rm -f $data" 0 1 2 5 15
  dialog --backtitle "Freedombone Configuration" \
      --radiolist "Pick a domain name service (DNS):" 25 50 16 \
      1 "Digital Courage" on \
      2 "German Privacy Foundation 1" off \
      3 "German Privacy Foundation 2" off \
      4 "Chaos Computer Club" off \
      5 "ClaraNet" off \
      6 "OpenNIC 1" off \
      7 "OpenNIC 2" off \
      8 "OpenNIC 3" off \
      9 "OpenNIC 4" off \
      10 "OpenNIC 5" off \
      11 "OpenNIC 6" off \
      12 "OpenNIC 7" off \
      13 "PowerNS" off \
      14 "ValiDOM" off \
      15 "Freie Unzensierte" off \
      16 "Google" off 2> $data
  sel=$?
  case $sel in
      1) exit 1;;
      255) exit 1;;
  esac
  case $(cat $data) in
      1) NAMESERVER1='85.214.73.63'
         NAMESERVER2='213.73.91.35'
         ;;
      2) NAMESERVER1='87.118.100.175'
         NAMESERVER2='94.75.228.29'
         ;;
      3) NAMESERVER1='85.25.251.254'
         NAMESERVER2='2.141.58.13'
         ;;
      4) NAMESERVER1='213.73.91.35'
         NAMESERVER2='85.214.73.63'
         ;;
      5) NAMESERVER1='212.82.225.7'
         NAMESERVER2='212.82.226.212'
         ;;
      6) NAMESERVER1='58.6.115.42'
         NAMESERVER2='58.6.115.43'
         ;;
      7) NAMESERVER1='119.31.230.42'
         NAMESERVER2='200.252.98.162'
         ;;
      8) NAMESERVER1='217.79.186.148'
         NAMESERVER2='81.89.98.6'
         ;;
      9) NAMESERVER1='78.159.101.37'
         NAMESERVER2='203.167.220.153'
         ;;
      10) NAMESERVER1='82.229.244.191'
          NAMESERVER2='82.229.244.191'
          ;;
      11) NAMESERVER1='216.87.84.211'
          NAMESERVER2='66.244.95.20'
          ;;
      12) NAMESERVER1='207.192.69.155'
          NAMESERVER2='72.14.189.120'
          ;;
      13) NAMESERVER1='194.145.226.26'
          NAMESERVER2='77.220.232.44'
          ;;
      14) NAMESERVER1='78.46.89.147'
          NAMESERVER2='88.198.75.145'
          ;;
      15) NAMESERVER1='85.25.149.144'
          NAMESERVER2='87.106.37.196'
          ;;
      16) NAMESERVER1='8.8.8.8'
          NAMESERVER2='4.4.4.4'
          ;;
      255) exit 1;;
  esac
  save_configuration_file
  data=$(tempfile 2>/dev/null)
  trap "rm -f $data" 0 1 2 5 15
  dialog --backtitle "Freedombone Configuration" \
      --radiolist "Choose Dynamic DNS provider:" 15 40 14 \
      1 dyndns off \
      2 freedns on \
      3 zoneedit off \
      4 no-ip off \
      5 easydns off \
      6 tzo off \
      7 3322 off \
      8 dnsomatic off \
      9 tunnelbroker off \
      10 dns.he.net off \
      11 dynsip off \
      12 sitelutions off \
      13 dnsexit off \
      14 changeip off 2> $data
  sel=$?
  case $sel in
      1) exit 1;;
      255) exit 1;;
  esac
  case $(cat $data) in
      1) DDNS_PROVIDER="default@dyndns.org";;
      2) DDNS_PROVIDER="default@freedns.afraid.org";;
      3) DDNS_PROVIDER="default@zoneedit.com";;
      4) DDNS_PROVIDER="default@no-ip.com";;
      5) DDNS_PROVIDER="default@easydns.com";;
      6) DDNS_PROVIDER="default@tzo.com";;
      7) DDNS_PROVIDER="dyndns@3322.org";;
      8) DDNS_PROVIDER="default@dnsomatic.com";;
      9) DDNS_PROVIDER="ipv6tb@he.net";;
      10) DDNS_PROVIDER="dyndns@he.net";;
      11) DDNS_PROVIDER="default@dynsip.org";;
      12) DDNS_PROVIDER="default@sitelutions.com";;
      13) DDNS_PROVIDER="default@dnsexit.com";;
      14) DDNS_PROVIDER="default@changeip.com";;
      255) exit 1;;
  esac
  save_configuration_file
  while [ ! $DDNS_USERNAME ]
  do
      data=$(tempfile 2>/dev/null)
      trap "rm -f $data" 0 1 2 5 15
      dialog --backtitle "Freedombone Configuration" \
          --inputbox "Dynamic DNS provider username" 10 30 "$(grep 'DDNS_USERNAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
      sel=$?
      case $sel in
          0) DDNS_USERNAME=$(cat $data);;
          1) exit 1;;
          255) exit 1;;
      esac
  done
  save_configuration_file
  while [ ! $DDNS_PASSWORD ]
  do
      data=$(tempfile 2>/dev/null)
      trap "rm -f $data" 0 1 2 5 15
      dialog --backtitle "Freedombone Configuration" \
          --clear \
          --insecure \
          --passwordbox "Dynamic DNS provider password" 10 30 "$(grep 'DDNS_PASSWORD' temp.cfg | awk -F '=' '{print $2}')" 2> $data
      sel=$?
      case $sel in
          0) DDNS_PASSWORD=$(cat $data);;
          1) exit 1;;
          255) exit 1;;
      esac
      if [ ${#DDNS_PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
          dialog --title "Password quality check" --msgbox "The password given was too short. It must be at least $MINIMUM_PASSWORD_LENGTH characters. You may need to change your password on the dynamic DNS provider's web site." 10 40
          DDNS_PASSWORD=""
      fi
  done
  save_configuration_file
  while [ ! $MY_NAME ]
  do
      data=$(tempfile 2>/dev/null)
      trap "rm -f $data" 0 1 2 5 15
      dialog --backtitle "Freedombone Configuration" \
          --inputbox "Your full name (or nick)" 10 30 "$(grep 'MY_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
      sel=$?
      case $sel in
          0) MY_NAME=$(cat $data);;
          1) exit 1;;
          255) exit 1;;
      esac
  done
  save_configuration_file
  if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
      LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep 'LOCAL_NETWORK_STATIC_IP_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
      if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
          LOCAL_NETWORK_STATIC_IP_ADDRESS='192.168..'
      fi
  fi
  if [ ! $ROUTER_IP_ADDRESS ]; then
      ROUTER_IP_ADDRESS=$(grep 'ROUTER_IP_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
      if [ ! $ROUTER_IP_ADDRESS ]; then
          ROUTER_IP_ADDRESS='192.168..'
      fi
  fi
  data=$(tempfile 2>/dev/null)
  trap "rm -f $data" 0 1 2 5 15
  dialog --backtitle "Freedombone Configuration" \
      --title "Local Network Configuration" \
      --form "\nPlease enter the IP addresses:" 11 55 3 \
      "This system:" 1 1 "$LOCAL_NETWORK_STATIC_IP_ADDRESS" 1 16 16 15 \
      "Internet router:" 2 1 "$ROUTER_IP_ADDRESS" 2 16 16 15 \
      2> $data
  sel=$?
  case $sel in
      1) exit 1;;
      255) exit 1;;
  esac
  LOCAL_NETWORK_STATIC_IP_ADDRESS=$(cat $data | sed -n 1p)
  ROUTER_IP_ADDRESS=$(cat $data | sed -n 2p)
  save_configuration_file
  if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
      WIKI_DETAILS_COMPLETE=
      while [ ! $WIKI_DETAILS_COMPLETE ]
      do
          data=$(tempfile 2>/dev/null)
          trap "rm -f $data" 0 1 2 5 15
          if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
              dialog --backtitle "Freedombone Configuration" \
                     --title "Wiki Configuration" \
                     --form "\nPlease enter your wiki details:" 11 55 4 \
                     "Title:" 1 1 "$(grep 'WIKI_TITLE' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 40 \
                     "Domain:" 2 1 "$(grep 'WIKI_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 40 \
                     "Code:" 3 1 "$(grep 'WIKI_CODE' temp.cfg | awk -F '=' '{print $2}')" 3 16 25 40 \
                     2> $data
          else
              dialog --backtitle "Freedombone Configuration" \
                     --title "Wiki Configuration" \
                     --form "\nPlease enter your wiki details:" 11 55 3 \
                     "Title:" 1 1 "$(grep 'WIKI_TITLE' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 40 \
                     "Domain:" 2 1 "$(grep 'WIKI_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 40 \
                     2> $data
          fi
          sel=$?
          case $sel in
              1) exit 1;;
              255) exit 1;;
          esac
          WIKI_TITLE=$(cat $data | sed -n 1p)
          WIKI_DOMAIN_NAME=$(cat $data | sed -n 2p)
          if [ $WIKI_DOMAIN_NAME ]; then
              TEST_DOMAIN_NAME=$WIKI_DOMAIN_NAME
              validate_domain_name
              if [[ $TEST_DOMAIN_NAME != $WIKI_DOMAIN_NAME ]]; then
                  WIKI_DOMAIN_NAME=
                  dialog --title "Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
              else
                  if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
                      WIKI_CODE=$(cat $data | sed -n 3p)
                      if [ ${#WIKI_CODE} -lt 30 ]; then
                          WIKI_DOMAIN_NAME=
                          dialog --title "FreeDNS code" --msgbox "$FREEDNS_MESSAGE" 15 50
                      fi
                  fi
              fi
          fi
          if [ $WIKI_DOMAIN_NAME ]; then
              WIKI_DETAILS_COMPLETE="yes"
          fi
      done
      save_configuration_file
  fi
  if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
      FULLBLOG_DETAILS_COMPLETE=
      while [ ! $FULLBLOG_DETAILS_COMPLETE ]
      do
          data=$(tempfile 2>/dev/null)
          trap "rm -f $data" 0 1 2 5 15
          if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
              dialog --backtitle "Freedombone Configuration" \
                     --title "Blog Configuration" \
                     --form "\nPlease enter your blog details:" 11 55 4 \
                     "Title:" 1 1 "$(grep 'MY_BLOG_TITLE' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                     "Domain:" 2 1 "$(grep 'FULLBLOG_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 30 \
                     "Code:" 3 1 "$(grep 'FULLBLOG_CODE' temp.cfg | awk -F '=' '{print $2}')" 3 16 25 30 \
                     2> $data
          else
              dialog --backtitle "Freedombone Configuration" \
                     --title "Blog Configuration" \
                     --form "\nPlease enter your blog details:" 11 55 3 \
                     "Title:" 1 1 "$(grep 'MY_BLOG_TITLE' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                     "Domain:" 2 1 "$(grep 'FULLBLOG_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 30 \
                     2> $data
          fi
          sel=$?
          case $sel in
              1) exit 1;;
              255) exit 1;;
          esac
          MY_BLOG_TITLE=$(cat $data | sed -n 1p)
          FULLBLOG_DOMAIN_NAME=$(cat $data | sed -n 2p)
          if [ $FULLBLOG_DOMAIN_NAME ]; then
              if [[ $FULLBLOG_DOMAIN_NAME == "$WIKI_DOMAIN_NAME" ]]; then
                  FULLBLOG_DOMAIN_NAME=""
              fi
              TEST_DOMAIN_NAME=$FULLBLOG_DOMAIN_NAME
              validate_domain_name
              if [[ $TEST_DOMAIN_NAME != $FULLBLOG_DOMAIN_NAME ]]; then
                  FULLBLOG_DOMAIN_NAME=
                  dialog --title "Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
              else
                  if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
                      FULLBLOG_CODE=$(cat $data | sed -n 3p)
                      if [ ${#FULLBLOG_CODE} -lt 30 ]; then
                          FULLBLOG_DOMAIN_NAME=
                          dialog --title "FreeDNS code" --msgbox "$FREEDNS_MESSAGE" 15 50
                      fi
                  fi
              fi
          fi
          if [ $FULLBLOG_DOMAIN_NAME ]; then
              FULLBLOG_DETAILS_COMPLETE="yes"
          fi
      done
      save_configuration_file
  fi
  if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
      OWNCLOUD_DETAILS_COMPLETE=
      while [ ! $OWNCLOUD_DETAILS_COMPLETE ]
      do
          data=$(tempfile 2>/dev/null)
          trap "rm -f $data" 0 1 2 5 15
          if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
              dialog --backtitle "Freedombone Configuration" \
                     --title "Owncloud Configuration" \
                     --form "\nPlease enter your Owncloud details:" 11 55 3 \
                     "Domain:" 1 1 "$(grep 'OWNCLOUD_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                     "Code:" 2 1 "$(grep 'OWNCLOUD_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 30 \
                     2> $data
          else
              dialog --backtitle "Freedombone Configuration" \
                     --title "Owncloud Configuration" \
                     --form "\nPlease enter your Owncloud details:" 11 55 3 \
                     "Domain:" 1 1 "$(grep 'OWNCLOUD_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                     2> $data
          fi
          sel=$?
          case $sel in
              1) exit 1;;
              255) exit 1;;
          esac
          OWNCLOUD_DOMAIN_NAME=$(cat $data | sed -n 1p)
          if [ $OWNCLOUD_DOMAIN_NAME ]; then
              TEST_DOMAIN_NAME=$OWNCLOUD_DOMAIN_NAME
              validate_domain_name
              if [[ $TEST_DOMAIN_NAME != $OWNCLOUD_DOMAIN_NAME ]]; then
                  OWNCLOUD_DOMAIN_NAME=
                  dialog --title "Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
              else
                  if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
                      OWNCLOUD_CODE=$(cat $data | sed -n 2p)
                      if [ ${#OWNCLOUD_CODE} -lt 30 ]; then
                          OWNCLOUD_DOMAIN_NAME=
                          dialog --title "FreeDNS code" --msgbox "$FREEDNS_MESSAGE" 15 50
                      fi
                  fi
              fi
          fi
          if [ $OWNCLOUD_DOMAIN_NAME ]; then
              OWNCLOUD_DETAILS_COMPLETE="yes"
          fi
      done
      save_configuration_file
  fi
  if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
      REDMATRIX_DETAILS_COMPLETE=
      while [ ! $REDMATRIX_DETAILS_COMPLETE ]
      do
          data=$(tempfile 2>/dev/null)
          trap "rm -f $data" 0 1 2 5 15
          if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
              dialog --backtitle "Freedombone Configuration" \
                     --title "RedMatrix Configuration" \
                     --form "\nPlease enter your RedMatrix details:" 11 55 3 \
                     "Domain:" 1 1 "$(grep 'REDMATRIX_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                     "Code:" 2 1 "$(grep 'REDMATRIX_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 30 \
                     2> $data
          else
              dialog --backtitle "Freedombone Configuration" \
                     --title "RedMatrix Configuration" \
                     --form "\nPlease enter your RedMatrix details:" 11 55 3 \
                     "Domain:" 1 1 "$(grep 'REDMATRIX_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                     2> $data
          fi
          sel=$?
          case $sel in
              1) exit 1;;
              255) exit 1;;
          esac
          REDMATRIX_DOMAIN_NAME=$(cat $data | sed -n 1p)
          if [ $REDMATRIX_DOMAIN_NAME ]; then
              TEST_DOMAIN_NAME=$REDMATRIX_DOMAIN_NAME
              validate_domain_name
              if [[ $TEST_DOMAIN_NAME != $REDMATRIX_DOMAIN_NAME ]]; then
                  REDMATRIX_DOMAIN_NAME=
                  dialog --title "Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
              else
                  if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
                      REDMATRIX_CODE=$(cat $data | sed -n 2p)
                      if [ ${#REDMATRIX_CODE} -lt 30 ]; then
                          REDMATRIX_DOMAIN_NAME=
                          dialog --title "FreeDNS code" --msgbox "$FREEDNS_MESSAGE" 15 50
                      fi
                  fi
              fi
          fi
          if [ $REDMATRIX_DOMAIN_NAME ]; then
              REDMATRIX_DETAILS_COMPLETE="yes"
          fi
      done
      save_configuration_file
  fi
  if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
      MICROBLOG_DETAILS_COMPLETE=
      while [ ! $MICROBLOG_DETAILS_COMPLETE ]
      do
          data=$(tempfile 2>/dev/null)
          trap "rm -f $data" 0 1 2 5 15
          if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
              dialog --backtitle "Freedombone Configuration" \
                     --title "Microblog Configuration" \
                     --form "\nPlease enter your Microblog details:" 11 55 3 \
                     "Domain:" 1 1 "$(grep 'MICROBLOG_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                     "Code:" 2 1 "$(grep 'MICROBLOG_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 30 \
                     2> $data
          else
              dialog --backtitle "Freedombone Configuration" \
                     --title "Microblog Configuration" \
                     --form "\nPlease enter your Microblog details:" 11 55 3 \
                     "Domain:" 1 1 "$(grep 'MICROBLOG_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                     2> $data
          fi
          sel=$?
          case $sel in
              1) exit 1;;
              255) exit 1;;
          esac
          MICROBLOG_DOMAIN_NAME=$(cat $data | sed -n 1p)
          if [ $MICROBLOG_DOMAIN_NAME ]; then
              if [[ $MICROBLOG_DOMAIN_NAME == "$REDMATRIX_DOMAIN_NAME" ]]; then
                  MICROBLOG_DOMAIN_NAME=""
              fi
              TEST_DOMAIN_NAME=$MICROBLOG_DOMAIN_NAME
              validate_domain_name
              if [[ $TEST_DOMAIN_NAME != $MICROBLOG_DOMAIN_NAME ]]; then
                  MICROBLOG_DOMAIN_NAME=
                  dialog --title "Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
              else
                  if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
                      MICROBLOG_CODE=$(cat $data | sed -n 2p)
                      if [ ${#MICROBLOG_CODE} -lt 30 ]; then
                          MICROBLOG_DOMAIN_NAME=
                          dialog --title "FreeDNS code" --msgbox "$FREEDNS_MESSAGE" 15 50
                      fi
                  fi
              fi
          fi
          if [ $MICROBLOG_DOMAIN_NAME ]; then
              MICROBLOG_DETAILS_COMPLETE="yes"
          fi
      done
      save_configuration_file
  fi
  if [[ $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
      DEVELOPER_DETAILS_COMPLETE=
      while [ ! $DEVELOPER_DETAILS_COMPLETE ]
      do
          data=$(tempfile 2>/dev/null)
          trap "rm -f $data" 0 1 2 5 15
          if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
              dialog --backtitle "Freedombone Configuration" \
                     --title "Developer Configuration" \
                     --form "\nPlease enter your Git hosting site details.\nIf You don't need developer tools then just select Ok" 11 55 3 \
                     "Domain:" 1 1 "$(grep 'GIT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 40 \
                     "Code:" 2 1 "$(grep 'GIT_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 40 \
                     2> $data
          else
              dialog --backtitle "Freedombone Configuration" \
                     --title "Developer Configuration" \
                     --form "\nPlease enter your Git hosting site details.\nIf You don't need developer tools then just select Ok" 11 55 2 \
                     "Domain:" 1 1 "$(grep 'GIT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 40 \
                     2> $data
          fi
          sel=$?
          case $sel in
              1) exit 1;;
              255) exit 1;;
          esac
          GIT_DOMAIN_NAME=$(cat $data | sed -n 1p)
          if [ $GIT_DOMAIN_NAME ]; then
              TEST_DOMAIN_NAME=$GIT_DOMAIN_NAME
              validate_domain_name
              if [[ $TEST_DOMAIN_NAME != $GIT_DOMAIN_NAME ]]; then
                  GIT_DOMAIN_NAME=
                  dialog --title "Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
              else
                  if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
                      GIT_CODE=$(cat $data | sed -n 2p)
                      if [ ${#GIT_CODE} -lt 30 ]; then
                          GIT_DOMAIN_NAME=
                          dialog --title "FreeDNS code" --msgbox "$FREEDNS_MESSAGE" 15 50
                      fi
                  fi
              fi
          else
              DEVELOPER_DETAILS_COMPLETE="yes"
          fi
          if [ $GIT_DOMAIN_NAME ]; then
              DEVELOPER_DETAILS_COMPLETE="yes"
          fi
      done
      save_configuration_file
  fi
  DEFAULT_DOMAIN_DETAILS_COMPLETE=
  while [ ! $DEFAULT_DOMAIN_DETAILS_COMPLETE ]
  do
      data=$(tempfile 2>/dev/null)
      trap "rm -f $data" 0 1 2 5 15
      if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
          dialog --backtitle "Freedombone Configuration" \
                 --title "Default Domain" \
                 --form "\nWhich domain name should your email/XMPP/IRC/VoIP be associated with?" 11 55 3 \
                 "Domain:" 1 1 "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 25 30 \
                 "Code:" 2 1 "$(grep 'DEFAULT_DOMAIN_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 25 30 \
                 2> $data
          sel=$?
          case $sel in
              1) exit 1;;
              255) exit 1;;
          esac
          DEFAULT_DOMAIN_NAME=$(cat $data | sed -n 1p)
          DEFAULT_DOMAIN_CODE=$(cat $data | sed -n 2p)
          if [ $DEFAULT_DOMAIN_NAME ]; then
              if [ ${#DEFAULT_DOMAIN_CODE} -lt 30 ]; then
                  DEFAULT_DOMAIN_NAME=
                  dialog --title "FreeDNS code" --msgbox "$FREEDNS_MESSAGE" 15 50
              fi
          fi
      else
          dialog --backtitle "Freedombone Configuration" \
              --inputbox "Which domain name should your email/XMPP/IRC/VoIP be associated with?" 10 45 \
              "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
          sel=$?
          case $sel in
              0) DEFAULT_DOMAIN_NAME=$(cat $data);;
              1) exit 1;;
              255) exit 1;;
          esac
      fi
      if [ $DEFAULT_DOMAIN_NAME ]; then
          TEST_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
          validate_domain_name
          if [[ $TEST_DOMAIN_NAME != $DEFAULT_DOMAIN_NAME ]]; then
              DEFAULT_DOMAIN_NAME=
              dialog --title "Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
          else
              DEFAULT_DOMAIN_DETAILS_COMPLETE="yes"
          fi
      fi
  done
  save_configuration_file
  while [ ${#MY_EMAIL_ADDRESS} -lt 5 ]
  do
      EMAIL_ADDRESS=$(grep 'MY_EMAIL_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
      if [ ! $EMAIL_ADDRESS ]; then
          EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
      fi
      if [ ${#MY_EMAIL_ADDRESS} -lt 5 ]; then
          EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
      fi
      data=$(tempfile 2>/dev/null)
      trap "rm -f $data" 0 1 2 5 15
      dialog --backtitle "Freedombone Configuration" \
          --inputbox "Your email address" 10 30 "$EMAIL_ADDRESS" 2> $data
      sel=$?
      case $sel in
          0) MY_EMAIL_ADDRESS=$(cat $data);;
          1) exit 1;;
          255) exit 1;;
      esac
  done
  save_configuration_file
  # delete the temporary configuration file
  if [ -f temp.cfg ]; then
      shred -zu temp.cfg
  fi
}
function show_result {
  clear
  echo ''
  echo "Configuration filename: $CONFIGURATION_FILE"
  echo ''
  echo 'Contents:'
  echo ''
  cat $CONFIGURATION_FILE
  echo ''
}
function read_configuration {
  if [ ! $CONFIGURATION_FILE ]; then
      CONFIGURATION_FILE='freedombone.cfg'
  fi
  if [ -f $CONFIGURATION_FILE ]; then
      if grep -q "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE; then
          ENABLE_SOCIAL_KEY_MANAGEMENT=$(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "GIT_DOMAIN_NAME" $CONFIGURATION_FILE; then
          GIT_DOMAIN_NAME=$(grep "GIT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "GIT_CODE" $CONFIGURATION_FILE; then
          GIT_CODE=$(grep "GIT_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MY_USERNAME" $CONFIGURATION_FILE; then
          MY_USERNAME=$(grep "MY_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "DOMAIN_NAME" $CONFIGURATION_FILE; then
          # for backwards compatability
          DEFAULT_DOMAIN_NAME=$(grep "DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE; then
          DEFAULT_DOMAIN_NAME=$(grep "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE; then
          DEFAULT_DOMAIN_CODE=$(grep "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "NAMESERVER1" $CONFIGURATION_FILE; then
          NAMESERVER1=$(grep "NAMESERVER1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "NAMESERVER2" $CONFIGURATION_FILE; then
          NAMESERVER2=$(grep "NAMESERVER2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
          DEBIAN_REPO=$(grep "DEBIAN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
          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
      if grep -q "DDNS_PROVIDER" $CONFIGURATION_FILE; then
          DDNS_PROVIDER=$(grep "DDNS_PROVIDER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "DDNS_USERNAME" $CONFIGURATION_FILE; then
          DDNS_USERNAME=$(grep "DDNS_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "DDNS_PASSWORD" $CONFIGURATION_FILE; then
          DDNS_PASSWORD=$(grep "DDNS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE; then
          LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "ENABLE_CJDNS" $CONFIGURATION_FILE; then
          ENABLE_CJDNS=$(grep "ENABLE_CJDNS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE; then
          ROUTER_IP_ADDRESS=$(grep "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "WIKI_TITLE" $CONFIGURATION_FILE; then
          WIKI_TITLE=$(grep "WIKI_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MY_NAME" $CONFIGURATION_FILE; then
          MY_NAME=$(grep "MY_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE; then
          MY_EMAIL_ADDRESS=$(grep "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "INSTALLING_ON_BBB" $CONFIGURATION_FILE; then
          INSTALLING_ON_BBB=$(grep "INSTALLING_ON_BBB" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "USB_DRIVE" $CONFIGURATION_FILE; then
          USB_DRIVE=$(grep "USB_DRIVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE; then
          PUBLIC_MAILING_LIST=$(grep "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
          MICROBLOG_DOMAIN_NAME=$(grep "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MICROBLOG_CODE" $CONFIGURATION_FILE; then
          MICROBLOG_CODE=$(grep "MICROBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "REDMATRIX_DOMAIN_NAME" $CONFIGURATION_FILE; then
          REDMATRIX_DOMAIN_NAME=$(grep "REDMATRIX_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "REDMATRIX_CODE" $CONFIGURATION_FILE; then
          REDMATRIX_CODE=$(grep "REDMATRIX_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE; then
          OWNCLOUD_DOMAIN_NAME=$(grep "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "OWNCLOUD_CODE" $CONFIGURATION_FILE; then
          OWNCLOUD_CODE=$(grep "OWNCLOUD_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE; then
          WIKI_DOMAIN_NAME=$(grep "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "WIKI_CODE" $CONFIGURATION_FILE; then
          WIKI_CODE=$(grep "WIKI_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
          FULLBLOG_DOMAIN_NAME=$(grep "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "FULLBLOG_CODE" $CONFIGURATION_FILE; then
          FULLBLOG_CODE=$(grep "FULLBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MY_BLOG_TITLE" $CONFIGURATION_FILE; then
          MY_BLOG_TITLE=$(grep "MY_BLOG_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE; then
          MY_BLOG_SUBTITLE=$(grep "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE; then
          MEDIAGOBLIN_DOMAIN_NAME=$(grep "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
      if grep -q "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE; then
          MEDIAGOBLIN_CODE=$(grep "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
      fi
  fi
}
read_configuration
interactive_configuration
show_result
exit 0
 |