From 45ad05cd11bf00f61142bb0b53869f10ee589388 Mon Sep 17 00:00:00 2001 From: frennkie Date: Sat, 18 Jul 2020 12:24:07 +0100 Subject: [PATCH 01/32] ip2tor: add message on reject --- .../config.scripts/blitz.subscriptions.ip2tor.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py index 5a5094264..16b80aea2 100644 --- a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py +++ b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 +import ast import codecs import json import math @@ -713,6 +714,9 @@ More information on the service you can find under: exitcode = 0 + order = ast.literal_eval(be.errorLong) + message = order['message'] + if (be.errorShort == "timeout on waiting for extending bridge" or be.errorShort == "fail on subscription storage" or be.errorShort == "invalid port" or @@ -723,8 +727,10 @@ More information on the service you can find under: You DID PAY the initial fee. But the service was not able to provide service. Subscription will be ignored. + Error: {0} - '''.format(be.errorShort), title="Error on Subscription", extra_button=True, extra_label="Details") +Message: {1} + '''.format(be.errorShort, message), title="Error on Subscription", extra_button=True, extra_label="Details") else: # error happened before payment @@ -732,8 +738,10 @@ Error: {0} You DID NOT PAY the initial fee. The service was not able to provide service. Subscription will be ignored. + Error: {0} - '''.format(be.errorShort), title="Error on Subscription", extra_button=True, extra_label="Details") +Message: {1} + '''.format(be.errorShort, message), title="Error on Subscription", extra_button=True, extra_label="Details") # show more details (when user used extra button) if exitcode == Dialog.EXTRA: From b192ea0f101e76a291ba3fb6bdbfce6c3eaa38db Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 13:40:41 +0200 Subject: [PATCH 02/32] BTCPay Server add install info --- home.admin/_bootstrap.provision.sh | 2 ++ home.admin/_bootstrap.sh | 6 ++++-- .../config.scripts/bonus.btcpayserver.sh | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/home.admin/_bootstrap.provision.sh b/home.admin/_bootstrap.provision.sh index 86ee9080d..95f90ee90 100644 --- a/home.admin/_bootstrap.provision.sh +++ b/home.admin/_bootstrap.provision.sh @@ -293,6 +293,8 @@ if [ "${BTCPayServer}" = "on" ]; then # because BTCPAY server freezes during recovery .. it will get installed after reboot echo "sudo -u admin /home/admin/config.scripts/bonus.btcpayserver.sh on" >> /home/admin/setup.sh + sudo chmod +x /home/admin/setup.sh >> ${logFile} + sudo ls -la /home/admin/setup.sh >> ${logFile} else echo "Provisioning BTCPayServer - keep default" >> ${logFile} diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index e6f41e17a..cebb4a447 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -142,9 +142,11 @@ if [ ${afterSetupScriptExists} -eq 1 ]; then # echo out script to journal logs sudo cat /home/admin/setup.sh # execute the after boot script - sudo /home/admin/setup.sh + echo "Logs in stored to: /home/admin/raspiblitz.recover.log" + echo "\n***** RUNNING AFTER BOOT SCRIPT ******** " >> /home/admin/raspiblitz.recover.log + sudo /home/admin/setup.sh >> /home/admin/raspiblitz.recover.log # delete the after boot script - sudo rm /home/admin/setup.sh + sudo rm /home/admin/setup.sh # reboot again echo "DONE wait 6 secs ... one more reboot needed ... " sudo shutdown -r now diff --git a/home.admin/config.scripts/bonus.btcpayserver.sh b/home.admin/config.scripts/bonus.btcpayserver.sh index d9b762fe1..0211be1a9 100644 --- a/home.admin/config.scripts/bonus.btcpayserver.sh +++ b/home.admin/config.scripts/bonus.btcpayserver.sh @@ -14,8 +14,12 @@ source /mnt/hdd/raspiblitz.conf source /home/admin/raspiblitz.info if [ "$1" = "status" ]; then + if [ "${BTCPayServer}" = "on" ]; then - echo "installed=1" + + echo "switchedon=1" + isInstalled=$(sudo ls /etc/systemd/system/btcpayserver.service 2>/dev/null | grep -c 'btcpayserver.service') + echo "installed=${isInstalled}" localIP=$(ip addr | grep 'state UP' -A2 | egrep -v 'docker0' | grep 'eth0\|wlan0' | tail -n1 | awk '{print $2}' | cut -f1 -d'/') echo "localIP='${localIP}'" @@ -61,6 +65,7 @@ if [ "$1" = "status" ]; then fi else + echo "switchedon=0" echo "installed=0" fi exit 0 @@ -73,6 +78,17 @@ if [ "$1" = "menu" ]; then echo "# collecting status info ... (please wait)" source <(sudo /home/admin/config.scripts/bonus.btcpayserver.sh status) + if [ ${switchedon} -eq 0 ]; then + whiptail --title " BTCPay Server " --msgbox "BTCPay Server is not activated." 7 36 + exit 0 + fi + + if [ ${installed} -eq 0 ]; then + whiptail --title " BTCPay Server " --msgbox "BTCPay Server needs to be re-installed.\nPress OK to start process." 8 45 + /home/admin/config.scripts/bonus.btcpayserver.sh on + exit 0 + fi + text="Local Webrowser: https://${localIP}:${httpsPort}" if [ ${#publicDomain} -gt 0 ]; then From 0d075aaefbbb405bdf8f5d30dc2335c646165737 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 14:28:14 +0200 Subject: [PATCH 03/32] refresh certs only when letsencrypt is on --- home.admin/config.scripts/bonus.letsencrypt.sh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/home.admin/config.scripts/bonus.letsencrypt.sh b/home.admin/config.scripts/bonus.letsencrypt.sh index 36ff8b79a..34c915220 100755 --- a/home.admin/config.scripts/bonus.letsencrypt.sh +++ b/home.admin/config.scripts/bonus.letsencrypt.sh @@ -105,11 +105,6 @@ function acme_install() { function refresh_certs_with_nginx() { - if [ ! -d "${ACME_CERT_HOME}" ]; then - echo "# no cert directory to link: ${ACME_CERT_HOME}" - return - fi - # FIRST: SET ALL TO DEFAULT SELF SIGNED echo "# default IP certs" @@ -126,6 +121,16 @@ function refresh_certs_with_nginx() { # SECOND: SET LETSENCRPYT CERTS FOR SUBSCRIPTIONS + if [ "${letsencrypt}" != "on" ]; then + echo "# lets encrypt is off - so no certs replacements" + return + fi + + if [ ! -d "${ACME_CERT_HOME}" ]; then + echo "# no cert directory to link: ${ACME_CERT_HOME}" + return + fi + certsDirectories=$(sudo ls ${ACME_CERT_HOME}) directoryArray=(`echo "${certsDirectories}" | tr ' ' ' '`) for i in "${directoryArray[@]}"; do From 92c473dcb938584bd67f901bf6361707fb5c2184 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 14:45:22 +0200 Subject: [PATCH 04/32] #1027 remove lets encrypt from settings menu --- home.admin/00settingsMenuBasics.sh | 32 ------------------- .../config.scripts/bonus.btcpayserver.sh | 4 +-- 2 files changed, 2 insertions(+), 34 deletions(-) diff --git a/home.admin/00settingsMenuBasics.sh b/home.admin/00settingsMenuBasics.sh index 68d85b647..5507c2922 100644 --- a/home.admin/00settingsMenuBasics.sh +++ b/home.admin/00settingsMenuBasics.sh @@ -14,7 +14,6 @@ if [ ${#autoNatDiscovery} -eq 0 ]; then autoNatDiscovery="off"; fi if [ ${#networkUPnP} -eq 0 ]; then networkUPnP="off"; fi if [ ${#touchscreen} -eq 0 ]; then touchscreen=0; fi if [ ${#lcdrotate} -eq 0 ]; then lcdrotate=0; fi -if [ ${#letsencrypt} -eq 0 ]; then letsencrypt="off"; fi if [ ${#zerotier} -eq 0 ]; then zerotier="off"; fi echo "map dropboxbackup to on/off" @@ -78,7 +77,6 @@ OPTIONS+=(r 'LCD Rotate' ${lcdrotateMenu}) OPTIONS+=(a 'Channel Autopilot' ${autoPilot}) OPTIONS+=(k 'Accept Keysend' ${keysend}) OPTIONS+=(n 'Testnet' ${chainValue}) -OPTIONS+=(c 'Let`s Encrypt Client' ${letsencrypt}) OPTIONS+=(u 'LND Auto-Unlock' ${autoUnlock}) OPTIONS+=(d 'StaticChannelBackup on DropBox' ${DropboxBackup}) OPTIONS+=(e 'StaticChannelBackup on USB Drive' ${LocalBackup}) @@ -290,36 +288,6 @@ else echo "TOR Setting unchanged." fi -# Let's Encrypt process choice -choice="off"; check=$(echo "${CHOICES}" | grep -c "c") -if [ ${check} -eq 1 ]; then choice="on"; fi -if [ "${letsencrypt}" != "${choice}" ]; then - echo "Let's Encrypt Client Setting changed .." - anychange=1 - /home/admin/config.scripts/bonus.letsencrypt.sh ${choice} - errorOnInstall=$? - if [ "${choice}" = "on" ]; then - if [ ${errorOnInstall} -eq 0 ]; then - msg="Successfully installed." - else - msg="Failed to install!" - fi - else - if [ ${errorOnInstall} -eq 0 ]; then - msg="Successfully removed." - else - msg="Failed to remove!" - fi - fi - - dialog --backtitle "Additional Services" \ - --title "Let's Encrypt Client" \ - --infobox "\n${msg}" 5 40 ; sleep 3 - -else - echo "Let's Encrypt Client Setting unchanged." -fi - # LND Auto-Unlock choice="off"; check=$(echo "${CHOICES}" | grep -c "u") if [ ${check} -eq 1 ]; then choice="on"; fi diff --git a/home.admin/config.scripts/bonus.btcpayserver.sh b/home.admin/config.scripts/bonus.btcpayserver.sh index 0211be1a9..ca16e7aed 100644 --- a/home.admin/config.scripts/bonus.btcpayserver.sh +++ b/home.admin/config.scripts/bonus.btcpayserver.sh @@ -213,8 +213,8 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then # Hidden Service for BTCPay if Tor is active if [ "${runBehindTor}" = "on" ]; then - # correct old Hidden Service with port - sudo sed -i "s/^HiddenServicePort 80 127.0.0.1:23000/HiddenServicePort 80 127.0.0.1:23002/g" /etc/tor/torrc + # tunr off first to make sure to remove old config + /home/admin/config.scripts/internet.hiddenservice.sh off btcpay /home/admin/config.scripts/internet.hiddenservice.sh btcpay 80 23002 443 23003 fi From 2990a3eed33799df9339bf09bd2ab9f66eb63175 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 15:20:16 +0200 Subject: [PATCH 05/32] improve hidden service --- .../config.scripts/internet.hiddenservice.sh | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/home.admin/config.scripts/internet.hiddenservice.sh b/home.admin/config.scripts/internet.hiddenservice.sh index f413c6a34..32acf4b4a 100644 --- a/home.admin/config.scripts/internet.hiddenservice.sh +++ b/home.admin/config.scripts/internet.hiddenservice.sh @@ -59,38 +59,36 @@ if [ ${#toPort2} -gt 0 ]; then fi if [ "${runBehindTor}" = "on" ]; then - #check if the service is already present - isHiddenService=$(sudo cat /etc/tor/torrc 2>/dev/null | grep -c $service) - if [ ${isHiddenService} -eq 0 ]; then - #check if the port is already forwarded - alreadyThere=$(sudo cat /etc/tor/torrc 2>/dev/null | grep -c "\b127.0.0.1:$fromPort\b") - if [ ${alreadyThere} -gt 0 ]; then - echo "The port $fromPort is already forwarded. Check /etc/tor/torrc for the details." - exit 1 - fi + + # delete any old entry for that servive + sudo sed -i "/# Hidden Service for ${service}/,/^\s*$/{d}" /etc/tor/torrc + + # make new entry for that service echo " # Hidden Service for $service HiddenServiceDir /mnt/hdd/tor/$service HiddenServiceVersion 3 HiddenServicePort $toPort 127.0.0.1:$fromPort" | sudo tee -a /etc/tor/torrc + # remove double lines + awk 'NF > 0 {blank=0} NF == 0 {blank++} blank < 2' /etc/tor/torrc > .tmp && sudo mv .tmp /etc/tor/torrc - # check and insert second port pair - if [ ${#toPort2} -gt 0 ]; then - alreadyThere=$(sudo cat /etc/tor/torrc 2>/dev/null | grep -c "\b127.0.0.1:$fromPort2\b") - if [ ${alreadyThere} -gt 0 ]; then - echo "The port $fromPort2 is already forwarded. Check the /etc/tor/torrc for the details." - else - echo "HiddenServicePort $toPort2 127.0.0.1:$fromPort2" | sudo tee -a /etc/tor/torrc - fi + # check and insert second port pair + if [ ${#toPort2} -gt 0 ]; then + alreadyThere=$(sudo cat /etc/tor/torrc 2>/dev/null | grep -c "\b127.0.0.1:$fromPort2\b") + if [ ${alreadyThere} -gt 0 ]; then + echo "The port $fromPort2 is already forwarded. Check the /etc/tor/torrc for the details." + else + echo "HiddenServicePort $toPort2 127.0.0.1:$fromPort2" | sudo tee -a /etc/tor/torrc fi - # restart tor - echo "" - echo "Restarting Tor to activate the Hidden Service..." - sudo systemctl restart tor - sleep 10 - else - echo "The Hidden Service for $service is already installed." fi + + # restart tor + echo "" + echo "Restarting Tor to activate the Hidden Service..." + sudo chmod 644 /etc/tor/torrc + sudo systemctl restart tor + sleep 10 + # show the Hidden Service address TOR_ADDRESS=$(sudo cat /mnt/hdd/tor/$service/hostname) if [ -z "$TOR_ADDRESS" ]; then From 50c55a0b8d991e5c6628d802c7d45674a6460a1c Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 15:26:00 +0200 Subject: [PATCH 06/32] improved hidden service method --- home.admin/config.scripts/internet.hiddenservice.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/home.admin/config.scripts/internet.hiddenservice.sh b/home.admin/config.scripts/internet.hiddenservice.sh index 32acf4b4a..6eb55a45f 100644 --- a/home.admin/config.scripts/internet.hiddenservice.sh +++ b/home.admin/config.scripts/internet.hiddenservice.sh @@ -15,17 +15,24 @@ source /mnt/hdd/raspiblitz.conf # delete a hidden service if [ "$1" == "off" ]; then + service="$2" if [ ${#service} -eq 0 ]; then echo "ERROR: service name is missing" exit 1 fi + + # remove service paragraph sudo sed -i "/# Hidden Service for ${service}/,/^\s*$/{d}" /etc/tor/torrc + # remove double lines + awk 'NF > 0 {blank=0} NF == 0 {blank++} blank < 2' /etc/tor/torrc > .tmp && sudo mv .tmp /etc/tor/torrc + echo "# OK service is removed - restarting TOR ..." + sudo chmod 644 /etc/tor/torrc sudo systemctl restart tor sleep 10 echo "# Done" - exit 1 + exit 0 fi service="$1" From 244b2c5ce107e224a191b3a3ae53b2e238fd513c Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 15:26:56 +0200 Subject: [PATCH 07/32] fix old TOR ports --- home.admin/config.scripts/bonus.btc-rpc-explorer.sh | 3 ++- home.admin/config.scripts/bonus.btcpayserver.sh | 3 +-- .../config.scripts/bonus.cryptoadvance-specter.sh | 6 ++---- home.admin/config.scripts/bonus.electrs.sh | 1 + home.admin/config.scripts/bonus.lnbits.sh | 1 + home.admin/config.scripts/bonus.rtl.sh | 3 +-- home.admin/config.scripts/bonus.thunderhub.sh | 3 +-- home.admin/config.scripts/internet.tor.sh | 13 ++++++++++--- 8 files changed, 19 insertions(+), 14 deletions(-) diff --git a/home.admin/config.scripts/bonus.btc-rpc-explorer.sh b/home.admin/config.scripts/bonus.btc-rpc-explorer.sh index f3ff09ace..8960074f4 100644 --- a/home.admin/config.scripts/bonus.btc-rpc-explorer.sh +++ b/home.admin/config.scripts/bonus.btc-rpc-explorer.sh @@ -229,7 +229,7 @@ EOF # Hidden Service for BTC-RPC-explorer if Tor is active source /mnt/hdd/raspiblitz.conf if [ "${runBehindTor}" = "on" ]; then - echo "# Creating Tor Hidden Service" + # make sure to keep in sync with internet.tor.sh script /home/admin/config.scripts/internet.hiddenservice.sh btc-rpc-explorer 80 3022 443 3023 fi exit 0 @@ -261,6 +261,7 @@ if [ "$1" = "0" ] || [ "$1" = "off" ]; then # Hidden Service if Tor is active if [ "${runBehindTor}" = "on" ]; then + # make sure to keep in sync with internet.tor.sh script /home/admin/config.scripts/internet.hiddenservice.sh off btc-rpc-explorer fi diff --git a/home.admin/config.scripts/bonus.btcpayserver.sh b/home.admin/config.scripts/bonus.btcpayserver.sh index ca16e7aed..952c42873 100644 --- a/home.admin/config.scripts/bonus.btcpayserver.sh +++ b/home.admin/config.scripts/bonus.btcpayserver.sh @@ -213,8 +213,7 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then # Hidden Service for BTCPay if Tor is active if [ "${runBehindTor}" = "on" ]; then - # tunr off first to make sure to remove old config - /home/admin/config.scripts/internet.hiddenservice.sh off btcpay + # make sure to keep in sync with internet.tor.sh script /home/admin/config.scripts/internet.hiddenservice.sh btcpay 80 23002 443 23003 fi diff --git a/home.admin/config.scripts/bonus.cryptoadvance-specter.sh b/home.admin/config.scripts/bonus.cryptoadvance-specter.sh index 053b48633..361c4442c 100755 --- a/home.admin/config.scripts/bonus.cryptoadvance-specter.sh +++ b/home.admin/config.scripts/bonus.cryptoadvance-specter.sh @@ -239,10 +239,8 @@ EOF # Hidden Service for SERVICE if Tor is active source /mnt/hdd/raspiblitz.conf if [ "${runBehindTor}" = "on" ]; then - echo "# --> correct old Hidden Service with port" - sudo sed -i "s/^HiddenServicePort 25441 127.0.0.1:25441/HiddenServicePort 80 127.0.0.1:25441/g" /etc/tor/torrc - sudo sed -i "s/^HiddenServicePort 25441 127.0.0.1:80/HiddenServicePort 443 127.0.0.1:25441/g" /etc/tor/torrc - # port 25441 is HTTPS with self-signed cert + # make sure to keep in sync with internet.tor.sh script + # port 25441 is HTTPS with self-signed cert - specte only makes sense to be served over HTTPS /home/admin/config.scripts/internet.hiddenservice.sh cryptoadvance-specter 443 25441 fi exit 0 diff --git a/home.admin/config.scripts/bonus.electrs.sh b/home.admin/config.scripts/bonus.electrs.sh index 8d4f7a260..8975ef380 100644 --- a/home.admin/config.scripts/bonus.electrs.sh +++ b/home.admin/config.scripts/bonus.electrs.sh @@ -453,6 +453,7 @@ WantedBy=multi-user.target # Hidden Service for electrs if Tor active if [ "${runBehindTor}" = "on" ]; then + # make sure to keep in sync with internet.tor.sh script /home/admin/config.scripts/internet.hiddenservice.sh electrs 50002 50002 50001 50001 fi diff --git a/home.admin/config.scripts/bonus.lnbits.sh b/home.admin/config.scripts/bonus.lnbits.sh index 043e32927..3bbdb5669 100755 --- a/home.admin/config.scripts/bonus.lnbits.sh +++ b/home.admin/config.scripts/bonus.lnbits.sh @@ -274,6 +274,7 @@ EOF # Hidden Service if Tor is active source /mnt/hdd/raspiblitz.conf if [ "${runBehindTor}" = "on" ]; then + # make sure to keep in sync with internet.tor.sh script /home/admin/config.scripts/internet.hiddenservice.sh lnbits 80 5002 443 5003 fi exit 0 diff --git a/home.admin/config.scripts/bonus.rtl.sh b/home.admin/config.scripts/bonus.rtl.sh index 4df4632d7..fa4b73b9b 100755 --- a/home.admin/config.scripts/bonus.rtl.sh +++ b/home.admin/config.scripts/bonus.rtl.sh @@ -200,8 +200,7 @@ EOF # Hidden Service for RTL if Tor is active if [ "${runBehindTor}" = "on" ]; then - echo "# Creating Tor Hidden Service" - sudo sed -i "s/^HiddenServicePort 80 127.0.0.1:3000/HiddenServicePort 80 127.0.0.1:3002/g" /etc/tor/torrc + # make sure to keep in sync with internet.tor.sh script /home/admin/config.scripts/internet.hiddenservice.sh RTL 80 3002 443 3003 fi exit 0 diff --git a/home.admin/config.scripts/bonus.thunderhub.sh b/home.admin/config.scripts/bonus.thunderhub.sh index 58dbdf3ca..aefeecc3c 100644 --- a/home.admin/config.scripts/bonus.thunderhub.sh +++ b/home.admin/config.scripts/bonus.thunderhub.sh @@ -229,8 +229,7 @@ EOF # Hidden Service for thunderhub if Tor is active if [ "${runBehindTor}" = "on" ]; then - # correct old Hidden Service with port - sudo sed -i "s/^HiddenServicePort 80 127.0.0.1:3001/HiddenServicePort 80 127.0.0.1:3012/g" /etc/tor/torrc + # make sure to keep in sync with internet.tor.sh script /home/admin/config.scripts/internet.hiddenservice.sh thunderhub 80 3012 443 3013 fi fi diff --git a/home.admin/config.scripts/internet.tor.sh b/home.admin/config.scripts/internet.tor.sh index 240b9ffb4..657663c2e 100755 --- a/home.admin/config.scripts/internet.tor.sh +++ b/home.admin/config.scripts/internet.tor.sh @@ -365,16 +365,23 @@ EOF /home/admin/config.scripts/internet.hiddenservice.sh btc-rpc-explorer 80 3002 fi if [ "${rtlWebinterface}" = "on" ]; then - /home/admin/config.scripts/internet.hiddenservice.sh RTL 80 3000 + /home/admin/config.scripts/internet.hiddenservice.sh RTL 80 3002 443 3003 fi if [ "${BTCPayServer}" = "on" ]; then - /home/admin/config.scripts/internet.hiddenservice.sh btcpay 80 23000 + /home/admin/config.scripts/internet.hiddenservice.sh btcpay 80 23002 443 23003 fi if [ "${ElectRS}" = "on" ]; then /home/admin/config.scripts/internet.hiddenservice.sh electrs 50002 50002 50001 50001 fi if [ "${LNBits}" = "on" ]; then - /home/admin/config.scripts/internet.hiddenservice.sh lnbits 80 5000 + /home/admin/config.scripts/internet.hiddenservice.sh lnbits 80 5002 443 5003 + fi + if [ "${thunderhub}" = "on" ]; then + /home/admin/config.scripts/internet.hiddenservice.sh thunderhub 80 3012 443 3013 + fi + if [ "${specter}" = "on" ]; then + # specter makes only sense to be served over https + /home/admin/config.scripts/internet.hiddenservice.sh cryptoadvance-specter 443 25441 fi echo "OK - TOR is now ON" From 3c4b3179e20fb21820711a4fe964c278a2ea67d0 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 16:29:58 +0200 Subject: [PATCH 08/32] remove directory check --- home.admin/config.scripts/bonus.letsencrypt.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/home.admin/config.scripts/bonus.letsencrypt.sh b/home.admin/config.scripts/bonus.letsencrypt.sh index 34c915220..78fc4068d 100755 --- a/home.admin/config.scripts/bonus.letsencrypt.sh +++ b/home.admin/config.scripts/bonus.letsencrypt.sh @@ -126,11 +126,6 @@ function refresh_certs_with_nginx() { return fi - if [ ! -d "${ACME_CERT_HOME}" ]; then - echo "# no cert directory to link: ${ACME_CERT_HOME}" - return - fi - certsDirectories=$(sudo ls ${ACME_CERT_HOME}) directoryArray=(`echo "${certsDirectories}" | tr ' ' ' '`) for i in "${directoryArray[@]}"; do From a28015b2a18d18ebbb6db614b373d4093b7b34d8 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 16:36:54 +0200 Subject: [PATCH 09/32] add more debug output --- home.admin/config.scripts/blitz.subscriptions.letsencrypt.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py index 6f829f8a0..a2c4e63b9 100644 --- a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py +++ b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py @@ -134,10 +134,13 @@ def subscriptionsNew(ip, dnsservice, id, token, target): ["/home/admin/config.scripts/bonus.letsencrypt.sh", "issue-cert", dnsservice, id, token, target], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') out, err = acmeResult.communicate() + >&2 echo "${out}" + >&2 echo "${err}" if out.find("error=") > -1: time.sleep(6) raise BlitzError("letsancrypt acme failed", out) + # create subscription data for storage subscription = dict() subscription['type'] = "letsencrypt-v1" From d7b22c636f88334d74e80f3cb63df8fdfecdcf36 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 16:38:17 +0200 Subject: [PATCH 10/32] fix debug output --- home.admin/config.scripts/blitz.subscriptions.letsencrypt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py index a2c4e63b9..7152d7818 100644 --- a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py +++ b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py @@ -134,8 +134,8 @@ def subscriptionsNew(ip, dnsservice, id, token, target): ["/home/admin/config.scripts/bonus.letsencrypt.sh", "issue-cert", dnsservice, id, token, target], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') out, err = acmeResult.communicate() - >&2 echo "${out}" - >&2 echo "${err}" + echo "${out}" 1>&2 + echo "${err}" 1>&2 if out.find("error=") > -1: time.sleep(6) raise BlitzError("letsancrypt acme failed", out) From a66719a905f5642a2c0bd2d2901e88700d19e754 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 16:40:29 +0200 Subject: [PATCH 11/32] fix debug output --- home.admin/config.scripts/blitz.subscriptions.letsencrypt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py index 7152d7818..1cc8878ac 100644 --- a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py +++ b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py @@ -134,8 +134,8 @@ def subscriptionsNew(ip, dnsservice, id, token, target): ["/home/admin/config.scripts/bonus.letsencrypt.sh", "issue-cert", dnsservice, id, token, target], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') out, err = acmeResult.communicate() - echo "${out}" 1>&2 - echo "${err}" 1>&2 + eprint(str(out)) + eprint(str(err)) if out.find("error=") > -1: time.sleep(6) raise BlitzError("letsancrypt acme failed", out) From 9791d06dff56612275fcc9453976d7f9aeb9f95a Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 16:47:42 +0200 Subject: [PATCH 12/32] correct order of processes --- .../blitz.subscriptions.letsencrypt.py | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py index 1cc8878ac..ea8657d5a 100644 --- a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py +++ b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py @@ -128,19 +128,6 @@ def subscriptionsNew(ip, dnsservice, id, token, target): if dnsservice == "duckdns": duckDNSupdate(getsubdomain(id), token, realip) - # run the ACME script - print("# Running letsencrypt ACME script ...") - acmeResult = subprocess.Popen( - ["/home/admin/config.scripts/bonus.letsencrypt.sh", "issue-cert", dnsservice, id, token, target], - stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') - out, err = acmeResult.communicate() - eprint(str(out)) - eprint(str(err)) - if out.find("error=") > -1: - time.sleep(6) - raise BlitzError("letsancrypt acme failed", out) - - # create subscription data for storage subscription = dict() subscription['type'] = "letsencrypt-v1" @@ -175,6 +162,18 @@ def subscriptionsNew(ip, dnsservice, id, token, target): eprint(e) raise BlitzError("fail on subscription storage", str(subscription), e) + # run the ACME script + print("# Running letsencrypt ACME script ...") + acmeResult = subprocess.Popen( + ["/home/admin/config.scripts/bonus.letsencrypt.sh", "issue-cert", dnsservice, id, token, target], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') + out, err = acmeResult.communicate() + eprint(str(out)) + eprint(str(err)) + if out.find("error=") > -1: + time.sleep(6) + raise BlitzError("letsancrypt acme failed", out) + print("# OK - LETSENCRYPT DOMAIN IS READY") return subscription From e4d2baefda58894a521c172a3195078332c5db46 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 20:18:54 +0200 Subject: [PATCH 13/32] try BTC without stppong script --- home.admin/_bootstrap.provision.sh | 13 +++--- .../config.scripts/bonus.btcpayserver.sh | 45 +++++++++---------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/home.admin/_bootstrap.provision.sh b/home.admin/_bootstrap.provision.sh index 95f90ee90..96d94c190 100644 --- a/home.admin/_bootstrap.provision.sh +++ b/home.admin/_bootstrap.provision.sh @@ -287,14 +287,15 @@ fi # BTCPAYSERVER if [ "${BTCPayServer}" = "on" ]; then - echo "Provisioning BTCPAYSERVER on TOR - run on after bootup script" >> ${logFile} - #sudo sed -i "s/^message=.*/message='Setup BTCPay (takes time)'/g" ${infoFile} - #sudo -u admin /home/admin/config.scripts/bonus.btcpayserver.sh on >> ${logFile} 2>&1 + echo "Provisioning BTCPAYSERVER on TOR - running setup" >> ${logFile} + sudo sed -i "s/^message=.*/message='Setup BTCPay (takes time)'/g" ${infoFile} + sudo -u admin /home/admin/config.scripts/bonus.btcpayserver.sh on >> ${logFile} 2>&1 + #echo "Provisioning BTCPAYSERVER on TOR - run on after bootup script" >> ${logFile} # because BTCPAY server freezes during recovery .. it will get installed after reboot - echo "sudo -u admin /home/admin/config.scripts/bonus.btcpayserver.sh on" >> /home/admin/setup.sh - sudo chmod +x /home/admin/setup.sh >> ${logFile} - sudo ls -la /home/admin/setup.sh >> ${logFile} + #echo "sudo -u admin /home/admin/config.scripts/bonus.btcpayserver.sh on" >> /home/admin/setup.sh + #sudo chmod +x /home/admin/setup.sh >> ${logFile} + #sudo ls -la /home/admin/setup.sh >> ${logFile} else echo "Provisioning BTCPayServer - keep default" >> ${logFile} diff --git a/home.admin/config.scripts/bonus.btcpayserver.sh b/home.admin/config.scripts/bonus.btcpayserver.sh index 952c42873..89af47e03 100644 --- a/home.admin/config.scripts/bonus.btcpayserver.sh +++ b/home.admin/config.scripts/bonus.btcpayserver.sh @@ -337,7 +337,6 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then # from the build.sh with path sudo -u btcpay /home/btcpay/dotnet/dotnet build -c Release NBXplorer/NBXplorer.csproj - # create nbxplorer service echo " [Unit] @@ -367,17 +366,17 @@ WantedBy=multi-user.target sudo systemctl enable nbxplorer sudo systemctl start nbxplorer - echo "Checking for nbxplorer config" - while [ ! -f "/home/btcpay/.nbxplorer/Main/settings.config" ] - do - echo "Waiting for nbxplorer to start - CTRL+C to abort" - sleep 10 - hasFailed=$(sudo systemctl status nbxplorer | grep -c "Active: failed") - if [ ${hasFailed} -eq 1 ]; then - echo "seems like starting nbxplorer service has failed - see: systemctl status nbxplorer" - echo "maybe report here: https://github.com/rootzoll/raspiblitz/issues/214" - fi - done + #echo "Checking for nbxplorer config" + #while [ ! -f "/home/btcpay/.nbxplorer/Main/settings.config" ] + # do + # echo "Waiting for nbxplorer to start - CTRL+C to abort" + # sleep 10 + # hasFailed=$(sudo systemctl status nbxplorer | grep -c "Active: failed") + # if [ ${hasFailed} -eq 1 ]; then + # echo "seems like starting nbxplorer service has failed - see: systemctl status nbxplorer" + # echo "maybe report here: https://github.com/rootzoll/raspiblitz/issues/214" + # fi + #done echo "" echo "***" @@ -437,17 +436,17 @@ WantedBy=multi-user.target sudo systemctl enable btcpayserver sudo systemctl start btcpayserver - echo "Checking for btcpayserver config" - while [ ! -f "/home/btcpay/.btcpayserver/Main/settings.config" ] - do - echo "Waiting for btcpayserver to start - CTRL+C to abort" - sleep 10 - hasFailed=$(sudo systemctl status btcpayserver | grep -c "Active: failed") - if [ ${hasFailed} -eq 1 ]; then - echo "seems like starting btcpayserver service has failed - see: systemctl status btcpayserver" - echo "maybe report here: https://github.com/rootzoll/raspiblitz/issues/214" - fi - done + #echo "Checking for btcpayserver config" + #while [ ! -f "/home/btcpay/.btcpayserver/Main/settings.config" ] + # do + # echo "Waiting for btcpayserver to start - CTRL+C to abort" + # sleep 10 + # hasFailed=$(sudo systemctl status btcpayserver | grep -c "Active: failed") + # if [ ${hasFailed} -eq 1 ]; then + # echo "seems like starting btcpayserver service has failed - see: systemctl status btcpayserver" + # echo "maybe report here: https://github.com/rootzoll/raspiblitz/issues/214" + # fi + #done /home/admin/config.scripts/bonus.btcpayserver.sh write-tls-macaroon From 5cdf2269b694f638bb24743d281d6877f84144bf Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 20:29:27 +0200 Subject: [PATCH 14/32] dhparam.pem keep a copy on HDD --- home.admin/config.scripts/blitz.web.sh | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/home.admin/config.scripts/blitz.web.sh b/home.admin/config.scripts/blitz.web.sh index 79af9c848..c4223f129 100755 --- a/home.admin/config.scripts/blitz.web.sh +++ b/home.admin/config.scripts/blitz.web.sh @@ -128,6 +128,9 @@ elif [ "$1" = "1" ] || [ "$1" = "on" ]; then sudo systemctl enable nginx sudo systemctl start nginx + # create nginx app-data dir + sudo mkdir /mnt/hdd/app-data/nginx/ 2>/dev/null + # general nginx settings if ! grep -Eq '^\s*server_names_hash_bucket_size.*$' /etc/nginx/nginx.conf; then # ToDo(frennkie) verify this @@ -135,10 +138,22 @@ elif [ "$1" = "1" ] || [ "$1" = "on" ]; then fi if [ ! -f /etc/ssl/certs/dhparam.pem ]; then - #can take 5-10+ minutes on a Raspberry Pi 3 - echo "Running \"sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048\" next." - echo "This can take 5-10 minutes on a Raspberry Pi 3 - please be patient!" - sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 + + # check if there is a user generated dhparam.pem on the HDD to use + userFileExists=$(sudo ls /mnt/hdd/app-data/nginx/dhparam.pem 2>/dev/null | grep -c dhparam.pem) + if [ ${userFileExists} -eq 0 ]; then + # generate dhparam.pem - can take +10 minutes on a Raspberry Pi + echo "Generating a complete new dhparam.pem" + echo "Running \"sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048\" next." + echo "This can take 5-10 minutes on a Raspberry Pi 3 - please be patient!" + sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 + sudo cp /etc/ssl/certs/dhparam.pem /mnt/hdd/app-data/nginx/dhparam.pem + else + # just copy the already user generated dhparam.pem into nginx + echo "Copying the user generetad /mnt/hdd/app-data/nginx/dhparam.pem" + sudo cp /mnt/hdd/app-data/nginx/dhparam.pem /etc/ssl/certs/dhparam.pem + fi + fi sudo cp /home/admin/assets/nginx/snippets/* /etc/nginx/snippets/ @@ -178,8 +193,7 @@ elif [ "$1" = "1" ] || [ "$1" = "on" ]; then sudo apt-get install -y python3-jinja2 sudo -H python3 -m pip install j2cli - # create nginx app-data dir and use LND cert by default - sudo mkdir /mnt/hdd/app-data/nginx/ 2>/dev/null + # use LND cert by default sudo ln -sf /mnt/hdd/lnd/tls.cert /mnt/hdd/app-data/nginx/tls.cert sudo ln -sf /mnt/hdd/lnd/tls.key /mnt/hdd/app-data/nginx/tls.key sudo ln -sf /mnt/hdd/lnd/tls.cert /mnt/hdd/app-data/nginx/tor_tls.cert From 30186568d9209d8fc6f350d2de73f90a7a7e4bf5 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 21:14:23 +0200 Subject: [PATCH 15/32] #1360 detect rejection on extension --- .../blitz.subscriptions.ip2tor.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py index 16b80aea2..2655836d4 100644 --- a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py +++ b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py @@ -412,6 +412,8 @@ def shopOrder(shopUrl, hostid, servicename, torTarget, duration, msatsFirst, msa bridge = apiGetBridgeStatus(session, shopUrl, bridge_id) if bridge['status'] == "A": break + if bridge['status'] == "R": + break if loopCount > 120: raise BlitzError("timeout bridge not getting ready", bridge) @@ -431,6 +433,13 @@ def shopOrder(shopUrl, hostid, servicename, torTarget, duration, msatsFirst, msa if (secondsDelivered + 600) < int(duration): contract_breached = True warning_text = "delivered duration shorter than advertised" + if bridge['status'] == "R": + contract_breached = True + try: + warningTXT = "rejected: {0}".format(bridge['message']) + except Exception as e: + warningTXT = "rejected: n/a" + break # create subscription data for storage subscription = dict() @@ -438,7 +447,7 @@ def shopOrder(shopUrl, hostid, servicename, torTarget, duration, msatsFirst, msa subscription['id'] = bridge['id'] subscription['name'] = servicename subscription['shop'] = shopUrl - subscription['active'] = True + subscription['active'] = not contract_breached subscription['ip'] = bridge_ip subscription['port'] = bridge_port subscription['duration'] = int(duration) @@ -522,6 +531,13 @@ def subscriptionExtend(shopUrl, bridgeid, durationAdvertised, msatsNext, bridge_ print("## Loop {0}".format(loopCount)) try: bridge = apiGetBridgeStatus(session, shopUrl, bridgeid) + if bridge['status'] == "R": + contract_breached = True + try: + warningTXT = "rejected: {0}".format(bridge['message']) + except Exception as e: + warningTXT = "rejected: n/a" + break if bridge['suspend_after'] != bridge_suspendafter: break except Exception as e: From 33302c808e78bf45525c2be4c4f2c18d8d711d85 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 22:43:14 +0200 Subject: [PATCH 16/32] Fix BTCPayServer blocking on recovery --- .../config.scripts/bonus.btcpayserver.sh | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/home.admin/config.scripts/bonus.btcpayserver.sh b/home.admin/config.scripts/bonus.btcpayserver.sh index 89af47e03..958f53cb8 100644 --- a/home.admin/config.scripts/bonus.btcpayserver.sh +++ b/home.admin/config.scripts/bonus.btcpayserver.sh @@ -364,7 +364,7 @@ WantedBy=multi-user.target sudo systemctl daemon-reload # start to create settings.config sudo systemctl enable nbxplorer - sudo systemctl start nbxplorer + #sudo systemctl start nbxplorer #echo "Checking for nbxplorer config" #while [ ! -f "/home/btcpay/.nbxplorer/Main/settings.config" ] @@ -383,7 +383,7 @@ WantedBy=multi-user.target echo "getting RPC credentials from the bitcoin.conf" RPC_USER=$(sudo cat /mnt/hdd/bitcoin/bitcoin.conf | grep rpcuser | cut -c 9-) PASSWORD_B=$(sudo cat /mnt/hdd/bitcoin/bitcoin.conf | grep rpcpassword | cut -c 13-) - sudo mv /home/btcpay/.nbxplorer/Main/settings.config /home/btcpay/.nbxplorer/Main/settings.config.backup + #sudo mv /home/btcpay/.nbxplorer/Main/settings.config /home/btcpay/.nbxplorer/Main/settings.config.backup touch /home/admin/settings.config sudo chmod 600 /home/admin/settings.config || exit 1 cat >> /home/admin/settings.config </dev/null - sudo systemctl start btcpayserver 2>/dev/null + + if [ "${state}" == "ready" ]; then + # start service + echo "start service" + sudo systemctl start nbxplorer 2>/dev/null + sudo systemctl start btcpayserver 2>/dev/null + fi + fi # setting value in raspi blitz config From ebc00b74cd631a1d1d1deeca15ddc3f6ceb92a8e Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 22:46:14 +0200 Subject: [PATCH 17/32] correct info on hidden service port --- home.admin/config.scripts/internet.hiddenservice.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/home.admin/config.scripts/internet.hiddenservice.sh b/home.admin/config.scripts/internet.hiddenservice.sh index 6eb55a45f..5dc5c592e 100644 --- a/home.admin/config.scripts/internet.hiddenservice.sh +++ b/home.admin/config.scripts/internet.hiddenservice.sh @@ -111,13 +111,10 @@ HiddenServicePort $toPort 127.0.0.1:$fromPort" | sudo tee -a /etc/tor/torrc echo "The Tor Hidden Service address for $service is:" echo "$TOR_ADDRESS" echo "use with the port: $toPort" - echo "" if [ ${#toPort2} -gt 0 ]; then - alreadyThere=$(sudo cat /etc/tor/torrc 2>/dev/null | grep -c "\b127.0.0.1:$fromPort2\b") - if [ ${alreadyThere} -eq 0 ]; then + wasAdded=$(sudo cat /etc/tor/torrc 2>/dev/null | grep -c "\b127.0.0.1:$fromPort2\b") + if [ ${wasAdded} -gt 0 ]; then echo "or the port: $toPort2" - else - echo "The port $fromPort2 is forwarded for another Hidden Service. Check the /etc/tor/torrc for the details." fi fi else From 5e8a3377f88e126c481d976cbc6e730c2dfe12b9 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 22:49:26 +0200 Subject: [PATCH 18/32] on write-tls-macaroon when system is ready --- home.admin/config.scripts/bonus.btcpayserver.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/home.admin/config.scripts/bonus.btcpayserver.sh b/home.admin/config.scripts/bonus.btcpayserver.sh index 958f53cb8..560d62fd6 100644 --- a/home.admin/config.scripts/bonus.btcpayserver.sh +++ b/home.admin/config.scripts/bonus.btcpayserver.sh @@ -178,7 +178,10 @@ BTC.lightning=type=lnd-rest;server=https://127.0.0.1:8080/;macaroonfilepath=/hom s="BTC.lightning=type=lnd-rest\;server=https\://127.0.0.1:8080/\;macaroonfilepath=/home/btcpay/admin.macaroon\;" sudo -u btcpay sed -i "s|^${s}certthumbprint=.*|${s}certthumbprint=$FINGERPRINT|g" /home/btcpay/.btcpayserver/Main/settings.config fi - sudo systemctl restart btcpayserver + + if [ "${state}" == "ready" ]; then + sudo systemctl restart btcpayserver + fi exit 0 fi From 25ff21d28b44b9958af45f9989fad65db63e4567 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sat, 18 Jul 2020 22:58:13 +0200 Subject: [PATCH 19/32] make sure nbxplorer directiry exists --- home.admin/config.scripts/bonus.btcpayserver.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/home.admin/config.scripts/bonus.btcpayserver.sh b/home.admin/config.scripts/bonus.btcpayserver.sh index 560d62fd6..0632e7586 100644 --- a/home.admin/config.scripts/bonus.btcpayserver.sh +++ b/home.admin/config.scripts/bonus.btcpayserver.sh @@ -387,6 +387,7 @@ WantedBy=multi-user.target RPC_USER=$(sudo cat /mnt/hdd/bitcoin/bitcoin.conf | grep rpcuser | cut -c 9-) PASSWORD_B=$(sudo cat /mnt/hdd/bitcoin/bitcoin.conf | grep rpcpassword | cut -c 13-) #sudo mv /home/btcpay/.nbxplorer/Main/settings.config /home/btcpay/.nbxplorer/Main/settings.config.backup + sudo -u btcpay mkdir -p /home/btcpay/.nbxplorer/Main touch /home/admin/settings.config sudo chmod 600 /home/admin/settings.config || exit 1 cat >> /home/admin/settings.config < Date: Sat, 18 Jul 2020 23:49:12 +0200 Subject: [PATCH 20/32] fix syntax errors --- home.admin/config.scripts/blitz.subscriptions.ip2tor.py | 1 - home.admin/config.scripts/bonus.btcpayserver.sh | 1 + home.admin/config.scripts/internet.hiddenservice.sh | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py index 2655836d4..79c653ed2 100644 --- a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py +++ b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py @@ -439,7 +439,6 @@ def shopOrder(shopUrl, hostid, servicename, torTarget, duration, msatsFirst, msa warningTXT = "rejected: {0}".format(bridge['message']) except Exception as e: warningTXT = "rejected: n/a" - break # create subscription data for storage subscription = dict() diff --git a/home.admin/config.scripts/bonus.btcpayserver.sh b/home.admin/config.scripts/bonus.btcpayserver.sh index 0632e7586..dacf4e1fe 100644 --- a/home.admin/config.scripts/bonus.btcpayserver.sh +++ b/home.admin/config.scripts/bonus.btcpayserver.sh @@ -464,6 +464,7 @@ WantedBy=multi-user.target # echo "maybe report here: https://github.com/rootzoll/raspiblitz/issues/214" # fi #done + sudo -u btcpay mkdir -p /home/btcpay/.btcpayserver/Main/ /home/admin/config.scripts/bonus.btcpayserver.sh write-tls-macaroon diff --git a/home.admin/config.scripts/internet.hiddenservice.sh b/home.admin/config.scripts/internet.hiddenservice.sh index 5dc5c592e..8464b9761 100644 --- a/home.admin/config.scripts/internet.hiddenservice.sh +++ b/home.admin/config.scripts/internet.hiddenservice.sh @@ -71,13 +71,13 @@ if [ "${runBehindTor}" = "on" ]; then sudo sed -i "/# Hidden Service for ${service}/,/^\s*$/{d}" /etc/tor/torrc # make new entry for that service - echo " + echo " # Hidden Service for $service HiddenServiceDir /mnt/hdd/tor/$service HiddenServiceVersion 3 HiddenServicePort $toPort 127.0.0.1:$fromPort" | sudo tee -a /etc/tor/torrc # remove double lines - awk 'NF > 0 {blank=0} NF == 0 {blank++} blank < 2' /etc/tor/torrc > .tmp && sudo mv .tmp /etc/tor/torrc + sudo awk 'NF > 0 {blank=0} NF == 0 {blank++} blank < 2' /etc/tor/torrc > .tmp && sudo mv .tmp /etc/tor/torrc # check and insert second port pair if [ ${#toPort2} -gt 0 ]; then From a8b2e067ab171af5ce41c9df27a95a078ed03555 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 19 Jul 2020 00:04:59 +0200 Subject: [PATCH 21/32] make sure cpu info is in raspiblitz.ino --- home.admin/_bootstrap.sh | 80 ++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index cebb4a447..4b5165564 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -58,6 +58,46 @@ if [ "${setupStep}" != "100" ]; then fi sudo chmod 777 ${infoFile} +################################ +# IDENTIFY CPU ARCHITECTURE +################################ + +cpu="?" +isARM=$(uname -m | grep -c 'arm') +isAARCH64=$(uname -m | grep -c 'aarch64') +isX86_64=$(uname -m | grep -c 'x86_64') +if [ ${isARM} -gt 0 ]; then + cpu="arm" +elif [ ${isAARCH64} -gt 0 ]; then + cpu="aarch64" +elif [ ${isX86_64} -gt 0 ]; then + cpu="x86_64" +fi +echo "cpu=${cpu}" >> $infoFile + +################################ +# IDENTIFY BASEIMAGE +################################ + +baseImage="?" +isDietPi=$(uname -n | grep -c 'DietPi') +isRaspbian=$(cat /etc/os-release 2>/dev/null | grep -c 'Raspbian') +isArmbian=$(cat /etc/os-release 2>/dev/null | grep -c 'Debian') +isUbuntu=$(cat /etc/os-release 2>/dev/null | grep -c 'Ubuntu') +if [ ${isRaspbian} -gt 0 ]; then + baseImage="raspbian" +fi +if [ ${isArmbian} -gt 0 ]; then + baseImage="armbian" +fi +if [ ${isUbuntu} -gt 0 ]; then +baseImage="ubuntu" +fi +if [ ${isDietPi} -gt 0 ]; then + baseImage="dietpi" +fi +echo "baseimage=${baseImage}" >> $infoFile + # resetting start count files echo "SYSTEMD RESTART LOG: blockchain (bitcoind/litecoind)" > /home/admin/systemd.blockchain.log echo "SYSTEMD RESTART LOG: lightning (LND)" > /home/admin/systemd.lightning.log @@ -538,46 +578,6 @@ else sudo chown admin:admin /mnt/hdd/app-data/subscriptions fi -################################ -# IDENTIFY CPU ARCHITECTURE -################################ - -cpu="?" -isARM=$(uname -m | grep -c 'arm') -isAARCH64=$(uname -m | grep -c 'aarch64') -isX86_64=$(uname -m | grep -c 'x86_64') -if [ ${isARM} -gt 0 ]; then - cpu="arm" -elif [ ${isAARCH64} -gt 0 ]; then - cpu="aarch64" -elif [ ${isX86_64} -gt 0 ]; then - cpu="x86_64" -fi -echo "cpu=${cpu}" >> $infoFile - -################################ -# IDENTIFY BASEIMAGE -################################ - -baseImage="?" -isDietPi=$(uname -n | grep -c 'DietPi') -isRaspbian=$(cat /etc/os-release 2>/dev/null | grep -c 'Raspbian') -isArmbian=$(cat /etc/os-release 2>/dev/null | grep -c 'Debian') -isUbuntu=$(cat /etc/os-release 2>/dev/null | grep -c 'Ubuntu') -if [ ${isRaspbian} -gt 0 ]; then - baseImage="raspbian" -fi -if [ ${isArmbian} -gt 0 ]; then - baseImage="armbian" -fi -if [ ${isUbuntu} -gt 0 ]; then -baseImage="ubuntu" -fi -if [ ${isDietPi} -gt 0 ]; then - baseImage="dietpi" -fi -echo "baseimage=${baseImage}" >> $infoFile - ################################ # STRESSTEST RASPBERRY PI ################################ From f36d228def71a3141eb9ef427a3c22862c15a3f1 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 19 Jul 2020 01:01:09 +0200 Subject: [PATCH 22/32] #1357 update the AppStore link --- home.admin/97addMobileWallet.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home.admin/97addMobileWallet.sh b/home.admin/97addMobileWallet.sh index 3581f1fe3..7b69e8805 100755 --- a/home.admin/97addMobileWallet.sh +++ b/home.admin/97addMobileWallet.sh @@ -273,12 +273,12 @@ Please go to MAINMENU > SERVICES and activate KEYSEND first. exit 1; ;; FULLY_NODED) - appstoreLink="https://testflight.apple.com/join/PuFnSqgi" + appstoreLink="https://apps.apple.com/us/app/fully-noded/id1436425586" /home/admin/config.scripts/blitz.lcd.sh qr ${appstoreLink} whiptail --title "Install Fully Noded on your iOS device" \ --yes-button "continue" \ --no-button "link as QR code" \ - --yesno "At the moment this app is in public beta testing:\n\n${appstoreLink}\n\nJoin testing and follow ALL instructions.\n\nWhen installed and started -> continue" 10 60 + --yesno "Download the app from the AppStore:\n\n${appstoreLink}\n\nWhen installed and started -> continue" 8 60 if [ $? -eq 1 ]; then /home/admin/config.scripts/blitz.lcd.sh qr-console ${appstoreLink} fi From 4858fe6e78d551df31a9d37d17d19689ad9f6e1c Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 19 Jul 2020 01:44:11 +0200 Subject: [PATCH 23/32] #1358 fix exception on message --- home.admin/config.scripts/blitz.subscriptions.ip2tor.py | 5 ++++- home.admin/config.scripts/blitz.subscriptions.py | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py index 79c653ed2..8cbd64543 100644 --- a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py +++ b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py @@ -730,7 +730,10 @@ More information on the service you can find under: exitcode = 0 order = ast.literal_eval(be.errorLong) - message = order['message'] + try : + message = order['message'] + except Exception as e: + message = "n/a" if (be.errorShort == "timeout on waiting for extending bridge" or be.errorShort == "fail on subscription storage" or diff --git a/home.admin/config.scripts/blitz.subscriptions.py b/home.admin/config.scripts/blitz.subscriptions.py index 65bd0087a..2b6b18576 100644 --- a/home.admin/config.scripts/blitz.subscriptions.py +++ b/home.admin/config.scripts/blitz.subscriptions.py @@ -251,7 +251,6 @@ if tag == "NEW2": # NEW IP2TOR BRIDGE ############################### - if tag == "NEW1": # check if Blitz is running behind TOR From dfb3e52b351b9748b26a2ba18b2b3875c4b84b46 Mon Sep 17 00:00:00 2001 From: frennkie Date: Sun, 19 Jul 2020 10:30:28 +0100 Subject: [PATCH 24/32] BlitzPy: add BlitzError --- home.admin/BlitzPy/blitzpy/__init__.py | 18 ++++++++++-------- home.admin/BlitzPy/blitzpy/exceptions.py | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 home.admin/BlitzPy/blitzpy/exceptions.py diff --git a/home.admin/BlitzPy/blitzpy/__init__.py b/home.admin/BlitzPy/blitzpy/__init__.py index c217ead14..2d6c6ba7a 100644 --- a/home.admin/BlitzPy/blitzpy/__init__.py +++ b/home.admin/BlitzPy/blitzpy/__init__.py @@ -1,8 +1,10 @@ -# -*- coding: utf-8 -*- - -from .config import RaspiBlitzConfig, RaspiBlitzInfo - -__all__ = [ - 'RaspiBlitzConfig', - 'RaspiBlitzInfo', -] +# -*- coding: utf-8 -*- + +from .config import RaspiBlitzConfig, RaspiBlitzInfo +from .exceptions import BlitzError + +__all__ = [ + 'RaspiBlitzConfig', + 'RaspiBlitzInfo', + 'BlitzError' +] diff --git a/home.admin/BlitzPy/blitzpy/exceptions.py b/home.admin/BlitzPy/blitzpy/exceptions.py new file mode 100644 index 000000000..2289dc04f --- /dev/null +++ b/home.admin/BlitzPy/blitzpy/exceptions.py @@ -0,0 +1,16 @@ +from datetime import datetime + +TS_FORMAT = "%Y-%m-%dT%H:%M:%SZ" + + +class BlitzError(Exception): + def __init__(self, short: str, details: dict = None, org: Exception = None): + self.short: str = str(short) + if details: + self.details: dict = details + self.details.update({'timestamp': datetime.utcnow().strftime(TS_FORMAT)}) + else: + self.details = dict() + self.details['timestamp'] = datetime.utcnow().strftime(TS_FORMAT) + + self.org: Exception = org From 2de15466d99c33a0585f9f028d0af4ac15f68af9 Mon Sep 17 00:00:00 2001 From: frennkie Date: Sun, 19 Jul 2020 10:32:17 +0100 Subject: [PATCH 25/32] refactor (BlitzError and pep8) --- .../blitz.subscriptions.ip2tor.py | 225 ++++----- .../blitz.subscriptions.letsencrypt.py | 169 ++++--- .../config.scripts/blitz.subscriptions.py | 454 +++++++++--------- 3 files changed, 443 insertions(+), 405 deletions(-) diff --git a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py index 8cbd64543..1fa76ed4f 100644 --- a/home.admin/config.scripts/blitz.subscriptions.ip2tor.py +++ b/home.admin/config.scripts/blitz.subscriptions.ip2tor.py @@ -1,6 +1,5 @@ #!/usr/bin/python3 -import ast import codecs import json import math @@ -13,7 +12,7 @@ from pathlib import Path import grpc import requests import toml -from blitzpy import RaspiBlitzConfig +from blitzpy import RaspiBlitzConfig, BlitzError from lndlibs import rpc_pb2 as lnrpc from lndlibs import rpc_pb2_grpc as rpcstub @@ -35,6 +34,12 @@ if len(sys.argv) <= 1 or sys.argv[1] == "-h" or sys.argv[1] == "help": print("# blitz.subscriptions.ip2tor.py ip-by-tor onionaddress") sys.exit(1) +# constants for standard services +SERVICE_LND_REST_API = "LND-REST-API" +SERVICE_LND_GRPC_API = "LND-GRPC-API" +SERVICE_LNBITS = "LNBITS" +SERVICE_BTCPAY = "BTCPAY" + ##################### # BASIC SETTINGS ##################### @@ -70,17 +75,6 @@ else: is_testnet = False -##################### -# HELPER CLASSES -##################### - -class BlitzError(Exception): - def __init__(self, errorShort, errorLong="", errorException=None): - self.errorShort = str(errorShort) - self.errorLong = str(errorLong) - self.errorException = errorException - - ##################### # HELPER FUNCTIONS ##################### @@ -91,9 +85,9 @@ def eprint(*args, **kwargs): def handleException(e): if isinstance(e, BlitzError): - eprint(e.errorLong) - eprint(e.errorException) - print("error='{0}'".format(e.errorShort)) + eprint(e.details) + eprint(e.org) + print("error='{0}'".format(e.short)) else: eprint(e) print("error='{0}'".format(str(e))) @@ -150,17 +144,17 @@ def apiGetHosts(session, shopurl): try: response = session.get(url) except Exception as e: - raise BlitzError("failed HTTP request", url, e) + raise BlitzError("failed HTTP request", {'url': url}, e) if response.status_code != 200: - raise BlitzError("failed HTTP code", response.status_code, ) + raise BlitzError("failed HTTP code", {'status_code': response.status_code}) # parse & validate data try: jData = json.loads(response.content) except Exception as e: - raise BlitzError("failed JSON parsing", response.content, e) + raise BlitzError("failed JSON parsing", {'content': response.content}, e) if not isinstance(jData, list): - raise BlitzError("hosts not list", response.content) + raise BlitzError("hosts not list", {'content': response.content}) for idx, hostEntry in enumerate(jData): try: # ignore if not offering tor bridge @@ -188,7 +182,7 @@ def apiGetHosts(session, shopurl): # shorten names to 20 chars max hostEntry['name'] = hostEntry['name'][:20] except Exception as e: - raise BlitzError("failed host entry pasring", str(hostEntry), e) + raise BlitzError("failed host entry pasring", hostEntry, e) hosts.append(hostEntry) @@ -211,11 +205,11 @@ def apiPlaceOrderNew(session, shopurl, hostid, toraddressWithPort): try: response = session.post(url, data=postData) except Exception as e: - raise BlitzError("failed HTTP request", url, e) + raise BlitzError("failed HTTP request", {'url': url}, e) if response.status_code == 420: - raise BlitzError("forwarding this address was rejected", response.status_code) + raise BlitzError("forwarding this address was rejected", {'status_code': response.status_code}) if response.status_code != 201: - raise BlitzError("failed HTTP code", response.status_code) + raise BlitzError("failed HTTP code", {'status_code': response.status_code}) # parse & validate data try: @@ -224,7 +218,7 @@ def apiPlaceOrderNew(session, shopurl, hostid, toraddressWithPort): print("error='MISSING ID'") return except Exception as e: - raise BlitzError("failed JSON parsing", response.status_code, e) + raise BlitzError("failed JSON parsing", {'status_code': response.status_code}, e) return jData['id'] @@ -236,11 +230,11 @@ def apiPlaceOrderExtension(session, shopurl, bridgeid): try: response = session.post(url) except Exception as e: - raise BlitzError("failed HTTP request", url, e) + raise BlitzError("failed HTTP request", {'url': url}, e) if response.status_code == 420: - raise BlitzError("forwarding this address was rejected", response.status_code) + raise BlitzError("forwarding this address was rejected", {'status_code': response.status_code}) if response.status_code != 200 and response.status_code != 201: - raise BlitzError("failed HTTP code", response.status_code) + raise BlitzError("failed HTTP code", {'status_code': response.status_code}) # parse & validate data print("# parse") @@ -250,12 +244,12 @@ def apiPlaceOrderExtension(session, shopurl, bridgeid): print("error='MISSING ID'") return except Exception as e: - raise BlitzError("failed JSON parsing", response.content, e) + raise BlitzError("failed JSON parsing", {'content': response.content}, e) return jData['po_id'] -def apiGetOrder(session, shopurl, orderid): +def apiGetOrder(session, shopurl, orderid) -> dict: print("# apiGetOrder") # make HTTP request @@ -263,19 +257,19 @@ def apiGetOrder(session, shopurl, orderid): try: response = session.get(url) except Exception as e: - raise BlitzError("failed HTTP request", url, e) + raise BlitzError("failed HTTP request", {'url': url}, e) if response.status_code != 200: - raise BlitzError("failed HTTP code", response.status_code) + raise BlitzError("failed HTTP code", {'status_code': response.status_code}) # parse & validate data try: jData = json.loads(response.content) if len(jData['item_details']) == 0: - raise BlitzError("missing item", response.content) + raise BlitzError("missing item", {'content': response.content}) if len(jData['ln_invoices']) > 1: - raise BlitzError("more than one invoice", response.content) + raise BlitzError("more than one invoice", {'content': response.content}) except Exception as e: - raise BlitzError("failed JSON parsing", response.content, e) + raise BlitzError("failed JSON parsing", {'content': response.content}, e) return jData @@ -288,16 +282,16 @@ def apiGetBridgeStatus(session, shopurl, bridgeid): try: response = session.get(url) except Exception as e: - raise BlitzError("failed HTTP request", url, e) + raise BlitzError("failed HTTP request", {'url': url}, e) if response.status_code != 200: - raise BlitzError("failed HTTP code", response.status_code) + raise BlitzError("failed HTTP code", {'status_code': response.status_code}) # parse & validate data try: jData = json.loads(response.content) if len(jData['id']) == 0: - raise BlitzError("missing id", response.content) + raise BlitzError("missing id", {'content': response.content}) except Exception as e: - raise BlitzError("failed JSON parsing", response.content, e) + raise BlitzError("failed JSON parsing", {'content': response.content}, e) return jData @@ -322,10 +316,10 @@ def lndDecodeInvoice(lnInvoiceString): # validate results if response.num_msat <= 0: - raise BlitzError("zero invoice not allowed", lnInvoiceString) + raise BlitzError("zero invoice not allowed", {'invoice': lnInvoiceString}) except Exception as e: - raise BlitzError("failed LND invoice decoding", lnInvoiceString, e) + raise BlitzError("failed LND invoice decoding", {'invoice': lnInvoiceString}, e) return response @@ -346,10 +340,10 @@ def lndPayInvoice(lnInvoiceString): # validate results if len(response.payment_error) > 0: - raise BlitzError(response.payment_error, lnInvoiceString) + raise BlitzError(response.payment_error, {'invoice': lnInvoiceString}) except Exception as e: - raise BlitzError("payment failed", lnInvoiceString, e) + raise BlitzError("payment failed", {'invoice': lnInvoiceString}, e) return response @@ -480,7 +474,7 @@ def shopOrder(shopUrl, hostid, servicename, torTarget, duration, msatsFirst, msa except Exception as e: eprint(e) - raise BlitzError("fail on subscription storage", str(subscription), e) + raise BlitzError("fail on subscription storage", subscription, e) print("# OK - BRIDGE READY: {0}:{1} -> {2}".format(bridge_ip, bridge_port, torTarget)) return subscription @@ -578,7 +572,7 @@ def subscriptionExtend(shopUrl, bridgeid, durationAdvertised, msatsNext, bridge_ except Exception as e: eprint(e) - raise BlitzError("fail on subscription storage", "", e) + raise BlitzError("fail on subscription storage", org=e) print("# BRIDGE GOT EXTENDED: {0} -> {1}".format(bridge_suspendafter, bridge['suspend_after'])) @@ -664,7 +658,8 @@ Try again later, enter another address or cancel. choices=choices, title="Available Subscriptions") # if user cancels - if code != d.OK: sys.exit(0) + if code != d.OK: + sys.exit(0) # get data of selected seletedIndex = int(tag) @@ -712,7 +707,8 @@ More information on the service you can find under: height=30) # if user AGREED break loop and continue with selected host - if code == "extra": break + if code == "extra": + break ############################ # PHASE 3: Make Subscription @@ -729,16 +725,15 @@ More information on the service you can find under: exitcode = 0 - order = ast.literal_eval(be.errorLong) - try : - message = order['message'] - except Exception as e: - message = "n/a" + try: + message = be.details['message'] + except KeyError: + message = "" - if (be.errorShort == "timeout on waiting for extending bridge" or - be.errorShort == "fail on subscription storage" or - be.errorShort == "invalid port" or - be.errorShort == "timeout bridge not getting ready"): + if (be.short == "timeout on waiting for extending bridge" or + be.short == "fail on subscription storage" or + be.short == "invalid port" or + be.short == "timeout bridge not getting ready"): # error happened after payment exitcode = Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' @@ -748,7 +743,7 @@ Subscription will be ignored. Error: {0} Message: {1} - '''.format(be.errorShort, message), title="Error on Subscription", extra_button=True, extra_label="Details") + '''.format(be.short, message), title="Error on Subscription", extra_button=True, extra_label="Details") else: # error happened before payment @@ -759,7 +754,7 @@ Subscription will be ignored. Error: {0} Message: {1} - '''.format(be.errorShort, message), title="Error on Subscription", extra_button=True, extra_label="Details") + '''.format(be.short, message), title="Error on Subscription", extra_button=True, extra_label="Details") # show more details (when user used extra button) if exitcode == Dialog.EXTRA: @@ -767,13 +762,13 @@ Message: {1} print('###### ERROR DETAIL FOR DEBUG #######') print("") print("Error Short:") - print(be.errorShort) + print(be.short) print('Shop:') print(shopurl) print('Bridge:') print(str(host)) print("Error Detail:") - print(be.errorLong) + print(be.details) print("") input("Press Enter to continue ...") @@ -796,7 +791,7 @@ Message: {1} sys.exit(1) # if LND REST or LND GRPC service ... add bridge IP to TLS - if servicename == "LND-REST-API" or servicename == "LND-GRPC-API": + if blitzServiceName == SERVICE_LND_REST_API or blitzServiceName == SERVICE_LND_GRPC_API: os.system("sudo /home/admin/config.scripts/lnd.tlscert.sh ip-add {0}".format(subscription['ip'])) os.system("sudo /home/admin/config.scripts/lnd.credentials.sh reset tls") os.system("sudo /home/admin/config.scripts/lnd.credentials.sh sync") @@ -811,7 +806,7 @@ You may want to consider to cancel the subscription later. # decide if https:// address protocol = "" - if blitzServiceName == "LNBITS": + if blitzServiceName == SERVICE_LNBITS: protocol = "https://" # Give final result feedback to user @@ -847,13 +842,11 @@ MAIN MENU > Manage Subscriptions > My Subscriptions # CREATE SSH DIALOG # use for ssh shell menu ############### - -if sys.argv[1] == "create-ssh-dialog": - +def create_ssh_dialog(): # check parameters try: if len(sys.argv) <= 4: - raise BlitzError("incorrect parameters", "") + raise BlitzError("incorrect parameters") except Exception as e: handleException(e) @@ -865,17 +858,16 @@ if sys.argv[1] == "create-ssh-dialog": sys.exit() + ############### # SHOP LIST # call from web interface ############### - -if sys.argv[1] == "shop-list": - +def shop_list(): # check parameters try: if len(sys.argv) <= 2: - raise BlitzError("incorrect parameters", "") + raise BlitzError("incorrect parameters") except Exception as e: handleException(e) @@ -891,17 +883,16 @@ if sys.argv[1] == "shop-list": sys.exit(0) + ########################## # SHOP ORDER # call from web interface ########################## - -if sys.argv[1] == "shop-order": - +def shop_order(): # check parameters try: if len(sys.argv) <= 8: - raise BlitzError("incorrect parameters", "") + raise BlitzError("incorrect parameters") except Exception as e: handleException(e) @@ -926,13 +917,12 @@ if sys.argv[1] == "shop-order": except Exception as e: handleException(e) + ####################### # SUBSCRIPTIONS LIST # call in intervals from background process ####################### - -if sys.argv[1] == "subscriptions-list": - +def subscriptions_list(): try: if Path(SUBSCRIPTIONS_FILE).is_file(): @@ -947,15 +937,12 @@ if sys.argv[1] == "subscriptions-list": except Exception as e: handleException(e) - sys.exit(0) ####################### # SUBSCRIPTIONS RENEW # call in intervals from background process ####################### - -if sys.argv[1] == "subscriptions-renew": - +def subscriptions_renew(): print("# RUNNING subscriptions-renew") # check parameters @@ -1002,16 +989,16 @@ if sys.argv[1] == "subscriptions-renew": subs = toml.load(SUBSCRIPTIONS_FILE) for sub in subs['subscriptions_ip2tor']: if sub['id'] == subscription['id']: - sub['warning'] = "Exception on Renew: {0}".format(be.errorShort) - if be.errorShort == "invoice bigger amount than advertised": + sub['warning'] = "Exception on Renew: {0}".format(be.short) + if be.short == "invoice bigger amount than advertised": sub['contract_breached'] = True sub['active'] = False with open(SUBSCRIPTIONS_FILE, 'w') as writer: writer.write(toml.dumps(subs)) writer.close() break - print("# BLITZERROR on subscriptions-renew of subscription index {0}: {1}".format(idx, be.errorShort)) - print("# {0}".format(be.errorShort)) + print("# BLITZERROR on subscriptions-renew of subscription index {0}: {1}".format(idx, be.short)) + print("# {0}".format(be.short)) except Exception as e: print("# EXCEPTION on subscriptions-renew of subscription index {0}".format(idx)) @@ -1022,18 +1009,17 @@ if sys.argv[1] == "subscriptions-renew": # output - not needed only for debug logs print("# DONE subscriptions-renew") - sys.exit(1) + ####################### # SUBSCRIPTION CANCEL -# call in intervalls from background process +# call in intervals from background process ####################### -if sys.argv[1] == "subscription-cancel": - +def subscription_cancel(): # check parameters try: if len(sys.argv) <= 2: - raise BlitzError("incorrect parameters", "") + raise BlitzError("incorrect parameters") except Exception as e: handleException(e) @@ -1058,30 +1044,28 @@ if sys.argv[1] == "subscription-cancel": except Exception as e: handleException(e) - sys.exit(0) ####################### -# GET ADDRESS BY SERVICENAME +# GET ADDRESS BY SERVICE NAME # gets called by other scripts to check if service has a ip2tor bridge address # output is bash key/value style so that it can be imported with source ####################### -if sys.argv[1] == "subscription-by-service": - +def subscription_by_service(): # check parameters try: if len(sys.argv) <= 2: - raise BlitzError("incorrect parameters", "") + raise BlitzError("incorrect parameters") except Exception as e: handleException(e) - servicename = sys.argv[2] + service_name = sys.argv[2] try: if os.path.isfile(SUBSCRIPTIONS_FILE): os.system("sudo chown admin:admin {0}".format(SUBSCRIPTIONS_FILE)) subs = toml.load(SUBSCRIPTIONS_FILE) for idx, sub in enumerate(subs['subscriptions_ip2tor']): - if sub['active'] and sub['name'] == servicename: + if sub['active'] and sub['name'] == service_name: print("type='{0}'".format(sub['type'])) print("ip='{0}'".format(sub['ip'])) print("port='{0}'".format(sub['port'])) @@ -1089,24 +1073,22 @@ if sys.argv[1] == "subscription-by-service": sys.exit(0) print("error='not found'") - sys.exit(0) except Exception as e: handleException(e) + sys.exit(1) - sys.exit(1) ####################### -# GET IP BY ONIONADDRESS +# GET IP BY ONION ADDRESS # gets called by other scripts to check if a onion address as a IP2TOR bridge # output is bash key/value style so that it can be imported with source ####################### -if sys.argv[1] == "ip-by-tor": - +def ip_by_tor(): # check parameters try: if len(sys.argv) <= 2: - raise BlitzError("incorrect parameters", "") + raise BlitzError("incorrect parameters") except Exception as e: handleException(e) @@ -1126,12 +1108,41 @@ if sys.argv[1] == "ip-by-tor": sys.exit(0) print("error='not found'") - sys.exit(0) except Exception as e: handleException(e) + sys.exit(1) - sys.exit(1) -# unknown command -print("# unknown command") +def main(): + if sys.argv[1] == "create-ssh-dialog": + create_ssh_dialog() + + elif sys.argv[1] == "shop-list": + shop_list() + + elif sys.argv[1] == "shop-order": + shop_order() + + elif sys.argv[1] == "subscriptions-list": + subscriptions_list() + + elif sys.argv[1] == "subscriptions-renew": + subscriptions_renew() + + elif sys.argv[1] == "subscription-cancel": + subscription_cancel() + + elif sys.argv[1] == "subscription-by-service": + subscription_by_service() + + elif sys.argv[1] == "ip-by-tor": + ip_by_tor() + + else: + # unknown command + print("# unknown command") + + +if __name__ == '__main__': + main() diff --git a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py index ea8657d5a..80d49b50c 100644 --- a/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py +++ b/home.admin/config.scripts/blitz.subscriptions.letsencrypt.py @@ -10,7 +10,7 @@ from pathlib import Path import requests import toml -from blitzpy import RaspiBlitzConfig +from blitzpy import RaspiBlitzConfig,BlitzError ##################### # SCRIPT INFO @@ -30,6 +30,12 @@ if len(sys.argv) <= 1 or sys.argv[1] == "-h" or sys.argv[1] == "help": print("# blitz.subscriptions.ip2tor.py subscription-cancel ") sys.exit(1) +# constants for standard services +SERVICE_LND_REST_API = "LND-REST-API" +SERVICE_LND_GRPC_API = "LND-GRPC-API" +SERVICE_LNBITS = "LNBITS" +SERVICE_BTCPAY = "BTCPAY" + ##################### # BASIC SETTINGS ##################### @@ -49,6 +55,7 @@ if cfg.run_behind_tor: # HELPER CLASSES ##################### +# ToDo(frennkie) replace this with updated BlitzError from blitzpy class BlitzError(Exception): def __init__(self, errorShort, errorLong="", errorException=None): self.errorShort = str(errorShort) @@ -75,19 +82,19 @@ def handleException(e): sys.exit(1) -def getsubdomain(fulldomainstring): - return fulldomainstring.split('.')[0] +def get_subdomain(fulldomain_str): + return fulldomain_str.split('.')[0] ############################ -# API Calls to DNS Servcies +# API Calls to DNS Services ############################ -def duckDNSupdate(domain, token, ip): +def duckdns_update(domain, token, ip): print("# duckDNS update IP API call for {0}".format(domain)) # make HTTP request - url = "https://www.duckdns.org/update?domains={0}&token={1}&ip={2}".format(getsubdomain(domain), token, ip) + url = "https://www.duckdns.org/update?domains={0}&token={1}&ip={2}".format(get_subdomain(domain), token, ip) try: response = session.get(url) if response.status_code != 200: @@ -102,31 +109,33 @@ def duckDNSupdate(domain, token, ip): # PROCESS FUNCTIONS ##################### -def subscriptionsNew(ip, dnsservice, id, token, target): - # id needs to the full domain name +def subscriptions_new(ip, dnsservice, id, token, target): + # id needs to be the full domain name if id.find(".") == -1: - raise BlitzError("not a fully qualified domainname", dnsservice_id) + # ToDo(frennkie) dnsservice_id doesn't exit + raise BlitzError("not a fully qualified domain name", dnsservice_id) # check if id already exists - if len(getSubscription(id)) > 0: + if len(get_subscription(id)) > 0: raise BlitzError("id already exists", id) # make sure lets encrypt client is installed os.system("/home/admin/config.scripts/bonus.letsencrypt.sh on") # dyndns - realip = ip + real_ip = ip if ip == "dyndns": - updateURL = "" + update_url = "" if dnsservice == "duckdns": - updateURL = "https://www.duckdns.org/update?domains={0}&token={1}".format(getsubdomain(domain), token, ip) - subprocess.run(['/home/admin/config.scriprs/internet.dyndomain.sh', 'on', id, updateURL], + # ToDo(frennkie) domain doesn't exit + update_url = "https://www.duckdns.org/update?domains={0}&token={1}".format(get_subdomain(domain), token, ip) + subprocess.run(['/home/admin/config.scriprs/internet.dyndomain.sh', 'on', id, update_url], stdout=subprocess.PIPE).stdout.decode('utf-8').strip() - realip = cfg.public_ip + real_ip = cfg.public_ip # update DNS with actual IP if dnsservice == "duckdns": - duckDNSupdate(getsubdomain(id), token, realip) + duckdns_update(get_subdomain(id), token, real_ip) # create subscription data for storage subscription = dict() @@ -164,10 +173,10 @@ def subscriptionsNew(ip, dnsservice, id, token, target): # run the ACME script print("# Running letsencrypt ACME script ...") - acmeResult = subprocess.Popen( + acme_result = subprocess.Popen( ["/home/admin/config.scripts/bonus.letsencrypt.sh", "issue-cert", dnsservice, id, token, target], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') - out, err = acmeResult.communicate() + out, err = acme_result.communicate() eprint(str(out)) eprint(str(err)) if out.find("error=") > -1: @@ -178,26 +187,24 @@ def subscriptionsNew(ip, dnsservice, id, token, target): return subscription -def subscriptionsCancel(id): - # ToDo(frennkie) id is not used.. - +def subscriptions_cancel(s_id): os.system("sudo chown admin:admin {0}".format(SUBSCRIPTIONS_FILE)) subs = toml.load(SUBSCRIPTIONS_FILE) - newList = [] - removedCert = None + new_list = [] + removed_cert = None for idx, sub in enumerate(subs['subscriptions_letsencrypt']): - if sub['id'] != subscriptionID: - newList.append(sub) + if sub['id'] != s_id: + new_list.append(sub) else: - removedCert = sub - subs['subscriptions_letsencrypt'] = newList + removed_cert = sub + subs['subscriptions_letsencrypt'] = new_list # run the ACME script to remove cert - if removedCert: - acmeResult = subprocess.Popen( - ["/home/admin/config.scripts/bonus.letsencrypt.sh", "remove-cert", removedCert['id'], - removedCert['target']], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') - out, err = acmeResult.communicate() + if removed_cert: + acme_result = subprocess.Popen( + ["/home/admin/config.scripts/bonus.letsencrypt.sh", "remove-cert", removed_cert['id'], + removed_cert['target']], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') + out, err = acme_result.communicate() if out.find("error=") > -1: time.sleep(6) raise BlitzError("letsencrypt acme failed", out) @@ -212,7 +219,7 @@ def subscriptionsCancel(id): # todo: deinstall letsencrypt if this was last subscription -def getSubscription(subscriptionID): +def get_subscription(subscription_id): try: if Path(SUBSCRIPTIONS_FILE).is_file(): @@ -223,7 +230,7 @@ def getSubscription(subscriptionID): if "subscriptions_letsencrypt" not in subs: return [] for idx, sub in enumerate(subs['subscriptions_letsencrypt']): - if sub['id'] == subscriptionID: + if sub['id'] == subscription_id: return sub return [] @@ -231,7 +238,7 @@ def getSubscription(subscriptionID): return [] -def getDomainByIP(ip): +def get_domain_by_ip(ip): # does subscriptin file exists if Path(SUBSCRIPTIONS_FILE).is_file(): os.system("sudo chown admin:admin {0}".format(SUBSCRIPTIONS_FILE)) @@ -253,7 +260,7 @@ def getDomainByIP(ip): raise BlitzError("no match") -def menuMakeSubscription(): +def menu_make_subscription(): # late imports - so that rest of script can run also if dependency is not available from dialog import Dialog @@ -299,7 +306,7 @@ If you havent already go to https://duckdns.org title="DuckDNS Domain") subdomain = text.strip() subdomain = subdomain.split(' ')[0] - subdomain = getsubdomain(subdomain) + subdomain = get_subdomain(subdomain) domain = "{0}.duckdns.org".format(subdomain) os.system("clear") @@ -326,7 +333,7 @@ This looks not like a valid subdomain. if len(token) < 20: Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' This looks not like a valid token. - ''', title="Unvalid Input") + ''', title="Invalid Input") sys.exit(0) else: @@ -350,7 +357,7 @@ This looks not like a valid token. "\nChoose the kind of IP you want to use:", choices=choices, width=60, height=10, title="Select Service") - # if user chosses CANCEL + # if user chooses CANCEL os.system("clear") if code != d.OK: sys.exit(0) @@ -362,16 +369,16 @@ This looks not like a valid token. if tag == "IP2TOR": # get all active IP2TOR subscriptions (just in case) - ip2torSubs = [] + ip2tor_subs = [] if Path(SUBSCRIPTIONS_FILE).is_file(): os.system("sudo chown admin:admin {0}".format(SUBSCRIPTIONS_FILE)) subs = toml.load(SUBSCRIPTIONS_FILE) for idx, sub in enumerate(subs['subscriptions_ip2tor']): if sub['active']: - ip2torSubs.append(sub) + ip2tor_subs.append(sub) # when user has no IP2TOR subs yet - if len(ip2torSubs) == 0: + if len(ip2tor_subs) == 0: Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' You have no active IP2TOR subscriptions. Create one first and try again. @@ -380,7 +387,7 @@ Create one first and try again. # let user select a IP2TOR subscription choices = [] - for idx, sub in enumerate(ip2torSubs): + for idx, sub in enumerate(ip2tor_subs): choices.append(("{0}".format(idx), "IP2TOR {0} {1}:{2}".format(sub['name'], sub['ip'], sub['port']))) d = Dialog(dialog="dialog", autowidgetsize=True) @@ -394,8 +401,8 @@ Create one first and try again. sys.exit(0) # get the slected IP2TOR bridge - ip2torSelect = ip2torSubs[int(tag)] - ip = ip2torSelect["ip"] + ip2tor_select = ip2tor_subs[int(tag)] + ip = ip2tor_select["ip"] target = "tor" elif tag == "DYNDNS": @@ -421,13 +428,13 @@ Create one first and try again. if len(ip) == 0: Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' This looks not like a valid IP. - ''', title="Unvalid Input") + ''', title="Invalid Input") sys.exit(0) # create the letsencrypt subscription try: os.system("clear") - subscription = subscriptionsNew(ip, dnsservice, domain, token, target) + subscription = subscriptions_new(ip, dnsservice, domain, token, target) # success dialog Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' @@ -455,19 +462,15 @@ Unknown Error happened - please report to developers: # CREATE SSH DIALOG # use for ssh shell menu ############### +def create_ssh_dialog(): + menu_make_subscription() -if sys.argv[1] == "create-ssh-dialog": - menuMakeSubscription() - - sys.exit() ########################## # SUBSCRIPTIONS NEW # call from web interface ########################## - -if sys.argv[1] == "subscription-new": - +def subscription_new(): # check parameters try: if len(sys.argv) <= 5: @@ -486,7 +489,7 @@ if sys.argv[1] == "subscription-new": # create the subscription try: - subscription = subscriptionsNew(ip, dnsservice_type, dnsservice_id, dnsservice_token, target) + subscription = subscriptions_new(ip, dnsservice_type, dnsservice_id, dnsservice_token, target) # output json ordered bridge print(json.dumps(subscription, indent=2)) @@ -495,12 +498,11 @@ if sys.argv[1] == "subscription-new": except Exception as e: handleException(e) + ####################### # SUBSCRIPTIONS LIST ####################### - -if sys.argv[1] == "subscriptions-list": - +def subscriptions_list(): try: if Path(SUBSCRIPTIONS_FILE).is_file(): @@ -515,13 +517,11 @@ if sys.argv[1] == "subscriptions-list": except Exception as e: handleException(e) - sys.exit(0) ####################### # SUBSCRIPTION DETAIL ####################### -if sys.argv[1] == "subscription-detail": - +def subscription_detail(): # check parameters try: if len(sys.argv) <= 2: @@ -529,22 +529,20 @@ if sys.argv[1] == "subscription-detail": except Exception as e: handleException(e) - subscriptionID = sys.argv[2] + subscription_id = sys.argv[2] try: - sub = getSubscription(subscriptionID) + sub = get_subscription(subscription_id) print(json.dumps(sub, indent=2)) except Exception as e: handleException(e) - sys.exit(0) ####################### # DOMAIN BY IP # to check if an ip has a domain mapping ####################### -if sys.argv[1] == "domain-by-ip": - +def domain_by_ip(): # check parameters try: if len(sys.argv) <= 2: @@ -556,19 +554,17 @@ if sys.argv[1] == "domain-by-ip": ip = sys.argv[2] try: - domain = getDomainByIP(ip) + domain = get_domain_by_ip(ip) print("domain='{0}'".format(domain)) except Exception as e: handleException(e) - sys.exit(0) ####################### # SUBSCRIPTION CANCEL ####################### -if sys.argv[1] == "subscription-cancel": - +def subscription_cancel(): # check parameters try: if len(sys.argv) <= 2: @@ -576,13 +572,36 @@ if sys.argv[1] == "subscription-cancel": except Exception as e: handleException(e) - subscriptionID = sys.argv[2] + subscription_id = sys.argv[2] try: - subscriptionsCancel(subscriptionID) + subscriptions_cancel(subscription_id) except Exception as e: handleException(e) - sys.exit(0) -# unknown command -print("# unknown command") +def main(): + if sys.argv[1] == "create-ssh-dialog": + create_ssh_dialog() + + elif sys.argv[1] == "domain-by-ip": + domain_by_ip() + + elif sys.argv[1] == "subscriptions-list": + subscriptions_list() + + elif sys.argv[1] == "subscription-cancel": + subscription_cancel() + + elif sys.argv[1] == "subscription-detail": + subscription_detail() + + elif sys.argv[1] == "subscription-new": + subscription_new() + + else: + # unknown command + print("# unknown command") + + +if __name__ == '__main__': + main() diff --git a/home.admin/config.scripts/blitz.subscriptions.py b/home.admin/config.scripts/blitz.subscriptions.py index 2b6b18576..993ca28b6 100644 --- a/home.admin/config.scripts/blitz.subscriptions.py +++ b/home.admin/config.scripts/blitz.subscriptions.py @@ -15,10 +15,10 @@ from blitzpy import RaspiBlitzConfig from dialog import Dialog # constants for standard services -LND_REST_API = "LND-REST-API" -LND_GRPC_API = "LND-GRPC-API" -LNBITS = "LNBITS" -BTCPAY = "BTCPAY" +SERVICE_LND_REST_API = "LND-REST-API" +SERVICE_LND_GRPC_API = "LND-GRPC-API" +SERVICE_LNBITS = "LNBITS" +SERVICE_BTCPAY = "BTCPAY" # load config cfg = RaspiBlitzConfig() @@ -32,35 +32,38 @@ SUBSCRIPTIONS_FILE = "/mnt/hdd/app-data/subscriptions/subscriptions.toml" # HELPER FUNCTIONS ####################### +# ToDo(frennkie) these are not being used! + def eprint(*args, **kwargs): print(*args, file=sys.stderr, **kwargs) -def parseDateIP2TORSERVER(datestr): - return datetime.strptime(datestr, "%Y-%m-%dT%H:%M:%S.%fZ") +def parse_date_ip2tor(date_str): + return datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S.%fZ") -def secondsLeft(dateObj): - return round((dateObj - datetime.utcnow()).total_seconds()) +def seconds_left(date_obj): + return round((date_obj - datetime.utcnow()).total_seconds()) ####################### # SSH MENU FUNCTIONS ####################### -def mySubscriptions(): +def my_subscriptions(): # check if any subscriptions are available - countSubscriptions = 0 + count_subscriptions = 0 try: os.system("sudo chown admin:admin {0}".format(SUBSCRIPTIONS_FILE)) subs = toml.load(SUBSCRIPTIONS_FILE) if 'subscriptions_ip2tor' in subs: - countSubscriptions += len(subs['subscriptions_ip2tor']) + count_subscriptions += len(subs['subscriptions_ip2tor']) if 'subscriptions_letsencrypt' in subs: - countSubscriptions += len(subs['subscriptions_letsencrypt']) + count_subscriptions += len(subs['subscriptions_letsencrypt']) except Exception as e: - pass - if countSubscriptions == 0: + print(f"warning: {e}") + + if count_subscriptions == 0: Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' You have no active or inactive subscriptions. ''', title="Info") @@ -69,36 +72,36 @@ You have no active or inactive subscriptions. # load subscriptions and make dialog choices out of it choices = [] lookup = {} - lookupIndex = 0 + lookup_index = 0 subs = toml.load(SUBSCRIPTIONS_FILE) # list ip2tor subscriptions if 'subscriptions_ip2tor' in subs: for sub in subs['subscriptions_ip2tor']: # remember subscription under lookupindex - lookupIndex += 1 - lookup[str(lookupIndex)] = sub + lookup_index += 1 + lookup[str(lookup_index)] = sub # add to dialog choices if sub['active']: - activeState = "active" + active_state = "active" else: - activeState = "in-active" + active_state = "in-active" name = "IP2TOR Bridge (P:{1}) for {0}".format(sub['name'], sub['port']) - choices.append(("{0}".format(lookupIndex), "{0} ({1})".format(name.ljust(30), activeState))) + choices.append(("{0}".format(lookup_index), "{0} ({1})".format(name.ljust(30), active_state))) # list letsencrypt subscriptions if 'subscriptions_letsencrypt' in subs: for sub in subs['subscriptions_letsencrypt']: # remember subscription under lookupindex - lookupIndex += 1 - lookup[str(lookupIndex)] = sub + lookup_index += 1 + lookup[str(lookup_index)] = sub # add to dialog choices if sub['active']: - activeState = "active" + active_state = "active" else: - activeState = "in-active" + active_state = "in-active" name = "LETSENCRYPT {0}".format(sub['id']) - choices.append(("{0}".format(lookupIndex), "{0} ({1})".format(name.ljust(30), activeState))) + choices.append(("{0}".format(lookup_index), "{0} ({1})".format(name.ljust(30), active_state))) # show menu with options d = Dialog(dialog="dialog", autowidgetsize=True) @@ -111,15 +114,15 @@ You have no active or inactive subscriptions. if code != d.OK: return - # get data of selected subscrption - selectedSub = lookup[str(tag)] + # get data of selected subscription + selected_sub = lookup[str(tag)] # show details of selected d = Dialog(dialog="dialog", autowidgetsize=True) d.set_background_title("My Subscriptions") - if selectedSub['type'] == "letsencrypt-v1": - if len(selectedSub['warning']) > 0: - selectedSub['warning'] = "\n{0}".format(selectedSub['warning']) + if selected_sub['type'] == "letsencrypt-v1": + if len(selected_sub['warning']) > 0: + selected_sub['warning'] = "\n{0}".format(selected_sub['warning']) text = ''' This is a LetsEncrypt subscription using the free DNS service {dnsservice} @@ -135,17 +138,17 @@ The state of the subscription is: {active} {warning} The following additional information is available: {description} -'''.format(dnsservice=selectedSub['dnsservice_type'], - domain=selectedSub['id'], - ip=selectedSub['ip'], - active="ACTIVE" if selectedSub['active'] else "NOT ACTIVE", - warning=selectedSub['warning'], - description=selectedSub['description'] +'''.format(dnsservice=selected_sub['dnsservice_type'], + domain=selected_sub['id'], + ip=selected_sub['ip'], + active="ACTIVE" if selected_sub['active'] else "NOT ACTIVE", + warning=selected_sub['warning'], + description=selected_sub['description'] ) - elif selectedSub['type'] == "ip2tor-v1": - if len(selectedSub['warning']) > 0: - selectedSub['warning'] = "\n{0}".format(selectedSub['warning']) + elif selected_sub['type'] == "ip2tor-v1": + if len(selected_sub['warning']) > 0: + selected_sub['warning'] = "\n{0}".format(selected_sub['warning']) text = ''' This is a IP2TOR subscription bought on {initdate} at {shop} @@ -161,26 +164,26 @@ The state of the subscription is: {active} {warning} The following additional information is available: {description} -'''.format(initdate=selectedSub['time_created'], - shop=selectedSub['shop'], - publicaddress="{0}:{1}".format(selectedSub['ip'], selectedSub['port']), - toraddress=selectedSub['tor'], - renewhours=(round(int(selectedSub['duration']) / 3600)), - renewsats=(round(int(selectedSub['price_extension']) / 1000)), - totalsats=(round(int(selectedSub['price_total']) / 1000)), - active="ACTIVE" if selectedSub['active'] else "NOT ACTIVE", - warning=selectedSub['warning'], - description=selectedSub['description'], - service=selectedSub['name'] +'''.format(initdate=selected_sub['time_created'], + shop=selected_sub['shop'], + publicaddress="{0}:{1}".format(selected_sub['ip'], selected_sub['port']), + toraddress=selected_sub['tor'], + renewhours=(round(int(selected_sub['duration']) / 3600)), + renewsats=(round(int(selected_sub['price_extension']) / 1000)), + totalsats=(round(int(selected_sub['price_total']) / 1000)), + active="ACTIVE" if selected_sub['active'] else "NOT ACTIVE", + warning=selected_sub['warning'], + description=selected_sub['description'], + service=selected_sub['name'] ) else: text = "no text?! FIXME" - if selectedSub['active']: - extraLable = "CANCEL SUBSCRIPTION" + if selected_sub['active']: + extra_label = "CANCEL SUBSCRIPTION" else: - extraLable = "DELETE SUBSCRIPTION" - code = d.msgbox(text, title="Subscription Detail", ok_label="Back", extra_button=True, extra_label=extraLable, + extra_label = "DELETE SUBSCRIPTION" + code = d.msgbox(text, title="Subscription Detail", ok_label="Back", extra_button=True, extra_label=extra_label, width=75, height=30) # user wants to delete this subscription @@ -188,15 +191,15 @@ The following additional information is available: # api calls when canceling if code == "extra": os.system("clear") - if selectedSub['type'] == "letsencrypt-v1": + if selected_sub['type'] == "letsencrypt-v1": cmd = "python /home/admin/config.scripts/blitz.subscriptions.letsencrypt.py subscription-cancel {0}".format( - selectedSub['id']) + selected_sub['id']) print("# running: {0}".format(cmd)) os.system(cmd) time.sleep(2) - elif selectedSub['type'] == "ip2tor-v1": + elif selected_sub['type'] == "ip2tor-v1": cmd = "python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py subscription-cancel {0}".format( - selectedSub['id']) + selected_sub['id']) print("# running: {0}".format(cmd)) os.system(cmd) time.sleep(2) @@ -205,183 +208,188 @@ The following additional information is available: time.sleep(3) # loop until no more subscriptions or user chooses CANCEL on subscription list - mySubscriptions() + my_subscriptions() -####################### -# SSH MENU -####################### +def main(): + ####################### + # SSH MENU + ####################### -choices = list() -choices.append(("LIST", "My Subscriptions")) -choices.append(("NEW1", "+ IP2TOR Bridge (paid)")) -choices.append(("NEW2", "+ LetsEncrypt HTTPS Domain (free)")) - -d = Dialog(dialog="dialog", autowidgetsize=True) -d.set_background_title("RaspiBlitz Subscriptions") -code, tag = d.menu( - "\nCheck existing subscriptions or create new:", - choices=choices, width=50, height=10, title="Subscription Management") - -# if user chosses CANCEL -if code != d.OK: - sys.exit(0) - -####################### -# MANAGE SUBSCRIPTIONS -####################### - -if tag == "LIST": - mySubscriptions() - sys.exit(0) - -############################### -# NEW LETSENCRYPT HTTPS DOMAIN -############################### - -if tag == "NEW2": - # run creating a new IP2TOR subscription - os.system("clear") - cmd = "python /home/admin/config.scripts/blitz.subscriptions.letsencrypt.py create-ssh-dialog" - print("# running: {0}".format(cmd)) - os.system(cmd) - sys.exit(0) - -############################### -# NEW IP2TOR BRIDGE -############################### - -if tag == "NEW1": - - # check if Blitz is running behind TOR - cfg.reload() - if not cfg.run_behind_tor.value: - Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' -The IP2TOR service just makes sense if you run -your RaspiBlitz behind TOR. - ''', title="Info") - sys.exit(1) - - os.system("clear") - print("please wait ..") - - # check for which standard services already a active bridge exists - lnd_rest_api = False - lnd_grpc_api = False - lnbits = False - btcpay = False - try: - if os.path.isfile(SUBSCRIPTIONS_FILE): - os.system("sudo chown admin:admin {0}".format(SUBSCRIPTIONS_FILE)) - subs = toml.load(SUBSCRIPTIONS_FILE) - for sub in subs['subscriptions_ip2tor']: - if not sub['active']: - continue - if sub['active'] and sub['name'] == LND_REST_API: - lnd_rest_api = True - if sub['active'] and sub['name'] == LND_GRPC_API: - lnd_grpc_api = True - if sub['active'] and sub['name'] == LNBITS: - lnbits = True - if sub['active'] and sub['name'] == BTCPAY: - btcpay = True - except Exception as e: - print(e) - - # check if BTCPayserver is installed - btcPayServer = False - statusData = subprocess.run(['/home/admin/config.scripts/bonus.btcpayserver.sh', 'status'], - stdout=subprocess.PIPE).stdout.decode('utf-8').strip() - if statusData.find("installed=1") > -1: - btcPayServer = True - - # ask user for which RaspiBlitz service the bridge should be used choices = list() - choices.append(("REST", "LND REST API {0}".format("--> ALREADY BRIDGED" if lnd_rest_api else ""))) - choices.append(("GRPC", "LND gRPC API {0}".format("--> ALREADY BRIDGED" if lnd_grpc_api else ""))) - if cfg.lnbits: - choices.append(("LNBITS", "LNbits Webinterface {0}".format("--> ALREADY BRIDGED" if lnd_grpc_api else ""))) - if btcPayServer: - choices.append(("BTCPAY", "BTCPay Server Webinterface {0}".format("--> ALREADY BRIDGED" if btcpay else ""))) - choices.append(("SELF", "Create a custom IP2TOR Bridge")) + choices.append(("LIST", "My Subscriptions")) + choices.append(("NEW1", "+ IP2TOR Bridge (paid)")) + choices.append(("NEW2", "+ LetsEncrypt HTTPS Domain (free)")) d = Dialog(dialog="dialog", autowidgetsize=True) d.set_background_title("RaspiBlitz Subscriptions") code, tag = d.menu( - "\nChoose RaspiBlitz Service to create Bridge for:", - choices=choices, width=60, height=10, title="Select Service") + "\nCheck existing subscriptions or create new:", + choices=choices, width=50, height=10, title="Subscription Management") # if user chosses CANCEL if code != d.OK: sys.exit(0) - servicename = None - torAddress = None - torPort = None - if tag == "REST": - # get TOR address for REST - servicename = LND_REST_API - torAddress = subprocess.run(['sudo', 'cat', '/mnt/hdd/tor/lndrest8080/hostname'], - stdout=subprocess.PIPE).stdout.decode('utf-8').strip() - torPort = 8080 - if tag == "GRPC": - # get TOR address for GRPC - servicename = LND_GRPC_API - torAddress = subprocess.run(['sudo', 'cat', '/mnt/hdd/tor/lndrpc10009/hostname'], - stdout=subprocess.PIPE).stdout.decode('utf-8').strip() - torPort = 10009 - if tag == "LNBITS": - # get TOR address for LNBits - servicename = LNBITS - torAddress = subprocess.run(['sudo', 'cat', '/mnt/hdd/tor/lnbits/hostname'], - stdout=subprocess.PIPE).stdout.decode('utf-8').strip() - torPort = 443 - if tag == "BTCPAY": - # get TOR address for BTCPAY - servicename = BTCPAY - torAddress = subprocess.run(['sudo', 'cat', '/mnt/hdd/tor/btcpay/hostname'], - stdout=subprocess.PIPE).stdout.decode('utf-8').strip() - torPort = 443 - if tag == "SELF": - servicename = "CUSTOM" - try: - # get custom TOR address - code, text = d.inputbox( - "Enter TOR Onion-Address:", - height=10, width=60, init="", - title="IP2TOR Bridge Target") - text = text.strip() - os.system("clear") - if code != d.OK: - sys.exit(0) - if len(text) == 0: - sys.exit(0) - if text.find('.onion') < 0 or text.find(' ') > 0: - print("Not a TOR Onion Address") - time.sleep(3) - sys.exit(0) - torAddress = text - # get custom TOR port - code, text = d.inputbox( - "Enter TOR Port Number:", - height=10, width=40, init="80", - title="IP2TOR Bridge Target") - text = text.strip() - os.system("clear") - if code != d.OK: - sys.exit(0) - if len(text) == 0: - sys.exit(0) - torPort = int(text) - except Exception as e: - print(e) - time.sleep(3) + ####################### + # MANAGE SUBSCRIPTIONS + ####################### + + if tag == "LIST": + my_subscriptions() + sys.exit(0) + + ############################### + # NEW LETSENCRYPT HTTPS DOMAIN + ############################### + + if tag == "NEW2": + # run creating a new IP2TOR subscription + os.system("clear") + cmd = "python /home/admin/config.scripts/blitz.subscriptions.letsencrypt.py create-ssh-dialog" + print("# running: {0}".format(cmd)) + os.system(cmd) + sys.exit(0) + + ############################### + # NEW IP2TOR BRIDGE + ############################### + + if tag == "NEW1": + + # check if Blitz is running behind TOR + cfg.reload() + if not cfg.run_behind_tor.value: + Dialog(dialog="dialog", autowidgetsize=True).msgbox(''' + The IP2TOR service just makes sense if you run + your RaspiBlitz behind TOR. + ''', title="Info") sys.exit(1) - # run creating a new IP2TOR subscription - os.system("clear") - cmd = "python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py create-ssh-dialog {0} {1} {2}".format( - servicename, torAddress, torPort) - print("# running: {0}".format(cmd)) - os.system(cmd) - sys.exit(0) + os.system("clear") + print("please wait ..") + + # check for which standard services already a active bridge exists + lnd_rest_api = False + lnd_grpc_api = False + lnbits = False + btcpay = False + try: + if os.path.isfile(SUBSCRIPTIONS_FILE): + os.system("sudo chown admin:admin {0}".format(SUBSCRIPTIONS_FILE)) + subs = toml.load(SUBSCRIPTIONS_FILE) + for sub in subs['subscriptions_ip2tor']: + if not sub['active']: + continue + if sub['active'] and sub['name'] == SERVICE_LND_REST_API: + lnd_rest_api = True + if sub['active'] and sub['name'] == SERVICE_LND_GRPC_API: + lnd_grpc_api = True + if sub['active'] and sub['name'] == SERVICE_LNBITS: + lnbits = True + if sub['active'] and sub['name'] == SERVICE_BTCPAY: + btcpay = True + except Exception as e: + print(e) + + # check if BTCPayServer is installed + btc_pay_server = False + status_data = subprocess.run(['/home/admin/config.scripts/bonus.btcpayserver.sh', 'status'], + stdout=subprocess.PIPE).stdout.decode('utf-8').strip() + if status_data.find("installed=1") > -1: + btc_pay_server = True + + # ask user for which RaspiBlitz service the bridge should be used + choices = list() + choices.append(("REST", "LND REST API {0}".format("--> ALREADY BRIDGED" if lnd_rest_api else ""))) + choices.append(("GRPC", "LND gRPC API {0}".format("--> ALREADY BRIDGED" if lnd_grpc_api else ""))) + if cfg.lnbits: + choices.append(("LNBITS", "LNbits Webinterface {0}".format("--> ALREADY BRIDGED" if lnbits else ""))) + if btc_pay_server: + choices.append(("BTCPAY", "BTCPay Server Webinterface {0}".format("--> ALREADY BRIDGED" if btcpay else ""))) + choices.append(("SELF", "Create a custom IP2TOR Bridge")) + + d = Dialog(dialog="dialog", autowidgetsize=True) + d.set_background_title("RaspiBlitz Subscriptions") + code, tag = d.menu( + "\nChoose RaspiBlitz Service to create Bridge for:", + choices=choices, width=60, height=10, title="Select Service") + + # if user chosses CANCEL + if code != d.OK: + sys.exit(0) + + service_name = None + tor_address = None + tor_port = None + if tag == "REST": + # get TOR address for REST + service_name = SERVICE_LND_REST_API + tor_address = subprocess.run(['sudo', 'cat', '/mnt/hdd/tor/lndrest8080/hostname'], + stdout=subprocess.PIPE).stdout.decode('utf-8').strip() + tor_port = 8080 + if tag == "GRPC": + # get TOR address for GRPC + service_name = SERVICE_LND_GRPC_API + tor_address = subprocess.run(['sudo', 'cat', '/mnt/hdd/tor/lndrpc10009/hostname'], + stdout=subprocess.PIPE).stdout.decode('utf-8').strip() + tor_port = 10009 + if tag == "LNBITS": + # get TOR address for LNBits + service_name = SERVICE_LNBITS + tor_address = subprocess.run(['sudo', 'cat', '/mnt/hdd/tor/lnbits/hostname'], + stdout=subprocess.PIPE).stdout.decode('utf-8').strip() + tor_port = 443 + if tag == "BTCPAY": + # get TOR address for BTCPAY + service_name = SERVICE_BTCPAY + tor_address = subprocess.run(['sudo', 'cat', '/mnt/hdd/tor/btcpay/hostname'], + stdout=subprocess.PIPE).stdout.decode('utf-8').strip() + tor_port = 443 + if tag == "SELF": + service_name = "CUSTOM" + try: + # get custom TOR address + code, text = d.inputbox( + "Enter TOR Onion-Address:", + height=10, width=60, init="", + title="IP2TOR Bridge Target") + text = text.strip() + os.system("clear") + if code != d.OK: + sys.exit(0) + if len(text) == 0: + sys.exit(0) + if text.find('.onion') < 0 or text.find(' ') > 0: + print("Not a TOR Onion Address") + time.sleep(3) + sys.exit(0) + tor_address = text + # get custom TOR port + code, text = d.inputbox( + "Enter TOR Port Number:", + height=10, width=40, init="80", + title="IP2TOR Bridge Target") + text = text.strip() + os.system("clear") + if code != d.OK: + sys.exit(0) + if len(text) == 0: + sys.exit(0) + tor_port = int(text) + except Exception as e: + print(e) + time.sleep(3) + sys.exit(1) + + # run creating a new IP2TOR subscription + os.system("clear") + cmd = "python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py create-ssh-dialog {0} {1} {2}".format( + service_name, tor_address, tor_port) + print("# running: {0}".format(cmd)) + os.system(cmd) + sys.exit(0) + + +if __name__ == '__main__': + main() From 9eb7e3eab223ce3de1d26d36df0442a71a21cf34 Mon Sep 17 00:00:00 2001 From: frennkie Date: Sun, 19 Jul 2020 10:38:04 +0100 Subject: [PATCH 26/32] BlityPy: bump to 0.3.0 --- home.admin/BlitzPy/CHANGELOG.md | 4 ++++ home.admin/BlitzPy/blitzpy/version.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/home.admin/BlitzPy/CHANGELOG.md b/home.admin/BlitzPy/CHANGELOG.md index be32c0ce9..c3c2b0029 100644 --- a/home.admin/BlitzPy/CHANGELOG.md +++ b/home.admin/BlitzPy/CHANGELOG.md @@ -5,6 +5,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0] - 2020-07-19 +### Added +- add BlitzError Class + ## [0.2.0] - 2020-05-23 ### Added - add write() to BlitzPy config Classes diff --git a/home.admin/BlitzPy/blitzpy/version.py b/home.admin/BlitzPy/blitzpy/version.py index f2d8494e5..bb6b41a2d 100644 --- a/home.admin/BlitzPy/blitzpy/version.py +++ b/home.admin/BlitzPy/blitzpy/version.py @@ -4,5 +4,5 @@ # 3) we can import it into your module module """ -__version_info__ = ('0', '2', '0') +__version_info__ = ('0', '3', '0') __version__ = '.'.join(__version_info__) From 22021dc2dc1fe2ddd646877776ab2bf9017ab290 Mon Sep 17 00:00:00 2001 From: frennkie Date: Sun, 19 Jul 2020 10:38:41 +0100 Subject: [PATCH 27/32] BlityPy: bump to 0.3.0 --- .../dist/BlitzPy-0.3.0-py2.py3-none-any.whl | Bin 0 -> 6154 bytes home.admin/BlitzPy/dist/BlitzPy-0.3.0.tar.gz | Bin 0 -> 5063 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 home.admin/BlitzPy/dist/BlitzPy-0.3.0-py2.py3-none-any.whl create mode 100644 home.admin/BlitzPy/dist/BlitzPy-0.3.0.tar.gz diff --git a/home.admin/BlitzPy/dist/BlitzPy-0.3.0-py2.py3-none-any.whl b/home.admin/BlitzPy/dist/BlitzPy-0.3.0-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..504e533a3ca03700330f409b7a33d0ee7d52b86d GIT binary patch literal 6154 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 HIl#XFvZu)L literal 0 HcmV?d00001 diff --git a/home.admin/BlitzPy/dist/BlitzPy-0.3.0.tar.gz b/home.admin/BlitzPy/dist/BlitzPy-0.3.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a8955b48df485a887c1916897c7cd51ccc6982d1 GIT binary patch literal 5063 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 b?85mkJd$<)zeHcp^<#`o@rYoQVPO0pqCOmZ literal 0 HcmV?d00001 From 67bca00b0a2dfe4a162f1a963872b18bb78919c4 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 19 Jul 2020 17:05:35 +0200 Subject: [PATCH 28/32] #1340 allow lnbits to checkout master --- home.admin/config.scripts/bonus.lnbits.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/home.admin/config.scripts/bonus.lnbits.sh b/home.admin/config.scripts/bonus.lnbits.sh index 3bbdb5669..345564fce 100755 --- a/home.admin/config.scripts/bonus.lnbits.sh +++ b/home.admin/config.scripts/bonus.lnbits.sh @@ -184,7 +184,13 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then cd /home/lnbits sudo -u lnbits git clone https://github.com/lnbits/lnbits.git cd /home/lnbits/lnbits - sudo -u lnbits git checkout tags/raspiblitz + if [ "$2" == "latest" ]; then + echo "# checking out master branch" + sudo -u lnbits git checkout + else + echo "# checking out tag 'raspiblitz'" + sudo -u lnbits git checkout tags/raspiblitz + fi # prepare .env file echo "# preparing env file" From 7b9ffd2e7eb91615e2de1e421e3025cc5cc07ceb Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 19 Jul 2020 17:06:36 +0200 Subject: [PATCH 29/32] change name --- home.admin/config.scripts/bonus.lnbits.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/config.scripts/bonus.lnbits.sh b/home.admin/config.scripts/bonus.lnbits.sh index 345564fce..07f78d601 100755 --- a/home.admin/config.scripts/bonus.lnbits.sh +++ b/home.admin/config.scripts/bonus.lnbits.sh @@ -184,7 +184,7 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then cd /home/lnbits sudo -u lnbits git clone https://github.com/lnbits/lnbits.git cd /home/lnbits/lnbits - if [ "$2" == "latest" ]; then + if [ "$2" == "master" ]; then echo "# checking out master branch" sudo -u lnbits git checkout else From 387d1613d36256532a6f93a20fd7c385c200e598 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 19 Jul 2020 17:40:22 +0200 Subject: [PATCH 30/32] fix permission --- home.admin/config.scripts/internet.hiddenservice.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.admin/config.scripts/internet.hiddenservice.sh b/home.admin/config.scripts/internet.hiddenservice.sh index 8464b9761..60c1edade 100644 --- a/home.admin/config.scripts/internet.hiddenservice.sh +++ b/home.admin/config.scripts/internet.hiddenservice.sh @@ -77,7 +77,7 @@ HiddenServiceDir /mnt/hdd/tor/$service HiddenServiceVersion 3 HiddenServicePort $toPort 127.0.0.1:$fromPort" | sudo tee -a /etc/tor/torrc # remove double lines - sudo awk 'NF > 0 {blank=0} NF == 0 {blank++} blank < 2' /etc/tor/torrc > .tmp && sudo mv .tmp /etc/tor/torrc + sudo awk 'NF > 0 {blank=0} NF == 0 {blank++} blank < 2' /etc/tor/torrc > /mnt/hdd/temp/tmp && sudo mv /mnt/hdd/temp/tmp /etc/tor/torrc # check and insert second port pair if [ ${#toPort2} -gt 0 ]; then From 62dd468e80820924c91434bd953b6aff99b60595 Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 19 Jul 2020 17:56:00 +0200 Subject: [PATCH 31/32] add autmatic start --- home.admin/config.scripts/bonus.lnbits.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/home.admin/config.scripts/bonus.lnbits.sh b/home.admin/config.scripts/bonus.lnbits.sh index 07f78d601..fe9270636 100755 --- a/home.admin/config.scripts/bonus.lnbits.sh +++ b/home.admin/config.scripts/bonus.lnbits.sh @@ -252,7 +252,13 @@ WantedBy=multi-user.target EOF sudo systemctl enable lnbits - echo "# OK - service needs starting: sudo systemctl start lnbits" + + source /home/admin/raspiblitz.info + if [ "${state}" == "ready" ]; then + sudo systemctl start lnbits + else + echo "# OK - lnbits service is enabled, but needs reboot or manual starting: sudo systemctl start lnbits" + fi else echo "LNbits already installed." From 22d26e8d5900d65633565c81d8a13389edb99bee Mon Sep 17 00:00:00 2001 From: rootzoll Date: Sun, 19 Jul 2020 17:56:39 +0200 Subject: [PATCH 32/32] automated starting --- home.admin/config.scripts/bonus.lnbits.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/home.admin/config.scripts/bonus.lnbits.sh b/home.admin/config.scripts/bonus.lnbits.sh index fe9270636..9433dc402 100755 --- a/home.admin/config.scripts/bonus.lnbits.sh +++ b/home.admin/config.scripts/bonus.lnbits.sh @@ -255,6 +255,7 @@ EOF source /home/admin/raspiblitz.info if [ "${state}" == "ready" ]; then + echo "# OK - lnbits service is enabled, system is on ready so starting lnbits service" sudo systemctl start lnbits else echo "# OK - lnbits service is enabled, but needs reboot or manual starting: sudo systemctl start lnbits"