aprsd 3.3.3__py2.py3-none-any.whl → 3.4.0__py2.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 (72) hide show
  1. aprsd/client.py +133 -20
  2. aprsd/clients/aprsis.py +6 -3
  3. aprsd/clients/fake.py +1 -1
  4. aprsd/clients/kiss.py +1 -1
  5. aprsd/cmds/completion.py +13 -27
  6. aprsd/cmds/fetch_stats.py +53 -57
  7. aprsd/cmds/healthcheck.py +32 -30
  8. aprsd/cmds/list_plugins.py +2 -2
  9. aprsd/cmds/listen.py +33 -17
  10. aprsd/cmds/send_message.py +2 -2
  11. aprsd/cmds/server.py +26 -9
  12. aprsd/cmds/webchat.py +34 -29
  13. aprsd/conf/common.py +46 -31
  14. aprsd/log/log.py +28 -6
  15. aprsd/main.py +20 -18
  16. aprsd/packets/__init__.py +3 -2
  17. aprsd/packets/collector.py +56 -0
  18. aprsd/packets/core.py +456 -321
  19. aprsd/packets/log.py +143 -0
  20. aprsd/packets/packet_list.py +83 -66
  21. aprsd/packets/seen_list.py +30 -19
  22. aprsd/packets/tracker.py +60 -62
  23. aprsd/packets/watch_list.py +64 -38
  24. aprsd/plugin.py +41 -16
  25. aprsd/plugins/email.py +35 -7
  26. aprsd/plugins/time.py +3 -2
  27. aprsd/plugins/version.py +4 -5
  28. aprsd/plugins/weather.py +0 -1
  29. aprsd/stats/__init__.py +20 -0
  30. aprsd/stats/app.py +46 -0
  31. aprsd/stats/collector.py +38 -0
  32. aprsd/threads/__init__.py +3 -2
  33. aprsd/threads/aprsd.py +67 -36
  34. aprsd/threads/keep_alive.py +55 -49
  35. aprsd/threads/log_monitor.py +46 -0
  36. aprsd/threads/rx.py +43 -24
  37. aprsd/threads/stats.py +44 -0
  38. aprsd/threads/tx.py +36 -17
  39. aprsd/utils/__init__.py +12 -0
  40. aprsd/utils/counter.py +6 -3
  41. aprsd/utils/json.py +20 -0
  42. aprsd/utils/objectstore.py +22 -17
  43. aprsd/web/admin/static/css/prism.css +4 -189
  44. aprsd/web/admin/static/js/charts.js +9 -7
  45. aprsd/web/admin/static/js/echarts.js +71 -9
  46. aprsd/web/admin/static/js/main.js +47 -6
  47. aprsd/web/admin/static/js/prism.js +11 -2246
  48. aprsd/web/admin/templates/index.html +18 -7
  49. aprsd/web/chat/static/js/gps.js +3 -1
  50. aprsd/web/chat/static/js/main.js +4 -3
  51. aprsd/web/chat/static/js/send-message.js +5 -2
  52. aprsd/web/chat/templates/index.html +1 -0
  53. aprsd/wsgi.py +62 -127
  54. {aprsd-3.3.3.dist-info → aprsd-3.4.0.dist-info}/METADATA +14 -16
  55. {aprsd-3.3.3.dist-info → aprsd-3.4.0.dist-info}/RECORD +60 -65
  56. {aprsd-3.3.3.dist-info → aprsd-3.4.0.dist-info}/WHEEL +1 -1
  57. aprsd-3.4.0.dist-info/pbr.json +1 -0
  58. aprsd/plugins/query.py +0 -81
  59. aprsd/rpc/__init__.py +0 -14
  60. aprsd/rpc/client.py +0 -165
  61. aprsd/rpc/server.py +0 -99
  62. aprsd/stats.py +0 -266
  63. aprsd/threads/store.py +0 -30
  64. aprsd/utils/converters.py +0 -15
  65. aprsd/web/admin/static/json-viewer/jquery.json-viewer.css +0 -57
  66. aprsd/web/admin/static/json-viewer/jquery.json-viewer.js +0 -158
  67. aprsd/web/chat/static/json-viewer/jquery.json-viewer.css +0 -57
  68. aprsd/web/chat/static/json-viewer/jquery.json-viewer.js +0 -158
  69. aprsd-3.3.3.dist-info/pbr.json +0 -1
  70. {aprsd-3.3.3.dist-info → aprsd-3.4.0.dist-info}/LICENSE +0 -0
  71. {aprsd-3.3.3.dist-info → aprsd-3.4.0.dist-info}/entry_points.txt +0 -0
  72. {aprsd-3.3.3.dist-info → aprsd-3.4.0.dist-info}/top_level.txt +0 -0
@@ -1,75 +1,74 @@
1
1
  aprsd/__init__.py,sha256=GiMknvhvMBWeMsJXiBS8slVBJdwX9h3FjnXqGjm8YZM,631
2
2
  aprsd/cli_helper.py,sha256=AgSSn6oTUdCDv4Ne1Jyg_0bi7GwINBBKotTLk_QE-cY,4568
3
- aprsd/client.py,sha256=7NI_xFUoPaAyVHMIogpedZjWhMZaK5ZYEQWsk9aAukQ,10072
3
+ aprsd/client.py,sha256=7Oi4yiIf2jpt75-1mfwdGPopmQAR_M6gj6mq2Ts0sZM,13225
4
4
  aprsd/exception.py,sha256=FyeehwYENwsRKyrU2WmgEPmcHsDLjdGRAe35f01Bu5A,502
