seperate gui & process lnd backup

This commit is contained in:
rootzoll 2021-05-02 00:50:00 +02:00
parent 30b1cf804f
commit fcc1dae6ba
10 changed files with 609 additions and 337 deletions

4
FAQ.md
View File

@ -234,7 +234,7 @@ If you still can SSH in and HDD is readable, we can try to rescue/export your LN
To rescue/export your Lightning data from a RaspiBlitz (since v1.1):
* SSH into your RaspiBlitz and EXIT to terminal from the menu.
* then run: `/home/admin/config.scripts/lnd.rescue.sh backup`
* then run: `/home/admin/config.scripts/lnd.backup.sh lnd-export-gui`
* follow the instructions of the script.
This will create a lnd-rescue file (ends on gz.tar) that contains all the data from the LND. The script offers you a command to transfer the lnd-rescue file to your laptop. If the transfer was successful you can now setup a fresh RaspiBlitz. Do all the setup until you have a clean new Lightning node running - just without any funding or channels.
@ -242,7 +242,7 @@ This will create a lnd-rescue file (ends on gz.tar) that contains all the data f
Then to restore your old LND data and to recover your funds and channels:
* SSH into your new RaspiBlitz and EXIT to terminal from the menu.
* then run: `/home/admin/config.scripts/lnd.rescue.sh restore`
* then run: `/home/admin/config.scripts/lnd.backup.sh lnd-import-gui`
* follow the instructions of the script.
This script will offer you a way to transfer the lnd-rescue file from your laptop to the new RaspiBlitz and will restore the old data. LND then gets restarted for you, and after some time it should show you the status screen again with your old funds and channels.

View File

