From ed4f7ec1f2899642819d1582652442d2bd9d3fd0 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 8 Mar 2019 13:30:33 +0000 Subject: [PATCH 01/88] #409 how to fix signature mismatch error --- FAQ.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/FAQ.md b/FAQ.md index c5b4e94..9ddf2d6 100644 --- a/FAQ.md +++ b/FAQ.md @@ -537,3 +537,12 @@ Yes but you need to change at least on one RaspiBlitz the port number (for examp ## How to change the public port LND/Lightning node is running on? There is a experimental script you can call from the terminal that will make all changes for you ... see details here: https://github.com/rootzoll/raspiblitz/issues/100#issuecomment-466722712 + +## How to solve a "signature mismatch after caveat verification" error? + +If you get this error by LND that means that something is wrong with the macaroons being used to communicate with LND .. see: https://github.com/lightningnetwork/lnd/blob/master/docs/macaroons.md + +To fix this depends on where you get this error: + +* If you get it in a mobile wallet, then redo the connection with the RaspiBlitz to get fresh macaroons. +* If you get this from RTL or from the scripts of the SSH menus of the RaspiBlitz, then go to "EXPORT Macacroons and TLS.cert" in SSH main menu and choose the the "RESET Macaroons & TLS" option. \ No newline at end of file From ae6f3794081553e02afc555d1370efe5509376e5 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Wed, 13 Mar 2019 16:04:09 +0100 Subject: [PATCH 02/88] #418 cleaning system logs on startup --- home.admin/_bootstrap.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index 814219c..4d4c160 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -58,6 +58,11 @@ if [ "${setupStep}" != "100" ]; then fi sudo chmod 777 ${infoFile} +# cleaning system logs to prevent SD card filling up +# see https://github.com/rootzoll/raspiblitz/issues/418#issuecomment-472180944 +echo "Cleaning system logs" +sudo rm /var/log/daemon* && sudo rm /var/log/*.gz + ################################ # GENERATE UNIQUE SSH PUB KEYS # on first boot up From e2d14aa4aa1fa5c15ca6f76b3370b96509082cfa Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Wed, 13 Mar 2019 16:09:01 +0100 Subject: [PATCH 03/88] #394 LND debuglogs to info --- home.admin/assets/lnd.bitcoin.conf | 2 +- home.admin/assets/lnd.litecoin.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/assets/lnd.bitcoin.conf b/home.admin/assets/lnd.bitcoin.conf index 05537ec..a6db19e 100755 --- a/home.admin/assets/lnd.bitcoin.conf +++ b/home.admin/assets/lnd.bitcoin.conf @@ -1,7 +1,7 @@ # lnd configuration [Application Options] -debuglevel=debug +debuglevel=info maxpendingchannels=5 alias=raspiblitz color=#68F442 diff --git a/home.admin/assets/lnd.litecoin.conf b/home.admin/assets/lnd.litecoin.conf index bf9bdc1..4f50520 100755 --- a/home.admin/assets/lnd.litecoin.conf +++ b/home.admin/assets/lnd.litecoin.conf @@ -1,7 +1,7 @@ # lnd configuration [Application Options] -debuglevel=debug +debuglevel=info maxpendingchannels=5 alias=raspiblitz color=#68F442 From 97b8feaa1a91e5ad62422e93cf8d0bcef583e4ba Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Wed, 13 Mar 2019 17:00:44 +0100 Subject: [PATCH 04/88] #394 change logrotate config --- build_sdcard.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/build_sdcard.sh b/build_sdcard.sh index ede9eeb..d39edf2 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -71,6 +71,11 @@ else echo "OK running ${baseImage}" fi +# setting static DNS server +# see https://github.com/rootzoll/raspiblitz/issues/322#issuecomment-466733550 +sudo sed -i "s/^#static domain_name_servers=192.168.0.1*/static domain_name_servers=1.1.1.1/g" /etc/dhcpcd.conf +systemctl daemon-reload + # fixing locales for build # https://github.com/rootzoll/raspiblitz/issues/138 # https://daker.me/2014/10/how-to-fix-perl-warning-setting-locale-failed-in-raspbian.html @@ -148,6 +153,27 @@ sudo bash -c "echo '[Service]' >> /etc/systemd/system/getty@tty1.service.d/autol sudo bash -c "echo 'ExecStart=' >> /etc/systemd/system/getty@tty1.service.d/autologin.conf" sudo bash -c "echo 'ExecStart=-/sbin/agetty --autologin pi --noclear %I 38400 linux' >> /etc/systemd/system/getty@tty1.service.d/autologin.conf" +# change log rotates +# see https://github.com/rootzoll/raspiblitz/issues/394#issuecomment-471535483 +sudo head -n 18 /etc/logrotate.d/rsyslog > ./rsyslog +echo "{" >> ./rsyslog +echo " rotate 4" >> ./rsyslog +echo " size=100M" >> ./rsyslog +echo " missingok" >> ./rsyslog +echo " notifempty" >> ./rsyslog +echo " compress" >> ./rsyslog +echo " delaycompress" >> ./rsyslog +echo " sharedscripts" >> ./rsyslog +echo " postrotate" >> ./rsyslog +echo " invoke-rc.d rsyslog rotate > /dev/null" >> ./rsyslog +echo " endscript" >> ./rsyslog +echo "}" >> ./rsyslog +echo "" >> ./rsyslog +sudo tail -n +19 /etc/logrotate.d/rsyslog >> ./rsyslog +sudo mv ./rsyslog /etc/logrotate.d/rsyslog +sudo chown root:root /etc/logrotate.d/rsyslog +sudo service rsyslog restart + echo "" echo "*** SOFTWARE UPDATE ***" # based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#software-update From 0b92392db96fa97d5d504fd775200b430dcd44b8 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Wed, 13 Mar 2019 17:38:08 +0100 Subject: [PATCH 05/88] version number to 1.1 --- build_sdcard.sh | 2 +- home.admin/_version.info | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build_sdcard.sh b/build_sdcard.sh index d39edf2..a39b14e 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -12,7 +12,7 @@ echo "" echo "*****************************************" -echo "* RASPIBLITZ SD CARD IMAGE SETUP v1.00 *" +echo "* RASPIBLITZ SD CARD IMAGE SETUP v1.1 *" echo "*****************************************" echo "" diff --git a/home.admin/_version.info b/home.admin/_version.info index 4b034a1..ba1762e 100644 --- a/home.admin/_version.info +++ b/home.admin/_version.info @@ -1,2 +1,2 @@ # RaspiBlitz Version - always [main].[sub] -codeVersion="1.0" \ No newline at end of file +codeVersion="1.1" \ No newline at end of file From 3756531b0e425532b23a05d6d27ad2aa2fd358e9 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Wed, 13 Mar 2019 18:13:49 +0100 Subject: [PATCH 06/88] #322 install checks on RTL --- home.admin/00settingsMenuServices.sh | 20 ++++++++++----- home.admin/config.scripts/bonus.rtl.sh | 35 ++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/home.admin/00settingsMenuServices.sh b/home.admin/00settingsMenuServices.sh index 843f77b..51f592d 100644 --- a/home.admin/00settingsMenuServices.sh +++ b/home.admin/00settingsMenuServices.sh @@ -172,13 +172,21 @@ if [ "${rtlWebinterface}" != "${choice}" ]; then echo "RTL Webinterface Setting changed .." anychange=1 sudo /home/admin/config.scripts/bonus.rtl.sh ${choice} + errorOnInstall=$? if [ "${choice}" = "on" ]; then - localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') - l1="RTL web servcie will be ready AFTER NEXT REBOOT:" - l2="Try to open the following URL in your local webrowser" - l3="and login with your PASSWORD B." - l4="---> http://${localip}:3000" - dialog --title 'OK' --msgbox "${l1}\n${l2}\n${l3}\n${l4}" 11 65 + if [ ${errorOnInstall} -eq 0 ]; then + localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') + l1="RTL web servcie will be ready AFTER NEXT REBOOT:" + l2="Try to open the following URL in your local webrowser" + l3="and login with your PASSWORD B." + l4="---> http://${localip}:3000" + dialog --title 'OK' --msgbox "${l1}\n${l2}\n${l3}\n${l4}" 11 65 + else + l1="!!! FAIL on RTL install !!!" + l2="Try manual install on terminal after rebootwith:" + l3="sudo /home/admin/config.scripts/bonus.rtl.sh on" + dialog --title 'FAIL' --msgbox "${l1}\n${l2}\n${l3}" 10 65 + fi fi needsReboot=1 else diff --git a/home.admin/config.scripts/bonus.rtl.sh b/home.admin/config.scripts/bonus.rtl.sh index 26781e5..5e2b77d 100755 --- a/home.admin/config.scripts/bonus.rtl.sh +++ b/home.admin/config.scripts/bonus.rtl.sh @@ -29,9 +29,6 @@ sudo systemctl stop RTL 2>/dev/null if [ "$1" = "1" ] || [ "$1" = "on" ]; then echo "*** INSTALL RTL ***" - # setting value in raspi blitz config - sudo sed -i "s/^rtlWebinterface=.*/rtlWebinterface=on/g" /mnt/hdd/raspiblitz.conf - isInstalled=$(sudo ls /etc/systemd/system/RTL.service 2>/dev/null | grep -c 'RTL.service') if [ ${isInstalled} -eq 0 ]; then @@ -42,18 +39,42 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then sudo apt-get install -y nodejs echo "" + # check if nodeJS was installed + nodeJSInstalled=$(node -v | grep -c "v11.") + if [ nodeJSInstalled -eq 0 ]; then + echo "FAIL - Was not able to install nodeJS 11" + echo "ABORT - RTL install" + exit 1 + fi + # download source code and set to tag release echo "*** Get the RTL Source Code ***" git clone https://github.com/ShahanaFarooqui/RTL.git cd RTL - git reset --hard v0.2.1 - #git reset --hard v0.1.14-alpha + git reset --hard v0.2.15 + # check if node_modles exists now + if [ -d "/home/admin/RTL" ]; then + echo "OK - RTL code copy looks good" + else + echo "FAIL - code copy did not run correctly" + echo "ABORT - RTL install" + exit 1 + fi + echo "" # install echo "*** Run: npm install ***" npm install cd .. + # check if node_modles exists now + if [ -d "/home/admin/RTL/node_modules" ]; then + echo "OK - RTL install looks good" + else + echo "FAIL - npm install did not run correctly" + echo "ABORT - RTL install" + exit 1 + fi echo "" # prepare RTL.conf file @@ -77,10 +98,14 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then sudo sed -i "s|chain/bitcoin/mainnet|chain/${network}/${chain}net|" /etc/systemd/system/RTL.service sudo systemctl enable RTL echo "OK - RTL is now ACTIVE" + else echo "RTL already installed." fi + # setting value in raspi blitz config + sudo sed -i "s/^rtlWebinterface=.*/rtlWebinterface=on/g" /mnt/hdd/raspiblitz.conf + echo "needs reboot to activate new setting" exit 0 fi From 9fc9188081bea5a2affeaeae4cdc30270558c517 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 00:15:19 +0100 Subject: [PATCH 07/88] FAQ info about rounting --- FAQ.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/FAQ.md b/FAQ.md index 7e5f576..21f6ac5 100644 --- a/FAQ.md +++ b/FAQ.md @@ -506,3 +506,12 @@ You could try to re-index, but that can take some very long time - multiple days Another option would be to delete the old blockchain and get a new one. See for details the FAQ question: [I have the full blockchain on another computer. How do I copy it to the RaspiBlitz?](FAQ.md#i-have-the-full-blockchain-on-another-computer-how-do-i-copy-it-to-the-raspiblitz). And even if you are not able to delete the data, first rename the undeletable folders and then follow the instructions. Also make sure to check again on your power supply - it needs to deliver equal or more then 3A and should deliver a stable current. If you think your HDD is degrading - maybe this is a good time to replace it. See for details the FAQ question: [How can I recover my coins from a failing RaspiBlitz?](FAQ.md#how-can-i-recover-my-coins-from-a-failing-raspiblitz) + +## Why is my node not routing? + +1. You don't have inbound liquidity +2. Low uptime +3. Capital is committed to competitive destinations +4. Capital committed to destinations no one wants to send to +5. Fees are too high +6. Your inbound liquidity doesn't have good inbound liquidity itself \ No newline at end of file From 3a3c7d34923d82931634f78f7d5168007a0ed92c Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 10:55:40 +0100 Subject: [PATCH 08/88] #394 emergency delete logs on boot >1GB --- home.admin/_bootstrap.sh | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index 4d4c160..e3dec01 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -58,10 +58,21 @@ if [ "${setupStep}" != "100" ]; then fi sudo chmod 777 ${infoFile} -# cleaning system logs to prevent SD card filling up +# Emergency cleaning logs when over 1GB (to prevent SD card filling up) # see https://github.com/rootzoll/raspiblitz/issues/418#issuecomment-472180944 -echo "Cleaning system logs" -sudo rm /var/log/daemon* && sudo rm /var/log/*.gz +echo "*** Checking Log Size ***" +logsMegaByte=$(sudo du -c -m /var/log | grep "total" | awk '{print $1;}') +if [ ${logsMegaByte} -gt 1000 ]; then + echo "WARN !! Logs /var/log in are bigger then 1GB" + echo "ACTION --> DELETED ALL LOGS" + sudo rm -r /var/log/* + sleep 3 + echo "WARN !! Logs in /var/log in were bigger then 1GB and got emergency delete to prevent fillup." + echo "If you see this in the logs please report to the GitHub issues, so LOG config needs to hbe optimized." +else + echo "OK - logs are at ${logsMegaByte} MB - within safety limit" +fi +echo "" ################################ # GENERATE UNIQUE SSH PUB KEYS From 4dd993ce0d0765e79b7dc0d3edb1982da832ac78 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 11:39:56 +0100 Subject: [PATCH 09/88] #421 added go version check --- home.admin/97addMobileWalletZap.sh | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/home.admin/97addMobileWalletZap.sh b/home.admin/97addMobileWalletZap.sh index 116db47..8054d4a 100755 --- a/home.admin/97addMobileWalletZap.sh +++ b/home.admin/97addMobileWalletZap.sh @@ -15,11 +15,13 @@ if [ ${#GOPATH} -eq 0 ]; then fi # make sure go is installed +goVersion="1.11" +echo "### Check Framework: GO ###" goInstalled=$(go version 2>/dev/null | grep -c 'go') if [ ${goInstalled} -eq 0 ];then - echo "### Installing GO ###" - wget https://storage.googleapis.com/golang/go1.11.linux-armv6l.tar.gz - sudo tar -C /usr/local -xzf go1.11.linux-armv6l.tar.gz + echo "---> Installing GO" + wget https://storage.googleapis.com/golang/go${goVersion}.linux-armv6l.tar.gz + sudo tar -C /usr/local -xzf go${goVersion}.linux-armv6l.tar.gz sudo rm *.gz sudo mkdir /usr/local/gocode sudo chmod 777 /usr/local/gocode @@ -27,11 +29,19 @@ if [ ${goInstalled} -eq 0 ];then fi if [ ${goInstalled} -eq 0 ];then echo "FAIL: Was not able to install GO (needed to run LndConnect)" + sleep 4 exit 1 fi +clear +correctGoVersion=$(go version | grep -c "go${goVersion}") +if [ ${correctGoVersion} -eq 0 ]; then + echo "WARNING: You work with a untested version of GO - should be ${goVersion} .. trying to continue" + go version + sleep 6 + echo "" +fi # make sure qrcode-encoder in installed -clear echo "*** Setup ***" echo "" echo "Installing zapconnect. Please wait..." From d37e49b41a48345d3de405599e6fc2653f7b8567 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 12:07:38 +0100 Subject: [PATCH 10/88] fsck the harddisk on every boot #360 --- home.admin/40addHDD.sh | 7 ++++++- home.admin/97addMobileWalletZap.sh | 8 ++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/home.admin/40addHDD.sh b/home.admin/40addHDD.sh index 41c418b..7db2ed0 100755 --- a/home.admin/40addHDD.sh +++ b/home.admin/40addHDD.sh @@ -25,7 +25,8 @@ if [ ${existsHDD} -gt 0 ]; then uuid=$1 fstabOK=$(cat /etc/fstab | grep -c ${uuid}) if [ ${fstabOK} -eq 0 ]; then - fstabAdd="UUID=${uuid} /mnt/hdd ext4 noexec,defaults 0 0" + # see https://github.com/rootzoll/raspiblitz/issues/360#issuecomment-467567572 + fstabAdd="UUID=${uuid} /mnt/hdd ext4 noexec,defaults 0 2" echo "Adding line to /etc/fstab ..." echo ${fstabAdd} # adding the new line after line 3 to the /etc/fstab @@ -46,6 +47,10 @@ if [ ${existsHDD} -gt 0 ]; then echo "OK - HDD is mounted" echo "" + # setting fsk check intervall to 1 + # see https://github.com/rootzoll/raspiblitz/issues/360#issuecomment-467567572 + sudo tune2fs -c 1 /dev/sda1 + # init the RASPIBLITZ Config configFile="/mnt/hdd/raspiblitz.conf" configExists=$(sudo ls ${configFile} | grep -c 'raspiblitz.conf') diff --git a/home.admin/97addMobileWalletZap.sh b/home.admin/97addMobileWalletZap.sh index 8054d4a..666cc14 100755 --- a/home.admin/97addMobileWalletZap.sh +++ b/home.admin/97addMobileWalletZap.sh @@ -62,10 +62,10 @@ echo "******************************" echo "" echo "GETTING THE APP" echo "At the moment this app is in closed beta testing and the source code has not been published yet." -echo "Go to http://www.zap-ios.jackmallers.com sign up with your email (confirmation can take time)" -echo "iOS: Read https://developer.apple.com/testflight/testers/" +echo "1. Install the app 'TestFlight' from Apple Appstore. Open it and agree to all terms of services." +echo "2. Open on your iOS device https://github.com/LN-Zap/zap-iOS and follow 'Download the Alpha'" echo "" -echo "*** STEP 1 ***" +echo "*** PAIRING STEP 1 ***" if [ ${#dynDomain} -eq 0 ]; then echo "Once you have the app is running make sure you are on the same local network (WLAN same as LAN)." fi @@ -77,7 +77,7 @@ echo "Then PRESS ENTER here in the terminal to generare the QR code and scan it read key clear -echo "*** STEP 2 : Click on Scan (make whole QR code fill camera) ***" +echo "*** PAIRING STEP 2 : Click on Scan (make whole QR code fill camera) ***" if [ ${#dynDomain} -eq 0 ]; then # If you drop the -i parameter, lndconnect will use the external IP. From adbd940331b530dc1becedd9e3e44834457f0cc6 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 12:39:16 +0100 Subject: [PATCH 11/88] #195 try to kickstart LCD back with fbi on boot --- build_sdcard.sh | 3 +++ home.admin/_bootstrap.sh | 6 ++++++ pictures/logoraspiblitz.png | Bin 0 -> 49267 bytes 3 files changed, 9 insertions(+) create mode 100644 pictures/logoraspiblitz.png diff --git a/build_sdcard.sh b/build_sdcard.sh index a39b14e..671a637 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -184,6 +184,9 @@ sudo apt-get install -y htop git curl bash-completion jq dphys-swapfile # installs bandwidth monitoring for future statistics sudo apt-get install -y vnstat +# preprae for display graphics mode +sudo apt-get install -y fbi + echo "" echo "*** ADDING MAIN USER admin ***" # based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#adding-main-user-admin diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index e3dec01..25aa80f 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -38,6 +38,12 @@ echo "Running RaspiBlitz Bootstrap ${codeVersion}" >> $logFile date >> $logFile echo "***********************************************" >> $logFile +# display 3 secs logo - try to kickstart LCD +# see https://github.com/rootzoll/raspiblitz/issues/195#issuecomment-469918692 +sudo fbi -a -T 1 -d /dev/fb5 --noverbose /home/admin/raspiblitz/pictures/logoraspiblitz.png +sleep 3 +sudo killall -3 fbi + # set default values for raspiblitz.info network="" chain="" diff --git a/pictures/logoraspiblitz.png b/pictures/logoraspiblitz.png new file mode 100644 index 0000000000000000000000000000000000000000..b139cfbb3d99c1c96db0b9337ab9c4ef83dbcf55 GIT binary patch literal 49267 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 Date: Thu, 14 Mar 2019 12:41:58 +0100 Subject: [PATCH 12/88] fix to fbi1 --- home.admin/_bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index 25aa80f..7d436ca 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -40,7 +40,7 @@ echo "***********************************************" >> $logFile # display 3 secs logo - try to kickstart LCD # see https://github.com/rootzoll/raspiblitz/issues/195#issuecomment-469918692 -sudo fbi -a -T 1 -d /dev/fb5 --noverbose /home/admin/raspiblitz/pictures/logoraspiblitz.png +sudo fbi -a -T 1 -d /dev/fb1 --noverbose /home/admin/raspiblitz/pictures/logoraspiblitz.png sleep 3 sudo killall -3 fbi From 92be6ffa2d18fb034b773b190f22bab8298cb641 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 12:47:33 +0100 Subject: [PATCH 13/88] make start boot screen 5 secs --- home.admin/_bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index 7d436ca..d89f857 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -41,7 +41,7 @@ echo "***********************************************" >> $logFile # display 3 secs logo - try to kickstart LCD # see https://github.com/rootzoll/raspiblitz/issues/195#issuecomment-469918692 sudo fbi -a -T 1 -d /dev/fb1 --noverbose /home/admin/raspiblitz/pictures/logoraspiblitz.png -sleep 3 +sleep 5 sudo killall -3 fbi # set default values for raspiblitz.info From 060c670c46d05897b7d6dbac5fb3d7a7213bce81 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 13:03:11 +0100 Subject: [PATCH 14/88] #88 add redis services --- build_sdcard.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/build_sdcard.sh b/build_sdcard.sh index 671a637..c04bef7 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -184,9 +184,15 @@ sudo apt-get install -y htop git curl bash-completion jq dphys-swapfile # installs bandwidth monitoring for future statistics sudo apt-get install -y vnstat -# preprae for display graphics mode +# prepare for display graphics mode +# see https://github.com/rootzoll/raspiblitz/pull/334 sudo apt-get install -y fbi +# prepare dor display service +# see https://github.com/rootzoll/raspiblitz/issues/88#issuecomment-471342311 +sudo apt-get install -y redis-server +sudo -H pip3 install redis + echo "" echo "*** ADDING MAIN USER admin ***" # based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#adding-main-user-admin From fd235d1d3b136750842918af43fe9da391841baf Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 13:14:04 +0100 Subject: [PATCH 15/88] EXT4-fs error #428 --- build_sdcard.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_sdcard.sh b/build_sdcard.sh index c04bef7..342da93 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -132,6 +132,8 @@ if [ "${baseImage}" = "raspbian" ]; then sudo raspi-config nonint do_boot_wait 0 # set WIFI country so boot does not block sudo raspi-config nonint do_wifi_country US + # see https://github.com/rootzoll/raspiblitz/issues/428#issuecomment-472822840 + echo "max_usb_current=1" | sudo tee -a /boot/config.txt # extra: remove some big packages not needed sudo apt-get remove -y --purge libreoffice* oracle-java* chromium-browser nuscratch scratch sonic-pi minecraft-pi python-pygame sudo apt-get clean From cca314d6702707be73be2c89075a126948285df1 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 13:18:04 +0100 Subject: [PATCH 16/88] #361 remove FTP option --- FAQ.md | 6 +++--- README.md | 17 ++++------------- home.admin/10setupBlitz.sh | 5 ----- home.admin/50torrentHDD.sh | 2 +- 4 files changed, 8 insertions(+), 22 deletions(-) diff --git a/FAQ.md b/FAQ.md index 21f6ac5..1719f78 100644 --- a/FAQ.md +++ b/FAQ.md @@ -55,11 +55,11 @@ Of course, people should modify the system, add own scripts, etc ... but if you ## How can I avoid using a prepared blockchain and validate myself? -The torrent and FTP download use a prepared blockchain to kick start the RaspiBlitz. If you want to selft validate you could do this on another more powerful computer and then transfere your own validated blockchain over to the RaspiBlitz. Check the options `Copying from another Computer` & `Cloning from a 2nd HDD` described in the [README](README.md) for more details. +The torrent download use a prepared blockchain to kick start the RaspiBlitz. If you want to selft validate you could do this on another more powerful computer and then transfere your own validated blockchain over to the RaspiBlitz. Check the options `Copying from another Computer` & `Cloning from a 2nd HDD` described in the [README](README.md) for more details. ## I have the full blockchain on another computer. How do I copy it to the RaspiBlitz? -Copying a already synced blockchain from another computer (for example your Laptop) can be a quick way to get the RaspiBlitz started or replacing a corrupted blockchain with a fresh one. Also that way you synced and verified the blockchain yourself and not trusting the RaspiBlitz FTP/Torrent downloads (dont trust, verify). +Copying a already synced blockchain from another computer (for example your Laptop) can be a quick way to get the RaspiBlitz started or replacing a corrupted blockchain with a fresh one. Also that way you synced and verified the blockchain yourself and not trusting the RaspiBlitz Torrent downloads (dont trust, verify). One requirement is that the blockchain is from another bitcoin-core client with version greater or equal to 0.17.1 with transaction index switched on (`txindex=1` in the `bitcoin.conf`). @@ -107,7 +107,7 @@ To connect the 2nd HDD to the RaspiBlitz, the use of a Y cable to provide extra ## Why is my "final sync" taking so long? -First of all if you see a final sync over 90% and you can see from time to time small increase - you should be OK ... this can take some looong time to catch up with the network. Only in the case that you activly choose the `SYNC` option in the `Getting the Blockchain` a final sync under 90% is OK. If you did a torrent, a FTP or a copy from another computer and seeing under 90% somthing went wrong and the setup process is ignoring your prepared Blockchain and doing a full sync - which can almost take forever on a raspberryPi. +First of all if you see a final sync over 90% and you can see from time to time small increase - you should be OK ... this can take some looong time to catch up with the network. Only in the case that you activly choose the `SYNC` option in the `Getting the Blockchain` a final sync under 90% is OK. If you did a torrent or a copy from another computer and seeing under 90% somthing went wrong and the setup process is ignoring your prepared Blockchain and doing a full sync - which can almost take forever on a raspberryPi. So if something is wrong (like mentioned above) then try again from the beginning. You need to reset your HDD for a fresh start: SSH in as admin user. Abort the final sync info with CTRL+c to get to the terminal. There run `sudo /home/admin/XXcleanHDD.sh -all` and follow the script to delete all data in HDD. When finsihed power down with `sudo shutdown now`. Then make a fresh SD card from image and this time try another option to get the blockchain. If you run into trouble the second time, please report an issue on GitHub. diff --git a/README.md b/README.md index 5efad32..577d616 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ This is the default way to download the blockchain data for the RaspiBlitz. If y ![DOWNLOAD1](pictures/download-torrent.png) -*This can take a while - normally it should be done if you keep it running over night, but some users reported that it took up to 3 days. If it takes longer than that or you cannot see any progress (downloading starting) for over an hour after you started thsi option consider to cancel the download and choose the FTP download option.* +*This can take a while - normally it should be done if you keep it running over night, but some users reported that it took up to 3 days. If it takes longer than that or you cannot see any progress (downloading starting) for over an hour after you started this option consider to cancel the download and go with the COPY option or retry fresh.* It is safe to close the terminal window (shutdown your laptop) while the RaspiBlitz is doing the torrent download. To check on progress and to continue the setup you need to ssh back in again. @@ -197,17 +197,8 @@ You can cancel the torrent download by keeping the key `x` pressed. Then the dow * [How can I avoid using a prepared blockchain and validate myself?](FAQ.md#how-can-i-avoid-using-a-prepared-blockchain-and-validate-myself) * [Why is taking my torrent download of the blockchain so long?]() -#### 2. FTP-Download -You should try the FTP download if the torrent option is not working for you. Please be aware that the files are hosted on a central server by us and up-time and bandwidth is not guaranteed. If you start it, you should see the following screen: - -![DOWNLOAD1](pictures/download-ftp.png) - -It is safe to close the terminal window (shutdown your laptop) while the RaspiBlitz is doing the FTP download. To check on progress and to continue the setup you need to ssh back in again. - -You can cancel the FTP download by keeping the key `x` pressed. Then the download will stop and you will be asked if you want to keep the progress so far. This makes sense if you need to shutdown the RaspiBlitz and you want to continue later or when you want to try another download option but want to keep the option to continue on FTP download if the other option is slower or not working. - -#### 4. Copying from another Computer +#### 2. Copying from another Computer If you have another computer available (laptop, desktop or another raspiblitz) that already runs a working blockchain (with txindex=1) you can use this option to copy it over to the RaspiBlitz. This will be done over the local network by SCP (SSH file transfere). Choose this option and follow the given instructions. @@ -215,11 +206,11 @@ This is also the best option if you dont like to run your RaspiBlitz with a prep More details: [I have the full blockchain on another computer. How do I copy it to the RaspiBlitz?](FAQ.md#i-have-the-full-blockchain-on-another-computer-how-do-i-copy-it-to-the-raspiblitz) -#### 5. Cloning from a 2nd HDD +#### 3. Cloning from a 2nd HDD If is a backup way to transfere a blockchain from another computer if copying over the network is not working. More details on the setup can be found [here](FAQ.md#how-do-i-clone-the-blockchain-from-a-2nd-hdd). -#### 6. Sync from Bitcoin-Network +#### 4. Sync from Bitcoin-Network This is the fallback of last resort. A RaspberryPi has a very low power CPU and syncing+validating the blockchain directly with the peer2peer network can take multiple weeks - thats why the other options above where invented. diff --git a/home.admin/10setupBlitz.sh b/home.admin/10setupBlitz.sh index 6eb5ad1..d17206f 100755 --- a/home.admin/10setupBlitz.sh +++ b/home.admin/10setupBlitz.sh @@ -188,7 +188,6 @@ if [ ${mountOK} -eq 1 ]; then menuitem=$(dialog --clear --beep --backtitle "RaspiBlitz" --title "Getting the Blockchain" \ --menu "You need a copy of the Bitcoin Blockchain - you have 5 options:" 13 75 5 \ T "TORRENT --> MAINNET + TESTNET thru Torrent (DEFAULT)" \ - D "DOWNLOAD --> MAINNET + TESTNET per FTP (FALLBACK)" \ C "COPY --> BLOCKCHAINDATA from another node with SCP" \ N "CLONE --> BLOCKCHAINDATA from 2nd HDD (extra cable)"\ S "SYNC --> MAINNET thru Bitcoin Network (ULTRA SLOW)" 2>&1 >/dev/tty) @@ -199,7 +198,6 @@ if [ ${mountOK} -eq 1 ]; then menuitem=$(dialog --clear --beep --backtitle "RaspiBlitz" --title "Getting the Blockchain" \ --menu "You need a copy of the Litecoin Blockchain - you have 3 options:" 13 75 4 \ T "TORRENT --> MAINNET thru Torrent (DEFAULT)" \ - D "DOWNLOAD --> MAINNET per FTP (FALLBACK)" \ S "SYNC --> MAINNET thru Litecoin Network (FALLBACK+SLOW)" 2>&1 >/dev/tty) # error @@ -225,9 +223,6 @@ if [ ${mountOK} -eq 1 ]; then S) /home/admin/50syncHDD.sh ;; - D) - /home/admin/50downloadHDD.sh - ;; esac exit 1 diff --git a/home.admin/50torrentHDD.sh b/home.admin/50torrentHDD.sh index bc44b5b..9e8d731 100755 --- a/home.admin/50torrentHDD.sh +++ b/home.admin/50torrentHDD.sh @@ -245,7 +245,7 @@ if [ ${torrentError} -gt 0 ]; then # User Cancel --> Torrent incomplete sleep 3 echo -ne '\007' - dialog --title " WARNING (${torrentError})" --yesno "The Torrent download failed or is not complete - maybe try FTP download next time. Do you want keep already downloaded torrent data?" 8 57 + dialog --title " WARNING (${torrentError})" --yesno "The Torrent download failed or is not complete - maybe try COPY option. Do you want keep already downloaded torrent data?" 8 57 response=$? case $response in 1) sudo rm -rf ${targetDir}; sudo rm -rf ${sessionDir} ;; From 14ebd783a97c27111d26539d5d15e190a3339100 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 13:23:12 +0100 Subject: [PATCH 17/88] #358 torrent info --- FAQ.md | 4 ++++ README.md | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index 1719f78..b6043b1 100644 --- a/FAQ.md +++ b/FAQ.md @@ -343,6 +343,10 @@ The downloaded blockchain is pre-indexed and pre-validated. That should be pract If you dont trust the download or you want to run the RaspiBlitz in a more production like setup (on your own risk) then don't use the torrent/ftp download and choose the option to COPY the blockchain data from a more powerful computer (laptop or desktop) where you synced, verified and indexed the blockchain all by your yourself - see [README](README.md#4-copying-from-another-computer) for more details. +# Why is taking my torrent download of the blockchain so long? + +Other users reported that opening up and forwarding the following port from their router to the RaspiBlitz helped speed up and getting started the torrent download: 6881-6889, 6969, 1337 + ## What is the "Base Torrent File"? Inspired by the website getbitcoinblockchain.com we use one of their base torrent files to have a basic set of blocks - that will not change for the future. This torrent contains most of the data (the big file) and we dont need to change the torrent for a long time. This way the torrent can get establish a wide spread seeding and the torrent network can take the heavy load. diff --git a/README.md b/README.md index 577d616..d0bcaed 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,6 @@ It is safe to close the terminal window (shutdown your laptop) while the RaspiBl You can cancel the torrent download by keeping the key `x` pressed. Then the download will stop and you will be asked if you want to keep the progress so far. This makes sense if you need to shutdown the RaspiBlitz and you want to continue later or when you want to try another download option but want to keep the option to continue on torrent if the other option is slower or not working. * [How can I avoid using a prepared blockchain and validate myself?](FAQ.md#how-can-i-avoid-using-a-prepared-blockchain-and-validate-myself) -* [Why is taking my torrent download of the blockchain so long?]() #### 2. Copying from another Computer From 17ee2be2c9623772c8dec98d729aa438fcb47de7 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 13:24:32 +0100 Subject: [PATCH 18/88] #358 README torrent update --- FAQ.md | 2 +- README.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index b6043b1..2d3fead 100644 --- a/FAQ.md +++ b/FAQ.md @@ -343,7 +343,7 @@ The downloaded blockchain is pre-indexed and pre-validated. That should be pract If you dont trust the download or you want to run the RaspiBlitz in a more production like setup (on your own risk) then don't use the torrent/ftp download and choose the option to COPY the blockchain data from a more powerful computer (laptop or desktop) where you synced, verified and indexed the blockchain all by your yourself - see [README](README.md#4-copying-from-another-computer) for more details. -# Why is taking my torrent download of the blockchain so long? +## Why is taking my torrent download of the blockchain so long? Other users reported that opening up and forwarding the following port from their router to the RaspiBlitz helped speed up and getting started the torrent download: 6881-6889, 6969, 1337 diff --git a/README.md b/README.md index d0bcaed..51d7c1b 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,7 @@ It is safe to close the terminal window (shutdown your laptop) while the RaspiBl You can cancel the torrent download by keeping the key `x` pressed. Then the download will stop and you will be asked if you want to keep the progress so far. This makes sense if you need to shutdown the RaspiBlitz and you want to continue later or when you want to try another download option but want to keep the option to continue on torrent if the other option is slower or not working. * [How can I avoid using a prepared blockchain and validate myself?](FAQ.md#how-can-i-avoid-using-a-prepared-blockchain-and-validate-myself) +* [Why is taking my torrent download of the blockchain so long?](FAQ.md#why-is-taking-my-torrent-download-of-the-blockchain-so-long) #### 2. Copying from another Computer From 7d08df57567f43435b61c0885378d9cc4c8290ba Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 13:54:45 +0100 Subject: [PATCH 19/88] #371 sanity check on publicIP data --- home.admin/_background.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/home.admin/_background.sh b/home.admin/_background.sh index 21d2153..1dfd347 100644 --- a/home.admin/_background.sh +++ b/home.admin/_background.sh @@ -80,6 +80,18 @@ do echo "freshPublicIP(${freshPublicIP})" echo "publicIP(${publicIP})" + # sanity check on IP data + # see https://github.com/rootzoll/raspiblitz/issues/371#issuecomment-472416349 + echo "-> sanity check of IP data: ${freshPublicIP}" + if [[ $freshPublicIP =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then + echo "OK IPv4" + elif [[ $freshPublicIP =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then + echo "OK IPv6" + else + echo "FAIL - not an IPv4 or IPv6 address" + freshPublicIP="" + fi + if [ ${#freshPublicIP} -eq 0 ]; then echo "freshPublicIP is ZERO - ignoring" From 1b908303b574c85d784099044976d2b0512e1a72 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 14:05:37 +0100 Subject: [PATCH 20/88] test ip sanaity check --- home.admin/_background.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/_background.sh b/home.admin/_background.sh index 1dfd347..2566856 100644 --- a/home.admin/_background.sh +++ b/home.admin/_background.sh @@ -67,7 +67,7 @@ do # every 15min - not too often # because its a ping to external service - recheckPublicIP=$((($counter % 900)+1)) + recheckPublicIP=$((($counter % 9)+1)) updateDynDomain=0 if [ ${recheckPublicIP} -eq 1 ]; then echo "*** RECHECK PUBLIC IP ***" From f80e32b95d5999185f4bcbf3da0cbe0a8b355ac2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 14:08:20 +0100 Subject: [PATCH 21/88] test IP sanity check --- home.admin/_background.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/home.admin/_background.sh b/home.admin/_background.sh index 2566856..5e9d8d2 100644 --- a/home.admin/_background.sh +++ b/home.admin/_background.sh @@ -83,10 +83,10 @@ do # sanity check on IP data # see https://github.com/rootzoll/raspiblitz/issues/371#issuecomment-472416349 echo "-> sanity check of IP data: ${freshPublicIP}" - if [[ $freshPublicIP =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then - echo "OK IPv4" - elif [[ $freshPublicIP =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then + if [[ $freshPublicIP =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then echo "OK IPv6" + elif [[ $freshPublicIP =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then + echo "OK IPv4" else echo "FAIL - not an IPv4 or IPv6 address" freshPublicIP="" From e9efa4bd65fddedce4d17c79b46216f68f4dcbcc Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 14 Mar 2019 14:19:00 +0100 Subject: [PATCH 22/88] #371 sanaity check on public ip data --- home.admin/40addHDD.sh | 13 +++++++++++++ home.admin/_background.sh | 2 +- home.admin/_bootstrap.sh | 13 +++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/home.admin/40addHDD.sh b/home.admin/40addHDD.sh index 7db2ed0..864e92a 100755 --- a/home.admin/40addHDD.sh +++ b/home.admin/40addHDD.sh @@ -69,6 +69,19 @@ if [ ${existsHDD} -gt 0 ]; then # try to determine publicIP and if not possible use localIP as placeholder # https://github.com/rootzoll/raspiblitz/issues/312#issuecomment-462675101 freshPublicIP=$(curl -s http://v4.ipv6-test.com/api/myip.php) + + # sanity check on IP data + # see https://github.com/rootzoll/raspiblitz/issues/371#issuecomment-472416349 + echo "-> sanity check of IP data: ${freshPublicIP}" + if [[ $freshPublicIP =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then + echo "OK IPv6" + elif [[ $freshPublicIP =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then + echo "OK IPv4" + else + echo "FAIL - not an IPv4 or IPv6 address" + freshPublicIP="" + fi + if [ ${#freshPublicIP} -eq 0 ]; then localIP=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') echo "WARNING: No publicIP information at all yet - working with placeholder : ${localIP}" diff --git a/home.admin/_background.sh b/home.admin/_background.sh index 5e9d8d2..f9310a1 100644 --- a/home.admin/_background.sh +++ b/home.admin/_background.sh @@ -67,7 +67,7 @@ do # every 15min - not too often # because its a ping to external service - recheckPublicIP=$((($counter % 9)+1)) + recheckPublicIP=$((($counter % 900)+1)) updateDynDomain=0 if [ ${recheckPublicIP} -eq 1 ]; then echo "*** RECHECK PUBLIC IP ***" diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index d89f857..456b5eb 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -310,6 +310,19 @@ if [ ${configExists} -eq 1 ]; then # wait otherwise looking for publicIP fails sleep 5 freshPublicIP=$(curl -s http://v4.ipv6-test.com/api/myip.php) + + # sanity check on IP data + # see https://github.com/rootzoll/raspiblitz/issues/371#issuecomment-472416349 + echo "-> sanity check of IP data: ${freshPublicIP}" + if [[ $freshPublicIP =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then + echo "OK IPv6" + elif [[ $freshPublicIP =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then + echo "OK IPv4" + else + echo "FAIL - not an IPv4 or IPv6 address" + freshPublicIP="" + fi + if [ ${#freshPublicIP} -eq 0 ]; then # prevent having no publicIP set at all and LND getting stuck # https://github.com/rootzoll/raspiblitz/issues/312#issuecomment-462675101 From 17b9fe2dc69964dc19c2106099f7bae9de4e0549 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 14:43:35 +0100 Subject: [PATCH 23/88] #324 backup tls instead of delete --- home.admin/config.scripts/lnd.newtlscert.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/lnd.newtlscert.sh b/home.admin/config.scripts/lnd.newtlscert.sh index 112415f..2b4b2ae 100644 --- a/home.admin/config.scripts/lnd.newtlscert.sh +++ b/home.admin/config.scripts/lnd.newtlscert.sh @@ -5,8 +5,10 @@ echo "making sure services are not running" sudo systemctl stop lnd 2>/dev/null -echo "deleting TLSCert" -sudo rm /mnt/hdd/lnd/tls.* 2>/dev/null +echo "keep old tls data as backup" +sudo mv /mnt/hdd/lnd/tls.cert /mnt/hdd/lnd/tls.cert.old +sudo mv /mnt/hdd/lnd/tls.key /mnt/hdd/lnd/tls.key.old + echo "let lnd generate new TLSCert" sudo -u bitcoin /usr/local/bin/lnd &>/dev/null & echo "wait until generated" From 1db3f008eff7c92077c7b76449997822f79e5073 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 15:03:59 +0100 Subject: [PATCH 24/88] #424 just error logging on sd card --- home.admin/assets/RTL.service | 2 ++ home.admin/assets/bitcoind.service | 2 ++ home.admin/assets/bootstrap.service | 1 + home.admin/assets/lnd.service | 2 ++ 4 files changed, 7 insertions(+) diff --git a/home.admin/assets/RTL.service b/home.admin/assets/RTL.service index 2264870..32c72f3 100644 --- a/home.admin/assets/RTL.service +++ b/home.admin/assets/RTL.service @@ -12,6 +12,8 @@ User=root Restart=always TimeoutSec=120 RestartSec=30 +StandardOutput=null +StandardError=journal [Install] WantedBy=multi-user.target \ No newline at end of file diff --git a/home.admin/assets/bitcoind.service b/home.admin/assets/bitcoind.service index 5503649..6bbb743 100644 --- a/home.admin/assets/bitcoind.service +++ b/home.admin/assets/bitcoind.service @@ -18,6 +18,8 @@ KillMode=process Restart=always TimeoutSec=120 RestartSec=30 +StandardOutput=null +StandardError=journal [Install] WantedBy=multi-user.target \ No newline at end of file diff --git a/home.admin/assets/bootstrap.service b/home.admin/assets/bootstrap.service index 11244a5..f07a41b 100644 --- a/home.admin/assets/bootstrap.service +++ b/home.admin/assets/bootstrap.service @@ -12,6 +12,7 @@ Type=oneshot RemainAfterExit=true ExecStart=/home/admin/_bootstrap.sh StandardOutput=journal +StandardError=journal [Install] WantedBy=multi-user.target \ No newline at end of file diff --git a/home.admin/assets/lnd.service b/home.admin/assets/lnd.service index d500893..6af4d7a 100644 --- a/home.admin/assets/lnd.service +++ b/home.admin/assets/lnd.service @@ -20,6 +20,8 @@ KillMode=process TimeoutSec=180 Restart=always RestartSec=60 +StandardOutput=null +StandardError=journal [Install] WantedBy=multi-user.target \ No newline at end of file From 602be668ac12efe5e12c0339ca79cd56be3b0102 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 15:07:47 +0100 Subject: [PATCH 25/88] use log files directly --- home.admin/XXdebugLogs.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/home.admin/XXdebugLogs.sh b/home.admin/XXdebugLogs.sh index c494ac2..732e3f0 100644 --- a/home.admin/XXdebugLogs.sh +++ b/home.admin/XXdebugLogs.sh @@ -45,6 +45,7 @@ pathAdd="" if [ "${chain}" = "test" ]; then pathAdd="/testnet3" fi +sudo journalctl -u ${network}d -b --no-pager -n5 sudo tail -n 20 /mnt/hdd/${network}${pathAdd}/debug.log echo "" @@ -53,7 +54,8 @@ sudo systemctl status lnd -n2 --no-pager echo "" echo "*** LAST 20 LND LOGS ***" -sudo journalctl -u lnd -b --no-pager -n20 +sudo journalctl -u lnd -b --no-pager -n5 +sudo tail -n 20 /mnt/hdd/lnd/logs/${network}/${chain}net/lnd.log echo "" if [ "${rtlWebinterface}" = "on" ]; then From c9cfeaa7d6bb7b8eda359893003a19a762a01036 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 15:10:23 +0100 Subject: [PATCH 26/88] error and info logs --- home.admin/XXdebugLogs.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/home.admin/XXdebugLogs.sh b/home.admin/XXdebugLogs.sh index 732e3f0..d35ba7e 100644 --- a/home.admin/XXdebugLogs.sh +++ b/home.admin/XXdebugLogs.sh @@ -40,12 +40,13 @@ echo "*** CHAINNETWORK SYSTEMD STATUS ***" sudo systemctl status ${network}d -n2 --no-pager echo "" -echo "*** LAST 20 CHAINNETWORK LOGS ***" +echo "*** LAST 5 ERROR LOGS ***" +sudo journalctl -u ${network}d -b --no-pager -n5 +echo "*** LAST 20 INFO LOGS ***" pathAdd="" if [ "${chain}" = "test" ]; then pathAdd="/testnet3" fi -sudo journalctl -u ${network}d -b --no-pager -n5 sudo tail -n 20 /mnt/hdd/${network}${pathAdd}/debug.log echo "" @@ -53,8 +54,9 @@ echo "*** LND SYSTEMD STATUS ***" sudo systemctl status lnd -n2 --no-pager echo "" -echo "*** LAST 20 LND LOGS ***" +echo "*** LAST 5 LND ERROR LOGS ***" sudo journalctl -u lnd -b --no-pager -n5 +echo "*** LAST 20 LND INFO LOGS ***" sudo tail -n 20 /mnt/hdd/lnd/logs/${network}/${chain}net/lnd.log echo "" From 88a26f881c5d00c3af34b134a6f02ca9d5e93b32 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 15:11:28 +0100 Subject: [PATCH 27/88] formatting logs --- home.admin/XXdebugLogs.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/home.admin/XXdebugLogs.sh b/home.admin/XXdebugLogs.sh index d35ba7e..31057c1 100644 --- a/home.admin/XXdebugLogs.sh +++ b/home.admin/XXdebugLogs.sh @@ -42,6 +42,7 @@ echo "" echo "*** LAST 5 ERROR LOGS ***" sudo journalctl -u ${network}d -b --no-pager -n5 +echo "" echo "*** LAST 20 INFO LOGS ***" pathAdd="" if [ "${chain}" = "test" ]; then @@ -56,6 +57,7 @@ echo "" echo "*** LAST 5 LND ERROR LOGS ***" sudo journalctl -u lnd -b --no-pager -n5 +echo "" echo "*** LAST 20 LND INFO LOGS ***" sudo tail -n 20 /mnt/hdd/lnd/logs/${network}/${chain}net/lnd.log echo "" From 215deda60d6e1e5bb450bf8b157af742ada69f12 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 15:43:16 +0100 Subject: [PATCH 28/88] #428 count under-voltage reports --- home.admin/00infoBlitz.sh | 6 +++--- home.admin/_background.sh | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index da69057..66da094 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -289,7 +289,7 @@ ${color_yellow}${ln_publicColor}${ln_external} "-------------------------------------------" \ "load average:${load##up*, }" "${temp}" \ "${hdd}" "${sync_percentage}" -if [ "${runBehindTor}" != "on" ]; then - # one extra space line at the end if nodeaddress is not TOR - echo "" + +if [ ${#undervoltageReports} -gt 0 ]; then + echo "${countReports} undervoltage reports found in syslog" fi diff --git a/home.admin/_background.sh b/home.admin/_background.sh index f9310a1..35204b5 100644 --- a/home.admin/_background.sh +++ b/home.admin/_background.sh @@ -60,6 +60,25 @@ do fi + #################################################### + # CHECK FOR UNDERVOLTAGE REPORTS + # every 1 hour scan for undervoltage reports + #################################################### + recheckUndervoltage=$(($counter % 3600)) + if [ ${recheckUndervoltage} -eq 1 ]; then + echo "*** RECHECK UNDERVOLTAGE ***" + countReports=$(sudo cat /var/log/syslog | grep -c "Under-voltage detected!") + echo "${countReports} undervoltage reports found in syslog" + if [ ${#undervoltageReports} -eq 0 ]; then + # write new value to info file + undervoltageReports="${countReports}" + echo "undervoltageReports=${undervoltageReports}" >> ${infoFile} + else + # update value in info file + sed -i "s/^undervoltageReports=.*/undervoltageReports=${countReports}/g" ${infoFile} + fi + fi + #################################################### # RECHECK PUBLIC IP # when public IP changes, restart LND with new IP From e37e01ec056c0778d659bb29b1755f8154713c77 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 15:54:47 +0100 Subject: [PATCH 29/88] undervoltage warnings --- home.admin/00infoBlitz.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index 66da094..6073a20 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -290,6 +290,6 @@ ${color_yellow}${ln_publicColor}${ln_external} "load average:${load##up*, }" "${temp}" \ "${hdd}" "${sync_percentage}" -if [ ${#undervoltageReports} -gt 0 ]; then - echo "${countReports} undervoltage reports found in syslog" +if [ ${#undervoltageReports} -gt 0 ] && [ "${undervoltageReports}" != "0" ]; then + echo "${undervoltageReports} undervoltage reports found in syslog" fi From 3e8c6bb615aa7867fabb0cc750da651f54b8831e Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 17:56:06 +0100 Subject: [PATCH 30/88] #397 rsync for MacOS and Linux --- home.admin/50copyHDD.sh | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 302003f..9828312 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -19,6 +19,21 @@ if [ "${setupStep}" = "100" ]; then sudo cp -f /mnt/hdd/bitcoin/bitcoin.conf /home/admin/assets/bitcoin.conf fi +# Basic Options +OPTIONS=(UNIX "MacOS or Linux" \ + WINDOWS "Windows" \ + BLITZ "RaspiBlitz" \ + ) + +CHOICE=$(dialog --clear --title "Which System is running on the other computer?" --menu "" 11 40 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) + +clear +case $CHOICE in + CLOSE) + exit 1; + ;; +esac + # delete all IN bitcoin directory but not itself if it exists # so that possibel link to /home/bitcoin/.bitcoin nicht beschädigt wird sudo rm -rfv /mnt/hdd/bitcoin/* 2>/dev/null @@ -26,7 +41,7 @@ sudo rm -rfv /mnt/hdd/bitcoin/* 2>/dev/null # make sure /mnt/hdd/bitcoin exists sudo mkdir /mnt/hdd/bitcoin 2>/dev/null -# allow all users write to it () +# allow all users write to it sudo chmod 777 /mnt/hdd/bitcoin clear @@ -45,7 +60,11 @@ echo "blockchain data. You should see directories 'blocks', 'chainstate' & 'inde echo "Make sure the bitcoin client on that computer is stopped." echo "" echo "COPY, PASTE & EXECUTE the following command on the blockchain source computer:" -echo "sudo scp -r ./chainstate ./indexes ./testnet3 ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" +if [ "${CHOICE}" = "WINDOWS" ]; then + echo "sudo scp -r ./chainstate ./indexes ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" +else + echo "sudo rsync -avhW --progress ./chainstate ./indexes ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" +fi echo "" echo "This command may ask you first about the admin password of the other computer (because sudo)." echo "Then it will ask for your SSH PASSWORD A from this RaspiBlitz." From 0450d40db47cd18d0da40e42c9844b0d9bf72db1 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 18:12:22 +0100 Subject: [PATCH 31/88] dialog fixes --- home.admin/50copyHDD.sh | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 9828312..9a17c64 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -6,11 +6,31 @@ source /home/admin/raspiblitz.info # get local ip localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') +# Basic Options +OPTIONS=(UNIX "MacOS or Linux" \ + WINDOWS "Windows" + ) + +CHOICE=$(dialog --clear --title "Which System is running on the other computer?" --menu "" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) + +clear +case $CHOICE in + UNIX) echo "Linus";; + WINDOWS) echo "Bill";; + *) exit 1;; +esac + +if [ -d "/mnt/hdd/bitcoin" ]; then + dialog --title "Prepare Copy" --yesno "Do you want to delete the old/local blockchain data now?" 8 60 + response=$? + echo "response(${response})" + case $response in + 1) exit 1 ;; + esac +fi + # additional prep if this is used to replace corrupted blockchain if [ "${setupStep}" = "100" ]; then - # warn user - echo "!! Press ENTER to delete the old blockchain .. CTRL+C to CANCEL" - read key # make sure services are not running echo "stopping servcies ..." sudo systemctl stop lnd @@ -19,21 +39,6 @@ if [ "${setupStep}" = "100" ]; then sudo cp -f /mnt/hdd/bitcoin/bitcoin.conf /home/admin/assets/bitcoin.conf fi -# Basic Options -OPTIONS=(UNIX "MacOS or Linux" \ - WINDOWS "Windows" \ - BLITZ "RaspiBlitz" \ - ) - -CHOICE=$(dialog --clear --title "Which System is running on the other computer?" --menu "" 11 40 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) - -clear -case $CHOICE in - CLOSE) - exit 1; - ;; -esac - # delete all IN bitcoin directory but not itself if it exists # so that possibel link to /home/bitcoin/.bitcoin nicht beschädigt wird sudo rm -rfv /mnt/hdd/bitcoin/* 2>/dev/null From 090ac43b22e349337565b44d2dc5b92f6d9a2363 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 18:20:16 +0100 Subject: [PATCH 32/88] #397 rsync total progress --- home.admin/50copyHDD.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 9a17c64..3a85207 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -68,8 +68,8 @@ echo "COPY, PASTE & EXECUTE the following command on the blockchain source compu if [ "${CHOICE}" = "WINDOWS" ]; then echo "sudo scp -r ./chainstate ./indexes ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" else - echo "sudo rsync -avhW --progress ./chainstate ./indexes ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" -fi + echo "sudo rsync -avhW --info=progress2 ./chainstate ./indexes ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" +fi echo "" echo "This command may ask you first about the admin password of the other computer (because sudo)." echo "Then it will ask for your SSH PASSWORD A from this RaspiBlitz." From 39704568d819e6eb4891af3bad62a54b6b3edb1f Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 15 Mar 2019 18:34:59 +0100 Subject: [PATCH 33/88] #424 update sd card to endurance version --- shoppinglist_au.md | 2 +- shoppinglist_ca.md | 2 +- shoppinglist_cz.md | 4 ++-- shoppinglist_de.md | 2 +- shoppinglist_es.md | 2 +- shoppinglist_fr.md | 2 +- shoppinglist_uk.md | 2 +- shoppinglist_usa.md | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/shoppinglist_au.md b/shoppinglist_au.md index 788b742..9030c12 100644 --- a/shoppinglist_au.md +++ b/shoppinglist_au.md @@ -2,7 +2,7 @@ ## Shopping List: Amazon Australia * RaspBerry Pi 3: https://www.amazon.com/RS-Components-Raspberry-Pi-Motherboard/dp/B07BFH96M3 -* Micro SD-Card 16GB: https://www.amazon.com/SanDisk-Mobile-MicroSDHC-SDSDQM-B35A-Adapter/dp/B004ZIENBA +* Micro SD-Card 32GB: https://www.amazon.com/Samsung-Endurance-32GB-Micro-Adapter/dp/B07B98GXQT * Power: https://www.amazon.com.au/Ils-Supply-Adapter-Charger-Raspberry/dp/B07F2JLSCL/ * 1TB Hard Drive: https://www.amazon.com/Toshiba-Advance-Portable-External-HDTC910XR3AA/dp/B079H7VYY6 * Case: https://www.amazon.com/Raspberry-Model-Protective-Heatsinks-Clear/dp/B01CDVSBPO diff --git a/shoppinglist_ca.md b/shoppinglist_ca.md index 2d8594c..06272b9 100644 --- a/shoppinglist_ca.md +++ b/shoppinglist_ca.md @@ -1,7 +1,7 @@ ## Shopping List: Amazon Canada * RaspBerry Pi 3: https://amzn.to/2NDLD31 -* Micro SD-Card 16GB: https://amzn.to/2NEXWMa +* Micro SD-Card 32GB: https://www.amazon.ca/Samsung-Endurance-Micro-Adapter-MB-MJ32GA/dp/B07DTFRNRJ * Power: https://amzn.to/2NCdCju * 1TB Hard Drive: https://amzn.to/2NF0lqj * LCD-Display + Case + Pen: https://amzn.to/2GWx3D8 diff --git a/shoppinglist_cz.md b/shoppinglist_cz.md index ac9ea47..2065bb5 100644 --- a/shoppinglist_cz.md +++ b/shoppinglist_cz.md @@ -1,9 +1,9 @@ ## Shopping List: Amazon/Alza/CZC Czech - RaspBerry Pi 3: https://www.alza.cz/raspberry-pi-3-model-b-d5284636.htm?o=1 -- Micro SD-Card 16GB: https://www.alza.cz/EN/kingston-micro-sdhc-16gb-class-10-uhs-i-industrial-temp-sd-adapter?dq=4156874&o=2 +- Micro SD-Card 32GB: https://www.alza.cz/EN/samsung-microsdhc-32gb-pro-endurance-uhs-i-u1-sd-adapter-d5339757.htm - Power: https://www.alza.cz/EN/alzapower-q100-quick-charge-3-0-black-d5324257.htm?o=2 - maybe you need an micro usb cable - 1TB Hard Drive: https://www.czc.cz/toshiba-canvio-basics-1tb-cerna/235949/produkt?gclid=EAIaIQobChMIgpLF5Mac3gIVCM53Ch3D9QWpEAQYAyABEgK-ZfD_BwE - Case: https://www.alza.cz/EN/raspberry-pi-black-d3837597.htm?o=1 -- LCD-Display (delivered to Czech Republic): https://www.amazon.com/dp/B01N3JROH8/ref=cm_sw_r_cp_ep_dp_-gOuBb2Q6T0C5 +- LCD-Display (delivered to Czech Republic): https://www.amazon.com/dp/B01N3JROH8/ref=cm_sw_r_cp_ep_dp_-gOuBb2Q6T0C5 \ No newline at end of file diff --git a/shoppinglist_de.md b/shoppinglist_de.md index 313da81..dc955f3 100644 --- a/shoppinglist_de.md +++ b/shoppinglist_de.md @@ -1,7 +1,7 @@ ## Shopping List: Amazon Germany * RaspBerry Pi 3: https://www.amazon.de/dp/B07BDR5PDW -* Micro SD-Card 16GB: https://www.amazon.de/gp/product/B073K14CVB/ +* Micro SD-Card 32GB: https://www.amazon.de/Samsung-MB-MJ32GA-EU-microSDXC-Endurance * Power >=3A: https://www.amazon.de/gp/product/B01JZE38QE * 1TB Hard Drive: https://www.amazon.de/dp/B07997KKSK?th=1 * Case: https://www.amazon.de/dp/B0173GQF8Y diff --git a/shoppinglist_es.md b/shoppinglist_es.md index 224bd5e..310a569 100644 --- a/shoppinglist_es.md +++ b/shoppinglist_es.md @@ -1,7 +1,7 @@ ## Shopping List: Amazon Spain * RaspBerry Pi 3: https://www.amazon.es/gp/product/B07BDR5PDW/ -* Micro SD-Card 16GB: https://www.amazon.es/gp/product/B073K14CVB/ +* Micro SD-Card 32GB: https://www.amazon.es/Samsung-Pro-Endurance-microSDHC-Adaptador/dp/B07CY3QSST * Power: https://www.amazon.es/gp/product/B01JZE38QE * 1TB Hard Drive: https://www.amazon.es/gp/product/B07997KKSK/ * Case: https://www.amazon.es/gp/product/B07DK4CRHS/ diff --git a/shoppinglist_fr.md b/shoppinglist_fr.md index 8d9182b..e57933c 100644 --- a/shoppinglist_fr.md +++ b/shoppinglist_fr.md @@ -1,7 +1,7 @@ ## Shopping List: Amazon France * RaspBerry Pi 3: https://www.amazon.fr/dp/B07BDR5PDW -* Micro SD-Card 16GB: https://www.amazon.fr/dp/B073K14CVB/ +* Micro SD-Card 32GB: https://www.amazon.fr/SANDISK-Adaptateur-Logiciel-Récupération-RescuePRO/dp/B06XWMQ81P/ * Power: https://www.amazon.fr/dp/B01566WOAG * 1TB Hard Drive: https://www.amazon.fr/dp/B07997KKSK * Case: https://www.amazon.fr/dp/B0173GQF70/ diff --git a/shoppinglist_uk.md b/shoppinglist_uk.md index dc22f14..fd42a4d 100644 --- a/shoppinglist_uk.md +++ b/shoppinglist_uk.md @@ -1,7 +1,7 @@ ## Shopping List: Amazon UK * RaspBerry Pi 3: https://www.amazon.co.uk/Raspberry-Pi-Model-64-Bit-Processor/dp/B07BDR5PDW -* Micro SD-Card 16GB: https://www.amazon.co.uk/Kingston-SDC10G2-16GB-microSDHC-Included/dp/B0162YQEIE +* Micro SD-Card 32GB: https://www.amazon.co.uk/Samsung-Endurance-MicroSDHC-Memory-Adapter/dp/B07CY3QSST * Power: https://www.amazon.co.uk/iTrunk-Raspberry-Model-Supply-Charger/dp/B01MFFSPHE or https://www.amazon.co.uk/dp/B07MLZQXS7 * 1TB Hard Drive: https://www.amazon.co.uk/Toshiba-Canvio-Basics-Portable-External/dp/B00KWHJY7Q * Case: https://www.amazon.co.uk/SB-Components-Transparent-Case-Raspberry/dp/B0173GQF8Y diff --git a/shoppinglist_usa.md b/shoppinglist_usa.md index 623d503..1ed0fa8 100644 --- a/shoppinglist_usa.md +++ b/shoppinglist_usa.md @@ -1,7 +1,7 @@ ## Shopping List: Amazon USA * RaspBerry Pi 3: http://a.co/ahl7RIp -* Micro SD-Card 16GB: http://a.co/d/710f4oJ +* Micro SD-Card 32GB: https://www.amazon.com/Samsung-Endurance-32GB-Micro-Adapter/dp/B07B98GXQT * Power: http://a.co/d/fVVOYZZ * 1TB Hard Drive: http://a.co/eUgVfLd * Case: http://a.co/1774Hwl From 6d603f88a76c1dd4d9b4c7f57a2ef513b3d763d6 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sat, 16 Mar 2019 23:47:22 +0100 Subject: [PATCH 34/88] #427 lnd rescue script --- home.admin/config.scripts/lnd.rescue.sh | 143 ++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100755 home.admin/config.scripts/lnd.rescue.sh diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh new file mode 100755 index 0000000..caf3005 --- /dev/null +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -0,0 +1,143 @@ +#!/bin/bash + +# command info +if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then + echo "small rescue script to to backup or restore" + echo "lnd.rescue.sh [backup|restore]" + exit 1 +fi + +localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') + +mode="$1" +if [ ${mode} = "backup" ]; then + + ################################ + # BACKUP + ################################ + + echo "*** LND.RESCUE --> BACKUP" + + # stop LND + echo "Stopping lnd..." + sudo systemctl stop lnd + sleep 5 + echo "OK" + echo + + # zip it + sudo tar -zcvf /home/admin/lnd-rescue.tar.gz /mnt/hdd/lnd + sudo chown admin:admin /home/admin/lnd-rescue.tar.gz + + # name with md5 checksum + md5checksum=$(md5sum /home/admin/lnd-rescue.tar.gz) + mv /home/admin/lnd-rescue.tar.gz /home/admin/lnd-rescue-${md5checksum}.tar.gz + + # start LND + echo "Starting lnd..." + sudo systemctl start lnd + echo "OK" + echo + + # offer SCP for download + echo "****************************" + echo "* DOWNLOAD THE BACKUP FILE *" + echo "****************************" + echo + echo "RUN THE FOLLOWING COMMAND ON YOUR LAPTOP IN NEW TERMINAL:" + echo "scp -r admin@${localip}:/home/admin/lnd-rescue-*.tar.gz ./" + echo "" + echo "Use password A to authenticate file transfere." + echo + +elif [ ${mode} = "restore" ]; then + + ################################ + # RESTORE + ################################ + + echo "*** LND.RESCUE --> RESTORE" + echo "" + + filename="" + while [ ${#filename} -eq 0 ] + do + countZips=$(sudo ls /home/admin/lnd-rescue-*.tar.gz | grep -c 'lnd-rescue') + if [ ${countZips} -lt 1 ]; then + echo "**************************" + echo "* UPLOAD THE BACKUP FILE *" + echo "**************************" + echo + echo "If you have a lnd-rescue backup file on your laptop you can now" + echo "upload it and restore the your old LND state." + echo + echo "To make upload open a new terminal on your laptop," + echo "change into the directory where your lnd-rescue file is and" + echo "COPY, PASTE AND EXECUTE THE FOLLOWING COMMAND:" + echo "scp -r admin@${localip}:/home/admin/lnd-rescue-*.tar.gz ./" + echo "" + echo "Use password A to authenticate file transfere." + echo + echo "PRESS ENTER when upload is done. Use CTRL-C to abort." + fi + if [ ${countZips} -gt 1 ]; then + echo "!! WARNING !!" + echo "There are multiple lnd-rescue files in directory /home/admin." + echo "Make sure there is only one to workd with and start again." + exit 1 + fi + if [ ${countZips} -eq 1 ]; then + + filename=$(sudo ls /home/admin/lnd-rescue-*.tar.gz) + echo "OK -> found file to restore: ${filename}" + + md5checksum=$(md5sum ${filename} | head -n1 | cut -d " " -f1) + isCorrect=$(echo ${filename} | grep -c ${md5checksum}) + if [ ${isCorrect} -eq 1 ]; then + echo "OK -> checksum looks good: ${md5checksum}" + else + echo "!!! FAIL -> Checksum not correct." + echo "Maybe transfere failed? Continue on your own risk!" + echo "Recommend to abort and upload again!" + fi + + echo + echo "WARNING: This will delete the actual LND state/funds of this RaspiBlitz." + echo + echo "PRESS ENTER to start restore. Use CTRL-C to abort." + fi + read key + done + + # stop LND + echo "Stopping lnd..." + systemctl stop lnd + sleep 5 + echo "OK" + echo + + # clean DIR + echo "Cleaning LND data ..." + sudo rm -r /mnt/hdd/lnd/* + echo "OK" + echo + + # unpack zip + echo "Restoring LND data ..." + sudo tar -xfv ${filename} -C / + echo "OK" + echo + + # start LND + echo "Starting lnd..." + sudo systemctl start lnd + echo "OK" + echo + + echo "DONE - please check if LND starts up correctly with restored state and funds." + echo "Keep in mind that some channels got forced closed by channel partners in the meanwhile." + echo + +else + echo "unknown parameter '${mode}' - exit" +fi \ No newline at end of file From 88ba165d27aa55db5aadd0f8f80ee4ccef0ad297 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:19:31 +0100 Subject: [PATCH 35/88] fix checksum naming --- home.admin/config.scripts/lnd.rescue.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index caf3005..1f9ba4a 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -30,7 +30,7 @@ if [ ${mode} = "backup" ]; then sudo chown admin:admin /home/admin/lnd-rescue.tar.gz # name with md5 checksum - md5checksum=$(md5sum /home/admin/lnd-rescue.tar.gz) + md5checksum=$(md5sum /home/admin/lnd-rescue.tar.gz | head -n1 | cut -d " " -f1) mv /home/admin/lnd-rescue.tar.gz /home/admin/lnd-rescue-${md5checksum}.tar.gz # start LND From cd612ae55584cc8ad761aad6041c1405c20da278 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:24:06 +0100 Subject: [PATCH 36/88] remove error output --- home.admin/config.scripts/lnd.rescue.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index 1f9ba4a..5b625ac 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -62,7 +62,7 @@ elif [ ${mode} = "restore" ]; then filename="" while [ ${#filename} -eq 0 ] do - countZips=$(sudo ls /home/admin/lnd-rescue-*.tar.gz | grep -c 'lnd-rescue') + countZips=$(sudo ls /home/admin/lnd-rescue-*.tar.gz 2>/dev/null | grep -c 'lnd-rescue') if [ ${countZips} -lt 1 ]; then echo "**************************" echo "* UPLOAD THE BACKUP FILE *" @@ -83,7 +83,8 @@ elif [ ${mode} = "restore" ]; then if [ ${countZips} -gt 1 ]; then echo "!! WARNING !!" echo "There are multiple lnd-rescue files in directory /home/admin." - echo "Make sure there is only one to workd with and start again." + echo "Make sure there is only one file to work with and start again." + echo exit 1 fi if [ ${countZips} -eq 1 ]; then From cfd6b5d3597063781f975b00e3aa4ea243111200 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:26:09 +0100 Subject: [PATCH 37/88] scp upload command --- home.admin/config.scripts/lnd.rescue.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index 5b625ac..91ca980 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -74,7 +74,7 @@ elif [ ${mode} = "restore" ]; then echo "To make upload open a new terminal on your laptop," echo "change into the directory where your lnd-rescue file is and" echo "COPY, PASTE AND EXECUTE THE FOLLOWING COMMAND:" - echo "scp -r admin@${localip}:/home/admin/lnd-rescue-*.tar.gz ./" + echo "scp -r ./lnd-rescue-*.tar.gz admin@${localip}:/home/admin/" echo "" echo "Use password A to authenticate file transfere." echo From eb6fc653817d48b5cab9b81404bcec1bcafbedff Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:28:14 +0100 Subject: [PATCH 38/88] added sudo to stop lnd --- home.admin/config.scripts/lnd.rescue.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index 91ca980..a1c0c65 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -89,6 +89,7 @@ elif [ ${mode} = "restore" ]; then fi if [ ${countZips} -eq 1 ]; then + clear filename=$(sudo ls /home/admin/lnd-rescue-*.tar.gz) echo "OK -> found file to restore: ${filename}" @@ -112,7 +113,7 @@ elif [ ${mode} = "restore" ]; then # stop LND echo "Stopping lnd..." - systemctl stop lnd + sudo systemctl stop lnd sleep 5 echo "OK" echo From 75eb88873b2c8bfc8dd8ee742ba49bb32d144eba Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:29:58 +0100 Subject: [PATCH 39/88] restore info --- home.admin/config.scripts/lnd.rescue.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index a1c0c65..4403fd1 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -90,6 +90,12 @@ elif [ ${mode} = "restore" ]; then if [ ${countZips} -eq 1 ]; then clear + echo + echo "**************************" + echo "* RESTORING BACKUP FILE *" + echo "**************************" + echo + filename=$(sudo ls /home/admin/lnd-rescue-*.tar.gz) echo "OK -> found file to restore: ${filename}" From 87c1e1f1f7a7e98ee4f3e4cca2ad5bf02414782c Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:31:20 +0100 Subject: [PATCH 40/88] debug output --- home.admin/config.scripts/lnd.rescue.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index 4403fd1..f2fa165 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -95,7 +95,7 @@ elif [ ${mode} = "restore" ]; then echo "* RESTORING BACKUP FILE *" echo "**************************" echo - + filename=$(sudo ls /home/admin/lnd-rescue-*.tar.gz) echo "OK -> found file to restore: ${filename}" @@ -131,7 +131,7 @@ elif [ ${mode} = "restore" ]; then echo # unpack zip - echo "Restoring LND data ..." + echo "Restoring LND data from ${filename} ..." sudo tar -xfv ${filename} -C / echo "OK" echo From e273923457ab8870dcadc13857bedea4d98e2f11 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:32:03 +0100 Subject: [PATCH 41/88] fix tar restore --- home.admin/config.scripts/lnd.rescue.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index f2fa165..71ae9bb 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -132,7 +132,7 @@ elif [ ${mode} = "restore" ]; then # unpack zip echo "Restoring LND data from ${filename} ..." - sudo tar -xfv ${filename} -C / + sudo tar -xf ${filename} -C / echo "OK" echo From 73a52244d85a5e6315295c3232ac1616a70bc5d2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:34:25 +0100 Subject: [PATCH 42/88] set ownership after lnd data restore --- home.admin/config.scripts/lnd.rescue.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index 71ae9bb..92e51bb 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -133,6 +133,7 @@ elif [ ${mode} = "restore" ]; then # unpack zip echo "Restoring LND data from ${filename} ..." sudo tar -xf ${filename} -C / + sudo chown -R bitcoin:bitcoin /mnt/hdd/lnd echo "OK" echo From 5ab800b5154d8d156d8cf07bd51a8bdb37b8eefa Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 00:56:42 +0100 Subject: [PATCH 43/88] dont restart LND on backup --- FAQ.md | 17 ++++++++++++++++- home.admin/config.scripts/lnd.rescue.sh | 10 ++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/FAQ.md b/FAQ.md index 1babd3b..0cb5247 100644 --- a/FAQ.md +++ b/FAQ.md @@ -119,7 +119,22 @@ But there is one safe way to start: Store your LND wallet seed (list of words yo Recovering the coins that you have in an active channel is a bit more complicated. Because you have to be sure that you really have an up to date backup of your channel state data. The problem is: If you post an old state of your channel, to the network this looks like an atempt to cheat, and your channel partner is allowed claim all the funds in the channel. -To really have a reliable backup, such feature needs to be part of the LND software. Almost every other solution would not be perfect. Thats why RaspiBlitz is not trying to provide a backup feature at the moment. +To really have a reliable backup, such feature needs to be part of the LND software. Almost every other solution would not be perfect. Thats why RaspiBlitz is not trying to provide a backup feature at the moment. But if you feel experimental and you look for a continues backup you may want to check out the following script to integrate into your RaspiBlitz: https://github.com/vindard/lnd-backup/blob/master/do-lndbackup.sh + +How to backup LND data in a rescue situation see next question. + +## How to rescue/move LND data between two RaspiBlitzes? + +In some situations you may just want to rescue/export your LND data (funds and channels) from a RaspiBlitz to then be able to restore it back to a fresh one. For this you can use the following procedure ... + +To rescue/export your Lightning data from a RaspiBlitz: + +* SSH into your RaspiBlitz and EXIT to terminal from the menu. +* then run: `/home/admin/config.scripts/lnd.rescue.sh backup` +* follow the instructions of the script. + +This will create a lnd-rescue file (ends on gz.tar) that contains all the data from the LND. + But you can try to backup at your own risk. All your Lightning Node data is within the `/mnt/hdd/lnd` directory. Just run a backup of that data when the lnd service is stopped -> `sudo systemctl stop lnd` Then on your laptop you go with the terminal into the directory you want to store the backup in and use the following SCP command to download: diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index 92e51bb..f8ff7a4 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -33,12 +33,6 @@ if [ ${mode} = "backup" ]; then md5checksum=$(md5sum /home/admin/lnd-rescue.tar.gz | head -n1 | cut -d " " -f1) mv /home/admin/lnd-rescue.tar.gz /home/admin/lnd-rescue-${md5checksum}.tar.gz - # start LND - echo "Starting lnd..." - sudo systemctl start lnd - echo "OK" - echo - # offer SCP for download echo "****************************" echo "* DOWNLOAD THE BACKUP FILE *" @@ -49,6 +43,10 @@ if [ ${mode} = "backup" ]; then echo "" echo "Use password A to authenticate file transfere." echo + echo "BEWARE: Your Lightning node is now stopped. So its safe to backup the data and restore it" + echo "later on - for example on a fresh RaspiBlitz. But once this Lightning node gets started" + echo "again by 'sudo systemctl start lnd' or a reboot its not adviced to restore the backup file" + echo "anymore bacause it cointains outdated channel data and can lead to loss of channel funds." elif [ ${mode} = "restore" ]; then From 13254b476a9678c6049b76e383db7049972e4ff8 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 01:06:05 +0100 Subject: [PATCH 44/88] Added v1.1 lnd rescue info --- FAQ.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/FAQ.md b/FAQ.md index 0cb5247..e4404b0 100644 --- a/FAQ.md +++ b/FAQ.md @@ -133,20 +133,17 @@ To rescue/export your Lightning data from a RaspiBlitz: * then run: `/home/admin/config.scripts/lnd.rescue.sh backup` * follow the instructions of the script. -This will create a lnd-rescue file (ends on gz.tar) that contains all the data from the LND. +This will create a lnd-rescue file (ends on gz.tar) that contains all the data from the LND. The script offers you a command to transfere the lnd-rescue file to your laptop. If transfere was successfull. You can now setup a fresh RaspiBlitz. Do all the setup until you have a clean new Lightning node running - just without any funding or channels. +Then to restore your old LND data and to recover your funds and channels: -But you can try to backup at your own risk. All your Lightning Node data is within the `/mnt/hdd/lnd` directory. Just run a backup of that data when the lnd service is stopped -> `sudo systemctl stop lnd` Then on your laptop you go with the terminal into the directory you want to store the backup in and use the following SCP command to download: - -`scp -r bitcoin@[LOCAL-IP-OF-RASPIBLITZ]:/mnt/hdd/lnd/ ./` use your password A - -And if you want to put a LND backup state back. Make a fresh RaspiBlitz (new sd card image and a clean HDD), set it up until its ready (you see the status screen on LCD) and then go to terminal, stop lnd service with `sudo systemctl stop lnd` delete the content of the lnd data dir with `sudo rm -rf /mnt/hdd/lnd/*`. Then on your laptop being in terminal in the same directory you did the backup in (the backuped lnd directory is listed there) run the following SCP command: - -`scp -r ./lnd/* bitcoin@[LOCAL-IP-OF-RASPIBLITZ]:/mnt/hdd/lnd/` use password A +* SSH into your new RaspiBlitz and EXIT to terminal from the menu. +* then run: `/home/admin/config.scripts/lnd.rescue.sh restore` +* follow the instructions of the script. -No run a reboot with: `sudo shutdown -r now` ... LND may need some longer rescan after reboot, but then you should see your old channels and balances. +This script will offer you a way to transfere the lnd-rescue file from your laptop to the new RaspiBlitz and will restore the old data. LND gets then restarted for you and after some time it should show you the status screen again with your old funds and channels. -**Be aware that if backup is some hours/days old, channels could have been closed by the other party and it may take some time until you see funds back on-chain. If backup is somewhat older also the channel counter parties may have used your offline time to cheat you with an old state. And if your backup was not the latest state and LND is closing channels it could also been happening that you are posting an old channel state (seen as cheating) and funds of that channel get lost as punishment. So again .. this backup method can be risky, use with caution.** +**Be aware that if backup is some hours old, channels could have been closed by the other party and it may take some time until you see funds back on-chain. If backup is somewhat older then 1 day also the channel counter parties may have used your offline time to cheat you with an old state. And if your backup was not the latest state it could also been happening that you are posting an old channel state (seen as cheating) and funds of that channel get lost as punishment. So again .. this backup method can be risky, use with caution. But its recommended to try in recover and rescue situations - its not for regular backups.** ## What is this mnemonic seed word list? From 4a283a21565694ce4ccc1cd0efd3a7d271d4d220 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 01:21:53 +0100 Subject: [PATCH 45/88] updated failing Blitz info --- FAQ.md | 52 +++++++++++++++++++--------------------------------- 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/FAQ.md b/FAQ.md index e4404b0..aa37e85 100644 --- a/FAQ.md +++ b/FAQ.md @@ -121,11 +121,17 @@ Recovering the coins that you have in an active channel is a bit more complicate To really have a reliable backup, such feature needs to be part of the LND software. Almost every other solution would not be perfect. Thats why RaspiBlitz is not trying to provide a backup feature at the moment. But if you feel experimental and you look for a continues backup you may want to check out the following script to integrate into your RaspiBlitz: https://github.com/vindard/lnd-backup/blob/master/do-lndbackup.sh -How to backup LND data in a rescue situation see next question. +How to backup LND data in a rescue situation see next question "How can I recover my coins from a failing RaspiBlitz?". -## How to rescue/move LND data between two RaspiBlitzes? +## How can I recover my coins from a failing RaspiBlitz? + +On a RaspiBlitz you have coins in your on-chain wallet (bitcoin wallet) and also coins in lightning channels. First we will try to recover all of them and even trying to keep your channels open with "Recover LND data". This that is not possible you can fall back to the second option "Recover from Wallet Seed". + +### 1) Recover LND data + +To recover all your LND data you must still be able to SSH into the RaspiBlitz (minimum v1.1) and the HDD should be still useable/reachable (mounted) - even it shows some errors. If this is not possible anymore you should skip to the second option "Recover from Wallet Seed". -In some situations you may just want to rescue/export your LND data (funds and channels) from a RaspiBlitz to then be able to restore it back to a fresh one. For this you can use the following procedure ... +If you still can SSH in and HDD is readable, we can try to rescue/export your LND data (funds and channels) from a RaspiBlitz to then be able to restore it back to a fresh one. For this you can use the following procedure ... To rescue/export your Lightning data from a RaspiBlitz: @@ -145,31 +151,13 @@ This script will offer you a way to transfere the lnd-rescue file from your lapt **Be aware that if backup is some hours old, channels could have been closed by the other party and it may take some time until you see funds back on-chain. If backup is somewhat older then 1 day also the channel counter parties may have used your offline time to cheat you with an old state. And if your backup was not the latest state it could also been happening that you are posting an old channel state (seen as cheating) and funds of that channel get lost as punishment. So again .. this backup method can be risky, use with caution. But its recommended to try in recover and rescue situations - its not for regular backups.** -## What is this mnemonic seed word list? - -With the 24 word list given you by LND on wallet creation you can recover your private key (BIP 39). You should write it down and store it at a save place. - -For more background on mnemonic seeds see this video: https://www.youtube.com/watch?v=wWCIQFNf_8g - -## How does PASSWORD D effects the word seed? - -On wallet creation you get asked if you want to protect your word seed list with an additional password. If you choose so, RaspiBlitz recommends you to use your PASSWORD D at this point. - -To use a an additional password for your seed words is optional. If you choose so, you will need the password to recover your private key from your your seed words later on. Without this password your private key cannot be recovered from your seed words. So the password adds an additional layer of security, if someone finds your written down word list. - -## How can I recover my coins from a failing RaspiBlitz? - -You might run into a situation where your hardware fails or the software starts to act buggy. So you decide to setup a fresh RaspiBlitz, like in the chapter above "Update to a new SD Card Release" - but the closing channels and cashing out is not working anymore. So whats about the funds you already have on your failing setup? - -There is not a perfect way yet to backup/recover your coins, but you can try the following to make the best out of the situation: - -### 1) Recover from Wallet Seed +### 2) Recover from Wallet Seed Remember those 24 words you were writing down during the setup? Thats your "cipher seed" - now this words are important to recover your wallet. If you dont have them anymore: skip this chapter and read option 2. If you still have the cypher seed: good, but read the following carefully: With the cypher seed you can recover the bitcoin wallet that LND was managing for you - but it does not contain all the details about the channels you have open - its just the key to your funding wallet. If you were able to close all channels or never opened any channels, then everything is OK and you can go on. If you had open channels with funds in there, the following is to consider: -* You now rely on your channel counter parts to force close the channel at one point. If they do, the coins will be available to use in your funding wallet again at one point in the future - after force close delay. +* You now rely on your channel counter parts to force close the channel at one point. If they do, the coins will be available to use in your funding wallet again at one point in the future - after force close delay (but see also [#278](https://github.com/rootzoll/raspiblitz/issues/278) ). * If your channel counter parts never force close the channel (because they are offline too) your channel funds can be frozen forever. So going this way there is a small risk, that you will not recover your funds. But normally if your channel counter parts are still online, see that you will not come back online and they have themselves some funds on their channel side with you: They have an incentive to force close the channel to make use of their funds again. @@ -190,19 +178,17 @@ Then give LND some time to rescan the blockchain. In the end you will have resto *Important: If you see a zero balance for on-chain funds after restoring from seed ... see details discussed [here](https://github.com/rootzoll/raspiblitz/issues/278) - you might try setup fresh this time with bigger look-ahead number.* -### 2) LND Channel State Backup +## What is this mnemonic seed word list? + +With the 24 word list given you by LND on wallet creation you can recover your private key (BIP 39). You should write it down and store it at a save place. -This second option is very very risky and can lead to complete loss of funds. And it olny can work, if you can still access the HDD content of your failing RaspiBlitz. It should only be used if you lost your cypher seed for the option above, forgot your cypher seed encryption password or your old channel counter parts are offline, too. +For more background on mnemonic seeds see this video: https://www.youtube.com/watch?v=wWCIQFNf_8g -What you do is in priciple: -- Make a copy of the HDD directory `/mnt/hdd/lnd` -- Setup a fresh RaspiBlitz -- Stop LND with `sudo systemctl stop lnd` -- Replace the new `/mnt/hdd/lnd` with your backuped version -- Make sure everything in `/mnt/hdd/lnd` is owned by bitcoin:bitcoin -- Reboot the RaspiBlitz +## How does PASSWORD D effects the word seed? -This is highly experimental. And again: If you restore the LND with an backup that is not representing the latest channel state, this will trigger the lightning "penalty" mechanism - allowing your channel counter part to grab all the funds from a channel. Its a measure of last resort. But if its working for you, let us know. +On wallet creation you get asked if you want to protect your word seed list with an additional password. If you choose so, RaspiBlitz recommends you to use your PASSWORD D at this point. + +To use a an additional password for your seed words is optional. If you choose so, you will need the password to recover your private key from your your seed words later on. Without this password your private key cannot be recovered from your seed words. So the password adds an additional layer of security, if someone finds your written down word list. ## How do I change the Name/Alias of my lightning node From e614aada0253bdd6990cb3bbdc0066e186854547 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 03:00:59 +0100 Subject: [PATCH 46/88] #141 more options on repair --- home.admin/00mainMenu.sh | 45 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 5f40455..f8edbfd 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -142,10 +142,49 @@ waitUntilChainNetworkIsReady() # analyse LOGS for possible reindex reindex=$(sudo cat /mnt/hdd/${network}/debug.log | grep -c 'Please restart with -reindex or -reindex-chainstate to recover') if [ ${reindex} -gt 0 ]; then - echo "!! DETECTED NEED FOR RE-INDEX in debug.log ... starting repair script." + echo "!! DETECTED NEED FOR RE-INDEX in debug.log ... starting repair options." sleep 3 - sudo /home/admin/config.scripts/network.reindex.sh - exit + + clear + # Basic Options + OPTIONS=(TORRENT "Redownload Prepared Torrent (DEFAULT)" \ + COPY "Copy Blockchain from another Computer (SKILLED)" \ + REINDEX "Resync thru ${${network}}d (TAKES VERY VERY LONG)" \ + BACKUP "Run Backup LND data first (optional)" \ + ) + + CHOICE=$(dialog --clear --title "Who to repair blockchain?" --menu "" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) + + clear + if [ "${CHOICE}" = "TORRENT" ]; then + echo "Starting TORRENT ..." + /home/admin/50torrentHDD.sh + raspiblitz + exit + + elif [ "${CHOICE}" = "COPY" ]; then + echo "Starting COPY ..." + /home/admin/50copyHDD.sh + raspiblitz + exit + + elif [ "${CHOICE}" = "REINDEX" ]; then + echo "Starting REINDEX ..." + sudo /home/admin/config.scripts/network.reindex.sh + exit + + elif [ "${CHOICE}" = "BACKUP" ]; then + sudo /home/admin/config.scripts/lnd.rescue.sh backup + echo "PRESS ENTER to return to menu." + read key + raspiblitz + exit + + else + echo "CANCEL" + exit + fi + fi # normal info From 4212ee1f5ca71abecb41e6c958e9524d754c479f Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 03:07:46 +0100 Subject: [PATCH 47/88] state info --- home.admin/00mainMenu.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index f8edbfd..d857c86 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -158,12 +158,14 @@ waitUntilChainNetworkIsReady() clear if [ "${CHOICE}" = "TORRENT" ]; then echo "Starting TORRENT ..." + sudo sed -i "s/^state=.*/state=retorrent/g" /home/admin/raspiblitz.info /home/admin/50torrentHDD.sh raspiblitz exit elif [ "${CHOICE}" = "COPY" ]; then echo "Starting COPY ..." + sudo sed -i "s/^state=.*/state=recopy/g" /home/admin/raspiblitz.info /home/admin/50copyHDD.sh raspiblitz exit @@ -185,6 +187,8 @@ waitUntilChainNetworkIsReady() exit fi + else + echo "${network} error: ${clienterror}" fi # normal info From 2041ba1f87787e37103c95464c3c56f0762838dc Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 03:17:53 +0100 Subject: [PATCH 48/88] #141 more info --- home.admin/00mainMenu.sh | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index d857c86..65e1daa 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -145,15 +145,25 @@ waitUntilChainNetworkIsReady() echo "!! DETECTED NEED FOR RE-INDEX in debug.log ... starting repair options." sleep 3 + dialog --backtitle "RaspiBlitz - Repair Script" --msgbox "Your blockchain data needs to be repaired. +This can be due to a power problems or a failing HDD. +Please check the FAQ on Raspi9Blitz Github +'My blockchain data is corrupted - what can I do?' +https://github.com/rootzoll/raspiblitz/blob/master/FAQ.md + +The RaspiBlitz will now try to help you on with the repair. +Maybe use BACKUP option first to secure your funds & channels. +" 13 52 + clear # Basic Options OPTIONS=(TORRENT "Redownload Prepared Torrent (DEFAULT)" \ COPY "Copy Blockchain from another Computer (SKILLED)" \ - REINDEX "Resync thru ${${network}}d (TAKES VERY VERY LONG)" \ - BACKUP "Run Backup LND data first (optional)" \ + REINDEX "Resync thru ${network}d (TAKES VERY VERY LONG)" \ + BACKUP "Run Backup LND data first (optional)" ) - CHOICE=$(dialog --clear --title "Who to repair blockchain?" --menu "" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) + CHOICE=$(dialog --backtitle "RaspiBlitz - Repair Script" --clear --title "Who to repair blockchain?" --menu "test" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) clear if [ "${CHOICE}" = "TORRENT" ]; then From 3a9943fe819c8bdcadb8123b4d1b8eb54cd0ce47 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 03:33:42 +0100 Subject: [PATCH 49/88] updated dialogs --- home.admin/00mainMenu.sh | 12 ++++++------ home.admin/config.scripts/lnd.rescue.sh | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 65e1daa..b4a431c 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -153,31 +153,31 @@ https://github.com/rootzoll/raspiblitz/blob/master/FAQ.md The RaspiBlitz will now try to help you on with the repair. Maybe use BACKUP option first to secure your funds & channels. -" 13 52 +" 13 65 clear # Basic Options OPTIONS=(TORRENT "Redownload Prepared Torrent (DEFAULT)" \ - COPY "Copy Blockchain from another Computer (SKILLED)" \ + COPY "Copy from another Computer (SKILLED)" \ REINDEX "Resync thru ${network}d (TAKES VERY VERY LONG)" \ BACKUP "Run Backup LND data first (optional)" ) - CHOICE=$(dialog --backtitle "RaspiBlitz - Repair Script" --clear --title "Who to repair blockchain?" --menu "test" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) + CHOICE=$(dialog --backtitle "RaspiBlitz - Repair Script" --clear --title "Repair Blockchain Data" --menu "Choose a repair/recovery option:" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) clear if [ "${CHOICE}" = "TORRENT" ]; then echo "Starting TORRENT ..." sudo sed -i "s/^state=.*/state=retorrent/g" /home/admin/raspiblitz.info /home/admin/50torrentHDD.sh - raspiblitz + /home/admin/00mainMenu.sh exit elif [ "${CHOICE}" = "COPY" ]; then echo "Starting COPY ..." sudo sed -i "s/^state=.*/state=recopy/g" /home/admin/raspiblitz.info /home/admin/50copyHDD.sh - raspiblitz + /home/admin/00mainMenu.sh exit elif [ "${CHOICE}" = "REINDEX" ]; then @@ -189,7 +189,7 @@ Maybe use BACKUP option first to secure your funds & channels. sudo /home/admin/config.scripts/lnd.rescue.sh backup echo "PRESS ENTER to return to menu." read key - raspiblitz + /home/admin/00mainMenu.sh exit else diff --git a/home.admin/config.scripts/lnd.rescue.sh b/home.admin/config.scripts/lnd.rescue.sh index f8ff7a4..2adc136 100755 --- a/home.admin/config.scripts/lnd.rescue.sh +++ b/home.admin/config.scripts/lnd.rescue.sh @@ -34,6 +34,7 @@ if [ ${mode} = "backup" ]; then mv /home/admin/lnd-rescue.tar.gz /home/admin/lnd-rescue-${md5checksum}.tar.gz # offer SCP for download + echo echo "****************************" echo "* DOWNLOAD THE BACKUP FILE *" echo "****************************" From f9552344087389656c66c999fad4f1fe893397e7 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 03:41:32 +0100 Subject: [PATCH 50/88] debug delete at the end --- home.admin/00mainMenu.sh | 6 +++--- home.admin/50copyHDD.sh | 1 + home.admin/50torrentHDD.sh | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index b4a431c..3fc1cba 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -146,13 +146,13 @@ waitUntilChainNetworkIsReady() sleep 3 dialog --backtitle "RaspiBlitz - Repair Script" --msgbox "Your blockchain data needs to be repaired. -This can be due to a power problems or a failing HDD. -Please check the FAQ on Raspi9Blitz Github +This can be due to power problems or a failing HDD. +Please check the FAQ on RaspiBlitz Github 'My blockchain data is corrupted - what can I do?' https://github.com/rootzoll/raspiblitz/blob/master/FAQ.md The RaspiBlitz will now try to help you on with the repair. -Maybe use BACKUP option first to secure your funds & channels. +To run a BACKUP of funds & channels first is recommended. " 13 65 clear diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 3a85207..5fbe9c2 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -125,6 +125,7 @@ if [ ${anyDataAtAll} -eq 1 ]; then else echo "OK -> DATA LOOKS GOOD :D" + sudo rm /mnt/hdd/${network}/debug.log fi diff --git a/home.admin/50torrentHDD.sh b/home.admin/50torrentHDD.sh index 9e8d731..c5631ba 100755 --- a/home.admin/50torrentHDD.sh +++ b/home.admin/50torrentHDD.sh @@ -263,9 +263,10 @@ if [ "${setupStep}" = "100" ]; then sudo systemctl disable ${network}d sudo cp -f /mnt/hdd/${network}/${network}.conf /home/admin/assets/${network}.conf sudo rm -rfv /mnt/hdd/${network}/* 2>/dev/null + sudo rm /mnt/hdd/${network}/debug.log fi -# Download worked / just move, copy on USB2 >4h +# Download worked / just move, copy on USB2 would be >4h echo "" echo "*** Moving Files ***" date +%s From b91b148ea88e7a4ffcac4415dc72aa917d0e1eaa Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 03:58:53 +0100 Subject: [PATCH 51/88] detect missing blockchain data --- home.admin/00mainMenu.sh | 15 ++++++++++++++- home.admin/50copyHDD.sh | 6 +++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 3fc1cba..f55b4b3 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -134,14 +134,27 @@ waitUntilChainNetworkIsReady() echo "can take longer if device was off or first time" while : do + + # check for error on network sudo -u bitcoin ${network}-cli -datadir=/home/bitcoin/.${network} getblockchaininfo 1>/dev/null 2>error.tmp clienterror=`cat error.tmp` rm error.tmp + + # check for missing blockchain data + blockchainsize=$(du /mnt/hdd/bitcoin | head -n1 | awk '{print $1;}') + if [ ${#blockchainsize} -gt 0 ]; then + if [ ${blockchainsize} -lt 1000000 ]; then + echo "Mission Bloclchain Data ..." + clienterror="missing blockchain" + sleep 3 + fi + fi + if [ ${#clienterror} -gt 0 ]; then # analyse LOGS for possible reindex reindex=$(sudo cat /mnt/hdd/${network}/debug.log | grep -c 'Please restart with -reindex or -reindex-chainstate to recover') - if [ ${reindex} -gt 0 ]; then + if [ ${reindex} -gt 0 ] || [ "${clienterror}" = "missing blockchain" ]; then echo "!! DETECTED NEED FOR RE-INDEX in debug.log ... starting repair options." sleep 3 diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 5fbe9c2..03308c6 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -41,7 +41,10 @@ fi # delete all IN bitcoin directory but not itself if it exists # so that possibel link to /home/bitcoin/.bitcoin nicht beschädigt wird +# also keep debug logs for repair script +sudo mv /mnt/hdd/bitcoin/debug.log /home/admin/debug.log 2>/dev/null sudo rm -rfv /mnt/hdd/bitcoin/* 2>/dev/null +sudo mv /home/admin/debug.log /mnt/hdd/bitcoin/debug.log 2>/dev/null # make sure /mnt/hdd/bitcoin exists sudo mkdir /mnt/hdd/bitcoin 2>/dev/null @@ -49,6 +52,7 @@ sudo mkdir /mnt/hdd/bitcoin 2>/dev/null # allow all users write to it sudo chmod 777 /mnt/hdd/bitcoin +echo clear echo "************************************************************************************" echo "Instructions to COPY/TRANSFER SYNCED BLOCKCHAIN from another computer" @@ -125,7 +129,7 @@ if [ ${anyDataAtAll} -eq 1 ]; then else echo "OK -> DATA LOOKS GOOD :D" - sudo rm /mnt/hdd/${network}/debug.log + sudo rm /mnt/hdd/bitcoin/debug.log fi From 24f15aa89585065c7d5eda23a2682806691b45dd Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 04:00:44 +0100 Subject: [PATCH 52/88] debug --- home.admin/00mainMenu.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index f55b4b3..34859f9 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -142,6 +142,7 @@ waitUntilChainNetworkIsReady() # check for missing blockchain data blockchainsize=$(du /mnt/hdd/bitcoin | head -n1 | awk '{print $1;}') + echo "blockchainsize(${blockchainsize})" if [ ${#blockchainsize} -gt 0 ]; then if [ ${blockchainsize} -lt 1000000 ]; then echo "Mission Bloclchain Data ..." @@ -149,6 +150,7 @@ waitUntilChainNetworkIsReady() sleep 3 fi fi + sleep 5 if [ ${#clienterror} -gt 0 ]; then From 52d97c8e8ec1d02302ef7927c267158447f57bf3 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 05:02:37 +0100 Subject: [PATCH 53/88] remove debug lines --- home.admin/00mainMenu.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 34859f9..59b79e2 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -141,16 +141,15 @@ waitUntilChainNetworkIsReady() rm error.tmp # check for missing blockchain data - blockchainsize=$(du /mnt/hdd/bitcoin | head -n1 | awk '{print $1;}') + blockchainsize=$(sudo du /mnt/hdd/bitcoin | head -n1 | awk '{print $1;}') echo "blockchainsize(${blockchainsize})" if [ ${#blockchainsize} -gt 0 ]; then if [ ${blockchainsize} -lt 1000000 ]; then - echo "Mission Bloclchain Data ..." + echo "Mission Blockchain Data ..." clienterror="missing blockchain" sleep 3 fi fi - sleep 5 if [ ${#clienterror} -gt 0 ]; then From 3517996fc1382048057de69fcee40d8e81d1feb5 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 16:11:28 +0100 Subject: [PATCH 54/88] #100 custom port in open testing and update --- home.admin/00infoBlitz.sh | 6 +++++- home.admin/_bootstrap.provision.sh | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index 6073a20..f3e08f8 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -215,6 +215,10 @@ ln_channelInfo="\n" ln_external="\n" ln_alias="${hostname}" ln_publicColor="" +ln_port=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep "^listen=*" | cut -f2 -d':') +if [ ${#ln_port} -eq 0 ]; then + ln_port="9735" +fi wallet_unlocked=$(sudo tail -n 1 /mnt/hdd/lnd/logs/${network}/${chain}net/lnd.log 2> /dev/null | grep -c unlock) if [ "$wallet_unlocked" -gt 0 ] ; then @@ -227,7 +231,7 @@ else if [ ${ln_tor} -eq 1 ]; then ln_publicColor="${color_green}" else - public_check=$(nc -z -w6 ${public_ip} 9735 2>/dev/null; echo $?) + public_check=$(nc -z -w6 ${public_ip} ${ln_port} 2>/dev/null; echo $?) if [ $public_check = "0" ]; then # only set yellow/normal because netcat can only say that the port is open - not that it points to this device for sure ln_publicColor="${color_yellow}" diff --git a/home.admin/_bootstrap.provision.sh b/home.admin/_bootstrap.provision.sh index 7eb2c1e..77a344e 100644 --- a/home.admin/_bootstrap.provision.sh +++ b/home.admin/_bootstrap.provision.sh @@ -156,6 +156,20 @@ else echo "Provisioning TOR - keep default" >> ${logFile} fi +# CUSTOM PORT +echo "Provisioning LND Port" >> ${logFile} +lndPort=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep "^listen=*" | cut -f2 -d':') +if [ ${#lndPort} -gt 0 ]; then + if [ "${lndPort}" != "9735" ]; then + echo "User is running custom LND port: ${lndPort}" >> ${logFile} + sudo /home/admin/config.scripts/lnd.setport.sh ${lndPort} >> ${logFile} 2>&1 + else + echo "User is running standard LND port: ${lndPort}" >> ${logFile} + fi +else + echo "Was not able to get LND port from config." >> ${logFile} +fi + sudo sed -i "s/^message=.*/message='Setup Done'/g" ${infoFile} echo "DONE - Give raspi some cool off time after hard building .... 20 secs sleep" >> ${logFile} From 4369c8ec01ef9809af24427131fa1b01da50a698 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 16:29:59 +0100 Subject: [PATCH 55/88] make sure bitcoin is stpooed --- home.admin/00mainMenu.sh | 12 ++++++++++++ home.admin/50torrentHDD.sh | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 59b79e2..0e02fde 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -65,6 +65,15 @@ if [ "${state}" = "reindex" ]; then exit 1 fi +# singal that torrent is in re-download +if [ "${state}" = "retorrent" ]; then + echo "Re-Index in progress ... start monitoring:" + /home/admin/50torrentHDD.sh + sudo sed -i "s/^state=.*/state=repair/g" /home/admin/raspiblitz.info + /home/admin/00mainMenu.sh + exit +fi + # if pre-sync is running - stop it - before continue if [ "${state}" = "presync" ]; then # stopping the pre-sync @@ -157,6 +166,7 @@ waitUntilChainNetworkIsReady() reindex=$(sudo cat /mnt/hdd/${network}/debug.log | grep -c 'Please restart with -reindex or -reindex-chainstate to recover') if [ ${reindex} -gt 0 ] || [ "${clienterror}" = "missing blockchain" ]; then echo "!! DETECTED NEED FOR RE-INDEX in debug.log ... starting repair options." + sudo sed -i "s/^state=.*/state=repair/g" /home/admin/raspiblitz.info sleep 3 dialog --backtitle "RaspiBlitz - Repair Script" --msgbox "Your blockchain data needs to be repaired. @@ -184,6 +194,7 @@ To run a BACKUP of funds & channels first is recommended. echo "Starting TORRENT ..." sudo sed -i "s/^state=.*/state=retorrent/g" /home/admin/raspiblitz.info /home/admin/50torrentHDD.sh + sudo sed -i "s/^state=.*/state=repair/g" /home/admin/raspiblitz.info /home/admin/00mainMenu.sh exit @@ -191,6 +202,7 @@ To run a BACKUP of funds & channels first is recommended. echo "Starting COPY ..." sudo sed -i "s/^state=.*/state=recopy/g" /home/admin/raspiblitz.info /home/admin/50copyHDD.sh + sudo sed -i "s/^state=.*/state=repair/g" /home/admin/raspiblitz.info /home/admin/00mainMenu.sh exit diff --git a/home.admin/50torrentHDD.sh b/home.admin/50torrentHDD.sh index c5631ba..63d7c1e 100755 --- a/home.admin/50torrentHDD.sh +++ b/home.admin/50torrentHDD.sh @@ -7,6 +7,15 @@ echo "" ## get basic info source /home/admin/raspiblitz.info + +# if setup was done - remove old data +if [ "${setupStep}" = "100" ]; then + echo "stopping servcies ..." + sudo systemctl stop lnd + sudo systemctl stop ${network}d + sudo systemctl disable ${network}d +fi + # make sure rtorrent is available sudo apt-get install rtorrent -y echo "" From 0f0dd71c61483e836717428de875e859b1a04347 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 16:36:14 +0100 Subject: [PATCH 56/88] repair in LCD screen --- home.admin/00infoLCD.sh | 11 +++++++++++ home.admin/50copyHDD.sh | 1 - home.admin/50torrentHDD.sh | 1 - 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/home.admin/00infoLCD.sh b/home.admin/00infoLCD.sh index 9b3571d..e0b1d33 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -122,6 +122,17 @@ while : continue fi + # check if recovering/upgrade is running + if [ "${state}" = "repair" ] || [ "${state}" = "retorrent" ] || [ "${state}" = "recopy" ] ; then + l1="Repair Mode\n" + l2="ssh admin@${localip}\n" + l3="Use password: PasswordA\n" + boxwidth=$((${#localip} + 28)) + dialog --backtitle "RaspiBlitz ${codeVersion} (${state}) ${setupStep} ${localip}" --infobox "$l1$l2$l3" 5 ${boxwidth} + sleep 3 + continue + fi + # if freshly recovered if [ "${state}" = "recovered" ]; then l1="FINAL RECOVER LOGIN NEEDED:\n" diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 03308c6..9c2150a 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -35,7 +35,6 @@ if [ "${setupStep}" = "100" ]; then echo "stopping servcies ..." sudo systemctl stop lnd sudo systemctl stop bitcoind - sudo systemctl disable bitcoind sudo cp -f /mnt/hdd/bitcoin/bitcoin.conf /home/admin/assets/bitcoin.conf fi diff --git a/home.admin/50torrentHDD.sh b/home.admin/50torrentHDD.sh index 63d7c1e..6702e39 100755 --- a/home.admin/50torrentHDD.sh +++ b/home.admin/50torrentHDD.sh @@ -13,7 +13,6 @@ if [ "${setupStep}" = "100" ]; then echo "stopping servcies ..." sudo systemctl stop lnd sudo systemctl stop ${network}d - sudo systemctl disable ${network}d fi # make sure rtorrent is available From 57839ea8fdcd8d96b99f8427532812438cd05e94 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 16:39:43 +0100 Subject: [PATCH 57/88] LCD info --- home.admin/00infoLCD.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/00infoLCD.sh b/home.admin/00infoLCD.sh index e0b1d33..c6e0570 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -123,7 +123,7 @@ while : fi # check if recovering/upgrade is running - if [ "${state}" = "repair" ] || [ "${state}" = "retorrent" ] || [ "${state}" = "recopy" ] ; then + if [ "${state}" = "repair" ] || [ "${state}" = "retorrent" ] || [ "${state}" = "recopy" ]; then l1="Repair Mode\n" l2="ssh admin@${localip}\n" l3="Use password: PasswordA\n" From 43882a763b671215d0a7925467d2b4ba95d18388 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 17:05:10 +0100 Subject: [PATCH 58/88] fixed if --- home.admin/00infoLCD.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/00infoLCD.sh b/home.admin/00infoLCD.sh index c6e0570..aa6f2eb 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -123,7 +123,7 @@ while : fi # check if recovering/upgrade is running - if [ "${state}" = "repair" ] || [ "${state}" = "retorrent" ] || [ "${state}" = "recopy" ]; then + if [ $state == 'repair' ] || [ $state == 'retorrent' ] || [ $state == 'recopy' ] ; then l1="Repair Mode\n" l2="ssh admin@${localip}\n" l3="Use password: PasswordA\n" From 8bf4c758f45a35d32654a96ebf1b48af33859cb5 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 17:10:20 +0100 Subject: [PATCH 59/88] fix info script --- home.admin/00infoLCD.sh | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/home.admin/00infoLCD.sh b/home.admin/00infoLCD.sh index aa6f2eb..ade126a 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -122,8 +122,7 @@ while : continue fi - # check if recovering/upgrade is running - if [ $state == 'repair' ] || [ $state == 'retorrent' ] || [ $state == 'recopy' ] ; then + if [ $state == 'repair' ]; then l1="Repair Mode\n" l2="ssh admin@${localip}\n" l3="Use password: PasswordA\n" @@ -133,6 +132,26 @@ while : continue fi + if [ $state == 'retorrent' ]; then + l1="Repair Mode- TORRENT\n" + l2="ssh admin@${localip}\n" + l3="Use password: PasswordA\n" + boxwidth=$((${#localip} + 28)) + dialog --backtitle "RaspiBlitz ${codeVersion} (${state}) ${setupStep} ${localip}" --infobox "$l1$l2$l3" 5 ${boxwidth} + sleep 3 + continue + fi + + if [ $state == 'recopy' ]; then + l1="Repair Mode - COPY\n" + l2="ssh admin@${localip}\n" + l3="Use password: PasswordA\n" + boxwidth=$((${#localip} + 28)) + dialog --backtitle "RaspiBlitz ${codeVersion} (${state}) ${setupStep} ${localip}" --infobox "$l1$l2$l3" 5 ${boxwidth} + sleep 3 + continue + fi + # if freshly recovered if [ "${state}" = "recovered" ]; then l1="FINAL RECOVER LOGIN NEEDED:\n" From 02587c519b4b43130be1f6d8a3326af610c58af1 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 17:18:51 +0100 Subject: [PATCH 60/88] fix infoscreen --- home.admin/00infoLCD.sh | 44 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/home.admin/00infoLCD.sh b/home.admin/00infoLCD.sh index ade126a..a5ffd46 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -122,28 +122,30 @@ while : continue fi - if [ $state == 'repair' ]; then - l1="Repair Mode\n" + # if freshly recovered + if [ "${state}" = "recovered" ]; then + l1="FINAL RECOVER LOGIN NEEDED:\n" l2="ssh admin@${localip}\n" - l3="Use password: PasswordA\n" + l3="Use password: raspiblitz\n" boxwidth=$((${#localip} + 28)) - dialog --backtitle "RaspiBlitz ${codeVersion} (${state}) ${setupStep} ${localip}" --infobox "$l1$l2$l3" 5 ${boxwidth} + dialog --backtitle "RaspiBlitz ${codeVersion} (${state})" --infobox "$l1$l2$l3" 5 ${boxwidth} sleep 3 continue fi - if [ $state == 'retorrent' ]; then - l1="Repair Mode- TORRENT\n" - l2="ssh admin@${localip}\n" - l3="Use password: PasswordA\n" + # if re-indexing + if [ "${state}" = "reindex" ]; then + l1="REINDEXING BLOCKCHAIN\n" + l2="To monitor & detect finish:\n" + l3="ssh admin@${localip}\n" boxwidth=$((${#localip} + 28)) - dialog --backtitle "RaspiBlitz ${codeVersion} (${state}) ${setupStep} ${localip}" --infobox "$l1$l2$l3" 5 ${boxwidth} + dialog --backtitle "RaspiBlitz ${codeVersion} (${state})" --infobox "$l1$l2$l3" 5 ${boxwidth} sleep 3 continue fi - if [ $state == 'recopy' ]; then - l1="Repair Mode - COPY\n" + if [ "${state}" = "repair" ]; then + l1="Repair Mode\n" l2="ssh admin@${localip}\n" l3="Use password: PasswordA\n" boxwidth=$((${#localip} + 28)) @@ -152,24 +154,22 @@ while : continue fi - # if freshly recovered - if [ "${state}" = "recovered" ]; then - l1="FINAL RECOVER LOGIN NEEDED:\n" + if [ "${state}" = "retorrent" ]; then + l1="Repair Mode- TORRENT\n" l2="ssh admin@${localip}\n" - l3="Use password: raspiblitz\n" + l3="Use password: PasswordA\n" boxwidth=$((${#localip} + 28)) - dialog --backtitle "RaspiBlitz ${codeVersion} (${state})" --infobox "$l1$l2$l3" 5 ${boxwidth} + dialog --backtitle "RaspiBlitz ${codeVersion} (${state}) ${setupStep} ${localip}" --infobox "$l1$l2$l3" 5 ${boxwidth} sleep 3 continue fi - # if re-indexing - if [ "${state}" = "reindex" ]; then - l1="REINDEXING BLOCKCHAIN\n" - l2="To monitor & detect finish:\n" - l3="ssh admin@${localip}\n" + if [ "${state}" = "recopy" ]; then + l1="Repair Mode - COPY\n" + l2="ssh admin@${localip}\n" + l3="Use password: PasswordA\n" boxwidth=$((${#localip} + 28)) - dialog --backtitle "RaspiBlitz ${codeVersion} (${state})" --infobox "$l1$l2$l3" 5 ${boxwidth} + dialog --backtitle "RaspiBlitz ${codeVersion} (${state}) ${setupStep} ${localip}" --infobox "$l1$l2$l3" 5 ${boxwidth} sleep 3 continue fi From b6048b59364c39a028cf17b578ffb6d623f77bd9 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 17:29:32 +0100 Subject: [PATCH 61/88] code move --- home.admin/00infoLCD.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/home.admin/00infoLCD.sh b/home.admin/00infoLCD.sh index a5ffd46..e3aaed1 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -144,6 +144,22 @@ while : continue fi + # when setup is in progress - password has been changed + if [ ${setupStep} -lt 100 ]; then + l1="Login to your RaspiBlitz with:\n" + l2="ssh admin@${localip}\n" + l3="Use your Password A\n" + boxwidth=$((${#localip} + 24)) + sleep 3 + dialog --backtitle "RaspiBlitz ${codeVersion} ${localip} - Welcome (${setupStep})" --infobox "$l1$l2$l3" 5 ${boxwidth} + sleep 7 + continue + fi + + ########################### + # DISPLAY AFTER SETUP + ########################### + if [ "${state}" = "repair" ]; then l1="Repair Mode\n" l2="ssh admin@${localip}\n" @@ -174,22 +190,6 @@ while : continue fi - # when setup is in progress - password has been changed - if [ ${setupStep} -lt 100 ]; then - l1="Login to your RaspiBlitz with:\n" - l2="ssh admin@${localip}\n" - l3="Use your Password A\n" - boxwidth=$((${#localip} + 24)) - sleep 3 - dialog --backtitle "RaspiBlitz ${codeVersion} ${localip} - Welcome (${setupStep})" --infobox "$l1$l2$l3" 5 ${boxwidth} - sleep 7 - continue - fi - - ########################### - # DISPLAY AFTER SETUP - ########################### - # check if bitcoin is ready sudo -u bitcoin ${network}-cli -datadir=/home/bitcoin/.${network} getblockchaininfo 1>/dev/null 2>error.tmp clienterror=`cat error.tmp` From 3213464efb6e9d03b768597da33c1ed329b18a37 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 17:59:08 +0100 Subject: [PATCH 62/88] correct size for checking blockchain --- home.admin/00mainMenu.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 0e02fde..db41923 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -150,11 +150,15 @@ waitUntilChainNetworkIsReady() rm error.tmp # check for missing blockchain data - blockchainsize=$(sudo du /mnt/hdd/bitcoin | head -n1 | awk '{print $1;}') + minSize=250000000000 + if [ "${network}" = "litecoin" ]; then + minSize=20000000000 + fi + blockchainsize=$(sudo du -shbc /mnt/hdd/${network} | head -n1 | awk '{print $1;}') echo "blockchainsize(${blockchainsize})" if [ ${#blockchainsize} -gt 0 ]; then - if [ ${blockchainsize} -lt 1000000 ]; then - echo "Mission Blockchain Data ..." + if [ ${blockchainsize} -lt ${minsize} ]; then + echo "Mission Blockchain Data (<${minsize}) ..." clienterror="missing blockchain" sleep 3 fi From ca708c83cdf20632e3c98f761d35703206c10623 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 18:04:56 +0100 Subject: [PATCH 63/88] color undervoltage warning --- home.admin/00infoBlitz.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index f3e08f8..aba3c10 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -295,5 +295,5 @@ ${color_yellow}${ln_publicColor}${ln_external} "${hdd}" "${sync_percentage}" if [ ${#undervoltageReports} -gt 0 ] && [ "${undervoltageReports}" != "0" ]; then - echo "${undervoltageReports} undervoltage reports found in syslog" + echo "!! ${color_red}${undervoltageReports} undervoltage reports found in syslog !!" fi From c9f7ce7ade997b747edc559819a0d9299430fec9 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 18:06:12 +0100 Subject: [PATCH 64/88] color on undervoltage warning --- home.admin/00infoBlitz.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index aba3c10..b71167d 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -295,5 +295,5 @@ ${color_yellow}${ln_publicColor}${ln_external} "${hdd}" "${sync_percentage}" if [ ${#undervoltageReports} -gt 0 ] && [ "${undervoltageReports}" != "0" ]; then - echo "!! ${color_red}${undervoltageReports} undervoltage reports found in syslog !!" + echo "!! ${color_red}${undervoltageReports} undervoltage reports found - maybe upgrade power supply !!" fi From 5d0c39fa7e49fb7a43bf00cab585d09f3b395778 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 18:07:06 +0100 Subject: [PATCH 65/88] coloring undervoltage warning --- home.admin/00infoBlitz.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index b71167d..bc2cb36 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -286,7 +286,7 @@ ${color_yellow} /,' ${color_gray} ${color_yellow} /' ${color_gray}LND ${color_green}${ln_version} ${ln_baseInfo} ${color_yellow} ${color_gray}${ln_channelInfo} ${ln_peersInfo} ${color_yellow} -${color_yellow}${ln_publicColor}${ln_external} +${color_yellow}${ln_publicColor}${ln_external}${color_red} " \ "RaspiBlitz v${codeVersion}" \ @@ -295,5 +295,5 @@ ${color_yellow}${ln_publicColor}${ln_external} "${hdd}" "${sync_percentage}" if [ ${#undervoltageReports} -gt 0 ] && [ "${undervoltageReports}" != "0" ]; then - echo "!! ${color_red}${undervoltageReports} undervoltage reports found - maybe upgrade power supply !!" + echo "!! ${undervoltageReports} undervoltage reports found - maybe upgrade power supply !!" fi From 85f083b93150a95ac2571b21ab552b8f4aa59246 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 18:07:26 +0100 Subject: [PATCH 66/88] text change --- home.admin/00infoBlitz.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index bc2cb36..75df46d 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -295,5 +295,5 @@ ${color_yellow}${ln_publicColor}${ln_external}${color_red} "${hdd}" "${sync_percentage}" if [ ${#undervoltageReports} -gt 0 ] && [ "${undervoltageReports}" != "0" ]; then - echo "!! ${undervoltageReports} undervoltage reports found - maybe upgrade power supply !!" + echo "${undervoltageReports} undervoltage reports found - maybe upgrade power supply" fi From 6ae5184a68354f5d0d36f82c50fe75f3ef559f83 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 18:10:09 +0100 Subject: [PATCH 67/88] fix minSize blockchain check --- home.admin/00mainMenu.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index db41923..347e5d1 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -157,8 +157,8 @@ waitUntilChainNetworkIsReady() blockchainsize=$(sudo du -shbc /mnt/hdd/${network} | head -n1 | awk '{print $1;}') echo "blockchainsize(${blockchainsize})" if [ ${#blockchainsize} -gt 0 ]; then - if [ ${blockchainsize} -lt ${minsize} ]; then - echo "Mission Blockchain Data (<${minsize}) ..." + if [ ${blockchainsize} -lt ${minSize} ]; then + echo "Mission Blockchain Data (<${minSize}) ..." clienterror="missing blockchain" sleep 3 fi From 4e148092146560e2b1664bb1b17ba08349bef651 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 18:59:57 +0100 Subject: [PATCH 68/88] added wait info --- home.admin/97addMobileWalletZap.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/97addMobileWalletZap.sh b/home.admin/97addMobileWalletZap.sh index 666cc14..5d2dd0a 100755 --- a/home.admin/97addMobileWalletZap.sh +++ b/home.admin/97addMobileWalletZap.sh @@ -44,9 +44,9 @@ fi # make sure qrcode-encoder in installed echo "*** Setup ***" echo "" -echo "Installing zapconnect. Please wait..." +echo "Installing zapconnect." echo "" -echo "Getting github.com/LN-Zap/lndconnect (please wait) ..." +echo "Getting github.com/LN-Zap/lndconnect (please wait - can take several minutes) ..." go get -d github.com/LN-Zap/lndconnect cd $GOPATH/src/github.com/LN-Zap/lndconnect echo "" From 7628914295a32eb10de147b1e7d0eeb33f43f83f Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 19:12:34 +0100 Subject: [PATCH 69/88] #329 prepare v1.1 for BTRFS data drive --- build_sdcard.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build_sdcard.sh b/build_sdcard.sh index 575694d..f1a00af 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -234,6 +234,9 @@ sudo apt-get install -y htop git curl bash-completion jq dphys-swapfile # installs bandwidth monitoring for future statistics sudo apt-get install -y vnstat +# prepare for BTRFS data drive raid +sudo apt-get install -y btrfs-tools + # prepare for display graphics mode # see https://github.com/rootzoll/raspiblitz/pull/334 sudo apt-get install -y fbi From 6fb6b41f32aaeaa6b77f5934d98640f9577fedfa Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 19:30:42 +0100 Subject: [PATCH 70/88] #397 MacOS supports just basic progress --- home.admin/50copyHDD.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 9c2150a..1616238 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -71,7 +71,7 @@ echo "COPY, PASTE & EXECUTE the following command on the blockchain source compu if [ "${CHOICE}" = "WINDOWS" ]; then echo "sudo scp -r ./chainstate ./indexes ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" else - echo "sudo rsync -avhW --info=progress2 ./chainstate ./indexes ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" + echo "sudo rsync -avhW --progress ./chainstate ./indexes ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" fi echo "" echo "This command may ask you first about the admin password of the other computer (because sudo)." From 04d6fca2cb36f8788551a96d9662f3571183055b Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 17 Mar 2019 19:31:46 +0100 Subject: [PATCH 71/88] typo fix --- home.admin/00mainMenu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 347e5d1..a7e99da 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -158,7 +158,7 @@ waitUntilChainNetworkIsReady() echo "blockchainsize(${blockchainsize})" if [ ${#blockchainsize} -gt 0 ]; then if [ ${blockchainsize} -lt ${minSize} ]; then - echo "Mission Blockchain Data (<${minSize}) ..." + echo "Missing Blockchain Data (<${minSize}) ..." clienterror="missing blockchain" sleep 3 fi From c80a03cc30a0f6137ae457ec6a5f1b5cac2e54a2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 00:18:30 +0100 Subject: [PATCH 72/88] #141 added needed reboot --- home.admin/50copyHDD.sh | 4 ++-- home.admin/50torrentHDD.sh | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 1616238..65c20d7 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -145,13 +145,13 @@ if [ "${setupStep}" = "100" ]; then sudo cp /home/admin/assets/bitcoin.conf /mnt/hdd/bitcoin/bitcoin.conf sudo chown bitcoin:bitcoin /mnt/hdd/bitcoin/bitcoin.conf sudo systemctl enable bitcoind - echo "DONE - reboot is needed: sudo shutdown -r now" + echo "DONE - rebooting: sudo shutdown -r now" + sudo shutdown -r now exit 0 fi # REACT ON QUICK CHECK DURING INITAL SETUP - if [ ${quickCheckOK} -eq 0 ]; then echo "*********************************************" diff --git a/home.admin/50torrentHDD.sh b/home.admin/50torrentHDD.sh index 6702e39..904d3c1 100755 --- a/home.admin/50torrentHDD.sh +++ b/home.admin/50torrentHDD.sh @@ -290,7 +290,8 @@ if [ "${setupStep}" = "100" ]; then sudo cp /home/admin/assets/${network}.conf /mnt/hdd/${network}/${network}.conf sudo chown -R bitcoin:bitcoin /mnt/hdd/${network}/ sudo systemctl enable ${network}d - echo "DONE - reboot needed: sudo shutdown -r now" + echo "DONE - rebooting: sudo shutdown -r now" + sudo shutdown -r now else # set SetupState sudo sed -i "s/^setupStep=.*/setupStep=50/g" /home/admin/raspiblitz.info From 030ac88be5260d973d81eecc5b2c515697b1267a Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 00:46:15 +0100 Subject: [PATCH 73/88] fixing rpcpassword after repair --- home.admin/50copyHDD.sh | 35 ++++++++++++++++++++--------------- home.admin/50torrentHDD.sh | 2 ++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 65c20d7..d11dd5a 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -20,15 +20,6 @@ case $CHOICE in *) exit 1;; esac -if [ -d "/mnt/hdd/bitcoin" ]; then - dialog --title "Prepare Copy" --yesno "Do you want to delete the old/local blockchain data now?" 8 60 - response=$? - echo "response(${response})" - case $response in - 1) exit 1 ;; - esac -fi - # additional prep if this is used to replace corrupted blockchain if [ "${setupStep}" = "100" ]; then # make sure services are not running @@ -38,12 +29,24 @@ if [ "${setupStep}" = "100" ]; then sudo cp -f /mnt/hdd/bitcoin/bitcoin.conf /home/admin/assets/bitcoin.conf fi -# delete all IN bitcoin directory but not itself if it exists -# so that possibel link to /home/bitcoin/.bitcoin nicht beschädigt wird -# also keep debug logs for repair script -sudo mv /mnt/hdd/bitcoin/debug.log /home/admin/debug.log 2>/dev/null -sudo rm -rfv /mnt/hdd/bitcoin/* 2>/dev/null -sudo mv /home/admin/debug.log /mnt/hdd/bitcoin/debug.log 2>/dev/null +if [ -d "/mnt/hdd/bitcoin" ]; then + dialog --title "Fresh or Repair" --yesno "Do you want to delete the old/local blockchain data now?" 8 60 + response=$? + echo "response(${response})" + if [ "${$response}" = "1" ]; then + echo "OK - keep old blockchain - just try to repair by copying over it" + sleep 3 + else + echo "OK - delete old blockchain" + # delete all IN bitcoin directory but not itself if it exists + # so that possibel link to /home/bitcoin/.bitcoin nicht beschädigt wird + # also keep debug logs for repair script + sudo mv /mnt/hdd/bitcoin/debug.log /home/admin/debug.log 2>/dev/null + sudo rm -rfv /mnt/hdd/bitcoin/* 2>/dev/null + sudo mv /home/admin/debug.log /mnt/hdd/bitcoin/debug.log 2>/dev/null + sleep 3 + fi +fi # make sure /mnt/hdd/bitcoin exists sudo mkdir /mnt/hdd/bitcoin 2>/dev/null @@ -143,7 +146,9 @@ echo "*********************************************" # if started after intial setup - quit here if [ "${setupStep}" = "100" ]; then sudo cp /home/admin/assets/bitcoin.conf /mnt/hdd/bitcoin/bitcoin.conf + rpcpass=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep 'bitcoind.rpcpass' | cut -d "=" -f2) sudo chown bitcoin:bitcoin /mnt/hdd/bitcoin/bitcoin.conf + sudo sed -i "s/^rpcpassword=.*/rpcpassword=${rpcpass}/g" /mnt/hdd/bitcoin/bitcoin.conf 2>/dev/null sudo systemctl enable bitcoind echo "DONE - rebooting: sudo shutdown -r now" sudo shutdown -r now diff --git a/home.admin/50torrentHDD.sh b/home.admin/50torrentHDD.sh index 904d3c1..8ddd3a4 100755 --- a/home.admin/50torrentHDD.sh +++ b/home.admin/50torrentHDD.sh @@ -288,6 +288,8 @@ date +%s if [ "${setupStep}" = "100" ]; then sudo cp /home/admin/assets/${network}.conf /mnt/hdd/${network}/${network}.conf + rpcpass=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep "${network}d.rpcpass" | cut -d "=" -f2) + sudo sed -i "s/^rpcpassword=.*/rpcpassword=${rpcpass}/g" /mnt/hdd/${network}/${network}.conf 2>/dev/null sudo chown -R bitcoin:bitcoin /mnt/hdd/${network}/ sudo systemctl enable ${network}d echo "DONE - rebooting: sudo shutdown -r now" From 209a1c7630a12e2925f80c7bd6b167054f8e83f2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 00:48:32 +0100 Subject: [PATCH 74/88] fix response check --- home.admin/50copyHDD.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index d11dd5a..c24f02d 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -33,7 +33,7 @@ if [ -d "/mnt/hdd/bitcoin" ]; then dialog --title "Fresh or Repair" --yesno "Do you want to delete the old/local blockchain data now?" 8 60 response=$? echo "response(${response})" - if [ "${$response}" = "1" ]; then + if [ "${response}" = "1" ]; then echo "OK - keep old blockchain - just try to repair by copying over it" sleep 3 else From c27cacf5ef2aaf74033c9f440dab0360ad4e4421 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 15:02:26 +0100 Subject: [PATCH 75/88] move info --- home.admin/00mainMenu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index a7e99da..dc4c918 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -155,9 +155,9 @@ waitUntilChainNetworkIsReady() minSize=20000000000 fi blockchainsize=$(sudo du -shbc /mnt/hdd/${network} | head -n1 | awk '{print $1;}') - echo "blockchainsize(${blockchainsize})" if [ ${#blockchainsize} -gt 0 ]; then if [ ${blockchainsize} -lt ${minSize} ]; then + echo "blockchainsize(${blockchainsize})" echo "Missing Blockchain Data (<${minSize}) ..." clienterror="missing blockchain" sleep 3 From 47e260da8eca58f48cd031e27715f25714d1790a Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 17:58:22 +0100 Subject: [PATCH 76/88] README v1.1 --- FAQ.md | 18 +++++++++++++++++- README.md | 11 +++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/FAQ.md b/FAQ.md index aa37e85..f96017b 100644 --- a/FAQ.md +++ b/FAQ.md @@ -558,4 +558,20 @@ Also make sure to check again on your power supply - it needs to deliver equal o 3. Capital is committed to competitive destinations 4. Capital committed to destinations no one wants to send to 5. Fees are too high -6. Your inbound liquidity doesn't have good inbound liquidity itself \ No newline at end of file +6. Your inbound liquidity doesn't have good inbound liquidity itself + +## Can I still get version 1.0 of RaspiBlitz? + +Yes here are the links: + +HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-02-18.img.gz + +Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.0-2019-02-18.torrent + +SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f + +Code: https://github.com/rootzoll/raspiblitz/tree/v1.0 + +## Is it safe to downgrade from v1.1 to v1.0? + +Yes it should - but its not tested yet. \ No newline at end of file diff --git a/README.md b/README.md index e3af382..85436b9 100644 --- a/README.md +++ b/README.md @@ -80,13 +80,16 @@ Connect the HDD to one of the USB ports. In the end your RaspiBlitz should look Your SD-card needs to contain the RaspiBlitz software. You can take the long road by [building the SD-card image yourself](#build-the-sd-card-image) or use the already prepared SD-Card image: -1. Download SD-Card image - **Version 1.0**: +1. Download SD-Card image - **Version 1.1**: -HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-02-18.img.gz +HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-03-18.img.gz -Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.0-2019-02-18.torrent +Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.0-2019-03-18.torrent -SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f +SHA-256: b7a449ce6444f9e7e9fd05156ff09c70a6e200be0b5e580d3317049eefc4f3b7 + +* [How to update my RaspiBlitz?](FAQ.md) +* [Can I still get version 1.0 of RaspiBlitz?](FAQ.md) 2. Write the SD-Card image to your SD Card - if you need details, see here: https://www.raspberrypi.org/documentation/installation/installing-images/README.md From b865dd483753c123b9487566298251f132ce9fc2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 17:59:37 +0100 Subject: [PATCH 77/88] README v1.1 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 85436b9..61335b2 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,8 @@ Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.0-2019- SHA-256: b7a449ce6444f9e7e9fd05156ff09c70a6e200be0b5e580d3317049eefc4f3b7 -* [How to update my RaspiBlitz?](FAQ.md) -* [Can I still get version 1.0 of RaspiBlitz?](FAQ.md) +* [How to update my RaspiBlitz?](FAQ.md#how-to-update-my-raspiblitz-after-version-098) +* [Can I still get version 1.0 of RaspiBlitz?](FAQ.md#can-i-still-get-version-10-of-raspiblitz) 2. Write the SD-Card image to your SD Card - if you need details, see here: https://www.raspberrypi.org/documentation/installation/installing-images/README.md From d375acdeff342e64794b78b729692e7ac535c0af Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 18:01:36 +0100 Subject: [PATCH 78/88] README v1.1 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 61335b2..c50c777 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # RaspiBlitz *Build your own Lightning Node on a RaspberryPi with a nice Display.* -`Version 1.0 with lnd 0.5.2-beta and bitcoin 0.17.0.1 or litecoin 0.16.3.` +`Version 1.1 with lnd 0.5.2-beta and bitcoin 0.17.0.1 or litecoin 0.16.3.` ![RaspiBlitz](pictures/raspiblitz.jpg) @@ -80,7 +80,7 @@ Connect the HDD to one of the USB ports. In the end your RaspiBlitz should look Your SD-card needs to contain the RaspiBlitz software. You can take the long road by [building the SD-card image yourself](#build-the-sd-card-image) or use the already prepared SD-Card image: -1. Download SD-Card image - **Version 1.1**: +**-->** Download SD-Card image - **Version 1.1**: HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-03-18.img.gz @@ -91,7 +91,7 @@ SHA-256: b7a449ce6444f9e7e9fd05156ff09c70a6e200be0b5e580d3317049eefc4f3b7 * [How to update my RaspiBlitz?](FAQ.md#how-to-update-my-raspiblitz-after-version-098) * [Can I still get version 1.0 of RaspiBlitz?](FAQ.md#can-i-still-get-version-10-of-raspiblitz) -2. Write the SD-Card image to your SD Card - if you need details, see here: +**-->** Write the SD-Card image to your SD Card - if you need details, see here: https://www.raspberrypi.org/documentation/installation/installing-images/README.md ## Boot your RaspiBlitz From ddd48bb952424e80c53d1a4a04d0b1ac2ba4d9f2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 18:02:23 +0100 Subject: [PATCH 79/88] correct link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c50c777..176cf4c 100644 --- a/README.md +++ b/README.md @@ -82,9 +82,9 @@ Your SD-card needs to contain the RaspiBlitz software. You can take the long roa **-->** Download SD-Card image - **Version 1.1**: -HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-03-18.img.gz +HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.1-2019-03-18.img.gz -Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.0-2019-03-18.torrent +Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.1-2019-03-18.torrent SHA-256: b7a449ce6444f9e7e9fd05156ff09c70a6e200be0b5e580d3317049eefc4f3b7 From f2f19f23fb5f09091420d158da05d021a83ffcc6 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 18 Mar 2019 18:23:47 +0100 Subject: [PATCH 80/88] v1.1 torrent file --- raspiblitz-v1.1-2019-03-18.torrent | Bin 0 -> 26575 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 raspiblitz-v1.1-2019-03-18.torrent diff --git a/raspiblitz-v1.1-2019-03-18.torrent b/raspiblitz-v1.1-2019-03-18.torrent new file mode 100755 index 0000000000000000000000000000000000000000..8521d08ab2e8a697941b6951b4f2c518e1333a2a GIT binary patch literal 26575 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 SAA|| Date: Mon, 18 Mar 2019 22:36:39 +0100 Subject: [PATCH 81/88] tested downgrade info --- FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index f96017b..11d8802 100644 --- a/FAQ.md +++ b/FAQ.md @@ -572,6 +572,6 @@ SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f Code: https://github.com/rootzoll/raspiblitz/tree/v1.0 -## Is it safe to downgrade from v1.1 to v1.0? +## Can I downgrade from v1.1 to v1.0? -Yes it should - but its not tested yet. \ No newline at end of file +Yes - it was tested ne time and worked. Just follow the normal update mechanism - just use the old v1.0 image. \ No newline at end of file From 99e43a999d68edde0910cdcc831b4554370ef3c5 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Tue, 19 Mar 2019 00:09:20 +0100 Subject: [PATCH 82/88] v1.1 Change Log and Update Instructions --- FAQ.md | 83 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/FAQ.md b/FAQ.md index 11d8802..261ea0f 100644 --- a/FAQ.md +++ b/FAQ.md @@ -1,27 +1,61 @@ # FAQ - Frequently Asked Questions -## How do I generate a Debug Report? +## Whats new in Version 1.1 of RaspiBlitz? -If your RaspiBlitz is not working right and you like to get help from the community, its good to provide more debug information, so other can better diagnose your problem - please follow the following steps to generate a debug report: +Version 1.1 packs some first fixes and enhancements to make the RaspiBlitz more stable, protect HDD data better and support you better in case of data corruption of the blockchain data. -- ssh into your raspiblitz as admin user with your password A -- If you see the menu - use CTRL+C to get to the terminal -- To generate debug report run: `./XXdebugLogs.sh` -- Then copy all output beginning with `*** RASPIBLITZ LOGS ***` and share this +- Update: RTL (Ride the Lightning) Web UI version 0.2.15-beta +- Fix: Preventing logs from filling up the sd card +- Fix: Pairing for latest Zap iOS Mobile Wallet +- Fix: Pairing for latest Shango Mobile Wallet +- Fix: Open LND port check when custom port +- New: Undervoltage Reports on LCD +- New: fsk (file system consistency check) of HDD on every boot +- New: Repair Help Menu in case if blockchain data corruption +- New: /config.scripts/lnd.setport.sh (set custom LND port) +- New: /config.scripts/lnd.rescue.sh (backup/replay LND data) +- Removed: FTP download option for blockchain -*PLEASE NOTICE: Its possible that this logs can contain private information (like IPs, node IDs, ...) - just share publicly what you feel OK with.* +For full details see issue list of [Release 1.1 Milestone](https://github.com/rootzoll/raspiblitz/milestone/3?closed=1). + +Instructions on how to update see FAQ info below. ## How to update my RaspiBlitz (AFTER version 0.98)? -To prepare the RaspiBlitz update: +For update you dont need to close any channels, remove funding or download the blockchain again. + +Simply [Ddwnload the new RaspiBlitz SD card image](https://github.com/rootzoll/raspiblitz#installing-the-software) to your laptop and have an sd card writer ready. Then login into your RaspiBlitz with SSH and: - main menu > OFF - remove power - remove SD card -Now download the new RaspiBlitz SD card image and write it to your SD card .. yes you simply overwrite the old one, it's OK, all your personal data is on the HDD (if you haven't done any manual changes to the system). See details about latest SD card image here: https://github.com/rootzoll/raspiblitz#scenario-2-start-at-home +Write the new image it to your SD card .. yes you simply overwrite the old one, it's OK, all your personal data is on the HDD. If you want to be extra safe you can make a image backup of your old sd card first - but that is optional. If you made manual changes to your RaspiBlitz with scripts on the sd card you might wanna check on this FAQ question first: [Why do I need to re-burn my SD card for an update?](FAQ.md#why-do-i-need-to-re-burn-my-sd-card-for-an-update). + +- insert new sd card image +- power on the RaspiBlitz again + +You should see that it switched into recover/backup mode. Its now provisioning the fresh OS on the sd card your old settings and data. This process can take some while especially if you had RTL Web UI activated. Follow the instructions on the display ... if it takes longer then an hour .. [get support](https://github.com/rootzoll/raspiblitz#support). -If done successfully, simply put the SD card into the RaspiBlitz and power on again. Then follow the instructions on the display ... and dont worry, you dont need to re-download the blockchain again. +When update/recover process is ready you will see a `FINAL RECOVER LOGIN NEEDED` message on the display. Login per SSH by using the password `raspiblitz` and set your Password A again. It can be the same as the old one, but maybe use the occasion to make password change for security reasons. If you had auto-unlock activated you might also be asked to enter your old Password C again. Then it wil make a final reboot. + +After your RaspiBlitz is done with catching up the latest blockchain data you should see your status screen displaying your funds and channels. Your backup is complete. + +## Can I downgrade from v1.1 to v1.0? + +Yes - it was tested one time and worked. Just follow the normal update mechanism - just use the old v1.0 image or your own backup image of the old sd card. + +## Can I still get version 1.0 of RaspiBlitz? + +Yes here are the links: + +HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-02-18.img.gz + +Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.0-2019-02-18.torrent + +SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f + +Code: https://github.com/rootzoll/raspiblitz/tree/v1.0 ## How to update a old RaspiBlitz (BEFORE version 0.98)? @@ -105,6 +139,17 @@ To connect the 2nd HDD to the RaspiBlitz, the use of a Y cable to provide extra ![ExtraPower](pictures/extrapower.png) +## How do I generate a Debug Report? + +If your RaspiBlitz is not working right and you like to get help from the community, its good to provide more debug information, so other can better diagnose your problem - please follow the following steps to generate a debug report: + +- ssh into your raspiblitz as admin user with your password A +- If you see the menu - use CTRL+C to get to the terminal +- To generate debug report run: `./XXdebugLogs.sh` +- Then copy all output beginning with `*** RASPIBLITZ LOGS ***` and share this + +*PLEASE NOTICE: Its possible that this logs can contain private information (like IPs, node IDs, ...) - just share publicly what you feel OK with.* + ## Why is my "final sync" taking so long? First of all if you see a final sync over 90% and you can see from time to time small increase - you should be OK ... this can take some looong time to catch up with the network. Only in the case that you activly choose the `SYNC` option in the `Getting the Blockchain` a final sync under 90% is OK. If you did a torrent or a copy from another computer and seeing under 90% somthing went wrong and the setup process is ignoring your prepared Blockchain and doing a full sync - which can almost take forever on a raspberryPi. @@ -558,20 +603,4 @@ Also make sure to check again on your power supply - it needs to deliver equal o 3. Capital is committed to competitive destinations 4. Capital committed to destinations no one wants to send to 5. Fees are too high -6. Your inbound liquidity doesn't have good inbound liquidity itself - -## Can I still get version 1.0 of RaspiBlitz? - -Yes here are the links: - -HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-02-18.img.gz - -Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.0-2019-02-18.torrent - -SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f - -Code: https://github.com/rootzoll/raspiblitz/tree/v1.0 - -## Can I downgrade from v1.1 to v1.0? - -Yes - it was tested ne time and worked. Just follow the normal update mechanism - just use the old v1.0 image. \ No newline at end of file +6. Your inbound liquidity doesn't have good inbound liquidity itself \ No newline at end of file From 24657ed0df49ab9d053c6595a48f8d5c37a64b66 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Tue, 19 Mar 2019 00:17:08 +0100 Subject: [PATCH 83/88] formatting --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 176cf4c..3e5f6e5 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Connect the HDD to one of the USB ports. In the end your RaspiBlitz should look Your SD-card needs to contain the RaspiBlitz software. You can take the long road by [building the SD-card image yourself](#build-the-sd-card-image) or use the already prepared SD-Card image: -**-->** Download SD-Card image - **Version 1.1**: +**Download SD-Card image - Version 1.1:** HTTP: http://wiki.fulmo.org/downloads/raspiblitz-v1.1-2019-03-18.img.gz @@ -91,8 +91,9 @@ SHA-256: b7a449ce6444f9e7e9fd05156ff09c70a6e200be0b5e580d3317049eefc4f3b7 * [How to update my RaspiBlitz?](FAQ.md#how-to-update-my-raspiblitz-after-version-098) * [Can I still get version 1.0 of RaspiBlitz?](FAQ.md#can-i-still-get-version-10-of-raspiblitz) -**-->** Write the SD-Card image to your SD Card - if you need details, see here: -https://www.raspberrypi.org/documentation/installation/installing-images/README.md +**Write the SD-Card image to your SD Card** + +if you need details, see here: https://www.raspberrypi.org/documentation/installation/installing-images/README.md ## Boot your RaspiBlitz From 510d9af0f784dd9a4ef6d1a2da7b93836aca4ead Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Tue, 19 Mar 2019 00:22:11 +0100 Subject: [PATCH 84/88] Added FAQ questions --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3e5f6e5..c252670 100644 --- a/README.md +++ b/README.md @@ -88,13 +88,14 @@ Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.1-2019- SHA-256: b7a449ce6444f9e7e9fd05156ff09c70a6e200be0b5e580d3317049eefc4f3b7 -* [How to update my RaspiBlitz?](FAQ.md#how-to-update-my-raspiblitz-after-version-098) -* [Can I still get version 1.0 of RaspiBlitz?](FAQ.md#can-i-still-get-version-10-of-raspiblitz) - **Write the SD-Card image to your SD Card** if you need details, see here: https://www.raspberrypi.org/documentation/installation/installing-images/README.md +* [How to update my RaspiBlitz?](FAQ.md#how-to-update-my-raspiblitz-after-version-098) +* [Whats new in Version 1.1 of RaspiBlitz?](FAQ.md#whats-new-in-version-11-of-raspiblitz) +* [Can I still get version 1.0 of RaspiBlitz?](FAQ.md#can-i-still-get-version-10-of-raspiblitz) + ## Boot your RaspiBlitz Insert the SD card and connect the power plug. From 3e39d838f7408f137c3f1e073771d400cf3c5b1f Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Tue, 19 Mar 2019 00:28:52 +0100 Subject: [PATCH 85/88] bootscreen info --- FAQ.md | 1 + 1 file changed, 1 insertion(+) diff --git a/FAQ.md b/FAQ.md index 261ea0f..96656f8 100644 --- a/FAQ.md +++ b/FAQ.md @@ -14,6 +14,7 @@ Version 1.1 packs some first fixes and enhancements to make the RaspiBlitz more - New: Repair Help Menu in case if blockchain data corruption - New: /config.scripts/lnd.setport.sh (set custom LND port) - New: /config.scripts/lnd.rescue.sh (backup/replay LND data) +- New: Bootscreen with logo - Removed: FTP download option for blockchain For full details see issue list of [Release 1.1 Milestone](https://github.com/rootzoll/raspiblitz/milestone/3?closed=1). From bbdd82484a71810b7ad8e21ad36030e4b5568de1 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Tue, 19 Mar 2019 00:32:31 +0100 Subject: [PATCH 86/88] Change Boot Logo Info --- FAQ.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index 96656f8..8844c0f 100644 --- a/FAQ.md +++ b/FAQ.md @@ -604,4 +604,10 @@ Also make sure to check again on your power supply - it needs to deliver equal o 3. Capital is committed to competitive destinations 4. Capital committed to destinations no one wants to send to 5. Fees are too high -6. Your inbound liquidity doesn't have good inbound liquidity itself \ No newline at end of file +6. Your inbound liquidity doesn't have good inbound liquidity itself + +## How can I change the boot screen logo? + +Just replace the file `/home/admin/raspiblitz/pictures/logoraspiblitz.png` with a PNG of the same dimensions. + +NOTE: On updates this change will get lost and you might need to redo it. \ No newline at end of file From 9d741270dcfa123efd79c333c3f0b0cb77047ab2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Tue, 19 Mar 2019 15:26:42 +0100 Subject: [PATCH 87/88] #420 add info on FAQ --- FAQ.md | 15 ++++++++++++++- README.md | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index 8844c0f..3902cb8 100644 --- a/FAQ.md +++ b/FAQ.md @@ -610,4 +610,17 @@ Also make sure to check again on your power supply - it needs to deliver equal o Just replace the file `/home/admin/raspiblitz/pictures/logoraspiblitz.png` with a PNG of the same dimensions. -NOTE: On updates this change will get lost and you might need to redo it. \ No newline at end of file +NOTE: On updates this change will get lost and you might need to redo it. + +## I cannot connect per SSH to my RaspiBlitz. What to do? + +- Check the command again with how its on the display - do you have it typed in correctly? +- Replace `ssh` with `sudo ssh` and try it (laptop admin password might be required). + +If that not works ry to ping the IP of the RaspiBlitz with `ping [IP-of-RaspiBlitz]`. If you get no response on the ping requests the device is not reachable try this check list: + +- Make sure that your RaspiBlitz and your laptop are really on the same local network +- Check if you have a VPN running on your laptop - some VPNs block local network +- Some Routers have `IP Isolation` switched on - not allowing to devices to connect + +If that all is not working: Join the conversation on [GitHub Issue #420](https://github.com/rootzoll/raspiblitz/issues/420). diff --git a/README.md b/README.md index c252670..966a05b 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,8 @@ Now open up a terminal ([OSX](https://www.youtube.com/watch?v=5XgBd6rjuDQ)/[Win1 **Now follow the dialoge in your terminal. This can take some time (prepare some coffee) - but in the end you should have a running Lightning node on your RaspberryPi that you can start to learn and hack on.** +* [I cannot connect per SSH to my RaspiBlitz. What to do?](FAQ.md) + ## Support If you run into a problem or you have still a question, follow the steps below to get support. Also check the [setup documentation](#setup-process-detailed-documentation) for details. From 3b6e93f84fac386856ac418e55273f9ca061f582 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Tue, 19 Mar 2019 15:28:15 +0100 Subject: [PATCH 88/88] Correct FAQ link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 966a05b..2e704a2 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ Now open up a terminal ([OSX](https://www.youtube.com/watch?v=5XgBd6rjuDQ)/[Win1 **Now follow the dialoge in your terminal. This can take some time (prepare some coffee) - but in the end you should have a running Lightning node on your RaspberryPi that you can start to learn and hack on.** -* [I cannot connect per SSH to my RaspiBlitz. What to do?](FAQ.md) +* [I cannot connect per SSH to my RaspiBlitz. What to do?](FAQ.md#i-cannot-connect-per-ssh-to-my-raspiblitz-what-to-do) ## Support