Skip to content
Snippets Groups Projects
freedombone-app-scuttlebot 12.3 KiB
Newer Older
Bob Mottram's avatar
Bob Mottram committed
#!/bin/bash
Bob Mottram's avatar
Bob Mottram committed
#  _____               _           _
# |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
# |   __|  _| -_| -_| . | . |     | . | . |   | -_|
# |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
Bob Mottram's avatar
Bob Mottram committed
#
Bob Mottram's avatar
Bob Mottram committed
#                              Freedom in the Cloud
Bob Mottram's avatar
Bob Mottram committed
#
Bob Mottram's avatar
Bob Mottram committed
# scuttlebot pub application. Enables nat traversal for SSB.
Bob Mottram's avatar
Bob Mottram committed
# https://scuttlebot.io
#
# This is deprecated for now because it appears that Patchwork
# Is moving to DHT invites, which presumably eliminates the
# need for separate pubs. Invites generated by scuttlebot
# are currently incompatible with the new DHT format.
#
Bob Mottram's avatar
Bob Mottram committed
# License
# =======
#
Bob Mottram's avatar
Bob Mottram committed
# Copyright (C) 2017-2019 Bob Mottram <bob@freedombone.net>
Bob Mottram's avatar
Bob Mottram committed
#
# 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=''
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
APP_CATEGORY=chat

Bob Mottram's avatar
Bob Mottram committed
IN_DEFAULT_INSTALL=0
SHOW_ON_ABOUT=0
SHOW_CLEARNET_ADDRESS_ON_ABOUT=0
Bob Mottram's avatar
Bob Mottram committed
SHOW_DOMAIN_IN_WEBADMIN=0
REQUIRES_APP=

SCUTTLEBOT_VERSION='13.0.0'
SCUTTLEBOT_REPLICATE_NODES=10
Bob Mottram's avatar
Bob Mottram committed
SCUTTLEBOT_PORT=8008
SCUTTLEBOT_ONION_PORT=8623
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
SCUTTLEBOT_SHORT_DESCRIPTION=$'Scuttlebot Pub'
SCUTTLEBOT_DESCRIPTION=$'Scuttlebot Pub'
SCUTTLEBOT_MOBILE_APP_URL='https://f-droid.org/en/packages/se.manyver/'

Bob Mottram's avatar
Bob Mottram committed
scuttlebot_variables=(MY_USERNAME
Bob Mottram's avatar
Bob Mottram committed
                      DEFAULT_DOMAIN_NAME
Bob Mottram's avatar
Bob Mottram committed
                      SYSTEM_TYPE)

function change_default_domain_name_scuttlebot {
    new_default_domain_name="$1"

    { echo '{';
      echo "  \"host\": \"${new_default_domain_name}\",";
      echo '  "tor-only": false,'; } > /etc/scuttlebot/.ssb/config
    systemctl restart scuttlebot
}

function logging_on_scuttlebot {
    echo -n ''
}

function logging_off_scuttlebot {
    echo -n ''
}

function scuttlebot_create_single_invite {
    invite_string=$(su -c "/etc/scuttlebot/node_modules/.bin/sbot invite.create 1" - scuttlebot | sed 's/"//g')
    if [ ! "$invite_string" ]; then
        echo $'Unable to create scuttlebot invite'
    fi
    write_config_param SCUTTLEBOT_INVITE "$invite_string"
}
Bob Mottram's avatar
Bob Mottram committed

function scuttlebot_create_invite {
    scuttlebot_create_single_invite
Bob Mottram's avatar
Bob Mottram committed
    clear
    echo -e "\\n\\nYour Scuttlebot invite code is:\\n\\n${SCUTTLEBOT_INVITE}\\n\\n"
Bob Mottram's avatar
Bob Mottram committed
    # shellcheck disable=SC2034
Bob Mottram's avatar
Bob Mottram committed
    read -n1 -r -p $"Press any key to continue..." key
}

