| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 | 
							- #!/bin/bash
 - #
 - #  _____               _           _
 - # |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
 - # |   __|  _| -_| -_| . | . |     | . | . |   | -_|
 - # |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
 - #
 - #                              Freedom in the Cloud
 - #
 - # The main issue here is bootstrapping. What is running
 - # on the bootstrap server publicbits.org port 6881 ?
 - #
 - # Also it appears that users trying to clone have to
 - # register an account on datbase.org or another datbase
 - # server
 - #
 - # License
 - # =======
 - #
 - # Copyright (C) 2018 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/>.
 - 
 - VARIANTS='full full-vim'
 - 
 - IN_DEFAULT_INSTALL=0
 - SHOW_ON_ABOUT=0
 - 
 - DATSERVER_DOMAIN_NAME=
 - DATSERVER_CODE=
 - DATSERVER_HYPERCORED_VERSION='1.4.1'
 - DATSERVER_DIRECTORY=/etc/datserver
 - DATSERVER_PORT=3282
 - 
 - # bootstrap servers are specified here
 - DATSERVER_BOOTSTRAP_FILE=$DATSERVER_DIRECTORY/node_modules/datland-swarm-defaults/index.js
 - 
 - DATSERVER_DISCOVERY1='discovery1.publicbits.org'
 - DATSERVER_DISCOVERY2='discovery2.publicbits.org'
 - DATSERVER_BOOTSTRAP1='bootstrap1.publicbits.org:6881'
 - DATSERVER_BOOTSTRAP2='bootstrap2.publicbits.org:6881'
 - DATSERVER_BOOTSTRAP3='bootstrap3.publicbits.org:6881'
 - DATSERVER_BOOTSTRAP4='bootstrap4.publicbits.org:6881'
 - 
 - datserver_variables=(MY_USERNAME
 -                      DATSERVER_DISCOVERY1
 -                      DATSERVER_DISCOVERY2
 -                      DATSERVER_BOOTSTRAP1
 -                      DATSERVER_BOOTSTRAP2
 -                      DATSERVER_BOOTSTRAP3
 -                      DATSERVER_BOOTSTRAP4)
 - 
 - function datserver_generate_bootstraps {
 -   { echo "var extend = require('xtend')";
 -     echo '';
 -     echo "var DAT_DOMAIN = 'dat.local'";
 -     echo 'var DEFAULT_DISCOVERY = [';
 -     echo "  '$DATSERVER_DISCOVERY1',";
 -     echo "  '$DATSERVER_DISCOVERY2'";
 -     echo ']';
 -     echo 'var DEFAULT_BOOTSTRAP = [';
 -     echo "  '$DATSERVER_BOOTSTRAP1',";
 -     echo "  '$DATSERVER_BOOTSTRAP2',";
 -     echo "  '$DATSERVER_BOOTSTRAP3',";
 -     echo "  '$DATSERVER_BOOTSTRAP4'";
 -     echo ']';
 -     echo '';
 -     echo 'var DEFAULT_OPTS = {';
 -     echo '  dns: {server: DEFAULT_DISCOVERY, domain: DAT_DOMAIN},';
 -     echo '  dht: {bootstrap: DEFAULT_BOOTSTRAP}';
 -     echo '}';
 -     echo '';
 -     echo 'module.exports = function (opts) {';
 -     echo '  return extend(DEFAULT_OPTS, opts) // opts takes priority';
 -     echo '}'; } > $DATSERVER_BOOTSTRAP_FILE
 - 
 -   chown datserver:datserver $DATSERVER_BOOTSTRAP_FILE
 - }
 - 
 - function datserver_configure_bootstraps {
 -     read_config_param DATSERVER_DISCOVERY1
 -     read_config_param DATSERVER_DISCOVERY2
 - 
 -     read_config_param DATSERVER_BOOTSTRAP1
 -     read_config_param DATSERVER_BOOTSTRAP2
 -     read_config_param DATSERVER_BOOTSTRAP3
 -     read_config_param DATSERVER_BOOTSTRAP4
 - 
 -     data=$(mktemp 2>/dev/null)
 -     dialog --backtitle $"Freedombone Control Panel" \
 -            --title $"dat bootstrap servers" \
 -            --form $"Specify discovery and bootstrap servers:\\n" 14 68 6 \
 -            $"Discovery 1:" 1 1 "$DATSERVER_DISCOVERY1" 1 15 50 99 \
 -            $"Discovery 2:" 2 1 "$DATSERVER_DISCOVERY2" 2 15 50 99 \
 -            $"Bootstrap 1:" 3 1 "$DATSERVER_BOOTSTRAP1" 3 15 50 99 \
 -            $"Bootstrap 2:" 4 1 $"$DATSERVER_BOOTSTRAP2" 4 15 50 99 \
 -            $"Bootstrap 3:" 5 1 $"$DATSERVER_BOOTSTRAP3" 5 15 50 99 \
 -            $"Bootstrap 4:" 6 1 $"$DATSERVER_BOOTSTRAP4" 6 15 50 99 \
 -            2> "$data"
 -     sel=$?
 -     case $sel in
 -         1)  rm -f "$data"
 -             return;;
 -         255) rm -f "$data"
 -              return;;
 -     esac
 -     DATSERVER_DISCOVERY1=$(sed -n 1p < "$data")
 -     DATSERVER_DISCOVERY2=$(sed -n 2p < "$data")
 -     DATSERVER_BOOTSTRAP1=$(sed -n 3p < "$data")
 -     DATSERVER_BOOTSTRAP2=$(sed -n 4p < "$data")
 -     DATSERVER_BOOTSTRAP3=$(sed -n 4p < "$data")
 -     DATSERVER_BOOTSTRAP4=$(sed -n 4p < "$data")
 -     rm "$data"
 - 
 -     write_config_param DATSERVER_DISCOVERY1
 -     write_config_param DATSERVER_DISCOVERY2
 - 
 -     write_config_param DATSERVER_BOOTSTRAP1
 -     write_config_param DATSERVER_BOOTSTRAP2
 -     write_config_param DATSERVER_BOOTSTRAP3
 -     write_config_param DATSERVER_BOOTSTRAP4
 - 
 -     datserver_generate_bootstraps
 -     systemctl restart datserver
 - }
 - 
 - function logging_on_datserver {
 -     echo -n ''
 - }
 - 
 - function logging_off_datserver {
 -     echo -n ''
 - }
 - 
 - function remove_user_datserver {
 -     echo -n ''
 - }
 - 
 - function add_user_datserver {
 -     echo -n ''
 -     echo '0'
 - }
 - 
 - function change_password_datserver {
 -     echo -n ''
 - }
 - 
 - function install_interactive_datserver {
 -     echo -n ''
 -     APP_INSTALLED=1
 - }
 - 
 - function reconfigure_datserver {
 -     # This is used if you need to switch identity. Dump old keys and generate new ones
 -     echo -n ''
 - }
 - 
 - function datserver_add_dat {
 -     data=$(mktemp 2>/dev/null)
 -     dialog --title $"Add a dat" \
 -            --backtitle $"Freedombone Control Panel" \
 -            --inputbox $"dat link:" 8 70 2>"$data"
 -     sel=$?
 -     case $sel in
 -         0)
 -             dat_link=$(<"$data")
 -             if [ "$dat_link" ]; then
 -                 if [ ${#dat_link} -gt 5 ]; then
 -                     if ! grep -q "$dat_link" $DATSERVER_DIRECTORY/feeds; then
 -                         echo "$dat_link" >> $DATSERVER_DIRECTORY/feeds
 -                         chown -R datserver:datserver $DATSERVER_DIRECTORY/feeds
 -                         systemctl restart datserver
 -                     fi
 -                 fi
 -             fi
 -             ;;
 -     esac
 -     rm -f "$data"
 - }
 - 
 - function configure_interactive_datserver {
 -     W=(1 $"Add a dat"
 -        2 $"Browse or edit feeds"
 -        3 $"Bootstrap servers")
 - 
 -     while true
 -     do
 -         # shellcheck disable=SC2068
 -         selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"dat server" --menu $"Choose an operation, or ESC for main menu:" 11 70 4 "${W[@]}" 3>&2 2>&1 1>&3)
 - 
 -         if [ ! "$selection" ]; then
 -            break
 -         fi
 -         case $selection in
 -             1) datserver_add_dat
 -                ;;
 -             2) cd $DATSERVER_DIRECTORY || break
 -                editor feeds
 -                chown -R datserver:datserver $DATSERVER_DIRECTORY/feeds
 -                systemctl restart datserver
 -                ;;
 -             3) datserver_configure_bootstraps
 -                ;;
 -         esac
 -     done
 - }
 - 
 - function upgrade_datserver {
 -     CURR_DATSERVER_HYPERCORED_VERSION=$(get_completion_param "datserver hypercored version")
 -     if [[ "$CURR_DATSERVER_HYPERCORED_VERSION" != "$DATSERVER_HYPERCORED_VERSION" ]]; then
 -         cd $DATSERVER_DIRECTORY || exit 254274
 -         systemctl stop datserver
 -         if npm update hypercored@$DATSERVER_HYPERCORED_VERSION; then
 -             set_completion_param "datserver hypercored version" "$DATSERVER_HYPERCORED_VERSION"
 -         fi
 -         datserver_generate_bootstraps
 -         chown -R datserver:datserver "$DATSERVER_DIRECTORY"
 -         systemctl restart datserver
 -     fi
 - }
 - 
 - function backup_local_datserver {
 -     source_directory=$DATSERVER_DIRECTORY
 - 
 -     systemctl stop datserver
 - 
 -     dest_directory=datserver
 -     backup_directory_to_usb "$source_directory" $dest_directory
 - 
 -     systemctl start datserver
 - }
 - 
 - function restore_local_datserver {
 -     systemctl stop datserver
 - 
 -     temp_restore_dir=/root/tempdatserver
 -     datserver_dir=$DATSERVER_DIRECTORY
 - 
 -     restore_directory_from_usb $temp_restore_dir datserver
 -     if [ -d $temp_restore_dir ]; then
 -         if [ -d "$temp_restore_dir$datserver_dir" ]; then
 -             cp -rp "$temp_restore_dir$datserver_dir"/* "$datserver_dir"/
 -         else
 -             if [ ! -d "$datserver_dir" ]; then
 -                 mkdir "$datserver_dir"
 -             fi
 -             cp -rp "$temp_restore_dir"/* "$datserver_dir"/
 -         fi
 -         chown -R datserver:datserver "$datserver_dir"
 -         rm -rf $temp_restore_dir
 -     fi
 -     systemctl start datserver
 - 
 - }
 - 
 - function backup_remote_datserver {
 -     source_directory=$DATSERVER_DIRECTORY
 -     systemctl stop datserver
 - 
 -     dest_directory=datserver
 -     backup_directory_to_friend "$source_directory" $dest_directory
 - 
 -     systemctl start datserver
 - }
 - 
 - function restore_remote_datserver {
 -     systemctl stop datserver
 - 
 -     temp_restore_dir=/root/tempdatserver
 -     datserver_dir=$DATSERVER_DIRECTORY
 - 
 -     restore_directory_from_friend $temp_restore_dir datserver
 -     if [ -d $temp_restore_dir ]; then
 -         if [ -d "$temp_restore_dir$datserver_dir" ]; then
 -             cp -rp "$temp_restore_dir$datserver_dir"/* "$datserver_dir"/
 -         else
 -             if [ ! -d "$datserver_dir" ]; then
 -                 mkdir "$datserver_dir"
 -             fi
 -             cp -rp $temp_restore_dir/* "$datserver_dir"/
 -         fi
 -         chown -R datserver:datserver "$datserver_dir"
 -         rm -rf $temp_restore_dir
 -     fi
 -     systemctl start datserver
 - 
 - }
 - 
 - function remove_datserver {
 -     if [ -f /etc/systemd/system/datserver.service ]; then
 -         systemctl stop datserver
 -         systemctl disable datserver
 -         rm /etc/systemd/system/datserver.service
 -     fi
 -     userdel -r datserver
 - 
 -     remove_nodejs datserver
 - 
 -     if [ -d $DATSERVER_DIRECTORY ]; then
 -         rm -rf $DATSERVER_DIRECTORY
 -     fi
 - 
 -     remove_app datserver
 -     remove_completion_param install_datserver
 -     sed -i '/datserver/d' "$COMPLETION_FILE"
 -     firewall_remove $DATSERVER_PORT
 - }
 - 
 - function install_datserver {
 -     apt-get -yq install wget
 - 
 -     install_nodejs datserver
 - 
 -     if [ -d $DATSERVER_DIRECTORY ]; then
 -         rm -rf $DATSERVER_DIRECTORY
 -     fi
 -     mkdir $DATSERVER_DIRECTORY
 -     cd $DATSERVER_DIRECTORY || exit 3658356
 - 
 -     if ! npm install hypercored@$DATSERVER_HYPERCORED_VERSION; then
 -         echo $'hypercored was not installed'
 -         exit 4635439
 -     fi
 - 
 -     if ! npm install lil-pids@2.6.1; then
 -         echo $'lil-pids was not installed'
 -         exit 36483463
 -     fi
 - 
 -     echo "$DATSERVER_DIRECTORY/node_modules/.bin/hypercored --cwd $DATSERVER_DIRECTORY" > $DATSERVER_DIRECTORY/services
 - 
 -     set_completion_param "datserver hypercored version" "$DATSERVER_HYPERCORED_VERSION"
 - 
 -     adduser --system --home="$DATSERVER_DIRECTORY" --group datserver
 -     if [ ! -d $DATSERVER_DIRECTORY ]; then
 -         echo $'dat directory was not created'
 -         exit 9568356
 -     fi
 - 
 -     datserver_generate_bootstraps
 - 
 -     chown -R datserver:datserver "$DATSERVER_DIRECTORY"
 - 
 -     firewall_add datserver $DATSERVER_PORT
 - 
 -     { echo '[Unit]';
 -       echo 'After=syslog.target network.target remote-fs.target nss-lookup.target';
 -       echo '';
 -       echo '[Service]';
 -       echo 'User=datserver';
 -       echo 'Group=datserver';
 -       echo "ExecStart=$DATSERVER_DIRECTORY/node_modules/.bin/lil-pids $DATSERVER_DIRECTORY/services $DATSERVER_DIRECTORY/pids";
 -       echo 'Restart=always';
 -       echo "WorkingDirectory=$DATSERVER_DIRECTORY";
 -       echo 'StandardError=syslog';
 -       echo '';
 -       echo '[Install]';
 -       echo 'WantedBy=multi-user.target'; } > /etc/systemd/system/datserver.service
 - 
 -     systemctl enable datserver
 -     systemctl start datserver
 - 
 -     APP_INSTALLED=1
 - }
 - 
 - # NOTE: deliberately there is no "exit 0"
 
 
  |