5
- aprsd/main.py,sha256=ydcJg8xXAJ1sWs84JcZlMaNGW-xzM9yIzSOwcCqtbOc,4535
5
+ aprsd/main.py,sha256=aOVLKdTWVx9ahoG2UAqtPJVzy6sScekwBFkj6gjaIeM,4673
6
6
  aprsd/messaging.py,sha256=0zE2y0jJBTxTwwgt8_XmSeMZfBTO77ZBY0GyGe8DX_w,134
7
- aprsd/plugin.py,sha256=Y6MygWrv_dmx2s-1qQcr_u1mM36wqItWZDI-eUy1vgQ,16435
7
+ aprsd/plugin.py,sha256=vVhfhZK9zsM02Ekw-6WxubUXTc4dhuslgTIPiiuKyKw,17359
8
8
  aprsd/plugin_utils.py,sha256=xKQbliwikJxw_E5TGK_BcBPXkHeJ1PqVxSCFcDbf1xg,2507
9
- aprsd/stats.py,sha256=iLuzy8yscY2mzJxpgtvN6tJxtM6q9Y8CCAlohIqQhKI,7101
10
- aprsd/wsgi.py,sha256=M3ll4V6JVY-LBS_k1WFG9QvChgdV1RhDCi9zqWvqhc0,10080
9
+ aprsd/wsgi.py,sha256=EsRRetouRSsQp5GCJdagybmgRXCBQeLl8rcdBUPDv7Y,8720
11
10
  aprsd/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- aprsd/clients/aprsis.py,sha256=rDVoP65k9FKZgCdjy7kSQLE6QaR2j2DXQcKshbKnlks,7156
13
- aprsd/clients/fake.py,sha256=gGBNYyz05AJP_5efmMKJ8wUC5KOF0lYRSDiiPaG9_xU,2066
14
- aprsd/clients/kiss.py,sha256=Cc26CbgDaJ9WfGfIHOhfTn7XdDnYWLLv85Xj4oD2_6U,3393
11
+ aprsd/clients/aprsis.py,sha256=PsIR77ao5QlaLR_Jq7uAkNUJQiw6q8swch2Pl8m2JyM,7257
12
+ aprsd/clients/fake.py,sha256=TyqwQ4XYzbT83r0jSBI-oyl9q6BK60TgVuFm2_nkrnw,2059
13
+ aprsd/clients/kiss.py,sha256=XvXvBgpv_i1kgV5MmdTR5DwRXEiT86M49Pa7vw8-gsA,3350
15
14
  aprsd/cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- aprsd/cmds/completion.py,sha256=4gTd6QLs97qZARraSEgAjudthdSGURecjjmC6JZtXXk,1763
15
+ aprsd/cmds/completion.py,sha256=KZNniU_9pTmLtItXzl-ATcLn9vi_0795pJ5D4lZXFG8,799
17
16
  aprsd/cmds/dev.py,sha256=ob5vKomigQdHuFt7aWU0YLaeXKsWbm3dqyYTf0qztIc,4369
18
- aprsd/cmds/fetch_stats.py,sha256=BgQcuDHLp7XiKGBFv_CI0RqqZTdvZMjG7bwl_Vm3UKs,5489
19
- aprsd/cmds/healthcheck.py,sha256=HhCFnaWNlyGbYiBZx_1APh4v36t8CUNGyi41mdcuSDg,2801
20
- aprsd/cmds/list_plugins.py,sha256=wGBEjINDDmvvW8wdiyuh7HsTUKxl69vxCvcDmgfyzRE,10667
21
- aprsd/cmds/listen.py,sha256=ndrQct8Vo1zrTS2Dh4FYD8TEhAsIjPnQZIyaQUHPum0,6241
22
- aprsd/cmds/send_message.py,sha256=9-ceqSM9Zgb-9FSr7DU2RlKm7BIn4Ft-LgPSaMG3_0g,4716
23
- aprsd/cmds/server.py,sha256=4guhBvXQnZZq-tPE1RQ9EUOPiI9AH6STkL97_adbfDo,3777
24
- aprsd/cmds/webchat.py,sha256=iVWxvI80DgshekiHb45sWfyVWDKvnQJm1l61jNWLwKA,20205
17
+ aprsd/cmds/fetch_stats.py,sha256=dVvhOWpATNGq0e_hbLe47MZ2dCLOO3XTd6zzqqQ1Lp8,4988
18
+ aprsd/cmds/healthcheck.py,sha256=mVrBIasdCnw-_vzuh15p4H1TFmiGg80WVXgXBcd2PMg,2628
19
+ aprsd/cmds/list_plugins.py,sha256=gSIa7uMZAvXylJ89GI3RU9wj6TPioREvBNfClVyfiOM,10653
20
+ aprsd/cmds/listen.py,sha256=1bd2fHD1UOAaAfaj_IRBE9lnSyedJSYhwP6OW-cFggc,7143
21
+ aprsd/cmds/send_message.py,sha256=0lNgOYGFYrdGiLRPsotTpEcYHuAheMN2sVKu2D-Gc0I,4711
22
+ aprsd/cmds/server.py,sha256=gvoPhEmibMsvLWwJUTGfkeHPM7WpuhL11VU5OFYQ8-U,4437
23
+ aprsd/cmds/webchat.py,sha256=w4UQNivyMj7glWQE3neI1ssL-h5KV9U4XH7pgoY1Z48,20370
25
24
  aprsd/conf/__init__.py,sha256=6j-N6jT49OYcp8dD8oZGt7mxWSOSUnWXeTIZW_C0bmw,1725
26
25
  aprsd/conf/client.py,sha256=w_Z6Pc5LUYzJzDsfhCcnMBLkPi9njNdCGOe3GfbpGaA,3029
