raspiblitz/home.admin/config.scripts/cln.backup.sh

397 lines
13 KiB
Bash
Raw Normal View History

merging pre-1.7.1 (#2462) * fix copychain returns * typo in sync loop * stop services on inconsistent state * calling correct provisioning * apply bitcoin and lncli aliases in all scripts * network.aliases: add CLNETWORK * make cln default plugin dir: cln-plugins-enabled similar to the nginx model make 2 directories for plugins: cln-plugins-enabled - symlinked to ~/.lightning/plugins plugins from here are loaded automatically on cln start cln-plugins-available: plugins are downloaded here to be run until the next cln restart (or stopped with runonce) note the disk is mounted with noexec so plugins can't run from there discuss in: https://github.com/rootzoll/raspiblitz/issues/2295 * move shutdown script * change all place where shutdown script is used * change notify & release * moved shutdown script * moved shutdown scripts * add more debug info * moving github script * remove chain in sync * no longer needed chain in sync * move debug script * patch patch command * make sure setup file is sourced * remove debug output * make sure lnd is put behind tor * change indent * get fresh sync progress * avoid scrolling in menus * use new selfsignedcert if no lnd tls.cert present * sparko: add info and connect menu with own cert https://github.com/rootzoll/raspiblitz/issues/2295 * cln.rest: add connect option for Zeus https://github.com/rootzoll/raspiblitz/issues/2295 * cln: add the backup plugin + options Usage options: cln-plugin.backup.sh [on] [testnet|mainnet|signet] cln-plugin.backup.sh [restore] [testnet|mainnet|signet] [force] cln-plugin.backup.sh [backup-compact] [testnet|mainnet|signet] https://github.com/lightningd/plugins/tree/master/backup Discussed in: https://github.com/rootzoll/raspiblitz/issues/2295 * cln: add cln-plugin.standard.python.sh Install and show the output of the chosen plugin for C-lightning Usage: cln-plugin.standard-python.sh on [plugin-name] [testnet|mainnet|signet] [runonce] tested plugins: summary | helpme | feeadjuster find more at: https://github.com/lightningd/plugins discussed in: https://github.com/rootzoll/raspiblitz/issues/2295 * shellcheck: change all `egrep` to `grep -E` https://github.com/koalaman/shellcheck/wiki/SC2196 * do not resolve aliases, use as variables * lnd: fix lnd.conf for parallel networks discussed in: https://github.com/rootzoll/raspiblitz/issues/2290 * lnd: add LND option for parallel networks * deprecate Testnet in SETTINGS keysend and autopilot only for mainnet due to: https://github.com/rootzoll/raspiblitz/issues/2290 * lnd: autopilot and autounlock for testnet * fix comments * add the SYSTEM menu for parallel chains * RTL update to v0.11.0 make chain specific directory for the config: /home/rtl/${netprefix}RTL/ use ${netprefix}lnd.conf in config override Environmen tvaribales for cln in the systemd service: /etc/systemd/system/${netprefix}${typeprefix}RTL.service discussed in: https://github.com/rootzoll/raspiblitz/issues/2384 * lnd.setname.sh for testnet * display ${CHAIN} in the SYSTEM menu options * keep _aliases file when live patches are applied * all lncli_aliases to be used as variables * default to KIllMode=control-group in services https://www.man7.org/linux/man-pages/man5/systemd.kill.5.html discussed in: https://github.com/rootzoll/raspiblitz/issues/1901 * add cln.hsmtool.sh for hsm_secret handling encrypt | decrypt | autounlock the hsm_secret for C-lightning usage: cln.hsmtool.sh [unlock] [testnet|mainnet|signet] cln.hsmtool.sh [encrypt|decrypt] [testnet|mainnet|signet] cln.hsmtool.sh [autounlock-on|autounlock-off] [testnet|mainnet|signet] discussed in: https://github.com/rootzoll/raspiblitz/issues/2295 * add cln.install-service.sh to set up cln with systemd script to set up or update the CLN systemd service checks for hsm_secret encryption, autounlock and the sparko plugin usage: /home/admin/config.scripts/cln.install-service.sh $CHAIN discussed in: https://github.com/rootzoll/raspiblitz/issues/2295 * use symlink to cln-plugins-enabled for all plugins * keep lnd autopilot and autounlock mainnet only mainnet only settings: lnd autopilot lnd keysend circuibreaker lnd autounlock StaticChannelBackup to DropBox and USB * cln FUNDING fix parsing address * cln.hsmtool: add change-password and lock options * always set password A * cached peer info * fix printing cache * fix check for existing files * handle bitcoind not running * result with newline * test line break * test new line * test new line * two vars on output * #2388 improve online check (less pinging) * used cached peer status * move chache * cach file permissions * allow sudo call * fix cache * remove double scan info * add conf info to sync screen * reorder info * add space * add space * order info * internet suppress error messages * order info * fix offering Blockchain copy * fix hostname * final ready state info * lnd unlock after provision * remove debug exit * harmonize ready state * add status to lnd unlock * update lnd unlock script * edit the unlock * remove debug echo * add debug * add debug * fix if statement * debug output * switch position of source setupdata * #1126 preparing new setup with new c-lightning (#2396) * move debug script * patch patch command * make sure setup file is sourced * remove debug output * make sure lnd is put behind tor * change indent * get fresh sync progress * always set password A * cached peer info * fix printing cache * fix check for existing files * handle bitcoind not running * result with newline * test line break * test new line * test new line * two vars on output * #2388 improve online check (less pinging) * used cached peer status * move chache * cach file permissions * allow sudo call * fix cache * remove double scan info * add conf info to sync screen * reorder info * add space * add space * order info * internet suppress error messages * order info * fix offering Blockchain copy * fix hostname * final ready state info * lnd unlock after provision * remove debug exit * harmonize ready state * add status to lnd unlock * update lnd unlock script * edit the unlock * remove debug echo * add debug * add debug * fix if statement * debug output * switch position of source setupdata * lnd.unlock: fix typo * netwok.monitor.sh debug * cln-plugin.summary: fix paths * rtl: fix permission of config on copy * CASHOUT: use aliases for lnd * rtl: install correctly for paralell chains * use CHAIN in CLN and LND menu * cln: add CASHOUT option * CLOSEALL and CASHOUT: Improve labels and comments Explaining CASHOUT in the label as discussed in: https://github.com/rootzoll/raspiblitz/issues/2358 * cln.install: fix tor config * cln: installthe latest master until the next release * _commands: source _aliases only if exists * network aliases: fall back to 'main' for 'chain' * new setup: keep testnet3 blocks and chainstate * new setup: improve capitalization in menu * improve help and comments * cln: install Sparko if configured, but not present * cln: add new wallet and import seed options * fix peernum * make sure that aliases get created on lnd setup * no error if aliases not yet exist * debug state * fix network alias when not set * fix syntax error * add debug error info * mute unlocking echos * add debug wait * add debug wait * make sure info is uptodate * make alias info as defaults * rename option * update sync info for no lightning * add action string * update sync info * move name dialog * wait for sync progress info * wait for syncprogress info * fix syntax * get fresh data * make sure to disable lnd * add c-lightning to debug * add setup logs to debug output * fix syntax error * add new-force wallet * try fix call hsmtool * hsm output tool * fix output * add seed-force * refactor blitz.mnemonic.py * test seed * debug info * dump object * try check * correct putput * fix syntax * check lnd for valid seed * fix gui * add Suez install script discussed in: https://github.com/rootzoll/raspiblitz/issues/2366 * cln rescue file export * get correct version * add cln export gui * cln.backup.sh cln-import * correct bytesize * generate cln wallet with passwordc * fix syntax * fix syntax * mute not needed error msg * PEERING: correct message on success * cln.install-service: fix sparko check * add Suez to menu for CLN and LND needs to be installed with the bitcoin user to be able to interact with CLN related: https://github.com/rootzoll/raspiblitz/issues/2366 * debug _provison.setup.sh stop bitcoind and restart with new config to avoid rpc password error disable and enable service instead of daemon-reload CLN: don't use passwordC as seedPassword * add cln.setname.sh make lnd.setname.sh work with parallel wallets * improve comments * SYSTEM: add CLNLOG and CLNCONF options * SYSTEM menu fixes * cln: add more aliases cln, clnlog, clnconf * cln: activate the backup plugin on every install * SERVICES menu: fix chantools/CLN switch * cln: load plugins from ${netprefix}cln-plugins-enabled changed the config paths to $lightning-dir/config or /networkname/config plugins are downloaded to the SDcard: /home/bitcoin/cln-plugins-available/ symlinked and loaded automatically from: /home/bitcoin/${netprefix}cln-plugins-enabled Related: #2295 * sparko: don't show logs after install * #2425 Adding experimental Blitz WebUI & API (#2426) * no password C & D when cln * add debug echos * set defaults before * #2228 wider grep to detect nvms (#2427) * cln.hsmtool: init backup with the new wallet * cln.install: fix access to raspiblitz.conf * cln-plugin.backup: fix path to backup-cli * cln: hide unhelpful warnings during setup * remove old jinja template rendering * fix lnd unlock detection * cln: look for files in .lightning dir with sudo * cln: correct lightning name in FInalDialog + typo * cln: make sure .lightning/bitcoin dir exists * FinalDialog: make the 24 words fit * cln.install.sh: create cln config if not present * Simplify localIP detection and improve compatibility (#2432) * show tail info on provision * only show lnd options when activated * fix syntax * only show main lightning impl options for RC1 * cln: always start the lightnind.service * cln: clear before showing summary * start cln on the end of provisioning * exit 0 on cln menu * press key after single actions * remove key press on cln actions * change to none * detect cln running * fix syntax * fix lightniing info * add TODO for CLN * add clnblockheight * zty with user bitcoin * check synced to chain for cln * fix increment * try scanprogress * use cln sync detection and progress * replace LNTYPE * next line * fix spaces * fix spaces * Update README.md (#2456) Fix 404 * Fix FAQ links (#2441) * Fix invalid URL ( (#2440) * support channels (#2382) * use #2370 height optimization * adjust exit codes in menu scripts * adjust password menu exit codes * adapt shutdown for cln * settings adapt to running lightning impl * fix syntax * debug info * add debug * better height * add default values * add config entry if not there yet * change default value * Added exit info for cln * make sure to load config file if available * add sparko to menu * add default for sparko * replace default sparko entry * show sparko installed or not * add more description to sparko option * RTL for clightnign in service menu * main menu item rtl * add RTL description * debug in RTL install * install sparko on recovery * update menu with cln * rework menu options Co-authored-by: openoms <oms@tuta.io> Co-authored-by: openoms <43343391+openoms@users.noreply.github.com> Co-authored-by: rek79 <rek79@users.noreply.github.com> Co-authored-by: Bitpaint <67663265+bitpaint@users.noreply.github.com> Co-authored-by: João Thallis <joaothallis@icloud.com> Co-authored-by: Peter Flock <78184669+peterflock@users.noreply.github.com> Co-authored-by: nyxnor <nyxnor@protonmail.com>
2021-08-04 00:18:30 +02:00
#!/bin/bash
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
echo "# ---------------------------------------------------"
echo "# CLN RESCUE FILE (tar.gz of complete cln directory)"
echo "# ---------------------------------------------------"
echo "# cln.backup.sh cln-export"
echo "# cln.backup.sh cln-export-gui"
echo "# cln.backup.sh cln-import [file]"
echo "# cln.backup.sh cln-import-gui [setup|production] [?resultfile]"
echo "# ---------------------------------------------------"
echo "# SEED WORDS"
echo "# ---------------------------------------------------"
echo "# cln.backup.sh seed-export-gui [lndseeddata]"
echo "# cln.backup.sh seed-import-gui [resultfile]"
exit 1
fi
# 1st PARAMETER action
mode="$1"
################################
# CLN RESCUE FILE - EXPORT
################################
if [ ${mode} = "cln-export" ]; then
echo "# *** CLN.RESCUE --> BACKUP"
downloadPath="/home/admin"
fileowner="admin"
# stop LND
echo "# Stopping cln..."
sudo systemctl stop lightningd 1>/dev/null
sleep 5
echo "# OK"
echo
# add cln version info into lnd dir (to detect needed updates later)
clnVersion=$(sudo -u bitcoin lightning-cli --version | cut -d '-' -f1 | cut -d 'v' -f2)
sudo rm /mnt/hdd/app-data/.lightning/version.info 2>/dev/null
echo "${clnVersion}" > /home/admin/cln.version.info
sudo mv /home/admin/cln.version.info /mnt/hdd/app-data/.lightning/version.info
sudo chown bitcoin:bitcoin /mnt/hdd/app-data/.lightning/version.info
# zip it
sudo tar -zcvf ${downloadPath}/cln-rescue.tar.gz /mnt/hdd/app-data/.lightning 1>&2
sudo chown ${fileowner}:${fileowner} ${downloadPath}/cln-rescue.tar.gz 1>&2
# delete old backups
rm ${downloadPath}/cln-rescue-*.tar.gz 2>/dev/null 1>/dev/null
# name with md5 checksum
md5checksum=$(md5sum ${downloadPath}/cln-rescue.tar.gz | head -n1 | cut -d " " -f1)
mv ${downloadPath}/cln-rescue.tar.gz ${downloadPath}/cln-rescue-${md5checksum}.tar.gz 1>&2
byteSize=$(ls -l ${downloadPath}/cln-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 "# cln service is stopped for security"
echo "filename='${downloadPath}/cln-rescue-${md5checksum}.tar.gz'"
echo "fileowner='${fileowner}'"
echo "size=${byteSize}"
exit 0
fi
if [ ${mode} = "cln-export-gui" ]; then
# create lnd rescue file
source <(/home/admin/config.scripts/cln.backup.sh cln-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: ${size} 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
################################
# CLN RESCUE FILE - IMPORT
################################
if [ ${mode} = "cln-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 cln..."
sudo systemctl stop lightningd 1>/dev/null
sleep 5
# clean DIR
echo "# cleaning old CLN data ..."
sudo rm -r /mnt/hdd/app-data/.lightning/* 1>/dev/null 2>/dev/null
# unpack zip
echo "# restoring CLN data from ${filename} ..."
sudo tar -xf ${filename} -C / 1>/dev/null
sudo chown -R bitcoin:bitcoin /mnt/hdd/app-data/.lightning 1>/dev/null
echo "# DONE - lightningd service is still stopped - start manually with command:"
echo "# sudo systemctl start lightningd"
exit 0
fi
if [ ${mode} = "cln-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 RESULTFILE to store results in
if [ "${scenario}" == "setup" ]; then
RESULTFILE=$3
if [ "${RESULTFILE}" == "" ]; 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 cln-rescue backup file on your laptop you can now"
echo "upload it and restore your latest C-Lightning state."
echo
echo "CAUTION: Dont restore outdated states - risk of loosing funds!"
echo
echo "To make upload open a new terminal on your laptop,"
echo "change into the directory where your cln-rescue file is and"
echo "COPY, PASTE AND EXECUTE THE FOLLOWING COMMAND:"
echo "scp -r ./cln-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 cln-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 "PRESS ENTER to continue & retry ... or 'x'+ ENTER to cancel"
read keyRetry
elif [ "${error}" == "multiple" ]; then
echo "!! WARNING !!"
echo "There are multiple cln-rescue files in directory ${defaultUploadPath}"
echo "Make sure you upload only one tar.gz-file and start again."
echo "PRESS ENTER to continue & retry ... or 'x'+ ENTER to cancel"
read keyRetry
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 ... or 'x'+ ENTER to cancel"
read keyRetry
else
# create no result file and exit
echo "!! WARNING !! Unknown State (report to devs)"
exit 1
fi
if [ "${keyRetry}" == "x" ] || [ "${keyRetry}" == "X" ] || [ "${keyRetry}" == "'x'" ]; then
# create no result file and exit
echo "# USER CANCEL"
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 "# result in: ${RESULTFILE} (remember to make clean delete once processed)"
echo "clnrescue='${filename}'" >> $RESULTFILE
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 C-Lightning 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 CLN data & restoring imported rescue file ..."
source <(sudo /home/admin/config.scripts/cln.backup.sh cln-import ${filename})
# TODO: check if update of CLN is needed (see detailes in cln-import) for edge case
# TODO: auto-unlock for c-lightning?
# turn off auto-unlock if activated because password c might now change
# if [ "${autoUnlock}" == "on" ]; then
# /home/admin/config.scripts/cln.autounlock.sh off
# fi
# restarting lnd & give final info
sudo systemctl start lightningd
echo "DONE - lightningd is now restarting .. Password C is now like within your rescue file"
echo "Check that CLN 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
####################################
# SEED WORDS - GUI PARTS
####################################
if [ ${mode} = "seed-export-gui" ]; then
# use text snippet for testing:
#
# 2nd PARAMETER: lnd seed data
seedwords6x4=$2
if [ "${seedwords6x4}" == "" ]; then
echo "error='missing parameter'"
exit 1
fi
ack=0
while [ ${ack} -eq 0 ]
do
whiptail --title "IMPORTANT SEED WORDS - PLEASE WRITE DOWN" --msgbox "C-Lightning 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
# fake seed 24 words for testing input:
# eins zwei polizei drei vier great idea fünf sechs alte keks sieben auch gute nacht ja ja ja was ist los was ist das
# scenario setup needs a 3rd parameter - the RESULTFILE to store results in
RESULTFILE=$2
if [ "${RESULTFILE}" == "" ]; then
echo "error='missing parameter'"
exit 1
fi
# 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 - C-lightning 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
# check if words are valid seed
source <(python /home/admin/config.scripts/blitz.mnemonic.py test "${wordstring}")
if [ "${valid}" == "0" ]; then
whiptail --title " WARNING " --yes-button "Try Again" --no-button "Cancel" --yesno "
The word list has 24 words BUT its not a
valid seed word list by our test.
Please check for typos.
" 12 52
if [ $? -eq 1 ]; then
clear
echo "# CANCEL empty results in: ${RESULTFILE}"
exit 1
fi
else
echo "OK - 24 words"
wordsCorrect=1
fi
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
clear
echo "# CANCEL empty results in: ${RESULTFILE}"
exit 1
fi
fi
done
# dont ask for password D (seed password) because raspiblitz never had that option for cln
passwordD=""
# writing result file data
clear
echo "# result in: ${RESULTFILE} (remember to make clean delete once processed)"
echo "seedWords='${wordstring}'" >> $RESULTFILE
echo "seedPassword='${passwordD}'" >> $RESULTFILE
exit 0
fi
echo "error='unknown parameter'"
exit 1