mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-05-16 10:23:31 +00:00
Change After=network.target → After=network-online.target + Wants=network- online.target in both service templates and install_web_service.sh. network.target only guarantees NetworkManager has started — it does NOT mean the device has an active internet connection. On boot the LED matrix service was starting within seconds of the network interface appearing, before WiFi association and DHCP completed, causing every first-update API call to fail with "Network is unreachable" or DNS resolution errors. network-online.target waits for a confirmed route before the service fires. On Raspberry Pi OS this is provided by NetworkManager-wait-online. The tradeoff is a few extra seconds at boot, acceptable for a display device. Observed on devpi: service started at 14:48:03, all API calls (weather, FlightRadar24, local ADS-B) failed at 14:48:07 with network errors, then the service restarted cleanly at 14:50:40 once WiFi was established. Co-authored-by: Chuck <chuck@example.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
113 lines
3.5 KiB
Bash
113 lines
3.5 KiB
Bash
#!/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"
|