luniebox/luniebox.sh

468 lines
13 KiB
Bash
Executable File

#!/usr/bin/env bash
INSTALL_CONFIG_FILE="/home/pi/luniebox/config/install.cfg"
REPO_URL="https://git.bstly.de/Lurkars/luniebox.git"
AUTOMATIC=false
NO_UPDATES=false
NO_SPOTIFYDL=false
NO_SPOTIFY=false
NO_MPD=false
NO_AUDIO=false
NO_MPU=true
AUDIO_DEVICE=false
AUDIO_DEVICES=("pimoroni" "adafruit")
DEVICE_NAME=false
REBOOT=false
help() {
local IFS="|"
printf "Usage: ${SCRIPTNAME} [-h] [-a] [--audio-device AUDIO_DEVICE] [--device-name DEVICE_NAME] [--no-updates] [--no-spotifydl] [--no-spotify] [--no-mpd] [--mpu] [--repo-url] \n"
printf " -h\t\t\t\tshow this help\n"
printf " -a\t\t\t\tautomatic/non-interactive mode (without --audio-device, no Audio device is set up)\n"
printf " --audio-device [AUDIO_DEVICE]\tset Audio device (one of [${AUDIO_DEVICES[*]}])\n"
printf " --device-name [DEVICE_NAME]\tset luniebox device name (default: luniebox)\n"
printf " --no-updates\t\t\tskip system updates \n"
printf " --no-spotifydl\t\t\tskip installation of zspotify (no offline support for Spotify) \n"
printf " --no-mpd\t\t\tskip installation of Music Player Daemon (no offline support, also skips zspotify)\n"
printf " --no-spotify\t\t\tskip installation of spotifyd (no Spotify support, also skips zspotify)\n"
printf " --mpu\t\t\t\tsetup MPU9250 on I2C port (default is no MPU9250)\n"
printf " --repo-url [REPOSITORY_URL]\tset luniebox repository url (default https://git.bstly.de/Lurkars/luniebox.git)\n"
exit 0
}
while [ -n "$1" ]; do
case "$1" in
"-h" | "--help")
help
;;
"-a" | "--automatic")
AUTOMATIC=true
;;
"--no-updates")
NO_UPDATES=true
;;
"--no-spotifydl")
NO_SPOTIFYDL=true
;;
"--no-spotify")
NO_SPOTIFY=true
;;
"--no-mpd")
NO_MPD=true
;;
"--audio-device")
AUDIO_DEVICE="$2"
shift
;;
"--device-name")
DEVICE_NAME="$2"
shift
;;
"--mpu")
NO_MPU=false
;;
"--repo-url")
REPO_URL="$2"
shift
;;
*)
printf "\nargument '$1' not supported!\n\n"
help
;;
esac
shift
done
if [[ ${AUDIO_DEVICE} != "false" ]] && ! [[ ${AUDIO_DEVICES[*]} =~ "$AUDIO_DEVICE" ]]; then
NO_AUDIO=true
printf "Audio device '${AUDIO_DEVICE}' not supported, please set it up manually.\n"
fi
AUDIO_DEVICES+=("other")
start() {
if [[ ${AUTOMATIC} == "false" ]]; then
echo "##########################################
# _ _ _ #
# | |_ _ _ __ (_) ___| |__ _____ __ #
# | | | | | '_ \| |/ _ \ '_ \ / _ \ \/ / #
# | | |_| | | | | | __/ |_) | (_) > < #
# |_|\__,_|_| |_|_|\___|_.__/ \___/_/\_\ #
# #
##########################################
Welcome to luniebox setup. This script will perfom some interactive
steps to install and configure everything neccessary to convert this
device into a standalone spotify music box with RFID functionality.
If you want to run the script automatically, press n and restart script with -a option.
Run the script with -h to get more information about possible options to be applied for setup process.
"
read -rp "Do you want to setup luniebox now? [Y/n] " response
echo ""
case "$response" in
[nN][oO] | [nN])
echo "Bye...."
exit 0
;;
esac
fi
setup
}
setup() {
cd /home/pi
initialize
update
setup_device_name
setup_software
setup_rfid
setup_audio
setup_mpu
finalize
}
initialize() {
echo "Initizalize setup..."
echo "Check for previous setup..."
if [[ -f "${INSTALL_CONFIG_FILE}" ]]; then
eval $(sed -r "/[^=]+=[^=]+/!d;s/\s+=\s/=/g" "${INSTALL_CONFIG_FILE}")
fi
if [[ -z ${SETUP_INITIALIZE+x} ]]; then
echo "Install required packages..."
sudo apt install -y git
echo "Fetch luniebox repository..."
git clone "${REPO_URL}" /home/pi/luniebox
echo "Create config directory"
mkdir -p /home/pi/luniebox/config
echo "SETUP_INITIALIZE=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
echo "luniebox is already setup!"
fi
if [[ -z ${SETUP_REPO_URL+x} ]]; then
echo "SETUP_REPO_URL=${REPO_URL}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
REPO_URL="${SETUP_REPO_URL}"
fi
}
update() {
if [[ -z ${SETUP_UPDATES+x} ]]; then
if [[ ${NO_UPDATES} == "false" ]]; then
if [[ ${AUTOMATIC} == "false" ]]; then
read -rp "Do you want to update system now? [Y/n] (recommended) " response
echo ""
case "$response" in
[nN][oO] | [nN])
NO_UPDATES=true
return 0
;;
esac
fi
echo "Update system"
sudo apt update
sudo apt upgrade -y
echo "SETUP_UPDATES=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
fi
fi
if [[ -z ${SETUP_NO_UPDATES+x} ]]; then
echo "SETUP_NO_UPDATES=${NO_UPDATES}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
NO_UPDATES="${SETUP_NO_UPDATES}"
fi
}
setup_software() {
setup_app
setup_spotify
setup_mpd
setup_zspotify
}
setup_app() {
if [[ -z ${SETUP_APP+x} ]]; then
echo "Install required packages..."
sudo apt install -y python3-venv python3-pip
cd /home/pi/luniebox/application
echo "Setup python venv..."
python -m venv venv
source venv/bin/activate
export CFLAGS=-fcommon
echo "Install pip requirements..."
pip install -r requirements.txt
deactivate
echo "Setup config and systemd services..."
cp /home/pi/luniebox/contrib/config/luniebox.cfg /home/pi/luniebox/config/luniebox.cfg
sudo cp /home/pi/luniebox/contrib/service/luniebox-app.service /etc/systemd/system/
sudo cp /home/pi/luniebox/contrib/service/luniebox-daemon.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable luniebox-app luniebox-daemon
REBOOT=true
echo "SETUP_APP=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
fi
}
setup_spotify() {
if [[ -z ${SETUP_SPOTIFY+x} ]]; then
if [[ ${NO_SPOTIFY} == "false" ]]; then
if [[ ${AUTOMATIC} == "false" ]]; then
read -rp "Do you want to install spotifyd for Spofity support? [Y/n] " response
echo ""
case "$response" in
[nN][oO] | [nN])
NO_SPOTIFY=true
return 0
;;
esac
fi
mkdir -p /home/pi/luniebox/bin
echo "Download spotifyd..."
wget -c https://github.com/Spotifyd/spotifyd/releases/download/v0.3.3/spotifyd-linux-armv6-slim.tar.gz -O - | tar -xz -C /home/pi/luniebox/bin
echo "Setup config and systemd services..."
if [[ ${NO_AUDIO} == "true" ]]; then
echo "WARNING: you may need to adjust the file '/home/pi/luniebox/config/spotifyd.cfg' manually to setup your audio device!"
echo ""
fi
cp /home/pi/luniebox/contrib/config/spotifyd.cfg /home/pi/luniebox/config/spotifyd.cfg
sed -i "s/^device_name.*=.*$/device_name = \"${DEVICE_NAME}\"/" /home/pi/luniebox/config/spotifyd.cfg
sudo cp /home/pi/luniebox/contrib/service/spotifyd.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable spotifyd
REBOOT=true
echo "SETUP_SPOTIFY=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
fi
fi
if [[ -z ${SETUP_NO_SPOTIFY+x} ]]; then
echo "SETUP_NO_SPOTIFY=${NO_SPOTIFY}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
NO_SPOTIFY="${SETUP_NO_SPOTIFY}"
fi
}
setup_mpd() {
if [[ -z ${SETUP_MPD+x} ]]; then
if [[ ${NO_MPD} == "false" ]]; then
if [[ ${AUTOMATIC} == "false" ]]; then
read -rp "Do you want to install mpd (Music Player Daemon) for offline file support? [Y/n] " response
echo ""
case "$response" in
[nN][oO] | [nN])
NO_MPD=true
return 0
;;
esac
fi
mkdir -p /home/pi/luniebox/library
echo "Install required packages..."
sudo apt install -y mpd
echo "Setup config..."
if [[ ${NO_AUDIO} == "true" ]]; then
echo "WARNING: you may need to adjust the file '/etc/mpd.conf' manually to setup your audio device!"
echo ""
fi
sudo cp /home/pi/luniebox/contrib/config/mpd.conf /etc/mpd.conf
REBOOT=true
echo "SETUP_MPD=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
fi
fi
if [[ -z ${SETUP_NO_MPD+x} ]]; then
echo "SETUP_NO_MPD=${NO_MPD}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
NO_MPD="${SETUP_NO_MPD}"
fi
}
setup_zspotify() {
if [[ -z ${SETUP_SPOTIFYDL+x} ]]; then
if [[ ${NO_SPOTIFYDL} == "false" ]] && [[ ${NO_SPOTIFY} == "false" ]] && [[ ${NO_MPD} == "false" ]]; then
if [[ ${AUTOMATIC} == "false" ]]; then
read -rp "Do you want to install zspotify for downloading Spotify tracks for offline support? [Y/n] " response
echo ""
case "$response" in
[nN][oO] | [nN])
NO_MPD=true
return 0
;;
esac
fi
echo "Fetch clspotify repository..."
git clone https://github.com/agent255/clspotify.git /home/pi/clspotify
cd /home/pi/clspotify
echo "Setup python venv..."
python -m venv venv
source venv/bin/activate
echo "Install pip requirements..."
pip install -r requirements.txt
deactivate
echo "Setup config..."
sed -i "s/^zspotify_path =.*$/zspotify_path = \/home\/pi\/clspotify\//" /home/pi/luniebox/config/luniebox.cfg
REBOOT=true
echo "SETUP_SPOTIFYDL=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
fi
fi
if [[ -z ${SETUP_NO_SPOTIFY+x} ]]; then
echo "SETUP_NO_SPOTIFYDL=${NO_SPOTIFYDL}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
NO_SPOTIFYDL="${SETUP_NO_SPOTIFYDL}"
fi
}
setup_device_name() {
if [[ -z ${SETUP_DEVICE_NAME+x} ]]; then
if [[ ${AUTOMATIC} == "false" ]] && [[ ${DEVICE_NAME} == "false" ]]; then
read -rp "Name for your Luniebox devices [default: luniebox]: " DEVICE_NAME
fi
if ! [[ $DEVICE_NAME ]] || [[ ${DEVICE_NAME} == "false" ]]; then
DEVICE_NAME="luniebox"
fi
echo "Set device name to '${DEVICE_NAME}'"
printf "${DEVICE_NAME}" | sudo tee /etc/hostname 1>/dev/null
sudo sed -i "/^127.0.0.1/s/$/ ${DEVICE_NAME}/g" /etc/hosts
REBOOT=true
echo "SETUP_DEVICE_NAME=${DEVICE_NAME}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
DEVICE_NAME="${SETUP_DEVICE_NAME}"
fi
}
setup_rfid() {
if [[ -z ${SETUP_RFID+x} ]]; then
echo "Enable SPI for RFID reader"
sudo sed -i "/dtparam=spi=on/s/^#//g" /boot/config.txt
REBOOT=true
echo "SETUP_RFID=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
fi
}
setup_mpu() {
if [[ -z ${SETUP_MPU+x} ]]; then
if [[ ${AUTOMATIC} == "false" ]] && [[ ${NO_MPU} == "true" ]]; then
read -rp "Do you want to setup I2C for MPU9250 9-axis sensor? [y/N] " response
echo ""
case "$response" in
[yY][eE][sS] | [yY])
NO_MPU=false
;;
*)
return 0
;;
esac
fi
if [[ ${NO_MPU} == "false" ]]; then
echo "Install I2C software, enable i2c bus 4, enable mpu"
sudo apt install -y i2c-tools python3-smbus
sudo sed -i "/dtparam=i2c_arm=on/s/^#//g" /boot/config.txt
printf "\n# setup i2c bus 4 for mpu\ndtoverlay=i2c-gpio,bus=4,i2c_gpio_delay_us=1,i2c_gpio_sda=23,i2c_gpio_scl=24\n" | sudo tee -a /boot/config.txt 1>/dev/null
sed -i "s/^mpu =.*$/mpu = True/" /home/pi/luniebox/config/luniebox.cfg
REBOOT=true
echo "SETUP_MPU=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
fi
fi
if [[ -z ${SETUP_NO_MPU+x} ]]; then
echo "SETUP_NO_MPU=${NO_MPU}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
NO_MPU="${SETUP_NO_MPU}"
fi
}
setup_audio() {
if [[ -z ${SETUP_AUDIO+x} ]]; then
if [[ ${NO_AUDIO} == "false" ]]; then
if [[ ${AUTOMATIC} == "false" ]]; then
echo "Choose your audio hardware"
select response in "${AUDIO_DEVICES[@]}"; do
echo ""
AUDIO_DEVICE="$response"
break
done
fi
case "$AUDIO_DEVICE" in
"pimoroni")
setup_pimoroni
;;
"adafruit")
setup_adafruit
;;
*)
NO_AUDIO=true
echo "WARNING: please setup your audio device manually!"
;;
esac
fi
fi
if [[ -z ${SETUP_AUDIO_DEVICE+x} ]]; then
echo "SETUP_AUDIO_DEVICE=${AUDIO_DEVICE}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
AUDIO_DEVICE="${SETUP_AUDIO_DEVICE}"
fi
if [[ -z ${SETUP_NO_AUDIO+x} ]]; then
echo "SETUP_NO_AUDIO=${NO_AUDIO}" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
else
NO_AUDIO="${SETUP_NO_AUDIO}"
fi
}
setup_pimoroni() {
echo "Setup Pimoroni Shim"
sudo sed -i "/dtparam=audio=on/s/^/#/g" /boot/config.txt
printf "\n# setup hifiberry for Pimoroni Shim\ndtoverlay=hifiberry-dac\ngpio=25=op,dh\n" | sudo tee -a /boot/config.txt 1>/dev/null
REBOOT=true
echo "SETUP_AUDIO=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
}
setup_adafruit() {
echo "Setup Adafruit Speaker Bonnet"
sudo sed -i "/dtparam=audio=on/s/^/#/g" /boot/config.txt
printf "\n# setup hifiberry and i2s for Adafruit Speaker Bonnet\ndtoverlay=hifiberry-dac\ndtoverlay=i2s-mmap\n" | sudo tee -a /boot/config.txt 1>/dev/null
cat /home/pi/luniebox/contrib/config/adafruit/asound.conf | sudo tee /etc/asound.conf 1>/dev/null
cat /home/pi/luniebox/contrib/config/adafruit/.asoundrc | tee /home/pi/.asoundrc 1>/dev/null
REBOOT=true
echo "SETUP_AUDIO=true" | tee -a "${INSTALL_CONFIG_FILE}" 1>/dev/null
}
finalize() {
if [[ ${REBOOT} == "true" ]]; then
if [[ ${AUTOMATIC} == "false" ]]; then
read -rp "Setup finished and reboot required. Do you want to automatically reboot your luniebox now? [Y/n] " response
echo ""
case "$response" in
[nN][oO] | [nN])
echo "Please reboot manually for luniebox working properly!"
echo "Bye...."
exit 0
;;
esac
fi
echo "Rebooting now...."
sleep 1
sudo reboot
exit 0
else
echo "Bye...."
exit 0
fi
}
start