aprsd 3.3.4__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.
- aprsd/client.py +133 -20
- aprsd/clients/aprsis.py +6 -3
- aprsd/clients/fake.py +1 -1
- aprsd/clients/kiss.py +1 -1
- aprsd/cmds/completion.py +13 -27
- aprsd/cmds/fetch_stats.py +53 -57
- aprsd/cmds/healthcheck.py +32 -30
- aprsd/cmds/list_plugins.py +2 -2
- aprsd/cmds/listen.py +33 -17
- aprsd/cmds/send_message.py +2 -2
- aprsd/cmds/server.py +26 -9
- aprsd/cmds/webchat.py +34 -29
- aprsd/conf/common.py +46 -31
- aprsd/log/log.py +28 -6
- aprsd/main.py +4 -17
- aprsd/packets/__init__.py +3 -2
- aprsd/packets/collector.py +56 -0
- aprsd/packets/core.py +456 -321
- aprsd/packets/log.py +143 -0
- aprsd/packets/packet_list.py +83 -66
- aprsd/packets/seen_list.py +30 -19
- aprsd/packets/tracker.py +60 -62
- aprsd/packets/watch_list.py +64 -38
- aprsd/plugin.py +41 -16
- aprsd/plugins/email.py +35 -7
- aprsd/plugins/time.py +3 -2
- aprsd/plugins/version.py +4 -5
- aprsd/plugins/weather.py +0 -1
- aprsd/stats/__init__.py +20 -0
- aprsd/stats/app.py +46 -0
- aprsd/stats/collector.py +38 -0
- aprsd/threads/__init__.py +3 -2
- aprsd/threads/aprsd.py +67 -36
- aprsd/threads/keep_alive.py +55 -49
- aprsd/threads/log_monitor.py +46 -0
- aprsd/threads/rx.py +43 -24
- aprsd/threads/stats.py +44 -0
- aprsd/threads/tx.py +36 -17
- aprsd/utils/__init__.py +12 -0
- aprsd/utils/counter.py +6 -3
- aprsd/utils/json.py +20 -0
- aprsd/utils/objectstore.py +22 -17
- aprsd/web/admin/static/css/prism.css +4 -189
- aprsd/web/admin/static/js/charts.js +9 -7
- aprsd/web/admin/static/js/echarts.js +71 -9
- aprsd/web/admin/static/js/main.js +47 -6
- aprsd/web/admin/static/js/prism.js +11 -2246
- aprsd/web/admin/templates/index.html +18 -7
- aprsd/web/chat/static/js/gps.js +3 -1
- aprsd/web/chat/static/js/main.js +4 -3
- aprsd/web/chat/static/js/send-message.js +5 -2
- aprsd/web/chat/templates/index.html +1 -0
- aprsd/wsgi.py +62 -127
- {aprsd-3.3.4.dist-info → aprsd-3.4.0.dist-info}/METADATA +14 -16
- {aprsd-3.3.4.dist-info → aprsd-3.4.0.dist-info}/RECORD +60 -63
- {aprsd-3.3.4.dist-info → aprsd-3.4.0.dist-info}/WHEEL +1 -1
- aprsd-3.4.0.dist-info/pbr.json +1 -0
- aprsd/plugins/query.py +0 -81
- aprsd/rpc/__init__.py +0 -14
- aprsd/rpc/client.py +0 -165
- aprsd/rpc/server.py +0 -99
- aprsd/stats.py +0 -266
- aprsd/web/admin/static/json-viewer/jquery.json-viewer.css +0 -57
- aprsd/web/admin/static/json-viewer/jquery.json-viewer.js +0 -158
- aprsd/web/chat/static/json-viewer/jquery.json-viewer.css +0 -57
- aprsd/web/chat/static/json-viewer/jquery.json-viewer.js +0 -158
- aprsd-3.3.4.dist-info/pbr.json +0 -1
- {aprsd-3.3.4.dist-info → aprsd-3.4.0.dist-info}/LICENSE +0 -0
- {aprsd-3.3.4.dist-info → aprsd-3.4.0.dist-info}/entry_points.txt +0 -0
- {aprsd-3.3.4.dist-info → aprsd-3.4.0.dist-info}/top_level.txt +0 -0
@@ -1,73 +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=
|
3
|
+
aprsd/client.py,sha256=7Oi4yiIf2jpt75-1mfwdGPopmQAR_M6gj6mq2Ts0sZM,13225
|
4
4
|
aprsd/exception.py,sha256=FyeehwYENwsRKyrU2WmgEPmcHsDLjdGRAe35f01Bu5A,502
|
5
|
-
aprsd/main.py,sha256=
|
5
|
+
aprsd/main.py,sha256=aOVLKdTWVx9ahoG2UAqtPJVzy6sScekwBFkj6gjaIeM,4673
|
6
6
|
aprsd/messaging.py,sha256=0zE2y0jJBTxTwwgt8_XmSeMZfBTO77ZBY0GyGe8DX_w,134
|
7
|
-
aprsd/plugin.py,sha256=
|
7
|
+
aprsd/plugin.py,sha256=vVhfhZK9zsM02Ekw-6WxubUXTc4dhuslgTIPiiuKyKw,17359
|
8
8
|
aprsd/plugin_utils.py,sha256=xKQbliwikJxw_E5TGK_BcBPXkHeJ1PqVxSCFcDbf1xg,2507
|
9
|
-
aprsd/
|
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=
|
13
|
-
aprsd/clients/fake.py,sha256=
|
14
|
-
aprsd/clients/kiss.py,sha256=
|
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=
|
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=
|
19
|
-
aprsd/cmds/healthcheck.py,sha256=
|
20
|
-
aprsd/cmds/list_plugins.py,sha256=
|
21
|
-
aprsd/cmds/listen.py,sha256=
|
22
|
-
aprsd/cmds/send_message.py,sha256=
|
23
|
-
aprsd/cmds/server.py,sha256=
|
24
|
-
aprsd/cmds/webchat.py,sha256=
|
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=
|
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=
|
34
|
-
aprsd/packets/__init__.py,sha256=
|
35
|
-
aprsd/packets/
|
36
|
-
aprsd/packets/
|
37
|
-
aprsd/packets/
|
38
|
-
aprsd/packets/
|
39
|
-
aprsd/packets/
|
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=
|
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/
|
47
|
-
aprsd/plugins/
|
48
|
-
aprsd/plugins/
|
49
|
-
aprsd/
|
50
|
-
aprsd/
|
51
|
-
aprsd/
|
52
|
-
aprsd/
|
53
|
-
aprsd/threads/
|
54
|
-
aprsd/threads/
|
55
|
-
aprsd/threads/
|
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=
|
59
|
-
aprsd/threads/
|
60
|
-
aprsd/
|
61
|
-
aprsd/utils/
|
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
|
62
63
|
aprsd/utils/fuzzyclock.py,sha256=qKV8SYZhQGOHG9biF8TeueLb6RMppspx1Zg4IOy1Z10,3265
|
63
|
-
aprsd/utils/json.py,sha256=
|
64
|
-
aprsd/utils/objectstore.py,sha256=
|
64
|
+
aprsd/utils/json.py,sha256=LR2g-sealCRyXnujjTNxNYUxBagrdBqYQxNLYJQGYaM,2487
|
65
|
+
aprsd/utils/objectstore.py,sha256=b4tNw21lQJ-g6vGN_0Hhc_VRbGiCc5tAZ2jszhRtfyM,3541
|
65
66
|
aprsd/utils/ring_buffer.py,sha256=lWWuw7lEbc2URhqAJfRLjpXBDLiK6UUWzk3j2VFnERQ,1111
|
66
67
|
aprsd/utils/trace.py,sha256=oya2ElYKn04yanmAoynaCnETJHvEeI_du-DCIApZDsA,5558
|
67
68
|
aprsd/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
68
69
|
aprsd/web/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
69
70
|
aprsd/web/admin/static/css/index.css,sha256=A0knpKbvbu2hxwV4yHXzb7l712GviOfEM4fl1NkjhEc,1282
|
70
|
-
aprsd/web/admin/static/css/prism.css,sha256=
|
71
|
+
aprsd/web/admin/static/css/prism.css,sha256=s2Izg4hP_qkrFH2sS2VN-ABdXMrEb8QFGLsNop_Nlx0,2671
|
71
72
|
aprsd/web/admin/static/css/tabs.css,sha256=bFU7TDkH7QLFcnCcMy2B8iVRYczTStlgpwxI2vpnLmw,644
|
72
73
|
aprsd/web/admin/static/images/Untitled.png,sha256=j03PNbZ_02asRRKWcezQUF79L283afDdrAcNBMqYFhk,37797
|
73
74
|
aprsd/web/admin/static/images/aprs-symbols-16-0.png,sha256=Wd1Mbh6L4fYYmjRR01a0TzCVKm8-rqfBlNSV8WFx4g4,52962
|
@@ -75,16 +76,14 @@ aprsd/web/admin/static/images/aprs-symbols-16-1.png,sha256=cKj--7nEAir_Br_Zp3-vt
|
|
75
76
|
aprsd/web/admin/static/images/aprs-symbols-64-0.png,sha256=Wd1Mbh6L4fYYmjRR01a0TzCVKm8-rqfBlNSV8WFx4g4,52962
|
76
77
|
aprsd/web/admin/static/images/aprs-symbols-64-1.png,sha256=cKj--7nEAir_Br_Zp3-vtUhx2v5sGakuPtJzrmGhyrE,48951
|
77
78
|
aprsd/web/admin/static/images/aprs-symbols-64-2.png,sha256=OIP7l9temgE-GfB8s29fytJ59GlFQ3TUpEqAA0Gzs2I,40716
|
78
|
-
aprsd/web/admin/static/js/charts.js,sha256=
|
79
|
-
aprsd/web/admin/static/js/echarts.js,sha256=
|
79
|
+
aprsd/web/admin/static/js/charts.js,sha256=spWghq8S-F9hIqpKUNNaWjxSeJxBE3XrUEac6oRU-kw,7354
|
80
|
+
aprsd/web/admin/static/js/echarts.js,sha256=iR1LaJcw49qu4fB3nKJ0ilv4WI6cQsDLdNFugv0MGc0,11738
|
80
81
|
aprsd/web/admin/static/js/logs.js,sha256=wIuX-Fxa30O3KVyZzDqwp7bS7FNE-qNNHzik0UmIrgU,658
|
81
|
-
aprsd/web/admin/static/js/main.js,sha256=
|
82
|
-
aprsd/web/admin/static/js/prism.js,sha256=
|
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
|
83
84
|
aprsd/web/admin/static/js/send-message.js,sha256=GPGOOn589WdJhKWxS20FiVKkq7jDFKQQHYQJdW2psAw,3852
|
84
85
|
aprsd/web/admin/static/js/tabs.js,sha256=cRePBekcExNQO54eRVGCnNXB1JHM9uURnv6LNoe8LMs,889
|
85
|
-
aprsd/web/admin/
|
86
|
-
aprsd/web/admin/static/json-viewer/jquery.json-viewer.js,sha256=klSHtWPkZv4zG4darvDEpAQ9hJFDqNbQrM-xDChm8Fo,5020
|
87
|
-
aprsd/web/admin/templates/index.html,sha256=9-YO2Z4A6nKu1Teh6u8YzZlQI1ZPrniGnGmQO2aEFuk,8553
|
86
|
+
aprsd/web/admin/templates/index.html,sha256=w4Qid-R1fK4OFtbe_vnRj9nuWOQ92fIGjD7X5Re1nFE,9083
|
88
87
|
aprsd/web/chat/static/css/chat.css,sha256=83HA_HZGAIAdLRxQeJn9Pg6Q22Qwv4mVm4KcZqyazzU,1847
|
89
88
|
aprsd/web/chat/static/css/index.css,sha256=vtYtiP0EJi2LTIZsSSVXeAtRhKZN1mN78yXhMLlko7o,1056
|
90
89
|
aprsd/web/chat/static/css/style.css.map,sha256=whSiOQyvQ7AYHxykhuFus-Zm9cjkvc5aG186kwrpP4s,174659
|
@@ -109,9 +108,9 @@ aprsd/web/chat/static/images/aprs-symbols-64-0.png,sha256=Wd1Mbh6L4fYYmjRR01a0Tz
|
|
109
108
|
aprsd/web/chat/static/images/aprs-symbols-64-1.png,sha256=cKj--7nEAir_Br_Zp3-vtUhx2v5sGakuPtJzrmGhyrE,48951
|
110
109
|
aprsd/web/chat/static/images/aprs-symbols-64-2.png,sha256=OIP7l9temgE-GfB8s29fytJ59GlFQ3TUpEqAA0Gzs2I,40716
|
111
110
|
aprsd/web/chat/static/images/globe.svg,sha256=x7kmRI-9gJaZI4FBlpG53K4ZscmqN_gajnzH-P4DzOI,1197
|
112
|
-
aprsd/web/chat/static/js/gps.js,sha256=
|
113
|
-
aprsd/web/chat/static/js/main.js,sha256=
|
114
|
-
aprsd/web/chat/static/js/send-message.js,sha256=
|
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
|
115
114
|
aprsd/web/chat/static/js/tabs.js,sha256=cRePBekcExNQO54eRVGCnNXB1JHM9uURnv6LNoe8LMs,889
|
116
115
|
aprsd/web/chat/static/js/upstream/bootstrap.bundle.min.js,sha256=gGVATfqL6AhR6ukxISDCnWUX6UkUakDC2XchR0dpCDo,80664
|
117
116
|
aprsd/web/chat/static/js/upstream/jquery-3.7.1.min.js,sha256=_JqT3SQfawRcv_BIHPThkBvs0OEvtFFmqPF_lYI_Cxo,87533
|
@@ -119,13 +118,11 @@ aprsd/web/chat/static/js/upstream/jquery-ui.min.js,sha256=qdH_gU82QrS5SDHqeQku9i
|
|
119
118
|
aprsd/web/chat/static/js/upstream/jquery.toast.js,sha256=V4m4PbwAYUb9yr3uP64y2ogcoS9oQsl4oPLAGaxQnQI,12989
|
120
119
|
aprsd/web/chat/static/js/upstream/semantic.min.js,sha256=AYdrntK9PGcU1ZsyD7fTBJ4o0j1bMeD4xn7P-UagMW4,403125
|
121
120
|
aprsd/web/chat/static/js/upstream/socket.io.min.js,sha256=dYF5MG5zs6ekpbIOXBXelJXquX0gi_c48kkYm8tCaYE,64274
|
122
|
-
aprsd/web/chat/
|
123
|
-
aprsd
|
124
|
-
aprsd/
|
125
|
-
aprsd-3.
|
126
|
-
aprsd-3.
|
127
|
-
aprsd-3.
|
128
|
-
aprsd-3.
|
129
|
-
aprsd-3.
|
130
|
-
aprsd-3.3.4.dist-info/top_level.txt,sha256=v1O96niUcJOTMh9aQnFRknbScJ6mMOwqurdbxeaeSjs,6
|
131
|
-
aprsd-3.3.4.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,,
|
@@ -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)
|