mirror of
https://github.com/craigerl/aprsd.git
synced 2026-01-08 17:39:17 -05:00
reworked Documentation
The documenation now has a new theme and updated apidocs. Also the main index is built from the README.md contents.
This commit is contained in:
parent
61126289df
commit
eb0818af65
25
README.md
25
README.md
@ -54,17 +54,22 @@
|
||||
APRSD is a python application for interacting with the APRS network and Ham radios with KISS interfaces and
|
||||
providing APRS services for HAM radio operators.
|
||||
|
||||
APRSD currently has 4 main commands to use.
|
||||
APRSD currently has the following commands to use.
|
||||
|
||||
- server - Connect to APRS and listen/respond to APRS messages
|
||||
- send-message - Send a message to a callsign via APRS_IS.
|
||||
- server - Start the aprsd server gateway process.
|
||||
- listen - Listen to packets on the APRS-IS Network based on FILTER.
|
||||
- check-version - check the version of aprsd
|
||||
- sample-config - generate a sample config file
|
||||
- dev - helpful for testing new aprsd plugins under development
|
||||
- dump-stats - output the stats of a running aprsd server command
|
||||
- list-plugins - list the built in plugins, available plugins on pypi.org and installed plugins
|
||||
- list-extensions - list the available extensions on pypi.org and installed extensions
|
||||
- send-message - Send a message to a callsign via APRS_IS.
|
||||
- check-version - Check this version against the latest in pypi.org.
|
||||
- completion - Show the shell completion code
|
||||
- dev - Development type subcommands
|
||||
- dump-stats - Dump the current stats from the running APRSD instance.
|
||||
- fetch-stats - Fetch stats from a APRSD admin web interface.
|
||||
- healthcheck - Check the health of the running aprsd server.
|
||||
- list-extensions - List the built in extensions available to APRSD.
|
||||
- list-plugins - List the built in plugins available to APRSD.
|
||||
- passcode - Generate an APRS passcode for a callsign.
|
||||
- sample-config - Generate a sample Config file from aprsd and all...
|
||||
- version - Show the APRSD version.
|
||||
|
||||
Each of those commands can connect to the APRS-IS network if internet
|
||||
connectivity is available. If internet is not available, then APRS can
|
||||
@ -85,7 +90,7 @@ You can see the [available plugins/extensions on pypi here:](https://pypi.org/se
|
||||
|
||||
* [See webchat extension here](https://github.com/hemna/aprsd-webchat-extension) <div id="webchat logo" align="left"><img src="https://raw.githubusercontent.com/hemna/aprsd-webchat-extension/master/screenshot.png" alt="Webchat" width="340"/></div>
|
||||
|
||||
* [See CLI chat extension here](https://github.com/hemna/aprsd-rich-cli-extension) <div id="rich_logo" align="left"><img src="https://github.com/hemna/aprsd-rich-cli-extension/blob/master/screenshot.png" alt="CLI Chat" width="340"></div>
|
||||
* [See CLI chat extension here](https://github.com/hemna/aprsd-rich-cli-extension) <div id="rich_logo" align="left"><img src="https://raw.githubusercontent.com/hemna/aprsd-rich-cli-extension/refs/heads/master/screenshot.png" alt="CLI Chat" width="340"></div>
|
||||
|
||||
### List of existing plugins - APRS Message processing/responders
|
||||
|
||||
|
||||
20
docs/Makefile
Normal file
20
docs/Makefile
Normal file
@ -0,0 +1,20 @@
|
||||
# Minimal makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line, and also
|
||||
# from the environment for the first two.
|
||||
SPHINXOPTS ?=
|
||||
SPHINXBUILD ?= sphinx-build
|
||||
SOURCEDIR = source
|
||||
BUILDDIR = build
|
||||
|
||||
# Put it first so that "make" without argument is like "make help".
|
||||
help:
|
||||
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
|
||||
.PHONY: help Makefile
|
||||
|
||||
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||
%: Makefile
|
||||
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
@ -6,17 +6,17 @@ This is needed if the Python source being documented changes significantly. Old
|
||||
RST files can be left behind.
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def main() -> None:
|
||||
docs_dir = Path(__file__).resolve().parent
|
||||
for folder in ("_build", "apidoc"):
|
||||
for folder in ('build', 'source/apidoc'):
|
||||
delete_dir = docs_dir / folder
|
||||
if delete_dir.exists():
|
||||
shutil.rmtree(delete_dir)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
125
docs/fix_readme_rst.py
Executable file
125
docs/fix_readme_rst.py
Executable file
@ -0,0 +1,125 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""Post-process readme.rst after m2r conversion to fix logo path and heading levels."""
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def fix_readme_rst(file_path: Path) -> None:
|
||||
"""Fix logo path and heading levels in readme.rst."""
|
||||
content = file_path.read_text(encoding='utf-8')
|
||||
|
||||
# Fix logo path: change ./aprsd_logo.png to ../images/aprsd_logo.png
|
||||
content = re.sub(
|
||||
r'\.\. image:: \./aprsd_logo\.png',
|
||||
'.. image:: ../images/aprsd_logo.png',
|
||||
content,
|
||||
)
|
||||
content = re.sub(
|
||||
r':target: \./aprsd_logo\.png', ':target: ../images/aprsd_logo.png', content
|
||||
)
|
||||
content = re.sub(r':alt: image', ':alt: APRSD Logo', content)
|
||||
|
||||
# Fix heading levels:
|
||||
# - Main title uses === (level 1) - keep as is
|
||||
# - "KM6LYW and WB4BOR" uses --- (level 2) - keep as is
|
||||
# - Major sections like "What is APRSD" use ^^^^^ (level 3) but should be --- (level 2)
|
||||
# - Subsections like "Current list plugins" use ~~~~ (level 4) but should be ^^^ (level 3)
|
||||
|
||||
lines = content.split('\n')
|
||||
fixed_lines = []
|
||||
i = 0
|
||||
|
||||
# Major sections that should be level 2 (---)
|
||||
# Note: "Configuration" and "server" are subsections under "Commands", so they stay level 3
|
||||
major_sections = [
|
||||
'What is APRSD',
|
||||
'APRSD Plugins/Extensions',
|
||||
'List of existing plugins',
|
||||
'List of existing extensions',
|
||||
'APRSD Overview Diagram',
|
||||
'Typical use case',
|
||||
'Installation',
|
||||
'Example usage',
|
||||
'Help',
|
||||
'Commands',
|
||||
'send-message',
|
||||
'Development',
|
||||
'Docker Container',
|
||||
'Running the container',
|
||||
'Activity',
|
||||
]
|
||||
|
||||
while i < len(lines):
|
||||
line = lines[i]
|
||||
|
||||
# Check if this is a heading underline
|
||||
if i > 0 and lines[i - 1].strip() and not lines[i - 1].startswith(' '):
|
||||
# Check what kind of underline this is
|
||||
if line.strip() and all(c == line[0] for c in line.strip()):
|
||||
underline_char = line.strip()[0]
|
||||
heading_text = lines[i - 1].strip()
|
||||
|
||||
# Skip "KM6LYW and WB4BOR" and "Star History" - they're fine as level 2
|
||||
if 'KM6LYW' in heading_text or 'Star History' in heading_text:
|
||||
# The heading text was already added, just add the underline
|
||||
fixed_lines.append(line)
|
||||
i += 1
|
||||
continue
|
||||
|
||||
# Convert level 3 headings (^^^^) to level 2 (---) for major sections
|
||||
if underline_char == '^' and len(line.strip()) >= 3:
|
||||
if any(section in heading_text for section in major_sections):
|
||||
# The heading text should already be the last line, replace underline
|
||||
if fixed_lines and fixed_lines[-1].strip() == heading_text:
|
||||
fixed_lines[-1] = heading_text
|
||||
fixed_lines.append('-' * len(heading_text))
|
||||
i += 1
|
||||
continue
|
||||
|
||||
# Convert level 4 headings (~~~~) to level 3 (^^^) for subsections
|
||||
if underline_char == '~' and len(line.strip()) >= 3:
|
||||
# The heading text should already be the last line, replace underline
|
||||
if fixed_lines and fixed_lines[-1].strip() == heading_text:
|
||||
fixed_lines[-1] = heading_text
|
||||
fixed_lines.append('^' * len(heading_text))
|
||||
i += 1
|
||||
continue
|
||||
|
||||
fixed_lines.append(line)
|
||||
i += 1
|
||||
|
||||
# Remove duplicate consecutive heading lines
|
||||
cleaned_lines = []
|
||||
for i, line in enumerate(fixed_lines):
|
||||
# Skip duplicate heading text lines (consecutive identical non-empty lines)
|
||||
if (
|
||||
i > 0
|
||||
and line.strip()
|
||||
and fixed_lines[i - 1].strip() == line.strip()
|
||||
and not line.strip().startswith('..')
|
||||
and not any(char in line for char in ['=', '-', '^', '~'])
|
||||
and len(line.strip()) > 0
|
||||
):
|
||||
continue
|
||||
cleaned_lines.append(line)
|
||||
|
||||
file_path.write_text('\n'.join(cleaned_lines), encoding='utf-8')
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""Main entry point."""
|
||||
docs_dir = Path(__file__).resolve().parent
|
||||
readme_rst = docs_dir / 'source' / 'readme.rst'
|
||||
|
||||
if not readme_rst.exists():
|
||||
print(f'Warning: {readme_rst} does not exist')
|
||||
return
|
||||
|
||||
fix_readme_rst(readme_rst)
|
||||
print(f'Fixed {readme_rst}')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
BIN
docs/images/aprsd_logo.png
Normal file
BIN
docs/images/aprsd_logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 99 KiB |
138
docs/listen.rst
138
docs/listen.rst
@ -1,138 +0,0 @@
|
||||
APRSD listen
|
||||
============
|
||||
|
||||
Running the APRSD listen command
|
||||
---------------------------------
|
||||
|
||||
The ``aprsd listen`` command allows you to listen to packets on the APRS-IS Network based on a FILTER.
|
||||
This is useful for monitoring specific APRS traffic without running the full server.
|
||||
|
||||
Once APRSD is :doc:`installed <install>` and :doc:`configured <configure>`, the listen command can be started by running:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen [FILTER]
|
||||
|
||||
The FILTER parameter is optional and follows the APRS-IS filter format. For example, ``m/300`` filters for
|
||||
messages within 300 miles of your configured location.
|
||||
|
||||
Example usage
|
||||
-------------
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
❯ aprsd listen --loglevel DEBUG m/300
|
||||
2025-12-10 14:32:33.813 | MainThread | INFO | Python version: 3.10.14 (main, Aug 14 2024, 05:14:46) [Clang 18.1.8 ] | aprsd.cmds.listen:listen:224
|
||||
2025-12-10 14:32:33.813 | MainThread | INFO | APRSD Listen Started version: 4.2.5.dev8+g9c0695794 | aprsd.cmds.listen:listen:225
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | ******************************************************************************** | oslo_config.cfg:log_opt_values:2804
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | Configuration options gathered from: | oslo_config.cfg:log_opt_values:2805
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | command line args: [] | oslo_config.cfg:log_opt_values:2806
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | config files: ['/Users/I530566/.config/aprsd/aprsd.conf'] | oslo_config.cfg:log_opt_values:2807
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | ================================================================================ | oslo_config.cfg:log_opt_values:2809
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | ack_rate_limit_period = 1 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | beacon_interval = 60 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | beacon_symbol = / | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | callsign = WB4BOR-1 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | config_dir = [] | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | config_file = ['/Users/I530566/.config/aprsd/aprsd.conf'] | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | config_source = [] | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | default_ack_send_count = 3 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | default_packet_send_count = 3 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | enable_beacon = True | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | enable_packet_logging = True | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.841 | MainThread | DEBUG | enable_save = True | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | enable_seen_list = True | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | enable_sending_ack_packets = True | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | enabled_plugins = ['aprsd.plugins.weather.AVWXWeatherPlugin'] | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | is_digipi = False | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | latitude = 37.3443862 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | load_help_plugin = True | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | log_packet_format = compact | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | longitude = -78.850000 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | msg_rate_limit_period = 2 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | packet_dupe_timeout = 300 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | packet_list_maxlen = 5000 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | packet_list_stats_maxlen = 20 | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | save_location = /Users/I530566/.config/aprsd/ | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | shell_completion = None | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | trace_enabled = False | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | units = imperial | oslo_config.cfg:log_opt_values:2817
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | logging.enable_color = True | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | logging.enable_console_stdout = True | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | logging.log_level = INFO | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | logging.logfile = /tmp/aprsd.log | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | logging.logformat = <green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <yellow>{thread.name: <18}</yellow> | <level>{level: <8}</level> | <level>{message}</level> | <cyan>{name}</cyan>:<cyan>{function:}</cyan>:<magenta>{line:}</magenta> | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | watch_list.alert_callsign = WB4BOR-1 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | watch_list.alert_time_seconds = 3600 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | watch_list.callsigns = ['APPOMX', 'REPEAT', 'KM6LYW', 'WB4BOR', 'M0IAX', 'VE3SCN', 'WA4RTS-5', 'KC9BUH', 'W4SOU-7', 'KD9KAF-7', 'NN4RB-9', 'KN4MLN-9', 'KK4WZS-8', 'K2VIZ-1', 'KE3XE-9', 'WB2UTI-9', 'KO4ARL-7', 'LMS6CAE42', 'WDJ6895', 'PHISVR', 'F1BIS-9', 'M7APR-9', 'Y09INA-5', 'M0PLT-7', 'M0GLJ-14', 'MW6JUY-10', 'M0XZS', 'M0HPP-8', 'ON2BBW-8'] | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | watch_list.enabled = True | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | watch_list.packet_keep_count = 10 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | aprs_registry.description = None | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | aprs_registry.enabled = False | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.842 | MainThread | DEBUG | aprs_registry.frequency_seconds = 3600 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | aprs_registry.registry_url = https://aprs.hemna.com/api/v1/registry | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | aprs_registry.service_website = None | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | aprs_network.enabled = True | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | aprs_network.host = 155.138.131.1 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | aprs_network.login = WB4BOR-1 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | aprs_network.password = **** | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | aprs_network.port = 14580 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | kiss_serial.baudrate = 9600 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | kiss_serial.device = None | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | kiss_serial.enabled = False | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | kiss_serial.path = ['WIDE1-1', 'WIDE2-1'] | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | kiss_tcp.enabled = False | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | kiss_tcp.host = None | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | kiss_tcp.path = ['WIDE1-1', 'WIDE2-1'] | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | kiss_tcp.port = 8001 | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | fake_client.enabled = False | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | aprs_fi.apiKey = 152327.lds79D1bgvlbd | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | owm_weather_plugin.apiKey = e26b403324563f24a290fa1d06459bae | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | avwx_plugin.apiKey = Foo | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | avwx_plugin.base_url = https://avwx.rest | oslo_config.cfg:log_opt_values:2824
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | ******************************************************************************** | oslo_config.cfg:log_opt_values:2828
|
||||
2025-12-10 14:32:33.843 | MainThread | DEBUG | Loading saved MsgTrack object. | aprsd.cmds.listen:listen:232
|
||||
2025-12-10 14:32:33.843 | MainThread | INFO | Creating aprslib client(155.138.131.1:14580) and logging in WB4BOR-1. try #1 | aprsd.client.drivers.aprsis:setup_connection:103
|
||||
2025-12-10 14:32:33.843 | MainThread | INFO | Attempting connection to 155.138.131.1:14580 | aprsd.client.drivers.lib.aprslib:_connect:69
|
||||
2025-12-10 14:32:33.869 | MainThread | INFO | Connected to ('155.138.131.1', 14580) | aprsd.client.drivers.lib.aprslib:_connect:78
|
||||
2025-12-10 14:32:33.900 | MainThread | DEBUG | Banner: # aprsc 2.1.19-g730c5c0 | aprsd.client.drivers.lib.aprslib:_connect:96
|
||||
2025-12-10 14:32:33.900 | MainThread | DEBUG | Sending login information | aprsd.client.drivers.lib.aprslib:_send_login:180
|
||||
2025-12-10 14:32:33.924 | MainThread | DEBUG | Server: '# logresp WB4BOR-1 verified, server T2CAEAST' | aprsd.client.drivers.lib.aprslib:_send_login:190
|
||||
2025-12-10 14:32:33.924 | MainThread | INFO | Login successful | aprsd.client.drivers.lib.aprslib:_send_login:212
|
||||
2025-12-10 14:32:33.924 | MainThread | INFO | Connected to T2CAEAST | aprsd.client.drivers.lib.aprslib:_send_login:214
|
||||
2025-12-10 14:32:33.924 | MainThread | INFO | Creating client connection | aprsd.cmds.listen:listen:242
|
||||
2025-12-10 14:32:33.924 | MainThread | INFO | <aprsd.client.client.APRSDClient object at 0x10bd9bfa0> | aprsd.cmds.listen:listen:244
|
||||
2025-12-10 14:32:33.924 | MainThread | DEBUG | Filter messages on aprsis server by '('m/300',)' | aprsd.cmds.listen:listen:252
|
||||
2025-12-10 14:32:33.924 | MainThread | INFO | Setting filter to: ('m/300',) | aprslib.inet:set_filter:83
|
||||
2025-12-10 14:32:33.925 | MainThread | INFO | No packet filtering enabled. | aprsd.cmds.listen:listen:268
|
||||
2025-12-10 14:32:33.925 | MainThread | WARNING | Not Loading any plugins use --load-plugins to load what's defined in the config file. | aprsd.cmds.listen:listen:282
|
||||
2025-12-10 14:32:33.925 | StatsStore | DEBUG | Starting | aprsd.threads.aprsd:run:64
|
||||
2025-12-10 14:32:33.925 | MainThread | DEBUG | Start APRSDRxThread | aprsd.cmds.listen:listen:294
|
||||
2025-12-10 14:32:33.926 | RX_PKT | DEBUG | Starting | aprsd.threads.aprsd:run:64
|
||||
2025-12-10 14:32:33.926 | MainThread | DEBUG | Create APRSDListenProcessThread | aprsd.cmds.listen:listen:298
|
||||
2025-12-10 14:32:33.926 | MainThread | DEBUG | Start APRSDListenProcessThread | aprsd.cmds.listen:listen:306
|
||||
2025-12-10 14:32:33.926 | ListenProcThread | DEBUG | Starting | aprsd.threads.aprsd:run:64
|
||||
2025-12-10 14:32:33.926 | KeepAlive | DEBUG | Starting | aprsd.threads.aprsd:run:64
|
||||
2025-12-10 14:32:33.926 | MainThread | DEBUG | keepalive Join | aprsd.cmds.listen:listen:313
|
||||
2025-12-10 14:32:34.927 | RX_PKT | DEBUG | Server: # filter m/300 active | aprsd.client.drivers.lib.aprslib:consumer:255
|
||||
2025-12-10 14:32:34.942 | RX_PKT | INFO | RX(1)↓ MicEPacket:None WX4EMC-1 →WIDE1-1→WIDE2-2→qAR→W4VA-13→ S8QQ8S : Lat:38.197 Lon:-77.561 101 mbits : Northeast@91.78miles | aprsd.packets.log:log:170
|
||||
2025-12-10 14:32:34.965 | RX_PKT | INFO | RX(2)↓ BeaconPacket:None W4MUP-10 →TCPIP*→qAS→W4MUP→ APMI06 : Lat:36.208 Lon:-80.269 Igate and Digi U=13.3V : Southwest@111.08miles | aprsd.packets.log:log:170
|
||||
2025-12-10 14:32:35.996 | RX_PKT | INFO | RX(3)↓ WeatherPacket:None W4MLN-1 →TCPIP*→qAC→T2CAEAST→ APN000 : Temp 009F Humidity 49% Wind 007MPH@261 Pressure 999.7mb Rain 0.01in/24hr : West-Southwest@157.78miles | aprsd.packets.log:log:170
|
||||
2025-12-10 14:32:37.669 | RX_PKT | INFO | RX(4)↓ BeaconPacket:None W4GER →TCPIP*→qAC→T2SYDNEY→ APOSB4 : Lat:38.735 Lon:-77.279 SharkRF openSPOT4 : Northeast@128.60miles | aprsd.packets.log:log:170
|
||||
2025-12-10 14:32:37.943 | RX_PKT | INFO | RX(5)↓ BeaconPacket:None NM5ER-10 →TCPIP*→qAC→T2SYDNEY→ APLRG1 : Lat:36.440 Lon:-81.140 LoRa APRS : West-Southwest@141.12miles | aprsd.packets.log:log:170
|
||||
|
||||
The listen command connects to the APRS-IS network and displays packets matching the specified filter.
|
||||
In the example above, packets within 300 miles are displayed, showing various packet types including MicEPacket,
|
||||
BeaconPacket, and WeatherPacket.
|
||||
|
||||
Key differences from the server command
|
||||
----------------------------------------
|
||||
|
||||
Unlike the ``aprsd server`` command, the listen command:
|
||||
|
||||
- Does not load plugins by default (use ``--load-plugins`` to enable them)
|
||||
- Does not respond to messages
|
||||
- Is designed for monitoring and logging APRS traffic
|
||||
- Supports APRS-IS filter syntax for targeted packet monitoring
|
||||
|
||||
.. include:: links.rst
|
||||
446
docs/readme.rst
446
docs/readme.rst
@ -1,446 +0,0 @@
|
||||
===============================================
|
||||
APRSD - Ham radio APRS-IS Message plugin server
|
||||
===============================================
|
||||
|
||||
KM6LYW and WB4BOR
|
||||
____________________
|
||||
|
||||
|pypi| |pytest| |versions| |slack| |issues| |commit| |imports| |down|
|
||||
|
||||
|
||||
`APRSD <http://github.com/craigerl/aprsd>`_ is a Ham radio `APRS <http://aprs.org>`_ message command gateway built on python.
|
||||
|
||||
|
||||
What is APRSD
|
||||
=============
|
||||
APRSD is a python application for interacting with the APRS network and providing
|
||||
APRS services for HAM radio operators.
|
||||
|
||||
APRSD currently has 4 main commands to use.
|
||||
* server - Connect to APRS and listen/respond to APRS messages
|
||||
* webchat - web based chat program over APRS
|
||||
* send-message - Send a message to a callsign via APRS_IS.
|
||||
* listen - Listen to packets on the APRS-IS Network based on FILTER.
|
||||
|
||||
Each of those commands can connect to the APRS-IS network if internet connectivity
|
||||
is available. If internet is not available, then APRS can be configured to talk
|
||||
to a TCP KISS TNC for radio connectivity.
|
||||
|
||||
Please `read the docs`_ to learn more!
|
||||
|
||||
APRSD Overview Diagram
|
||||
======================
|
||||
|
||||
.. image:: https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true
|
||||
|
||||
Typical use case
|
||||
================
|
||||
|
||||
APRSD's typical use case is that of providing an APRS wide service to all HAM
|
||||
radio operators. For example the callsign 'REPEAT' on the APRS network is actually
|
||||
an instance of APRSD that can provide a list of HAM repeaters in the area of the
|
||||
callsign that sent the message.
|
||||
|
||||
|
||||
Ham radio operator using an APRS enabled HAM radio sends a message to check
|
||||
the weather. An APRS message is sent, and then picked up by APRSD. The
|
||||
APRS packet is decoded, and the message is sent through the list of plugins
|
||||
for processing. For example, the WeatherPlugin picks up the message, fetches the weather
|
||||
for the area around the user who sent the request, and then responds with
|
||||
the weather conditions in that area. Also includes a watch list of HAM
|
||||
callsigns to look out for. The watch list can notify you when a HAM callsign
|
||||
in the list is seen and now available to message on the APRS network.
|
||||
|
||||
|
||||
|
||||
Installation
|
||||
=============
|
||||
|
||||
To install ``aprsd``, use Pip:
|
||||
|
||||
``pip install aprsd``
|
||||
|
||||
Example usage
|
||||
==============
|
||||
|
||||
``aprsd -h``
|
||||
|
||||
Help
|
||||
====
|
||||
::
|
||||
|
||||
|
||||
└─> aprsd -h
|
||||
Usage: aprsd [OPTIONS] COMMAND [ARGS]...
|
||||
|
||||
Options:
|
||||
--version Show the version and exit.
|
||||
-h, --help Show this message and exit.
|
||||
|
||||
Commands:
|
||||
check-version Check this version against the latest in pypi.org.
|
||||
completion Show the shell completion code
|
||||
dev Development type subcommands
|
||||
fetch-stats Fetch stats from a APRSD admin web interface.
|
||||
healthcheck Check the health of the running aprsd server.
|
||||
list-extensions List the built in plugins available to APRSD.
|
||||
list-plugins List the built in plugins available to APRSD.
|
||||
listen Listen to packets on the APRS-IS Network based on FILTER.
|
||||
sample-config Generate a sample Config file from aprsd and all...
|
||||
send-message Send a message to a callsign via APRS_IS.
|
||||
server Start the aprsd server gateway process.
|
||||
version Show the APRSD version.
|
||||
webchat Web based HAM Radio chat program!
|
||||
|
||||
|
||||
Commands
|
||||
========
|
||||
|
||||
Configuration
|
||||
=============
|
||||
This command outputs a sample config yml formatted block that you can edit
|
||||
and use to pass in to ``aprsd`` with ``-c``. By default aprsd looks in ``~/.config/aprsd/aprsd.yml``
|
||||
|
||||
``aprsd sample-config``
|
||||
|
||||
::
|
||||
|
||||
└─> aprsd sample-config
|
||||
...
|
||||
|
||||
server
|
||||
======
|
||||
|
||||
This is the main server command that will listen to APRS-IS servers and
|
||||
look for incomming commands to the callsign configured in the config file
|
||||
|
||||
::
|
||||
|
||||
└─[$] > aprsd server --help
|
||||
Usage: aprsd server [OPTIONS]
|
||||
|
||||
Start the aprsd server gateway process.
|
||||
|
||||
Options:
|
||||
--loglevel [CRITICAL|ERROR|WARNING|INFO|DEBUG]
|
||||
The log level to use for aprsd.log
|
||||
[default: INFO]
|
||||
-c, --config TEXT The aprsd config file to use for options.
|
||||
[default:
|
||||
/Users/i530566/.config/aprsd/aprsd.yml]
|
||||
--quiet Don't log to stdout
|
||||
-f, --flush Flush out all old aged messages on disk.
|
||||
[default: False]
|
||||
-h, --help Show this message and exit.
|
||||
|
||||
└─> aprsd server
|
||||
Load config
|
||||
12/07/2021 03:16:17 PM MainThread INFO APRSD is up to date server.py:51
|
||||
12/07/2021 03:16:17 PM MainThread INFO APRSD Started version: 2.5.6 server.py:52
|
||||
12/07/2021 03:16:17 PM MainThread INFO Using CONFIG values: server.py:55
|
||||
12/07/2021 03:16:17 PM MainThread INFO ham.callsign = WB4BOR server.py:60
|
||||
12/07/2021 03:16:17 PM MainThread INFO aprs.login = WB4BOR-12 server.py:60
|
||||
12/07/2021 03:16:17 PM MainThread INFO aprs.password = XXXXXXXXXXXXXXXXXXX server.py:58
|
||||
12/07/2021 03:16:17 PM MainThread INFO aprs.host = noam.aprs2.net server.py:60
|
||||
12/07/2021 03:16:17 PM MainThread INFO aprs.port = 14580 server.py:60
|
||||
12/07/2021 03:16:17 PM MainThread INFO aprs.logfile = /tmp/aprsd.log server.py:60
|
||||
|
||||
|
||||
Current list of built-in plugins
|
||||
======================================
|
||||
|
||||
::
|
||||
|
||||
└─> aprsd list-plugins
|
||||
🐍 APRSD Built-in Plugins 🐍
|
||||
┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
||||
┃ Plugin Name ┃ Info ┃ Type ┃ Plugin Path ┃
|
||||
┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
|
||||
│ AVWXWeatherPlugin │ AVWX weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.AVWXWeatherPlugin │
|
||||
│ EmailPlugin │ Send and Receive email │ RegexCommand │ aprsd.plugins.email.EmailPlugin │
|
||||
│ FortunePlugin │ Give me a fortune │ RegexCommand │ aprsd.plugins.fortune.FortunePlugin │
|
||||
│ LocationPlugin │ Where in the world is a CALLSIGN's last GPS beacon? │ RegexCommand │ aprsd.plugins.location.LocationPlugin │
|
||||
│ NotifySeenPlugin │ Notify me when a CALLSIGN is recently seen on APRS-IS │ WatchList │ aprsd.plugins.notify.NotifySeenPlugin │
|
||||
│ OWMWeatherPlugin │ OpenWeatherMap weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.OWMWeatherPlugin │
|
||||
│ PingPlugin │ reply with a Pong! │ RegexCommand │ aprsd.plugins.ping.PingPlugin │
|
||||
│ QueryPlugin │ APRSD Owner command to query messages in the MsgTrack │ RegexCommand │ aprsd.plugins.query.QueryPlugin │
|
||||
│ TimeOWMPlugin │ Current time of GPS beacon's timezone. Uses OpenWeatherMap │ RegexCommand │ aprsd.plugins.time.TimeOWMPlugin │
|
||||
│ TimePlugin │ What is the current local time. │ RegexCommand │ aprsd.plugins.time.TimePlugin │
|
||||
│ USMetarPlugin │ USA only METAR of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.USMetarPlugin │
|
||||
│ USWeatherPlugin │ Provide USA only weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.USWeatherPlugin │
|
||||
│ VersionPlugin │ What is the APRSD Version │ RegexCommand │ aprsd.plugins.version.VersionPlugin │
|
||||
└───────────────────┴────────────────────────────────────────────────────────────┴──────────────┴─────────────────────────────────────────┘
|
||||
|
||||
|
||||
Pypi.org APRSD Installable Plugin Packages
|
||||
|
||||
Install any of the following plugins with 'pip install <Plugin Package Name>'
|
||||
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
|
||||
┃ Plugin Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃
|
||||
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
|
||||
│ 📂 aprsd-stock-plugin │ Ham Radio APRSD Plugin for fetching stock quotes │ 0.1.3 │ Dec 2, 2022 │ No │
|
||||
│ 📂 aprsd-sentry-plugin │ Ham radio APRSD plugin that does.... │ 0.1.2 │ Dec 2, 2022 │ No │
|
||||
│ 📂 aprsd-timeopencage-plugin │ APRSD plugin for fetching time based on GPS location │ 0.1.0 │ Dec 2, 2022 │ No │
|
||||
│ 📂 aprsd-weewx-plugin │ HAM Radio APRSD that reports weather from a weewx weather station. │ 0.1.4 │ Dec 7, 2021 │ Yes │
|
||||
│ 📂 aprsd-repeat-plugins │ APRSD Plugins for the REPEAT service │ 1.0.12 │ Dec 2, 2022 │ No │
|
||||
│ 📂 aprsd-telegram-plugin │ Ham Radio APRS APRSD plugin for Telegram IM service │ 0.1.3 │ Dec 2, 2022 │ No │
|
||||
│ 📂 aprsd-twitter-plugin │ Python APRSD plugin to send tweets │ 0.3.0 │ Dec 7, 2021 │ No │
|
||||
│ 📂 aprsd-slack-plugin │ Amateur radio APRS daemon which listens for messages and responds │ 1.0.5 │ Dec 18, 2022 │ No │
|
||||
└──────────────────────────────┴────────────────────────────────────────────────────────────────────┴─────────┴──────────────┴────────────┘
|
||||
|
||||
|
||||
🐍 APRSD Installed 3rd party Plugins 🐍
|
||||
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
||||
┃ Package Name ┃ Plugin Name ┃ Version ┃ Type ┃ Plugin Path ┃
|
||||
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
|
||||
│ aprsd-weewx-plugin │ WeewxMQTTPlugin │ 1.0 │ RegexCommand │ aprsd_weewx_plugin.weewx.WeewxMQTTPlugin │
|
||||
└────────────────────┴─────────────────┴─────────┴──────────────┴──────────────────────────────────────────┘
|
||||
|
||||
|
||||
|
||||
send-message
|
||||
============
|
||||
|
||||
This command is typically used for development to send another aprsd instance
|
||||
test messages
|
||||
|
||||
::
|
||||
|
||||
└─[$] > aprsd send-message -h
|
||||
Usage: aprsd send-message [OPTIONS] TOCALLSIGN COMMAND...
|
||||
|
||||
Send a message to a callsign via APRS_IS.
|
||||
|
||||
Options:
|
||||
--loglevel [CRITICAL|ERROR|WARNING|INFO|DEBUG]
|
||||
The log level to use for aprsd.log
|
||||
[default: INFO]
|
||||
-c, --config TEXT The aprsd config file to use for options.
|
||||
[default:
|
||||
/Users/i530566/.config/aprsd/aprsd.yml]
|
||||
--quiet Don't log to stdout
|
||||
--aprs-login TEXT What callsign to send the message from.
|
||||
[env var: APRS_LOGIN]
|
||||
--aprs-password TEXT the APRS-IS password for APRS_LOGIN [env
|
||||
var: APRS_PASSWORD]
|
||||
-n, --no-ack Don't wait for an ack, just sent it to APRS-
|
||||
IS and bail. [default: False]
|
||||
-w, --wait-response Wait for a response to the message?
|
||||
[default: False]
|
||||
--raw TEXT Send a raw message. Implies --no-ack
|
||||
-h, --help Show this message and exit.
|
||||
|
||||
|
||||
SEND EMAIL (radio to smtp server)
|
||||
=================================
|
||||
|
||||
::
|
||||
|
||||
Received message______________
|
||||
Raw : KM6XXX>APY400,WIDE1-1,qAO,KM6XXX-1::KM6XXX-9 :-user@host.com test new shortcuts global, radio to pc{29
|
||||
From : KM6XXX
|
||||
Message : -user@host.com test new shortcuts global, radio to pc
|
||||
Msg number : 29
|
||||
|
||||
Sending Email_________________
|
||||
To : user@host.com
|
||||
Subject : KM6XXX
|
||||
Body : test new shortcuts global, radio to pc
|
||||
|
||||
Sending ack __________________ Tx(3)
|
||||
Raw : KM6XXX-9>APRS::KM6XXX :ack29
|
||||
To : KM6XXX
|
||||
Ack number : 29
|
||||
|
||||
|
||||
RECEIVE EMAIL (imap server to radio)
|
||||
====================================
|
||||
|
||||
::
|
||||
|
||||
Sending message_______________ 6(Tx3)
|
||||
Raw : KM6XXX-9>APRS::KM6XXX :-somebody@gmail.com email from internet to radio{6
|
||||
To : KM6XXX
|
||||
Message : -somebody@gmail.com email from internet to radio
|
||||
|
||||
Received message______________
|
||||
Raw : KM6XXX>APY400,WIDE1-1,qAO,KM6XXX-1::KM6XXX-9 :ack6
|
||||
From : KM6XXX
|
||||
Message : ack6
|
||||
Msg number : 0
|
||||
|
||||
|
||||
LOCATION
|
||||
========
|
||||
|
||||
::
|
||||
|
||||
Received Message _______________
|
||||
Raw : KM6XXX-6>APRS,TCPIP*,qAC,T2CAEAST::KM6XXX-14:location{2
|
||||
From : KM6XXX-6
|
||||
Message : location
|
||||
Msg number : 2
|
||||
Received Message _______________ Complete
|
||||
|
||||
Sending Message _______________
|
||||
Raw : KM6XXX-14>APRS::KM6XXX-6 :KM6XXX-6: 8 Miles E Auburn CA 0' 0,-120.93584 1873.7h ago{2
|
||||
To : KM6XXX-6
|
||||
Message : KM6XXX-6: 8 Miles E Auburn CA 0' 0,-120.93584 1873.7h ago
|
||||
Msg number : 2
|
||||
Sending Message _______________ Complete
|
||||
|
||||
Sending ack _______________
|
||||
Raw : KM6XXX-14>APRS::KM6XXX-6 :ack2
|
||||
To : KM6XXX-6
|
||||
Ack : 2
|
||||
Sending ack _______________ Complete
|
||||
|
||||
AND... ping, fortune, time.....
|
||||
|
||||
|
||||
Web Admin Interface
|
||||
===================
|
||||
To start the web admin interface, You have to install gunicorn in your virtualenv that already has aprsd installed.
|
||||
|
||||
::
|
||||
|
||||
source <path to APRSD's virtualenv>/bin/activate
|
||||
pip install gunicorn
|
||||
gunicorn --bind 0.0.0.0:8080 "aprsd.wsgi:app"
|
||||
|
||||
The web admin interface will be running on port 8080 on the local machine. http://localhost:8080
|
||||
|
||||
|
||||
|
||||
Development
|
||||
===========
|
||||
|
||||
* ``git clone git@github.com:craigerl/aprsd.git``
|
||||
* ``cd aprsd``
|
||||
* ``make``
|
||||
|
||||
Workflow
|
||||
========
|
||||
|
||||
While working aprsd, The workflow is as follows:
|
||||
|
||||
* Checkout a new branch to work on by running
|
||||
|
||||
``git checkout -b mybranch``
|
||||
|
||||
* Make your changes to the code
|
||||
* Run Tox with the following options:
|
||||
|
||||
- ``tox -epep8``
|
||||
- ``tox -efmt``
|
||||
- ``tox -p``
|
||||
|
||||
* Commit your changes. This will run the pre-commit hooks which does checks too
|
||||
|
||||
``git commit``
|
||||
|
||||
* Once you are done with all of your commits, then push up the branch to
|
||||
github with:
|
||||
|
||||
``git push -u origin mybranch``
|
||||
|
||||
* Create a pull request from your branch so github tests can run and we can do
|
||||
a code review.
|
||||
|
||||
|
||||
Release
|
||||
=======
|
||||
|
||||
To do release to pypi:
|
||||
|
||||
* Tag release with:
|
||||
|
||||
``git tag -v1.XX -m "New release"``
|
||||
|
||||
* Push release tag:
|
||||
|
||||
``git push origin master --tags``
|
||||
|
||||
* Do a test build and verify build is valid by running:
|
||||
|
||||
``make build``
|
||||
|
||||
* Once twine is happy, upload release to pypi:
|
||||
|
||||
``make upload``
|
||||
|
||||
|
||||
Docker Container
|
||||
================
|
||||
|
||||
Building
|
||||
========
|
||||
|
||||
There are 2 versions of the container Dockerfile that can be used.
|
||||
The main Dockerfile, which is for building the official release container
|
||||
based off of the pip install version of aprsd and the Dockerfile-dev,
|
||||
which is used for building a container based off of a git branch of
|
||||
the repo.
|
||||
|
||||
Official Build
|
||||
==============
|
||||
|
||||
``docker build -t hemna6969/aprsd:latest .``
|
||||
|
||||
Development Build
|
||||
=================
|
||||
|
||||
``docker build -t hemna6969/aprsd:latest -f Dockerfile-dev .``
|
||||
|
||||
|
||||
Running the container
|
||||
=====================
|
||||
|
||||
There is a ``docker-compose.yml`` file in the ``docker/`` directory
|
||||
that can be used to run your container. To provide the container
|
||||
an ``aprsd.conf`` configuration file, change your
|
||||
``docker-compose.yml`` as shown below:
|
||||
|
||||
::
|
||||
|
||||
volumes:
|
||||
- $HOME/.config/aprsd:/config
|
||||
|
||||
To install plugins at container start time, pass in a list of
|
||||
comma-separated list of plugins on PyPI using the ``APRSD_PLUGINS``
|
||||
environment variable in the ``docker-compose.yml`` file. Note that
|
||||
version constraints may also be provided. For example:
|
||||
|
||||
::
|
||||
|
||||
environment:
|
||||
- APRSD_PLUGINS=aprsd-slack-plugin>=1.0.2,aprsd-twitter-plugin
|
||||
|
||||
|
||||
.. badges
|
||||
|
||||
.. |pypi| image:: https://badge.fury.io/py/aprsd.svg
|
||||
:target: https://badge.fury.io/py/aprsd
|
||||
|
||||
.. |pytest| image:: https://github.com/craigerl/aprsd/workflows/python/badge.svg
|
||||
:target: https://github.com/craigerl/aprsd/actions
|
||||
|
||||
.. |versions| image:: https://img.shields.io/pypi/pyversions/aprsd.svg
|
||||
:target: https://pypi.org/pypi/aprsd
|
||||
|
||||
.. |slack| image:: https://img.shields.io/badge/slack-@hemna/aprsd-blue.svg?logo=slack
|
||||
:target: https://hemna.slack.com/app_redirect?channel=C01KQSCP5RP
|
||||
|
||||
.. |imports| image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336
|
||||
:target: https://timothycrosley.github.io/isort/
|
||||
|
||||
.. |issues| image:: https://img.shields.io/github/issues/craigerl/aprsd
|
||||
|
||||
.. |commit| image:: https://img.shields.io/github/last-commit/craigerl/aprsd
|
||||
|
||||
.. |down| image:: https://static.pepy.tech/personalized-badge/aprsd?period=month&units=international_system&left_color=black&right_color=orange&left_text=Downloads
|
||||
:target: https://pepy.tech/project/aprsd
|
||||
|
||||
.. links
|
||||
.. _read the docs:
|
||||
https://aprsd.readthedocs.io
|
||||
6
docs/requirements.txt
Normal file
6
docs/requirements.txt
Normal file
@ -0,0 +1,6 @@
|
||||
alabaster==1.0.0
|
||||
#Sphinx==8.2.3
|
||||
Sphinx
|
||||
sphinx-rtd-theme==3.0.2
|
||||
sphinx-copybutton==0.5.2
|
||||
m2r2
|
||||
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
@ -9,13 +9,13 @@ aprsd.client.drivers.lib.aprslib module
|
||||
|
||||
.. automodule:: aprsd.client.drivers.lib.aprslib
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.client.drivers.lib
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -17,53 +17,53 @@ aprsd.client.drivers.aprsis module
|
||||
|
||||
.. automodule:: aprsd.client.drivers.aprsis
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.client.drivers.fake module
|
||||
--------------------------------
|
||||
|
||||
.. automodule:: aprsd.client.drivers.fake
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.client.drivers.kiss\_common module
|
||||
----------------------------------------
|
||||
|
||||
.. automodule:: aprsd.client.drivers.kiss_common
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.client.drivers.registry module
|
||||
------------------------------------
|
||||
|
||||
.. automodule:: aprsd.client.drivers.registry
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.client.drivers.serialkiss module
|
||||
--------------------------------------
|
||||
|
||||
.. automodule:: aprsd.client.drivers.serialkiss
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.client.drivers.tcpkiss module
|
||||
-----------------------------------
|
||||
|
||||
.. automodule:: aprsd.client.drivers.tcpkiss
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.client.drivers
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -17,21 +17,21 @@ aprsd.client.client module
|
||||
|
||||
.. automodule:: aprsd.client.client
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.client.stats module
|
||||
-------------------------
|
||||
|
||||
.. automodule:: aprsd.client.stats
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.client
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -9,69 +9,69 @@ aprsd.cmds.completion module
|
||||
|
||||
.. automodule:: aprsd.cmds.completion
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.cmds.dev module
|
||||
---------------------
|
||||
|
||||
.. automodule:: aprsd.cmds.dev
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.cmds.fetch\_stats module
|
||||
------------------------------
|
||||
|
||||
.. automodule:: aprsd.cmds.fetch_stats
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.cmds.healthcheck module
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: aprsd.cmds.healthcheck
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.cmds.list\_plugins module
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: aprsd.cmds.list_plugins
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.cmds.listen module
|
||||
------------------------
|
||||
|
||||
.. automodule:: aprsd.cmds.listen
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.cmds.send\_message module
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: aprsd.cmds.send_message
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.cmds.server module
|
||||
------------------------
|
||||
|
||||
.. automodule:: aprsd.cmds.server
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.cmds
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -9,45 +9,45 @@ aprsd.conf.client module
|
||||
|
||||
.. automodule:: aprsd.conf.client
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.conf.common module
|
||||
------------------------
|
||||
|
||||
.. automodule:: aprsd.conf.common
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.conf.log module
|
||||
---------------------
|
||||
|
||||
.. automodule:: aprsd.conf.log
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.conf.opts module
|
||||
----------------------
|
||||
|
||||
.. automodule:: aprsd.conf.opts
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.conf.plugin\_common module
|
||||
--------------------------------
|
||||
|
||||
.. automodule:: aprsd.conf.plugin_common
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.conf
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -9,13 +9,13 @@ aprsd.log.log module
|
||||
|
||||
.. automodule:: aprsd.log.log
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.log
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -9,21 +9,21 @@ aprsd.packets.filters.dupe\_filter module
|
||||
|
||||
.. automodule:: aprsd.packets.filters.dupe_filter
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.packets.filters.packet\_type module
|
||||
-----------------------------------------
|
||||
|
||||
.. automodule:: aprsd.packets.filters.packet_type
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.packets.filters
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -17,69 +17,69 @@ aprsd.packets.collector module
|
||||
|
||||
.. automodule:: aprsd.packets.collector
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.packets.core module
|
||||
-------------------------
|
||||
|
||||
.. automodule:: aprsd.packets.core
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.packets.filter module
|
||||
---------------------------
|
||||
|
||||
.. automodule:: aprsd.packets.filter
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.packets.log module
|
||||
------------------------
|
||||
|
||||
.. automodule:: aprsd.packets.log
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.packets.packet\_list module
|
||||
---------------------------------
|
||||
|
||||
.. automodule:: aprsd.packets.packet_list
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.packets.seen\_list module
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: aprsd.packets.seen_list
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.packets.tracker module
|
||||
----------------------------
|
||||
|
||||
.. automodule:: aprsd.packets.tracker
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.packets.watch\_list module
|
||||
--------------------------------
|
||||
|
||||
.. automodule:: aprsd.packets.watch_list
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.packets
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -9,53 +9,53 @@ aprsd.plugins.fortune module
|
||||
|
||||
.. automodule:: aprsd.plugins.fortune
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.plugins.notify module
|
||||
---------------------------
|
||||
|
||||
.. automodule:: aprsd.plugins.notify
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.plugins.ping module
|
||||
-------------------------
|
||||
|
||||
.. automodule:: aprsd.plugins.ping
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.plugins.time module
|
||||
-------------------------
|
||||
|
||||
.. automodule:: aprsd.plugins.time
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.plugins.version module
|
||||
----------------------------
|
||||
|
||||
.. automodule:: aprsd.plugins.version
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.plugins.weather module
|
||||
----------------------------
|
||||
|
||||
.. automodule:: aprsd.plugins.weather
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.plugins
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -25,45 +25,45 @@ aprsd.cli\_helper module
|
||||
|
||||
.. automodule:: aprsd.cli_helper
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.exception module
|
||||
----------------------
|
||||
|
||||
.. automodule:: aprsd.exception
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.main module
|
||||
-----------------
|
||||
|
||||
.. automodule:: aprsd.main
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.plugin module
|
||||
-------------------
|
||||
|
||||
.. automodule:: aprsd.plugin
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.plugin\_utils module
|
||||
--------------------------
|
||||
|
||||
.. automodule:: aprsd.plugin_utils
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -9,21 +9,21 @@ aprsd.stats.app module
|
||||
|
||||
.. automodule:: aprsd.stats.app
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.stats.collector module
|
||||
----------------------------
|
||||
|
||||
.. automodule:: aprsd.stats.collector
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.stats
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -9,61 +9,61 @@ aprsd.threads.aprsd module
|
||||
|
||||
.. automodule:: aprsd.threads.aprsd
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.threads.keepalive module
|
||||
------------------------------
|
||||
|
||||
.. automodule:: aprsd.threads.keepalive
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.threads.registry module
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: aprsd.threads.registry
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.threads.rx module
|
||||
-----------------------
|
||||
|
||||
.. automodule:: aprsd.threads.rx
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.threads.service module
|
||||
----------------------------
|
||||
|
||||
.. automodule:: aprsd.threads.service
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.threads.stats module
|
||||
--------------------------
|
||||
|
||||
.. automodule:: aprsd.threads.stats
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.threads.tx module
|
||||
-----------------------
|
||||
|
||||
.. automodule:: aprsd.threads.tx
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.threads
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -9,69 +9,69 @@ aprsd.utils.counter module
|
||||
|
||||
.. automodule:: aprsd.utils.counter
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.utils.fuzzyclock module
|
||||
-----------------------------
|
||||
|
||||
.. automodule:: aprsd.utils.fuzzyclock
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.utils.json module
|
||||
-----------------------
|
||||
|
||||
.. automodule:: aprsd.utils.json
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.utils.keepalive\_collector module
|
||||
---------------------------------------
|
||||
|
||||
.. automodule:: aprsd.utils.keepalive_collector
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.utils.objectstore module
|
||||
------------------------------
|
||||
|
||||
.. automodule:: aprsd.utils.objectstore
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.utils.package module
|
||||
--------------------------
|
||||
|
||||
.. automodule:: aprsd.utils.package
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.utils.ring\_buffer module
|
||||
-------------------------------
|
||||
|
||||
.. automodule:: aprsd.utils.ring_buffer
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
aprsd.utils.trace module
|
||||
------------------------
|
||||
|
||||
.. automodule:: aprsd.utils.trace
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
|
||||
Module contents
|
||||
---------------
|
||||
|
||||
.. automodule:: aprsd.utils
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:undoc-members:
|
||||
@ -13,7 +13,7 @@ These plugins respond to APRS messages sent to your APRSD callsign.
|
||||
PingPlugin
|
||||
~~~~~~~~~~
|
||||
|
||||
**Command:** ``ping``, ``p``, or ``p `` (p followed by space)
|
||||
**Command:** ``ping``, ``p``, or ``p`` followed by a space
|
||||
|
||||
**Description:** Responds with "Pong!" and the current time.
|
||||
|
||||
@ -33,7 +33,7 @@ PingPlugin
|
||||
FortunePlugin
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
**Command:** ``fortune``, ``f``, or ``f `` (f followed by space)
|
||||
**Command:** ``fortune``, ``f``, or ``f`` followed by a space
|
||||
|
||||
**Description:** Returns a random fortune cookie message using the system's ``fortune`` command.
|
||||
|
||||
@ -56,7 +56,7 @@ will automatically search common installation paths and disable itself if not fo
|
||||
TimePlugin
|
||||
~~~~~~~~~~
|
||||
|
||||
**Command:** ``time``, ``t``, or ``t `` (t followed by space)
|
||||
**Command:** ``time``, ``t``, or ``t`` followed by a space
|
||||
|
||||
**Description:** Returns the current local time of the APRSD server in a human-readable format
|
||||
with timezone information.
|
||||
@ -77,7 +77,7 @@ with timezone information.
|
||||
TimeOWMPlugin
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
**Command:** ``time``, ``t``, or ``t `` (t followed by space)
|
||||
**Command:** ``time``, ``t``, or ``t`` followed by a space
|
||||
|
||||
**Description:** Returns the current time based on the GPS beacon location of the calling
|
||||
callsign (or optionally a specified callsign). Uses OpenWeatherMap API to determine the
|
||||
@ -106,7 +106,7 @@ timezone for the location.
|
||||
VersionPlugin
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
**Command:** ``version``, ``v``, or ``v `` (v followed by space)
|
||||
**Command:** ``version``, ``v``, or ``v`` followed by a space
|
||||
|
||||
**Description:** Returns the APRSD version number and server uptime.
|
||||
|
||||
@ -155,7 +155,7 @@ for aprs.fi to get the GPS location.
|
||||
USMetarPlugin
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
**Command:** ``metar``, ``m``, ``M``, or ``m `` (m or M at start of message)
|
||||
**Command:** ``metar``, ``m``, ``M``, or ``m`` followed by a space (m or M at start of message)
|
||||
|
||||
**Description:** Provides METAR (Meteorological Aerodrome Report) weather reports for
|
||||
stations within the United States only. Uses the forecast.weather.gov API.
|
||||
@ -214,7 +214,7 @@ direction, and humidity.
|
||||
AVWXWeatherPlugin
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
**Command:** ``metar``, ``m``, ``m `` (m at start of message)
|
||||
**Command:** ``metar``, ``m``, or ``m`` followed by a space (m at start of message)
|
||||
|
||||
**Description:** Provides METAR weather reports using the AVWX API service. Fetches METAR
|
||||
data from the nearest weather station to the GPS beacon location of the calling callsign
|
||||
@ -13,21 +13,21 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
from importlib.metadata import Distribution
|
||||
|
||||
|
||||
sys.path.insert(0, os.path.abspath("../src"))
|
||||
sys.path.insert(0, os.path.abspath('../src'))
|
||||
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = "APRSD"
|
||||
copyright = ""
|
||||
author = "Craig Lamparter"
|
||||
project = 'APRSD'
|
||||
copyright = ''
|
||||
author = 'Walter A. Boring IV'
|
||||
|
||||
# The short X.Y version
|
||||
version = "v1.5.0"
|
||||
# version = "v4.2.5"
|
||||
# The full version, including alpha/beta/rc tags
|
||||
release = ""
|
||||
release = Distribution.from_name('aprsd').version
|
||||
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
@ -40,36 +40,40 @@ release = ""
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
"sphinx.ext.autodoc",
|
||||
"sphinx.ext.doctest",
|
||||
"sphinx.ext.todo",
|
||||
"sphinx.ext.viewcode",
|
||||
"sphinx.ext.napoleon",
|
||||
'sphinx.ext.autodoc',
|
||||
'sphinx.ext.autosectionlabel',
|
||||
'sphinx.ext.doctest',
|
||||
'sphinx.ext.intersphinx',
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.napoleon',
|
||||
'sphinx.ext.viewcode',
|
||||
'sphinx_copybutton',
|
||||
'sphinx_rtd_theme',
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ["_templates"]
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
#
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = ".rst"
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = "index"
|
||||
master_doc = 'index'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = "en"
|
||||
language = 'en'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
|
||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = None
|
||||
@ -80,21 +84,23 @@ pygments_style = None
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = "alabaster"
|
||||
# html_theme = "alabaster"
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
# html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#
|
||||
html_theme_options = {
|
||||
# Override the default alabaster line wrap, which wraps tightly at 940px.
|
||||
"page_width": "auto",
|
||||
}
|
||||
# html_theme_options = {
|
||||
# # Override the default alabaster line wrap, which wraps tightly at 940px.
|
||||
# "page_width": "auto",
|
||||
# }
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ["_static"]
|
||||
html_static_path = ['_static']
|
||||
|
||||
# Custom sidebar templates, must be a dictionary that maps document names
|
||||
# to template names.
|
||||
@ -106,11 +112,17 @@ html_static_path = ["_static"]
|
||||
#
|
||||
# html_sidebars = {}
|
||||
|
||||
intersphninx_mapping = {'python': ('https://docs.python.org/3', None)}
|
||||
autodoc_typehints = 'description'
|
||||
html_css_files = [
|
||||
'https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/fira_code.min.css'
|
||||
]
|
||||
|
||||
|
||||
# -- Options for HTMLHelp output ---------------------------------------------
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = "adoc"
|
||||
htmlhelp_basename = 'adoc'
|
||||
|
||||
|
||||
# -- Options for LaTeX output ------------------------------------------------
|
||||
@ -134,7 +146,7 @@ latex_elements = {
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, "a.tex", "a Documentation", "a", "manual"),
|
||||
(master_doc, 'a.tex', 'a Documentation', 'a', 'manual'),
|
||||
]
|
||||
|
||||
|
||||
@ -142,7 +154,7 @@ latex_documents = [
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [(master_doc, "a", "a Documentation", [author], 1)]
|
||||
man_pages = [(master_doc, 'a', 'a Documentation', [author], 1)]
|
||||
|
||||
|
||||
# -- Options for Texinfo output ----------------------------------------------
|
||||
@ -153,12 +165,12 @@ man_pages = [(master_doc, "a", "a Documentation", [author], 1)]
|
||||
texinfo_documents = [
|
||||
(
|
||||
master_doc,
|
||||
"a",
|
||||
"a Documentation",
|
||||
'a',
|
||||
'a Documentation',
|
||||
author,
|
||||
"a",
|
||||
"One line description of project.",
|
||||
"Miscellaneous",
|
||||
'a',
|
||||
'One line description of project.',
|
||||
'Miscellaneous',
|
||||
),
|
||||
]
|
||||
|
||||
@ -178,11 +190,16 @@ epub_title = project
|
||||
# epub_uid = ''
|
||||
|
||||
# A list of files that should not be packed into the epub file.
|
||||
epub_exclude_files = ["search.html"]
|
||||
epub_exclude_files = ['search.html']
|
||||
|
||||
|
||||
# -- Extension configuration -------------------------------------------------
|
||||
|
||||
# -- Options for autosectionlabel extension ----------------------------------
|
||||
|
||||
# Prefix document path to section labels to avoid duplicate labels
|
||||
autosectionlabel_prefix_document = True
|
||||
|
||||
# -- Options for todo extension ----------------------------------------------
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
@ -154,8 +154,8 @@ command-line interface::
|
||||
# Implementation here
|
||||
pass
|
||||
|
||||
Configuration Options
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
WebChat Configuration Options
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The extension adds configuration options through ``conf/opts.py``::
|
||||
|
||||
@ -186,8 +186,8 @@ The configuration can then be used in the extension code::
|
||||
host = CONF.webchat.host
|
||||
port = CONF.webchat.port
|
||||
|
||||
Project Structure
|
||||
^^^^^^^^^^^^^^^^^
|
||||
WebChat Project Structure
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The webchat extension has the following structure::
|
||||
|
||||
325
docs/source/listen.rst
Normal file
325
docs/source/listen.rst
Normal file
@ -0,0 +1,325 @@
|
||||
APRSD listen
|
||||
============
|
||||
|
||||
Running the APRSD listen command
|
||||
---------------------------------
|
||||
|
||||
The ``aprsd listen`` command allows you to listen to packets on the APRS-IS Network based on a FILTER.
|
||||
This is useful for monitoring specific APRS traffic without running the full server.
|
||||
|
||||
Once APRSD is :doc:`installed <install>` and :doc:`configured <configure>`, the listen command can be started by running:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen [FILTER]
|
||||
|
||||
The FILTER parameter is optional and follows the APRS-IS filter format. For example, ``m/300`` filters for
|
||||
messages within 300 miles of your configured location.
|
||||
|
||||
Example usage
|
||||
-------------
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
❯ aprsd listen m/300
|
||||
2025-12-11 09:44:33.349 | Python version: 3.14.0rc1 free-threading build (main, Aug 8 2025, 16:53:07) [Clang 20.1.4 ]
|
||||
2025-12-11 09:44:33.349 | APRSD Listen Started version: 4.2.5.dev17+g0ef131678.d20251211
|
||||
2025-12-11 09:44:33.365 | Creating aprslib client(155.138.131.1:14580) and logging in WB4BOR-1. try #1
|
||||
2025-12-11 09:44:33.365 | Attempting connection to 155.138.131.1:14580
|
||||
2025-12-11 09:44:33.391 | Connected to ('155.138.131.1', 14580)
|
||||
2025-12-11 09:44:33.469 | Login successful
|
||||
2025-12-11 09:44:33.469 | Connected to T2CAEAST
|
||||
2025-12-11 09:44:33.469 | Creating client connection
|
||||
2025-12-11 09:44:33.469 | <aprsd.client.client.APRSDClient object at 0x57a5c7bc310>
|
||||
2025-12-11 09:44:33.469 | Setting filter to: ('m/300',)
|
||||
2025-12-11 09:44:33.469 | No packet filtering enabled.
|
||||
2025-12-11 09:44:33.469 | Not Loading any plugins use --load-plugins to load what's defined in the config file.
|
||||
2025-12-11 09:44:35.458 | RX(1)↓ BeaconPacket:None KQ4INX-D →TCPIP*→qAC→KQ4INX-DS→ APDG03 : Lat:37.598 Lon:-77.323 70cm MMDVM Voice (DMR) 440.52500MHz +5.0000MHz, APRS for DMRGateway : East-Northeast@85.57miles
|
||||
2025-12-11 09:44:35.472 | RX(2)↓ StatusPacket:None KQ4INX-D →qAS→KQ4INX→ APDG03 : Powered by WPSD (https://wpsd.radio)
|
||||
2025-12-11 09:44:36.599 | RX(3)↓ BeaconPacket:None WX4EMC-1 →qAR→W4KEL-12→ ID : Lat:0.000 Lon:0.000 None : East@5607.38miles
|
||||
2025-12-11 09:44:38.306 | RX(4)↓ BeaconPacket:None KC4JGC-10 →TCPIP*→qAC→T2BIO→ APDR16 : Lat:38.043 Lon:-78.722 : North@48.78miles
|
||||
2025-12-11 09:44:39.472 | RX(5)↓ WeatherPacket:None K9MJM-1 →TCPIP*→qAC→T2SYDNEY→ SKY : Temp -04F Humidity 92% Wind 000MPH@96 Pressure 1013.3mb Rain 0.0in/24hr : West-Southwest@175.80miles
|
||||
2025-12-11 09:44:39.524 | RX(6)↓ BeaconPacket:None KA6LOW →TCPIP*→qAC→T2RDU→ APDPRS : Lat:39.126 Lon:-77.574 : North-Northeast@141.21miles
|
||||
2025-12-11 09:44:41.392 | RX(7)↓ MicEPacket:None KM4HFB-9 →WIDE1-1→WIDE2-1→qAR→W4KEL-12→ SX1U5Y : Lat:38.260 Lon:-77.550 Altitude 078 Speed 015MPH Course 248 110 mbits : Northeast@95.08miles
|
||||
2025-12-11 09:44:41.418 | RX(8)↓ BeaconPacket:None K8WVU-9 →W8SP-1→WIDE1*→WIDE2-1→qAR→KF8LO-1→ APAT81 : Lat:39.580 Lon:-79.957 using Radioddity DB25-D : North-Northwest@165.67miles
|
||||
2025-12-11 09:44:42.131 | RX(9)↓ MicEPacket:None N0OEP-9 →WIDE1-1→WIDE2-1→qAR→KB4ZIN-1→ S7QW6Y : Lat:37.295 Lon:-76.716 Altitude 028 Course 063 101 mbits : East@117.30miles
|
||||
2025-12-11 09:44:42.723 | RX(10)↓ ObjectPacket:None KJ4ACB-S →TCPIP*→qAC→KJ4ACB-GS→ APDG01 : Lat:35.444 Lon:-78.515 Altitude 003 RNG 002 70cm Voice (D-Star) 434.60000MHz +0.0000MHz : South@132.62miles
|
||||
2025-12-11 09:44:43.158 | RX(11)↓ WeatherPacket:None KO4FR →TCPIP*→qAC→T2SPAIN→ APRS : Temp 005F Humidity 54% Wind 000MPH@146 Pressure 1011.9mb Rain 0.09in/24hr : Southeast@45.96miles
|
||||
2025-12-11 09:44:43.249 | RX(12)↓ BeaconPacket:None AA4HI-4 →TCPIP*→qAS→N4UED-4→ APMI06 : Lat:36.449 Lon:-77.636 WX3in1Plus2.0 U=12.5V,T=??.?C/??.?F : Southeast@91.24miles
|
||||
|
||||
The listen command connects to the APRS-IS network and displays packets matching the specified filter.
|
||||
In the example above, packets within 300 miles are displayed, showing various packet types including MicEPacket,
|
||||
BeaconPacket, and WeatherPacket.
|
||||
|
||||
APRS-IS Filter Syntax
|
||||
----------------------
|
||||
|
||||
The ``aprsd listen`` command supports the full APRS-IS server-side filter syntax. For complete documentation
|
||||
on all available filter types and options, see the `APRS-IS Filter Documentation <http://www.aprs-is.net/javAPRSFilter.aspx>`_.
|
||||
|
||||
Filters allow you to subscribe to specific APRS traffic based on various criteria. Multiple filter specifications
|
||||
can be combined, separated by spaces. If any filter matches, the packet is passed.
|
||||
|
||||
You can also exclude packets by prefixing a filter parameter with a hyphen (-). This tells the filter to
|
||||
approve packets that match the include filters **except** those that match the exclude filters.
|
||||
|
||||
For example, to get all stations within 200 km except stations with the prefix "CW":
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen m/200 -p/CW
|
||||
|
||||
The following filter types are available:
|
||||
|
||||
Range Filter (r/lat/lon/dist)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes position packets and objects within ``dist`` km from the specified latitude/longitude.
|
||||
Latitude and longitude are signed decimal degrees (negative for West/South, positive for East/North).
|
||||
|
||||
Up to 9 range filters can be defined simultaneously for better coverage. Messages addressed to stations
|
||||
within the range are also passed.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen r/33/-97/200
|
||||
|
||||
This filters for packets within 200 km of latitude 33, longitude -97 (Dallas, Texas area).
|
||||
|
||||
My Range Filter (m/dist)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Same as the range filter, except the center is defined as the last known position of the logged-in client
|
||||
(as configured in your APRSD config file).
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen m/300
|
||||
|
||||
This filters for packets within 300 miles of your configured location.
|
||||
|
||||
Friend Range Filter (f/call/dist)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Same as the range filter, except the center is defined as the last known position of the specified callsign.
|
||||
Up to 9 friend filters can be defined simultaneously.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen f/WB4BOR-1/50
|
||||
|
||||
This filters for packets within 50 km of the last known position of WB4BOR-1.
|
||||
|
||||
Area Filter (a/latN/lonW/latS/lonE)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Works like the range filter but defines a rectangular box of coordinates. Coordinates can be seen as
|
||||
upper-left and lower-right corners. Latitude/longitude are decimal degrees (South and West are negative).
|
||||
Up to 9 area filters can be defined simultaneously.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen a/40/-80/35/-75
|
||||
|
||||
This filters for packets in a box from latitude 40N, longitude 80W to latitude 35N, longitude 75W.
|
||||
|
||||
Prefix Filter (p/aa/bb/cc...)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes traffic with fromCall that starts with any of the specified prefixes.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen p/WB4/KM6
|
||||
|
||||
This filters for packets from callsigns starting with "WB4" or "KM6".
|
||||
|
||||
Budlist Filter (b/call1/call2...)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes all traffic from exact callsigns: call1, call2, etc. The asterisk (*) wildcard is allowed.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen b/WB4BOR-1/KM6LYW
|
||||
|
||||
This filters for packets from exactly WB4BOR-1 or KM6LYW.
|
||||
|
||||
Object Filter (o/obj1/obj2...)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes all objects with the exact name of obj1, obj2, etc. The asterisk (*) wildcard is allowed.
|
||||
Spaces are not allowed. Use ``|`` for ``/`` and ``~`` for ``*`` in object names.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen o/APRS*/WEATHER
|
||||
|
||||
This filters for objects named "APRS*" or "WEATHER".
|
||||
|
||||
Strict Object Filter (os/obj1/obj2...)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes all objects with the exact name of obj1, obj2, etc. Objects are always 9 characters and Items
|
||||
are 3 to 9 characters. There can only be one ``os`` filter and it must be at the end of the filter line.
|
||||
The asterisk (*) wildcard is allowed. Use ``|`` for ``/`` and ``~`` for ``*`` in object names.
|
||||
|
||||
Type Filter (t/poimqstunw or t/poimqstuw/call/km)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes all traffic based on packet type. One or more types can be defined:
|
||||
|
||||
- ``p`` = Position packets
|
||||
- ``o`` = Objects
|
||||
- ``i`` = Items
|
||||
- ``m`` = Message
|
||||
- ``q`` = Query
|
||||
- ``s`` = Status
|
||||
- ``t`` = Telemetry
|
||||
- ``u`` = User-defined
|
||||
- ``n`` = NWS format messages and objects
|
||||
- ``w`` = Weather
|
||||
|
||||
The weather type filter also passes position packets for positionless weather packets.
|
||||
|
||||
The second format allows putting a radius limit around a callsign (station callsign-SSID or object name)
|
||||
for the requested station types.
|
||||
|
||||
**Examples:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen t/mw
|
||||
aprsd listen t/poimqstuw/WB4BOR-1/50
|
||||
|
||||
The first example filters for messages and weather packets. The second filters for all packet types
|
||||
within 50 km of WB4BOR-1.
|
||||
|
||||
Symbol Filter (s/pri/alt/over)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Filters by symbol. ``pri`` = symbols in primary table, ``alt`` = symbols in alternate table,
|
||||
``over`` = overlay character (case sensitive). Use ``|`` for ``/`` in symbol specifications.
|
||||
|
||||
**Examples:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen s/->
|
||||
aprsd listen s//#
|
||||
aprsd listen s//#/T
|
||||
|
||||
The first passes all House and Car symbols (primary table). The second passes all Digi with or without
|
||||
overlay. The third passes all Digi with overlay of capital "T".
|
||||
|
||||
Digipeater Filter (d/digi1/digi2...)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes all packets that have been digipeated by a particular station(s) (the station's call is in the path).
|
||||
The asterisk (*) wildcard is allowed.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen d/WIDE1-1/WIDE2-1
|
||||
|
||||
This filters for packets digipeated by WIDE1-1 or WIDE2-1.
|
||||
|
||||
Entry Station Filter (e/call1/call2/...)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes all packets with the specified callsign-SSID(s) immediately following the q construct. This allows
|
||||
filtering based on receiving IGate, etc. Supports asterisk (*) wildcard.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen e/T2CAEAST/T2SYDNEY
|
||||
|
||||
This filters for packets received by T2CAEAST or T2SYDNEY IGates.
|
||||
|
||||
Group Message Filter (g/call1/call2/...)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes all message packets with the specified callsign-SSID(s) as the addressee of the message.
|
||||
Supports asterisk (*) wildcard.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen g/REPEAT/APRS
|
||||
|
||||
This filters for messages addressed to REPEAT or APRS.
|
||||
|
||||
Unproto Filter (u/unproto1/unproto2/...)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Passes all packets with the specified destination callsign-SSID(s) (also known as the To call or unproto call).
|
||||
Supports asterisk (*) wildcard.
|
||||
|
||||
**Example:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen u/APRS*/CQ
|
||||
|
||||
This filters for packets with destination callsigns starting with "APRS" or "CQ".
|
||||
|
||||
q Construct Filter (q/con/I)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Filters by q Construct command. ``con`` = list of q Constructs to pass (case sensitive),
|
||||
``I`` = Pass positions from IGATES identified by qAr, qAo, or qAR.
|
||||
|
||||
**Examples:**
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
aprsd listen q/C
|
||||
aprsd listen q/rR
|
||||
aprsd listen q//I
|
||||
|
||||
The first passes all traffic with qAC. The second passes all traffic with qAr or qAR.
|
||||
The third passes all position packets from IGATES identified in other packets by qAr or qAR.
|
||||
|
||||
Filter Notes
|
||||
~~~~~~~~~~~~
|
||||
|
||||
- Multiple filter definitions can be combined, separated by spaces
|
||||
- If any filter matches, the packet is passed (OR logic)
|
||||
- Exclude filters (prefixed with ``-``) block specified packets from include filters
|
||||
- Standard port functionality such as messaging for IGates is not affected
|
||||
- Filters only affect data going to the client; packets from the client or gated by the client are not filtered
|
||||
- The filter command can be set as part of the login line or as a separate command
|
||||
- Use ``filter default`` to reset to the predefined filter for that port
|
||||
|
||||
For more information, see the `APRS-IS Filter Documentation <http://www.aprs-is.net/javAPRSFilter.aspx>`_.
|
||||
|
||||
Key differences from the server command
|
||||
----------------------------------------
|
||||
|
||||
Unlike the ``aprsd server`` command, the listen command:
|
||||
|
||||
- Does not load plugins by default (use ``--load-plugins`` to enable them)
|
||||
- Does not respond to messages
|
||||
- Is designed for monitoring and logging APRS traffic
|
||||
- Supports APRS-IS filter syntax for targeted packet monitoring
|
||||
|
||||
.. include:: links.rst
|
||||
553
docs/source/readme.rst
Normal file
553
docs/source/readme.rst
Normal file
@ -0,0 +1,553 @@
|
||||
.. role:: raw-html-m2r(raw)
|
||||
:format: html
|
||||
|
||||
|
||||
APRSD - Ham radio APRS-IS Message platform software
|
||||
===================================================
|
||||
|
||||
KM6LYW and WB4BOR
|
||||
-----------------
|
||||
|
||||
|
||||
.. image:: https://badge.fury.io/py/aprsd.svg
|
||||
:target: https://badge.fury.io/py/aprsd
|
||||
:alt: pypi
|
||||
|
||||
|
||||
.. image:: https://img.shields.io/pypi/pyversions/aprsd.svg
|
||||
:target: https://pypi.org/pypi/aprsd
|
||||
:alt: versions
|
||||
|
||||
|
||||
.. image:: https://img.shields.io/badge/slack-@hemna/aprsd-blue.svg?logo=slack
|
||||
:target: https://hemna.slack.com/app_redirect?channel=C01KQSCP5RP
|
||||
:alt: slack
|
||||
|
||||
|
||||
.. image:: https://img.shields.io/github/issues/craigerl/aprsd
|
||||
:target: https://img.shields.io/github/issues/craigerl/aprsd
|
||||
:alt: issues
|
||||
|
||||
|
||||
.. image:: https://img.shields.io/github/last-commit/craigerl/aprsd
|
||||
:target: https://img.shields.io/github/last-commit/craigerl/aprsd
|
||||
:alt: commit
|
||||
|
||||
|
||||
.. image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336
|
||||
:target: https://timothycrosley.github.io/isort/
|
||||
:alt: imports
|
||||
|
||||
|
||||
.. image:: https://static.pepy.tech/personalized-badge/aprsd?period=month&units=international_system&left_color=black&right_color=orange&left_text=Downloads
|
||||
:target: https://pepy.tech/project/aprsd
|
||||
:alt: down
|
||||
|
||||
|
||||
`APRSD <http://github.com/craigerl/aprsd>`_ is a Ham radio
|
||||
`APRS <http://aprs.org>`_ message platform built with python.
|
||||
|
||||
|
||||
.. image:: ../images/aprsd_logo.png
|
||||
:target: ../images/aprsd_logo.png
|
||||
:alt: APRSD Logo
|
||||
|
||||
|
||||
Table of Contents
|
||||
=================
|
||||
|
||||
|
||||
#. `APRSD - Ham radio APRS-IS Message platform software <#aprsd---ham-radio-aprs-is-message-platform-software>`_
|
||||
#. `What is APRSD <#what-is-aprsd>`_
|
||||
#. `APRSD Plugins/Extensions <#aprsd-pluginsextensions>`_
|
||||
#. `List of existing plugins - APRS Message processing/responders <#list-of-existing-plugins---aprs-message-processingresponders>`_
|
||||
#. `List of existing extensions - Add new capabilities to APRSD <#list-of-existing-extensions---add-new-capabilities-to-aprsd>`_
|
||||
#. `APRSD Overview Diagram <#aprsd-overview-diagram>`_
|
||||
#. `Typical use case <#typical-use-case>`_
|
||||
#. `Installation <#installation>`_
|
||||
#. `Example usage <#example-usage>`_
|
||||
#. `Help <#help>`_
|
||||
#. `Commands <#commands>`_
|
||||
#. `Configuration <#configuration>`_
|
||||
#. `server <#server>`_
|
||||
#. `Current list plugins <#current-list-plugins>`_
|
||||
#. `Current list extensions <#current-list-extensions>`_
|
||||
#. `send-message <#send-message>`_
|
||||
#. `Development <#development>`_
|
||||
#. `Release <#release>`_
|
||||
#. `Building your own APRSD plugins <#building-your-own-aprsd-plugins>`_
|
||||
#. `Docker Container <#docker-container>`_
|
||||
#. `Running the container <#running-the-container>`_
|
||||
#. `Activity <#activity>`_
|
||||
#. `Star History <#star-history>`_
|
||||
|
||||
----
|
||||
|
||||
..
|
||||
|
||||
[!WARNING]
|
||||
Legal operation of this software requires an amateur radio license and a valid call sign.
|
||||
|
||||
[!NOTE]
|
||||
Star this repo to follow our progress! This code is under active development, and contributions are both welcomed and appreciated. See `CONTRIBUTING.md <https://github.com/craigerl/aprsd/blob/master/CONTRIBUTING.md>`_ for details.
|
||||
|
||||
|
||||
What is APRSD
|
||||
-------------
|
||||
|
||||
APRSD is a python application for interacting with the APRS network and Ham radios with KISS interfaces and
|
||||
providing APRS services for HAM radio operators.
|
||||
|
||||
APRSD currently has the following commands to use.
|
||||
|
||||
|
||||
* server - Start the aprsd server gateway process.
|
||||
* listen - Listen to packets on the APRS-IS Network based on FILTER.
|
||||
* send-message - Send a message to a callsign via APRS_IS.
|
||||
* check-version - Check this version against the latest in pypi.org.
|
||||
* completion - Show the shell completion code
|
||||
* dev - Development type subcommands
|
||||
* dump-stats - Dump the current stats from the running APRSD instance.
|
||||
* fetch-stats - Fetch stats from a APRSD admin web interface.
|
||||
* healthcheck - Check the health of the running aprsd server.
|
||||
* list-extensions - List the built in extensions available to APRSD.
|
||||
* list-plugins - List the built in plugins available to APRSD.
|
||||
* passcode - Generate an APRS passcode for a callsign.
|
||||
* sample-config - Generate a sample Config file from aprsd and all...
|
||||
* version - Show the APRSD version.
|
||||
|
||||
Each of those commands can connect to the APRS-IS network if internet
|
||||
connectivity is available. If internet is not available, then APRS can
|
||||
be configured to talk to a TCP KISS TNC for radio connectivity directly.
|
||||
|
||||
Please `read the docs <https://aprsd.readthedocs.io>`_ to learn more!
|
||||
|
||||
APRSD Plugins/Extensions
|
||||
------------------------
|
||||
|
||||
APRSD Has the ability to add plugins and extensions. Plugins add new message filters that can look for specific messages and respond. For example, the aprsd-email-plugin adds the ability to send/recieve email to/from an APRS callsign. Extensions add new unique capabilities to APRSD itself. For example the aprsd-admin-extension adds a web interface command that shows the running status of the aprsd server command. aprsd-webchat-extension is a new web based APRS 'chat' command.
|
||||
|
||||
You can see the `available plugins/extensions on pypi here: <https://pypi.org/search/?q=aprsd>`_ `https://pypi.org/search/?q=aprsd <https://pypi.org/search/?q=aprsd>`_
|
||||
|
||||
..
|
||||
|
||||
[!NOTE]
|
||||
aprsd admin and webchat commands have been extracted into separate extensions.
|
||||
|
||||
|
||||
* `See admin extension here <https://github.com/hemna/aprsd-admin-extension>`_ :raw-html-m2r:`<div id="admin logo" align="left"><img src="https://raw.githubusercontent.com/hemna/aprsd-admin-extension/refs/heads/master/screenshot.png" alt="Web Admin" width="340"/></div>`
|
||||
|
||||
|
||||
|
||||
*
|
||||
`See webchat extension here <https://github.com/hemna/aprsd-webchat-extension>`_ :raw-html-m2r:`<div id="webchat logo" align="left"><img src="https://raw.githubusercontent.com/hemna/aprsd-webchat-extension/master/screenshot.png" alt="Webchat" width="340"/></div>`
|
||||
|
||||
*
|
||||
`See CLI chat extension here <https://github.com/hemna/aprsd-rich-cli-extension>`_ :raw-html-m2r:`<div id="rich_logo" align="left"><img src="https://raw.githubusercontent.com/hemna/aprsd-rich-cli-extension/refs/heads/master/screenshot.png" alt="CLI Chat" width="340"></div>`
|
||||
|
||||
List of existing plugins - APRS Message processing/responders
|
||||
-------------------------------------------------------------
|
||||
|
||||
|
||||
* `aprsd-email-plugin <https://github.com/hemna/aprsd-email-plugin>`_ - send/receive email!
|
||||
* `aprsd-location-plugin <https://github.com/hemna/aprsd-location-plugin>`_ - get latest GPS location.
|
||||
* `aprsd-locationdata-plugin <https://github.com/hemna/aprsd-locationdata-plugin>`_ - get latest GPS location
|
||||
* `aprsd-digipi-plugin <https://github.com/hemna/aprsd-digipi-plugin>`_ - Look for digipi beacon packets
|
||||
* `aprsd-w3w-plugin <https://github.com/hemna/aprsd-w3w-plugin>`_ - get your w3w coordinates
|
||||
* `aprsd-mqtt-plugin <https://github.com/hemna/aprsd-mqtt-plugin>`_ - send aprs packets to an MQTT topic
|
||||
* `aprsd-telegram-plugin <https://github.com/hemna/aprsd-telegram-plugin>`_ - send/receive messages to telegram
|
||||
* `aprsd-borat-plugin <https://github.com/hemna/aprsd-borat-plugin>`_ - get Borat quotes
|
||||
* `aprsd-wxnow-plugin <https://github.com/hemna/aprsd-wxnow-plugin>`_ - get closest N weather station reports
|
||||
* `aprsd-weewx-plugin <https://github.com/hemna/aprsd-weewx-plugin>`_ - get weather from your weewx weather station
|
||||
* `aprsd-slack-plugin <https://github.com/hemna/aprsd-slack-plugin>`_ - send/receive messages to a slack channel
|
||||
* `aprsd-sentry-plugin <https://github.com/hemna/aprsd-sentry-plugin>`_ -
|
||||
* `aprsd-repeat-plugins <https://github.com/hemna/aprsd-repeat-plugins>`_ - plugins for the REPEAT service. Get nearest Ham radio repeaters!
|
||||
* `aprsd-twitter-plugin <https://github.com/hemna/aprsd-twitter-plugin>`_ - make tweets from your Ham Radio!
|
||||
* `aprsd-timeopencage-plugin <https://github.com/hemna/aprsd-timeopencage-plugin>`_ - Get local time for a callsign
|
||||
* `aprsd-stock-plugin <https://github.com/hemna/aprsd-stock-plugin>`_ - get stock quotes from your Ham radio
|
||||
|
||||
List of existing extensions - Add new capabilities to APRSD
|
||||
-----------------------------------------------------------
|
||||
|
||||
|
||||
* `aprsd-admin-extension <https://github.com/hemna/aprsd-admin-extension>`_ - Web Administration page for APRSD
|
||||
* `aprsd-webchat-extension <https://github.com/hemna/aprsd-webchat-extension>`_ - Web page for APRS Messaging
|
||||
* `aprsd-rich-cli-extension <https://github.com/hemna/aprsd-rich-cli-extension>`_ - Textual rich CLI versions of aprsd commands
|
||||
* `aprsd-irc-extension <https://github.com/hemna/aprsd-irc-extension>`_ - an IRC like server command for APRS
|
||||
|
||||
APRSD Overview Diagram
|
||||
----------------------
|
||||
|
||||
|
||||
.. image:: https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true
|
||||
:target: https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true
|
||||
:alt: APRSD Logo
|
||||
|
||||
|
||||
Typical use case
|
||||
----------------
|
||||
|
||||
APRSD\'s typical use case is that of providing an APRS wide service to
|
||||
all HAM radio operators. For example the callsign \'REPEAT\' on the APRS
|
||||
network is actually an instance of APRSD that can provide a list of HAM
|
||||
repeaters in the area of the callsign that sent the message.
|
||||
|
||||
Ham radio operator using an APRS enabled HAM radio sends a message to
|
||||
check the weather. An APRS message is sent, and then picked up by APRSD.
|
||||
The APRS packet is decoded, and the message is sent through the list of
|
||||
plugins for processing. For example, the WeatherPlugin picks up the
|
||||
message, fetches the weather for the area around the user who sent the
|
||||
request, and then responds with the weather conditions in that area.
|
||||
Also includes a watch list of HAM callsigns to look out for. The watch
|
||||
list can notify you when a HAM callsign in the list is seen and now
|
||||
available to message on the APRS network.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
**Install uv (recommended):**
|
||||
|
||||
``uv`` is a fast Python package installer and resolver. To install ``uv``\ , visit `https://docs.astral.sh/uv/getting-started/installation/ <https://docs.astral.sh/uv/getting-started/installation/>`_
|
||||
|
||||
To install ``aprsd``\ , use uv:
|
||||
|
||||
``uv pip install aprsd``
|
||||
|
||||
Or with the traditional pip:
|
||||
|
||||
``pip install aprsd``
|
||||
|
||||
Example usage
|
||||
-------------
|
||||
|
||||
``aprsd -h``
|
||||
|
||||
Help
|
||||
----
|
||||
|
||||
:
|
||||
|
||||
.. code-block::
|
||||
|
||||
└─> aprsd -h
|
||||
Usage: aprsd [OPTIONS] COMMAND [ARGS]...
|
||||
|
||||
Options:
|
||||
--version Show the version and exit.
|
||||
-h, --help Show this message and exit.
|
||||
|
||||
Commands:
|
||||
check-version Check this version against the latest in pypi.org.
|
||||
completion Show the shell completion code
|
||||
dev Development type subcommands
|
||||
fetch-stats Fetch stats from a APRSD admin web interface.
|
||||
healthcheck Check the health of the running aprsd server.
|
||||
list-extensions List the built in plugins available to APRSD.
|
||||
list-plugins List the built in plugins available to APRSD.
|
||||
listen Listen to packets on the APRS-IS Network based on FILTER.
|
||||
sample-config Generate a sample Config file from aprsd and all...
|
||||
send-message Send a message to a callsign via APRS_IS.
|
||||
server Start the aprsd server gateway process.
|
||||
version Show the APRSD version.
|
||||
|
||||
|
||||
Commands
|
||||
--------
|
||||
|
||||
Configuration
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
This command outputs a sample config yml formatted block that you can
|
||||
edit and use to pass in to ``aprsd`` with ``-c``. By default aprsd looks in
|
||||
``~/.config/aprsd/aprsd.yml``
|
||||
|
||||
``aprsd sample-config``
|
||||
|
||||
.. code-block::
|
||||
|
||||
└─> aprsd sample-config
|
||||
...
|
||||
|
||||
|
||||
server
|
||||
^^^^^^
|
||||
|
||||
This is the main server command that will listen to APRS-IS servers and
|
||||
look for incomming commands to the callsign configured in the config
|
||||
file
|
||||
|
||||
.. code-block::
|
||||
|
||||
└─[$] > aprsd server --help
|
||||
Usage: aprsd server [OPTIONS]
|
||||
|
||||
Start the aprsd server gateway process.
|
||||
|
||||
Options:
|
||||
--loglevel [CRITICAL|ERROR|WARNING|INFO|DEBUG]
|
||||
The log level to use for aprsd.log
|
||||
[default: INFO]
|
||||
-c, --config TEXT The aprsd config file to use for options.
|
||||
[default:
|
||||
/Users/i530566/.config/aprsd/aprsd.yml]
|
||||
--quiet Don't log to stdout
|
||||
-f, --flush Flush out all old aged messages on disk.
|
||||
[default: False]
|
||||
-h, --help Show this message and exit.
|
||||
|
||||
└─> aprsd server
|
||||
Registering LogMonitorThread
|
||||
2025-01-06 16:27:12.398 | MainThread | INFO | APRSD is up to date | aprsd.cmds.server:server:82
|
||||
2025-01-06 16:27:12.398 | MainThread | INFO | APRSD Started version: 4.2.4 | aprsd.cmds.server:server:83
|
||||
2025-01-06 16:27:12.398 | MainThread | INFO | Creating client connection | aprsd.cmds.server:server:101
|
||||
2025-01-06 16:27:12.398 | MainThread | INFO | Creating aprslib client(noam.aprs2.net:14580) and logging in WB4BOR-1. | aprsd.client.aprsis:setup_connection:136
|
||||
2025-01-06 16:27:12.398 | MainThread | INFO | Attempting connection to noam.aprs2.net:14580 | aprslib.inet:_connect:226
|
||||
2025-01-06 16:27:12.473 | MainThread | INFO | Connected to ('44.135.208.225', 14580) | aprslib.inet:_connect:233
|
||||
2025-01-06 16:27:12.617 | MainThread | INFO | Login successful | aprsd.client.drivers.aprsis:_send_login:154
|
||||
2025-01-06 16:27:12.618 | MainThread | INFO | Connected to T2BC | aprsd.client.drivers.aprsis:_send_login:156
|
||||
2025-01-06 16:27:12.618 | MainThread | INFO | <aprsd.client.aprsis.APRSISClient object at 0x103a36480> | aprsd.cmds.server:server:103
|
||||
2025-01-06 16:27:12.618 | MainThread | INFO | Loading Plugin Manager and registering plugins | aprsd.cmds.server:server:117
|
||||
2025-01-06 16:27:12.619 | MainThread | INFO | Loading APRSD Plugins | aprsd.plugin:setup_plugins:492
|
||||
|
||||
|
||||
|
||||
Current list plugins
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block::
|
||||
|
||||
└─> aprsd list-plugins
|
||||
🐍 APRSD Built-in Plugins 🐍
|
||||
┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
||||
┃ Plugin Name ┃ Info ┃ Type ┃ Plugin Path ┃
|
||||
┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
|
||||
│ AVWXWeatherPlugin │ AVWX weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.AVWXWeatherPlugin │
|
||||
│ FortunePlugin │ Give me a fortune │ RegexCommand │ aprsd.plugins.fortune.FortunePlugin │
|
||||
│ NotifySeenPlugin │ Notify me when a CALLSIGN is recently seen on APRS-IS │ WatchList │ aprsd.plugins.notify.NotifySeenPlugin │
|
||||
│ OWMWeatherPlugin │ OpenWeatherMap weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.OWMWeatherPlugin │
|
||||
│ PingPlugin │ reply with a Pong! │ RegexCommand │ aprsd.plugins.ping.PingPlugin │
|
||||
│ TimeOWMPlugin │ Current time of GPS beacon's timezone. Uses OpenWeatherMap │ RegexCommand │ aprsd.plugins.time.TimeOWMPlugin │
|
||||
│ TimePlugin │ What is the current local time. │ RegexCommand │ aprsd.plugins.time.TimePlugin │
|
||||
│ USMetarPlugin │ USA only METAR of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.USMetarPlugin │
|
||||
│ USWeatherPlugin │ Provide USA only weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.USWeatherPlugin │
|
||||
│ VersionPlugin │ What is the APRSD Version │ RegexCommand │ aprsd.plugins.version.VersionPlugin │
|
||||
└───────────────────┴────────────────────────────────────────────────────────────┴──────────────┴─────────────────────────────────────────┘
|
||||
|
||||
|
||||
Pypi.org APRSD Installable Plugin Packages
|
||||
|
||||
Install any of the following plugins with
|
||||
'uv pip install <Plugin Package Name>'
|
||||
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
|
||||
┃ Plugin Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃
|
||||
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
|
||||
│ 📂 aprsd-assistant-plugin │ APRSd plugin for hosting the APRS Assistant chatbot │ 0.0.3 │ 2024-10-20T02:59:39 │ No │
|
||||
│ │ (aprs-assistant) │ │ │ │
|
||||
│ 📂 aprsd-borat-plugin │ Borat quotes for aprsd plugin │ 0.1.1.dev1 │ 2024-01-19T16:04:38 │ No │
|
||||
│ 📂 aprsd-locationdata-plugin │ Fetch location information from a callsign │ 0.3.0 │ 2024-02-06T17:20:43 │ No │
|
||||
│ 📂 aprsd-mqtt-plugin │ APRSD MQTT Plugin sends APRS packets to mqtt queue │ 0.2.0 │ 2023-04-17T16:01:50 │ No │
|
||||
│ 📂 aprsd-repeat-plugins │ APRSD Plugins for the REPEAT service │ 1.2.0 │ 2023-01-10T17:15:36 │ No │
|
||||
│ 📂 aprsd-sentry-plugin │ Ham radio APRSD plugin that does.... │ 0.1.2 │ 2022-12-02T19:07:33 │ No │
|
||||
│ 📂 aprsd-slack-plugin │ Amateur radio APRS daemon which listens for messages and │ 1.2.0 │ 2023-01-10T19:21:33 │ No │
|
||||
│ │ responds │ │ │ │
|
||||
│ 📂 aprsd-stock-plugin │ Ham Radio APRSD Plugin for fetching stock quotes │ 0.1.3 │ 2022-12-02T18:56:19 │ Yes │
|
||||
│ 📂 aprsd-telegram-plugin │ Ham Radio APRS APRSD plugin for Telegram IM service │ 0.1.3 │ 2022-12-02T19:07:15 │ No │
|
||||
│ 📂 aprsd-timeopencage-plugin │ APRSD plugin for fetching time based on GPS location │ 0.2.0 │ 2023-01-10T17:07:11 │ No │
|
||||
│ 📂 aprsd-twitter-plugin │ Python APRSD plugin to send tweets │ 0.5.0 │ 2023-01-10T16:51:47 │ No │
|
||||
│ 📂 aprsd-weewx-plugin │ HAM Radio APRSD that reports weather from a weewx weather │ 0.3.2 │ 2023-04-20T20:16:19 │ No │
|
||||
│ │ station. │ │ │ │
|
||||
│ 📂 aprsd-wxnow-plugin │ APRSD Plugin for getting the closest wx reports to last │ 0.2.0 │ 2023-10-08T01:27:29 │ Yes │
|
||||
│ │ beacon │ │ │ │
|
||||
└──────────────────────────────┴──────────────────────────────────────────────────────────────┴────────────┴─────────────────────┴────────────┘
|
||||
|
||||
|
||||
🐍 APRSD Installed 3rd party Plugins 🐍
|
||||
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
||||
┃ Package Name ┃ Plugin Name ┃ Version ┃ Type ┃ Plugin Path ┃
|
||||
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
|
||||
│ aprsd-stock-plugin │ YahooStockQuote │ 0.1.3 │ RegexCommand │ aprsd_stock_plugin.stock.YahooStockQuote │
|
||||
│ aprsd-wxnow-plugin │ WXNowPlugin │ 0.2.0 │ RegexCommand │ aprsd_wxnow_plugin.conf.opts.WXNowPlugin │
|
||||
└────────────────────┴─────────────────┴─────────┴──────────────┴──────────────────────────────────────────┘
|
||||
|
||||
|
||||
Current list extensions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block::
|
||||
|
||||
└─> aprsd list-extensions
|
||||
|
||||
|
||||
Pypi.org APRSD Installable Extension Packages
|
||||
|
||||
Install any of the following extensions by running
|
||||
'uv pip install <Plugin Package Name>'
|
||||
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
|
||||
┃ Extension Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃
|
||||
┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
|
||||
│ 📂 aprsd-admin-extension │ Administration extension for the Ham radio APRSD Server │ 1.0.1 │ 2025-01-06T21:57:24 │ Yes │
|
||||
│ 📂 aprsd-irc-extension │ An Extension to Ham radio APRSD Daemon to act like an irc server │ 0.0.5 │ 2024-04-09T11:28:47 │ No │
|
||||
│ │ for APRS │ │ │ │
|
||||
│ 📂 aprsd-rich-cli-extens │ APRSD Extension to create textual rich CLI versions of aprsd │ 0.1.1 │ 2024-12-01T00:00:00 │ No │
|
||||
│ ion │ commands │ │ │ │
|
||||
│ 📂 aprsd-webchat-extens │ Web page for APRS Messaging │ 1.2.3 │ 2024-10-01T00:00:00 │ No │
|
||||
│ ion │ │ │ │ │
|
||||
└──────────────────────────┴─────────────────────────────────────────────────────────────────────┴─────────┴─────────────────────┴────────────┘
|
||||
|
||||
|
||||
send-message
|
||||
------------
|
||||
|
||||
This command is typically used for development to send another aprsd
|
||||
instance test messages
|
||||
|
||||
.. code-block::
|
||||
|
||||
└─[$] > aprsd send-message -h
|
||||
Usage: aprsd send-message [OPTIONS] TOCALLSIGN COMMAND...
|
||||
|
||||
Send a message to a callsign via APRS_IS.
|
||||
|
||||
Options:
|
||||
--loglevel [CRITICAL|ERROR|WARNING|INFO|DEBUG]
|
||||
The log level to use for aprsd.log
|
||||
[default: INFO]
|
||||
-c, --config TEXT The aprsd config file to use for options.
|
||||
[default:
|
||||
/Users/i530566/.config/aprsd/aprsd.yml]
|
||||
--quiet Don't log to stdout
|
||||
--aprs-login TEXT What callsign to send the message from.
|
||||
[env var: APRS_LOGIN]
|
||||
--aprs-password TEXT the APRS-IS password for APRS_LOGIN [env
|
||||
var: APRS_PASSWORD]
|
||||
-n, --no-ack Don't wait for an ack, just sent it to APRS-
|
||||
IS and bail. [default: False]
|
||||
-w, --wait-response Wait for a response to the message?
|
||||
[default: False]
|
||||
--raw TEXT Send a raw message. Implies --no-ack
|
||||
-h, --help Show this message and exit.
|
||||
|
||||
|
||||
Development
|
||||
-----------
|
||||
|
||||
|
||||
* ``git clone git@github.com:craigerl/aprsd.git``
|
||||
* ``cd aprsd``
|
||||
* ``make``
|
||||
|
||||
Workflow
|
||||
^^^^^^^^
|
||||
|
||||
While working aprsd, The workflow is as follows:
|
||||
|
||||
|
||||
*
|
||||
Checkout a new branch to work on by running
|
||||
|
||||
``git checkout -b mybranch``
|
||||
|
||||
*
|
||||
Make your changes to the code
|
||||
|
||||
*
|
||||
Run Tox with the following options:
|
||||
|
||||
|
||||
* ``tox -epep8``
|
||||
* ``tox -efmt``
|
||||
* ``tox -p``
|
||||
|
||||
*
|
||||
Commit your changes. This will run the pre-commit hooks which does
|
||||
checks too
|
||||
|
||||
``git commit``
|
||||
|
||||
*
|
||||
Once you are done with all of your commits, then push up the branch
|
||||
to github with:
|
||||
|
||||
``git push -u origin mybranch``
|
||||
|
||||
*
|
||||
Create a pull request from your branch so github tests can run and
|
||||
we can do a code review.
|
||||
|
||||
Release
|
||||
^^^^^^^
|
||||
|
||||
To do release to pypi:
|
||||
|
||||
|
||||
*
|
||||
Tag release with:
|
||||
|
||||
``git tag -v1.XX -m "New release"``
|
||||
|
||||
*
|
||||
Push release tag:
|
||||
|
||||
``git push origin master --tags``
|
||||
|
||||
*
|
||||
Do a test build and verify build is valid by running:
|
||||
|
||||
``make build``
|
||||
|
||||
*
|
||||
Once twine is happy, upload release to pypi:
|
||||
|
||||
``make upload``
|
||||
|
||||
Building your own APRSD plugins
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
For information on building your own APRSD plugins, see the `Plugin Development documentation <https://aprsd.readthedocs.io/en/latest/plugin.html>`_.
|
||||
|
||||
Docker Container
|
||||
----------------
|
||||
|
||||
For information on building Docker containers (official and development builds), see the `Docker Container documentation <https://aprsd.readthedocs.io/en/latest/readme.html#docker-container>`_.
|
||||
|
||||
Running the container
|
||||
---------------------
|
||||
|
||||
There is a ``docker-compose.yml`` file in the ``docker/`` directory that can
|
||||
be used to run your container. To provide the container an ``aprsd.conf``
|
||||
configuration file, change your ``docker-compose.yml`` as shown below:
|
||||
|
||||
.. code-block::
|
||||
|
||||
volumes:
|
||||
- $HOME/.config/aprsd:/config
|
||||
|
||||
|
||||
To install plugins at container start time, pass in a list of
|
||||
comma-separated list of plugins on PyPI using the ``APRSD_PLUGINS``
|
||||
environment variable in the ``docker-compose.yml`` file. Note that version
|
||||
constraints may also be provided. For example:
|
||||
|
||||
.. code-block::
|
||||
|
||||
environment:
|
||||
- APRSD_PLUGINS=aprsd-slack-plugin>=1.0.2,aprsd-twitter-plugin
|
||||
|
||||
|
||||
|
||||
Activity
|
||||
--------
|
||||
|
||||
|
||||
.. image:: https://repobeats.axiom.co/api/embed/8b96657861770a15f0b851a5eebafb34d0e0b3d3.svg
|
||||
:target: https://repobeats.axiom.co/api/embed/8b96657861770a15f0b851a5eebafb34d0e0b3d3.svg
|
||||
:alt: Alt
|
||||
|
||||
|
||||
Star History
|
||||
------------
|
||||
|
||||
|
||||
.. image:: https://api.star-history.com/svg?repos=craigerl/aprsd&type=Date
|
||||
:target: https://star-history.com/#craigerl/aprsd&Date
|
||||
:alt: Star History Chart
|
||||
@ -2,7 +2,6 @@ build
|
||||
pip
|
||||
pip-tools
|
||||
pre-commit
|
||||
Sphinx<=8.2
|
||||
tox
|
||||
wheel
|
||||
|
||||
@ -10,6 +9,3 @@ wheel
|
||||
# but it induces an install of cryptography
|
||||
# This is sucky for rpi systems.
|
||||
# twine
|
||||
|
||||
# m2r is for converting .md files to .rst for the docs
|
||||
m2r
|
||||
|
||||
@ -1,49 +1,25 @@
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile --resolver backtracking --annotation-style=line requirements-dev.in -o requirements-dev.txt
|
||||
alabaster==1.0.0 # via sphinx
|
||||
babel==2.17.0 # via sphinx
|
||||
build==1.3.0 # via pip-tools, -r requirements-dev.in
|
||||
cachetools==6.2.2 # via tox
|
||||
certifi==2025.11.12 # via requests
|
||||
cfgv==3.5.0 # via pre-commit
|
||||
chardet==5.2.0 # via tox
|
||||
charset-normalizer==3.4.4 # via requests
|
||||
click==8.3.1 # via pip-tools
|
||||
colorama==0.4.6 # via tox
|
||||
distlib==0.4.0 # via virtualenv
|
||||
docutils==0.21.2 # via m2r, sphinx
|
||||
filelock==3.20.0 # via tox, virtualenv
|
||||
identify==2.6.15 # via pre-commit
|
||||
idna==3.11 # via requests
|
||||
imagesize==1.4.1 # via sphinx
|
||||
jinja2==3.1.6 # via sphinx
|
||||
m2r==0.3.1 # via -r requirements-dev.in
|
||||
markupsafe==3.0.3 # via jinja2
|
||||
mistune==0.8.4 # via m2r
|
||||
nodeenv==1.9.1 # via pre-commit
|
||||
packaging==25.0 # via build, pyproject-api, sphinx, tox
|
||||
packaging==25.0 # via build, pyproject-api, tox
|
||||
pip==25.3 # via pip-tools, -r requirements-dev.in
|
||||
pip-tools==7.5.2 # via -r requirements-dev.in
|
||||
platformdirs==4.5.1 # via tox, virtualenv
|
||||
pluggy==1.6.0 # via tox
|
||||
pre-commit==4.5.0 # via -r requirements-dev.in
|
||||
pygments==2.19.2 # via sphinx
|
||||
pyproject-api==1.10.0 # via tox
|
||||
pyproject-hooks==1.2.0 # via build, pip-tools
|
||||
pyyaml==6.0.3 # via pre-commit
|
||||
requests==2.32.5 # via sphinx
|
||||
setuptools==80.9.0 # via pip-tools
|
||||
snowballstemmer==3.0.1 # via sphinx
|
||||
sphinx==8.1.3 # via -r requirements-dev.in
|
||||
sphinxcontrib-applehelp==2.0.0 # via sphinx
|
||||
sphinxcontrib-devhelp==2.0.0 # via sphinx
|
||||
sphinxcontrib-htmlhelp==2.1.0 # via sphinx
|
||||
sphinxcontrib-jsmath==1.0.1 # via sphinx
|
||||
sphinxcontrib-qthelp==2.0.0 # via sphinx
|
||||
sphinxcontrib-serializinghtml==2.0.0 # via sphinx
|
||||
tomli==2.3.0 # via build, pip-tools, pyproject-api, sphinx, tox
|
||||
tox==4.32.0 # via -r requirements-dev.in
|
||||
typing-extensions==4.15.0 # via tox, virtualenv
|
||||
urllib3==2.6.1 # via requests
|
||||
virtualenv==20.35.4 # via pre-commit, tox
|
||||
wheel==0.45.1 # via pip-tools, -r requirements-dev.in
|
||||
|
||||
11
tox.ini
11
tox.ini
@ -33,13 +33,18 @@ commands =
|
||||
skip_install = true
|
||||
deps =
|
||||
-r{toxinidir}/requirements.txt
|
||||
-r{toxinidir}/requirements-dev.txt
|
||||
-r docs/requirements.txt
|
||||
{toxinidir}/.
|
||||
changedir = {toxinidir}/docs
|
||||
commands =
|
||||
{envpython} clean_docs.py
|
||||
sphinx-apidoc --force --output-dir apidoc {toxinidir}/aprsd
|
||||
sphinx-build -a -W . _build
|
||||
m2r2 --overwrite {toxinidir}/README.md
|
||||
{envpython} -c "import shutil, os; os.chdir('{toxinidir}'); shutil.move('README.rst', 'docs/source/readme.rst')"
|
||||
{envpython} fix_readme_rst.py
|
||||
sphinx-apidoc --force --output-dir source/apidoc {toxinidir}/aprsd
|
||||
#sphinx-build -a -W . _build
|
||||
sphinx-build -M html source build
|
||||
|
||||
|
||||
[testenv:pep8]
|
||||
deps =
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user