aprsd 3.4.4__py3-none-any.whl → 4.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. aprsd/cli_helper.py +12 -5
  2. aprsd/client/aprsis.py +31 -9
  3. aprsd/client/base.py +13 -2
  4. aprsd/client/drivers/aprsis.py +6 -3
  5. aprsd/client/drivers/fake.py +15 -20
  6. aprsd/client/factory.py +0 -2
  7. aprsd/client/fake.py +0 -2
  8. aprsd/client/kiss.py +17 -2
  9. aprsd/client/stats.py +1 -3
  10. aprsd/cmds/completion.py +7 -4
  11. aprsd/cmds/dev.py +38 -42
  12. aprsd/cmds/fetch_stats.py +140 -143
  13. aprsd/cmds/healthcheck.py +5 -3
  14. aprsd/cmds/list_plugins.py +140 -134
  15. aprsd/cmds/listen.py +13 -9
  16. aprsd/cmds/server.py +53 -27
  17. aprsd/conf/__init__.py +1 -2
  18. aprsd/conf/client.py +3 -4
  19. aprsd/conf/common.py +19 -93
  20. aprsd/conf/log.py +2 -4
  21. aprsd/conf/opts.py +5 -4
  22. aprsd/conf/plugin_common.py +11 -121
  23. aprsd/exception.py +2 -0
  24. aprsd/log/log.py +7 -46
  25. aprsd/main.py +10 -4
  26. aprsd/packets/__init__.py +14 -4
  27. aprsd/packets/core.py +57 -67
  28. aprsd/packets/log.py +8 -8
  29. aprsd/packets/packet_list.py +9 -6
  30. aprsd/plugin.py +22 -11
  31. aprsd/plugins/notify.py +1 -4
  32. aprsd/plugins/weather.py +10 -8
  33. aprsd/stats/collector.py +5 -2
  34. aprsd/threads/__init__.py +3 -2
  35. aprsd/threads/aprsd.py +12 -7
  36. aprsd/threads/{keep_alive.py → keepalive.py} +14 -45
  37. aprsd/threads/registry.py +3 -3
  38. aprsd/threads/rx.py +9 -6
  39. aprsd/threads/stats.py +2 -2
  40. aprsd/threads/tx.py +3 -4
  41. aprsd/utils/__init__.py +42 -10
  42. aprsd/utils/json.py +9 -4
  43. aprsd/utils/keepalive_collector.py +55 -0
  44. aprsd/utils/trace.py +0 -2
  45. aprsd-4.0.1.dist-info/AUTHORS +1 -0
  46. {aprsd-3.4.4.dist-info → aprsd-4.0.1.dist-info}/METADATA +307 -408
  47. aprsd-4.0.1.dist-info/RECORD +74 -0
  48. {aprsd-3.4.4.dist-info → aprsd-4.0.1.dist-info}/WHEEL +1 -1
  49. aprsd/cmds/admin.py +0 -57
  50. aprsd/cmds/webchat.py +0 -662
  51. aprsd/conf/plugin_email.py +0 -105
  52. aprsd/plugins/email.py +0 -715
  53. aprsd/plugins/location.py +0 -181
  54. aprsd/threads/log_monitor.py +0 -121
  55. aprsd/web/__init__.py +0 -0
  56. aprsd/web/admin/__init__.py +0 -0
  57. aprsd/web/admin/static/css/index.css +0 -84
  58. aprsd/web/admin/static/css/prism.css +0 -4
  59. aprsd/web/admin/static/css/tabs.css +0 -35
  60. aprsd/web/admin/static/images/Untitled.png +0 -0
  61. aprsd/web/admin/static/images/aprs-symbols-16-0.png +0 -0
  62. aprsd/web/admin/static/images/aprs-symbols-16-1.png +0 -0
  63. aprsd/web/admin/static/images/aprs-symbols-64-0.png +0 -0
  64. aprsd/web/admin/static/images/aprs-symbols-64-1.png +0 -0
  65. aprsd/web/admin/static/images/aprs-symbols-64-2.png +0 -0
  66. aprsd/web/admin/static/js/charts.js +0 -235
  67. aprsd/web/admin/static/js/echarts.js +0 -465
  68. aprsd/web/admin/static/js/logs.js +0 -26
  69. aprsd/web/admin/static/js/main.js +0 -231
  70. aprsd/web/admin/static/js/prism.js +0 -12
  71. aprsd/web/admin/static/js/send-message.js +0 -114
  72. aprsd/web/admin/static/js/tabs.js +0 -28
  73. aprsd/web/admin/templates/index.html +0 -196
  74. aprsd/web/chat/static/css/chat.css +0 -115
  75. aprsd/web/chat/static/css/index.css +0 -66
  76. aprsd/web/chat/static/css/style.css.map +0 -1
  77. aprsd/web/chat/static/css/tabs.css +0 -41
  78. aprsd/web/chat/static/css/upstream/bootstrap.min.css +0 -6
  79. aprsd/web/chat/static/css/upstream/font.woff2 +0 -0
  80. aprsd/web/chat/static/css/upstream/google-fonts.css +0 -23
  81. aprsd/web/chat/static/css/upstream/jquery-ui.css +0 -1311
  82. aprsd/web/chat/static/css/upstream/jquery.toast.css +0 -28
  83. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  84. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  85. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  86. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  87. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/icons.woff +0 -0
  88. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/icons.woff2 +0 -0
  89. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/outline-icons.woff +0 -0
  90. aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  91. aprsd/web/chat/static/images/Untitled.png +0 -0
  92. aprsd/web/chat/static/images/aprs-symbols-16-0.png +0 -0
  93. aprsd/web/chat/static/images/aprs-symbols-16-1.png +0 -0
  94. aprsd/web/chat/static/images/aprs-symbols-64-0.png +0 -0
  95. aprsd/web/chat/static/images/aprs-symbols-64-1.png +0 -0
  96. aprsd/web/chat/static/images/aprs-symbols-64-2.png +0 -0
  97. aprsd/web/chat/static/images/globe.svg +0 -3
  98. aprsd/web/chat/static/js/gps.js +0 -84
  99. aprsd/web/chat/static/js/main.js +0 -45
  100. aprsd/web/chat/static/js/send-message.js +0 -612
  101. aprsd/web/chat/static/js/tabs.js +0 -28
  102. aprsd/web/chat/static/js/upstream/bootstrap.bundle.min.js +0 -7
  103. aprsd/web/chat/static/js/upstream/jquery-3.7.1.min.js +0 -2
  104. aprsd/web/chat/static/js/upstream/jquery-ui.min.js +0 -13
  105. aprsd/web/chat/static/js/upstream/jquery.toast.js +0 -374
  106. aprsd/web/chat/static/js/upstream/semantic.min.js +0 -11
  107. aprsd/web/chat/static/js/upstream/socket.io.min.js +0 -7
  108. aprsd/web/chat/templates/index.html +0 -139
  109. aprsd/wsgi.py +0 -322
  110. aprsd-3.4.4.dist-info/AUTHORS +0 -13
  111. aprsd-3.4.4.dist-info/RECORD +0 -134
  112. {aprsd-3.4.4.dist-info → aprsd-4.0.1.dist-info}/LICENSE +0 -0
  113. {aprsd-3.4.4.dist-info → aprsd-4.0.1.dist-info}/entry_points.txt +0 -0
  114. {aprsd-3.4.4.dist-info → aprsd-4.0.1.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: aprsd
3
- Version: 3.4.4
3
+ Version: 4.0.1
4
4
  Summary: APRSd is a APRS-IS server that can be used to connect to APRS-IS and send and receive APRS packets.
5
5
  Author-email: Craig Lamparter <craig@craiger.org>, "Walter A. Boring IV" <waboring@hemna.com>, Emre Saglam <emresaglam@gmail.com>, Jason Martin <jhmartin@toger.us>, John <johng42@users.noreply.github.com>, Martiros Shakhzadyan <vrzh@vrzh.net>, Zoe Moore <zoenb@mailbox.org>, ranguli <hello@joshmurphy.ca>
6
6
  Maintainer-email: Craig Lamparter <craig@craiger.org>, "Walter A. Boring IV" <waboring@hemna.com>
@@ -197,40 +197,26 @@ Classifier: Programming Language :: Python :: 3.8
197
197
  Classifier: Programming Language :: Python :: 3.9
198
198
  Classifier: Programming Language :: Python :: 3.10
199
199
  Classifier: Programming Language :: Python :: 3.11
200
- Requires-Python: >=3.8
201
- Description-Content-Type: text/x-rst
200
+ Requires-Python: >=3.10
201
+ Description-Content-Type: text/markdown
202
202
  License-File: LICENSE
203
203
  License-File: AUTHORS
204
204
  Requires-Dist: aprslib==0.7.2
205
- Requires-Dist: attrs==24.2.0
205
+ Requires-Dist: attrs==24.3.0
206
206
  Requires-Dist: ax253==0.1.5.post1
207
- Requires-Dist: beautifulsoup4==4.12.3
208
- Requires-Dist: bidict==0.23.1
209
207
  Requires-Dist: bitarray==3.0.0
210
- Requires-Dist: blinker==1.9.0
211
- Requires-Dist: certifi==2024.8.30
212
- Requires-Dist: charset-normalizer==3.4.0
213
- Requires-Dist: click==8.1.7
214
- Requires-Dist: click-params==0.5.0
208
+ Requires-Dist: certifi==2024.12.14
209
+ Requires-Dist: charset-normalizer==3.4.1
210
+ Requires-Dist: click==8.1.8
215
211
  Requires-Dist: commonmark==0.9.1
216
212
  Requires-Dist: dataclasses-json==0.6.7
217
213
  Requires-Dist: debtcollector==3.0.0
218
- Requires-Dist: deprecated==1.2.15
219
- Requires-Dist: flask==3.1.0
220
- Requires-Dist: flask-httpauth==4.8.0
221
- Requires-Dist: flask-socketio==5.4.1
222
- Requires-Dist: geographiclib==2.0
223
- Requires-Dist: geopy==2.4.1
224
- Requires-Dist: h11==0.14.0
214
+ Requires-Dist: haversine==2.9.0
225
215
  Requires-Dist: idna==3.10
226
- Requires-Dist: imapclient==3.0.1
227
- Requires-Dist: importlib-metadata==8.5.0
228
- Requires-Dist: itsdangerous==2.2.0
229
- Requires-Dist: jinja2==3.1.4
216
+ Requires-Dist: importlib-metadata==8.6.1
230
217
  Requires-Dist: kiss3==8.0.0
231
- Requires-Dist: loguru==0.7.2
232
- Requires-Dist: markupsafe==3.0.2
233
- Requires-Dist: marshmallow==3.23.1
218
+ Requires-Dist: loguru==0.7.3
219
+ Requires-Dist: marshmallow==3.26.0
234
220
  Requires-Dist: mypy-extensions==1.0.0
235
221
  Requires-Dist: netaddr==1.3.0
236
222
  Requires-Dist: oslo-config==9.7.0
@@ -238,93 +224,59 @@ Requires-Dist: oslo-i18n==6.5.0
238
224
  Requires-Dist: packaging==24.2
239
225
  Requires-Dist: pbr==6.1.0
240
226
  Requires-Dist: pluggy==1.5.0
241
- Requires-Dist: pygments==2.18.0
227
+ Requires-Dist: pygments==2.19.1
242
228
  Requires-Dist: pyserial==3.5
243
229
  Requires-Dist: pyserial-asyncio==0.6
244
- Requires-Dist: python-engineio==4.10.1
245
- Requires-Dist: python-socketio==5.11.4
246
230
  Requires-Dist: pytz==2024.2
247
231
  Requires-Dist: pyyaml==6.0.2
248
232
  Requires-Dist: requests==2.32.3
249
233
  Requires-Dist: rfc3986==2.0.0
250
234
  Requires-Dist: rich==12.6.0
251
235
  Requires-Dist: rush==2021.4.0
252
- Requires-Dist: shellingham==1.5.4
253
- Requires-Dist: simple-websocket==1.1.0
254
- Requires-Dist: six==1.16.0
255
- Requires-Dist: soupsieve==2.6
256
236
  Requires-Dist: stevedore==5.4.0
257
- Requires-Dist: tabulate==0.9.0
258
237
  Requires-Dist: thesmuggler==1.0.1
259
238
  Requires-Dist: timeago==1.0.16
260
239
  Requires-Dist: typing-extensions==4.12.2
261
240
  Requires-Dist: typing-inspect==0.9.0
262
241
  Requires-Dist: tzlocal==5.2
263
242
  Requires-Dist: update-checker==0.18.0
264
- Requires-Dist: urllib3==2.2.3
265
- Requires-Dist: validators==0.22.0
266
- Requires-Dist: werkzeug==3.1.3
267
- Requires-Dist: wrapt==1.17.0
268
- Requires-Dist: wsproto==1.2.0
243
+ Requires-Dist: urllib3==2.3.0
244
+ Requires-Dist: wrapt==1.17.2
269
245
  Requires-Dist: zipp==3.21.0
270
246
  Provides-Extra: dev
271
- Requires-Dist: add-trailing-comma==3.1.0; extra == "dev"
272
247
  Requires-Dist: alabaster==1.0.0; extra == "dev"
273
- Requires-Dist: autoflake==1.5.3; extra == "dev"
274
248
  Requires-Dist: babel==2.16.0; extra == "dev"
275
- Requires-Dist: black==24.10.0; extra == "dev"
276
249
  Requires-Dist: build==1.2.2.post1; extra == "dev"
277
- Requires-Dist: cachetools==5.5.0; extra == "dev"
278
- Requires-Dist: certifi==2024.8.30; extra == "dev"
250
+ Requires-Dist: cachetools==5.5.1; extra == "dev"
251
+ Requires-Dist: certifi==2024.12.14; extra == "dev"
279
252
  Requires-Dist: cfgv==3.4.0; extra == "dev"
280
253
  Requires-Dist: chardet==5.2.0; extra == "dev"
281
- Requires-Dist: charset-normalizer==3.4.0; extra == "dev"
282
- Requires-Dist: check-manifest==0.50; extra == "dev"
283
- Requires-Dist: click==8.1.7; extra == "dev"
254
+ Requires-Dist: charset-normalizer==3.4.1; extra == "dev"
255
+ Requires-Dist: click==8.1.8; extra == "dev"
284
256
  Requires-Dist: colorama==0.4.6; extra == "dev"
285
- Requires-Dist: commonmark==0.9.1; extra == "dev"
286
- Requires-Dist: configargparse==1.7; extra == "dev"
287
- Requires-Dist: coverage[toml]==7.6.8; extra == "dev"
288
257
  Requires-Dist: distlib==0.3.9; extra == "dev"
289
258
  Requires-Dist: docutils==0.21.2; extra == "dev"
290
- Requires-Dist: exceptiongroup==1.2.2; extra == "dev"
291
- Requires-Dist: filelock==3.16.1; extra == "dev"
292
- Requires-Dist: fixit==2.1.0; extra == "dev"
293
- Requires-Dist: flake8==7.1.1; extra == "dev"
294
- Requires-Dist: gray==0.15.0; extra == "dev"
295
- Requires-Dist: identify==2.6.3; extra == "dev"
259
+ Requires-Dist: filelock==3.17.0; extra == "dev"
260
+ Requires-Dist: identify==2.6.6; extra == "dev"
296
261
  Requires-Dist: idna==3.10; extra == "dev"
297
262
  Requires-Dist: imagesize==1.4.1; extra == "dev"
298
- Requires-Dist: iniconfig==2.0.0; extra == "dev"
299
- Requires-Dist: isort==5.13.2; extra == "dev"
300
- Requires-Dist: jinja2==3.1.4; extra == "dev"
301
- Requires-Dist: libcst==1.5.1; extra == "dev"
263
+ Requires-Dist: jinja2==3.1.5; extra == "dev"
302
264
  Requires-Dist: m2r==0.3.1; extra == "dev"
303
265
  Requires-Dist: markupsafe==3.0.2; extra == "dev"
304
- Requires-Dist: mccabe==0.7.0; extra == "dev"
305
266
  Requires-Dist: mistune==0.8.4; extra == "dev"
306
- Requires-Dist: moreorless==0.4.0; extra == "dev"
307
- Requires-Dist: mypy==1.13.0; extra == "dev"
308
- Requires-Dist: mypy-extensions==1.0.0; extra == "dev"
309
267
  Requires-Dist: nodeenv==1.9.1; extra == "dev"
310
268
  Requires-Dist: packaging==24.2; extra == "dev"
311
- Requires-Dist: pathspec==0.12.1; extra == "dev"
312
- Requires-Dist: pep8-naming==0.14.1; extra == "dev"
269
+ Requires-Dist: pip==24.3.1; extra == "dev"
313
270
  Requires-Dist: pip-tools==7.4.1; extra == "dev"
314
271
  Requires-Dist: platformdirs==4.3.6; extra == "dev"
315
272
  Requires-Dist: pluggy==1.5.0; extra == "dev"
316
- Requires-Dist: pre-commit==4.0.1; extra == "dev"
317
- Requires-Dist: pycodestyle==2.12.1; extra == "dev"
318
- Requires-Dist: pyflakes==3.2.0; extra == "dev"
319
- Requires-Dist: pygments==2.18.0; extra == "dev"
320
- Requires-Dist: pyproject-api==1.8.0; extra == "dev"
273
+ Requires-Dist: pre-commit==4.1.0; extra == "dev"
274
+ Requires-Dist: pygments==2.19.1; extra == "dev"
275
+ Requires-Dist: pyproject-api==1.9.0; extra == "dev"
321
276
  Requires-Dist: pyproject-hooks==1.2.0; extra == "dev"
322
- Requires-Dist: pytest==8.3.4; extra == "dev"
323
- Requires-Dist: pytest-cov==6.0.0; extra == "dev"
324
- Requires-Dist: pyupgrade==3.19.0; extra == "dev"
325
277
  Requires-Dist: pyyaml==6.0.2; extra == "dev"
326
278
  Requires-Dist: requests==2.32.3; extra == "dev"
327
- Requires-Dist: rich==12.6.0; extra == "dev"
279
+ Requires-Dist: setuptools==75.8.0; extra == "dev"
328
280
  Requires-Dist: snowballstemmer==2.2.0; extra == "dev"
329
281
  Requires-Dist: sphinx==8.1.3; extra == "dev"
330
282
  Requires-Dist: sphinxcontrib-applehelp==2.0.0; extra == "dev"
@@ -333,120 +285,164 @@ Requires-Dist: sphinxcontrib-htmlhelp==2.1.0; extra == "dev"
333
285
  Requires-Dist: sphinxcontrib-jsmath==1.0.1; extra == "dev"
334
286
  Requires-Dist: sphinxcontrib-qthelp==2.0.0; extra == "dev"
335
287
  Requires-Dist: sphinxcontrib-serializinghtml==2.0.0; extra == "dev"
336
- Requires-Dist: tokenize-rt==6.1.0; extra == "dev"
337
- Requires-Dist: toml==0.10.2; extra == "dev"
338
288
  Requires-Dist: tomli==2.2.1; extra == "dev"
339
- Requires-Dist: tox==4.23.2; extra == "dev"
340
- Requires-Dist: trailrunner==1.4.0; extra == "dev"
289
+ Requires-Dist: tox==4.24.1; extra == "dev"
341
290
  Requires-Dist: typing-extensions==4.12.2; extra == "dev"
342
- Requires-Dist: unify==0.5; extra == "dev"
343
- Requires-Dist: untokenize==0.1.1; extra == "dev"
344
- Requires-Dist: urllib3==2.2.3; extra == "dev"
345
- Requires-Dist: virtualenv==20.28.0; extra == "dev"
291
+ Requires-Dist: urllib3==2.3.0; extra == "dev"
292
+ Requires-Dist: virtualenv==20.29.1; extra == "dev"
346
293
  Requires-Dist: wheel==0.45.1; extra == "dev"
347
294
 
348
- ===============================================
349
- APRSD - Ham radio APRS-IS Message plugin server
350
- ===============================================
351
-
352
- KM6LYW and WB4BOR
353
- ____________________
354
-
355
- |pypi| |pytest| |versions| |slack| |issues| |commit| |imports| |down|
356
-
357
-
358
- `APRSD <http://github.com/craigerl/aprsd>`_ is a Ham radio `APRS <http://aprs.org>`_ message command gateway built on python.
359
-
360
-
361
- Table of Contents
362
- =================
363
-
364
- 1. `What is APRSD <#what-is-aprsd>`_
365
- 2. `APRSD Overview Diagram <#aprsd-overview-diagram>`_
366
- 3. `Typical Use Case <#typical-use-case>`_
367
- 4. `Installation <#installation>`_
368
- 5. `Example Usage <#example-usage>`_
369
- 6. `Help <#help>`_
370
- 7. `Commands <#commands>`_
371
- - `Configuration <#configuration>`_
372
- - `Server <#server>`_
373
- - `Current List of Built-in Plugins <#current-list-of-built-in-plugins>`_
374
- - `Pypi.org APRSD Installable Plugin Packages <#pypiorg-aprsd-installable-plugin-packages>`_
375
- - `🐍 APRSD Installed 3rd Party Plugins <#aprsd-installed-3rd-party-plugins>`_
376
- - `Send Message <#send-message>`_
377
- - `Send Email (Radio to SMTP Server) <#send-email-radio-to-smtp-server>`_
378
- - `Receive Email (IMAP Server to Radio) <#receive-email-imap-server-to-radio>`_
379
- - `Location <#location>`_
380
- - `Web Admin Interface <#web-admin-interface>`_
381
- 8. `Development <#development>`_
382
- - `Building Your Own APRSD Plugins <#building-your-own-aprsd-plugins>`_
383
- 9. `Workflow <#workflow>`_
384
- 10. `Release <#release>`_
385
- 11. `Docker Container <#docker-container>`_
386
- - `Building <#building-1>`_
387
- - `Official Build <#official-build>`_
388
- - `Development Build <#development-build>`_
389
- - `Running the Container <#running-the-container>`_
390
-
391
-
392
- What is APRSD
393
- =============
394
- APRSD is a python application for interacting with the APRS network and providing
395
- APRS services for HAM radio operators.
295
+ # APRSD - Ham radio APRS-IS Message platform software
296
+
297
+ ## KM6LYW and WB4BOR
298
+
299
+ [![pypi](https://badge.fury.io/py/aprsd.svg)](https://badge.fury.io/py/aprsd)
300
+ [![versions](https://img.shields.io/pypi/pyversions/aprsd.svg)](https://pypi.org/pypi/aprsd)
301
+ [![slack](https://img.shields.io/badge/slack-@hemna/aprsd-blue.svg?logo=slack)](https://hemna.slack.com/app_redirect?channel=C01KQSCP5RP)
302
+ ![issues](https://img.shields.io/github/issues/craigerl/aprsd)
303
+ ![commit](https://img.shields.io/github/last-commit/craigerl/aprsd)
304
+ [![imports](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://timothycrosley.github.io/isort/)
305
+ [![down](https://static.pepy.tech/personalized-badge/aprsd?period=month&units=international_system&left_color=black&right_color=orange&left_text=Downloads)](https://pepy.tech/project/aprsd)
306
+
307
+ [APRSD](http://github.com/craigerl/aprsd) is a Ham radio
308
+ [APRS](http://aprs.org) message platform built with python.
309
+
310
+ ![image](./aprsd_logo.png)
311
+
312
+ # Table of Contents
313
+
314
+ 1. [APRSD - Ham radio APRS-IS Message platform software](#aprsd---ham-radio-aprs-is-message-platform-software)
315
+ 2. [What is APRSD](#what-is-aprsd)
316
+ 3. [APRSD Plugins/Extensions](#aprsd-pluginsextensions)
317
+ 4. [List of existing plugins - APRS Message processing/responders](#list-of-existing-plugins---aprs-message-processingresponders)
318
+ 5. [List of existing extensions - Add new capabilities to APRSD](#list-of-existing-extensions---add-new-capabilities-to-aprsd)
319
+ 6. [APRSD Overview Diagram](#aprsd-overview-diagram)
320
+ 7. [Typical use case](#typical-use-case)
321
+ 8. [Installation](#installation)
322
+ 9. [Example usage](#example-usage)
323
+ 10. [Help](#help)
324
+ 11. [Commands](#commands)
325
+ 12. [Configuration](#configuration)
326
+ 13. [server](#server)
327
+ 14. [Current list plugins](#current-list-plugins)
328
+ 15. [Current list extensions](#current-list-extensions)
329
+ 16. [send-message](#send-message)
330
+ 17. [Development](#development)
331
+ 18. [Release](#release)
332
+ 19. [Building your own APRSD plugins](#building-your-own-aprsd-plugins)
333
+ 20. [Overview](#overview)
334
+ 21. [Docker Container](#docker-container)
335
+ 22. [Building](#building)
336
+ 23. [Official Build](#official-build)
337
+ 24. [Development Build](#development-build)
338
+ 25. [Running the container](#running-the-container)
339
+ 26. [Activity](#activity)
340
+ 27. [Star History](#star-history)
341
+
342
+ ---
343
+
344
+ > [!WARNING]
345
+ > Legal operation of this software requires an amateur radio license and a valid call sign.
346
+
347
+ > [!NOTE]
348
+ > 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.
349
+
350
+ ### What is APRSD
351
+
352
+ APRSD is a python application for interacting with the APRS network and Ham radios with KISS interfaces and
353
+ providing APRS services for HAM radio operators.
396
354
 
397
355
  APRSD currently has 4 main commands to use.
398
- * server - Connect to APRS and listen/respond to APRS messages
399
- * webchat - web based chat program over APRS
400
- * send-message - Send a message to a callsign via APRS_IS.
401
- * listen - Listen to packets on the APRS-IS Network based on FILTER.
402
356
 
403
- Each of those commands can connect to the APRS-IS network if internet connectivity
404
- is available. If internet is not available, then APRS can be configured to talk
405
- to a TCP KISS TNC for radio connectivity.
357
+ - server - Connect to APRS and listen/respond to APRS messages
358
+ - send-message - Send a message to a callsign via APRS_IS.
359
+ - listen - Listen to packets on the APRS-IS Network based on FILTER.
360
+ - check-version - check the version of aprsd
361
+ - sample-config - generate a sample config file
362
+ - dev - helpful for testing new aprsd plugins under development
363
+ - dump-stats - output the stats of a running aprsd server command
364
+ - list-plugins - list the built in plugins, available plugins on pypi.org and installed plugins
365
+ - list-extensions - list the available extensions on pypi.org and installed extensions
406
366
 
407
- Please `read the docs`_ to learn more!
367
+ Each of those commands can connect to the APRS-IS network if internet
368
+ connectivity is available. If internet is not available, then APRS can
369
+ be configured to talk to a TCP KISS TNC for radio connectivity directly.
408
370
 
409
- APRSD Overview Diagram
410
- ======================
371
+ Please [read the docs](https://aprsd.readthedocs.io) to learn more!
411
372
 
412
- .. image:: https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true
413
373
 
414
- Typical use case
415
- ================
374
+ ### APRSD Plugins/Extensions
416
375
 
417
- APRSD's typical use case is that of providing an APRS wide service to all HAM
418
- radio operators. For example the callsign 'REPEAT' on the APRS network is actually
419
- an instance of APRSD that can provide a list of HAM repeaters in the area of the
420
- callsign that sent the message.
376
+ 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.
421
377
 
378
+ 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)
422
379
 
423
- Ham radio operator using an APRS enabled HAM radio sends a message to check
424
- the weather. An APRS message is sent, and then picked up by APRSD. The
425
- APRS packet is decoded, and the message is sent through the list of plugins
426
- for processing. For example, the WeatherPlugin picks up the message, fetches the weather
427
- for the area around the user who sent the request, and then responds with
428
- the weather conditions in that area. Also includes a watch list of HAM
429
- callsigns to look out for. The watch list can notify you when a HAM callsign
430
- in the list is seen and now available to message on the APRS network.
380
+ > [!NOTE]
381
+ > aprsd admin and webchat commands have been extracted into separate extensions.
382
+ * [See admin extension here](https://github.com/hemna/aprsd-admin-extension) <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>
431
383
 
384
+ * [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>
432
385
 
433
386
 
434
- Installation
435
- =============
387
+ ### List of existing plugins - APRS Message processing/responders
436
388
 
437
- To install ``aprsd``, use Pip:
389
+ - [aprsd-email-plugin](https://github.com/hemna/aprsd-email-plugin) - send/receive email!
390
+ - [aprsd-location-plugin](https://github.com/hemna/aprsd-location-plugin) - get latest GPS location.
391
+ - [aprsd-locationdata-plugin](https://github.com/hemna/aprsd-locationdata-plugin) - get latest GPS location
392
+ - [aprsd-digipi-plugin](https://github.com/hemna/aprsd-digipi-plugin) - Look for digipi beacon packets
393
+ - [aprsd-w3w-plugin](https://github.com/hemna/aprsd-w3w-plugin) - get your w3w coordinates
394
+ - [aprsd-mqtt-plugin](https://github.com/hemna/aprsd-mqtt-plugin) - send aprs packets to an MQTT topic
395
+ - [aprsd-telegram-plugin](https://github.com/hemna/aprsd-telegram-plugin) - send/receive messages to telegram
396
+ - [aprsd-borat-plugin](https://github.com/hemna/aprsd-borat-plugin) - get Borat quotes
397
+ - [aprsd-wxnow-plugin](https://github.com/hemna/aprsd-wxnow-plugin) - get closest N weather station reports
398
+ - [aprsd-weewx-plugin](https://github.com/hemna/aprsd-weewx-plugin) - get weather from your weewx weather station
399
+ - [aprsd-slack-plugin](https://github.com/hemna/aprsd-slack-plugin) - send/receive messages to a slack channel
400
+ - [aprsd-sentry-plugin](https://github.com/hemna/aprsd-sentry-plugin) -
401
+ - [aprsd-repeat-plugins](https://github.com/hemna/aprsd-repeat-plugins) - plugins for the REPEAT service. Get nearest Ham radio repeaters!
402
+ - [aprsd-twitter-plugin](https://github.com/hemna/aprsd-twitter-plugin) - make tweets from your Ham Radio!
403
+ - [aprsd-timeopencage-plugin](https://github.com/hemna/aprsd-timeopencage-plugin) - Get local time for a callsign
404
+ - [aprsd-stock-plugin](https://github.com/hemna/aprsd-stock-plugin) - get stock quotes from your Ham radio
438
405
 
439
- ``pip install aprsd``
406
+ ### List of existing extensions - Add new capabilities to APRSD
440
407
 
441
- Example usage
442
- ==============
408
+ - [aprsd-admin-extension](https://github.com/hemna/aprsd-admin-extension) - Web Administration page for APRSD
409
+ - [aprsd-webchat-extension](https://github.com/hemna/aprsd-webchat-extension) - Web page for APRS Messaging
410
+ - [aprsd-irc-extension](https://github.com/hemna/aprsd-irc-extension) - an IRC like server command for APRS
443
411
 
444
- ``aprsd -h``
412
+ ### APRSD Overview Diagram
445
413
 
446
- Help
447
- ====
448
- ::
414
+ ![image](https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true)
449
415
 
416
+ ### Typical use case
417
+
418
+ APRSD\'s typical use case is that of providing an APRS wide service to
419
+ all HAM radio operators. For example the callsign \'REPEAT\' on the APRS
420
+ network is actually an instance of APRSD that can provide a list of HAM
421
+ repeaters in the area of the callsign that sent the message.
422
+
423
+ Ham radio operator using an APRS enabled HAM radio sends a message to
424
+ check the weather. An APRS message is sent, and then picked up by APRSD.
425
+ The APRS packet is decoded, and the message is sent through the list of
426
+ plugins for processing. For example, the WeatherPlugin picks up the
427
+ message, fetches the weather for the area around the user who sent the
428
+ request, and then responds with the weather conditions in that area.
429
+ Also includes a watch list of HAM callsigns to look out for. The watch
430
+ list can notify you when a HAM callsign in the list is seen and now
431
+ available to message on the APRS network.
432
+
433
+ ### Installation
434
+
435
+ To install `aprsd`, use Pip:
436
+
437
+ `pip install aprsd`
438
+
439
+ ### Example usage
440
+
441
+ `aprsd -h`
442
+
443
+ ### Help
444
+
445
+ :
450
446
 
451
447
  └─> aprsd -h
452
448
  Usage: aprsd [OPTIONS] COMMAND [ARGS]...
@@ -468,31 +464,25 @@ Help
468
464
  send-message Send a message to a callsign via APRS_IS.
469
465
  server Start the aprsd server gateway process.
470
466
  version Show the APRSD version.
471
- webchat Web based HAM Radio chat program!
472
467
 
468
+ ### Commands
473
469
 
474
- Commands
475
- ========
470
+ ### Configuration
476
471
 
477
- Configuration
478
- =============
479
- This command outputs a sample config yml formatted block that you can edit
480
- and use to pass in to ``aprsd`` with ``-c``. By default aprsd looks in ``~/.config/aprsd/aprsd.yml``
472
+ This command outputs a sample config yml formatted block that you can
473
+ edit and use to pass in to `aprsd` with `-c`. By default aprsd looks in
474
+ `~/.config/aprsd/aprsd.yml`
481
475
 
482
- ``aprsd sample-config``
483
-
484
- ::
476
+ `aprsd sample-config`
485
477
 
486
478
  └─> aprsd sample-config
487
479
  ...
488
480
 
489
- server
490
- ======
481
+ ### server
491
482
 
492
483
  This is the main server command that will listen to APRS-IS servers and
493
- look for incomming commands to the callsign configured in the config file
494
-
495
- ::
484
+ look for incomming commands to the callsign configured in the config
485
+ file
496
486
 
497
487
  └─[$] > aprsd server --help
498
488
  Usage: aprsd server [OPTIONS]
@@ -512,35 +502,32 @@ look for incomming commands to the callsign configured in the config file
512
502
  -h, --help Show this message and exit.
513
503
 
514
504
  └─> aprsd server
515
- Load config
516
- 12/07/2021 03:16:17 PM MainThread INFO APRSD is up to date server.py:51
517
- 12/07/2021 03:16:17 PM MainThread INFO APRSD Started version: 2.5.6 server.py:52
518
- 12/07/2021 03:16:17 PM MainThread INFO Using CONFIG values: server.py:55
519
- 12/07/2021 03:16:17 PM MainThread INFO ham.callsign = WB4BOR server.py:60
520
- 12/07/2021 03:16:17 PM MainThread INFO aprs.login = WB4BOR-12 server.py:60
521
- 12/07/2021 03:16:17 PM MainThread INFO aprs.password = XXXXXXXXXXXXXXXXXXX server.py:58
522
- 12/07/2021 03:16:17 PM MainThread INFO aprs.host = noam.aprs2.net server.py:60
523
- 12/07/2021 03:16:17 PM MainThread INFO aprs.port = 14580 server.py:60
524
- 12/07/2021 03:16:17 PM MainThread INFO aprs.logfile = /tmp/aprsd.log server.py:60
525
-
526
-
527
- Current list of built-in plugins
528
- --------------------------------
529
- ::
505
+ Registering LogMonitorThread
506
+ 2025-01-06 16:27:12.398 | MainThread | INFO | APRSD is up to date | aprsd.cmds.server:server:82
507
+ 2025-01-06 16:27:12.398 | MainThread | INFO | APRSD Started version: 3.5.1.dev0+g72d068c.d20250102 | aprsd.cmds.server:server:83
508
+ 2025-01-06 16:27:12.398 | MainThread | INFO | Creating client connection | aprsd.cmds.server:server:101
509
+ 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
510
+ 2025-01-06 16:27:12.398 | MainThread | INFO | Attempting connection to noam.aprs2.net:14580 | aprslib.inet:_connect:226
511
+ 2025-01-06 16:27:12.473 | MainThread | INFO | Connected to ('44.135.208.225', 14580) | aprslib.inet:_connect:233
512
+ 2025-01-06 16:27:12.617 | MainThread | INFO | Login successful | aprsd.client.drivers.aprsis:_send_login:154
513
+ 2025-01-06 16:27:12.618 | MainThread | INFO | Connected to T2BC | aprsd.client.drivers.aprsis:_send_login:156
514
+ 2025-01-06 16:27:12.618 | MainThread | INFO | <aprsd.client.aprsis.APRSISClient object at 0x103a36480> | aprsd.cmds.server:server:103
515
+ 2025-01-06 16:27:12.618 | MainThread | INFO | Loading Plugin Manager and registering plugins | aprsd.cmds.server:server:117
516
+ 2025-01-06 16:27:12.619 | MainThread | INFO | Loading APRSD Plugins | aprsd.plugin:setup_plugins:492
517
+
518
+
519
+ #### Current list plugins
530
520
 
531
521
  └─> aprsd list-plugins
532
- 🐍 APRSD Built-in Plugins 🐍
522
+ 🐍 APRSD Built-in Plugins 🐍
533
523
  ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
534
524
  ┃ Plugin Name ┃ Info ┃ Type ┃ Plugin Path ┃
535
525
  ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
536
526
  │ AVWXWeatherPlugin │ AVWX weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.AVWXWeatherPlugin │
537
- │ EmailPlugin │ Send and Receive email │ RegexCommand │ aprsd.plugins.email.EmailPlugin │
538
527
  │ FortunePlugin │ Give me a fortune │ RegexCommand │ aprsd.plugins.fortune.FortunePlugin │
539
- │ LocationPlugin │ Where in the world is a CALLSIGN's last GPS beacon? │ RegexCommand │ aprsd.plugins.location.LocationPlugin │
540
528
  │ NotifySeenPlugin │ Notify me when a CALLSIGN is recently seen on APRS-IS │ WatchList │ aprsd.plugins.notify.NotifySeenPlugin │
541
529
  │ OWMWeatherPlugin │ OpenWeatherMap weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.OWMWeatherPlugin │
542
530
  │ PingPlugin │ reply with a Pong! │ RegexCommand │ aprsd.plugins.ping.PingPlugin │
543
- │ QueryPlugin │ APRSD Owner command to query messages in the MsgTrack │ RegexCommand │ aprsd.plugins.query.QueryPlugin │
544
531
  │ TimeOWMPlugin │ Current time of GPS beacon's timezone. Uses OpenWeatherMap │ RegexCommand │ aprsd.plugins.time.TimeOWMPlugin │
545
532
  │ TimePlugin │ What is the current local time. │ RegexCommand │ aprsd.plugins.time.TimePlugin │
546
533
  │ USMetarPlugin │ USA only METAR of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.USMetarPlugin │
@@ -551,37 +538,59 @@ Current list of built-in plugins
551
538
 
552
539
  Pypi.org APRSD Installable Plugin Packages
553
540
 
554
- Install any of the following plugins with 'pip install <Plugin Package Name>'
555
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
556
- ┃ Plugin Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃
557
- ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
558
- │ 📂 aprsd-stock-plugin │ Ham Radio APRSD Plugin for fetching stock quotes │ 0.1.3 │ Dec 2, 2022 │ No │
559
- │ 📂 aprsd-sentry-plugin Ham radio APRSD plugin that does.... 0.1.2 Dec 2, 2022 │ No │
560
- 📂 aprsd-timeopencage-plugin APRSD plugin for fetching time based on GPS location 0.1.0 Dec 2, 2022 No │
561
- │ 📂 aprsd-weewx-plugin │ HAM Radio APRSD that reports weather from a weewx weather station. │ 0.1.4 Dec 7, 2021 Yes
562
- │ 📂 aprsd-repeat-plugins APRSD Plugins for the REPEAT service 1.0.12 Dec 2, 2022 │ No │
563
- │ 📂 aprsd-telegram-plugin Ham Radio APRS APRSD plugin for Telegram IM service 0.1.3 Dec 2, 2022 │ No │
564
- │ 📂 aprsd-twitter-pluginPython APRSD plugin to send tweets 0.3.0 Dec 7, 2021 │ No │
565
- │ 📂 aprsd-slack-plugin Amateur radio APRS daemon which listens for messages and responds 1.0.5 Dec 18, 2022 │ No │
566
- └──────────────────────────────┴────────────────────────────────────────────────────────────────────┴─────────┴──────────────┴────────────┘
567
-
568
-
569
- 🐍 APRSD Installed 3rd party Plugins 🐍
541
+ Install any of the following plugins with
542
+ 'pip install <Plugin Package Name>'
543
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
544
+ ┃ Plugin Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃
545
+ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
546
+ │ 📂 aprsd-assistant-plugin APRSd plugin for hosting the APRS Assistant chatbot 0.0.3 2024-10-20T02:59:39 │ No │
547
+ (aprs-assistant)
548
+ │ 📂 aprsd-borat-plugin │ Borat quotes for aprsd plugin │ 0.1.1.dev1 2024-01-19T16:04:38No
549
+ │ 📂 aprsd-locationdata-plugin Fetch location information from a callsign 0.3.0 2024-02-06T17:20:43 │ No │
550
+ │ 📂 aprsd-mqtt-plugin APRSD MQTT Plugin sends APRS packets to mqtt queue 0.2.0 2023-04-17T16:01:50 │ No │
551
+ │ 📂 aprsd-repeat-plugins │ APRSD Plugins for the REPEAT service 1.2.0 2023-01-10T17:15:36 │ No │
552
+ │ 📂 aprsd-sentry-plugin Ham radio APRSD plugin that does.... 0.1.2 │ 2022-12-02T19:07:33 │ No │
553
+ │ 📂 aprsd-slack-plugin │ Amateur radio APRS daemon which listens for messages and │ 1.2.0 │ 2023-01-10T19:21:33 │ No │
554
+ │ │ responds │ │ │ │
555
+ │ 📂 aprsd-stock-plugin │ Ham Radio APRSD Plugin for fetching stock quotes │ 0.1.3 │ 2022-12-02T18:56:19 │ Yes │
556
+ 📂 aprsd-telegram-plugin │ Ham Radio APRS APRSD plugin for Telegram IM service │ 0.1.3 │ 2022-12-02T19:07:15 │ No │
557
+ │ 📂 aprsd-timeopencage-plugin │ APRSD plugin for fetching time based on GPS location │ 0.2.0 │ 2023-01-10T17:07:11 │ No │
558
+ │ 📂 aprsd-twitter-plugin │ Python APRSD plugin to send tweets │ 0.5.0 │ 2023-01-10T16:51:47 │ No │
559
+ │ 📂 aprsd-weewx-plugin │ HAM Radio APRSD that reports weather from a weewx weather │ 0.3.2 │ 2023-04-20T20:16:19 │ No │
560
+ │ │ station. │ │ │ │
561
+ │ 📂 aprsd-wxnow-plugin │ APRSD Plugin for getting the closest wx reports to last │ 0.2.0 │ 2023-10-08T01:27:29 │ Yes │
562
+ │ │ beacon │ │ │ │
563
+ └──────────────────────────────┴──────────────────────────────────────────────────────────────┴────────────┴─────────────────────┴────────────┘
564
+
565
+
566
+ 🐍 APRSD Installed 3rd party Plugins 🐍
570
567
  ┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
571
568
  ┃ Package Name ┃ Plugin Name ┃ Version ┃ Type ┃ Plugin Path ┃
572
569
  ┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
573
- │ aprsd-weewx-plugin │ WeewxMQTTPlugin 1.0 │ RegexCommand │ aprsd_weewx_plugin.weewx.WeewxMQTTPlugin
570
+ │ aprsd-stock-plugin │ YahooStockQuote 0.1.3 │ RegexCommand │ aprsd_stock_plugin.stock.YahooStockQuote
571
+ │ aprsd-wxnow-plugin │ WXNowPlugin │ 0.2.0 │ RegexCommand │ aprsd_wxnow_plugin.conf.opts.WXNowPlugin │
574
572
  └────────────────────┴─────────────────┴─────────┴──────────────┴──────────────────────────────────────────┘
575
573
 
574
+ #### Current list extensions
575
+ └─> aprsd list-extensions
576
+
576
577
 
578
+ Pypi.org APRSD Installable Extension Packages
577
579
 
578
- send-message
579
- ============
580
+ Install any of the following extensions by running
581
+ 'pip install <Plugin Package Name>'
582
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
583
+ ┃ Extension Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃
584
+ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
585
+ │ 📂 aprsd-admin-extension │ Administration extension for the Ham radio APRSD Server │ 1.0.1 │ 2025-01-06T21:57:24 │ Yes │
586
+ │ 📂 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 │
587
+ │ │ for APRS │ │ │ │
588
+ └──────────────────────────┴─────────────────────────────────────────────────────────────────────┴─────────┴─────────────────────┴────────────┘
580
589
 
581
- This command is typically used for development to send another aprsd instance
582
- test messages
590
+ ### send-message
583
591
 
584
- ::
592
+ This command is typically used for development to send another aprsd
593
+ instance test messages
585
594
 
586
595
  └─[$] > aprsd send-message -h
587
596
  Usage: aprsd send-message [OPTIONS] TOCALLSIGN COMMAND...
@@ -607,243 +616,133 @@ test messages
607
616
  --raw TEXT Send a raw message. Implies --no-ack
608
617
  -h, --help Show this message and exit.
609
618
 
619
+ ### Development
610
620
 
611
- SEND EMAIL (radio to smtp server)
612
- =================================
613
-
614
- ::
615
-
616
- Received message______________
617
- Raw : KM6XXX>APY400,WIDE1-1,qAO,KM6XXX-1::KM6XXX-9 :-user@host.com test new shortcuts global, radio to pc{29
618
- From : KM6XXX
619
- Message : -user@host.com test new shortcuts global, radio to pc
620
- Msg number : 29
621
-
622
- Sending Email_________________
623
- To : user@host.com
624
- Subject : KM6XXX
625
- Body : test new shortcuts global, radio to pc
626
-
627
- Sending ack __________________ Tx(3)
628
- Raw : KM6XXX-9>APRS::KM6XXX :ack29
629
- To : KM6XXX
630
- Ack number : 29
631
-
632
-
633
- RECEIVE EMAIL (imap server to radio)
634
- ====================================
635
-
636
- ::
637
-
638
- Sending message_______________ 6(Tx3)
639
- Raw : KM6XXX-9>APRS::KM6XXX :-somebody@gmail.com email from internet to radio{6
640
- To : KM6XXX
641
- Message : -somebody@gmail.com email from internet to radio
642
-
643
- Received message______________
644
- Raw : KM6XXX>APY400,WIDE1-1,qAO,KM6XXX-1::KM6XXX-9 :ack6
645
- From : KM6XXX
646
- Message : ack6
647
- Msg number : 0
648
-
649
-
650
- LOCATION
651
- ========
621
+ - `git clone git@github.com:craigerl/aprsd.git`
622
+ - `cd aprsd`
623
+ - `make`
652
624
 
653
- ::
654
-
655
- Received Message _______________
656
- Raw : KM6XXX-6>APRS,TCPIP*,qAC,T2CAEAST::KM6XXX-14:location{2
657
- From : KM6XXX-6
658
- Message : location
659
- Msg number : 2
660
- Received Message _______________ Complete
661
-
662
- Sending Message _______________
663
- Raw : KM6XXX-14>APRS::KM6XXX-6 :KM6XXX-6: 8 Miles E Auburn CA 0' 0,-120.93584 1873.7h ago{2
664
- To : KM6XXX-6
665
- Message : KM6XXX-6: 8 Miles E Auburn CA 0' 0,-120.93584 1873.7h ago
666
- Msg number : 2
667
- Sending Message _______________ Complete
668
-
669
- Sending ack _______________
670
- Raw : KM6XXX-14>APRS::KM6XXX-6 :ack2
671
- To : KM6XXX-6
672
- Ack : 2
673
- Sending ack _______________ Complete
674
-
675
- AND... ping, fortune, time.....
676
-
677
-
678
- Web Admin Interface
679
- ===================
680
- APRSD has a web admin interface that allows you to view the status of the running APRSD server instance.
681
- The web admin interface shows graphs of packet counts, packet types, number of threads running, the latest
682
- packets sent and received, and the status of each of the plugins that are loaded. You can also view the logfile
683
- and view the raw APRSD configuration file.
684
-
685
- To start the web admin interface, You have to install gunicorn in your virtualenv that already has aprsd installed.
686
-
687
- ::
688
-
689
- source <path to APRSD's virtualenv>/bin/activate
690
- aprsd admin --loglevel INFO
691
-
692
- The web admin interface will be running on port 8080 on the local machine. http://localhost:8080
693
-
694
-
695
- Development
696
- ===========
697
-
698
- * ``git clone git@github.com:craigerl/aprsd.git``
699
- * ``cd aprsd``
700
- * ``make``
701
-
702
- Workflow
703
- --------
625
+ #### Workflow
704
626
 
705
627
  While working aprsd, The workflow is as follows:
706
628
 
707
- * Checkout a new branch to work on by running
629
+ - Checkout a new branch to work on by running
708
630
 
709
- ``git checkout -b mybranch``
631
+ `git checkout -b mybranch`
710
632
 
711
- * Make your changes to the code
712
- * Run Tox with the following options:
633
+ - Make your changes to the code
713
634
 
714
- - ``tox -epep8``
715
- - ``tox -efmt``
716
- - ``tox -p``
635
+ - Run Tox with the following options:
717
636
 
718
- * Commit your changes. This will run the pre-commit hooks which does checks too
637
+ - `tox -epep8`
638
+ - `tox -efmt`
639
+ - `tox -p`
719
640
 
720
- ``git commit``
641
+ - Commit your changes. This will run the pre-commit hooks which does
642
+ checks too
721
643
 
722
- * Once you are done with all of your commits, then push up the branch to
723
- github with:
644
+ `git commit`
724
645
 
725
- ``git push -u origin mybranch``
646
+ - Once you are done with all of your commits, then push up the branch
647
+ to github with:
726
648
 
727
- * Create a pull request from your branch so github tests can run and we can do
728
- a code review.
649
+ `git push -u origin mybranch`
729
650
 
651
+ - Create a pull request from your branch so github tests can run and
652
+ we can do a code review.
730
653
 
731
- Release
732
- -------
654
+ #### Release
733
655
 
734
656
  To do release to pypi:
735
657
 
736
- * Tag release with:
658
+ - Tag release with:
737
659
 
738
- ``git tag -v1.XX -m "New release"``
660
+ `git tag -v1.XX -m "New release"`
739
661
 
740
- * Push release tag:
662
+ - Push release tag:
741
663
 
742
- ``git push origin master --tags``
664
+ `git push origin master --tags`
743
665
 
744
- * Do a test build and verify build is valid by running:
666
+ - Do a test build and verify build is valid by running:
745
667
 
746
- ``make build``
668
+ `make build`
747
669
 
748
- * Once twine is happy, upload release to pypi:
670
+ - Once twine is happy, upload release to pypi:
749
671
 
750
- ``make upload``
672
+ `make upload`
751
673
 
674
+ #### Building your own APRSD plugins
752
675
 
753
- Building your own APRSD plugins
754
- -------------------------------
676
+ APRSD plugins are the mechanism by which APRSD can respond to APRS
677
+ Messages. The plugins are loaded at server startup and can also be
678
+ loaded at listen startup. When a packet is received by APRSD, it is
679
+ passed to each of the plugins in the order they were registered in the
680
+ config file. The plugins can then decide what to do with the packet.
681
+ When a plugin is called, it is passed a APRSD Packet object. The plugin
682
+ can then do something with the packet and return a reply message if
683
+ desired. If a plugin does not want to reply to the packet, it can just
684
+ return None. When a plugin does return a reply message, APRSD will send
685
+ the reply message to the appropriate destination.
755
686
 
756
- APRSD plugins are the mechanism by which APRSD can respond to APRS Messages. The plugins are loaded at server startup
757
- and can also be loaded at listen startup. When a packet is received by APRSD, it is passed to each of the plugins
758
- in the order they were registered in the config file. The plugins can then decide what to do with the packet.
759
- When a plugin is called, it is passed a APRSD Packet object. The plugin can then do something with the packet and
760
- return a reply message if desired. If a plugin does not want to reply to the packet, it can just return None.
761
- When a plugin does return a reply message, APRSD will send the reply message to the appropriate destination.
687
+ For example, when a \'ping\' message is received, the PingPlugin will
688
+ return a reply message of \'pong\'. When APRSD receives the \'pong\'
689
+ message, it will be sent back to the original caller of the ping
690
+ message.
762
691
 
763
- For example, when a 'ping' message is received, the PingPlugin will return a reply message of 'pong'. When APRSD
764
- receives the 'pong' message, it will be sent back to the original caller of the ping message.
692
+ APRSD plugins are simply python packages that can be installed from
693
+ pypi.org. They are installed into the aprsd virtualenv and can be
694
+ imported by APRSD at runtime. The plugins are registered in the config
695
+ file and loaded at startup of the aprsd server command or the aprsd
696
+ listen command.
765
697
 
766
- APRSD plugins are simply python packages that can be installed from pypi.org. They are installed into the
767
- aprsd virtualenv and can be imported by APRSD at runtime. The plugins are registered in the config file and loaded
768
- at startup of the aprsd server command or the aprsd listen command.
698
+ #### Overview
769
699
 
770
- Overview
771
- --------
772
- You can build your own plugins by following the instructions in the `Building your own APRSD plugins`_ section.
700
+ You can build your own plugins by following the instructions in the
701
+ [Building your own APRSD plugins](#building-your-own-aprsd-plugins)
702
+ section.
773
703
 
774
704
  Plugins are called by APRSD when packe
775
705
 
776
- Docker Container
777
- ================
706
+ ### Docker Container
778
707
 
779
- Building
780
- ========
708
+ ### Building
781
709
 
782
- There are 2 versions of the container Dockerfile that can be used.
783
- The main Dockerfile, which is for building the official release container
710
+ There are 2 versions of the container Dockerfile that can be used. The
711
+ main Dockerfile, which is for building the official release container
784
712
  based off of the pip install version of aprsd and the Dockerfile-dev,
785
- which is used for building a container based off of a git branch of
786
- the repo.
787
-
788
- Official Build
789
- ==============
713
+ which is used for building a container based off of a git branch of the
714
+ repo.
790
715
 
791
- ``docker build -t hemna6969/aprsd:latest .``
716
+ ### Official Build
792
717
 
793
- Development Build
794
- =================
718
+ `docker build -t hemna6969/aprsd:latest .`
795
719
 
796
- ``docker build -t hemna6969/aprsd:latest -f Dockerfile-dev .``
720
+ ### Development Build
797
721
 
722
+ `docker build -t hemna6969/aprsd:latest -f Dockerfile-dev .`
798
723
 
799
- Running the container
800
- =====================
724
+ ### Running the container
801
725
 
802
- There is a ``docker-compose.yml`` file in the ``docker/`` directory
803
- that can be used to run your container. To provide the container
804
- an ``aprsd.conf`` configuration file, change your
805
- ``docker-compose.yml`` as shown below:
726
+ There is a `docker-compose.yml` file in the `docker/` directory that can
727
+ be used to run your container. To provide the container an `aprsd.conf`
728
+ configuration file, change your `docker-compose.yml` as shown below:
806
729
 
807
- ::
808
-
809
- volumes:
810
- - $HOME/.config/aprsd:/config
730
+ volumes:
731
+ - $HOME/.config/aprsd:/config
811
732
 
812
733
  To install plugins at container start time, pass in a list of
813
- comma-separated list of plugins on PyPI using the ``APRSD_PLUGINS``
814
- environment variable in the ``docker-compose.yml`` file. Note that
815
- version constraints may also be provided. For example:
816
-
817
- ::
734
+ comma-separated list of plugins on PyPI using the `APRSD_PLUGINS`
735
+ environment variable in the `docker-compose.yml` file. Note that version
736
+ constraints may also be provided. For example:
818
737
 
819
738
  environment:
820
739
  - APRSD_PLUGINS=aprsd-slack-plugin>=1.0.2,aprsd-twitter-plugin
821
740
 
822
741
 
823
- .. badges
824
-
825
- .. |pypi| image:: https://badge.fury.io/py/aprsd.svg
826
- :target: https://badge.fury.io/py/aprsd
827
-
828
- .. |pytest| image:: https://github.com/craigerl/aprsd/workflows/python/badge.svg
829
- :target: https://github.com/craigerl/aprsd/actions
830
-
831
- .. |versions| image:: https://img.shields.io/pypi/pyversions/aprsd.svg
832
- :target: https://pypi.org/pypi/aprsd
833
-
834
- .. |slack| image:: https://img.shields.io/badge/slack-@hemna/aprsd-blue.svg?logo=slack
835
- :target: https://hemna.slack.com/app_redirect?channel=C01KQSCP5RP
836
-
837
- .. |imports| image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336
838
- :target: https://timothycrosley.github.io/isort/
839
-
840
- .. |issues| image:: https://img.shields.io/github/issues/craigerl/aprsd
742
+ ### Activity
841
743
 
842
- .. |commit| image:: https://img.shields.io/github/last-commit/craigerl/aprsd
744
+ ![Alt](https://repobeats.axiom.co/api/embed/8b96657861770a15f0b851a5eebafb34d0e0b3d3.svg "Repobeats analytics image")
843
745
 
844
- .. |down| image:: https://static.pepy.tech/personalized-badge/aprsd?period=month&units=international_system&left_color=black&right_color=orange&left_text=Downloads
845
- :target: https://pepy.tech/project/aprsd
746
+ ## Star History
846
747
 
847
- .. links
848
- .. _read the docs:
849
- https://aprsd.readthedocs.io
748
+ [![Star History Chart](https://api.star-history.com/svg?repos=craigerl/aprsd&type=Date)](https://star-history.com/#craigerl/aprsd&Date)