From 7b163d57a624bb215c2fdbef3243563586d1ff31 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Fri, 15 Feb 2019 23:19:43 +0100 Subject: [PATCH 001/130] dont delete linked directory anymore --- home.admin/50copyHDD.sh | 101 +++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 5e57e69..34a4457 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -17,28 +17,15 @@ if [ "${setupStep}" = "100" ]; then sudo systemctl stop bitcoind fi +# 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 -# create bitcoin base directory and link with bitcoin user -echo "delete and create new blockchain directory ..." -sudo rm -rf /mnt/hdd/bitcoin 2>/dev/null -sudo rm -rf /home/bitcoin/.bitcoin 2>/dev/null -sudo mkdir /mnt/hdd/bitcoin -sudo chown bitcoin:bitcoin /mnt/hdd/bitcoin -sudo ln -s /mnt/hdd/bitcoin /home/bitcoin/.bitcoin - -# check setup -echo "checking setup ..." -sudo touch /home/bitcoin/.bitcoin/test.txt -createdCorerct=$(sudo ls /mnt/hdd/bitcoin/test.txt | grep -c 'test.txt') -sudo rm /home/bitcoin/.bitcoin/test.txt -if [ ${createdCorerct} -eq 0 ]; then - sudo rm -rf /mnt/hdd/bitcoin - sudo rm -rf /home/bitcoin/.bitcoin - echo "FAILED: sudo ln -s /mnt/hdd/bitcoin /home/bitcoin/.bitcoin" - echo "Press ENTER to get back to menu ..." - read key - exit 1 -fi +# make sure /mnt/hdd/bitcoin exists +sudo mkdir /mnt/hdd/bitcoin 2>/dev/null + +# allow all users write to it () +sudo chmod 777 /mnt/hdd/bitcoin clear echo "************************************************************************************" @@ -56,7 +43,7 @@ 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}:/home/bitcoin/.bitcoin" +echo "sudo scp -r ./chainstate ./indexes ./testnet3 ./blocks bitcoin@${localip}:/mnt/hdd/bitcoin" 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." @@ -100,42 +87,62 @@ if [ ${count} -lt 1500 ]; then quickCheckOK=0 fi +echo "*********************************************" +echo "QUICK CHECK RESULT" +echo "*********************************************" + # just if any data transferred .. if [ ${anyDataAtAll} -eq 1 ]; then # data was invalid - ask user to keep? if [ ${quickCheckOK} -eq 0 ]; then - echo "*********************************************" - echo "There seems to be an invalid transfer." - echo "Wait 5 secs ..." - sleep 5 - dialog --title " INVALID TRANSFER - DELETE DATA?" --yesno "Quickcheck shows the data you transferred is invalid/incomplete. This can lead further RaspiBlitz setup to get stuck in error state.\nDo you want to reset/delete data data?" 8 60 - response=$? - echo "response(${response})" - case $response in - 1) quickCheckOK=1 ;; - esac - fi - if [ ${quickCheckOK} -eq 0 ]; then - echo "Deleting invalid Data ..." - sudo rm -rf /mnt/hdd/bitcoin - sudo rm -rf /home/bitcoin/.bitcoin - sleep 2 + echo "FAIL -> DATA seems incomplete." + + else + + echo "OK -> DATA LOOKS GOOD :D" + fi else + + echo "CANCEL -> NO DATA was copied." + quickCheckOK=0 + +fi +echo "*********************************************" + +# if started after intial setup - quit here +if [ "${setupStep}" = "100" ]; then + "DONE - reboot is needed: sudo shutdown -r now" + exit 0 +fi + +# REACT ON QUICK CHECK DURING INITAL SETUP + + +if [ ${quickCheckOK} -eq 0 ]; then + + echo "*********************************************" + echo "There seems to be an invalid transfer." + + echo "Wait 5 secs ..." + sleep 5 + dialog --title " INVALID TRANSFER - DELETE DATA?" --yesno "Quickcheck shows the data you transferred is invalid/incomplete. This can lead further RaspiBlitz setup to get stuck in error state.\nDo you want to reset/delete data data?" 8 60 + response=$? + echo "response(${response})" + case $response in + 1) quickCheckOK=1 ;; + esac - echo "back to menu ..." - # when no data transferred - just delete bitcoin base dir again +fi + +if [ ${quickCheckOK} -eq 0 ]; then + echo "Deleting invalid Data ... " sudo rm -rf /mnt/hdd/bitcoin sleep 2 - fi -if [ ${setupStep} -lt 100 ]; then - # setup script will decide the next logical step - /home/admin/10setupBlitz.sh -else - "DONE - reboot is needed: sudo shutdown -r now" -fi \ No newline at end of file +# setup script will decide the next logical step +/home/admin/10setupBlitz.sh From 5ee5166070bc4e1bd00872321f5525098fee87dd Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 16 Feb 2019 00:07:43 +0100 Subject: [PATCH 002/130] updated FAQ --- FAQ.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index f3ca03c..51efc97 100644 --- a/FAQ.md +++ b/FAQ.md @@ -71,7 +71,7 @@ If everything of the above is prepared, start the setup of the new RaspiBlitz wi Once you finished all the transferes the Raspiblitz will make a quick-check on the data - but that will not guarantee that everything in detail was OK with the transfere. Check further FAQ answeres if you get stuck or see a final sync with a value below 90%. -**If you want to replace a corrupted blockchain this way:** *Go to terminal - maybe with CTRL+c. `sudo systemctl stop bitcoind` and `sudo systemctl stop lnd` then call `/home/admin/50copyHDD.sh` use the displayed SCP commands to copy over the fresh blockchain. Press ENTER when all is copied, so that the script can quick check the data and set the correct permissions. Then make a reboot `sudo shutdown -r now`* +**If you want to replace a corrupted blockchain this way:** *Go to terminal - maybe with CTRL+c. Then call `/home/admin/50copyHDD.sh` use the displayed SCP commands to copy over the fresh blockchain. Press ENTER when all is copied, so that the script can quick check the data. Then make a reboot `sudo shutdown -r now`* ## How do I clone the Blockchain from a 2nd HDD? @@ -488,3 +488,11 @@ When you put in a sd card with a new/clean RaspiBlitz image the RaspiBlitz will But there might be cases where you want to start a totally fresh/clean RaspiBlitz from the beginning. To do so you need to delete the old data from the HDD. You can do so by formating it on another computer (for example with FAT and name it "NEW"). Or when you can run the script "/home/admin/XXcleanHD.sh -all" on the terminal. When the HDD is clean, then flash a new RaspiBlitz sd card and your setup should start fresh. + +## My blockchain data is corrupted - what can I do? + +You could try to re-index, but that can take some very long time - multiple days or even weeks. + +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) + +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) From 6e9370a24a7911f9ae3a82f620e74a0210e097ed Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 16 Feb 2019 00:09:12 +0100 Subject: [PATCH 003/130] FAQ added links --- FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index 51efc97..89359d4 100644 --- a/FAQ.md +++ b/FAQ.md @@ -493,6 +493,6 @@ When the HDD is clean, then flash a new RaspiBlitz sd card and your setup should You could try to re-index, but that can take some very long time - multiple days or even weeks. -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) +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) -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) +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) From b44827681f7660b39a94679781ab851956d57491 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 16 Feb 2019 00:17:27 +0100 Subject: [PATCH 004/130] open SSH info --- FAQ.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index 89359d4..2732814 100644 --- a/FAQ.md +++ b/FAQ.md @@ -495,4 +495,4 @@ 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) -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) +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) \ No newline at end of file diff --git a/README.md b/README.md index 900dd7c..1285519 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ When everything boots up correctly, you should see the local IP address of your ![LCD0](pictures/lcd0-welcome.png) -Now open up a [terminal](https://www.youtube.com/watch?v=5XgBd6rjuDQ) and connect thru SSH with the command displayed by the RaspiBlitz: +Now open up a terminal ([OSX](https://www.youtube.com/watch?v=5XgBd6rjuDQ)/[Win10](https://www.youtube.com/watch?v=xIfzZXHaCzQ)) and connect thru SSH with the command displayed by the RaspiBlitz: `ssh admin@[YOURIP]` → use password: `raspiblitz` From 70635f5b3116fe33a0ae5d91367d8da7721cfc7f Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 16 Feb 2019 00:19:39 +0100 Subject: [PATCH 005/130] info on corrupted data --- home.admin/50copyHDD.sh | 4 +++- home.admin/config.scripts/network.reindex.sh | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 34a4457..5fa7028 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -14,7 +14,8 @@ if [ "${setupStep}" = "100" ]; then # make sure services are not running echo "stopping servcies ..." sudo systemctl stop lnd - sudo systemctl stop bitcoind + sudo systemctl stop bitcoind + sudo systemctl disable bitcoind fi # delete all IN bitcoin directory but not itself if it exists @@ -115,6 +116,7 @@ echo "*********************************************" # if started after intial setup - quit here if [ "${setupStep}" = "100" ]; then + sudo systemctl enable bitcoind "DONE - reboot is needed: sudo shutdown -r now" exit 0 fi diff --git a/home.admin/config.scripts/network.reindex.sh b/home.admin/config.scripts/network.reindex.sh index 881e753..e1c3950 100755 --- a/home.admin/config.scripts/network.reindex.sh +++ b/home.admin/config.scripts/network.reindex.sh @@ -50,7 +50,9 @@ while [ ${finished} -eq 0 ] echo "REINDEXING BLOCKCHAIN" echo "*************************" date - echo "THIS CAN TAKE SOME LONG TIME" + echo "THIS CAN TAKE SOME VERY LONG TIME" + echo "See Raspiblitz FAQ: https://github.com/rootzoll/raspiblitz" + echo "On question: My blockchain data is corrupted - what can I do?" echo "If you dont see any progress after 24h keep X pressed to stop." # get blockchain sync progress From df78fd97a0c1bdf3b590ed81dfa27a7c2537c8ed Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 16 Feb 2019 00:39:32 +0100 Subject: [PATCH 006/130] bitcoin.conf after copyHDD --- home.admin/50copyHDD.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 5fa7028..ca847d6 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -15,7 +15,7 @@ if [ "${setupStep}" = "100" ]; then echo "stopping servcies ..." sudo systemctl stop lnd sudo systemctl stop bitcoind - sudo systemctl disable bitcoind + sudo systemctl disable bitcoind fi # delete all IN bitcoin directory but not itself if it exists @@ -116,7 +116,9 @@ echo "*********************************************" # if started after intial setup - quit here if [ "${setupStep}" = "100" ]; then - sudo systemctl enable bitcoind + 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 "DONE - reboot is needed: sudo shutdown -r now" exit 0 fi From 20a63a20b945af35f723e3fb9caead526b142d64 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 16 Feb 2019 01:17:39 +0100 Subject: [PATCH 007/130] backup bitcoin.conf --- home.admin/50copyHDD.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index ca847d6..873584f 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -16,6 +16,7 @@ if [ "${setupStep}" = "100" ]; then 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 # delete all IN bitcoin directory but not itself if it exists From 62c88062c78af3fc326abc5a75ac60fa1830f2d9 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 16 Feb 2019 11:01:53 +0100 Subject: [PATCH 008/130] repair with torrent --- home.admin/50torrentHDD.sh | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/home.admin/50torrentHDD.sh b/home.admin/50torrentHDD.sh index d95dbf4..1dc965b 100755 --- a/home.admin/50torrentHDD.sh +++ b/home.admin/50torrentHDD.sh @@ -255,12 +255,21 @@ if [ ${torrentError} -gt 0 ]; then fi +# 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 + sudo cp -f /mnt/hdd/${network}/${network}.conf /home/admin/assets/${network}.conf + sudo rm -rfv /mnt/hdd/${network}/* 2>/dev/null +fi + # Download worked / just move, copy on USB2 >4h echo "" echo "*** Moving Files ***" date +%s echo "can take some minutes... please wait" - sudo mkdir /mnt/hdd/${network} 2>/dev/null sudo mv ${targetPath1}/* /mnt/hdd/${network}/ sudo cp -r ${targetPath2}/* /mnt/hdd/${network}/ @@ -268,7 +277,12 @@ sudo rm -r ${targetDir} echo "OK" date +%s -if [ ${setupStep} -lt 100 ]; then +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" +else # set SetupState sudo sed -i "s/^setupStep=.*/setupStep=50/g" /home/admin/raspiblitz.info # continue setup From fda7a98776430ed2faf82e9b1106c67b8f95b428 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 16 Feb 2019 23:26:59 +0100 Subject: [PATCH 009/130] added backup info --- FAQ.md | 2 +- home.admin/50copyHDD.sh | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/FAQ.md b/FAQ.md index 2732814..ddb702d 100644 --- a/FAQ.md +++ b/FAQ.md @@ -121,7 +121,7 @@ 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 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. +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 ## What is this mnemonic seed word list? diff --git a/home.admin/50copyHDD.sh b/home.admin/50copyHDD.sh index 873584f..302003f 100755 --- a/home.admin/50copyHDD.sh +++ b/home.admin/50copyHDD.sh @@ -55,9 +55,6 @@ echo "PRESS ENTER if transfers is done OR if you want to choose another another sleep 2 read key -# unlink bitcoin user (will created later in setup again) -sudo unlink /home/bitcoin/.bitcoin - # make quick check if data is there anyDataAtAll=0 quickCheckOK=1 @@ -120,7 +117,7 @@ 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 - "DONE - reboot is needed: sudo shutdown -r now" + echo "DONE - reboot is needed: sudo shutdown -r now" exit 0 fi From c9295826f044c2e055c4c762291396ceef778096 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 17 Feb 2019 00:22:42 +0100 Subject: [PATCH 010/130] more details on info --- FAQ.md | 10 +++++++++- home.admin/50torrentHDD.sh | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index ddb702d..d1ea40e 100644 --- a/FAQ.md +++ b/FAQ.md @@ -464,15 +464,23 @@ Work Nodes for the process of producing a new sd card image release: * Remove `Ubuntu LIVE` USB stick and replace with `Ubuntu AIRGAP` * PowerOn Build Laptop (press F12 for boot menu) * Cut Power of RaspiBlitz, remove sd card and connect with sd card reader to build laptop + +Old: * Open `Disks` manager, select sd card and choose `Create Disk Image` (right upper corner window) * Store image to NTFS USB stick (click to start can take a while - enter password) * Open in File Manager the NTFS USB Stick, context menu the created IMG file `compress` * Name it: `raspiblitz-vX.X-YEAR-MONTH-DAY.img.zip` -* Delete all IMG files from NTFS (just keep zips) + +New: +* open terminal - check name if sd-card writer with `df` +* `dd if=/dev/[sdcarddevice] | gzip > /media/ubuntu/NTFS/raspiblitz-vX.X-YEAR-MONTH-DAY.img.gz` + +* Delete all IMG files from NTFS (just keep zips/gzs) * Context on white space, `Open in Terminal`, run `shasum -a 256 [NEW-ZIP] > sha256.txt` * [Do future author signing here with tools from airgap build machine] * Shutdown build computer * Connect NTFS USB stick to MacOS (its just readonly) +* Check if file can be unzipped on OSX * Run tests with new image * Upload new image to Download Server * Copy SHA256-String into GutHub README and update downloadlink diff --git a/home.admin/50torrentHDD.sh b/home.admin/50torrentHDD.sh index 1dc965b..bc44b5b 100755 --- a/home.admin/50torrentHDD.sh +++ b/home.admin/50torrentHDD.sh @@ -269,7 +269,7 @@ fi echo "" echo "*** Moving Files ***" date +%s -echo "can take some minutes... please wait" +echo "can take 10-60 minutes... please wait" sudo mkdir /mnt/hdd/${network} 2>/dev/null sudo mv ${targetPath1}/* /mnt/hdd/${network}/ sudo cp -r ${targetPath2}/* /mnt/hdd/${network}/ From b3d0db7ba0b1d5739f9ae8c5fdbb5a5101e39d1b Mon Sep 17 00:00:00 2001 From: jodobear <36855907+jodobear@users.noreply.github.com> Date: Sun, 17 Feb 2019 02:41:28 +0100 Subject: [PATCH 011/130] Update FAQ.md Added info on resolving blockchain data corruption. --- FAQ.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/FAQ.md b/FAQ.md index d1ea40e..bee9dc2 100644 --- a/FAQ.md +++ b/FAQ.md @@ -63,13 +63,13 @@ Copying a already synced blockchain from another computer (for example your Lapt 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`). -But we dont copy the data via USB to the device, because the HDD needs to be formatted in EXT4 and that is usually not read/writeable by Windows or Mac computers. So I will explain a way to copy the data thru your local network. This should work from Windows, Mac, Linux and even from another already synced RaspiBlitz. +But we dont copy the data via USB to the device, because the HDD needs to be formatted in EXT4 and that is usually not read/writeable by Windows or Mac computers. So I will explain a way to copy the data through your local network. This should work from Windows, Mac, Linux and even from another already synced RaspiBlitz. Both computers (your RaspberryPi and the other computer with the full blockchain on) need to be connected to the same local network. Make sure that bitcoin is stoped on the computer containing the blockchain. If your blockchain source is another RaspiBlitz run on the terminal `sudo systemctl stop bitcoind` and then go to the directory where the blochcian data is with `cd /mnt/hdd/bitcoin` - when copy/transfer is done later reboot a RaspiBlitz source with `sudo shutdown -r now`. -If everything of the above is prepared, start the setup of the new RaspiBlitz with a fresh SD card (like explained in the README) - its OK that there is no blockchain data on your HDD yet - just follow the setup. When you get to the setup-point `Getting the Blockchain` choose the COPY option. Starting from version 1.0 of the RaspiBlitz this will give you further detailed instructions how to transfere the blockchain data onto your RaspiBlitz. In short: On your computer with the blockchain data source you will execute SCP commands, that will copy the data over your Local Network to your RaspiBlitz. +If everything of the above is prepared, start the setup of the new RaspiBlitz with a fresh SD card (like explained in the README) - its OK that there is no blockchain data on your HDD yet - just follow the setup. When you get to the setup-point `Getting the Blockchain` choose the COPY option. Starting from version 1.0 of the RaspiBlitz this will give you further detailed instructions how to transfer the blockchain data onto your RaspiBlitz. In short: On your computer with the blockchain data source you will execute SCP commands, that will copy the data over your Local Network to your RaspiBlitz. -Once you finished all the transferes the Raspiblitz will make a quick-check on the data - but that will not guarantee that everything in detail was OK with the transfere. Check further FAQ answeres if you get stuck or see a final sync with a value below 90%. +Once you finished all the transferes the Raspiblitz will make a quick-check on the data - but that will not guarantee that everything in detail was OK with the transfer. Check further FAQ answeres if you get stuck or see a final sync with a value below 90%. **If you want to replace a corrupted blockchain this way:** *Go to terminal - maybe with CTRL+c. Then call `/home/admin/50copyHDD.sh` use the displayed SCP commands to copy over the fresh blockchain. Press ENTER when all is copied, so that the script can quick check the data. Then make a reboot `sudo shutdown -r now`* @@ -501,6 +501,6 @@ When the HDD is clean, then flash a new RaspiBlitz sd card and your setup should You could try to re-index, but that can take some very long time - multiple days or even weeks. -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) +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) \ No newline at end of file +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) From 0a85d779634f08c79dc2fe6569c0cb8cc1803094 Mon Sep 17 00:00:00 2001 From: PhoenixAdageyudi <2complacent@protonmail.com> Date: Sun, 17 Feb 2019 00:21:48 -0500 Subject: [PATCH 012/130] Update FAQ.md --- FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index d1ea40e..0ea9133 100644 --- a/FAQ.md +++ b/FAQ.md @@ -65,7 +65,7 @@ One requirement is that the blockchain is from another bitcoin-core client with But we dont copy the data via USB to the device, because the HDD needs to be formatted in EXT4 and that is usually not read/writeable by Windows or Mac computers. So I will explain a way to copy the data thru your local network. This should work from Windows, Mac, Linux and even from another already synced RaspiBlitz. -Both computers (your RaspberryPi and the other computer with the full blockchain on) need to be connected to the same local network. Make sure that bitcoin is stoped on the computer containing the blockchain. If your blockchain source is another RaspiBlitz run on the terminal `sudo systemctl stop bitcoind` and then go to the directory where the blochcian data is with `cd /mnt/hdd/bitcoin` - when copy/transfer is done later reboot a RaspiBlitz source with `sudo shutdown -r now`. +Both computers (your RaspberryPi and the other computer with the full blockchain on) need to be connected to the same local network. Make sure that bitcoin is stoped on the computer containing the blockchain. If your blockchain source is another RaspiBlitz run on the terminal `sudo systemctl stop bitcoind` and then go to the directory where the blockchain data is with `cd /mnt/hdd/bitcoin` - when copy/transfer is done later reboot a RaspiBlitz source with `sudo shutdown -r now`. If everything of the above is prepared, start the setup of the new RaspiBlitz with a fresh SD card (like explained in the README) - its OK that there is no blockchain data on your HDD yet - just follow the setup. When you get to the setup-point `Getting the Blockchain` choose the COPY option. Starting from version 1.0 of the RaspiBlitz this will give you further detailed instructions how to transfere the blockchain data onto your RaspiBlitz. In short: On your computer with the blockchain data source you will execute SCP commands, that will copy the data over your Local Network to your RaspiBlitz. @@ -503,4 +503,4 @@ 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) -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) \ No newline at end of file +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) From 30b18e1342c51a4872ec7d488ddfea1acb2f78cd Mon Sep 17 00:00:00 2001 From: openoms Date: Sun, 17 Feb 2019 18:50:44 +0000 Subject: [PATCH 013/130] add flip screen option to FAQ --- FAQ.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/FAQ.md b/FAQ.md index f3ca03c..b54b0d5 100644 --- a/FAQ.md +++ b/FAQ.md @@ -488,3 +488,8 @@ When you put in a sd card with a new/clean RaspiBlitz image the RaspiBlitz will But there might be cases where you want to start a totally fresh/clean RaspiBlitz from the beginning. To do so you need to delete the old data from the HDD. You can do so by formating it on another computer (for example with FAT and name it "NEW"). Or when you can run the script "/home/admin/XXcleanHD.sh -all" on the terminal. When the HDD is clean, then flash a new RaspiBlitz sd card and your setup should start fresh. + +## Can I flip the screen? + +For the default 3.5" LCD you need to edit the /boot/config.txt. Run `sudo nano /boot/config.txt` +look for the line `dtoverlay=tft35a:rotate=270` towards the end. To flip the screen with 180 degrees change the line to `dtoverlay=tft35a:rotate=90` and reboot with `sudo reboot`. Reference: https://github.com/goodtft/LCD-show/issues/34 From ae5f331942c4a7e5f59c5cda2e72730e4070ee4d Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 11:27:52 +0100 Subject: [PATCH 014/130] LND backup more instructions --- FAQ.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/FAQ.md b/FAQ.md index d1ea40e..2886820 100644 --- a/FAQ.md +++ b/FAQ.md @@ -121,7 +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 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 +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 + +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. + +**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.** ## What is this mnemonic seed word list? @@ -472,8 +482,9 @@ Old: * Name it: `raspiblitz-vX.X-YEAR-MONTH-DAY.img.zip` New: -* open terminal - check name if sd-card writer with `df` -* `dd if=/dev/[sdcarddevice] | gzip > /media/ubuntu/NTFS/raspiblitz-vX.X-YEAR-MONTH-DAY.img.gz` +* Connect and open in Filemenager NTFS - context on white scace -> open terminal +* run `df`to check on sd card reader device name +* `sudo dd if=/dev/[sdcarddevice] | gzip > ./raspiblitz-vX.X-YEAR-MONTH-DAY.img.gz` * Delete all IMG files from NTFS (just keep zips/gzs) * Context on white space, `Open in Terminal`, run `shasum -a 256 [NEW-ZIP] > sha256.txt` From 123d4a81905848cd5b6dcad64223e18a9f5dab07 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 11:32:27 +0100 Subject: [PATCH 015/130] fix "no reboot" after RTL install --- home.admin/00settingsMenuServices.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/home.admin/00settingsMenuServices.sh b/home.admin/00settingsMenuServices.sh index 0f2cfd4..843f77b 100644 --- a/home.admin/00settingsMenuServices.sh +++ b/home.admin/00settingsMenuServices.sh @@ -170,6 +170,7 @@ choice="off"; check=$(echo "${CHOICES}" | grep -c "5") if [ ${check} -eq 1 ]; then choice="on"; fi if [ "${rtlWebinterface}" != "${choice}" ]; then echo "RTL Webinterface Setting changed .." + anychange=1 sudo /home/admin/config.scripts/bonus.rtl.sh ${choice} if [ "${choice}" = "on" ]; then localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') From 906e2229c79adcabe2f9bc4f7ef1185d5b746b62 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 11:45:09 +0100 Subject: [PATCH 016/130] RTL version update --- home.admin/config.scripts/bonus.rtl.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/bonus.rtl.sh b/home.admin/config.scripts/bonus.rtl.sh index 204cb56..26781e5 100755 --- a/home.admin/config.scripts/bonus.rtl.sh +++ b/home.admin/config.scripts/bonus.rtl.sh @@ -46,8 +46,8 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then echo "*** Get the RTL Source Code ***" git clone https://github.com/ShahanaFarooqui/RTL.git cd RTL - #git reset --hard v0.1.13-alpha - git reset --hard v0.1.14-alpha + git reset --hard v0.2.1 + #git reset --hard v0.1.14-alpha # install From 92d4395abb870277ca7d6bcaf47357604a0efc0c Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 15:56:55 +0100 Subject: [PATCH 017/130] fixed dynDNS update url parameter --- home.admin/config.scripts/internet.dyndomain.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/config.scripts/internet.dyndomain.sh b/home.admin/config.scripts/internet.dyndomain.sh index 67f29e3..4a8ffc4 100755 --- a/home.admin/config.scripts/internet.dyndomain.sh +++ b/home.admin/config.scripts/internet.dyndomain.sh @@ -15,7 +15,7 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then turn="on"; fi dynDomain=$2 # 3. parameter [?domainName] -updateDynDomain=$3 +dynUpdateUrl=$3 # run interactive if 'turn on' && no further parameters if [ "${turn}" = "on" ] && [ ${#dynDomain} -eq 0 ]; then From a1d4f20c5784f1ce6d206faf72a19ad4bbb30c9d Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 17:07:20 +0100 Subject: [PATCH 018/130] small UI fix --- 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 fe36ef4..9b3571d 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -198,7 +198,7 @@ while : l2="ssh admin@${localip}\n" l3="Waiting for AUTO-UNLOCK" fi - boxwidth=$((${#localip} + 24)) + boxwidth=$((${#localip} + 26)) dialog --backtitle "RaspiBlitz ${codeVersion} (${localip}) - ${hostname}" --infobox "$l1$l2$l3$l4" ${h} ${boxwidth} sleep 5 continue From dc0fd31e07b6c6041b65fc0167c05def50c6b5dc Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 17:23:38 +0100 Subject: [PATCH 019/130] fix scripts parameter --- home.admin/config.scripts/internet.dyndomain.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/internet.dyndomain.sh b/home.admin/config.scripts/internet.dyndomain.sh index 4a8ffc4..ce2be62 100755 --- a/home.admin/config.scripts/internet.dyndomain.sh +++ b/home.admin/config.scripts/internet.dyndomain.sh @@ -11,11 +11,17 @@ fi turn="off" if [ "$1" = "1" ] || [ "$1" = "on" ]; then turn="on"; fi +echo "number of args($#)" + # 2. parameter [?domainName] -dynDomain=$2 +if [ $# > 1 ]; then + dynDomain=$2 +fi # 3. parameter [?domainName] -dynUpdateUrl=$3 +if [ $# > 2 ]; then + dynUpdateUrl=$3 +fi # run interactive if 'turn on' && no further parameters if [ "${turn}" = "on" ] && [ ${#dynDomain} -eq 0 ]; then From 2f452ca8a451b03b7ee145b67efe83c9170f4464 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 17:25:43 +0100 Subject: [PATCH 020/130] fix dialog paramter --- home.admin/config.scripts/internet.dyndomain.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/home.admin/config.scripts/internet.dyndomain.sh b/home.admin/config.scripts/internet.dyndomain.sh index ce2be62..fd9ee5b 100755 --- a/home.admin/config.scripts/internet.dyndomain.sh +++ b/home.admin/config.scripts/internet.dyndomain.sh @@ -26,6 +26,10 @@ fi # run interactive if 'turn on' && no further parameters if [ "${turn}" = "on" ] && [ ${#dynDomain} -eq 0 ]; then + # make sure dialog file is writeable + sudp touch ./.tmp + sudo chmod 777 ./.tmp + dialog --backtitle "DynamicDNS" --inputbox "ENTER the Dynamic Domain Name: For more details see chapter in GitHub README From e73372d6aef563de8ada268a357ad567c0edc7d2 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 17:35:34 +0100 Subject: [PATCH 021/130] fixing dynUpdateUrl bug --- home.admin/config.scripts/internet.dyndomain.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/home.admin/config.scripts/internet.dyndomain.sh b/home.admin/config.scripts/internet.dyndomain.sh index fd9ee5b..0010d87 100755 --- a/home.admin/config.scripts/internet.dyndomain.sh +++ b/home.admin/config.scripts/internet.dyndomain.sh @@ -91,7 +91,12 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then # setting value in raspi blitz config sudo sed -i "s/^dynDomain=.*/dynDomain='${dynDomain}'/g" /mnt/hdd/raspiblitz.conf - sudo sed -i "s/^dynUpdateUrl=.*/dynUpdateUrl='${dynUpdateUrl}'/g" /mnt/hdd/raspiblitz.conf + + # setting dynUpdateUrl is a bit cpmplicated because value can contain chars that break sed replacement + # so first remove dynUpdateUrl from config and then add fresh as new line at the end + grep -v "dynUpdateUrl" /mnt/hdd/raspiblitz.conf > /mnt/hdd/raspiblitz.conf + echo "dynUpdateUrl='${dynUpdateUrl}'" >> ${configFile} + #sudo sed -i "s/^dynUpdateUrl=.*/dynUpdateUrl='${dynUpdateUrl}'/g" /mnt/hdd/raspiblitz.conf echo "changing lnd.conf" From fe834f20c4586a828251f5f59d0e7807c25391df Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 17:41:48 +0100 Subject: [PATCH 022/130] fix replacing dynUpdateUrl parameter --- home.admin/config.scripts/internet.dyndomain.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/internet.dyndomain.sh b/home.admin/config.scripts/internet.dyndomain.sh index 0010d87..988c23d 100755 --- a/home.admin/config.scripts/internet.dyndomain.sh +++ b/home.admin/config.scripts/internet.dyndomain.sh @@ -94,8 +94,11 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then # setting dynUpdateUrl is a bit cpmplicated because value can contain chars that break sed replacement # so first remove dynUpdateUrl from config and then add fresh as new line at the end - grep -v "dynUpdateUrl" /mnt/hdd/raspiblitz.conf > /mnt/hdd/raspiblitz.conf - echo "dynUpdateUrl='${dynUpdateUrl}'" >> ${configFile} + grep -v "dynUpdateUrl" /mnt/hdd/raspiblitz.conf > /mnt/hdd/raspiblitz.conf.new + echo "dynUpdateUrl='${dynUpdateUrl}'" >> /mnt/hdd/raspiblitz.conf.new + sudo rm /mnt/hdd/raspiblitz.conf + sudo mv /mnt/hdd/raspiblitz.conf.new /mnt/hdd/raspiblitz.conf + sudo chmod 777 /mnt/hdd/raspiblitz.conf #sudo sed -i "s/^dynUpdateUrl=.*/dynUpdateUrl='${dynUpdateUrl}'/g" /mnt/hdd/raspiblitz.conf echo "changing lnd.conf" From aca7168a88cd4f1c95ada27b0be700fbc4c4b176 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 17:43:24 +0100 Subject: [PATCH 023/130] dynUpdateUrl fix --- home.admin/config.scripts/internet.dyndomain.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/home.admin/config.scripts/internet.dyndomain.sh b/home.admin/config.scripts/internet.dyndomain.sh index 988c23d..83cdd30 100755 --- a/home.admin/config.scripts/internet.dyndomain.sh +++ b/home.admin/config.scripts/internet.dyndomain.sh @@ -94,10 +94,10 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then # setting dynUpdateUrl is a bit cpmplicated because value can contain chars that break sed replacement # so first remove dynUpdateUrl from config and then add fresh as new line at the end - grep -v "dynUpdateUrl" /mnt/hdd/raspiblitz.conf > /mnt/hdd/raspiblitz.conf.new - echo "dynUpdateUrl='${dynUpdateUrl}'" >> /mnt/hdd/raspiblitz.conf.new + grep -v "dynUpdateUrl" /mnt/hdd/raspiblitz.conf > ./raspiblitz.conf.new + echo "dynUpdateUrl='${dynUpdateUrl}'" >> ./raspiblitz.conf.new sudo rm /mnt/hdd/raspiblitz.conf - sudo mv /mnt/hdd/raspiblitz.conf.new /mnt/hdd/raspiblitz.conf + sudo mv ./raspiblitz.conf.new /mnt/hdd/raspiblitz.conf sudo chmod 777 /mnt/hdd/raspiblitz.conf #sudo sed -i "s/^dynUpdateUrl=.*/dynUpdateUrl='${dynUpdateUrl}'/g" /mnt/hdd/raspiblitz.conf From ba8b71abdfd5ed267bf0595033d516e54a3bc0ac Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 17:57:33 +0100 Subject: [PATCH 024/130] added RaspiBlot credits --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1285519..35c87b9 100644 --- a/README.md +++ b/README.md @@ -574,6 +574,8 @@ You have still more questions? Check the [RaspiBlitz-FAQ-Archive](FAQ.md). Everybody is welcome to join, improve and extend the RaspiBlitz - its a work in progress. [Check the issues](https://github.com/rootzoll/raspiblitz/issues) if you wanna help out or add new ideas. You find the scripts used for RaspiBlitz interactions on the device at `/home/admin` or in this git repo in the subfolder `home.admin`. +Also get inspired for a deep-dive with the original "[RaspiBolt](https://github.com/Stadicus/guides/tree/master/raspibolt)" tutorial on how to build a lightning node on the RaspberryPi which was the base work the RaspiBlitz was developed on - so much thx to Stadicus :) + Join me on twitter [@rootzoll](https://twitter.com/rootzoll), visit us at a upcomming [#lightninghackday](https://twitter.com/hashtag/LightningHackday?src=hash) or check by on of our bitcoin meetups in Berlin ... every 1st Thursday evening a month at the room77 bar - feel free to buy me a beer with lightning there :) * [How can I get further help/support?](#support) From 6ee7a162f4b1ce6980c01fb61b7f735ab922dd51 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 18:41:12 +0100 Subject: [PATCH 025/130] added some cool off time after provision/update --- home.admin/_bootstrap.provision.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/home.admin/_bootstrap.provision.sh b/home.admin/_bootstrap.provision.sh index cd31025..7eb2c1e 100644 --- a/home.admin/_bootstrap.provision.sh +++ b/home.admin/_bootstrap.provision.sh @@ -157,4 +157,8 @@ else 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} +sleep 20 + echo "END Provisioning" >> ${logFile} \ No newline at end of file From c9da1b72ee2de3511a86ffb138bfd72848279e98 Mon Sep 17 00:00:00 2001 From: bluecell296 <43343391+openoms@users.noreply.github.com> Date: Mon, 18 Feb 2019 18:06:25 +0000 Subject: [PATCH 026/130] resolve conflict in FAQ --- FAQ.md | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/FAQ.md b/FAQ.md index b54b0d5..a88ae31 100644 --- a/FAQ.md +++ b/FAQ.md @@ -63,15 +63,15 @@ Copying a already synced blockchain from another computer (for example your Lapt 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`). -But we dont copy the data via USB to the device, because the HDD needs to be formatted in EXT4 and that is usually not read/writeable by Windows or Mac computers. So I will explain a way to copy the data thru your local network. This should work from Windows, Mac, Linux and even from another already synced RaspiBlitz. +But we dont copy the data via USB to the device, because the HDD needs to be formatted in EXT4 and that is usually not read/writeable by Windows or Mac computers. So I will explain a way to copy the data through your local network. This should work from Windows, Mac, Linux and even from another already synced RaspiBlitz. -Both computers (your RaspberryPi and the other computer with the full blockchain on) need to be connected to the same local network. Make sure that bitcoin is stoped on the computer containing the blockchain. If your blockchain source is another RaspiBlitz run on the terminal `sudo systemctl stop bitcoind` and then go to the directory where the blochcian data is with `cd /mnt/hdd/bitcoin` - when copy/transfer is done later reboot a RaspiBlitz source with `sudo shutdown -r now`. +Both computers (your RaspberryPi and the other computer with the full blockchain on) need to be connected to the same local network. Make sure that bitcoin is stoped on the computer containing the blockchain. If your blockchain source is another RaspiBlitz run on the terminal `sudo systemctl stop bitcoind` and then go to the directory where the blockchain data is with `cd /mnt/hdd/bitcoin` - when copy/transfer is done later reboot a RaspiBlitz source with `sudo shutdown -r now`. -If everything of the above is prepared, start the setup of the new RaspiBlitz with a fresh SD card (like explained in the README) - its OK that there is no blockchain data on your HDD yet - just follow the setup. When you get to the setup-point `Getting the Blockchain` choose the COPY option. Starting from version 1.0 of the RaspiBlitz this will give you further detailed instructions how to transfere the blockchain data onto your RaspiBlitz. In short: On your computer with the blockchain data source you will execute SCP commands, that will copy the data over your Local Network to your RaspiBlitz. +If everything of the above is prepared, start the setup of the new RaspiBlitz with a fresh SD card (like explained in the README) - its OK that there is no blockchain data on your HDD yet - just follow the setup. When you get to the setup-point `Getting the Blockchain` choose the COPY option. Starting from version 1.0 of the RaspiBlitz this will give you further detailed instructions how to transfer the blockchain data onto your RaspiBlitz. In short: On your computer with the blockchain data source you will execute SCP commands, that will copy the data over your Local Network to your RaspiBlitz. -Once you finished all the transferes the Raspiblitz will make a quick-check on the data - but that will not guarantee that everything in detail was OK with the transfere. Check further FAQ answeres if you get stuck or see a final sync with a value below 90%. +Once you finished all the transferes the Raspiblitz will make a quick-check on the data - but that will not guarantee that everything in detail was OK with the transfer. Check further FAQ answeres if you get stuck or see a final sync with a value below 90%. -**If you want to replace a corrupted blockchain this way:** *Go to terminal - maybe with CTRL+c. `sudo systemctl stop bitcoind` and `sudo systemctl stop lnd` then call `/home/admin/50copyHDD.sh` use the displayed SCP commands to copy over the fresh blockchain. Press ENTER when all is copied, so that the script can quick check the data and set the correct permissions. Then make a reboot `sudo shutdown -r now`* +**If you want to replace a corrupted blockchain this way:** *Go to terminal - maybe with CTRL+c. Then call `/home/admin/50copyHDD.sh` use the displayed SCP commands to copy over the fresh blockchain. Press ENTER when all is copied, so that the script can quick check the data. Then make a reboot `sudo shutdown -r now`* ## How do I clone the Blockchain from a 2nd HDD? @@ -121,7 +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 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. +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 + +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. + +**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.** ## What is this mnemonic seed word list? @@ -464,15 +474,24 @@ Work Nodes for the process of producing a new sd card image release: * Remove `Ubuntu LIVE` USB stick and replace with `Ubuntu AIRGAP` * PowerOn Build Laptop (press F12 for boot menu) * Cut Power of RaspiBlitz, remove sd card and connect with sd card reader to build laptop + +Old: * Open `Disks` manager, select sd card and choose `Create Disk Image` (right upper corner window) * Store image to NTFS USB stick (click to start can take a while - enter password) * Open in File Manager the NTFS USB Stick, context menu the created IMG file `compress` * Name it: `raspiblitz-vX.X-YEAR-MONTH-DAY.img.zip` -* Delete all IMG files from NTFS (just keep zips) + +New: +* Connect and open in Filemenager NTFS - context on white scace -> open terminal +* run `df`to check on sd card reader device name +* `sudo dd if=/dev/[sdcarddevice] | gzip > ./raspiblitz-vX.X-YEAR-MONTH-DAY.img.gz` + +* Delete all IMG files from NTFS (just keep zips/gzs) * Context on white space, `Open in Terminal`, run `shasum -a 256 [NEW-ZIP] > sha256.txt` * [Do future author signing here with tools from airgap build machine] * Shutdown build computer * Connect NTFS USB stick to MacOS (its just readonly) +* Check if file can be unzipped on OSX * Run tests with new image * Upload new image to Download Server * Copy SHA256-String into GutHub README and update downloadlink @@ -489,6 +508,14 @@ But there might be cases where you want to start a totally fresh/clean RaspiBlit When the HDD is clean, then flash a new RaspiBlitz sd card and your setup should start fresh. +## My blockchain data is corrupted - what can I do? + +You could try to re-index, but that can take some very long time - multiple days or even weeks. + +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) + ## Can I flip the screen? For the default 3.5" LCD you need to edit the /boot/config.txt. Run `sudo nano /boot/config.txt` From 657d0c5ea7292a6d2aadcc21dc6a05ec5b37d40f Mon Sep 17 00:00:00 2001 From: bluecell296 <43343391+openoms@users.noreply.github.com> Date: Mon, 18 Feb 2019 18:08:13 +0000 Subject: [PATCH 027/130] resolve conflict in FAQ --- FAQ.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/FAQ.md b/FAQ.md index a88ae31..7d8ac83 100644 --- a/FAQ.md +++ b/FAQ.md @@ -515,8 +515,3 @@ 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) - -## Can I flip the screen? - -For the default 3.5" LCD you need to edit the /boot/config.txt. Run `sudo nano /boot/config.txt` -look for the line `dtoverlay=tft35a:rotate=270` towards the end. To flip the screen with 180 degrees change the line to `dtoverlay=tft35a:rotate=90` and reboot with `sudo reboot`. Reference: https://github.com/goodtft/LCD-show/issues/34 From fd2bed759eb1effb90306de99b3bd70c578cd335 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 19:13:10 +0100 Subject: [PATCH 028/130] final build notes --- FAQ.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/FAQ.md b/FAQ.md index 7d8ac83..7e5f576 100644 --- a/FAQ.md +++ b/FAQ.md @@ -474,18 +474,9 @@ Work Nodes for the process of producing a new sd card image release: * Remove `Ubuntu LIVE` USB stick and replace with `Ubuntu AIRGAP` * PowerOn Build Laptop (press F12 for boot menu) * Cut Power of RaspiBlitz, remove sd card and connect with sd card reader to build laptop - -Old: -* Open `Disks` manager, select sd card and choose `Create Disk Image` (right upper corner window) -* Store image to NTFS USB stick (click to start can take a while - enter password) -* Open in File Manager the NTFS USB Stick, context menu the created IMG file `compress` -* Name it: `raspiblitz-vX.X-YEAR-MONTH-DAY.img.zip` - -New: * Connect and open in Filemenager NTFS - context on white scace -> open terminal * run `df`to check on sd card reader device name * `sudo dd if=/dev/[sdcarddevice] | gzip > ./raspiblitz-vX.X-YEAR-MONTH-DAY.img.gz` - * Delete all IMG files from NTFS (just keep zips/gzs) * Context on white space, `Open in Terminal`, run `shasum -a 256 [NEW-ZIP] > sha256.txt` * [Do future author signing here with tools from airgap build machine] From cf8cba1a595c8b758f7f3ea700e7657407eb1034 Mon Sep 17 00:00:00 2001 From: bluecell296 <43343391+openoms@users.noreply.github.com> Date: Mon, 18 Feb 2019 18:22:35 +0000 Subject: [PATCH 029/130] resolve conflicts in FAQ --- FAQ.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/FAQ.md b/FAQ.md index 7d8ac83..7e5f576 100644 --- a/FAQ.md +++ b/FAQ.md @@ -474,18 +474,9 @@ Work Nodes for the process of producing a new sd card image release: * Remove `Ubuntu LIVE` USB stick and replace with `Ubuntu AIRGAP` * PowerOn Build Laptop (press F12 for boot menu) * Cut Power of RaspiBlitz, remove sd card and connect with sd card reader to build laptop - -Old: -* Open `Disks` manager, select sd card and choose `Create Disk Image` (right upper corner window) -* Store image to NTFS USB stick (click to start can take a while - enter password) -* Open in File Manager the NTFS USB Stick, context menu the created IMG file `compress` -* Name it: `raspiblitz-vX.X-YEAR-MONTH-DAY.img.zip` - -New: * Connect and open in Filemenager NTFS - context on white scace -> open terminal * run `df`to check on sd card reader device name * `sudo dd if=/dev/[sdcarddevice] | gzip > ./raspiblitz-vX.X-YEAR-MONTH-DAY.img.gz` - * Delete all IMG files from NTFS (just keep zips/gzs) * Context on white space, `Open in Terminal`, run `shasum -a 256 [NEW-ZIP] > sha256.txt` * [Do future author signing here with tools from airgap build machine] From 88ebb149a1abb70fdb89429ca04ae4b08515373c Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 20:52:32 +0100 Subject: [PATCH 030/130] added torrent of v1.0 image --- README.md | 5 ++++- raspiblitz-v1.0-2018-02-18.torrent | Bin 0 -> 26375 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100755 raspiblitz-v1.0-2018-02-18.torrent diff --git a/README.md b/README.md index 35c87b9..5a021cd 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,10 @@ 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**: -(PLEASE BE PATIENT - IMAGE v1.0 IS COMING SOON) + +http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-02-18.img.gz +SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f +Torrent-Download: 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 diff --git a/raspiblitz-v1.0-2018-02-18.torrent b/raspiblitz-v1.0-2018-02-18.torrent new file mode 100755 index 0000000000000000000000000000000000000000..a1969868e8ec6579530c683b10c991e3b9e497aa GIT binary patch literal 26375 zcmagEQ>-vN6fJmc+qP}nwr$(CZQHi-9ox2TYyP>)|O1QO_>?ETumIf=;>XY42`W#o#?Dwon4$wO-<-5UAP#Tnb{ec{|}bd#?slv#^(Qb ziKz_>^Z&(aZ13P;>g4R|WcFVO7i%syPBu>Z|DA)W4KwTi!rMET+R>Sq+S=P$TGBaN z{*Mg)KR6bq|AjL#wX<}lb9OPb`G0eEbuj&}wKe^}XiXUzxQv}l4P8u42#h@c+lZ@* zy_1uvoeMo92Rp-m{r@p(X>Uhh@*l>Mk(HH!m64N?joFlg%hb-;-o(<*oRv#eMU0k% zh0D^;%-)2J%f{5s+{MC@iJggwfs=ueiP@Be%g)f&l$n{!$12Cm+t?=L{z z*!UBfS-~^Pz;UW8KClqfkV0lm(4m-H1JcO9(#lB%(Q*z!haZ(j zS(GuBGh|bU1|qor1gePEMb#JKZ9v^1y7nC|rjN?05Y^eFP)%CRsn%-6G7cn@3^PU3 z;#>25jA@G8cGOm4tXtv5Ao1~nBf0fYYqW7GvsF^tztz=a64#ZC+#CP8D3xkHlzC#co7hYZX`@bjk9rnlha&@nai+lMxo@SN(o>=&Yf(u9vH^qSYQgM z(ful>(r=_CfeGg8dAH*WIR~UNjph9e5?UX%@0)HNb)~(YDL`vfkMB1>sxZU32s@fH zG~i+=G*8{kv*uJ`3}#0!^KvkzCrCNj62`dId?dT-ts-P74q^2X*xbkyvEdPtFzQyS zoG|u*W8bKEtrK21&6z4OTwFQ0X9nAb%VgWa1iN^G4yiWtY4LJV53?4p**a}+x@ zQYK0hi_BZScyWQK==UbcZ{oisatu6ZxbDYvVx z5%ZWtxpP^S%{G8Cb0O*zI6gx<`>=@<(aZEVv|jl;_@S{5VQC@NxB|*vX1Y#m(0j` zOtjXFW-*87v-O&0Am5~n6zohG+N5?SHXwc?sWfxrt3{ZJ?OE>_BZS0(jjWxsgep9mr zb55xtS;*#fy4`v{%Br)EyvC#m=UZL8(hl(K@iH70=-}XLTFFertvQ4to(iRb{szdbK zhbb zQ*zPh5tADNFnt^qFTztU$P~mDFD0NqaPJa%;i)Lk6OU?z+^st2|tVc;=Snt{5kQh-scfWbF5zTbi9rwmV zxR*>cKQ=SBVY$688%k86t8}%OWddA5f{jLEy~aw(<0xoZ;eST?jt}2uRic-)!ts=o z_QpE_GdSMmC_O(W>h}A&D02HZc*NNkkCCojh)s5oG+e?Y*RI2gR#<%N9h4wb9TdS3 zLm`hNEYi}I%(Pi_zXOUD`Bb!_0tOT2#y3}%R0_P=k$D~Hg`9^~0bT-fwvDA9xkJBq zO=_03QjXAmx4LDBMf{}ynr<%9=dFTs?Wz+8o8=^U7a)Wp6SrR-vtwnE@hR zCDFE192snA)+8F8MxrVk)%I;Pq2RQXRRm2IGseU~F!!EK@#KwOmRWSZfP8r~SGV=} z_`5T3famf-Tx!dGugN`ELXn3l#0`7uR&>8waj3s|U8;NjI@)xkJ0E*6V3n;apefAj z(AiqGIpN_)-GXTAC@_$vFOOi*^e^Z@h>7jPH9+RGC{SO~>uvr2wZY(8?YLQUMd6}- zzjV*|q7KPtSX{`}_*pdpC+`u48Z~6%qdc=~BsK*^`JH%YSW)7?gF)%#O44eh(c+%W zmu^IjW8?np@`DdmljDd5Xy9XC@MM6(lh0$9MjGGYNyzEt@o;6(8Zat#a}k%QXNkji zdm?%`UrNq9A9W9zAw|Zd3Nr{i@UOWW>RiEcFB$0+9wE$-Am6>VFdg-f{%zJhXLac2 zu5^nWodr&n#z!E63{ST09}Z{W;uyGwqLeOexe4o(74$Ur}0a7)H{5l>RCmu7EWK zCuMK%`)J)F^lje_|KZ{Y>_?#Gm|8<-|NHHqZFnm)-hDT{d6olaT7m@Q}??nm4Oo){(a3Lc|g6lsYDbq$i@g@JVjBxb=~5`8=0Y zcCgy&IL0Tx&paM`b6S~4Ma7|Jbf#n__vk#zM{rZ-ci0%!{4g~i>VA&EQFC+Bra%gM zZhI|Hqv(m1hwDlJRE`7w=MVvvQZ{wV{WdMc!arb~SOlR_TUK#`p>|@|=4?a@ z3z70+HVw7lTjV_K;=(wFlpblbFiu`vciB5$YV)#4^o_E1ma7Xs4kJ;e-s>9^SZfg@ zbAZI@+onBp2C)@uqB3pNYEtfE*gr9)YS7gTtf#tW|rgvG1M zoU+CXOpoT1RYZ|ZtMu|#)2!|GNK8=&vp2&q2yHyM=-C#GZpj$ObcKcNiwAdkB40Xv zcu-NWoiMmSZ+u0?nr)p<9}iA=tiO1miQw$owzRgq1rJ^8Fp(i(gj5d^Oq+eU+s45( zy6g2mytdCPv5!FU4iAkMr0$+OC`b*4kF_eh-MehBo=;)sZjJb0P~>v8n!{GFT?Ms) z0A=n6bpb>I9E5WzqG7di!3>hVvc6#~PUGS4Uc8u#N3JsZ@HI{4p?CrH)CxuVeWsh| ztjp+ROnmK*QX&y=tSH;mK`?O4nvmd2OgOBmuCYpOsmfpi)_=e4n;b$Pc6-5C7Y-|e zrY9PqQoD()x3l18aAxEEs`a$I|DIu?)WdTMGRR9?quKv>GC=2FK>{#bBcOw6Q_Q1J z^*Zjze2t84pb7nur03hf?Lg_hq%`4BOjE>?#OqiyIgY8&e||KU?j{!ve&1+uR7F`g z;q^~0Rad~Ytm`a^792-U17;o4##QM;E+ueu=j;>;LwWmlJu|tUbpB#y z@SBAUqY>G}hK+Yp`D73QkJ%sGbEi7K0D_Ej%>X56!-OjZpM)`#yp>_;9k6;t+MjR! za}n-NCRgxtmi=8Csq-B%J1KA{OTO;Vx%iI|g$yZIw+IV>hHSOOO5;dEAJt)R>PWZl zlhn87Pwj}HWNQI0I(CMr7t>3Ze=c#BfiilWg@#O(=IV<}8prYBU56Y-D^+BM0 zBxYkoD@WA)@nH>^@p@FLaH8R~l|Ydqp#0`%zb>S!{h+A8vdU=Po=6iv6sIgHfozrBAAC~|g}|KMWV zANNO~k`I<}0QLfns?6rN!}WT&3lx3!nM+2=nz7`KI!8Xv_Oql`WFnHhnq5|@1KOz_ z)36KF_Iw-H$(JKLoiT^d@GQ6r<*gJB|0GjtsY+H?XgsQ*TV*+Zp1}@Yo5iMLoQ`)nI*?FUSJh7JFXQS&nG#3eL}6;}|3w^uG_thTyWaN(&?MD`xpI?Q`(WtBD)j+C;>ooHgB!lS2m04v0bfS7#P!=e;NGg($mhZ>YB zI1%hfhewc3npU6`UiD6irIIvcxIG!S_3=JVA-*d7bCEJG9^zKqoWlkYBz>q&j%< z(A02IMdXgo_q$-G8#f1doQ_?A6ho6|^fLY1!KniRl@4RolsPmCdcIbA6bvf>40{WK zP^X*A8qsybvxc2icR1fJkyTFxJ7=I$lM6rqAUE(xD0C!uoEeWpb<%VlF*UV_uNu2M6$zNRR$johvcG2f3eZ1oTGd**}?J5wgzHoDcJU0s3lWAkWjgU(MZ zcjw4T&TPXl?;N>=apy&RVus9{V*C8A0uK4XcxJ@D6i?{?mbu_76!Z2n;gqy1Fk?y73L=@hEi%PvQQkcD2ngz8%|TQ* zj=qg`)Hs_GDJ*za4e2OX)>!rp8l$1SjRaTGWT(l)J%!(~ zmngw}hcC-tHi%G*T)Fk$Z_TQoaY$nVWS>DLqF^uxqlpGC2j&RIeID+57?k?Hm0Abk_UJSWi% zN4~CQ0vhb>5IGBT-%-_pcxfJel6z`=bJoZpl|@g1?Ma8iHBl^@0v@KFCsCsgugH7a z=G_*|_thbosaPeXyB;HCj3Upu`EoiI&o)sFPQ5KiF`EL8YnMMdC~n;5B`P7CO|yQ7 zRUt=lNVvrS^B(p6yvK=68`eS*mvSV!mo5tkB$6vjb*u<2m>fdDo^ep=;xS)=105n^ zv_+DBSQk&AW;}+BRY})T?wyT_nKZWY=7ic#!qH;{&^gpQD$byw2_72J1Pey2A^NQu zHz-WE;>~0(;5Mf;&j&Lh=IQA8xt=4O1n?APmTojUoc9vS=vaFAR30p_P=so%n`#SM zT_+Cicq};;I0NIC)yMQzu~frNC+tOG^7C8?hrc98(fSUyRgC`!wBOIw`j){CYw4;5P#bD) zeQo8F9*4zLCWb`@N835bF6T;4oZ{@W04|C2Pq9P{y;4})P?z%huE(z8u05=Mypmmr zo-NH(Z~v(ko3gu;iq&p%MRLkf%B-1z?wR#P+XSQj?!?Dva_) z>Y?zhIwa|#Hpa|^uHQpgif;qRP+fKr!_3km3`1 z5*%eZ4-<$XPRux!7Q8O3u9vuNYm6)%N1AP6fVS;6!^DxIx`JlxlvE16EBO$^HN+j2 zoEY3RJe%&3E^YxVlM#YXN*gQO|M{0}s8X(10mUgmLw+Lt;@8{6|Ke!fDfH%q#GsR8 zd8L9EDzK58pw+AmpL_douq+bE7KaLF<*Kb!C&3J4C-EPUV>v52s=xA5#(Sy>1Ysr| zP_zGo^&%KW_|f=blXP*_6)q7X8RTBTFo6n<$ z?pj(1)W-1b10-4h(-70XNF9WfQiol;cG(*!=!qhAinNuzxTrw-8#R2y9(Lu^b*Fkc zwf^H-Son#(YnC1->C$25h54|VPiMZ ze2*^9>n-!KUS4GcDVeNgNi{)C5a_WuG^qq>^_j zh#+JCNV^P&${AC%%~4wc)iS7O7d$t`OTAv^S<_WArvWRTN_^<%f;x(~R^bsnaRe!d zyvxAPQep)OQU_W2DzF8^)Vz9`;};X70KVBPnP=Y04OJ>$4kpTz@%z(+rYI|k%kz<` z0Ry}fEbH|W&zj$GqzQ<$lyA;bX7#^l*BG)7L~Cu_3yf1xmGI)-qbqGJ#A77ott%<^ zcsij~rXHbq)i=)u&u@ z|A;0E#JC8!L3vLOK>*2kO!+du(pV=nB+ZKa?r$i5AIMT;M!DG}T;e8DSIhAM)W)6H z0D-qLYoqjksXdNHsZIe%<#o6OGsgnX)l=KtkA$h)K~+v%l(9Mai(c|*Cu=8Uc`arE zYSn3#2>s=JnK1e)UP`9ZC$#f&5=PVg>%UEx5P7X==k1%>FNui_3hr-w#fRYonwl{G zl+KMOy6Gle%WqyPJqT#vQZ)n!k4FwQAOnu;7!W3A>O6E`jR=ZOE9QI{PWjGT z<)V5>wQxkRK5&lTxzpfB%SUx_wz|r80nm%$edP2$y3Km-MBOQxOcX#ctz84YA~u6nX&j7{Z`NBS~t$>_73TA{gZ#W}2_)56R?6i-`3n7E4sU*FqwGpZv-#%yZyl3g_aPhG(U%zIMX_(4%CHbQ&G{& z0ApuR+PP)?t7mHK#NVR1$oQ(324}1WqJ{V(nx3_`Jzg^(`xii_#B}sGB4x})Lcu`UN1X;17*fRt4XA()OB|lJ; z;t%D}>fvC(uV%112XC@m55BAb4jw`m9lzw!P$8ghCDq?;lpmUy?1LtAJJd+ER-qav29 z_u}m4T-m&rvYRo*IR03@ih?@kT5$yp3aB^fwK3u?HWr2?y8&L{(KZE@jPJ(G zZX$s)-Q>CT^Tf{}a!W0io+&p>S4>X!56}agbwoo2x(lh)pUAzE!i?HLN&L}!xfRqm z7npJ^>Z($U>~hMn{C*+mZHG!9LhNMjR1fM%FN@3EGKxmbPsOynoLO9NdG#O6Sj>RH zF}S$|8FnSx=XWLKHp@!cL#69*`tM9ii#M#JCL0z+%*iiIi-NlcsJ{gHz~zX~lEDG` z_|K&0Z%`*m@dvr>auC@N$#sG#xa|Tt+My$Up>Vlu0wKbB7M#I`<~Tfcq-?ykKU?1k z`Tdt+RyQK~g!6+Z`VNY(-Db1W(B^yU>O6im*uvYvBcBCP`)J6ImP8{uXLe;R9%dga zaJZ?qjDa!Ig{azX)U&7%LVw}b7seHn8U8TG`f_}xrI8i6Xt4YiVM8z5ru`g*&1Z&I zCmO;e4ixo{6MgfN?lexY1i4sIzp=xgCaD>;89`)Ldbl|YrqUl@;zFldoC`2po+yRG z+(}EQ_GVQUuX{=BiIg_uP^oB_Qd>>3SaZ|eP;&J{F;H7oG)s8#egfx5onjktvr0K$ zXKW`Ghago5!X4iRnlVS~It+N`%u|8bjlvFsy^lqih9fb{7W_zk(0l({{@KZ>wsbRV z2zR+YGx-V1V$H&s7s?)0xl{;9m^Owu@v4%S+gBtYZh~M-v?-!Y;I-80dUg^ z>pEs1WnQyXm}PPGfS_}i)f9;I2Tvdg!e3wH>^mflo=W*p0i3BiQI4=e8BLp!a6e@m zLWqOz0vD)Aw@VB8a2Uy$Y~L)?6);_&k?!=ZMl?TFuyIarS{(zoGfn_WFV9vXRNQTM z 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 literal 0 HcmV?d00001 From 82449702ac7adde52f1c1b0af38ffa26c0233e2e Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 21:31:10 +0100 Subject: [PATCH 031/130] v1.0 http/torrent image release --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5a021cd..5f51077 100644 --- a/README.md +++ b/README.md @@ -81,9 +81,9 @@ Your SD-card needs to contain the RaspiBlitz software. You can take the long roa 1. Download SD-Card image - **Version 1.0**: -http://wiki.fulmo.org/downloads/raspiblitz-v1.0-2019-02-18.img.gz +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-2018-02-18.torrent SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f -Torrent-Download: 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 e327a404ed13efb8c77dcca50d18423fea0ac0cc Mon Sep 17 00:00:00 2001 From: rootzoll Date: Mon, 18 Feb 2019 21:32:42 +0100 Subject: [PATCH 032/130] v1.0 http/torrent image release --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5f51077..5efad32 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,9 @@ Your SD-card needs to contain the RaspiBlitz software. You can take the long roa 1. Download SD-Card image - **Version 1.0**: 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-2018-02-18.torrent + SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f 2. Write the SD-Card image to your SD Card - if you need details, see here: From 9e8a42dc8268d415410246e4e9a3e14b309c39c1 Mon Sep 17 00:00:00 2001 From: openoms Date: Mon, 18 Feb 2019 22:16:33 +0000 Subject: [PATCH 033/130] general guide for dietpi --- FAQ.md | 5 ++ dietpi/Odroid_HC1_HC2.md | 121 ++++++++++++++++++++++++++++++++++++ dietpi/README.md | 129 +++++++++++---------------------------- 3 files changed, 160 insertions(+), 95 deletions(-) create mode 100644 dietpi/Odroid_HC1_HC2.md diff --git a/FAQ.md b/FAQ.md index 7e5f576..eda7d0f 100644 --- a/FAQ.md +++ b/FAQ.md @@ -506,3 +506,8 @@ 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) + +## Can I flip the screen? + +For the default 3.5" LCD you need to edit the /boot/config.txt. Run `sudo nano /boot/config.txt` +look for the line `dtoverlay=tft35a:rotate=270` towards the end. To flip the screen with 180 degrees change the line to `dtoverlay=tft35a:rotate=90` and reboot with `sudo reboot`. Reference: https://github.com/goodtft/LCD-show/issues/34 \ No newline at end of file diff --git a/dietpi/Odroid_HC1_HC2.md b/dietpi/Odroid_HC1_HC2.md new file mode 100644 index 0000000..84746af --- /dev/null +++ b/dietpi/Odroid_HC1_HC2.md @@ -0,0 +1,121 @@ + +![](pictures/DroidBlitz.jpg) + + +## Download the fully prebuilt RaspiBlitz-on-DietPi SDcard image for the Odroid HC1 / HC2 / XU3 / XU4 + +for the Odroid HC1 / HC2 / XU3 / XU4 from this [torrent](https://github.com/openoms/raspiblitz/blob/raspiblitz-dev/dietpi/RaspiBlitz1.0_OdroidHC1_DietPi6.21.1.torrent) or from [mega.nz](https://mega.nz/#F!EVNAAQiB!ZyLHP2dJMRSVjZOTCQMIYA). +(sha256sum RaspiBlitz1.0_OdroidHC1_DietPi6.21.1.img: +96ee8700f52a12fb5b13fab3fffcdcf5d364c6dd16c580d969e421cef2cd7cc2) + +Steps to run: +- download the .img file, +- burn to a 16 GB SD with [Etcher](https://www.balena.io/etcher/) +- extend the rootFS partition with a partition manager (disks, Gparted, etc.) +- boot the Odroid with the SDcard and login with ssh admin@at.your.raspiblitz.ip, password: raspiblitz + +Using this image you can skip the rest of this guide as it is mostly about how this image was built. + +The setup continues with the [RaspiBlitz Setup Process](https://github.com/rootzoll/raspiblitz/blob/master/README.md#setup-process-detailed-documentation) + +--- +## Setting up the DietPi OS + +### Download the updated DietPi image + +For the Odroid HC1 / HC2 / XU3 / XU4 a v6.20.6 DietPi image with fail2ban installed is uploaded [here]( +https://mega.nz/#!AcdVBAbR!O-W3jP5LUgw7lMY8S9XcBWcKX3IhRNAAFmaYzDXIUC0). (sha256sum DietPi_v6.20.6_OdroidXU4-ARMv7-Stretch.img: +1459b91f66b9db98f3437c31231e44497b7b7dcd9146d2cc41a3da653f9a9215) + +Burn to the SDCard with [Etcher](https://www.balena.io/etcher/) and extend the rootfs partition to the size of your card with a partition manager. + +Insert the SDcard into the Odroid. + +Power up and continue with: [Run the DietPi optimized Raspiblitz SDcard build script](#Run-the-RaspiBlitz-build_sdcard.sh-script) + +### Build your own DietPi image: + +Watch out this an ardous process. +Updating from a v6.14 DietPi image is causing a bootloop under some circumstances. Will be sorted once the current, >6.2 version is uploaded for the Odroids. + +For the Odroid HC1 / HC2 / XU3 / XU4 the start is this image: +https://dietpi.com/downloads/images/DietPi_OdroidXU4-ARMv7-Stretch.7z +Burn it to the SD with [Etcher](https://www.balena.io/etcher/) + +Getting started with DietPi: https://dietpi.com/phpbb/viewtopic.php?f=8&t=9#p9 + +In the desktop terminal on Linux / MacOS or Putty on Windows: + +`ssh root@[IP-OF-DIETPI]` +password: `dietpi` + +Ok > Cancel > Cancel +automatic apt update & apt upgrade and asks to reboot +![](pictures/dietpi_1st_reboot.png) + +`ssh root@[IP-OF-DIETPI]` +after the previous update the ssh keys might change: + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +run (can be copied from the terminal output): +`ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` + +`ssh root@[IP-OF-DIETPI]` +yes > +password: `dietpi` + +At this point if the DietPi was not updated from 6.14 it does not manage to save settings going forward. +Exit the sotware installer (press Tab to jump to Exit) +![](pictures/dietpi-software_exit.png) + +in the bash prompt run: +`dietpi-update` +>Ok > Cancel the recovery point +update > >Opt out of survey > Ok +Reboots + +`ssh root@[IP-OF-DIETPI]` +password: `dietpi` + +>Ok > Cancel > Cancel +Search `fail2ban` > Space to select > Enter +SSH server > switch from Dropbear to the OpenSSH-server +> Install > Ok +>Opt out of survey > Ok +Reboots again + +Changing the SSH server will change the SSH keys again. To clear: +`ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` + + +## Run the RaspiBlitz build_sdcard.sh script + +In the desktop terminal in Linux / MacOS or Putty in Windows: + +`ssh root@[IP-OF-DIETPI]` +password: `dietpi` +Should end up here on version v6.20.6 or higher: +![](pictures/bash_prompt.png) + +run the build_sdcard.sh script in this format: +`wget https://raw.githubusercontent.com/[GITHUB-USERNAME]/raspiblitz/[BRANCH]/build_sdcard.sh && sudo bash build_sdcard.sh [BRANCH] [GITHUB-USERNAME]` + +Be aware of that the fork needs to be called `raspiblitz` for the git download to work. +if you intend to use @openoms`s forked version: + +`wget https://raw.githubusercontent.com/openoms/raspiblitz/raspiblitz-dev/build_sdcard.sh && sudo bash build_sdcard.sh raspiblitz-dev openoms` + + +`ssh admin@[IP-OF-DROIDBLITZ]` +password: raspiblitz + +The setup continues with the [RaspiBlitz Setup Process](https://github.com/rootzoll/raspiblitz/blob/master/README.md#setup-process-detailed-documentation) + +--- +### Examples of copying the blockchain data from a HDD using a powered USB to SATA adapter + +![example setup](pictures/HDD_copy_example.jpg) +![](pictures/adapterHDD_HC1.jpg) diff --git a/dietpi/README.md b/dietpi/README.md index 5fda129..8a993dc 100644 --- a/dietpi/README.md +++ b/dietpi/README.md @@ -1,4 +1,4 @@ -# ⚡️ RaspiBlitz on DietPi ⚡️ +# ⚡️ RaspiBlitz-on-DietPi ⚡️ # A hardware agnostic platform @@ -9,128 +9,67 @@ This guide was tested on: * Raspberry Pi 3 B Plus - no LCD support so far * hoping to extend this list with more compatible boards especially the ROCK64 -See the hardware specs: [hardware specs](hw_comparison.md). +See the [hardware comparison](hw_comparison.md). -![](pictures/DroidBlitz.jpg) - -## Download the fully prebuilt RaspiBlitz on DietPi SDcard image - -for the Odroid HC1 / HC2 / XU3 / XU4 from this [torrent](https://github.com/openoms/raspiblitz/blob/raspiblitz-dev/dietpi/RaspiBlitz1.0_OdroidHC1_DietPi6.21.1.torrent) or from [mega.nz](https://mega.nz/#F!EVNAAQiB!ZyLHP2dJMRSVjZOTCQMIYA). -(sha256sum RaspiBlitz1.0_OdroidHC1_DietPi6.21.1.img: -96ee8700f52a12fb5b13fab3fffcdcf5d364c6dd16c580d969e421cef2cd7cc2) - -Steps to run: -- download the .img file, -- burn to a 16 GB SD with [Etcher](https://www.balena.io/etcher/) -- extend the rootFS partition with a partition manager (disks, Gparted, etc.) -- boot the Odroid with the SDcard and login with ssh admin@at.your.raspiblitz.ip, password: raspiblitz - -Using this image you can skip the rest of this guide as it is mostly about how this image was built. - -The setup continues with the [RaspiBlitz Setup Process](https://github.com/rootzoll/raspiblitz/blob/master/README.md#setup-process-detailed-documentation) - +### Downloads and walkthrough for the [Odroid HC1 / HC2 / XU3 / XU4](Odroid_HC1_HC2.md) --- -## Setting up the DietPi OS - -### Download the updated DietPi image +## General Guide for RaspiBlitz-on-DietPi -For the Odroid HC1 / HC2 / XU3 / XU4 a v6.20.6 DietPi image with fail2ban installed is uploaded [here]( -https://mega.nz/#!AcdVBAbR!O-W3jP5LUgw7lMY8S9XcBWcKX3IhRNAAFmaYzDXIUC0). (sha256sum DietPi_v6.20.6_OdroidXU4-ARMv7-Stretch.img: -1459b91f66b9db98f3437c31231e44497b7b7dcd9146d2cc41a3da653f9a9215) +### Setting up the DietPi OS -Burn to the SDCard with [Etcher](https://www.balena.io/etcher/) and extend the rootfs partition to the size of your card with a partition manager. +* Start with an ARM based Single Board Computer listed on DietPi.com. +At least 1GB RAM is recommended. +Look for the SD card image for the specific SBC in the [download section](https://dietpi.com/#download). -Insert the SDcard into the Odroid. +* Burn the image to the SDCard with [Etcher](https://www.balena.io/etcher/) and extend the rootfs partition to the size of your card with a partition manager. -Power up and continue with: [Run the DietPi optimized Raspiblitz SDcard build script](#Run-the-RaspiBlitz-build_sdcard.sh-script) +* Insert the SDcard into your SBC. -### Build your own DietPi image: +* Connect the HDD with a powered suitably powered adapter. +A USB 2.0 port will not be able to power an HDD so you will need extra cable +If you are connecting the HDD to a USB 3.0 port and have an at least 2A power supply, you might be able to run without an extra cable. -Watch out this an ardous process. -Updating from a v6.14 DietPi image is causing a bootloop under some circumstances. Will be sorted once the current, >6.2 version is uploaded for the Odroids. +* Power up and continue with: [Run the DietPi optimized Raspiblitz SDcard build script](#Run-the-RaspiBlitz-build_sdcard.sh-script) -For the Odroid HC1 / HC2 / XU3 / XU4 the start is this image: -https://dietpi.com/downloads/images/DietPi_OdroidXU4-ARMv7-Stretch.7z -Burn it to the SD with [Etcher](https://www.balena.io/etcher/) - -Getting started with DietPi: https://dietpi.com/phpbb/viewtopic.php?f=8&t=9#p9 - -In the desktop terminal on Linux / MacOS or Putty on Windows: + +* In the desktop terminal on Linux / MacOS or Putty on Windows: `ssh root@[IP-OF-DIETPI]` password: `dietpi` +Getting started with DietPi: https://dietpi.com/phpbb/viewtopic.php?f=8&t=9#p9 -Ok > Cancel > Cancel -automatic apt update & apt upgrade and asks to reboot -![](pictures/dietpi_1st_reboot.png) - -`ssh root@[IP-OF-DIETPI]` -after the previous update the ssh keys might change: - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -run (can be copied from the terminal output): -`ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` - -`ssh root@[IP-OF-DIETPI]` -yes > -password: `dietpi` - -At this point if the DietPi was not updated from 6.14 it does not manage to save settings going forward. -Exit the sotware installer (press Tab to jump to Exit) -![](pictures/dietpi-software_exit.png) - -in the bash prompt run: -`dietpi-update` ->Ok > Cancel the recovery point -update > >Opt out of survey > Ok -Reboots - -`ssh root@[IP-OF-DIETPI]` -password: `dietpi` - ->Ok > Cancel > Cancel -Search `fail2ban` > Space to select > Enter -SSH server > switch from Dropbear to the OpenSSH-server -> Install > Ok ->Opt out of survey > Ok -Reboots again +* You might be asked about updating DietPi. This might not be straightforward if starting froma version <6.20. Try to update, it is best to build on the latest version. +* In the DietPi software menu install fail2ban and make OpenSSH server the default SSH server. Changing the SSH server will change the SSH keys again. To clear: `ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` - -## Run the RaspiBlitz build_sdcard.sh script - -In the desktop terminal in Linux / MacOS or Putty in Windows: - +* After every reboot log back in: `ssh root@[IP-OF-DIETPI]` -password: `dietpi` -Should end up here on version v6.20.6 or higher: +password: `dietpi` + +* Should end up here on version v6.20.6 or higher: ![](pictures/bash_prompt.png) -run the build_sdcard.sh script in this format: -`wget https://raw.githubusercontent.com/[GITHUB-USERNAME]/raspiblitz/[BRANCH]/build_sdcard.sh && sudo bash build_sdcard.sh [BRANCH] [GITHUB-USERNAME]` -Be aware of that the fork needs to be called `raspiblitz` for the git download to work. -if you intend to use @openoms`s forked version: +### Run the RaspiBlitz build_sdcard.sh script -`wget https://raw.githubusercontent.com/openoms/raspiblitz/raspiblitz-dev/build_sdcard.sh && sudo bash build_sdcard.sh raspiblitz-dev openoms` +* Format of the command to build the SDcard: +`wget https://raw.githubusercontent.com/[GITHUB-USERNAME]/raspiblitz/[BRANCH]/build_sdcard.sh && sudo bash build_sdcard.sh [BRANCH] [GITHUB-USERNAME]` +If you are working from a forked repo be aware of that the fork needs to be called `raspiblitz` for the git downloads to work. +* Run the forked version of @openoms: +`wget https://raw.githubusercontent.com/openoms/raspiblitz/raspiblitz-dev/build_sdcard.sh && sudo bash build_sdcard.sh raspiblitz-dev openoms` +This will take a couple minutes depending on your internet ceonnection and the processing power of the SBC. +* Restart when done and log back in now as `admin`: `ssh admin@[IP-OF-DROIDBLITZ]` -password: raspiblitz +password: `raspiblitz` -The setup continues with the [RaspiBlitz Setup Process](https://github.com/rootzoll/raspiblitz/blob/master/README.md#setup-process-detailed-documentation) +* From here he setup continues with the [RaspiBlitz Setup Process](https://github.com/rootzoll/raspiblitz/blob/master/README.md#setup-process-detailed-documentation) ---- -### Examples of copying the blockchain data from a HDD using a powered USB to SATA adapter -![example setup](pictures/HDD_copy_example.jpg) -![](pictures/adapterHDD_HC1.jpg) --- ### Useful commands for debugging: @@ -144,7 +83,7 @@ To test a new configuration run XXcleanHDD.sh and strictly restart `sudo tail -n100 /mnt/hdd/bitcoin/debug.log` - shows the last 100 lines `sudo systemctl status lnd` `sudo journalctl -f -u lnd` -`./home/admin/XXdebugLogs.sh` - debug log collection on the raspiblitz +`./home/admin/XXdebugLogs.sh` - debug log collection on the RaspiBlitz --- From 14cf3e7dab2f4ec6e2b5a2afefd74fef509d7699 Mon Sep 17 00:00:00 2001 From: openoms Date: Mon, 18 Feb 2019 22:54:52 +0000 Subject: [PATCH 034/130] dietpi guide update and reformat --- FAQ.md | 10 ++-- dietpi/Odroid_HC1_HC2.md | 112 ++++++++++++++++++++------------------- dietpi/README.md | 6 ++- 3 files changed, 67 insertions(+), 61 deletions(-) diff --git a/FAQ.md b/FAQ.md index eda7d0f..a221e86 100644 --- a/FAQ.md +++ b/FAQ.md @@ -491,6 +491,11 @@ Work Nodes for the process of producing a new sd card image release: There is an experimental section in this GitHub that tries to build for other SingleBoardComputers. Feel free to try it out and share your experience: [dietpi/README.md](dietpi/README.md) +## Can I flip the screen? + +For the default 3.5" LCD you need to edit the /boot/config.txt. Run `sudo nano /boot/config.txt` +look for the line `dtoverlay=tft35a:rotate=270` towards the end. To flip the screen with 180 degrees change the line to `dtoverlay=tft35a:rotate=90` and reboot with `sudo reboot`. Reference: https://github.com/goodtft/LCD-show/issues/34 + ## How to setup fresh/clean/reset and not getting into recovery mode? When you put in a sd card with a new/clean RaspiBlitz image the RaspiBlitz will get into recovery mode because it detects the old data on your HDD and assumes you just want to continue to work with this data. @@ -506,8 +511,3 @@ 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) - -## Can I flip the screen? - -For the default 3.5" LCD you need to edit the /boot/config.txt. Run `sudo nano /boot/config.txt` -look for the line `dtoverlay=tft35a:rotate=270` towards the end. To flip the screen with 180 degrees change the line to `dtoverlay=tft35a:rotate=90` and reboot with `sudo reboot`. Reference: https://github.com/goodtft/LCD-show/issues/34 \ No newline at end of file diff --git a/dietpi/Odroid_HC1_HC2.md b/dietpi/Odroid_HC1_HC2.md index 84746af..856e7a9 100644 --- a/dietpi/Odroid_HC1_HC2.md +++ b/dietpi/Odroid_HC1_HC2.md @@ -1,121 +1,125 @@ -![](pictures/DroidBlitz.jpg) +# ⚡️ RaspiBlitz-on-DietPi ⚡️ +# For the Odroid HC1 / HC2 / XU3 / XU4 +![](pictures/DroidBlitz.jpg) -## Download the fully prebuilt RaspiBlitz-on-DietPi SDcard image for the Odroid HC1 / HC2 / XU3 / XU4 +## There are 3 options provided: +* a trusted SDcard image +* building your own SDcard from an updated DietPi image. +* Build your own SDcard from the image downloaded from [Dietpi.com](dietpi.com#download) +--- +### Download the fully prebuilt RaspiBlitz-on-DietPi SDcard image +* [torrent](https://github.com/openoms/raspiblitz/blob/raspiblitz-dev/dietpi/RaspiBlitz1.0_OdroidHC1_DietPi6.21.1.torrent) +* [mega.nz link](https://mega.nz/#F!EVNAAQiB!ZyLHP2dJMRSVjZOTCQMIYA) -for the Odroid HC1 / HC2 / XU3 / XU4 from this [torrent](https://github.com/openoms/raspiblitz/blob/raspiblitz-dev/dietpi/RaspiBlitz1.0_OdroidHC1_DietPi6.21.1.torrent) or from [mega.nz](https://mega.nz/#F!EVNAAQiB!ZyLHP2dJMRSVjZOTCQMIYA). -(sha256sum RaspiBlitz1.0_OdroidHC1_DietPi6.21.1.img: -96ee8700f52a12fb5b13fab3fffcdcf5d364c6dd16c580d969e421cef2cd7cc2) +sha256sum RaspiBlitz1.0_OdroidHC1_DietPi6.21.1.img: 96ee8700f52a12fb5b13fab3fffcdcf5d364c6dd16c580d969e421cef2cd7cc2 Steps to run: - download the .img file, - burn to a 16 GB SD with [Etcher](https://www.balena.io/etcher/) - extend the rootFS partition with a partition manager (disks, Gparted, etc.) -- boot the Odroid with the SDcard and login with ssh admin@at.your.raspiblitz.ip, password: raspiblitz +- boot the Odroid with the SDcard +- login with `ssh admin@at.your.raspiblitz.ip` +password: `raspiblitz` Using this image you can skip the rest of this guide as it is mostly about how this image was built. The setup continues with the [RaspiBlitz Setup Process](https://github.com/rootzoll/raspiblitz/blob/master/README.md#setup-process-detailed-documentation) --- -## Setting up the DietPi OS - ### Download the updated DietPi image -For the Odroid HC1 / HC2 / XU3 / XU4 a v6.20.6 DietPi image with fail2ban installed is uploaded [here]( -https://mega.nz/#!AcdVBAbR!O-W3jP5LUgw7lMY8S9XcBWcKX3IhRNAAFmaYzDXIUC0). (sha256sum DietPi_v6.20.6_OdroidXU4-ARMv7-Stretch.img: -1459b91f66b9db98f3437c31231e44497b7b7dcd9146d2cc41a3da653f9a9215) +* For the Odroid HC1 / HC2 / XU3 / XU4 a v6.20.6 DietPi image with fail2ban installed is uploaded [here]( +https://mega.nz/#!AcdVBAbR!O-W3jP5LUgw7lMY8S9XcBWcKX3IhRNAAFmaYzDXIUC0). +sha256sum DietPi_v6.20.6_OdroidXU4-ARMv7-Stretch.img: +1459b91f66b9db98f3437c31231e44497b7b7dcd9146d2cc41a3da653f9a9215 -Burn to the SDCard with [Etcher](https://www.balena.io/etcher/) and extend the rootfs partition to the size of your card with a partition manager. +* Burn the image to the SDCard with [Etcher](https://www.balena.io/etcher/) and extend the rootfs partition to the size of your card with a partition manager (disks, Gparted, etc). -Insert the SDcard into the Odroid. +* Insert the SDcard into the Odroid. -Power up and continue with: [Run the DietPi optimized Raspiblitz SDcard build script](#Run-the-RaspiBlitz-build_sdcard.sh-script) +* Power up and continue with: [Run the RaspiBlitz build_sdcard.sh script](#Run-the-RaspiBlitz-build_sdcard.sh-script) + +--- ### Build your own DietPi image: -Watch out this an ardous process. +* Watch out this is an ardous process. Updating from a v6.14 DietPi image is causing a bootloop under some circumstances. Will be sorted once the current, >6.2 version is uploaded for the Odroids. -For the Odroid HC1 / HC2 / XU3 / XU4 the start is this image: +* For the Odroid HC1 / HC2 / XU3 / XU4 the start is this image: https://dietpi.com/downloads/images/DietPi_OdroidXU4-ARMv7-Stretch.7z -Burn it to the SD with [Etcher](https://www.balena.io/etcher/) +* Burn it to the SD with [Etcher](https://www.balena.io/etcher/) -Getting started with DietPi: https://dietpi.com/phpbb/viewtopic.php?f=8&t=9#p9 - -In the desktop terminal on Linux / MacOS or Putty on Windows: +* In the desktop terminal on Linux / MacOS or Putty on Windows: `ssh root@[IP-OF-DIETPI]` password: `dietpi` +Getting started with DietPi: https://dietpi.com/phpbb/viewtopic.php?f=8&t=9#p9 -Ok > Cancel > Cancel +* Ok > Cancel > Cancel automatic apt update & apt upgrade and asks to reboot ![](pictures/dietpi_1st_reboot.png) +* Log back in: `ssh root@[IP-OF-DIETPI]` -after the previous update the ssh keys might change: - +password: `dietpi` +* after the previous update the ssh keys might change: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - run (can be copied from the terminal output): -`ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` - +`ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` `ssh root@[IP-OF-DIETPI]` yes > password: `dietpi` -At this point if the DietPi was not updated from 6.14 it does not manage to save settings going forward. +* At this point if the DietPi was not updated from 6.14 it does not manage to save settings going forward. Exit the sotware installer (press Tab to jump to Exit) ![](pictures/dietpi-software_exit.png) -in the bash prompt run: -`dietpi-update` ->Ok > Cancel the recovery point -update > >Opt out of survey > Ok +* in the bash prompt run: +`dietpi-update` +Ok > Cancel the recovery point +update > Opt out of survey > Ok Reboots +* Log back in: `ssh root@[IP-OF-DIETPI]` password: `dietpi` - ->Ok > Cancel > Cancel +* In the DietPi software menu install fail2ban and make OpenSSH server the default SSH server. +Changing the SSH server will change the SSH keys again. To clear: +`ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` +Ok > Cancel > Cancel Search `fail2ban` > Space to select > Enter SSH server > switch from Dropbear to the OpenSSH-server -> Install > Ok ->Opt out of survey > Ok +Install > Ok +Opt out of survey > Ok Reboots again -Changing the SSH server will change the SSH keys again. To clear: +* Changing the SSH server will change the SSH keys again. To clear: `ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` -## Run the RaspiBlitz build_sdcard.sh script +### Run the RaspiBlitz build_sdcard.sh script -In the desktop terminal in Linux / MacOS or Putty in Windows: - -`ssh root@[IP-OF-DIETPI]` -password: `dietpi` -Should end up here on version v6.20.6 or higher: -![](pictures/bash_prompt.png) - -run the build_sdcard.sh script in this format: -`wget https://raw.githubusercontent.com/[GITHUB-USERNAME]/raspiblitz/[BRANCH]/build_sdcard.sh && sudo bash build_sdcard.sh [BRANCH] [GITHUB-USERNAME]` - -Be aware of that the fork needs to be called `raspiblitz` for the git download to work. -if you intend to use @openoms`s forked version: - -`wget https://raw.githubusercontent.com/openoms/raspiblitz/raspiblitz-dev/build_sdcard.sh && sudo bash build_sdcard.sh raspiblitz-dev openoms` +* Format of the command to build the SDcard: +`wget https://raw.githubusercontent.com/[GITHUB-USERNAME]/raspiblitz/[BRANCH]/build_sdcard.sh && sudo bash build_sdcard.sh [BRANCH] [GITHUB-USERNAME]` +If you are working from a forked repo be aware of that the fork needs to be called `raspiblitz` for the git downloads to work. +* Run the forked version of @openoms: +`wget https://raw.githubusercontent.com/openoms/raspiblitz/raspiblitz-dev/build_sdcard.sh && sudo bash build_sdcard.sh raspiblitz-dev openoms` +This will take a couple minutes depending on your internet ceonnection and the processing power of the SBC. +* Restart when done and log back in now as `admin`: `ssh admin@[IP-OF-DROIDBLITZ]` -password: raspiblitz +password: `raspiblitz` -The setup continues with the [RaspiBlitz Setup Process](https://github.com/rootzoll/raspiblitz/blob/master/README.md#setup-process-detailed-documentation) +* From here he setup continues with the [RaspiBlitz Setup Process](https://github.com/rootzoll/raspiblitz/blob/master/README.md#setup-process-detailed-documentation) --- -### Examples of copying the blockchain data from a HDD using a powered USB to SATA adapter +### Examples of copying the blockchain data from a HDD using a powered USB to SATA adapter ![example setup](pictures/HDD_copy_example.jpg) ![](pictures/adapterHDD_HC1.jpg) diff --git a/dietpi/README.md b/dietpi/README.md index 8a993dc..e536455 100644 --- a/dietpi/README.md +++ b/dietpi/README.md @@ -9,12 +9,14 @@ This guide was tested on: * Raspberry Pi 3 B Plus - no LCD support so far * hoping to extend this list with more compatible boards especially the ROCK64 -See the [hardware comparison](hw_comparison.md). +See the [hardware comparison](hw_comparison.md). + +--- ### Downloads and walkthrough for the [Odroid HC1 / HC2 / XU3 / XU4](Odroid_HC1_HC2.md) --- -## General Guide for RaspiBlitz-on-DietPi +## General guide for the RaspiBlitz-on-DietPi ### Setting up the DietPi OS From bcd865a0c86eb2f1546e277723c0b8f63a156b71 Mon Sep 17 00:00:00 2001 From: openoms Date: Tue, 19 Feb 2019 00:28:36 +0000 Subject: [PATCH 035/130] fix typos --- dietpi/Odroid_HC1_HC2.md | 23 ++++++++++++----------- dietpi/README.md | 18 ++++++++---------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/dietpi/Odroid_HC1_HC2.md b/dietpi/Odroid_HC1_HC2.md index 856e7a9..00617c6 100644 --- a/dietpi/Odroid_HC1_HC2.md +++ b/dietpi/Odroid_HC1_HC2.md @@ -5,7 +5,7 @@ ![](pictures/DroidBlitz.jpg) ## There are 3 options provided: -* a trusted SDcard image +* a trusted fully prebuilt SDcard image * building your own SDcard from an updated DietPi image. * Build your own SDcard from the image downloaded from [Dietpi.com](dietpi.com#download) --- @@ -30,7 +30,7 @@ The setup continues with the [RaspiBlitz Setup Process](https://github.com/rootz --- ### Download the updated DietPi image -* For the Odroid HC1 / HC2 / XU3 / XU4 a v6.20.6 DietPi image with fail2ban installed is uploaded [here]( +For the Odroid HC1 / HC2 / XU3 / XU4 a v6.20.6 DietPi image with fail2ban installed is uploaded [here]( https://mega.nz/#!AcdVBAbR!O-W3jP5LUgw7lMY8S9XcBWcKX3IhRNAAFmaYzDXIUC0). sha256sum DietPi_v6.20.6_OdroidXU4-ARMv7-Stretch.img: 1459b91f66b9db98f3437c31231e44497b7b7dcd9146d2cc41a3da653f9a9215 @@ -39,13 +39,13 @@ sha256sum DietPi_v6.20.6_OdroidXU4-ARMv7-Stretch.img: * Insert the SDcard into the Odroid. -* Power up and continue with: [Run the RaspiBlitz build_sdcard.sh script](#Run-the-RaspiBlitz-build_sdcard.sh-script) +* Power up and continue with [running the RaspiBlitz build_sdcard.sh script](#Run-the-RaspiBlitz-build_sdcard.sh-script) --- ### Build your own DietPi image: -* Watch out this is an ardous process. +Watch out this is an ardous process. Updating from a v6.14 DietPi image is causing a bootloop under some circumstances. Will be sorted once the current, >6.2 version is uploaded for the Odroids. * For the Odroid HC1 / HC2 / XU3 / XU4 the start is this image: @@ -65,7 +65,7 @@ automatic apt update & apt upgrade and asks to reboot * Log back in: `ssh root@[IP-OF-DIETPI]` password: `dietpi` -* after the previous update the ssh keys might change: +* after the update the ssh keys might change: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -75,8 +75,8 @@ run (can be copied from the terminal output): yes > password: `dietpi` -* At this point if the DietPi was not updated from 6.14 it does not manage to save settings going forward. -Exit the sotware installer (press Tab to jump to Exit) +* At this point if the DietPi OS was not updated from 6.14 it does not manage to save settings going forward. +Exit the software installer (press Tab to jump to Exit) ![](pictures/dietpi-software_exit.png) * in the bash prompt run: @@ -88,9 +88,7 @@ Reboots * Log back in: `ssh root@[IP-OF-DIETPI]` password: `dietpi` -* In the DietPi software menu install fail2ban and make OpenSSH server the default SSH server. -Changing the SSH server will change the SSH keys again. To clear: -`ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` +* In the DietPi software menu install fail2ban and make OpenSSH server the default SSH server. Ok > Cancel > Cancel Search `fail2ban` > Space to select > Enter SSH server > switch from Dropbear to the OpenSSH-server @@ -98,7 +96,10 @@ Install > Ok Opt out of survey > Ok Reboots again -* Changing the SSH server will change the SSH keys again. To clear: +* Log back in: +`ssh root@[IP-OF-DIETPI]` +password: `dietpi` +Changing the SSH server will change the SSH keys again. To clear: `ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` diff --git a/dietpi/README.md b/dietpi/README.md index e536455..c495462 100644 --- a/dietpi/README.md +++ b/dietpi/README.md @@ -20,6 +20,8 @@ See the [hardware comparison](hw_comparison.md). ### Setting up the DietPi OS +Getting started with DietPi: https://dietpi.com/phpbb/viewtopic.php?f=8&t=9#p9 + * Start with an ARM based Single Board Computer listed on DietPi.com. At least 1GB RAM is recommended. Look for the SD card image for the specific SBC in the [download section](https://dietpi.com/#download). @@ -32,18 +34,14 @@ Look for the SD card image for the specific SBC in the [download section](https: A USB 2.0 port will not be able to power an HDD so you will need extra cable If you are connecting the HDD to a USB 3.0 port and have an at least 2A power supply, you might be able to run without an extra cable. -* Power up and continue with: [Run the DietPi optimized Raspiblitz SDcard build script](#Run-the-RaspiBlitz-build_sdcard.sh-script) - - - -* In the desktop terminal on Linux / MacOS or Putty on Windows: +* Power up and log in with the desktop terminal on Linux / MacOS or Putty on Windows: `ssh root@[IP-OF-DIETPI]` password: `dietpi` -Getting started with DietPi: https://dietpi.com/phpbb/viewtopic.php?f=8&t=9#p9 -* You might be asked about updating DietPi. This might not be straightforward if starting froma version <6.20. Try to update, it is best to build on the latest version. -* In the DietPi software menu install fail2ban and make OpenSSH server the default SSH server. +* You might be asked about updating DietPi. This is not a straightforward process if starting from a version <6.20. Try to update, it is best to build on the latest version. + +* In the DietPi software menu install `fail2ban` and make `OpenSSH server` the default SSH server. Changing the SSH server will change the SSH keys again. To clear: `ssh-keygen -f "/home/[your-linux-username]/.ssh/known_hosts" -R "dietpi.IP"` @@ -57,13 +55,13 @@ password: `dietpi` ### Run the RaspiBlitz build_sdcard.sh script -* Format of the command to build the SDcard: +* Use this format to build the SDcard with the Raspiblitz script: `wget https://raw.githubusercontent.com/[GITHUB-USERNAME]/raspiblitz/[BRANCH]/build_sdcard.sh && sudo bash build_sdcard.sh [BRANCH] [GITHUB-USERNAME]` If you are working from a forked repo be aware of that the fork needs to be called `raspiblitz` for the git downloads to work. * Run the forked version of @openoms: `wget https://raw.githubusercontent.com/openoms/raspiblitz/raspiblitz-dev/build_sdcard.sh && sudo bash build_sdcard.sh raspiblitz-dev openoms` -This will take a couple minutes depending on your internet ceonnection and the processing power of the SBC. +This will take a couple minutes depending on your internet connection and the processing power of the SBC. * Restart when done and log back in now as `admin`: `ssh admin@[IP-OF-DROIDBLITZ]` From 857252e4e219c04bbc6ae1957689440f684c680d Mon Sep 17 00:00:00 2001 From: rootzoll Date: Tue, 19 Feb 2019 13:46:31 +0100 Subject: [PATCH 036/130] torrent file rename --- README.md | 2 +- ...18.torrent => raspiblitz-v1.0-2019-02-18.torrent | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename raspiblitz-v1.0-2018-02-18.torrent => raspiblitz-v1.0-2019-02-18.torrent (100%) diff --git a/README.md b/README.md index 5efad32..0f2f367 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Your SD-card needs to contain the RaspiBlitz software. You can take the long roa 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-2018-02-18.torrent +Torrent: https://github.com/rootzoll/raspiblitz/raw/master/raspiblitz-v1.0-2019-02-18.torrent SHA-256: 99ca96d214657388305ca117e2343ead45f9d907f185bef36c712a9a3e75568f diff --git a/raspiblitz-v1.0-2018-02-18.torrent b/raspiblitz-v1.0-2019-02-18.torrent similarity index 100% rename from raspiblitz-v1.0-2018-02-18.torrent rename to raspiblitz-v1.0-2019-02-18.torrent From 434b0ebd028b7528b3b63386f737e30f18304a23 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Tue, 19 Feb 2019 17:47:24 +0100 Subject: [PATCH 037/130] added re-torrent info --- FAQ.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/FAQ.md b/FAQ.md index 7e5f576..eca7cb2 100644 --- a/FAQ.md +++ b/FAQ.md @@ -501,8 +501,16 @@ When the HDD is clean, then flash a new RaspiBlitz sd card and your setup should ## My blockchain data is corrupted - what can I do? -You could try to re-index, but that can take some very long time - multiple days or even weeks. +You could try to re-index, but that can take some very long time - multiple days or even weeks. But there are other options: -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. +1. Copy Blockchain from another Computer -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) +You can 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. + +2. Re-Torrent download prepared Blockchain + +You can also start a new Torrent-Download and replace the old blockchain with a new download once its finished. Go to terminal and run script `/mnt/hdd/50torrentHDD.sh` + +3. Backup LND Data, make fresh Blitz, Replay LND Data + +You can backup your channel and wallet data, make a complete fresh RaspiBlitz and after that one is setup you replace the LND data with your old one. 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 or SD card is degrading - maybe this is a good time to replace. 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)* From e3ea3fde359858fb38fe9ce12e8c6d9f3917b2b9 Mon Sep 17 00:00:00 2001 From: wingsuit Date: Wed, 20 Feb 2019 02:12:40 +0100 Subject: [PATCH 038/130] Corrected a sentence Tiny change correcting a sentence --- FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index d1a98e1..5678cc7 100644 --- a/FAQ.md +++ b/FAQ.md @@ -339,7 +339,7 @@ The best way would be to build the sd card yourself. You use the script `build_s To download a blockchain from a third party (torrent/ftp) is not optimal and for the future with more cheap & powerfull SingleBoardComputers we could get rid of this 'patch'. -The downloaded blockchain is pre-indexed and pre-validated. That should be practically secure enough, because if the user gets a "manipulated" blockchain it would not work after setup. The beginning of the downloaded blockchain needs to fit the genesis block (in bitcoind software) and the end of the downloaded blockchain needs not match with the rest of the bitcoin network state - hashes of new block distrubuted within the peer-2-peer network need to match the downloaded blockchain head. So if you downloaded a manipulated blockchain it would simply just don't work in practice. As long as you are not in a totally hostile environment where someone would be able to fake a whole network of peers and miners around you - this is secure enough for running a small funded full node to try out the lightning network. +The downloaded blockchain is pre-indexed and pre-validated. That should be practically secure enough, because if the user gets a "manipulated" blockchain it would not work after setup. The beginning of the downloaded blockchain needs to fit the genesis block (in bitcoind software) and the end of the downloaded blockchain needs not match with the rest of the bitcoin network state - hashes of new block distrubuted within the peer-2-peer network need to match the downloaded blockchain head. So if you downloaded a manipulated blockchain it simply wouldn't work in practice. As long as you are not in a totally hostile environment where someone would be able to fake a whole network of peers and miners around you - this is secure enough for running a small funded full node to try out the lightning network. 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. From 6a9a63a93e8be6a29a760a3ca6eb2edddb97023d Mon Sep 17 00:00:00 2001 From: openoms Date: Wed, 20 Feb 2019 11:13:00 +0000 Subject: [PATCH 039/130] fix requests missing in dietpi for autounlock --- home.admin/config.scripts/lnd.autounlock.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/home.admin/config.scripts/lnd.autounlock.sh b/home.admin/config.scripts/lnd.autounlock.sh index 92b290c..d08056f 100755 --- a/home.admin/config.scripts/lnd.autounlock.sh +++ b/home.admin/config.scripts/lnd.autounlock.sh @@ -1,5 +1,8 @@ #!/bin/bash +# requests missing in dietpi +sudo pip install requests + # command info if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then echo "small config script to autounlock lnd after restart" From 26764dda287b0cc3cdb74afb2a3af2ae8927d659 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Wed, 20 Feb 2019 12:34:05 +0100 Subject: [PATCH 040/130] undervoltage info --- FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index d1a98e1..81dd72c 100644 --- a/FAQ.md +++ b/FAQ.md @@ -323,7 +323,7 @@ Also there are first free 3D open source files in this repo in the directory `ca ## Are those "Under-Voltage detected" warnings a problem? -When your USB power adapter for the RaspiBlitz delivers too low power those messages with "Under-Voltage detected" (undervoltage) are shortly seen on the display. If you see those just one or two times that's not OK, but can be in a tolerant window. Nevertheless make sure your USB power adapter can deliver at least 3A. If you still see those warnings maybe get a second USB Power adapter just for the HDD and power the HDD through a Y-Cable - see https://en.wikipedia.org/wiki/Y-cable#USB +When your USB power adapter for the RaspiBlitz delivers too low power those messages with "Under-Voltage detected" (undervoltage) are shortly seen on the display. This can lead to data loss/corruption on the HDD. If you see those just one or two times that's not OK, but can be in a tolerant window. Nevertheless it make sure your USB power adapter can deliver at least 3A (big and stable is good). If you still see those warnings maybe get a second USB Power adapter just for the HDD and power the HDD through a Y-Cable - see https://en.wikipedia.org/wiki/Y-cable#USB or put a USB Hub with extra power between the raspberry and the HDD. ## Why do we need to download the blockchain and not syncing it? From ffcf86ee023a784973ea6b775af8535f69a92fdf Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 22 Feb 2019 15:12:10 +0100 Subject: [PATCH 041/130] LCD alternative #343 --- shoppinglist_usa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shoppinglist_usa.md b/shoppinglist_usa.md index 7bc953d..d0747b5 100644 --- a/shoppinglist_usa.md +++ b/shoppinglist_usa.md @@ -5,4 +5,4 @@ * Power: http://a.co/d/fVVOYZZ * 1TB Hard Drive: http://a.co/eUgVfLd * Case: http://a.co/1774Hwl -* LCD-Display: http://a.co/65p2wu6 \ No newline at end of file +* LCD-Display: http://a.co/65p2wu6 or https://www.amazon.com/gp/product/B01CNJVG8K/ \ No newline at end of file From 02b31c31d96b0967aa43ca03900353f27f988af0 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 22 Feb 2019 17:27:58 +0100 Subject: [PATCH 042/130] added power supply alternative --- shoppinglist_uk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shoppinglist_uk.md b/shoppinglist_uk.md index 89f9ea0..dc22f14 100644 --- a/shoppinglist_uk.md +++ b/shoppinglist_uk.md @@ -2,7 +2,7 @@ * 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 -* Power: https://www.amazon.co.uk/iTrunk-Raspberry-Model-Supply-Charger/dp/B01MFFSPHE +* 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 * LCD-Display: https://www.amazon.co.uk/ELEGOO-480x320-Raspberry-Monitor-Interface/dp/B01MRQTMTD \ No newline at end of file From 624f3b4dbd0832744cea5844d24b410495280e8e Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 22 Feb 2019 18:48:56 +0100 Subject: [PATCH 043/130] third alternative shopping item for LCD #343 --- shoppinglist_usa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shoppinglist_usa.md b/shoppinglist_usa.md index d0747b5..6d8ab67 100644 --- a/shoppinglist_usa.md +++ b/shoppinglist_usa.md @@ -5,4 +5,4 @@ * Power: http://a.co/d/fVVOYZZ * 1TB Hard Drive: http://a.co/eUgVfLd * Case: http://a.co/1774Hwl -* LCD-Display: http://a.co/65p2wu6 or https://www.amazon.com/gp/product/B01CNJVG8K/ \ No newline at end of file +* LCD-Display: http://a.co/65p2wu6 or https://www.amazon.com/gp/product/B01CNJVG8K/ or https://www.amazon.com/dp/B06X191RX7 \ No newline at end of file From cb7cd4f902838787403818000c359989b0ece7d2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 22 Feb 2019 22:46:13 +0100 Subject: [PATCH 044/130] optional continue in PGP autocheck #342 --- build_sdcard.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/build_sdcard.sh b/build_sdcard.sh index ede9eeb..bc7ac8f 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -246,8 +246,12 @@ fi fingerprint=$(gpg ./laanwj-releases.asc 2>/dev/null | grep "${laanwjPGP}" -c) if [ ${fingerprint} -lt 1 ]; then echo "" - echo "!!! BUILD FAILED --> Bitcoin download PGP author not OK" - exit 1 + echo "!!! BUILD WARNING --> Bitcoin PGP author not as expected" + echo "Should be laanwjPGP: ${laanwjPGP}" + echo "This is the output of that check (gpg ./laanwj-releases.asc):" + gpg ./laanwj-releases.asc + echo "PRESS ENTER to TAKE THE RISK if you think all is OK" + read key fi gpg --import ./laanwj-releases.asc sudo -u admin wget https://bitcoin.org/bin/bitcoin-core-${bitcoinVersion}/SHA256SUMS.asc From becad8e301a699cc0405ecd5f68ab0d0eed2ccf4 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 22 Feb 2019 23:22:03 +0100 Subject: [PATCH 045/130] optional continue on PGP check --- build_sdcard.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/build_sdcard.sh b/build_sdcard.sh index bc7ac8f..6983887 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -243,13 +243,12 @@ then echo "!!! FAIL !!! Download laanwj-releases.asc not success." exit 1 fi +gpg ./laanwj-releases.asc fingerprint=$(gpg ./laanwj-releases.asc 2>/dev/null | grep "${laanwjPGP}" -c) if [ ${fingerprint} -lt 1 ]; then echo "" echo "!!! BUILD WARNING --> Bitcoin PGP author not as expected" - echo "Should be laanwjPGP: ${laanwjPGP}" - echo "This is the output of that check (gpg ./laanwj-releases.asc):" - gpg ./laanwj-releases.asc + echo "Should contain laanwjPGP: ${laanwjPGP}" echo "PRESS ENTER to TAKE THE RISK if you think all is OK" read key fi @@ -336,11 +335,14 @@ if [ "${binaryChecksum}" != "${lndSHA256}" ]; then fi # check gpg finger print +gpg ./pgp_keys.asc fingerprint=$(gpg ./pgp_keys.asc 2>/dev/null | grep "${olaoluwaPGP}" -c) if [ ${fingerprint} -lt 1 ]; then echo "" - echo "!!! BUILD FAILED --> LND download author PGP not OK" - exit 1 + echo "!!! BUILD WARNING --> Bitcoin PGP author not as expected" + echo "Should contain olaoluwaPGP: ${olaoluwaPGP}" + echo "PRESS ENTER to TAKE THE RISK if you think all is OK" + read key fi gpg --import ./pgp_keys.asc sleep 3 From 3c394619282b99630c5b63b55764c6e48b001cd6 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sat, 23 Feb 2019 23:00:57 +0100 Subject: [PATCH 046/130] #343 another display option --- shoppinglist_usa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shoppinglist_usa.md b/shoppinglist_usa.md index 6d8ab67..623d503 100644 --- a/shoppinglist_usa.md +++ b/shoppinglist_usa.md @@ -5,4 +5,4 @@ * Power: http://a.co/d/fVVOYZZ * 1TB Hard Drive: http://a.co/eUgVfLd * Case: http://a.co/1774Hwl -* LCD-Display: http://a.co/65p2wu6 or https://www.amazon.com/gp/product/B01CNJVG8K/ or https://www.amazon.com/dp/B06X191RX7 \ No newline at end of file +* LCD-Display: http://a.co/65p2wu6 or https://www.amazon.com/gp/product/B01CNJVG8K/ or https://www.amazon.com/dp/B06X191RX7 or https://www.sparkfun.com/products/14776 \ No newline at end of file From 5d8d5e9a237f43b6093a7f54db3f93d2ef16c3fb Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sat, 23 Feb 2019 23:44:36 +0100 Subject: [PATCH 047/130] #100 beginning of set lnd port script --- home.admin/config.scripts/lnd.setport.sh | 46 ++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 home.admin/config.scripts/lnd.setport.sh diff --git a/home.admin/config.scripts/lnd.setport.sh b/home.admin/config.scripts/lnd.setport.sh new file mode 100644 index 0000000..bb2891e --- /dev/null +++ b/home.admin/config.scripts/lnd.setport.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# based on: https://github.com/rootzoll/raspiblitz/issues/100#issuecomment-465997126 + +if [ $# -eq 0 ]; then + echo "small config script set the port LND is running on" + echo "lnd.setport.sh [portnumber]" + exit 1 +fi + +portnumber=$1 + +# check port number is bigger then zero +if [ ${portnumber} -lt 1 ]; then + echo "FAIL - portnumber(${portnumber}) not above 0" + exit 1 +fi + +# check port number is smaller than max +if [ ${portnumber} -gt 65535 ]; then + echo "FAIL - portnumber(${portnumber}) not below 65535" + exit 1 +fi + +# check lnd.conf exits +lndConfExists=$(sudo ls /mnt/hdd/lnd/lnd.conf | grep -c 'lnd.conf') +if [ ${lndConfExists} -eq 0 ]; then + echo "FAIL - /mnt/hdd/lnd/lnd.conf not found" + exit 1 +fi + +echo "DEBUG EXIT" +exit 0 + +# check if "listen=" exists in lnd config +valueExists=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep -c 'nat=') +if [ ${valueExists} -eq 0 ]; then + echo "Adding autonat config defaults to /mnt/hdd/lnd/lnd.conf" + sudo sed -i '$ a listen=0.0.0.0:9735' /mnt/hdd/lnd/lnd.conf +fi + +# stop services +echo "making sure services are not running" +sudo systemctl stop lnd 2>/dev/null + +echo "needs reboot to activate new setting" \ No newline at end of file From c46a18f89f0b9af03b285b4ce39bb50bd199e42c Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sat, 23 Feb 2019 23:50:27 +0100 Subject: [PATCH 048/130] add integer check --- home.admin/config.scripts/lnd.setport.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/home.admin/config.scripts/lnd.setport.sh b/home.admin/config.scripts/lnd.setport.sh index bb2891e..b7fb246 100644 --- a/home.admin/config.scripts/lnd.setport.sh +++ b/home.admin/config.scripts/lnd.setport.sh @@ -10,6 +10,13 @@ fi portnumber=$1 +# check port numer is a integer +if ! [ "$portnumber" -eq "$portnumber" ] 2> /dev/null +then + echo "FAIL - portnumber(${portnumber}) not a number" + exit 1 +fi + # check port number is bigger then zero if [ ${portnumber} -lt 1 ]; then echo "FAIL - portnumber(${portnumber}) not above 0" From e37a5336f92728d3a07db473065e91a7e4f59b1d Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 24 Feb 2019 01:51:56 +0100 Subject: [PATCH 049/130] first version if lnd.setport.sh #100 --- home.admin/config.scripts/lnd.setport.sh | 42 +++++++++++++++++++----- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/home.admin/config.scripts/lnd.setport.sh b/home.admin/config.scripts/lnd.setport.sh index b7fb246..e880f82 100644 --- a/home.admin/config.scripts/lnd.setport.sh +++ b/home.admin/config.scripts/lnd.setport.sh @@ -29,6 +29,13 @@ if [ ${portnumber} -gt 65535 ]; then exit 1 fi +# check if TOR is on +source /mnt/hdd/raspiblitz.conf +if [ "${runBehindTor}" = "on" ]; then + echo "FAIL - portnumber cannot be changed if TOR is ON (not implemented)" + exit 1 +fi + # check lnd.conf exits lndConfExists=$(sudo ls /mnt/hdd/lnd/lnd.conf | grep -c 'lnd.conf') if [ ${lndConfExists} -eq 0 ]; then @@ -36,18 +43,35 @@ if [ ${lndConfExists} -eq 0 ]; then exit 1 fi -echo "DEBUG EXIT" -exit 0 - # check if "listen=" exists in lnd config -valueExists=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep -c 'nat=') -if [ ${valueExists} -eq 0 ]; then - echo "Adding autonat config defaults to /mnt/hdd/lnd/lnd.conf" - sudo sed -i '$ a listen=0.0.0.0:9735' /mnt/hdd/lnd/lnd.conf +valueExists=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep -c 'listen=') +if [ ${valueExists} -lt 3 ]; then + echo "Adding listen config defaults to /mnt/hdd/lnd/lnd.conf" + sudo sed -i "9i listen=0.0.0.0:9735" /mnt/hdd/lnd/lnd.conf fi # stop services -echo "making sure services are not running" +echo "making sure LND is not running" sudo systemctl stop lnd 2>/dev/null -echo "needs reboot to activate new setting" \ No newline at end of file +# disable services +echo "making sure LND is disabled" +sudo systemctl disable lnd + +# change port in lnd config +echo "change port in lnd config" +sudo sed -i "s/^listen=.*/listen=0.0.0.0:${portnumber}/g" /mnt/hdd/lnd/lnd.conf + +# editing service file +echo "editing /etc/systemd/system/lnd.service" +sudo sed -i "s/^ExecStart=\/usr\/local\/bin\/lnd.*/ExecStart=\/usr\/local\/bin\/lnd --externalip=\${publicIP}:${portnumber}/g" /etc/systemd/system/lnd.service + +# enable service again +echo "enable service again" +sudo systemctl enable lnd + +# make sure port is open on firewall +sudo ufw allow ${portnumber} comment 'LND Port' +sudo ufw --force enable + +echo "needs reboot to activate new setting -> sudo shutdown -r now" \ No newline at end of file From f291055f47d0a57b3a80b1bc1da6031a853d9037 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 24 Feb 2019 02:35:44 +0100 Subject: [PATCH 050/130] added FAQ how to change LND port --- FAQ.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/FAQ.md b/FAQ.md index d87b509..043410e 100644 --- a/FAQ.md +++ b/FAQ.md @@ -519,3 +519,11 @@ You can also start a new Torrent-Download and replace the old blockchain with a 3. Backup LND Data, make fresh Blitz, Replay LND Data You can backup your channel and wallet data, make a complete fresh RaspiBlitz and after that one is setup you replace the LND data with your old one. 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 or SD card is degrading - maybe this is a good time to replace. 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)* + +## I have two RaspiBlitz in my network - can they both be public? + +Yes but you need to change at least on one RaspiBlitz the port number (for example to 9736) on one of your RaspiBlitzes - see how to change a port below. Then you can forward both ports from your home internet router to the matching RaspiBlitzes. + +## 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 \ No newline at end of file From e754d531c748af70f7344a4ac8c2a66fb0c2d7a2 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 24 Feb 2019 02:57:27 +0100 Subject: [PATCH 051/130] updated shango connect --- home.admin/97addMobileWalletShango.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/home.admin/97addMobileWalletShango.sh b/home.admin/97addMobileWalletShango.sh index 3070efb..2d85f70 100644 --- a/home.admin/97addMobileWalletShango.sh +++ b/home.admin/97addMobileWalletShango.sh @@ -42,7 +42,8 @@ read key clear echo "*** STEP 2 : SCAN MACAROON (make whole QR code fill camera) ***" -echo -e "${myip}:10009,\n$(xxd -p -c2000 ./.lnd/data/chain/${network}/${chain}net/admin.macaroon)," > qr.txt && cat ./.lnd/tls.cert >>qr.txt && qrencode -t ANSI256 < qr.txt +#echo -e "${myip}:10009,\n$(xxd -p -c2000 ~/.lnd/data/chain/${network}/${chain}net/admin.macaroon)," > qr.txt && qrencode -t ANSIUTF8 < qr.txt +echo -e "${myip}:10009,\n$(xxd -p -c2000 ./.lnd/data/chain/${network}/${chain}net/admin.macaroon)," > qr.txt && qrencode -t ANSI256 < qr.txt echo "(To shrink QR code: OSX->CMD- / LINUX-> CTRL-) Press ENTER when finished." read key shred qr.txt From 1ef1ef31a516d445830e474e596e45f83ae385e3 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 24 Feb 2019 15:35:47 +0100 Subject: [PATCH 052/130] FAQ without LCD --- FAQ.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/FAQ.md b/FAQ.md index d87b509..dcc6c58 100644 --- a/FAQ.md +++ b/FAQ.md @@ -519,3 +519,13 @@ You can also start a new Torrent-Download and replace the old blockchain with a 3. Backup LND Data, make fresh Blitz, Replay LND Data You can backup your channel and wallet data, make a complete fresh RaspiBlitz and after that one is setup you replace the LND data with your old one. 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 or SD card is degrading - maybe this is a good time to replace. 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)* + +## Can I run the RaspiBlitz without a display/LCD? + +The display is one of the nice features of the RaspiBlitz but the raspberry can un without it. Maybe not all add-on feature could be used to the full extend, but you can get started without the LCD and even plug it on later. + +Normally with the LCD its easy to see your local IP changes and you can get started quickly. Without it needs a bit more digging thru your network - you can find a good tutorial on that on the RaspiBolt tutorial (origin of RaspiBlitz): + +https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#connecting-to-the-network + +*Please Note: Without a LCD-Hat you cannot simply use the HDMI as alternative, because screen signal is routed to the GPIO pins. On how to switch that back manually - see [waveshare documentation](https://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A)).* From 08d4f76d188bc2589d5c503575574b7ad13d1858 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 28 Feb 2019 14:58:09 +0100 Subject: [PATCH 053/130] #372 removed old statement about TOR --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 0f2f367..f1fa8ac 100644 --- a/README.md +++ b/README.md @@ -410,8 +410,6 @@ But this also comes with the following side effects: To try it out just switch on the service - you can deactivate later on if its not working for you. -The TOR integration is experimental and at the moment there is no way to switch off TOR again. - ##### RTL Webinterface The RTL Webinterface is a LND Control Dashboard you can run in your browser with a nice GUI - it offers much more control over your Lightning node than the RaspiBlitu SSH menus. Its recommended to give it a try. From 3766caf68fbcd93973c6209fe4575e5a98c36412 Mon Sep 17 00:00:00 2001 From: antonleviathan Date: Sat, 2 Mar 2019 12:59:39 -0500 Subject: [PATCH 054/130] Add Canadian shopping list (amazon.ca) --- shoppinglist_ca.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 shoppinglist_ca.md diff --git a/shoppinglist_ca.md b/shoppinglist_ca.md new file mode 100644 index 0000000..2d8594c --- /dev/null +++ b/shoppinglist_ca.md @@ -0,0 +1,7 @@ +## Shopping List: Amazon Canada + +* RaspBerry Pi 3: https://amzn.to/2NDLD31 +* Micro SD-Card 16GB: https://amzn.to/2NEXWMa +* Power: https://amzn.to/2NCdCju +* 1TB Hard Drive: https://amzn.to/2NF0lqj +* LCD-Display + Case + Pen: https://amzn.to/2GWx3D8 From c6de3d3d2e0c0975daa10e05e3bcdffb8c5d70ae Mon Sep 17 00:00:00 2001 From: antonleviathan Date: Sat, 2 Mar 2019 12:59:50 -0500 Subject: [PATCH 055/130] Add Canadian shopping list to README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f1fa8ac..bc91136 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ These are the community currated shopping lists based on country: * [Germany](shoppinglist_de.md) *(reference shopping list)* * [USA](shoppinglist_usa.md) +* [Canada](shoppinglist_ca.md) * [UK](shoppinglist_uk.md) * [Switzerland](shoppinglist_ch.md) * [France](shoppinglist_fr.md) From e5da72701407d707bf56caeafb8a1b03c9e82068 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Wed, 6 Mar 2019 00:02:10 +0100 Subject: [PATCH 056/130] split Raspiblitz_standard.stl into two files #396 --- .../standard/RaspiBlitz_Standard_Bottom.stl | Bin 0 -> 4284 bytes .../standard/RaspiBlitz_Standard_Top.stl | Bin 0 -> 144384 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 case.3dprint/standard/RaspiBlitz_Standard_Bottom.stl create mode 100644 case.3dprint/standard/RaspiBlitz_Standard_Top.stl diff --git a/case.3dprint/standard/RaspiBlitz_Standard_Bottom.stl b/case.3dprint/standard/RaspiBlitz_Standard_Bottom.stl new file mode 100644 index 0000000000000000000000000000000000000000..4a0924342a37f791dcb536c93b1cdda077174f7c GIT binary patch literal 4284 zcmb7`y=qlK5XV;nd4Skj+{#K4HE4n;_d^hikbuVb5MnFt8`wk;t6PY^fP^$6Nn`0V zSor`Jf);xIv-$1L?w%X)fHK*c-+b>m_vzu@VlqE`G}+m_yLof-_MKakhX;EHPaZ6n z%fFNVe+~mr{F0>O^AO$+|4!#2AWJh_aDKF(ERBd>Gfsp6Ax;#&^miL0%yeo*lvIeM zsR_}Ah*JXwB*lPGJjtr5#8!+<$Y8Ki<$A`5(>ZlOmFOueA477f+=y8GN(W6=iMFgR zW)Z^GwHu4|E3!PDOTPE%@n>Y6UteEZR!pxD(zJwV2xXu?DKjdsGx0Q)C&Ft=O>9i5 z!(u4Rv?hGz$LG|PV|0XQy5O^|39qRM#Y;Qg5=GMz#Dgd^m*(2mvzaC+`NyBv)@jZw zBI0)yAsRycD!qbGenz6luVF0 zuPV2j>oxKVf!q_)Xda3|cZsL-s&b0~A&n=HJz;w_P$dSLwDFinBJf2f)IohZUrl%` z$=loS&U(UYG#jjZ?8{=*g!ZbBAzx^G48IFGhRwYtv{!TiITKnE>n<8~mw4Wji1Max z=fRx)YY_0$5eF~fu<$+24`Zh z)>C{Xf-iOIG;cV|DjIMx1Ky(e70p{B$4Ed!U?oD+9PgF)%U9;|7~XG7u)DdtR=M9R zPbjPLnR@~&>KKpV=OLN-YkR0%Uw=L68?~|aqWbp9N;isgb(bejy@ophK}UK5jVIdf zmKa{s65|t;)ydDTGi4%~$~iyz`D*0%l?Z8Cf*$6*ibHPp3!o+Vo~u{iel;mj0OHI337Ex|(TP{&HP!!o$(VtU z!JMcg{UXEfDq=i_wgH08@EcRb2wuaT*M@V>wukWH>&G2Gb8ZxO#nUNi(_x4bwH>F9Hu5@;(yF0nFB1Lf!DIy3`mm+;Y6oI`83JMA~1nEUkL^kn){OZf>63z4(8>`+N5#&N0>GuRHdVFro+{bgog6Hqa42-`JnIXu)LaAx7|O=l)*(4MLVI)Aa!Ac5Fl-B^H9C z9Xsx1CHKCpOta}1jhQpJgx5RmW3qd8piBQ!-nUEFQ8^f>JFR56zs)AZovSZ|CbcNQ zs>)1GKRg@0$UfRz6kZ68C zN;LO_>Vp4*^gp_z6h%i!9USq>tD8cf*Bj}+U#{||6&D719hxto+AU)>=s3VTJ$jyB zyVxrod-se@p>p*{^4@MB0=Z;a+);H)Oi$c)Io16twL${5GszU~ad^{@;j$5^H$B_> zw=lnMC_m^w_|qUhT%+7`Gh9E}f$WYfa$WZvDLSHk1RX(yb;x_0>zJ7(pBbUWuTfc8 z8$krQRY=hh%OYrP6s3_`%9?JeG9SAng10%0yM$1b*a&EI-;Z3z`w@F{85t2vLW@I@ z>(PEFijLSDL2Fh8LyHwfmAOw!QZzzQVk5ZcCju$vmeJ3;hZ=Wl)#dnUYw+vy{1F+) z+RL|ov(9gqz2vbrDdr$T3~k%3)!_-hSel24TC{mA1acY1sM{hGCArV*5iZnydmV_N9vVU49)VoR zeX?$YK#Ho-|E?=}pHH_Yv!pCl)Bj8D>WC5%^zHqi_K0v@o1C^)>eCTOq2VvW^}p3F zBEGEJ$c(K6Wg!=#1Ghsciry=+uJoDyO!8K)4P=>*sH)cekwMM?f=IzpR9%<%hvEPD zEL_P_Vj-T&;C)Cg$Qwgz}l%vzcQ?br==^aw3H^{l&YV%f~p z-v@ZV*IE`OcaDW<$0n- zJ?CY4J&fSY;jvv&R9zvOBk*~y<|WfDRpv7pIWGzKtH@dnDX|gJ{YuT2PzS$15;OHo;BE20Es?6_mIa3S!0SHBjjo^MjUD29T%~DkvXUjPeYQ7sA!L6ECbHCZ3 zR#}#>V`FxH;>j#NUakJ~g}{!br?cd$X!W0G{p);v<=B^=D8qUb{lcs=y%|FaBC5Q2 zCTq_9>#3H5geW(;B3oKK!(25sj#X@UK1;6E5UnHf%=$Ys&)`Sc%<(1J?kjhB`yS?_ zXpm~O4BdmG{IYeIU*^_2_Nb<%L$9=!t0Ku|Xb6<#*gY=)97?v`q&?3JU?>aMfI8yC z(jSBd)hxv(jtDSZ10olq9eZTurp%1LnKY$B6U}qCqhU>~05XTaW7c~FsAIA*i z0@XXG%no3^>4?h(8@h)&-D5T!)J$6m8%8OrA0Zc4ua5n1|2VgBiGt=iUq^{B*KDdQ zg}^nnV|RMJm-|dTgRP98ka)UQDR0qv-nK?S)qt=UKPfZv)LY;_GH00xi+> z*=GlLa`y-BB(Dtv<*ITpO2@MEh1?~1AB#c+HLFfOcb9k1I^JUp>Ln8!81Brsd$GIz zsgQwkkqcYXu|I5=9;y>Rf)!Z5JfpyxlUDh>AJa&^$y##vuU6+RYpk6+W|C|^^2yb9 zh1v&_!bI;C_DDJq8F2%PM_euQ@gf?KrT@h&lNEvdt~ZFw@&vuG>4MUK70bm zv0dumEvF;U5`11s1o;t?eoULw&y%*}Q&i}d2=XIS`k`CJEfidccI=}!J~z$aFgAJV zhBUWIe{a{0kNo<W2 zt3FHaGtm3t{&)RejXM)K!*T5Gn>L3ITpZzklIQ);GOiEuc091aM<7~9Y<;t|yCAEh zJ7Qk-mPpy!ez3P;qd=o1((y)V*Y-NP4|J~HGVtk8+Ak3^Bt)Pj8hy@|cMH7M!EJTo zw=|r2AzDWaWNqEP8CBg42^A75e({u-r|UA`4@7+TN{$KKGgtvlxPs&4vk zcPCUEJIqTdxWcC(7ow@nZ&r1mEY#L5)T4Yl>OenqM0c`kG+A{&tB~-;#$n#_4}=cX zrz6%3GTjxG>$)!%`TG+@AlK?Yhk11xzeoLw&z90tOm}^ix_o{WM2al)o`I4a+nn6f z{dj90jxdl*mbu(-@(lN84u3CPSM8qb=`Q>-k6ZVAU?Wlx@%>%Hy6|l?kKyG z`+DNk1iR*NZ|NREL9QOZ4)?ZHexLj(Lw@YY^ProZRLT8i)0Bjvi6gvglRxl1L@q?r zt}|Ixn5;TAzVt>!AQxKb*r|JmxGSI96PnZHOghRf(srb`sxRLiHUem^WB+9icOUPu zHB|QQ#u}pV{E=QELp&AAqor;!Qj;FP&5@!bB51?0@25SVRaf_Co*X|Yp+obL-kOSQ{q|V- z`$+H8zc%@Gg|*<=eb{g}sr%MY+cS;Q5rJG->%Qkj{1=hwO?);at?1w zLoW15N4$S4)je|fk@ShxO0+@>t-Q&nt@O}9_>SqzdKGI`^43VN^|M=i ztB?!Pj?Hzfzxqh}xymJ4aY{2U%|{?wNBC9b{~zy>YWK`Az91xj;$#QZeh^<9gb_jB zBaxybK8m0t2m%I~+JVXrPvC2aysR z!L5Ql8S+K$+;OX9nXd=i=~l_L8X*)VHiBFAH@$!SOT2>&PT6{QM3yQ~x76Muw+azR ziH+bo$dn-c(J#mp7q1_=v&nr@*6J;Y6dfUJ0b0=4p>|LCUe6wqE&7$({Q^XgTZI%v z6v_Qm1RdQTC8(~%&acwP_kEN;9f6eCi0HbS%m!vj+tr>Wud5c3>(Oxjw=+)a9+eS7;1-> z*N^m;-yf<*q7jM`8xd{~lFfg7yb1(lEz$-0Z_%&RK5TTqLJA@--MDM3L`S!v+&AWa ztc!4|z2#^fNI}FTmJfOf?8z7kG2K$-?0`ZeT`Be+#uhipOR`E*N_vjfU=sY4== z5*rcL0V5pNl`Qi%SM{dfgGiy)q}t{81R_+Mi~U5kr_0-euhlrhfIVc@9s;3ugmr}4 zvyMU-h(In?j25|Z;!TW zx)#ZyB1fWiAO+=O9FVUgC_P66a;b83dtjZYw$Uxr{Xk0)ar+iT1ai@nI^2TMo}*k< z=I@==`)J)N6>Gp-P4pPPj#3c?(K?WV2z^JGcPd%CIwC%Ne{g-W99_G*Tp10a$71O% zsN$2jT!m2OC>^xxEaR3C!J{nX^)LebP!yCattFpngronbpSaIa7INLTUj>nZ2-QQQ z{2*O2x=oLbQiyO1l5BZL$@HEX2kB5_iE2$gcKu&1NKlPSy>*E81Ldmn|I$mi z4wNgc75fZCrJwX%^>9R}a&&J;S;(b4|1X4U|NnJlK!j@9oGmEFSG~=pwdAng6ZwU$ z>PaTc*#Y$wjq)Ri6op1axCMiQ$AO#U>&KTX>5rJGdTh?`;Tvg`xhn&eq>p)6uL{ys_Xcbzbo;W#m z$Y&9s-ODHoEJy1=Sqj1ZkdmSiXqDpPeN2r?dR-v}5$ZV@-FI=H0e28kx2^*zh@j^# z`4X$|A_BQ^b+79{xvI=pkhjx;l-P*>s$H~%>g_guAO#Vs9IYcZ!f*4ijxd7mJ@Mp3 z1g_|@4)wZ13L@w(xQ!o(KrS^hME7=-tIFJu+vz|`Y($jjhSJXE%FzzX+^SDEZ8kro z_a7D4mPyA5I*f;V|YT=QDP%h zdyq+fPf-Z$?Fy}GS0bb(d><|=Vo7ozxjPuPipi*Zol7FJX$SK52t`q7MC9~Cj^Vh& z!t1R?me>Qx>4&1=D2h8Tj(w4KKKLK6EVZ-A<-SFKVrN2)7+eP;kP;ga?FS-oG*IZA zen?AjUzG1B%AM3Of;S)i_~;;?&bTwdeUdBsoH`T*pM$t#A;%J_Lymp8v&nU|3)fpt z9g2eYx!TK&_5=4aNNaef2zNrF5o)%?El~&@C8GV1;}Y(w;SOZ9A8H3uN8oOoxNB)o zCfu*k5?SW=xf;8o5sISxKm_ks7p|QP?Ru}DJF#l>M2sWD*s2Ww)he{V z5*l!CA8wVQD03`CtLq%`@AGp)@01CSpZN3@TFd#{Pw z5rNiH6jGmxX2tgPSic8a(%Xz*v&6j}3^XZlGD}2=1OpfWMLYE8x0nMf6lWVtFos+h z>7*kX&+WwyHRSDU1QnMNXt3c-mW-KE*Mro8t zq8KcS6yd+KRJ$AL{tIfJtLp}NPE^01q7lf&%XGK-k|GEJ07`5G*KsZUM&_*l?}e~c zJkm*7$fK-;4j$bWMi>$yDLMkJTH1P&TQ*L5E+eRn07gCOkxpWS4!aSFxiZKqi4OW@ zp*vhx{v9hYr94TAjo|%?{O}RNj}l=7_gtd64i)>A6CoqdbcC|du}i$&&)l-?Sytlh z`!leQ;@#C_z=^CamHAVY`!W6a$4N(vruyx!xQqaDsq5Si8huPT`e1aEno}*ZN=-Rs z$v9ibK33>wv*ZhX-4XlZ%pL>I($4&Hf9ylFj<{poJ~Q#2fo{zUKboU!B>g$R`7 z*nxjbxmD(MVpUH~O{m@Yw3XI=ogWE?F6smSWpJcrc^KfZu6#vcX3n zT1PZ5_K^GhFBRCorSfNVD|W`3G3*n697ME^DB8ZZTX~zsvWlEaM@zhKPFp|LSno$S zbt`t#N^j3kyYb%s(X~>pJ+~7(JTp51xe$#OI`-?$_lD{ZAHo(_E0BO(C>P__9Q)oE z=b8r|8SADU|2PBd9a|7*&W>%b&&%#Q*Mt3@*1Z)*Y+)=`^&|bgA9nGm1s;F(>8EvA zz8L{FsKobaZ_ORx$@W0Bj%fJQ6Kv+)hTE!iT4wzw1L^+QKy@<8LIg^pxB88Hu%Eul z$EMHtI0Ly5z5Vh)uV0DHeml|0mxZg%HTGyWCiqd}gEI$s0}|Hx_W@dhJ~{Tvl2gp< zPmgE)j%`cFsIW(h_VakOA@^2C)O)%J8zgn?0d*i3qUniKYKmF=neptYzkb?+ zIxyNyM--ly>OTAYz$8BUJbSvN_g%Gpz8`925M!4ZmH1uzVCPBhrngI(uYWW%F*YI? zxHh?@x97@1lEe`wUv%8bgiR4Wk5m+ngQ^0aYg_ok&d`A?y30q z%#uZa%RpI())AL)rLwc3V51GeRtWkJVTq*N24O_33eOub=ISkKwROHvJOV0Q z_H}US{!D}ZRTNrn0U}Z+#9L=l*{G4 z(#^4}d^Vo_aL@ChOt*oiV^HZ^)=#U&*rg+09PF^i<}C_QeHa50Zdj-OUG4X3M9Ayn zO+$0iQH^x;PuF!I7or`z(%0Qsg@+6Kvl+=n>H@ONjq%d$Ys z9!&dJxktL@{Br5I1BE+N8Eem5k5v_t9J}eM{A}3kkGr`STxx}gSo(yHZ_earakCzG z@B86WE963S{*TXF!HAAp=dYT@hCk^(^?^~EG?x?1Oxb;Q; zr02G@qq~-L1m_ZEj)h!^j*M5_B>E`?a>?s)ai6I1DoE_~ClH*H17VC#)(`{;Bf^wu zgpBu#SVi*rkJpuu#mkaQTo-j1K?s145EO~#@rkl5ta_26Kfj}szrTI?N!pN)M|wwJ zTj=F98wAmFxMD-r!S0l4CzJ*l|0~TVy_YV^v!7btAmP zbr$m?us5vb3xbGIJqj&^pLWmYe5WxPDXd#tO_ zf%;IAWB>Y9H@E7;h1olY%BCZt`jO#O(@XpwbEeTS@9*kMeQPPt1nGEt%r5iyCAtoj zi)hDAARV>r!feVnWz!FqALeasDrBKt9WnpupUh={P!5y#in3z$yLgYDSng}@I<*T~ zwZbnS+ufPU%aTiUZ%;k3uJe;w?R-OkF&J%7sh^shbN?O<20S6DZliqF;5eWrlOC)2IiP%qF_=sY;elj$DX#><%TLN&kwhI#O+6I%dN=Qm7`5Qo-yJFC?*6zFpZgdn z_h$3K-rwH~3*~iUpjb$F?burfOikZIR&{ycjdZkR zN9*oh}edciJ>6?St*T#csXcg+qfA>JI?r5PMEkO$% z`}E)Q()W{9&F&ea>3H4^G8XEl z^B<4S4ZTf>m#!tX;^%y(z98fx7or{eVFnvLVUf#dg1lOXGkNa(K^lC}~bvyQv z_XHw2f1`A)6XZg)W3OvGHnexaGc3=<;pu1zT9_}hA3r7Jj~Mif`lmp~DjE|jjQuDL zt*U;1Z!dH;r-ihK+;nVcA?b)u9iEP|P)F!SUvJtUQpd~#WilF*jxRe+Ov`2T@V(`G zFQ_9pxvzKOZ;5DhO<48KkdHJ3dW&esUQ?uWs8E|p?5kv}W$tBty|!UlXvrTF`+6O& zh#uqEdzzIFO`;v!TMb&bMB9-I(NtGg%Vr+io67EcV#{Y}FX}_IW4C*!Oy;_MsjOy- zjzBIEgRmkzmK54nCZh?}l~;I@<~i!q5qvBZKfb~n=Fj@%jEv6!MVYR{j4TQP^DBi= z^Db@8Nl^8cOud`R4yfzd{yfo->+?ryr09qhH2atPqRIzek~+9t#ijN|#oC#3ighi% zqZ4O1#aUD(NxdbLD`BaFza`7|E#dE2l!fY@S55?SsdCu!h*c<8w@|&6^=mgM{lGW5 zh*0I6I+QHrQj&7EheTkUHb39+Yu4@BLm`k$y+w|;3Mq(C<)G*#k-CbF2nJLZk7yl8 zLAff6M>GN{h){Vn{u_}It{+}kvK-w@^fr)v?7wQ4_6*5O@s?fn_8^>Th_*_-WySl0 z*Oj_g^t(1T!XSh}_o&dVBanh}|Esr4?Ln#^<&%219qk8F5TVLZcdd4=2)UG`+avV% z*?4d2o}(<}%JEj8sz{Cu?fmgW#Q&?YBu8{YFct#2R5_}yg6OSkO?~Xr{XpAwglzMu zx*~s+?W+B!=NuCwo}*k<=DqUvIus=~BFb|TC1XFb10Vj$`zrsN4QJw_5m<|eQ2jU< zHToa|xm24+>p%)3RPTvG1a(W4Pbxwv3Sl4xYeAKxS}+(J!DD7rtdZ7B0Kxl`wCcb5 z70S|k%omZnz}FE}y1Ch z7o{VJ^`m;sf7BHrPj zK+lzh*#XP~ruP!0AVOIitpgFrb$hFjf(TWPu3fzE@IFWXG(QZaAVT$$Xg?GMM<2a4 zbshTCKxIJ0*7OmP7DUe#I!1d$5Lmm2z}2K~m5%r|-20;AEU917Pd?Av(HJ7vgR+dV z&e3&+wTs!;u$^?Pkb(%z0;eNz9`(n>RlbEh?;Os3DWhE5E9TDHecTbnFQsF=7)CdJ zyYw8*Y0ME?TJH42N$$yC>X{g)oB#PiUZF#)N$w_1A7v2ewAB3V?=kGff}7JYb`T>0oAo}K z^}#mY7Yuq1j%IhVxq~{f8@>NYM~aGpHMCe>$F{O3v+)~UKW>TN&$NmpSwU(wSvCSI zMxD*NYwdpjx{g3fYy`LJ)S`Gc=Z9%YKhVF5E2zoUBTVNHY{4c!6qm$WHfE@!Sp5rG zeNOBpOZZG5V^Ue$@u6{FB(Y+TR%LBAeZ|n!@kXdKuM1M!gEdCem##R zRqNM;mHYmma8H~ac)aC}tTh#P`WB)j%JN^Yy6X;@YrghZQ%wgV&_a60l9Y?Z&-usv zcvCYL7k5XbemXQS1=repBy z1w2{PsL!#tbg0g5&R%FHro}Vldb3<%Z^X%O{Cd+7nd_>td41QJSC2Q+5OeM?=;f}v z!>=nuJNCJi@odlZ{Ym*o#IbI#74|OI`OcS%T-{zP=pDH#Bgw7r8?#v_lgtyR8Z(qz zeriFlTd`d+blgg7!%oy&o9MQ?hoM|V=sJeo74LQ#v?r zmEivR;oPK41L{X16xZ6XihE}}@$rhs?;if}PFDAy4(`SDnp)&CK1(K?K5vP!oj(oE zuPDtDKkev0KNMw-rOJyeL{t3LmP+i`*W0`M{{A=-pI!3 z=00!9CjiD)D>S$2uce*b`R7ZqJHGsWBgPwJtTV!Cwqo=dd zfpT@Lj%}XcHau>d(=NE<`)__mmHi{@C;v8?s4kzh(CmquSnT-&u0>NlDpd$tMGy z9{4ajG^|`RR%Uh)4S`(aL))zpC%1<0sNr3!yC+MnHz!wV#Oh7kOA&u!#6caX+p+Iy z-`K4%YMy!VdTmX|(W?iod)D!>eRcpPIrf+><=pKrZ8nGRYtHI#_|Ot3gM!*_U4@1p zTQX0wV<&FoT0Z zA_8Z!j@|w3y6%ONOU!5OdYV_6pnYd z)!v^pzc8OI@tGZ`1Or$LIzm6kvd$87I6gyK6E5>n6m>)+q;?&lbUU_}zeH$LnMSO9 zhh_|W!_EEQQtgU4)zPb8TWYrS-JK20JwG*L!@jPsA&_gf=UQvq%9+gAjb5nCyg1gO z-Q5}jdm`#{>>sb0tipu**nzcq)A5V}o*uv$amOx}(t*vo=We#<)PMv;;5i0FJNAqH zu9#OAKgm8_IXV*~)G^i_CD9tE=x|o(p)9lg&Q%GBKrY>?sjUXMXV&ZqjT-f!iR*#X z--mcT27Ky|UGCzcUb*l2{w{wS~| zU;LwnrUMcBiY1%k48FUXhrWTue<>c1N#&y`dM>YvvjC%-_hx@Ly=lI5v}!Ai;Ky3f zJ>R^cyW9Su0<2EywF!8R0Z%Bb{jV7jR9E6`pP>+f!dp$CIf9q@b$*(I*D8%Re(fqQ9vzDar8|OfeV}g@ z>JW03j?Z)*K~52oCsRm=ib9dsxqlHI5vw>tc#a4WkrE4`D7p@eVbSY~tny=H!d6A% zWR$hhwW}z;jtD|o81W-gSCsuJ(t@Ha+CyHa+zGi-*}O3uGezxk9U{uxIW>^Z{4AiT zpf=Q>#C5UjJeN+_l&e`K^vIt-wTi_>k^=nReEnQllI$gsekEhigkD1~ zG>1aWu~d1HwP@s1UgEKJ;gP!O{X^Wr@9hnxtub!gp?|iO4$I=m^cgVZeNam-6-Ygdk&~?8||5EuZy{8w~BRw&E zM=44y1V{Ubpc)wjf>Y=(qJy7;;yUP>5nBfl{8Lnt3lLHFIX~eP<_bWWi;i56)}bhf z03Bpi??V$=tzK2br?C0iC4Lw2@70JhxA5Tux2(?h%lo6&&8qByLT%ZqzU9+{L;toK z{3W8f%dNabsAb&SKTQ-Lh`D@`OSn)zzDQs+teo{c{{5WL-t09lJn^$;MZ$%llQZ z%kit$rcZ<=XqCLq(X`qgWU?NW>$1j6pWcWRM4*2(3unVw|L$AO5Aruo-}v>v)}#L{ zCO^tpXnWb$Zd!9{FY;@FqPz()>9MWmr++m{M=nI8e~#T^Qcp(TJILV&TKLJm*Q~*F zgny3RdG8Q5Y}g+2PwPxNYJca!Yu2F|f(!LIcBwoMvR!5+mbhg~!hvV5TggkfAN-`2 z@=4e6*mFJEi?q7yT71MtL?9Ph=-6!vJjklHsKo3SrX-*xh(LXQ<`zb=`r(nmpc=eD zy_~;Sk>%`wSfA%68h`V{xfO!1+yx~zB0F-Q6WyO_oTazNMM)OQ&t?4nlV{ zLQ!HPclSj=6@sb4idveyVe*{GR+PnNu{Bam_% zgg^K3&xHp`Zjf^o$vrBfBV0BB?T?A#Bsn283ZU`2&>=_ZAh$}&g>nF_)e-2SUzQdE z!ncasBP@%SEA@eeIzsat(7qoM&1*L@a}DA-dMImiMh#)$?Cv&*h*iQDM1bwSB<*y6 zkn?lzL9S*yoR;@%SMWz8kPFZ4%YG$vAO#V;9Q_@W*a*pmb6;Oakof5@=pqH>VvR(s z@)1Zu1oU0uIoClyQCD(yk6c*O5gk4PZSj_a-?_t1AYd4j)f<3^>f1eew*laI#Ai%?AG3l2;`b@dZd^4pm4bDC zIw9TR)++k0j5-O87V3!Z2Y(7pd9W$#@@O%Z*ZrF6XoWxSIvc;T^FBo3OC-#iQ1XkrTO(A6T2YzGpl;Mt>A}MD{KtKdJ^g)O4+sa^mD1zn;sGr|5Qk z^;p7u(owq7>{ciXb==uA+u9XA=jqs_BT4F5`9?=i$~6qzllpjB>EM0#D6J0)<>M;~ z#f29BH$uungziV$pZk+CXl>hW*qk)9w?y~j)Z@h|+-uoCTMMa7_D~D@!+gh z$c1RE1&SQVdmw2t>1g}xoHUe$=rV!h*2ptb$KYH0lU^f4IYN}^@LQz!As3=4FV2j! zNxj=oX0u-(k`{XSH|yp>Aq&wuVt4K-X1)pI>11)4goR5_TF-A42tE zQDBOh{48Zp>QE*DDTvT@9HI=dWiF0jZ@)Yz9d#i3v+I9Y(+W$^ha5O&j!#Nqf2V9{ zg%m_QR_lWG#7W*md3#j-y*z6_y8|oL>ESeuGWbs`{*z_?SfcN+oIYEgHF~WBTR8OL zG~6A~xB%_gWyz`;WYq_~H?(qqg8I-x$9}2wLG$86%~`>U#o4{rJ4a5%V*UZlCP43m zYaBF3v~SMll`qba((ScQ{{4}+TZ2Gpl9V@czP3%uFXm$U0&3NJifRbtLfv!^ZY|A< zZ*IXZF3&WNKHJro+jD@U6;LLv%`d#LK8A5Qui{n{U}kOZzou&F^W! z4p;B!`?0p|Jpmk7F5mr#_e3SxuU^lzlXeo~SXCW?;|ikb+kkyGhX&*s$?|tvlfL@T z0p7~_Vl=?>ym)4ua#_4miyazF-<3W1wpP1XKX}U6u^F8co_7Bv7I=C?0-oDN9jKe$ zC{}6A7Vd7!%Gb%K=|H)Zzre2%@jmL|6LBn){+@M@)4Ens5P>JB$#WWW>-l3Y-C<$G zt{nsDsi4pj!LREGq{Ko9tLpcu8hZEOM7DR%Y|1CYW7@?jWvm6=^QJ4Nx4cGA9P4ri zZQK*(7dkb;O4d%F1O)3shA&v^~e zV=BCsQnHXs-Ya>#O^HGvMfQ^C-=6e8T7`(yE5%9wwDzN-bf6!|h3%yKffQNht%j0x z1X8d)u+}9)#<K#&2*t(czViKNEQEYB ziU?j-8G(44^B-?_B@6QgiTSmB=OwrmLcQ}+a^;L1-$BMgq>v@@jhWKz`wzVrJ0sM#Txs@b_0|+^sG?~Q zq3fWpT8HTC*6fppbrYNRUS-J$Wx9LARv7_AQzKeFm? z;IndW)mzU$!+se%&K!R6nGD4h)VKz}elBYg<8SqYgjksCJ~sVKZ8Isel@?WuT#L{D zne}5083!=$g?emo-(<7!j%Ji~=t3m+81?Ch!oN0l-PG|(Z;x)SMX`20emzUZR$_dr zW6$j0%-v$9gihXfpC4QM=$6A|@9Y2~Fdmk6ysAAMO58btectVkM2t7aDBsPH*a(Qb% z6|zvSjwqb}Qt0iXec73J|4l;#a-lwoJWE{~GR}@+=?~?ntfwl{8g+~;mB%|!NcyqU zSsJ?Ik1?!BQyqa^Z4&c%`Okk5_Pk`b?8JvDFW|bwYiX$C`;vLXk=;fBqp=-(R^#l9 zu7vpK&TFku79voRV;?Fq)qJh%c-D8v_5_RzM!D~n&*u%TF8!D|Jv%X(biDKP)wBW| z@_Lod3VRWO`W*Y|VpGj-q+|Fu+Y=ChauH4I^U4pK8M`O=Pc`IH7SdZwE%y9y-b-fT zVtqLxs3=C@T>1Q7@)}{gy3X&YN&j9n-!9RYb(~ea8FKX=pWl16r07>VV)o68bef|t zYuKlI9L7x}7osVPIb~_Skf$j-^~$z%?7JA*{ooshSFs_FbmYB#@r3+t{DH?=+Z}ll z5P@8++vW0x*}_7KBg=Iuw1qr>d(gEsq+owVNsgVJr>WbS=2&CqZA-7v@K)AaHFylY z5kMViA?5L!*vp;J+hFs{-k*S!*Gk^ZdY~kajyD1*iPj$%2f5{z9yY%kzat$HIDR17 zu?G}Lb+->$pVVW?_Vh>oy`EM3a~`K{XfgCSuF&b4S`*#9#~PV;Ur0(oxrkoW>qgdF zZ|n%yu0d9HS$^1@`|6H#q@X1z$+3SUuNO@0#pcwwKLOhu+j-OQJD>%r%^7d=Yp-uh zM+9!R<6aBB`{RB7SpZ2X`+Y(0&~ou4!-#*!ewW6PW;AAv z4DCp`w`M`F&1%v6b_WW2!=DxHto!jjdA{z(MYBWof71|wTv!XV#vvX1NJl+)M*_zG zBLekN_B|R8kG9KB9R0}RPqBUwJ!yJDZ==0C+#Zh?PGzq@zAout;qB>&K(4ReD(IDa zYEKxkxZNaXe12Cbe$%a1NcntRLGQJae2>ovpd=baX#^ck&)XKwuBRad5!f~~Qj;Gy zYiIL!oIz!~5m@+QLGS!TaX+f-yv=_*GltE4Z7HAoXb9x$G`^rWHjD3D@}Ag-bbS6w zcH;b9tDB;?h(LXg{r34Wtp77h&EJE=nqj@8Ttw4prv{14omJl@jRr>7tMVMH`jNjZ z8NKD$)s{0>b@RRMzPWLU7+tRri=q&X&rWtfe?C2_`GA)aFoqt_1&BA;@+?3#8m|`8 zcN(}=NReeeb3#cJPknr%yM?k%KV;9PY}03{2Di}P>;OjK>xip2Q{7&(-$~oM>XUSd z;IVaoOgv+)SjYFjH<1J`>A_?X0YTaK8UF?d|Nh6>P8Y4e_HLlJlbfs+qb?JQ$8{~D znfVp#Ws6_uZ!It9qWtjjS)n}H4NT-hG@e{=?3$e?u*YZQ303KGucia#8pb8xKM@I7 zcF&XSf^jDF(&2kF9Vi#uiQc%s*N^eTwgH}R(9bl`v%}@j5dQoa`^R^dd|IB^v&WL- zIi5XmY?@)Xe5S!?8A!o11}I6*kkfv-mWDCr7<<0|uAP>gEz`W@*2T~;8W)Fo*U~18 z+-b?#1acwTvCGp;hW^;q+1t{GAK7Ke84GfuPdWlAh(P}+E`#PixAs5IT8Hu^AQ$RG zYaKhOL|=F7^^4}Kb=T08X0KIqhjBB z>wFaLRHcPKx}_g&%+Ow5&h98qnXak0&ywpl$No8gGxz5=7AO9Co+8PCf>xmKux{_yQi~u6kb*|%8W3c97C$w#l# z98T>spjG;=0X;DN7UX_lU8!;~z{}!946og2grvkqaI0Rz`p z4k(wG)u|ggcXz6e`=L?P{I+5e`>xtY*3gVY)V6$Q0?~+g{74ITTcb~sntardP6@5E zo(UZw#Owf~bsZo7@u9imoyu(Oilz)t(d4fCMdUoryYsT(oY&74cILV~=z&tN*~*<~Q!q5RVnxX34Y9sL!!~8uo4Cm?DGO3r7!`c+LkA zXf5q!oQq>KyG}^DXGBxhy=5k4kmvVvFwo_AM&!O5o%9)=dOc5%Aik%)DLPoMr3zqQmZj@)7S_oIK)(!1`k#z`!q zZ@8%wRfaLt6Y*u62=V%)iEd!(3mG3btfT2bv>s(qeZ58# zO@p!uEm8XT{ECljbU*kbHBxj$3i!d1B%@F;Wbxt&8z0-=&ZrurgWWcjh`uV6zG{2%hcI@&O z3CM-$6OR<7Q*^(QB>pt0{c#KTiMEaX+C_>&8cbc!8C4_5 z5&WBB!#0d&*E8P_m3;X@bAd#ZoA+RU@0uyjV<4KM6Y3Xn zpK8#JHJCdn1Mfk+i)ML+yzNh)qMpcSWRw}+T~hNQ*6!}76OpoROkuC>rjveuMM)Iz zQ>C42tf=BHShF@gC8fBRaq0DBF01;H;@^lFcO%a?^ZP!eSX%KKYr=cfbM zHMeIv`cd}rg5FbU%Vu5exHIux3FKD|%}^N)-P?4uNe&VWd(i~yqdJ$xfe_83}!eicCsy+CdSN;Z;zkNjtBG5uU!pWb% zX7kVRi8G4&=|hTH^v^E(h@ij-grx9x;St6XEw4v(5Xv9psl7|kUv_|`(1{U#-hh|+ z&fVR9If5Vtj!=|nM0UrTVFa9&Atr;aavkC{htek{MV-eXfTAdLc0gUvrZy)E{p8w~ zBgT@BB>}<3%LbLXZgE{h1d$RO!FwWcg@0TR>QHjU^{S+2Nlb*GkeG-iq8xT-_K;jU;=-!ee6)7@jP!6>Z-ZQ3mTkkwL|(hlf`s6<3yMM` zg0~=Xg@2-#Tv+vPl#c8GF_2F}cQis#ln#NAy0w#GLCz&~a7$zvb%gsBe3f15xE+Ff z9=H4{w!6aDW~JdP)9}XNBN8wi1ea ze&VUI?85$cLbEQe&v;_i6-%Dg#+`KB7pG@b$Fc0esdGb38gI$KeSAcqB*$J-buw$# z{c`3LtM5%j1ajpv{vnI_8xy_~{&?+V_UVhe{quv0GKcoW6c?ho=W2$mxFkZv|Eud< zM;Jl<)-aGF%81})KyU#6Q7v|d7UU=AvIFWm@4ILfQg~UM29yXjCi;E^iG%-0CfA{J z@$1Jr_V=$xbObp&{UQ`zmSe3bkJ1sGoByH^f{S0LxH9?^V@afTg9;&fqCCkc5TZsR zR?$VivX_43M94Fd8iJ!pb9C*>yGzt`P6S#a>PH}A`VrP4JmmTik)w7wcaU>QS-hOx z@j1VKcvtbt82q^cwaex6Uqlu!OD<6sy)vf`c@{MqA)Z&DgBbiD$rZBbzrs&7 zSy!`ltHJp<0?p4?$Esa%Ry#Yuxey`BQN4tixa~rgLdX$L zoZ-%C6(Yp>W2sMAt096yuAuNTBIL?KLl6_UT_GfwxL$&2u{@V2p*dI16VkUw2-^`M z_5HV1YQ@6!<++Vjl7hCYa_sgHvXD#o#IMIf=yj#ga;2Bk4@psSMJ-?s2z~THgyiCA z^_}YIQB+cdAAB|`bch*XtoA^JMhO9(|#Xwl|!tn@u6M*b7MMC{fGE;T0dTIc&d z;{Fi)5+NycRU3EZ?v7($rIqj>^v9KOOOy^-mbD^M3{806 zndh~5?k;hjTl1VD1rhowZ0R?-p&^hZkWQpOUDSyK!C^}-4|29j``eGye(>39< z;l8ABS@#2N$6C-&dXt8r&=O=wK?KkCwtBrhO)hQXo+ARe@LalfM=_)z0>5Rf`+*ch z@H}^yCW$X;>pBpDT=>;sT?bMS!M{mR?E>fsJ0E0-K(5r^2Y79s7Maa-s}O-)`pHSG zU8Eo)@mN1^+`d>k5P@9!`9aiy6hw$~Y~swY?gt`}3s1i3wTl!TkxgR>=!n#=j!<0s znQHU{DfDcL$mQR((Ap!S0}&b*oNCtn!1K>#|5W&lW>uTrzUi}SGI(!6Dgg$}bPwLn$hzR6rxpA-;7q?KaE8h>KAVPgB z3Hq*Y6(W!;@aa&mL-Q!leH}d<_ox2B>zo56*14O|CO5D_bn za83krVP3t+SQ3oZfm|7vMtWB}Z&I~O-24}0NI`^*3e;8;!Ds|>`74WXu0U>;zh?He z;5tK!QWtQT07YtK4mx0Gil(;OIRi3se`eWQtTH(lgsU6&>Ed_tJn%(0X6RCiO78?l+2 z)@umVfoR8Wx%a0~srF6T*IkP-wD;hQZPqg%ET>tZLEmOk{?TdjDve#97v~eoi-X!x zu3_x(Eu^nKFXvdD|Go%Vbx zM>6T44pA0ab$D#R3i63tr6UwY+KvdJqvFKLp&zf(H_3X|)>?4o{4cC7lSN&f=<8WK zJBYGlr_7ohdXf;Q9XnBQZR8Peaoc4^B=Xswv|2Ov0{#eXv(?#V?sj8 z%~V!l_nri#^ccYJs1?b>PrgL!G}KY<%g+<$5~6UmMhPhQj_3K=;}yv~BM?fW*uj$H z6TTwEL!B3DIu@Ph{c1%r&oqSk=ydrv=v=TUAGvxL?UnNK zlH|MAmZbJr_Uc5oWbBs2)yHavCbJVh<bn!`4xTj&84rt`C~gG zkV}>M^ZbrBS3-5`^kJjUUZk%NDIK`ug*$9?^8TG)LsN?nWG5?MqOT7r#LLzI@4f}X zLPXQK?J09Zr8}vVzU?54Iu)#mfS6J)78xHkX2=SUCu05L&nzf zRSMrd<8vxmo?|HsxgUr?N^FFhA^Up_LEK40gt`thGQX~nq9de*9Pu?}#QTLZ<4r#B zY6v|<&oQSLoz+i%$9&Nq!*czSm+DIG@9`C+*b7}`@o(A6_IK>}cJwgcI`u4T@qAfo z4~0N3+{N?jDoNHZ%0;v)b3aP2D8=^Q)to(3YNzH0+WzB;&VD=H-{(0(Y`9sB9c&rT zuFuL2Aq5eb3(c|14LoBudxyShS+0ZbT7r^jgzHk){N_Y+w&;!qVLy0pf5Ad7L_7AP_+G5Q4uiFS`MC_t zbG4@8Us>YYS4N=u%jdJIy!a#CGeMeV@Mw67iZ|PR+>`Q`s61DQ))CK^%j=G9-_!5y zf9>5&XQzK7Sw^7T_vzN-E%|waAe0T#(dMB7?pqtWvw6KgOK3e~6P*SWXRr`~lIZ&% z58UVWugTbq=Ne=n0=eSj__rsIhy8fJZcBH=%toxnkfNDs?bp%QD1Y*;LM}v83pReh zotjjgEk1fG9k~!47q{LjUZ3APysj3|Ie?uvPMD95AD4(+#p|!NWJWO^G4TGL?yS4= zvM#xt4CH!$+gj^%t)sqN9dWa=<6iEz#JsWQnRGn2i|Cdc*H{A+4*LE%_O5?Nx=*tW z=F9W?C!kzJpd`mGJTKLK_W6PSniJ18t1_N4<}HW_b^h20#76MCdj7GAZl&t=%opl5 zPDJf!J4$lwZ|6;LFE;7qpAAQfDhIWb%#Qt8qZ({Sn|I71_cvwOM=_Tg_G!oN*0LzO z5uar~`IM<4Dm1*3bz%>1=h*>7Qx+)7g|wl|`lQLDx2K;tay@H7J&^?lGaKo-kgnuU zb-SKjpY-wX+tbG!yq+cV#vocpyi_FBE%4;J%&$up{w)9b>se!`@vrI{0YvMF)U#vU zymbDx9G!hd%HnZ1vIbB_0ggsVjvd%J!R<>KXr|IRVMH8w=0=vx8-!@b-e2os_t$T0 zhgLptCqpho^KUQ9OmlR)=4x*D^h?)685QES9CRo4+|24$jQ4i&t!J5Ah|USqNu=B* zKMK_wt0Q=xD#?Yq9eWDphUoHkbS>zecu>?2av_?YQM)FvevKXu^&R|g8X}MjGxyLrul>W>w3N(Hhjw`~(5eH! z7w|6K5SH{#E8zA0lb^`vR=vD$ILjKA8M5Q@WS}L8KuM1M*p^Og+3r$qvpc7Js>z~! zRKt#l(LhJ=EFtvg7M{B;ooBH6ZO>s}JI{snUA1sNLqPkPLLvyB!AioMEmgcets|WD32ar-i<#SN*ETU) zUA@QQGr&vqw}o~G`Hq)8b)x@#dZK$BQ*iN}G|9!wn`mCDBG+RfxGWu^>lj;NA{$X@ zTvC<7{A@Vaj&g;*zxH0Sx_>6hj=k{4b8Pw1=abHltYhBXf01Ux0)c29L4Ae)g7iOz zd4u|#_|wXW=WqBn(Te3aYv)W+)^~)Ff(ZV_`qP8hE%UxWXDL52wA;@^`#UX#ZG z0K&J5$FRtHM?cV7T?bMSfiJfnOiDTeDTpYr=A>0VFV6@C?Lo!`86uDizjCeXKnf!88{#?wDTokj1O9EgY4Duh+D9lvTbTh(NA?_VuT4b@I1MP`f??DTru2V<7E#uhJ2|RY*aETcy9Z zYsW`A!q5&SNAZhzFc>sy5gk27|;C(vwlM@lhb@~0l^j zKP2-r+#aF0v`i1$3;-!8SKK#Zz7px}e(fRxx#U~GoVAM-9f5Bxo3`oX4jFK#yY-dH z89b98&nH3eXSMu^c&AY=?_T5F%>~{F6;8{WfC%xV<|mP6Qxn7#xAJ5FsS- zGs--w_`eY1jI-4Df{ut-bzzmD2)PsfKdqunoj!u2k98cb>xk)x4=C`h9M|I zu860{8u@R}Rg^!kbs5?JUv(v0P*^3}i82*ZPQdu$Q_X4HwFZ`L8g;A95j@GA`C_({iql^%gXeG(vP4;+Q4*c>o^em;V!MWHbnRvgWg%Ke@R8>lt?JLxpJ9AW zI)q%*A+Ae5aw2kCh58)3R^fZy_;efbj_z<3r(Ti(U=*J zXR4FCIQt&Xuw))-icWZ>C42nj*P*xvN;2d^^ucE`BX@ygH=!KZ3w|sadV_LcBNt}e z(-FgG-QzAUJKg-_wN~uf1hVtVn)YtPww-zMotD!mHaT ztGvo*h+KpJajo_}c`xNVUg6y+cJk$I=_nVu5Ka5-H0ILS%lNp9HHtX_FU;R&$?qOe z3(~kw<2&PHJ0g$^Yn|S!6-Z@YQLg*@wtth3eF?Kj-f=#|Qu)G%5~4!N`lL?ZeUpCt z&P;3DN|8Gjxe!emn#PP`-)4MlemVXA1VkWL*F%}srCB0pu47NQIEbyMoc%wq{xTi8 zu%>lH$2_SlG53bdN2}hSh?Z<^k!h`*FLIKje-!mXImy4P`EY1Qm&>0b1rhokwUw-z zy5z9gXVaJIt!IR+#l=KUd$a^CbnJXJTC=iKYOul=+9Y5*BU(r7`sb_A-(Qwve~yaN z^7Ub6JUv6xQ(uh?Qx(}B>&`Pc#xsC^C_VvE|MIcZ&`SHr{=8V_+yJgEP(R4ggw4ZnOJC0~W zdFYiso-h2QnKgQVYkj#!L!b^sJ9hKw(?e$)-o@5D@BqX9iv1Y#l+oM1-T6#o*Cf{p zy`6@B$dz}rPmcY?3sv1iHP?rpT-$_U<~YpCHsfqDFYA>zY2MBw&kld|U1;T-ABFbs z?aq)(BeNmp?I#cECw2{}5RhfQ&eUtS z=NotBb*s_a>dXR8#<)8R(RoLn=Pnq)Ja?G?jz$J|ODMj3d3XJ-W(*P7f{3Q9L$kgM zy-@2$sFvNDAq5fG#~i!u$f=p#?`*_AFWZu4GkM8#F?+=1FNm&zYH{Ou&awEQVRdkheM zpd>%5qe*crZsmnN6Oaon{AI$mEc+LMrdWe-4VD$(%dPXua~ViM!~-)fXVsm?M>yUd zFE=W}F2r^7+XE@891Nf&ihCX7uL^j z%85)~8CXB6Yy=SP*oZ(%Yy|fs#cW{C9o&fB*Cn3T=R56NxUB^(y3j)j0f&* z%CZjW2;|bo67qp@%eWuSdjFjzGd`M`Gf|(q&UNHlQH3?A(vDfR)95=`m$GCGRBQy-F@z$iHnhHvExtc41GOUpB{}vV zPaZW7RxQNFnk^YplqEs>%9x6oaqPV>er0YSSBMqeYqH#RZ)TPKp2v92*0>N&nd@I# zY(Db;C_4{0DT-&0ujC|>L6YR0j=Lk>-p=lUfGCTAAcEu|qDWYk46EWF5kV9I5rN}C zPy_@d9(&W=f&>YYgMfl05#&U2epS=gJHOuBQ{R0af9Gx0x2w9Rr)Q?8t2(i=F{yfe z10{F{u_Vf!(7COvzT24MCbOn{8e~E5&jJZGg_i%#mHklJl z(;K9Fm6`wkAnxscUeTuRoc6K9J)`L+&+3*u`tTXNR=kLKY~S-tI8e(z_PebWX`wvA zNT4J#!Coa+{Ki}`Z-|)o_S!hK{^gcbkGzw~ReH)>x}t(b%yLb~h!cNwpqXucYnT2a zfhC37%BqK)Lz0Aj>~~{HI)ReN1lOa=>2oPZ>G_A-3JLqz??w-4&llP&rFd*n>lv=j zs!N_H$4{nq_q*+5hg&{J$lrAWC6Ng}gU``ECcOq*Z;<|46aMgYuEaC{ewuGp#}2T^ z^+3WdH#355jA&AnR@KNS0K0v7$J6tkNtdNP`**gn`D|aamv4l)P`;)!vX;Zm^Nbz$ zFwHh9wO~ zgGaB3wpZ?NM6Zz62|m;G=coTO=)dIaVET8;&Bu0bGQKwXJH;vTiX`cOOxP0oQ6uDc z5hftN50jv!jz6IC`J2wW={9u2me@2B{2fQn)}!jdTI!hVq`b{Y*pkRZq?*ewF{<2N zmhVhs{zUr!tv}hiN+Lb636fWb@X%s&WB&GE!*Ilt8*hWd}?Qq2tI2n_h%#`{S2ziMwSirO_1%W zY{OiV%*vOMuqBa+u$uF@NM4Ok_np0xUlDa1^#A$kAN^Tzqao|E6%?U7%-9prhB`jw zMp|ntvZH$Ge=KA!WZ(-&nQloNCTC)Yn%e*h7A9m;Fjb%5v>h#w1y; z%o`=WvNLn1w-KxRZ9-}xp`HxbE6WCH^PjRI38f{yElFOnfLgm}a=oJ!5i@j3qmXW}6(L9<=q{4%cjw6UU{4(BUcCv& z>K!NjeE3O={h}TCrk?7`<>?h=K8%iSW$#UiKNU{O-@Uu@S2`B6) z%kX}s-T|0UTJ~|I(MMf5(uREv{!`7-cbibpsG)N%t6{aSO(-pCua{nPAf!b4-oetc zk0aM3oKT}E{~no8`ByXUe3IEYx1UAqOs?EZt=q=WnWS)%Ka6Oq3=@p{HI@0de4_va3rtr+I~0W zm82t|!Ei!(#lJ@)a4fOkKiFG2K1T8iM^2s(IOXR0sW+MbLMX4eB=+jr3FC|dqlQ}% zhZv7zAJ3rOt}#|-@?wg_ANN!Is7^xzC_#d=ve{YddbJ&9yj*p>>wM#z8!@+?^Vgf6 zsO|EbxlXL!G{X2bxrb|V>C=>L!PY{1I$@n^>wkE}R%0L6R-ZLcD=4|G)So1jL?`%- zh37c9t;W`N8b3^_Z6r94ZJe9-m*+wpum6^No~xWSn6;4Rkk^$lj(_}&k?o0OClaWI zxfFfgrw%3ceqwb*uw&6#A?c=!~-K*^_Zn=Whdstp!EIShR z@eFF+CQV;8Ui@mm>$^waJ8iExYk+;iuLjol>jf9_w?YmwUj-pvy<@ekr&+Jh&oKWKbust48WzU!ML2~rb=NXhldZ-9>r%or> zhM)eA&tig}5nttz)}LM(;6FLnr=Dx+2gp2aKL^t{`ak-bYu+9qnBiTZJMNJ?2y!G3 z$1%t}Rq~irsC5gw3yZ7$+lmEc2gL1~{|#LqlE}4mvFE8D<|a6Q9cS%wtxBS6FfhWL z&}_Ka+xUMQQ44LLZJ+n>q^=^RnnT<@w8ZKBb&01?*0~9RH(zt3J>K#9$??4IoxR%E zu)c^}-B7gpVNn3JkVe}ymQYU=4dh%n$3Qt8a}vsSe$LuAT$QVSmp1C84HLe<$CyhO zBnPlu^h6O{Quy6K+TgOJ7OzxL$I^C)@RNl8Y_BpBa-BnnkU&Jj?`HbtkNG_D^|7D6 z8Ep8?S~KC`m~*v{qJ1n0xt4-k7YXzvGQl>6&}xx{7p>JI4vw~0yE`IbAG3{fw7cW4 zw7cV*byr&X05TE|H)j@5yGh!6PQI~v`9{tZp!S?ZE&L+n^IoMrC+pIllRtKD;WApZ01zl)hIZmSrFN-8wOYzAmj#l-XhU>&v!hc?Gtf_kq7nseBN$NABj&O$TM5 z*;%Jk0Ex?OH`7^T8Z$_6TlGJ4E@f|zu|_@L>NxqehesX18wo7Q+7%IYUffRFlCWuq zMytECHS&-His1gLj{R==jfG2Mujqg2&m#ONiA-=W>2$HL`QzIota}s^_OajkDkImP zvkfHdb>R;11PQkBMY*wJ%}Y1q4<%Q3;+i|mL8q_lTiNDKvEkj%U9VSKA3!anapfW9 zFNuv8lRl|xJiDWU3nQE`n-S)w^LhVV_^fb0DqJ_>EUMpr&Zris?859xNb3aThfBe%Tyl18 zVS>!Wwu^d5l66cuYn-v-;>G&LM>F@Pldo`!)$GlF>(S+*J^7LY>9_%lAsC%{Q z&zJaHtz&V8k;WKfsb%B(gU>ZW{+>wtjC@Wtr*(&Bv9hC5ekuBvW&^d*p3i$}XdaPp zw@%>G=U=4N3Ex>>O)HV;9#v$8Wv|4sBsbdjdCi>Jt>=Y#>pN=%YN0(^r++U-tgM>k z{Oewfk{VgK($LZ9%iKzu$Y4>gi zN;e;)5vZm2l3~M#Tj#tDz2(u$TN>$-5@Mn^yXA4BbsXC*kDL4Szzdth`YsZ?cjZfs zMC*MQ%SA#SOM5==u`WH#XG;!DdDwA;(W!AQ%X;&*+tR&~9_n7b+URCVuBUUv*L-ZO zM*LBwJkd!B7w-L_(LQgH_pQvW{*|;lB3ehU77i|I)oJsMEmZT$uQzg?yHzi~`lq9e zzxS6RNn*mn!8_bY>%{14)q*?Uo5Rsb$3wi&l6TjM;36+?_|BrUO9p{x@$I&mdA++(ng}If_2yYGJA6a z%R()rDV~!ux6Urt(7E@kURuquw!I2ev%IPrb&$Nu`Jl3qee|D!-J24q9<~IDTubX% zMBvR|i8wv2sBxm}b?0Yu+8C&1&Z}kB{C4}}Zk=e~sjF4<1%Hn){YrL||*LalXW zOD869OVj)LJF6|C-qb-9gJqwCjORuXl_x!IOv!TGxp#R5`iojf)5_&~C*#fNM)9}e#~NijZ?($p(r1A?W1W;& z@iASjyIQfNaT+0M&Je59K5wa{ydvt8E6(IW9gT^ejg}4Wi96@7vFfz7T);gwxWPJ3 z=&_R8s@?Cm%pBrsV8@B>25KQaH*Kv|lI&Ms##I-&It_7V%jY&e`E#XJ7WY@Ab>i}o zE++Tg!#PJ9!_9z2)K8|#5BLh+ohA2A)r$8DJJ?5`2%m0pkUCND61FI(+=_x+(7 zacFp|<-0p}ksE2sIyA4K*{1%wl+iDbrVLHCRz?pKt(NwA-=GYbjeo2axcu$QE|me3 zvuv)tCbM3?H7%P*WyAda-VJKqr#~8JR5+OIe0E8XcqA|vC(;xR_+o$KK&OU**z<>7 zt@8b5wbjznzqqm7=;*Uno#K8?BO9xe-Zn=5wZ?fii<^K z_@UfstE^m0kGgU6LEE(MHG5Oz%%io=0x6X>0>>4kDF+CmBDHpG%55tt8GW)#FMi9YWSho+lH`bQh?532~w9sBmQR1e<=%XEGxEN?C4 zS~h1>&gF5Gdl|LRL#z|!*$!3~&oqxQ22_}C;uA7vp~a_V%GWpLXLEw1v9Y{nUV-^( zRqp7yX~V)Y-FDr&&-`#r6XR^td;+!5L#!WNAB&$7EzdPDb`DH3(G&C#OQNT~n@@;= zcj_B+ivDJz1U-< z5+v01&$)Q%S(L_-Dwpa8`ky~+s_S{US=)oOPWazCV3sN0*J#tdmiBgsZ*-V7gjP-F zJ#FrPr>F79foK=z!^L+)op{4P!#r4gh%t*I^-zNOWw9imm*U}4C@#+6m^c}Iq;jut z9Fxppi!{xbe3aEJ+kT``?uF`<#a!)oHP?gouq1h%bKWx<+s8Rw!gJ$toFD&=*e8ms0mRde(gwUDOyk{y4zCeQ9}jGt81h1q&= z3`W~N?_=|>xt6}x)o3%mq6;OMdk0JMc|8y2yYiPGWUT60-G!bYfhAF%iN*O0v($Rm z^1>biSKZ^fd5jV8c|V$(Y7RT~q+z;a44gf~45%}j20VLqadrV-Ayg@6Kl5d8CF9Ze zaR$zXA*~bbOCK<&KfLTJak`~}Dg2ng^*HI~=4|bht6=rJidt+Y>#-X2*4NYTtXwC^=Q& zVXDgNh$Z>FDMS>1c+IR=MJF(yCDK0c@U({}|2wfI*1$ZOyLUN4IU13syqvwpnr+KO ziTCLnA!;FQtjQWYS?SmGUUK{Ko?>3M>*nu$?f^#&QRIm?OCEw@5a8l+j@!os&aH z?6sy zN;y(5Q|nf_SfN4T^N$71_T26cHxlm@%>w6x@@1HmFGFy?477n-NK@n_^}@XQds;JV zwwA+<_UzyJoIfht+FbL~NQ>xqK1*=s3F(!s<#5}_OdQQO-kd@?es)t1h{%NBT{CCa zU{o%31}_yJZ+`j0Fwrb^M;uB970MbcbzR!SlIZ>Xjkk?=Q@Xm6=2p=%dE&|e{60*X zhnEjF?p&Jgnl_+5-OufB&6vXyb6fhnOY09XZs$sIWqq%zM%dq)=TeqyI}fPOd!|e$ zV`|qd#-_G4T_{09|KdLOL|dciw!DV(&w3hxT9^ma=Y70E6(e{w-dOfqE$v>5TKYHo zwyoSo`Lh*`_E##ouw2wan(k^(w-MjO6ccY_ z#J|UU7Ka3CjVkh+r}1?e=}%96hd+*guj4rJRIZVFAMDxWy!(O1N&H1~=`j+Dvf z#)ofNJrT7c(Y$Jwo-!zYch#QkX34B&13Twm@~l{8uQpUG53x=@Z=vk3ie6a{nsfG) z(lVI!Ja>_@#qxLHsWeMrm*n%d|J5m4|5QtSxIa%amen!;1sL0pW0hb^NQv` zY3-QI4umDqI)HVR#GKnrje~#PYQhmtpTEHwrDPP9`d)|YCw$&)^LvZ$j6Ylzo<6=2 z3Dm;X7e4RxiWSANmQPzVo%Yv0zm~zu{@p<%Tuj+%DG8Hfj2QYSzdQa;UhzuV?eyQv z^v~}uvYfxG%9vP+!p^rarNsYYjW(U4wdX|CLYiv6ePQ6+TXEv6b+zeP^hZzQ)xTIa zs^r+_QTM(jS9f^qQ8f3mLarid&xuKQiWsPc^wgm6v|BG*nquP840D2r7Oj4+tJ%PE zA0FK4v7Z1Y4L8jeE9;6C51*nh4SPH)i#6KNiG1rmHuL;dQxuv|*TD0P1eWCUmZzt& z>Gba^J&_@ST6!<3Ksm7KpV@+PU}K&u&TOOdUvXw5tA5LK%+rDr(dQO|Iwg>)!Gll5GJ zT1e~lNYCkH5hy`|b3Lid6)WIzxFnP1ip*N zH(^Df1PQdQ+du-f@LJJrpaco*W4a9_Pz$eS-3CgKz#gjGKmxVox&t|4=r&M-1diaD z6R4$UDwO9U;~B*4Yj|#S8z?~nv%u*DN|10kR!|fK=Q)(oHOeo)mQfD1hQx31G@G<5 z0)Y}F@?{BlDjnY%fj|ioeC%+n{ttxG;y$*##pVbEO0e8v<_^yr7dAy8P=Z9My5CXG zL;g}8-d0GUmV72!8i7Cw65n2B?J&a6*LmuXzj-)2w!EudrvIwgC7!>EM4%0M50u0h zzC8o#%|pRWz-4pn6oKuRd3^#){dMKisG?mGOIqUG7Jrd}PwA z*V8kYJy|SKBUIKh*3$D|b^9QX(XhpfRy|Onj+sE)^!>cE?-epy&T5;%D_iTMFk%yBNjtZDj2Lq; zFRdN4GmN8$XwT=Z{_S|z*PdY+Y(yet>lV8iW1PJnBmSOwz=>t4I2 z*C$h!n;E^##YrQ??N6Ih77v?1tqY@y1aBWuD`iLZC~eMcSxX#wx-ormFJjqPa`j!X z;dko1b)yn0Jgp@=kcorwQVYFDeaal@}clEq#4o3khm)8YP z4a<3UXh@9MPS%N*VA+Juz-wBaJ|N zNYk34W#wFlpQ$Q}eHyP3SZ<}`4^uCUlD28}&VG-pXT|EmxY5`^EzF*!6Sruet>5ca z60x+`7HVP6E1l>{-#!{H&L@7P?;kuvzilVyqnfH^$+Gi1@j35B`7&Q_{J8MY?p#Am(^pgR%Kq=Ql~wYNQ=GD%?4=CKa?O?0l55KT z8zEPiAt8^|%ClA9_H|YJroPBtu8vVPs)FU!8y7ZG79iV0T>C{M+^cuuI|--wqjZf3 z^^oQ2#Jl6pxt1+1FVgOmH|~vXVA6* z1POf=(z(qgjLQq6#QOGoTw@Hws`=!Zf4h;^34WrKW0e)FPlOtME~g*+X}scN9#^;? zK+q4iL>@DZ1ovIqA%3|Lsb5H7| z%knNm&vWU&b6cggs3&$_jus=fHE_A|EJ~MT^R&vhgpLyvcumpj?TfA7ClvdWh_dY} ziIR?JVbqxKLdou3-&zE(3Mzh#>3IpCmEcu+Z5!7XH=k}GW*2e0Pz!0aN10XMYhwmJ zs3&?qh@!WNpjFoHU7xvE3{AF^zJjNf_|7V6X=#&c z{zv7q;@IO2MUe@MH3C}!X`gq-`+dzLv?4omWR3yxT64m(g^yp~W-vw;NKqkHXVSIq1E8;f40vlys__Vk+j z%U(8J>!Zc{m+}}Wkt_BR6L`fQmgMseihe>=n-wkM^Zw>SEu{6f>ifT2t}|C0qH?Q- z2HuM>2O-{lXr#_l-I!Qrl-ZH8N3elZOZeja~Of`p!OHJgX+3!sVRBa}DzZCwk;O z%s&&VEF`9t$Qyj)0%w~~_sTEZi|^~Ub<{#{_4DEDUm&PvwwkZy@4&pOk-whsJ456d z7F&YEqS?8EBQ8dohr_Z^3+tqNh2^4$w1-Km@>VA_3Dl|Pgo0F$usJenE ztKOrxRXCxvo}YXtb<*n`pB3KQQG(@`ICeV|8z?~{f9=0gdz|CAuW%bkpq9P^v1}(9 zA&mrT>HF}e6Z9Xywhu27JW{J2k3(%mEvyr$h3kt#gk=LINZ^^E|mlzH?$EE9Ok4b^3#M zn$t@c7PG50q&P3rqjK6KtrJJ)3^so_SyS}68f~r8QyElw{hi9JiY58Hw|~te*8X|U z{9D8t=n2};<7+(y7NiJzuf1r^Wo+lZLvIjMwM?h-`wr(w;wOL{>z1YLpg9v4&6iB{ z1U-{#Wk#qufFF#v%;}YDiEb_BH(}*F(t17qq?`jIiexdD@4oBebD%P-(i;nTXlDmf zIg)6%=9&jn#^;R@%k#zA@B}nKt#EjD7 zr=p*lYtA}puPv3a6*I*8-CQTT9w}?@nWgF9(~d?4<|;*+36*Vyb~2k*LU`96HH{T@ zs2;W?oUms~(@loJ1%D@Igy#ZYwSD|DXcCA@#>{qzV>o-cV%iw31^)2FYc zblMm#3T=!|j|R**U(#fCJ!;{33H|{bOZIBw?)WB?Vnw&b^&{9wv|?W|`jD>kq_M7D zY0;wK>>372Fsc!~r5$zN{LYoPOO&WOsDiP)#fw%wvecYOQJ;35jxKnaeosu`Xi%Sb z$InMxo4S+}xsFveP=W;7qt!dPnx+_Y%8KVdZK>59YpX{bRy$hW+%_jl^gbDFpccj} z>O}9vC1%^ZRmCsuYHLLCV`HrrJ@eI0ceail={PZgzTr|mE}ooaj%rp%c(d2k2-HG* zw6f-8F5}TtF=E}~G*_;r9j!LuSk!R?p10bq__0N_I>l~7TJN(bw{h(AXb~);6R3r4 zNNYKRSIiBA-J)dhiVHo#daRl=$*Kp(vH83mXytO%(=A00TD^=~yLWwH)tsWS-8#|n zM0sQQ)L0=F&ZD@ZXD#0wP28Z>qsO^+R{cuXO(h#AmsT~-t&bA7wtueG9JR0&eBP)B z(W1`i5~A$stu!-Xd$M}_BFihDhta+Id}Xw;cV)B~(&bh>diBMuww5O`(Ff>?ddBjW zk110~^+v`whw6%$TLTO`em8TuyODueJQfaK z;d%ekXV%kzPMj*;Ks@OES<1N^^$nCDA;0iT+dl7r4K>ApP94mHwC5yhp}mV$R(b55 zfpWZ8PE4V_gkotgA(SAYKgrD6^|)AAe2eLJ$6G7=RsIru_Q8_qTk3PeOvh7IjEQR+ z8Msac;~Q{|4#iC*_Yj4?S?rwp@VW~l@1LK{Z!3ujJ{3mz=!nmuccRj#~J`Iw{054e%$E6Vyx=6BG6BshyhDUUj~ zX}-giqS@MXf&hm@*~pBLBSWe8M~M&DZgUUF@&i zOJ06Lu7UM=2lv@v_L|#JTzjQNgiHvs=j%iP$31h_=tjchxTl>D%zjYgWzKOhFQGuE zS=8I#cb_$TFN_wiG|O+G1c?mjYWKS5q4CUE`&r1g6I+4h|4eA!sB?rL5GC77iEOQP?b-IL-M8I#BFFt&8i8ME zkoI{$XkOF!$<;_qxD@ZgI9iPK##nT^JJ&B|d}%fmzjyi0g<7lTT(CT>HQ~J0W9W;? zqT0r|0x@F3^p{+yg*4ix7?WJ(jTiUOd(`wLTHnR~inPzWJZm+_>tK+W@ctzBlu*Z_rUiFNog|yH6 zaBdgZTXh?y6yG*Noc)Twc_k$zmVB1hXxp?-6iusZ4Bqj*(|@|LP!aYb-NRUVH~+=5%_aG~-%&n*9#iTE2K-i1V4N^&Ax+OdXWAPD zN^Njf`RECO5{xXyl6>CFcgh)A?$s2xeA~5nXQT&SI7ME~OBim(lUKiQs%(5P@hNd| z`Y98&Fj^YzSx*4;3~K%P_v~_7HT+^$L5ld4$GdmEoPL~`z`tvRLuyG$B!X$5x6huE z;^6oV&SiU^r8s)di;vc)_vQ|u>{M>O`-$lCJ`Yo1? z_cpa68?O!SVwOL%&N=7)2+anTs}l_y6td@i2pcZrKda%mBuID4wc#O>SC)Qowtp%{LsrhyS|sD-r8+qv$Xz?ZF~ zMZ)3+21YL;trO*Qk2fFhI81amcf{Rpoi%u-Fvr(9C?|&?_THmCDs zjU2&ttz@iS)RgSOULVS1jJu?#jBM9kmnfRG_o#cxNT3$Rc2b6o3awpEvaz{iPAAp_ z3A9Heb;nbI*0hWL3g_MAs#mh6M|wK6m_aOwvMofNa&{o%cHz5Ck~e1y-Yp<&j zF<*L|*P*j>%pGs}#24pRI8h5}xoTQHg-?DqMl34!tXcP+Iy95I-(%d6@3QpV=8115 z-!tEte#rCr@|o5fE6tbeFC!Ke|JFS7ZUc=#Esn1FViptpCj8O!c|_i}dBn2Hm93bc z)h$1_B&db7&pUHv9^qV&UF7|$nt_rb@jrQPx1VKs!qGgcB#NkdJ4%Qu1Z&MgGvRLX^p*QODheCp z)%3U`6@|TZd)Byfd-sMSc#zhK_B3;Tiq;7GKiIkvB?FJ|3B}-GNj~piq}`OLJTtd$ z#0V!Ouq1jPOus&|()EFHUf);To*o(IaAO3Q&-=-{6*hn!Bdfm(CUZ1Jd3g5vJziW)~(R0&Uxz~tduJ?a`nS|>iucgop~uBf>e z?=-pbW91^e~m-?`?8S5z>%_E_Pnceb8Jpw^70xr3>BI0HWu zrx(Q-!4D3`7kney;I$EIbVhp}r{oUWBV5g6QO1Z1@vi&7N70&8yR0Y2=MK(zPnL@` zjfu(4jWe~DJA*CDYhEFt+o)fBh%4BvrO`O4uz|JhI3-JPc?;h0cB+*%;<2Cic-Rkv_Z=JobdUbP}Yes1S= z@3hLh@Df~O%$zMwzcG%33>0+iCb;wo9Ax~74PR>mwfK|B0-fG9PQx>e4qCh zqp*1PmA0Z&kJ}qj3u)Un_uZtlJR&ihjLkp-wd`YVs~Kyb6k`h|o8Hb1j3>tz2;Q&G z>o=#mu^u|{V?jc_<77stx1#j7D4K))V%9fqwvGfJ ze=%zo{jO|~zMuZl9}~7jdBp_U<~J|(rxU0pOG-+w2Ny0GMMwz}@>mgt%CC2gYTZyA ztMR13R>am-b7W7{evaB|SMH~pG%g$^%AIbcy-m>C8>^-L1KN4iJW9WQ?TEN_sFYc$ zWsDdDHU0Zy6I98xUtr2ZBv9$+FqLI4y7}u<%=HlW(JFPU$uAXX^eZxWx7t}Ix^Pc^=Y=2{GFdgc}-D9LP~UkY5tvUJl~UGp z$ISmttYe@S(m3+@yu}XJ7q3n!Yvwv!pIVpOM6Kp8kbXSXtrHVZ#TbiTt&lR3{!3?t z`lxJ0x$=yUr^3p9Zr#tCjWPPg$a5|Ud7f#_OsakUxg=?u#*#kKhVzNs=HI=e$;Myl z5(V9Enud5N*qwtzKzht?N?~Bsw*|lsfr{vO&Fs$|kw>U%T9l_Eay) zNMOymT=tN?m960Ow)TxMDxB|Y7L2YLz}liG=%LTMxM8&M!n?8J>V{?UTI>QuC8+UH zj_s@I8|r2Ho;s9be~>^eHEK(u;+E0I)DA}iryf0}%{t>uvl@3LQNGexZY#gp`DQ$p zi*wdGvACwg*zrkMv8>5R-WNGlJ^}b?H;;>{YWEO~p`hOQ#s|-D|O8_lITUE3Ej2 z%1ultvb>-cn}IPKG$%uM<|Er<#DRTZ82cwI_Cz;-ilEP z7>{wP4M%e%CERZR7!g}Wjuj=JjS3|HaFX&_+7cw_u5A(h`sF90;^c9nZNat9EMND~ zyh1IcX`Z2GFR}jb4bHOD(=@N}JB9vjqQU&3BJQ=Qz@wN28i5`ntvvx~*I?`~*@81R z%XtR8x^x01Nbq{theafvIe}Wd`m;zKIiiLLKlL92%f<0SAK|#C(?9z2YtM;D$Th-h z-bZRPr4y)yPnjXFGT6X79D1u0C_&Tsz*jb zYUy`1Bv69oUR?A6`kNQpKnW7O%HLkekr{zn38x+pPM#^>!gR0D25R9u zoKBzwiE)4A3aT}?nG>jmaj=;asD*EnI)M@-Fj6;j0=4wGRPG+Kh5ht=Wxva!7GJ?x zE=6ixlpv8Ix+Y`;3Dn||!JdIcuTX*nM)T-3M*_8YrF_NXa>l|ULSCT+30}o+KQo|L zC_zGh${>RO{5<*~fm#{HMAGIzxxQVEmPp`uZ0*fqkVM;o2}zp>q{KIPPj%8>r{JHdk=fd>!f_%G08oQbxRfp zw$f@UtRZS4P4kJxYl(Ls))K*kUr;>fBJx+ppH3(?osJW&6$yIH6JLE*JbP%FvplV5 zK&{C$r&zV+-3oM~-i~%6CZS2-Wuu^h5+n`{f5)QRPCi5R*g)swMc>N!xpY2If^CH* zQCsyHV?Fh~xxb(b*I8n_$=~IAFIq?T{wU-2hHZgI#p1Qr#kSH3ic}XIvCfg}*j8$m zf}cOt{DXWJEt*nWJol)vSaa<-t^SlV6D+}Y!;;iBD04L6iWFSK66x+N36vm#s}|JA zkdZ(weLaIiUa^Ay>p%%+7)RTBJy3##%I-mh(mCg{$&6(K3Dm-@7#iV6Nn|4325Cwg z=m~z+M_RK%-pOnvbl{Fe$jp%>r9Wvy5iCIh=jS5ZU;?#p21zGSg7Y(ITPIM01kTlD zPN0@P!-6$O3C<^>?aXZ;q23317B6!GwbXacNay1ejh6FhPu8`eIZHX8XwNf-+pr0B zol9baRgzl$X`k~iX4w)X)VlBx;a9x`B}k}aIhJ7SMj}`%!&pL)?1|W-IM;{mrq>)L zNT`TxxlRVXLISl^q(ARTpxN*vfm-VKj5S9I68d{BS3AAtAsbv4YT^8Y<&`2FC_w_> zqxE_qfm)d3LbrhuBvhSbwgqTiKN6^gxifSdC_w_V7ijfxAc0!yY|6X_=oJ#Eg}F?0 zuTX*nW)sl7@*{y-n3F{#94J9T^<&N;p%H#0Pz&?SXoLeLNMHtu%n8)8=YYcRgD8ni z@SG)_4~I?owOkgsf--XgwbTgCD>f}6bbX)%*KeZj%xxf{&v;=yP=W-`Qs_2Nf`q!m z@rvfm3Dm;puFMJ4!siv8Q1LNTH!WVxZmWMf=NPYsIg4}~SQctw548w&2I;?Y$7DMK zP(}u+-`QK;21+oN2tCvZlwd3wdZ-g9K?0-ebOI$v=y6_D8~T&?K_pNM}SD<{7Q(XJ%b>WMtt8i><_vT5;A7$1YJPOB64 zM~gl5uX=$?^j<5UciCTzUD65Jy8OTV{oH;+RyCKcAY-#aJ<%^Izfk33Tk$crp*rW% z1`?H4soqP$UdJQvfdj~&00OzXte zdQqze*8li50=0M@VUapvUjh8w0vOfE8JqW2;B`y<)zY@7ok6P}$`d52Zv0ff6Jz?ozjb1Zu6`ZhE@ijWkb<5+wAj z5$P_`fBXg#sD(Kvbgz&=E&qURp0&}Dyg~^Q8L~$BrDuKv3Dj!5`X|rF!ALexf&@K9 zQ9p*v6d@Z(pq9Qym>WrXg%Tv_DKoS_S?^aUL4v-xlUH)@kx=WB9ly468MScLbckT* zwDr_T;QcW~ST?XM)WX%+I)M@-8n6Drb9_Uj>l`IW;20CKVbuc()XFfHP#yTsuVvWa znyXwN*b2H0l;Ex{=wUcvKV=}H@8BXml3rn1sD5c*E#sSrKgM*t5erF@BLcYL;|(OZ<3iRk1QxlceRqV4q$GUn84+j z1*ZDmKR2za2Wg#HzNCSueD~(Y6`i6*-IFU)xfN@#iq+zyFm8%g#OLlM9uACZa-hp! z=DKUkEQ0s7M0=&{^6zTz%=gz06y2r;oaeqxF*Qkg+$DRcd-c*_uUOdgrZXj~xIi07 zqqh`SbgPrd-tcC?T%1#@2NJt?adt|6UWul*s&K_Ami_X3+_!;R8i86ECFb*%t2EZ? zAvb7c4fd;ZduLd^k8_x+b1rA@c6oj?o9wP5{!S|*uq-w2!*hrjCFb+K&^DX+B+x(< zyMEO~0=+_-vYxu8o86~367OB6eTyLWP0h*hibh=NNKdbeel@F|sw5i!P)?v0(z*@0 zF8q9L@K}PeJs9(Y(LDOdfD$D1eaU3`(gqT!h4EOH4Zo!P21Zn26cyUjy+R2RxI16w z1ZwH~#9=*9f`q<%9TF%(0(Z;Py+R2RxZj~ppacor`!I7t)9RlqsP^Wuh|u}ymYgft z^XefF)y;i~)=7l+z6vMOEAOW$Y`ZKZ&|BRGYQ3C0cW_~!gOZUZGqpgp~((oIBWj31?PxxOX4T6`U}Yvv)e&=xyfp zKw?V4hpA5&lqKn{i)EqK^Y`wjR^1F$d>Wp3EK`P*EOdAPC?;zkw1Yej1V`IQK0{>*pK^ z)Ix9d)

