#!/bin/bash # TODO: check if services/apps are running and stop all ... or let thet to outside? # TODO: check if old data ... or let this to outside? if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then echo "# managing the RaspiBlitz data - import, export, backup." echo "# blitz.migration.sh [status|export|import|export-gui|import-gui]" echo "error='missing parameters'" exit 1 fi # check if started with sudo if [ "$EUID" -ne 0 ]; then echo "error='missing sudo'" exit 1 fi # check if data drive is mounted - other wise cannot operate isMounted=$(sudo df | grep -c /mnt/hdd) if [ ${isMounted} -eq 0 ]; then echo "# FAIL check why /mnt/hdd is not available/mounted" echo "error='datadrive not found'" exit 1 fi ################### # STATUS ################### # gathering system info isBTRFS=$(lsblk -o FSTYPE,MOUNTPOINT | grep /mnt/hdd | awk '$1=$1' | cut -d " " -f 1 | grep -c btrfs) # set place where zipped TAR file gets stored defaultZipPath="/mnt/hdd/temp" # SCP download and upload links localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') scpDownload="scp -r 'bitcoin@${localip}:${defaultZipPath}/raspiblitz-*.tar.gz' ./" scpUpload="scp -r './raspiblitz-*.tar.gz bitcoin@${localip}:${defaultZipPath}'" # output status data & exit if [ "$1" = "status" ]; then echo "# RASPIBLITZ Data Import & Export" echo "isBTRFS=${isBTRFS}" echo "scpDownload=\"${scpDownload}\"" echo "scpUpload=\"${scpUpload}\"" exit 1 fi ######################### # EXPORT RaspiBlitz Data ######################### if [ "$1" = "export" ]; then echo "# RASPIBLITZ DATA --> EXPORT" # collect files to exclude in export in temp file echo "*.tar.gz" > ~/.exclude.temp echo "/mnt/hdd/bitcoin" >> ~/.exclude.temp echo "/mnt/hdd/litecoin" >> ~/.exclude.temp echo "/mnt/hdd/swapfile" >> ~/.exclude.temp echo "/mnt/hdd/temp" >> ~/.exclude.temp echo "/mnt/hdd/lost+found" >> ~/.exclude.temp echo "/mnt/hdd/snapshots" >> ~/.exclude.temp echo "/mnt/hdd/torrent" >> ~/.exclude.temp echo "/mnt/hdd/app-storage" >> ~/.exclude.temp # copy bitcoin data files to backup dir (if bitcoin active) if [ -f "/mnt/hdd/bitcoin/bitcoin.conf" ]; then sudo mkdir -p /mnt/hdd/backup_bitcoin sudo cp /mnt/hdd/bitcoin/bitcoin.conf /mnt/hdd/backup_bitcoin/bitcoin.conf sudo cp /mnt/hdd/bitcoin/wallet.dat /mnt/hdd/backup_bitcoin/wallet.dat 2>/dev/null fi # copy litecoin data files to backup dir (if litecoin active) if [ -f "/mnt/hdd/litecoin/litecoin.conf" ]; then sudo mkdir -p /mnt/hdd/backup_litecoin sudo cp /mnt/hdd/bitcoin/litecoin.conf /mnt/hdd/backup_litecoin/litecoin.conf sudo cp /mnt/hdd/bitcoin/wallet.dat /mnt/hdd/backup_litecoin/wallet.dat 2>/dev/null fi # clean old backups from temp rm /hdd/temp/raspiblitz-*.tar.gz 2>/dev/null # get date stamp datestamp=$(date "+%y-%m-%d-%H-%M") echo "# datestamp=${datestamp}" # get name of RaspiBlitz from config (optional if exists) blitzname="-" source /mnt/hdd/raspiblitz.conf 2>/dev/null if [ ${#hostname} -gt 0 ]; then blitzname=$(echo "${hostname}" | sed 's/[^0-9a-z]*//g') blitzname=$(echo "-${blitzname}-") fi echo "# blitzname=${blitzname}" # zip it echo "# Building the Export File (this can take some time) .." sudo tar -zcvf ${defaultZipPath}/raspiblitz-export-temp.tar.gz -X ~/.exclude.temp /mnt/hdd 1>~/.include.temp 2>/dev/null # get md5 checksum echo "# Building checksum (can take also a while) ..." md5checksum=$(md5sum ${defaultZipPath}/raspiblitz-export-temp.tar.gz | head -n1 | cut -d " " -f1) echo "# md5checksum=${md5checksum}" # final renaming name="raspiblitz${blitzname}${datestamp}-${md5checksum}.tar.gz" echo "exportpath='${defaultZipPath}'" echo "filename='${name}'" sudo mv ${defaultZipPath}/raspiblitz-export-temp.tar.gz ${defaultZipPath}/${name} sudo chown bitcoin:bitcoin ${defaultZipPath}/${name} # delete temp files rm ~/.exclude.temp rm ~/.include.temp echo "scpDownload=\"${scpDownload}\"" echo "# OK - Export done" exit 0 fi if [ "$1" = "export-gui" ]; then # cleaning old migration files from blitz sudo rm ${defaultZipPath}/*.tar.gz # stopping lnd / bitcoin echo "--> stopping services ..." sudo systemctl stop lnd sudo systemctl stop bitcoind # create new migration file clear echo "--> creating blitz migration file ... (please wait)" source <(sudo /home/admin/config.scripts/blitz.migration.sh "export") if [ ${#filename} -eq 0 ]; then echo "# FAIL: was not able to create migration file" exit 0 fi # show info for migration echo echo "*******************************" echo "* DOWNLOAD THE MIGRATION FILE *" echo "*******************************" echo echo "ON YOUR LAPTOP - RUN IN NEW TERMINAL:" echo "${scpDownload}" echo "" echo "Use password A to authenticate file transfere." echo echo "Your Lightning node is now stopped. After download press ENTER to shutdown your raspiblitz." echo "To complete the data migration follow then instructions on the github FAQ." echo read key /home/admin/XXshutdown.sh exit 0 fi ######################### # IMPORT RaspiBlitz Data ######################### if [ "$1" = "import" ]; then # check second parameter for path and/or filename of import importFile="${defaultZipPath}/raspiblitz-*.tar.gz" if [ ${#2} -gt 0 ]; then # check if and/or filename of import containsPath=$(echo $2 | grep -c '/') if [ ${containsPath} -gt 0 ]; then startsOnPath=$(echo $2 | grep -c '^/') if [ ${startsOnPath} -eq 0 ]; then echo "# needs to be an absolut path: ${2}" echo "error='invalid path'" exit 1 else if [ -d "$2" ]; then echo "# using path from parameter to search for import" endsOnPath=$(echo $2 | grep -c '/$') if [ ${endsOnPath} -eq 1 ]; then importFile="${2}raspiblitz-*.tar.gz" else importFile="${2}/raspiblitz-*.tar.gz" fi else echo "# using path+file from parameter for import" importFile=$2 fi fi else # is just filename - to use with default path echo "# using file from parameter for import" importFile="${defaultZipPath}/${2}" fi fi # checking if file exists and unique echo "# checking for file with: ${importFile}" countZips=$(sudo ls ${importFile} 2>/dev/null | grep -c '.tar.gz') if [ ${countZips} -eq 0 ]; then echo "# can just find file when ends on .tar.gz and exists" echo "scpUpload=\"${scpUpload}\"" echo "error='file not found'" exit 1 elif [ ${countZips} -eq 1 ]; then importFile=$(sudo ls ${importFile}) else echo "# Multiple files found. Not sure which to use." echo "# Please use absolut-path+file as second parameter." echo "error='file not unique'" exit 1 fi echo "importFile='${importFile}'" echo "# Validating Checksum (can take some time) .." md5checksum=$(md5sum ${importFile} | head -n1 | cut -d " " -f1) isCorrect=$(echo ${importFile} | grep -c ${md5checksum}) if [ ${isCorrect} -eq 1 ]; then echo "# OK -> checksum looks good: ${md5checksum}" else echo "# FAIL -> Checksum not correct: ${md5checksum}" echo "# Maybe transfere/upload failed?" echo "error='bad checksum'" exit 1 fi echo "# Importing (overwrite) (can take some time) .." sudo tar -xf ${importFile} -C / # copy bitcoin/litecoin data backups back to orgplaces (if part of backup) if [ -d "/mnt/hdd/backup_bitcoin" ]; then echo "# Copying back bitcoin backup data .." sudo cp /mnt/hdd/backup_bitcoin/bitcoin.conf /mnt/hdd/bitcoin/bitcoin.conf sudo cp /mnt/hdd/backup_bitcoin/wallet.dat /mnt/hdd/bitcoin/wallet.dat 2>/dev/null fi if [ -d "/mnt/hdd/backup_litecoin" ]; then echo "# Copying back litecoin backup data .." sudo cp /mnt/hdd/backup_litecoin/litecoin.conf /mnt/hdd/litecoin/litecoin.conf sudo cp /mnt/hdd/backup_litecoin/wallet.dat /mnt/hdd/litecoin/wallet.dat 2>/dev/null fi echo "# OK done - you may now want to:" echo "# make sure that HDD is not registered in /etc/fstab & reboot" echo "# to kickstart recovering system based in imported data" exit 0 fi if [ "$1" = "import-gui" ]; then # get info about HDD source <(sudo /home/admin/config.scripts/blitz.datadrive.sh status) # make sure a HDD/SSD is connected if [ ${isMounted} -eq 1 ]; then fi # make sure HDD/SSD is not mounted # because importing migration just works during early setup if [ ${isMounted} -eq 1 ]; then echo "FAIL --> cannot import migration data when HDD(SDD is mounted" exit 1 fi # ask format for new HDD/SSD OPTIONS=(EXT4 "Ext4 & 1 Partition (default)" \ BTRFS "BTRFS & 3 Partinions (experimental)" ) CHOICE=$(whiptail --clear --title "Repair Options" --menu "" 9 52 2 "${OPTIONS[@]}" 2>&1 >/dev/tty) clear case $CHOICE in EXT4) echo "EXT4 FORMAT" ;; BTRFS) echo "BTRFS FORMAT" ;; esac exit 0 # cleaning old migration files from blitz sudo rm ${defaultZipPath}/*.tar.gz # make sure that temp directory exists and can be written by admin sudo mkdir -p ${defaultZipPath} chmod 777 -R ${defaultZipPath} 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 "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 admin@${localip}:${defaultZipPath}" echo "" echo "Use password A to authenticate file transfere." echo "PRESS ENTER when upload is done." read key countZips=$(sudo ls ${defaultZipPath}/raspiblitz-*.tar.gz 2>/dev/null | grep -c 'raspiblitz-') # in case no upload found if [ ${countZips} -eq 0 ]; then echo echo "FAIL: Was not able to detect uploaded file in ${defaultZipPath}" exit 0 fi # in case of multiple files if [ ${countZips} -gt 1 ]; then echo echo "FAIL: Multiple possible files detected in ${defaultZipPath}" exit 0 fi # restore upload echo echo "OK: Upload found in ${defaultZipPath} - restoring data ... (please wait)" source <(sudo /home/admin/config.scripts/blitz.migration.sh "import") # check result echo if [ ${#error} -gt 0 ]; then echo "FAIL: Was not able to restore data --> ${error}" else echo "OK: Migration data was imported" echo "You may need to redownload/validate/build blockchain data & indexes." fi exit 0 fi echo "error='unkown command'" exit 1