#!/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 # # 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 . 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"