diff --git a/README.md b/README.md index 2816fc45a..05904dae3 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ There are further Services that can be switched on: * **Suez** (Channel Visualization for LND & CL) [details](https://github.com/prusnak/suez#suez) * **Helipad** (Podcasting 2.0 Boostagram reader) [details](https://github.com/Podcastindex-org/helipad) * **Homer** (Web Dashboard) [details](https://github.com/bastienwirtz/homer#readme) +* **Squeaknode** [details](https://github.com/yzernik/squeaknode) * **CL Spark Wallet** (WalletUI with BOLT12 offers) [details](https://github.com/shesek/spark-wallet#progressive-web-app) * **CL plugin: Sparko** (WalletUI & HTTP-RPC bridge) [details](https://github.com/fiatjaf/sparko#the-sparko-plugin) * **CL plugin: CLBOSS** (Automated Node Manager) [details](https://github.com/ZmnSCPxj/clboss#clboss-the-c-lightning-node-manager) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 6378c70d6..ce62fd281 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -156,6 +156,9 @@ if [ "${circuitbreaker}" == "on" ]; then fi if [ "${tallycoinConnect}" == "on" ]; then OPTIONS+=(TALLY "Tallycoin Connect") +fi +if [ "${squeaknode}" == "on" ]; then + OPTIONS+=(SQUEAKNODE "Squeaknode") fi # dont offer to switch to "testnet view for now" - so no wswitch back to mainnet needed @@ -307,6 +310,10 @@ case $CHOICE in HELIPAD) sudo /home/admin/config.scripts/bonus.helipad.sh menu ;; + + SQUEAKNODE) + /home/admin/config.scripts/bonus.squeaknode.sh menu + ;; CHANTOOLS) sudo /home/admin/config.scripts/bonus.chantools.sh menu ;; @@ -375,4 +382,4 @@ exitCodeOfSubmenu=$? if [ "${exitCodeOfSubmenu}" != "0" ]; then echo "# submenu signaled exit code '${exitCodeOfSubmenu}' --> forward to outside loop" fi -exit ${exitCodeOfSubmenu} \ No newline at end of file +exit ${exitCodeOfSubmenu} diff --git a/home.admin/00settingsMenuServices.sh b/home.admin/00settingsMenuServices.sh index 00a376ee8..b7e887113 100755 --- a/home.admin/00settingsMenuServices.sh +++ b/home.admin/00settingsMenuServices.sh @@ -30,6 +30,7 @@ if [ ${#spark} -eq 0 ]; then spark="off"; fi if [ ${#tallycoinConnect} -eq 0 ]; then tallycoinConnect="off"; fi if [ ${#helipad} -eq 0 ]; then helipad="off"; fi if [ ${#bitcoinminds} -eq 0 ]; then bitcoinminds="off"; fi +if [ ${#squeaknode} -eq 0 ]; then squeaknode="off"; fi # show select dialog echo "run dialog ..." @@ -65,6 +66,7 @@ if [ "${lightning}" == "lnd" ] || [ "${lnd}" == "on" ]; then OPTIONS+=(x 'LND Sphinx-Relay' ${sphinxrelay}) OPTIONS+=(f 'LND Helipad Boostagram reader' ${helipad}) OPTIONS+=(d 'LND Tallycoin Connect' ${tallycoinConnect}) + OPTIONS+=(q 'LND Squeaknode' ${squeaknode}) fi # just available for CL @@ -599,6 +601,21 @@ else echo "# Spark Wallet on mainnet Setting unchanged." fi +# squeaknode process choice +choice="off"; check=$(echo "${CHOICES}" | grep -c "q") +if [ ${check} -eq 1 ]; then choice="on"; fi +if [ "${squeaknode}" != "${choice}" ]; then + echo "squeaknode Setting changed .." + anychange=1 + sudo -u admin /home/admin/config.scripts/bonus.squeaknode.sh ${choice} + if [ "${choice}" = "on" ]; then + sudo systemctl start squeaknode + sudo -u admin /home/admin/config.scripts/bonus.squeaknode.sh menu + fi +else + echo "squeaknode setting unchanged." +fi + if [ ${anychange} -eq 0 ]; then dialog --msgbox "NOTHING CHANGED!\nUse Spacebar to check/uncheck services." 8 58 exit 0 diff --git a/home.admin/_provision_.sh b/home.admin/_provision_.sh index 189b7b0d2..b54aca872 100755 --- a/home.admin/_provision_.sh +++ b/home.admin/_provision_.sh @@ -727,6 +727,15 @@ else echo "Provisioning bitcoinminds.org - keep default" >> ${logFile} fi +# squeaknode +if [ "${squeaknode}" = "on" ]; then + echo "Provisioning Squeaknode - run config script" >> ${logFile} + sudo sed -i "s/^message=.*/message='Setup Squeaknode '/g" ${infoFile} + sudo -u admin /home/admin/config.scripts/bonus.squeaknode.sh on >> ${logFile} 2>&1 +else + echo "Provisioning Squeaknode - keep default" >> ${logFile} +fi + # custom install script from user customInstallAvailable=$(ls /mnt/hdd/app-data/custom-installs.sh 2>/dev/null | grep -c "custom-installs.sh") if [ ${customInstallAvailable} -gt 0 ]; then diff --git a/home.admin/config.scripts/bitcoin.install.sh b/home.admin/config.scripts/bitcoin.install.sh index fbb0915c8..f4dcad212 100644 --- a/home.admin/config.scripts/bitcoin.install.sh +++ b/home.admin/config.scripts/bitcoin.install.sh @@ -129,7 +129,7 @@ fi if [ "${CHAIN}" = testnet ];then prefix="t" bitcoinprefix="test" - zmqprefix=21 # zmqpubrawblock=21332 zmqpubrawtx=21333 + zmqprefix=21 # zmqpubrawblock=21332 zmqpubrawtx=21333 zmqpubhashblock=21334 rpcprefix=1 # rpcport=18332 elif [ ${CHAIN} = signet ];then prefix="s" @@ -188,6 +188,7 @@ rpcuser=raspiblitz rpcpassword=$randomRPCpass ${bitcoinprefix}.zmqpubrawblock=tcp://127.0.0.1:${zmqprefix}332 ${bitcoinprefix}.zmqpubrawtx=tcp://127.0.0.1:${zmqprefix}333 +${bitcoinprefix}.zmqpubhashblock=tcp://127.0.0.1:${zmqprefix}334 onlynet=onion proxy=127.0.0.1:9050 @@ -366,4 +367,4 @@ fi echo "# FAIL - Unknown Parameter $1" echo "# may need reboot to run" -exit 1 \ No newline at end of file +exit 1 diff --git a/home.admin/config.scripts/bonus.squeaknode.sh b/home.admin/config.scripts/bonus.squeaknode.sh new file mode 100644 index 000000000..c1f91782d --- /dev/null +++ b/home.admin/config.scripts/bonus.squeaknode.sh @@ -0,0 +1,309 @@ +#!/bin/bash + +# https://github.com/yzernik/squeaknode +pinnedVersion="v0.1.176" + +# command info +if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then + echo "small config script to switch squeaknode on or off" + echo "bonus.squeaknode.sh on" + echo "bonus.squeaknode.sh [off|status|menu|write-macaroons]" + exit 1 +fi + +source /mnt/hdd/raspiblitz.conf + +# show info menu +if [ "$1" = "menu" ]; then + + # get squeaknode status info + echo "# collecting status info ... (please wait)" + source <(sudo /home/admin/config.scripts/bonus.squeaknode.sh status) + + text="Local Web Browser: http://${localIP}:${httpPort}" + + whiptail --title " squeaknode " --msgbox "${text}" 16 69 + + /home/admin/config.scripts/blitz.display.sh hide + echo "please wait ..." + exit 0 +fi + +# add default value to raspi config if needed +if ! grep -Eq "^squeaknode=" /mnt/hdd/raspiblitz.conf; then + echo "squeaknode=off" >> /mnt/hdd/raspiblitz.conf +fi + +# status +if [ "$1" = "status" ]; then + + if [ "${squeaknode}" = "on" ]; then + echo "installed=1" + + localIP=$(hostname -I | awk '{print $1}') + echo "localIP='${localIP}'" + echo "httpPort='12994'" + + # check for error + isDead=$(sudo systemctl status squeaknode | grep -c 'inactive (dead)') + if [ ${isDead} -eq 1 ]; then + echo "error='Service Failed'" + exit 1 + fi + + else + echo "installed=0" + fi + exit 0 +fi + +# status +if [ "$1" = "write-macaroons" ]; then + + # make sure its run as user admin + adminUserId=$(id -u admin) + if [ "${EUID}" != "${adminUserId}" ]; then + echo "error='please run as admin user'" + exit 1 + fi + + echo "make sure symlink to central app-data directory exists" + if ! [[ -L "/home/squeaknode/.lnd" ]]; then + sudo rm -rf "/home/squeaknode/.lnd" # not a symlink.. delete it silently + sudo ln -s "/mnt/hdd/app-data/lnd/" "/home/squeaknode/.lnd" # and create symlink + fi + + # set tls.cert path (use | as separator to avoid escaping file path slashes) + sudo -u squeaknode sed -i "s|^SQUEAKNODE_LND_TLS_CERT_PATH=.*|SQUEAKNODE_LND_TLS_CERT_PATH=/home/squeaknode/.lnd/tls.cert|g" /home/squeaknode/squeaknode/.env + + # set macaroon path info in .env + # sudo chmod 600 /home/squeaknode/squeaknode/.env + lndMacaroonPath=$(sudo echo /home/squeaknode/.lnd/data/chain/${network}/${chain}net/admin.macaroon) + sudo chown squeaknode ${lndMacaroonPath} + sudo -u squeaknode sed -i "s|^SQUEAKNODE_LND_MACAROON_PATH=.*|SQUEAKNODE_LND_MACAROON_PATH=${lndMacaroonPath}|g" /home/squeaknode/squeaknode/.env + + toraddress=$(sudo cat /mnt/hdd/tor/squeaknode-p2p-${chain}net/hostname 2>/dev/null) + sudo -u squeaknode sed -i "s|^SQUEAKNODE_SERVER_EXTERNAL_ADDRESS=.*|SQUEAKNODE_SERVER_EXTERNAL_ADDRESS=${toraddress}|g" /home/squeaknode/squeaknode/.env + + # set macaroon path info in .env - USING PATH + echo "# OK - macaroons written to /home/squeaknode/squeaknode/.env" + + exit 0 +fi + +# stop service +echo "making sure services are not running" +sudo systemctl stop squeaknode 2>/dev/null + +# switch on +if [ "$1" = "1" ] || [ "$1" = "on" ]; then + echo "*** INSTALL squeaknode ***" + + if [ "${runBehindTor}" = "on" ]; then + # make sure to keep in sync with internet.tor.sh script + /home/admin/config.scripts/internet.hiddenservice.sh squeaknode-p2p-mainnet 8555 8555 + /home/admin/config.scripts/internet.hiddenservice.sh squeaknode-p2p-testnet 18555 18555 + fi + + isInstalled=$(sudo ls /etc/systemd/system/squeaknode.service 2>/dev/null | grep -c 'squeaknode.service') + if [ ${isInstalled} -eq 0 ]; then + + echo "*** Add the 'squeaknode' user ***" + sudo adduser --disabled-password --gecos "" squeaknode + + # make sure needed debian packages are installed + echo "# installing needed packages" + + # install from GitHub + githubRepo="https://github.com/yzernik/squeaknode" + echo "# get the github code ${githubRepo}" + sudo rm -r /home/squeaknode/squeaknode 2>/dev/null + cd /home/squeaknode + sudo -u squeaknode git clone ${githubRepo}.git + cd /home/squeaknode/squeaknode + sudo -u squeaknode git checkout ${pinnedVersion} + + # Prepare configs + RPCHOST="localhost" + RPCPORT="8332" + RPCUSER=$(sudo cat /mnt/hdd/${network}/${network}.conf | grep rpcuser | cut -c 9-) + PASSWORD_B=$(sudo cat /mnt/hdd/${network}/${network}.conf | grep rpcpassword | cut -c 13-) + + # prefix for zmq + if [ "${chain}" = "main" ];then + zmqprefix=28 + elif [ "${chain}" = "test" ];then + zmqprefix=21 + elif [ "${chain}" = "sig" ];then + zmqprefix=23 + else + echo "err='unvalid chain parameter on lnd.check.sh'" + exit 1 + fi + ZEROMQ_HASHBLOCK_PORT=${zmqprefix}334 + + LNDHOST="localhost" + LNDRPCPORT=10009 + + MAX_SQUEAKS=100000 + + # prepare .env file + echo "# preparing env file" + sudo rm /home/squeaknode/squeaknode/.env 2>/dev/null + sudo -u squeaknode touch /home/squeaknode/squeaknode/.env + sudo bash -c "echo 'SQUEAKNODE_BITCOIN_RPC_HOST=${RPCHOST}' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_BITCOIN_RPC_PORT=${RPCPORT}' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_BITCOIN_RPC_USER=${RPCUSER}' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_BITCOIN_RPC_PASS=${PASSWORD_B}' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_BITCOIN_ZEROMQ_HASHBLOCK_PORT=${ZEROMQ_HASHBLOCK_PORT}' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_LND_HOST=${LNDHOST}' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_LND_RPC_PORT=${LNDRPCPORT}' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_LND_TLS_CERT_PATH=' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_LND_MACAROON_PATH=' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_TOR_PROXY_IP=localhost' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_TOR_PROXY_PORT=9050' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_WEBADMIN_ENABLED=true' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_WEBADMIN_USERNAME=raspiblitz' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_WEBADMIN_PASSWORD=pass' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_NODE_NETWORK=${chain}net' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_NODE_MAX_SQUEAKS=${MAX_SQUEAKS}' >> /home/squeaknode/squeaknode/.env" + sudo bash -c "echo 'SQUEAKNODE_SERVER_EXTERNAL_ADDRESS=' >> /home/squeaknode/squeaknode/.env" + /home/admin/config.scripts/bonus.squeaknode.sh write-macaroons + + # set database path to HDD data so that its survives updates and migrations + sudo mkdir /mnt/hdd/app-data/squeaknode 2>/dev/null + sudo chown squeaknode:squeaknode -R /mnt/hdd/app-data/squeaknode + sudo bash -c "echo 'SQUEAKNODE_NODE_SQK_DIR_PATH=/mnt/hdd/app-data/squeaknode' >> /home/squeaknode/squeaknode/.env" + + # to the install + echo "# installing application dependencies" + + sudo apt update + sudo apt-get install -y libffi-dev libudev-dev + + cd /home/squeaknode/squeaknode + sudo -u squeaknode python3 -m venv venv + sudo -u squeaknode ./venv/bin/pip install --upgrade pip + sudo -u squeaknode ./venv/bin/pip install --upgrade setuptools + sudo -u squeaknode ./venv/bin/pip install --no-cache-dir --force-reinstall -Iv grpcio==1.39.0 + sudo -u squeaknode ./venv/bin/pip install wheel + sudo -u squeaknode ./venv/bin/pip install -r requirements.txt + sudo -u squeaknode ./venv/bin/pip install squeaknode==${pinnedVersion} + + # open firewall + echo + echo "*** Updating Firewall ***" + sudo ufw allow 8555 comment 'squeaknode P2P mainnet' + sudo ufw allow 18555 comment 'squeaknode P2P testnet' + sudo ufw allow 12994 comment 'squeaknode HTTP' + echo "" + + # install service + echo "*** Install systemd ***" + cat </dev/null +# systemd unit for squeaknode + +[Unit] +Description=squeaknode +Wants=bitcoind.service +After=bitcoind.service + +[Service] +EnvironmentFile=/home/squeaknode/squeaknode/.env +WorkingDirectory=/home/squeaknode/squeaknode +ExecStart=/bin/sh -c 'cd /home/squeaknode/squeaknode && ./venv/bin/squeaknode' +User=squeaknode +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 +EOF + + sudo systemctl enable squeaknode + + source /home/admin/raspiblitz.info + if [ "${state}" == "ready" ]; then + echo "# OK - squeaknode service is enabled, system is on ready so starting squeaknode service" + sudo systemctl start squeaknode + else + echo "# OK - squeaknode service is enabled, but needs reboot or manual starting: sudo systemctl start squeaknode" + fi + + else + echo "squeaknode already installed." + fi + + # setting value in raspi blitz config + sudo sed -i "s/^squeaknode=.*/squeaknode=on/g" /mnt/hdd/raspiblitz.conf + + # Hidden Service if Tor is active + source /mnt/hdd/raspiblitz.conf + exit 0 +fi + +# switch off +if [ "$1" = "0" ] || [ "$1" = "off" ]; then + + # check for second parameter: should data be deleted? + deleteData=0 + if [ "$2" = "--delete-data" ]; then + deleteData=1 + elif [ "$2" = "--keep-data" ]; then + deleteData=0 + else + if (whiptail --title " DELETE DATA? " --yesno "Do you want to delete\nthe squeaknode Server Data?" 8 30); then + deleteData=1 + else + deleteData=0 + fi + fi + echo "# deleteData(${deleteData})" + + # setting value in raspi blitz config + sudo sed -i "s/^squeaknode=.*/squeaknode=off/g" /mnt/hdd/raspiblitz.conf + + # Hidden Service if Tor is active + if [ "${runBehindTor}" = "on" ]; then + /home/admin/config.scripts/internet.hiddenservice.sh off squeaknode-p2p-mainnet + /home/admin/config.scripts/internet.hiddenservice.sh off squeaknode-p2p-testnet + fi + + isInstalled=$(sudo ls /etc/systemd/system/squeaknode.service 2>/dev/null | grep -c 'squeaknode.service') + if [ ${isInstalled} -eq 1 ] || [ "${squeaknode}" == "on" ]; then + echo "*** REMOVING squeaknode ***" + sudo systemctl stop squeaknode + sudo systemctl disable squeaknode + sudo rm /etc/systemd/system/squeaknode.service + sudo userdel -rf squeaknode + + if [ ${deleteData} -eq 1 ]; then + echo "# deleting data" + sudo rm -R /mnt/hdd/app-data/squeaknode + else + echo "# keeping data" + fi + + echo "OK squeaknode removed." + else + echo "squeaknode is not installed." + fi + + # close ports on firewall + sudo ufw deny 8555 + sudo ufw deny 18555 + sudo ufw deny 12994 + exit 0 +fi + +echo "FAIL - Unknown Parameter $1" +exit 1