function configure_interactive_scuttlebot {
    W=(1 $"Create an invite")

Bob Mottram's avatar
Bob Mottram committed
    while true
    do
        # shellcheck disable=SC2068
        selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"Scuttlebot" --menu $"Choose an operation, or ESC to exit:" 10 60 2 "${W[@]}" 3>&2 2>&1 1>&3)

        if [ ! "$selection" ]; then
            break
        fi

        case $selection in
Bob Mottram's avatar
Bob Mottram committed
            1) scuttlebot_create_invite;;
        esac
    done
}
Bob Mottram's avatar
Bob Mottram committed

function remove_user_scuttlebot {
Bob Mottram's avatar
Bob Mottram committed
    echo -n ''
#    remove_username="$1"
Bob Mottram's avatar
Bob Mottram committed
}

function add_user_scuttlebot {
Bob Mottram's avatar
Bob Mottram committed
#    new_username="$1"
#    new_user_password="$2"
    # This doesn't have users
Bob Mottram's avatar
Bob Mottram committed
    echo '0'
}

function install_interactive_scuttlebot {
    if [[ $ONION_ONLY != "no" ]]; then
        SCUTTLEBOT_DOMAIN_NAME='scuttlebot.local'
        write_config_param "SCUTTLEBOT_DOMAIN_NAME" "$SCUTTLEBOT_DOMAIN_NAME"
    else
        function_check interactive_site_details
        interactive_site_details scuttlebot
    fi
Bob Mottram's avatar
Bob Mottram committed
    APP_INSTALLED=1
}

function change_password_scuttlebot {
Bob Mottram's avatar
Bob Mottram committed
#    new_username="$1"
#    new_user_password="$2"
Bob Mottram's avatar
Bob Mottram committed
    echo '0'
}

function reconfigure_scuttlebot {
    if [ -d /etc/scuttlebot/.ssb ]; then
        systemctl stop scuttlebot
        rm -rf /etc/scuttlebot/.ssb
        systemctl start scuttlebot
    fi
}

function upgrade_scuttlebot {
Bob Mottram's avatar
Bob Mottram committed
    if ! grep -q 'scuttlebot version:' $"COMPLETION_FILE"; then
Bob Mottram's avatar
Bob Mottram committed
        return
    fi

    CURR_SCUTTLEBOT_VERSION=$(get_completion_param "scuttlebot version")
    echo "scuttlebot current version: ${CURR_SCUTTLEBOT_VERSION}"
    echo "scuttlebot app version: ${SCUTTLEBOT_VERSION}"
    if [[ "${CURR_SCUTTLEBOT_VERSION}" == "${SCUTTLEBOT_VERSION}" ]]; then
        return
    fi

    cat <<EOF > /usr/bin/upgrade_scuttlebot
#!/bin/bash
cd /etc/scuttlebot || exit 1
if ! npm upgrade -g scuttlebot@${SCUTTLEBOT_VERSION} --save; then
    exit 2
fi
exit 0
EOF
    chmod +x /usr/bin/upgrade_scuttlebot
    su -c '/usr/bin/upgrade_scuttlebot' - scuttlebot
    rm /usr/bin/upgrade_scuttlebot

Bob Mottram's avatar
Bob Mottram committed
    sed -i "s|scuttlebot version.*|scuttlebot version:${SCUTTLEBOT_VERSION}|g" "${COMPLETION_FILE}"
Bob Mottram's avatar
Bob Mottram committed
}

function backup_local_scuttlebot {
    if [ -d /etc/scuttlebot/.ssb ]; then
        systemctl stop scuttlebot
        function_check backup_directory_to_usb
        backup_directory_to_usb /etc/scuttlebot/.ssb scuttlebot
        systemctl start scuttlebot
    fi
}

