468 lines
13 KiB
Bash
Executable File
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
|