raspiblitz/home.admin/config.scripts/bonus.ckbunker.sh

298 lines
9.2 KiB
Bash
Raw Normal View History

#!/bin/bash
GITHUB_REPO="https://github.com/Coldcard/ckbunker"
VERSION="bf08623875b576c4bc4498dc68e749cdf6b5de31"
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
echo "# Config script to switch the CKbunker on or off"
echo "# Installs CKBunker ${GITHUB_REPO}/commit/${VERSION}"
echo "# bonus.ckbunker.sh status -> status information (key=value)"
echo "# bonus.ckbunker.sh on -> install the app"
echo "# bonus.ckbunker.sh off -> uninstall the app"
echo "# bonus.ckbunker.sh menu -> SSH menu dialog"
echo "# bonus.ckbunker.sh prestart -> will be called by systemd before start"
exit 1
fi
source /mnt/hdd/raspiblitz.conf
GITHUB_SIGN_AUTHOR="web-flow"
GITHUB_SIGN_PUBKEYLINK="https://github.com/web-flow.gpg"
GITHUB_SIGN_FINGERPRINT="4AEE18F83AFDEB23"
PORT_CLEAR="9823"
PORT_SSL="9824"
PORT_TOR_CLEAR="9825"
PORT_TOR_SSL="9826"
localIP=$(hostname -I | awk '{print $1}')
# check if app is already installed
isInstalled=$(sudo ls /etc/systemd/system/ckbunker.service 2>/dev/null | grep -c "ckbunker.service")
# check if service is running
isRunning=$(systemctl status ckbunker 2>/dev/null | grep -c 'active (running)')
if [ "${isInstalled}" == "1" ]; then
# gather address info (whats needed to call the app)
toraddress=$(sudo cat /mnt/hdd/tor/ckbunker/hostname 2>/dev/null)
fingerprint=$(openssl x509 -in /mnt/hdd/app-data/nginx/tls.cert -fingerprint -noout | cut -d"=" -f2)
fi
if [ "$1" = "status" ]; then
echo "appID='ckbunker'"
echo "githubRepo='${GITHUB_REPO}'"
echo "githubVersion='${GITHUB_VERSION}'"
echo "githubSignature='${GITHUB_SIGNATURE}'"
echo "isInstalled=${isInstalled}"
echo "isRunning=${isRunning}"
if [ "${isInstalled}" == "1" ]; then
echo "portCLEAR=${PORT_CLEAR}"
echo "portSSL=${PORT_SSL}"
echo "localIP='${localIP}'"
echo "toraddress='${toraddress}'"
echo "fingerprint='${fingerprint}'"
echo "toraddress='${toraddress}'"
fi
exit
fi
# show info menu
if [ "$1" = "menu" ]; then
dialogTitle="CKbunker setup"
dialogText="# To set up first switch to the 'ckbunker' user:
sudo su - ckbunker
# run:
ckbunker setup
# open in your local web browser:
https://${localIP}:${PORT_SSL}/setup with Fingerprint:
${fingerprint}\n
# follow the guide at:
https://ckbunker.com/setup.html
(save your password)
# When the setup is done start the service in the background:
sudo systemctl enable ckbunker
sudo systemctl start ckbunker"
# use whiptail to show SSH dialog & exit
whiptail --title "${dialogTitle}" --msgbox "${dialogText}" 21 67
echo "please wait ..."
exit 0
fi
# switch on
if [ "$1" = "1" ] || [ "$1" = "on" ]; then
echo "# Install CKBunker"
if [ ${isInstalled} -eq 1 ]; then
echo "# ckbunker.service is already installed."
exit 1
fi
echo "# Installing ckbunker ..."
# dependencies
sudo apt install -y virtualenv python-dev libusb-1.0-0-dev libudev-dev
# create dedicated user
sudo adduser --disabled-password --gecos "" ckbunker
# add the user to the Tor group
sudo usermod -a -G debian-tor ckbunker
if ! [ -d /mnt/hdd/app-data/ckbunker ]; then
echo "# create app-data directory"
sudo mkdir /mnt/hdd/app-data/ckbunker 2>/dev/null
sudo chown ckbunker:ckbunker -R /mnt/hdd/app-data/ckbunker
else
echo "# reuse existing app-directory"
sudo chown ckbunker:ckbunker -R /mnt/hdd/app-data/ckbunker
fi
echo "# download the source code & verify"
sudo -u ckbunker git clone --recursive ${GITHUB_REPO} /home/ckbunker/ckbunker
cd /home/ckbunker/ckbunker || exit 1
sudo -u ckbunker git reset --hard ${VERSION}
if [ "${GITHUB_SIGN_AUTHOR}" != "" ]; then
sudo -u ckbunker /home/admin/config.scripts/blitz.git-verify.sh \
"${GITHUB_SIGN_AUTHOR}" "${GITHUB_SIGN_PUBKEYLINK}" "${GITHUB_SIGN_FINGERPRINT}" || exit 1
fi
sudo -u ckbunker virtualenv -p python3 ENV
sudo -u ckbunker sh -c '. /home/ckbunker/ckbunker/ENV/bin/activate && \
pip install -r requirements.txt && pip install --editable .'
echo "# add the udev rules"
cd /etc/udev/rules.d/
sudo wget https://raw.githubusercontent.com/Coldcard/ckcc-protocol/master/51-coinkite.rules
sudo udevadm control --reload-rules && sudo udevadm trigger
echo "source /home/ckbunker/ckbunker/ENV/bin/activate" | sudo -u ckbunker tee -a /home/ckbunker/.bashrc
echo "PATH=\$PATH:~/ckbunker/ENV/bin/" | sudo -u ckbunker tee -a /home/ckbunker/.bashrc
echo "cd /home/ckbunker/ckbunker" | sudo -u ckbunker tee -a /home/ckbunker/.bashrc
echo "# updating Firewall"
sudo ufw allow ${PORT_CLEAR} comment "ckbunker HTTP"
sudo ufw allow ${PORT_SSL} comment "ckbunker HTTPS"
echo "# create systemd service: ckbunker.service"
echo "
[Unit]
Description=ckbunker
Wants=bitcoind
After=bitcoind
[Service]
WorkingDirectory=/home/ckbunker/ckbunker/
ExecStartPre=-/home/admin/config.scripts/bonus.ckbunker.sh prestart
ExecStart=sh -c '. ENV/bin/activate && ENV/bin/ckbunker run'
User=ckbunker
Restart=always
TimeoutSec=120
RestartSec=30
StandardOutput=null
StandardError=journal
# Hardening measures
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
PrivateDevices=true
[Install]
WantedBy=multi-user.target
" | sudo tee /etc/systemd/system/ckbunker.service
sudo chown root:root /etc/systemd/system/ckbunker.service
# when tor is set on also install the hidden service
if [ "${runBehindTor}" = "on" ]; then
# activating tor hidden service
/home/admin/config.scripts/tor.onion-service.sh ckbunker 80 ${PORT_TOR_CLEAR} 443 ${PORT_TOR_SSL}
fi
echo "# setup nginx config"
# write the HTTPS config
echo "
server {
listen ${PORT_SSL} ssl;
listen [::]:${PORT_SSL} ssl;
server_name _;
include /etc/nginx/snippets/ssl-params.conf;
include /etc/nginx/snippets/ssl-certificate-app-data.conf;
access_log /var/log/nginx/access_ckbunker.log;
error_log /var/log/nginx/error_ckbunker.log;
location / {
proxy_pass http://127.0.0.1:${PORT_CLEAR};
include /etc/nginx/snippets/ssl-proxy-params.conf;
}
}
" | sudo tee /etc/nginx/sites-available/ckbunker_ssl.conf
sudo ln -sf /etc/nginx/sites-available/ckbunker_ssl.conf /etc/nginx/sites-enabled/
# write the Tor config
echo "
server {
2022-07-15 17:33:52 +01:00
listen ${PORT_TOR_CLEAR};
server_name _;
access_log /var/log/nginx/access_ckbunker.log;
error_log /var/log/nginx/error_ckbunker.log;
location / {
proxy_pass http://127.0.0.1:${PORT_CLEAR};
include /etc/nginx/snippets/ssl-proxy-params.conf;
}
}
" | sudo tee /etc/nginx/sites-available/ckbunker_tor.conf
sudo ln -sf /etc/nginx/sites-available/ckbunker_tor.conf /etc/nginx/sites-enabled/
# write the Tor+HTTPS config
echo "
server {
2022-07-15 17:33:52 +01:00
listen ${PORT_TOR_SSL} ssl;
server_name _;
include /etc/nginx/snippets/ssl-params.conf;
include /etc/nginx/snippets/ssl-certificate-app-data-tor.conf;
access_log /var/log/nginx/access_ckbunker.log;
error_log /var/log/nginx/error_ckbunker.log;
location / {
proxy_pass http://127.0.0.1:${PORT_CLEAR};
include /etc/nginx/snippets/ssl-proxy-params.conf;
}
}
" | sudo tee /etc/nginx/sites-available/ckbunker_tor_ssl.conf
sudo ln -sf /etc/nginx/sites-available/ckbunker_tor_ssl.conf /etc/nginx/sites-enabled/
# test nginx config & activate thru reload
sudo nginx -t
sudo systemctl reload nginx
# mark app as installed in raspiblitz config
/home/admin/config.scripts/blitz.conf.sh set ckbunker "on"
echo "# OK - CKbunker is now installed"
echo "# To set up:
# switch to the user
sudo su - ckbunker
# run:
ckbunker setup
# open in your local web browser:
https://${localIP}:${PORT_SSL}/setup
# and follow the guide at:
https://ckbunker.com/setup.html
# When the setup is done run the service in the backgound with:
sudo systemctl enable ckbunker
sudo systemctl start ckbunker
"
exit 0
fi
# switch off
if [ "$1" = "0" ] || [ "$1" = "off" ]; then
echo "# stop & remove systemd service"
sudo systemctl stop ckbunker 2>/dev/null
sudo systemctl disable ckbunker.service
sudo rm /etc/systemd/system/ckbunker.service
echo "# remove nginx symlinks"
sudo rm -f /etc/nginx/sites-enabled/ckbunker_ssl.conf 2>/dev/null
sudo rm -f /etc/nginx/sites-enabled/ckbunker_tor.conf 2>/dev/null
sudo rm -f /etc/nginx/sites-enabled/ckbunker_tor_ssl.conf 2>/dev/null
sudo rm -f /etc/nginx/sites-available/ckbunker_ssl.conf 2>/dev/null
sudo rm -f /etc/nginx/sites-available/ckbunker_tor.conf 2>/dev/null
sudo rm -f /etc/nginx/sites-available/ckbunker_tor_ssl.conf 2>/dev/null
sudo nginx -t
sudo systemctl reload nginx
echo "# close ports on firewall"
sudo ufw deny "${PORT_CLEAR}"
sudo ufw deny "${PORT_SSL}"
echo "# removing Tor hidden service (if active)"
/home/admin/config.scripts/tor.onion-service.sh off ckbunker
echo "# remove user"
sudo userdel -rf ckbunker
echo "# mark app as uninstalled in raspiblitz config"
/home/admin/config.scripts/blitz.conf.sh set ckbunker "off"
# only if 'delete-data' is an additional parameter then also the data directory gets deleted
if [ "$(echo "$@" | grep -c delete-data)" -gt 0 ]; then
echo "# found 'delete-data' parameter --> also deleting the app-data"
sudo rm -r /mnt/hdd/app-data/ckbunker
fi
echo "# OK - CKbunker is uninstalled now"
exit 0
fi
# just a basic error message when unknow action parameter was given
echo "# FAIL - Unknown Parameter $1"
exit 1