mirror of
https://github.com/rootzoll/raspiblitz.git
synced 2024-11-19 09:50:19 +01:00
524 lines
18 KiB
Bash
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 |