From b200d557697d2fec1606d74518c47c50164500af Mon Sep 17 00:00:00 2001
From: Bob Mottram <bob@freedombone.net>
Date: Mon, 9 Apr 2018 13:32:43 +0100
Subject: [PATCH] dat server app

---
 src/freedombone-app-datserver | 323 ++++++++++++++++++++++++++++++++++
 src/freedombone-app-peertube  |   5 +-
 2 files changed, 324 insertions(+), 4 deletions(-)
 create mode 100755 src/freedombone-app-datserver

diff --git a/src/freedombone-app-datserver b/src/freedombone-app-datserver
new file mode 100755
index 000000000..442b0728d
--- /dev/null
+++ b/src/freedombone-app-datserver
@@ -0,0 +1,323 @@
+#!/bin/bash
+#
+#  _____               _           _
+# |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
+# |   __|  _| -_| -_| . | . |     | . | . |   | -_|
+# |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
+#
+#                              Freedom in the Cloud
+#
+# 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_DAT_VERSION='13.10.0'
+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
+        return
+    fi
+
+    if npm update -g dat@$DATSERVER_DAT_VERSION; then
+        set_completion_param "datserver version" "$DATSERVER_DAT_VERSION"
+    fi
+    chown -R datserver:datserver "$DATSERVER_DIRECTORY"
+}
+
+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
+
+    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
+
+    set_completion_param "datserver version" "$DATSERVER_DAT_VERSION"
+
+    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"
diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube
index 96ec463fd..f98bb178a 100755
--- a/src/freedombone-app-peertube
+++ b/src/freedombone-app-peertube
@@ -269,10 +269,7 @@ function peertube_import_from_file {
         nodecmd='torsocks node'
     fi
 
-    data2=$(mktemp 2>/dev/null)
-    dialog --title "Choose the video file (select with spacebar)" --fselect "/home/$MY_USERNAME/" 30 60 2> "$data2"
-    selected_file=$(cat "$data2")
-    rm -f "$data2"
+    selected_file=$(dialog --title "Choose the video file (select with spacebar)" --fselect "/home/$MY_USERNAME/" 30 60)
     if [ ! "$selected_file" ]; then
         return
     fi
-- 
GitLab