#!/bin/bash set -e echo "--- TimeTurner Setup ---" # Determine package manager PKG_MANAGER="" if command -v apt &> /dev/null; then PKG_MANAGER="apt" elif command -v dnf &> /dev/null; then PKG_MANAGER="dnf" elif command -v pacman &> /dev/null; then PKG_MANAGER="pacman" else echo "Error: No supported package manager (apt, dnf, pacman) found. Please install dependencies manually." exit 1 fi echo "Detected package manager: $PKG_MANAGER" # --- Update System Packages --- echo "Updating system packages..." if [ "$PKG_MANAGER" == "apt" ]; then sudo apt update sudo DEBIAN_FRONTEND=noninteractive apt upgrade -y -o Dpkg::Options::="--force-confold" elif [ "$PKG_MANAGER" == "dnf" ]; then sudo dnf upgrade -y elif [ "$PKG_MANAGER" == "pacman" ]; then sudo pacman -Syu --noconfirm fi echo "System packages updated." # --- Install Rust/Cargo if not installed --- if ! command -v cargo &> /dev/null; then echo "Rust/Cargo not found. Installing Rustup..." curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y # Source cargo's env for the current shell session # This is for the current script's execution path, typically rustup adds to .bashrc/.profile for future sessions. # We need it now, but for non-interactive script, sourcing won't affect parent shell. # However, cargo build below will rely on it being in PATH. rustup makes sure of this if it installs. # For safety, ensure PATH is updated. export PATH="$HOME/.cargo/bin:$PATH" echo "Rust/Cargo installed successfully." else echo "Rust/Cargo is already installed." fi # --- Install common build dependencies for Rust --- echo "Installing common build dependencies..." if [ "$PKG_MANAGER" == "apt" ]; then sudo apt update sudo apt install -y build-essential libudev-dev pkg-config curl elif [ "$PKG_MANAGER" == "dnf" ]; then sudo dnf install -y gcc make perl-devel libudev-devel pkg-config curl elif [ "$PKG_MANAGER" == "pacman" ]; then sudo pacman -Sy --noconfirm base-devel libudev pkg-config curl fi echo "Common build dependencies installed." # --- Apply custom splash screen --- if [[ "$(uname)" == "Linux" ]]; then echo "🖼️ Applying custom splash screen..." SPLASH_URL="https://raw.githubusercontent.com/cjfranko/NTP-Timeturner/refs/heads/main/splash.png" PLYMOUTH_THEME_DIR="/usr/share/plymouth/themes/pix" PLYMOUTH_IMAGE_PATH="${PLYMOUTH_THEME_DIR}/splash.png" sudo mkdir -p "${PLYMOUTH_THEME_DIR}" echo "Downloading splash image from ${SPLASH_URL}..." sudo curl -L "${SPLASH_URL}" -o "${PLYMOUTH_IMAGE_PATH}" if [ -f "${PLYMOUTH_IMAGE_PATH}" ]; then echo "Splash image downloaded. Updating Plymouth configuration..." # Set 'pix' as the default plymouth theme if not already. # This is a common theme that expects splash.png. sudo update-alternatives --install /usr/share/plymouth/themes/default.plymouth default.plymouth "${PLYMOUTH_THEME_DIR}/pix.plymouth" 100 || true # Ensure the pix theme exists and is linked if [ ! -f "${PLYMOUTH_THEME_DIR}/pix.plymouth" ]; then echo "Creating dummy pix.plymouth for update-initramfs" echo "[Plymouth Theme]" | sudo tee "${PLYMOUTH_THEME_DIR}/pix.plymouth" > /dev/null echo "Name=Pi Splash" | sudo tee -a "${PLYMOUTH_THEME_DIR}/pix.plymouth" > /dev/null echo "Description=TimeTurner Raspberry Pi Splash Screen" | sudo tee -a "${PLYMOUTH_THEME_DIR}/pix.plymouth" > /dev/null echo "SpriteAnimation=/splash.png" | sudo tee -a "${PLYMOUTH_THEME_DIR}/pix.plymouth" > /dev/null fi # Update the initial RAM filesystem to include the new splash screen sudo update-initramfs -u echo "✅ Custom splash screen applied. Reboot may be required to see changes." else echo "❌ Failed to download splash image from ${SPLASH_URL}." fi else echo "⚠️ Skipping splash screen configuration on non-Linux OS." fi # --- Remove NTPD and install Chrony, NMTUI, Adjtimex --- echo "Removing NTPD (if installed) and installing Chrony, NMTUI, Adjtimex..." # --- Remove NTPD and install Chrony, NMTUI, Adjtimex --- echo "Removing NTPD (if installed) and installing Chrony, NMTUI, Adjtimex..." if [ "$PKG_MANAGER" == "apt" ]; then sudo apt update sudo apt remove -y ntp || true # Remove ntp if it exists, ignore if not sudo apt install -y chrony network-manager adjtimex sudo systemctl enable chrony --now elif [ "$PKG_MANAGER" == "dnf" ]; then sudo dnf remove -y ntp sudo dnf install -y chrony NetworkManager-tui adjtimex sudo systemctl enable chronyd --now elif [ "$PKG_MANAGER" == "pacman" ]; then sudo pacman -Sy --noconfirm ntp || true sudo pacman -R --noconfirm ntp || true # Ensure ntp is removed sudo pacman -Sy --noconfirm chrony networkmanager adjtimex sudo systemctl enable chronyd --now sudo systemctl enable NetworkManager --now # nmtui relies on NetworkManager fi echo "NTPD removed (if present). Chrony, NMTUI, and Adjtimex installed and configured." # --- Install and configure WiFi hotspot and captive portal --- echo "📡 Installing and configuring WiFi hotspot and captive portal..." if [ "$PKG_MANAGER" == "apt" ]; then # Install dependencies, but handle nodogsplash separately sudo apt install -y hostapd dnsmasq # Check architecture ARCH=$(dpkg --print-architecture) if [ "$ARCH" == "armhf" ]; then NDS_DEB_URL="https://github.com/nodogsplash/nodogsplash/releases/download/v6.0.0/nodogsplash_6.0.0-1_armhf.deb" elif [ "$ARCH" == "arm64" ]; then NDS_DEB_URL="https://github.com/nodogsplash/nodogsplash/releases/download/v6.0.0/nodogsplash_6.0.0-1_arm64.deb" else echo "Unsupported architecture for nodogsplash deb: $ARCH. Please install manually." exit 1 fi echo "Downloading nodogsplash for $ARCH..." curl -L "$NDS_DEB_URL" -o /tmp/nodogsplash.deb # Verify that the downloaded file is a debian package if ! dpkg-deb -I /tmp/nodogsplash.deb >/dev/null 2>&1; then echo "❌ Error: Downloaded file is not a valid Debian package. Please check the URL and your connection." rm /tmp/nodogsplash.deb exit 1 fi echo "Installing nodogsplash..." sudo dpkg -i /tmp/nodogsplash.deb # Install any missing dependencies for nodogsplash sudo apt-get install -f -y rm /tmp/nodogsplash.deb sudo systemctl unmask hostapd sudo systemctl enable hostapd sudo systemctl enable nodogsplash else echo "This script is designed for Debian-based systems like Raspberry Pi OS." echo "Skipping WiFi hotspot setup." fi # Stop services to configure # Ensure services exist before trying to stop them sudo systemctl stop hostapd || true sudo systemctl stop dnsmasq || true if command -v nodogsplash &> /dev/null; then sudo systemctl stop nodogsplash || true fi # Configure static IP for wlan0 echo "Configuring static IP for wlan0..." sudo sed -i '/^interface wlan0/d' /etc/dhcpcd.conf sudo tee -a /etc/dhcpcd.conf > /dev/null < /dev/null < /dev/null < /dev/null <