diff --git a/home.admin/40addHDD.sh b/home.admin/40addHDD.sh index 864e92a5d..b2733689e 100755 --- a/home.admin/40addHDD.sh +++ b/home.admin/40addHDD.sh @@ -87,7 +87,7 @@ if [ ${existsHDD} -gt 0 ]; then echo "WARNING: No publicIP information at all yet - working with placeholder : ${localIP}" freshPublicIP="${localIP}" fi - echo "publicIP=${freshPublicIP}" >> $configFile + echo "publicIP='${freshPublicIP}'" >> $configFile fi diff --git a/home.admin/_background.sh b/home.admin/_background.sh index 35204b5d8..ed785f320 100644 --- a/home.admin/_background.sh +++ b/home.admin/_background.sh @@ -87,6 +87,10 @@ do # every 15min - not too often # because its a ping to external service recheckPublicIP=$((($counter % 900)+1)) + # prevent when lndAddress is set + if [ ${#lndAddress} -gt 3 ]; then + recheckPublicIP=0 + fi updateDynDomain=0 if [ ${recheckPublicIP} -eq 1 ]; then echo "*** RECHECK PUBLIC IP ***" @@ -120,8 +124,8 @@ do # 1) update config file echo "update config value" - sed -i "s/^publicIP=.*/publicIP=${freshPublicIP}/g" ${configFile} - publicIP=${freshPublicIP} + sed -i "s/^publicIP=.*/publicIP='${freshPublicIP}'/g" ${configFile} + publicIP='${freshPublicIP}' # 2) only restart LND if dynDNS is activated # because this signals that user wants "public node" diff --git a/home.admin/_bootstrap.sh b/home.admin/_bootstrap.sh index 456b5eb8f..66ef54973 100644 --- a/home.admin/_bootstrap.sh +++ b/home.admin/_bootstrap.sh @@ -302,38 +302,65 @@ echo "Check if HDD contains configuration .." >> $logFile configExists=$(ls ${configFile} | grep -c '.conf') if [ ${configExists} -eq 1 ]; then + # make sure lndAddress & lndPort exist + valueExists=$(cat ${configFile} | grep -c 'lndPort=') + if [ ${valueExists} -eq 0 ]; then + lndPort=$(sudo cat /mnt/hdd/lnd/lnd.conf | grep "^listen=*" | cut -f2 -d':') + if [ ${#lndPort} -eq 0 ]; then + lndPort="9735" + fi + echo "lndPort='${lndPort}'" >> ${configFile} + fi + valueExists=$(cat ${configFile} | grep -c 'lndAddress=') + if [ ${valueExists} -eq 0 ]; then + echo "lndAddress=''" >> ${configFile} + fi + # load values echo "load and update publicIP" >> $logFile source ${configFile} + freshPublicIP="" + + # determine the publicIP/domain that LND should announce + if [ ${#lndAddress} -gt 3 ]; then - # update public IP on boot - # wait otherwise looking for publicIP fails - sleep 5 - freshPublicIP=$(curl -s http://v4.ipv6-test.com/api/myip.php) + # use domain as PUBLICIP + freshPublicIP="${lndAddress}" - # sanity check on IP data - # see https://github.com/rootzoll/raspiblitz/issues/371#issuecomment-472416349 - echo "-> sanity check of IP data: ${freshPublicIP}" - if [[ $freshPublicIP =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then - echo "OK IPv6" - elif [[ $freshPublicIP =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then - echo "OK IPv4" else - echo "FAIL - not an IPv4 or IPv6 address" - freshPublicIP="" + + # update public IP on boot + # wait otherwise looking for publicIP fails + sleep 5 + freshPublicIP=$(curl -s http://v4.ipv6-test.com/api/myip.php) + + # sanity check on IP data + # see https://github.com/rootzoll/raspiblitz/issues/371#issuecomment-472416349 + echo "-> sanity check of IP data: ${freshPublicIP}" + if [[ $freshPublicIP =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then + echo "OK IPv6" + elif [[ $freshPublicIP =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then + echo "OK IPv4" + else + echo "FAIL - not an IPv4 or IPv6 address" + freshPublicIP="" + fi + + if [ ${#freshPublicIP} -eq 0 ]; then + # prevent having no publicIP set at all and LND getting stuck + # https://github.com/rootzoll/raspiblitz/issues/312#issuecomment-462675101 + if [ ${#publicIP} -eq 0 ]; then + localIP=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') + echo "WARNING: No publicIP information at all - working with placeholder: ${localIP}" >> $logFile + freshPublicIP="${localIP}" + fi + fi + fi + # set publicip value in raspiblitz.conf if [ ${#freshPublicIP} -eq 0 ]; then - # prevent having no publicIP set at all and LND getting stuck - # https://github.com/rootzoll/raspiblitz/issues/312#issuecomment-462675101 - if [ ${#publicIP} -eq 0 ]; then - localIP=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') - echo "WARNING: No publicIP information at all - working with placeholder: ${localIP}" >> $logFile - freshPublicIP="${localIP}" - fi - fi - if [ ${#freshPublicIP} -eq 0 ]; then - echo "WARNING: Was not able to determine external IP on startup." >> $logFile + echo "WARNING: Was not able to determine external IP/domain on startup." >> $logFile else publicIPValueExists=$( sudo cat ${configFile} | grep -c 'publicIP=' ) if [ ${publicIPValueExists} -gt 1 ]; then @@ -344,10 +371,10 @@ if [ ${configExists} -eq 1 ]; then fi if [ ${publicIPValueExists} -eq 0 ]; then echo "create value (${freshPublicIP})" >> $logFile - echo "publicIP=${freshPublicIP}" >> $configFile + echo "publicIP='${freshPublicIP}'" >> $configFile else echo "update value (${freshPublicIP})" >> $logFile - sed -i "s/^publicIP=.*/publicIP=${freshPublicIP}/g" ${configFile} + sed -i "s/^publicIP=.*/publicIP='${freshPublicIP}'/g" ${configFile} fi fi diff --git a/home.admin/assets/lnd.service b/home.admin/assets/lnd.service index 6af4d7a5c..5d4425536 100644 --- a/home.admin/assets/lnd.service +++ b/home.admin/assets/lnd.service @@ -10,7 +10,7 @@ After=bitcoind.service [Service] EnvironmentFile=/mnt/hdd/raspiblitz.conf -ExecStart=/usr/local/bin/lnd --externalip=${publicIP} +ExecStart=/usr/local/bin/lnd --externalip=${publicIP}:{lndPort} PIDFile=/home/bitcoin/.lnd/lnd.pid User=bitcoin Group=bitcoin diff --git a/home.admin/config.scripts/internet.sshtunnel.py b/home.admin/config.scripts/internet.sshtunnel.py index c684bc93c..7e19fe1b1 100755 --- a/home.admin/config.scripts/internet.sshtunnel.py +++ b/home.admin/config.scripts/internet.sshtunnel.py @@ -37,6 +37,11 @@ StandardOutput=journal WantedBy=multi-user.target """ +# get LND port form lnd.conf +LNDPORT = subprocess.getoutput("sudo cat /mnt/hdd/lnd/lnd.conf | grep '^listen=*' | cut -f2 -d':'") +if len(LNDPORT) == 0: + LNDPORT="9735" + # # RESTORE = SWITCHING ON with restore flag on # on restore other external scripts dont need calling @@ -93,6 +98,11 @@ if sys.argv[1] == "on": if port_external.isdigit() == False: print("[INTERNAL-PORT]<[EXTERNAL-PORT] external not number '%s'" % (sys.argv[i])) sys.exit(1) + if port_internal == LNDPORT: + if port_internal != port_external: + print("FAIL: When tunneling your local LND port '%s' it needs to be the same on the external server, but is '%s'" % (LNDPORT,port_external)) + print("Try again by using the same port. If you cant change the external port, change local LND port with: /home/config.scripts/lnd.setport.sh") + sys.exit(1) ssh_ports = ssh_ports + "\"%s\" " % (sys.argv[i]) additional_parameters= additional_parameters + "-R %s:localhost:%s " % (port_external,port_internal) @@ -140,6 +150,9 @@ if sys.argv[1] == "on": if file_content.count("sshtunnel=") == 0: file_content = file_content+"\nsshtunnel=''" file_content = re.sub("sshtunnel=.*", "sshtunnel='%s %s'" % (ssh_server, ssh_ports), file_content) + if restoringOnUpdate == False: + serverdomain=ssh_server.split("@")[1] + file_content = re.sub("lndAddress=.*", "lndAddress='%s'" % (serverdomain), file_content) file_content = "".join([s for s in file_content.splitlines(True) if s.strip("\r\n")]) + "\n" print(file_content) with open("/mnt/hdd/raspiblitz.conf", "w") as text_file: @@ -189,6 +202,7 @@ elif sys.argv[1] == "off": with open('/mnt/hdd/raspiblitz.conf') as f: file_content = f.read() file_content = re.sub("sshtunnel=.*", "", file_content) + file_content = re.sub("lndAddress=.*", "lndAddress=''", file_content) file_content = re.sub("\n\n", "\n", file_content) print(file_content) with open("/mnt/hdd/raspiblitz.conf", "w") as text_file: diff --git a/home.admin/config.scripts/lnd.setport.sh b/home.admin/config.scripts/lnd.setport.sh index 3b6755830..c3c8d90d1 100644 --- a/home.admin/config.scripts/lnd.setport.sh +++ b/home.admin/config.scripts/lnd.setport.sh @@ -64,18 +64,18 @@ echo "change port in lnd config" sudo sed -i "s/^listen=.*/listen=0.0.0.0:${portnumber}/g" /mnt/hdd/lnd/lnd.conf # add to raspiblitz.config (so it can survive update) -valueExists=$(sudo cat /mnt/hdd/raspiblitz.conf | grep -c 'customPortLND=') +valueExists=$(sudo cat /mnt/hdd/raspiblitz.conf | grep -c 'lndPort=') if [ ${valueExists} -eq 0 ]; then # add as new value - echo "customPortLND=${portnumber}" >> /mnt/hdd/raspiblitz.conf + echo "lndPort=${portnumber}" >> /mnt/hdd/raspiblitz.conf else # update existing value - sudo sed -i "s/^customPortLND=.*/customPortLND=${portnumber}/g" /mnt/hdd/raspiblitz.conf + sudo sed -i "s/^lndPort=.*/lndPort=${portnumber}/g" /mnt/hdd/raspiblitz.conf fi # editing service file echo "editing /etc/systemd/system/lnd.service" -sudo sed -i "s/^ExecStart=\/usr\/local\/bin\/lnd.*/ExecStart=\/usr\/local\/bin\/lnd --externalip=\${publicIP}:${portnumber}/g" /etc/systemd/system/lnd.service +sudo sed -i "s/^ExecStart=\/usr\/local\/bin\/lnd.*/ExecStart=\/usr\/local\/bin\/lnd --externalip=\${publicIP}:\${lndPort}/g" /etc/systemd/system/lnd.service # enable service again echo "enable service again"