Merge branch 'dev' into elements

This commit is contained in:
/rootzoll 2024-05-29 16:55:22 +02:00 committed by GitHub
commit 0e5ed29dd4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
33 changed files with 670 additions and 622 deletions

View File

@ -90,7 +90,7 @@
- Update: Core Lightning v23.02.2 [details](https://github.com/ElementsProject/lightning/releases/tag/v23.02.2) - Update: Core Lightning v23.02.2 [details](https://github.com/ElementsProject/lightning/releases/tag/v23.02.2)
- Update: C-lightningREST v0.10.2 [details](https://github.com/Ride-The-Lightning/c-lightning-REST/releases/tag/v0.10.2) - Update: C-lightningREST v0.10.2 [details](https://github.com/Ride-The-Lightning/c-lightning-REST/releases/tag/v0.10.2)
- Update: Electrum Server in Rust (electrs) v0.9.11 [details](https://github.com/romanz/electrs/blob/master/RELEASE-NOTES.md#0911-jan-5-2023) - Update: Electrum Server in Rust (electrs) v0.9.11 [details](https://github.com/romanz/electrs/blob/master/RELEASE-NOTES.md#0911-jan-5-2023)
- Update: Lightning Terminal v0.9.2-alpha [details](https://github.com/lightninglabs/lightning-terminal/releases/tag/v0.9.2-alpha) - Update: Lightning Terminal v0.8.6-alpha [details](https://github.com/lightninglabs/lightning-terminal/releases/tag/v0.8.6-alpha)
- Update: RTL v0.13.6 with update option [details](https://github.com/Ride-The-Lightning/RTL/releases/tag/v0.13.6) - Update: RTL v0.13.6 with update option [details](https://github.com/Ride-The-Lightning/RTL/releases/tag/v0.13.6)
- Update: Thunderhub v0.13.16 with balance sharing disabled [details](https://github.com/apotdevin/thunderhub/releases/tag/v0.13.16) - Update: Thunderhub v0.13.16 with balance sharing disabled [details](https://github.com/apotdevin/thunderhub/releases/tag/v0.13.16)
- Update: LNbits 0.10.6 [details](https://github.com/lnbits/lnbits/releases/tag/0.10.6) - Update: LNbits 0.10.6 [details](https://github.com/lnbits/lnbits/releases/tag/0.10.6)

View File

@ -369,7 +369,7 @@ echo -e "\n*** SOFTWARE UPDATE ***"
# sqlite3 -> database # sqlite3 -> database
# fdisk -> create partitions # fdisk -> create partitions
# lsb-release -> needed to know which distro version we're running to add APT sources # lsb-release -> needed to know which distro version we're running to add APT sources
general_utils="policykit-1 htop git curl bash-completion vim jq dphys-swapfile bsdmainutils autossh telnet vnstat parted dosfstools fbi sysbench build-essential dialog bc python3-dialog unzip whois fdisk lsb-release smartmontools rsyslog" general_utils="sudo policykit-1 htop git curl bash-completion vim jq dphys-swapfile bsdmainutils autossh telnet vnstat parted dosfstools fbi sysbench build-essential dialog bc python3-dialog unzip whois fdisk lsb-release smartmontools rsyslog resolvconf"
# add btrfs-progs if not bookworm on aarch64 # add btrfs-progs if not bookworm on aarch64
[ "${architecture}" = "aarch64" ] && ! grep "12 (bookworm)" < /etc/os-release && general_utils="${general_utils} btrfs-progs" [ "${architecture}" = "aarch64" ] && ! grep "12 (bookworm)" < /etc/os-release && general_utils="${general_utils} btrfs-progs"
# python3-mako --> https://github.com/rootzoll/raspiblitz/issues/3441 # python3-mako --> https://github.com/rootzoll/raspiblitz/issues/3441
@ -664,18 +664,19 @@ echo -e "\n*** ADDING GROUPS FOR CREDENTIALS STORE ***"
echo -e "\n*** SHELL SCRIPTS & ASSETS ***" echo -e "\n*** SHELL SCRIPTS & ASSETS ***"
# copy raspiblitz repo from github # copy raspiblitz repo from github
cd /home/admin/ || exit 1 cd /home/admin/ || exit 1
sudo -u admin git config --global user.name "${github_user}" sudo -u admin git config --global user.name "${github_user}" || exit 1
sudo -u admin git config --global user.email "johndoe@example.com" sudo -u admin git config --global user.email "johndoe@example.com" || exit 1
sudo -u admin git config --global http.postBuffer 524288000 || exit 1
sudo -u admin rm -rf /home/admin/raspiblitz sudo -u admin rm -rf /home/admin/raspiblitz
sudo -u admin git clone -b "${branch}" https://github.com/${github_user}/raspiblitz.git sudo -u admin git clone -b "${branch}" https://github.com/${github_user}/raspiblitz.git || exit 1
sudo -u admin cp -r /home/admin/raspiblitz/home.admin/*.* /home/admin sudo -u admin cp -r /home/admin/raspiblitz/home.admin/*.* /home/admin || exit 1
sudo -u admin cp /home/admin/raspiblitz/home.admin/.tmux.conf /home/admin sudo -u admin cp /home/admin/raspiblitz/home.admin/.tmux.conf /home/admin || exit 1
sudo -u admin cp -r /home/admin/raspiblitz/home.admin/assets /home/admin/ sudo -u admin cp -r /home/admin/raspiblitz/home.admin/assets /home/admin/ || exit 1
sudo -u admin chmod +x *.sh sudo -u admin chmod +x *.sh || exit 1
sudo -u admin cp -r /home/admin/raspiblitz/home.admin/config.scripts /home/admin/ sudo -u admin cp -r /home/admin/raspiblitz/home.admin/config.scripts /home/admin/ || exit 1
sudo -u admin chmod +x /home/admin/config.scripts/*.sh sudo -u admin chmod +x /home/admin/config.scripts/*.sh || exit 1
sudo -u admin cp -r /home/admin/raspiblitz/home.admin/setup.scripts /home/admin/ sudo -u admin cp -r /home/admin/raspiblitz/home.admin/setup.scripts /home/admin/ || exit 1
sudo -u admin chmod +x /home/admin/setup.scripts/*.sh sudo -u admin chmod +x /home/admin/setup.scripts/*.sh || exit 1
# install newest version of BlitzPy # install newest version of BlitzPy
blitzpy_wheel=$(ls -tR /home/admin/raspiblitz/home.admin/BlitzPy/dist | grep -E "any.whl" | tail -n 1) blitzpy_wheel=$(ls -tR /home/admin/raspiblitz/home.admin/BlitzPy/dist | grep -E "any.whl" | tail -n 1)

View File

@ -159,9 +159,6 @@ fi
if [ "${circuitbreaker}" == "on" ]; then if [ "${circuitbreaker}" == "on" ]; then
OPTIONS+=(CIRCUITBREAKER "Circuitbreaker (LND firewall)") OPTIONS+=(CIRCUITBREAKER "Circuitbreaker (LND firewall)")
fi fi
if [ "${tallycoinConnect}" == "on" ]; then
OPTIONS+=(TALLY "Tallycoin Connect")
fi
if [ "${squeaknode}" == "on" ]; then if [ "${squeaknode}" == "on" ]; then
OPTIONS+=(SQUEAKNODE "Squeaknode") OPTIONS+=(SQUEAKNODE "Squeaknode")
fi fi
@ -310,9 +307,6 @@ case $CHOICE in
THUB) THUB)
sudo /home/admin/config.scripts/bonus.thunderhub.sh menu sudo /home/admin/config.scripts/bonus.thunderhub.sh menu
;; ;;
TALLY)
sudo /home/admin/config.scripts/bonus.tallycoin-connect.sh menu
;;
ZEROTIER) ZEROTIER)
sudo /home/admin/config.scripts/bonus.zerotier.sh menu sudo /home/admin/config.scripts/bonus.zerotier.sh menu
;; ;;

View File

@ -98,8 +98,7 @@ do
network \ network \
chain \ chain \
lightning \ lightning \
internet_localip \ internet_localip
system_vm_vagrant \
) )
# background.scan is not ready yet # background.scan is not ready yet
@ -281,25 +280,6 @@ MAINMENU > REPAIR > REPAIR-LND > RETRYSCB
#echo "# DURING SETUP: Handle System State (${state})" #echo "# DURING SETUP: Handle System State (${state})"
# when no HDD on Vagrant - just print info & exit (admin info & exit)
if [ "${state}" == "noHDD" ] && [ ${system_vm_vagrant} != "0" ]; then
echo "***********************************************************"
echo "VAGRANT INFO"
echo "***********************************************************"
echo "To connect a HDD data disk to your VagrantVM:"
echo "- shutdown VM with command: off"
echo "- open your VirtualBox GUI and select RaspiBlitzVM"
echo "- change the 'mass storage' settings"
echo "- add a second 'Primary Slave' drive to the already existing controller"
echo "- close VirtualBox GUI and run: vagrant up & vagrant ssh"
echo "***********************************************************"
echo "You can either create a new dynamic VDI with around 900GB or download"
echo "a VDI with a presynced blockchain to speed up setup. If you dont have 900GB"
echo "space on your laptop you can store the VDI file on an external drive."
echo "***********************************************************"
exit 1
fi
# for all critical errors (admin info & exit) # for all critical errors (admin info & exit)
if [ "${state}" == "error" ] || [ "${state}" == "errorHDD" ]; then if [ "${state}" == "error" ] || [ "${state}" == "errorHDD" ]; then
clear clear

View File

@ -26,7 +26,6 @@ if [ ${#lit} -eq 0 ]; then lit="off"; fi
if [ ${#lndg} -eq 0 ]; then lndg="off"; fi if [ ${#lndg} -eq 0 ]; then lndg="off"; fi
if [ ${#whitepaper} -eq 0 ]; then whitepaper="off"; fi if [ ${#whitepaper} -eq 0 ]; then whitepaper="off"; fi
if [ ${#chantools} -eq 0 ]; then chantools="off"; fi if [ ${#chantools} -eq 0 ]; then chantools="off"; fi
if [ ${#tallycoinConnect} -eq 0 ]; then tallycoinConnect="off"; fi
if [ ${#helipad} -eq 0 ]; then helipad="off"; fi if [ ${#helipad} -eq 0 ]; then helipad="off"; fi
if [ ${#lightningtipbot} -eq 0 ]; then lightningtipbot="off"; fi if [ ${#lightningtipbot} -eq 0 ]; then lightningtipbot="off"; fi
if [ ${#fints} -eq 0 ]; then fints="off"; fi if [ ${#fints} -eq 0 ]; then fints="off"; fi
@ -66,7 +65,6 @@ if [ "${lightning}" == "lnd" ] || [ "${lnd}" == "on" ]; then
OPTIONS+=(ha 'LND ChannelTools (Fund Rescue)' ${chantools}) OPTIONS+=(ha 'LND ChannelTools (Fund Rescue)' ${chantools})
OPTIONS+=(xa 'LND Sphinx-Relay' ${sphinxrelay}) OPTIONS+=(xa 'LND Sphinx-Relay' ${sphinxrelay})
OPTIONS+=(fa 'LND Helipad Boostagram reader' ${helipad}) OPTIONS+=(fa 'LND Helipad Boostagram reader' ${helipad})
OPTIONS+=(da 'LND Tallycoin Connect' ${tallycoinConnect})
OPTIONS+=(lb 'LND LNDK (experimental BOLT 12)' ${lndk}) OPTIONS+=(lb 'LND LNDK (experimental BOLT 12)' ${lndk})
fi fi
@ -485,23 +483,6 @@ else
echo "Helipad setting unchanged." echo "Helipad setting unchanged."
fi fi
# Tallycoin
choice="off"; check=$(echo "${CHOICES}" | grep -c "da")
if [ ${check} -eq 1 ]; then choice="on"; fi
if [ "${tallycoinConnect}" != "${choice}" ]; then
echo "Tallycoin Setting changed .."
anychange=1
sudo -u admin /home/admin/config.scripts/bonus.tallycoin-connect.sh ${choice}
if [ "${choice}" = "on" ]; then
whiptail --title " Installed Tallycoin-Connect" --msgbox "\
Tallycoin-Connect was installed.\n
Use the new 'TALLY' entry in Main Menu for more info.\n
" 10 45
fi
else
echo "Tallycoin Setting unchanged."
fi
# LNDK # LNDK
choice="off"; check=$(echo "${CHOICES}" | grep -c "lb") choice="off"; check=$(echo "${CHOICES}" | grep -c "lb")
if [ ${check} -eq 1 ]; then choice="on"; fi if [ ${check} -eq 1 ]; then choice="on"; fi

View File

@ -490,9 +490,9 @@ if [ "${lndg}" == "on" ]; then
fi fi
## Disabled for now until the base image has Python 3.10 ## Disabled for now until the base image has Python 3.10
#if [ "${specter}" == "on" ]; then if [ "${specter}" == "on" ]; then
# OPTIONS+=(SPECTER "Update Specter Desktop") OPTIONS+=(SPECTER "Update Specter Desktop")
#fi fi
if [ "${BTCPayServer}" == "on" ]; then if [ "${BTCPayServer}" == "on" ]; then
OPTIONS+=(BTCPAY "Update BTCPayServer") OPTIONS+=(BTCPAY "Update BTCPayServer")

View File

@ -105,25 +105,11 @@ fi
echo "importing: _version.info" echo "importing: _version.info"
/home/admin/_cache.sh import /home/admin/_version.info /home/admin/_cache.sh import /home/admin/_version.info
# basic hardware info (will not change) # get hardware info
source <(/home/admin/_cache.sh valid \ source <(/home/admin/config.scripts/blitz.hardware.sh status)
system_board \ /home/admin/_cache.sh set system_board "${board}"
system_ram_mb \ /home/admin/_cache.sh set system_ram_mb "${ramMB}"
system_ram_gb \ /home/admin/_cache.sh set system_ram_gb "${ramGB}"
)
if [ "${stillvalid}" == "0" ]; then
source <(/home/admin/config.scripts/blitz.hardware.sh status)
/home/admin/_cache.sh set system_board "${board}"
/home/admin/_cache.sh set system_ram_mb "${ramMB}"
/home/admin/_cache.sh set system_ram_gb "${ramGB}"
fi
# VM detect vagrant
source <(/home/admin/_cache.sh valid system_vm_vagrant)
if [ "${stillvalid}" == "0" ]; then
vagrant=$(df | grep -c "/vagrant")
/home/admin/_cache.sh set system_vm_vagrant "${vagrant}"
fi
# flag that init was done (will be checked on each loop) # flag that init was done (will be checked on each loop)
/home/admin/_cache.sh set system_init_time "$(date +%s)" /home/admin/_cache.sh set system_init_time "$(date +%s)"
@ -171,9 +157,7 @@ do
fi fi
# ram # ram
ram=$(free -m | grep Mem | awk '{ print $2 }') ram_avail=$(free -m | grep -E 'Mem|Speicher' | awk '{ print $7 }')
ram_avail=$(free -m | grep Mem | awk '{ print $7 }')
/home/admin/_cache.sh set system_ram_mb "${ram}"
/home/admin/_cache.sh set system_ram_available_mb "${ram_avail}" /home/admin/_cache.sh set system_ram_available_mb "${ram_avail}"
# undervoltage # undervoltage

View File

@ -337,6 +337,34 @@ else
echo "No HDMI switch found. " >> $logFile echo "No HDMI switch found. " >> $logFile
fi fi
################################
# GPT integrity check
################################
check_and_fix_gpt() {
local device=$1
output=$(sudo gdisk -l $device 2>&1)
if echo "$output" | grep -q "PMBR size mismatch"; then
echo "GPT PMBR size mismatch detected on $device. Fixing..." >> $logFile
sgdisk -e $device
echo "Fixed GPT PMBR size mismatch on $device." >> $logFile
elif echo "$output" | grep -q "The backup GPT table is not on the end of the device"; then
echo "Backup GPT table is not at the end of $device. Fixing..." >> $logFile
sgdisk -e $device
echo "Fixed backup GPT table location on $device." >> $logFile
else
echo "No GPT issues detected on $device." >> $logFile
fi
}
# List all block devices
devices=$(lsblk -dno NAME | grep -E '^sd|^nvme|^vd|^mmcblk')
# Check and fix each device
for dev in $devices; do
check_and_fix_gpt /dev/$dev
done
################################ ################################
# FS EXPAND # FS EXPAND
# extend sd card to maximum capacity # extend sd card to maximum capacity
@ -520,13 +548,15 @@ if [ "${baseimage}" == "raspios_arm64" ]; then
isRaspberryPi5=$(cat /proc/device-tree/model 2>/dev/null | grep -c "Raspberry Pi 5") isRaspberryPi5=$(cat /proc/device-tree/model 2>/dev/null | grep -c "Raspberry Pi 5")
firmwareBuildNumber=$(rpi-eeprom-update | grep "CURRENT" | cut -d "(" -f2 | sed 's/[^0-9]*//g') firmwareBuildNumber=$(rpi-eeprom-update | grep "CURRENT" | cut -d "(" -f2 | sed 's/[^0-9]*//g')
echo "checking Firmware: isRaspberryPi5(${isRaspberryPi5}) firmwareBuildNumber(${firmwareBuildNumber})" >> $logFile echo "checking Firmware: isRaspberryPi5(${isRaspberryPi5}) firmwareBuildNumber(${firmwareBuildNumber})" >> $logFile
if [ ${isRaspberryPi5} -gt 0 ] && [ ${firmwareBuildNumber} -lt 1701887365 ]; then if [ ${isRaspberryPi5} -gt 0 ] && [ ${firmwareBuildNumber} -lt 1708097321 ]; then # Fri 16 Feb 15:28:41 UTC 2024 (1708097321)
echo "RaspberryPi 5 detected with old firmware ... do update." >> $logFile echo "updating Firmware" >> $logFile
echo "RaspberryPi 5 detected with old firmware (${firmwareBuildNumber}) ... do update." >> $logFile
apt-get update -y apt-get update -y
apt-get upgrade -y apt-get upgrade -y
apt-get install -y rpi-eeprom apt-get install -y rpi-eeprom
rpi-eeprom-update -a rpi-eeprom-update -a
echo "Restarting ..." >> $logFile echo "Restarting ..." >> $logFile
sleep 3
reboot reboot
else else
echo "RaspberryPi Firmware not in th need of update." >> $logFile echo "RaspberryPi Firmware not in th need of update." >> $logFile

View File

@ -55,6 +55,11 @@ function blitzhelp() {
echo " cache check on chache system state" echo " cache check on chache system state"
echo " github jumping directly into the options to change branch/repo/pr" echo " github jumping directly into the options to change branch/repo/pr"
echo echo
echo "Development with VM:"
echo " sync sync all repos from shared folder"
echo " sync code sync only main raspiblitz repo from shared folder"
echo " sync api sync only blitz api repo from shared folder"
echo
echo "Power:" echo "Power:"
echo " restart restart the node" echo " restart restart the node"
echo " off shutdown the node" echo " off shutdown the node"
@ -81,7 +86,7 @@ function blitzhelp() {
echo " whitepaper download the whitepaper from the blockchain to /home/admin/bitcoin.pdf" echo " whitepaper download the whitepaper from the blockchain to /home/admin/bitcoin.pdf"
echo " notifyme wrapper for blitz.notify.sh that will send a notification using the configured method and settings" echo " notifyme wrapper for blitz.notify.sh that will send a notification using the configured method and settings"
echo " suez visualize channels (for the default ln implementation and chain when installed)" echo " suez visualize channels (for the default ln implementation and chain when installed)"
exho " lnproxy wrap invoices with lnproxy" echo " lnproxy wrap invoices with lnproxy"
echo echo
echo "LND:" echo "LND:"
echo " lncli LND commandline interface (when installed)" echo " lncli LND commandline interface (when installed)"
@ -215,6 +220,13 @@ function patch() {
echo echo
} }
# command: sync
# sync VM with shared folder
function sync() {
sudo /home/admin/config.scripts/blitz.vm.sh sync ${1}
echo
}
# command: off # command: off
function off() { function off() {
echo "Command to power off your RaspiBlitz" echo "Command to power off your RaspiBlitz"

View File

@ -721,15 +721,6 @@ else
echo "Provisioning CircuitBreaker - keep default" >> ${logFile} echo "Provisioning CircuitBreaker - keep default" >> ${logFile}
fi fi
# tallycoin_connect
if [ "${tallycoinConnect}" = "on" ]; then
echo "Provisioning Tallycoin Connect - run config script" >> ${logFile}
/home/admin/_cache.sh set message "Setup Tallycoin Connect"
sudo -u admin /home/admin/config.scripts/bonus.tallycoin-connect.sh on >> ${logFile} 2>&1
else
echo "Provisioning Tallycoin Connect - keep default" >> ${logFile}
fi
# squeaknode # squeaknode
if [ "${squeaknode}" = "on" ]; then if [ "${squeaknode}" = "on" ]; then
echo "Provisioning Squeaknode - run config script" >> ${logFile} echo "Provisioning Squeaknode - run config script" >> ${logFile}

View File

@ -19,6 +19,11 @@ server {
location / { location / {
proxy_pass http://127.0.0.1:5000; proxy_pass http://127.0.0.1:5000;
# needed for websocket connections
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
include /etc/nginx/snippets/ssl-proxy-params.conf; include /etc/nginx/snippets/ssl-proxy-params.conf;
} }

View File

@ -19,6 +19,11 @@ server {
location / { location / {
proxy_pass https://127.0.0.1:5001; proxy_pass https://127.0.0.1:5001;
# needed for websocket connections
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
include /etc/nginx/snippets/ssl-proxy-params.conf; include /etc/nginx/snippets/ssl-proxy-params.conf;
} }

View File

@ -1,21 +0,0 @@
## tallycoin_connect_ssl.conf
server {
listen 8124 ssl http2;
listen [::]:8124 ssl http2;
server_name _;
include /etc/nginx/snippets/ssl-params.conf;
include /etc/nginx/snippets/ssl-certificate-app-data.conf;
include /etc/nginx/snippets/gzip-params.conf;
access_log /var/log/nginx/access_tallycoin_connect.log;
error_log /var/log/nginx/error_tallycoin_connect.log;
location / {
proxy_pass http://127.0.0.1:8123;
include /etc/nginx/snippets/ssl-proxy-params.conf;
}
}

View File

@ -1,18 +0,0 @@
## tallycoin_connect_tor.conf
server {
listen 8125;
listen [::]:8125;
server_name _;
include /etc/nginx/snippets/gzip-params.conf;
access_log /var/log/nginx/access_tallycoin_connect.log;
error_log /var/log/nginx/error_tallycoin_connect.log;
location / {
proxy_pass http://127.0.0.1:8123;
include /etc/nginx/snippets/ssl-proxy-params.conf;
}
}

View File

@ -1,21 +0,0 @@
## tallycoin_connect_tor_ssl.conf
server {
listen 8126 ssl http2;
listen [::]:8126 ssl http2;
server_name _;
include /etc/nginx/snippets/ssl-params.conf;
include /etc/nginx/snippets/ssl-certificate-app-data-tor.conf;
include /etc/nginx/snippets/gzip-params.conf;
access_log /var/log/nginx/access_tallycoin_connect.log;
error_log /var/log/nginx/error_tallycoin_connect.log;
location / {
proxy_pass http://127.0.0.1:8123;
include /etc/nginx/snippets/ssl-proxy-params.conf;
}
}

View File

@ -148,7 +148,12 @@ if [ "$2" = "info" ]; then
if [ "$1" == "signet" ]; then if [ "$1" == "signet" ]; then
subfolder="signet/" subfolder="signet/"
fi fi
btc_blocks_data_kb=$(sudo du -s /mnt/hdd/bitcoin/${subfolder}blocks | cut -f1) btc_blocks_data_kb=$(sudo du -s /mnt/hdd/bitcoin/${subfolder}blocks 2>/dev/null | cut -f1)
if [ "${btc_blocks_data_kb}" == "" ]; then
btc_blocks_data_kb="0"
fi
# print data
# parse data # parse data
btc_blocks_headers=$(echo "${blockchaininfo}" | jq -r '.headers') btc_blocks_headers=$(echo "${blockchaininfo}" | jq -r '.headers')
@ -156,9 +161,14 @@ if [ "$2" = "info" ]; then
btc_blocks_behind=$((${btc_blocks_headers} - ${btc_blocks_verified})) btc_blocks_behind=$((${btc_blocks_headers} - ${btc_blocks_verified}))
btc_sync_initialblockdownload=$(echo "${blockchaininfo}" | jq -r '.initialblockdownload' | grep -c 'true') btc_sync_initialblockdownload=$(echo "${blockchaininfo}" | jq -r '.initialblockdownload' | grep -c 'true')
btc_sync_progress=$(echo "${blockchaininfo}" | jq -r '.verificationprogress') btc_sync_progress=$(echo "${blockchaininfo}" | jq -r '.verificationprogress')
if (( $(awk 'BEGIN { print( '${btc_sync_progress}'<0.99995 ) }') )); then if [[ "${btc_sync_progress}" == *"e-"* ]]; then
# is still very small - round up to 0.01%
btc_sync_percentage="0.01"
elif (( $(awk 'BEGIN { print( '${btc_sync_progress}'<0.99995 ) }') )); then
# #3620 prevent displaying 100.00%, although incorrect because of rounding # #3620 prevent displaying 100.00%, although incorrect because of rounding
btc_sync_percentage=$(awk 'BEGIN { printf( "%.2f%%", 100 * '${btc_sync_progress}') }') btc_sync_percentage="${btc_sync_progress:2:2}.${btc_sync_progress:4:2}"
# remove trailing zero if present (just first one)
btc_sync_percentage="${btc_sync_percentage#0}"
elif [ "${btc_blocks_headers}" != "" ] && [ "${btc_blocks_headers}" == "${btc_blocks_verified}" ]; then elif [ "${btc_blocks_headers}" != "" ] && [ "${btc_blocks_headers}" == "${btc_blocks_verified}" ]; then
btc_sync_percentage="100.00" btc_sync_percentage="100.00"
else else

View File

@ -0,0 +1,80 @@
#!/bin/bash
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
echo "# Switches on bitcoind mainnet behind the scenes to testnet."
echo "# !!! JUST USE FOR DEVELOPEMNT - NOT FOR PRODUCTION !!!"
echo "# "
echo "# bitcoin.testnet.sh [activate|revert]"
echo
exit 1
fi
# make sure user is root
if [ $UID -ne 0 ]; then
echo "error='run this script with sudo'"
exit 1
fi
echo "# Running: bitcoin.testnet.sh $*"
if [ "$1" == "activate" ]; then
# check if bitcoin testnet is already activated
testnetSet=$(cat /mnt/hdd/bitcoin/bitcoin.conf | grep -c "^testnet=1")
if [ $testnetSet -gt 0 ]; then
echo "error='testnet is already activated'"
exit 1
fi
echo "# SWITCHING TO TESTNET .."
# make changes to bitcoin.conf
sed -i 's|^testnet=0|testnet=1|' /mnt/hdd/bitcoin/bitcoin.conf
sed -i 's/^\(main.debuglogfile=.*\)/#\1/' /mnt/hdd/bitcoin/bitcoin.conf
sed -i 's|^test.debuglogfile=/mnt/hdd/bitcoin/testnet3/debug.log|test.debuglogfile=/mnt/hdd/bitcoin/debug.log|' /mnt/hdd/bitcoin/bitcoin.conf
sed -i 's/^\(main.rpcbind=.*\)/#\1/' /mnt/hdd/bitcoin/bitcoin.conf
sed -i 's|^test.rpcbind=127.0.0.1:18332|test.rpcbind=127.0.0.1:8332|' /mnt/hdd/bitcoin/bitcoin.conf
# restart bitcoind service
systemctl restart bitcoind.service
echo "# OK bitcoind should now run testnet on mainnet ports"
echo "# If you want to save space you can delete old mainnet blockchain with:"
echo "# rm -rf /mnt/hdd/bitcoin/blocks"
echo "# rm -rf /mnt/hdd/bitcoin/chainstate"
exit 0
fi
if [ "$1" == "revert" ]; then
# check if bitcoin testnet is already activated
testnetSet=$(cat /mnt/hdd/bitcoin/bitcoin.conf | grep -c "^testnet=1")
if [ $testnetSet -eq 0 ]; then
echo "error='testnet is not activated'"
exit 1
fi
echo "# SWITCHING BACK TO MAINNET .."
# make changes to bitcoin.conf
sed -i 's|^testnet=1|testnet=0|' /mnt/hdd/bitcoin/bitcoin.conf
sed -i 's|^#main.debuglogfile=.*|main.debuglogfile=/mnt/hdd/bitcoin/debug.log|' /mnt/hdd/bitcoin/bitcoin.conf
sed -i 's|^test.debuglogfile=/mnt/hdd/bitcoin/debug.log|test.debuglogfile=/mnt/hdd/bitcoin/testnet3/debug.log|' /mnt/hdd/bitcoin/bitcoin.conf
sed -i 's|^#main.rpcbind=.*|main.rpcbind=127.0.0.1:8332|' /mnt/hdd/bitcoin/bitcoin.conf
sed -i 's|^test.rpcbind=127.0.0.1:8332|test.rpcbind=127.0.0.1:18332|' /mnt/hdd/bitcoin/bitcoin.conf
# restart bitcoind service
systemctl restart bitcoind.service
echo "# OK bitcoind should now run normal mainnet again"
echo "# If you want to save space you can delete old testnet blockchain with:"
echo "# rm -rf /mnt/hdd/bitcoin/testnet3/blocks"
echo "# rm -rf /mnt/hdd/bitcoin/testnet3/chainstate"
exit 0
fi
echo "error='unkown parameter'"
exit 1

View File

@ -27,10 +27,11 @@ action=$1
######################### #########################
# STATUS # STATUS
# gather data on sd card # gather data on SDcard / OS drive
minimumSizeByte=16384000000 minimumSizeByte=16384000000
rootPartition=$(sudo mount | grep " / " | cut -d " " -f 1 | cut -d "/" -f 3) rootPartitionLine=$(sudo mount | grep " / " | cut -d " " -f 1)
rootPartitionBytes=$(lsblk -b -o NAME,SIZE | grep "${rootPartition}" | tr -s ' ' | cut -d " " -f 2) rootPartition=$(basename ${rootPartitionLine})
rootPartitionBytes=$(lsblk -b -o NAME,SIZE | grep "${rootPartition}" | awk '{print $2}')
# make conclusions # make conclusions
needsExpansion=0 needsExpansion=0

View File

@ -464,7 +464,7 @@ sudo /home/admin/config.scripts/blitz.zram.sh status
echo echo
echo "*** HARDWARE TEST RESULTS ***" echo "*** HARDWARE TEST RESULTS ***"
sudo vcgencmd get_throttled sudo vcgencmd get_throttled 2>/dev/null
source <(/home/admin/_cache.sh get system_count_undervoltage) source <(/home/admin/_cache.sh get system_count_undervoltage)
showImproveInfo=0 showImproveInfo=0
if [ ${#system_count_undervoltage} -gt 0 ]; then if [ ${#system_count_undervoltage} -gt 0 ]; then

View File

@ -13,11 +13,31 @@ fi
# detect known SBCs # detect known SBCs
board="" board=""
isRaspberryPi4=$(cat /proc/device-tree/model | grep -c "Raspberry Pi 4")
# detect RaspberryPi 3
isRaspberryPi3=$(cat /proc/device-tree/model 2>/dev/null | grep -c "Raspberry Pi 3")
if [ "${isRaspberryPi3}" == "1" ]; then
board="rp3"
fi
# detect RaspberryPi 4
isRaspberryPi4=$(cat /proc/device-tree/model 2>/dev/null | grep -c "Raspberry Pi 4")
if [ "${isRaspberryPi4}" == "1" ]; then if [ "${isRaspberryPi4}" == "1" ]; then
board="rp4" board="rp4"
fi fi
# detect RaspberryPi 5
isRaspberryPi5=$(cat /proc/device-tree/model 2>/dev/null | grep -c "Raspberry Pi 5")
if [ "${isRaspberryPi5}" == "1" ]; then
board="rp5"
fi
# detect VM
isVM=$(grep -c 'hypervisor' /proc/cpuinfo)
if [ ${isVM} -gt 0 ]; then
board="vm"
fi
# get how many RAM (in MB) # get how many RAM (in MB)
ramMB=$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 )}' /proc/meminfo) ramMB=$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 )}' /proc/meminfo)

View File

@ -622,9 +622,9 @@ def menuMakeSubscription(blitzServiceName, torAddress, torPort):
if lastusedShop == choice_url_ip2torcom: lastusedShop="" if lastusedShop == choice_url_ip2torcom: lastusedShop=""
# FULMO Shop # FULMO Shop
choice_url_fulmo="fulmo7x6yvgz6zs2b2ptduvzwevxmizhq23klkenslt5drxx2physlqd.onion" #choice_url_fulmo="fulmo7x6yvgz6zs2b2ptduvzwevxmizhq23klkenslt5drxx2physlqd.onion"
choices.append(("B", "Fulmo Shop")) #choices.append(("B", "Fulmo Shop"))
if lastusedShop == choice_url_fulmo: lastusedShop="" #if lastusedShop == choice_url_fulmo: lastusedShop=""
# add before option if different from static options # add before option if different from static options
if len(lastusedShop) > 0: choices.append(("Y", lastusedShop)) if len(lastusedShop) > 0: choices.append(("Y", lastusedShop))
@ -632,30 +632,42 @@ def menuMakeSubscription(blitzServiceName, torAddress, torPort):
# enter own shop address option # enter own shop address option
choices.append(("X", "Enter a new Shop URL")) choices.append(("X", "Enter a new Shop URL"))
# select dialog # show a dialog info box
d = Dialog(dialog="dialog", autowidgetsize=True) d = Dialog(dialog="dialog", autowidgetsize=True)
d.set_background_title("IP2TOR - Select Shop") d.set_background_title("IP2TOR - Select Shop")
code, selected = d.menu( d.msgbox('''
"\nChoose your IP2Tor provider/shop:", At the moment there are no public IP2TOR services to link to.
choices=choices, width=75, height=10, title="Select IP2Tor Shop") You could run one yourself - please check the GitHub repo:
https://github.com/raulcano/docker-ip2tor-shop''', height=10, width=72)
# select dialog
#d = Dialog(dialog="dialog", autowidgetsize=True)
#d.set_background_title("IP2TOR - Select Shop")
#code, selected = d.menu(
# "\nChoose your IP2Tor provider/shop:",
# choices=choices, width=75, height=10, title="Select IP2Tor Shop")
# if user canceled # if user canceled
if code != d.OK: #if code != d.OK:
sys.exit(0) # sys.exit(0)
if selected == "A" : shopurl=choice_url_ip2torcom #if selected == "A" : shopurl=choice_url_ip2torcom
if selected == "B" : shopurl=choice_url_fulmo #if selected == "B" : shopurl=choice_url_fulmo
if selected == "Y" : shopurl=lastusedShop #if selected == "Y" : shopurl=lastusedShop
# input shop url # input shop url
if selected == "X": #if selected == "X":
d = Dialog(dialog="dialog", autowidgetsize=True) d = Dialog(dialog="dialog", autowidgetsize=True)
d.set_background_title("IP2TOR - Add new Shop") d.set_background_title("IP2TOR - Add new Shop")
code, shopurl = d.inputbox( code, shopurl = d.inputbox(
"Enter Address of the IP2TOR Shop (OR JUST PRESS OK):", "Enter Address of the IP2TOR Shop (OR JUST PRESS OK):",
height=10, width=72, init=shopurl, height=10, width=72, init=shopurl,
title="Shop Address") title="Shop Address")
if shopurl.find("://") > 0: shopurl = shopurl[shopurl.find("://") + 3:] if shopurl.find("://") > 0: shopurl = shopurl[shopurl.find("://") + 3:]
# if user choose cancel
if code != d.OK:
sys.exit(0)
# try & get host list from shop # try & get host list from shop
os.system('clear') os.system('clear')

View File

@ -334,8 +334,10 @@ def subscriptions_cancel(s_id):
print(json.dumps(subs, indent=2)) print(json.dumps(subs, indent=2))
# todo: deinstall letsencrypt if this was last subscription # deinstall letsencrypt/dyndns if this was last subscription
if len(subs['subscriptions_letsencrypt']) == 0:
os.system("/home/admin/config.scripts/bonus.letsencrypt.sh off")
os.system("/home/admin/config.scripts/internet.dyndomain.sh off")
def get_subscription(subscription_id): def get_subscription(subscription_id):
try: try:

View File

@ -268,8 +268,8 @@ def main():
cfg.reload() cfg.reload()
if not cfg.run_behind_tor.value: if not cfg.run_behind_tor.value:
Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' Dialog(dialog="dialog", autowidgetsize=True).msgbox('''
The IP2TOR service just makes sense if you run The IP2TOR service just makes sense if you
your RaspiBlitz behind TOR. run your RaspiBlitz behind TOR.
''', title="Info") ''', title="Info")
sys.exit(0) sys.exit(0)

View File

@ -0,0 +1,162 @@
#!/bin/bash
# This is for developing on your RaspiBlitz VM
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "-help" ]; then
echo "FOR DEVELOPMENT USE ONLY!"
echo "RaspiBlitzVM Sync with repos in /mnt/vm_shared_folder"
echo "blitz.vm.sh sync -> syncs all available repos in shared folder"
echo "blitz.vm.sh sync code -> syncs only the raspiblitz repo"
echo "blitz.vm.sh sync api -> syncs only the raspiblitz API repo"
echo ""
exit 1
fi
# check runnig as sudo
if [ "$EUID" -ne 0 ]; then
echo "error='please run as root'"
exit 1
fi
# check if running in vm
isVM=$(grep -c 'hypervisor' /proc/cpuinfo)
if [ ${isVM} -eq 0 ]; then
echo "# This script is only for RaspiBlitz running in a VM"
echo "error='not a VM'"
exit 1
fi
# check if shared folder exists
if [ ! -d "/mnt/vm_shared_folder" ]; then
echo "# Creating shared folder /mnt/vm_shared_folder"
mkdir /mnt/vm_shared_folder
chmod 777 /mnt/vm_shared_folder
fi
# check if shared folder is mounted
isMounted=$(mount | grep '/mnt/vm_shared_folder')
if [ ${#isMounted} -eq 0 ]; then
echo "# Mounting shared folder /mnt/vm_shared_folder"
mount -t 9p -o trans=virtio share /mnt/vm_shared_folder
if [ $? -eq 0 ]; then
echo "# OK - shared folder mounted"
else
echo "# make sure to activate shared folder in VM settings (VirtFS)"
echo "error='mount failed'"
exit 1
fi
fi
# RASPIBLITZ MAIN REPO
if [ "$2" == "code" ] || [ "$2" == "" ]; then
echo
echo "# ##### RASPIBLITZ REPO"
#check if contains a raspiblitz MAIN repo
containsRaspiBlitzRepo=$(ls /mnt/vm_shared_folder | grep -wc 'raspiblitz')
if [ ${containsRaspiBlitzRepo} -eq 0 ]; then
echo "# /mnt/vm_shared_folder does not contain a raspiblitz repo"
echo "# make sure to share the directory that contains the raspiblitz repo - not the repo itself"
echo "# make sure its named 'raspiblitz' and not 'raspiblitz-main' or 'raspiblitz-v1.7'"
if [ "$2" != "" ]; then
echo "error='no raspiblitz main repo'"
exit 1
fi
else
cd /home/admin
echo "# COPYING from VM SHARED FOLDER to /home/admin/"
echo "# - basic admin files"
rm -f *.sh
su - admin -c 'cp /mnt/vm_shared_folder/raspiblitz/home.admin/.tmux.conf /home/admin'
su - admin -c 'cp /mnt/vm_shared_folder/raspiblitz/home.admin/*.* /home/admin 2>/dev/null'
su - admin -c 'chmod 755 *.sh'
echo "# - asset directory"
rm -rf assets
su - admin -c 'cp -R /mnt/vm_shared_folder/raspiblitz/home.admin/assets /home/admin/assets'
echo "# - config.scripts directory"
rm -rf /home/admin/config.scripts
su - admin -c 'cp -R /mnt/vm_shared_folder/raspiblitz/home.admin/config.scripts /home/admin/config.scripts'
su - admin -c 'chmod 755 /home/admin/config.scripts/*.sh'
su - admin -c 'chmod 755 /home/admin/config.scripts/*.py'
echo "# - setup.scripts directory"
rm -rf /home/admin/setup.scripts
su - admin -c 'cp -R /mnt/vm_shared_folder/raspiblitz/home.admin/setup.scripts /home/admin/setup.scripts'
su - admin -c 'chmod 755 /home/admin/setup.scripts/*.sh'
su - admin -c 'chmod 755 /home/admin/config.scripts/*.py'
echo "# ******************************************"
if [ "$2" != "" ]; then
exit 0
fi
fi
fi
# RASPIBLITZ API REPO
if [ "$2" == "api" ] || [ "$2" == "" ]; then
echo
echo "# ##### RASPIBLITZ API REPO"
# check if blitzapi service is enabled
systemctl is-enabled blitzapi 2>/dev/null
notInstalled=$?
#check if contains a raspiblitz API repo
containsApiRepo=$(ls /mnt/vm_shared_folder | grep -wc 'blitz_api')
if [ ${containsApiRepo} -eq 0 ]; then
echo "# /mnt/vm_shared_folder does not contain a api repo"
echo "# make sure to share the directory that contains the api repo - not the repo itself"
echo "# make sure its named 'blitz_api'"
if [ "$2" != "" ]; then
echo "error='no raspiblitz api repo'"
exit 1
fi
elif [ ${notInstalled} -gt 0 ]; then
echo "# blitzapi service is not installed or enabled - skipping"
if [ "$2" != "" ]; then
echo "error='blitzapi service not enabled'"
exit 1
fi
else
echo "# TODO: Not implemented yet - use /script/updateBlitzAPI.sh instead to sync from host to VM"
#echo "# Stopping blitzapi service"
#systemctl stop blitzapi
#echo "# COPYING from VM SHARED FOLDER to /home/blitzapi/"
#rm -rf /home/blitzapi/blitz_api
#cp -R /mnt/vm_shared_folder/blitz_api /home/blitzapi
#chown -R blitzapi:blitzapi /home/blitzapi/blitz_api
#cd /home/blitzapi/blitz_api || exit 1
#su - blitzapi -c './venv/bin/pip install -r requirements.txt'
#echo "# Starting blitzapi service"
#systemctl start blitzapi
if [ "$2" != "" ]; then
exit 0
fi
fi
fi
if [ "$1" == "sync" ]; then
exit 0
fi
# in case of unknown command
echo "error='unkown command'"
exit 1

View File

@ -3,22 +3,22 @@
# Based on: https://gist.github.com/normandmickey/3f10fc077d15345fb469034e3697d0d0 # Based on: https://gist.github.com/normandmickey/3f10fc077d15345fb469034e3697d0d0
# https://github.com/dgarage/NBXplorer/tags # https://github.com/dgarage/NBXplorer/tags
NBXplorerVersion="v2.5.0" NBXplorerVersion="v2.5.2"
# https://github.com/btcpayserver/btcpayserver/releases # https://github.com/btcpayserver/btcpayserver/releases
BTCPayVersion="v1.12.5" BTCPayVersion="v1.13.0"
# check who signed the release (person that published release) # check who signed the release (person that published release)
PGPsigner="nicolasdorier" #PGPsigner="nicolasdorier"
PGPpubkeyLink="https://keybase.io/nicolasdorier/pgp_keys.asc" #PGPpubkeyLink="https://keybase.io/nicolasdorier/pgp_keys.asc"
PGPpubkeyFingerprint="AB4CFA9895ACA0DBE27F6B346618763EF09186FE" #PGPpubkeyFingerprint="AB4CFA9895ACA0DBE27F6B346618763EF09186FE"
# --- # ---
#PGPsigner="Kukks" #PGPsigner="Kukks"
#PGPpubkeyLink="https://github.com/${PGPsigner}.gpg" #PGPpubkeyLink="https://github.com/${PGPsigner}.gpg"
#PGPpubkeyFingerprint="8E5530D9D1C93097" #PGPpubkeyFingerprint="8E5530D9D1C93097"
# --- # ---
#PGPsigner="web-flow" PGPsigner="web-flow"
#PGPpubkeyLink="https://github.com/web-flow.gpg" PGPpubkeyLink="https://github.com/web-flow.gpg"
#PGPpubkeyFingerprint="(4AEE18F83AFDEB23|B5690EEEBB952194)" PGPpubkeyFingerprint="B5690EEEBB952194"
# command info # command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then

View File

@ -315,8 +315,8 @@ function downloadAndVerifyBinary() {
sudo rm -f /home/fulcrum/Fulcrum sudo rm -f /home/fulcrum/Fulcrum
sudo rm -f /home/fulcrum/FulcrumAdmin sudo rm -f /home/fulcrum/FulcrumAdmin
# symlink # symlink
sudo ln -s /home/fulcrum/Fulcrum-${fulcrumVersion}-${build}/Fulcrum /home/fulcrum/ | sudo ln -s /home/fulcrum/Fulcrum-${fulcrumVersion}-${build}/Fulcrum /home/fulcrum/
sudo ln -s /home/fulcrum/Fulcrum-${fulcrumVersion}-${build}/FulcrumAdmin /home/fulcrum/ sudo ln -s /home/fulcrum/Fulcrum-${fulcrumVersion}-${build}/FulcrumAdmin /home/fulcrum/
} }
function createSystemdService() { function createSystemdService() {

View File

@ -12,8 +12,9 @@ fi
source /mnt/hdd/raspiblitz.conf source /mnt/hdd/raspiblitz.conf
ACME_LOAD_BASE_URL="https://codeload.github.com/acmesh-official/acme.sh/tar.gz" # https://github.com/acmesh-official/acme.sh/releases
ACME_VERSION="2.8.6" ACME_LOAD_BASE_URL="https://github.com/acmesh-official/acme.sh/archive/refs/tags/3.0.7.tar.gz"
ACME_VERSION="3.0.7"
ACME_INSTALL_HOME="/home/admin/.acme.sh" ACME_INSTALL_HOME="/home/admin/.acme.sh"
ACME_CONFIG_HOME="/mnt/hdd/app-data/letsencrypt" ACME_CONFIG_HOME="/mnt/hdd/app-data/letsencrypt"
@ -21,19 +22,6 @@ ACME_CERT_HOME="${ACME_CONFIG_HOME}/certs"
ACME_IS_INSTALLED=0 ACME_IS_INSTALLED=0
# if Tor is on test that CURL is by default running over Tor
# TODO: issue https://github.com/rootzoll/raspiblitz/issues/1341
#if [ "${runBehindTor}" == "on" ]; then
# echo "# checking if Tor proxy for CURL is working ..."
# checkTor=$(curl -s https://check.torproject.org | grep -c "Congratulations")
# if [ ${checkTor} -eq 0 ]; then
# echo "err='curl tor proxy not working'"
# exit 1
# else
# echo "# OK Tor proxy for CURL"
# fi
#fi
################### ###################
# FUNCTIONS # FUNCTIONS
################### ###################
@ -70,7 +58,15 @@ function acme_status() {
} }
function acme_install() { function acme_install() {
email="${1}" email="${1}"
# create a dummy email if none is provided
if [ -z "${email}" ]; then
random_number=$(shuf -i 100-999 -n 1)
random_word=$(shuf -n 1 /usr/share/dict/words)
ending="x.com"
email="${random_word}${random_number}@gm${ending}"
fi
# ensure socat # ensure socat
if ! command -v socat >/dev/null; then if ! command -v socat >/dev/null; then
@ -79,41 +75,38 @@ function acme_install() {
sudo apt-get install -y socat >/dev/null 2>&1 sudo apt-get install -y socat >/dev/null 2>&1
fi fi
# make sure config directory exists
if ! [ -d $ACME_CONFIG_HOME ]; then if ! [ -d $ACME_CONFIG_HOME ]; then
sudo mkdir -p $ACME_CONFIG_HOME sudo mkdir -p $ACME_CONFIG_HOME
fi fi
sudo chown admin:admin $ACME_CONFIG_HOME sudo chown admin:admin $ACME_CONFIG_HOME
rm -f "/tmp/acme.sh_${ACME_VERSION}.tar.gz" # download and install acme.sh
if ! curl --silent --fail -o "/tmp/acme.sh_${ACME_VERSION}.tar.gz" "${ACME_LOAD_BASE_URL}/${ACME_VERSION}" 2>&1; then echo "# download acme.sh release ${ACME_VERSION} from ${ACME_LOAD_BASE_URL}"
echo "Error ($?): Download failed from: ${ACME_LOAD_BASE_URL}/${ACME_VERSION}" rm -r /tmp/acme.sh* 2>/dev/null
rm -f "/tmp/acme.sh_${ACME_VERSION}.tar.gz" if ! curl -L --silent --fail -o "/tmp/acme.sh.tar.gz" "${ACME_LOAD_BASE_URL}" 2>&1; then
echo "Error ($?): Download failed from: ${ACME_LOAD_BASE_URL}"
rm -r /tmp/acme.sh*
exit 1 exit 1
fi fi
if tar xzf "/tmp/acme.sh_${ACME_VERSION}.tar.gz" -C /tmp/; then if tar xzf "/tmp/acme.sh.tar.gz" -C /tmp/; then
cd "/tmp/acme.sh-${ACME_VERSION}" || exit cd "/tmp/acme.sh-${ACME_VERSION}" || exit
if [ -n "${email}" ]; then echo "# installing acme.sh with email(${email})"
./acme.sh --install \ ./acme.sh --install \
--noprofile \ --noprofile \
--home "${ACME_INSTALL_HOME}" \ --home "${ACME_INSTALL_HOME}" \
--config-home "${ACME_CONFIG_HOME}" \ --config-home "${ACME_CONFIG_HOME}" \
--cert-home "${ACME_CERT_HOME}" \ --cert-home "${ACME_CERT_HOME}" \
--accountemail "${email}" --accountemail "${email}"
else
./acme.sh --install \
--noprofile \
--home "${ACME_INSTALL_HOME}" \
--config-home "${ACME_CONFIG_HOME}" \
--cert-home "${ACME_CERT_HOME}"
fi
else
echo "# Error ($?): Extracting failed"
exit 1
fi fi
rm -f "/tmp/acme.sh_${ACME_VERSION}.tar.gz" rm -r /tmp/acme.sh*
rm -Rf "/tmp/acme.sh_${ACME_VERSION}"
} }
function refresh_certs_with_nginx() { function refresh_certs_with_nginx() {
@ -219,6 +212,7 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then
sudo chmod -R 733 $ACME_CONFIG_HOME sudo chmod -R 733 $ACME_CONFIG_HOME
# install the acme script # install the acme script
echo "# acme_install"
acme_install "${address}" acme_install "${address}"
echo "" echo ""

View File

@ -3,7 +3,7 @@
# https://github.com/lnbits/lnbits # https://github.com/lnbits/lnbits
# https://github.com/lnbits/lnbits/releases # https://github.com/lnbits/lnbits/releases
tag="0.11.3" tag="0.12.8"
VERSION="${tag}" VERSION="${tag}"
# command info # command info
@ -129,12 +129,12 @@ if [ "$1" = "menu" ]; then
# display possible problems with IP2TOR setup # display possible problems with IP2TOR setup
if [ ${#ip2torWarn} -gt 0 ]; then if [ ${#ip2torWarn} -gt 0 ]; then
whiptail --title " Warning " \ whiptail --title " Warning " \
--yes-button "Back" \ --yes-button "Back" \
--no-button "Continue Anyway" \ --no-button "Continue Anyway" \
--yesno "Your IP2TOR+LetsEncrypt may have problems:\n${ip2torWarn}\n\nCheck if locally responding: https://${localIP}:${httpsPort}\n\nCheck if service is reachable over Tor:\n${toraddress}" 14 72 --yesno "Your IP2TOR+LetsEncrypt may have problems:\n${ip2torWarn}\n\nCheck if locally responding: https://${localIP}:${httpsPort}\n\nCheck if service is reachable over Tor:\n${toraddress}" 14 72
if [ "$?" != "1" ]; then if [ "$?" != "1" ]; then
exit 0 exit 0
fi fi
fi fi
# add info on funding source # add info on funding source
@ -148,7 +148,7 @@ if [ "$1" = "menu" ]; then
text="https://${localIP}:${httpsPort}${authMethod}" text="https://${localIP}:${httpsPort}${authMethod}"
if [ ${#publicDomain} -gt 0 ]; then if [ ${#publicDomain} -gt 0 ]; then
text="${text} text="${text}
Public Domain: https://${publicDomain}:${httpsPort} Public Domain: https://${publicDomain}:${httpsPort}
port forwarding on router needs to be active & may change port" port forwarding on router needs to be active & may change port"
fi fi
@ -201,8 +201,6 @@ Consider adding a IP2TOR Bridge under OPTIONS."
# just IP2TOR active - offer cancel or Lets Encrypt # just IP2TOR active - offer cancel or Lets Encrypt
OPTIONS+=(HTTPS-ON "Add free HTTPS-Certificate for LNbits") OPTIONS+=(HTTPS-ON "Add free HTTPS-Certificate for LNbits")
OPTIONS+=(IP2TOR-OFF "Cancel IP2Tor Subscription for LNbits") OPTIONS+=(IP2TOR-OFF "Cancel IP2Tor Subscription for LNbits")
else
OPTIONS+=(IP2TOR-ON "Make Public with IP2Tor Subscription")
fi fi
# Change Funding Source options (only if available) # Change Funding Source options (only if available)
@ -225,139 +223,140 @@ Consider adding a IP2TOR Bridge under OPTIONS."
WIDTH=66 WIDTH=66
CHOICE_HEIGHT=$(("${#OPTIONS[@]}/2+1")) CHOICE_HEIGHT=$(("${#OPTIONS[@]}/2+1"))
HEIGHT=$((CHOICE_HEIGHT+7)) HEIGHT=$((CHOICE_HEIGHT + 7))
CHOICE=$(dialog --clear \ CHOICE=$(dialog --clear \
--title " LNbits - Options" \ --title " LNbits - Options" \
--ok-label "Select" \ --ok-label "Select" \
--cancel-label "Back" \ --cancel-label "Back" \
--menu "Choose one of the following options:" \ --menu "Choose one of the following options:" \
$HEIGHT $WIDTH $CHOICE_HEIGHT \ $HEIGHT $WIDTH $CHOICE_HEIGHT \
"${OPTIONS[@]}" \ "${OPTIONS[@]}" \
2>&1 >/dev/tty) 2>&1 >/dev/tty)
case $CHOICE in case $CHOICE in
IP2TOR-ON) IP2TOR-ON)
python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py create-ssh-dialog LNBITS ${toraddress} 443 python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py create-ssh-dialog LNBITS ${toraddress} 443
exit 0 exit 0
;; ;;
IP2TOR-OFF) IP2TOR-OFF)
clear clear
python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py subscription-cancel ${ip2torID} python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py subscription-cancel ${ip2torID}
echo echo
echo "OK - PRESS ENTER to continue" echo "OK - PRESS ENTER to continue"
read key read key
exit 0 exit 0
;; ;;
HTTPS-ON) HTTPS-ON)
python /home/admin/config.scripts/blitz.subscriptions.letsencrypt.py create-ssh-dialog python /home/admin/config.scripts/blitz.subscriptions.letsencrypt.py create-ssh-dialog
exit 0 exit 0
;; ;;
SWITCH-CL) SWITCH-CL)
clear clear
/home/admin/config.scripts/bonus.lnbits.sh switch cl /home/admin/config.scripts/bonus.lnbits.sh switch cl
echo "Restarting LNbits ..." echo "Restarting LNbits ..."
sudo systemctl restart lnbits sudo systemctl restart lnbits
echo echo
echo "OK new funding source for LNbits active." echo "OK new funding source for LNbits active."
echo "PRESS ENTER to continue" echo "PRESS ENTER to continue"
read key read key
exit 0 exit 0
;; ;;
SWITCH-LND) SWITCH-LND)
clear clear
/home/admin/config.scripts/bonus.lnbits.sh switch lnd /home/admin/config.scripts/bonus.lnbits.sh switch lnd
echo "Restarting LNbits ..." echo "Restarting LNbits ..."
sudo systemctl restart lnbits sudo systemctl restart lnbits
echo echo
echo "OK new funding source for LNbits active." echo "OK new funding source for LNbits active."
echo "PRESS ENTER to continue" echo "PRESS ENTER to continue"
read key read key
exit 0 exit 0
;; ;;
BACKUP) BACKUP)
clear clear
/home/admin/config.scripts/bonus.lnbits.sh backup /home/admin/config.scripts/bonus.lnbits.sh backup
echo echo
echo "Backup done" echo "Backup done"
echo "PRESS ENTER to continue" echo "PRESS ENTER to continue"
read key read key
exit 0 exit 0
;; ;;
RESTORE) RESTORE)
clear clear
# check if backup exist # check if backup exist
source <(/home/admin/_cache.sh get LNBitsDB) source <(/home/admin/_cache.sh get LNBitsDB)
if [ "${LNBitsDB}" == "PostgreSQL" ]; then if [ "${LNBitsDB}" == "PostgreSQL" ]; then
backup_target="/mnt/hdd/app-data/backup/lnbits_db" backup_target="/mnt/hdd/app-data/backup/lnbits_db"
backup_file=$(ls -t $backup_target/*.sql | head -n1) backup_file=$(ls -t $backup_target/*.sql | head -n1)
else else
backup_target="/mnt/hdd/app-data/backup/lnbits_sqlite" backup_target="/mnt/hdd/app-data/backup/lnbits_sqlite"
backup_file=$(ls -t $backup_target/*.tar | head -n1) backup_file=$(ls -t $backup_target/*.tar | head -n1)
fi fi
if [ "$backup_file" = "" ]; then if [ "$backup_file" = "" ]; then
echo "ABORT - No Backup found to restore from" echo "ABORT - No Backup found to restore from"
exit 1 exit 1
else else
# build dialog to choose backup file from menu # build dialog to choose backup file from menu
OPTIONS_RESTORE=() OPTIONS_RESTORE=()
counter=0 counter=0
cd $backup_target cd $backup_target
for f in `find *.* -maxdepth 1 -type f`; do for f in $(find *.* -maxdepth 1 -type f); do
[[ -f "$f" ]] || continue [[ -f "$f" ]] || continue
counter=$(($counter+1)) counter=$(($counter + 1))
OPTIONS_RESTORE+=($counter "$f") OPTIONS_RESTORE+=($counter "$f")
done done
WIDTH_RESTORE=66 WIDTH_RESTORE=66
CHOICE_HEIGHT_RESTORE=$(("${#OPTIONS_RESTORE[@]}/2+1")) CHOICE_HEIGHT_RESTORE=$(("${#OPTIONS_RESTORE[@]}/2+1"))
HEIGHT_RESTORE=$((CHOICE_HEIGHT_RESTORE+7)) HEIGHT_RESTORE=$((CHOICE_HEIGHT_RESTORE + 7))
CHOICE_RESTORE=$(dialog --clear \ CHOICE_RESTORE=$(dialog --clear \
--title " LNbits - Backup restore" \ --title " LNbits - Backup restore" \
--ok-label "Select" \ --ok-label "Select" \
--cancel-label "Back" \ --cancel-label "Back" \
--menu "Choose one of the following backups:" \ --menu "Choose one of the following backups:" \
$HEIGHT_RESTORE $WIDTH_RESTORE $CHOICE_HEIGHT_RESTORE \ $HEIGHT_RESTORE $WIDTH_RESTORE $CHOICE_HEIGHT_RESTORE \
"${OPTIONS_RESTORE[@]}" \ "${OPTIONS_RESTORE[@]}" \
2>&1 >/dev/tty) 2>&1 >/dev/tty)
# start restore with selected backup # start restore with selected backup
clear clear
if [ "$CHOICE_RESTORE" != "" ]; then if [ "$CHOICE_RESTORE" != "" ]; then
backup_file=${backup_target}/${OPTIONS_RESTORE[$(($CHOICE_RESTORE*2-1))]} backup_file=${backup_target}/${OPTIONS_RESTORE[$(($CHOICE_RESTORE * 2 - 1))]}
/home/admin/config.scripts/bonus.lnbits.sh restore "${backup_file}" /home/admin/config.scripts/bonus.lnbits.sh restore "${backup_file}"
echo echo
echo "Restore done" echo "Restore done"
echo "PRESS ENTER to continue" echo "PRESS ENTER to continue"
read key read key
fi fi
exit 0 exit 0
fi fi
;; ;;
MIGRATE-DB) MIGRATE-DB)
clear clear
dialog --title "MIGRATE LNBITS" --yesno " dialog --title "MIGRATE LNBITS" --yesno "
Do you want to proceed the migration? Do you want to proceed the migration?
Try to migrate your LNBits SQLite database to PostgreSQL. Try to migrate your LNBits SQLite database to PostgreSQL.
This can fail for unknown circumstances. Revert of this process is possible afterwards, a backup will be saved. This can fail for unknown circumstances. Revert of this process is possible afterwards, a backup will be saved.
" 12 65 " 12 65
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
clear clear
/home/admin/config.scripts/bonus.lnbits.sh migrate /home/admin/config.scripts/bonus.lnbits.sh migrate
echo echo
migrateMsg migrateMsg
echo echo
echo "OK please test your LNBits installation." echo "OK please test your LNBits installation."
echo "PRESS ENTER to continue" echo "PRESS ENTER to continue"
read key read key
fi fi
exit 0 exit 0
;; ;;
*) *)
clear clear
exit 0 exit 0
;;
esac esac
exit 0 exit 0
@ -381,7 +380,7 @@ if [ "$1" = "status" ]; then
# auth method is to call with a certain useer id # auth method is to call with a certain useer id
#admin_userid=$(sudo cat /home/lnbits/lnbits/.super_user) #admin_userid=$(sudo cat /home/lnbits/lnbits/.super_user)
admin_userid=$(sudo cat /mnt/hdd/app-data/LNBits/data/.super_user); admin_userid=$(sudo cat /mnt/hdd/app-data/LNBits/data/.super_user)
echo "authMethod='/wallet?usr=${admin_userid}'" echo "authMethod='/wallet?usr=${admin_userid}'"
# check funding source # check funding source
@ -534,7 +533,7 @@ if [ "$1" = "prestart" ]; then
# protect the admin user id if exists # protect the admin user id if exists
# chmod 640 /home/lnbits/lnbits/.super_user 2>/dev/null # chmod 640 /home/lnbits/lnbits/.super_user 2>/dev/null
chmod 640 /mnt/hdd/app-data/LNBits/data/.super_user 2>/dev/null chmod 640 /mnt/hdd/app-data/LNBits/data/.super_user 2>/dev/null
echo "# OK: prestart finished" echo "# OK: prestart finished"
exit 0 # exit with clean code exit 0 # exit with clean code
@ -587,21 +586,22 @@ if [ "$1" = "sync" ] || [ "$1" = "repo" ]; then
# pull latest code # pull latest code
sudo -u lnbits git pull sudo -u lnbits git pull
# check if poetry in installed, if not install it echo "# check if poetry in installed, if not install it"
if ! sudo -u lnbits which poetry; then if ! sudo -u lnbits which poetry; then
echo "# install poetry" echo "# install poetry"
sudo pip3 install --upgrade pip sudo pip3 install --upgrade pip
sudo pip3 install poetry sudo pip3 install poetry
fi fi
# do install like this
echo "# install"
sudo -u lnbits poetry install sudo -u lnbits poetry install
# make sure default virtaulenv is used echo "# make sure the default virtualenv is used"
sudo apt-get remove -y python3-virtualenv 2>/dev/null sudo apt-get remove -y python3-virtualenv 2>/dev/null
sudo pip uninstall -y virtualenv 2>/dev/null sudo pip uninstall -y virtualenv 2>/dev/null
sudo apt-get install -y python3-virtualenv sudo apt-get install -y python3-virtualenv
# restart lnbits service echo "# restart lnbits service"
sudo systemctl restart lnbits sudo systemctl restart lnbits
echo "# server is restarting ... maybe takes some seconds until available" echo "# server is restarting ... maybe takes some seconds until available"
exit 0 exit 0
@ -619,12 +619,6 @@ if [ "$1" = "install" ]; then
exit 0 exit 0
fi fi
echo "# *** INSTALL LNBITS ${VERSION} ***"
# add lnbits user
echo "*** Add the 'lnbits' user ***"
sudo adduser --system --group --home /home/lnbits lnbits
# get optional github parameter # get optional github parameter
githubUser="lnbits" githubUser="lnbits"
if [ "$2" != "" ]; then if [ "$2" != "" ]; then
@ -634,17 +628,24 @@ if [ "$1" = "install" ]; then
tag="$3" tag="$3"
fi fi
echo "# *** INSTALL LNBITS ***"
echo "# githubUser=$githubUser tag=$tag"
# add lnbits user
echo "*** Add the 'lnbits' user ***"
sudo adduser --system --group --home /home/lnbits lnbits
# install from GitHub # install from GitHub
echo "# get the github code user(${githubUser}) branch(${tag})" echo "# get the github code user(${githubUser}) branch(${tag})"
sudo rm -r /home/lnbits/lnbits 2>/dev/null sudo rm -r /home/lnbits/lnbits 2>/dev/null
cd /home/lnbits || exit 1 cd /home/lnbits || exit 1
sudo -u lnbits git clone https://github.com/${githubUser}/lnbits lnbits sudo -u lnbits git clone https://github.com/${githubUser}/lnbits lnbits
cd /home/lnbits/lnbits || exit 1 cd /home/lnbits/lnbits || exit 1
sudo -u lnbits git checkout ${tag} || exit 1 sudo -u lnbits git checkout ${tag} || exit 1
# to the install # to the install
echo "# installing application dependencies" echo "# installing application dependencies"
cd /home/lnbits/lnbits || exit 1 cd /home/lnbits/lnbits || exit 1
# check if poetry in installed, if not install it # check if poetry in installed, if not install it
if ! sudo -u lnbits which poetry; then if ! sudo -u lnbits which poetry; then
@ -652,7 +653,8 @@ if [ "$1" = "install" ]; then
sudo pip3 install --upgrade pip sudo pip3 install --upgrade pip
sudo pip3 install poetry sudo pip3 install poetry
fi fi
# do install like this
echo "# install"
sudo -u lnbits poetry install sudo -u lnbits poetry install
# make sure default virtaulenv is used # make sure default virtaulenv is used
@ -681,7 +683,6 @@ if [ "$1" = "uninstall" ]; then
exit 0 exit 0
fi fi
# on # on
if [ "$1" = "1" ] || [ "$1" = "on" ]; then if [ "$1" = "1" ] || [ "$1" = "on" ]; then
@ -790,7 +791,7 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then
# let switch command part do the detail config # let switch command part do the detail config
/home/admin/config.scripts/bonus.lnbits.sh switch ${fundingsource} /home/admin/config.scripts/bonus.lnbits.sh switch ${fundingsource}
cd /home/lnbits/lnbits || exit 1 cd /home/lnbits/lnbits || exit 1
# open firewall # open firewall
echo echo
@ -799,6 +800,14 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then
sudo ufw allow 5001 comment 'lnbits HTTPS' sudo ufw allow 5001 comment 'lnbits HTTPS'
echo echo
# make sure that systemd starts funding source first
systemdDependency="bitcoind.service"
if [ "${fundingsource}" == "lnd" ]; then
systemdDependency="lnd.service"
elif [ "${fundingsource}" == "cl" ]; then
systemdDependency="lightningd.service"
fi
# install service # install service
echo "*** Install systemd ***" echo "*** Install systemd ***"
cat <<EOF | sudo tee /etc/systemd/system/lnbits.service >/dev/null cat <<EOF | sudo tee /etc/systemd/system/lnbits.service >/dev/null
@ -806,8 +815,8 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then
[Unit] [Unit]
Description=lnbits Description=lnbits
Wants=bitcoind.service Wants=${systemdDependency}
After=bitcoind.service After=${systemdDependency}
[Service] [Service]
WorkingDirectory=/home/lnbits/lnbits WorkingDirectory=/home/lnbits/lnbits
@ -842,13 +851,13 @@ EOF
# setup nginx symlinks # setup nginx symlinks
if ! [ -f /etc/nginx/sites-available/lnbits_ssl.conf ]; then if ! [ -f /etc/nginx/sites-available/lnbits_ssl.conf ]; then
sudo cp /home/admin/assets/nginx/sites-available/lnbits_ssl.conf /etc/nginx/sites-available/lnbits_ssl.conf sudo cp /home/admin/assets/nginx/sites-available/lnbits_ssl.conf /etc/nginx/sites-available/lnbits_ssl.conf
fi fi
if ! [ -f /etc/nginx/sites-available/lnbits_tor.conf ]; then if ! [ -f /etc/nginx/sites-available/lnbits_tor.conf ]; then
sudo cp /home/admin/assets/nginx/sites-available/lnbits_tor.conf /etc/nginx/sites-available/lnbits_tor.conf sudo cp /home/admin/assets/nginx/sites-available/lnbits_tor.conf /etc/nginx/sites-available/lnbits_tor.conf
fi fi
if ! [ -f /etc/nginx/sites-available/lnbits_tor_ssl.conf ]; then if ! [ -f /etc/nginx/sites-available/lnbits_tor_ssl.conf ]; then
sudo cp /home/admin/assets/nginx/sites-available/lnbits_tor_ssl.conf /etc/nginx/sites-available/lnbits_tor_ssl.conf sudo cp /home/admin/assets/nginx/sites-available/lnbits_tor_ssl.conf /etc/nginx/sites-available/lnbits_tor_ssl.conf
fi fi
sudo ln -sf /etc/nginx/sites-available/lnbits_ssl.conf /etc/nginx/sites-enabled/ sudo ln -sf /etc/nginx/sites-available/lnbits_ssl.conf /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/lnbits_tor.conf /etc/nginx/sites-enabled/ sudo ln -sf /etc/nginx/sites-available/lnbits_tor.conf /etc/nginx/sites-enabled/
@ -924,6 +933,10 @@ if [ "$1" = "switch" ]; then
exit 1 exit 1
fi fi
# make lnd.service fallback
sudo sed -i 's/Wants=lnd.service/Wants=bitcoind.service/' /etc/systemd/system/lnbits.service
sudo sed -i 's/After=lnd.service/After=bitcoind.service/' /etc/systemd/system/lnbits.service
echo "##############" echo "##############"
echo "# NOTE: If you switch the funding source of a running LNbits instance all sub account will keep balance." echo "# NOTE: If you switch the funding source of a running LNbits instance all sub account will keep balance."
echo "# Make sure that the new funding source has enough sats to cover the LNbits bookeeping of sub accounts." echo "# Make sure that the new funding source has enough sats to cover the LNbits bookeeping of sub accounts."
@ -1006,7 +1019,7 @@ if [ "$1" = "0" ] || [ "$1" = "off" ]; then
else else
if (whiptail --title " DELETE DATA? " --yesno "Do you want to delete\nthe LNbits Server Data?" 8 30); then if (whiptail --title " DELETE DATA? " --yesno "Do you want to delete\nthe LNbits Server Data?" 8 30); then
deleteData=1 deleteData=1
else else
deleteData=0 deleteData=0
fi fi
fi fi
@ -1069,7 +1082,7 @@ if [ "$1" = "backup" ]; then
else else
# sqlite backup # sqlite backup
backup_target="/mnt/hdd/app-data/backup/lnbits_sqlite" backup_target="/mnt/hdd/app-data/backup/lnbits_sqlite"
backup_file="lnbits_sqlite_`date +%d`-`date +%m`-`date +%Y`_`date +%H`-`date +%M`_fs.tar" backup_file="lnbits_sqlite_$(date +%d)-$(date +%m)-$(date +%Y)_$(date +%H)-$(date +%M)_fs.tar"
if [ ! -d $backup_target ]; then if [ ! -d $backup_target ]; then
sudo mkdir -p $backup_target 1>&2 sudo mkdir -p $backup_target 1>&2
fi fi
@ -1191,9 +1204,8 @@ if [ "$1" = "migrate" ]; then
# execStartPre is not enough, wait for lnbits is finally running # execStartPre is not enough, wait for lnbits is finally running
count=0 count=0
count_max=30 count_max=30
while ! nc -zv 127.0.0.1 5000 2>/dev/null; while ! nc -zv 127.0.0.1 5000 2>/dev/null; do
do count=$(expr $count + 1)
count=`expr $count + 1`
echo "wait for LNBIts to start (${count}s/${count_max}s)" echo "wait for LNBIts to start (${count}s/${count_max}s)"
sleep 1 sleep 1
if [ $count = $count_max ]; then if [ $count = $count_max ]; then

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# https://github.com/cryptoadvance/specter-desktop # https://github.com/cryptoadvance/specter-desktop
pinnedVersion="1.13.1" pinnedVersion="2.0.4"
# command info # command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
@ -131,7 +131,7 @@ function configure_specter {
"proxy_url": "${proxy}", "proxy_url": "${proxy}",
"only_tor": "${torOnly}", "only_tor": "${torOnly}",
"tor_control_port": "${tor_control_port}", "tor_control_port": "${tor_control_port}",
"tor_status": true, "tor_status": false,
"hwi_bridge_url": "/hwi/api/" "hwi_bridge_url": "/hwi/api/"
} }
EOF EOF
@ -146,6 +146,8 @@ EOF
echo "# Connect Specter to the default mainnet node" echo "# Connect Specter to the default mainnet node"
cat >/home/admin/default.json <<EOF cat >/home/admin/default.json <<EOF
{ {
"python_class": "cryptoadvance.specter.node.Node",
"fullpath": "/home/specter/.specter/nodes/default.json"
"name": "raspiblitz_mainnet", "name": "raspiblitz_mainnet",
"alias": "default", "alias": "default",
"autodetect": false, "autodetect": false,
@ -155,8 +157,6 @@ EOF
"port": "8332", "port": "8332",
"host": "localhost", "host": "localhost",
"protocol": "http", "protocol": "http",
"external_node": true,
"fullpath": "/home/specter/.specter/nodes/default.json"
} }
EOF EOF
sudo mv /home/admin/default.json /home/specter/.specter/nodes/default.json sudo mv /home/admin/default.json /home/specter/.specter/nodes/default.json
@ -176,7 +176,7 @@ EOF
"name": "raspiblitz_${chain}net", "name": "raspiblitz_${chain}net",
"alias": "raspiblitz_${chain}net", "alias": "raspiblitz_${chain}net",
"autodetect": false, "autodetect": false,
"datadir": "", "datadir": "/mnt/hdd/bitcoin",
"user": "${RPCUSER}", "user": "${RPCUSER}",
"password": "${PASSWORD_B}", "password": "${PASSWORD_B}",
"port": "${PORT}", "port": "${PORT}",
@ -238,6 +238,8 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then
echo "# --> creating a virtualenv" echo "# --> creating a virtualenv"
sudo -u specter virtualenv --python=python3 /home/specter/.env sudo -u specter virtualenv --python=python3 /home/specter/.env
sudo -u specter /home/specter/.env/bin/python3 -m pip install --upgrade pip
echo "# --> pip-installing specter" echo "# --> pip-installing specter"
sudo -u specter /home/specter/.env/bin/python3 -m pip install --upgrade cryptoadvance.specter==$pinnedVersion || exit 1 sudo -u specter /home/specter/.env/bin/python3 -m pip install --upgrade cryptoadvance.specter==$pinnedVersion || exit 1

View File

@ -1,225 +0,0 @@
#!/bin/bash
# https://github.com/djbooth007/tallycoin_connect
USERNAME=tallycoin
APP_DATA_DIR=/mnt/hdd/app-data/tallycoin-connect
HOME_DIR=/home/$USERNAME
CONFIG_FILE=$APP_DATA_DIR/tallycoin_api.key
RASPIBLITZ_INFO=/home/admin/raspiblitz.info
SERVICE_FILE=/etc/systemd/system/tallycoin-connect.service
TC_VERSION=1.8.0
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
echo "config script to switch tallycoin_connect on or off"
echo "bonus.tallycoin-connect.sh [on|off|menu]"
exit 1
fi
# check and load raspiblitz config to know which network is running
source $RASPIBLITZ_INFO
source /mnt/hdd/raspiblitz.conf
# show info menu
if [ "$1" = "menu" ]; then
# get network info
localip=$(hostname -I | awk '{print $1}')
toraddress=$(sudo cat /mnt/hdd/tor/tallycoin-connect/hostname 2>/dev/null)
fingerprint=$(openssl x509 -in /mnt/hdd/app-data/nginx/tls.cert -fingerprint -noout | cut -d"=" -f2)
if [ "${runBehindTor}" = "on" ] && [ ${#toraddress} -gt 0 ]; then
# Info with TOR
sudo /home/admin/config.scripts/blitz.display.sh qr "${toraddress}"
whiptail --title " Tallycoin Connect " --msgbox "Open in your local web browser:
http://${localip}:8123\n
https://${localip}:8124 with Fingerprint:
${fingerprint}\n
Use your Password B to login.\n
Hidden Service address for TOR Browser (see LCD for QR):\n${toraddress}
" 16 72
sudo /home/admin/config.scripts/blitz.display.sh hide
else
# Info without TOR
whiptail --title " Tallycoin Connect " --msgbox "Open in your local web browser & accept self-signed cert:
http://${localip}:8123\n
https://${localip}:8124 with Fingerprint:
${fingerprint}\n
Use your Password B to login.\n
Activate TOR to access the web interface from outside your local network.
" 15 72
fi
echo "please wait ..."
exit 0
fi
# switch on
if [ "$1" = "1" ] || [ "$1" = "on" ]; then
isInstalled=$(sudo ls $HOME_DIR 2>/dev/null | grep -c 'tallycoin_connect')
if [ ${isInstalled} -eq 0 ]; then
echo "*** INSTALL TALLYCOIN CONNECT ***"
# install nodeJS
/home/admin/config.scripts/bonus.nodejs.sh on
# add user
sudo adduser --system --group --home /home/$USERNAME $USERNAME
# install tallycoin_connect
cd $HOME_DIR
sudo -u $USERNAME wget https://github.com/djbooth007/tallycoin_connect/archive/refs/tags/v$TC_VERSION.tar.gz
sudo -u $USERNAME tar -xzf v$TC_VERSION.tar.gz
sudo -u $USERNAME mv tallycoin_connect{-$TC_VERSION,}
sudo -u $USERNAME rm v$TC_VERSION.tar.gz
cd tallycoin_connect
sudo -u $USERNAME cat .dockerignore | sudo -u $USERNAME xargs sudo -u $USERNAME rm -rf
sudo -u $USERNAME rm .dockerignore
sudo -u $USERNAME npm install
if ! [ $? -eq 0 ]; then
echo "FAIL - npm install did not run correctly, aborting"
exit 1
fi
# setup config
sudo mkdir -p $APP_DATA_DIR
sudo chown $USERNAME:$USERNAME $APP_DATA_DIR
if [[ ! -f "$CONFIG_FILE" ]]; then
configFile=/home/admin/tallycoin_api.key
touch $configFile
sudo chmod 600 $configFile || exit 1
passwordB=$(sudo cat /mnt/hdd/${network}/${network}.conf | grep rpcpassword | cut -c 13-)
passwd=$(printf $passwordB | sha256sum | tr -d ' -')
tlsCert=$(base64 /mnt/hdd/app-data/lnd/tls.cert | tr -d '=' | tr '/+' '_-' | tr -d '\n')
macaroon=$(base64 /mnt/hdd/app-data/lnd/data/chain/${network}/${chain}net/admin.macaroon | tr -d '=' | tr '/+' '_-' | tr -d '\n')
echo "{\"tls_cert\":\"$tlsCert\",\"macaroon\":\"$macaroon\",\"tallycoin_passwd\":\"$passwd\"}" > $configFile
sudo mv $configFile $CONFIG_FILE
sudo chown $USERNAME:$USERNAME $CONFIG_FILE
fi
##################
# NGINX
##################
# setup nginx symlinks
if ! [ -f /etc/nginx/sites-available/tallycoin_connect_ssl.conf ]; then
sudo cp -f /home/admin/assets/nginx/sites-available/tallycoin_connect_ssl.conf /etc/nginx/sites-available/tallycoin_connect_ssl.conf
fi
if ! [ -f /etc/nginx/sites-available/tallycoin_connect_tor.conf ]; then
sudo cp /home/admin/assets/nginx/sites-available/tallycoin_connect_tor.conf /etc/nginx/sites-available/tallycoin_connect_tor.conf
fi
if ! [ -f /etc/nginx/sites-available/tallycoin_connect_tor_ssl.conf ]; then
sudo cp /home/admin/assets/nginx/sites-available/tallycoin_connect_tor_ssl.conf /etc/nginx/sites-available/tallycoin_connect_tor_ssl.conf
fi
sudo ln -sf /etc/nginx/sites-available/tallycoin_connect_ssl.conf /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/tallycoin_connect_tor.conf /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/tallycoin_connect_tor_ssl.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
# open the firewall
echo "*** Updating Firewall ***"
sudo ufw allow from any to any port 8123 comment 'allow Tallycoin Connect HTTP'
sudo ufw allow from any to any port 8124 comment 'allow Tallycoin Connect HTTPS'
echo ""
##################
# SYSTEMD SERVICE
##################
echo "# Install Tallycoin Connect systemd for ${network} on ${chain}"
echo "
# Systemd unit for Tallycoin Connect
[Unit]
Description=Tallycoin Connect daemon
Wants=lnd.service
After=lnd.service
[Service]
WorkingDirectory=$HOME_DIR/tallycoin_connect
Environment=\"CONFIG_FILE=$CONFIG_FILE\"
ExecStart=/usr/bin/npm start
User=tallycoin
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 $SERVICE_FILE
sudo systemctl enable tallycoin-connect
# setting value in raspiblitz config
/home/admin/config.scripts/blitz.conf.sh set tallycoinConnect "on"
# Hidden Service for tallycoin-connect if Tor is active
if [ "${runBehindTor}" = "on" ]; then
# make sure to keep in sync with tor.onion-service.sh script
/home/admin/config.scripts/tor.onion-service.sh tallycoin-connect 80 8125 443 8126
fi
source $RASPIBLITZ_INFO
if [ "${state}" == "ready" ]; then
echo "# OK - the tallycoin-connect.service is enabled, system is ready so starting service"
sudo systemctl start tallycoin-connect
else
echo "# OK - the tallycoin-connect.service is enabled, to start manually use: 'sudo systemctl start tallycoin-connect'"
fi
else
echo "*** TALLYCOIN CONNECT ALREADY INSTALLED ***"
fi
exit 0
fi
# switch off
if [ "$1" = "0" ] || [ "$1" = "off" ]; then
isInstalled=$(sudo ls $HOME_DIR 2>/dev/null | grep -c 'tallycoin_connect')
if [ ${isInstalled} -eq 1 ]; then
echo "*** UNINSTALL TALLYCOIN CONNECT ***"
# remove systemd service
sudo systemctl stop tallycoin-connect
sudo systemctl disable tallycoin-connect
sudo rm -f $SERVICE_FILE
# close ports on firewall
sudo ufw delete allow from any to any port 8123 comment 'allow Tallycoin Connect HTTP'
sudo ufw delete allow from any to any port 8124 comment 'allow Tallycoin Connect HTTPS'
# remove nginx symlinks
sudo rm -f /etc/nginx/sites-enabled/tallycoin_connect_*
sudo nginx -t
sudo systemctl reload nginx
# Hidden Service if Tor is active
if [ "${runBehindTor}" = "on" ]; then
/home/admin/config.scripts/tor.onion-service.sh off tallycoin-connect
fi
# remove config
sudo rm -rf $APP_DATA_DIR
# delete user and home directory
sudo userdel -rf $USERNAME
# setting value in raspi blitz config
/home/admin/config.scripts/blitz.conf.sh set tallycoinConnect "off"
echo "OK TALLYCOIN CONNECT removed."
else
echo "*** TALLYCOIN CONNECT NOT INSTALLED ***"
fi
exit 0
fi
echo "FAIL - Unknown Parameter $1"
exit 1

View File

@ -0,0 +1,50 @@
#!/bin/bash
# This script allows users to sign a message from a specific Bitcoin address
# either by generating a new address or using an existing one.
# Ask if a new address should be generated or an existing one should be entered
read -p "Do you want to generate a new address? (y/n) " generate_new
# 1.a. If generating a new address, ask for the address type
if [ "$generate_new" == "y" ]; then
echo "Generate a wallet new address. Address-types has to be one of:"
echo "1. p2wkh: Pay to witness key hash"
echo "2. np2wkh: Pay to nested witness key hash"
echo "3. p2tr: Pay to taproot pubkey"
read -p "Enter the address type (1-3 or string): " address_type
case "$address_type" in
1|"p2wkh")
address_type="p2wkh"
;;
2|"np2wkh")
address_type="np2wkh"
;;
3|"p2tr")
address_type="p2tr"
;;
*)
echo "Error: Invalid address type."
exit 1
;;
esac
address=$(lncli newaddress $address_type)
address_variable=$(echo $address | jq -r '.address')
else
# 1.b. Check if the manually entered address is valid
read -p "Enter the existing address: " address
if ! bitcoin-cli validateaddress "$address" | grep -q "isvalid\": true"; then
echo "Error: The entered address is not valid."
exit 1
fi
address_variable=$address
fi
# 2. Ask for the message to sign and save it to a variable
read -p "Enter the message to sign: " message_to_sign
# 3. Execute the lncli wallet addresses signmessage command
signature_js=$(lncli wallet addresses signmessage --address $address_variable --msg "$message_to_sign")
signature=$(echo $signature_js | jq -r '.signature')
echo "The address is: $address_variable"
echo "The message to sign is: $message_to_sign"
echo "The signature is: $signature"

View File

@ -44,12 +44,17 @@ if [ "${btc_default_blocks_data_kb}" != "" ] && [ ${btc_default_blocks_data_kb}
OPTIONS=() OPTIONS=()
OPTIONS+=(SELFSYNC "Run full self sync/validation (takes long)") OPTIONS+=(SELFSYNC "Run full self sync/validation (takes long)")
OPTIONS+=(COPY "Copy from Computer/RaspiBlitz over LAN (3-10h)") OPTIONS+=(COPY "Copy from Computer/RaspiBlitz over LAN (3-10h)")
OPTIONS+=(TESTNET "Sync smaller Testnet (ONLY DEVELOPER)")
CHOICESUB=$(dialog --backtitle "RaspiBlitz" --clear --title " Blockchain Sync/Validation " --menu "\nYour Blockchain is not fully synced yet.\nThe full validation might take multiple days to finish.\n\nHow do you want to proceed:" 13 66 7 "${OPTIONS[@]}" 2>&1 >/dev/tty) CHOICESUB=$(dialog --backtitle "RaspiBlitz" --clear --title " Blockchain Sync/Validation " --menu "\nYour Blockchain is not fully synced yet.\nThe full validation might take multiple days to finish.\n\nHow do you want to proceed:" 13 66 7 "${OPTIONS[@]}" 2>&1 >/dev/tty)
if [ "${CHOICESUB}" == "COPY" ]; then if [ "${CHOICESUB}" == "COPY" ]; then
/home/admin/config.scripts/blitz.copychain.sh target /home/admin/config.scripts/blitz.copychain.sh target
fi fi
if [ "${CHOICESUB}" == "TESTNET" ]; then
sudo /home/admin/config.scripts/bitcoin.testnet.sh activate
fi
fi fi
############################################ ############################################

View File

@ -28,7 +28,7 @@ actionString="Please wait - this can take some time"
# formatting BLOCKCHAIN SYNC PROGRESS # formatting BLOCKCHAIN SYNC PROGRESS
if [ "${btc_default_ready}" == "0" ] || [ "${btc_default_peers}" == "" ]; then if [ "${btc_default_ready}" == "0" ] || [ "${btc_default_peers}" == "" ]; then
if [ ${system_count_start_blockchain} -gt 1 ]; then if [ "${system_count_start_blockchain}" != "" ] && [ ${system_count_start_blockchain} -gt 1 ]; then
syncProgress="${system_count_start_blockchain} restarts" syncProgress="${system_count_start_blockchain} restarts"
else else
syncProgress="waiting for start" syncProgress="waiting for start"