27
- aprsd/conf/common.py,sha256=jIWmvcRjFd5EipQJ3n-O3QhA2DogFabhqG84JWeKA98,8122
26
+ aprsd/conf/common.py,sha256=LTLVtz9fFXsnYIhq2Hv73r-tn-Y7nW4rRJj5KCLFtuA,9013
28
27
  aprsd/conf/log.py,sha256=v5C2Lda6x39IdamHpelOY6tDHPkqHyx_qmPF3WEmeAE,1424
29
28
  aprsd/conf/opts.py,sha256=Jq1DPyDdNyN2rbuHq8O-lF2Entkb9tFTbh9gjZwWC5s,2701
30
29
  aprsd/conf/plugin_common.py,sha256=HKNV2JKCJOPUqTdoFgc96mGNZLU6zNii2syjuJj8tAo,6253
31
30
  aprsd/conf/plugin_email.py,sha256=IB8G_vTCC-6HVGx9y1PP2vKXfXRzlEx9lEFXdIIGHzA,2332
32
31
  aprsd/log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- aprsd/log/log.py,sha256=Lytim2gK7gm3VoMDqJkXS1s28lXuahz2vX1Z7cvn_zw,2698
34
- aprsd/packets/__init__.py,sha256=h3cq6MCjvztM2GBeHagay0chEcJWKophT22PLktGYzg,434
35
- aprsd/packets/core.py,sha256=I5ajk1EJoNPpOjndTG9kddaV8Y3x_gdxoa7TqOWwGCo,22655
36
- aprsd/packets/packet_list.py,sha256=CeDD9uV3YTnnXmH52rdAkN4AswY8A710fQ2NSLicCcw,2444
37
- aprsd/packets/seen_list.py,sha256=YnwnwsV89n8l-DbTe5WqD1YIUjCfobmQiSoI4rf5ioY,1071
38
- aprsd/packets/tracker.py,sha256=YD3-uYaaStO-3-_VvV7cYeDAtyJKTPimVLybc688_3U,3005
39
- aprsd/packets/watch_list.py,sha256=RBZiqAQ6Y3lm79z4tDa5sQCFIQRyWS8O-j9w3m0argE,2880
32
+ aprsd/log/log.py,sha256=j-2rbGwyCnaAmTrf3uuuXSpbTbhhTm3XSueaQ_NDQQA,3408
33
+ aprsd/packets/__init__.py,sha256=OK2qFCNscFcMlimHJvP__R-7Igre4b912t3gGflNqIw,510
34
+ aprsd/packets/collector.py,sha256=qPk2vQZyBJSjgOsc_RTSWUsXMsKd6L4YJoVG5NjFV1c,1636
35
+ aprsd/packets/core.py,sha256=Ke6WDofzpMZSOdDfGsxZal8vdJrKUXLedDXGu7FcAZg,27400
36
+ aprsd/packets/log.py,sha256=jCcZazhivzlo38nEE3qnUiaZGNhtpX3QUgG1ExofwrM,4545
37
+ aprsd/packets/packet_list.py,sha256=-ZCFfaHPL-QEddSRrIa5JfqVDfiAeWYrTarETSQUte8,3518
38
+ aprsd/packets/seen_list.py,sha256=mH_yAN5KVajmF-W5G-uKPgZDhxy7lOI1Ds7n1mkBGdE,1543
39
+ aprsd/packets/tracker.py,sha256=4uZJ7I1uAxOohF1LFxhsokNYKA7Am_XbAP3Kix_XLJw,3165
40
+ aprsd/packets/watch_list.py,sha256=Fn6_eqkgWnXjEIx82roiWqJoPewcb7qdNjq_gpYqWD8,3789
40
41
  aprsd/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- aprsd/plugins/email.py,sha256=pQ3p90wmgO17iKRjYvtaqE6KEmenutFE6DavXm4Vep8,23073
42
+ aprsd/plugins/email.py,sha256=U0v4crh5uSDWrEes7HHPpXI6eyF7ySYyqqKp2j1klDs,23627
42
43
  aprsd/plugins/fortune.py,sha256=XCSIaZ9JXC3LZOMV5tSr3dAvbVvIn4xSUdWxpZHStfc,1573
43
44
  aprsd/plugins/location.py,sha256=E1i-dO11br2bmmAqTjoFI2vzS_o0T6xwCakUCr05_qY,6464
44
45
  aprsd/plugins/notify.py,sha256=5Qk7P1ZsFl8pNYQMIBmVYnTcKua9gzvgkUwbrcQ6Byc,1969
45
46
  aprsd/plugins/ping.py,sha256=A3yLMPUDU-PA1Q98xStd0WM04MZvGn3FzVpGKjyoXDc,763