tGv0bE_)Hn7hjfa(LJ1NT4?PxKz6QJs5mmSM^y+S%fST<0C zL_`}Ff!82jT{w>EHc*1Zx#Ra!zpN!k*USmj%8_qPc0{61boIou*3P1d+#b-5)?#5?3+81EXd#-UMqs5O)YEUku zEuNk8WrQ@o4CbO;l(SJZ>$5-KwRR>|u`*aLmgMtBla1aL zTbrIPIh|M*Mw9ErHj3MRo!+=_O_6ciDwdt2R~yH0TRGeux2?yZ7R~`u zt0YNT3$~UicQzq;qfQTp5%T!1i0^P=ga}Ujs5hG{`>|?kid9% z-3Ah{L*jYarn?fnL34Zz*Av82pxAb~kRGAB?A z`?OA=SGaR8+S3V?Xawv=oH>EJ4&%O!I)M@-aNowv3DmN8cT9i23Y`zMkuxpeQE&8E zKivjOkl@kIdqU0!WKN*g{SpT}`Fg|iE_+4){KlEWDW0v1CBBPpKiAIrC2w5QuZ z2@-E!+2_&Toyi3M`3)pcYvzglw5m1I8~{p?5bgJSD(`~#b7_KXAc0zZSIbf}>}}i6 zUNxI!dgkSqGX?!`3(qrMwp&m4SSP*aC_w@}vj!(AMm8jmNQ#8mf)49 z*8?R;;PoFOta{+M#7}+d4I4*3o!~d2jUD8?F=n&MoInW@c)#*_*EeqM%D-!*=-)4= z6YtKLNeAz{KJUqUk}=Z^&lFZz$ZIhiw9})VFNfal4!&d%d^Ju9Af2Xq!toblFz#+YpgMu z;`G;iv~?p&cph%sPJSw;I~kPZ^Ufh+IuSP~Z{3JmNMnv1%1-&hFypm?<6RTQt~j2p zo%V|C5&K-ss2l9<~Wli1{hgxU@vjfo{ zZWqQGCt99zo?N+L4Q8f5EuQ6Gc0j#C#{l#Nqso-hx5U)SjST>~v5m*?J;hdQyV|15KUu{ws!TT>%2))r}>x5=Yxu1{!m zs8Kh#hUck!kC#^}`i^y?oi@5VjHgC-HPT8ojYBP@@oJ_$q-S;&AJ=nO-_Y&cO%6Ba zMX`V9UgCbEqj7yx6X6@!Bf^T|DG?)U^#Yiyn&zo(VyQy2@-rl=y3kP3LEwWrb4Pal$yq6$B9;WZF7VZ_6g<9lo zs@z8-oInW@d@OhR`!_;qaW0#=X)CGa!wIgr>ea5NzfCa?|v4f z)v{Kv&L+4YFSL#wjz;uf`Md5FN|0Exgy&`?ojHM8MX#Oky#Hu{WiOogEclq?d8-v2 zj={kO!Q}K~+uMwU@>eGY2bU+#&cp^1O6#K=gM#lFyfQPqb-CustD|dAl1HD1yi&hs z^h!x|f+LP4ojD<6YNghl_Pv9(S4Af5GgT;SwFEWpqPO8T?0O)<$Lh}T&xF#VHcF`W zj665tge}2xnNYM&;Qh|Nt2x|u%tprZQH)xV^WQk!NMOE3-3FG0T6!KxD$h^<=#R&C zJ2qVACX-K=SW@OTbfOS>E3=OM8zHr@MJ&Q^IYnOe=-V^s`(5t*o$YY%;9ZwIMsLGy z*!4idy{2#QlRqQ(cAG#ghoc|WBQn8~_0~0kBhkMRvMeN449y!HRA{PoX2a`YTSu*a z=N}L5&c{1TruPzVEBfa**!SdTR;OR7T&Jb!$F{e6>q>uRJ!Fe2q7aQrFgr*l_>X&u zT^65nr8VMW!Qj3Mas`xL5A>?lM}2~Q;#OqvP$$q6B)Bicc9R}vPRRcH@Aa^K4=2=p zH{1sIYSp@YJxUwgcO&1OQGz!33Xbiz+-e2g21=0NjH~5Wgw@>7=L6flPh5fEQ}6R= z?Qr9H(ruswi6vL_2Lo@Oj^Gs%sCDl7$Acw~am)dXSC&^O;l9h6-v7H-NZ_@i*8{ci zNhSk99`PUd-E4H$E?b`PbHe}cX$gtMl6O*7opi6*x_Vkdtp?q0q-t&Dx11ucP_nf2 z->K>xU`d(VKq7zbE2*_t$?ry)6R3sHzB+-=oSa2a^;dkV)d`d!!MOsz*&5b&t@D8d zYIW{&E_Hp`e*o0_wef*ci5^2 zwqb~{&LB#V;2rrQ_e3O6EBTofo*w6ZvFwFxSoJ{3-}~3m_o4HVy&`S?lW+9u8bpHM zaU(yGp%%Y+ztmX1M`cc+1c}RSH`Bh2k=~<_KrQ)BeOa%$RSzUkOO9dJBM>M-g03{u zj${J~)Z#a9+Oa!=4U{0k@8|Yj*w(4A{>N|aa;zjs&^7P*dTW?hemPR}ud;^hp*m~W zBB5SlwG}?y(+>#_$D8!e;bua;C+Gx9kdQ4R>3<^FL#ZVRm@lE?_>b>6_Pas;KOcEE zwpwSk=zn`-L88Q^N1j`cNm};`%R;RK-5z;9-4bamLCGscA9;RRqMpd?x24Q&Akio8 zf#>&oOCt0V^a{0BZ@=YvXL?cu0wqgJU#D-h^Zp-gg~WqFe|c(t{$&Ik=oM<^_%6-k zFBgeGNnm-J=f!j_EGhH0LgK@h(mabF&Hfj!Q0wNS^PaRFk=}$+a&+W*PlIoz)_?N~ ziCQ0=^4!ZC$p)5%TKIOa*Bsy6>$K?;yf|c5`Wdw6ICR3{uq8+&^ynM>x#<@X+sY%qK77W_*+P;1H6 z*MrrfzKTGg1c?f7z8>tCo1Zk`Dcl-;kU*_1t6vW;_$Cs8^+4KNd0=q<-bh}d1c@KB z4h()Y@ZSj3I#y(0uJzv>P;kxP zYa_HSO7=V)6dXa%CVURCq|CiSqTr)J!Db`mTX^OKYT>+Ji170r2j}!&{cce3#1uKh z!d|I4zz|{e5|kkE*gJ!Q{eO=`D$cj=?U@s(b@<8GgPUT*2+J#!%>Dbd;HI`x>%V!0#2oK{VA-Nc|Kb&D zb<95?=#C8|EU!@Vuwnn;jbl>lzj=j3wUZGZ%x@7OeFv9W*CD~JY@mOn}ga76g66S-R!3kHwY-I2X zwX!7j47RutMp#~<#6PxY@UL{O|K=4E6`OVons>r%Wbg{LzAV)>c<*i)VR?m;ub=4> z?0#Qr{Wq_WXm|IeV2uZ1HZpjHTBTm;6fFHPjIg{y$*yLdf>G&O|II5To^8-6*f`uq z2Cq=-r4Kp=bB2GFvAjY_$HN_hUDLJxn^#C&Pv{U_7;YnjSE$wPgBOAi!U@YOlyn&X z0*&Vj{~x^_3H+L6jiOY(oI}oE`-Nb;bMj0bF55Pkqq#grS|4{&g2bXv+XVZS2s`Ii z&5=MYhr>(r$&m>3s`~x*q3ay&>0Y4(iK0YjOCKdNC)&n89}HBGo}h<1ff6KcmV7?= zav7)xw=Vtp4XioVHpBUl01+rb;xR{n=C8m;L;|&VMcNBvBM~S;;#|+5XZLfF2$Uf4 zTxH?OaL)Z)^TU(2dWL_KUe@Yu9yL;NfZtM?DoGare||&z$R#YK{bI6?32Q47vn_-*Sq)LP>$=&WCD_C1vgv5@zf3o`;9Q zhBQGouq@P?Gyj6;olQW5yh6!_`&T>@@=7f%DRZxoc(KY~o|i8~e#)?07q!Ms`^$51 zKM*0WP*P$M&;O`rAG@T?y+Wd;xasLJE$pd}+DmUM)N1g-EzhO_K(JTz&u>h8^^Rxe zp+sw}ec{X<&)VUk>`Pk{BB^Eg<7o-J@T|~3g1%wTnnxTO6Uh_WvP{+ z9+o~6C_w_}0KWyd{Jtn)ADFJXO2$SYjq#dFqQH|N}44mZzu ztF+|nG>ibzXF84tC73hx;!(W-p`iOu`E~8kwyv^a8-v+;2MvL$DatQu|$4}hfy?CbCe))=Bt9i z$YTi-sD&$eEU%!K^b6Xfb0IobBZIwu#^-$)EMyGmyT@GdWdj3u-n09zpLXcx{>Ebr z=ie=Vp^WipQ;PZgmMD!tE!+)^c4T|zuq6{n-b8aK;^KM<#NHmP9EskU@ zVPZynl~tZI`|BCZzJ4QG#6-u4X{#=!Ac0z#$Ia(GyReeT`h6p@sM~ucmWvt8koI{u z{a#t5b*e00{Ctmz`MNMy7?$Moo+(yE%-&x~e7oW&6SdHWPMq6z-_>dReX~`wh6e5# z#<3YH3ZGYhtGINZxBlSst{G1h7oSeANqIl)Jd>Ev8U8}`ed z!C8)~KPjW|^$3M`_lz_ik7;eL?|v^C3Dm-91=^we@t#JT``64-D{?x~cO=jr?V>~x zDfCZVm?)!CRAvICIgZ87Igqlxtx@2oLgL>3XJb)<#Ft6Af+`n*wS&FEJJ{d;Shs=g zgS5}vZCzU<`@TZr(r3$JImcF~(XxH8T%CCC;6Nj-e~P)olQn=6tSy%0^B&0Y(ERLr z7Nf=I(MG+K4^vg90E`~M9kqPkXG&!e_e*6lvOb71cJFe8cC$tTOQPt3 zWPJm*kk%s=WY3F zTjP0mVZj3hrQJJL2Atw{LH{MVro?sjr)A=`uOiyjX*8Ety=VMCT^cU zXuenMu8Sq=+CDV=L8^)jLVG@M_Z1C9^MOUpq5bM=JDDNT;mrM1dsp^~srAII^4-lv z)9YDhQ0-)f_H-LL&qj#>)aUWAVQ=&beH)p@R#?HRi zT{kAz({lXQJ86b;WMF<_pSSPW2d>m{4_upnXrK{a%t{UAfI!;ky+(UT&#qC=$oXX* zjljGQNc+6mw^lcPe|w^9`Oo#~u9o6a=N7Xm>t5xqTEW;nc&5vdzoAB;mhM%Tg$b_w z&onSv<*Kda5q>fMR*#Bs;}aQtP8TyP4sT>657oWGd>J}H7b`tw@Vke@fxD&Q{%R_BxXKsKx{^Q% z5}4IfJzrUbmXjQ{R7sd&T(`jzozU~vX7oyCF1NK*-cgyimi1LV)SkX9;aN4F{pi>4 z-Smv4YFBn7uq-6L-n!kQ=cWw{WlC4|ke;v&)GFJVW9X9-j_nz!6Mp3t=R?Jet?KuG zt_Ko&7Fw(amW5h#)7H{+Vp2l;^={oO2kxGX`FB-GGJ9(z8|hhrt#WyPU(Bql^%4h` zrD;LdTb)2p&_hMb9f-LupUTgTIpVOPrfLLkPVgBmnBG; z^J-Z(Znr-kW&;V-`sB}*7E!7$?+1xqp#+I{r&qR!(slR!1A$t9?=NE!a?eS!5vm8; zK&_qg*I2~Xa=e2idW8}s77i|I5u0ypkwnM_5~wvbxWOV4daMj1P=ds8Ghh*Uj(i*D z6-tnhyWQ|k37f-gAc0zCJ8!jYbm_Aoj6ewzt~>)hd`0CsGA+z2Bv4C@D-K7wFajk= z$lY~#zlks#ek4$<|0kO*uO<|W(rx%rf`l5o0&lk02?t7$_+l2XEs5k65~#KI8s`E@ zO6bzZr`zzO1POZPvhANZe6jx>Ljl(1)4A5W%)10_f#mh52Bm2>!X8ybOH{OwlO zDsMRXpZx&(gFreL?QF3e#&(QPpXZio=6%w5qpSS4acZ&RjSE!}DjWklr znzIB6b^Q1KoSE1_g0+-~zu&tNHeR7bwZhWUzqtRKS4gOq&iF)zWuaED0>`Yjx>;>~ zm{%y-S7EQEb>^$Z8NE_tNvM}_&5<}ULS7%CJ7-PR~fMLIg^XP}fby z=Mp4PtK*cm*7cFCW1X;?qXdbg728YF(7*L|YGEkN^B8j6|e;$>cjHN{~>;8Lz=e1Z%0^ zGu}B-g5|Egw%V#k>AI<5XAmVw^e*tdMJ$@VB8)%@5*ePz9O-X&e*OMo-vRL6rJcdh z+cw`JRbS#c0Cmp!SR))Ld3#!_<$IaV?`UuLKJT~92Z;^|F@gBBH7=aL!1)r~)1AJ` zY#A-mIvjE4b(GTx)RMhN?WnWn&uF7jhmrA>-iX!auUUhiBtpD8I7qYQ~dtA-x)FTpIG4`N5VN z*1lwFcQ>SUV*J@`M(WvY;=%sf2G515FC#n;r)ZvsQ!}hSulHUVqj9ru%_A=~Ft9At zLYj64nwQ-eKg=Os`m~;b*|AXzZTq}N+PAJRW|kGx7shG?YVje5{KJLSJB*4lNFvO%|Lm($64$EJTOC8&k8&)c&?YnPjd z@s#rn^IoGCXHQeMecpTbuetJ2j_O|R?j@rQBsl-sE3YfBHc`H_k16N!(vR*XV{K6j zY5K-8cE0QB%R@zv7C8cFopZ4oTV%QDtAwpGq{&b+-v>aVA$|Yb0WHr&CVO zKHSQ6w+UyVl{v{BZY&pRpLfrYQ-KylOzeC&841i0jq$GA8)=#^>A<8 z5rOu`{W7{n{W^@g=&42veq@)wj(aGmfx*s zw0@KFstfwod4uxxVTNgJ1%H8MXOzf1A-Ka5U>qgG~sB!|L7ScZNaLQm_iSmWj za5s%Z3AP)S}NZ zzMoSzb{ZLsg6HogW6e2#=B#Nl{~7m0`};?$aXCc0{Vy4(re=-9+9H7^`Mm2Yv^Jf) zM;f=D&FRFi7FaH45q+hrwCD4#D%slniiqmXb2>R6>T3g~1htU%dDj-dZtl$0(@0x% zKN%&fChhVB-jpYLP*0=hhP%nAg*4X5=jA>{eapzdVMiSA=J9h&SuW;; z!)$gwZ>>tLT|+37Aoq6EicE9gEkV~tWy;gY1ZI&#+CFAtS>ExkwdB>Xi}y;gdt#{XK9|#p5+w9*^r`7r)U;D~lTm_S^?8Syb`wIa zo8H@Nw8-h?J!({MM|)V3&-+I9>*gj}&0$Qsms~aZG0Hk3%R(*PhPpmZPP?ypg*4js zd9&<)!K~Q6g(x|#xDoqHw&0A-a_7#PIkN`UZXRsUzH@%?{PX7YBhAI4&r4_oYT-9% zdO~iN7$~%{fkzEuy{R1zFyA-SKH9dVbqIm8pk_l zsb>SEbz;@ES48K;qply`+_e!UxP}2s@_Db1r5#D=j&o*i);RQpcZO2;D6F5)+w9ae zb6@eE#?I;wlTiz=37z!a4)lyuZp|D#Sg2EsFFZRie$Ksa6mQey|D(qBJ28F-DAN?sCsq`X>>^MgyXVQ9%^x2T7$St<{;^ z+uPqXyn{5MGryhPckgz0X6N3t6iHC)rBfGYLRQ$=LSOddbFJB(-?bF=Uh)}c)FLf) zUnPf3e-;k7d)E`x(!0lhR_d8&nP#5-_OknY`1hGwq-~uazH7X0S|2Oa5@Nj~t$ye$ z4w2w>v-OHduwBx&N({BMik7bo!`>$GYgY|s!+jr2Z$5J6r_|E=TK+l9mgtjvclgPP zZ7+_^R;b0h(h?&}yQ3xfocDcvyrNI}zwoQ`0hq~Sb8-ALu>X4Hgv<;f^GH2bUspz- zxjuir_a-)rjc?>`zwYSqiq;+&9dZ)dV@py$YEw`2^?^;%qu1V3WLu;y(I-#l{$A$9 zEixx+?Eybql4cK+_=4>6&kyuR&)n2q)F<%!=LnOwgw#YTNlm0^aOTV;CF+y=oi|&O zsKMof(P5cOMrY?LyrTMCc>io|Ms$*R|K6vg$;x=?v*){uygpj3V&ZW(m#`(N?Ibpi zJT|fI+4;E&wP?c<+#xg5NuS^Ecgq}867P{c^;@!geO30J|DXmJMWc! z;tw~jOi_!p)&=l;)FjsGM!FYmk-aGW4{DK?r)IA#l}^eo{PvTFI!+us*7P9w9@ueg zmwo&C#=f1B@OPoimXi4WjlHF}#W%QOX?ikfrDcv*qejUNzfXMU*51^kvp~|b>d#=kH-27+4wcOBMW_> z`>NKg07rXCJS20~7Y`S*-#2s@sil>H!YUfZS6^!*zt*xX66~!!9bckqixQpKDW7xh zueiI{ii|$mmc;L^KUiyfa9{Su!fa8!yVhy9cP61V6@Bz8iJurD8h8*LG_Cb02S~4farK1Fkt+`t#~XvRwn`jju+}i!J%HB9}!+|ARh` zt>&R~h$|oox!Ruyikf0WOYYDc?8IH6iC?UaFJD;Ey=PpZ7 zLV~MZK0z(6c9vk@InUFcB`6^gRs&t5^fq^Qd>V14=Df@CSsRp);8nLaI3shWCT(p{ zLc+$#+!*va=$EI|p0P!p+fw>RFBG~y0`D|HW| zk=BNhpz4>c4Ad|nzod>L+M*Uugz7d@RaZjyIL-%jHR!#!y^0V(Uui@M&x&~J(6q6N zpcZ?ZKXMX`!&-t85MJsKq=GI}S=n=$Uu$&uN1a5_+od{b)N5ULQt3 zI40XGN=RsJNS_~&Pf&{$!JEBG_5EP1kC8&!voN&pJV78t%&Em|Xl+nJf|1)MQ6C5I24?c`ezU!zgoMpok^wYcuBxs-uc6ke z&xaDJj-0tloUiz4w&S3L1ZSltp=Khjc}m;0NNB}dfBuU;r zCAda$^-2}(%lj1e+^{V4RlB0()?=~^4?JF{kK&l0r37(1_sB`6`mXnhj@54_zi AKmY&$ literal 0 HcmV?d00001 From deacf809489c8bff1ee7853641e7e1680a00b431 Mon Sep 17 00:00:00 2001 From: Daniel Esteban Date: Thu, 7 Mar 2019 18:32:40 +0100 Subject: [PATCH 057/130] Added shopping list for Amazon Spain --- shoppinglist_es.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 shoppinglist_es.md diff --git a/shoppinglist_es.md b/shoppinglist_es.md new file mode 100644 index 0000000..e166950 --- /dev/null +++ b/shoppinglist_es.md @@ -0,0 +1,8 @@ +## 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/ +* Power: https://www.amazon.es/gp/product/B01M58O9M9/ +* 1TB Hard Drive: https://www.amazon.es/gp/product/B07997KKSK/ +* Case: https://www.amazon.es/gp/product/B01F1PSFY6/ +* LCD-Display: https://www.amazon.es/gp/product/B01MZZ1VY1/ \ No newline at end of file From 6b25f90e52350170f79c00b33c5abf8ecb43eb4e Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 7 Mar 2019 19:33:28 +0000 Subject: [PATCH 058/130] Bigger Power Adapter --- shoppinglist_es.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shoppinglist_es.md b/shoppinglist_es.md index e166950..39dd1a5 100644 --- a/shoppinglist_es.md +++ b/shoppinglist_es.md @@ -2,7 +2,7 @@ * RaspBerry Pi 3: https://www.amazon.es/gp/product/B07BDR5PDW/ * Micro SD-Card 16GB: https://www.amazon.es/gp/product/B073K14CVB/ -* Power: https://www.amazon.es/gp/product/B01M58O9M9/ +* 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/B01F1PSFY6/ -* LCD-Display: https://www.amazon.es/gp/product/B01MZZ1VY1/ \ No newline at end of file +* LCD-Display: https://www.amazon.es/gp/product/B01MZZ1VY1/ From e25b60e3225ed28b812678904367bf87e49ea992 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 7 Mar 2019 19:44:12 +0000 Subject: [PATCH 059/130] Case supporting display --- shoppinglist_es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shoppinglist_es.md b/shoppinglist_es.md index 39dd1a5..224bd5e 100644 --- a/shoppinglist_es.md +++ b/shoppinglist_es.md @@ -4,5 +4,5 @@ * Micro SD-Card 16GB: https://www.amazon.es/gp/product/B073K14CVB/ * 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/B01F1PSFY6/ +* Case: https://www.amazon.es/gp/product/B07DK4CRHS/ * LCD-Display: https://www.amazon.es/gp/product/B01MZZ1VY1/ From ed4f7ec1f2899642819d1582652442d2bd9d3fd0 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 8 Mar 2019 13:30:33 +0000 Subject: [PATCH 060/130] #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 061/130] #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 062/130] #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 063/130] #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 064/130] 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 065/130] #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 066/130] 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 067/130] #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 068/130] #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 069/130] 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 070/130] #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 071/130] 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 072/130] 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 073/130] #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 074/130] 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 075/130] #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 076/130] #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 077/130] #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 078/130] #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 079/130] 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 080/130] 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 081/130] #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 082/130] #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 083/130] #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 084/130] 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 085/130] 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 086/130] 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 087/130] #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 088/130] 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 089/130] #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 090/130] 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 091/130] #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 092/130] #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 093/130] #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 094/130] 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 095/130] 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 096/130] 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 097/130] 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 098/130] 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 099/130] 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 100/130] 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 101/130] 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 102/130] 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 103/130] 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 104/130] 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 105/130] #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 106/130] 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 107/130] #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 108/130] 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 109/130] 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 110/130] 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 111/130] 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 112/130] 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 113/130] #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 114/130] 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 115/130] 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 116/130] 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 117/130] 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 118/130] 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 119/130] 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 120/130] 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 121/130] 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 122/130] 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 123/130] 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 124/130] 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 125/130] 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 126/130] 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 127/130] 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 128/130] #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 129/130] #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 130/130] 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