2022-02-06 10:19:03 +01:00
#!/usr/bin/env bash
2022-02-08 20:09:26 +01:00
INSTALL_CONFIG_FILE = "/home/pi/luniebox/config/install.cfg"
REPO_URL = "https://git.bstly.de/Lurkars/luniebox.git"
2022-02-06 10:19:03 +01:00
AUTOMATIC = false
NO_UPDATES = false
NO_SPOTIFYDL = false
NO_SPOTIFY = false
NO_MPD = false
NO_AUDIO = false
2022-02-08 20:09:26 +01:00
NO_MPU = true
2022-02-06 10:19:03 +01:00
AUDIO_DEVICE = false
AUDIO_DEVICES = ( "pimoroni" "adafruit" )
DEVICE_NAME = false
2022-02-08 20:09:26 +01:00
REBOOT = false
2022-02-06 10:19:03 +01:00
help( ) {
local IFS = "|"
2022-02-08 20:09:26 +01:00
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 "
2022-02-06 10:19:03 +01:00
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"
2022-02-08 20:09:26 +01:00
printf " --repo-url [REPOSITORY_URL]\tset luniebox repository url (default https://git.bstly.de/Lurkars/luniebox.git)\n"
2022-02-06 10:19:03 +01:00
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
; ;
2022-02-06 11:40:14 +01:00
"--no-mpd" )
NO_MPD = true
; ;
2022-02-06 10:19:03 +01:00
"--audio-device" )
AUDIO_DEVICE = " $2 "
shift
; ;
"--device-name" )
DEVICE_NAME = " $2 "
shift
; ;
"--mpu" )
2022-02-08 20:09:26 +01:00
NO_MPU = false
; ;
"--repo-url" )
REPO_URL = " $2 "
shift
2022-02-06 10:19:03 +01:00
; ;
*)
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
2022-02-08 20:09:26 +01:00
initialize
update
setup_device_name
2022-02-06 10:19:03 +01:00
setup_software
setup_rfid
2022-02-08 20:09:26 +01:00
setup_audio
2022-02-06 10:19:03 +01:00
setup_mpu
finalize
}
2022-02-08 20:09:26 +01:00
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 } " )
2022-02-06 10:19:03 +01:00
fi
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
2022-02-08 20:09:26 +01:00
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 } "
2022-02-06 10:19:03 +01:00
fi
2022-02-08 20:09:26 +01:00
}
2022-02-06 10:19:03 +01:00
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
fi
2022-02-08 20:09:26 +01:00
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 } "
2022-02-06 10:19:03 +01:00
fi
}
2022-02-08 20:09:26 +01:00
setup_software( ) {
setup_app
setup_spotify
setup_mpd
setup_zspotify
}
2022-02-06 10:19:03 +01:00
setup_app( ) {
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
}
setup_spotify( ) {
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
fi
2022-02-08 20:09:26 +01:00
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 } "
2022-02-06 10:19:03 +01:00
fi
}
setup_mpd( ) {
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
fi
2022-02-08 20:09:26 +01:00
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 } "
2022-02-06 10:19:03 +01:00
fi
}
setup_zspotify( ) {
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
fi
fi
2022-02-08 20:09:26 +01:00
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 } "
2022-02-06 10:19:03 +01:00
fi
2022-02-08 20:09:26 +01:00
}
2022-02-06 10:19:03 +01:00
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
2022-02-08 20:09:26 +01:00
if ! [ [ $DEVICE_NAME ] ] || [ [ ${ DEVICE_NAME } = = "false" ] ] ; then
DEVICE_NAME = "luniebox"
fi
2022-02-06 10:19:03 +01:00
2022-02-08 20:09:26 +01:00
echo " Set device name to ' ${ DEVICE_NAME } ' "
2022-02-06 10:19:03 +01:00
2022-02-08 20:09:26 +01:00
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 } "
2022-02-06 10:19:03 +01:00
fi
}
setup_rfid( ) {
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
}
setup_mpu( ) {
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
fi
2022-02-08 20:09:26 +01:00
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 } "
2022-02-06 10:19:03 +01:00
fi
}
setup_audio( ) {
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
fi
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
}
setup_pimoroni( ) {
echo "Setup Pimoroni Shim"
sudo sed -i "/dtparam=audio=on/s/^/#/g" /boot/config.txt
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
}
setup_adafruit( ) {
echo "Setup Adafruit Speaker Bonnet"
sudo sed -i "/dtparam=audio=on/s/^/#/g" /boot/config.txt
2022-02-08 20:09:26 +01:00
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
2022-02-24 16:12:47 +01:00
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
2022-02-08 20:09:26 +01:00
REBOOT = true
echo "SETUP_AUDIO=true" | tee -a " ${ INSTALL_CONFIG_FILE } " 1>/dev/null
2022-02-06 10:19:03 +01:00
}
finalize( ) {
2022-02-08 20:09:26 +01:00
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
2022-02-06 10:19:03 +01:00
2022-02-08 20:09:26 +01:00
echo "Rebooting now...."
sleep 1
sudo reboot
exit 0
else
echo "Bye...."
exit 0
fi
2022-02-06 10:19:03 +01:00
}
start