46
- aprsd/plugins/query.py,sha256=h7OWgjroB1wirDNCUZ-N0T7Z95fp0QoFNwS9c7fKptw,2458
47
- aprsd/plugins/time.py,sha256=DrxQ8l8D19krmGOZ3S2SNcZ4vzsiJ3Rz1BamaIHcLCg,3496
48
- aprsd/plugins/version.py,sha256=wlg1EtWjwQI-KcjCKhlOV0Y65zu0HsDZ5vmwaM3Rd7M,849
49
- aprsd/plugins/weather.py,sha256=A91pXUhwyAQ1oio9e0OlpvukIzXsexJB4gdb1AUOLA8,13356
50
- aprsd/rpc/__init__.py,sha256=rTKlOpldslhTAb6sOwJGhwcrU5CnhhdtALSI_GasA24,343
51
- aprsd/rpc/client.py,sha256=NDR_iWqGeMuyrgIP1usjRh8npg2OiN4S8ogGd7jgq3o,4641
52
- aprsd/rpc/server.py,sha256=xLlw3cx9P-g0xLDiBETg99lC9M8J9xXVdxTU0qbMoFg,2750
53
- aprsd/threads/__init__.py,sha256=rTeA6Rt-pcpwUg30GsUnitRrcp4UPXfjshasP-Wwo4s,319
54
- aprsd/threads/aprsd.py,sha256=hPSFo58LN0qmx8gZCqk9zJYYhSo3xTvInDXStcS6a4o,2270
55
- aprsd/threads/keep_alive.py,sha256=KqX3weVSsGcKfiaKTCN8ZD0QSxYCxIVnWWXsYvbOvvE,4250
56
- aprsd/threads/log_monitor.py,sha256=iZgNIkG1YNN3UDXVu1T45oSAuDtjtzbJEglxR_lEiKw,2036
47
+ aprsd/plugins/time.py,sha256=59-tMl7ogccLobWl9hMDm8mUVXdqW6kB5javrtp0rok,3535
48
+ aprsd/plugins/version.py,sha256=NAPFKQ0lQqgjoDyTVy8tZcRGmdcJE_ZogRElDz27V2U,839
49
+ aprsd/plugins/weather.py,sha256=iZ4Zv_23-2dquNKXhsiimFVlMEVoBNKyom4LtORwuoU,13333
50
+ aprsd/stats/__init__.py,sha256=zaZSovVLW_9_Zf4gNahvyFFYCkp9nwqmTytrsquXyzo,884
51
+ aprsd/stats/app.py,sha256=xTVke-ax39YJFf8KF9KiudgbrYCDbszTk1fouDtHPw8,1256
52
+ aprsd/stats/collector.py,sha256=NqThUI3d2WTwf2CbXooTIUWXlqt91cC4HTW3dPBt8jg,1219
53
+ aprsd/threads/__init__.py,sha256=b8Dma0cWE7356WU_Ehvm0RtL4-zCJNUchPFArJd2Gtw,274
54
+ aprsd/threads/aprsd.py,sha256=r2WlvtND0YTpq8jotRacZegD4WjX8msPDpl3ccqZo_Y,3292
55
+ aprsd/threads/keep_alive.py,sha256=gRqr62GqVEU_RNzY-SYxXmZjzE5x4XyDnuNMlDpupA0,4798
56
+ aprsd/threads/log_monitor.py,sha256=PLg44BW4nIlyLB-Mtp7B1b6Rzt-dSAU-jqQWh8dsS9s,3462
57
57
  aprsd/threads/registry.py,sha256=5DuzNSwhOEwI0Gl5j9e286uqbxzKLSHzInfPy61r7PI,1702
58
- aprsd/threads/rx.py,sha256=5P8m27lzDB0qjobQLk8b8XYSxxksjVqXC6XO3Tgml0I,12592
59
- aprsd/threads/store.py,sha256=LyuILI-KtVjPeLsTVj7dS_EpkjWgIQscrQ6kG9av8Jg,713
60
- aprsd/threads/tx.py,sha256=Y_t22O_kPuLJH_vN2zsnxdtgWLpWDrZm07wN2fKlX-w,7694
61
- aprsd/utils/__init__.py,sha256=Fch1kI87ErUqJP0yoi0ZPGrzc-agAg3dy_zSo_U38Ec,4159
62
- aprsd/utils/converters.py,sha256=1SwbX097MQOM9BGfuUtpbMUe1vmHKFw-IqLjPYmR6P4,492
63
- aprsd/utils/counter.py,sha256=oKCH1ID0BOJJ3SyDLhXzpBLAeHOoPnYQW9gaeu8wcF4,1156
58
+ aprsd/threads/rx.py,sha256=X5pBYZV_V5w_FGfpugKG7rhc0p2JAWaxRDYSIUxlLC4,13431
59
+ aprsd/threads/stats.py,sha256=Yey3B2iuGUQsNuUiFxvXKJU_1pif8gfOb5uP_U2-hS8,959
60
+ aprsd/threads/tx.py,sha256=vRFVH6G6YmykL492Z8N2TcJ0wcWVznGF-7gRgXnhTUw,8307
61
+ aprsd/utils/__init__.py,sha256=X9tYE5o5Bn_dn-y0N33JEJ-GBQWr-isLn6GiEV1LCsg,4547
62
+ aprsd/utils/counter.py,sha256=obIO0d9qCuhlvZI8Xf4DrjFlgHh-EuMZTVGv6gzQBkM,1202
64
63
  aprsd/utils/fuzzyclock.py,sha256=qKV8SYZhQGOHG9biF8TeueLb6RMppspx1Zg4IOy1Z10,3265
65
- aprsd/utils/json.py,sha256=I5PFv02rZTB15qbdhEKIwwT1j-glQaVboLJS7Xp8J60,1871
66
- aprsd/utils/objectstore.py,sha256=fhSlJo8LIlHHfpL7eDU9D63P5mscI_cBy3LvPiYSyTo,3401
64
+ aprsd/utils/json.py,sha256=LR2g-sealCRyXnujjTNxNYUxBagrdBqYQxNLYJQGYaM,2487
65
+ aprsd/utils/objectstore.py,sha256=b4tNw21lQJ-g6vGN_0Hhc_VRbGiCc5tAZ2jszhRtfyM,3541
67
66
  aprsd/utils/ring_buffer.py,sha256=lWWuw7lEbc2URhqAJfRLjpXBDLiK6UUWzk3j2VFnERQ,1111
68
67
  aprsd/utils/trace.py,sha256=oya2ElYKn04yanmAoynaCnETJHvEeI_du-DCIApZDsA,5558
69
68
  aprsd/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
69
  aprsd/web/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
70
  aprsd/web/admin/static/css/index.css,sha256=A0knpKbvbu2hxwV4yHXzb7l712GviOfEM4fl1NkjhEc,1282
