mirror of
https://github.com/rootzoll/raspiblitz.git
synced 2025-02-25 07:07:46 +01:00
* fix copychain returns * typo in sync loop * stop services on inconsistent state * calling correct provisioning * apply bitcoin and lncli aliases in all scripts * network.aliases: add CLNETWORK * make cln default plugin dir: cln-plugins-enabled similar to the nginx model make 2 directories for plugins: cln-plugins-enabled - symlinked to ~/.lightning/plugins plugins from here are loaded automatically on cln start cln-plugins-available: plugins are downloaded here to be run until the next cln restart (or stopped with runonce) note the disk is mounted with noexec so plugins can't run from there discuss in: https://github.com/rootzoll/raspiblitz/issues/2295 * move shutdown script * change all place where shutdown script is used * change notify & release * moved shutdown script * moved shutdown scripts * add more debug info * moving github script * remove chain in sync * no longer needed chain in sync * move debug script * patch patch command * make sure setup file is sourced * remove debug output * make sure lnd is put behind tor * change indent * get fresh sync progress * avoid scrolling in menus * use new selfsignedcert if no lnd tls.cert present * sparko: add info and connect menu with own cert https://github.com/rootzoll/raspiblitz/issues/2295 * cln.rest: add connect option for Zeus https://github.com/rootzoll/raspiblitz/issues/2295 * cln: add the backup plugin + options Usage options: cln-plugin.backup.sh [on] [testnet|mainnet|signet] cln-plugin.backup.sh [restore] [testnet|mainnet|signet] [force] cln-plugin.backup.sh [backup-compact] [testnet|mainnet|signet] https://github.com/lightningd/plugins/tree/master/backup Discussed in: https://github.com/rootzoll/raspiblitz/issues/2295 * cln: add cln-plugin.standard.python.sh Install and show the output of the chosen plugin for C-lightning Usage: cln-plugin.standard-python.sh on [plugin-name] [testnet|mainnet|signet] [runonce] tested plugins: summary | helpme | feeadjuster find more at: https://github.com/lightningd/plugins discussed in: https://github.com/rootzoll/raspiblitz/issues/2295 * shellcheck: change all `egrep` to `grep -E` https://github.com/koalaman/shellcheck/wiki/SC2196 * do not resolve aliases, use as variables * lnd: fix lnd.conf for parallel networks discussed in: https://github.com/rootzoll/raspiblitz/issues/2290 * lnd: add LND option for parallel networks * deprecate Testnet in SETTINGS keysend and autopilot only for mainnet due to: https://github.com/rootzoll/raspiblitz/issues/2290 * lnd: autopilot and autounlock for testnet * fix comments * add the SYSTEM menu for parallel chains * RTL update to v0.11.0 make chain specific directory for the config: /home/rtl/${netprefix}RTL/ use ${netprefix}lnd.conf in config override Environmen tvaribales for cln in the systemd service: /etc/systemd/system/${netprefix}${typeprefix}RTL.service discussed in: https://github.com/rootzoll/raspiblitz/issues/2384 * lnd.setname.sh for testnet * display ${CHAIN} in the SYSTEM menu options * keep _aliases file when live patches are applied * all lncli_aliases to be used as variables * default to KIllMode=control-group in services https://www.man7.org/linux/man-pages/man5/systemd.kill.5.html discussed in: https://github.com/rootzoll/raspiblitz/issues/1901 * add cln.hsmtool.sh for hsm_secret handling encrypt | decrypt | autounlock the hsm_secret for C-lightning usage: cln.hsmtool.sh [unlock] [testnet|mainnet|signet] cln.hsmtool.sh [encrypt|decrypt] [testnet|mainnet|signet] cln.hsmtool.sh [autounlock-on|autounlock-off] [testnet|mainnet|signet] discussed in: https://github.com/rootzoll/raspiblitz/issues/2295 * add cln.install-service.sh to set up cln with systemd script to set up or update the CLN systemd service checks for hsm_secret encryption, autounlock and the sparko plugin usage: /home/admin/config.scripts/cln.install-service.sh $CHAIN discussed in: https://github.com/rootzoll/raspiblitz/issues/2295 * use symlink to cln-plugins-enabled for all plugins * keep lnd autopilot and autounlock mainnet only mainnet only settings: lnd autopilot lnd keysend circuibreaker lnd autounlock StaticChannelBackup to DropBox and USB * cln FUNDING fix parsing address * cln.hsmtool: add change-password and lock options * always set password A * cached peer info * fix printing cache * fix check for existing files * handle bitcoind not running * result with newline * test line break * test new line * test new line * two vars on output * #2388 improve online check (less pinging) * used cached peer status * move chache * cach file permissions * allow sudo call * fix cache * remove double scan info * add conf info to sync screen * reorder info * add space * add space * order info * internet suppress error messages * order info * fix offering Blockchain copy * fix hostname * final ready state info * lnd unlock after provision * remove debug exit * harmonize ready state * add status to lnd unlock * update lnd unlock script * edit the unlock * remove debug echo * add debug * add debug * fix if statement * debug output * switch position of source setupdata * #1126 preparing new setup with new c-lightning (#2396) * move debug script * patch patch command * make sure setup file is sourced * remove debug output * make sure lnd is put behind tor * change indent * get fresh sync progress * always set password A * cached peer info * fix printing cache * fix check for existing files * handle bitcoind not running * result with newline * test line break * test new line * test new line * two vars on output * #2388 improve online check (less pinging) * used cached peer status * move chache * cach file permissions * allow sudo call * fix cache * remove double scan info * add conf info to sync screen * reorder info * add space * add space * order info * internet suppress error messages * order info * fix offering Blockchain copy * fix hostname * final ready state info * lnd unlock after provision * remove debug exit * harmonize ready state * add status to lnd unlock * update lnd unlock script * edit the unlock * remove debug echo * add debug * add debug * fix if statement * debug output * switch position of source setupdata * lnd.unlock: fix typo * netwok.monitor.sh debug * cln-plugin.summary: fix paths * rtl: fix permission of config on copy * CASHOUT: use aliases for lnd * rtl: install correctly for paralell chains * use CHAIN in CLN and LND menu * cln: add CASHOUT option * CLOSEALL and CASHOUT: Improve labels and comments Explaining CASHOUT in the label as discussed in: https://github.com/rootzoll/raspiblitz/issues/2358 * cln.install: fix tor config * cln: installthe latest master until the next release * _commands: source _aliases only if exists * network aliases: fall back to 'main' for 'chain' * new setup: keep testnet3 blocks and chainstate * new setup: improve capitalization in menu * improve help and comments * cln: install Sparko if configured, but not present * cln: add new wallet and import seed options * fix peernum * make sure that aliases get created on lnd setup * no error if aliases not yet exist * debug state * fix network alias when not set * fix syntax error * add debug error info * mute unlocking echos * add debug wait * add debug wait * make sure info is uptodate * make alias info as defaults * rename option * update sync info for no lightning * add action string * update sync info * move name dialog * wait for sync progress info * wait for syncprogress info * fix syntax * get fresh data * make sure to disable lnd * add c-lightning to debug * add setup logs to debug output * fix syntax error * add new-force wallet * try fix call hsmtool * hsm output tool * fix output * add seed-force * refactor blitz.mnemonic.py * test seed * debug info * dump object * try check * correct putput * fix syntax * check lnd for valid seed * fix gui * add Suez install script discussed in: https://github.com/rootzoll/raspiblitz/issues/2366 * cln rescue file export * get correct version * add cln export gui * cln.backup.sh cln-import * correct bytesize * generate cln wallet with passwordc * fix syntax * fix syntax * mute not needed error msg * PEERING: correct message on success * cln.install-service: fix sparko check * add Suez to menu for CLN and LND needs to be installed with the bitcoin user to be able to interact with CLN related: https://github.com/rootzoll/raspiblitz/issues/2366 * debug _provison.setup.sh stop bitcoind and restart with new config to avoid rpc password error disable and enable service instead of daemon-reload CLN: don't use passwordC as seedPassword * add cln.setname.sh make lnd.setname.sh work with parallel wallets * improve comments * SYSTEM: add CLNLOG and CLNCONF options * SYSTEM menu fixes * cln: add more aliases cln, clnlog, clnconf * cln: activate the backup plugin on every install * SERVICES menu: fix chantools/CLN switch * cln: load plugins from ${netprefix}cln-plugins-enabled changed the config paths to $lightning-dir/config or /networkname/config plugins are downloaded to the SDcard: /home/bitcoin/cln-plugins-available/ symlinked and loaded automatically from: /home/bitcoin/${netprefix}cln-plugins-enabled Related: #2295 * sparko: don't show logs after install * #2425 Adding experimental Blitz WebUI & API (#2426) * no password C & D when cln * add debug echos * set defaults before * #2228 wider grep to detect nvms (#2427) * cln.hsmtool: init backup with the new wallet * cln.install: fix access to raspiblitz.conf * cln-plugin.backup: fix path to backup-cli * cln: hide unhelpful warnings during setup * remove old jinja template rendering * fix lnd unlock detection * cln: look for files in .lightning dir with sudo * cln: correct lightning name in FInalDialog + typo * cln: make sure .lightning/bitcoin dir exists * FinalDialog: make the 24 words fit * cln.install.sh: create cln config if not present * Simplify localIP detection and improve compatibility (#2432) * show tail info on provision * only show lnd options when activated * fix syntax * only show main lightning impl options for RC1 * cln: always start the lightnind.service * cln: clear before showing summary * start cln on the end of provisioning * exit 0 on cln menu * press key after single actions * remove key press on cln actions * change to none * detect cln running * fix syntax * fix lightniing info * add TODO for CLN * add clnblockheight * zty with user bitcoin * check synced to chain for cln * fix increment * try scanprogress * use cln sync detection and progress * replace LNTYPE * next line * fix spaces * fix spaces * Update README.md (#2456) Fix 404 * Fix FAQ links (#2441) * Fix invalid URL ( (#2440) * support channels (#2382) * use #2370 height optimization * adjust exit codes in menu scripts * adjust password menu exit codes * adapt shutdown for cln * settings adapt to running lightning impl * fix syntax * debug info * add debug * better height * add default values * add config entry if not there yet * change default value * Added exit info for cln * make sure to load config file if available * add sparko to menu * add default for sparko * replace default sparko entry * show sparko installed or not * add more description to sparko option * RTL for clightnign in service menu * main menu item rtl * add RTL description * debug in RTL install * install sparko on recovery * update menu with cln * rework menu options Co-authored-by: openoms <oms@tuta.io> Co-authored-by: openoms <43343391+openoms@users.noreply.github.com> Co-authored-by: rek79 <rek79@users.noreply.github.com> Co-authored-by: Bitpaint <67663265+bitpaint@users.noreply.github.com> Co-authored-by: João Thallis <joaothallis@icloud.com> Co-authored-by: Peter Flock <78184669+peterflock@users.noreply.github.com> Co-authored-by: nyxnor <nyxnor@protonmail.com>
1084 lines
No EOL
39 KiB
Bash
Executable file
1084 lines
No EOL
39 KiB
Bash
Executable file
#!/bin/bash
|
|
#########################################################################
|
|
# Build your SD card image based on:
|
|
# raspios_arm64-2020-08-24
|
|
# https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2021-04-09/
|
|
# SHA256: a30a3650c3ef22a69f6f025760c6b04611a5992961a8c2cd44468f1c429d68bb
|
|
##########################################################################
|
|
# setup fresh SD card with image above - login per SSH and run this script:
|
|
##########################################################################
|
|
|
|
echo ""
|
|
echo "*****************************************"
|
|
echo "* RASPIBLITZ SD CARD IMAGE SETUP v1.7 *"
|
|
echo "*****************************************"
|
|
echo "For details on optional parameters - see build script source code:"
|
|
|
|
# 1st optional paramater: NO-INTERACTION
|
|
# ----------------------------------------
|
|
# When 'true' then no questions will be ask on building .. so it can be used in build scripts
|
|
# for containers or as part of other build scripts (default is false)
|
|
|
|
noInteraction="$1"
|
|
if [ ${#noInteraction} -eq 0 ]; then
|
|
noInteraction="false"
|
|
fi
|
|
if [ "${noInteraction}" != "true" ] && [ "${noInteraction}" != "false" ]; then
|
|
echo "ERROR: NO-INTERACTION parameter needs to be either 'true' or 'false'"
|
|
exit 1
|
|
else
|
|
echo "1) will use NO-INTERACTION --> '${noInteraction}'"
|
|
fi
|
|
|
|
# 2nd optional paramater: FATPACK
|
|
# -------------------------------
|
|
# could be 'true' or 'false' (default)
|
|
# When 'true' it will pre-install needed frameworks for additional apps and features
|
|
# as a convenience to safe on install and update time for additional apps.
|
|
# When 'false' it will just install the bare minimum and additional apps will just
|
|
# install needed frameworks and libraries on demand when activated by user.
|
|
# Use 'false' if you want to run your node without: go, dot-net, nodejs, docker, ...
|
|
|
|
fatpack="$2"
|
|
if [ ${#fatpack} -eq 0 ]; then
|
|
fatpack="false"
|
|
fi
|
|
if [ "${fatpack}" != "true" ] && [ "${fatpack}" != "false" ]; then
|
|
echo "ERROR: FATPACK parameter needs to be either 'true' or 'false'"
|
|
exit 1
|
|
else
|
|
echo "2) will use FATPACK --> '${fatpack}'"
|
|
fi
|
|
|
|
# 3rd optional paramater: GITHUB-USERNAME
|
|
# ---------------------------------------
|
|
# could be any valid github-user that has a fork of the raspiblitz repo - 'rootzoll' is default
|
|
# The 'raspiblitz' repo of this user is used to provisioning sd card
|
|
# with raspiblitz assets/scripts later on.
|
|
# If this parameter is set also the branch needs to be given (see next parameter).
|
|
githubUser="$3"
|
|
if [ ${#githubUser} -eq 0 ]; then
|
|
githubUser="rootzoll"
|
|
fi
|
|
echo "3) will use GITHUB-USERNAME --> '${githubUser}'"
|
|
|
|
# 4th optional paramater: GITHUB-BRANCH
|
|
# -------------------------------------
|
|
# could be any valid branch of the given GITHUB-USERNAME forked raspiblitz repo - 'dev' is default
|
|
githubBranch="$4"
|
|
if [ ${#githubBranch} -eq 0 ]; then
|
|
githubBranch="dev"
|
|
fi
|
|
echo "4) will use GITHUB-BRANCH --> '${githubBranch}'"
|
|
|
|
# 5th optional paramater: DISPLAY-CLASS
|
|
# ----------------------------------------
|
|
# Could be 'hdmi', 'headless' or 'lcd'
|
|
# On 'false' the standard video output is used (HDMI) by default.
|
|
# https://github.com/rootzoll/raspiblitz/issues/1265#issuecomment-813369284
|
|
displayClass="$5"
|
|
if [ ${#displayClass} -eq 0 ] || [ "${displayClass}" == "false" ]; then
|
|
displayClass="hdmi"
|
|
fi
|
|
if [ "${displayClass}" != "hdmi" ] && [ "${displayClass}" != "lcd" ] && [ "${displayClass}" != "headless" ]; then
|
|
echo "ERROR: DISPLAY-CLASS parameter needs to be 'lcd', 'hdmi' or 'headless'"
|
|
exit 1
|
|
else
|
|
echo "5) will use DISPLAY-CLASS --> '${displayClass}'"
|
|
fi
|
|
|
|
# 6th optional paramater: TWEAK-BOOTDRIVE
|
|
# ---------------------------------------
|
|
# could be 'true' (default) or 'false'
|
|
# If 'true' it will try (based on the base OS) to optimize the boot drive.
|
|
# If 'false' this will skipped.
|
|
tweakBootdrives="$6"
|
|
if [ ${#tweakBootdrives} -eq 0 ]; then
|
|
tweakBootdrives="true"
|
|
fi
|
|
if [ "${tweakBootdrives}" != "true" ] && [ "${tweakBootdrives}" != "false" ]; then
|
|
echo "ERROR: TWEAK-BOOTDRIVE parameter needs to be either 'true' or 'false'"
|
|
exit 1
|
|
else
|
|
echo "6) will use TWEAK-BOOTDRIVE --> '${tweakBootdrives}'"
|
|
fi
|
|
|
|
# 7th optional paramater: WIFI
|
|
# ---------------------------------------
|
|
# could be 'false' or 'true' (default) or a valid WIFI country code like 'US' (default)
|
|
# If 'false' WIFI will be deactivated by default
|
|
# If 'true' WIFI will be activated by with default country code 'US'
|
|
# If any valid wifi country code Wifi will be activated with that country code by default
|
|
modeWifi="$7"
|
|
if [ ${#modeWifi} -eq 0 ] || [ "${modeWifi}" == "true" ]; then
|
|
modeWifi="US"
|
|
fi
|
|
echo "7) will use WIFI --> '${modeWifi}'"
|
|
|
|
# AUTO-DETECTION: CPU-ARCHITECTURE
|
|
# ---------------------------------------
|
|
# keep in mind that DietPi for Raspberry is also a stripped down Raspbian
|
|
isARM=$(uname -m | grep -c 'arm')
|
|
isAARCH64=$(uname -m | grep -c 'aarch64')
|
|
isX86_64=$(uname -m | grep -c 'x86_64')
|
|
cpu="?"
|
|
if [ ${isARM} -gt 0 ]; then
|
|
cpu="arm"
|
|
elif [ ${isAARCH64} -gt 0 ]; then
|
|
cpu="aarch64"
|
|
elif [ ${isX86_64} -gt 0 ]; then
|
|
cpu="x86_64"
|
|
else
|
|
echo "!!! FAIL !!!"
|
|
echo "Can only build on ARM, aarch64, x86_64 not on:"
|
|
uname -m
|
|
exit 1
|
|
fi
|
|
echo "X) will use CPU-ARCHITECTURE --> '${cpu}'"
|
|
|
|
# AUTO-DETECTION: OPERATINGSYSTEM
|
|
# ---------------------------------------
|
|
baseimage="?"
|
|
isDietPi=$(uname -n | grep -c 'DietPi')
|
|
isRaspbian=$(grep -c 'Raspbian' /etc/os-release 2>/dev/null)
|
|
isDebian=$(grep -c 'Debian' /etc/os-release 2>/dev/null)
|
|
isUbuntu=$(grep -c 'Ubuntu' /etc/os-release 2>/dev/null)
|
|
isNvidia=$(uname -a | grep -c 'tegra')
|
|
if [ ${isRaspbian} -gt 0 ]; then
|
|
baseimage="raspbian"
|
|
fi
|
|
if [ ${isDebian} -gt 0 ]; then
|
|
if [ $(uname -n | grep -c 'rpi') -gt 0 ] && [ ${isAARCH64} -gt 0 ]; then
|
|
baseimage="debian_rpi64"
|
|
elif [ $(uname -n | grep -c 'raspberrypi') -gt 0 ] && [ ${isAARCH64} -gt 0 ]; then
|
|
baseimage="raspios_arm64"
|
|
elif [ ${isAARCH64} -gt 0 ] || [ ${isARM} -gt 0 ] ; then
|
|
baseimage="armbian"
|
|
else
|
|
baseimage="debian"
|
|
fi
|
|
fi
|
|
if [ ${isUbuntu} -gt 0 ]; then
|
|
baseimage="ubuntu"
|
|
fi
|
|
if [ ${isDietPi} -gt 0 ]; then
|
|
baseimage="dietpi"
|
|
fi
|
|
if [ "${baseimage}" = "?" ]; then
|
|
cat /etc/os-release 2>/dev/null
|
|
echo "!!! FAIL: Base Image cannot be detected or is not supported."
|
|
exit 1
|
|
fi
|
|
echo "X) will use OPERATINGSYSTEM ---> '${baseimage}'"
|
|
|
|
# USER-CONFIRMATION
|
|
if [ "${noInteraction}" != "true" ]; then
|
|
echo -n "Do you agree with all parameters above? (yes/no) "
|
|
read installRaspiblitzAnswer
|
|
if [ "$installRaspiblitzAnswer" != "yes" ] ; then
|
|
exit 1
|
|
fi
|
|
fi
|
|
echo "Building RaspiBlitz ..."
|
|
echo ""
|
|
sleep 3
|
|
|
|
# INSTALL TOR
|
|
echo "*** INSTALL TOR BY DEFAULT ***"
|
|
echo ""
|
|
sudo apt install -y dirmngr
|
|
echo "*** Adding KEYS deb.torproject.org ***"
|
|
# fix for v1.6 base image https://github.com/rootzoll/raspiblitz/issues/1906#issuecomment-755299759
|
|
wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | sudo gpg --import
|
|
sudo gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
|
|
torKeyAvailable=$(sudo gpg --list-keys | grep -c "A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89")
|
|
if [ ${torKeyAvailable} -eq 0 ]; then
|
|
echo "!!! FAIL: Was not able to import deb.torproject.org key"
|
|
exit 1
|
|
fi
|
|
echo "- OK key added"
|
|
|
|
echo "*** Adding Tor Sources to sources.list ***"
|
|
torSourceListAvailable=$(sudo grep -c 'https://deb.torproject.org/torproject.org' /etc/apt/sources.list)
|
|
echo "torSourceListAvailable=${torSourceListAvailable}"
|
|
if [ ${torSourceListAvailable} -eq 0 ]; then
|
|
echo "- adding TOR sources ..."
|
|
if [ "${baseimage}" = "raspbian" ] || [ "${baseimage}" = "raspios_arm64" ] || [ "${baseimage}" = "armbian" ] || [ "${baseimage}" = "dietpi" ]; then
|
|
echo "- using https://deb.torproject.org/torproject.org buster"
|
|
echo "deb https://deb.torproject.org/torproject.org buster main" | sudo tee -a /etc/apt/sources.list
|
|
echo "deb-src https://deb.torproject.org/torproject.org buster main" | sudo tee -a /etc/apt/sources.list
|
|
elif [ "${baseimage}" = "ubuntu" ]; then
|
|
echo "- using https://deb.torproject.org/torproject.org focal"
|
|
echo "deb https://deb.torproject.org/torproject.org focal main" | sudo tee -a /etc/apt/sources.list
|
|
echo "deb-src https://deb.torproject.org/torproject.org focal main" | sudo tee -a /etc/apt/sources.list
|
|
else
|
|
echo "!!! FAIL: No Tor sources for os: ${baseimage}"
|
|
exit 1
|
|
fi
|
|
echo "- OK sources added"
|
|
else
|
|
echo "TOR sources are available"
|
|
fi
|
|
|
|
echo "*** Install & Enable Tor ***"
|
|
sudo apt update
|
|
sudo apt install tor tor-arm torsocks -y
|
|
echo ""
|
|
|
|
# FIXING LOCALES
|
|
# https://github.com/rootzoll/raspiblitz/issues/138
|
|
# https://daker.me/2014/10/how-to-fix-perl-warning-setting-locale-failed-in-raspbian.html
|
|
# https://stackoverflow.com/questions/38188762/generate-all-locales-in-a-docker-image
|
|
if [ "${baseimage}" = "raspbian" ] || [ "${baseimage}" = "dietpi" ] || \
|
|
[ "${baseimage}" = "raspios_arm64" ]||[ "${baseimage}" = "debian_rpi64" ]; then
|
|
echo ""
|
|
echo "*** FIXING LOCALES FOR BUILD ***"
|
|
|
|
sudo sed -i "s/^# en_US.UTF-8 UTF-8.*/en_US.UTF-8 UTF-8/g" /etc/locale.gen
|
|
sudo sed -i "s/^# en_US ISO-8859-1.*/en_US ISO-8859-1/g" /etc/locale.gen
|
|
sudo locale-gen
|
|
export LANGUAGE=en_US.UTF-8
|
|
export LANG=en_US.UTF-8
|
|
if [ "${baseimage}" = "raspbian" ] || [ "${baseimage}" = "dietpi" ]; then
|
|
export LC_ALL=en_US.UTF-8
|
|
|
|
# https://github.com/rootzoll/raspiblitz/issues/684
|
|
sudo sed -i "s/^ SendEnv LANG LC.*/# SendEnv LANG LC_*/g" /etc/ssh/ssh_config
|
|
|
|
# remove unneccesary files
|
|
sudo rm -rf /home/pi/MagPi
|
|
# https://www.reddit.com/r/linux/comments/lbu0t1/microsoft_repo_installed_on_all_raspberry_pis/
|
|
sudo rm -f /etc/apt/sources.list.d/vscode.list
|
|
sudo rm -f /etc/apt/trusted.gpg.d/microsoft.gpg
|
|
fi
|
|
if [ ! -f /etc/apt/sources.list.d/raspi.list ]; then
|
|
echo "# Add the archive.raspberrypi.org/debian/ to the sources.list"
|
|
echo "deb http://archive.raspberrypi.org/debian/ buster main" | sudo tee /etc/apt/sources.list.d/raspi.list
|
|
fi
|
|
fi
|
|
|
|
# remove some (big) packages that are not needed
|
|
sudo apt remove -y --purge libreoffice* oracle-java* chromium-browser nuscratch scratch sonic-pi minecraft-pi plymouth python2 vlc
|
|
sudo apt clean
|
|
sudo apt -y autoremove
|
|
|
|
if [ -f "/usr/bin/python3.7" ]; then
|
|
# make sure /usr/bin/python exists (and calls Python3.7 in Buster)
|
|
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1
|
|
echo "python calls python3.7"
|
|
elif [ -f "/usr/bin/python3.8" ]; then
|
|
# use python 3.8 if available
|
|
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
|
|
sudo ln -s /usr/bin/python3.8 /usr/bin/python3.7
|
|
echo "python calls python3.8"
|
|
else
|
|
echo "!!! FAIL !!!"
|
|
echo "There is no tested version of python present"
|
|
exit 1
|
|
fi
|
|
|
|
# update debian
|
|
echo ""
|
|
echo "*** UPDATE ***"
|
|
sudo apt update -y
|
|
sudo apt upgrade -f -y
|
|
|
|
echo ""
|
|
echo "*** PREPARE ${baseimage} ***"
|
|
|
|
# make sure the pi user is present
|
|
if [ "$(compgen -u | grep -c dietpi)" -gt 0 ];then
|
|
echo "# Renaming dietpi user to pi"
|
|
sudo usermod -l pi dietpi
|
|
elif [ "$(compgen -u | grep -c pi)" -eq 0 ];then
|
|
echo "# Adding the user pi"
|
|
sudo adduser --disabled-password --gecos "" pi
|
|
sudo adduser pi sudo
|
|
fi
|
|
|
|
# special prepare when Raspbian
|
|
if [ "${baseimage}" = "raspbian" ]||[ "${baseimage}" = "raspios_arm64" ]||\
|
|
[ "${baseimage}" = "debian_rpi64" ]; then
|
|
sudo apt install -y raspi-config
|
|
# do memory split (16MB)
|
|
sudo raspi-config nonint do_memory_split 16
|
|
# set to wait until network is available on boot (0 seems to yes)
|
|
sudo raspi-config nonint do_boot_wait 0
|
|
# set WIFI country so boot does not block
|
|
if [ "${modeWifi}" != "false" ]; then
|
|
# this will undo the softblock of rfkill on RaspiOS
|
|
sudo raspi-config nonint do_wifi_country $modeWifi
|
|
fi
|
|
# see https://github.com/rootzoll/raspiblitz/issues/428#issuecomment-472822840
|
|
|
|
configFile="/boot/config.txt"
|
|
max_usb_current="max_usb_current=1"
|
|
max_usb_currentDone=$(grep -c "$max_usb_current" $configFile)
|
|
|
|
if [ ${max_usb_currentDone} -eq 0 ]; then
|
|
echo "" | sudo tee -a $configFile
|
|
echo "# Raspiblitz" | sudo tee -a $configFile
|
|
echo "$max_usb_current" | sudo tee -a $configFile
|
|
else
|
|
echo "$max_usb_current already in $configFile"
|
|
fi
|
|
|
|
# run fsck on sd root partition on every startup to prevent "maintenance login" screen
|
|
# see: https://github.com/rootzoll/raspiblitz/issues/782#issuecomment-564981630
|
|
# see https://github.com/rootzoll/raspiblitz/issues/1053#issuecomment-600878695
|
|
# use command to check last fsck check: sudo tune2fs -l /dev/mmcblk0p2
|
|
if [ "${tweakBootdrives}" == "true" ]; then
|
|
echo "* running tune2fs"
|
|
sudo tune2fs -c 1 /dev/mmcblk0p2
|
|
else
|
|
echo "* skipping tweakBootdrives"
|
|
fi
|
|
|
|
# edit kernel parameters
|
|
kernelOptionsFile=/boot/cmdline.txt
|
|
fsOption1="fsck.mode=force"
|
|
fsOption2="fsck.repair=yes"
|
|
fsOption1InFile=$(grep -c ${fsOption1} ${kernelOptionsFile})
|
|
fsOption2InFile=$(grep -c ${fsOption2} ${kernelOptionsFile})
|
|
|
|
if [ ${fsOption1InFile} -eq 0 ]; then
|
|
sudo sed -i "s/^/$fsOption1 /g" "$kernelOptionsFile"
|
|
echo "$fsOption1 added to $kernelOptionsFile"
|
|
else
|
|
echo "$fsOption1 already in $kernelOptionsFile"
|
|
fi
|
|
if [ ${fsOption2InFile} -eq 0 ]; then
|
|
sudo sed -i "s/^/$fsOption2 /g" "$kernelOptionsFile"
|
|
echo "$fsOption2 added to $kernelOptionsFile"
|
|
else
|
|
echo "$fsOption2 already in $kernelOptionsFile"
|
|
fi
|
|
fi
|
|
|
|
# special prepare when Nvidia Jetson Nano
|
|
if [ ${isNvidia} -eq 1 ] ; then
|
|
# disable GUI on boot
|
|
sudo systemctl set-default multi-user.target
|
|
fi
|
|
|
|
echo ""
|
|
echo "*** CONFIG ***"
|
|
# based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#raspi-config
|
|
|
|
# set new default password for root user
|
|
echo "root:raspiblitz" | sudo chpasswd
|
|
echo "pi:raspiblitz" | sudo chpasswd
|
|
|
|
# prepare auto-start of 00infoLCD.sh script on pi user login (just kicks in if auto-login of pi is activated in HDMI or LCD mode)
|
|
if [ "${baseimage}" = "raspbian" ]||[ "${baseimage}" = "raspios_arm64" ]||\
|
|
[ "${baseimage}" = "debian_rpi64" ]||[ "${baseimage}" = "armbian" ]||\
|
|
[ "${baseimage}" = "ubuntu" ]; then
|
|
homeFile=/home/pi/.bashrc
|
|
autostartDone=$(grep -c "automatic start the LCD" $homeFile)
|
|
if [ ${autostartDone} -eq 0 ]; then
|
|
# bash autostart for pi
|
|
# run as exec to dont allow easy physical access by keyboard
|
|
# see https://github.com/rootzoll/raspiblitz/issues/54
|
|
sudo bash -c 'echo "# automatic start the LCD info loop" >> /home/pi/.bashrc'
|
|
sudo bash -c 'echo "SCRIPT=/home/admin/00infoLCD.sh" >> /home/pi/.bashrc'
|
|
sudo bash -c 'echo "# replace shell with script => logout when exiting script" >> /home/pi/.bashrc'
|
|
sudo bash -c 'echo "exec \$SCRIPT" >> /home/pi/.bashrc'
|
|
echo "autostart LCD added to $homeFile"
|
|
else
|
|
echo "autostart LCD already in $homeFile"
|
|
fi
|
|
elif [ "${baseimage}" = "dietpi" ]; then
|
|
homeFile=/home/dietpi/.bashrc
|
|
autostartDone=$(grep -c "automatic start the LCD" $homeFile)
|
|
if [ ${autostartDone} -eq 0 ]; then
|
|
# bash autostart for dietpi
|
|
sudo bash -c 'echo "# automatic start the LCD info loop" >> /home/dietpi/.bashrc'
|
|
sudo bash -c 'echo "SCRIPT=/home/admin/00infoLCD.sh" >> /home/dietpi/.bashrc'
|
|
sudo bash -c 'echo "# replace shell with script => logout when exiting script" >> /home/dietpi/.bashrc'
|
|
sudo bash -c 'echo "exec \$SCRIPT" >> /home/dietpi/.bashrc'
|
|
echo "autostart LCD added to $homeFile"
|
|
else
|
|
echo "autostart LCD already in $homeFile"
|
|
fi
|
|
else
|
|
echo "WARN: Script Autostart not available for baseimage(${baseimage}) - may just run on 'headless'"
|
|
fi
|
|
|
|
# change log rotates
|
|
# see https://github.com/rootzoll/raspiblitz/issues/394#issuecomment-471535483
|
|
echo "/var/log/syslog" >> ./rsyslog
|
|
echo "{" >> ./rsyslog
|
|
echo " rotate 7" >> ./rsyslog
|
|
echo " daily" >> ./rsyslog
|
|
echo " missingok" >> ./rsyslog
|
|
echo " notifempty" >> ./rsyslog
|
|
echo " delaycompress" >> ./rsyslog
|
|
echo " compress" >> ./rsyslog
|
|
echo " postrotate" >> ./rsyslog
|
|
echo " invoke-rc.d rsyslog rotate > /dev/null" >> ./rsyslog
|
|
echo " endscript" >> ./rsyslog
|
|
echo "}" >> ./rsyslog
|
|
echo "" >> ./rsyslog
|
|
echo "/var/log/mail.info" >> ./rsyslog
|
|
echo "/var/log/mail.warn" >> ./rsyslog
|
|
echo "/var/log/mail.err" >> ./rsyslog
|
|
echo "/var/log/mail.log" >> ./rsyslog
|
|
echo "/var/log/daemon.log" >> ./rsyslog
|
|
echo "{" >> ./rsyslog
|
|
echo " rotate 4" >> ./rsyslog
|
|
echo " size=100M" >> ./rsyslog
|
|
echo " missingok" >> ./rsyslog
|
|
echo " notifempty" >> ./rsyslog
|
|
echo " compress" >> ./rsyslog
|
|
echo " delaycompress" >> ./rsyslog
|
|
echo " sharedscripts" >> ./rsyslog
|
|
echo " postrotate" >> ./rsyslog
|
|
echo " invoke-rc.d rsyslog rotate > /dev/null" >> ./rsyslog
|
|
echo " endscript" >> ./rsyslog
|
|
echo "}" >> ./rsyslog
|
|
echo "" >> ./rsyslog
|
|
echo "/var/log/kern.log" >> ./rsyslog
|
|
echo "/var/log/auth.log" >> ./rsyslog
|
|
echo "{" >> ./rsyslog
|
|
echo " rotate 4" >> ./rsyslog
|
|
echo " size=100M" >> ./rsyslog
|
|
echo " missingok" >> ./rsyslog
|
|
echo " notifempty" >> ./rsyslog
|
|
echo " compress" >> ./rsyslog
|
|
echo " delaycompress" >> ./rsyslog
|
|
echo " sharedscripts" >> ./rsyslog
|
|
echo " postrotate" >> ./rsyslog
|
|
echo " invoke-rc.d rsyslog rotate > /dev/null" >> ./rsyslog
|
|
echo " endscript" >> ./rsyslog
|
|
echo "}" >> ./rsyslog
|
|
echo "" >> ./rsyslog
|
|
echo "/var/log/user.log" >> ./rsyslog
|
|
echo "/var/log/lpr.log" >> ./rsyslog
|
|
echo "/var/log/cron.log" >> ./rsyslog
|
|
echo "/var/log/debug" >> ./rsyslog
|
|
echo "/var/log/messages" >> ./rsyslog
|
|
echo "{" >> ./rsyslog
|
|
echo " rotate 4" >> ./rsyslog
|
|
echo " weekly" >> ./rsyslog
|
|
echo " missingok" >> ./rsyslog
|
|
echo " notifempty" >> ./rsyslog
|
|
echo " compress" >> ./rsyslog
|
|
echo " delaycompress" >> ./rsyslog
|
|
echo " sharedscripts" >> ./rsyslog
|
|
echo " postrotate" >> ./rsyslog
|
|
echo " invoke-rc.d rsyslog rotate > /dev/null" >> ./rsyslog
|
|
echo " endscript" >> ./rsyslog
|
|
echo "}" >> ./rsyslog
|
|
sudo mv ./rsyslog /etc/logrotate.d/rsyslog
|
|
sudo chown root:root /etc/logrotate.d/rsyslog
|
|
sudo service rsyslog restart
|
|
|
|
echo ""
|
|
echo "*** SOFTWARE UPDATE ***"
|
|
# based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#software-update
|
|
|
|
# installs like on RaspiBolt
|
|
sudo apt install -y htop git curl bash-completion vim jq dphys-swapfile bsdmainutils
|
|
|
|
# installs bandwidth monitoring for future statistics
|
|
sudo apt install -y vnstat
|
|
|
|
# prepare for format data drive
|
|
sudo apt install -y parted dosfstools
|
|
|
|
# prepare for BTRFS data drive raid
|
|
sudo apt install -y btrfs-progs
|
|
|
|
# network tools
|
|
sudo apt install -y autossh telnet
|
|
|
|
# prepare for display graphics mode
|
|
# see https://github.com/rootzoll/raspiblitz/pull/334
|
|
sudo apt install -y fbi
|
|
|
|
# prepare for powertest
|
|
sudo apt install -y sysbench
|
|
|
|
# check for dependencies on DietPi, Ubuntu, Armbian
|
|
sudo apt install -y build-essential
|
|
|
|
# add armbian-config
|
|
if [ "${baseimage}" = "armbian" ]; then
|
|
# add armbian config
|
|
sudo apt install armbian-config -y
|
|
fi
|
|
|
|
# dependencies for python
|
|
sudo apt install -y python3-venv python3-dev python3-wheel python3-jinja2 python3-pip
|
|
|
|
# make sure /usr/bin/pip exists (and calls pip3 in Debian Buster)
|
|
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1
|
|
|
|
# rsync is needed to copy from HDD
|
|
sudo apt install -y rsync
|
|
# install ifconfig
|
|
sudo apt install -y net-tools
|
|
#to display hex codes
|
|
sudo apt install -y xxd
|
|
# setuptools needed for Nyx
|
|
sudo pip install setuptools
|
|
# netcat for 00infoBlitz.sh
|
|
sudo apt install -y netcat
|
|
# install OpenSSH client + server
|
|
sudo apt install -y openssh-client
|
|
sudo apt install -y openssh-sftp-server
|
|
sudo apt install -y sshpass
|
|
# install killall, fuser
|
|
sudo apt install -y psmisc
|
|
# install firewall
|
|
sudo apt install -y ufw
|
|
# make sure sqlite3 is available
|
|
sudo apt install -y sqlite3
|
|
|
|
|
|
sudo apt clean
|
|
sudo apt -y autoremove
|
|
|
|
echo ""
|
|
echo "*** ADDING MAIN USER admin ***"
|
|
# based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#adding-main-user-admin
|
|
# using the default password 'raspiblitz'
|
|
|
|
sudo adduser --disabled-password --gecos "" admin
|
|
echo "admin:raspiblitz" | sudo chpasswd
|
|
sudo adduser admin sudo
|
|
sudo chsh admin -s /bin/bash
|
|
|
|
# configure sudo for usage without password entry
|
|
echo '%sudo ALL=(ALL) NOPASSWD:ALL' | sudo EDITOR='tee -a' visudo
|
|
|
|
# WRITE BASIC raspiblitz.info to sdcard
|
|
echo "baseimage=${baseimage}" > /home/admin/raspiblitz.info
|
|
echo "cpu=${cpu}" >> /home/admin/raspiblitz.info
|
|
echo "displayClass=headless" >> /home/admin/raspiblitz.info
|
|
sudo mv ./raspiblitz.info /home/admin/raspiblitz.info
|
|
sudo chmod 755 /home/admin/raspiblitz.info
|
|
|
|
echo ""
|
|
echo "*** ADDING SERVICE USER bitcoin"
|
|
# based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#adding-the-service-user-bitcoin
|
|
|
|
# create user and set default password for user
|
|
sudo adduser --disabled-password --gecos "" bitcoin
|
|
echo "bitcoin:raspiblitz" | sudo chpasswd
|
|
|
|
echo ""
|
|
echo "*** ADDING GROUPS FOR CREDENTIALS STORE ***"
|
|
# access to credentials (e.g. macaroon files) in a central location is managed with unix groups and permissions
|
|
sudo /usr/sbin/groupadd --force --gid 9700 lndadmin
|
|
sudo /usr/sbin/groupadd --force --gid 9701 lndinvoice
|
|
sudo /usr/sbin/groupadd --force --gid 9702 lndreadonly
|
|
sudo /usr/sbin/groupadd --force --gid 9703 lndinvoices
|
|
sudo /usr/sbin/groupadd --force --gid 9704 lndchainnotifier
|
|
sudo /usr/sbin/groupadd --force --gid 9705 lndsigner
|
|
sudo /usr/sbin/groupadd --force --gid 9706 lndwalletkit
|
|
sudo /usr/sbin/groupadd --force --gid 9707 lndrouter
|
|
|
|
echo ""
|
|
echo "*** Python DEFAULT libs & dependencies ***"
|
|
|
|
# for setup shell scripts
|
|
sudo apt -y install dialog bc python3-dialog
|
|
|
|
# libs (for global python scripts)
|
|
sudo -H python3 -m pip install grpcio==1.36.1
|
|
sudo -H python3 -m pip install googleapis-common-protos==1.53.0
|
|
sudo -H python3 -m pip install toml==0.10.1
|
|
sudo -H python3 -m pip install j2cli==0.3.10
|
|
sudo -H python3 -m pip install requests[socks]==2.21.0
|
|
|
|
echo ""
|
|
echo "*** SHELL SCRIPTS AND ASSETS ***"
|
|
|
|
# copy raspiblitz repo from github
|
|
cd /home/admin/
|
|
sudo -u admin git config --global user.name "${githubUser}"
|
|
sudo -u admin git config --global user.email "johndoe@example.com"
|
|
sudo -u admin rm -rf /home/admin/raspiblitz
|
|
sudo -u admin git clone -b ${githubBranch} https://github.com/${githubUser}/raspiblitz.git
|
|
sudo -u admin cp -r /home/admin/raspiblitz/home.admin/*.* /home/admin
|
|
sudo -u admin cp -r /home/admin/raspiblitz/home.admin/.tmux.conf /home/admin
|
|
sudo -u admin chmod +x *.sh
|
|
sudo -u admin cp -r /home/admin/raspiblitz/home.admin/assets /home/admin/
|
|
sudo -u admin cp -r /home/admin/raspiblitz/home.admin/config.scripts /home/admin/
|
|
sudo -u admin chmod +x /home/admin/config.scripts/*.sh
|
|
|
|
# install newest version of BlitzPy
|
|
blitzpy_wheel=$(ls -trR /home/admin/raspiblitz/home.admin/BlitzPy/dist | grep -E "*any.whl" | tail -n 1)
|
|
blitzpy_version=$(echo ${blitzpy_wheel} | grep -oE "([0-9]\.[0-9]\.[0-9])")
|
|
echo ""
|
|
echo "*** INSTALLING BlitzPy Version: ${blitzpy_version} ***"
|
|
sudo -H /usr/bin/python -m pip install "/home/admin/raspiblitz/home.admin/BlitzPy/dist/${blitzpy_wheel}" >/dev/null 2>&1
|
|
|
|
# make sure lndlibs are patched for compatibility for both Python2 and Python3
|
|
if ! grep -Fxq "from __future__ import absolute_import" /home/admin/config.scripts/lndlibs/rpc_pb2_grpc.py; then
|
|
sed -i -E '1 a from __future__ import absolute_import' /home/admin/config.scripts/lndlibs/rpc_pb2_grpc.py
|
|
fi
|
|
if ! grep -Eq "^from . import.*" /home/admin/config.scripts/lndlibs/rpc_pb2_grpc.py; then
|
|
sed -i -E 's/^(import.*_pb2)/from . \1/' /home/admin/config.scripts/lndlibs/rpc_pb2_grpc.py
|
|
fi
|
|
|
|
# add /sbin to path for all
|
|
sudo bash -c "echo 'PATH=\$PATH:/sbin' >> /etc/profile"
|
|
|
|
echo ""
|
|
echo "*** RASPIBLITZ EXTRAS ***"
|
|
|
|
# for background processes
|
|
sudo apt -y install screen
|
|
|
|
# for multiple (detachable/background) sessions when using SSH
|
|
# https://github.com/rootzoll/raspiblitz/issues/990
|
|
sudo apt -y install tmux
|
|
|
|
# optimization for torrent download
|
|
sudo bash -c "echo 'net.core.rmem_max = 4194304' >> /etc/sysctl.conf"
|
|
sudo bash -c "echo 'net.core.wmem_max = 1048576' >> /etc/sysctl.conf"
|
|
|
|
# install a command-line fuzzy finder (https://github.com/junegunn/fzf)
|
|
sudo apt -y install fzf
|
|
|
|
sudo bash -c "echo '' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo '# https://github.com/rootzoll/raspiblitz/issues/1784' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo 'NG_CLI_ANALYTICS=ci' >> /home/admin/.bashrc"
|
|
|
|
homeFile=/home/admin/.bashrc
|
|
keyBindings="source /usr/share/doc/fzf/examples/key-bindings.bash"
|
|
keyBindingsDone=$(grep -c "$keyBindings" $homeFile)
|
|
|
|
if [ ${keyBindingsDone} -eq 0 ]; then
|
|
sudo bash -c "echo 'source /usr/share/doc/fzf/examples/key-bindings.bash' >> /home/admin/.bashrc"
|
|
echo "key-bindings added to $homeFile"
|
|
else
|
|
echo "key-bindings already in $homeFile"
|
|
fi
|
|
|
|
homeFile=/home/admin/.bashrc
|
|
autostart="automatically start main menu"
|
|
autostartDone=$(grep -c "$autostart" $homeFile)
|
|
|
|
if [ ${autostartDone} -eq 0 ]; then
|
|
# bash autostart for admin
|
|
sudo bash -c "echo '# shortcut commands' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo 'source /home/admin/_commands.sh' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo '# automatically start main menu for admin unless' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo '# when running in a tmux session' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo 'if [ -z \"\$TMUX\" ]; then' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo ' ./00raspiblitz.sh' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo 'fi' >> /home/admin/.bashrc"
|
|
echo "autostart added to $homeFile"
|
|
else
|
|
echo "autostart already in $homeFile"
|
|
fi
|
|
|
|
sudo bash -c "echo '' >> /home/admin/.bashrc"
|
|
sudo bash -c "echo '# Raspiblitz' >> /home/admin/.bashrc"
|
|
|
|
echo ""
|
|
echo "*** SWAP FILE ***"
|
|
# based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#moving-the-swap-file
|
|
# but just deactivating and deleting old (will be created alter when user adds HDD)
|
|
|
|
sudo dphys-swapfile swapoff
|
|
sudo dphys-swapfile uninstall
|
|
|
|
echo ""
|
|
echo "*** INCREASE OPEN FILE LIMIT ***"
|
|
# based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_20_pi.md#increase-your-open-files-limit
|
|
|
|
sudo sed --in-place -i "56s/.*/* soft nofile 128000/" /etc/security/limits.conf
|
|
sudo bash -c "echo '* hard nofile 128000' >> /etc/security/limits.conf"
|
|
sudo bash -c "echo 'root soft nofile 128000' >> /etc/security/limits.conf"
|
|
sudo bash -c "echo 'root hard nofile 128000' >> /etc/security/limits.conf"
|
|
sudo bash -c "echo '# End of file' >> /etc/security/limits.conf"
|
|
|
|
sudo sed --in-place -i "23s/.*/session required pam_limits.so/" /etc/pam.d/common-session
|
|
|
|
sudo sed --in-place -i "25s/.*/session required pam_limits.so/" /etc/pam.d/common-session-noninteractive
|
|
sudo bash -c "echo '# end of pam-auth-update config' >> /etc/pam.d/common-session-noninteractive"
|
|
|
|
|
|
# *** fail2ban ***
|
|
# based on https://stadicus.github.io/RaspiBolt/raspibolt_21_security.html
|
|
echo "*** HARDENING ***"
|
|
sudo apt install -y --no-install-recommends python3-systemd fail2ban
|
|
|
|
# *** CACHE DISK IN RAM ***
|
|
echo "Activating CACHE RAM DISK ... "
|
|
sudo /home/admin/config.scripts/blitz.cache.sh on
|
|
|
|
# *** Wifi, Bluetooth & other configs ***
|
|
if [ "${baseimage}" = "raspbian" ]||[ "${baseimage}" = "raspios_arm64" ]||\
|
|
[ "${baseimage}" = "debian_rpi64" ]; then
|
|
|
|
if [ "${modeWifi}" == "false" ]; then
|
|
echo ""
|
|
echo "*** DISABLE WIFI ***"
|
|
sudo systemctl disable wpa_supplicant.service
|
|
sudo ifconfig wlan0 down
|
|
fi
|
|
|
|
echo ""
|
|
echo "*** DISABLE BLUETOOTH ***"
|
|
|
|
configFile="/boot/config.txt"
|
|
disableBT="dtoverlay=disable-bt"
|
|
disableBTDone=$(grep -c "$disableBT" $configFile)
|
|
|
|
if [ ${disableBTDone} -eq 0 ]; then
|
|
# disable bluetooth module
|
|
sudo echo "" >> $configFile
|
|
sudo echo "# Raspiblitz" >> $configFile
|
|
echo 'dtoverlay=pi3-disable-bt' | sudo tee -a $configFile
|
|
echo 'dtoverlay=disable-bt' | sudo tee -a $configFile
|
|
else
|
|
echo "disable BT already in $configFile"
|
|
fi
|
|
|
|
# remove bluetooth services
|
|
sudo systemctl disable bluetooth.service
|
|
sudo systemctl disable hciuart.service
|
|
|
|
# remove bluetooth packages
|
|
sudo apt remove -y --purge pi-bluetooth bluez bluez-firmware
|
|
echo
|
|
|
|
# disable audio
|
|
echo "*** DISABLE AUDIO (snd_bcm2835) ***"
|
|
sudo sed -i "s/^dtparam=audio=on/# dtparam=audio=on/g" /boot/config.txt
|
|
echo
|
|
|
|
# disable DRM VC4 V3D
|
|
echo "*** DISABLE DRM VC4 V3D driver ***"
|
|
dtoverlay=vc4-fkms-v3d
|
|
sudo sed -i "s/^dtoverlay=vc4-fkms-v3d/# dtoverlay=vc4-fkms-v3d/g" /boot/config.txt
|
|
echo
|
|
|
|
# I2C fix (make sure dtparam=i2c_arm is not on)
|
|
# see: https://github.com/rootzoll/raspiblitz/issues/1058#issuecomment-739517713
|
|
sudo sed -i "s/^dtparam=i2c_arm=.*//g" /boot/config.txt
|
|
fi
|
|
|
|
# *** FATPACK *** (can be activated by parameter - see details at start of script)
|
|
if [ "${fatpack}" == "true" ]; then
|
|
echo "*** FATPACK ***"
|
|
echo "* Adding nodeJS Framework ..."
|
|
sudo /home/admin/config.scripts/bonus.nodejs.sh on
|
|
if [ "$?" != "0" ]; then
|
|
echo "FATPACK FAILED"
|
|
exit 1
|
|
fi
|
|
echo "* Optional Packages (may be needed for extended features)"
|
|
sudo apt-get install -y qrencode
|
|
sudo apt-get install -y btrfs-tools
|
|
sudo apt-get install -y secure-delete
|
|
sudo apt-get install -y fbi
|
|
sudo apt-get install -y ssmtp
|
|
sudo apt-get install -y unclutter xterm python3-pyqt5
|
|
sudo apt-get install -y xfonts-terminus
|
|
sudo apt-get install -y nginx apache2-utils
|
|
sudo apt-get install -y nginx
|
|
sudo apt-get install -y python3-jinja2
|
|
sudo apt-get install -y socat
|
|
sudo apt-get install -y libatlas-base-dev
|
|
sudo apt-get install -y mariadb-server mariadb-client
|
|
sudo apt-get install -y hexyl
|
|
sudo apt-get install -y autossh
|
|
|
|
# *** UPDATE FALLBACK NODE LIST (only as part of fatpack) *** see https://github.com/rootzoll/raspiblitz/issues/1888
|
|
echo "*** FALLBACK NODE LIST ***"
|
|
sudo -u admin curl -H "Accept: application/json; indent=4" https://bitnodes.io/api/v1/snapshots/latest/ -o /home/admin/fallback.nodes
|
|
byteSizeList=$(sudo -u admin stat -c %s /home/admin/fallback.nodes)
|
|
if [ ${#byteSizeList} -eq 0 ] || [ ${byteSizeList} -lt 10240 ]; then
|
|
echo "WARN: Failed downloading fresh FALLBACK NODE LIST --> https://bitnodes.io/api/v1/snapshots/latest/"
|
|
sudo rm /home/admin/fallback.nodes 2>/dev/null
|
|
sudo cp /home/admin/assets/fallback.nodes /home/admin/fallback.nodes
|
|
fi
|
|
sudo chown admin:admin /home/admin/fallback.nodes
|
|
|
|
else
|
|
echo "* skipping FATPACK"
|
|
fi
|
|
|
|
# *** BOOTSTRAP ***
|
|
echo ""
|
|
echo "*** RASPI BOOTSTRAP SERVICE ***"
|
|
sudo chmod +x /home/admin/_bootstrap.sh
|
|
sudo cp /home/admin/assets/bootstrap.service /etc/systemd/system/bootstrap.service
|
|
sudo systemctl enable bootstrap
|
|
|
|
# *** BACKGROUND ***
|
|
echo ""
|
|
echo "*** RASPI BACKGROUND SERVICE ***"
|
|
sudo chmod +x /home/admin/_background.sh
|
|
sudo cp /home/admin/assets/background.service /etc/systemd/system/background.service
|
|
sudo systemctl enable background
|
|
|
|
# "*** BITCOIN ***"
|
|
# based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_30_bitcoin.md#installation
|
|
|
|
echo ""
|
|
echo "*** PREPARING BITCOIN ***"
|
|
|
|
# set version (change if update is available)
|
|
# https://bitcoincore.org/en/download/
|
|
bitcoinVersion="0.21.0"
|
|
|
|
# needed to check code signing
|
|
laanwjPGP="01EA5486DE18A882D4C2684590C8019E36C2E964"
|
|
|
|
# prepare directories
|
|
sudo rm -rf /home/admin/download
|
|
sudo -u admin mkdir /home/admin/download
|
|
cd /home/admin/download
|
|
|
|
# download, check and import signer key
|
|
sudo -u admin wget https://bitcoin.org/laanwj-releases.asc
|
|
if [ ! -f "./laanwj-releases.asc" ]
|
|
then
|
|
echo "!!! FAIL !!! Download laanwj-releases.asc not success."
|
|
exit 1
|
|
fi
|
|
gpg --import --import-options show-only ./laanwj-releases.asc
|
|
fingerprint=$(gpg ./laanwj-releases.asc 2>/dev/null | grep "${laanwjPGP}" -c)
|
|
if [ ${fingerprint} -lt 1 ]; then
|
|
echo ""
|
|
echo "!!! BUILD WARNING --> Bitcoin PGP author not as expected"
|
|
echo "Should contain laanwjPGP: ${laanwjPGP}"
|
|
echo "PRESS ENTER to TAKE THE RISK if you think all is OK"
|
|
read key
|
|
fi
|
|
gpg --import ./laanwj-releases.asc
|
|
|
|
# download signed binary sha256 hash sum file and check
|
|
sudo -u admin wget https://bitcoin.org/bin/bitcoin-core-${bitcoinVersion}/SHA256SUMS.asc
|
|
verifyResult=$(gpg --verify SHA256SUMS.asc 2>&1)
|
|
goodSignature=$(echo ${verifyResult} | grep 'Good signature' -c)
|
|
echo "goodSignature(${goodSignature})"
|
|
correctKey=$(echo ${verifyResult} | grep "using RSA key ${laanwjPGP: -16}" -c)
|
|
echo "correctKey(${correctKey})"
|
|
if [ ${correctKey} -lt 1 ] || [ ${goodSignature} -lt 1 ]; then
|
|
echo ""
|
|
echo "!!! BUILD FAILED --> PGP Verify not OK / signature(${goodSignature}) verify(${correctKey})"
|
|
exit 1
|
|
else
|
|
echo ""
|
|
echo "****************************************"
|
|
echo "OK --> BITCOIN MANIFEST IS CORRECT"
|
|
echo "****************************************"
|
|
echo ""
|
|
fi
|
|
|
|
# get the sha256 value for the corresponding platform from signed hash sum file
|
|
if [ ${isARM} -eq 1 ] ; then
|
|
bitcoinOSversion="arm-linux-gnueabihf"
|
|
fi
|
|
if [ ${isAARCH64} -eq 1 ] ; then
|
|
bitcoinOSversion="aarch64-linux-gnu"
|
|
fi
|
|
if [ ${isX86_64} -eq 1 ] ; then
|
|
bitcoinOSversion="x86_64-linux-gnu"
|
|
fi
|
|
bitcoinSHA256=$(grep -i "$bitcoinOSversion" SHA256SUMS.asc | cut -d " " -f1)
|
|
|
|
echo ""
|
|
echo "*** BITCOIN v${bitcoinVersion} for ${bitcoinOSversion} ***"
|
|
|
|
# download resources
|
|
binaryName="bitcoin-${bitcoinVersion}-${bitcoinOSversion}.tar.gz"
|
|
if [ ! -f "./${binaryName}" ]; then
|
|
sudo -u admin wget https://bitcoin.org/bin/bitcoin-core-${bitcoinVersion}/${binaryName}
|
|
fi
|
|
if [ ! -f "./${binaryName}" ]; then
|
|
echo "!!! FAIL !!! Download BITCOIN BINARY not success."
|
|
exit 1
|
|
else
|
|
# check binary checksum test
|
|
echo "- checksum test"
|
|
binaryChecksum=$(sha256sum ${binaryName} | cut -d " " -f1)
|
|
echo "Valid SHA256 checksum should be: ${bitcoinSHA256}"
|
|
echo "Downloaded binary SHA256 checksum: ${binaryChecksum}"
|
|
if [ "${binaryChecksum}" != "${bitcoinSHA256}" ]; then
|
|
echo "!!! FAIL !!! Downloaded BITCOIN BINARY not matching SHA256 checksum: ${bitcoinSHA256}"
|
|
rm -v ./${binaryName}
|
|
exit 1
|
|
else
|
|
echo ""
|
|
echo "****************************************"
|
|
echo "OK --> VERIFIED BITCOIN CHECKSUM CORRECT"
|
|
echo "****************************************"
|
|
sleep 10
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
# install
|
|
sudo -u admin tar -xvf ${binaryName}
|
|
sudo install -m 0755 -o root -g root -t /usr/local/bin/ bitcoin-${bitcoinVersion}/bin/*
|
|
sleep 3
|
|
installed=$(sudo -u admin bitcoind --version | grep "${bitcoinVersion}" -c)
|
|
if [ ${installed} -lt 1 ]; then
|
|
echo ""
|
|
echo "!!! BUILD FAILED --> Was not able to install bitcoind version(${bitcoinVersion})"
|
|
exit 1
|
|
fi
|
|
echo "- Bitcoin install OK"
|
|
|
|
echo ""
|
|
echo "*** PREPARING LIGHTNING ***"
|
|
|
|
# "*** LND ***"
|
|
## based on https://github.com/Stadicus/guides/blob/master/raspibolt/raspibolt_40_lnd.md#lightning-lnd
|
|
## see LND releases: https://github.com/lightningnetwork/lnd/releases
|
|
lndVersion="0.12.1-beta"
|
|
|
|
# olaoluwa
|
|
#PGPauthor="roasbeef"
|
|
#PGPpkeys="https://keybase.io/roasbeef/pgp_keys.asc"
|
|
#PGPcheck="9769140D255C759B1EB77B46A96387A57CAAE94D"
|
|
# bitconner
|
|
PGPauthor="bitconner"
|
|
PGPpkeys="https://keybase.io/bitconner/pgp_keys.asc"
|
|
PGPcheck="9C8D61868A7C492003B2744EE7D737B67FA592C7"
|
|
# Joost Jager
|
|
#PGPauthor="joostjager"
|
|
#PGPpkeys="https://keybase.io/joostjager/pgp_keys.asc"
|
|
#PGPcheck="D146D0F68939436268FA9A130E26BB61B76C4D3A"
|
|
|
|
# get LND resources
|
|
cd /home/admin/download
|
|
|
|
# download lnd binary checksum manifest
|
|
sudo -u admin wget -N https://github.com/lightningnetwork/lnd/releases/download/v${lndVersion}/manifest-v${lndVersion}.txt
|
|
|
|
# check if checksums are signed by lnd dev team
|
|
sudo -u admin wget -N https://github.com/lightningnetwork/lnd/releases/download/v${lndVersion}/manifest-${PGPauthor}-v${lndVersion}.sig
|
|
sudo -u admin wget --no-check-certificate -N -O "pgp_keys.asc" ${PGPpkeys}
|
|
gpg --import --import-options show-only ./pgp_keys.asc
|
|
fingerprint=$(sudo gpg "pgp_keys.asc" 2>/dev/null | grep "${PGPcheck}" -c)
|
|
if [ ${fingerprint} -lt 1 ]; then
|
|
echo ""
|
|
echo "!!! BUILD WARNING --> LND PGP author not as expected"
|
|
echo "Should contain PGP: ${PGPcheck}"
|
|
echo "PRESS ENTER to TAKE THE RISK if you think all is OK"
|
|
read key
|
|
fi
|
|
gpg --import ./pgp_keys.asc
|
|
sleep 3
|
|
verifyResult=$(gpg --verify manifest-${PGPauthor}-v${lndVersion}.sig manifest-v${lndVersion}.txt 2>&1)
|
|
goodSignature=$(echo ${verifyResult} | grep 'Good signature' -c)
|
|
echo "goodSignature(${goodSignature})"
|
|
correctKey=$(echo ${verifyResult} | tr -d " \t\n\r" | grep "${PGPcheck}" -c)
|
|
echo "correctKey(${correctKey})"
|
|
if [ ${correctKey} -lt 1 ] || [ ${goodSignature} -lt 1 ]; then
|
|
echo ""
|
|
echo "!!! BUILD FAILED --> LND PGP Verify not OK / signature(${goodSignature}) verify(${correctKey})"
|
|
exit 1
|
|
else
|
|
echo ""
|
|
echo "****************************************"
|
|
echo "OK --> SIGNATURE LND MANIFEST IS CORRECT"
|
|
echo "****************************************"
|
|
echo ""
|
|
fi
|
|
|
|
# get the lndSHA256 for the corresponding platform from manifest file
|
|
if [ ${isARM} -eq 1 ] ; then
|
|
lndOSversion="armv7"
|
|
lndSHA256=$(grep -i "linux-$lndOSversion" manifest-v$lndVersion.txt | cut -d " " -f1)
|
|
fi
|
|
if [ ${isAARCH64} -eq 1 ] ; then
|
|
lndOSversion="arm64"
|
|
lndSHA256=$(grep -i "linux-$lndOSversion" manifest-v$lndVersion.txt | cut -d " " -f1)
|
|
fi
|
|
if [ ${isX86_64} -eq 1 ] ; then
|
|
lndOSversion="amd64"
|
|
lndSHA256=$(grep -i "linux-$lndOSversion" manifest-v$lndVersion.txt | cut -d " " -f1)
|
|
fi
|
|
|
|
echo ""
|
|
echo "*** LND v${lndVersion} for ${lndOSversion} ***"
|
|
echo "SHA256 hash: $lndSHA256"
|
|
echo ""
|
|
|
|
# get LND binary
|
|
binaryName="lnd-linux-${lndOSversion}-v${lndVersion}.tar.gz"
|
|
if [ ! -f "./${binaryName}" ]; then
|
|
lndDownloadUrl="https://github.com/lightningnetwork/lnd/releases/download/v${lndVersion}/${binaryName}"
|
|
echo "- downloading lnd binary --> ${lndDownloadUrl}"
|
|
sudo -u admin wget ${lndDownloadUrl}
|
|
echo "- download done"
|
|
else
|
|
echo "- using existing lnd binary"
|
|
fi
|
|
|
|
# check binary was not manipulated (checksum test)
|
|
echo "- checksum test"
|
|
binaryChecksum=$(sha256sum ${binaryName} | cut -d " " -f1)
|
|
echo "Valid SHA256 checksum(s) should be: ${lndSHA256}"
|
|
echo "Downloaded binary SHA256 checksum: ${binaryChecksum}"
|
|
checksumCorrect=$(echo "${lndSHA256}" | grep -c "${binaryChecksum}")
|
|
if [ "${checksumCorrect}" != "1" ]; then
|
|
echo "!!! FAIL !!! Downloaded LND BINARY not matching SHA256 checksum in manifest: ${lndSHA256}"
|
|
rm -v ./${binaryName}
|
|
exit 1
|
|
else
|
|
echo ""
|
|
echo "****************************************"
|
|
echo "OK --> VERIFIED LND CHECKSUM IS CORRECT"
|
|
echo "****************************************"
|
|
echo ""
|
|
sleep 10
|
|
fi
|
|
|
|
# install
|
|
echo "- install LND binary"
|
|
sudo -u admin tar -xzf ${binaryName}
|
|
sudo install -m 0755 -o root -g root -t /usr/local/bin lnd-linux-${lndOSversion}-v${lndVersion}/*
|
|
sleep 3
|
|
installed=$(sudo -u admin lnd --version)
|
|
if [ ${#installed} -eq 0 ]; then
|
|
echo ""
|
|
echo "!!! BUILD FAILED --> Was not able to install LND"
|
|
exit 1
|
|
fi
|
|
|
|
correctVersion=$(sudo -u admin lnd --version | grep -c "${lndVersion}")
|
|
if [ ${correctVersion} -eq 0 ]; then
|
|
echo ""
|
|
echo "!!! BUILD FAILED --> installed LND is not version ${lndVersion}"
|
|
sudo -u admin lnd --version
|
|
exit 1
|
|
fi
|
|
sudo chown -R admin /home/admin
|
|
echo "- OK install of LND done"
|
|
|
|
echo ""
|
|
echo "*** raspiblitz.info ***"
|
|
sudo cat /home/admin/raspiblitz.info
|
|
|
|
# *** RASPIBLITZ IMAGE READY INFO ***
|
|
echo ""
|
|
echo "**********************************************"
|
|
echo "BASIC SD CARD BUILD DONE"
|
|
echo "**********************************************"
|
|
echo ""
|
|
echo "Your SD Card Image for RaspiBlitz is ready (might still do display config)."
|
|
echo "Take the chance & look thru the output above if you can spot any errors or warnings."
|
|
echo ""
|
|
echo "IMPORTANT IF WANT TO MAKE A RELEASE IMAGE FROM THIS BUILD:"
|
|
echo "1. login fresh --> user:admin password:raspiblitz"
|
|
echo "2. run --> release"
|
|
echo ""
|
|
|
|
# (do last - because might trigger reboot)
|
|
if [ "${displayClass}" != "headless" ] || [ "${baseimage}" = "raspbian" ] || [ "${baseimage}" = "raspios_arm64" ]; then
|
|
echo "*** ADDITIONAL DISPLAY OPTIONS ***"
|
|
echo "- calling: blitz.display.sh set-display ${displayClass}"
|
|
sudo /home/admin/config.scripts/blitz.display.sh set-display ${displayClass}
|
|
fi |