raspiblitz/home.admin/config.scripts/blitz.passwords.sh
/rootzoll 9d23c63c38
#3313 & #3230 lndg final (#3506)
* Integrate LNDg to Raspiblitz (#3313)

* cl.hsmtool: fix password display

* add clearnet fallback for tor keys

* fix CLN wallet reset (#3296)

* cln: unify and improve the resetWallet function
previously the old config and channel database could have been left
behind when using SEEDRESTORE and FILERESTORE
* prompt to save the wallet password for backup

* change default branch to v1.8 (#3306)

* Adds install script for LNDg (https://github.com/cryptosharks131/lndg)

Install script creates user lndg and installs LNDg in /home/lndg/lndg,
uses systemd for the backend, and uses nginx and uwsgi for the gui.

Install script will check for tor and enable tor
if "run behind tor" is on.

Updates menu settings for easy access to the script settings

* Creates bonus.lndg.sh script for installing LNDg
Adds LNDg to list of apps in "SERVICES"
Adds LNDg to UPDATES when installed
Adds LNDg to menu when installed

Fixed typos/errors, tested and works!

* LNDg menu install. Added ssl, ssl over tor, and standardized nginx files. Tests Good.

* FAQ.cln: poncho, CLN cheatsheet, extract privkey

* #3286 fix loca IP

* fix #3312

* fix lnbits update options (#3307)

* Integrates LNDg to Raspiblitz
Fixes issues with python and python3 (see comments on PR).
Adds option to keep or delete database on both uninstall and install with existing database.

Fixes issues with python and python3 (see comments on PR).
Adds option to keep or delete database on both uninstall and install with existing database.

Update 00settingsMenuServices.sh

Update info menu for LNDg

Adds username and instructions on how to change username

* Update bonus.lndg.sh

* Install LNDg script
Forces yes on install question

* Update blitz.shutdown.sh

* Update bonus.lndg.sh

* Update bonus.lndg.sh

* Update bonus.lndg.sh

* Update bonus.lndg.sh

Co-authored-by: openoms <oms@tuta.io>
Co-authored-by: openoms <43343391+openoms@users.noreply.github.com>
Co-authored-by: Dipun Mistry <dipunm@gmail.com>
Co-authored-by: rootzoll <christian@geektank.de>

* added documentation

* #3230 change password B

* #3230 fix to version 1.4.0

Co-authored-by: allyourbankarebelongtous <100060902+allyourbankarebelongtous@users.noreply.github.com>
Co-authored-by: openoms <oms@tuta.io>
Co-authored-by: openoms <43343391+openoms@users.noreply.github.com>
Co-authored-by: Dipun Mistry <dipunm@gmail.com>
2022-12-09 21:49:44 +01:00

594 lines
20 KiB
Bash
Executable file

#!/bin/bash
# command info
if [ "$1" == "" ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
echo "small config script to set a passwords A,B,C & D"
echo "blitz.passwords.sh set a [?newpassword] "
echo "blitz.passwords.sh set b [?newpassword] "
echo "blitz.passwords.sh set c [?oldpassword] [?newpassword] " # will change lnd & core lightning if installed
echo "blitz.passwords.sh check [a|b|c] [passwordToCheck]"
echo "or just as a password enter dialog (result as file)"
echo "blitz.passworda.sh set [x] [text] [result-file] [?empty-allowed]"
exit 1
fi
# prepare hased password storage
hashedPasswordSalt=""
hashedPasswordStoragePath="/mnt/hdd/app-data/passwords"
if [ $(df | grep -c "/mnt/hdd") -gt 0 ]; then
# check if path & salt file exists
if [ $(sudo ls ${hashedPasswordStoragePath}/salt.txt | grep -c "salt.txt") -eq 0 ]; then
echo "# creating salt & hashedPasswordStoragePath ..."
mkdir -p ${hashedPasswordStoragePath}
echo "$RANDOM-$(date +%N)" | shasum -a 512 | cut -d " " -f1 | cut -c 1-16 > ${hashedPasswordStoragePath}/salt.txt
chmod 660 ${hashedPasswordStoragePath}/salt.txt
chown -R admin:admin ${hashedPasswordStoragePath}
else
echo "# salt file exists"
fi
hashedPasswordSalt=$(sudo cat ${hashedPasswordStoragePath}/salt.txt)
echo "# hashedPasswordSalt(${hashedPasswordSalt})"
else
echo "# hashedPasswordSalt - not available yet (no HDD yet)"
fi
############################
# CHECKING PASSWORDS
############################
if [ "$1" == "check" ]; then
# brute force protection (just effective to oustide callers)
# if there was another try within last minute add another 3 seconds delay protection
source <(/home/admin/_cache.sh meta system_password_bruteforceprotection)
/home/admin/_cache.sh set system_password_bruteforceprotection on 60
if [ "${value}" == "on" ] && [ "${stillvalid}" == "1" ]; then
echo "# multiple tries within last minute - respond slow"
sleep 5 # advanced brute force protection
else
echo "# first try within last minute - respond fast"
sleep 1 # basic brute force protection
fi
typeOfPassword=$2
if [ "${typeOfPassword}" != "a" ] && [ "${typeOfPassword}" != "b" ] && [ "${typeOfPassword}" != "c" ]; then
echo "error='unknown password to check'"
echo "correct=0"
exit 1
fi
passwordToCheck=$3
clearedPassword=$(echo "${passwordToCheck}" | tr -dc '[:alnum:]-.' | tr -d ' ')
if [ ${#clearedPassword} -lt ${#passwordToCheck} ]; then
echo "error='password to check contains unvalid chars'"
echo "correct=0"
exit 1
fi
passwordHashSystem=$(sudo cat ${hashedPasswordStoragePath}/${typeOfPassword}.hash 2>/dev/null)
passwordHashTest=$(mkpasswd -m sha-512 "${passwordToCheck}" -S "${hashedPasswordSalt:0:16}")
#echo "# passwordToCheck(${passwordToCheck})"
#echo "# passwordHashSystem(${passwordHashSystem})"
#echo "# hashedPasswordSalt(${hashedPasswordSalt})"
#echo "# passwordHashTest(${passwordHashTest})"
if [ ${#passwordHashSystem} -eq 0 ]; then
echo "error='password cannot be checked - no hash available'"
echo "correct=0"
exit 1
fi
if [ "${passwordHashSystem}" == "${passwordHashTest}" ]; then
echo "correct=1"
else
echo "correct=0"
fi
exit
fi
############################
# SETTING PASSWORDS
############################
# check if started with sudo
echo "runningUser='$EUID'"
if [ "$EUID" -ne 0 ]; then
echo "error='need user root'"
exit 1
fi
if [ "$1" != "set" ]; then
echo "error='unkown parameter'"
exit 1
fi
# load raspiblitz config (if available)
source /home/admin/raspiblitz.info
source /mnt/hdd/raspiblitz.conf
if [ ${#network} -eq 0 ]; then
network="bitcoin"
fi
if [ ${#chain} -eq 0 ]; then
chain="main"
fi
# 1. parameter [?a|b|c]
abcd=$2
# run interactive if no further parameters
reboot=0;
OPTIONS=()
if [ ${#abcd} -eq 0 ]; then
reboot=1;
emptyAllowed=1
OPTIONS+=(A "Master Login Password")
OPTIONS+=(B "RPC/App Password")
if [ "${lightning}" == "lnd" ] || [ "${lnd}" == "on" ]; then
OPTIONS+=(C "LND Lightning Wallet Password")
fi
if [ "${cl}" == "on" ] && [ "${clEncryptedHSM}" == "on" ]; then
OPTIONS+=(CL "Core Lightning Wallet Password")
fi
CHOICE=$(dialog --clear \
--backtitle "RaspiBlitz" \
--title "Set Password" \
--menu "Which password to change?" \
11 50 7 \
"${OPTIONS[@]}" \
2>&1 >/dev/tty)
clear
case $CHOICE in
A)
abcd='a';
;;
B)
abcd='b';
;;
C)
abcd='c';
;;
D)
abcd='d';
;;
CL)
abcd='cl';
;;
*)
exit 0
;;
esac
fi
############################
# PASSWORD A
if [ "${abcd}" = "a" ]; then
if [ "${hashedPasswordSalt}" == "" ]; then
echo "error='hdd not mounted yet - cannot set/check blitz passwords yet'"
echo "correct=0"
exit 1
fi
newPassword=$3
# if no password given by parameter - ask by dialog
if [ ${#newPassword} -eq 0 ]; then
clear
# ask user for new password A (first time)
password1=$(whiptail --passwordbox "\nSet new Admin/SSH Password A:\n(min 8chars, 1word, chars+number, no specials)" 10 52 "" --title "Password A" --backtitle "RaspiBlitz - Setup" 3>&1 1>&2 2>&3)
if [ $? -eq 1 ]; then
if [ ${emptyAllowed} -eq 0 ]; then
echo "# CANCEL not possible"
sleep 2
else
exit 0
fi
fi
# ask user for new password A (second time)
password2=$(whiptail --passwordbox "\nRe-Enter Password A:\n(This is new password to login per SSH)" 10 52 "" --title "Password A" --backtitle "RaspiBlitz - Setup" 3>&1 1>&2 2>&3)
if [ $? -eq 1 ]; then
if [ ${emptyAllowed} -eq 0 ]; then
echo "# CANCEL not possible"
sleep 2
else
exit 0
fi
fi
# check if passwords match
if [ "${password1}" != "${password2}" ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Passwords dont Match\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set a
exit 0
fi
# password zero
if [ ${#password1} -eq 0 ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Password cannot be empty\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set a
exit 0
fi
# check that password does not contain bad characters
clearedResult=$(echo "${password1}" | tr -dc '[:alnum:]-.' | tr -d ' ')
if [ ${#clearedResult} != ${#password1} ] || [ ${#clearedResult} -eq 0 ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Contains bad characters (spaces, special chars)\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set a
exit 0
fi
# password longer than 8
if [ ${#password1} -lt 8 ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Password length under 8\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set a
exit 0
fi
# use entered password now as parameter
newPassword="${password1}"
fi
# store password hash
mkpasswd -m sha-512 "${newPassword}" -S "${hashedPasswordSalt:0:16}" > ${hashedPasswordStoragePath}/a.hash
chown admin:admin ${hashedPasswordStoragePath}/a.hash
chmod 660 ${hashedPasswordStoragePath}/a.hash
# change user passwords and then change hostname
echo "pi:$newPassword" | sudo chpasswd
echo "root:$newPassword" | sudo chpasswd
echo "bitcoin:$newPassword" | sudo chpasswd
echo "admin:$newPassword" | sudo chpasswd
sleep 1
echo "# OK - password A changed for user pi, root, admin & bitcoin"
echo "error=''"
############################
# PASSWORD B
elif [ "${abcd}" = "b" ]; then
if [ "${hashedPasswordSalt}" == "" ]; then
echo "error='hdd not mounted yet - cannot set/check blitz passwords yet'"
echo "correct=0"
exit 1
fi
newPassword=$3
# if no password given by parameter - ask by dialog
if [ ${#newPassword} -eq 0 ]; then
clear
# ask user for new password B (first time)
password1=$(whiptail --passwordbox "\nPlease enter your new Password B:\n(min 8chars, 1word, chars+number, no specials)" 10 52 "" --title "Password B" --backtitle "RaspiBlitz - Setup" 3>&1 1>&2 2>&3)
if [ $? -eq 1 ]; then
if [ "${emptyAllowed}" == "0" ]; then
echo "# CANCEL not possible"
sleep 2
else
exit 0
fi
fi
# ask user for new password B (second time)
password2=$(whiptail --passwordbox "\nRe-Enter Password B:\n" 10 52 "" --title "Password B" --backtitle "RaspiBlitz - Setup" 3>&1 1>&2 2>&3)
if [ $? -eq 1 ]; then
if [ "${emptyAllowed}" == "0" ]; then
echo "# CANCEL not possible"
sleep 2
else
exit 0
fi
fi
# check if passwords match
if [ "${password1}" != "${password2}" ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Passwords dont Match\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set b
exit 0
fi
# password zero
if [ ${#password1} -eq 0 ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Password cannot be empty\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set b
exit 0
fi
# check that password does not contain bad characters
clearedResult=$(echo "${password1}" | tr -dc '[:alnum:]-.' | tr -d ' ')
if [ ${#clearedResult} != ${#password1} ] || [ ${#clearedResult} -eq 0 ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Contains bad characters (spaces, special chars)\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set b
exit 0
fi
# password longer than 8
if [ ${#password1} -lt 8 ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Password length under 8\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set b
exit 0
fi
# use entered password now as parameter
newPassword="${password1}"
fi
# store password hash
mkpasswd -m sha-512 "${newPassword}" -S "${hashedPasswordSalt:0:16}" > ${hashedPasswordStoragePath}/b.hash
chown admin:admin ${hashedPasswordStoragePath}/b.hash
chmod 660 ${hashedPasswordStoragePath}/b.hash
# change in assets (just in case this is used on setup)
sed -i "s/^rpcpassword=.*/rpcpassword=${newPassword}/g" /home/admin/assets/${network}.conf 2>/dev/null
# change in real configs
sed -i "s/^rpcpassword=.*/rpcpassword=${newPassword}/g" /mnt/hdd/${network}/${network}.conf 2>/dev/null
sed -i "s/^rpcpassword=.*/rpcpassword=${newPassword}/g" /home/admin/.${network}/${network}.conf 2>/dev/null
# NOTE: now other bonus apps configs that need passwordB need to be adapted manually
# bonus apps that use a "prestart" will adapt themselves on service restart after reboot
# blitzweb
if ! [ -f /etc/nginx/.htpasswd ]; then
echo "${newPassword}" | sudo htpasswd -ci /etc/nginx/.htpasswd admin
else
echo "${newPassword}" | sudo htpasswd -i /etc/nginx/.htpasswd admin
fi
# electrs
if [ "${ElectRS}" == "on" ]; then
echo "# changing the RPC password for ELECTRS"
RPC_USER=$(cat /mnt/hdd/bitcoin/bitcoin.conf | grep rpcuser | cut -c 9-)
sudo sed -i "s/^auth = \"$RPC_USER.*\"/auth = \"$RPC_USER:${newPassword}\"/g" /home/electrs/.electrs/config.toml
fi
# BTCPayServer
if [ "${BTCPayServer}" == "on" ]; then
echo "# changing the RPC password for BTCPAYSERVER"
sudo sed -i "s/^btc.rpc.password=.*/btc.rpc.password=${newPassword}/g" /home/btcpay/.nbxplorer/Main/settings.config
fi
# JoinMarket
if [ "${joinmarket}" == "on" ]; then
echo "# changing the RPC password for JOINMARKET"
sudo sed -i "s/^rpc_password =.*/rpc_password = ${newPassword}/g" /home/joinmarket/.joinmarket/joinmarket.cfg
echo "# changing the password for the 'joinmarket' user"
echo "joinmarket:${newPassword}" | sudo chpasswd
fi
# ThunderHub
if [ "${thunderhub}" == "on" ]; then
echo "# changing the password for ThunderHub"
sudo sed -i "s/^masterPassword:.*/masterPassword: '${newPassword}'/g" /mnt/hdd/app-data/thunderhub/thubConfig.yaml
fi
# LIT
if [ "${lit}" == "on" ]; then
echo "# changing the password for LIT"
sudo sed -i "s/^uipassword=.*/uipassword=${newPassword}/g" /mnt/hdd/app-data/.lit/lit.conf
sudo sed -i "s/^faraday.bitcoin.password=.*/faraday.bitcoin.password=${newPassword}/g" /mnt/hdd/app-data/.lit/lit.conf
fi
# i2pd
if [ "${i2pd}" == "on" ]; then
echo "# changing the password for i2pd"
sudo sed -i "s/^pass = .*/pass = ${newPassword}/g" /etc/i2pd/i2pd.conf
fi
# LNDg
if [ "${lndg}" == "on" ]; then
echo "# changing the password for lndg"
sudo -u lndg /home/lndg/lndg/.venv/bin/python initialize.py -pw ${newPassword}
fi
echo "# OK -> RPC Password B changed"
echo "# Reboot is needed (will be triggered if interactive menu was called)"
echo "error=''"
sleep 3
############################
# PASSWORD C
# will change both (lnd & core lightning) if installed
elif [ "${abcd}" = "c" ]; then
if [ "${hashedPasswordSalt}" == "" ]; then
echo "error='hdd not mounted yet - cannot set/check blitz passwords yet'"
echo "correct=0"
exit 1
fi
oldPassword=$3
newPassword=$4
if [ "${oldPassword}" == "" ]; then
# ask user for old password c
clear
oldPassword=$(whiptail --passwordbox "\nEnter old Password C:\n" 10 52 "" --title "Old Password C" --backtitle "RaspiBlitz - Passwords" 3>&1 1>&2 2>&3)
if [ $? -eq 1 ] || [ "${oldPassword}" == "" ]; then
# calling recursive repeat
sudo /home/admin/config.scripts/blitz.passwords.sh set c
fi
echo "# OK ... processing"
fi
if [ "${newPassword}" == "" ]; then
clear
# ask user for new password c
newPassword=$(whiptail --passwordbox "\nEnter new Password C:\n" 10 52 "" --title "New Password C" --backtitle "RaspiBlitz - Passwords" 3>&1 1>&2 2>&3)
if [ $? -eq 1 ] || [ "${newPassword}" == "" ]; then
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set c ${oldPassword}
exit 0
fi
# check new password does not contain bad characters
clearedResult=$(echo "${newPassword}" | tr -dc '[:alnum:]-.' | tr -d ' ')
if [ ${#clearedResult} != ${#newPassword} ] || [ ${#clearedResult} -eq 0 ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Contains bad characters (spaces, special chars)" 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.password.sh set c ${oldPassword}
exit 0
fi
# check new password longer than 8
if [ ${#newPassword} -lt 8 ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Password length under 8" 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.password.sh set c ${oldPassword}
exit 0
fi
# ask user to retype new password c
newPassword2=$(whiptail --passwordbox "\nEnter again new Password C:\n" 10 52 "" --title "New Password C (repeat)" --backtitle "RaspiBlitz - Passwords" 3>&1 1>&2 2>&3)
if [ $? -eq 1 ] || [ "${newPassword}" == "" ]; then
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set c ${oldPassword}
exit 0
fi
echo "# OK ... processing"
# check if passwords match
if [ "${newPassword}" != "${newPassword2}" ]; then
dialog --backtitle "RaspiBlitz - Setup" --msgbox "FAIL -> Passwords dont Match" 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set c ${oldPassword}
exit 0
fi
echo "# OK ... processing"
fi
# CHANGE LND WALLET PASSWORD
if [ "${lightning}" == "lnd" ] || [ "${lnd}" == "on" ]; then
echo "# CHANGE LND - PASSWORD C (only mainnet)"
echo "# Make sure Auto-Unlocks off"
sudo /home/admin/config.scripts/lnd.autounlock.sh off
echo "# LND needs to be restarted to lock wallet first .. (please wait)"
sudo systemctl restart lnd
sleep 2
err=""
if ! pip list | grep grpc; then
echo "# pip install grpc"
sudo -H python3 -m pip install grpcio==1.38.1 1>/dev/null 2>/dev/null
fi
source <(sudo /home/admin/config.scripts/lnd.initwallet.py change-password mainnet $oldPassword $newPassword)
if [ "${err}" != "" ]; then
echo "error='Was not able to change password'"
sleep 2
exit 0
fi
else
echo "# LND not installed/active"
fi
# CHANGE CORE LIGHTNING WALLET PASSWORD
if [ "${cl}" == "on" ] && [ "${clEncryptedHSM}" == "on" ]; then
echo "# CHANGE CORE LIGHTNING - PASSWORD C (only mainnet)"
sudo /home/admin/config.scripts/cl.hsmtool.sh change-password mainnet $oldPassword $newPassword
#TODO: test success
else
echo "# CORE LIGHTNING not installed/active/encrypted"
fi
# store password hash
mkpasswd -m sha-512 "${newPassword}" -S "${hashedPasswordSalt:0:16}" > ${hashedPasswordStoragePath}/c.hash
chown admin:admin ${hashedPasswordStoragePath}/c.hash
chmod 660 ${hashedPasswordStoragePath}/c.hash
# final user output
echo ""
echo "#OK"
echo "error=''"
############################
# PASSWORD X
elif [ "${abcd}" = "x" ]; then
emptyAllowed=0
if [ "$5" == "empty-allowed" ]; then
emptyAllowed=1
fi
# second parameter is the flexible text
text=$3
resultFile=$4
shred -u "$4" 2>/dev/null
# ask user for new password (first time)
password1=$(whiptail --passwordbox "\n${text}:\n(min 8chars, 1word, chars+number, no specials)" 10 52 "" --backtitle "RaspiBlitz" 3>&1 1>&2 2>&3)
# ask user for new password A (second time)
password2=""
if [ ${#password1} -gt 0 ]; then
password2=$(whiptail --passwordbox "\nRe-Enter the Password:\n(to test if typed in correctly)" 10 52 "" --backtitle "RaspiBlitz" 3>&1 1>&2 2>&3)
fi
# check if passwords match
if [ "${password1}" != "${password2}" ]; then
dialog --backtitle "RaspiBlitz" --msgbox "FAIL -> Passwords dont Match\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set x "$3" "$4" "$5"
exit 0
fi
if [ ${emptyAllowed} -eq 0 ]; then
# password zero
if [ ${#password1} -eq 0 ]; then
dialog --backtitle "RaspiBlitz" --msgbox "FAIL -> Password cannot be empty\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set x "$3" "$4" "$5"
exit 0
fi
# check that password does not contain bad characters
clearedResult=$(echo "${password1}" | tr -dc '[:alnum:]-.' | tr -d ' ')
if [ ${#clearedResult} != ${#password1} ] || [ ${#clearedResult} -eq 0 ]; then
dialog --backtitle "RaspiBlitz" --msgbox "FAIL -> Contains bad characters (spaces, special chars)\nPlease try again ..." 6 62
# calling recursive repeat
/home/admin/config.scripts/blitz.password.sh set x "$3" "$4" "$5"
exit 0
fi
# password longer than 8
if [ ${#password1} -lt 8 ]; then
dialog --backtitle "RaspiBlitz" --msgbox "FAIL -> Password length under 8\nPlease try again ..." 6 52
# calling recursive repeat
/home/admin/config.scripts/blitz.passwords.sh set x "$3" "$4" "$5"
exit 0
fi
fi
# store result is file
echo "${password1}" > "${resultFile}"
else
echo "# FAIL: there is no password '${abcd}' (reminder: use lower case)"
echo "error='no password ${abcd}'"
exit 0
fi
# when started with menu ... reboot when done
if [ "${reboot}" == "1" ]; then
echo "# Now rebooting to activate changes ..."
sudo /home/admin/config.scripts/blitz.shutdown.sh reboot
fi