72
- aprsd/web/admin/static/css/prism.css,sha256=cCLkt6M9lzoh5VwINxciSkGxiFe5JyDBG9Yh0DNN-fE,3467
71
+ aprsd/web/admin/static/css/prism.css,sha256=s2Izg4hP_qkrFH2sS2VN-ABdXMrEb8QFGLsNop_Nlx0,2671
73
72
  aprsd/web/admin/static/css/tabs.css,sha256=bFU7TDkH7QLFcnCcMy2B8iVRYczTStlgpwxI2vpnLmw,644
74
73
  aprsd/web/admin/static/images/Untitled.png,sha256=j03PNbZ_02asRRKWcezQUF79L283afDdrAcNBMqYFhk,37797
75
74
  aprsd/web/admin/static/images/aprs-symbols-16-0.png,sha256=Wd1Mbh6L4fYYmjRR01a0TzCVKm8-rqfBlNSV8WFx4g4,52962
@@ -77,16 +76,14 @@ aprsd/web/admin/static/images/aprs-symbols-16-1.png,sha256=cKj--7nEAir_Br_Zp3-vt
77
76
  aprsd/web/admin/static/images/aprs-symbols-64-0.png,sha256=Wd1Mbh6L4fYYmjRR01a0TzCVKm8-rqfBlNSV8WFx4g4,52962
78
77
  aprsd/web/admin/static/images/aprs-symbols-64-1.png,sha256=cKj--7nEAir_Br_Zp3-vtUhx2v5sGakuPtJzrmGhyrE,48951
79
78
  aprsd/web/admin/static/images/aprs-symbols-64-2.png,sha256=OIP7l9temgE-GfB8s29fytJ59GlFQ3TUpEqAA0Gzs2I,40716
80
- aprsd/web/admin/static/js/charts.js,sha256=vs2jze40B-ujl1tH5CHs4O75lAptcWHRCY4NG32iGvg,7360
81
- aprsd/web/admin/static/js/echarts.js,sha256=iaHkTWaGYrN7RPrLxI2O0ntJxVvnmHCXc9w-_vjLKkY,10244
79
+ aprsd/web/admin/static/js/charts.js,sha256=spWghq8S-F9hIqpKUNNaWjxSeJxBE3XrUEac6oRU-kw,7354
80
+ aprsd/web/admin/static/js/echarts.js,sha256=iR1LaJcw49qu4fB3nKJ0ilv4WI6cQsDLdNFugv0MGc0,11738
82
81
  aprsd/web/admin/static/js/logs.js,sha256=wIuX-Fxa30O3KVyZzDqwp7bS7FNE-qNNHzik0UmIrgU,658
83
- aprsd/web/admin/static/js/main.js,sha256=eww77QN3BrvTPVVBET0ZfPcaIXr8exM2Y3K5MGpjjME,6799
84
- aprsd/web/admin/static/js/prism.js,sha256=tyCa_2VLFEetUUycJVc3PnEn7v046QjcD5YYd-qO8qo,64705
82
+ aprsd/web/admin/static/js/main.js,sha256=Ix-otPASp9_zYNoJJAmnQsgeZdAsaxJTPqDPixu-rtU,8128
83
+ aprsd/web/admin/static/js/prism.js,sha256=38yQvPqke_0dwkM6gVvp24LPl2Xs3oO0GvvLkjb1i6A,27861
85
84
  aprsd/web/admin/static/js/send-message.js,sha256=GPGOOn589WdJhKWxS20FiVKkq7jDFKQQHYQJdW2psAw,3852
86
85
  aprsd/web/admin/static/js/tabs.js,sha256=cRePBekcExNQO54eRVGCnNXB1JHM9uURnv6LNoe8LMs,889
87
- aprsd/web/admin/static/json-viewer/jquery.json-viewer.css,sha256=rXfxviikI1RGZM3px6piq9ZL0YZuO5ETcO8-toY-DDY,1080
88
- aprsd/web/admin/static/json-viewer/jquery.json-viewer.js,sha256=klSHtWPkZv4zG4darvDEpAQ9hJFDqNbQrM-xDChm8Fo,5020
89
- aprsd/web/admin/templates/index.html,sha256=9-YO2Z4A6nKu1Teh6u8YzZlQI1ZPrniGnGmQO2aEFuk,8553
86
+ aprsd/web/admin/templates/index.html,sha256=w4Qid-R1fK4OFtbe_vnRj9nuWOQ92fIGjD7X5Re1nFE,9083
90
87
  aprsd/web/chat/static/css/chat.css,sha256=83HA_HZGAIAdLRxQeJn9Pg6Q22Qwv4mVm4KcZqyazzU,1847
91
88
  aprsd/web/chat/static/css/index.css,sha256=vtYtiP0EJi2LTIZsSSVXeAtRhKZN1mN78yXhMLlko7o,1056
92
89
  aprsd/web/chat/static/css/style.css.map,sha256=whSiOQyvQ7AYHxykhuFus-Zm9cjkvc5aG186kwrpP4s,174659
@@ -111,9 +108,9 @@ aprsd/web/chat/static/images/aprs-symbols-64-0.png,sha256=Wd1Mbh6L4fYYmjRR01a0Tz
111
108
  aprsd/web/chat/static/images/aprs-symbols-64-1.png,sha256=cKj--7nEAir_Br_Zp3-vtUhx2v5sGakuPtJzrmGhyrE,48951
112
109
  aprsd/web/chat/static/images/aprs-symbols-64-2.png,sha256=OIP7l9temgE-GfB8s29fytJ59GlFQ3TUpEqAA0Gzs2I,40716
