From e8218229ab3e3e19d1e20a4b668d5884267aaba5 Mon Sep 17 00:00:00 2001 From: Timothy Hofland Date: Wed, 11 Mar 2026 07:36:15 +0100 Subject: [PATCH] fix: dynamically detect user and home directory in setup script --- scripts/setup.sh | 60 +++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/scripts/setup.sh b/scripts/setup.sh index b62f325..aa35dff 100644 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -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 <> /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 < /home/pi/mpvj/backend/.env +cat < "$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