No description
  • Go 73.4%
  • JavaScript 15%
  • CSS 7.9%
  • HTML 3.5%
  • Makefile 0.2%
Find a file
Pierre-Olivier Mercier 07f8673f2f Harden API surface and station/wifi backends
Bind to localhost by default and stop echoing backend errors (which can
embed credentials or low-level details) back over the API and log
broadcast. Validate hotspot SSID/passphrase/channel before writing
hostapd.conf and tighten its mode to 0600 since it stores the WPA PSK.
Restrict WebSocket upgrades to same-origin so a LAN browser can't be
turned into a proxy for the API.

Guard shared state: status reads/writes go through StatusMutex (the
periodic updater races with the toggle and status handlers otherwise),
broadcastToWebSockets no longer mutates the client map under RLock, and
station-event callbacks now run under SafeGo so a panic in app code can't
take down the daemon. Stop channels in hostapd, dhcp, and iwd signal
monitors are now closed under sync.Once to survive concurrent Stop calls.

App.Shutdown is idempotent and waits for the periodic loops before
closing backends, so signal-driven and deferred shutdowns no longer race.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 21:56:50 +08:00
cmd/repeater Harden API surface and station/wifi backends 2026-05-01 21:56:50 +08:00
internal Harden API surface and station/wifi backends 2026-05-01 21:56:50 +08:00
.gitignore Migrate to a better architectured project 2026-01-01 23:31:01 +07:00
generate.go Add OpenAPI specs 2025-10-28 18:25:45 +07:00
go.mod Migrate to a better architectured project 2026-01-01 23:31:01 +07:00
go.sum Add OpenAPI specs 2025-10-28 18:25:45 +07:00
Makefile Migrate to a better architectured project 2026-01-01 23:31:01 +07:00
oapi-gin.cfg.yaml Add OpenAPI specs 2025-10-28 18:25:45 +07:00
oapi-types.cfg.yaml Add OpenAPI specs 2025-10-28 18:25:45 +07:00
openapi.yaml Handle connecting/disconnecting states 2026-01-01 23:31:01 +07:00
README.md Migrate to a better architectured project 2026-01-01 23:31:01 +07:00

Travel Router Control

A Go application for controlling a mini travel router with dual WiFi interfaces and Ethernet connectivity. The router can operate as a WiFi repeater, connecting to upstream networks while providing a hotspot for client devices.

Features

  • WiFi network scanning and connection management
  • Hotspot (access point) configuration and control
  • Connected device monitoring
  • Real-time system logs via WebSocket
  • RESTful API following OpenAPI 3.0 specification
  • Web interface for easy management

Architecture

The application follows a clean architecture pattern:

.
├── cmd/
│   └── repeater/          # Application entry point
│       ├── main.go
│       └── static/        # Embedded web assets
├── internal/
│   ├── api/              # HTTP API layer
│   │   ├── router.go     # Gin router setup
│   │   └── handlers/     # HTTP handlers
│   ├── app/              # Application logic & lifecycle
│   ├── device/           # Device management
│   ├── hotspot/          # Hotspot control
│   ├── logging/          # Logging system
│   ├── models/           # Data structures
│   └── wifi/             # WiFi operations (wpa_supplicant via D-Bus)
├── openapi.yaml          # API specification
└── go.mod

Building

go build -o repeater ./cmd/repeater

Running

sudo ./repeater

The application requires root privileges to:

  • Access D-Bus system bus for wpa_supplicant
  • Control systemd services (hostapd)
  • Read DHCP leases and ARP tables

The server will start on port 8080.

API Endpoints

WiFi Operations

  • GET /api/wifi/scan - Scan for available networks
  • POST /api/wifi/connect - Connect to a network
  • POST /api/wifi/disconnect - Disconnect from current network

Hotspot Operations

  • POST /api/hotspot/config - Configure hotspot settings
  • POST /api/hotspot/toggle - Enable/disable hotspot

Device Management

  • GET /api/devices - Get connected devices

System

  • GET /api/status - Get system status
  • GET /api/logs - Get system logs
  • DELETE /api/logs - Clear logs

WebSocket

  • GET /ws/logs - Real-time log streaming

See openapi.yaml for complete API documentation.

Configuration

The application uses the following system resources:

  • WiFi Interface: wlan0 (for upstream connection)
  • AP Interface: wlan1 (for hotspot)
  • Hostapd Config: /etc/hostapd/hostapd.conf
  • WPA Supplicant Config: /etc/wpa_supplicant/wpa_supplicant.conf

These can be modified in the respective package constants.

Dependencies

  • Gin: HTTP web framework
  • godbus: D-Bus client for wpa_supplicant control
  • gorilla/websocket: WebSocket support
  • wpa_supplicant: WiFi connection management
  • hostapd: Hotspot functionality

License

MIT