@ -47,13 +47,13 @@ if [ "${migrationOS}" == "raspiblitz" ]; then
echo "migrationOS='${migrationOS}'" >> $SETUPFILE
echo "migrationVersion='${migrationVersion}'" >> $SETUPFILE
# get defaultZipPath, localIP, etc
# get defaultUploadPath, localIP, etc
source <(sudo /home/admin/config.scripts/blitz.migration.sh status)
# make sure that temp directory exists, is clear and can be written by user bitcoin
sudo mkdir -p ${defaultZipPath} 2>/dev/null
sudo mkdir -p ${defaultUploadPath} 2>/dev/null
sudo rm /mnt/hdd/temp/migration/* 2>/dev/null
sudo chown -R bitcoin:bitcoin ${defaultZipPath} 2>/dev/null
sudo chown -R bitcoin:bitcoin ${defaultUploadPath} 2>/dev/null
# scp upload info
clear
@ -67,17 +67,17 @@ if [ "${migrationOS}" == "raspiblitz" ]; then
echo "ON YOUR LAPTOP open a new terminal and change into"
echo "the directory where your migration file is and"
echo "COPY, PASTE AND EXECUTE THE FOLLOWING COMMAND:"
echo "scp -r ./raspiblitz-*.tar.gz bitcoin@${localip}:${defaultZipPath}"
echo "scp -r ./raspiblitz-*.tar.gz bitcoin@${localip}:${defaultUploadPath}"
echo ""
echo "Use password 'raspiblitz' to authenticate file transfer."
echo "PRESS ENTER when upload is done."
read key
countZips=$(sudo ls ${defaultZipPath}/raspiblitz-*.tar.gz 2>/dev/null | grep -c 'raspiblitz-')
countZips=$(sudo ls ${defaultUploadPath}/raspiblitz-*.tar.gz 2>/dev/null | grep -c 'raspiblitz-')
# in case no upload found
if [ ${countZips} -eq 0 ]; then
echo "FAIL: Was not able to detect uploaded file in ${defaultZipPath}"
echo "FAIL: Was not able to detect uploaded file in ${defaultUploadPath}"
echo "Shutting down ... please make a fresh sd card & try again."
sleep 3
echo "shutdown=1" >> $SETUPFILE
@ -86,7 +86,7 @@ if [ "${migrationOS}" == "raspiblitz" ]; then
# in case of multiple files
if [ ${countZips} -gt 1 ]; then
echo "# FAIL: Multiple possible files detected in ${defaultZipPath}"
echo "# FAIL: Multiple possible files detected in ${defaultUploadPath}"
echo "Shutting down ... please make a fresh sd card & try again."
sleep 3
echo "shutdown=1" >> $SETUPFILE
@ -95,7 +95,7 @@ if [ "${migrationOS}" == "raspiblitz" ]; then
# further checks and unpacking will be done when migration is processed (not part of dialog)
echo "OK: Migration data was imported - will process after password reset"
echo "migrationFile='${defaultZipPath}'" >> $SETUPFILE
echo "migrationFile='${defaultUploadPath}'" >> $SETUPFILE
sleep 4
# user needs to reset password A

View File

@ -113,37 +113,56 @@ if [ "${CHOICE}" == "NEW" ]; then
elif [ "${CHOICE}" == "OLD" ]; then
# get more details what kind of old lightning wallet user has
OPTIONS=()
OPTIONS+=(LNDRESCUE "LND tar.gz-Backupfile (BEST)")
OPTIONS+=(SEED+SCB "Seed & channel.backup file (OK)")
OPTIONS+=(ONLYSEED "Only Seed Word List (FALLBACK)")
CHOICE=$(dialog --backtitle "RaspiBlitz" --clear --title "RECOVER LND DATA & WALLET" --menu "Data you have to recover from?" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty)
CHOICE=""
while [ "${CHOICESUB}" == "" ]
do
if [ "${CHOICE}" == "LNDRESCUE" ]; then
# get more details what kind of old lightning wallet user has
OPTIONS=()
OPTIONS+=(LNDRESCUE "LND tar.gz-Backupfile (BEST)")
OPTIONS+=(SEED+SCB "Seed & channel.backup file (OK)")
OPTIONS+=(ONLYSEED "Only Seed Word List (FALLBACK)")
CHOICESUB=$(dialog --backtitle "RaspiBlitz" --clear --title "RECOVER LND DATA & WALLET" --menu "Data you have to recover from?" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty)
# just activate LND rescue upload
uploadLNDRESCUE=1
if [ "${CHOICESUB}" == "LNDRESCUE" ]; then
# dont set password c anymore later on
setPasswordC=0
# just activate LND rescue upload
uploadLNDRESCUE=1
elif [ "${CHOICE}" == "SEED+SCB" ]; then
# dont set password c anymore later on
setPasswordC=0
# activate SEED input & SCB upload
enterSEED=1
uploadSCB=1
elif [ "${CHOICESUB}" == "SEED+SCB" ]; then
elif [ "${CHOICE}" == "ONLYSEED" ]; then
# activate SEED input & SCB upload
enterSEED=1
uploadSCB=1
# activate SEED input & SCB upload
enterSEED=1
elif [ "${CHOICESUB}" == "ONLYSEED" ]; then
else
echo "# you selected cancel - exited to terminal"
echo "# use command 'restart' to reboot & start again"
exit 1
fi
# let people know about the difference between SEED & SEED+SCB
whiptail --title "IMPORTANT INFO" --yes-button "JUST 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
if [ $? -eq 1 ]; then
# when user wants to go back
CHOICESUB=""
else
# activate SEED input & SCB upload
enterSEED=1
fi
else
echo "# you selected cancel - exited to terminal"
echo "# use command 'restart' to reboot & start again"
exit 1
fi
done
else
echo "# you selected cancel - exited to terminal"
@ -153,11 +172,10 @@ fi
# UPLOAD LND RESCUE FILE dialog (if activated by dialogs above)
if [ ${uploadLNDRESCUE} -eq 1 ]; then
echo "TODO: UPLOAD LND RESCUE FILE"
/home/admin/config.scripts/lnd.backup.sh lnd-import-gui setup $SETUPFILE
exit 1
fi
# INPUT LIGHTNING SEED dialog (if activated by dialogs above)
if [ ${enterSEED} -eq 1 ]; then
echo "TODO: INPUT LIGHTNING SEED"
@ -166,8 +184,7 @@ fi
# UPLOAD STATIC CHANNEL BACKUP FILE dialog (if activated by dialogs above)
if [ ${uploadSCB} -eq 1 ]; then
echo "TODO: UPLOAD STATIC CHANNEL BACKUP FILE"
exit 1
/home/admin/config.scripts/lnd.backup.sh scb-import-gui setup $SETUPFILE
fi
###################

View File

@ -454,7 +454,6 @@ case $CHOICE in
if [ "$?" = "1" ]; then
echo
echo "# clean and unmount for next try"
sudo rm -f ${defaultZipPath}/raspiblitz-*.tar.gz 2>/dev/null
sudo umount /mnt/hdd 2>/dev/null
sudo umount /mnt/storage 2>/dev/null
sudo umount /mnt/temp 2>/dev/null

View File

@ -33,7 +33,7 @@ elif [ "${CHOICE}" = "REINDEX" ]; then
sudo /home/admin/config.scripts/network.reindex.sh
elif [ "${CHOICE}" = "BACKUP" ]; then
sudo /home/admin/config.scripts/lnd.rescue.sh backup
sudo /home/admin/config.scripts/lnd.backup.sh lnd-export-gui
echo "PRESS ENTER to continue."
read key

View File

@ -20,7 +20,7 @@ Download LND Data Backup now?
echo "*************************************"
echo "please wait .."
sleep 2
/home/admin/config.scripts/lnd.rescue.sh backup
/home/admin/config.scripts/lnd.backup.sh lnd-export-gui
echo
echo "PRESS ENTER to continue once you are done downloading."
read key
@ -31,7 +31,7 @@ Download LND Data Backup now?
echo "*************************************"
echo "please wait .."
sleep 2
/home/admin/config.scripts/lnd.rescue.sh backup no-download
/home/admin/config.scripts/lnd.backup.sh lnd-export
fi
}
@ -189,7 +189,7 @@ case $CHOICE in
read key
;;
BACKUP-LND)
sudo /home/admin/config.scripts/lnd.rescue.sh backup
sudo /home/admin/config.scripts/lnd.backup.sh lnd-export-gui
echo
echo "Press ENTER when your backup download is done to shutdown."
read key

View File

@ -38,7 +38,7 @@ Do you want to download LND Data Backup now?
echo "*************************************"
echo "please wait .."
sleep 2
/home/admin/config.scripts/lnd.rescue.sh backup
/home/admin/config.scripts/lnd.backup.sh lnd-export-gui
echo
echo "PRESS ENTER to continue once you're done downloading."
read key
@ -49,7 +49,7 @@ Do you want to download LND Data Backup now?
echo "*************************************"
echo "please wait .."
sleep 2
/home/admin/config.scripts/lnd.rescue.sh backup no-download
/home/admin/config.scripts/lnd.backup.sh lnd-export
fi
whiptail --title "READY TO UPDATE?" --yes-button "START UPDATE" --no-button "Cancel" --yesno "If you start the update: The RaspiBlitz will power down.

View File

@ -111,8 +111,9 @@ if [ ${action} = "check-upload" ]; then
fi
# ok looks good - return filename
# ok looks good - return filename & more info
echo "filename=${filename}"
echo "bytesize=${byteSize}"
exit 0
fi

View File

@ -0,0 +1,547 @@
#!/bin/bash
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
echo "# ---------------------------------------------------"
echo "# LND RESCUE FILE (tar.gz of complete lnd directory)"
echo "# ---------------------------------------------------"
echo "# lnd.backup.sh lnd-export"
echo "# lnd.backup.sh lnd-export-gui"
echo "# lnd.backup.sh lnd-import [file]"
echo "# lnd.backup.sh lnd-import-gui [setup|production]"
echo "# ---------------------------------------------------"
echo "# STATIC CHANNEL BACKUP"
echo "# ---------------------------------------------------"
echo "# lnd.backup.sh scb-export"
echo "# lnd.backup.sh scb-export-gui"
echo "# lnd.backup.sh scb-import [file]"
echo "# lnd.backup.sh scb-import-gui [setup|production]"
echo "# ---------------------------------------------------"
echo "# SEED WORDS"
echo "# ---------------------------------------------------"
echo "# lnd.backup.sh seed-export-gui [lndseeddata]"
echo "# lnd.backup.sh seed-import-gui"
exit 1
fi
# 1st PRAMETER action
mode="$1"
################################
# LND RESCUE FILE - EXPORT
################################
if [ ${mode} = "lnd-export" ]; then
echo "# *** LND.RESCUE --> BACKUP"
downloadPath="/home/admin"
fileowner="admin"
# stop LND
echo "# Stopping lnd..."
sudo systemctl stop lnd
sleep 5
echo "# OK"
echo
# add lnd version info into lnd dir (to detect needed updates later)
lndVersion=$(sudo -u bitcoin lncli getinfo | jq -r ".version" | cut -d ' ' -f1)
sudo rm /mnt/hdd/lnd/version.info 2>/dev/null
echo "${lndVersion}" > /home/admin/lnd.version.info
sudo mv /home/admin/lnd.version.info /mnt/hdd/lnd/version.info
sudo chown bitcoin:bitcoin /mnt/hdd/lnd/version.info
# zip it
sudo tar -zcvf ${downloadPath}/lnd-rescue.tar.gz /mnt/hdd/lnd 1>&2
sudo chown ${fileowner}:${fileowner} ${downloadPath}/lnd-rescue.tar.gz 1>&2
# delete old backups
rm ${downloadPath}/lnd-rescue-*.tar.gz 2>/dev/null 1>/dev/null
# name with md5 checksum
md5checksum=$(md5sum ${downloadPath}/lnd-rescue.tar.gz | head -n1 | cut -d " " -f1)
mv ${downloadPath}/lnd-rescue.tar.gz ${downloadPath}/lnd-rescue-${md5checksum}.tar.gz 1>&2
byteSize=$(ls -l ${downloadPath}/lnd-rescue-${md5checksum}.tar.gz | awk '{print $5}')
# check file size
if [ ${byteSize} -lt 100 ]; then
echo "error='backup is empty'"
exit 1
fi
# output result data
echo "# lnd service is stopped for security"
echo "filename='${downloadPath}/lnd-rescue-${md5checksum}.tar.gz'"
echo "fileowner='${fileowner}'"
echo "size=${byteSize}"
exit 0
fi
if [ ${mode} = "lnd-export-gui" ]; then
# create lnd rescue file
source <(/home/admin/config.scripts/lnd.backup.sh lnd-export)
if [ "${error}" != "" ]; then
echo "error='${error}'"
exit 1
fi
# get local ip info
source <(/home/admin/config.scripts/internet.sh status local)
# offer SCP for download
clear
echo
echo "****************************"
echo "* DOWNLOAD THE RESCUE FILE *"
echo "****************************"
echo
echo "ON YOUR MAC & LINUX LAPTOP - RUN IN NEW TERMINAL:"
echo "scp '${fileowner}@${localip}:${filename}' ./"
echo "ON WINDOWS USE:"
echo "scp ${fileowner}@${localip}:${filename} ."
echo ""
echo "Use password A to authenticate file transfer."
echo "Check for correct file size after transfer: ${byteSize} byte"
echo
echo "BEWARE: Your Lightning node is now stopped. It's safe to backup the data and"
echo "restore it on a fresh RaspiBlitz. But once this Lightning node gets started"
echo "again or rebooted, it's not advised to restore the backup file because"
echo "it would contain outdated channel data and can lead to loss of channel funds."
exit 0
fi
################################
# LND RESCUE FILE - IMPORT
################################
if [ ${mode} = "lnd-import" ]; then
# 2nd PARAMETER: file to import (expect that the file was valid checked from calling script)
filename=$2
if [ "${filename}" == "" ]; then
echo "error='filename missing'"
exit 1
fi
fileExists=$(sudo ls ${filename} 2>/dev/null | grep -c "${filename}")
if [ "${fileExists}" != "1" ]; then
echo "error='filename not found'"
exit 1
fi
# stop LND
echo "# stopping lnd..."
sudo systemctl stop lnd 1>/dev/null
sleep 5
# clean DIR
echo "# cleaning old LND data ..."
sudo rm -r /mnt/hdd/lnd/* 1>/dev/null 2>/dev/null
# unpack zip
echo "# restoring LND data from ${filename} ..."
sudo tar -xf ${filename} -C / 1>/dev/null
sudo chown -R bitcoin:bitcoin /mnt/hdd/lnd 1>/dev/null
# lnd version of LND rescue file (thats packed as extra info in the file)
# its included since RaspiBlitz v1.7.1 /mnt/hdd/lnd/version.info
# this can happen if someone uses the manual LND update and then uploads to an old default LND
# if so just signal this in the output
echo "# DONE - lnd service is still stopped - start manually with command:"
echo "# sudo systemctl start lnd"
exit 0
fi
if [ ${mode} = "lnd-import-gui" ]; then
# get by second parameter if this call if happening during setup or production
scenario=$2
if [ "${scenario}" != "setup" ] && [ "${scenario}" != "production" ]; then
echo "error='mising parameter'"
exit 1
fi
# scenario setup needs a 3rd parameter - the SETUPFILE to store results in
if [ "${scenario}" == "setup" ]; then
SETUPFILE=$3
if [ "${SETUPFILE}" == "" ]; then
echo "error='mising parameter'"
exit 1
fi
fi
# determine password info based on scenario
if [ "${scenario}" == "setup" ]; then
passwordInfo="password 'raspiblitz'"
else
passwordInfo="your Password A"
fi
# get defaultUploadPath, localIP, etc
source <(sudo /home/admin/config.scripts/blitz.upload.sh prepare-upload)
filename=""
while [ "${filename}" == "" ]
do
clear
echo "**************************"
echo "* UPLOAD THE RESCUE FILE *"
echo "**************************"
echo "If you have a lnd-rescue backup file on your laptop you can now"
echo "upload it and restore the your latest LND state."
echo
echo "CAUTION: Dont restore old LND states - risk of loosing funds!"
echo
echo "To make upload open a new terminal on your laptop,"
echo "change into the directory where your lnd-rescue file is and"
echo "COPY, PASTE AND EXECUTE THE FOLLOWING COMMAND:"
echo "scp -r ./lnd-rescue-*.tar.gz ${defaultUploadUser}@${localip}:${defaultUploadPath}/"
echo ""
echo "Use ${passwordInfo} to authenticate file transfer."
echo "PRESS ENTER when upload is done"
read key
# check upload (will return filename or error)
source <(sudo /home/admin/config.scripts/blitz.upload.sh check-upload lnd-rescue)
if [ "${filename}" != "" ]; then
echo "OK - File found: ${filename}"
echo "PRESS ENTER to continue."
read key
elif [ "${error}" == "not-found" ]; then
echo "!! WARNING !!"
echo "There was no upload found in ${defaultUploadPath}"
echo "Make sure you upload only one tar.gz-file and start again."
echo "PRESS ENTER to continue & retry"
read key
elif [ "${error}" == "multiple" ]; then
echo "!! WARNING !!"
echo "There are multiple lnd-rescue files in directory ${defaultUploadPath}"
echo "Make sure you upload only one tar.gz-file and start again."
echo "PRESS ENTER to continue & retry"
read key
elif [ "${error}" == "invalid" ]; then
echo "!! WARNING !!"
echo "The file uploaded is not a valid (complete upload failed or not correct file)."
echo "PRESS ENTER to continue & retry"
read key
else
echo "!! WARNING !! Unknown State (report to devs)"
exit 1
fi
done
# in setup scenario the final import is happening during provison
if [ "${scenario}" == "setup" ]; then
# just add lndrescue filename to give file
echo "lndrescue='${filename}'" >> $SETUPFILE
echo ""
exit 0
fi
# in production now start restoring LND data based on file
source /mnt/hdd/raspiblitz.conf
# ask security question before deleting old wallet
echo "WARNING: This will delete/overwrite the LND state/funds of this RaspiBlitz."
echo
echo "Write the word 'override' and press ENTER to CONTINUE:"
read securityInput
if [ "${securityInput}" != "override" ] && [ "${securityInput}" != "'override'" ]; then
echo
echo "CANCELED import of uploaded rescue file"
exit 1
fi
echo
# run import process
echo "OK deleting old LND data & restoring imported rescue file ..."
source <(sudo /home/admin/config.scripts/lnd.backup.sh lnd-import ${filename})
# TODO: check if update of LND is needed (see detailes in lnd-import) for edge case
# turn off auto-unlock if activated because password c might now change
if [ "${autoUnlock}" == "on" ]; then
/home/admin/config.scripts/lnd.autounlock.sh off
fi
# restarting lnd & give final info
sudo systemctl start lnd
echo "DONE - lnd is now restarting .. Password C is now like within your rescue file"
echo "Check that LND is starting up correctly and your old channel & funds are restored."
echo "Take into account that some channels might have been force closed in the meanwhile."
exit 0
fi
####################################
# STATIC CHANEL BACKUP FILE - EXPORT
####################################
if [ ${mode} = "scb-export" ]; then
# get file info
source /mnt/hdd/raspiblitz.conf
echo "filename='/mnt/hdd/lnd/data/chain/${network}/${chain}net/channel.backup'"
echo "fileuser='bitcoin'"
# localip
source <(/home/admin/config.scripts/internet.sh status local)
echo "localip='${localip}'"
exit 0
fi
if [ ${mode} = "scb-export-gui" ]; then
# get the scb info
source <(sudo /home/admin/config.scripts/lnd.backup.sh scb-export)
# show download info
clear
echo "**************************************"
echo "* DOWNLOAD STATIC CHANEL BACKUP FILE *"
echo "**************************************"
echo
echo "RUN THE FOLLOWING COMMAND ON YOUR LAPTOP IN NEW TERMINAL:"
echo "scp -r ${fileuser}@${localip}:${filename} ./"
echo ""
echo "Use password A to authenticate file transfer."
echo
echo "NOTE: Use this file when setting up a fresh RaspiBlitz by choosing"
echo "option OLD WALLET and then SCB+SEED -> Seed & channel.backup file"
echo "Will just recover on-chain & channel-funds, but closing all channels"
exit 0
fi
####################################
# STATIC CHANEL BACKUP FILE - IMPORT
####################################
if [ ${mode} = "scb-import" ]; then
# 2nd PARAMETER: file to import (expect that the file was valid checked from calling script)
filename=$2
if [ "${filename}" == "" ]; then
echo "error='filename missing'"
exit 1
fi
fileExists=$(sudo ls ${filename} 2>/dev/null | grep -c "${filename}")
if [ "${fileExists}" != "1" ]; then
echo "error='filename not found'"
exit 1
fi
# place the the file at '/home/admin/channel.backup'
sudo mv ${filename} /home/admin/channel.backup
sudo chmod 777 /home/admin/channel.backup
sudo chown admin:admin /home/admin/channel.backup
echo "# OK - placed SCB file at /home/admin/channel.backup"
fi
if [ ${mode} = "scb-import-gui" ]; then
# get by second parameter if this call if happening during setup or production
scenario=$2
if [ "${scenario}" != "setup" ] && [ "${scenario}" != "production" ]; then
echo "error='mising parameter'"
exit 1
fi
# scenario setup needs a 3rd parameter - the SETUPFILE to store results in
if [ "${scenario}" == "setup" ]; then
SETUPFILE=$3
if [ "${SETUPFILE}" == "" ]; then
echo "error='mising parameter'"
exit 1
fi
fi
# determine password info based on scenario
if [ "${scenario}" == "setup" ]; then
passwordInfo="password 'raspiblitz'"
else
passwordInfo="your Password A"
fi
# get defaultUploadPath, localIP, etc
source <(sudo /home/admin/config.scripts/blitz.upload.sh prepare-upload)
filename=""
while [ "${filename}" == "" ]
do
clear
echo "**********************************"
echo "* UPLOAD THE channel.backup FILE *"
echo "**********************************"
echo
echo "If you have the channel.backup file on your laptop or on"
echo "another server you can now upload it to the RaspiBlitz."
echo
echo "To make upload open a new terminal and change,"
echo "into the directory where your lnd-rescue file is and"
echo "COPY, PASTE AND EXECUTE THE FOLLOWING COMMAND:"
echo "scp ./*.backup ${defaultUploadUser}@${localip}:${defaultUploadPath}/"
echo ""
echo "Use ${passwordInfo} to authenticate file transfer."
echo "PRESS ENTER when upload is done."
read key
# check upload (will return filename or error)
source <(sudo /home/admin/config.scripts/blitz.upload.sh check-upload scb)
if [ "${filename}" != "" ]; then
echo "OK - File found: ${filename}"
echo "PRESS ENTER to continue."
read key
elif [ "${error}" == "not-found" ]; then
echo "!! WARNING !!"
echo "There was no upload found in ${defaultUploadPath}"
echo "Make sure you upload only one tar.gz-file and start again."
echo "PRESS ENTER to continue & retry"
read key
elif [ "${error}" == "multiple" ]; then
echo "!! WARNING !!"
echo "There are multiple lnd-rescue files in directory ${defaultUploadPath}"
echo "Make sure you upload only one tar.gz-file and start again."
echo "PRESS ENTER to continue & retry"
read key
elif [ "${error}" == "invalid" ]; then
echo "!! WARNING !!"
echo "The file uploaded is not a valid (complete upload failed or not correct file)."
echo "PRESS ENTER to continue & retry"
read key
else
echo "!! WARNING !! Unknown State (report to devs)"
exit 1
fi
done
# in setup scenario the final import is happening during provison
if [ "${scenario}" == "setup" ]; then
# just add staticchannelbackup filename to give file
echo "staticchannelbackup='${filename}'" >> $SETUPFILE
echo ""
exit 0
fi
# run import process
echo "OK importing channel.backup file ..."
source <(sudo /home/admin/config.scripts/lnd.backup.sh scb-import ${filename})
# give final info
echo "DONE - placed SCB file at /home/admin/channel.backup"
echo "Reboot and login to trigger import."
exit 0
fi
####################################
# SEED WORDS - GUI PARTS
####################################
echo "# lnd.backup.sh seed-export-gui [seedwords6x4]"
echo "# lnd.backup.sh seed-import-gui [resultfile]"
if [ ${mode} = "seed-export-gui" ]; then
# 2nd PARAMETER: lnd seed data
seedwords=$2
if [ "${seedwords}" == "" ]; then
echo "error='mising parameter'"
exit 1
fi
ack=0
while [ ${ack} -eq 0 ]
do
whiptail --title "IMPORTANT SEED WORDS - PLEASE WRITE DOWN" --msgbox "LND Wallet got created. Store these numbered words in a safe location:\n\n${seedwords6x4}" 12 76
whiptail --title "Please Confirm" --yes-button "Show Again" --no-button "CONTINUE" --yesno " Are you sure that you wrote down the word list?" 8 55
if [ $? -eq 1 ]; then
ack=1
fi
done
fi
# Results will be stored on memory cache:
# /var/cache/raspiblitz/seed-import.results
if [ ${mode} = "seed-import-gui" ]; then
# prepare seed result file
sudo rm /var/cache/raspiblitz/seed-import.results 2>/dev/null
sudo touch /var/cache/raspiblitz/seed-import.results
sudo chown admin:admin /var/cache/raspiblitz/seed-import.results
# input loop for seed words
wordsCorrect=0
while [ ${wordsCorrect} -eq 0 ]
do
# prepare temp file
sudo rm /var/cache/raspiblitz/.seed.tmp 2>/dev/null
sudo touch /var/cache/raspiblitz/.seed.tmp
sudo chown admin:admin /var/cache/raspiblitz/.seed.tmp
# dialog to enter
dialog --backtitle "RaspiBlitz - LND Recover" --inputbox "Please enter/paste the SEED WORD LIST:\n(just the words, seperated by spaces, in correct order as numbered)" 9 78 2>/var/cache/raspiblitz/.seed.tmp
wordstring=$(cat /var/cache/raspiblitz/.seed.tmp | sed 's/[^a-zA-Z0-9 ]//g')
sudo shred -u /var/cache/raspiblitz/.seed.tmp 2>/dev/null
echo "processing ..."
# check correct number of words
wordcount=$(echo "${wordstring}" | wc -w)
if [ ${wordcount} -eq 24 ]; then
echo "OK - 24 words"
wordsCorrect=1
else
whiptail --title " WARNING " \
--yes-button "Try Again" \
--no-button "Cancel" \
--yesno "
The word list has ${wordcount} words. But it must be 24.
Please check your list and try again.
Best is to write words in external editor
and then copy and paste them into dialog.
The Word list should look like this:
wordone wordtweo wordthree ...
" 16 52
if [ $? -eq 1 ]; then
# result file is empty on cancel
exit 1
fi
fi
done
# ask if seed was protected by password D
passwordD=""
dialog --title "SEED PASSWORD" --yes-button "No extra Password" --no-button "Yes" --yesno "
Are your seed words protected by an extra password?
During wallet creation LND offers to set an extra password
to protect the seed words. Most users did not set this.
" 11 65
if [ $? -eq 1 ]; then
sudo rm /var/cache/raspiblitz/.pass.tmp 2>/dev/null
sudo touch /var/cache/raspiblitz/.pass.tmp
sudo chown admin:admin /var/cache/raspiblitz/.pass.tmp
sudo /home/admin/config.scripts/blitz.setpassword.sh x "Enter extra Password D" /var/cache/raspiblitz/.pass.tmp empty-allowed
passwordD=$(sudo cat /var/cache/raspiblitz/.pass.tmp)
sudo shred -u /var/cache/raspiblitz/.pass.tmp 2>/dev/null
fi
# writing result file data
clear
echo "# result of in mem cache: /var/cache/raspiblitz/seed-import.results"
echo "seedwords='${wordstring}'" >> /var/cache/raspiblitz/seed-import.results
echo "password='${passwordD}'" >> /var/cache/raspiblitz/seed-import.results
exit 0
fi
echo "error='unknown parameter'"
exit 1

View File

@ -1,292 +0,0 @@
#!/bin/bash
source /mnt/hdd/raspiblitz.conf
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
echo "# small rescue script to to backup or restore LND data"
echo "# -> basic status:"
echo "# lnd.rescue.sh status"
echo "# -> backup all LND data in a tar.gz file for download:"
echo "# lnd.rescue.sh backup [?no-download]"
echo "# -> upload a LND data tar.gz file to replace LND data:"
echo "# lnd.rescue.sh restore"
echo "# -> download the LND channel.backup file from SD card:"
echo "# lnd.rescue.sh scb-down"
echo "# -> upload the LND channel.backup to recover wallet:"
echo "# lnd.rescue.sh scb-up"
exit 1
fi
# get local ip
source <(/home/admin/config.scripts/internet.sh status local)
defaultUploadDir="/home/admin"
mode="$1"
if [ ${mode} = "status" ]; then
echo "localip='${localip}'"
echo "defaultUploadDir='${defaultUploadDir}'"
exit 0
elif [ ${mode} = "backup" ]; then
################################
# BACKUP
################################
echo "# *** LND.RESCUE --> BACKUP"
# stop LND
echo "# Stopping lnd..."
sudo systemctl stop lnd
sleep 5
echo "# OK"
echo
# zip it
sudo tar -zcvf /home/admin/lnd-rescue.tar.gz /mnt/hdd/lnd 1>&2
sudo chown admin:admin /home/admin/lnd-rescue.tar.gz 1>&2
# delete old backups
rm /home/admin/lnd-rescue-*.tar.gz 2>/dev/null 1>/dev/null
# name with md5 checksum
md5checksum=$(md5sum /home/admin/lnd-rescue.tar.gz | head -n1 | cut -d " " -f1)
mv /home/admin/lnd-rescue.tar.gz /home/admin/lnd-rescue-${md5checksum}.tar.gz 1>&2
echo "file='lnd-rescue-${md5checksum}.tar.gz'"
echo "path='/home/admin/'"
byteSize=$(ls -l /home/admin/lnd-rescue-${md5checksum}.tar.gz | awk '{print $5}')
echo "size=${byteSize}"
if [ ${byteSize} -lt 100 ]; then
echo "error='backup is empty'"
echo
echo "# *****************************"
echo "# * BACKUP ERROR *"
echo "# *****************************"
echo "# The byte size of the created rescue-file is too small (${byteSize}) - might be empty!"
echo "# If you plan any update or recovery please stop and report this error to dev team. Thx."
exit 0
fi
# stop here in case of 'no-download' option
if [ "${2}" == "no-download" ]; then
echo "# No download of LND data requested."
exit 0
fi
# offer SCP for download
clear
echo
echo "****************************"
echo "* DOWNLOAD THE RESCUE FILE *"
echo "****************************"
echo
echo "ON YOUR MAC & LINUX LAPTOP - RUN IN NEW TERMINAL:"
echo "scp -r 'admin@${localip}:/home/admin/lnd-rescue-*.tar.gz' ./"
echo "ON WINDOWS USE:"
echo "scp -r admin@${localip}:/home/admin/lnd-rescue-*.tar.gz ."
echo ""
echo "Use password A to authenticate file transfer."
echo "Check for correct file size after transfer: ${byteSize} byte"
echo
echo "BEWARE: Your Lightning node is now stopped. It's safe to backup the data and"
echo "restore it on a fresh RaspiBlitz. But once this Lightning node gets started"
echo "again or rebooted, it's not advised to restore the backup file because"
echo "it would contain outdated channel data and can lead to loss of channel funds."
elif [ ${mode} = "restore" ]; then
################################
# RESTORE
################################
echo "# LND.RESCUE --> RESTORE"
echo ""
# delete old backups
rm /home/admin/lnd-rescue-*.tar.gz
filename=""
while [ ${#filename} -eq 0 ]
do
countZips=$(sudo ls /home/admin/lnd-rescue-*.tar.gz 2>/dev/null | grep -c 'lnd-rescue')
if [ ${countZips} -lt 1 ]; then
echo "**************************"
echo "* UPLOAD THE RESCUE FILE *"
echo "**************************"
echo "If you have a lnd-rescue backup file on your laptop you can now"
echo "upload it and restore the your latest LND state."
echo
echo "CAUTION: Dont restore old LND states - risk of loosing funds!"
echo
echo "To make upload open a new terminal on your laptop,"
echo "change into the directory where your lnd-rescue file is and"
echo "COPY, PASTE AND EXECUTE THE FOLLOWING COMMAND:"
echo "scp -r ./lnd-rescue-*.tar.gz admin@${localip}:/home/admin/"
echo ""
echo "Use password A to authenticate file transfer."
echo "PRESS ENTER when upload is done."
fi
if [ ${countZips} -gt 1 ]; then
echo "!! WARNING !!"
echo "There are multiple lnd-rescue files in directory /home/admin."
echo "Make sure you upload only one tar.gz-file and start again."
echo
echo "PRESS ENTER to continue."
read key
exit 1
fi
if [ ${countZips} -eq 1 ]; then
clear
echo
echo "**************************"
echo "* RESTORING BACKUP FILE *"
echo "**************************"
echo
filename=$(sudo ls /home/admin/lnd-rescue-*.tar.gz)
echo "OK -> found file to restore: ${filename}"
# checksum test
md5checksum=$(md5sum ${filename} | head -n1 | cut -d " " -f1)
isCorrect=$(echo ${filename} | grep -c ${md5checksum})
if [ ${isCorrect} -eq 1 ]; then
echo "OK -> checksum looks good: ${md5checksum}"
else
echo "!!! FAIL -> Checksum not correct."
echo "Maybe transfer failed? Continue at your own risk!"
echo "It is recommended to abort and upload again!"
fi
# overrride test
oldWalletExists=$(sudo ls /mnt/hdd/lnd/data/chain/${network}/${chain}net/wallet.db 2>/dev/null | grep -c "wallet.db")
if [ ${oldWalletExists} -gt 0 ]; then
echo
echo "WARNING: This will delete/overwrite the LND state/funds of this RaspiBlitz."
fi
echo
echo "PRESS ENTER to start restore. Enter x & ENTER to cancel."
fi
read key
if [ "${key}" == "x" ]; then
exit 1
fi
done
# stop LND
echo "Stopping lnd..."
sudo systemctl stop lnd
sleep 5
echo "OK"
echo
# clean DIR
echo "Cleaning LND data ..."
sudo rm -r /mnt/hdd/lnd/*
echo "OK"
echo
# unpack zip
echo "Restoring LND data from ${filename} ..."
sudo tar -xf ${filename} -C /
sudo chown -R bitcoin:bitcoin /mnt/hdd/lnd
echo "OK"
echo
# check if LND needs update
# (if RaspiBlitz has an optional LND version update, then install it
# the newer LND version can always handle older data)
echo "Checking LND version ..."
source <(sudo -u admin /home/admin/config.scripts/lnd.update.sh info)
if [ ${lndUpdateInstalled} -eq 0 ]; then
echo "Installing available LND update ... (newer version can handle more wallet formats)"
sudo -u admin /home/admin/config.scripts/lnd.update.sh verified
else
echo "OK"
fi
echo
# start LND
echo "Starting lnd..."
sudo systemctl start lnd
echo "OK"
echo
echo "DONE - please check if LND starts up correctly with restored state and funds."
echo "Keep in mind that some channels maybe forced closed in the meanwhile."
echo
elif [ ${mode} = "scb-down" ]; then
echo
echo "****************************"
echo "* DOWNLOAD THE BACKUP FILE *"
echo "****************************"
echo
echo "RUN THE FOLLOWING COMMAND ON YOUR LAPTOP IN NEW TERMINAL:"
echo "scp -r admin@${localip}:/home/admin/.lnd/data/chain/${network}/${chain}net/channel.backup ./"
echo ""
echo "Use password A to authenticate file transfer."
echo
echo "NOTE: Use this file when setting up a fresh RaspiBlitz by choosing"
echo "option OLD WALLET and then SCB+SEED -> Seed & channel.backup file"
echo "Will just recover on-chain & channel-funds, but closing all channels"
elif [ ${mode} = "scb-up" ]; then
gotFile=-1
while [ ${gotFile} -lt 1 ]
do
# show info
clear
sleep 1
echo "**********************************"
echo "* UPLOAD THE channel.backup FILE *"
echo "**********************************"
echo
if [ ${gotFile} -eq -1 ]; then
echo "If you have the channel.backup file on your laptop or on"
echo "another server you can now upload it to the RaspiBlitz."
elif [ ${gotFile} -eq 0 ]; then
echo "NO channel.backup FOUND IN /home/admin"
echo "Please try upload again."
fi
echo
echo "To make upload open a new terminal and change,"
echo "into the directory where your lnd-rescue file is and"
echo "COPY, PASTE AND EXECUTE THE FOLLOWING COMMAND:"
echo "scp ./channel.backup admin@${localip}:/home/admin/"
echo ""
echo "Use password A to authenticate file transfer."
echo "PRESS ENTER when upload is done. Enter x & ENTER to cancel."
# wait user interaction
echo "Please upload file. Press ENTER to try again or (x & ENTER) to cancel."
read key
if [ "${key}" == "x" ]; then
# EXIT with CODE 1 --> USER CANCEL
echo "# CANCEL upload"
exit 1
fi
# test upload
gotFile=$(ls /home/admin/channel.backup | grep -c 'channel.backup')
done
# EXIT with CODE 1 --> FILE UPLOADED
echo
echo "# OK channel.backup uploaded"
sleep 2
exit 0
else
echo "unknown parameter '${mode}' - exit"
fi