From 05d7972e6f56184a559ba1f22a8165b62e4a3711 Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Wed, 20 Feb 2019 08:32:10 +0100 Subject: [PATCH 01/32] Add option to display QR-code for funding --- home.admin/BBfundWallet.sh | 11 +++++++++++ home.admin/XXdisplayQR.sh | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100755 home.admin/XXdisplayQR.sh diff --git a/home.admin/BBfundWallet.sh b/home.admin/BBfundWallet.sh index 4e995f3..6d1413c 100755 --- a/home.admin/BBfundWallet.sh +++ b/home.admin/BBfundWallet.sh @@ -68,3 +68,14 @@ fi echo "Whats next? --> Wait for confirmations. You can use info on LCD to check if funds have arrived." echo "If you want your lighting node to open channels automatically, activate the 'Autopilot' under 'Activate/Deactivate Services'" echo "" + +echo "" +echo "******************************" +echo "QR-Code? (Y/N)" +echo "******************************" +echo "Would you like to see a QR-code of this address? Press Y" +read -n1 key + +if [ "$key" = "y" ]; then + /home/admin/XXdisplayQR.sh $network:${address} +fi diff --git a/home.admin/XXdisplayQR.sh b/home.admin/XXdisplayQR.sh new file mode 100755 index 0000000..1d03012 --- /dev/null +++ b/home.admin/XXdisplayQR.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Display a QR code provided as parameter $1 + +qrcode=$1 + +# make sure qrcode-encoder in installed +clear +echo "*** Setup ***" +sudo apt-get install qrencode -y + +clear +echo "Make the this terminal as big as possible - fullscreen would be best." +echo "Then PRESS ENTER here in the terminal to generare the QR code and scan it with the app." +read key + +clear +echo -e "$1" | qrencode -t ANSI256 +echo -e "$1" +echo "(To shrink QR code: OSX->CMD- / LINUX-> CTRL-) Press ENTER when finished." +read key + +clear From 3ca18633bf39d176916b4631260db57eb1843d70 Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Fri, 22 Feb 2019 15:54:20 +0100 Subject: [PATCH 02/32] Fixed issue #344 (disappearing number of connections when dyndns) --- home.admin/00infoBlitz.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index da69057..0165c81 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -179,14 +179,6 @@ else public="" public_color="${color_red}" fi - if [ ${#public_addr} -gt 25 ]; then - # if a IPv6 address dont show peers to save space - networkConnectionsInfo="" - fi - if [ ${#public_addr} -gt 35 ]; then - # if a LONG IPv6 address dont show "Public" in front to save space - public_addr_pre="" - fi # DynDNS if [ ${#dynDomain} -gt 0 ]; then @@ -201,9 +193,17 @@ else # replace IP display with dynDNS public_addr_pre="DynDNS " - networkConnectionsInfo="" public_addr="${dynDomain}" + fi + if [ ${#public_addr} -gt 25 ]; then + # if a IPv6 address dont show peers to save space + networkConnectionsInfo="" + fi + + if [ ${#public_addr} -gt 35 ]; then + # if a LONG IPv6 address dont show "Public" in front to save space + public_addr_pre="" fi fi From 39f01b53eb6a6fc41aa0830500d75e375a8cc6d8 Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Fri, 22 Feb 2019 16:14:12 +0100 Subject: [PATCH 03/32] Lightning logo has straighter lines now and is brighter yellow This looks worse in ssh, but a lot better on the recommended LCD display --- home.admin/00infoBlitz.sh | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/home.admin/00infoBlitz.sh b/home.admin/00infoBlitz.sh index 0165c81..83e1a15 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -6,7 +6,8 @@ source /home/admin/_version.info # set colors color_red='\033[0;31m' color_green='\033[0;32m' -color_yellow='\033[0;33m' +color_amber='\033[0;33m' +color_yellow='\033[1;93m' color_gray='\033[0;37m' color_purple='\033[0;35m' @@ -174,7 +175,7 @@ else if [ $public_check = "0" ]; then public="" # only set yellow/normal because netcat can only say that the port is open - not that it points to this device for sure - public_color="${color_yellow}" + public_color="${color_amber}" else public="" public_color="${color_red}" @@ -188,7 +189,7 @@ else if [ "${ipOfDynDNS}:${public_port}" != "${public_addr}" ]; then public_color="${color_red}" else - public_color="${color_yellow}" + public_color="${color_amber}" fi # replace IP display with dynDNS @@ -230,7 +231,7 @@ else public_check=$(nc -z -w6 ${public_ip} 9735 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}" + ln_publicColor="${color_amber}" else ln_publicColor="${color_red}" fi @@ -269,20 +270,20 @@ printf " ${color_yellow} ${color_yellow} ${color_yellow} -${color_yellow} ${color_yellow}%s ${color_green} ${ln_alias} +${color_yellow} ${color_amber}%s ${color_green} ${ln_alias} ${color_yellow} ${color_gray}${network} Fullnode + Lightning Network ${torInfo} -${color_yellow} ,/ ${color_yellow}%s -${color_yellow} ,'/ ${color_gray}%s, CPU %s°C -${color_yellow} ,' / ${color_gray}Free Mem ${color_ram}${ram} ${color_gray} Free HDD ${color_hdd}%s -${color_yellow} ,' /_____, ${color_gray}ssh admin@${color_green}${local_ip}${color_gray} ▼${network_rx} ▲${network_tx} -${color_yellow} .'____ ,' ${color_gray}${webinterfaceInfo} -${color_yellow} / ,' ${color_gray}${network} ${color_green}${networkVersion} ${chain}net ${color_gray}Sync ${sync_color}${sync} (%s) -${color_yellow} / ,' ${color_gray}${public_addr_pre}${public_color}${public_addr} ${public}${networkConnectionsInfo} -${color_yellow} /,' ${color_gray} -${color_yellow} /' ${color_gray}LND ${color_green}${ln_version} ${ln_baseInfo} +${color_yellow} / ${color_amber}%s +${color_yellow} // ${color_gray}%s, CPU %s°C +${color_yellow} / / ${color_gray}Free Mem ${color_ram}${ram} ${color_gray} Free HDD ${color_hdd}%s +${color_yellow} / /______ ${color_gray}ssh admin@${color_green}${local_ip}${color_gray} ▼${network_rx} ▲${network_tx} +${color_yellow} /_____ / ${color_gray}${webinterfaceInfo} +${color_yellow} / / ${color_gray}${network} ${color_green}${networkVersion} ${chain}net ${color_gray}Sync ${sync_color}${sync} (%s) +${color_yellow} / / ${color_gray}${public_addr_pre}${public_color}${public_addr} ${public}${networkConnectionsInfo} +${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_gray}${ln_publicColor}${ln_external} " \ "RaspiBlitz v${codeVersion}" \ From c927aa6c17c041f96e1089c0b863ee0082185f7a Mon Sep 17 00:00:00 2001 From: "hapax.io" <39811582+thehapax@users.noreply.github.com> Date: Sat, 23 Feb 2019 00:15:18 -0800 Subject: [PATCH 04/32] detect os and print corresponding QR command --- home.admin/97addMobileWalletZap.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/home.admin/97addMobileWalletZap.sh b/home.admin/97addMobileWalletZap.sh index 116db47..1c77e92 100755 --- a/home.admin/97addMobileWalletZap.sh +++ b/home.admin/97addMobileWalletZap.sh @@ -77,7 +77,21 @@ else lndconnect --host=${dynDomain} fi -echo "(To shrink QR code: OSX->CMD- / LINUX-> CTRL-) Press ENTER when finished." + +platform='unknown' +unamestr=`uname` +if [[ "$unamestr" == 'Linux' ]]; then + platform='linux' +elif [[ "$unamestr" == 'Darwin' ]]; then + platform='Darwin' # mac OSX +fi + +if [[ $platform == 'Linux' ]]; then + echo "(To shrink QR code: CTRL-) Press ENTER when finished." +elif [[ $platform == 'Darwin' ]]; then + echo "(To shrink QR code: CMD-) Press ENTER when finished." +fi + read key clear From c5669a94645370b5e195a866adec09e67cffb15f Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Sat, 23 Feb 2019 16:38:06 +0100 Subject: [PATCH 05/32] Added QR display on LCD-screen for fundWallet, createInvoice and addMobileWalletShango --- home.admin/97addMobileWalletShango.sh | 21 +++++++-------- home.admin/BBcreateInvoice.sh | 12 +++++---- home.admin/BBfundWallet.sh | 15 +++-------- home.admin/XXdisplayQR.sh | 37 ++++++++++++++++++--------- 4 files changed, 45 insertions(+), 40 deletions(-) mode change 100644 => 100755 home.admin/97addMobileWalletShango.sh diff --git a/home.admin/97addMobileWalletShango.sh b/home.admin/97addMobileWalletShango.sh old mode 100644 new mode 100755 index 3070efb..43a339a --- a/home.admin/97addMobileWalletShango.sh +++ b/home.admin/97addMobileWalletShango.sh @@ -4,10 +4,7 @@ source /home/admin/raspiblitz.info source /mnt/hdd/raspiblitz.conf -# make sure qrcode-encoder in installed clear -echo "*** Setup ***" -sudo apt-get install qrencode -y # get local IP myip=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p') @@ -35,20 +32,20 @@ echo "On Setup Step 'Choose LND Server Type' connect to 'DIY SELF HOSTED'" echo "(Or in the App go to --> 'Settings' > 'Connect to your LND Server')" echo "There you see three 3 form fields to fill out. Skip those and go right to the buttons below." echo "" -echo "Click on the 'Scan QR' button" -echo "Make the this terminal as big as possible - fullscreen would be best." -echo "Then PRESS ENTER here in the terminal to generare the QR code and scan it with the app." -read key +echo "Click on the 'Scan QR' button and PRESS ENTER" +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 "(To shrink QR code: OSX->CMD- / LINUX-> CTRL-) Press ENTER when finished." -read key -shred qr.txt + +echo -e "${myip}:10009,\n$(xxd -p -c2000 ./.lnd/data/chain/${network}/${chain}net/admin.macaroon)," > qr.txt && cat ./.lnd/tls.cert >>qr.txt + +./XXdisplayQR.sh clear +echo echo "Now press 'Connect' within the Shango Wallet." echo "If its not working - check issues on GitHub:" +echo echo "https://github.com/neogeno/shango-lightning-wallet/issues" -echo "" \ No newline at end of file +echo "" diff --git a/home.admin/BBcreateInvoice.sh b/home.admin/BBcreateInvoice.sh index 1f8fef8..7d20010 100755 --- a/home.admin/BBcreateInvoice.sh +++ b/home.admin/BBcreateInvoice.sh @@ -79,10 +79,10 @@ if [ ${#error} -gt 0 ]; then echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "${error}" else - echo "******************************" - echo "WIN" - echo "******************************" - echo "${result}" +# echo "******************************" +# echo "WIN" +# echo "******************************" +# echo "${result}" echo "" rhash=$(echo "$result" | grep r_hash | cut -d '"' -f4) payReq=$(echo "$result" | grep pay_req | cut -d '"' -f4) @@ -95,4 +95,6 @@ else # TODO: Offer to go into monitor for incommin payment loop. fi -echo "" \ No newline at end of file +echo "" +echo -e "${payReq}" > qr.txt +./XXdisplayQR.sh diff --git a/home.admin/BBfundWallet.sh b/home.admin/BBfundWallet.sh index 6d1413c..6e24223 100755 --- a/home.admin/BBfundWallet.sh +++ b/home.admin/BBfundWallet.sh @@ -65,17 +65,10 @@ echo "Send ${coininfo} to address --> ${address}" if [ "$chain" = "test" ]; then echo "get some testnet coins from https://testnet-faucet.mempool.co" fi + +echo -e "$network:${address}" > qr.txt +/home/admin/XXdisplayQR.sh + echo "Whats next? --> Wait for confirmations. You can use info on LCD to check if funds have arrived." echo "If you want your lighting node to open channels automatically, activate the 'Autopilot' under 'Activate/Deactivate Services'" echo "" - -echo "" -echo "******************************" -echo "QR-Code? (Y/N)" -echo "******************************" -echo "Would you like to see a QR-code of this address? Press Y" -read -n1 key - -if [ "$key" = "y" ]; then - /home/admin/XXdisplayQR.sh $network:${address} -fi diff --git a/home.admin/XXdisplayQR.sh b/home.admin/XXdisplayQR.sh index 1d03012..09de15c 100755 --- a/home.admin/XXdisplayQR.sh +++ b/home.admin/XXdisplayQR.sh @@ -1,23 +1,36 @@ #!/bin/bash -# Display a QR code provided as parameter $1 +# Display a QR code for the string in qr.txt -qrcode=$1 +echo +echo "Please wait. Generating QR-code..." +echo +# make sure qrcode-encode and fbi are installed +sudo apt-get install qrencode fbi -y > /dev/null -# make sure qrcode-encoder in installed -clear -echo "*** Setup ***" -sudo apt-get install qrencode -y +qrencode -l L -o /home/admin/qr.png < /home/admin/qr.txt > /dev/null +sudo fbi -a -T 1 -d /dev/fb1 --noverbose /home/admin/qr.png 2> /dev/null + +echo "************************************" +echo "Scan the QR-Code on the LCD-Display." +echo "************************************" +echo +echo "If you don't have access to the LCD, you can view it here." +echo "Make the this terminal window as big as possible - fullscreen would be best." +echo "Then PRESS ENTER here in the terminal to show QR code." -clear -echo "Make the this terminal as big as possible - fullscreen would be best." -echo "Then PRESS ENTER here in the terminal to generare the QR code and scan it with the app." read key clear -echo -e "$1" | qrencode -t ANSI256 -echo -e "$1" -echo "(To shrink QR code: OSX->CMD- / LINUX-> CTRL-) Press ENTER when finished." +qrencode -t ANSI256 < /home/admin/qr.txt +shred /home/admin/qr.txt +rm -f /home/admin/qr.txt +echo "(To shrink QR code: macOS press CMD- / LINUX press CTRL-) Press ENTER when finished." read key clear + +# remove the QR picture on the raspi LCD +sudo killall -3 fbi +shred /home/admin/qr.png +rm -f /home/admin/qr.png From 8e649c82825db6e562510ea4681a88af4420ee19 Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Sat, 23 Feb 2019 17:00:39 +0100 Subject: [PATCH 06/32] Moved installation instructions for Shango Mobile Wallet and display QR-Code to App-Store Users chose if they want Shango for iOS or Android and get the correct url including qr-code for their device --- home.admin/97addMobileWallet.sh | 31 +++++++++++++++++++++++---- home.admin/97addMobileWalletShango.sh | 5 ----- 2 files changed, 27 insertions(+), 9 deletions(-) mode change 100644 => 100755 home.admin/97addMobileWallet.sh diff --git a/home.admin/97addMobileWallet.sh b/home.admin/97addMobileWallet.sh old mode 100644 new mode 100755 index 0d53805..9063f26 --- a/home.admin/97addMobileWallet.sh +++ b/home.admin/97addMobileWallet.sh @@ -25,16 +25,39 @@ fi # Basic Options OPTIONS=(ZAP "Zap Wallet (iOS)" \ - SHANGO "Shango Wallet (iOS/Android)") + SHANGO_IOS "Shango Wallet for iOS" + SHANGO_ANDROID "Shango Wallet for Android" + ) -CHOICE=$(dialog --clear --title "Choose Mobile Wallet" --menu "" 10 40 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) +CHOICE=$(dialog --clear --title "Choose Mobile Wallet" --menu "" 10 50 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) clear case $CHOICE in CLOSE) exit 1; ;; - SHANGO) + SHANGO_IOS) + echo "************************************" + echo "Install Testflight and Shango-Wallet" + echo "************************************" + echo "At the moment this app is in public beta testing:" + echo + echo "https://testflight.apple.com/join/WwCjFnS8" + echo "https://testflight.apple.com/join/WwCjFnS8" > qr.txt + echo + ./XXdisplayQR.sh + ./97addMobileWalletShango.sh + exit 1; + ;; + SHANGO_ANDROID) + echo "*******************************************" + echo "Install Shango-Wallet on your Android Phone" + echo "*******************************************" + echo + echo "At the moment this app is in public beta testing:" + echo "https://play.google.com/apps/testing/com.shango" >qr.txt + echo "https://play.google.com/apps/testing/com.shango" + ./XXdisplayQR.sh ./97addMobileWalletShango.sh exit 1; ;; @@ -42,4 +65,4 @@ case $CHOICE in ./97addMobileWalletZap.sh exit 1; ;; -esac \ No newline at end of file +esac diff --git a/home.admin/97addMobileWalletShango.sh b/home.admin/97addMobileWalletShango.sh index 43a339a..7ac5453 100755 --- a/home.admin/97addMobileWalletShango.sh +++ b/home.admin/97addMobileWalletShango.sh @@ -19,11 +19,6 @@ echo "******************************" echo "Connect Shango Mobile Wallet" echo "******************************" echo "" -echo "GETTING THE APP" -echo "At the moment this app is in public beta testing:" -echo "iOS: Read https://testflight.apple.com/join/WwCjFnS8 (open on device)" -echo "Android: https://play.google.com/apps/testing/com.shango (open on device)" -echo "" echo "*** 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)." From 43fce1f6091a6f607692946329878660239ab941 Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Sun, 24 Feb 2019 07:08:33 +0100 Subject: [PATCH 07/32] Display Shango logo and QR-link on LCD during setup and made QR-display a little smoother --- home.admin/97addMobileWallet.sh | 52 +++++++++++++++++--------- home.admin/97addMobileWalletShango.sh | 48 ++++++++++++------------ home.admin/BBcreateInvoice.sh | 47 ++++++++++++++++++----- home.admin/BBfundWallet.sh | 32 ++++++++++------ home.admin/XXaptInstall.sh | 4 ++ home.admin/XXdisplayLCD.sh | 8 ++++ home.admin/XXdisplayQR.sh | 28 ++++---------- home.admin/XXdisplayQRlcd.sh | 10 +++++ home.admin/XXdisplayQRlcd_hide.sh | 4 ++ home.admin/assets/install_shango.jpg | Bin 0 -> 47978 bytes 10 files changed, 151 insertions(+), 82 deletions(-) create mode 100755 home.admin/XXaptInstall.sh create mode 100755 home.admin/XXdisplayLCD.sh create mode 100755 home.admin/XXdisplayQRlcd.sh create mode 100755 home.admin/XXdisplayQRlcd_hide.sh create mode 100644 home.admin/assets/install_shango.jpg diff --git a/home.admin/97addMobileWallet.sh b/home.admin/97addMobileWallet.sh index 9063f26..cf91fed 100755 --- a/home.admin/97addMobileWallet.sh +++ b/home.admin/97addMobileWallet.sh @@ -6,7 +6,7 @@ source /mnt/hdd/raspiblitz.conf # check if dynamic domain is set if [ ${#dynDomain} -eq 0 ]; then - dialog --title " Just Local Network? " --yesno "If you want to connect with your RaspiBlitz + whiptail --title " Just Local Network? " --yesno "If you want to connect with your RaspiBlitz also from outside your local network you need to activate 'Services' -> 'DynamicDNS' FIRST. @@ -29,7 +29,9 @@ OPTIONS=(ZAP "Zap Wallet (iOS)" \ SHANGO_ANDROID "Shango Wallet for Android" ) -CHOICE=$(dialog --clear --title "Choose Mobile Wallet" --menu "" 10 50 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) +CHOICE=$(whiptail --clear --title "Choose Mobile Wallet" --menu "" 15 50 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) + +./XXdisplayQRlcd_hide.sh clear case $CHOICE in @@ -37,27 +39,41 @@ case $CHOICE in exit 1; ;; SHANGO_IOS) - echo "************************************" - echo "Install Testflight and Shango-Wallet" - echo "************************************" - echo "At the moment this app is in public beta testing:" - echo - echo "https://testflight.apple.com/join/WwCjFnS8" echo "https://testflight.apple.com/join/WwCjFnS8" > qr.txt - echo - ./XXdisplayQR.sh + ./XXdisplayLCD.sh /home/admin/assets/install_shango.jpg + + whiptail --title "Install Testflight and Shango on your iOS device" \ + --yes-button "show link as QR" \ + --no-button "continue" \ + --yesno "At the moment this app is in public beta testing:\n\nhttps://testflight.apple.com/join/WwCjFnS8" 20 60 + + if [ $? -eq 0 ]; then + /home/admin/XXdisplayQR.sh + fi + + shred qr.txt + rm -f qr.txt + /home/admin/XXdisplayQRlcd_hide.sh + ./97addMobileWalletShango.sh exit 1; ;; SHANGO_ANDROID) - echo "*******************************************" - echo "Install Shango-Wallet on your Android Phone" - echo "*******************************************" - echo - echo "At the moment this app is in public beta testing:" - echo "https://play.google.com/apps/testing/com.shango" >qr.txt - echo "https://play.google.com/apps/testing/com.shango" - ./XXdisplayQR.sh + echo "https://play.google.com/apps/testing/com.shango" > qr.txt + ./XXdisplayQRlcd.sh + whiptail --title "Install Shango on your Android Phone" \ + --yes-button "show link as QR" \ + --no-button "continue" \ + --yesno "At the moment this app is in public beta testing:\n\nhttps://play.google.com/apps/testing/com.shango \n\nDo you want to see a QR code with an Playstore link?" 20 60 + + if [ $? -eq 0 ]; then + /home/admin/XXdisplayQR.sh + fi + + shred qr.txt + rm -f qr.txt + /home/admin/XXdisplayQRlcd_hide.sh + ./97addMobileWalletShango.sh exit 1; ;; diff --git a/home.admin/97addMobileWalletShango.sh b/home.admin/97addMobileWalletShango.sh index 7ac5453..743113e 100755 --- a/home.admin/97addMobileWalletShango.sh +++ b/home.admin/97addMobileWalletShango.sh @@ -14,33 +14,33 @@ if [ ${#dynDomain} -gt 0 ]; then myip="${dynDomain}" fi -clear -echo "******************************" -echo "Connect Shango Mobile Wallet" -echo "******************************" -echo "" -echo "*** STEP 1 ***" +#echo -e "${myip}:10009,\n$(xxd -p -c2000 ./.lnd/data/chain/${network}/${chain}net/admin.macaroon)," > qr.txt && cat ./.lnd/tls.cert >>qr.txt +echo -e "${myip}:10009,\n$(xxd -p -c2000 ./.lnd/data/chain/${network}/${chain}net/admin.macaroon)," > qr.txt + +./XXdisplayQRlcd.sh + +msg="" 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)." + msg="Once you have the app is running make sure you are on the same local network (WLAN same as LAN)." fi -echo "On Setup Step 'Choose LND Server Type' connect to 'DIY SELF HOSTED'" -echo "(Or in the App go to --> 'Settings' > 'Connect to your LND Server')" -echo "There you see three 3 form fields to fill out. Skip those and go right to the buttons below." -echo "" -echo "Click on the 'Scan QR' button and PRESS ENTER" +msg="${msg}On Setup Step 'Choose LND Server Type' connect to 'DIY SELF HOSTED' \n\n (Or in the App go to --> 'Settings' > 'Connect to your LND Server') \n\nThere you see three 3 form fields to fill out. Skip those and go right to the buttons below.\n\nClick on the 'Scan QR' button. Scan the QR on the LCD and or to see it in this window." -read key -clear -echo "*** STEP 2 : SCAN MACAROON (make whole QR code fill camera) ***" +whiptail --backtitle "Connecting Shango Mobile Wallet" \ + --title "Setup Shango Step 1" \ + --yes-button "show QR" \ + --no-button "continue" \ + --yesno "${msg}" 20 65 -echo -e "${myip}:10009,\n$(xxd -p -c2000 ./.lnd/data/chain/${network}/${chain}net/admin.macaroon)," > qr.txt && cat ./.lnd/tls.cert >>qr.txt +if [ $? -eq 0 ]; then + /home/admin/XXdisplayQR.sh +fi +shred qr.txt +rm -f qr.txt -./XXdisplayQR.sh +whiptail --backtitle "Connecting Shango Mobile Wallet" \ + --title "Press Connect on Shango" \ + --msgbox "Now press 'Connect' within the Shango Wallet.\n\nIf its not working - check issues on GitHub:\n\nhttps://github.com/neogeno/shango-lightning-wallet/issues" 15 65 -clear -echo -echo "Now press 'Connect' within the Shango Wallet." -echo "If its not working - check issues on GitHub:" -echo -echo "https://github.com/neogeno/shango-lightning-wallet/issues" -echo "" +./XXdisplayQRlcd_hide.sh +shred qr.png 2> /dev/null +rm -f qr.png diff --git a/home.admin/BBcreateInvoice.sh b/home.admin/BBcreateInvoice.sh index 7d20010..abbd5ab 100755 --- a/home.admin/BBcreateInvoice.sh +++ b/home.admin/BBcreateInvoice.sh @@ -25,6 +25,7 @@ if [ ${chainInSync} -eq 0 ]; then echo "!!!!!!!!!!!!!!!!!!!" echo "" exit 1 + # TODO: Wait and loop. Offer the user a "abort wait" button fi # check number of connected peers @@ -51,6 +52,8 @@ if [ ${#amount} -eq 0 ]; then exit 1 fi +# TODO let user enter a description + # build command command="lncli --chain=${network} --network=${chain}net addinvoice ${amount}" @@ -83,18 +86,44 @@ else # echo "WIN" # echo "******************************" # echo "${result}" - echo "" + + rhash=$(echo "$result" | grep r_hash | cut -d '"' -f4) payReq=$(echo "$result" | grep pay_req | cut -d '"' -f4) + echo -e "${payReq}" > qr.txt + ./XXdisplayQRlcd.sh + + echo + echo "********************" + echo "Here is your invoice" + echo "********************" + echo echo "Give this Invoice/PaymentRequest to someone to pay it:" - echo "" - echo ${payReq} - echo "" - echo "You can use 'lncli --chain=${network} --network=${chain}net lookupinvoice ${rhash}' to check the payment. " + echo + echo "${payReq}" + echo + echo "Do you want to see the invoice QR-code in this terminal? (Y/N)" - # TODO: Offer to go into monitor for incommin payment loop. + read -n1 key + if [ "$key" = "y" ]; then + /home/admin/XXdisplayQR.sh + fi + + shred qr.txt + rm -f qr.txt + clear + echo "************" + echo "What's next?" + echo "************" + echo + echo "You can use" + echo + echo "lncli --chain=${network} --network=${chain}net lookupinvoice ${rhash}" + echo + echo "to check the payment." + + /home/admin/XXdisplayQRlcd_hide.sh + # TODO: Offer to go into monitor for incommin payment loop. + # Or simply start the loop and show success status when payment occured fi -echo "" -echo -e "${payReq}" > qr.txt -./XXdisplayQR.sh diff --git a/home.admin/BBfundWallet.sh b/home.admin/BBfundWallet.sh index 6e24223..edb6461 100755 --- a/home.admin/BBfundWallet.sh +++ b/home.admin/BBfundWallet.sh @@ -56,19 +56,29 @@ if [ "$chain" = "test" ]; then coininfo="TESTNET Bitcoin" fi -# output info -echo "" -echo "******************************" -echo "TODO" -echo "******************************" -echo "Send ${coininfo} to address --> ${address}" +msg="Send ${coininfo} to address --> ${address}\n\nScan the QR code on the LCD with your mobile wallet or copy paste the address." if [ "$chain" = "test" ]; then - echo "get some testnet coins from https://testnet-faucet.mempool.co" + msg="${msg} \n\n Get some testnet coins from https://testnet-faucet.mempool.co" fi echo -e "$network:${address}" > qr.txt -/home/admin/XXdisplayQR.sh +/home/admin/XXdisplayQRlcd.sh -echo "Whats next? --> Wait for confirmations. You can use info on LCD to check if funds have arrived." -echo "If you want your lighting node to open channels automatically, activate the 'Autopilot' under 'Activate/Deactivate Services'" -echo "" +whiptail --backtitle "Fund your on chain wallet" \ + --title "Send ${coininfo}" \ + --yes-button "show QR" \ + --no-button "continue" \ + --yesno "${msg} \n\n Do you want to see the QR-code for ${coininfo}:${address} in this window?" 0 0 + +if [ $? -eq 0 ]; then + /home/admin/XXdisplayQR.sh +fi + +shred qr.txt +rm -f qr.txt + +whiptail --backtitle "Fund your on chain wallet" \ + --title "What's next?" \ + --msgbox "Wait for confirmations. \n\nYou can use info on LCD to check if funds have arrived. \n\nIf you want your lighting node to open channels automatically, activate the 'Autopilot' under 'Activate/Deactivate Services'" 0 0 + +/home/admin/XXdisplayQRlcd_hide.sh diff --git a/home.admin/XXaptInstall.sh b/home.admin/XXaptInstall.sh new file mode 100755 index 0000000..2adc88d --- /dev/null +++ b/home.admin/XXaptInstall.sh @@ -0,0 +1,4 @@ +# Installs package if not yet installed +if [ $(sudo dpkg-query -l | grep "ii $1" | wc -l) = 0 ]; then + sudo apt-get install $1 -y > /dev/null +fi diff --git a/home.admin/XXdisplayLCD.sh b/home.admin/XXdisplayLCD.sh new file mode 100755 index 0000000..868c07a --- /dev/null +++ b/home.admin/XXdisplayLCD.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Display an image on the LCD + +# make sure fbi is installed +./XXaptInstall.sh fbi + +sudo fbi -a -T 1 -d /dev/fb1 --noverbose $1 2> /dev/null diff --git a/home.admin/XXdisplayQR.sh b/home.admin/XXdisplayQR.sh index 09de15c..f7d6cb0 100755 --- a/home.admin/XXdisplayQR.sh +++ b/home.admin/XXdisplayQR.sh @@ -2,24 +2,17 @@ # Display a QR code for the string in qr.txt -echo -echo "Please wait. Generating QR-code..." -echo # make sure qrcode-encode and fbi are installed -sudo apt-get install qrencode fbi -y > /dev/null +#clear +#echo "*** Setup ***" -qrencode -l L -o /home/admin/qr.png < /home/admin/qr.txt > /dev/null -sudo fbi -a -T 1 -d /dev/fb1 --noverbose /home/admin/qr.png 2> /dev/null +echo 50 | whiptail --title "Installing" --backtitle "QR-Code" --gauge "please wait" 4 40 100 +./XXaptInstall.sh qrencode +echo 90 | whiptail --title "Installing" --backtitle "QR-Code" --gauge "please wait" 4 40 100 +./XXaptInstall.sh fbi -echo "************************************" -echo "Scan the QR-Code on the LCD-Display." -echo "************************************" -echo -echo "If you don't have access to the LCD, you can view it here." -echo "Make the this terminal window as big as possible - fullscreen would be best." -echo "Then PRESS ENTER here in the terminal to show QR code." - -read key +whiptail --title "Get ready" --backtitle "QR-Code in Terminal Window" \ + --msgbox "Make this terminal window as large as possible - fullscreen would be best. \n\nThe QR-Code might be too large for your display. In that case, shrink the letters by pressing the keys Ctrl and Minus (or Cmd and Minus if you are on a Mac) \n\nPRESS ENTER when you are ready to see the QR-code." 20 60 clear qrencode -t ANSI256 < /home/admin/qr.txt @@ -29,8 +22,3 @@ echo "(To shrink QR code: macOS press CMD- / LINUX press CTRL-) Press ENTER when read key clear - -# remove the QR picture on the raspi LCD -sudo killall -3 fbi -shred /home/admin/qr.png -rm -f /home/admin/qr.png diff --git a/home.admin/XXdisplayQRlcd.sh b/home.admin/XXdisplayQRlcd.sh new file mode 100755 index 0000000..1aa7ad2 --- /dev/null +++ b/home.admin/XXdisplayQRlcd.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Display a QR code for the string in qr.txt + +# make sure qrcode-encode and fbi are installed +./XXaptInstall.sh qrencode +./XXaptInstall.sh fbi + +qrencode -l L -o /home/admin/qr.png < /home/admin/qr.txt > /dev/null +sudo fbi -a -T 1 -d /dev/fb1 --noverbose /home/admin/qr.png 2> /dev/null diff --git a/home.admin/XXdisplayQRlcd_hide.sh b/home.admin/XXdisplayQRlcd_hide.sh new file mode 100755 index 0000000..98a6782 --- /dev/null +++ b/home.admin/XXdisplayQRlcd_hide.sh @@ -0,0 +1,4 @@ +#!/bin/bash +sudo killall -3 fbi +shred /home/admin/qr.png 2> /dev/null +rm -f /home/admin/qr.png 2> /dev/null diff --git a/home.admin/assets/install_shango.jpg b/home.admin/assets/install_shango.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c83e8e8c595f774c5d862d8b125d168d4badd5e4 GIT binary patch literal 47978 zcmeFYc|4SF`!{}#oiN!$jD5|%3scFK5DHNyA^T32WLiieicr={w#1ZuA4HNZOW7GD z*)n4p!)(u``@TQl`}@70=lOkq&+GZ)_j>*A(_Gga&g;0&^E{5@T;9iVo`ad)PT!#q$MSDYJ z{?0=K@~8md9pC`3V2J7;nj55Jx*qRp~XbJ-1NolH7t}Z0u9|g zy-cHm-EE^RFShuKPEB7ayy zee}f~EG~!`1_Zl{Xeg>HDvN<{2fN+SwK;42_jken^u_+($nfxR#c(ynfM5?L6&)QN zC1q75RaFI$Lm?#6Khz~c!9PU&A0?c14{;6l3JmoM@E18O(dBwTSg5`jSo7bSH zlvNc})i3_T7Jp+h40b=X*~NeWUwyIvYQw{}ySeIygkAS`cMbi!D$clgD1oHXe|n&F zDAGTPc*t;=1?ugP{L26aBL7bR*1*3t@NW(LTLb^rz`r%{|33}<2ZVF?2XR|C2+#oP z2B3YxGaxh|#4{iegpbOA_8Bt^x&|2ywM*h%xZex%RhkTC;<5RhX&i2oDp%j>?p!G0Ag8YfB^uJsf%k!poOjR z#lteqj0{CWK&C(C|8>KE|ATCS5e3r=A|iif|Mv(E*TCRV5E@?q+11=Y+y~OJAnh9- z8hDtG1!?Zaflu+4#Per|_!CrCfM z8RibswC6$k!A&psaF8AaX$jvjKQE9bfHb$CyGsZF(6Juohq}9Zg0wP7vj$(ZF$8Hn z&{1IZ_$T`MKhdG?5nww3z%U>%GT6(*GgL&zRaOLqyV@eA?%}@fp`i*FKuGQq>;}SS zzd#rNNC5bo%!h9QoQJv<0hO$&qNAy)pnB*S{FVN<5C7u&-xG(n{Ts)&^&gu-c>De% z??2xCkGz1_V4vCrb@Svu@~*!CfVwyUI5znoc@i%H02&JbwS)g85AR`r`6u}ADsre)*8tyuuwao8&?9meQTVT&`2YCD ze`?l0wc~`1`wjPCcYm-dJFu5|`Fnuo_ILC8Q(LkZ8z#NFpQ^k_CAMDTRE1 zG(g%RJ&+;D1Y{nv0@;Eb(9qJb(s0uV(MZuK(P-10rZK0vNOP6OgC>Y3iYAsOndUjo zYnpd7wKVNCy)@rwFf?m4yR-o95n5haQCbCBZCXQGD_Td|8??c+F|-M^8MLoyD`*>O zyJ<&gF|_Nn`*aL+Ty!FI3UnvwOzAGsxzYvE#n2_uWzm(;)zWp+jnK{0Vd*IJZ1l(J z<>__l&FCHIJ?O*fAJAve7tz3C5(#WX$Bq;#_S+B5$u_m(?v$nBLux_)lu}QI= zVsm5*WlLr&W&6lB%SK@5Vpn80V|QamvS+i`vJbQWhB8AXp{JqF&?smIvO6Kl5j@#EEj$=rT3#t$GhScb z6y8eS@4N?mLVTzB-1#2yRqze-?Hv<5cIue>v4mr&W8aP)@Qd&p@%!*U<*(zP5ug*0 z6R;Kt7swOn5?B}H7Cb5FDwrTxDL8qY=D6H(o8z~R7aZ?9zAGdwWFizO^g`&P(7G_M z@F`($;b+3F!YeQ?m;uZS_6&xGt%~r7oEGsFc`ni^f)zb3YAPBg`bu;_lqe=Gc1i4> z7)oqLoJCw){D$~5@eXmU1Wdw0B3hzMVp5V>Qd`nfGE=f!a!*QH%3dm7s!r;c^f75O z=_u(k>1i1@8MsW4%xjrZSq52cSs&S4*{^amavE};a@lf&@-*_A@?P?}@6Uexp34!l`mj<(^8T z%9g5}s;g?Y>ZlrC*Pj@r6;ZDuJ=Z7QD02oMgNsP z#z4g2n!!s03|tiM0)Gu(I3<3{?NrgJ<0|OLT0XJrDoW3TIX(`>ojLI zw>8f)UpOy!KKOj21&zfyi!_UAOG!(A%Q`E-%FHUwYUYCUg`f*f)(qActh23u+Njt> z+jQG<*&=M;+Tt&sxtMZs>XOW*uuC0wP`fL3rFMJvXYEt%F%C)&w;g&f3taZPT<^%} zXy;huxa(x(l)e8XB3uwv*XXa=UweCvWOxHEHQ*O`PR^0X7Q{9(u=-)`a@ykQsBh6#Q6YiPex$b4?mF0!=HucW; z-t)2YDfXfI+WVsXnEbB!HTZM-`}lVT2nR$23;AZwsLbzRcRRl+be?(uTT;!w3p#p1*zi z_Ny33%=MTKq&PAbxpc?mPRU)CyFPdO?T&EaBNsIwHL%Lp>uulO;1O6Z8E1^ZFMOFP^+0WqD?O%RZBh z$~m6%C}%I%Eq6HYR9;2CP<~?m!Aq}~%EHQ4-d%b3wft;(eT72BD- znpbvIX;)QLOIGL9aMdK#LTV#xv2~txnEK20Lk;H|IvP(l)-)+L6*r4EXSeXQq_ncM z#1DXT1gIa_2Uv<7V4(ScG4#S7rN6wCX8Z{g3{bu=X==-Jb<6~FG zFyn6Hzb1SqaFaJDiBor`>8BHBj?QGv9-nC%; ziv7v4A(SM!ST%GXt=)upw-HRAe%4UUbR-!i|eH&1Q$VI8nbxL_Q0D`}g5 zyLd-^r(^fR?kwI9Puxo&@Dob*wfDOZ><^ZS;Uq@VbFwVCkz!7nrutE-)HZ;F333Y3 zK?@NBXgDCW91vM$l1}v2hRLA3jP*O?#G} zk@@^Z*6V^dg+;|BrEe>%s%vWN>Kht6K6Z9}>i*pGWq4%t+xM~YiOKne#UD#Qmw&CS z;ISK9W5Q>pdgmIAmP-=zX;c0;nh>Xky3(G!C)5oMMMLzyW{pO?2wl;;gY;+Dm;=u-DxJ-?uK zcQu?muh?bsfB0sd{X|D^n1}UU8*Xh(eJlFYey*`@bjJ&Rrkj~|{DZT!2Vb*zdM@4- zC_Q;I=H`gkBxuqrDHQT5v^&^{$|OoOF> z&mmiTcegOrW6Kylg$!6SOj;=Y`(mu0!@o`=gO`RKcCe8w4Ss0 zOMZ+fL*h4{~m`cy?W7{H?ZTsx}#=# zBM@yL8XoWRrbLe=#j|Eu=P+~|rzdymv32^PRzfg)Bra*ZC_$yzh#?(w%OZG7SqtIw z0-gID$tyvgtL1pLUnTjSwf@DpJi6_a z?-k%k1+1fWv5bZ_*}hj9Y2d5cOq7o z_HD-i5u@qsRV2_BFkM7RI5d zfIzubwese{_l!)Jw`=wY*Wp*U9_b(T5dN`4yM`$5mFnow8{jaD6yGmc(>@q6pFC$1 z<5wGE*oI(#^cnj*jSAf1MU%YKC`V!Or$Xjuq^STs9?WR@J~i+D?VZ?Wm*X>mDB+vG zS?6Ae+-Utl&O}}tWQzGp;cLaEkR_8~_en0qdXbo}*MJ4K=oTaBxCx}~!|Enqn?V;?%y z)z!)uq-mB?mf`xETmw&#^R~DuRc$f5QdB;acPtu$#gK|WHlBvzp*2)s@zQ_~oGylu z@PMIiOppK7Rq-UAG|O6@g9R1m#1bcO-Ag@Hqpu?*o!>4p3KxvtmP?s*8iPN+9gY{~ z4Wb-(j4>r09Gkw)OstXQSK3q`+ONT_QJDFNe9@jG(n#np7&g{>z4%MZ*OYXDIzRlo z^Xv_)fSrD>&wenu5`7((H1{F?u_%@bq_~=s`7Yd`^nWi;Z|x7|ODzspIbV?RsNr{E zW)@|gGCW%|PX($GZF6)nBQVC@{QG(EN6v#6A3iK0D>&s`n=h^VfB0GHMLQqkCUse!PHP_E<63;Sn;)Sw>(RdPY@?I7kqoh!TQu z!oiV#_7+$2>WO+k(J=?A^P)~kSnu09bNy%R;OUeshlXM7qVmO=hL)^--S-V-I&uLC zce;M>9kgaF2m@m?TV(TfGCk*bO0PG5C2svCUV&8ULw4@cwk}#7y=h7Xn3XSUoHug# z`UWNInT&3CW=`vrnH=~aJ)vG7>};p4ko+p-EBnTNh*RTWm${$f_%8$$<7DoR888`G z9;KxMue9Lj77WB9_B9$l-G6;uL2i&)pqS=Nv%kSdg303d=H8766dyEgko#M-_sE+l zCFjjC*Od-K{r&cD>1}DN2 zHxz?HiUzQzy6S$_lw6;6)TG=mrc+~B4N|=Swv@PB2Kz2Hab`_8@54H&)}wpA%uv~!Ern2< zbWl8G-ncz;Txn8&MQ`4|*=wGd&*U@g6~Z}`pT`I9j4xi$75LFQ=KNde%sZZQ{ww)P z317S~l*(PY^d|QO=^hnmzfKZzpGQvRJC2@M9B;(ux|C{8yY_iD$HTEwv1z|8Vw}vX zz97|f01W$_Bl#&6xHl&PubF)+Mw^MvO;dsG?nR)7(Sl1V&##Ut3?{u-Z(yoFvx4lxdW6x1^Tmefjqlau%;G!6EcBwd-;Xa%@C3yA1gKn0i@jBfmDg9TjBQ2Z zknsvn+I_dz=<)zUtUVrtSw*nDT{s~NzQBQ)nxZ^M&W%!m1&~Mf-#q_c)=$rOBxV>! zkkNmfl&O2WSxYg&^t7tm6J2P=9eCP-{5o`s7B5781-}jxs=Gtc`<3dYb)xSBZ_j1T zv>eT^Cj|(UJAXRUVTS@QICc0RGy92i`%b3I;fM}&VE{oiwn*s#nuC@NjnfTJTve7lK#U+_KO^_C}_{ zi7R(d7YOrZ`?G3SHI;VlE=YJY`pv13mEkN@;8Ms5rJ645kNP!f`;K#oBq**4$*MZ z#o^K4lujJO)6#sr-Fagxinh=8lNqkBZp2_Dpo5wUxHm@|BS`6+s|tVQ3-_f0ywVS@ z5m2rH#~n4^ducFTznhe($a7^sUwK;7*D|gy2$4!aXSrY<^mNmgE`2YQIV1Ze6O5nh(7}(!$rviTNJ6gfw$@=@KI|ifrK6n_uo*+N3G@04Pn-4>~Q2}nlh4Pba zS(3GBkp;1C&G#mUF2}xdkk6dz6&GRUekOrKB+{%avo_!VtW%8nzYIpJ zAN=4*`VO5$4|o#oe0EV~u!MKaJD*8F>6Z1h$bh$AVUKqh|%r{|I9``HDXZWgt zh1#mxv^XmMRno2M1+r@)#j9W+2^wxfO>4vN_4#5L?%ZY817wl&E~?uM|Hk+9{_~?j zi1%=;qun;zM}fo27+d~)xBKAgrUrpT`qUkxNmCC$M+IP{TV_ES*U>ABq^Fdn+X9Qd zZIPfWQf$6`LxI~Gk(^&g&ux7QHckad{M*?0_E}AG#V(4MkUDU()c1sxLvt5f_4;+F z$PQ{}{L&@Ci`SrFp<0^+H7$yzco%GUMTwH=O$AKl0GZbb|F18KBpid=jCE#jB5+|g zA3eQnBwS24#xf#zr%&^^+oHra;^z`#rJD*cKA-|UuOfUXt)N5ll@0lP3E;Li`s+ec zNB%yt)z>c%OUr+Xpj;vgAltd9z)*}Z>9moakget5*!su~bWSgSlC|=&wNE|=!k~WT z`|RfjQ||gBYt*-pSYdC<^8*QEQb?@xCHT&C%FlozI-Pn(KG>h3{RAG<3<-oLt3UbS zx?#P0@O`kWDHDV^k4pV1TQN=y^1Y!~udHPC7Zv0a_VRS#^w%t+P~EqXRfK78YuF6J zsavkjwQdRik`ag6EvjL^GMtU{<~0ANP6fnCNdfEyBsu;bGww>mX%rg#IxLNKE zPbx6h({x5SHB-y8>X&NDkqf~mF2d{3@*F3L#a4EdA%8&Cnv@!b;$^+DLCerURWjYIVbGhyd z$=y0~Vcc6~$=Cz?hJRgURtT%QlUR9oM_^o->d zkAPWF%R}pir(cEREY%PX3^fOF)2EMbvORFf3SAj^md;zw?qx*zU2b;Tt|Z6L!1R-> zSKrbrVspK#NE>#i@`SPI{M(DAEFZ$sn)h8LiC-=*Y8hwSH0u=Wn5}&&DAgiyX6WD8 z#&@+gVXt*Rcs-=ZP;x=FL-bnSnZYKCW8|H@+sBjT7X~Ly@UDartaMjYE)__ORts@| zIqiJK%=I?FHKEb;WsqGuJ{UTaKA-S(ga_{o^3b0q=wJku2$$vn| z;jJ@;nOfvqS{CR#-t8g;nRV$Z4 zK6PnOwMmBx+~q`;-x@#1emUJs@oB>T>L3^2J?mc2_T6XsKhWw(aPVR;m%g9^-nl#> zTlq&OKumCTDaPd7nJ$Ub!8-8bD`RU~Bwk&+O#GXn2OzrO?kc9F&)Wa^fjO3+lM^ab zzlK*;HPULzBg8nw;TuK|7NbjA0pf5wax=DDvhW7)j6Iwu!j)C&U z!El0O>r+(V?8#0vL8XccuxxJ<#I;C*k)Q)NM6QQpa?ntuS3t5Z@}V@&>fwBS>Vdh1 zjk%|}L|+1@BptwGGMYs`O9dXDfn!n-J1jUW3j5DLkbHZaA|6G~M*fPA0H;<4P2{`@ z$#|Ej2~OnfI3)@z2uwQAr$E-DDFpE`GEK8B6}aDkCS(O8+h4)4CV>;TrMo0Ty7AL< zBnu$IV;yV~V^}l;`90iQiI&pm3?rOI{o2dZ`X)BK&|2SGld3IzWq#tQ|235XdAt^d zg$Ry6cPu!zal$8X8z1dfSS{-KiICj2c@lM2gN~ zZ(M&5zUW1G@mbqIsj>aQNC;_xtf}inagqed&kaPP9k8xvv+Cm2kC2V~i?8Aym1De) zHs+PpvnBus0_c1yKsez+;v1U}Cvj{q*x!#4j3CZa$`)mtU5dbk%A$DYwEz1zoDUO} zpK*4k<>|6e#M3D3pci%TV;p2R;0Pz9G?9}dpA?1mLSiyuOe7&t#byM-E|@S9Q>N1U z)@P1o6Z17x3OgEa{K$9HRm+w+Rb;_fv4GW7B<3PyeU=5Z**CZcLLg$$1nY-tSK>63 zD!(1zR;l^Q^NiplUgb{uo=@wTFw{yWg++sSI|4yro*)XY!D?X%BzX9OIh)8N!^pcI zrbQt)=lR$%B`j7Fc+^%5xfy;VAP)Uuki@IyOwNj7=?>wGBS|h^)g81lZ#chw!r2!Z z|75HCM5G4g5gZ$mCFicMpm+_G0X}J@ewR@){E9O9Z2pNqqhREZ(9eS58pM4H%P2{; zQ7cYKdgvWpqn?d+&4;Ju81|*gK5?VoaJ{h|SFrM7WV4iC z6(s@h{4w_w>YQp{UbdI07)i@NM*`jJhqLG#a|fcclAxTA^9lCzdn93gDj*ALv%%bq zVq?D(NfZO0y`96Fp&!F42S1_{os~!Q&L5y3lJs3lW}6*5KNMI6(e#L3WI2;m3osS} z5z_xM7o_})y<+ZCflg5v)&zAxA5je2E(D2FNB&C=WPhIuaJ0nqqjwCO!O8T#ARLSO zI!BOPCLLeG`cPORiB4YV%7A+mzBOmQ*3oxLN|_g0n(MM8dA(Ymy>Sii(`NkM9KVPn z34rFLOD5dH8h&!t`&y0WDyJmAnwy)fT2pO&_x<~(9Iwqw<>>;EUDT2wg-x0YJo^&i zO6l4FHE~t}K)$Ov1mNBFBw;~tKPYY$5jUVOohO!@z~QbMiL?Y4dU-xgdy^TZsIpwX0U!_8nI?A20t9k z5wB7DV0DOY^yEoLLL_RooAF}{PsXytg}XPSnGpQZv1)rCqt29p_!pRplvj?)tE)Oz|ZY8@U?or8IeRv3yh) zolG)QESPu7P4RR0ASNz0Y?bHb zl-{0KhJ!AoBvVdA)UI_SIct0#``9<@r2bs0(>y7b%yaan5yZshipiusDTUH3}BrDB4Q`ckI9>tyeCh1t6Qz(6Ns>yFRpiHZEv}Ogy z5~D^kC5SG{BVi=D?;b;8PBD7pR=r~3$qoZH4ufHVCfg`}qBYnj52FgBi@|S?W!b!X zc<-6SyAiXZyp`etqif^};degsKNhu{igL4Vk2n^^)T2A$6MXm|ok-r{sd-o@@y=17 z3@<9csc&PW%r>nwLV%c zPt*g-{F>y_&iB;=vPV+e?=0^xYU$7&RgN0_wY=_1yhs^_RpDP4l+SN+nfYLdZXx8{ z5@_{AQ@E$~z_0gF&nFCpm3{WdItN+RSPe`bw!4MBlCw>;F1)H!Vz&Nk@UjuAieI+t zr1q9X47k}eCwR?gSzTqKpI`2M`jTDZg%I;FJ6&Tla;Zs%Mf8>ad>hc$Xk{nylG8Ox zNGGw^B}ZVNIQ07mvIR5Duc4}&PyOgVeqYp9oAG3zHZ1Yy5;!S*2X~yu3MpR^Fg-7# zQMB!7jBLc}kLj7&qmQ2OxW+MX@R+aw>u~3qg?w-LkFgaBPvC=-vY+1*&VMf}duSHY z(^N~my1IXxRt17ce} z4+9~ab37E?+hUod8~a&^Z5$>3pdTY-;LO^aj$WE1pLYa9vm9`zKT)*0fPeM=!I;3@ zzvcq+Bped6H@Ghcr=bGtJa3V|z&L^~YP$=ZZ|C4YN=Qejz{y8qd=VLdnfj!XSKQ z`$hzv-XS|2g2Gk-E^SN55(G)07B8 zl^?o2$q+R;pG5^E5~zSf3PC-9a$)Wza=agG{IBs}v;i&y1m~ zf5R?%I81UKF^QFd_Aw8NEEfxT(vq@UVU%G+HLL>(?Vq=bo7EiC(Yh4gfv&H4 z^hTWiOXsSVD;fl=m!SlyOcM7Vo(X5Qu8$4Jba$mB#Rz}bb1fr8bz8KK)Ew!``u%h3 z;yCtva)Z~gAIkc-yO1vsByJ*w`7th=!fcQ0wIqO1$V($(x2)Ev6bmi36P_P`LGeqBcna6!OBA zi1_*VJJnF=s`zVs6Bc57*2i&-l<+t-GY)s@jv|GT0Ek2BZ1~Jj( z$pzs=Oz(zMryU<}pm(MiW0pjXo5!h-PmW>6*5M>!Mk*ka&_D$~l$n6$pGAY!5+toi zM+@+v&F4Co{7pB;Kfl0-7(hBlUcuGq4IWw9`QYrW7Ca*7-5gk{KM;4Y;V z_yQ(kZBgmtOw^zQws7z9J0+2Ce)+en+8+Bm8$}0~RsTpaM68-&_we9$*FCS8@s#42 z{wQcCl!;_Gs^N4o=;b5VX5yKSyU+I(-w3rt^20z=93PxIiNAy!TsI-j=HNXV6WAQrJDo$w+T~9s?dw0dx&mUQ_{}*5VZd+B!{Pk0U=4 z(I58RaofIg`4wlzCg-q5DN{|Dz4g09Ai@cM8J~)%d1Xo`cU$VqTJ&C?R7%r z;6!Y%;_~F$^aL#>*Scnk2M;45`k2(4ongZOuz8<=_jF_TMYtwkCJKJpv8 zwA((3B+HX_;h10UmqEqW#;BWp!r~8f-|PK|WKl-48$5$hULcNAAjo!|W_s)@xV7Hh ziKdTGvc!&pj^AW>R@ZE{r^wO%`0ZIkn8`Hz;+Vz&1)M{UAu-RvrKS0D`FKo+W9EIO znrtV}xl0IEBf1cU24B(VoeAI;SKjVVcnx~JY7sGIMPY`NPGdV<1b zsL=AQ>iJTF(fczMNjj`21t`LB40dqe96|o#XtkA!u7f{9Z&i@@$f+{uox9-Zetn(X zfcE`$-NBVmzR+JnleD_$ard`-{|R)R)<&+nA9p@a^W~bmi~=p=7~&%}gggi(*S&}| z5!s!y;NZIlA=q{atB(3>_}LKW<4AQ{nZf)XFThiUjwX5^_B2Sm;IaTVcHn;=i=ai;>5v@2uS6wql%qXJ*t^}wa&Ivy1CHSZnxcgMr9#9|o* z$_9od&S1yL(cpM_DL@5OzEA;6I6+T~VsYdnViyOe-0>lG|EE2ATI#odfY;C;UYDL7 zcg-I_`@k_zVx;S8zUld4#;yrFyxX*u&R`nkx^~N-0nL4)eJh!H?ej`E&o1A3F79*8 zV7}l^zVOwh>ISXLt70k{npK#St_^2+x+|u`QIiHK)2@ah3nX^0#GA$Z!9Dn-k^2E( zz6YJV+zG4q-Kl$u-|#2s7?NeuG2cxw!FU>H9t!yh!8@J&@a zB|Q?mcC5Rp^g@Jq1EMqJs@B6+&eLU%Fiz5mhO6hg_K60Yv(oRSE8vaeE}ICY+a<^} zCtX;g#vtn~74Y=bvT^L4E(rWM6mJZ(M!*y2SD(JcY0C!p|IYuYbZKb6{I-=V)Q+>L z{&h9#y~4vVDzyrIp^nE@|8w>z{5o7l4?FJ;^h3H|u;8IG{|3)rvgt{(0QI2u1RG@FxIi0tOSxE^3E7^{#Chm@33s$fq2Q+Rvs_s zW0eT5Xvao#r_d!op2{uZFXL;J)#d4gd5T!HLlZ8$D6`o3M0K_=liyg<#;?I-g9L5i z<*Y3QL}z0yI%+bxE<|#)pA@WVDt!OFa7UHFDEi0udIRC?w;!~7Li+uNRd%kDX5U;d zGnr^S=DF3rIqQttaTJ{Md82iol+{7JpbyWDqyk+^2{FeAr!flV3(|>891bf_`Hyiu zcsj_;8P)taj&@GJ>|6JOjEnMi*LAl7CTUr%O0%nVKQfAQV|%<8ExTiYt6j5^7uKdaC$GvoKr)MwbXZNac5cmUcuWfH_oQi#&e9>*O_}qG{XvCO3 zA!YHl(*oneV;ZwH;R@4j$Rnnm8?g0~HrTm^B0-lEmPcsQX^VNNfWCo5kY30;Dj=9` zGV+j=%n1pzH4m@7b2X3ynvL4(456RFHZ-Vek4f$h1 z4@CFQsUT*lMeW=}ZG$uazh=LrK@Wn{TQn6&Ex;;K+8v82DPVzyZz=Rh%r+8qwgp<1 zqAw7@<(ws2^c^AN8IWTVLOuXjBZt5Vo^VXHW7JI%Orl#_obtZ)%0#eZFf5>ZU*=;47o)B3~k|JmX;S4{<2n^Se(=0z!wj?u!=hSv>MfCg_199(1 z7i4=UY)3U3TzA`?HYpn5c9$0EbQoCCE_ecFt!r*?1`Wmn5Mb<;#1%kc-orLgm@|pW z6W~h0q;ZmrFs?#3j`A+sxO+{SSH8onL(bf52C;1|dj35cvj9EdH&8%g6!t(>6c=wi z215=Uol^xkrLOmZCZwpjP;o|z!@&hwkFzkfeM^aB50qa zuw>)9Da9%t5^WT+rH*OJC=QU1k2%Hi1QhmjA@)5Xg6*35F-vCLFuv#A? zBEa>u-H~!6+LVxufpT|9;$rz4AH2F%IAffho4b_d<*Zzm0sfjmo+tv=+)3e$wj!X2 z>?Hjm171RiElzUU;Ka6M{P~*HRnxCis_~%@)#y*08c@jsC`@Qf2@-3INDHq5wiQ7GzJT7C!8u`+x*i+iS4Z`1OT2Gpk)K7` zM!c4NoqkR8xBJok&q=m1YIlE8f{YSL(Co0owS#ebubB{hBcX5s&AHO}vy81ib<8rNIbHKn z%}oZIIb~WAj*WXEh==)DPw%?*`ysezly4Z4nn2~s>o!6$xI644gFsGDCYB!iW1L5ITR}au^i$$Oo&3&yw@`4m_mZsNN@&GjGggi03P84l zBNLN>{BR%HE*Kq#3z%1Gzbd@EaB1(}MwqxNb{hD zKEjt2kbAOT@GoGcr;!uO82flo+c1Je-95CⓈRJdr<^>9-m)y)!hH4#c_LH&m*Gx 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 T`>1>@`!|mMulURPcjA8m!AV0B literal 0 HcmV?d00001 From 4dc2de5644d85c7d81b8adb3d25b561fe6e3476e Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Sun, 24 Feb 2019 09:34:07 +0100 Subject: [PATCH 08/32] added loop at invoice creation waiting for ldn to sync --- home.admin/BBcreateInvoice.sh | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/home.admin/BBcreateInvoice.sh b/home.admin/BBcreateInvoice.sh index abbd5ab..fc9052b 100755 --- a/home.admin/BBcreateInvoice.sh +++ b/home.admin/BBcreateInvoice.sh @@ -17,16 +17,19 @@ echo "" echo "*** Precheck ***" # check if chain is in sync -chainInSync=$(lncli --chain=${network} --network=${chain}net getinfo | grep '"synced_to_chain": true' -c) -if [ ${chainInSync} -eq 0 ]; then - echo "!!!!!!!!!!!!!!!!!!!" - echo "FAIL - 'lncli getinfo' shows 'synced_to_chain': false" - echo "Wait until chain is sync with LND and try again." - echo "!!!!!!!!!!!!!!!!!!!" - echo "" - exit 1 - # TODO: Wait and loop. Offer the user a "abort wait" button -fi +cmdChainInSync="lncli --chain=${network} --network=${chain}net getinfo | grep '"synced_to_chain": true' -c" +chainInSync=$(cmdChainInSync) +while [ ${chainInSync} -eq 0 ]; do + dialog --title "Fail: not in sync" \ + --ok-label "Try now" \ + --cancel-label "Give up" \ + --pause "\n\n'lncli getinfo' shows 'synced_to_chain': false\n\nTry again in a few seconds." 15 60 5 + + if [ $? -gt 0 ]; then + exit 1 + fi + chainInSync=$(cmdChainInSync) +done # check number of connected peers echo "check for open channels" From 63a14f19a9d2f6a545e89436b6e1328a29877d6a Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Sun, 24 Feb 2019 11:21:25 +0100 Subject: [PATCH 09/32] Creating or paying invoices, wait for lnd to get ready Also put redundant code into XXchainInSync.sh --- home.admin/BBcreateInvoice.sh | 30 +++------------------------- home.admin/BBpayInvoice.sh | 32 +++++------------------------- home.admin/XXchainInSync.sh | 37 +++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 54 deletions(-) create mode 100755 home.admin/XXchainInSync.sh diff --git a/home.admin/BBcreateInvoice.sh b/home.admin/BBcreateInvoice.sh index fc9052b..e7e712d 100755 --- a/home.admin/BBcreateInvoice.sh +++ b/home.admin/BBcreateInvoice.sh @@ -13,33 +13,9 @@ if [ ${#chain} -eq 0 ]; then chain=$(${network}-cli getblockchaininfo | jq -r '.chain') fi -echo "" -echo "*** Precheck ***" - -# check if chain is in sync -cmdChainInSync="lncli --chain=${network} --network=${chain}net getinfo | grep '"synced_to_chain": true' -c" -chainInSync=$(cmdChainInSync) -while [ ${chainInSync} -eq 0 ]; do - dialog --title "Fail: not in sync" \ - --ok-label "Try now" \ - --cancel-label "Give up" \ - --pause "\n\n'lncli getinfo' shows 'synced_to_chain': false\n\nTry again in a few seconds." 15 60 5 - - if [ $? -gt 0 ]; then - exit 1 - fi - chainInSync=$(cmdChainInSync) -done - -# check number of connected peers -echo "check for open channels" -openChannels=$(sudo -u bitcoin /usr/local/bin/lncli --chain=${network} --network=${chain}net listchannels 2>/dev/null | grep chan_id -c) -if [ ${openChannels} -eq 0 ]; then - echo "" - echo "!!!!!!!!!!!!!!!!!!!" - echo "FAIL - You have NO ESTABLISHED CHANNELS .. open a channel first." - echo "!!!!!!!!!!!!!!!!!!!" - echo "" +# Check if ready (chain in sync and channels open) +./XXchainInSync.sh $network $chain +if [ $? != 0 ]; then exit 1 fi diff --git a/home.admin/BBpayInvoice.sh b/home.admin/BBpayInvoice.sh index 83b5c36..fc07598 100755 --- a/home.admin/BBpayInvoice.sh +++ b/home.admin/BBpayInvoice.sh @@ -12,32 +12,10 @@ if [ ${#chain} -eq 0 ]; then chain=$(${network}-cli getblockchaininfo | jq -r '.chain') fi -echo "" -echo "*** Precheck ***" -echo "please wait a moment ..." - -# check if chain is in sync -chainInSync=$(lncli --chain=${network} --network=${chain}net getinfo | grep '"synced_to_chain": true' -c) -if [ ${chainInSync} -eq 0 ]; then - echo "!!!!!!!!!!!!!!!!!!!" - echo "FAIL - 'lncli getinfo' shows 'synced_to_chain': false" - echo "Wait until chain is sync with LND and try again." - echo "!!!!!!!!!!!!!!!!!!!" - echo "" - exit 1 -fi - - -# check number of connected peers -echo "check for open channels" -openChannels=$(sudo -u bitcoin /usr/local/bin/lncli --chain=${network} --network=${chain}net listchannels 2>/dev/null | grep chan_id -c) -if [ ${openChannels} -eq 0 ]; then - echo "" - echo "!!!!!!!!!!!!!!!!!!!" - echo "FAIL - You have NO ESTABLISHED CHANNELS .. open a channel first." - echo "!!!!!!!!!!!!!!!!!!!" - echo "" - exit 1 +# Check if ready (chain in sync and channels open) +./XXchainInSync.sh $network $chain +if [ $? != 0 ]; then + exit 1 fi paymentRequestStart="???" @@ -118,4 +96,4 @@ else echo "******************************" echo "It worked :) - check out the service you were paying." fi -echo "" \ No newline at end of file +echo "" diff --git a/home.admin/XXchainInSync.sh b/home.admin/XXchainInSync.sh new file mode 100755 index 0000000..00df330 --- /dev/null +++ b/home.admin/XXchainInSync.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# Check if lnd is synced to chain and channels are open +# If it isn't, wait until it is +# exits with 1 if it isn't. + +network=$1 +chain=$2 + +# check if chain is in sync +cmdChainInSync="lncli --chain=${network} --network=${chain}net getinfo | grep '"synced_to_chain": true' -c" +chainInSync=${cmdChainInSync} +while [ $chainInSync -eq 0 ]; do + dialog --title "Fail: not in sync" \ + --ok-label "Try now" \ + --cancel-label "Give up" \ + --pause "\n\n'lncli getinfo' shows 'synced_to_chain': false\n\nTry again in a few seconds." 15 60 5 + + if [ $? -gt 0 ]; then + exit 1 + fi + chainInSync=${cmdChainInSync} +done + +# check number of connected peers +echo "check for open channels" +openChannels=$(sudo -u bitcoin /usr/local/bin/lncli --chain=${network} --network=${chain}net listchannels 2>/dev/null | grep chan_id -c) +if [ ${openChannels} -eq 0 ]; then + echo "" + echo "!!!!!!!!!!!!!!!!!!!" + echo "FAIL - You have NO ESTABLISHED CHANNELS .. open a channel first." + echo "!!!!!!!!!!!!!!!!!!!" + echo "" + exit 1 +fi + +exit 0 From 2705685e9828dd58827ec8f5104edc585332408e Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 24 Feb 2019 17:20:35 +0100 Subject: [PATCH 10/32] extra sync on shutdown #348 --- home.admin/00mainMenu.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/home.admin/00mainMenu.sh b/home.admin/00mainMenu.sh index 5f40455..ddf9bce 100755 --- a/home.admin/00mainMenu.sh +++ b/home.admin/00mainMenu.sh @@ -462,7 +462,9 @@ case $CHOICE in sleep 10 echo "stop ${network}d (2) - please wait .." sudo systemctl stop ${network}d - echo "starting shutdown" + sleep 3 + sync + echo "starting shutdown ..." sudo shutdown now exit 0 ;; From a514b7e9a6c08fee742191a8035351bcaf66ea5f Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 24 Feb 2019 18:58:58 +0100 Subject: [PATCH 11/32] smal correction --- FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index c5b4e94..79e54e0 100644 --- a/FAQ.md +++ b/FAQ.md @@ -61,7 +61,7 @@ The torrent and FTP download use a prepared blockchain to kick start the RaspiBl 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). -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`). +One requirement is that the blockchain is from another bitcoin-core client with version greater or equal to 0.17.0.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 through your local network. This should work from Windows, Mac, Linux and even from another already synced RaspiBlitz. From c7eaf0af6372593186da97a865ccd8723fb68052 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 24 Feb 2019 20:20:41 +0100 Subject: [PATCH 12/32] make custom LND port upgrade safe --- home.admin/_bootstrap.provision.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/home.admin/_bootstrap.provision.sh b/home.admin/_bootstrap.provision.sh index 7eb2c1e..3015c8c 100644 --- a/home.admin/_bootstrap.provision.sh +++ b/home.admin/_bootstrap.provision.sh @@ -156,6 +156,14 @@ else echo "Provisioning TOR - keep default" >> ${logFile} fi +# CUSTOM LND PORT +# if a custom LND port was set, then run config for that +portNumber=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep "^listen=" | cut -f2 -d':') +if [ ${#portNumber} -gt 0 ]; then + echo "Provisioning Custom LND Port ${portNumber}- run config script" >> ${logFile} + sudo /home/admin/config.scripts/lnd.setportsh ${portNumber} >> ${logFile} 2>&1 +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 c6d3030d7e862bb561501acd3cac09d35469e01d Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Sun, 24 Feb 2019 20:21:03 +0100 Subject: [PATCH 13/32] remove debug message --- home.admin/40addHDD.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/40addHDD.sh b/home.admin/40addHDD.sh index 41c418b..56ca324 100755 --- a/home.admin/40addHDD.sh +++ b/home.admin/40addHDD.sh @@ -48,7 +48,7 @@ if [ ${existsHDD} -gt 0 ]; then # init the RASPIBLITZ Config configFile="/mnt/hdd/raspiblitz.conf" - configExists=$(sudo ls ${configFile} | grep -c 'raspiblitz.conf') + configExists=$(sudo ls ${configFile} 2>/dev/null | grep -c 'raspiblitz.conf') if [ ${configExists} -eq 0 ]; then # create file and use init values from raspiblitz.info From 06c489ae5379b39985ae4ea83c65e512ae3cfd5d Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 00:31:02 +0100 Subject: [PATCH 14/32] first test data storage script #329 --- home.admin/config.scripts/blitz.datadrive.sh | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 home.admin/config.scripts/blitz.datadrive.sh diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh new file mode 100644 index 0000000..9125cd1 --- /dev/null +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# command info +if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then + echo "managing additional data storage" + echo "blitz.datadrive.sh [on|off]" + echo "exits on 0 = needs reboot" + exit 1 +fi + +# check if sudo +if [ "$EUID" -ne 0 ] + then echo "Please run as root (with sudo)" + exit +fi + +# update install sources +echo "make sure BTRFS is installed" +sudo apt-get install -y btrfs-tools + + +# detect the two usb drives +lsblk -o NAME | grep "^sd" | grep -v "sda" | while read -r line ; do + echo "Processing: $line" +done + +exit 0 + + +lsblk -o UUID,NAME,FSTYPE,SIZE,LABEL,MODEL | greap "^sd" +# TODO: find the drives + + +# TODO: DETECT if they is already data +lsblk -o UUID,NAME,FSTYPE,SIZE,LABEL,MODEL + +# check if there is already data on there + +# create +sudo mkfs.btrfs -L DATASTORE -f /dev/sdb +sudo mkdir -p /mnt/data +sudo mount /dev/sdb1 /mnt/data +sudo btrfs filesystem show /mnt/data +sudo btrfs device add -f /dev/sdc /mnt/data +sudo btrfs filesystem df /mnt/data +sudo btrfs filesystem balance start -dconvert=raid1 -mconvert=raid1 /mnt/data \ No newline at end of file From 3ac9324913a0903fc45493fbb97a535fc86364e5 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 02:10:42 +0100 Subject: [PATCH 15/32] find tweo devices of same size --- home.admin/config.scripts/blitz.datadrive.sh | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index 9125cd1..e4472b8 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -20,9 +20,24 @@ sudo apt-get install -y btrfs-tools # detect the two usb drives -lsblk -o NAME | grep "^sd" | grep -v "sda" | while read -r line ; do - echo "Processing: $line" +echo "Detecting two USB sticks with same size ..." +dev1="" +dev2="" +lsblk -o NAME | grep "^sd" | grep -v "sda" | while read -r test1 ; do + size1=$(lsblk -o NAME,SIZE -b | grep "^${test1}") + echo "Checking : ${test1} -> ${size1}" + lsblk -o NAME | grep "^sd" | grep -v "sda" | while read -r test2 ; do + size2=$(lsblk -o NAME,SIZE -b | grep "^${test2}") + echo " compare with ${test2} -> ${size2}" + if [ "${size1}" = "${size2}" ]; then + echo " MATCH ${test1} = ${test2}" + # remember last match + dev1="${test1}" + dev2="${test2}" + fi + done done +echo "RESULT: ${dev1} & ${dev2}" exit 0 From 6a72e4822868dea19aa149c761084e2f70217ed4 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 02:15:42 +0100 Subject: [PATCH 16/32] fix same size detection --- home.admin/config.scripts/blitz.datadrive.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index e4472b8..5ec3074 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -20,15 +20,15 @@ sudo apt-get install -y btrfs-tools # detect the two usb drives -echo "Detecting two USB sticks with same size ..." +echo "Detecting two USB sticks/drives with same size ..." dev1="" dev2="" -lsblk -o NAME | grep "^sd" | grep -v "sda" | while read -r test1 ; do +lsblk -o NAME | grep "^sd" | while read -r test1 ; do size1=$(lsblk -o NAME,SIZE -b | grep "^${test1}") - echo "Checking : ${test1} -> ${size1}" - lsblk -o NAME | grep "^sd" | grep -v "sda" | while read -r test2 ; do + echo "Checking : ${test1} size(${size1})" + lsblk -o NAME | grep "^sd" | grep -v "${test1}" | while read -r test2 ; do size2=$(lsblk -o NAME,SIZE -b | grep "^${test2}") - echo " compare with ${test2} -> ${size2}" + echo " compare ${test2} size(${size2})" if [ "${size1}" = "${size2}" ]; then echo " MATCH ${test1} = ${test2}" # remember last match From fccfbf7649c6c07bc8e5cd6a6d7fa61a5e10d98b Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 02:17:27 +0100 Subject: [PATCH 17/32] fix size detection --- home.admin/config.scripts/blitz.datadrive.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index 5ec3074..b563974 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -24,10 +24,10 @@ echo "Detecting two USB sticks/drives with same size ..." dev1="" dev2="" lsblk -o NAME | grep "^sd" | while read -r test1 ; do - size1=$(lsblk -o NAME,SIZE -b | grep "^${test1}") + size1=$(lsblk -o NAME,SIZE -b | grep "^${test1}" | awk '$1=$1' | cut -d " " -f 2) echo "Checking : ${test1} size(${size1})" lsblk -o NAME | grep "^sd" | grep -v "${test1}" | while read -r test2 ; do - size2=$(lsblk -o NAME,SIZE -b | grep "^${test2}") + size2=$(lsblk -o NAME,SIZE -b | grep "^${test2}" | awk '$1=$1' | cut -d " " -f 2) echo " compare ${test2} size(${size2})" if [ "${size1}" = "${size2}" ]; then echo " MATCH ${test1} = ${test2}" From c53906350e4037b97905745a1c534ecee3d4a3d0 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 02:24:25 +0100 Subject: [PATCH 18/32] fix size detection --- home.admin/config.scripts/blitz.datadrive.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index b563974..33d2fce 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -28,16 +28,18 @@ lsblk -o NAME | grep "^sd" | while read -r test1 ; do echo "Checking : ${test1} size(${size1})" lsblk -o NAME | grep "^sd" | grep -v "${test1}" | while read -r test2 ; do size2=$(lsblk -o NAME,SIZE -b | grep "^${test2}" | awk '$1=$1' | cut -d " " -f 2) - echo " compare ${test2} size(${size2})" if [ "${size1}" = "${size2}" ]; then - echo " MATCH ${test1} = ${test2}" - # remember last match - dev1="${test1}" - dev2="${test2}" + echo " MATCHING ${test2} size(${size2})" + dev1=$(echo "${test1}") + dev2=$(echo "${test2}") + else + echo " different ${test2} size(${size2})" fi done done -echo "RESULT: ${dev1} & ${dev2}" +echo "RESULTS:" +echo "dev1(${dev1})" +echo "dev2(${dev2})" exit 0 From 37235c974395085eb54782e812dc22a30d9fdf81 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 02:29:57 +0100 Subject: [PATCH 19/32] fix while loop scope --- home.admin/config.scripts/blitz.datadrive.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index 33d2fce..20b569c 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -18,11 +18,8 @@ fi echo "make sure BTRFS is installed" sudo apt-get install -y btrfs-tools - # detect the two usb drives echo "Detecting two USB sticks/drives with same size ..." -dev1="" -dev2="" lsblk -o NAME | grep "^sd" | while read -r test1 ; do size1=$(lsblk -o NAME,SIZE -b | grep "^${test1}" | awk '$1=$1' | cut -d " " -f 2) echo "Checking : ${test1} size(${size1})" @@ -30,13 +27,17 @@ lsblk -o NAME | grep "^sd" | while read -r test1 ; do size2=$(lsblk -o NAME,SIZE -b | grep "^${test2}" | awk '$1=$1' | cut -d " " -f 2) if [ "${size1}" = "${size2}" ]; then echo " MATCHING ${test2} size(${size2})" - dev1=$(echo "${test1}") - dev2=$(echo "${test2}") + echo "${test1}" > .dev1.tmp + echo "${test2}" > .dev2.tmp else echo " different ${test2} size(${size2})" fi done done +dev1=$(cat .dev1.tmp) +dev2=$(cat .dev2.tmp) +rm -f .dev1.tmp +rm -f .dev2.tmp echo "RESULTS:" echo "dev1(${dev1})" echo "dev2(${dev2})" From 6a85b23b7c32e3797fa2b8dd15210a61c03df620 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 04:46:32 +0100 Subject: [PATCH 20/32] checking for old data --- home.admin/config.scripts/blitz.datadrive.sh | 32 ++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index 20b569c..9f05b46 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -11,12 +11,13 @@ fi # check if sudo if [ "$EUID" -ne 0 ] then echo "Please run as root (with sudo)" - exit + exit 1 fi # update install sources -echo "make sure BTRFS is installed" +echo "make sure BTRFS is installed ..." sudo apt-get install -y btrfs-tools +echo "" # detect the two usb drives echo "Detecting two USB sticks/drives with same size ..." @@ -41,6 +42,33 @@ rm -f .dev2.tmp echo "RESULTS:" echo "dev1(${dev1})" echo "dev2(${dev2})" +echo "" + +# check that results are available +if [ ${#dev1} -eq 0 ] || [ ${#dev2} -eq 0 ]; then + echo "!! FAIL -> was not able to detect two devices with the same size" + exit 1 +fi + +# check size (at least 4GB minus some tolerance) +size=$(lsblk -o NAME,SIZE -b | grep "^${dev1}" | awk '$1=$1' | cut -d " " -f 2) +if [ ${size} -lt 3500000000 ]; then + echo "!! FAIL -> too small - additional storage needs to be bigger than 4GB" + exit 1 +fi + +# check if devices are containing old data +echo "Analysing Drives ..." +nameDev1=$(lsblk -o NAME,LABEL | grep "^${dev1}" | awk '$1=$1' | cut -d " " -f 2) +nameDev2=$(lsblk -o NAME,LABEL | grep "^${dev2}" | awk '$1=$1' | cut -d " " -f 2) +if [ "${nameDev1}" = "DATASTORE" ] || [ "${nameDev2}" = "DATASTORE" ]; then + # TODO: once implemented -> also make sure that dev1 is named "DATASTORE" and if 2nd is other -> format and add as raid + echo "!! NOT IMPLEMENTED YET -> devices seem contain old data, because name is 'DATASTORE'" + echo "if you dont care about that data: format devices devices on other computer with FAT(32) named TEST" + exit 1 +fi +echo "OK drives dont contain old data." +echo "" exit 0 From 6d3633eb7cccfccaa237a495dbd4d9800da79a98 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 05:33:52 +0100 Subject: [PATCH 21/32] formatting BTRFS --- home.admin/config.scripts/blitz.datadrive.sh | 143 ++++++++++++------- 1 file changed, 94 insertions(+), 49 deletions(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index 9f05b46..7f12817 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -19,9 +19,34 @@ echo "make sure BTRFS is installed ..." sudo apt-get install -y btrfs-tools echo "" -# detect the two usb drives -echo "Detecting two USB sticks/drives with same size ..." -lsblk -o NAME | grep "^sd" | while read -r test1 ; do +# check on/off state +dataStorageNotAvailableYet=$(sudo btrfs filesystem df /mnt/data 2>&1 | grep -c "ERROR: not a btrfs filesystem") +if [ "$1" = "1" ] || [ "$1" = "on" ]; then + echo "Trying to switch additional data storage on ..." + if [ ${dataStorageNotAvailableYet} -eq 0 ]; then + echo "FAIL -> data storage is already on" + exit 1 + fi +elif [ "$1" = "0" ] || [ "$1" = "off" ]; then + echo "Trying to switch additional data storage off ..." + if [ ${dataStorageNotAvailableYet} -eq 1 ]; then + echo "FAIL -> data storage is already off" + exit 1 + fi +else + echo "FAIL -> Parameter '${$1}' not known." + exit 1 +fi + +################### +# SWITCH ON +################### + +if [ "$1" = "1" ] || [ "$1" = "on" ]; then + + # detect the two usb drives + echo "Detecting two USB sticks/drives with same size ..." + lsblk -o NAME | grep "^sd" | while read -r test1 ; do size1=$(lsblk -o NAME,SIZE -b | grep "^${test1}" | awk '$1=$1' | cut -d " " -f 2) echo "Checking : ${test1} size(${size1})" lsblk -o NAME | grep "^sd" | grep -v "${test1}" | while read -r test2 ; do @@ -34,59 +59,79 @@ lsblk -o NAME | grep "^sd" | while read -r test1 ; do echo " different ${test2} size(${size2})" fi done -done -dev1=$(cat .dev1.tmp) -dev2=$(cat .dev2.tmp) -rm -f .dev1.tmp -rm -f .dev2.tmp -echo "RESULTS:" -echo "dev1(${dev1})" -echo "dev2(${dev2})" -echo "" + done + dev1=$(cat .dev1.tmp) + dev2=$(cat .dev2.tmp) + rm -f .dev1.tmp + rm -f .dev2.tmp + echo "RESULTS:" + echo "dev1(${dev1})" + echo "dev2(${dev2})" + echo "" -# check that results are available -if [ ${#dev1} -eq 0 ] || [ ${#dev2} -eq 0 ]; then - echo "!! FAIL -> was not able to detect two devices with the same size" - exit 1 -fi + # check that results are available + if [ ${#dev1} -eq 0 ] || [ ${#dev2} -eq 0 ]; then + echo "!! FAIL -> was not able to detect two devices with the same size" + exit 1 + fi -# check size (at least 4GB minus some tolerance) -size=$(lsblk -o NAME,SIZE -b | grep "^${dev1}" | awk '$1=$1' | cut -d " " -f 2) -if [ ${size} -lt 3500000000 ]; then - echo "!! FAIL -> too small - additional storage needs to be bigger than 4GB" - exit 1 -fi + # check size (at least 4GB minus some tolerance) + size=$(lsblk -o NAME,SIZE -b | grep "^${dev1}" | awk '$1=$1' | cut -d " " -f 2) + if [ ${size} -lt 3500000000 ]; then + echo "!! FAIL -> too small - additional storage needs to be bigger than 4GB" + exit 1 + fi -# check if devices are containing old data -echo "Analysing Drives ..." -nameDev1=$(lsblk -o NAME,LABEL | grep "^${dev1}" | awk '$1=$1' | cut -d " " -f 2) -nameDev2=$(lsblk -o NAME,LABEL | grep "^${dev2}" | awk '$1=$1' | cut -d " " -f 2) -if [ "${nameDev1}" = "DATASTORE" ] || [ "${nameDev2}" = "DATASTORE" ]; then - # TODO: once implemented -> also make sure that dev1 is named "DATASTORE" and if 2nd is other -> format and add as raid - echo "!! NOT IMPLEMENTED YET -> devices seem contain old data, because name is 'DATASTORE'" - echo "if you dont care about that data: format devices devices on other computer with FAT(32) named TEST" - exit 1 -fi -echo "OK drives dont contain old data." -echo "" + # check if devices are containing old data + echo "Analysing Drives ..." + nameDev1=$(lsblk -o NAME,LABEL | grep "^${dev1}" | awk '$1=$1' | cut -d " " -f 2) + nameDev2=$(lsblk -o NAME,LABEL | grep "^${dev2}" | awk '$1=$1' | cut -d " " -f 2) + if [ "${nameDev1}" = "DATASTORE" ] || [ "${nameDev2}" = "DATASTORE" ]; then + # TODO: once implemented -> also make sure that dev1 is named "DATASTORE" and if 2nd is other -> format and add as raid + echo "!! NOT IMPLEMENTED YET -> devices seem contain old data, because name is 'DATASTORE'" + echo "if you dont care about that data: format devices devices on other computer with FAT(32) named TEST" + exit 1 + fi + echo "OK drives dont contain old data." + echo "" -exit 0 + # format first drive + echo "Formatting /dev/${dev1} with BTRFS ..." + sudo mkfs.btrfs -L DATASTORE -f /dev/${dev1} + echo "OK" + echo "" + # mount the BTRFS drive + echo "Mounting under /mnt/data ..." + sudo mkdir -p /mnt/data + sudo mount /dev/sdb1 /mnt/data + echo "OK" + echo "" -lsblk -o UUID,NAME,FSTYPE,SIZE,LABEL,MODEL | greap "^sd" -# TODO: find the drives + # adding the second device + echo "Adding the second device as RAID1 .." + sudo btrfs device add -f /dev/sdc /mnt/data + sudo btrfs filesystem balance start -dconvert=raid1 -mconvert=raid1 /mnt/data + echo "" + exit 0 + #uuid=$(lsblk -o NAME,UUID | grep "^${dev1}" | awk '$1=$1' | cut -d " " -f 2) + +fi -# TODO: DETECT if they is already data -lsblk -o UUID,NAME,FSTYPE,SIZE,LABEL,MODEL +################### +# SWITCH OFF +################### -# check if there is already data on there +if [ "$1" = "0" ] || [ "$1" = "off" ]; then -# create -sudo mkfs.btrfs -L DATASTORE -f /dev/sdb -sudo mkdir -p /mnt/data -sudo mount /dev/sdb1 /mnt/data -sudo btrfs filesystem show /mnt/data -sudo btrfs device add -f /dev/sdc /mnt/data -sudo btrfs filesystem df /mnt/data -sudo btrfs filesystem balance start -dconvert=raid1 -mconvert=raid1 /mnt/data \ No newline at end of file + echo "TODO -> Turn off" + + sudo btrfs filesystem show /mnt/data + sudo btrfs filesystem df /mnt/data + + sudo umount /mnt/data + + exit 0 + +fi From 0f1a0b0fa8efdb240114b6b79fc7241522e225da Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Mon, 25 Feb 2019 05:40:13 +0100 Subject: [PATCH 22/32] establishing RAID1 --- home.admin/config.scripts/blitz.datadrive.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index 7f12817..07d911e 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -104,13 +104,13 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then # mount the BTRFS drive echo "Mounting under /mnt/data ..." sudo mkdir -p /mnt/data - sudo mount /dev/sdb1 /mnt/data + sudo mount /dev/${dev1} /mnt/data echo "OK" echo "" # adding the second device echo "Adding the second device as RAID1 .." - sudo btrfs device add -f /dev/sdc /mnt/data + sudo btrfs device add -f /dev/${dev2} /mnt/data sudo btrfs filesystem balance start -dconvert=raid1 -mconvert=raid1 /mnt/data echo "" exit 0 @@ -129,7 +129,7 @@ if [ "$1" = "0" ] || [ "$1" = "off" ]; then sudo btrfs filesystem show /mnt/data sudo btrfs filesystem df /mnt/data - + sudo umount /mnt/data exit 0 From f88bd5adafd8f36545509a59c7e27a160629cf15 Mon Sep 17 00:00:00 2001 From: ZeusLN <47701173+ZeusLN@users.noreply.github.com> Date: Wed, 27 Feb 2019 22:24:03 -0500 Subject: [PATCH 23/32] transmission typo --- home.admin/90finishSetup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/90finishSetup.sh b/home.admin/90finishSetup.sh index 0843578..94a1951 100755 --- a/home.admin/90finishSetup.sh +++ b/home.admin/90finishSetup.sh @@ -63,7 +63,7 @@ echo "allow: lightning gRPC" sudo ufw allow 10009 comment 'lightning gRPC' echo "allow: lightning REST API" sudo ufw allow 8080 comment 'lightning REST API' -echo "allow: trasmission" +echo "allow: transmission" sudo ufw allow 51413 comment 'transmission' echo "allow: local web admin" sudo ufw allow from 192.168.0.0/16 to any port 80 comment 'allow local LAN web' @@ -81,4 +81,4 @@ sudo apt-get update echo "OK - System is now up to date" # mark setup is done -sudo sed -i "s/^setupStep=.*/setupStep=100/g" /home/admin/raspiblitz.info \ No newline at end of file +sudo sed -i "s/^setupStep=.*/setupStep=100/g" /home/admin/raspiblitz.info From 5cba95bcfec4bd48e36814c5c0cb80603a2ed843 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Thu, 28 Feb 2019 14:56:53 +0100 Subject: [PATCH 25/32] detecting UUID --- home.admin/config.scripts/blitz.datadrive.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/home.admin/config.scripts/blitz.datadrive.sh b/home.admin/config.scripts/blitz.datadrive.sh index 07d911e..a235f6b 100644 --- a/home.admin/config.scripts/blitz.datadrive.sh +++ b/home.admin/config.scripts/blitz.datadrive.sh @@ -115,7 +115,8 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then echo "" exit 0 - #uuid=$(lsblk -o NAME,UUID | grep "^${dev1}" | awk '$1=$1' | cut -d " " -f 2) + # adding the second device + uuid=$(sudo btrfs filesystem show /mnt/data | grep "uuid:" | awk '$1=$1' | cut -d " " -f 4) fi From cee6efccabcda889135823da402dd59561bdbbca Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 3 Mar 2019 17:06:52 -0500 Subject: [PATCH 26/32] Add support for connecting to Zeus mobile wallet --- FAQ.md | 46 +++++++-------- README.md | 37 ++++++------ home.admin/97addMobileWallet.sh | 13 +++-- home.admin/97addMobileWalletZap.sh | 16 +++--- home.admin/97addMobileWalletZeus.sh | 87 +++++++++++++++++++++++++++++ 5 files changed, 146 insertions(+), 53 deletions(-) create mode 100644 home.admin/97addMobileWalletZeus.sh diff --git a/FAQ.md b/FAQ.md index c5b4e94..b7455f6 100644 --- a/FAQ.md +++ b/FAQ.md @@ -39,7 +39,7 @@ If you run a version earlier then 0.98 you basically need to setup a new RaspiBl ## Why do I need to re-burn my SD card for an update? -I know it would be nicer to run just an update script and you are ready to go. But then the scripts would need to be written in a much more complex way to be able to work with any versions of LND and Bitcoind (they are already complex enough with all the edge cases) and testing would become even more time consuming than it is now already. That's nothing a single developer can deliver. +I know it would be nicer to run just an update script and you are ready to go. But then the scripts would need to be written in a much more complex way to be able to work with any versions of LND and Bitcoind (they are already complex enough with all the edge cases) and testing would become even more time consuming than it is now already. That's nothing a single developer can deliver. For some, it might be a pain point to make an update by re-burning a new sd card - especially if you added your own scripts or made changes to the system - but thats by design. It's a way to enforce a "clean state" with every update - the same state that I tested and developed the scripts with. The reason for that pain: I simply cannot write and support scripts that run on every modified system forever - that's simply too much work. @@ -61,13 +61,13 @@ The torrent and FTP download use a prepared blockchain to kick start the RaspiBl 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). -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`). +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 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 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 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. +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 transfer. Check further FAQ answeres if you get stuck or see a final sync with a value below 90%. @@ -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 -> `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: +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 @@ -129,13 +129,13 @@ And if you want to put a LND backup state back. Make a fresh RaspiBlitz (new sd `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. +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? -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. +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 @@ -226,7 +226,7 @@ Linux/Ubuntu (desktop): https://askubuntu.com/questions/86724/how-do-i-open-the- Linux/Raspbian (command line): https://www.addictivetips.com/ubuntu-linux-tips/manually-partition-a-hard-drive-command-line-linux/ -## How do I shrink the QR code for connecting my Shango/Zap mobile phone? +## How do I shrink the QR code for connecting my Shango/Zap/Zeus mobile phone? Make the fonts smaller until the QR code fits into your (fullscreen) terminal. In OSX use `CMD` + `-` key. In LINUX use `CTRL`+ `-` key. On WINDOWS Putty go into the settings and change the font size: https://globedrill.com/change-font-size-putty @@ -240,11 +240,11 @@ The node address is red, when the RaspiBlitz detects that it cannot reach the po ## Why is my node address on the display yellow (not green)? -Yellow is OK. The RaspiBlitz can detect, that it can reach a service on the port 9735 of your public IP - this is in most cases the LND of your RaspiBlitz. But the RaspiBlitz cannot 100% for sure detect that this is its own LND service on that port - thats why its just yellow, not green. +Yellow is OK. The RaspiBlitz can detect, that it can reach a service on the port 9735 of your public IP - this is in most cases the LND of your RaspiBlitz. But the RaspiBlitz cannot 100% for sure detect that this is its own LND service on that port - thats why its just yellow, not green. ## Can I run the RaspiBlitz as Backend for BTCPayServer? -BTCPay Server is a solution to be your own payment processor to accept Lightning Payments for your online store: https://github.com/btcpayserver/btcpayserver +BTCPay Server is a solution to be your own payment processor to accept Lightning Payments for your online store: https://github.com/btcpayserver/btcpayserver You can find setup instructions for a experimental setup here: https://goo.gl/KnTzLu @@ -256,12 +256,12 @@ You dont need a LAN port on your laptop as long as you can connect over WLAN to ## Is it possible to connect the Blitz over Wifi instead of using a LAN cable? -A LAN cable is recommended because it reduces a possible source of error on the network connection side. But how to setup WLAN when you dont have a LAN-Router/Switch available see here: +A LAN cable is recommended because it reduces a possible source of error on the network connection side. But how to setup WLAN when you dont have a LAN-Router/Switch available see here: https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#prepare-wifi -## Can I directly connect the RaspiBlitz with my laptop? +## Can I directly connect the RaspiBlitz with my laptop? -If you have a LAN port on your laptop - or you have a USB-LAN adapter, you can connect the RaspiBlitz directly (without a router/switch) to your laptop and share the WIFI internet connection. You can follow this [guide for OSX](https://medium.com/@tzhenghao/how-to-ssh-into-your-raspberry-pi-with-a-mac-and-ethernet-cable-636a197d055). +If you have a LAN port on your laptop - or you have a USB-LAN adapter, you can connect the RaspiBlitz directly (without a router/switch) to your laptop and share the WIFI internet connection. You can follow this [guide for OSX](https://medium.com/@tzhenghao/how-to-ssh-into-your-raspberry-pi-with-a-mac-and-ethernet-cable-636a197d055). In short for OSX: @@ -271,7 +271,7 @@ In short for OSX: * Settings > Network > Ethernet-Adapter > set to DHCP * in terminal > `ifconfig` there you should the the IP of the bridge100 * in terminal > `arp -a` and check for an IP of a client to the bridge -* in terminal > ssh admin@[clientIP] +* in terminal > ssh admin@[clientIP] If anyone has expirence on doing this in Linux/Win, please share. @@ -283,7 +283,7 @@ But if cannot login with SSH and you need to power off at least remove the LAN c ## How can I build an SD card other then the master branch? -There might be a new not released features in development that are not yet in the master branch - but you want to try them out. +There might be a new not released features in development that are not yet in the master branch - but you want to try them out. To build a sd card image from another branch than master you follow the [Build the SD Card Image](README.md#build-the-sd-card-image) from the README, but execute the build script from the other branch and add the name of that branch as a parameter to the build script. @@ -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. 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. +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? @@ -334,10 +334,10 @@ The RaspiBlitz is powered by the RaspberryPi. The processing power of this Singl Using pre-built software almost always shifts trust to the one who made the binary. But at least you can check with the SHA checksum after download if the image downloaded is really the one offered by the GitHub Repo. To do so make a quick check if your browser is really in the correct GiutHub page and that your HTTPS of the GitHub page is signed by 'DigiCert'. Then compare the SHA-256 string (always next to the download link of the image on the README) with the result of the command `shasum -a 256 [DOWNLOADED-FILE-TO-CHECK]` (Mac/Linux). Still this is not optimal and if at least some people from the community request it, I will consider signing the download as an author for the future. The best way would be to build the sd card yourself. You use the script `build_sdcard.sh` for it. Take some minutes to check if you see anything suspicious in that build script and then follow the [README](README.md#build-the-sd-card-image) on this. - + ## Is downloading the blockchain from a third party secure? -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'. +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 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. @@ -371,7 +371,7 @@ To create the Update Torrent file, follow the following step ... Have a almost 100% synced bitcoind MAINNET with txindex=1 on a RaspiBlitz (remove all funds from this node - because blockchain get messed with) -Stop bitcoind with: +Stop bitcoind with: ``` sudo systemctl stop bitcoind ``` @@ -474,7 +474,7 @@ 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 -* Connect and open in Filemenager NTFS - context on white scace -> open terminal +* 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) @@ -484,8 +484,8 @@ Work Nodes for the process of producing a new sd card image release: * 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 +* Upload new image to Download Server +* Copy SHA256-String into GutHub README and update downloadlink ## Can I run RaspiBlitz on other computers than RaspberryPi? @@ -498,11 +498,11 @@ look for the line `dtoverlay=tft35a:rotate=270` towards the end. To flip the scr ## 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. +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. 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. +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? diff --git a/README.md b/README.md index f1fa8ac..7023702 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ There are additional services that can be switched on: ![MainMenu-Services](pictures/mainmenu-services.png) -As an parallel alternative to the SSH menu there is also the RTL WebUI available (LND API Coverage at 57%): +As an parallel alternative to the SSH menu there is also the RTL WebUI available (LND API Coverage at 57%): ![RTL-preview](pictures/RTL-dashboard.png) @@ -29,7 +29,7 @@ See more details in the [Feature Documentation](#feature-documentation) & of cou The RaspiBlitz is optimized for being setup during a workshop at a hackday or conference. When it comes ready assembled together with a up-to-date synced blockchain its possible to have it ready in about 2 to 3 hours - most is waiting time. -If you start at home ordering the parts from Amazon (see shopping list below) then its a weekend project with a lot of download and syncing time where you can do other stuff while checking on the progress from time to time. +If you start at home ordering the parts from Amazon (see shopping list below) then its a weekend project with a lot of download and syncing time where you can do other stuff while checking on the progress from time to time. ## Hardware Needed @@ -77,7 +77,7 @@ Connect the HDD to one of the USB ports. In the end your RaspiBlitz should look ## Installing the Software -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: +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**: @@ -190,7 +190,7 @@ This is the default way to download the blockchain data for the RaspiBlitz. If y *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.* -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. +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. 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. @@ -203,7 +203,7 @@ You should try the FTP download if the torrent option is not working for you. Pl ![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. +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. @@ -217,7 +217,7 @@ More details: [I have the full blockchain on another computer. How do I copy it #### 5. 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). +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 @@ -233,7 +233,7 @@ The RaspiBlitz calling the LND wallet creation command for you: ![SSH8](pictures/ssh8-wallet.png) -First it will ask you to set your wallet unlock password - use your choosen PASSWORD C here and confirm it by inputting it a second time. +First it will ask you to set your wallet unlock password - use your choosen PASSWORD C here and confirm it by inputting it a second time. Second it will ask you if you have an existing "cipher seed mnemonic" - if this is your first RaspiBlitz/LND just ansere `n`. @@ -257,7 +257,7 @@ The basic setup is done - hooray ... but still prepare for some long waiting tim ### First Start: Syncing & Scanning -After the reboot is done it takes a while for all services to start up - wait until you see on the LCD/display that LND wallet needs to get unlocked. Then SSH in again with the same command like in the beginning (check LCD/display) but this time (and every following login) use your PASSWORD A. +After the reboot is done it takes a while for all services to start up - wait until you see on the LCD/display that LND wallet needs to get unlocked. Then SSH in again with the same command like in the beginning (check LCD/display) but this time (and every following login) use your PASSWORD A. After terminal login LND will ask you (like on every start/reboot) to unlock the wallet again - use PASSWORD C: @@ -291,7 +291,7 @@ If you now login by SSH in your RaspiBlitz (or you are still logged in) you will ![SSH9e1](pictures/mainmenu1.png) -And if you scroll down .. you see even more options. All options of the main menu will be explained below in the feature documentation. +And if you scroll down .. you see even more options. All options of the main menu will be explained below in the feature documentation. *OK .. so from here on your RaspiBlitz is ready to play with.* @@ -337,7 +337,7 @@ Before you can open channels with other nodes you need to put some coins onto yo #### CONNECT: Connect to a Peer -Before you can open a channel with another node on the network you need to connect this node as a peer to your node. +Before you can open a channel with another node on the network you need to connect this node as a peer to your node. Opening a channel with a peer is just optional. Having another node a peer helps your node to receive information about the network thru the gossip protocol. It will help your node to find better routes thru the network. @@ -345,7 +345,7 @@ Opening a channel with a peer is just optional. Having another node a peer helps To open a payment channel with another node you can use this option. -Find interessting nodes to open channels with on online directories like [1ML.com](https://1ml.com/). +Find interessting nodes to open channels with on online directories like [1ML.com](https://1ml.com/). *This is just a very basic shell script. For more usability try the RTL Webinterface (under Services) or connect a (mobile) wallet with your RaspiBlitz.* @@ -385,7 +385,7 @@ To do so you can register at an DynamicDomain service like freedns.afraid.org an * 8333 (Bitcoin/mainnet) * 9735 (LND Node) -* 10009 (LND RPC) +* 10009 (LND RPC) ... from your internet router to the local IP of your RaspiBlitz and then activate unter "Services" the "DynamicDNS" option. @@ -432,11 +432,12 @@ This feature should support you in connecting your RaspiBlitz to a mobile wallet mobile-wallets -At the moment [ZAP (iOS)](https://github.com/LN-Zap/zap-iOS) and [Shango (iOS/Android)](https://github.com/neogeno/shango-lightning-wallet) are available. +At the moment [ZAP (iOS)](https://github.com/LN-Zap/zap-iOS), [Shango (iOS/Android)](https://github.com/neogeno/shango-lightning-wallet), +and [Zeus (iOS/Android)](https://github.com/ZeusLN/zeus) are available. Please keep in mind that if you also want to connect to your smartphone also from the outside (thru LTE, 3G, ..) with your RaspiBlitz you might need to open/forward ports on your router and should look into the DynamicDNS features to handle changeing IP of our Home-DSL. -* [How do I shrink the QR code for connecting my Shango/Zap mobile phone?](FAQ.md#how-do-i-shrink-the-qr-code-for-connecting-my-shangozap-mobile-phone) +* [How do I shrink the QR code for connecting my Shango/Zap/Zeus mobile phone?](FAQ.md#how-do-i-shrink-the-qr-code-for-connecting-my-shangozap-mobile-phone) #### EXPORT: Macaroons and TLS.cert @@ -496,11 +497,11 @@ Use if the want to remove all funds from the RaspiBlitz. #### OFF: PowerOff RaspiBlitz -A safe way to shutdown the RaspiBlitz. If then a reboot/restart is needed - un/replug the power. +A safe way to shutdown the RaspiBlitz. If then a reboot/restart is needed - un/replug the power. #### X: Console Terminal -Closes the SSH main menu and exits to the terminal - where the user can make use of the CLI clients `bitcoin-cli` & `lncli` directly to make use of the Bitcoin- and Lightningnode. +Closes the SSH main menu and exits to the terminal - where the user can make use of the CLI clients `bitcoin-cli` & `lncli` directly to make use of the Bitcoin- and Lightningnode. With the command `raspiblitz` it's possible to return to the main menu. @@ -544,7 +545,7 @@ If done successfully, simply put the SD card into the RaspiBlitz and power on ag A ready to use SD card image of the RaspiBlitz for your RaspberryPi is provided as download by us to get everybody started quickly (see above). But if you want to build that image yourself - here is a quick guide: * Get a fresh Rasbian RASPBIAN STRETCH WITH DESKTOP card image: [DOWNLOAD](https://www.raspberrypi.org/downloads/raspbian/) -* Write image to a SD card: [TUTORIAL](https://www.raspberrypi.org/documentation/installation/installing-images/README.md) +* Write image to a SD card: [TUTORIAL](https://www.raspberrypi.org/documentation/installation/installing-images/README.md) * Add a file called `ssh` to the root of the SD card when mounted to enable SSH login * Start card in Raspi and login per SSH with `ssh pi@[IP-OF-YOUR-RASPI]` password is `raspberry` @@ -554,7 +555,7 @@ Now you are ready to start the SD card build script - copy the following command As you can see from the URL you find the build script in this Git repo under `build_sdcard.sh` - there you can check what gets installed and configured in detail. Feel free to post improvements as pull requests. -The whole build process takes a while. At the end the LCD drivers get installed and a reboot is needed. A user `admin` is created during the process. Remember the default password is now `raspiblitz`. You can login per SSH again - this time use admin: `ssh admin@[IP-OF-YOUR-RASPI]`. An installer of the SD card image should automatically launch. If you do not want to continue with the installation at this moment and use this sd card as a template for setting up multiple RaspiBlitze, click `Cancel` and run `/home/admin/XXprepareRelease.sh`. Once you see the LCD going white and the activity LED of the pi starts going dark, you can unplug power and remove the SD card. You have now built your own RaspiBlitz SD card image. +The whole build process takes a while. At the end the LCD drivers get installed and a reboot is needed. A user `admin` is created during the process. Remember the default password is now `raspiblitz`. You can login per SSH again - this time use admin: `ssh admin@[IP-OF-YOUR-RASPI]`. An installer of the SD card image should automatically launch. If you do not want to continue with the installation at this moment and use this sd card as a template for setting up multiple RaspiBlitze, click `Cancel` and run `/home/admin/XXprepareRelease.sh`. Once you see the LCD going white and the activity LED of the pi starts going dark, you can unplug power and remove the SD card. You have now built your own RaspiBlitz SD card image. *Note: If you plan to use your self build sd card as a MASTER copy to backup image and distribute it. Use a smaller 8GB card for that. This way its ensured that it will fit on every 16 GB card recommended for RaspiBlitz later on.* diff --git a/home.admin/97addMobileWallet.sh b/home.admin/97addMobileWallet.sh index 0d53805..39dfd89 100644 --- a/home.admin/97addMobileWallet.sh +++ b/home.admin/97addMobileWallet.sh @@ -7,10 +7,10 @@ source /mnt/hdd/raspiblitz.conf # check if dynamic domain is set if [ ${#dynDomain} -eq 0 ]; then dialog --title " Just Local Network? " --yesno "If you want to connect with your RaspiBlitz -also from outside your local network you need to -activate 'Services' -> 'DynamicDNS' FIRST. +also from outside your local network you need to +activate 'Services' -> 'DynamicDNS' FIRST. -For more details see chapter in GitHub README +For more details see chapter in GitHub README 'Public Domain with DynamicDNS' https://github.com/rootzoll/raspiblitz @@ -25,7 +25,8 @@ fi # Basic Options OPTIONS=(ZAP "Zap Wallet (iOS)" \ - SHANGO "Shango Wallet (iOS/Android)") + SHANGO "Shango Wallet (iOS/Android)" \ + ZEUS "Zeus Wallet (iOS/Android)") CHOICE=$(dialog --clear --title "Choose Mobile Wallet" --menu "" 10 40 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) @@ -42,4 +43,8 @@ case $CHOICE in ./97addMobileWalletZap.sh exit 1; ;; + ZEUS) + ./97addMobileWalletZeus.sh + exit 1; + ;; esac \ No newline at end of file diff --git a/home.admin/97addMobileWalletZap.sh b/home.admin/97addMobileWalletZap.sh index 116db47..ecf53b9 100755 --- a/home.admin/97addMobileWalletZap.sh +++ b/home.admin/97addMobileWalletZap.sh @@ -2,7 +2,7 @@ # load raspiblitz config data source /home/admin/raspiblitz.info -source /mnt/hdd/raspiblitz.conf +source /mnt/hdd/raspiblitz.conf # export go vars (if needed) if [ ${#GOROOT} -eq 0 ]; then @@ -34,7 +34,7 @@ fi clear echo "*** Setup ***" echo "" -echo "Installing zapconnect. Please wait..." +echo "Installing lndconnect. Please wait..." echo "" echo "Getting github.com/LN-Zap/lndconnect (please wait) ..." go get -d github.com/LN-Zap/lndconnect @@ -51,15 +51,15 @@ echo "Connect Zap Mobile Wallet" 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 "At the moment this app is in closed beta testing." 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 "" echo "*** STEP 1 ***" -if [ ${#dynDomain} -eq 0 ]; then +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 -echo "During Setup of the Zap app you should get to the 'Connect Remote-Node' screen." +echo "During Setup of the Zap app you should get to the 'Connect Remote-Node' screen." echo "" echo "---> Click on Scan" echo "Make the this terminal as big as possible - fullscreen would be best." @@ -69,8 +69,8 @@ read key clear echo "*** 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. +if [ ${#dynDomain} -eq 0 ]; then + # If you drop the -i parameter, lndconnect will use the external IP. lndconnect -i else # when dynamic domain is set @@ -81,7 +81,7 @@ echo "(To shrink QR code: OSX->CMD- / LINUX-> CTRL-) Press ENTER when finished." read key clear -echo "If its not working - check issues on GitHub:" +echo "If it's not working - check issues on GitHub:" echo "https://github.com/LN-Zap/zap-iOS/issues" echo "https://github.com/LN-Zap/lndconnect/issues" echo "" diff --git a/home.admin/97addMobileWalletZeus.sh b/home.admin/97addMobileWalletZeus.sh new file mode 100644 index 0000000..cf2497c --- /dev/null +++ b/home.admin/97addMobileWalletZeus.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# load raspiblitz config data +source /home/admin/raspiblitz.info +source /mnt/hdd/raspiblitz.conf + +# export go vars (if needed) +if [ ${#GOROOT} -eq 0 ]; then + export GOROOT=/usr/local/go + export PATH=$PATH:$GOROOT/bin +fi +if [ ${#GOPATH} -eq 0 ]; then + export GOPATH=/usr/local/gocode + export PATH=$PATH:$GOPATH/bin +fi + +# make sure go is installed +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 + sudo rm *.gz + sudo mkdir /usr/local/gocode + sudo chmod 777 /usr/local/gocode + goInstalled=$(go version 2>/dev/null | grep -c 'go') +fi +if [ ${goInstalled} -eq 0 ];then + echo "FAIL: Was not able to install GO (needed to run LndConnect)" + exit 1 +fi + +# make sure qrcode-encoder in installed +clear +echo "*** Setup ***" +echo "" +echo "Installing lndconnect. Please wait..." +echo "" +echo "Getting github.com/LN-Zap/lndconnect (please wait) ..." +go get -d github.com/LN-Zap/lndconnect +cd $GOPATH/src/github.com/LN-Zap/lndconnect +echo "" +echo "Building github.com/LN-Zap/lndconnect ..." +make +cd +sleep 3 + +clear +echo "******************************" +echo "Connect Zeus Mobile Wallet" +echo "******************************" +echo "" +echo "GETTING THE APP" +echo "At the moment this app is in alpha stages." +echo "You can compile the code for iOS or Android but only an Android APK is currently available for downloads." +echo "Go to https://github.com/ZeusLN/zeus/releases to find the latest release." +echo "" +echo "*** 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 +echo "During setup of the Zeus app you should get to the 'Settings' screen." +echo "" +echo "---> Click on the Scan lndconnect config button" +echo "Make the this terminal as big as possible - fullscreen would be best." +echo "Then PRESS ENTER here in the terminal to generare the QR code and scan it with the app." +read key + +clear +echo "*** 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. + lndconnect -i --port=8080 +else + # when dynamic domain is set + lndconnect --host=${dynDomain} --port=8080 +fi + +echo "(To shrink QR code: OSX->CMD- / LINUX-> CTRL-) Press ENTER when finished." +read key + +clear +echo "If it's not working - check issues on GitHub:" +echo "https://github.com/ZeusLN/zeus" +echo "https://github.com/LN-Zap/lndconnect/issues" +echo "" From a3763604621cd7bbe8618e07ef314f80691bee57 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Wed, 6 Mar 2019 12:52:48 +0100 Subject: [PATCH 27/32] better ping address to check internet --- home.admin/00infoLCD.sh | 2 +- home.admin/80scanLND.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/home.admin/00infoLCD.sh b/home.admin/00infoLCD.sh index 9b3571d..1057c21 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -73,7 +73,7 @@ while : # check for internet connection # https://en.wikipedia.org/wiki/1.1.1.1 - online=$(ping 1.1.1.1 -c 1 -W 2 | grep -c '1 received') + online=$(ping 1.0.0.1 -c 1 -W 2 | grep -c '1 received') if [ ${online} -eq 0 ]; then message="no internet connection" diff --git a/home.admin/80scanLND.sh b/home.admin/80scanLND.sh index 6d0f839..2bc23ad 100755 --- a/home.admin/80scanLND.sh +++ b/home.admin/80scanLND.sh @@ -36,7 +36,7 @@ if [ ${#item} -eq 0 ]; then # check if offline # https://en.wikipedia.org/wiki/1.1.1.1 - online=$(ping 1.1.1.1 -c 1 -W 2 | grep -c '1 received') + online=$(ping 1.0.0.1 -c 1 -W 2 | grep -c '1 received') fi # get total number of blocks @@ -59,7 +59,7 @@ fi if [ ${online} -eq 0 ]; then heigh=7 width=44 - infoStr=$(echo " Waiting INTERNET CONNECTION\n RaspiBlitz cannot ping 1.1.1.1\n Local IP is ${localip}\n Please check cables and router.") + infoStr=$(echo " Waiting INTERNET CONNECTION\n RaspiBlitz cannot ping 1.0.0.1\n Local IP is ${localip}\n Please check cables and router.") elif [ ${isInitialChainSync} -gt 0 ]; then heigh=7 infoStr=" Waiting for final Blockchain Sync\n Progress: ${progress} %\n Please wait - this can take some time.\n ssh admin@${localip}\n Password A" From 53ac313d4de30ae409f8b04c923efc81856fdc3a Mon Sep 17 00:00:00 2001 From: fluidvoice Date: Fri, 8 Mar 2019 10:16:13 -0300 Subject: [PATCH 28/32] fix display sync % --- 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 da69057..19f2eeb 100755 --- a/home.admin/00infoBlitz.sh +++ b/home.admin/00infoBlitz.sh @@ -90,7 +90,7 @@ if [ -n ${btc_path} ]; then block_diff=$(expr ${block_chain} - ${block_verified}) progress="$(echo "${blockchaininfo}" | jq -r '.verificationprogress')" - sync_percentage=$(printf "%.2f%%" "$(echo $progress | awk '{print 100 * $1}')") + sync_percentage=$(echo $progress | awk '{printf( "%.2f%%", 100 * $1)}') if [ ${block_diff} -eq 0 ]; then # fully synced sync="OK" From 3e9d3388c2838ca0c99b612467d9bcb363def088 Mon Sep 17 00:00:00 2001 From: Christian Rotzoll Date: Fri, 8 Mar 2019 13:16:43 +0000 Subject: [PATCH 29/32] better detect chain not in sync #409 --- home.admin/BBfundWallet.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/BBfundWallet.sh b/home.admin/BBfundWallet.sh index edb6461..cc89c83 100755 --- a/home.admin/BBfundWallet.sh +++ b/home.admin/BBfundWallet.sh @@ -23,8 +23,8 @@ echo "" echo "RESULT:" # PRECHECK) check if chain is in sync -chainInSync=$(lncli --chain=${network} --network=${chain}net getinfo | grep '"synced_to_chain": true' -c) -if [ ${chainInSync} -eq 0 ]; then +chainOutSync=$(lncli --chain=${network} --network=${chain}net getinfo | grep '"synced_to_chain": false' -c) +if [ ${chainOutSync} -eq 1 ]; then command="" result="FAIL PRECHECK - lncli getinfo shows 'synced_to_chain': false - wait until chain is sync " fi From a46861a1eb8190283abce477b435b4ff5fe8e595 Mon Sep 17 00:00:00 2001 From: fluidvoice Date: Fri, 8 Mar 2019 10:16:52 -0300 Subject: [PATCH 30/32] fix display sync % --- home.admin/80scanLND.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/home.admin/80scanLND.sh b/home.admin/80scanLND.sh index 6d0f839..f7871ea 100755 --- a/home.admin/80scanLND.sh +++ b/home.admin/80scanLND.sh @@ -46,7 +46,8 @@ scanstate="${item}/${total}" # get blockchain sync progress progress="$(echo "${blockchaininfo}" | jq -r '.verificationprogress')" -progress=$(echo "${progress}*100" | bc) +#progress=$(echo "${progress}*100" | bc) +progress=$(echo $progress | awk '{printf( "%.2f%%", 100 * $1)}') # check if blockchain is still syncing heigh=6 @@ -88,4 +89,5 @@ fi # display progress to user sleep 3 -dialog --title " ${network} / ${chain} " --backtitle "RaspiBlitz (${hostname})" --infobox "${infoStr}" ${heigh} ${width} \ No newline at end of file +temp=$(echo "scale=1; $(cat /sys/class/thermal/thermal_zone0/temp)/1000" | bc) +dialog --title " ${network} / ${chain} " --backtitle "RaspiBlitz (${hostname}) CPU: ${temp}°C" --infobox "${infoStr}" ${heigh} ${width} \ No newline at end of file From bdc4ea285e92936b0e78c3df39a300f0af9710d5 Mon Sep 17 00:00:00 2001 From: fluidvoice Date: Fri, 8 Mar 2019 10:17:17 -0300 Subject: [PATCH 31/32] fix display sync % --- home.admin/00infoLCD.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/home.admin/00infoLCD.sh b/home.admin/00infoLCD.sh index 9b3571d..c7cff7e 100755 --- a/home.admin/00infoLCD.sh +++ b/home.admin/00infoLCD.sh @@ -80,12 +80,11 @@ while : # when in presync - get more info on progress elif [ "${state}" = "presync" ]; then # get blockchain sync progress - blockchaininfo="$(sudo -u root bitcoin-cli -conf=/home/admin/assets/bitcoin.conf getblockchaininfo 2>/dev/null)" + blockchaininfo="$(sudo -u root ${network}-cli -datadir=/home/bitcoin/.${network} getblockchaininfo 2>/dev/null)" message="starting" if [ ${#blockchaininfo} -gt 0 ]; then message="$(echo "${blockchaininfo}" | jq -r '.verificationprogress')" - message=$(echo "${message}*100" | bc) - message="${message}%" + message=$(echo $message | awk '{printf( "%.2f%%", 100 * $1)}') fi # when old data - improve message From 74aa17cec0bfbbc909486426b1fd847f909309b6 Mon Sep 17 00:00:00 2001 From: fluidvoice Date: Fri, 8 Mar 2019 10:19:40 -0300 Subject: [PATCH 32/32] display CPU temp always/syncing --- home.admin/config.scripts/network.reindex.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/home.admin/config.scripts/network.reindex.sh b/home.admin/config.scripts/network.reindex.sh index e1c3950..0b41228 100755 --- a/home.admin/config.scripts/network.reindex.sh +++ b/home.admin/config.scripts/network.reindex.sh @@ -59,6 +59,7 @@ while [ ${finished} -eq 0 ] blockchaininfo=$(sudo -u bitcoin ${network}-cli -datadir=/home/bitcoin/.${network} getblockchaininfo) progress=$(echo "${blockchaininfo}" | jq -r '.verificationprogress') #progress=$(echo "${progress}*100" | bc) + progress=$(echo $progress | awk '{printf( "%.2f%%", 100 * $1)}') inprogress="$(echo "${blockchaininfo}" | jq -r '.initialblockdownload')" if [ "${inprogress}" = "false" ]; then finished=1