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