raspiblitz/home.admin/99lndRepairMenu.sh
2022-05-05 10:59:50 +02:00

524 lines
18 KiB
Bash

#!/bin/bash
# get raspiblitz config
echo "# get raspiblitz config"
source /home/admin/raspiblitz.info
source /mnt/hdd/raspiblitz.conf
source <(/home/admin/config.scripts/network.aliases.sh getvars lnd $1)
sudo mkdir /var/cache/raspiblitz/temp 2>/dev/null
if ! pip list | grep grpc; then sudo -H python3 -m pip install grpcio==1.38.1; fi
askLNDbackupCopy()
{
whiptail --title "LND Data Backup" --yes-button "Backup" --no-button "Skip" --yesno "
Before deleting your data, do you want
to make a backup of all your LND Data
and download the file(s) to your laptop?
Download LND Data Backup now?
" 12 44
if [ $? -eq 0 ]; then
clear
echo "***********************************"
echo "* PREPARING THE LND BACKUP DOWNLOAD"
echo "***********************************"
echo "please wait .."
/home/admin/config.scripts/lnd.compact.sh interactive
/home/admin/config.scripts/lnd.backup.sh lnd-export-gui
echo
echo "PRESS ENTER to continue once you're done downloading."
read key
else
clear
echo "*************************************"
echo "* JUST MAKING A BACKUP TO THE SD CARD"
echo "*************************************"
echo "please wait .."
sleep 2
/home/admin/config.scripts/lnd.backup.sh lnd-export
sleep 3
fi
}
getpasswordC() # from dialogPasswords.sh
{
# temp file for password results
_temp="/var/cache/raspiblitz/temp/.temp.tmp"
sudo /home/admin/config.scripts/blitz.passwords.sh set x "PASSWORD C - Lightning Wallet Password" $_temp
passwordC=$(sudo cat $_temp)
sudo rm $_temp
dialog --backtitle "RaspiBlitz - Setup" --msgbox "\nThanks - Password C accepted.\n\nAlways use this password to \nunlock your Lightning Wallet." 10 34
}
lndHealthCheck()
{
# check that lnd started
lndRunning=0
loopcount=0
while [ ${lndRunning} -eq 0 ]
do
lndRunning=$(systemctl status ${netprefix}lnd.service | grep -c running)
if [ ${lndRunning} -eq 0 ]; then
date +%s
echo "LND not ready yet ... waiting another 60 seconds."
sleep 10
fi
loopcount=$(($loopcount +1))
if [ ${loopcount} -gt 100 ]; then
echo "lnd-start-fail" "lnd service not getting to running status" "sudo systemctl status ${netprefix}lnd.service | grep -c running --> ${lndRunning}"
exit 8
fi
done
echo "OK - LND is running"
sleep 10
# Check LND health/fails (to be extended)
tlsExists=$(ls /mnt/hdd/lnd/tls.cert 2>/dev/null | grep -c "tls.cert")
if [ ${tlsExists} -eq 0 ]; then
echo "lnd-no-tls" "lnd not created TLS cert" "no /mnt/hdd/lnd/tls.cert"
exit 9
fi
}
syncAndCheckLND() # from _provision.setup.sh
{
# make sure all directories are linked
sudo /home/admin/config.scripts/blitz.datadrive.sh link
# check if now a config exists
configLinkedCorrectly=$(ls /home/bitcoin/.lnd/${netprefix}lnd.conf | grep -c "${netprefix}lnd.conf")
if [ "${configLinkedCorrectly}" != "1" ]; then
echo "lnd-link-broken" "link /home/bitcoin/.lnd/${netprefix}lnd.conf broken" ""
exit 7
fi
# Init LND service & start
echo "*** Init LND Service & Start ***"
/home/admin/_cache.sh set message "LND Testrun"
# just in case
sudo systemctl stop ${netprefix}lnd 2>/dev/null
sudo systemctl disable ${netprefix}lnd 2>/dev/null
# copy lnd service - note the same service is created with 'lnd.install.sh on mainnet'
sudo cp /home/admin/assets/lnd.service /etc/systemd/system/lnd.service
# start lnd up
echo "Starting LND Service ..."
sudo systemctl enable ${netprefix}lnd
sudo systemctl start ${netprefix}lnd
echo "Starting LND Service ... executed"
if [ $(sudo -u bitcoin ls /mnt/hdd/lnd/data/chain/bitcoin/${chain}net/wallet.db 2>/dev/null | grep -c wallet.db) -gt 0 ]; then
echo "# OK, there is an LND wallet present"
else
echo "lnd-no-wallet" "there is no LND wallet present" "/mnt/hdd/lnd/data/chain/bitcoin/${chain}net/wallet.db --> missing"
exit 13
fi
# sync macaroons & TLS to other users
echo "*** Copy LND Macaroons to user admin ***"
/home/admin/_cache.sh set message "LND Credentials"
# check if macaroon exists now - if not fail
attempt=0
while [ $(sudo -u bitcoin ls -la /home/bitcoin/.lnd/data/chain/${network}/${chain}net/admin.macaroon 2>/dev/null | grep -c admin.macaroon) -eq 0 ]; do
echo "Waiting 2 mins for LND to create macaroons ... (${attempt}0s)"
sleep 10
attempt=$((attempt+1))
if [ $attempt -eq 12 ];then
/home/admin/config.scripts/blitz.error.sh _provision.setup.sh "lnd-no-macaroons" "lnd did not create macaroons" "/home/bitcoin/.lnd/data/chain/${network}/${chain}net/admin.macaroon --> missing"
exit 14
fi
done
# now sync macaroons & TLS to other users
sudo /home/admin/config.scripts/lnd.credentials.sh sync
# make a final lnd check
source <(/home/admin/config.scripts/lnd.check.sh basic-setup "${chain}net")
if [ "${err}" != "" ]; then
echo
echo "lnd-check-error" "lnd.check.sh basic-setup ${chain}net with error" "/home/admin/config.scripts/lnd.check.sh basic-setup ${chain}net --> ${err}"
echo
# exit 15
fi
}
function restoreFromSeed()
{
askLNDbackupCopy
## from dialogLightningWallet.sh
# let people know about the difference between SEED & SEED+SCB
whiptail --title "IMPORTANT INFO" --yes-button "ENTER SEED" --no-button "Go Back" --yesno "
Using JUST SEED WORDS will only recover your on-chain funds.
To also try to recover the open channel funds you need the
channel.backup file (since RaspiBlitz v1.2 / LND 0.6-beta)
or having a complete LND rescue-backup from your old node.
" 11 65
# start seed input and get results
_temp="/var/cache/raspiblitz/.temp.tmp"
/home/admin/config.scripts/lnd.backup.sh seed-import-gui $_temp
source $_temp 2>/dev/null
sudo rm $_temp 2>/dev/null
# if user canceled the seed input
if [ "${seedWords}" == "" ]; then
# signal cancel to the calling script by exit code (4 = exit on seedwords)
exit 4
fi
getpasswordC
removeLNDwallet
# creates fresh lnd.conf without an alias
/home/admin/config.scripts/lnd.install.sh on $CHAIN
sudo systemctl start ${netprefix}lnd
lndHealthCheck
# from _provison.setup.sh
# create wallet
# WALLET --> SEED
if [ "${seedWords}" != "" ]; then
echo "WALLET --> SEED"
/home/admin/_cache.sh set message "LND Wallet (SEED)"
source <(/home/admin/config.scripts/lnd.initwallet.py seed "${chain}net" "${passwordC}" "${seedWords}" "${seedPassword}")
if [ "${err}" != "" ]; then
echo "lnd-wallet-seed" "lnd.initwallet.py seed returned error" "/home/admin/config.scripts/lnd.initwallet.py seed ${chain}net ... --> ${err} + ${errMore}"
exit 12
fi
fi
syncAndCheckLND
}
function restoreSCB()
{
# import SCB and get results
_temp="/var/cache/raspiblitz/.temp.tmp"
# 'production' to use passwordA
/home/admin/config.scripts/lnd.backup.sh scb-import-gui production $_temp
source $_temp 2>/dev/null
sudo rm $_temp 2>/dev/null
# if user canceled the upload
if ! ls -la /home/admin/channel.backup; then
echo "# signal cancel to the calling script by exit code (5 = exit on scb)"
exit 5
fi
echo
echo "The next step will attempt to trigger all online peers to force close the channels."
echo "Restoring the channel.backup can be repeated until all the channels are force closed."
echo
echo "Make sure to enter the Raspiblitz menu to trigger the next step."
echo "If menu does not open automatically - use command: raspiblitz"
echo "Press ENTER to continue or CTRL+C to abort"
read key
### --> DEACTIVATED BECAUSE when a file is placed at /home/admin/channel.backup
### it will now automatically trigger a Static-Channel-Backup procedure after lnd recoverymode is done
#
# # WALLET --> SEED + SCB
# if ls -la /home/admin/channel.backup; then
#
# # LND was restarted so need to unlock
# echo "WALLET --> UNLOCK WALLET - SCAN 0"
# /home/admin/_cache.sh set message "LND Wallet Unlock - scan 0"
# source <(/home/admin/config.scripts/lnd.initwallet.py unlock "${chain}net" "${passwordC}" 0)
# if [ "${err}" != "" ]; then
# echo "lnd-wallet-unlock" "lnd.initwallet.py unlock returned error" "/home/admin/config.scripts/lnd.initwallet.py unlock ${chain}net ... --> ${err} + ${errMore}"
# if [ "${errMore}" = "wallet already unlocked, WalletUnlocker service is no longer available" ]; then
# echo "The wallet is already unlocked, continue."
# else
# exit 11
# fi
# fi
#
# echo "WALLET --> SEED + SCB "
# /home/admin/_cache.sh set message "LND Wallet (SEED & SCB)"
# macaroonPath="/home/admin/.lnd/data/chain/${network}/${chain}net/admin.macaroon"
# source <(/home/admin/config.scripts/lnd.initwallet.py scb ${chain}net "/home/admin/channel.backup" "${macaroonPath}")
# if [ "${err}" != "" ]; then
# echo "lnd-wallet-seed+scb" "lnd.initwallet.py scb returned error" "/home/admin/config.scripts/lnd.initwallet.py scb ${chain}net ... --> ${err} + ${errMore}"
# while [ $(echo "${errMore}" | grep -c "RPC server is in the process of starting up") -gt 0 ]; do
# echo "# ${errMore}"
# echo "# waiting 10 seconds (${counter})"
# counter=$((counter+1))
# if [ ${counter} -eq 60 ]; then
# echo "# Giving up after 10 minutes"
# echo
# echo "lnd-wallet-seed+scb" "lnd.initwallet.py scb returned error" "/home/admin/config.scripts/lnd.initwallet.py scb ${chain}net ... --> ${err} + ${errMore}"
# echo
# echo "The SCB recovery is not possible now - use the RETRYSCB option the REPAIR-LND menu after LND is synced."
# echo "Can repeat the SCB recovery until all peers have force closed the channels to this node."
# echo
# echo "# ${netprefix}lnd error logs:"
# sudo journalctl -u ${netprefix}lnd
# echo
# echo "# ${netprefix}lnd logs:"
# sudo tail /home/bitcoin/.lnd/logs/bitcoin/${CHAIN}/lnd.log
# exit 12
# fi
# sleep 10
# source <(/home/admin/config.scripts/lnd.initwallet.py scb ${chain}net "/home/admin/channel.backup" "${macaroonPath}")
# done
#
# fi
# fi
#
# syncAndCheckLND
}
function removeLNDwallet
{
clear
echo
echo "The next step WILL REMOVE the old LND wallet on ${CHAIN}"
echo "Press ENTER to continue or CTRL+C to abort"
read key
echo "# Stopping lnd on ${CHAIN} ..."
sudo systemctl stop ${netprefix}lnd
sudo systemctl disable ${netprefix}lnd
echo "Reset wallet on ${CHAIN}"
sudo rm -f /home/bitcoin/.lnd/${netprefix}lnd.conf
sudo rm -f /home/bitcoin/.lnd/${netprefix}v3_onion_private_key
sudo rm -f /mnt/hdd/lnd/data/chain/${network}/${CHAIN}/wallet.db
sudo rm -f /home/bitcoin/.lnd/data/graph/${CHAIN}/channel.db
sudo rm -f /home/bitcoin/.lnd/data/graph/${CHAIN}/sphinxreplay.db
sudo rm -rf /mnt/hdd/lnd/data/chain/${network}/${CHAIN}
sudo rm -rf /home/bitcoin/.lnd/logs/${network}/${CHAIN}
sudo rm -rf /home/bitcoin/.lnd/data/graph/${CHAIN}
sudo rm -rf home/bitcoin/.lnd/data/watchtower/${CHAIN}
}
# BASIC MENU INFO
WIDTH=64
BACKTITLE="RaspiBlitz"
TITLE="LND repair options for $CHAIN"
MENU=""
OPTIONS=()
if [ "${chain}" = "main" ]; then
OPTIONS+=(COMPACT "Compact the LND channel.db")
OPTIONS+=(GETSCB "Download channel.backup (StaticChannelBackup)")
fi
OPTIONS+=(BACKUP-LND "Backup your LND data (Rescue-File)")
OPTIONS+=(RESET-LND "Delete LND & start new node/wallet")
OPTIONS+=(LNDRESCUE "Restore from a rescue file")
OPTIONS+=(SEED+SCB "Restore from a seed and channel.backup")
OPTIONS+=(RETRYSCB "Retry closing channels with the channel.backup")
OPTIONS+=(ONLYSEED "Restore from a seed (onchain funds only)")
OPTIONS+=(RESCAN "Rescan the blockchain to recover onchain funds")
CHOICE_HEIGHT=$(("${#OPTIONS[@]}/2+1"))
HEIGHT=$((CHOICE_HEIGHT+6))
CHOICE=$(dialog --clear \
--backtitle "$BACKTITLE" \
--title "$TITLE" \
--ok-label "Select" \
--cancel-label "Main menu" \
--menu "$MENU" \
$HEIGHT $WIDTH $CHOICE_HEIGHT \
"${OPTIONS[@]}" \
2>&1 >/dev/tty)
case $CHOICE in
COMPACT)
/home/admin/config.scripts/lnd.compact.sh interactive
echo "# Starting ${netprefix}lnd.service ..."
sudo systemctl start lnd
echo
echo "Press ENTER to return to main menu."
read key
;;
GETSCB)
/home/admin/config.scripts/lnd.backup.sh scb-export-gui
;;
BACKUP-LND)
/home/admin/config.scripts/lnd.compact.sh interactive
sudo /home/admin/config.scripts/lnd.backup.sh ${netprefix}lnd-export-gui
echo
echo "Press ENTER when your backup download is done to shutdown."
read key
/home/admin/config.scripts/blitz.shutdown.sh
;;
RESET-LND)
askLNDbackupCopy
# ask for a new name so that network analysis has harder time to connect new node id with old
result=""
while [ ${#result} -eq 0 ]
do
trap 'rm -f "$_temp"' EXIT
_temp=$(mktemp -p /dev/shm/)
l1="Please enter the name of your new LND node:\n"
l2="different name is better for a fresh identity\n"
l3="one word, use up to 32 basic characters"
dialog --backtitle "RaspiBlitz - Setup (${network}/${chain})" --inputbox "$l1$l2$l3" 13 52 2>$_temp
result=$( cat $_temp | tr -dc '[:alnum:]-.' | tr -d ' ' )
echo "processing ..."
sleep 3
done
removeLNDwallet
# create wallet
/home/admin/config.scripts/lnd.install.sh on ${chain}net initwallet
# display and delete the seed for ${chain}net
sudo /home/admin/config.scripts/lnd.install.sh display-seed ${chain}net delete
#TODO the new hostname is not taken into account on init (user can change set the lnd name in menu later)
# make sure host is named like in the raspiblitz config
# echo "Setting the Name/Alias/Hostname .."
sudo /home/admin/config.scripts/lnd.setname.sh ${chain}net "${result}"
# /home/admin/config.scripts/blitz.conf.sh set hostname "${result}"
syncAndCheckLND
echo "Press ENTER to return to main menu."
read key
# go back to main menu (and show)
/home/admin/00raspiblitz.sh
exit 0
;;
LNDRESCUE)
askLNDbackupCopy
#removeAllLNDwallets
clear
echo
echo "The next step WILL REMOVE the old LND wallets on ALL CHAINS"
echo "Press ENTER to continue or CTRL+C to abort"
read key
echo "# Stopping lnd on mainnet ..."
sudo systemctl stop lnd
# don' t want to set CL as default if running parallel
#/home/admin/config.scripts/lnd.install.sh off mainnet
if [ "${tlnd}" == "on" ];then
/home/admin/config.scripts/lnd.install.sh off testnet
fi
if [ "${slnd}" == "on" ];then
/home/admin/config.scripts/lnd.install.sh off signet
fi
echo "Reset wallet"
sudo rm -r /mnt/hdd/lnd
## from dialogLightningWallet.sh
# import file
# run upload dialog and get result
_temp="/var/cache/raspiblitz/temp/.temp.tmp"
/home/admin/config.scripts/lnd.backup.sh lnd-import-gui production $_temp
source $_temp 2>/dev/null
sudo rm $_temp 2>/dev/null
/home/admin/config.scripts/lnd.install.sh on ${CHAIN}
sudo systemctl start ${netprefix}lnd
syncAndCheckLND
echo "Press ENTER to return to main menu."
read key
# go back to main menu (and show)
/home/admin/00raspiblitz.sh
exit 0
;;
ONLYSEED)
restoreFromSeed
echo "Set lnd recovery mode & restart ..."
sudo /home/admin/config.scripts/lnd.backup.sh "${chain}net" recoverymode on
sudo systemctl restart ${netprefix}lnd
sleep 3
echo "# Unlock wallet ..."
/home/admin/config.scripts/lnd.unlock.sh "${CHAIN}"
echo
echo "System will now go thru rescan for on-chain funds"
echo "Press ENTER to return to main menu."
read key
# go back to main menu (and show)
/home/admin/00raspiblitz.sh
exit 0
;;
SEED+SCB)
restoreFromSeed
restoreSCB
echo "Set lnd recovery mode & restart ..."
sudo /home/admin/config.scripts/lnd.backup.sh "${chain}net" recoverymode on
sudo systemctl restart ${netprefix}lnd
sleep 3
echo "# Unlock wallet ..."
/home/admin/config.scripts/lnd.unlock.sh "${CHAIN}"
echo
echo "System will now go thru rescan for on-chain funds and when done"
echo "the Static-Channel-Backup will trigger to recover off-chain funds."
echo "Press ENTER to return to main menu."
read key
# go back to main menu (and show)
/home/admin/00raspiblitz.sh
exit 0
;;
RETRYSCB)
restoreSCB
# go back to main menu (and show)
/home/admin/00raspiblitz.sh
exit 0
;;
RESCAN)
clear
source <(sudo /home/admin/config.scripts/lnd.backup.sh "${CHAIN}" recoverymode status)
if [ "${recoverymode}" == "0" ]; then
echo "Putting lnd back in recoverymode."
sudo /home/admin/config.scripts/lnd.backup.sh "${CHAIN}" recoverymode on
echo "Restarting lnd ..."
sudo systemctl restart ${netprefix}lnd
sleep 3
else
echo "lnd already in recoverymode."
fi
echo "# Unlock wallet ..."
/home/admin/config.scripts/lnd.unlock.sh "${CHAIN}"
echo
echo "To show the scanning progress in the background will follow the lnd.log with:"
echo "'sudo tail -n 30 -f /mnt/hdd/lnd/logs/${network}/${chain}net/lnd.log'"
echo
echo "Press ENTER to continue"
echo "use CTRL+C any time to exit .. then use the command 'raspiblitz' to return to the menu"
echo "(the rescan will continue in the background)"
echo "#######################################################################################"
read key
sudo tail -n 30 -f /mnt/hdd/lnd/logs/${network}/${chain}net/lnd.log
;;
esac
exit 0