#!/bin/bash echo "Starting the main menu ..." # CONFIGFILE - configuration of RaspiBlitz configFile="/mnt/hdd/raspiblitz.conf" # INFOFILE - state data from bootstrap infoFile="/home/admin/raspiblitz.info" # check if HDD is connected hddExists=$(lsblk | grep -c sda1) if [ ${hddExists} -eq 0 ]; then # check if there is maybe a HDD but woth no partitions noPartition=$(lsblk | grep -c sda) if [ ${noPartition} -eq 1 ]; then echo "***********************************************************" echo "WARNING: HDD HAS NO PARTITIONS" echo "***********************************************************" echo "Press ENTER to create a Partition - or CTRL+C to abort" read key echo "Creating Partition ..." sudo parted -s /dev/sda mklabel msdos sudo parted -s /dev/sda unit s mkpart primary `sudo parted /dev/sda unit s print free | grep 'Free Space' | tail -n 1` echo "DONE." sleep 3 else echo "***********************************************************" echo "WARNING: NO HDD FOUND -> Shutdown, connect HDD and restart." echo "***********************************************************" exit fi fi # check data from _bootstrap.sh that was running on device setup bootstrapInfoExists=$(ls $infoFile | grep -c '.info') if [ ${bootstrapInfoExists} -eq 0 ]; then echo "***********************************************************" echo "WARNING: NO raspiblitz.info FOUND -> bootstrap not running?" echo "***********************************************************" exit fi # load the data from the info file (will get produced on every startup) source ${infoFile} if [ "${state}" = "recovering" ]; then echo "***********************************************************" echo "WARNING: bootstrap still updating - close SSH, login later" echo "To monitor progress --> tail -n1000 -f raspiblitz.log" echo "***********************************************************" exit fi # signal that after bootstrap recover user dialog is needed recoveredInfoExists=$(sudo ls /home/admin/raspiblitz.recover.info 2>/dev/null | grep -c '.info') if [ ${recoveredInfoExists} -gt 0 ]; then echo "System recovered - needs final user settings" /home/admin/20recoverDialog.sh exit 1 fi # signal that a reindex was triggered if [ "${state}" = "reindex" ]; then echo "Re-Index in progress ... start monitoring:" /home/admin/config.scripts/network.reindex.sh exit 1 fi # singal that torrent is in re-download if [ "${state}" = "retorrent" ]; then echo "Re-Index in progress ... start monitoring:" /home/admin/50torrentHDD.sh sudo sed -i "s/^state=.*/state=repair/g" /home/admin/raspiblitz.info /home/admin/00raspiblitz.sh exit fi # singal that copstation is running if [ "${state}" = "copystation" ]; then echo "Copy Station is Runnning ..." echo "reboot to return to normal" sudo /home/admin/XXcopyStation.sh exit fi # if pre-sync is running - stop it - before continue if [ "${state}" = "presync" ]; then # stopping the pre-sync echo "" # analyse if blockchain was detected broken by pre-sync blockchainBroken=$(sudo tail /mnt/hdd/bitcoin/debug.log 2>/dev/null | grep -c "Please restart with -reindex or -reindex-chainstate to recover.") if [ ${blockchainBroken} -eq 1 ]; then # dismiss if its just a date thing futureBlock=$(sudo tail /mnt/hdd/bitcoin/debug.log 2>/dev/null | grep "Please restart with -reindex or -reindex-chainstate to recover." | grep -c "block database contains a block which appears to be from the future") if [ ${futureBlock} -gt 0 ]; then blockchainBroken=0 echo "-> Ignore reindex - its just a future block" fi fi if [ ${blockchainBroken} -eq 1 ]; then echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "Detected corrupted blockchain on pre-sync !" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "Deleting blockchain data ..." echo "(needs to get downloaded fresh during setup)" sudo rm -f -r /mnt/hdd/bitcoin else echo "************************************" echo "Preparing ... pls wait (up to 1min) " echo "************************************" sudo -u root bitcoin-cli -conf=/home/admin/assets/bitcoin.conf stop 2>/dev/null echo "Calling presync to finish up .." sleep 50 fi # unmount the temporary mount echo "Unmount HDD .." sudo umount -l /mnt/hdd sleep 3 # update info file state=waitsetup sudo sed -i "s/^state=.*/state=waitsetup/g" $infoFile sudo sed -i "s/^message=.*/message='Pre-Sync Stopped'/g" $infoFile fi # if state=ready -> setup is done or started if [ "${state}" = "ready" ]; then configExists=$(ls ${configFile} | grep -c '.conf') if [ ${configExists} -eq 1 ]; then echo "loading config data" source ${configFile} else echo "setup still in progress - setupStep(${setupStep})" fi fi ## default menu settings # to fit the main menu without scrolling: HEIGHT=13 WIDTH=64 CHOICE_HEIGHT=6 BACKTITLE="RaspiBlitz" TITLE="" MENU="Choose one of the following options:" OPTIONS=() # check if RTL web interface is installed runningRTL=$(sudo ls /etc/systemd/system/RTL.service 2>/dev/null | grep -c 'RTL.service') # function to use later waitUntilChainNetworkIsReady() { source ${configFile} echo "checking ${network}d - please wait .." echo "can take longer if device was off or first time" while : do # check for error on network sudo -u bitcoin ${network}-cli -datadir=/home/bitcoin/.${network} getblockchaininfo 1>/dev/null 2>error.tmp clienterror=`cat error.tmp` rm error.tmp # check for missing blockchain data minSize=250000000000 if [ "${network}" = "litecoin" ]; then minSize=20000000000 fi blockchainsize=$(sudo du -shbc /mnt/hdd/${network} 2>/dev/null | head -n1 | awk '{print $1;}') if [ ${#blockchainsize} -gt 0 ]; then if [ ${blockchainsize} -lt ${minSize} ]; then echo "blockchainsize(${blockchainsize})" echo "Missing Blockchain Data (<${minSize}) ..." clienterror="missing blockchain" sleep 3 fi fi if [ ${#clienterror} -gt 0 ]; then # analyse LOGS for possible reindex reindex=$(sudo cat /mnt/hdd/${network}/debug.log 2>/dev/null | grep -c 'Please restart with -reindex or -reindex-chainstate to recover') if [ ${reindex} -gt 0 ]; then # dismiss if its just a date thing futureBlock=$(sudo tail /mnt/hdd/${network}/debug.log 2>/dev/null | grep "Please restart with -reindex or -reindex-chainstate to recover" | grep -c "block database contains a block which appears to be from the future") if [ ${futureBlock} -gt 0 ]; then blockchainBroken=0 echo "-> Ignore reindex - its just a future block" fi fi if [ ${reindex} -gt 0 ] || [ "${clienterror}" = "missing blockchain" ]; then echo "!! DETECTED NEED FOR RE-INDEX in debug.log ... starting repair options." sudo sed -i "s/^state=.*/state=repair/g" /home/admin/raspiblitz.info sleep 3 dialog --backtitle "RaspiBlitz - Repair Script" --msgbox "Your blockchain data needs to be repaired. This can be due to power problems or a failing HDD. Please check the FAQ on RaspiBlitz Github 'My blockchain data is corrupted - what can I do?' https://github.com/rootzoll/raspiblitz/blob/master/FAQ.md The RaspiBlitz will now try to help you on with the repair. To run a BACKUP of funds & channels first is recommended. " 13 65 clear # Basic Options OPTIONS=(TORRENT "Redownload Prepared Torrent (DEFAULT)" \ COPY "Copy from another Computer (SKILLED)" \ REINDEX "Resync thru ${network}d (TAKES VERY VERY LONG)" \ BACKUP "Run Backup LND data first (optional)" ) CHOICE=$(dialog --backtitle "RaspiBlitz - Repair Script" --clear --title "Repair Blockchain Data" --menu "Choose a repair/recovery option:" 11 60 6 "${OPTIONS[@]}" 2>&1 >/dev/tty) clear if [ "${CHOICE}" = "TORRENT" ]; then echo "Starting TORRENT ..." sudo sed -i "s/^state=.*/state=retorrent/g" /home/admin/raspiblitz.info /home/admin/50torrentHDD.sh sudo sed -i "s/^state=.*/state=repair/g" /home/admin/raspiblitz.info /home/admin/00raspiblitz.sh exit elif [ "${CHOICE}" = "COPY" ]; then echo "Starting COPY ..." sudo sed -i "s/^state=.*/state=recopy/g" /home/admin/raspiblitz.info /home/admin/50copyHDD.sh sudo sed -i "s/^state=.*/state=repair/g" /home/admin/raspiblitz.info /home/admin/00raspiblitz.sh exit elif [ "${CHOICE}" = "REINDEX" ]; then echo "Starting REINDEX ..." sudo /home/admin/config.scripts/network.reindex.sh exit elif [ "${CHOICE}" = "BACKUP" ]; then sudo /home/admin/config.scripts/lnd.rescue.sh backup echo "PRESS ENTER to return to menu." read key /home/admin/00raspiblitz.sh exit else echo "CANCEL" exit fi fi # let 80scanLND script to the info to use /home/admin/80scanLND.sh if [ $? -gt 0 ]; then echo "${network} error: ${clienterror}" exit 0 fi else locked=$(sudo -u bitcoin /usr/local/bin/lncli --chain=${network} --network=${chain}net getinfo 2>&1 | grep -c unlock) if [ ${locked} -gt 0 ]; then uptime=$(awk '{printf("%d\n",$1 + 0.5)}' /proc/uptime) if [ "${autoUnlock}" == "on" ] && [ ${uptime} -lt 300 ]; then # give autounlock 5 min after startup to react sleep 1 else # check how many times LND was restarted source <(sudo /home/admin/config.scripts/blitz.statusscan.sh) if [ ${startcountLightning} -lt 4 ]; then /home/admin/AAunlockLND.sh echo "Starting up Wallet ... (10sec)" sleep 5 sleep 5 echo "please wait ... update to next screen can be slow" else /home/admin/80scanLND.sh lightning-error echo "(exit after too much restarts/unlocks - restart to try again)" exit 0 fi fi fi lndSynced=$(sudo -u bitcoin /usr/local/bin/lncli --chain=${network} --network=${chain}net getinfo 2>/dev/null | jq -r '.synced_to_chain' | grep -c true) if [ ${lndSynced} -eq 0 ]; then /home/admin/80scanLND.sh if [ $? -gt 0 ]; then exit 0 fi else # everything is ready - return from loop return fi fi sleep 5 done } if [ ${#setupStep} -eq 0 ]; then echo "WARN: no setup step found in raspiblitz.info" setupStep=0 fi if [ ${setupStep} -eq 0 ]; then # check data from boostrap # TODO: when olddata --> CLEAN OR MANUAL-UPDATE-INFO if [ "${state}" = "olddata" ]; then # old data setup BACKTITLE="RaspiBlitz - Manual Update" TITLE="⚡ Found old RaspiBlitz Data on HDD ⚡" MENU="\n ATTENTION: OLD DATA COULD CONTAIN FUNDS\n" OPTIONS+=(MANUAL "read how to recover your old funds" \ DELETE "erase old data, keep blockchain, reboot" ) HEIGHT=11 else isRaspbian=$(cat /etc/os-release 2>/dev/null | grep -c 'Raspbian') if [ ${isRaspbian} -gt 0 ]; then # show hardware test /home/admin/05hardwareTest.sh # start setup BACKTITLE="RaspiBlitz - Setup" TITLE="⚡ Welcome to your RaspiBlitz ⚡" MENU="\nChoose how you want to setup your RaspiBlitz: \n " OPTIONS+=(BITCOIN "Setup BITCOIN and Lightning (DEFAULT)" \ LITECOIN "Setup LITECOIN and Lightning (EXPERIMENTAL)" ) HEIGHT=11 else # start setup BACKTITLE="RaspiBlitz - Setup" TITLE="⚡ Welcome to your RaspiBlitz ⚡" MENU="\nStart to setup your RaspiBlitz: \n " OPTIONS+=(BITCOIN "Setup BITCOIN and Lightning") HEIGHT=10 fi fi elif [ ${setupStep} -lt 100 ]; then # continue setup BACKTITLE="${hostname} / ${network} / ${chain}" TITLE="⚡ Welcome to your RaspiBlitz ⚡" MENU="\nThe setup process is not finished yet: \n " OPTIONS+=(CONTINUE "Continue Setup of your RaspiBlitz") HEIGHT=10 else # check if LND needs re-setup source <(sudo /home/admin/config.scripts/lnd.check.sh basic-setup) if [ ${wallet} -eq 0 ] || [ ${macaroon} -eq 0 ] || [ ${config} -eq 0 ] || [ ${tls} -eq 0 ]; then echo "WARN: LND needs re-setup" /home/admin/70initLND.sh exit 0 fi # wait all is synced and ready waitUntilChainNetworkIsReady # check if there is a channel.backup to activate gotSCB=$(ls /home/admin/channel.backup 2>/dev/null | grep -c 'channel.backup') if [ ${gotSCB} -eq 1 ]; then echo "*** channel.backup Recovery ***" lncli restorechanbackup --multi_file=/home/admin/channel.backup 2>/home/admin/.error.tmp error=`cat /home/admin/.error.tmp` rm /home/admin/.error.tmp 2>/dev/null if [ ${#error} -gt 0 ]; then # output error message echo "" echo "!!! FAIL !!! SOMETHING WENT WRONG:" echo "${error}" # check if its possible to give background info on the error notMachtingSeed=$(echo $error | grep -c 'unable to unpack chan backup') if [ ${notMachtingSeed} -gt 0 ]; then echo "--> ERROR BACKGROUND:" echo "The WORD SEED is not matching the channel.backup file." echo "Either there was an error in the word seed list or" echo "or the channel.backup file is from another RaspiBlitz." echo fi # basic info on error echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo echo "You can try after full setup to restore channel.backup file again with:" echo "lncli restorechanbackup --multi_file=/home/admin/channel.backup" echo echo "Press ENTER to continue for now ..." read key else mv /home/admin/channel.backup /home/admin/channel.backup.done dialog --title " OK channel.backup IMPORT " --msgbox " LND accepted the channel.backup file you uploaded. It will now take around a hour until you can see, if LND was able to recover funds from your channels. " 9 56 fi fi #forward to main menu /home/admin/00mainMenu.sh exit 0 fi CHOICE=$(dialog --clear \ --backtitle "$BACKTITLE" \ --title "$TITLE" \ --menu "$MENU" \ $HEIGHT $WIDTH $CHOICE_HEIGHT \ "${OPTIONS[@]}" \ 2>&1 >/dev/tty) clear case $CHOICE in CLOSE) exit 1; ;; BITCOIN) sed -i "s/^network=.*/network=bitcoin/g" ${infoFile} sed -i "s/^chain=.*/chain=main/g" ${infoFile} /home/admin/10setupBlitz.sh exit 1; ;; LITECOIN) sed -i "s/^network=.*/network=litecoin/g" ${infoFile} sed -i "s/^chain=.*/chain=main/g" ${infoFile} /home/admin/10setupBlitz.sh exit 1; ;; CONTINUE) /home/admin/10setupBlitz.sh exit 1; ;; OFF) echo "" echo "LCD turns white when shutdown complete." echo "Then wait 5 seconds and disconnect power." echo "-----------------------------------------------" echo "stop lnd - please wait .." sudo systemctl stop lnd echo "stop ${network}d (1) - please wait .." sudo -u bitcoin ${network}-cli stop sleep 10 echo "stop ${network}d (2) - please wait .." sudo systemctl stop ${network}d sleep 3 sync echo "starting shutdown ..." sudo shutdown now exit 0 ;; MANUAL) echo "************************************************************************************" echo "PLEASE go to RaspiBlitz FAQ:" echo "https://github.com/rootzoll/raspiblitz" echo "And check: How can I recover my coins from a failing RaspiBlitz?" echo "************************************************************************************" exit 0 ;; DELETE) sudo /home/admin/XXcleanHDD.sh sudo shutdown -r now exit 0 ;; X) lncli -h echo "OK you now on the command line." echo "You can return to the main menu with the command:" echo "raspiblitz" ;; R) /home/admin/00raspiblitz.sh ;; U) # unlock /home/admin/AAunlockLND.sh /home/admin/00raspiblitz.sh ;; esac