113
110
  aprsd/web/chat/static/images/globe.svg,sha256=x7kmRI-9gJaZI4FBlpG53K4ZscmqN_gajnzH-P4DzOI,1197
114
- aprsd/web/chat/static/js/gps.js,sha256=3H-bN8z6_uhDZFJjjJIPj2VNpmihoLK1_f9UyOdAAb4,2302
115
- aprsd/web/chat/static/js/main.js,sha256=q-EpkB1aTagoy6SKaD8bwoA8qtGQSeUkUMGVXdYxU68,1226
116
- aprsd/web/chat/static/js/send-message.js,sha256=w5cjXC911nVt4JcKjF5UhikKhc7R7AO2wzVMaIPUflE,18620
111
+ aprsd/web/chat/static/js/gps.js,sha256=8_DFgKvfCf8V54jULhN3GYvP3QKicJfcM-mfVPx6DzQ,2370
112
+ aprsd/web/chat/static/js/main.js,sha256=IZARmM7l-bNncXSTEo3Oq-SJfyUPPmKoEZPpVoRtXDc,1259
113
+ aprsd/web/chat/static/js/send-message.js,sha256=jMUqZ4-jUwqVJQjhnYDKpLUl7S93VDGsWXOnRBJdSNw,18851
117
114
  aprsd/web/chat/static/js/tabs.js,sha256=cRePBekcExNQO54eRVGCnNXB1JHM9uURnv6LNoe8LMs,889
118
115
  aprsd/web/chat/static/js/upstream/bootstrap.bundle.min.js,sha256=gGVATfqL6AhR6ukxISDCnWUX6UkUakDC2XchR0dpCDo,80664
119
116
  aprsd/web/chat/static/js/upstream/jquery-3.7.1.min.js,sha256=_JqT3SQfawRcv_BIHPThkBvs0OEvtFFmqPF_lYI_Cxo,87533
@@ -121,13 +118,11 @@ aprsd/web/chat/static/js/upstream/jquery-ui.min.js,sha256=qdH_gU82QrS5SDHqeQku9i
121
118
  aprsd/web/chat/static/js/upstream/jquery.toast.js,sha256=V4m4PbwAYUb9yr3uP64y2ogcoS9oQsl4oPLAGaxQnQI,12989
122
119
  aprsd/web/chat/static/js/upstream/semantic.min.js,sha256=AYdrntK9PGcU1ZsyD7fTBJ4o0j1bMeD4xn7P-UagMW4,403125
123
120
  aprsd/web/chat/static/js/upstream/socket.io.min.js,sha256=dYF5MG5zs6ekpbIOXBXelJXquX0gi_c48kkYm8tCaYE,64274
