#!/bin/bash # # _____ _ _ # | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___ # | __| _| -_| -_| . | . | | . | . | | -_| # |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___| # # Freedom in the Cloud # # 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_DAT_VERSION='13.10.0' DATSERVER_HYPERCORED_VERSION='1.4.1' DATSERVER_DIRECTORY=/etc/datserver datserver_variables=(MY_USERNAME) function logging_on_datserver { echo -n '' } function logging_off_datserver { echo -n '' } function remove_user_datserver { remove_username="$1" "${PROJECT_NAME}-pass" -u "$remove_username" --rmapp datserver } function add_user_datserver { new_username="$1" new_user_password="$2" "${PROJECT_NAME}-pass" -u "$new_username" -a datserver -p "$new_user_password" echo '0' } function install_interactive_datserver { echo -n '' APP_INSTALLED=1 } function change_password_datserver { curr_username="$1" new_user_password="$2" "${PROJECT_NAME}-pass" -u "$curr_username" -a datserver -p "$new_user_password" } function reconfigure_datserver { # This is used if you need to switch identity. Dump old keys and generate new ones echo -n '' } function datserver_add_url { data=$(mktemp 2>/dev/null) dialog --title $"Add a file to dat using its URL" \ --backtitle $"Freedombone Control Panel" \ --inputbox $"File URL" 8 70 2>"$data" sel=$? case $sel in 0) file_url=$(<"$data") if [ "$file_url" ]; then if [ ${#file_url} -gt 5 ]; then clear cd $DATSERVER_DIRECTORY || return wget "$file_url" chown -R datserver:datserver $DATSERVER_DIRECTORY/* fi fi ;; esac rm -f "$data" } function datserver_add_file { read_config_param MY_USERNAME selected_file=$(dialog --title "Choose a file to store within dat" --fselect "/home/$MY_USERNAME/" 30 60) if [ ! "$selected_file" ]; then return fi if [ ! -f "$selected_file" ]; then return fi if [[ "$selected_file" == "$DATSERVER_DIRECTORY"* ]]; then return fi clear echo '' echo $"Copying $selected_file" cp "$selected_file" $DATSERVER_DIRECTORY chown -R datserver:datserver $DATSERVER_DIRECTORY/* } function datserver_show_address { cd $DATSERVER_DIRECTORY || return dat_address=$(dat status | grep "dat:") clear echo '' echo "$dat_address" echo '' echo -n "$dat_address" | qrencode -t UTF8 echo '' echo ' ' # shellcheck disable=SC2034 read -n1 -r -p $"Press any key to continue..." key } function configure_interactive_datserver { W=(1 $"Add a local file" 2 $"Add a file from its URL") 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:" 14 70 3 "${W[@]}" 3>&2 2>&1 1>&3) if [ ! "$selection" ]; then break fi case $selection in 1) datserver_show_address ;; 2) datserver_add_file ;; 3) datserver_add_url ;; esac done } function upgrade_datserver { CURR_DATSERVER_DAT_VERSION=$(get_completion_param "datserver version") if [[ "$CURR_DATSERVER_DAT_VERSION" != "$DATSERVER_DAT_VERSION" ]]; then if npm update -g dat@$DATSERVER_DAT_VERSION; then set_completion_param "datserver version" "$DATSERVER_DAT_VERSION" fi chown -R datserver:datserver "$DATSERVER_DIRECTORY" fi CURR_DATSERVER_HYPERCORED_VERSION=$(get_completion_param "datserver hypercored version") if [[ "$CURR_DATSERVER_HYPERCORED_VERSION" != "$DATSERVER_HYPERCORED_VERSION" ]]; then if npm update -g hypercored@$DATSERVER_HYPERCORED_VERSION; then set_completion_param "datserver hypercored version" "$DATSERVER_HYPERCORED_VERSION" fi chown -R datserver:datserver "$DATSERVER_DIRECTORY" 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 npm uninstall -g dat npm uninstall -g hypercored remove_nodejs datserver remove_onion_service datserver "${DATSERVER_ONION_PORT}" if grep -q "datserver" /etc/crontab; then sed -i "/datserver/d" /etc/crontab fi if [ -d $DATSERVER_DIRECTORY ]; then rm -rf $DATSERVER_DIRECTORY fi remove_app datserver remove_completion_param install_datserver sed -i '/datserver/d' "$COMPLETION_FILE" } function install_datserver { apt-get -yq install wget install_nodejs datserver if ! npm install -g dat@$DATSERVER_DAT_VERSION; then exit 2468736 fi if [ ! -f /root/.npm-global/bin/dat ]; then echo $'dat was not installed' exit 156835 fi if ! npm install -g hypercored@$DATSERVER_HYPERCORED_VERSION; then echo $'hypercored was not installed' exit 4635439 fi set_completion_param "datserver version" "$DATSERVER_DAT_VERSION" set_completion_param "datserver hypercored version" "$DATSERVER_HYPERCORED_VERSION" if [ -d $DATSERVER_DIRECTORY ]; then rm -rf $DATSERVER_DIRECTORY fi mkdir $DATSERVER_DIRECTORY useradd -d "$DATSERVER_DIRECTORY" -s /bin/false datserver if [ ! -d $DATSERVER_DIRECTORY ]; then echo $'dat directory was not created' exit 9568356 fi cd $DATSERVER_DIRECTORY || exit 3578635 echo -e "\\n\\n" | dat create if [ ! -d $DATSERVER_DIRECTORY/.dat ]; then echo $'dat was not created' exit 753563 fi dat_address=$(dat status | grep "dat:") if [ ! "$dat_address" ]; then echo $'dat address could not be found' exit 235479763 fi if [ ${#dat_address} -lt 10 ]; then echo $'dat address is too short' exit 4789264359 fi echo "$dat_address created" { echo '[Unit]'; echo 'Description=datserver'; echo 'After=syslog.target'; echo 'After=network.target'; echo ''; echo '[Service]'; echo 'Type=simple'; echo 'User=datserver'; echo 'Group=datserver'; echo "WorkingDirectory=$DATSERVER_DIRECTORY"; echo "ExecStart=/root/.npm-global/bin/dat share $DATSERVER_DIRECTORY"; echo 'Environment=NODE_ENV=production'; echo 'Environment=USER=datserver'; echo 'Restart=always'; echo 'StandardError=syslog'; echo ''; echo '[Install]'; echo 'WantedBy=multi-user.target'; } >> "/etc/systemd/system/datserver.service" systemctl enable datserver chown -R datserver:datserver "$DATSERVER_DIRECTORY" systemctl start datserver APP_INSTALLED=1 } # NOTE: deliberately there is no "exit 0"