From 05d7972e6f56184a559ba1f22a8165b62e4a3711 Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Wed, 20 Feb 2019 08:32:10 +0100 Subject: [PATCH 1/8] 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 2/8] 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 3/8] 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 c5669a94645370b5e195a866adec09e67cffb15f Mon Sep 17 00:00:00 2001 From: Raumi <@raumi75> Date: Sat, 23 Feb 2019 16:38:06 +0100 Subject: [PATCH 4/8] 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 5/8] 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 6/8] 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 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Ⓢ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 7/8] 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 8/8] 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