function restore_local_scuttlebot {
    if [ -d /etc/scuttlebot ]; then
        systemctl stop scuttlebot
        temp_restore_dir=/root/tempscuttlebot
        function_check restore_directory_from_usb
        restore_directory_from_usb $temp_restore_dir scuttlebot
        if [ -d $temp_restore_dir/etc/scuttlebot/.ssb ]; then
            cp -r $temp_restore_dir/etc/scuttlebot/.ssb /etc/scuttlebot/
        else
            cp -r $temp_restore_dir/* /etc/scuttlebot/.ssb/*
        fi
Bob Mottram's avatar
Bob Mottram committed
        systemctl start scuttlebot
        rm -rf $temp_restore_dir
Bob Mottram's avatar
Bob Mottram committed
    fi
}

function backup_remote_scuttlebot {
    echo -n ''
Bob Mottram's avatar
Bob Mottram committed
}

function restore_remote_scuttlebot {
    echo -n ''
Bob Mottram's avatar
Bob Mottram committed
}

function remove_scuttlebot {
Bob Mottram's avatar
Bob Mottram committed
    firewall_remove ${SCUTTLEBOT_PORT}

Bob Mottram's avatar
Bob Mottram committed
    systemctl stop scuttlebot
    systemctl disable scuttlebot
    rm /etc/systemd/system/scuttlebot.service
Bob Mottram's avatar
Bob Mottram committed
    systemctl daemon-reload
Bob Mottram's avatar
Bob Mottram committed

    userdel -r scuttlebot

    if [ -d /etc/scuttlebot ]; then
        rm -rf /etc/scuttlebot
    fi

    remove_completion_param install_scuttlebot
Bob Mottram's avatar
Bob Mottram committed
    sed -i '/scuttlebot /d' "$COMPLETION_FILE"
Bob Mottram's avatar
Bob Mottram committed
}

Bob Mottram's avatar
Bob Mottram committed
function mesh_install_scuttlebot {
Bob Mottram's avatar
Bob Mottram committed
    #shellcheck disable=SC2153
    if [[ "$VARIANT" != "meshclient" && "$VARIANT" != "meshusb" ]]; then
        return
    fi

    # shellcheck disable=SC2086
    chroot "$rootdir" $INSTALL_PACKAGES libsodium23
Bob Mottram's avatar
Bob Mottram committed
    chroot "$rootdir" $INSTALL_PACKAGES autotools-dev automake
    get_npm_arch
Bob Mottram's avatar
Bob Mottram committed
    mesh_setup_npm
    if [ ! -d "$rootdir/etc/scuttlebot" ]; then
        mkdir -p "$rootdir/etc/scuttlebot"
    fi

    # an unprivileged user to install and run as
    chroot "$rootdir" useradd -d /etc/scuttlebot/ scuttlebot
    chroot "$rootdir" chown -R scuttlebot:scuttlebot /etc/scuttlebot
Bob Mottram's avatar
Bob Mottram committed
    cat <<EOF > "$rootdir/usr/bin/install_scuttlebot"
Bob Mottram's avatar
Bob Mottram committed
#!/bin/bash
cd /etc/scuttlebot || exit 1
if ! npm install --arch=$NPM_ARCH scuttlebot@${SCUTTLEBOT_VERSION}; then
    exit 2
Bob Mottram's avatar
Bob Mottram committed
fi
Bob Mottram's avatar
Bob Mottram committed
exit 0
Bob Mottram's avatar
Bob Mottram committed
EOF
    chroot "$rootdir" /bin/chmod +x /usr/bin/install_scuttlebot
    chroot "$rootdir" sudo -u scuttlebot /usr/bin/install_scuttlebot
Bob Mottram's avatar
Bob Mottram committed
    rm "$rootdir/usr/bin/install_scuttlebot"
    if [ ! -f "$rootdir/etc/scuttlebot/node_modules/.bin/sbot" ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo $'Scuttlebot was not installed'
        exit 528253
    fi

    # daemon
Bob Mottram's avatar
Bob Mottram committed
    { echo '[Unit]';
      echo 'Description=Scuttlebot (messaging system)';
      echo 'After=syslog.target';
      echo 'After=network.target';
      echo '';
      echo '[Service]';
      echo 'Type=simple';
      echo 'User=scuttlebot';
      echo 'Group=scuttlebot';
      echo "WorkingDirectory=/etc/scuttlebot";
Bob Mottram's avatar
Bob Mottram committed
      echo 'ExecStart=/etc/scuttlebot/node_modules/scuttlebot/bin.js server';
Bob Mottram's avatar
Bob Mottram committed
      echo 'Restart=always';
      echo 'Environment="USER=scuttlebot"';
      echo 'PrivateTmp=true';
      echo 'PrivateDevices=false';
      echo 'NoNewPrivileges=true';
      echo 'CapabilityBoundingSet=~CAP_SYS_ADMIN';
Bob Mottram's avatar
Bob Mottram committed
      echo '';
      echo '[Install]';
      echo 'WantedBy=multi-user.target'; } > "$rootdir/etc/systemd/system/scuttlebot.service"
function install_scuttlebutt-notification {
    cat <<EOF > /usr/bin/install_scuttlebutt_notification
#!/bin/bash
Bob Mottram's avatar
Bob Mottram committed
cd /etc/scuttlebot || exit 1
if ! git clone https://github.com/ssbc/ssb-example-pm notification; then
    echo $'ssb-example-pm was not cloned'
    exit 2
fi

if [ ! -d /etc/scuttlebot/notification ]; then
    echo $'/etc/scuttlebot/notification not found'
    exit 3
fi

cd /etc/scuttlebot/notification || exit 4
npm install

exit 0
EOF
    chmod +x /usr/bin/install_scuttlebutt_notification
    su -c '/usr/bin/install_scuttlebutt_notification' - scuttlebot
    rm /usr/bin/install_scuttlebutt_notification
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
    if [ ! -f /etc/scuttlebot/notification/ssb-example-pm.js ]; then
        echo $'ssb-example-pm.js was not cloned'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
function install_scuttlebot {
    function_check install_nodejs
    install_nodejs scuttlebot

    $INSTALL_PACKAGES libsodium23
Bob Mottram's avatar
Bob Mottram committed
    $INSTALL_PACKAGES autotools-dev automake
    if [ -d /etc/scuttlebot ]; then
        rm -rf /etc/scuttlebot
    mkdir -p /etc/scuttlebot

    # an unprivileged user to install and run as
    useradd -d /etc/scuttlebot/ scuttlebot
    chown -R scuttlebot:scuttlebot /etc/scuttlebot

    cat <<EOF > /usr/bin/install_scuttlebot
#!/bin/bash
cd /etc/scuttlebot || exit 1
if ! npm install scuttlebot@${SCUTTLEBOT_VERSION}; then
    exit 2
fi

if ! npm install ssb-dht-invite@0.9.0; then
    exit 3
fi

exit 0
EOF
    chmod +x /usr/bin/install_scuttlebot
    su -c '/usr/bin/install_scuttlebot' - scuttlebot
    rm /usr/bin/install_scuttlebot

    if [ ! -f /etc/scuttlebot/node_modules/.bin/sbot ]; then
        echo $'Scuttlebot was not installed'
Bob Mottram's avatar
Bob Mottram committed
    fi

    # daemon
Bob Mottram's avatar
Bob Mottram committed
    { echo '[Unit]';
      echo 'Description=Scuttlebot (messaging system)';
      echo 'After=syslog.target';
      echo 'After=network.target';
      echo '';
      echo '[Service]';
      echo 'Type=simple';
      echo 'User=scuttlebot';
      echo 'Group=scuttlebot';
      echo "WorkingDirectory=/etc/scuttlebot";
Bob Mottram's avatar
Bob Mottram committed
      echo 'ExecStart=/etc/scuttlebot/node_modules/scuttlebot/bin.js server';
Bob Mottram's avatar
Bob Mottram committed
      echo 'Restart=always';
      echo 'Environment="USER=scuttlebot"';
      echo '';
      echo '[Install]';
      echo 'WantedBy=multi-user.target'; } > /etc/systemd/system/scuttlebot.service
Bob Mottram's avatar
Bob Mottram committed

    enable_mdns
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
    if [ ! -d /etc/scuttlebot/.ssb ]; then
Bob Mottram's avatar
Bob Mottram committed
        mkdir /etc/scuttlebot/.ssb
Bob Mottram's avatar
Bob Mottram committed
    SCUTTLEBOT_ONION_HOSTNAME=$(add_onion_service scuttlebot 80 ${SCUTTLEBOT_ONION_PORT})

    if [[ "$ONION_ONLY" == 'no' ]]; then
        { echo '{';
          echo "  \"host\": \"${DEFAULT_DOMAIN_NAME}\",";
          echo '  "tor-only": false,'; } > /etc/scuttlebot/.ssb/config
    else
        { echo '{';
          echo "  \"host\": \"${SCUTTLEBOT_ONION_HOSTNAME}\",";
          echo '  "tor-only": true,'; } > /etc/scuttlebot/.ssb/config
    fi

    { echo "  \"port\": ${SCUTTLEBOT_PORT},";
Bob Mottram's avatar
Bob Mottram committed
      echo '  "timeout": 30000,';
      echo '  "pub": true,';
      echo '  "local": true,';
      echo '  "friends": {';
      echo "    \"dunbar\": ${SCUTTLEBOT_REPLICATE_NODES},";
      echo '    "hops": 1';
Bob Mottram's avatar
Bob Mottram committed
      echo '  },';
      echo '  "gossip": {';
      echo '    "connections": 2';
      echo '  },';
      echo '  "master": [],';
      echo '  "logging": {';
      echo '    "level": "error"';
      echo '  }';
Bob Mottram's avatar
Bob Mottram committed
      echo '}'; } >> /etc/scuttlebot/.ssb/config
Bob Mottram's avatar
Bob Mottram committed

    chown -R scuttlebot:scuttlebot /etc/scuttlebot

    # start the daemon
    systemctl enable scuttlebot.service
    systemctl daemon-reload
Bob Mottram's avatar
Bob Mottram committed
    systemctl restart scuttlebot.service

Bob Mottram's avatar
Bob Mottram committed
    firewall_add scuttlebot ${SCUTTLEBOT_PORT}

Bob Mottram's avatar
Bob Mottram committed
    # wait for keys to be generated
    ctr=0
Bob Mottram's avatar
Bob Mottram committed
    while [ $ctr -lt 6 ]; do
Bob Mottram's avatar
Bob Mottram committed
        if [ -f /etc/scuttlebot/.ssb/manifest.json ]; then
            break
        fi
        ctr=$((ctr+1))
        sleep 3
    done

    if [ ! -f /etc/scuttlebot/.ssb/manifest.json ]; then
        echo $'scuttlebot manifest was not generated'
Bob Mottram's avatar
Bob Mottram committed
    fi

    scuttlebot_create_single_invite

    create_default_web_site

    install_scuttlebutt-notification

Bob Mottram's avatar
Bob Mottram committed
    if ! grep -q "scuttlebot version:" "${COMPLETION_FILE}"; then
        echo "scuttlebot version:${SCUTTLEBOT_VERSION}" >> "${COMPLETION_FILE}"
Bob Mottram's avatar
Bob Mottram committed
    else
Bob Mottram's avatar
Bob Mottram committed
        sed -i "s|scuttlebot version.*|scuttlebot version:${SCUTTLEBOT_VERSION}|g" "${COMPLETION_FILE}"
Bob Mottram's avatar
Bob Mottram committed
    fi

    APP_INSTALLED=1
}

# NOTE: deliberately no exit 0