Files
nearxos 031e1c3415 Enhance provisioning documentation and scripts for improved network boot and DNS management</message>
<message>Add new documentation files for device DNS management via DHCP and dnsmasq configuration. Update cloud-init scripts to ensure proper handling of /etc/resolv.conf and DNS settings, allowing for seamless integration with file.server. Modify existing scripts to support dynamic LAN subnet configuration and improve overall network boot functionality. These changes enhance user experience and streamline the setup process for the CM4 eMMC provisioning service.
2026-03-04 19:15:38 +02:00

130 lines
4.5 KiB
Bash

#!/bin/bash
# Minimal bootstrap script for cloud-init first boot (test).
set -e
# Ensure hostname resolves (avoids "sudo: unable to resolve host")
H="$(hostname)"
grep -q "127.0.1.1.*$H" /etc/hosts || echo "127.0.1.1 $H" >> /etc/hosts
# Do not overwrite /etc/resolv.conf: use DNS from DHCP so file.server and LXC DNS work.
# --- Chromium kiosk autostart (same behaviour as gnss-guard start-chromium.sh) ---
PI_USER="${PI_USER:-pi}"
SCRIPT_DEST="/usr/local/bin/start-chromium.sh"
AUTOSTART_SYSTEM="/etc/xdg/autostart"
PI_HOME="/home/$PI_USER"
# Icon: download start-here.png from file server, or set DESKTOP_ICON to override
FILE_SERVER="${FILE_SERVER:-http://file.server:5000/files/first-boot}"
ICON_DEST="/usr/share/pixmaps/tm.png"
DESKTOP_ICON="${DESKTOP_ICON:-chromium-browser}"
if [ "$DESKTOP_ICON" = "chromium-browser" ]; then
mkdir -p /usr/share/pixmaps
icon_url="${FILE_SERVER}/start-here.png"
if ! curl -fsSL "$icon_url" -o "$ICON_DEST" 2>/dev/null; then
# Fallback: use gateway IP (LXC on provisioning LAN) when DNS not ready yet at first boot
gw="$(ip -4 route show default 2>/dev/null | awk '{print $3; exit}')"
if [ -n "$gw" ]; then
curl -fsSL "http://${gw}:5000/files/first-boot/start-here.png" -o "$ICON_DEST" 2>/dev/null || true
fi
fi
if [ -s "$ICON_DEST" ]; then
chmod 644 "$ICON_DEST"
DESKTOP_ICON="$ICON_DEST"
fi
fi
# Install start-chromium.sh system-wide so it works regardless of user home
cat << 'START_CHROMIUM_EOF' > "$SCRIPT_DEST"
#!/bin/bash
# Disable keyring prompts
export GNOME_KEYRING_CONTROL=""
export DISPLAY=:0
# Force X11 instead of Wayland for better fullscreen support
export GDK_BACKEND=x11
unset WAYLAND_DISPLAY
# Wait for display and desktop environment to be ready
for i in {1..60}; do
if xset q >/dev/null 2>&1 || [ -n "$DISPLAY" ]; then
if pgrep -x pcmanfm >/dev/null 2>&1 || pgrep -x lxsession >/dev/null 2>&1 || pgrep -x xfdesktop >/dev/null 2>&1; then
break
fi
fi
sleep 0.5
done
sleep 5
/usr/bin/chromium --start-fullscreen --noerrdialogs --disable-infobars --disable-session-crashed-bubble --disable-restore-session-state --no-first-run --password-store=basic --use-mock-keychain --ozone-platform=x11 --disable-features=UseChromeOSDirectVideoDecoder --app=http://127.0.0.1:8080 &
sleep 3
for i in {1..10}; do
WINDOW_ID=$(wmctrl -l 2>/dev/null | grep -i chromium | head -1 | awk '{print $1}')
if [ -n "$WINDOW_ID" ]; then
wmctrl -i -r "$WINDOW_ID" -b add,fullscreen 2>/dev/null
break
fi
sleep 0.5
done
wait
START_CHROMIUM_EOF
chmod 755 "$SCRIPT_DEST"
# Autostart entry (runs Chromium at desktop login)
mkdir -p "$AUTOSTART_SYSTEM"
cat > "$AUTOSTART_SYSTEM/chromium-kiosk.desktop" << DESKTOP_EOF
[Desktop Entry]
Type=Application
Name=Chromium Fullscreen
Exec=/usr/local/bin/start-chromium.sh
Icon=$DESKTOP_ICON
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
DESKTOP_EOF
chmod 644 "$AUTOSTART_SYSTEM/chromium-kiosk.desktop"
# Desktop shortcut: real .desktop file on Desktop so the file manager treats it as a launcher (not a script).
# Symlink with no extension was shown as "executable script" and prompted; .desktop runs directly with quick_exec=1.
if getent passwd "$PI_USER" >/dev/null 2>&1; then
mkdir -p "$PI_HOME/Desktop" "$PI_HOME/.config/libfm"
if [ -f "$PI_HOME/.config/libfm/libfm.conf" ] && grep -q '^quick_exec=' "$PI_HOME/.config/libfm/libfm.conf"; then
sed -i 's/^quick_exec=.*/quick_exec=1/' "$PI_HOME/.config/libfm/libfm.conf"
else
echo 'quick_exec=1' >> "$PI_HOME/.config/libfm/libfm.conf"
fi
chown -R "$PI_USER:$PI_USER" "$PI_HOME/.config/libfm" 2>/dev/null || true
DESKTOP_FILE="$PI_HOME/Desktop/GNSS Guard.desktop"
cat > "$DESKTOP_FILE" << DESKTOP_SHORTCUT_EOF
[Desktop Entry]
Type=Application
Name=GNSS Guard
Comment=GNSS Guard Dashboard (e.g. if closed)
Exec=/usr/local/bin/start-chromium.sh
Icon=$DESKTOP_ICON
Terminal=false
Categories=Utility;
DESKTOP_SHORTCUT_EOF
chmod 644 "$DESKTOP_FILE"
chown "$PI_USER:$PI_USER" "$DESKTOP_FILE"
# Remove old symlink if present
rm -f "$PI_HOME/Desktop/GNSS Guard"
# Application menu/panel entry (same content)
SHORTCUT_FILE="/usr/share/applications/gnss-guard.desktop"
cat > "$SHORTCUT_FILE" << DESKTOP_SHORTCUT_EOF
[Desktop Entry]
Type=Application
Name=GNSS Guard
Comment=GNSS Guard Dashboard (e.g. if closed)
Exec=/usr/local/bin/start-chromium.sh
Icon=$DESKTOP_ICON
Terminal=true
Categories=Utility;
DESKTOP_SHORTCUT_EOF
chmod 644 "$SHORTCUT_FILE"
fi
echo "[$(date -Iseconds)] test completed" | tee -a /var/log/cloud-init-bootstrap.log