fix: dynamically detect user and home directory in setup script

This commit is contained in:
Timothy Hofland
2026-03-11 07:36:15 +01:00
parent a5d1e88fd5
commit e8218229ab

View File

@ -12,13 +12,20 @@ if [ -z "$REPO_URL" ]; then
exit 1
fi
# 0. ROOT CHECK (Robust)
# 0. ROOT & USER DETECTION
if [ "$(id -u)" -ne 0 ]; then
echo "ERROR: This script must be run as root."
echo "Please use: sudo bash $0 $@"
exit 1
fi
# Detect the real user who called sudo
REAL_USER=${SUDO_USER:-$(logname)}
REAL_HOME=$(eval echo "~$REAL_USER")
echo "Target User: $REAL_USER"
echo "Target Home: $REAL_HOME"
# 1. INTERROGATION PHASE
echo "Interrogating user for configuration..."
@ -34,7 +41,6 @@ WIFI_SSID=${WIFI_SSID:-MPVJ-AP}
while true; do
WIFI_COUNTRY=$(whiptail --inputbox "Enter 2-letter Country Code (e.g. US, GB, DE)" 8 45 "US" --title "WiFi Country Configuration" 3>&1 1>&2 2>&3 < /dev/tty) || exit 1
WIFI_COUNTRY=$(echo "$WIFI_COUNTRY" | tr '[:lower:]' '[:upper:]')
# Portable regex check using grep
if ! echo "$WIFI_COUNTRY" | grep -qE "^[A-Z]{2}$"; then
whiptail --msgbox "Error: Country Code must be exactly 2 letters (e.g., US)." 8 45 < /dev/tty
else
@ -143,6 +149,8 @@ EOF
# 3.3 dhcpcd
if ! grep -q "interface wlan0" /etc/dhcpcd.conf; then
cat <<EOF >> /etc/dhcpcd.conf
# MPVJ wlan0 Static IP
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
@ -167,19 +175,19 @@ sed -i 's/#use-ipv4-ll=yes/use-ipv4-ll=yes/g' /etc/avahi/avahi-daemon.conf
echo "Deploying Application..."
# 4.1 Clone
[ -d /home/pi/mpvj ] && mv /home/pi/mpvj /home/pi/mpvj.old.$(date +%s)
git clone "$REPO_URL" /home/pi/mpvj
mkdir -p /home/pi/media
chown -R pi:pi /home/pi/mpvj /home/pi/media
[ -d "$REAL_HOME/mpvj" ] && mv "$REAL_HOME/mpvj" "$REAL_HOME/mpvj.old.$(date +%s)"
sudo -u "$REAL_USER" git clone "$REPO_URL" "$REAL_HOME/mpvj"
mkdir -p "$REAL_HOME/media"
chown -R "$REAL_USER:$REAL_USER" "$REAL_HOME/mpvj" "$REAL_HOME/media"
# 4.2 Build
export NODE_OPTIONS="--max-old-space-size=512"
cd /home/pi/mpvj/backend
sudo -u pi npm install --jobs 1
cd /home/pi/mpvj/frontend
cd "$REAL_HOME/mpvj/backend"
sudo -u "$REAL_USER" npm install --jobs 1
cd "$REAL_HOME/mpvj/frontend"
if [ ! -d "dist" ]; then
sudo -u pi npm install --jobs 1
sudo -u pi npm run build
sudo -u "$REAL_USER" npm install --jobs 1
sudo -u "$REAL_USER" npm run build
fi
# 4.3 Systemd
@ -190,8 +198,8 @@ After=network.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/mpvj/backend
User=$REAL_USER
WorkingDirectory=$REAL_HOME/mpvj/backend
ExecStart=/usr/bin/node index.js
Restart=on-failure
Environment=NODE_OPTIONS=--max-old-space-size=512
@ -203,39 +211,39 @@ systemctl daemon-reload
systemctl enable mpvj-backend.service
# 4.4 .env
cat <<EOF > /home/pi/mpvj/backend/.env
cat <<EOF > "$REAL_HOME/mpvj/backend/.env"
PORT=80
MPVJ_HOSTNAME=$HOSTNAME
MPVJ_SSID=$WIFI_SSID
MPVJ_WIFI_PASS=$WIFI_PASS
MPVJ_REPO_URL=$REPO_URL
MPVJ_MEDIA_DIR=/home/pi/media
MPVJ_MEDIA_DIR=$REAL_HOME/media
EOF
chown pi:pi /home/pi/mpvj/backend/.env
chmod 600 /home/pi/mpvj/backend/.env
chown "$REAL_USER:$REAL_USER" "$REAL_HOME/mpvj/backend/.env"
chmod 600 "$REAL_HOME/mpvj/backend/.env"
# 4.5 Install ofxPiMapper Engine
echo "Installing OpenFrameworks and ofxPiMapper (This will take ~1 hour)..."
cd /home/pi
cd "$REAL_HOME"
if [ ! -d "openFrameworks" ]; then
sudo -u pi git clone --depth 1 --branch master https://github.com/openframeworks/openFrameworks.git
sudo -u "$REAL_USER" git clone --depth 1 --branch master https://github.com/openframeworks/openFrameworks.git
cd openFrameworks/scripts/linux/debian
./install_dependencies.sh -y > /dev/null 2>&1
cd ../../../
cd scripts/linux/debian
./install_codecs.sh > /dev/null 2>&1
cd ../../../
make -j1 -C libs/openFrameworksCompiled/project/linux64 > /dev/null 2>&1
sudo -u "$REAL_USER" make -j1 -C libs/openFrameworksCompiled/project/linux64 > /dev/null 2>&1
fi
cd /home/pi/openFrameworks/addons
cd "$REAL_HOME/openFrameworks/addons"
if [ ! -d "ofxPiMapper" ]; then
sudo -u pi git clone https://github.com/kr15h/ofxPiMapper.git
sudo -u pi git clone https://github.com/vanderlin/ofxOfelia.git
sudo -u "$REAL_USER" git clone https://github.com/kr15h/ofxPiMapper.git
sudo -u "$REAL_USER" git clone https://github.com/vanderlin/ofxOfelia.git
fi
# Build Example with Highlight Patch
cd /home/pi/openFrameworks/addons/ofxPiMapper
cd "$REAL_HOME/openFrameworks/addons/ofxPiMapper"
if [ -f src/Osc/OscControl.cpp ]; then
echo "Applying highlight surface OSC listener modification..."
sed -i '/if (m.getAddress() == "\/ofxPiMapper\/surface\/select"){/i \
@ -246,8 +254,8 @@ if [ -f src/Osc/OscControl.cpp ]; then
}' src/Osc/OscControl.cpp
fi
cd /home/pi/openFrameworks/addons/ofxPiMapper/example-basic
sudo -u pi make -j1 > /dev/null 2>&1
cd "$REAL_HOME/openFrameworks/addons/ofxPiMapper/example-basic"
sudo -u "$REAL_USER" make -j1 > /dev/null 2>&1
cp bin/example-basic /usr/local/bin/ofxPiMapper
chmod +x /usr/local/bin/ofxPiMapper