gtemon - APRS Gateway Traffic Monitor
A logging and analysis system for APRS-to-APRS-IS gateways to track usage statistics and generate reports.
Features
- Continuous Traffic Logging: Connects to APRS-IS and logs all gateway traffic
- Comprehensive Tracking: Captures callsigns, packet types, timestamps, and geographic data
- Geographic Analysis: Automatically detects state/region from position packets
- Flexible Reporting: CLI tools for generating usage reports by time period, station, and geography
- Reliable Operation: Automatic reconnection with exponential backoff
- Systemd Integration: Run as a system service for unattended operation
- Efficient Storage: SQLite database with optimized indexes for fast queries
Installation
Prerequisites
- Python 3.9 or higher
- pip or uv package manager
Using uv (Recommended)
# Install uv if you don't have it
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install gtemon in development mode
cd gtemon
uv pip install -e .
Using pip
cd gtemon
pip install -e .
Quick Start
1. Create Configuration File
gtemon-daemon --create-config
This creates config.yaml in the current directory. Edit it with your settings:
aprs:
callsign: NTSGTE # Your gateway callsign
passcode: "-1" # Use -1 for read-only access
server: rotate.aprs2.net
port: 14580
filter: "b/NTSGTE p/NTSGTE" # Track packets to/from NTSGTE
database:
path: /var/lib/gtemon/gtemon.db
logging:
level: INFO
file: /var/log/gtemon/gtemon.log
2. Test the Daemon
Run the daemon in the foreground to test:
gtemon-daemon -c config.yaml -v
You should see packets being logged. Press Ctrl+C to stop.
3. Generate Reports
Once you have some data, generate a summary report:
gtemon-report summary --last-days 7
APRS-IS Filters
The filter configuration determines what traffic you receive. Common filters:
b/CALL- Packets heard by CALL (buddied)p/CALL- Packets originated by CALLr/lat/lon/dist- Radius filter (dist in km)- Combine with spaces:
b/NTSGTE p/NTSGTE
See APRS-IS filter documentation for more options.
Reporting Commands
Summary Report
# Last 30 days
gtemon-report summary --last-month
# Specific date range
gtemon-report summary --start 2025-01-01 --end 2025-01-31
# Last week
gtemon-report summary --last-days 7
Top Stations
# Top 20 most active stations
gtemon-report top-stations --limit 20
Database Info
gtemon-report info
Export to CSV
gtemon-report export data.csv --last-month
Running as a Service
1. Create System User
sudo useradd -r -s /bin/false gtemon
sudo mkdir -p /var/lib/gtemon /var/log/gtemon /etc/gtemon
sudo chown gtemon:gtemon /var/lib/gtemon /var/log/gtemon
2. Install Configuration
sudo cp config.yaml /etc/gtemon/
sudo chown root:gtemon /etc/gtemon/config.yaml
sudo chmod 640 /etc/gtemon/config.yaml
Update /etc/gtemon/config.yaml with appropriate paths:
database:
path: /var/lib/gtemon/gtemon.db
logging:
level: INFO
file: /var/log/gtemon/gtemon.log
3. Install and Enable Service
sudo cp systemd/gtemon.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable gtemon
sudo systemctl start gtemon
4. Check Status
sudo systemctl status gtemon
sudo journalctl -u gtemon -f
Configuration Reference
APRS Settings
aprs.callsign: Your gateway callsign for APRS-IS authenticationaprs.passcode: APRS-IS passcode (use-1for read-only)aprs.server: APRS-IS server hostnameaprs.port: APRS-IS port (typically 14580)aprs.filter: Server-side filter string
Database Settings
database.path: Path to SQLite database file
Logging Settings
logging.level: Log level (DEBUG, INFO, WARNING, ERROR)logging.file: Log file path (omit for stdout only)
Daemon Settings
daemon.reconnect_max_backoff: Maximum reconnection delay in seconds
Database Schema
The system uses SQLite with two main tables:
packets
Stores all received packets:
id: Auto-incrementing primary keytimestamp: Packet timestamp (UTC)source_call: Source callsigndest_call: Destination callsignpath: Digipeater pathpacket_type: position, message, telemetry, etc.latitude,longitude: Coordinates (if available)state: State/region (if determined)raw_packet: Original packet string
stations_summary
Aggregated statistics per station:
callsign: Station callsignfirst_seen,last_seen: Timestampstotal_packets: Total packet countlast_state,last_latitude,last_longitude: Last known location
Troubleshooting
No packets received
- Check APRS-IS credentials:
callsignandpasscode - Verify filter syntax in configuration
- Test connectivity:
telnet rotate.aprs2.net 14580 - Check logs:
journalctl -u gtemon -n 100
Database permission errors
Ensure the database directory is writable by the daemon user:
sudo chown -R gtemon:gtemon /var/lib/gtemon
High CPU usage
The daemon is designed to be lightweight. If you experience high CPU:
- Check for excessive reconnection loops (review logs)
- Verify your filter isn't too broad (receiving too much traffic)
- Consider increasing
reconnect_max_backoffin config
Development
Running Tests
pytest tests/
Code Formatting
black gtemon/
ruff check gtemon/
License
MIT License - see LICENSE file for details
Contributing
This is a volunteer project for ham radio network reporting. Issues and pull requests welcome!
Credits
Built for the NTS Gateway Traffic Monitoring project.
Uses: