| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 | #!/bin/bash
#
# .---.                  .              .
# |                      |              |
# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
#
#                    Freedom in the Cloud
#
# scuttlebot pub application
# https://scuttlebot.io
# Problem: on occasion uses 100% of the CPU, severely impacting other services
#
# License
# =======
#
# Copyright (C) 2017 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=''
IN_DEFAULT_INSTALL=0
SHOW_ON_ABOUT=0
SHOW_ICANN_ADDRESS_ON_ABOUT=0
SCUTTLEBOT_VERSION='9.8.0'
SCUTTLEBOT_PORT=8008
scuttlebot_variables=(MY_USERNAME
                      DEFAULT_DOMAIN_NAME
                      SYSTEM_TYPE)
function logging_on_scuttlebot {
    echo -n ''
}
function logging_off_scuttlebot {
    echo -n ''
}
function scuttlebot_create_invite {
    invite_string=$(su -c "sbot invite.create 1" - scuttlebot | sed 's/"//g')
    clear
    echo -e '\n\nYour Scuttlebot invite code is:\n\n'${invite_string}'\n\n'
    read -n1 -r -p $"Press any key to continue..." key
}
function configure_interactive_scuttlebot {
    while true
    do
        data=$(tempfile 2>/dev/null)
        trap "rm -f $data" 0 1 2 5 15
        dialog --backtitle $"Freedombone Control Panel" \
               --title $"Scuttlebot" \
               --radiolist $"Choose an operation:" 10 50 2 \
               1 $"Create an invite" off \
               2 $"Exit" on 2> $data
        sel=$?
        case $sel in
            1) return;;
            255) return;;
        esac
        case $(cat $data) in
            1) scuttlebot_create_invite;;
            2) break;;
        esac
    done
}
function remove_user_scuttlebot {
    remove_username="$1"
}
function add_user_scuttlebot {
    new_username="$1"
    new_user_password="$2"
    echo '0'
}
function install_interactive_scuttlebot {
    echo -n ''
    APP_INSTALLED=1
}
function change_password_scuttlebot {
    new_username="$1"
    new_user_password="$2"
    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 {
    if ! grep -q 'scuttlebot version:' $COMPLETION_FILE; then
        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
    npm upgrade -g scuttlebot@${SCUTTLEBOT_VERSION} --save
    if [ ! "$?" = "0" ]; then
        return
    fi
    sed -i "s|scuttlebot version.*|scuttlebot version:${SCUTTLEBOT_VERSION}|g" ${COMPLETION_FILE}
}
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
        cp -r $temp_restore_dir/etc/scuttlebot/.ssb /etc/scuttlebot/
        systemctl start scuttlebot
    fi
}
function backup_remote_scuttlebot {
    if [ -d /etc/scuttlebot/.ssb ]; then
        systemctl stop scuttlebot
        function_check backup_directory_to_friend
        backup_directory_to_friend /etc/scuttlebot/.ssb scuttlebot
        systemctl start scuttlebot
    fi
}
function restore_remote_scuttlebot {
    if [ -d /etc/scuttlebot ]; then
        systemctl stop scuttlebot
        temp_restore_dir=/root/tempscuttlebot
        function_check restore_directory_from_friend
        restore_directory_from_friend $temp_restore_dir scuttlebot
        cp -r $temp_restore_dir/etc/scuttlebot/.ssb /etc/scuttlebot/
        systemctl start scuttlebot
    fi
}
function remove_scuttlebot {
    firewall_remove ${SCUTTLEBOT_PORT}
    systemctl stop scuttlebot
    systemctl disable scuttlebot
    rm /etc/systemd/system/scuttlebot.service
    systemctl daemon-reload
    userdel -r scuttlebot
    if [ -d /etc/scuttlebot ]; then
        rm -rf /etc/scuttlebot
    fi
    remove_completion_param install_scuttlebot
    sed -i '/scuttlebot /d' $COMPLETION_FILE
}
function install_scuttlebot {
    function_check install_nodejs
    install_nodejs scuttlebot
    npm install -g scuttlebot@${SCUTTLEBOT_VERSION}
    if [ ! -f /usr/local/bin/sbot ]; then
        exit 528253
    fi
    if [ ! -d /etc/scuttlebot ]; then
        mkdir -p /etc/scuttlebot
    fi
    # an unprivileged user to run as
    useradd -d /etc/scuttlebot/ scuttlebot
    # daemon
    echo '[Unit]' > /etc/systemd/system/scuttlebot.service
    echo 'Description=Scuttlebot (messaging system)' >> /etc/systemd/system/scuttlebot.service
    echo 'After=syslog.target' >> /etc/systemd/system/scuttlebot.service
    echo 'After=network.target' >> /etc/systemd/system/scuttlebot.service
    echo '' >> /etc/systemd/system/scuttlebot.service
    echo '[Service]' >> /etc/systemd/system/scuttlebot.service
    echo 'Type=simple' >> /etc/systemd/system/scuttlebot.service
    echo 'User=scuttlebot' >> /etc/systemd/system/scuttlebot.service
    echo 'Group=scuttlebot' >> /etc/systemd/system/scuttlebot.service
    echo "WorkingDirectory=/etc/scuttlebot" >> /etc/systemd/system/scuttlebot.service
    echo 'ExecStart=/usr/local/bin/sbot server' >> /etc/systemd/system/scuttlebot.service
    echo 'Restart=always' >> /etc/systemd/system/scuttlebot.service
    echo 'Environment="USER=scuttlebot"' >> /etc/systemd/system/scuttlebot.service
    echo '' >> /etc/systemd/system/scuttlebot.service
    echo '[Install]' >> /etc/systemd/system/scuttlebot.service
    echo 'WantedBy=multi-user.target' >> /etc/systemd/system/scuttlebot.service
    chown -R scuttlebot:scuttlebot /etc/scuttlebot
    # files gw_name myhostname mdns4_minimal [NOTFOUND=return] dns
    sed -i "s|hosts:.*|hosts:          files mdns4_minimal dns mdns4 mdns|g" /etc/nsswitch.conf
    # start the daemon
    systemctl enable scuttlebot.service
    systemctl daemon-reload
    systemctl start scuttlebot.service
    sleep 3
    if [ ! -d /etc/scuttlebot/.ssb ]; then
        echo $'Scuttlebot config not generated'
        exit 73528
    fi
    echo '{' > /etc/scuttlebot/.ssb/config
    echo "  \"host\": \"${DEFAULT_DOMAIN_NAME}\"," >> /etc/scuttlebot/.ssb/config
    echo "  \"port\": ${SCUTTLEBOT_PORT}," >> /etc/scuttlebot/.ssb/config
    echo '  "timeout": 30000,' >> /etc/scuttlebot/.ssb/config
    echo '  "pub": true,' >> /etc/scuttlebot/.ssb/config
    echo '  "local": true,' >> /etc/scuttlebot/.ssb/config
    echo '  "friends": {' >> /etc/scuttlebot/.ssb/config
    echo '    "dunbar": 150,' >> /etc/scuttlebot/.ssb/config
    echo '    "hops": 3' >> /etc/scuttlebot/.ssb/config
    echo '  },' >> /etc/scuttlebot/.ssb/config
    echo '  "gossip": {' >> /etc/scuttlebot/.ssb/config
    echo '    "connections": 2' >> /etc/scuttlebot/.ssb/config
    echo '  },' >> /etc/scuttlebot/.ssb/config
    echo '  "master": [],' >> /etc/scuttlebot/.ssb/config
    echo '  "logging": {' >> /etc/scuttlebot/.ssb/config
    echo '    "level": "error"' >> /etc/scuttlebot/.ssb/config
    echo '  }' >> /etc/scuttlebot/.ssb/config
    echo '}' >> /etc/scuttlebot/.ssb/config
    chown scuttlebot:scuttlebot /etc/scuttlebot/.ssb/config
    systemctl restart scuttlebot.service
    firewall_add scuttlebot ${SCUTTLEBOT_PORT}
    if ! grep -q "scuttlebot version:" ${COMPLETION_FILE}; then
        echo "scuttlebot version:${SCUTTLEBOT_VERSION}" >> ${COMPLETION_FILE}
    else
        sed -i "s|scuttlebot version.*|scuttlebot version:${SCUTTLEBOT_VERSION}|g" ${COMPLETION_FILE}
    fi
    APP_INSTALLED=1
}
# NOTE: deliberately no exit 0
 |