diff --git a/README.md b/README.md index 5f94e52..9102675 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,13 @@ Hachi synchronises timecode-locked systems by decoding incoming LTC (Linear Time Code) and broadcasting it as NTP/PTP β€” with the dedication our namesake would insist upon. -Created by Chris Frankland-Wright and Chaos Rogers +Created by Chris Frankland-Wright and John Rogers --- ## πŸ“¦ Hardware Requirements -- Raspberry Pi 5 2GB (Dev Platform) but should be supported by Pi v3 (or better) +- Raspberry Pi 5 (Dev Platform) but should be supported by Pi v3 (or better) - Debian Bookworm (64-bit recommended) - Teensy 4.0 - https://thepihut.com/products/teensy-4-0-headers - Audio Adapter Board for Teensy 4.0 (Rev D) - https://thepihut.com/products/audio-adapter-board-for-teensy-4-0 @@ -32,7 +32,7 @@ Created by Chris Frankland-Wright and Chaos Rogers ## πŸ–₯️ Web Interface & API -When running as a background daemon, Hachi provides a web interface for monitoring and configuration. +When running as a background daemon, TimeTurner provides a web interface for monitoring and configuration. - **Access**: The web UI is available at `http://:8080`. - **Functionality**: You can view the real-time sync status, see logs, and change all configuration options directly from your browser. @@ -50,7 +50,7 @@ When running as a background daemon, Hachi provides a web interface for monitori ## πŸš€ Installation -The `setup.sh` script compiles and installs the Hachi application. You can run it by cloning the repository with `git` or by using the `curl` command below for a git-free installation. +The `setup.sh` script compiles and installs the TimeTurner application. You can run it by cloning the repository with `git` or by using the `curl` command below for a git-free installation. ### Prerequisites @@ -86,27 +86,11 @@ The installation script automates the following steps: After installation is complete, the script will provide instructions to start the service manually or to run the application in its interactive terminal mode. -```bash -The working directory is /opt/timeturner. -Default 'config.yml' installed to /opt/timeturner. - -To start the service, run: - sudo systemctl start timeturner.service - -To view live logs, run: - journalctl -u timeturner.service -f - -To run the interactive TUI instead, simply run from the project directory: - cargo run -Or from anywhere after installation: - timeturner -``` - --- ## πŸ”„ Updating -If you installed Hachi by cloning the repository with `git`, you can use the `update.sh` script to easily update to the latest version. +If you installed TimeTurner by cloning the repository with `git`, you can use the `update.sh` script to easily update to the latest version. **Note**: This script will not work if you used the `curl` one-line command for installation, as that method does not create a Git repository. @@ -129,7 +113,7 @@ chronyc tracking | NTP Tracking sudo nano /etc/chrony/chrony.conf | Default Chrony Conf File Add to top: -# Serve the system clock as a reference at stratumβ€―1 +# Serve the system clock as a reference at stratumβ€―10 server 127.127.1.0 allow 127.0.0.0/8 local stratum 1 diff --git a/setup.sh b/setup.sh index 0b68c12..93cb02a 100644 --- a/setup.sh +++ b/setup.sh @@ -97,7 +97,7 @@ echo "Common build dependencies installed." # --- Install Python dependencies for testing --- echo "🐍 Installing Python dependencies for test scripts..." if [ "$PKG_MANAGER" == "apt" ]; then - # We no longer need hotspot dependencies + # python3-serial is the name for pyserial in apt sudo apt install -y python3 python3-pip python3-serial elif [ "$PKG_MANAGER" == "dnf" ]; then # python3-pyserial is the name for pyserial in dnf @@ -217,8 +217,237 @@ else fi -# --- The entire WiFi hotspot and captive portal section has been removed --- +# --- Install and configure WiFi hotspot and captive portal --- +echo "πŸ“‘ Installing and configuring WiFi hotspot and captive portal..." +if [ "$PKG_MANAGER" == "apt" ]; then + # Stop the service if it's running from a previous installation to prevent "Text file busy" error. + echo "Stopping existing nodogsplash service before installation..." + sudo systemctl stop nodogsplash || true + + # We will use dnsmasq for DHCP, as the compiled nodogsplash version may not support the internal DHCP server. + # sudo apt-get remove --purge -y dnsmasq || true # This line is no longer needed. + + # Install dependencies for hotspot and for building nodogsplash. + # ifupdown is needed to manage /etc/network/interfaces + sudo apt install -y hostapd dnsmasq git libmicrohttpd-dev libjson-c-dev iptables ifupdown + + # Force iptables-legacy for nodogsplash + echo "Setting iptables-legacy mode for nodogsplash..." + sudo update-alternatives --set iptables /usr/sbin/iptables-legacy + sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy + + echo "Building and installing nodogsplash from source..." + # Create a temporary directory for the build + BUILD_DIR=$(mktemp -d) + git clone https://github.com/nodogsplash/nodogsplash.git "$BUILD_DIR" + + # Run the build in a subshell to isolate the directory change + ( + cd "$BUILD_DIR" + make + sudo make install + + # Manually install the systemd service file as 'make install' might not do it. + # This makes the script more robust. + if [ -f "debian/nodogsplash.service" ]; then + echo "Manually installing systemd service file..." + sudo cp debian/nodogsplash.service /etc/systemd/system/nodogsplash.service + # Reload systemd to recognize the new service + sudo systemctl daemon-reload + else + echo "⚠️ Warning: nodogsplash.service file not found in source. Cannot set up as a service." + fi + ) + + # Clean up the build directory + sudo rm -rf "$BUILD_DIR" + echo "βœ… nodogsplash installed successfully." + + # Disable the standalone hostapd service to let NetworkManager manage it. + # We are now using the classic hostapd service, so unmask it. + 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 + +# --- Configure networking for AP mode --- + +# Set the WiFi country code to prevent radio issues. This is a critical step. +echo "Setting WiFi Country Code to US..." +sudo raspi-config nonint do_wifi_country US + +# Tell NetworkManager to ignore wlan0 completely to prevent conflicts. +echo "Configuring NetworkManager to ignore wlan0..." +sudo tee /etc/NetworkManager/conf.d/99-unmanaged-wlan0.conf > /dev/null < /dev/null < /dev/null < /dev/null < /dev/null < /dev/null; then + echo "Attempting to start nodogsplash service..." + if ! sudo systemctl restart nodogsplash; then + echo "❌ nodogsplash service failed to start. Displaying logs..." + # Give a moment for logs to be written + sleep 2 + sudo journalctl -u nodogsplash.service --no-pager -n 50 + echo "" + echo "To debug further, run nodogsplash in the foreground with this command:" + echo " sudo /usr/bin/nodogsplash -f -d 7" + echo "" + exit 1 + fi + echo "βœ… nodogsplash service started successfully." + fi +else + echo "❌ Error: wlan0 failed to get the static IP 10.0.252.1. Found: '$IP_CHECK'." + echo "Please check 'sudo systemctl status hostapd' and 'cat /etc/network/interfaces'." + exit 1 +fi + +echo "βœ… WiFi hotspot and captive portal configured. SSID: Fetch-Hachi, IP: 10.0.252.1" +echo "Clients will be redirected to http://10.0.252.1/static/index.html" # 1. Build the release binary echo "πŸ“¦ Building release binary with Cargo..." diff --git a/static/index.html b/static/index.html index 02bb279..deb683d 100644 --- a/static/index.html +++ b/static/index.html @@ -3,7 +3,7 @@ - Fetch | Hachi + NTP TimeTurner @@ -129,7 +129,7 @@ diff --git a/update.sh b/update.sh index ad9fcb9..666471e 100644 --- a/update.sh +++ b/update.sh @@ -13,11 +13,11 @@ cargo build --release # 3. Stop the currently running service to release the file lock echo "πŸ›‘ Stopping TimeTurner service..." -sudo systemctl stop timeturner.service || true +sudo systemctl stop timeturner.service # 4. Copy the new binary to the installation directory echo "πŸš€ Deploying new binary..." -sudo cp target/release/ntp_timeturner /opt/timeturner/timeturner +sudo cp target/release/timeturner /opt/timeturner/timeturner # 5. Restart the service with the new binary echo "βœ… Restarting TimeTurner service..."