2019-12-10 20:48:28 +01:00
|
|
|
#!/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."
|
2020-02-14 14:35:11 +01:00
|
|
|
echo "# blitz.migration.sh [status|export|import|export-gui|import-gui]"
|
2020-01-20 21:05:40 +01:00
|
|
|
echo "error='missing parameters'"
|
2019-12-10 20:48:28 +01:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# check if started with sudo
|
|
|
|
if [ "$EUID" -ne 0 ]; then
|
2020-01-20 21:05:40 +01:00
|
|
|
echo "error='missing sudo'"
|
2019-12-10 20:48:28 +01:00
|
|
|
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
|
2019-12-15 01:34:51 +01:00
|
|
|
defaultZipPath="/mnt/hdd/temp"
|
2019-12-10 20:48:28 +01:00
|
|
|
|
|
|
|
# SCP download and upload links
|
|
|
|
localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')
|
2019-12-15 12:53:42 +01:00
|
|
|
scpDownload="scp -r 'bitcoin@${localip}:${defaultZipPath}/raspiblitz-*.tar.gz' ./"
|
2020-02-14 22:30:21 +01:00
|
|
|
scpUpload="scp -r './raspiblitz-*.tar.gz bitcoin@${localip}:${defaultZipPath}'"
|
2019-12-10 20:48:28 +01:00
|
|
|
|
|
|
|
# output status data & exit
|
|
|
|
if [ "$1" = "status" ]; then
|
|
|
|
echo "# RASPIBLITZ Data Import & Export"
|
2020-02-14 22:30:21 +01:00
|
|
|
echo "isBTRFS=${isBTRFS}"
|
|
|
|
echo "scpDownload=\"${scpDownload}\""
|
|
|
|
echo "scpUpload=\"${scpUpload}\""
|
2019-12-10 20:48:28 +01:00
|
|
|
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
|
2019-12-14 18:38:11 +01:00
|
|
|
echo "/mnt/hdd/temp" >> ~/.exclude.temp
|
|
|
|
echo "/mnt/hdd/lost+found" >> ~/.exclude.temp
|
2019-12-10 20:48:28 +01:00
|
|
|
echo "/mnt/hdd/snapshots" >> ~/.exclude.temp
|
2019-12-14 18:38:11 +01:00
|
|
|
echo "/mnt/hdd/torrent" >> ~/.exclude.temp
|
|
|
|
echo "/mnt/hdd/app-storage" >> ~/.exclude.temp
|
2019-12-10 20:48:28 +01:00
|
|
|
|
2019-12-15 12:30:00 +01:00
|
|
|
# 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
|
|
|
|
|
2019-12-10 20:48:28 +01:00
|
|
|
# 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) .."
|
2020-02-14 22:30:21 +01:00
|
|
|
sudo tar -zcvf ${defaultZipPath}/raspiblitz-export-temp.tar.gz -X ~/.exclude.temp /mnt/hdd 1>~/.include.temp 2>/dev/null
|
2019-12-10 20:48:28 +01:00
|
|
|
|
|
|
|
# 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}'"
|
2020-02-14 14:35:11 +01:00
|
|
|
sudo mv ${defaultZipPath}/raspiblitz-export-temp.tar.gz ${defaultZipPath}/${name}
|
2019-12-15 12:53:42 +01:00
|
|
|
sudo chown bitcoin:bitcoin ${defaultZipPath}/${name}
|
2019-12-10 20:48:28 +01:00
|
|
|
|
|
|
|
# delete temp files
|
|
|
|
rm ~/.exclude.temp
|
|
|
|
rm ~/.include.temp
|
|
|
|
|
2020-02-14 22:30:21 +01:00
|
|
|
echo "scpDownload=\"${scpDownload}\""
|
2019-12-10 20:48:28 +01:00
|
|
|
echo "# OK - Export done"
|
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
2020-02-14 14:35:11 +01:00
|
|
|
if [ "$1" = "export-gui" ]; then
|
|
|
|
|
|
|
|
# cleaning old migration files from blitz
|
|
|
|
sudo rm ${defaultZipPath}/*.tar.gz
|
|
|
|
|
2020-02-14 15:00:43 +01:00
|
|
|
# stopping lnd / bitcoin
|
|
|
|
echo "--> stopping services ..."
|
|
|
|
sudo systemctl stop lnd
|
|
|
|
sudo systemctl stop bitcoind
|
|
|
|
|
2020-02-14 14:35:11 +01:00
|
|
|
# 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
|
2020-02-14 15:00:43 +01:00
|
|
|
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
|
2020-02-14 14:35:11 +01:00
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
2019-12-10 20:48:28 +01:00
|
|
|
#########################
|
|
|
|
# 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"
|
2020-02-14 22:30:21 +01:00
|
|
|
echo "scpUpload=\"${scpUpload}\""
|
2019-12-10 20:48:28 +01:00
|
|
|
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 /
|
2019-12-15 02:16:46 +01:00
|
|
|
|
2019-12-15 12:30:00 +01:00
|
|
|
# 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"
|
|
|
|
|
2019-12-10 20:48:28 +01:00
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
2020-02-14 14:35:11 +01:00
|
|
|
if [ "$1" = "import-gui" ]; then
|
|
|
|
|
2020-02-14 22:30:21 +01:00
|
|
|
# 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
|
|
|
|
|
2020-02-14 14:35:11 +01:00
|
|
|
# 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
|
|
|
|
|
2019-12-10 20:48:28 +01:00
|
|
|
echo "error='unkown command'"
|
|
|
|
exit 1
|