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