Files
raspiblitz/home.admin/_bootstrap.sh
2025-08-27 15:31:34 +02:00

1481 lines
56 KiB
Bash
Executable File

#!/bin/bash
# This script runs on every start called by boostrap.service
# see logs with --> tail -n 100 /home/admin/raspiblitz.log
# NOTE: this boostrap script runs as root user (bootstrap.service) - so no sudo needed
################################
# BASIC SETTINGS
################################
# load codeVersion
source /home/admin/_version.info
# CONFIGFILE - configuration of RaspiBlitz
# used by fresh SD image to recover configuration
# and delivers basic config info for scripts
configFile="/mnt/hdd/app-data/raspiblitz.conf"
# LOGFILE - store debug logs of bootstrap
# resets on every start
logFile="/home/admin/raspiblitz.log"
# INFOFILE - state data from bootstrap
# used by display and later setup steps
infoFile="/home/admin/raspiblitz.info"
# SETUPFILE
# this key/value file contains the state during the setup process
setupFile="/var/cache/raspiblitz/temp/raspiblitz.setup"
# make sure ram disk is mounted
/home/admin/_cache.sh ramdisk on
# Backup last log file if available
cp ${logFile} /home/admin/raspiblitz.last.log 2>/dev/null
# Init boostrap log file
echo "Writing logs to: ${logFile}"
echo "" > $logFile
chmod 640 ${logFile}
chown root:sudo ${logFile}
echo "***********************************************" >> $logFile
echo "Running RaspiBlitz Bootstrap ${codeVersion}" >> $logFile
date >> $logFile
echo "***********************************************" >> $logFile
# list all running systemd services for future debug
systemctl list-units --type=service --state=running >> $logFile
# make sure ssh is configured and running
echo "# make sure SSH server is configured & running" >> $logFile
/home/admin/config.scripts/blitz.ssh.sh checkrepair >> $logFile
echo "## prepare raspiblitz temp" >> $logFile
# make sure /var/cache/raspiblitz/temp exists
mkdir -p /var/cache/raspiblitz/temp
chmod 777 /var/cache/raspiblitz/temp
################################
# INIT raspiblitz.info
################################
# raspiblitz.info contains the persisted system state
# that either given by build or has to survive a reboot
echo "## INIT raspiblitz.info" >> $logFile
# set default values for raspiblitz.info (that are not set by build_sdcard.sh)
setupPhase='boot'
setupStep=0
fsexpanded=0
blitzapi='off'
btc_mainnet_sync_initial_done=0
btc_testnet_sync_initial_done=0
btc_signet_sync_initial_done=0
ln_lnd_mainnet_sync_initial_done=0
ln_lnd_testnet_sync_initial_done=0
ln_lnd_signet_sync_initial_done=0
ln_cl_mainnet_sync_initial_done=0
ln_cl_testnet_sync_initial_done=0
ln_cl_signet_sync_initial_done=0
# detect VM
vm=0
if [ $(systemd-detect-virt) != "none" ]; then
vm=1
fi
# load already persisted valued (overwriting defaults if exist)
source ${infoFile} 2>/dev/null
# write fresh raspiblitz.info file
echo "state=starting" > $infoFile
echo "message=starting" >> $infoFile
echo "setupPhase=${setupPhase}" >> $infoFile
echo "setupStep=${setupStep}" >> $infoFile
echo "baseimage=${baseimage}" >> $infoFile
echo "cpu=${cpu}" >> $infoFile
echo "vm=${vm}" >> $infoFile
echo "blitzapi=${blitzapi}" >> $infoFile
echo "displayClass=${displayClass}" >> $infoFile
echo "displayType=${displayType}" >> $infoFile
echo "fsexpanded=${fsexpanded}" >> $infoFile
echo "btc_mainnet_sync_initial_done=${btc_mainnet_sync_initial_done}" >> $infoFile
echo "btc_testnet_sync_initial_done=${btc_testnet_sync_initial_done}" >> $infoFile
echo "btc_signet_sync_initial_done=${btc_signet_sync_initial_done}" >> $infoFile
echo "ln_lnd_mainnet_sync_initial_done=${ln_lnd_mainnet_sync_initial_done}" >> $infoFile
echo "ln_lnd_testnet_sync_initial_done=${ln_lnd_testnet_sync_initial_done}" >> $infoFile
echo "ln_lnd_signet_sync_initial_done=${ln_lnd_signet_sync_initial_done}" >> $infoFile
echo "ln_cl_mainnet_sync_initial_done=${ln_cl_mainnet_sync_initial_done}" >> $infoFile
echo "ln_cl_testnet_sync_initial_done=${ln_cl_testnet_sync_initial_done}" >> $infoFile
echo "ln_cl_signet_sync_initial_done=${ln_cl_signet_sync_initial_done}" >> $infoFile
chmod 664 ${infoFile}
# write content of raspiblitz.info to logs
cat $infoFile >> $logFile
# determine correct raspberrypi boot drive path (that easy to access when sd card is insert into laptop)
raspi_bootdir="/boot/firmware"
######################################
# STOP flags - for manual provision
rm /tmp/100mb.spacer 2>/dev/null # remove spacer file to create wiggle room on pishrinked images
# when a file 'stop' is on the sd card bootfs partition root - stop for manual provision (raspberrypi)
flagExists=$(ls ${raspi_bootdir}/stop 2>/dev/null | grep -c 'stop')
# when a file 'stop' is in the /home/admin directory - stop for manual provision (laptop)
if [ "${flagExists}" = "0" ]; then
flagExists=$(ls /home/admin/stop 2>/dev/null | grep -c 'stop')
fi
if [ "${flagExists}" = "1" ]; then
localip=$(hostname -I | awk '{print $1}')
/home/admin/_cache.sh set state "stop"
/home/admin/_cache.sh set message "stopped for manual provision"
/home/admin/_cache.sh set internet_localip "${localip}"
systemctl stop background.service
systemctl stop background.scan.service
# log info
echo "INFO: 'bootstrap stopped - run command release after manual provison to remove stop flag" >> ${logFile}
exit 0
fi
# VM stop signal for manual provision - when an audio device is detected on a VM
flagExists=$(lspci | grep -c "Audio")
if [ "${vm}" = "1" ] && [ ${flagExists} -gt 0 ]; then
localip=$(hostname -I | awk '{print $1}')
/home/admin/_cache.sh set state "stop"
/home/admin/_cache.sh set message "VM stopped for manual provision"
/home/admin/_cache.sh set internet_localip "${localip}"
systemctl stop background.service
systemctl stop background.scan.service
# log info
echo "INFO: 'bootstrap stopped - remove the audio device from the VM" >> ${logFile}
exit 0
fi
# when the provision did not ran thru without error (ask user for fresh sd card)
provisionFlagExists=$(ls /home/admin/provision.flag | grep -c 'provision.flag')
if [ "${provisionFlagExists}" = "1" ]; then
systemctl stop ${network}d 2>/dev/null
/home/admin/_cache.sh set state "inconsistentsystem"
/home/admin/_cache.sh set message "provision did not ran thru"
echo "FAIL: 'provision did not ran thru' - need fresh sd card!" >> ${logFile}
rm /mnt/hdd/app-data/raspiblitz.setup
exit 1
fi
#########################
# INIT RaspiBlitz Cache
#########################
# make sure that redis service is enabled (disabled on fresh install medium)
redisEnabled=$(systemctl is-enabled redis-server | grep -c "enabled")
echo "## redisEnabled(${redisEnabled})" >> $logFile
if [ ${redisEnabled} -eq 0 ]; then
echo "# make sure redis is running" >> $logFile
sleep 6
systemctl status redis-server >> $logFile
systemctl enable redis-server >> $logFile
systemctl start redis-server >> $logFile
systemctl status redis-server >> $logFile
fi
# make sure latest info file is imported
/home/admin/_cache.sh import $infoFile
# setting basic status info
/home/admin/_cache.sh set state "starting"
/home/admin/_cache.sh set message "bootstrap"
# try to load config values if available (config overwrites info)
source ${configFile} 2>/dev/null
# monitor LAN connection fast to display local IP changes
/home/admin/_cache.sh focus internet_localip 0
################################
# SET WIFI (by file)
################################
# File: wpa_supplicant.conf
# legacy way to set wifi of rasperrypi
wpaFileExists=$(ls ${raspi_bootdir}/wpa_supplicant.conf 2>/dev/null | grep -c 'wpa_supplicant.conf')
if [ "${wpaFileExists}" = "1" ]; then
echo "Getting data from file: ${raspi_bootdir}/wpa_supplicant.conf" >> ${logFile}
ssid=$(grep ssid "${raspi_bootdir}/wpa_supplicant.conf" | awk -F'=' '{print $2}' | tr -d '"')
password=$(grep psk "${raspi_bootdir}/wpa_supplicant.conf" | awk -F'=' '{print $2}' | tr -d '"')
fi
# File: wifi
# get first line as string from wifi file (NAME OF WIFI)
# get second line as string from wifi file (PASSWORD OF WIFI)
wifiFileExists=$(ls ${raspi_bootdir}/wifi 2>/dev/null | grep -c 'wifi')
if [ "${wifiFileExists}" = "1" ]; then
echo "Getting data from file: ${raspi_bootdir}/wifi" >> ${logFile}
ssid=$(sed -n '1p' ${raspi_bootdir}/wifi | tr -d '[:space:]')
password=$(sed -n '2p' ${raspi_bootdir}/wifi | tr -d '[:space:]')
fi
# set wifi if data is available
if [ "${ssid}" != "" ] && [ "${password}" != "" ]; then
echo "Setting Wifi ..." >> ${logFile}
echo "ssid(${ssid}) password(${password})" >> ${logFile}
/home/admin/_cache.sh set message "setting wifi"
err=""
echo "Setting Wifi SSID(${ssid}) Password(${password})" >> ${logFile}
source <(/home/admin/config.scripts/internet.wifi.sh on ${ssid} ${password})
if [ "${err}" != "" ]; then
echo "Setting Wifi failed - edit or remove file ${raspi_bootdir}/wifi" >> ${logFile}
echo "error(${err})" >> ${logFile}
echo "Will shutdown in 1min ..." >> ${logFile}
/home/admin/_cache.sh set state "errorWIFI"
/home/admin/_cache.sh set message "${err}"
sleep 60
shutdown now
exit 1
fi
rm ${raspi_bootdir}/wifi 2>/dev/null
rm ${raspi_bootdir}/wpa_supplicant.conf 2>/dev/null
fi
################################
# CLEANING BOOT SYSTEM
################################
# Emergency cleaning logs when over 1GB (to prevent SD card filling up)
# see https://github.com/rootzoll/raspiblitz/issues/418#issuecomment-472180944
echo "*** Checking Log Size ***"
logsMegaByte=$(du -c -m /var/log | grep "total" | awk '{print $1;}')
if [ ${logsMegaByte} -gt 1000 ]; then
echo "WARN # Logs /var/log in are bigger then 1GB" >> $logFile
# dont delete directories - can make services crash
rm /var/log/*
service rsyslog restart
/home/admin/_cache.sh set message "WARNING: /var/log/ >1GB"
echo "WARN # Logs in /var/log in were bigger then 1GB and got emergency delete to prevent fillup." >> $logFile
ls -la /var/log >> $logFile
echo "If you see this in the logs please report to the GitHub issues, so LOG config needs to be optimized." >> $logFile
sleep 10
else
echo "OK - logs are at ${logsMegaByte} MB - within safety limit" >> $logFile
fi
echo ""
################################
# BOOT LOGO
################################
# display 3 secs logo - try to kickstart LCD
# see https://github.com/rootzoll/raspiblitz/issues/195#issuecomment-469918692
# see https://github.com/rootzoll/raspiblitz/issues/647
# see https://github.com/rootzoll/raspiblitz/pull/1580
randnum=$(shuf -i 0-7 -n 1)
/home/admin/config.scripts/blitz.display.sh image /home/admin/raspiblitz/pictures/startlogo${randnum}.png
sleep 5
/home/admin/config.scripts/blitz.display.sh hide
######################################
# WAIT FOR FIRST FULL BACKGROUND SCAN
echo "## RaspiBlitz Cache ... wait background.scan.service to finish first scan loop" >> $logFile
systemscan_runtime=""
while [ "${systemscan_runtime}" = "" ]
do
sleep 1
source <(/home/admin/_cache.sh get systemscan_runtime)
echo "- waiting for background.scan.service --> systemscan_runtime(${systemscan_runtime})" >> $logFile
done
################################
# WAIT LOOP: HDD CONNECTED
# (old RaspiBlitz Setup)
################################
echo "Waiting for HDD/SSD ..." >> $logFile
scenario="" # run loop at least on time
until [ ${#scenario} -gt 0 ] && [[ ! "${scenario}" =~ ^error ]]; do
# recheck HDD/SSD
source <(/home/admin/config.scripts/blitz.data.sh status)
echo "blitz.data.sh status - scenario: ${scenario}" >> $logFile
# in case of HDD analyse ERROR
if [ "${scenario}" = "error:no-storage" ]; then
/home/admin/_cache.sh set state "noHDD"
/home/admin/_cache.sh set message ">=1TB"
elif [[ "${scenario}" =~ ^error ]]; then
echo "FAIL - error on HDD analysis: ${scenario}" >> $logFile
/home/admin/_cache.sh set state "errorHDD"
/home/admin/_cache.sh set message "${scenario}"
fi
# wait for next check
sleep 2
done
################################
# GPT integrity check
################################
# List all block devices
devices=$(lsblk -dno NAME | grep -E '^sd|^nvme|^vd|^mmcblk')
# Check and fix each device
for dev in $devices; do
device="/dev/$dev"
output=$(sudo gdisk -l $device 2>&1)
if echo "$output" | grep -q "PMBR size mismatch"; then
echo "GPT PMBR size mismatch detected on $device. Fixing..." >> $logFile
sgdisk -e $device
echo "Fixed GPT PMBR size mismatch on $device." >> $logFile
elif echo "$output" | grep -q "The backup GPT table is not on the end of the device"; then
echo "Backup GPT table is not at the end of $device. Fixing..." >> $logFile
sgdisk -e $device
echo "Fixed backup GPT table location on $device." >> $logFile
else
echo "No GPT issues detected on $device." >> $logFile
fi
done
#####################################
# PRE-SETUP INIT (ALL SYSTEMS)
#####################################
if [ "${scenario}" != "ready" ] ; then
# write info for LCD
echo "## PRE-SETUP INIT (ALL SYSTEMS)" >> $logFile
/home/admin/_cache.sh set state "system-init"
/home/admin/_cache.sh set message "please wait"
# now that HDD/SSD is connected ... if relevant data from a previous RaspiBlitz was available
# /var/cache/raspiblitz/hdd-inspect exists with copy of config data to init system with
echo "STORAGE connected .. run inspection" >> $logFile
/home/admin/config.scripts/blitz.data.sh status -inspect >> $logFile
#####################################
# WIFI RESTORE
# from former RaspiBlitz
# check if there is a WIFI configuration to backup or restore
if [ -d "/var/cache/raspiblitz/hdd-inspect/wifi" ]; then
echo "WIFI RESTORE from /var/cache/raspiblitz/hdd-inspect/wpa_supplicant.conf" >> $logFile
/home/admin/config.scripts/internet.wifi.sh backup-restore >> $logFile
else
echo "No WIFI RESTORE because no /var/cache/raspiblitz/hdd-inspect/wpa_supplicant.conf" >> $logFile
fi
################################
# SSH SERVER CERTS RESTORE
# from former RaspiBlitz
if [ -d "/var/cache/raspiblitz/hdd-inspect/sshd" ]; then
# INIT OLD SSH HOST KEYS on Update/Recovery to prevent "Unknown Host" on ssh client
echo "SSH SERVER CERTS RESTORE activating old SSH host keys" >> $logFile
/home/admin/config.scripts/blitz.ssh.sh restore /var/cache/raspiblitz/hdd-inspect/sshd/ssh >> $logFile
else
echo "No SSH SERVER CERTS RESTORE because no /var/cache/raspiblitz/hdd-inspect" >> $logFile
fi
fi
###################################
# WAIT LOOP: LOCALNET / INTERNET
# after HDD > can contain WIFI conf
###################################
while true; do
# get latest network info directly
source <(/home/admin/config.scripts/internet.sh status online)
echo "internet.sh status localip(${localip}) online(${online})" >> $logFile
# check state of network
if [ "${dhcp}" = "0" ]; then
# display user waiting for DHCP
echo "Waiting for DHCP ..." >> $logFile
/home/admin/_cache.sh set state "noDHCP"
/home/admin/_cache.sh set message "Waiting for DHCP"
elif [ "${localip}" = "" ]; then
if [ "${configWifiExists}" = "0" ]; then
# display user to connect LAN
echo "Waiting for LAN/WAN ..." >> $logFile
/home/admin/_cache.sh set state "noIP-LAN"
/home/admin/_cache.sh set message "Connect the LAN/WAN"
else
# display user that wifi settings are not working
echo "WIFI Settings not working ..." >> $logFile
/home/admin/_cache.sh set state "noIP-WIFI"
/home/admin/_cache.sh set message "WIFI Settings not working"
fi
elif [ "${online}" = "0" ]; then
# display user that internet is missing (needed for firmware updates)
echo "Waiting for internet ..." >> $logFile
/home/admin/_cache.sh set state "noInternet"
/home/admin/_cache.sh set message "No connection to Internet"
else
echo "OK got localIP & Internet .." >> $logFile
break
fi
sleep 1
done
#####################################
# PRE-SETUP INIT(RASPBERRY PI)
#####################################
if [ "${scenario}" != "ready" ] && [ "${baseimage}" = "raspios_arm64" ]; then
echo "## PRE-SETUP INIT(RASPBERRY PI)" >> $logFile
# set flag for reboot (only needed on raspberry pi)
systemInitReboot=0
################################
# FS EXPAND
# extend sd card to maximum capacity
source <(/home/admin/config.scripts/blitz.bootdrive.sh status)
if [ "${needsExpansion}" = "1" ] && [ "${fsexpanded}" = "0" ]; then
echo "FSEXPAND needed ... starting process" >> $logFile
/home/admin/config.scripts/blitz.bootdrive.sh status >> $logFile
/home/admin/config.scripts/blitz.bootdrive.sh fsexpand >> $logFile
systemInitReboot=1
/home/admin/_cache.sh set message "FSEXPAND"
elif [ "${tooSmall}" = "1" ]; then
echo "# FAIL #######" >> $logFile
echo "SDCARD TOO SMALL 16GB minimum" >> $logFile
echo "##############" >> $logFile
/home/admin/_cache.sh set state "sdtoosmall"
echo "System stopped. Please cut power." >> $logFile
sleep 6000
shutdown now
sleep 100
exit 1
else
echo "No FS EXPAND needed. needsExpansion(${needsExpansion}) fsexpanded(${fsexpanded})" >> $logFile
fi
################################
# FORCED SWITCH TO HDMI
# if a file called 'hdmi' gets
# placed onto the bootfs part of
# the sd card - switch to hdmi
forceHDMIoutput=$(ls ${raspi_bootdir}/hdmi* 2>/dev/null | grep -c hdmi)
if [ ${forceHDMIoutput} -eq 1 ]; then
/home/admin/_cache.sh set message "HDMI"
# delete that file (to prevent loop)
rm ${raspi_bootdir}/hdmi*
# switch to HDMI what will trigger reboot
echo "HDMI switch found ... activating HDMI display output & flag reboot" >> $logFile
/home/admin/config.scripts/blitz.display.sh set-display hdmi >> $logFile
systemInitReboot=1
else
echo "No HDMI switch found. " >> $logFile
fi
################################
# SSH SERVER CERTS RESET
# if a file called 'ssh.reset' gets
# placed onto the boot part of
# the sd card - delete old ssh data
sshReset=$(ls ${raspi_bootdir}/ssh.reset* 2>/dev/null | grep -c reset)
if [ ${sshReset} -eq 1 ]; then
# delete that file (to prevent loop)
rm ${raspi_bootdir}/ssh.reset* >> $logFile
# delete ssh certs
echo "SSHRESET switch found ... stopping SSH and deleting old certs" >> $logFile
/home/admin/config.scripts/blitz.ssh.sh renew >> $logFile
/home/admin/config.scripts/blitz.ssh.sh backup >> $logFile
systemInitReboot=1
/home/admin/_cache.sh set message "SSHRESET"
else
echo "No SSHRESET switch found. " >> $logFile
fi
##################################
# DISPLAY RESTORE (if needed)
if [ -f "/var/cache/raspiblitz/hdd-inspect/raspiblitz.conf" ]; then
echo "check that display class in raspiblitz.conf from HDD is different from as it is now in raspiblitz.info ..." >> $logFile
# get display class value from raspiblitz.info
source <(cat ${infoFile} | grep "^displayClass=")
infoFileDisplayClass="${displayClass}"
echo "infoFileDisplayClass(${infoFileDisplayClass})" >> $logFile
# get display class value from raspiblitz.conf
source <(cat /var/cache/raspiblitz/hdd-inspect/raspiblitz.conf | grep "^displayClass=")
confFileDisplayClass="${displayClass}"
echo "confFileDisplayClass(${confFileDisplayClass})" >> $logFile
# check if values are different and need to change
if [ "${confFileDisplayClass}" != "" ] && [ "${infoFileDisplayClass}" != "${displayClass}" ]; then
echo "DISPLAY RESTORE - need to update displayClass from (${infoFileDisplayClass}) to (${confFileDisplayClass})'" >> ${logFile}
/home/admin/config.scripts/blitz.display.sh set-display ${confFileDisplayClass} >> ${logFile}
systemInitReboot=1
else
echo "No DISPLAY RESTORE because no need to change" >> $logFile
fi
else
echo "No DISPLAY RESTORE because no /var/cache/raspiblitz/hdd-inspect/raspiblitz.conf" >> $logFile
fi
################################
# UASP FIX
/home/admin/_cache.sh set message "checking HDD"
source <(/home/admin/config.scripts/blitz.data.sh uasp-fix)
if [ "${error}" != "" ]; then
echo "UASP FIX failed: ${error}" >> $logFile
/home/admin/_cache.sh set state "errorUASP"
/home/admin/_cache.sh set message "${error}"
exit 1
fi
if [ "${neededReboot}" = "1" ]; then
echo "UASP FIX applied ... reboot needed." >> $logFile
systemInitReboot=1
else
echo "No UASP FIX needed" >> $logFile
fi
################################
# RaspberryPi 5 - Firmware Update (needs internet)
# https://github.com/raspiblitz/raspiblitz/issues/4359
echo "checking Firmware" >> $logFile
/home/admin/_cache.sh set message "checking Firmware"
echo "getting data" >> $logFile
raspberryPiVersion=$(tr -d '\0' 2>/dev/null < /sys/firmware/devicetree/base/model | sed -E 's/.*Raspberry Pi ([0-9]+).*/\1/')
firmwareBuildNumber=$(rpi-eeprom-update 2>/dev/null | grep "CURRENT" | cut -d "(" -f2 | sed 's/[^0-9]*//g')
echo "checking Firmware: isRaspberryPiVersion(${raspberryPiVersion}) firmwareBuildNumber(${firmwareBuildNumber})" >> $logFile
if [ "${raspberryPiVersion}" != "" ] && [ ${raspberryPiVersion} -gt 4 ] && [ ${firmwareBuildNumber} -lt 1741626637 ]; then # Mon Mar 10 05:10:37 PM UTC 2025 (1741626637)
echo "updating Firmware" >> $logFile
echo "RaspberryPi 5 detected with old firmware (${firmwareBuildNumber}) ... do update." >> $logFile
apt-get update -y
apt-get upgrade -y
apt-get install -y rpi-eeprom
rpi-eeprom-update -a
systemInitReboot=1
else
echo "RaspberryPi Firmware no need for update." >> $logFile
fi
######################################
# CHECK IF REBOOT IS NEEDED
# from actions above
if [ "${systemInitReboot}" = "1" ]; then
echo "Reboot" >> $logFile
cp ${logFile} /home/admin/raspiblitz.systeminit.log
/home/admin/_cache.sh set state "reboot"
sleep 8
shutdown -r now
sleep 100
exit 0
else
echo "No Reboot needed" >> $logFile
fi
fi
############################
############################
# WHEN SETUP IS NEEDED
############################
echo "Check if setup is needed --> scenario(${scenario})" >> $logFile
echo "Starting Bootstrap Setup Section: $( [ "${scenario}" != "ready" ] && echo "true" || echo "false" )" >> $logFile
if [ "${scenario}" != "ready" ] ; then
echo "## WHEN SETUP IS NEEDED " >> $logFile
echo "/home/admin/config.scripts/blitz.data.sh status -inspect (auto store to cache)" >> $logFile
source <(/home/admin/config.scripts/blitz.data.sh status -inspect)
# when there are no partitions on any drive - signal all drives are clean
/home/admin/_cache.sh set system_setup_cleanDrives "0"
if [ "${storagePartitionsCount}" = "0" ] && [ "${dataPartitionsCount}" = "0" ]; then
if [ "${systemMountedPath}" = "/" ] || [ "${systemPartitionsCount}" = "0" ]; then
echo "INFO: no partitions on any drive - signal all drives are clean" >> $logFile
/home/admin/_cache.sh set system_setup_cleanDrives "1"
fi
fi
# add info if a flag shows that install medium was tried before
if [ -f "/home/admin/systemcopy.flag" ]; then
/home/admin/_cache.sh set "system_setup_secondtry" "1"
rm /home/admin/systemcopy.flag
else
/home/admin/_cache.sh set "system_setup_secondtry" "0"
fi
# TODO: GET INFO FROM OTHER IMPLEMENTATIONS & COMPARE AGAINST LOCAL - not just LND
# when migration check if for outdated btc, lnd, cln
if [ "${scenario}" = "migration" ]; then
migrationMode="normal"
if [ "${hddVersionLND}" != "" ]; then
source <(/home/admin/config.scripts/lnd.install.sh info "${hddVersionLND}")
if [ "${compatible}" != "1" ]; then
migrationMode="outdatedLightning"
fi
fi
/home/admin/_cache.sh set migrationMode "${migrationMode}"
fi
# TODO: REPLACE THIS OLD VALUES IN SSH & WEBUI
/home/admin/_cache.sh set hddCandidate "${hddCandidate}"
/home/admin/_cache.sh set hddGigaBytes "${hddGigaBytes}"
/home/admin/_cache.sh set hddBlocksBitcoin "${hddBlocksBitcoin}"
/home/admin/_cache.sh set hddGotMigrationData "${hddGotMigrationData}"
/home/admin/_cache.sh set hddVersionLND "${hddVersionLND}"
# map scenario to setupPhase
/home/admin/_cache.sh set "system_setup_askSystemCopy" "0"
if [ "${scenario}" = "setup" ]; then
setupPhase="setup"
infoMessage="Please start Setup"
/home/admin/_cache.sh set "system_setup_askSystemCopy" "${scenarioSystemCopy}"
elif [ "${scenario}" = "biggerdevice" ]; then
setupPhase="biggerdevice"
infoMessage="Please start Setup"
/home/admin/_cache.sh set "system_setup_askSystemCopy" "${scenarioSystemCopy}"
elif [ "${scenario}" = "recover" ]; then
setupPhase="recovery"
infoMessage="Please start Recovery"
/home/admin/_cache.sh set "system_setup_askSystemCopy" "${scenarioSystemCopy}"
elif [ "${scenario}" = "migration" ]; then
setupPhase="migration"
infoMessage="Please start Migration"
else
setupPhase="error"
infoMessage="Unkonwn Setup Phase"
fi
# check if raspiblitz.setup exists (from former system copy step)
if [ -f "/var/cache/raspiblitz/hdd-inspect/raspiblitz.setup" ]; then
# this is when booting from hdd after system copy
echo "INFO: 'raspiblitz.setup' exists - skip user wait loop" >> ${logFile}
cp -a /var/cache/raspiblitz/hdd-inspect/raspiblitz.setup ${setupFile}
state="waitprovision"
else
echo "INFO: 'raspiblitz.setup' does not exist - wait for user config" >> ${logFile}
state="waitsetup"
/home/admin/_cache.sh set state "${state}"
/home/admin/_cache.sh set message "${infoMessage}"
/home/admin/_cache.sh set setupPhase "${setupPhase}"
fi
#############################################
# WAIT LOOP: USER SETUP/UPDATE/MIGRATION
# until SSH or WEBUI setup data is available
#############################################
echo "## WAIT LOOP: USER SETUP/UPDATE/MIGRATION" >> ${logFile}
echo "state(${state})" >> ${logFile}
until [ "${state}" = "waitprovision" ]
do
# give the loop a little bed time
sleep 4
# check for updated state value from SSH-UI or WEB-UI for loop
source <(/home/admin/_cache.sh get state)
done
echo "## WAIT LOOP: DONE" >> ${logFile}
echo "/home/admin/config.scripts/blitz.data.sh status -inspect (auto store to cache)"
source <(/home/admin/config.scripts/blitz.data.sh status -inspect)
# get the results from the SSH-UI or WEB-UI
echo "LOADING 'raspiblitz.setup' ..." >> ${logFile}
source ${setupFile}
# overwrite recover by user choice
if [ "${scenario}" = "recover" ] && [ "${menuchoice}" = "setup" ]; then
echo "OVERWRITE BY USERCHOICE recover -> setup" >> ${logFile}
scenario="setup"
setupPhase="setup"
/home/admin/_cache.sh set setupPhase "${setupPhase}"
fi
# when this is the boot of the new system (skip to provision)
if [ "${systemCopy}" = "done" ]; then
echo "INFO: 'systemCopy' is done - skip to provision / scenario(${scenario})" >> ${logFile}
if [ "${scenario}" != "recover" ]; then
echo "INFO: set scenario to setup" >> ${logFile}
scenario="setup"
fi
setupCommand="skip"
bootFromStorage=0
# system recommended setup & system but user decided against - downgrade to simple setup
elif [ "${scenario}" = "setup" ] && [ "${scenarioSystemCopy}" = "1" ] && [ "${systemCopy}" = "0" ] && [ "${deleteData}" = "all" ]; then
echo "# downgrade to install medium setup" >> ${logFile}
setupCommand="setup"
bootFromStorage=0
# system recommended setup & system but user decided against but keep blockhain - downgrade to simple setup
elif [ "${scenario}" = "setup" ] && [ "${scenarioSystemCopy}" = "1" ] && [ "${systemCopy}" = "0" ] && [ "${deleteData}" = "keepBlockchain" ]; then
echo "# downgrade to install medium clean" >> ${logFile}
setupCommand="clean"
bootFromStorage=0
# user agreed to system copy & delete all data
elif [ "${scenario}" = "setup" ] && [ "${scenarioSystemCopy}" = "1" ] && [ "${systemCopy}" = "1" ] && [ "${deleteData}" = "all" ]; then
echo "# user agreed to system copy & delete all data" >> ${logFile}
setupCommand="setup"
# user agreed to system copy & delete all data
elif [ "${scenario}" = "setup" ] && [ "${scenarioSystemCopy}" = "1" ] && [ "${systemCopy}" = "1" ] && [ "${deleteData}" = "keepBlockchain" ]; then
echo "# user agreed to system clean to keep blockchain" >> ${logFile}
setupCommand="clean"
# user agreed to run system from install medium and delete all data
elif [ "${scenario}" = "setup" ] && [ "${deleteData}" = "all" ]; then
echo "# user agreed to run system from install medium and delete all data" >> ${logFile}
setupCommand="setup"
bootFromStorage=0
# user agreed to run system from install medium and keep blockchain
elif [ "${scenario}" = "setup" ] && [ "${deleteData}" = "keepBlockchain" ]; then
echo "# user agreed to run system from install medium and keep blockchain" >> ${logFile}
setupCommand="clean"
bootFromStorage=0
# run recovery
elif [ "${scenario}" = "recover" ]; then
echo "# run recovery" >> ${logFile}
setupCommand="recover"
else
echo "WARN: No matching scenario found" >> ${logFile}
fi
# even when the user decided not to run the system from storage/data drive
# create a place holder partition for future system use
# ONLY when a dedicated system device is available - dont create a system partition
createSystemPartion=1
if [ ${#systemDevice} -gt 0 ] && [ "${systemDevice}" != "${storageDevice}" ]; then
createSystemPartion=0
fi
echo "scenario(${scenario})" >> ${logFile}
echo "scenarioSystemCopy(${scenarioSystemCopy})" >> ${logFile} # recommended by system
echo "systemCopy(${systemCopy})" >> ${logFile} # user choice
echo "createSystemPartion(${createSystemPartion})" >> ${logFile} # system partition
echo "deleteData(${deleteData})" >> ${logFile}
echo "setupCommand(${setupCommand})" >> ${logFile}
echo "bootFromStorage(${bootFromStorage})" >> ${logFile}
echo "storageDevice(${storageDevice})" >> ${logFile}
echo "systemDevice(${systemDevice})" >> ${logFile}
echo "dataDevice(${dataDevice})" >> ${logFile}
###############################################
# SYSTEM COPY OF FRESH SYSTEM (SETUP & RECOVER)
if [ "${setupCommand}" = "setup" ] || [ "${setupCommand}" = "recover" ] || [ "${setupCommand}" = "clean" ]; then
echo "FORMAT/RECOVER DRIVES" >> ${logFile}
/home/admin/_cache.sh set state "hdd-format"
/home/admin/_cache.sh set message "${setupCommand}"
# STORAGE
echo "#### STORAGE ####" >> ${logFile}
echo "# storageDevice(${storageDevice}) storageMountedPath(${storageMountedPath})" >> ${logFile}
if [ ${#storageDevice} -gt 0 ] && [ ${#storageMountedPath} -eq 0 ]; then
echo "STORAGE: ${setupCommand} STORAGE start" >> ${logFile}
error=""
source <(/home/admin/config.scripts/blitz.data.sh ${setupCommand} STORAGE "${storageDevice}" "${combinedDataStorage}" "${createSystemPartion}")
if [ "${error}" != "" ]; then
echo "FAIL: '${setupCommand} STORAGE' failed error(${error})" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "${error}"
exit 1
fi
echo "STORAGE: ${setupCommand} STORAGE done" >> ${logFile}
else
echo "STORAGE: ${setupCommand} STORAGE skipped - already mounted" >> ${logFile}
fi
# SYSTEM
echo "#### SYSTEM ####" >> ${logFile}
echo "# systemDevice(${systemDevice}) systemWarning(${systemWarning})" >> ${logFile}
if [ ${#systemDevice} -gt 0 ] && [ "${systemDevice}" != "${storageDevice}" ] && [ "${bootFromStorage}" = "0" ] && [ ${#systemWarning} -eq 0 ]; then
error=""
echo "SYSTEM: ${setupCommand} SYSTEM start" >> ${logFile}
source <(/home/admin/config.scripts/blitz.data.sh ${setupCommand} SYSTEM "${systemDevice}")
if [ "${error}" != "" ]; then
echo "FAIL: '${setupCommand} SYSTEM' failed error(${error})" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "${error}"
exit 1
fi
echo "SYSTEM: ${setupCommand} SYSTEM done" >> ${logFile}
else
if [ "${systemMountedPath}" = "/" ]; then
echo "SYSTEM: ${setupCommand} SYSTEM skipped - its active system" >> ${logFile}
else
echo "SYSTEM: ${setupCommand} SYSTEM skipped - already mounted" >> ${logFile}
fi
fi
# DATA
echo "#### DATA ####" >> ${logFile}
echo "# dataDevice(${dataDevice}) dataWarning(${dataWarning})" >> ${logFile}
if [ ${#dataDevice} -gt 0 ] && [ "${dataDevice}" != "${storageDevice}" ] && [ ${#dataWarning} -eq 0 ]; then
error=""
echo "DATA: ${setupCommand} DATA start" >> ${logFile}
source <(/home/admin/config.scripts/blitz.data.sh ${setupCommand} DATA "${dataDevice}")
if [ "${error}" != "" ]; then
echo "FAIL: '${setupCommand} DATA' failed error(${error})" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "${error}"
exit 1
fi
echo "DATA: ${setupCommand} DATA done" >> ${logFile}
else
if [ "${dataMountedPath}" = "/mnt/hdd" ]; then
echo "DATA: ${setupCommand} DATA skipped - its active data" >> ${logFile}
else
echo "DATA: ${setupCommand} DATA skipped - already mounted" >> ${logFile}
fi
fi
# when system was installed on new boot drive
echo "scenario(${scenario})" >> ${logFile}
echo "systemCopy(${systemCopy})" >> ${logFile}
#############################################
# WAIT LOOP: 2nd SETUP UI WAIT LOOP
# (after HDD/SSD is setup)
############################################
# at the moment only needed for upload file migration
echo "uploadMigration(${uploadMigration}) storagePartition(${storagePartition})" >> ${logFile}
if [ "${uploadMigration}" = "1" ]; then
# trigger the 2nd setup loop
state="waitsetup-extended"
source <(/home/admin/config.scripts/blitz.migration.sh status)
/home/admin/_cache.sh set "ui_migration_upload" "1"
/home/admin/_cache.sh set "ui_migration_uploadUnix" "${uploadUnix}"
/home/admin/_cache.sh set "ui_migration_uploadWin" "${uploadWin}"
if [ "${storagePartition}" = "" ]; then
echo "FAIL: storagePartition is empty" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "storagePartition empty"
exit 1
fi
# prepare upload storage
mkdir -p /mnt/upload 2>/dev/null
mount /dev/${storagePartition} /mnt/upload
mkdir -p /mnt/upload/temp 2>/dev/null
chown -R admin:admin /mnt/upload
chmod -R 777 /mnt/upload
rm -rf /mnt/upload/temp/*
else
# skip the 2nd setup loop
state="waitprovision"
fi
/home/admin/_cache.sh set state "${state}"
echo "## 2nd WAIT LOOP: AFTER HDD/SETUP" >> ${logFile}
echo "state(${state})" >> ${logFile}
until [ "${state}" = "waitprovision" ]
do
# give the loop a little bed time
sleep 4
# check for updated state value from SSH-UI or WEB-UI for loop
source <(/home/admin/_cache.sh get state)
done
echo "## 2nd WAIT LOOP: DONE" >> ${logFile}
# detect possible uploaded migration file
source <(/home/admin/config.scripts/blitz.migration.sh status)
if [ "${migrationFile}" != "" ]; then
# wirite migration file to setup file
echo "adding to ${setupFile} migrationFile(${migrationFile})" >> ${logFile}
echo "migrationFile=${migrationFile}" >> ${setupFile}
else
if [ "${uploadMigration}" = "1" ]; then
echo "FAIL: no migration file found" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "no migration file found"
exit 1
else
echo "OK - no migration file found" >> ${logFile}
fi
fi
umount /mnt/upload 2>/dev/null
# pre-quick change of login passwort for admin
# do proper passwordA setting later when HDD is mounted
source ${setupFile}
if [ "${passwordA}" != "" ]; then
echo "## SETTING PASSWORD FOR ADMIN" >> ${logFile}
echo "admin:${passwordA}" | chpasswd
fi
#############################################
# SYSTEM COPY
############################################
if [ "${systemCopy}" = "1" ]; then
if [ "${systemDevice}" = "" ]; then
echo "systemDevice() - using storageDevice for system" >> ${logFile}
systemDevice="${storageDevice}"
bootFromStorage=1
fi
echo "#### SYSTEM COPY OF FRESH SYSTEM" >> ${logFile}
echo "bootFromStorage(${bootFromStorage})" >> ${logFile}
echo "storageDevice(${storageDevice})" >> ${logFile}
echo "systemDevice(${systemDevice})" >> ${logFile}
echo "dataDevice(${dataDevice})" >> ${logFile}
/home/admin/_cache.sh set state "systemcopy"
/home/admin/_cache.sh set message "copying system"
echo "bootFromStorage(${bootFromStorage})" >> ${logFile}
if [ "${bootFromStorage}" = "1" ]; then
/home/admin/config.scripts/blitz.data.sh copy-system "${storageDevice}" storage
if [ $? -ne 0 ]; then
echo "FAIL: copy-system (storage) failed" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "copy-system failed"
exit 1
fi
else
/home/admin/config.scripts/blitz.data.sh copy-system "${systemDevice}" system
if [ $? -ne 0 ]; then
echo "FAIL: copy-system (system) failed" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "copy-system failed"
exit 1
fi
fi
# mark systemCopy as done in raspiblitz.setup
if ! sed -i "s/^systemCopy=.*/systemCopy=done/" "${setupFile}"; then
echo "error='failed to update systemCopy in setupFile'" >> ${logFile}
exit 1
fi
# put setupFile to new system (so after reboot it does not need to ask user again)
source <(/home/admin/config.scripts/blitz.data.sh status)
mkdir -p /mnt/disk_data 2>/dev/null
mount /dev/${dataPartition} /mnt/disk_data
echo "copy setupFile(${setupFile}) to /mnt/disk_data/app-data/raspiblitz.setup" >> ${logFile}
mkdir -p /mnt/disk_data/app-data 2>/dev/null
cp ${setupFile} /mnt/disk_data/app-data/raspiblitz.setup
if [ $? -ne 0 ]; then
echo "FAIL: copy setupFile to new system failed" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "copy setupFile to new system failed"
exit 1
fi
umount /mnt/disk_data
# put flag file into old system
touch /home/admin/systemcopy.flag
# disable old system boot
echo "# disable old system boot" >> ${logFile}
/home/admin/config.scripts/blitz.data.sh kill-boot ${installDevice} >> ${logFile}
if [ $? -eq 1 ]; then
echo "FAIL: blitz.data.sh kill-boot \"${installDevice}\" failed" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "blitz.data.sh kill-boot failed"
exit 1
fi
# reboot so that new system can start
echo "GOING INTO REBOOT" >> ${logFile}
/home/admin/_cache.sh set state "system-change"
/home/admin/_cache.sh set message "changing boot device"
# sync filesystem buffers
sync
# force write of memory-cached filesystem data
sync; echo 3 > /proc/sys/vm/drop_caches
# wait for sync to complete
sleep 2
shutdown -r now
exit 0
else
# continue with setup
echo "NO systemCopy" >> ${logFile}
fi
else
echo "Skipping System Copy" >> ${logFile}
fi
#############################################
# MIGRATION from old RaspiBlitz
############################################
if [ "${hddMigration}" = "1" ]; then
echo "## MIGRATION from old RaspiBlitz via old HDD" >> ${logFile}
/home/admin/_cache.sh set state "hdd-migration"
/home/admin/_cache.sh set message "${hddMigrateDeviceFrom} ${hddMigrateDeviceTo}"
/home/admin/config.scripts/blitz.data.sh migration hdd run "${hddMigrateDeviceFrom}" >> ${logFile}
if [ $? -ne 0 ]; then
echo "FAIL: blitz.data.sh migration hdd run failed" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "blitz.migration.sh migrate failed"
exit 1
fi
scenario="recovery"
setupPhase="recovery"
/home/admin/_cache.sh set setupPhase "${setupPhase}"
fi
#############################################
# PROVISION PROCESS
#############################################
# set flag that provision process was started on this system
echo "the provision process was started but did not finish yet" > /home/admin/provision.flag
# perma mount drives/partitions
/home/admin/config.scripts/blitz.data.sh mount >> ${logFile}
if [ $? -eq 1 ]; then
echo "FAIL: blitz.data.sh mount failed" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "blitz.data.sh mount failed"
exit 1
fi
# link directories together in /mnt/hdd (pre-provision)
/home/admin/config.scripts/blitz.data.sh link >> ${logFile}
if [ $? -eq 1 ]; then
echo "FAIL: blitz.data.sh link failed" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "blitz.data.sh link failed"
exit 1
fi
#############################################
# MIGRATION from uploaded migration file
############################################
# if migrationFile was uploaded (value from raspiblitz.setup) - now import
source ${setupFile}
echo "# migrationFile(/mnt/disk_storage/temp/${migrationFile})" >> ${logFile}
if [ "${migrationFile}" != "" ]; then
echo "##### IMPORT MIGRATIONFILE: ${migrationFile}" >> ${logFile}
# unpack
/home/admin/_cache.sh set message "Unpacking Migration Data"
error=""
source <(/home/admin/config.scripts/blitz.migration.sh import "/mnt/disk_storage/temp/${migrationFile}")
# check for errors
if [ "${error}" != "" ]; then
/home/admin/config.scripts/blitz.error.sh _bootstrap.sh "migration-import-error" "blitz.migration.sh import exited with error" "/home/admin/config.scripts/blitz.migration.sh import ${migrationFile} --> ${error}" ${logFile}
exit 1
fi
# make sure a raspiblitz.conf exists after migration
confExists=$(ls /mnt/hdd/app-data/raspiblitz.conf 2>/dev/null | grep -c "raspiblitz.conf")
if [ "${confExists}" != "1" ]; then
/home/admin/config.scripts/blitz.error.sh _bootstrap.sh "migration-failed" "missing-config" "After runnign migration process - no raspiblitz.conf abvailable." ${logFile}
exit 1
fi
# make sure upload mount is deleted
rm -rf /mnt/upload 2>/dev/null
# signal recovery provision phase
scenario="recovery"
setupPhase="recovery"
/home/admin/_cache.sh set setupPhase "${setupPhase}"
fi
if [ "${scenario}" = "setup" ]; then
rm -f ${configFile}
echo "# CREATING raspiblitz.conf from setup file" >> ${logFile}
source /home/admin/_version.info
source ${setupFile}
touch ${configFile} >> ${logFile}
echo "# RASPIBLITZ CONFIG FILE" > ${configFile}
echo "raspiBlitzVersion='${codeVersion}'" >> ${configFile}
echo "lcdrotate='1'" >> ${configFile}
echo "lightning='${lightning}'" >> ${configFile}
echo "network='bitcoin'" >> ${configFile}
echo "chain='main'" >> ${configFile}
echo "hostname='${hostname}'" >> ${configFile}
echo "runBehindTor='on'" >> ${configFile}
chown root:sudo ${configFile}
chmod 664 ${configFile}
echo "cat ${configFile}" >> ${logFile}
cat ${configFile} >> ${logFile}
fi
# load fresh setup data
echo "# Sourcing ${setupFile} " >> ${logFile}
source ${setupFile}
# enable tor service
/home/admin/config.scripts/tor.install.sh enable >> ${logFile}
# kick-off provision process
/home/admin/_cache.sh set state "provision"
/home/admin/_cache.sh set message "Starting Provision"
# add some debug info to logfile
echo "# df " >> ${logFile}
df >> ${logFile}
echo "# lsblk -o NAME,FSTYPE,LABEL " >> ${logFile}
lsblk -o NAME,FSTYPE,LABEL >> ${logFile}
# load fresh config data
echo "# Sourcing ${configFile} " >> ${logFile}
cat ${configFile} >> ${logFile}
source ${configFile}
# load fresh setup data
echo "# Sourcing ${setupFile} " >> ${logFile}
source ${setupFile}
# make sure basic info is in raspiblitz.info
/home/admin/_cache.sh set network "${network}"
/home/admin/_cache.sh set chain "${chain}"
/home/admin/_cache.sh set lightning "${lightning}"
# Bitcoin Mainnet
if [ "${mainnet}" = "on" ] || [ "${chain}" = "main" ]; then
echo "Provisioning ${network} Mainnet - run config script" >> ${logFile}
/home/admin/config.scripts/bitcoin.install.sh on mainnet >> ${logFile} 2>&1
else
echo "Provisioning ${network} Mainnet - not active" >> ${logFile}
fi
# Bitcoin Testnet
if [ "${testnet}" = "on" ]; then
echo "Provisioning ${network} Testnet - run config script" >> ${logFile}
/home/admin/config.scripts/bitcoin.install.sh on testnet >> ${logFile} 2>&1
else
echo "Provisioning ${network} Testnet - not active" >> ${logFile}
fi
# Bitcoin Signet
if [ "${signet}" = "on" ]; then
echo "Provisioning ${network} Signet - run config script" >> ${logFile}
/home/admin/config.scripts/bitcoin.install.sh on signet >> ${logFile} 2>&1
else
echo "Provisioning ${network} Signet - not active" >> ${logFile}
fi
# if setup - run provision setup first
if [ "${setupPhase}" = "setup" ]; then
echo "Calling _provision.setup.sh for basic setup tasks .." >> $logFile
/home/admin/_cache.sh set message "Provision Setup"
/home/admin/_provision.setup.sh
errorState=$?
if [ "$errorState" != "0" ]; then
# only trigger an error message if the script hasnt itself triggered an error message already
source <(/home/admin/_cache.sh get state)
if [ "${state}" != "error" ]; then
/home/admin/config.scripts/blitz.error.sh _bootstrap.sh "provision-setup-exit" "unknown or syntax error on (${errorState}) _provision.setup.sh" "" ${logFile}
fi
exit 1
fi
fi
echo "# CHOOSE PROVISION: setupPhase(${setupPhase})" >> ${logFile}
# if migration from other nodes - run the migration provision first
if [ "${setupPhase}" = "migration" ]; then
echo "Calling _provision.migration.sh for possible migrations .." >> $logFile
/home/admin/_cache.sh set message "Provision migration"
/home/admin/_provision.migration.sh
errorState=$?
if [ "$errorState" != "0" ]; then
# only trigger an error message if the script hasnt itself triggered an error message already
source <(/home/admin/_cache.sh get state)
if [ "${state}" != "error" ]; then
/home/admin/config.scripts/blitz.error.sh _bootstrap.sh "provision-migration-exit" "unknown or syntax error on (${errorState}) _provision.migration.sh" "" ${logFile}
fi
exit 1
fi
fi
# if update/recovery/migration-followup
if [ "${setupPhase}" = "update" ] || [ "${setupPhase}" = "recovery" ] || [ "${setupPhase}" = "migration" ]; then
echo "Calling _provision.update.sh .." >> $logFile
/home/admin/_cache.sh set message "Provision Update/Recovery/Migration"
/home/admin/_provision.update.sh
errorState=$?
if [ "$errorState" != "0" ]; then
# only trigger an error message if the script hasnt itself triggered an error message already
source <(/home/admin/_cache.sh get state)
if [ "${state}" != "error" ]; then
/home/admin/config.scripts/blitz.error.sh _bootstrap.sh "provision-update-exit" "unknown or syntax error on (${errorState}) _provision.update.sh" "" ${logFile}
fi
exit 1
fi
fi
# finalize provisioning
echo "Calling _bootstrap.provision.sh for general system provisioning (${setupPhase}) .." >> $logFile
/home/admin/_cache.sh set message "Provision Basics"
/home/admin/_provision_.sh
errorState=$?
if [ "$errorState" != "0" ]; then
# only trigger an error message if the script hasnt itself triggered an error message already
source <(/home/admin/_cache.sh get state)
if [ "${state}" != "error" ]; then
/home/admin/config.scripts/blitz.error.sh _bootstrap.sh "provision-exit" "unknown or syntax error on (${errorState}) _provision_.sh" "" ${logFile}
fi
exit 1
fi
# everyone can read the config but it can only be
# edited/written by root ot admin user (part of group sudo)
chown root:sudo ${configFile}
chmod 664 ${configFile}
# delete provision in progress flag
rm /home/admin/provision.flag
rm /mnt/hdd/app-data/raspiblitz.setup 2>/dev/null
# final relink of directories
/home/admin/config.scripts/blitz.data.sh link >> ${logFile}
if [ $? -eq 1 ]; then
echo "FAIL: blitz.data.sh link failed (2)" >> ${logFile}
/home/admin/_cache.sh set state "error"
/home/admin/_cache.sh set message "blitz.data.sh link failed (2)"
exit 1
fi
###################################
# Set Password A (in all cases)
if [ "${passwordA}" = "" ]; then
/home/admin/config.scripts/blitz.error.sh _bootstrap.sh "missing-passworda-2" "missing passwordA(2) in (${setupFile})" "" ${logFile}
exit 1
fi
echo "# setting PASSWORD A" >> ${logFile}
/home/admin/config.scripts/blitz.passwords.sh set a "${passwordA}" >> ${logFile}
# mark provision process done
/home/admin/_cache.sh set message "Provision Done"
# wait until syncProgress is available (neeed for final dialogs)
/home/admin/_cache.sh set state "waitsync"
btc_default_ready="0"
loop_counter=0
while [ "${btc_default_ready}" != "1" ]
do
loop_counter=$((loop_counter + 1))
source <(/home/admin/_cache.sh get btc_default_ready)
echo "# waitsync loop ${loop_counter} ... btc_default_ready(${btc_default_ready})" >> $logFile
sleep 2
if [ ${loop_counter} -eq 30 ]; then
echo "LOOP TAKES TOO LONG: Try deleting settings.json & force restart" >> $logFile
rm /mnt/hdd/app-storage/bitcoin/settings.json
systemctl restart bitcoind
fi
done
# one time add info on blockchain sync to chache
source <(/home/admin/_cache.sh get chain)
source <(/home/admin/config.scripts/bitcoin.monitor.sh ${chain}net info)
/home/admin/_cache.sh set btc_default_blocks_data_kb "${btc_blocks_data_kb}"
###################################################
# HANDOVER TO FINAL SETUP CONTROLLER
###################################################
echo "# HANDOVER TO FINAL SETUP CONTROLLER ..." >> $logFile
/home/admin/_cache.sh set state "waitfinal"
/home/admin/_cache.sh set message "Setup Done"
# system has to wait before reboot to present like seed words and other info/options to user
echo "BOOTSTRAP EXIT ... waiting for final setup controller to initiate final reboot." >> $logFile
exit 1
else
############################
############################
# NORMAL START BOOTSTRAP (not executed after setup)
# Blockchain & Lightning not running
############################
echo "# NORMAL START BOOTSTRAP" >> $logFile
source <(/home/admin/config.scripts/blitz.data.sh status)
#################################
# FIX BLOCKCHAINDATA OWNER (just in case)
# https://github.com/rootzoll/raspiblitz/issues/239#issuecomment-450887567
#################################
chown bitcoin:bitcoin -R /mnt/hdd/bitcoin 2>/dev/null
#################################
# FIX BLOCKING FILES (just in case)
# https://github.com/rootzoll/raspiblitz/issues/1901#issue-774279088
# https://github.com/rootzoll/raspiblitz/issues/1836#issue-755342375
rm -f /mnt/hdd/bitcoin/bitcoind.pid 2>/dev/null
rm -f /mnt/hdd/bitcoin/.lock 2>/dev/null
################################
# DELETE LOG & LOCK FILES
################################
# LND and Blockchain Errors will be still in systemd journals
# limit debug.log to 10MB on start - see #3872
if [ $(grep -c "shrinkdebugfile=" < /mnt/hdd/app-data/bitcoin/bitcoin.conf) -eq 0 ];then
echo "shrinkdebugfile=1" | tee -a /mnt/hdd/app-data/bitcoin/bitcoin.conf
fi
# /mnt/hdd/app-data/lnd/logs/bitcoin/mainnet/lnd.log
rm /mnt/hdd/app-data/lnd/logs/${network}/${chain}net/lnd.log 2>/dev/null
# https://github.com/rootzoll/raspiblitz/issues/1700
rm /mnt/storage/app-storage/electrs/db/mainnet/LOCK 2>/dev/null
####################################
# EXPANDING PARTITIONS (for Proxmox)
####################################
if [ ${#storagePartition} -gt 0 ] && [ ${#storageUnusedSpacePercent} -gt 0 ] && [ ${storageUnusedSpacePercent} != "0" ]; then
echo "# EXPANDING STORAGE PARTITION" >> $logFile
/home/admin/config.scripts/blitz.data.sh expand ${storagePartition} >> ${logFile}
fi
if [ ${#dataPartition} -gt 0 ] && [ "${combinedDataStorage}" = "0" ] && [ ${#dataUnusedSpacePercent} -gt 0 ] && [ ${dataUnusedSpacePercent} != "0" ]; then
echo "# EXPANDING DATA PARTITION" >> $logFile
/home/admin/config.scripts/blitz.data.sh expand ${dataPartition} >> ${logFile}
fi
fi
##############################
##############################
# BOOSTRAP IN EVERY SITUATION
##############################
echo "# BOOSTRAP IN EVERY SITUATION" >> $logFile
/home/admin/_cache.sh set setupPhase "starting"
# make sure all is linked correctly
echo "blitz.data.sh link" >> $logFile
/home/admin/config.scripts/blitz.data.sh link >> ${logFile}
# load data from config file fresh
echo "load configfile data" >> $logFile
source ${configFile}
# if a WIFI config exists backup to HDD
source <(/home/admin/config.scripts/internet.sh status)
if [ ${configWifiExists} -eq 1 ]; then
echo "Making Backup Copy of WIFI config to HDD" >> $logFile
cp /etc/wpa_supplicant/wpa_supplicant.conf /mnt/hdd/app-data/wpa_supplicant.conf
fi
# always copy the latest display setting (maybe just in raspiblitz.info) to raspiblitz.conf
if [ "${displayClass}" != "" ]; then
/home/admin/config.scripts/blitz.conf.sh set displayClass ${displayClass}
fi
if [ "${displayType}" != "" ]; then
/home/admin/config.scripts/blitz.conf.sh set displayType ${displayType}
fi
# correct blitzapi config value
blitzApiRunning=$(ls /etc/systemd/system/blitzapi.service 2>/dev/null | grep -c "blitzapi.service")
if [ "${blitzapi}" = "" ] && [ ${blitzApiRunning} -eq 1 ]; then
/home/admin/config.scripts/blitz.conf.sh set blitzapi "on"
fi
# make sure users have latest credentials (if lnd is on)
if [ "${lightning}" = "lnd" ] || [ "${lnd}" = "on" ]; then
echo "running LND users credentials update" >> $logFile
/home/admin/config.scripts/lnd.credentials.sh sync "${chain:-main}net" >> $logFile
else
echo "skipping LND credentials sync" >> $logFile
fi
# mount optional backup device
if [ "${localBackupDeviceUUID}" != "" ] && [ "${localBackupDeviceUUID}" != "off" ]; then
/home/admin/config.scripts/blitz.backupdevice.sh mount >> $logFile
fi
#####################################
# CLEAN HDD TEMP
#####################################
echo "CLEANING TEMP DRIVE/FOLDER" >> $logFile
if [ -d "/mnt/hdd/temp" ]; then
echo "# Cleaning /mnt/hdd/temp" >> $logFile
rm -rf /mnt/hdd/temp/*
else
echo "# No /mnt/hdd/temp folder found" >> $logFile
fi
####################
# FORCE UASP FLAG
####################
# if uasp.force flag was set on sd card - now move into raspiblitz.conf
if [ -f "${raspi_bootdir}/uasp.force" ]; then
/home/admin/config.scripts/blitz.conf.sh set forceUasp "on"
rm ${raspi_bootdir}/uasp.force* >> $logFile
echo "DONE forceUasp=on recorded in raspiblitz.conf" >> $logFile
fi
######################################
# PREPARE SUBSCRIPTIONS DATA DIRECTORY
######################################
if [ -d "/mnt/hdd/app-data/subscriptions" ]; then
echo "OK: subscription data directory exists"
chown admin:admin /mnt/hdd/app-data/subscriptions
else
echo "CREATE: subscription data directory"
mkdir /mnt/hdd/app-data/subscriptions
chown admin:admin /mnt/hdd/app-data/subscriptions
fi
# make sure that bitcoin service is active
systemctl enable ${network}d
# make sure setup/provision is marked as done
/home/admin/_cache.sh set setupPhase "done"
/home/admin/_cache.sh set state "ready"
/home/admin/_cache.sh set message "Node Running"
# relax systemscan on certain values
/home/admin/_cache.sh focus internet_localip -1
# if node is stil in inital blockchain download
source <(/home/admin/_cache.sh get btc_default_sync_initialblockdownload)
if [ "${btc_default_sync_initialblockdownload}" = "1" ]; then
echo "Node is still in IBD .. refresh btc_default_sync_progress faster" >> $logFile
/home/admin/_cache.sh focus btc_default_sync_progress 0
fi
# backup wifi settings
/home/admin/config.scripts/internet.wifi.sh backup-restore
# notify about (re)start if activated
source <(/home/admin/_cache.sh get hostname)
/home/admin/config.scripts/blitz.notify.sh send "RaspiBlitz '${hostname}' (re)started" >> $logFile
echo "DONE BOOTSTRAP" >> $logFile
exit 0