124
- aprsd/web/chat/static/json-viewer/jquery.json-viewer.css,sha256=rXfxviikI1RGZM3px6piq9ZL0YZuO5ETcO8-toY-DDY,1080
125
- aprsd/web/chat/static/json-viewer/jquery.json-viewer.js,sha256=klSHtWPkZv4zG4darvDEpAQ9hJFDqNbQrM-xDChm8Fo,5020
126
- aprsd/web/chat/templates/index.html,sha256=vxa0VV3ZIGfv8x1VwCeamJhdyNQ1QpsU_tNHoIrBTXs,6566
127
- aprsd-3.3.3.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
128
- aprsd-3.3.3.dist-info/METADATA,sha256=sZG1iZ9RmZ8mPgv29axDHnyrdw3PrWIsyiJYUz_7N10,24038
129
- aprsd-3.3.3.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
130
- aprsd-3.3.3.dist-info/entry_points.txt,sha256=4fReoJUB-bFqOUK6eeXYYCvTdVLprL7KVH0hWQRP9eM,171
131
- aprsd-3.3.3.dist-info/pbr.json,sha256=QW-UmK79ahf_eTbJJme1hu6rvqcm_4f2AwmkBknqWDg,46
132
- aprsd-3.3.3.dist-info/top_level.txt,sha256=v1O96niUcJOTMh9aQnFRknbScJ6mMOwqurdbxeaeSjs,6
133
- aprsd-3.3.3.dist-info/RECORD,,
121
+ aprsd/web/chat/templates/index.html,sha256=9z8JoF3W6SlPndf28iCgdHwiaG9_f9fnk5nXWEfx5wg,6633
122
+ aprsd-3.4.0.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
123
+ aprsd-3.4.0.dist-info/METADATA,sha256=QRSmoFBQDZYBLxYhIw9Q2EysubtOp-HkAYtdYWsg9QQ,23977
124
+ aprsd-3.4.0.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
125
+ aprsd-3.4.0.dist-info/entry_points.txt,sha256=4fReoJUB-bFqOUK6eeXYYCvTdVLprL7KVH0hWQRP9eM,171
126
+ aprsd-3.4.0.dist-info/pbr.json,sha256=oi5eCCf_oPOyExcFQ1Plk7M0Zlp2-ZwWQerpFnlBTso,46
127
+ aprsd-3.4.0.dist-info/top_level.txt,sha256=v1O96niUcJOTMh9aQnFRknbScJ6mMOwqurdbxeaeSjs,6
128
+ aprsd-3.4.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
@@ -0,0 +1 @@
1
+ {"git_version": "fc9ab4a", "is_release": true}
aprsd/plugins/query.py DELETED
@@ -1,81 +0,0 @@
1
- import datetime
2
- import logging
3
- import re
4
-
5
- from oslo_config import cfg
6
-
7
- from aprsd import packets, plugin
8
- from aprsd.packets import tracker
9
- from aprsd.utils import trace
10
-
11
-
12
- CONF = cfg.CONF
13
- LOG = logging.getLogger("APRSD")
14
-
15
-
16
- class QueryPlugin(plugin.APRSDRegexCommandPluginBase):
17
- """Query command."""
18
-
19
- command_regex = r"^\!.*"
20
- command_name = "query"
21
- short_description = "APRSD Owner command to query messages in the MsgTrack"
22
-
23
- def setup(self):
24
- """Do any plugin setup here."""
25
- if not CONF.query_plugin.callsign:
26
- LOG.error("Config query_plugin.callsign not set. Disabling plugin")
27
- self.enabled = False
28
- self.enabled = True
29
-
30
- @trace.trace
31
- def process(self, packet: packets.MessagePacket):
32
- LOG.info("Query COMMAND")
33
-
34
- fromcall = packet.from_call
35
- message = packet.get("message_text", None)
36
-
37
- pkt_tracker = tracker.PacketTrack()
38
- now = datetime.datetime.now()
39
- reply = "Pending messages ({}) {}".format(
40
- len(pkt_tracker),
41
- now.strftime("%H:%M:%S"),
42
- )
43
-
44
- searchstring = "^" + CONF.query_plugin.callsign + ".*"
45
- # only I can do admin commands
46
- if re.search(searchstring, fromcall):
47
-
48
- # resend last N most recent: "!3"
49
- r = re.search(r"^\!([0-9]).*", message)
50
- if r is not None:
51
- if len(pkt_tracker) > 0:
52
- last_n = r.group(1)
53
- reply = packets.NULL_MESSAGE
54
- LOG.debug(reply)
55
- pkt_tracker.restart_delayed(count=int(last_n))
56
- else:
57
- reply = "No pending msgs to resend"
58
- LOG.debug(reply)
59
- return reply
60
-
61
- # resend all: "!a"
62
- r = re.search(r"^\![aA].*", message)
63
- if r is not None:
64
- if len(pkt_tracker) > 0:
65
- reply = packets.NULL_MESSAGE
66
- LOG.debug(reply)
67
- pkt_tracker.restart_delayed()
68
- else:
69
- reply = "No pending msgs"
70
- LOG.debug(reply)
71
- return reply
72
-
73
- # delete all: "!d"
74
- r = re.search(r"^\![dD].*", message)
75
- if r is not None:
76
- reply = "Deleted ALL pending msgs."
77
- LOG.debug(reply)
78
- pkt_tracker.flush()
79
- return reply
80
-
81
- return reply
aprsd/rpc/__init__.py DELETED
@@ -1,14 +0,0 @@
1
- import rpyc
2
-
3
-
4
- class AuthSocketStream(rpyc.SocketStream):
5
- """Used to authenitcate the RPC stream to remote."""
6
-
7
- @classmethod
8
- def connect(cls, *args, authorizer=None, **kwargs):
9
- stream_obj = super().connect(*args, **kwargs)
10
-
11
- if callable(authorizer):
12
- authorizer(stream_obj.sock)
13
-
14
- return stream_obj
aprsd/rpc/client.py DELETED
@@ -1,165 +0,0 @@
1
- import json
2
- import logging
3
-
4
- from oslo_config import cfg
5
- import rpyc
6
-
7
- from aprsd import conf # noqa
8
- from aprsd import rpc
9
-
10
-
11
- CONF = cfg.CONF
12
- LOG = logging.getLogger("APRSD")
13
-
14
-
15
- class RPCClient:
16
- _instance = None
17
- _rpc_client = None
18
-
19
- ip = None
20
- port = None
21
- magic_word = None
22
-
23
- def __new__(cls, *args, **kwargs):
24
- if cls._instance is None:
25
- cls._instance = super().__new__(cls)
26
- return cls._instance
27
-
28
- def __init__(self, ip=None, port=None, magic_word=None):
29
- if ip:
30
- self.ip = ip
31
- else:
32
- self.ip = CONF.rpc_settings.ip
33
- if port:
34
- self.port = int(port)
35
- else:
36
- self.port = CONF.rpc_settings.port
37
- if magic_word:
38
- self.magic_word = magic_word
39
- else:
40
- self.magic_word = CONF.rpc_settings.magic_word
41
- self._check_settings()
42
- self.get_rpc_client()
43
-
44
- def _check_settings(self):
45
- if not CONF.rpc_settings.enabled:
46
- LOG.warning("RPC is not enabled, no way to get stats!!")
47
-
48
- if self.magic_word == conf.common.APRSD_DEFAULT_MAGIC_WORD:
49
- LOG.warning("You are using the default RPC magic word!!!")
50
- LOG.warning("edit aprsd.conf and change rpc_settings.magic_word")
51
-
52
- LOG.debug(f"RPC Client: {self.ip}:{self.port} {self.magic_word}")
53
-
54
- def _rpyc_connect(
55
- self, host, port, service=rpyc.VoidService,
56
- config={}, ipv6=False,
57
- keepalive=False, authorizer=None, ):
58
-
59
- LOG.info(f"Connecting to RPC host '{host}:{port}'")
60
- try:
61
- s = rpc.AuthSocketStream.connect(
62
- host, port, ipv6=ipv6, keepalive=keepalive,
63
- authorizer=authorizer,
64
- )
65
- return rpyc.utils.factory.connect_stream(s, service, config=config)
66
- except ConnectionRefusedError:
67
- LOG.error(f"Failed to connect to RPC host '{host}:{port}'")
68
- return None
69
-
70
- def get_rpc_client(self):
71
- if not self._rpc_client:
72
- self._rpc_client = self._rpyc_connect(
73
- self.ip,
74
- self.port,
75
- authorizer=lambda sock: sock.send(self.magic_word.encode()),
76
- )
77
- return self._rpc_client
78
-
79
- def get_stats_dict(self):
80
- cl = self.get_rpc_client()
81
- result = {}
82
- if not cl:
83
- return result
84
-
85
- try:
86
- rpc_stats_dict = cl.root.get_stats()
87
- result = json.loads(rpc_stats_dict)
88
- except EOFError:
89
- LOG.error("Lost connection to RPC Host")
90
- self._rpc_client = None
91
- return result
92
-
93
- def get_stats(self):
94
- cl = self.get_rpc_client()
95
- result = {}
96
- if not cl:
97
- return result
98
-
99
- try:
100
- result = cl.root.get_stats_obj()
101
- except EOFError:
102
- LOG.error("Lost connection to RPC Host")
103
- self._rpc_client = None
104
- return result
105
-
106
- def get_packet_track(self):
107
- cl = self.get_rpc_client()
108
- result = None
109
- if not cl:
110
- return result
111
- try:
112
- result = cl.root.get_packet_track()
113
- except EOFError:
114
- LOG.error("Lost connection to RPC Host")
115
- self._rpc_client = None
116
- return result
117
-
118
- def get_packet_list(self):
119
- cl = self.get_rpc_client()
120
- result = None
121
- if not cl:
122
- return result
123
- try:
124
- result = cl.root.get_packet_list()
125
- except EOFError:
126
- LOG.error("Lost connection to RPC Host")
127
- self._rpc_client = None
128
- return result
129
-
130
- def get_watch_list(self):
131
- cl = self.get_rpc_client()
132
- result = None
133
- if not cl:
134
- return result
135
- try:
136
- result = cl.root.get_watch_list()
137
- except EOFError:
138
- LOG.error("Lost connection to RPC Host")
139
- self._rpc_client = None
140
- return result
141
-
142
- def get_seen_list(self):
143
- cl = self.get_rpc_client()
144
- result = None
145
- if not cl:
146
- return result
147
- try:
148
- result = cl.root.get_seen_list()
149
- except EOFError:
150
- LOG.error("Lost connection to RPC Host")
151
- self._rpc_client = None
152
- return result
153
-
154
- def get_log_entries(self):
155
- cl = self.get_rpc_client()
156
- result = None
157
- if not cl:
158
- return result
159
- try:
160
- result_str = cl.root.get_log_entries()
161
- result = json.loads(result_str)
162
- except EOFError:
163
- LOG.error("Lost connection to RPC Host")
164
- self._rpc_client = None
165
- return result
aprsd/rpc/server.py DELETED
@@ -1,99 +0,0 @@
1
- import json
2
- import logging
3
-
4
- from oslo_config import cfg
5
- import rpyc
6
- from rpyc.utils.authenticators import AuthenticationError
7
- from rpyc.utils.server import ThreadPoolServer
8
-
9
- from aprsd import conf # noqa: F401
10
- from aprsd import packets, stats, threads
11
- from aprsd.threads import log_monitor
12
-
13
-
14
- CONF = cfg.CONF
15
- LOG = logging.getLogger("APRSD")
16
-
17
-
18
- def magic_word_authenticator(sock):
19
- client_ip = sock.getpeername()[0]
20
- magic = sock.recv(len(CONF.rpc_settings.magic_word)).decode()
21
- if magic != CONF.rpc_settings.magic_word:
22
- LOG.error(
23
- f"wrong magic word passed from {client_ip} "
24
- "'{magic}' != '{CONF.rpc_settings.magic_word}'",
25
- )
26
- raise AuthenticationError(
27
- f"wrong magic word passed in '{magic}'"
28
- f" != '{CONF.rpc_settings.magic_word}'",
29
- )
30
- return sock, None
31
-
32
-
33
- class APRSDRPCThread(threads.APRSDThread):
34
- def __init__(self):
35
- super().__init__(name="RPCThread")
36
- self.thread = ThreadPoolServer(
37
- APRSDService,
38
- port=CONF.rpc_settings.port,
39
- protocol_config={"allow_public_attrs": True},
40
- authenticator=magic_word_authenticator,
41
- )
42
-
43
- def stop(self):
44
- if self.thread:
45
- self.thread.close()
46
- self.thread_stop = True
47
-
48
- def loop(self):
49
- # there is no loop as run is blocked
50
- if self.thread and not self.thread_stop:
51
- # This is a blocking call
52
- self.thread.start()
53
-
54
-
55
- @rpyc.service
56
- class APRSDService(rpyc.Service):
57
- def on_connect(self, conn):
58
- # code that runs when a connection is created
59
- # (to init the service, if needed)
60
- LOG.info("RPC Client Connected")
61
- self._conn = conn
62
-
63
- def on_disconnect(self, conn):
64
- # code that runs after the connection has already closed
65
- # (to finalize the service, if needed)
66
- LOG.info("RPC Client Disconnected")
67
- self._conn = None
68
-
69
- @rpyc.exposed
70
- def get_stats(self):
71
- stat = stats.APRSDStats()
72
- stats_dict = stat.stats()
73
- return_str = json.dumps(stats_dict, indent=4, sort_keys=True, default=str)
74
- return return_str
75
-
76
- @rpyc.exposed
77
- def get_stats_obj(self):
78
- return stats.APRSDStats()
79
-
80
- @rpyc.exposed
81
- def get_packet_list(self):
82
- return packets.PacketList()
83
-
84
- @rpyc.exposed
85
- def get_packet_track(self):
86
- return packets.PacketTrack()
87
-
88
- @rpyc.exposed
89
- def get_watch_list(self):
90
- return packets.WatchList()
91
-
92
- @rpyc.exposed
93
- def get_seen_list(self):
94
- return packets.SeenList()
95
-
96
- @rpyc.exposed
97
- def get_log_entries(self):
98
- entries = log_monitor.LogEntries().get_all_and_purge()
99
- return json.dumps(entries, default=str)