mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-08-21 02:19:07 +00:00
git tracks five scripts as mode 644 that first_time_install.sh then chmods to
755 (start_display.sh, stop_display.sh, the two install_*_service.sh, and
one-shot-install.sh does the same to first_time_install.sh). With
core.fileMode true, the default on Linux, git reports all five as modified
from then on, in files the user never touched.
The update button stashes local changes before pulling, so it is not blocked
by this. But it never pops that stash -- stash pop and stash apply appear
nowhere in the update flow -- so the mode change is stashed away and left
there, and the files revert:
=== file modes after the update button's stash ===
664 first_time_install.sh <- installer had made these 755
664 start_display.sh
664 stop_display.sh
664 scripts/install/install_service.sh
So every web-UI update silently strips the executable bit from the installer's
own scripts, and leaves a stash entry holding the difference. start_display.sh
and stop_display.sh stop working from the shell afterwards.
A manual `git pull --rebase` over SSH fails outright, since nothing stashes for
it: "cannot pull with rebase: You have unstaged changes". That is the likely
source of the reports, since plenty of people update that way.
Tracking the five as 755 -- what they should always have been, as the
installer chmodding them attests -- removes the spurious mode change
entirely: nothing to stash, nothing stripped, no stash entry, and manual
pulls work.
The pull also passes --autostash, for the case the code explicitly tolerates:
when the stash fails it logs a warning and pulls anyway, and that pull is what
then fails. Autostash also pops what it stashes, which the manual stash does
not.
Note that `git add -A` after `git update-index --chmod=+x` silently reverts
the index to the on-disk mode, so the modes here were set by chmodding the
files themselves.
Regression test asserts the five stay tracked executable; reverting any one
of them fails it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01STMbQE4YctTacQXfbYqKuW
113 lines
3.5 KiB
Bash
Executable File
113 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# LED Matrix Web Interface Service Installer
|
|
# This script installs and enables the web interface systemd service
|
|
|
|
set -e
|
|
|
|
echo "Installing LED Matrix Web Interface Service..."
|
|
|
|
# Get the actual user who invoked sudo
|
|
if [ -n "$SUDO_USER" ]; then
|
|
ACTUAL_USER="$SUDO_USER"
|
|
else
|
|
ACTUAL_USER=$(whoami)
|
|
fi
|
|
|
|
# Determine the Project Root Directory (parent of scripts/install/)
|
|
PROJECT_ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
|
|
|
|
echo "Installing for user: $ACTUAL_USER"
|
|
echo "Project root directory: $PROJECT_ROOT_DIR"
|
|
|
|
# Check if running as root
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo "Please run as root (use sudo)"
|
|
exit 1
|
|
fi
|
|
|
|
# Generate the service file dynamically with the correct paths
|
|
echo "Generating service file with dynamic paths..."
|
|
WEB_SERVICE_FILE_CONTENT=$(cat <<EOF
|
|
[Unit]
|
|
Description=LED Matrix Web Interface Service
|
|
After=network-online.target
|
|
Wants=network-online.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=${ACTUAL_USER}
|
|
WorkingDirectory=${PROJECT_ROOT_DIR}
|
|
Environment=USE_THREADING=1
|
|
ExecStart=/usr/bin/python3 ${PROJECT_ROOT_DIR}/scripts/utils/start_web_conditionally.py
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
StandardOutput=syslog
|
|
StandardError=syslog
|
|
SyslogIdentifier=ledmatrix-web
|
|
# Automatically create and manage cache directory
|
|
CacheDirectory=ledmatrix
|
|
CacheDirectoryMode=0775
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
)
|
|
|
|
# Write the service file to systemd directory
|
|
echo "Writing service file to /etc/systemd/system/ledmatrix-web.service"
|
|
echo "$WEB_SERVICE_FILE_CONTENT" > /etc/systemd/system/ledmatrix-web.service
|
|
|
|
# Ensure cache directory exists with proper permissions
|
|
# This is a fallback for older systemd versions that don't support CacheDirectory
|
|
# Systemd 239+ will automatically create it via CacheDirectory directive
|
|
echo "Setting up cache directory..."
|
|
CACHE_DIR="/var/cache/ledmatrix"
|
|
if [ ! -d "$CACHE_DIR" ]; then
|
|
mkdir -p "$CACHE_DIR"
|
|
# Set group ownership to allow both root and web user access
|
|
# Try to use ACTUAL_USER's group, fallback to root if that fails
|
|
if getent group "$ACTUAL_USER" > /dev/null 2>&1; then
|
|
chown root:"$ACTUAL_USER" "$CACHE_DIR" 2>/dev/null || chown root:root "$CACHE_DIR"
|
|
else
|
|
chown root:root "$CACHE_DIR"
|
|
fi
|
|
chmod 775 "$CACHE_DIR"
|
|
echo "✓ Cache directory created: $CACHE_DIR"
|
|
else
|
|
# Ensure permissions are correct
|
|
chmod 775 "$CACHE_DIR" 2>/dev/null || true
|
|
# Try to set group ownership if possible
|
|
if getent group "$ACTUAL_USER" > /dev/null 2>&1; then
|
|
chown root:"$ACTUAL_USER" "$CACHE_DIR" 2>/dev/null || true
|
|
fi
|
|
echo "✓ Cache directory exists: $CACHE_DIR"
|
|
fi
|
|
|
|
# Reload systemd to recognize the new service
|
|
echo "Reloading systemd..."
|
|
systemctl daemon-reload
|
|
|
|
# Enable the service to start on boot
|
|
echo "Enabling ledmatrix-web.service..."
|
|
systemctl enable ledmatrix-web.service
|
|
|
|
# Start the service
|
|
echo "Starting ledmatrix-web.service..."
|
|
systemctl start ledmatrix-web.service
|
|
|
|
# Check service status
|
|
echo "Checking service status..."
|
|
systemctl status ledmatrix-web.service --no-pager
|
|
|
|
echo ""
|
|
echo "Web interface service installed and started!"
|
|
echo "The web interface will now start automatically when:"
|
|
echo "1. The system boots"
|
|
echo "2. The 'web_display_autostart' setting is true in config/config.json"
|
|
echo ""
|
|
echo "To check the service status: systemctl status ledmatrix-web.service"
|
|
echo "To view logs: journalctl -u ledmatrix-web.service -f"
|
|
echo "To stop the service: systemctl stop ledmatrix-web.service"
|
|
echo "To disable autostart: systemctl disable ledmatrix-web.service"
|