raspiblitz/home.admin/_background.sh

326 lines
12 KiB
Bash
Raw Normal View History

2018-12-11 13:15:15 +01:00
#!/bin/bash
# This script runs on after start in background
# as a service and gets restarted on failure
# it runs ALMOST every seconds
# INFOFILE - state data from bootstrap
infoFile="/home/admin/raspiblitz.info"
# CONFIGFILE - configuration of RaspiBlitz
configFile="/mnt/hdd/raspiblitz.conf"
2018-12-23 14:20:13 +01:00
# LOGS see: sudo journalctl -f -u background
2018-12-11 13:15:15 +01:00
# Check if HDD contains configuration
configExists=$(ls ${configFile} | grep -c '.conf')
if [ ${configExists} -eq 1 ]; then
source ${configFile}
2019-02-02 23:49:04 +01:00
else
source ${infoFile}
2018-12-11 13:15:15 +01:00
fi
2018-12-23 14:31:58 +01:00
echo "_background.sh STARTED"
2018-12-11 13:15:15 +01:00
counter=0
while [ 1 ]
do
###############################
# Prepare this loop
###############################
# count up
counter=$(($counter+1))
2018-12-22 16:44:15 +01:00
# gather the uptime seconds
upSeconds=$(cat /proc/uptime | grep -o '^[0-9]\+')
2018-12-11 13:15:15 +01:00
####################################################
# RECHECK DHCP-SERVER
# https://github.com/rootzoll/raspiblitz/issues/160
####################################################
# every 5 minutes
2018-12-11 13:33:22 +01:00
recheckDHCP=$((($counter % 300)+1))
2018-12-11 13:35:00 +01:00
if [ ${recheckDHCP} -eq 1 ]; then
2018-12-11 13:15:15 +01:00
echo "*** RECHECK DHCP-SERVER ***"
# get the local network IP
localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')
echo "localip(${localip})"
# detect a missing DHCP config
if [ "${localip:0:4}" = "169." ]; then
echo "Missing DHCP detected ... trying emergency reboot"
sudo shutdown -r now
else
echo "DHCP OK"
fi
fi
2019-03-15 15:43:16 +01:00
####################################################
# CHECK FOR UNDERVOLTAGE REPORTS
# every 1 hour scan for undervoltage reports
####################################################
recheckUndervoltage=$(($counter % 3600))
if [ ${recheckUndervoltage} -eq 1 ]; then
echo "*** RECHECK UNDERVOLTAGE ***"
countReports=$(sudo cat /var/log/syslog | grep -c "Under-voltage detected!")
echo "${countReports} undervoltage reports found in syslog"
if [ ${#undervoltageReports} -eq 0 ]; then
# write new value to info file
undervoltageReports="${countReports}"
echo "undervoltageReports=${undervoltageReports}" >> ${infoFile}
else
# update value in info file
sed -i "s/^undervoltageReports=.*/undervoltageReports=${countReports}/g" ${infoFile}
fi
fi
2018-12-11 13:15:15 +01:00
####################################################
# RECHECK PUBLIC IP
# when public IP changes, restart LND with new IP
####################################################
# every 15min - not too often
# because its a ping to external service
2019-03-14 14:19:00 +01:00
recheckPublicIP=$((($counter % 900)+1))
2019-04-03 02:58:10 +01:00
# prevent when lndAddress is set
if [ ${#lndAddress} -gt 3 ]; then
recheckPublicIP=0
fi
2018-12-13 21:59:58 +01:00
updateDynDomain=0
2018-12-11 13:35:00 +01:00
if [ ${recheckPublicIP} -eq 1 ]; then
2018-12-11 13:15:15 +01:00
echo "*** RECHECK PUBLIC IP ***"
# execute only after setup when config exists
if [ ${configExists} -eq 1 ]; then
# get actual public IP
freshPublicIP=$(curl -s http://v4.ipv6-test.com/api/myip.php 2>/dev/null)
2019-03-14 13:54:45 +01:00
# sanity check on IP data
# see https://github.com/rootzoll/raspiblitz/issues/371#issuecomment-472416349
2019-04-09 23:32:14 +01:00
echo "-> sanity check of new IP data"
2019-03-14 14:08:20 +01:00
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
2019-03-14 13:54:45 +01:00
echo "OK IPv6"
2019-03-14 14:08:20 +01:00
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"
2019-03-14 13:54:45 +01:00
else
echo "FAIL - not an IPv4 or IPv6 address"
freshPublicIP=""
fi
2019-01-21 21:40:48 +01:00
if [ ${#freshPublicIP} -eq 0 ]; then
echo "freshPublicIP is ZERO - ignoring"
2018-12-11 13:15:15 +01:00
# check if changed
2019-01-21 21:40:48 +01:00
elif [ "${freshPublicIP}" != "${publicIP}" ]; then
2018-12-11 13:15:15 +01:00
# 1) update config file
echo "update config value"
2019-04-03 02:58:10 +01:00
sed -i "s/^publicIP=.*/publicIP='${freshPublicIP}'/g" ${configFile}
publicIP='${freshPublicIP}'
2018-12-11 13:15:15 +01:00
2018-12-22 16:44:15 +01:00
# 2) only restart LND if dynDNS is activated
# because this signals that user wants "public node"
if [ ${#dynDomain} -gt 0 ]; then
echo "restart LND with new environment config"
# restart and let to auto-unlock (if activated) do the rest
sudo systemctl restart lnd.service
fi
2018-12-11 13:15:15 +01:00
2018-12-22 16:44:15 +01:00
# 2) trigger update if dnyamic domain (if set)
2018-12-13 21:59:58 +01:00
updateDynDomain=1
2018-12-11 13:15:15 +01:00
else
echo "public IP has not changed"
fi
else
echo "skip - because setup is still running"
fi
fi
2019-04-15 12:31:28 +01:00
2019-04-15 14:59:53 +01:00
###############################
# SCB Monitoring
###############################
# check every 1min
recheckSCB=$(($counter % 60))
if [ ${recheckSCB} -eq 1 ]; then
2019-04-17 04:44:05 +01:00
#echo "SCB Monitoring ..."
2019-04-15 18:45:16 +01:00
source ${configFile}
2019-04-15 14:59:53 +01:00
# check if channel.backup exists
scbExists=$(sudo ls /mnt/hdd/lnd/data/chain/${network}/${chain}net/channel.backup 2>/dev/null | grep -c 'channel.backup')
if [ ${scbExists} -eq 1 ]; then
2019-04-17 04:44:05 +01:00
#echo "Found Channel Backup File .. check if changed .."
2019-04-15 14:59:53 +01:00
md5checksumORG=$(sudo md5sum /mnt/hdd/lnd/data/chain/${network}/${chain}net/channel.backup 2>/dev/null | head -n1 | cut -d " " -f1)
md5checksumCPY=$(sudo md5sum /home/admin/.lnd/data/chain/${network}/${chain}net/channel.backup 2>/dev/null | head -n1 | cut -d " " -f1)
if [ "${md5checksumORG}" != "${md5checksumCPY}" ]; then
echo "--> Channel Backup File changed"
2019-04-15 18:45:16 +01:00
# make copy to sd card (as local basic backup)
2019-04-15 14:59:53 +01:00
sudo mkdir -p /home/admin/.lnd/data/chain/${network}/${chain}net/ 2>/dev/null
2019-04-15 19:27:42 +01:00
sudo cp /mnt/hdd/lnd/data/chain/${network}/${chain}net/channel.backup /home/admin/.lnd/data/chain/${network}/${chain}net/channel.backup
2019-04-15 14:59:53 +01:00
echo "OK channel.backup copied to '/home/admin/.lnd/data/chain/${network}/${chain}net/channel.backup'"
2019-04-15 18:45:16 +01:00
# check if a SCP backup target is set
# paramter in raspiblitz.conf:
2019-04-15 19:54:07 +01:00
# scpBackupTarget='[USER]@[SERVER]:[DIRPATH-WITHOUT-ENDING-/]'
2019-04-15 18:45:16 +01:00
# On target server add the public key of your RaspiBlitz to the authorized_keys for the user
# https://www.linode.com/docs/security/authentication/use-public-key-authentication-with-ssh/
if [ ${#scpBackupTarget} -gt 0 ]; then
echo "--> Offsite-Backup SCP Server"
2019-04-16 02:10:58 +01:00
# its ok to ignore known host, because data is encrypted (worst case of MiM would be: no offsite channel backup)
# but its more likely that whithout ignoriing known host, script might not run thru and that way: no offsite channel backup
sudo scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null /home/admin/.lnd/data/chain/${network}/${chain}net/channel.backup ${scpBackupTarget}/channel.backup
2019-04-15 19:37:41 +01:00
result=$?
if [ ${result} -eq 0 ]; then
echo "OK - SCP Backup exited with 0"
else
echo "FAIL - SCP Backup exited with ${result}"
fi
2019-04-15 18:45:16 +01:00
fi
# check if a DropBox backup target is set
# paramter in raspiblitz.conf:
# dropboxBackupTarget='[DROPBOX-APP-OAUTH2-TOKEN]'
# see dropbox setup: https://gist.github.com/vindard/e0cd3d41bb403a823f3b5002488e3f90
if [ ${#dropboxBackupTarget} -gt 0 ]; then
echo "--> Offsite-Backup Dropbox"
source <(sudo /home/admin/config.scripts/dropbox.upload.sh upload ${dropboxBackupTarget} /home/admin/.lnd/data/chain/${network}/${chain}net/channel.backup)
if [ ${#err} -gt 0 ]; then
2019-04-15 19:37:41 +01:00
echo "FAIL - ${err}"
2019-04-15 18:45:16 +01:00
echo "${errMore}"
else
2019-04-15 19:37:41 +01:00
echo "OK - ${upload}"
2019-04-15 18:45:16 +01:00
fi
fi
2019-04-17 04:44:05 +01:00
#else
# echo "Channel Backup File not changed."
2019-04-15 14:59:53 +01:00
fi
2019-04-17 04:44:05 +01:00
#else
# echo "No Channel Backup File .."
2019-04-15 14:59:53 +01:00
fi
fi
2018-12-13 21:59:58 +01:00
###############################
2018-12-22 16:44:15 +01:00
# LND AUTO-UNLOCK
###############################
# check every 10secs
recheckAutoUnlock=$((($counter % 10)+1))
if [ ${recheckAutoUnlock} -eq 1 ]; then
# check if auto-unlock feature if activated
if [ "${autoUnlock}" = "on" ]; then
# check if lnd is locked
locked=$(sudo -u bitcoin /usr/local/bin/lncli --chain=${network} --network=${chain}net getinfo 2>&1 | grep -c unlock)
if [ ${locked} -gt 0 ]; then
2018-12-23 15:47:01 +01:00
echo "STARTING AUTO-UNLOCK ..."
2018-12-23 22:11:21 +01:00
# building REST command
2019-01-18 00:46:32 +01:00
passwordC=$(sudo cat /root/lnd.autounlock.pwd)
2019-01-18 01:00:33 +01:00
command="sudo python /home/admin/config.scripts/lnd.unlock.py '${passwordC}'"
2019-01-18 01:55:38 +01:00
bash -c "${command}"
2019-04-03 03:01:11 +01:00
2018-12-22 16:44:15 +01:00
fi
fi
fi
###############################
2018-12-13 21:59:58 +01:00
# UPDATE DYNAMIC DOMAIN
# like afraid.org
2018-12-13 23:09:16 +01:00
# ! experimental
2018-12-13 21:59:58 +01:00
###############################
2018-12-13 23:08:23 +01:00
# if not activated above, update every 6 hours
2018-12-13 22:33:02 +01:00
if [ ${updateDynDomain} -eq 0 ]; then
2018-12-13 21:59:58 +01:00
# dont +1 so that it gets executed on first loop
2018-12-13 23:08:23 +01:00
updateDynDomain=$(($counter % 21600))
2018-12-13 21:59:58 +01:00
fi
if [ ${updateDynDomain} -eq 1 ]; then
echo "*** UPDATE DYNAMIC DOMAIN ***"
# check if update URL for dyn Domain is set
2019-01-18 23:44:49 +01:00
if [ ${#dynUpdateUrl} -gt 6 ]; then
2018-12-13 21:59:58 +01:00
# calling the update url
echo "calling: ${dynUpdateUrl}"
echo "to update domain: ${dynDomain}"
curl --connect-timeout 6 ${dynUpdateUrl}
else
echo "'dynUpdateUrl' not set in ${configFile}"
fi
fi
2019-08-08 02:15:44 +02:00
####################################################
# CHECK FOR END OF IBD (self validation)
####################################################
# check every 60secs
recheckIBD=$((($counter % 60)+1))
if [ ${recheckIBD} -eq 1 ]; then
# check if flag exists (got created on 50syncHDD.sh)
flagExists=$(ls /home/admin/selfsync.flag 2>/dev/null | grep -c "selfsync.flag")
if [ ${flagExists} -eq 1 ]; then
2019-08-09 10:26:11 +02:00
finishedIBD=$(sudo -u bitcoin ${network}-cli getblockchaininfo --chain=${network} --network=${chain}net | grep "initialblockdownload" | grep -c "false")
2019-08-08 02:15:44 +02:00
if [ ${finishedIBD} -eq 1 ]; then
2019-08-08 17:41:58 +02:00
echo "CHECK FOR END OF IBD --> reduce RAM, check TOR and restart ${network}d"
2019-08-08 02:19:26 +02:00
2019-08-08 02:15:44 +02:00
# remove flag
rm /home/admin/selfsync.flag
# stop bitcoind
2019-08-08 02:19:26 +02:00
sudo systemctl stop ${network}d
2019-08-08 02:15:44 +02:00
# set dbcache back to normal (to give room for other apps)
kbSizeRAM=$(cat /proc/meminfo | grep "MemTotal" | sed 's/[^0-9]*//g')
if [ ${kbSizeRAM} -gt 1500000 ]; then
echo "Detected RAM >1GB --> optimizing ${network}.conf"
2019-08-08 20:31:43 +02:00
sudo sed -i "s/^dbcache=.*/dbcache=512/g" /mnt/hdd/${network}/${network}.conf
2019-08-08 02:15:44 +02:00
else
echo "Detected RAM 1GB --> optimizing ${network}.conf"
sudo sed -i "s/^dbcache=.*/dbcache=128/g" /mnt/hdd/${network}/${network}.conf
fi
2019-08-08 17:41:58 +02:00
# if TOR was activated during setup make sure bitcoin runs behind TOR latest from now on
if [ "${runBehindTor}" = "on" ]; then
echo "TOR is ON -> make sure bitcoin is running behind TOR after IBD"
/home/admin/config.scripts/internet.tor.sh btcconf-on
else
echo "TOR is OFF after IBD"
fi
2019-08-08 02:15:44 +02:00
# restart bitcoind
2019-08-08 02:19:26 +02:00
sudo systemctl start ${network}d
2019-08-08 02:15:44 +02:00
fi
fi
fi
2018-12-11 13:15:15 +01:00
###############################
# Prepare next loop
###############################
# sleep 1 sec
sleep 1
# limit counter to max seconds per week:
# 604800 = 60sec * 60min * 24hours * 7days
2018-12-13 23:08:23 +01:00
if [ ${counter} -gt 604800 ]; then
2018-12-11 13:15:15 +01:00
counter=0
echo "counter zero reset"
fi
done