Compare commits

...

1552 Commits

Author SHA1 Message Date
TIP Automation User
cf2ad4fa5a Chg: update image tag in helm values to v2.7.1-RC2 2022-10-14 19:14:55 +00:00
Stephane Bourque
d8257265da Merge pull request #266 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-11226
2022-10-14 11:53:10 -07:00
Stephane Bourque
159d8112da Merge pull request #261 from Telecominfraproject/update-mac-build
Update macOS build instruction
2022-10-14 11:50:32 -07:00
Stephane Bourque
fc58822dd8 Merge pull request #265 from Telecominfraproject/WIFI-11162
https://telecominfraproject.atlassian.net/browse/WIFI-11226
2022-10-14 10:43:04 -07:00
stephb9959
ce4c47f568 https://telecominfraproject.atlassian.net/browse/WIFI-11226
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-14 10:41:22 -07:00
Stephane Bourque
2d026fbcd8 Merge pull request #264 from Telecominfraproject/WIFI-11162
https://telecominfraproject.atlassian.net/browse/WIFI-11225
2022-10-14 09:29:39 -07:00
Stephane Bourque
79f1a75a96 Merge branch 'master' into WIFI-11162 2022-10-14 09:29:31 -07:00
stephb9959
b5a1da8649 https://telecominfraproject.atlassian.net/browse/WIFI-11162
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-14 09:21:29 -07:00
stephb9959
87511d39e7 https://telecominfraproject.atlassian.net/browse/WIFI-11162
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-14 09:15:28 -07:00
stephb9959
f0921a9bee https://telecominfraproject.atlassian.net/browse/WIFI-11162
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-14 09:09:53 -07:00
stephb9959
d136b77b43 https://telecominfraproject.atlassian.net/browse/WIFI-11162
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-14 08:57:23 -07:00
stephb9959
b2b29fe00e https://telecominfraproject.atlassian.net/browse/WIFI-11162
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-14 08:42:07 -07:00
stephb9959
5e1e6c964f https://telecominfraproject.atlassian.net/browse/WIFI-11162
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-14 08:36:24 -07:00
TIP Automation User
66825a1103 Chg: update image tag in helm values to v2.7.1-RC1 2022-10-11 17:32:44 +00:00
Stephane Bourque
7e6a566996 Merge pull request #263 from Telecominfraproject/master
Creating 2.7.1 release
2022-10-11 10:26:41 -07:00
stephb9959
c3a4b97ba9 Merge remote-tracking branch 'origin/master' 2022-10-11 09:22:47 -07:00
stephb9959
4cb39e3ebc Merge remote-tracking branch 'origin/master'
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-11 09:22:37 -07:00
Dmitry Dunaev
2be1301542 Merge pull request #262 from Telecominfraproject/security/wifi-11170--docker-image-version
[WIFI-11170] Chg: upgrade base Debian image
2022-10-11 14:56:47 +03:00
Dmitry Dunaev
83f54c3203 [WIFI-11170] Chg: upgrade base Debian image
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-10-11 14:56:01 +03:00
Jun Woo Shin
d7ddd4a491 Update macOS build instruction
Signed-off-by: Jun Woo Shin <jwoos@fb.com>
2022-10-10 16:18:21 -04:00
stephb9959
090fc89b75 Merge remote-tracking branch 'origin/master' 2022-10-10 08:49:49 -07:00
stephb9959
e5fad8efa5 https://telecominfraproject.atlassian.net/browse/WIFI-11162
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-10 08:49:36 -07:00
Dmitry Dunaev
7fa0266545 Chg: helm log level to debug for testing
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-10-07 11:11:36 +03:00
stephb9959
a4821577d8 Removed unneeded files 2022-10-06 10:56:58 -07:00
stephb9959
9f67845ba2 Removed unneeded files 2022-10-06 10:53:45 -07:00
stephb9959
f9bc2f3e99 Removed unneeded files 2022-10-06 10:49:33 -07:00
stephb9959
8bba101ef7 https://telecominfraproject.atlassian.net/browse/WIFI-11012
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-06 10:35:14 -07:00
stephb9959
cc6cf3bdd4 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	build
2022-10-06 10:06:29 -07:00
stephb9959
b1685ad765 https://telecominfraproject.atlassian.net/browse/WIFI-11012
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-06 10:04:33 -07:00
TIP Automation User
a373a24ee1 Chg: update image tag in helm values to v2.7.0 2022-10-05 11:32:46 +00:00
TIP Automation User
3d6e5e00bb Chg: update image tag in helm values to v2.7.0-RC6 2022-10-05 02:45:44 +00:00
jaspreetsachdev
e7d3b4b151 Merge pull request #260 from Telecominfraproject/master
WIFI-10942
2022-10-04 22:38:13 -04:00
stephb9959
332fec8f9c https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 14:11:31 -07:00
stephb9959
25bc8e2b56 https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 12:29:05 -07:00
stephb9959
71bb83d7de https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 11:55:14 -07:00
stephb9959
8871151cf4 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/AP_WS_Process_connect.cpp
2022-10-04 11:54:32 -07:00
stephb9959
32f672698d https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 11:54:11 -07:00
stephb9959
16a2495346 https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 11:27:00 -07:00
stephb9959
426f2d81ac https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 11:13:58 -07:00
stephb9959
3be3920929 https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 11:04:55 -07:00
stephb9959
fcac2065ec https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 10:45:40 -07:00
stephb9959
26b4697d61 Merge remote-tracking branch 'origin/master' 2022-10-04 10:13:40 -07:00
stephb9959
c7fb094497 https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 10:13:32 -07:00
stephb9959
52a83e5fa1 Merge remote-tracking branch 'origin/master' 2022-10-04 10:08:29 -07:00
stephb9959
abb8ac8575 https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 10:06:48 -07:00
stephb9959
957e1bae89 Merge remote-tracking branch 'origin/master' 2022-10-04 09:25:54 -07:00
stephb9959
710553f224 https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 09:25:43 -07:00
jaspreetsachdev
4569b5aefc changed to information level logging 2022-10-04 11:34:37 -04:00
jaspreetsachdev
b12c060c97 changed to information level logging 2022-10-04 11:34:02 -04:00
jaspreetsachdev
1c49c05e12 changed debug to information 2022-10-04 11:32:58 -04:00
stephb9959
956a71e21f Merge pull request #258 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 23:06:16 -07:00
stephb9959
09576ab5b2 Merge pull request #258 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 22:59:00 -07:00
stephb9959
220ca58fa3 Merge pull request #258 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 22:49:55 -07:00
stephb9959
6a4546f803 Merge pull request #258 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 19:20:44 -07:00
stephb9959
a988fbc1a5 Merge pull request #258 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 19:07:12 -07:00
stephb9959
8741a407e8 Merge remote-tracking branch 'origin/master' 2022-10-03 17:05:48 -07:00
Stephane Bourque
3a8b5369eb Merge pull request #258 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 17:05:33 -07:00
Stephane Bourque
41634904e8 Merge pull request #258 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 16:59:19 -07:00
Stephane Bourque
3beb6032e9 Merge branch 'master' into WIFI-10942 2022-10-03 16:59:11 -07:00
stephb9959
92e33342cb https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-03 16:57:24 -07:00
Stephane Bourque
033f3fc626 Merge pull request #257 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 16:27:19 -07:00
stephb9959
4b0521e40a https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-03 16:10:39 -07:00
Stephane Bourque
9144377472 Merge pull request #256 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 13:34:21 -07:00
Stephane Bourque
ee8671876a Merge branch 'master' into WIFI-10942 2022-10-03 13:34:15 -07:00
stephb9959
56de1fea0b https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-03 13:32:20 -07:00
Stephane Bourque
92db23751d Merge pull request #255 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 13:17:12 -07:00
stephb9959
7da8f44a8e https://telecominfraproject.atlassian.net/browse/WIFI-10942 2022-10-03 13:16:18 -07:00
Stephane Bourque
d1d44b3aa2 Merge pull request #254 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-03 11:52:16 -07:00
Stephane Bourque
cf061d0c21 Merge branch 'master' into WIFI-10942 2022-10-03 11:52:09 -07:00
Stephane Bourque
85c4218a6a https://telecominfraproject.atlassian.net/browse/WIFI-10942 2022-10-03 11:50:38 -07:00
TIP Automation User
c3a51487c0 Chg: update image tag in helm values to v2.7.0-RC5 2022-10-03 11:14:15 +00:00
Dmitry Dunaev
dd44d0504d Merge pull request #253 from Telecominfraproject/master
[WIFI-10581] Add: postgresql-client in Dockerfile
2022-10-03 14:03:55 +03:00
Dmitry Dunaev
4cd9b47f23 Merge pull request #252 from Telecominfraproject/fix/wifi-10581--postgres-client
[WIFI-10581] Add: postgresql-client in Dockerfile
2022-10-03 11:22:27 +03:00
Dmitry Dunaev
86c04b185e [WIFI-10581] Add: postgresql-client in Dockerfile
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-10-03 11:12:00 +03:00
Stephane Bourque
a6ff0ab197 Merge pull request #251 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-02 10:30:26 -07:00
Stephane Bourque
8b1056eb59 Merge pull request #250 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-02 10:26:23 -07:00
Stephane Bourque
2b6206c6c5 https://telecominfraproject.atlassian.net/browse/WIFI-10942 2022-10-02 10:24:22 -07:00
Stephane Bourque
b5c3b101d3 Merge pull request #179 from Telecominfraproject/WIFI-10581-switch-images-to-debian-slim
[WIFI-10581] Switch microservice Docker images from Alpine to Debian-slim
2022-10-02 09:47:51 -07:00
Stephane Bourque
f60fed173d Merge branch 'master' into WIFI-10581-switch-images-to-debian-slim 2022-10-02 09:47:21 -07:00
TIP Automation User
9202893b77 Chg: update image tag in helm values to v2.7.0-RC4 2022-09-30 19:48:53 +00:00
Stephane Bourque
7b1920b7b2 Merge pull request #249 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-09-30 11:40:29 -07:00
stephb9959
cafd757593 https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-30 11:35:12 -07:00
stephb9959
ff7a806f67 https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-30 11:33:30 -07:00
TIP Automation User
f264a2e556 Chg: update image tag in helm values to v2.7.0-RC3 2022-09-30 16:31:25 +00:00
Stephane Bourque
f11751ac89 Merge pull request #248 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-09-30 08:55:04 -07:00
stephb9959
fa9d59852a https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-30 08:18:47 -07:00
TIP Automation User
51d1df8150 Chg: update image tag in helm values to v2.7.0-RC2 2022-09-29 23:27:31 +00:00
jaspreetsachdev
37e910e1c2 Merge pull request #247 from Telecominfraproject/master
Fixes for WIFI-10846
2022-09-29 19:01:04 -04:00
Stephane Bourque
9c08f5194b Merge pull request #246 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-29 12:31:54 -07:00
stephb9959
c31ea8f632 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-29 12:31:30 -07:00
Stephane Bourque
08b2d7a278 Merge pull request #245 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-29 09:55:24 -07:00
stephb9959
82688aa4ca https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-29 08:27:01 -07:00
stephb9959
96e6ebdfa1 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-29 07:47:49 -07:00
stephb9959
986cb57389 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-29 07:43:05 -07:00
stephb9959
a39efd3204 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-29 07:27:37 -07:00
stephb9959
350eeca6ec https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-28 22:30:04 -07:00
Stephane Bourque
f686179f7a Merge pull request #244 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-28 20:56:08 -07:00
stephb9959
33d908db96 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-28 20:53:08 -07:00
Stephane Bourque
8e90917e5f Merge pull request #242 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-28 14:26:17 -07:00
stephb9959
aa39497793 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-28 14:25:44 -07:00
Stephane Bourque
fe2f170f1f Merge pull request #241 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-28 14:06:53 -07:00
stephb9959
20cdc999f3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-28 13:54:30 -07:00
Stephane Bourque
ad7fa81b5e Merge pull request #240 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-28 11:11:06 -07:00
stephb9959
5cbf25260d https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-28 11:06:52 -07:00
stephb9959
9c9e6cb593 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-28 10:36:29 -07:00
stephb9959
81fa16fb9c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-28 10:35:08 -07:00
stephb9959
82e877393d https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-28 10:24:56 -07:00
Dmitry Dunaev
0cf6a4cf19 Merge pull request #239 from Telecominfraproject/feature/wifi-10932--docker-support-http
[WIFI-10932] Add: restapi disable property in docker entrypoint
2022-09-28 17:35:00 +03:00
Dmitry Dunaev
e1a3e40326 [WIFI-10932] Add: restapi disable property in docker entrypoint
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-28 17:34:45 +03:00
Dmitry Dunaev
ecf7ab790e Merge pull request #236 from Telecominfraproject/feature/wifi-10582--helm-global-cert-secret
[WIFI-10582] Add: functionality to use external existing certificates secret
2022-09-28 17:05:52 +03:00
Stephane Bourque
e743a97d39 Merge pull request #238 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-27 23:32:08 -07:00
stephb9959
02320b616a https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-27 22:05:36 -07:00
stephb9959
bf1137a99b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-27 21:38:07 -07:00
Stephane Bourque
c7bafec390 Merge pull request #237 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-27 09:55:22 -07:00
stephb9959
5e2d3e7c81 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-27 09:54:29 -07:00
stephb9959
61ab1f7904 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-27 09:50:39 -07:00
stephb9959
d6a61c45ec https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-27 09:43:33 -07:00
stephb9959
f6e7693e39 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-27 09:43:16 -07:00
stephb9959
0e605f9ada https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-27 09:29:10 -07:00
stephb9959
613a2adfca https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-27 09:28:38 -07:00
Dmitry Dunaev
6a2dcb1d29 [WIFI-10582] Add: functionality to use external existing certificates secret
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-27 16:59:29 +03:00
Stephane Bourque
53a7c9c78a Merge pull request #235 from Telecominfraproject/WIFI-10846
Wifi https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-26 11:08:02 -07:00
stephb9959
8955c614a8 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-26 11:07:22 -07:00
stephb9959
1685aefda3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-26 11:01:50 -07:00
Stephane Bourque
c7d5cd96d3 Merge pull request #234 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-26 10:56:04 -07:00
stephb9959
3a70f669ee https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-26 10:55:29 -07:00
Stephane Bourque
cbfb278675 Merge pull request #233 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-26 10:16:56 -07:00
stephb9959
57771f411a https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-26 10:16:22 -07:00
Stephane Bourque
c5991bc6f8 Merge pull request #232 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-26 09:45:48 -07:00
stephb9959
22df3fb8ef https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-26 09:39:03 -07:00
stephb9959
ea369afabf https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-26 08:21:33 -07:00
Stephane Bourque
26b74e503f Merge pull request #231 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-25 20:08:11 -07:00
stephb9959
4a450269f5 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-25 20:07:32 -07:00
Stephane Bourque
e8fe17c906 Merge pull request #230 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-25 19:34:57 -07:00
stephb9959
e44bb3199c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-25 19:33:02 -07:00
Stephane Bourque
f327708f83 Merge pull request #229 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-25 17:53:37 -07:00
stephb9959
eee680686f https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-25 17:53:13 -07:00
Stephane Bourque
74522dbaf8 Merge pull request #228 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-25 07:49:03 -07:00
stephb9959
0e9b13f2b3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-25 07:48:24 -07:00
stephb9959
117f24e0b6 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-25 07:45:09 -07:00
Stephane Bourque
0deeb7403f Merge pull request #227 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-23 14:59:30 -07:00
stephb9959
f639710d38 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 14:58:55 -07:00
Stephane Bourque
c70daf5c9c Merge pull request #226 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-23 14:29:16 -07:00
stephb9959
6d59b45e6f https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 14:28:28 -07:00
Stephane Bourque
e81f1a8fcc Merge pull request #225 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-23 14:16:53 -07:00
stephb9959
540205763c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 14:08:36 -07:00
stephb9959
ec450c30e5 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 14:01:56 -07:00
stephb9959
ef9902c75a https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 13:46:48 -07:00
Stephane Bourque
e367aa72f0 Merge pull request #224 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-23 11:16:07 -07:00
stephb9959
9384bed03d https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 11:09:45 -07:00
stephb9959
29e61bf432 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 10:37:41 -07:00
stephb9959
510e56518a https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 10:34:29 -07:00
stephb9959
82004e3f2e https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 10:11:51 -07:00
stephb9959
2620baca91 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 09:57:30 -07:00
stephb9959
f105b9386c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 09:57:23 -07:00
Stephane Bourque
83e5feec49 Merge pull request #223 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-23 09:08:26 -07:00
stephb9959
24dffe09a4 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-23 09:07:42 -07:00
Stephane Bourque
28052bff3c Merge pull request #222 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 23:50:18 -07:00
stephb9959
c2c37ad0d2 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 23:49:48 -07:00
Stephane Bourque
e5ac94421e Merge pull request #221 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 23:26:43 -07:00
stephb9959
5a306f1a70 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 23:26:15 -07:00
Stephane Bourque
ecb58fe3ed Merge pull request #220 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 21:18:11 -07:00
stephb9959
629a3b390b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 21:17:36 -07:00
Stephane Bourque
071b13f401 Merge pull request #219 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 20:29:25 -07:00
stephb9959
3b5b9636f3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 20:28:31 -07:00
stephb9959
8e125732b3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 15:22:20 -07:00
Stephane Bourque
4ed6fe70ec Merge pull request #218 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 15:15:20 -07:00
stephb9959
8e0ae5f6c8 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 15:14:37 -07:00
Stephane Bourque
e6ec2c65bf Merge pull request #217 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 14:16:14 -07:00
stephb9959
45a4211793 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 14:14:50 -07:00
stephb9959
68e85d8c5a https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 14:11:01 -07:00
Stephane Bourque
8625a81689 Merge pull request #216 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 13:48:40 -07:00
stephb9959
61deb1f589 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 13:47:57 -07:00
Stephane Bourque
f68ada1013 Merge pull request #215 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 10:04:06 -07:00
stephb9959
a1df232de9 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 10:02:36 -07:00
stephb9959
3ac0875b83 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 09:44:38 -07:00
Stephane Bourque
658dbad1b1 Merge pull request #214 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-22 08:50:43 -07:00
stephb9959
94f4930bd7 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 08:44:48 -07:00
stephb9959
0bc515e3ab https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 08:39:24 -07:00
Stephane Bourque
f7a00e0426 Merge pull request #213 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-21 19:31:09 -07:00
stephb9959
81e49026f8 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-21 19:26:50 -07:00
stephb9959
1ae68019d3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-21 18:33:45 -07:00
Stephane Bourque
fde5a2c353 Merge pull request #212 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-21 09:09:59 -07:00
stephb9959
2e316478d7 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-21 09:08:02 -07:00
stephb9959
6c23a969d0 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-21 09:06:13 -07:00
stephb9959
8e900aea69 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-21 08:57:03 -07:00
stephb9959
16c32e53bd https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-21 08:53:27 -07:00
Stephane Bourque
fde3cfa9ce Merge pull request #211 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-20 21:50:59 -07:00
stephb9959
fb15504294 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 21:50:02 -07:00
Stephane Bourque
dc219aa34f Merge pull request #210 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-20 21:30:11 -07:00
stephb9959
8357cd76ed https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 21:29:37 -07:00
Stephane Bourque
6ef36ae53d Merge pull request #209 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-20 21:22:36 -07:00
stephb9959
716d3755fe https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 21:18:42 -07:00
stephb9959
3299aadf57 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 21:05:08 -07:00
stephb9959
71ed6c90d1 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 20:52:06 -07:00
Stephane Bourque
0cc391141b Merge pull request #208 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-20 20:04:48 -07:00
stephb9959
f45b2baa4b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 19:55:37 -07:00
stephb9959
e00aa23775 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 18:27:46 -07:00
stephb9959
83c9476720 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 18:09:59 -07:00
Stephane Bourque
0f38bcab99 Merge pull request #207 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-20 15:40:48 -07:00
stephb9959
18d9947c0e https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 15:37:27 -07:00
stephb9959
3de2dd1931 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 15:22:36 -07:00
stephb9959
847648f1ee https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 15:18:01 -07:00
stephb9959
d77a4a6bb9 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 15:11:14 -07:00
stephb9959
05767cc1a7 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 14:44:08 -07:00
stephb9959
0e5c7ef5c6 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 14:41:54 -07:00
stephb9959
bc6773ac28 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 14:38:50 -07:00
stephb9959
d39574aa22 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 13:48:56 -07:00
stephb9959
b6795a4f04 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 11:34:56 -07:00
stephb9959
b8fe03c74d https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 11:29:48 -07:00
Stephane Bourque
9e877270a4 Merge pull request #206 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-20 11:19:02 -07:00
stephb9959
47b182e481 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 11:16:28 -07:00
stephb9959
f680135e53 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 11:14:52 -07:00
stephb9959
f3aecbd034 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 11:07:55 -07:00
stephb9959
15776c01ac https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 11:04:01 -07:00
stephb9959
8fc342770b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 10:51:31 -07:00
stephb9959
27c1bbeb20 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-20 10:46:19 -07:00
Dmitry Dunaev
b5be0eb8ba Merge pull request #203 from Telecominfraproject/feature/wifi-10595--helm-radius-proxy
[WIFI-10595] Add: helm - enable radius proxy
2022-09-20 15:16:37 +03:00
Stephane Bourque
277abfa036 Merge pull request #205 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-19 23:08:08 -07:00
stephb9959
a4bb7a1c0e https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 15:24:55 -07:00
stephb9959
89134305e8 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 15:21:22 -07:00
stephb9959
f7b4fe84e1 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 15:12:10 -07:00
Stephane Bourque
eb085ea9a9 Merge pull request #204 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-19 14:41:12 -07:00
stephb9959
2c29200bbf https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 14:40:24 -07:00
stephb9959
1e2728423a https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 14:37:41 -07:00
stephb9959
24c9283a55 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 14:34:48 -07:00
stephb9959
92e1afedfb https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 14:05:21 -07:00
stephb9959
b86f06b818 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 14:04:23 -07:00
stephb9959
2f3a0cc756 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 14:01:04 -07:00
stephb9959
713cd01b6b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 13:58:36 -07:00
stephb9959
888cc94709 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 13:50:31 -07:00
stephb9959
0926f57391 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 13:47:07 -07:00
stephb9959
78396d28d7 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 12:39:45 -07:00
stephb9959
9edcd5a330 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 12:15:39 -07:00
stephb9959
dc9a04dbc3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 12:05:10 -07:00
stephb9959
1d675067fe https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 11:52:10 -07:00
stephb9959
f69bc3434a https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 11:41:37 -07:00
stephb9959
17c8d5ceaf https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 10:36:52 -07:00
stephb9959
caf133b6a2 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 10:28:36 -07:00
stephb9959
dcfdb6d242 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 10:24:31 -07:00
stephb9959
40535390b1 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 10:12:29 -07:00
stephb9959
b86d7425ac https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 09:35:47 -07:00
stephb9959
907803eafa https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 09:27:21 -07:00
stephb9959
050a3e3584 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 09:11:40 -07:00
Dmitry Dunaev
f182b12f54 [WIFI-10595] Add: helm - enable radius proxy
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-19 14:18:35 +03:00
stephb9959
1052bbee57 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 01:06:19 -07:00
stephb9959
16a970feb3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 01:05:36 -07:00
stephb9959
a185377258 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 00:52:10 -07:00
stephb9959
0871045b3c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 00:44:14 -07:00
stephb9959
4e2b1e4ecc https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 00:16:04 -07:00
stephb9959
b3f7b16f30 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-19 00:00:32 -07:00
stephb9959
2b7d96728b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-18 23:55:53 -07:00
stephb9959
13e5eab8f4 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-18 23:45:59 -07:00
stephb9959
fd3fbb3dbf https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-18 23:37:53 -07:00
stephb9959
7abd8af2e6 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-18 23:01:16 -07:00
stephb9959
3d97f5a9e3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-18 22:41:19 -07:00
stephb9959
d70ed3cae2 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-18 22:21:45 -07:00
stephb9959
814fe872f6 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-17 15:19:08 -07:00
stephb9959
354f0057c1 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-17 14:01:34 -07:00
stephb9959
390e050801 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-17 13:52:40 -07:00
stephb9959
f8a157ddbe https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-17 13:46:45 -07:00
stephb9959
8d4abd42ec https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-17 13:38:48 -07:00
stephb9959
4a82af2bcd https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-17 13:24:52 -07:00
stephb9959
bfeb9f64e2 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-17 11:22:50 -07:00
Stephane Bourque
071a2ff47f Merge pull request #202 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-17 08:58:18 -07:00
stephb9959
6678669188 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-17 08:48:41 -07:00
Stephane Bourque
3c6299ecc6 Merge pull request #201 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-16 22:59:47 -07:00
stephb9959
afe989205f https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 22:58:03 -07:00
stephb9959
5955e2e845 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 22:53:00 -07:00
TIP Automation User
6c038e1d64 Chg: update image tag in helm values to v2.7.0-RC1 2022-09-16 19:54:47 +00:00
Stephane Bourque
d75836e88f Merge pull request #200 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-16 10:07:53 -07:00
stephb9959
2500dfdd80 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 09:58:03 -07:00
stephb9959
cfa496653f https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 09:51:44 -07:00
stephb9959
e4b9920b56 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 09:47:22 -07:00
stephb9959
ec156c203e https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 09:13:14 -07:00
stephb9959
13fd91b135 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 08:55:18 -07:00
stephb9959
123a638080 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 08:41:33 -07:00
stephb9959
c165a1d3de https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 08:31:51 -07:00
stephb9959
40d2cdf1b3 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-16 08:24:07 -07:00
Stephane Bourque
df850c1a82 Merge pull request #199 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-16 00:04:09 -07:00
stephb9959
565199df70 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 23:59:49 -07:00
stephb9959
c9599c3d86 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 23:51:31 -07:00
stephb9959
988c90643d https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 23:41:48 -07:00
stephb9959
62951a502c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 23:31:33 -07:00
stephb9959
05ec034f7a https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 23:16:22 -07:00
stephb9959
4e5bf7929c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 22:58:38 -07:00
stephb9959
e39149337c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 22:39:59 -07:00
stephb9959
d14da5612b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 22:31:51 -07:00
stephb9959
e42852297d https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 22:01:06 -07:00
stephb9959
1501e0f037 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 21:47:38 -07:00
stephb9959
2d3fd0b736 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 21:18:05 -07:00
stephb9959
17a77ba02b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 21:07:50 -07:00
stephb9959
2541e25ee6 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 16:59:23 -07:00
Stephane Bourque
0c831f0dd8 Merge pull request #198 from Telecominfraproject/WIFI-10846
https://telecominfraproject.atlassian.net/browse/WIFI-10846
2022-09-15 16:24:04 -07:00
stephb9959
7799b3f904 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 16:17:59 -07:00
stephb9959
1762fdc859 https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 16:00:21 -07:00
stephb9959
339ce4734b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 13:35:44 -07:00
stephb9959
3f6b469c3c https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-15 13:28:42 -07:00
Dmitry Dunaev
1db1a6c86d Merge pull request #197 from Telecominfraproject/feature/wifi-10595--deploy-add-radius-proxy
[WIFI-10595] Add: RADIUS proxy support on Docker level
2022-09-15 17:20:27 +03:00
Dmitry Dunaev
aca62368d9 [WIFI-10595] Add: RADIUS proxy support on Docker level
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-15 17:19:57 +03:00
Dmitry Dunaev
c0bf3f8872 Merge pull request #194 from Telecominfraproject/feature/wifi-10842--docker-compose--iptocountry
[WIFI-10842] Add: docker-compose support for iptocountry
2022-09-15 14:09:22 +03:00
Dmitry Dunaev
00f94a6d81 [WIFI-10842] Add: docker-compose support for iptocountry
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-15 14:08:57 +03:00
stephb9959
442f614f1b https://telecominfraproject.atlassian.net/browse/WIFI-10846
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-14 23:17:15 -07:00
Stephane Bourque
2be63c60ee Merge pull request #193 from Telecominfraproject/WIFI-10797
https://telecominfraproject.atlassian.net/browse/WIFI-10797
2022-09-13 23:36:34 -07:00
stephb9959
039cf7a83f https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-13 23:35:07 -07:00
Stephane Bourque
0b502b9f8f Merge pull request #192 from Telecominfraproject/WIFI-10797
https://telecominfraproject.atlassian.net/browse/WIFI-10797
2022-09-13 23:19:39 -07:00
stephb9959
a77fec4475 https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-13 23:07:17 -07:00
stephb9959
dfa9a09ded https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-13 23:02:02 -07:00
Stephane Bourque
40f9d2d4fb Merge pull request #191 from Telecominfraproject/WIFI-10551
https://telecominfraproject.atlassian.net/browse/WIFI-10551
2022-09-13 09:01:27 -07:00
stephb9959
1da30b61ef https://telecominfraproject.atlassian.net/browse/WIFI-10551
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-13 09:00:30 -07:00
Stephane Bourque
175fab0eb5 Merge pull request #190 from Telecominfraproject/WIFI-10797
https://telecominfraproject.atlassian.net/browse/WIFI-10797
2022-09-12 22:57:13 -07:00
stephb9959
b311fbe44d https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-12 22:56:44 -07:00
Stephane Bourque
636b82c28d Merge pull request #189 from Telecominfraproject/WIFI-10797
https://telecominfraproject.atlassian.net/browse/WIFI-10797
2022-09-08 22:55:45 -07:00
stephb9959
183f06e5fa https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-08 22:55:20 -07:00
Stephane Bourque
ac7d4ef048 Merge pull request #188 from Telecominfraproject/WIFI-10797
https://telecominfraproject.atlassian.net/browse/WIFI-10797
2022-09-08 14:53:19 -07:00
stephb9959
0c5087960e https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-08 14:52:34 -07:00
Stephane Bourque
e4be8c84f3 Merge pull request #187 from Telecominfraproject/WIFI-10797
https://telecominfraproject.atlassian.net/browse/WIFI-10797
2022-09-07 23:13:04 -07:00
stephb9959
ce93663cb5 https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-07 22:25:02 -07:00
stephb9959
952442b32d https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-07 09:20:51 -07:00
stephb9959
e06f367eb9 https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-07 09:08:17 -07:00
stephb9959
c0bab98714 https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-07 08:49:46 -07:00
stephb9959
616f3864fb https://telecominfraproject.atlassian.net/browse/WIFI-10797
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-07 08:40:13 -07:00
Stephane Bourque
5f3974aac7 Merge pull request #186 from Telecominfraproject/WIFI-10340
https://telecominfraproject.atlassian.net/browse/WIFI-10340
2022-09-02 09:38:13 -07:00
stephb9959
98a4bfc6c5 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-02 09:37:06 -07:00
stephb9959
a518f13a2d https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-02 09:14:02 -07:00
Dmitry Dunaev
981f6f7e6d Merge pull request #185 from Telecominfraproject/feature/wifi-10069--add-wait-postgres-initcontainer
[WIFI-10069] Add: helm - wait-postgres init container
2022-09-02 14:27:45 +03:00
Dmitry Dunaev
253982a63f [WIFI-10069] Add: helm - wait-postgres init container
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-02 13:41:55 +03:00
Stephane Bourque
03e342a24d Merge pull request #184 from Telecominfraproject/WIFI-10340
https://telecominfraproject.atlassian.net/browse/WIFI-10340
2022-08-31 08:38:32 -07:00
stephb9959
7b9db4bf4d https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-31 08:35:42 -07:00
stephb9959
fc92130fa4 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-30 23:38:19 -07:00
Stephane Bourque
e6d56fec79 Merge pull request #183 from Telecominfraproject/WIFI-10340
https://telecominfraproject.atlassian.net/browse/WIFI-10340
2022-08-28 22:43:41 -07:00
stephb9959
c3094ce73b https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 22:42:07 -07:00
stephb9959
330577edb0 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 10:50:12 -07:00
stephb9959
de6d5288f4 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 10:43:36 -07:00
stephb9959
6e96e8bc9a https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 10:24:06 -07:00
stephb9959
10f8638d73 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 09:46:58 -07:00
stephb9959
0b25e94a68 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 09:26:02 -07:00
stephb9959
3d769634c6 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 09:18:21 -07:00
stephb9959
17f8ca60cf https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 08:47:46 -07:00
stephb9959
544577bad8 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-28 08:26:55 -07:00
stephb9959
24a0035ac0 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 22:32:05 -07:00
stephb9959
cdea03bbb2 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 22:24:05 -07:00
stephb9959
2783809ae9 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 22:15:59 -07:00
stephb9959
565c05b4f3 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 21:48:24 -07:00
stephb9959
e1d90f8ea3 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 21:45:39 -07:00
stephb9959
60321902ec https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 21:39:24 -07:00
stephb9959
9ac0995fd4 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 21:35:17 -07:00
stephb9959
00551fae2c https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 21:19:28 -07:00
stephb9959
42c937848d https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 21:13:10 -07:00
stephb9959
f0d63c69c1 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 21:04:20 -07:00
stephb9959
d09f980a64 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 20:31:38 -07:00
stephb9959
f09a8bd0fe https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-27 20:00:56 -07:00
stephb9959
7dcc8cabbb https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-26 22:01:31 -07:00
stephb9959
a816e0d1c1 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-26 21:44:12 -07:00
stephb9959
01b3daa051 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-26 21:31:09 -07:00
stephb9959
2bf9bb8935 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-26 21:25:28 -07:00
stephb9959
218a49cb95 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-26 21:08:47 -07:00
stephb9959
66ea0cf308 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 22:51:21 -07:00
stephb9959
99a77cdcc4 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 22:47:59 -07:00
stephb9959
b021d80300 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 22:24:17 -07:00
stephb9959
798c40df23 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 16:25:37 -07:00
stephb9959
d95007fae1 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 15:50:02 -07:00
stephb9959
2745f1cfa0 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 15:41:43 -07:00
stephb9959
9f7b78d0f1 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 15:39:08 -07:00
stephb9959
91b0c95101 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 15:23:53 -07:00
stephb9959
6d193699c1 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 15:15:29 -07:00
stephb9959
a63cd8bb7b https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 14:43:00 -07:00
stephb9959
599c8d6fd3 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 14:36:58 -07:00
stephb9959
305ea52737 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 11:05:42 -07:00
stephb9959
7f26d8d49e https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 11:00:15 -07:00
stephb9959
09dbad5e05 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 09:32:38 -07:00
stephb9959
de20856cc1 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 09:29:06 -07:00
stephb9959
5c1e7f97dd https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 09:25:26 -07:00
stephb9959
ee9fdc8d1a https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 09:17:22 -07:00
stephb9959
c5269a9a3c https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 08:59:49 -07:00
stephb9959
79599e9b06 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-25 08:20:11 -07:00
stephb9959
dd47234b4e https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 23:05:56 -07:00
stephb9959
9f14dc8196 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 23:03:19 -07:00
stephb9959
286d313e69 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 22:54:43 -07:00
stephb9959
e69f2cabf1 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 13:29:51 -07:00
stephb9959
246c4dc8f2 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 10:42:51 -07:00
stephb9959
7d7a12a903 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 08:43:56 -07:00
stephb9959
69809eb243 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 08:38:38 -07:00
stephb9959
db85dc82b5 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 08:33:45 -07:00
stephb9959
a291a473b5 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 08:31:33 -07:00
stephb9959
e8ae32d6d4 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 08:24:48 -07:00
stephb9959
1d79d26dac https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 08:16:10 -07:00
stephb9959
b1f06462da https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 08:12:21 -07:00
stephb9959
f0de5dbf80 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-24 08:06:30 -07:00
stephb9959
ad0f28d9ae https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-23 23:23:36 -07:00
stephb9959
bb89e49856 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-23 23:12:22 -07:00
Stephane Bourque
f4952d5865 Merge pull request #181 from Telecominfraproject/WIFI-10571
https://telecominfraproject.atlassian.net/browse/WIFI-10571
2022-08-23 13:41:53 -07:00
stephb9959
ab655910ec https://telecominfraproject.atlassian.net/browse/WIFI-10571
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-23 13:41:26 -07:00
Stephane Bourque
b0666a0efd Merge pull request #180 from Telecominfraproject/WIFI-10340
https://telecominfraproject.atlassian.net/browse/WIFI-10571
2022-08-21 09:35:49 -07:00
stephb9959
d6540a8c1c https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-19 12:25:26 -07:00
stephb9959
1016a98712 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-19 12:17:42 -07:00
stephb9959
1a8574ea86 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-19 12:06:37 -07:00
stephb9959
eeee8b2818 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-19 11:39:31 -07:00
Johann Hoffmann
f68ecd421d Fix self-signed cert file extension for Debian
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-08-19 17:20:16 +02:00
Johann Hoffmann
0e582b10ce Create necessary library links in Docker image
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-08-19 16:15:32 +02:00
Johann Hoffmann
4bfa8054cc Add ca-certificates package to build base image
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-08-18 13:15:32 +02:00
stephb9959
010d1f736b https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-17 21:31:37 -07:00
Johann Hoffmann
c36d4bcad1 Switch to Debian-slim base images
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-08-17 18:07:24 +02:00
stephb9959
e2c71a7555 https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-16 23:35:53 -07:00
stephb9959
1bb6a68b4b https://telecominfraproject.atlassian.net/browse/WIFI-10340
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-15 23:14:56 -07:00
Stephane Bourque
055ea2e3f1 Merge pull request #178 from Telecominfraproject/WIFI-10551
https://telecominfraproject.atlassian.net/browse/WIFI-10551
2022-08-15 13:41:39 -07:00
stephb9959
ad8b6163ac https://telecominfraproject.atlassian.net/browse/WIFI-10551
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-15 13:41:15 -07:00
Dmitry Dunaev
2c405c1cad Merge pull request #177 from Telecominfraproject/fix/wifi-10413--cve-fix
[WIFI-10413] Fix: vulnerable base Docker image version
2022-08-15 13:30:58 +03:00
Dmitry Dunaev
cea975da8b [WIFI-10413] Fix: vulnerable base Docker image version
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-08-15 11:14:06 +03:00
Stephane Bourque
217241eb6a Merge pull request #176 from Telecominfraproject/WIFI-10551
https://telecominfraproject.atlassian.net/browse/WIFI-10359
2022-08-14 21:46:13 -07:00
stephb9959
85783e49c9 https://telecominfraproject.atlassian.net/browse/WIFI-10359
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-14 21:44:06 -07:00
Stephane Bourque
1d5e1a443b Merge pull request #175 from Telecominfraproject/WIFI-10551
https://telecominfraproject.atlassian.net/browse/WIFI-10551
2022-08-14 21:31:12 -07:00
stephb9959
e31a5e69a2 https://telecominfraproject.atlassian.net/browse/WIFI-10551
https://telecominfraproject.atlassian.net/browse/WIFI-10409

Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-14 21:29:54 -07:00
Stephane Bourque
59eae1535f Merge pull request #174 from Telecominfraproject/WIFI-10551
https://telecominfraproject.atlassian.net/browse/WIFI-10551
2022-08-11 22:02:18 -07:00
stephb9959
622dcbaf78 https://telecominfraproject.atlassian.net/browse/WIFI-10551
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-11 22:01:55 -07:00
Stephane Bourque
bc736863dc Merge pull request #173 from Telecominfraproject/WIFI-10551
https://telecominfraproject.atlassian.net/browse/WIFI-10551
2022-08-11 08:27:09 -07:00
stephb9959
5306cb4666 https://telecominfraproject.atlassian.net/browse/WIFI-10551
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-11 08:26:09 -07:00
stephb9959
2e30a954b6 https://telecominfraproject.atlassian.net/browse/WIFI-10551
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-11 08:24:20 -07:00
Stephane Bourque
f170f5dc90 Merge pull request #172 from Telecominfraproject/WIFI-10245
https://telecominfraproject.atlassian.net/browse/WIFI-10245
2022-08-10 16:21:36 -07:00
stephb9959
7901bca172 https://telecominfraproject.atlassian.net/browse/WIFI-10245
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-10 16:21:01 -07:00
Stephane Bourque
736a168233 Merge pull request #171 from Telecominfraproject/WIFI-10345
https://telecominfraproject.atlassian.net/browse/WIFI-10345
2022-08-10 16:20:16 -07:00
stephb9959
556f4bd9d1 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-10 14:56:59 -07:00
Stephane Bourque
2c9fe98ab4 Merge pull request #170 from Telecominfraproject/WIFI-10516
https://telecominfraproject.atlassian.net/browse/WIFI-10516
2022-08-10 12:07:55 -07:00
stephb9959
a8003a3f5f https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-10 12:05:25 -07:00
stephb9959
5a31c2be5f https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 17:48:27 -07:00
stephb9959
e32f3fc265 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 17:45:34 -07:00
stephb9959
5a26c55ffb https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 17:42:04 -07:00
stephb9959
6aa18fa8ec https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 17:30:59 -07:00
stephb9959
995f8eedc3 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 17:28:19 -07:00
stephb9959
ea3ba39e33 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 17:20:19 -07:00
stephb9959
580cd0dcb0 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 17:11:49 -07:00
stephb9959
1e95a45649 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 17:02:57 -07:00
stephb9959
db6af2d2eb https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 16:37:04 -07:00
stephb9959
1008d10112 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 16:24:29 -07:00
stephb9959
7b27970e64 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 14:42:28 -07:00
stephb9959
c9c7d7194f https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 14:34:13 -07:00
stephb9959
9f364009ca https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 09:11:43 -07:00
stephb9959
58dd4f0002 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 09:06:27 -07:00
stephb9959
4ca16d2c35 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 07:55:55 -07:00
stephb9959
bc3b8eee00 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 07:48:39 -07:00
stephb9959
7ea327df08 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 07:42:34 -07:00
stephb9959
94f12c9e5b https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-09 07:23:32 -07:00
Dmitry Dunaev
b273d0ecc9 Merge pull request #169 from Telecominfraproject/feature/wifi-10388--versioning
[WIFI-10388] Chg: use Docker build arg to define dependency version
2022-08-09 11:37:41 +03:00
stephb9959
ff44166aa4 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 23:09:07 -07:00
stephb9959
2a06316d46 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 23:04:34 -07:00
stephb9959
aae437df20 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 22:38:05 -07:00
stephb9959
cfc516ce02 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 22:28:38 -07:00
stephb9959
db6e547d3a https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 22:22:05 -07:00
stephb9959
e51fe3cd3b https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 22:01:41 -07:00
stephb9959
14a6e541e5 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 21:56:35 -07:00
stephb9959
f9d3bc3c43 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 21:47:18 -07:00
stephb9959
ad6f15671b https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 21:39:58 -07:00
stephb9959
f1f946c9ef https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 21:38:18 -07:00
stephb9959
38ca54ac55 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 21:32:53 -07:00
stephb9959
341609bb39 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 21:21:27 -07:00
stephb9959
1875d2a980 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 21:01:41 -07:00
stephb9959
d888ba6ee4 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 20:42:53 -07:00
stephb9959
b9fd3acf75 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 14:58:21 -07:00
stephb9959
ed9ee69f2f https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 14:54:40 -07:00
stephb9959
d436b4b157 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 14:51:33 -07:00
stephb9959
2855f87544 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 14:47:44 -07:00
stephb9959
07ae3bad4d https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 14:44:07 -07:00
stephb9959
81651a4120 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 14:30:34 -07:00
stephb9959
c456e73ab1 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 14:25:24 -07:00
stephb9959
e919e35ea0 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 13:44:09 -07:00
stephb9959
bea768bf8f https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 13:35:07 -07:00
stephb9959
32ec94b3b9 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 12:31:43 -07:00
stephb9959
48553494ca https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 12:21:49 -07:00
stephb9959
163ee377c4 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 11:55:58 -07:00
stephb9959
d3b5bd1f13 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 11:49:37 -07:00
stephb9959
624242bbab https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 11:35:55 -07:00
stephb9959
6b49921e54 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 11:26:18 -07:00
stephb9959
3439de3222 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 11:23:20 -07:00
stephb9959
f74f48def7 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 11:17:53 -07:00
stephb9959
0fd25c7089 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 11:07:09 -07:00
stephb9959
eeb1044718 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-08 10:59:18 -07:00
Dmitry Dunaev
c32da56c92 [WIFI-10388] Chg: use Docker build arg to define dependency version
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-08-08 17:32:33 +03:00
Stephane Bourque
02d5bce712 Merge pull request #168 from Telecominfraproject/WIFI-7786
Protocol documentation update
2022-08-07 21:47:12 -07:00
stephb9959
1baf06adea Protocol documentation update
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-07 21:46:38 -07:00
Stephane Bourque
60a5049d05 Merge pull request #167 from Telecominfraproject/WIFI-7786
https://telecominfraproject.atlassian.net/browse/WIFI-7786
2022-08-02 23:04:41 -07:00
stephb9959
692f0c0326 https://telecominfraproject.atlassian.net/browse/WIFI-7786
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-02 23:02:38 -07:00
Stephane Bourque
7ddcb36ad2 Merge pull request #166 from Telecominfraproject/WIFI-10388
https://telecominfraproject.atlassian.net/browse/WIFI-10388
2022-08-01 09:02:51 -07:00
stephb9959
91700a3c1c https://telecominfraproject.atlassian.net/browse/WIFI-10388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-01 09:00:41 -07:00
Stephane Bourque
5da93336fa Merge pull request #165 from Telecominfraproject/WIFI-10407
https://telecominfraproject.atlassian.net/browse/WIFI-9977v6
2022-08-01 08:43:56 -07:00
stephb9959
feb1faec4f https://telecominfraproject.atlassian.net/browse/WIFI-9977v6
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-01 08:42:53 -07:00
Stephane Bourque
82e28f1728 Merge pull request #164 from Telecominfraproject/WIFI-10407
https://telecominfraproject.atlassian.net/browse/WIFI-10407
2022-07-29 08:31:41 -07:00
stephb9959
bf3912a67f https://telecominfraproject.atlassian.net/browse/WIFI-10407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-29 08:30:18 -07:00
Stephane Bourque
fe68b1e778 Merge pull request #163 from Telecominfraproject/WIFI-9977v5
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-27 12:51:36 -07:00
stephb9959
546ca9d0b2 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 12:50:36 -07:00
Stephane Bourque
14d5309637 Merge pull request #162 from Telecominfraproject/WIFI-9977v5
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-27 10:00:50 -07:00
stephb9959
e871708f41 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 09:59:57 -07:00
Stephane Bourque
135eae4931 Merge pull request #161 from Telecominfraproject/WIFI-9977v5
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-27 09:49:13 -07:00
stephb9959
beee84775e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 09:43:36 -07:00
stephb9959
62a13bfaf5 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 09:39:35 -07:00
stephb9959
42e0f67ce8 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 09:32:35 -07:00
stephb9959
50a7d3a79e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 09:20:21 -07:00
stephb9959
300f91db17 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 09:17:21 -07:00
stephb9959
8fad2a1981 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 08:55:05 -07:00
stephb9959
0e427d4799 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-27 08:18:41 -07:00
stephb9959
0cb700ac7b https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 23:29:00 -07:00
stephb9959
23f03813eb https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 15:07:20 -07:00
Stephane Bourque
44bedc6b8c Merge pull request #160 from Telecominfraproject/WIFI-9977v5
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-26 14:50:52 -07:00
stephb9959
4acfe59f78 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 14:44:12 -07:00
stephb9959
cc66db4a33 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 14:30:34 -07:00
stephb9959
cf87b00781 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 14:15:42 -07:00
stephb9959
85b6e70132 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 14:00:20 -07:00
stephb9959
446c2c7206 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 13:26:03 -07:00
stephb9959
a66a472e9e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 13:06:06 -07:00
stephb9959
d438f99f25 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 12:55:42 -07:00
Stephane Bourque
a2ae008755 Merge pull request #159 from Telecominfraproject/WIFI-10345
https://telecominfraproject.atlassian.net/browse/WIFI-10345
2022-07-24 19:23:25 -07:00
stephb9959
12333b2bd3 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-24 12:05:45 -07:00
stephb9959
f09106c3a9 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-24 10:52:17 -07:00
stephb9959
05226c912e https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-24 10:27:44 -07:00
stephb9959
ef9eb0972d https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-24 10:24:53 -07:00
stephb9959
19b7803ca9 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-24 10:05:07 -07:00
stephb9959
9f1726cc99 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 14:28:55 -07:00
stephb9959
85c68d2fff https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 14:11:19 -07:00
stephb9959
0f924cdbba https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 14:06:06 -07:00
stephb9959
9433f337be https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 13:54:25 -07:00
stephb9959
feacd6544a https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 13:47:47 -07:00
stephb9959
0b79b180bb https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 13:45:48 -07:00
stephb9959
28bce56334 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 13:31:18 -07:00
stephb9959
d26e7efb6a https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 13:07:22 -07:00
stephb9959
3d3b5b4404 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 12:59:36 -07:00
stephb9959
db3cabb768 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 12:40:16 -07:00
stephb9959
3ccf4b40b8 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 11:17:23 -07:00
stephb9959
3c77fd1415 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 11:01:23 -07:00
stephb9959
ff14d887bb https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 10:52:18 -07:00
stephb9959
10221f8b16 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 10:37:23 -07:00
stephb9959
178fcccaac https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 10:31:42 -07:00
stephb9959
4f6f0aea26 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 10:01:05 -07:00
stephb9959
332d093e72 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 09:34:58 -07:00
stephb9959
6c275aefe8 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 09:26:15 -07:00
stephb9959
1dd5efeb22 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 08:57:51 -07:00
stephb9959
2ad0ec12dd https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-23 08:47:33 -07:00
Stephane Bourque
b09cec0bc2 Merge pull request #157 from Telecominfraproject/WIFI-9977v4
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-21 22:12:59 -07:00
stephb9959
d14ca95010 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-21 22:04:15 -07:00
stephb9959
2df1100795 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-19 21:40:12 -07:00
stephb9959
2f961f992a Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-19 21:20:27 -07:00
stephb9959
ecdc5b3531 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-19 20:53:16 -07:00
stephb9959
5f08a581f2 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-19 20:49:07 -07:00
stephb9959
87b4a5d626 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-19 20:43:53 -07:00
stephb9959
6aa2ef2878 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-19 20:42:18 -07:00
stephb9959
9267a36529 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-19 20:32:01 -07:00
stephb9959
72db313d8d Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 23:03:57 -07:00
stephb9959
93f0b2500e Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 23:03:21 -07:00
stephb9959
76b7aba5bd Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 22:41:32 -07:00
stephb9959
0585884033 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 22:36:39 -07:00
stephb9959
c31fa08579 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 22:34:26 -07:00
stephb9959
d9c3fea93d Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 22:27:51 -07:00
stephb9959
6325476325 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 22:24:29 -07:00
stephb9959
054e172b64 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 21:56:22 -07:00
stephb9959
7ae51f0fec Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 21:52:58 -07:00
stephb9959
531c0e24ba Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 21:46:53 -07:00
stephb9959
d97a31e002 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 08:51:32 -07:00
stephb9959
70e5b1d0db Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 08:43:17 -07:00
stephb9959
63516e85db Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-18 08:34:15 -07:00
stephb9959
35b1dbdc2e Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 23:25:41 -07:00
stephb9959
c9abe16cfe Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 23:21:22 -07:00
stephb9959
aee7530b2b Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 23:13:06 -07:00
stephb9959
ceda99fa84 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 22:56:27 -07:00
stephb9959
ce78b144e6 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 22:51:54 -07:00
stephb9959
3fd3717978 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 22:36:29 -07:00
stephb9959
9be3f1dfa9 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 22:34:11 -07:00
stephb9959
2249367696 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 22:23:46 -07:00
stephb9959
b68af82771 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 22:12:55 -07:00
stephb9959
884d2e323b Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 16:02:31 -07:00
stephb9959
5a21b6f197 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 15:53:41 -07:00
stephb9959
62c0178aa9 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 15:17:39 -07:00
stephb9959
041452cf93 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 15:00:57 -07:00
stephb9959
89ebaf78bc Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 14:45:10 -07:00
stephb9959
295a6496ef Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 14:13:48 -07:00
stephb9959
48fb10bcec Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 13:36:59 -07:00
stephb9959
525e464592 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 12:28:52 -07:00
stephb9959
5f20866a31 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 12:27:51 -07:00
stephb9959
05f60cd08b Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 11:57:45 -07:00
stephb9959
bd7b56757d Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 11:50:41 -07:00
stephb9959
bc3c85fe2d Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 11:37:41 -07:00
stephb9959
22c87decdc Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 11:18:53 -07:00
stephb9959
d13216e0e2 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 11:17:52 -07:00
stephb9959
992d977312 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-17 11:13:04 -07:00
stephb9959
9cb789d0b0 Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-16 23:35:09 -07:00
stephb9959
b4e9747bfa Feature: venue-broadcast
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-16 22:44:33 -07:00
Stephane Bourque
5ec9d6a2c8 Merge pull request #155 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-16 08:38:50 -07:00
stephb9959
3abb24919f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-16 08:37:02 -07:00
Stephane Bourque
345195dd1e Merge pull request #153 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-15 23:09:58 -07:00
stephb9959
21db12bcc6 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 23:07:32 -07:00
stephb9959
be01cfb142 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 22:57:54 -07:00
stephb9959
55645c5da4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 22:32:26 -07:00
stephb9959
aa0316462f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 22:31:08 -07:00
stephb9959
ebb3c8fed0 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 22:21:22 -07:00
stephb9959
4fb788def4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 22:08:57 -07:00
stephb9959
5b1e048be3 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 22:04:54 -07:00
stephb9959
03ebc88672 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 21:58:46 -07:00
stephb9959
80bb7ffa07 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 21:57:22 -07:00
stephb9959
1776a70a0e Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 21:47:24 -07:00
stephb9959
3a0de1fee9 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 21:35:12 -07:00
stephb9959
8414ed719b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 21:08:13 -07:00
stephb9959
eebb18fccf Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 21:00:27 -07:00
stephb9959
1e59b8e160 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 20:43:23 -07:00
stephb9959
6da673e754 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 20:39:56 -07:00
stephb9959
ee4cb53517 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 20:34:11 -07:00
stephb9959
61da6aa317 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:50:55 -07:00
stephb9959
bbbadd3a23 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:44:52 -07:00
stephb9959
855eb0dc13 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:36:05 -07:00
stephb9959
0601aaf340 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:35:00 -07:00
stephb9959
100d0302be Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:29:37 -07:00
stephb9959
1fe4dbf49f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:24:29 -07:00
stephb9959
720222137c Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:18:39 -07:00
stephb9959
d464b8a6f4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:11:58 -07:00
stephb9959
019a995bdd Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:09:08 -07:00
stephb9959
f70a8f1732 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 16:08:16 -07:00
stephb9959
0c79d2a632 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 15:56:44 -07:00
stephb9959
1d16bd352a Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 15:46:02 -07:00
stephb9959
88564f2a77 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 15:33:52 -07:00
stephb9959
1907ab9623 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 15:30:01 -07:00
stephb9959
60e50b2af4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 15:24:11 -07:00
stephb9959
cd24a45c87 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 15:17:46 -07:00
stephb9959
cab25f6fd7 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 15:04:55 -07:00
stephb9959
23c5879a4b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 14:55:59 -07:00
stephb9959
4e90422e7c Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 14:43:57 -07:00
stephb9959
e75983019a Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 14:25:20 -07:00
stephb9959
a6afef5f8e Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 14:15:56 -07:00
stephb9959
15e45f32a1 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 14:11:19 -07:00
stephb9959
4c7e1807a2 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 14:01:21 -07:00
stephb9959
301b24415c Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 14:00:34 -07:00
stephb9959
da0698ab9b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 13:57:27 -07:00
stephb9959
f8454e6b83 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 13:52:54 -07:00
stephb9959
cfaab404e9 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 13:49:58 -07:00
stephb9959
e5f98cda04 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 13:44:54 -07:00
stephb9959
bd8fece423 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 13:36:18 -07:00
stephb9959
68a707fe57 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 13:31:09 -07:00
stephb9959
e02a5595a1 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 12:44:21 -07:00
Stephane Bourque
744c1143fb Merge pull request #152 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-15 11:16:01 -07:00
stephb9959
41423a6d5f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 11:15:25 -07:00
stephb9959
060c8673e7 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 11:14:42 -07:00
Stephane Bourque
1210ae821b Merge pull request #151 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-15 10:49:12 -07:00
stephb9959
1a2e4cc184 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 10:48:18 -07:00
Stephane Bourque
e32ace120b Merge pull request #150 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-15 10:33:55 -07:00
stephb9959
3f2c046a96 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 10:32:21 -07:00
Stephane Bourque
9459bb022c Merge pull request #149 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-15 10:16:04 -07:00
stephb9959
9526a2639a Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 10:14:56 -07:00
Stephane Bourque
2051467c0b Merge pull request #148 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-15 07:47:53 -07:00
stephb9959
bacaa9959c Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 07:46:36 -07:00
Stephane Bourque
875ee6bfd1 Merge pull request #147 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-15 07:42:16 -07:00
stephb9959
8f966fa80c Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 07:41:13 -07:00
stephb9959
d9ac843134 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-15 07:07:18 -07:00
Stephane Bourque
c14abf8aa0 Merge pull request #145 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-14 20:55:33 -07:00
stephb9959
d779fca535 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 20:50:46 -07:00
stephb9959
7e1d545f26 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 20:43:38 -07:00
stephb9959
9c2d60ed3a Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 20:22:58 -07:00
Stephane Bourque
b8516cad84 Merge pull request #144 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-14 15:52:37 -07:00
stephb9959
eba979d9da Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 15:47:58 -07:00
stephb9959
d163f7522d Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 15:34:53 -07:00
stephb9959
132fdafd32 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 15:29:00 -07:00
stephb9959
3d6527f30b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 15:17:02 -07:00
stephb9959
dc114de8fa Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 15:16:11 -07:00
stephb9959
0592537b71 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 15:16:04 -07:00
stephb9959
eddaaa0cd6 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 08:03:33 -07:00
stephb9959
46e72369ae Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-14 07:28:32 -07:00
Stephane Bourque
58648d7dc5 Merge pull request #142 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-13 23:59:54 -07:00
stephb9959
b2bd6aab9e Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 23:58:42 -07:00
stephb9959
3781f5283f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 23:42:47 -07:00
stephb9959
7b990a7d2f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 23:14:33 -07:00
Stephane Bourque
c1347fc3b8 Merge pull request #140 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-13 15:51:42 -07:00
stephb9959
888fcbbcd3 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 15:50:31 -07:00
stephb9959
4e4156c420 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 15:45:51 -07:00
stephb9959
ee98a7b8a5 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 14:24:54 -07:00
stephb9959
0b5518d265 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 14:21:38 -07:00
stephb9959
7bc0656f25 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 13:53:53 -07:00
stephb9959
177a8b40ee Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 12:54:43 -07:00
Stephane Bourque
85ee78f35e Merge pull request #139 from Telecominfraproject/WIFI-9977
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-13 12:08:11 -07:00
stephb9959
9043b3a558 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:59:10 -07:00
stephb9959
4d2d488812 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:53:09 -07:00
stephb9959
adf226f2e8 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:48:24 -07:00
stephb9959
749d425d80 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:40:55 -07:00
stephb9959
a6f9deb315 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:35:41 -07:00
stephb9959
f4236408fc Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:30:03 -07:00
stephb9959
377c7bfc0b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:20:27 -07:00
stephb9959
2e3efd97e4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:08:28 -07:00
stephb9959
58abf04e42 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 11:07:40 -07:00
stephb9959
5e002899b5 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 10:45:04 -07:00
stephb9959
d43c8f63ab Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-13 08:27:54 -07:00
Stephane Bourque
a00ba50920 Merge pull request #137 from Telecominfraproject/WIFI-10084
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-12 20:39:33 -07:00
stephb9959
c2fa87d6bd Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 20:38:12 -07:00
stephb9959
ab0b36a96f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 20:31:18 -07:00
stephb9959
89f8047e2f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 20:20:15 -07:00
stephb9959
1515c9bb6a Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 20:11:54 -07:00
stephb9959
b53e6f44fa Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 14:16:10 -07:00
stephb9959
769c9c90f6 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 12:31:16 -07:00
stephb9959
dc0eb35376 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 12:02:29 -07:00
stephb9959
e6b497f0b4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 11:21:07 -07:00
stephb9959
bab9d869b1 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 10:52:42 -07:00
stephb9959
a9127d4fcf Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 10:35:30 -07:00
stephb9959
fea78abe9b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 10:27:10 -07:00
stephb9959
bd72993fa5 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 10:11:48 -07:00
stephb9959
7d74694bf9 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 10:01:30 -07:00
stephb9959
8e84a0f1f3 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 09:50:24 -07:00
stephb9959
98c8f29555 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 09:41:04 -07:00
stephb9959
42a4ee0864 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 09:28:59 -07:00
stephb9959
fcce86acf4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 09:03:41 -07:00
stephb9959
31aad8b41b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 08:18:25 -07:00
stephb9959
a828039445 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 08:03:07 -07:00
stephb9959
6905aeaeec Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 07:53:16 -07:00
Stephane Bourque
3293b7b71d Merge pull request #136 from Telecominfraproject/WIFI-10084
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-12 00:31:03 -07:00
stephb9959
2d6df5ea29 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 00:29:01 -07:00
stephb9959
e466f76b75 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 00:28:12 -07:00
stephb9959
170b97514b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 00:20:54 -07:00
stephb9959
a463bb60dd Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 00:20:03 -07:00
stephb9959
9bbb12b674 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-12 00:05:05 -07:00
stephb9959
46cc41e065 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 23:53:15 -07:00
stephb9959
1776643579 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 23:40:46 -07:00
stephb9959
c0d9aca88a Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 23:22:39 -07:00
stephb9959
88018335da Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 23:08:01 -07:00
stephb9959
7ce7927c95 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 22:56:38 -07:00
stephb9959
5b797cf937 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 22:43:53 -07:00
stephb9959
cd615e8f2b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 22:33:17 -07:00
stephb9959
cf3f0fe67f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 21:57:51 -07:00
stephb9959
b80e92f3dc Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 21:50:53 -07:00
stephb9959
11034bd4fd Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 14:31:25 -07:00
stephb9959
01980892b1 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 14:24:14 -07:00
stephb9959
f4d4405663 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 14:18:24 -07:00
stephb9959
a8370dc8dd Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 14:17:43 -07:00
stephb9959
861c4d0dee Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 14:12:15 -07:00
stephb9959
8c70e833ea Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 14:08:03 -07:00
stephb9959
f8928bbec2 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 13:42:00 -07:00
stephb9959
0b7e474e01 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 13:40:22 -07:00
stephb9959
14f0bb75d1 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 12:37:20 -07:00
stephb9959
32d37a3b9c Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 12:27:12 -07:00
stephb9959
24391c5ac4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 12:23:39 -07:00
stephb9959
7ac47dfaa0 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 12:16:05 -07:00
stephb9959
fd77d6ef37 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 11:32:02 -07:00
stephb9959
04c9deffd3 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 11:23:55 -07:00
stephb9959
f8bc00cb55 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 11:15:48 -07:00
stephb9959
f2ae0b6bd4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 11:11:25 -07:00
stephb9959
1904b34c84 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 11:07:13 -07:00
stephb9959
23ea21d2b4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 10:57:06 -07:00
stephb9959
276572a8a5 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 10:29:10 -07:00
stephb9959
b9bd5ca6a5 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 10:27:41 -07:00
stephb9959
201a4dd6e7 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 10:18:57 -07:00
Stephane Bourque
769eb83744 Merge pull request #135 from Telecominfraproject/WIFI-10084
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-11 10:09:31 -07:00
stephb9959
66a30c4f37 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 10:06:22 -07:00
Stephane Bourque
2a744e2fde Merge pull request #134 from Telecominfraproject/WIFI-10084
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-11 09:43:00 -07:00
stephb9959
f212aa2e8c Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 09:30:47 -07:00
stephb9959
fc478bd304 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 09:11:39 -07:00
stephb9959
6e8a2478c4 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 09:01:46 -07:00
stephb9959
eceb5a9034 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 08:48:55 -07:00
stephb9959
782acea8c7 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 08:47:18 -07:00
stephb9959
524d392e83 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 08:39:08 -07:00
Stephane Bourque
885f1affeb Merge pull request #133 from Telecominfraproject/WIFI-10084
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-11 07:22:44 -07:00
stephb9959
50abf75a0a Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-11 07:21:53 -07:00
Stephane Bourque
1e2d04ad07 Merge pull request #131 from Telecominfraproject/WIFI-10084
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
2022-07-10 16:10:40 -07:00
stephb9959
5874d3f1fd Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 16:09:06 -07:00
stephb9959
a4abbe6ef3 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 16:06:37 -07:00
stephb9959
41e3cbb2b2 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 16:00:13 -07:00
stephb9959
1f77083973 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 15:52:36 -07:00
stephb9959
b08f993a20 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 15:40:34 -07:00
stephb9959
113baa625e Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 15:34:49 -07:00
stephb9959
3765d22815 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 15:33:47 -07:00
stephb9959
24d492903b Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 15:27:09 -07:00
stephb9959
3b4fd70522 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 14:54:45 -07:00
stephb9959
19cf9101fe Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 14:43:49 -07:00
stephb9959
004319e7ad Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 14:36:17 -07:00
stephb9959
94893d1185 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 14:28:57 -07:00
stephb9959
13dce2f3e8 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 14:28:16 -07:00
stephb9959
ea7bc3c52f Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 14:13:36 -07:00
stephb9959
0235a13841 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 14:07:54 -07:00
stephb9959
be33c88337 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 13:58:40 -07:00
stephb9959
0456f638c9 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 11:32:09 -07:00
stephb9959
83ada79ca3 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 11:29:25 -07:00
stephb9959
913d1e571d Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 11:22:33 -07:00
stephb9959
8f98e510db Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 11:17:51 -07:00
stephb9959
fb0da90b63 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 11:04:44 -07:00
stephb9959
1e1dec51ab Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 11:01:34 -07:00
stephb9959
c35602e30e Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 10:47:26 -07:00
stephb9959
4c90a777e0 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 10:36:38 -07:00
stephb9959
9abfa4bad5 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 10:30:23 -07:00
stephb9959
7ecd0c9891 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 10:09:41 -07:00
stephb9959
6e25ccdd87 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 10:08:10 -07:00
stephb9959
a8f970eaf2 Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 09:52:23 -07:00
stephb9959
9f4d362a6d Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10084
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-10 08:02:46 -07:00
stephb9959
c84f05cd22 Merge remote-tracking branch 'origin/master' 2022-07-08 23:10:01 -07:00
stephb9959
a532520044 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-08 23:09:34 -07:00
Stephane Bourque
02c3b2fe2e Merge pull request #129 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-07 20:54:24 -07:00
stephb9959
cce4a7ec93 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-07 20:52:40 -07:00
Stephane Bourque
9aef183dc2 Merge pull request #128 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-07 12:08:40 -07:00
stephb9959
60a3365a9e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-07 11:59:04 -07:00
stephb9959
6c052d7afe https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-07 11:57:57 -07:00
Stephane Bourque
88eae31b7f Merge pull request #127 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 23:41:42 -07:00
stephb9959
d59f6e3dfc https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 23:39:46 -07:00
Stephane Bourque
c97566f625 Merge pull request #126 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 22:59:51 -07:00
stephb9959
1fb41a9460 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 22:55:50 -07:00
stephb9959
cfec8a1cbc https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 22:55:39 -07:00
stephb9959
7a84640c71 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 22:52:44 -07:00
Stephane Bourque
0d2276ff5a Merge pull request #125 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 22:25:36 -07:00
stephb9959
d227f83384 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 22:23:28 -07:00
stephb9959
acb4d91a3d https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 22:20:48 -07:00
Stephane Bourque
72b2913cc5 Merge pull request #124 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 22:03:47 -07:00
stephb9959
746ef603e2 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 22:02:51 -07:00
stephb9959
ab792f7239 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 22:02:42 -07:00
Stephane Bourque
c4bb577763 Merge pull request #123 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 21:41:49 -07:00
stephb9959
3caf67102e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 21:41:15 -07:00
Stephane Bourque
8a3ade14ae Merge pull request #122 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 21:26:06 -07:00
stephb9959
4199b859ad https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 21:24:36 -07:00
stephb9959
be1b571f7f https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 21:10:29 -07:00
Stephane Bourque
3002e17fd2 Merge pull request #121 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 21:04:22 -07:00
stephb9959
0d1a794e10 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 21:00:50 -07:00
stephb9959
2aa7d97c80 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 19:23:47 -07:00
Stephane Bourque
0d3a0cbf03 Merge pull request #120 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 16:26:07 -07:00
stephb9959
1d8cb5447b https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 16:25:10 -07:00
Stephane Bourque
3526a7abd9 Merge pull request #119 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 16:01:04 -07:00
stephb9959
d7ec9a3552 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 15:59:29 -07:00
Stephane Bourque
9f567e0e69 Merge pull request #118 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 15:30:56 -07:00
stephb9959
b16a410f1d https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 15:29:39 -07:00
Stephane Bourque
0955f23dfc Merge pull request #117 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 14:52:21 -07:00
stephb9959
bd10ebc19c https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 14:50:58 -07:00
stephb9959
f74c5b496f https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 14:50:07 -07:00
stephb9959
6e961be74e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 14:42:28 -07:00
Stephane Bourque
c92d22f3cb Merge pull request #116 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 12:13:18 -07:00
stephb9959
e1770dc6a2 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 10:47:43 -07:00
Stephane Bourque
eace417fd3 Merge pull request #115 from Telecominfraproject/WIFI-9977v3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-06 08:45:20 -07:00
stephb9959
ec3b5ededc https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-06 08:39:12 -07:00
Stephane Bourque
78a6b011f8 Merge pull request #113 from Telecominfraproject/RADSEC-proxy
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-05 15:01:37 -07:00
stephb9959
a5450418b3 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-05 14:23:21 -07:00
stephb9959
c74aa0d89f https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-05 13:36:38 -07:00
stephb9959
5f5e887f91 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-04 23:26:10 -07:00
stephb9959
54a9290589 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-04 23:23:52 -07:00
stephb9959
24be35c974 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-04 23:18:12 -07:00
Stephane Bourque
937d2818c0 Merge pull request #112 from Telecominfraproject/RTTYv3
Fix: https://telecominfraproject.atlassian.net/browse/WIFI-10040
2022-07-04 21:44:59 -07:00
stephb9959
f014960b3a https://telecominfraproject.atlassian.net/browse/WIFI-10040
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-04 13:57:13 -07:00
stephb9959
cc5b319141 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-01 08:00:28 -07:00
Stephane Bourque
d5e7a6661f Merge pull request #111 from Telecominfraproject/RTTYv3
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-07-01 06:53:53 -07:00
stephb9959
3368782471 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 23:30:13 -07:00
stephb9959
2f013557a9 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 23:22:50 -07:00
stephb9959
09595abc8c https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 23:22:30 -07:00
stephb9959
5104ab1dc3 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 23:18:22 -07:00
stephb9959
8f3b2f795f https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 22:59:14 -07:00
stephb9959
9779ee669b https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 22:55:58 -07:00
stephb9959
f7187749a1 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 22:51:03 -07:00
stephb9959
ddec407856 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 22:47:11 -07:00
stephb9959
4650ac592a https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 22:39:13 -07:00
stephb9959
bc5c9e30cf https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 22:19:45 -07:00
stephb9959
1b53398e1e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 22:14:39 -07:00
stephb9959
7b59a981dd https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 22:02:19 -07:00
stephb9959
ec3cb6586f https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 21:41:33 -07:00
stephb9959
c40be95aa8 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 21:29:35 -07:00
stephb9959
ba8edb7f74 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 20:51:00 -07:00
stephb9959
ea14936a1d https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 20:42:03 -07:00
stephb9959
676f131ca9 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 20:39:55 -07:00
stephb9959
2e1fc663c8 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 20:29:27 -07:00
stephb9959
cd9ef2ed2a https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 17:02:17 -07:00
stephb9959
4a1a903656 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 16:59:00 -07:00
stephb9959
f6409fc063 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 16:38:23 -07:00
stephb9959
6af855f6ca https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 16:33:39 -07:00
stephb9959
bec81bc380 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 16:31:15 -07:00
stephb9959
0e4e4156a1 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 16:07:51 -07:00
stephb9959
2aa60a5676 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 15:59:58 -07:00
stephb9959
8b396e51ff https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 15:48:15 -07:00
Stephane Bourque
01f53d7b78 Merge pull request #110 from Telecominfraproject/WIFI-9828
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-06-30 15:47:01 -07:00
stephb9959
b3c188701f https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 14:31:12 -07:00
stephb9959
7eb4c9e38b https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 11:00:42 -07:00
stephb9959
c93c34c042 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 10:53:37 -07:00
stephb9959
418f8d31ae https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 10:44:14 -07:00
stephb9959
77c0c191f7 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 10:12:49 -07:00
stephb9959
f0f4cf54bb https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 10:06:30 -07:00
stephb9959
917abf1d7f https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 09:43:05 -07:00
stephb9959
b4e7e4e26b https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 09:27:33 -07:00
stephb9959
9d0a146859 https://telecominfraproject.atlassian.net/browse/WIFI-9877
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 09:13:46 -07:00
Stephane Bourque
7420b72b23 Merge pull request #108 from Telecominfraproject/oui_download_url
properties: update default OUI download URL everywhere
2022-06-30 07:25:57 -07:00
Stephane Bourque
5fc675484c Merge pull request #107 from Telecominfraproject/WIFI-9828
https://telecominfraproject.atlassian.net/browse/WIFI-9828
2022-06-30 07:12:49 -07:00
Stijn Tintel
38ad11542b properties: update default OUI download URL everywhere
The URL https://linuxnet.ca/ieee/oui.txt times out:

  OUI-SVR: [Information] Start: Retrieving OUI file: https://linuxnet.ca/ieee/oui.txt
  OUI-SVR: [Error] Timeout: connect timed out: 24.222.55.20:443

It was replaced with a working URL in the following commit:
7e5e998265 ("Updated the OUI db download link")

Let's use the new URL everywhere for consistency.

Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
2022-06-30 16:19:44 +03:00
stephb9959
63f2a4085a https://telecominfraproject.atlassian.net/browse/WIFI-9828
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-30 00:17:39 -07:00
Stephane Bourque
fea70efb2d Merge pull request #106 from Telecominfraproject/WIFI-9828
Wifi 9828
2022-06-30 00:15:26 -07:00
stephb9959
da42c9845f https://telecominfraproject.atlassian.net/browse/WIFI-9828
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 23:47:47 -07:00
stephb9959
ed46778bd4 https://telecominfraproject.atlassian.net/browse/WIFI-9828
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 23:35:14 -07:00
stephb9959
1f7c0b7fdf https://telecominfraproject.atlassian.net/browse/WIFI-9828
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 23:22:58 -07:00
stephb9959
15ec31fc89 https://telecominfraproject.atlassian.net/browse/WIFI-9828
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 23:13:38 -07:00
stephb9959
d2a0d6da8a https://telecominfraproject.atlassian.net/browse/WIFI-9828
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 23:08:52 -07:00
stephb9959
77cae31031 https://telecominfraproject.atlassian.net/browse/WIFI-9828
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 22:41:36 -07:00
stephb9959
6cab1caf6c https://telecominfraproject.atlassian.net/browse/WIFI-9828
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 22:10:28 -07:00
Stephane Bourque
eea8203869 Merge pull request #104 from Telecominfraproject/WiFi-9620-CoA
https://telecominfraproject.atlassian.net/browse/WIFI-9977
2022-06-29 18:31:24 -07:00
stephb9959
040397aa8e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 17:20:56 -07:00
stephb9959
bba92aa9b8 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 17:20:14 -07:00
stephb9959
c332a3946d https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 17:19:12 -07:00
stephb9959
02e677f849 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 17:07:07 -07:00
stephb9959
a26f7c03c1 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 17:05:43 -07:00
stephb9959
9181ae01cc https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 17:00:23 -07:00
stephb9959
7825b00d2e https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 16:50:51 -07:00
stephb9959
8b895c2088 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 16:30:39 -07:00
stephb9959
49d39d37a1 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 16:23:06 -07:00
stephb9959
406d59d5d7 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 15:55:21 -07:00
stephb9959
186d12c78a https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 15:49:36 -07:00
stephb9959
421c24c961 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 15:16:49 -07:00
stephb9959
e00c835680 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 15:12:54 -07:00
stephb9959
3f972ebb4a https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 14:55:58 -07:00
stephb9959
cf8d29e66f https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 14:45:13 -07:00
stephb9959
d5e11d246a https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 12:29:01 -07:00
stephb9959
6ac29199e0 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 11:53:14 -07:00
stephb9959
2f9452d6ef https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 11:10:24 -07:00
stephb9959
caed454e1a https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 11:05:50 -07:00
stephb9959
30916cbed1 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 10:54:35 -07:00
stephb9959
81899788a9 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 10:23:53 -07:00
stephb9959
e1590cbe90 https://telecominfraproject.atlassian.net/browse/WIFI-9977
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 10:22:30 -07:00
stephb9959
bcbc212436 https://telecominfraproject.atlassian.net/browse/WIFI-9976
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 10:09:02 -07:00
stephb9959
520671684b https://telecominfraproject.atlassian.net/browse/WIFI-9976
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 10:04:48 -07:00
Stephane Bourque
eacf9c0450 Merge pull request #102 from Telecominfraproject/WiFi-9620-CoA
https://telecominfraproject.atlassian.net/browse/WIFI-9952
2022-06-29 09:41:30 -07:00
stephb9959
bef4c3ed5c https://telecominfraproject.atlassian.net/browse/WIFI-9952
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-29 09:14:57 -07:00
stephb9959
4fe6254bf2 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 09:45:18 -07:00
stephb9959
63ba3d633d https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 08:28:48 -07:00
stephb9959
1255cf0a56 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 08:09:00 -07:00
stephb9959
7a6f2a517c https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 07:57:29 -07:00
stephb9959
6c15908ed6 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 07:49:31 -07:00
stephb9959
d0a7670fff https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 07:40:06 -07:00
stephb9959
17d6253cfe https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 07:28:42 -07:00
stephb9959
ab592305ce https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 07:11:34 -07:00
stephb9959
0da527e1d7 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 07:06:16 -07:00
stephb9959
d3848a6f8b https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 06:54:51 -07:00
stephb9959
c522c22d31 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 06:48:20 -07:00
stephb9959
783886662f https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 06:44:19 -07:00
stephb9959
56ab9b1409 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-28 06:29:20 -07:00
stephb9959
67e86a0edf https://telecominfraproject.atlassian.net/browse/WIFI-9952
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 20:30:44 -07:00
stephb9959
70c12a5b77 https://telecominfraproject.atlassian.net/browse/WIFI-9952
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 17:24:48 -07:00
stephb9959
03f2e2d457 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 14:20:41 -07:00
stephb9959
ed12331d20 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 14:13:38 -07:00
stephb9959
ec0c295c7c https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 14:10:53 -07:00
stephb9959
2438bd7ca7 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 14:09:08 -07:00
stephb9959
18d18f68c5 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 13:58:11 -07:00
stephb9959
120f94a95a https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 13:51:16 -07:00
stephb9959
7b9cda8c3d https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 13:42:59 -07:00
stephb9959
0d116119ed https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 09:27:28 -07:00
stephb9959
b9a7f53a92 https://telecominfraproject.atlassian.net/browse/WIFI-9959
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-27 08:23:33 -07:00
Johann Hoffmann
459029d5d7 Always re-generate config file if TEMPLATE_CONFIG is set to true
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-06-24 18:17:05 +02:00
stephb9959
bfe0ff4481 https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-24 08:00:47 -07:00
stephb9959
b70a95d12b https://telecominfraproject.atlassian.net/browse/WIFI-9620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-24 07:51:23 -07:00
Stephane Bourque
8280ff46db Update PROTOCOL.md
Fixing protocol properties file entries.

Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-24 07:46:06 -07:00
Stephane Bourque
59da808bcd Update PROTOCOL.md
Fixed some formatting.

Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-24 07:36:19 -07:00
Stephane Bourque
840c22e0d1 Merge pull request #98 from Telecominfraproject/WIFI-9620
Wifi 9620
2022-06-23 11:02:37 -07:00
stephb9959
996e410fde Fix: https://telecominfraproject.atlassian.net/browse/WIFI-9537
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-23 11:01:01 -07:00
stephb9959
521dcc2eed Removal of extraneous logging and debug statements.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-23 09:42:19 -07:00
stephb9959
4d73467b8a New RADIUS routing algorithm
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-23 09:03:30 -07:00
stephb9959
515444d223 New RADIUS routing algorithm
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-23 09:02:28 -07:00
stephb9959
dccda306d4 New RADIUS routing algorithm
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-23 09:00:25 -07:00
stephb9959
3fd5c59994 Updating radius configuration file template
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 23:03:03 -07:00
stephb9959
87fee4ecd2 Updating radius configuration file template
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 22:25:55 -07:00
stephb9959
b37e7d4c5d Updating radius configuration file template
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 22:13:25 -07:00
stephb9959
f8c21f0c68 Fixing: https://telecominfraproject.atlassian.net/browse/WIFI-9537
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 22:02:52 -07:00
stephb9959
f74c098b99 Fixing: https://telecominfraproject.atlassian.net/browse/WIFI-9537
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 22:00:01 -07:00
stephb9959
1619cec197 Fixing: https://telecominfraproject.atlassian.net/browse/WIFI-9537
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 21:49:10 -07:00
stephb9959
62211b6e8b Adding deviceping command to CLI.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 21:36:20 -07:00
stephb9959
1bebe0729a Improving Radius router.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 12:03:43 -07:00
stephb9959
6a8a6aa851 Fixing compile warning.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 11:54:47 -07:00
stephb9959
4b6880a306 Fixing https://telecominfraproject.atlassian.net/browse/WIFI-9537
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-22 11:52:50 -07:00
stephb9959
3d252116dd Changing b64 libs
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-21 10:52:50 -07:00
stephb9959
2fc5e69145 Removing DST parameter
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-21 10:33:49 -07:00
stephb9959
8d2e85d0ee Removing DST parameter
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-21 10:18:32 -07:00
stephb9959
d1efdc93a4 Removing DST parameter
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-21 10:10:19 -07:00
stephb9959
c27627302f Fixing Base64 encoding
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-21 09:21:57 -07:00
stephb9959
ae18fead11 Adding temporary routing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-20 23:17:39 -07:00
stephb9959
75a6300ffb Move to proper TIP RADIUS dictionary
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>

Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-20 10:20:27 -07:00
stephb9959
f84a4c83d0 Fixing RADIUS packet decoding offset
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-18 22:37:43 -07:00
Johann Hoffmann
d5c8cb5837 [WIFI-9534] Add condition to avoid deleting default and release branch images
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-06-17 13:49:54 +02:00
stephb9959
a09f2ec7bd Troubleshooting failed Radius parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-16 14:08:28 -07:00
stephb9959
7af9be5845 Troubleshooting failed Radius parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-16 11:08:47 -07:00
stephb9959
bc6e7d538b Fix: failure to send CoA response to CoA server
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-16 09:16:37 -07:00
stephb9959
59ed9df3c9 Bad serialnumber RADIUS packet filtering.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-16 09:02:57 -07:00
stephb9959
0f46a6ded0 Runt RADIUS packet filtering.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-16 08:59:01 -07:00
stephb9959
ef09214187 Wrong CoA socket address
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-16 08:52:29 -07:00
stephb9959
aa4631b55d Adding radius config secret in config processing, for living lab and cli commands.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-15 23:36:05 -07:00
stephb9959
08b59e04ee Adding radius config sampel for living lab and cli commands.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-15 16:44:21 -07:00
stephb9959
3455297cd6 Adding radius config sampel for living lab and cli commands.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-15 16:44:08 -07:00
stephb9959
350ccd5371 Fixing strategy parsing
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-15 15:57:50 -07:00
stephb9959
b89c0773c5 Merge remote-tracking branch 'origin/WIFI-9620' into WIFI-9620 2022-06-15 15:35:56 -07:00
stephb9959
d03cd6a6df Initial Work
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-15 15:35:22 -07:00
stephb9959
142a04ffc3 Initial Work
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-15 15:03:45 -07:00
stephb9959
2b8e496bbc Merge remote-tracking branch 'origin/master' 2022-06-15 07:29:29 -07:00
stephb9959
776a781a87 README.md typos and clarifications.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-15 07:29:21 -07:00
Johann Hoffmann
f5d66365b8 Temporarily disable cleanup for merges into release branches
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-06-15 14:49:30 +02:00
stephb9959
fd8b021225 Merge remote-tracking branch 'origin/master' 2022-06-08 09:54:17 -07:00
stephb9959
1d2b54b6cf Adding IE parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-08 09:54:09 -07:00
Dmitry Dunaev
b073246293 Merge pull request #94 from Telecominfraproject/fix/wifi-9174--dep-charts
[WIFI-9174] Fix: switch from deprecated bitnami charts to mirrored ones
2022-06-03 15:42:24 +03:00
Dmitry Dunaev
8205cb7336 [WIFI-9174] Fix: switch from deprecated bitnami charts to mirrored ones
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-06-03 15:40:09 +03:00
stephb9959
9339ae893a Adding IE parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 23:15:26 -07:00
stephb9959
ce483ba51c Adding IE parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 21:59:03 -07:00
stephb9959
85a7de67fb Adding IE parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 21:44:26 -07:00
stephb9959
abdabe7da3 Adding IE parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 21:10:13 -07:00
stephb9959
669af7640c Initial commit.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 15:49:10 -07:00
stephb9959
83c46c44aa Initial commit.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 15:39:04 -07:00
stephb9959
7b2ba4fed4 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 14:04:10 -07:00
stephb9959
ef5aa26991 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 12:28:20 -07:00
stephb9959
92b25846d2 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 12:24:37 -07:00
stephb9959
77663f9184 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 12:23:48 -07:00
stephb9959
61c7ab3267 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 11:48:41 -07:00
stephb9959
8ae0006343 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 10:54:50 -07:00
stephb9959
64a1fa1c85 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 10:49:34 -07:00
stephb9959
2b9c90d5e6 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 10:11:15 -07:00
stephb9959
565cee2373 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 10:06:52 -07:00
stephb9959
36c5c9c5b6 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 10:02:23 -07:00
stephb9959
837c3d5570 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 09:59:27 -07:00
stephb9959
2a71721548 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 09:50:59 -07:00
stephb9959
055bdcf937 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-02 09:36:27 -07:00
stephb9959
221ee05298 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 23:51:57 -07:00
stephb9959
afb8252dc2 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 23:51:07 -07:00
stephb9959
77f86d139f Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 23:39:52 -07:00
stephb9959
b2353b6a0e Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 23:39:10 -07:00
stephb9959
bf4b9b0d63 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 23:33:09 -07:00
stephb9959
e51236f0ca Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 23:30:31 -07:00
stephb9959
5be8ad75ed Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 23:04:09 -07:00
stephb9959
054e3e1591 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 11:43:02 -07:00
stephb9959
06366f875c Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 11:21:59 -07:00
stephb9959
64d3f8c3ee Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 10:25:19 -07:00
stephb9959
8878445e03 Adding more IEs parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 10:00:23 -07:00
stephb9959
ea30684f0c Framework update.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 08:43:39 -07:00
stephb9959
ebf08a63f1 Framework update.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-01 08:31:05 -07:00
stephb9959
e9e7db9ac0 Framework update.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-31 23:55:15 -07:00
stephb9959
7f9d03ed34 Framework update.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-31 14:00:24 -07:00
stephb9959
084483b028 Framework update.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-31 12:33:16 -07:00
stephb9959
285dbacd12 Changes for script command for devices: remove UCI and added TIMEOUT.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-29 09:19:19 -07:00
stephb9959
8f79d70753 Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 23:16:26 -07:00
stephb9959
6d20481d64 Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 23:06:44 -07:00
stephb9959
7da4bbba61 Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 22:34:34 -07:00
stephb9959
ff955d8b2f Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 22:33:48 -07:00
stephb9959
29d615393f Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 22:21:05 -07:00
stephb9959
2a716e6c66 Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 22:16:21 -07:00
stephb9959
b662dcf88c Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 22:05:28 -07:00
stephb9959
253ffbf111 Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 22:03:33 -07:00
stephb9959
dfd689512b Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 22:00:07 -07:00
stephb9959
cee2705bf8 Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 21:12:07 -07:00
stephb9959
af1e293bde Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 21:02:13 -07:00
stephb9959
58266eb239 Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 20:57:05 -07:00
stephb9959
87dc357c9f Adding WifiScan Parsing WLAN_EID_SUPPORTED_REGULATORY_CLASSES
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 20:54:02 -07:00
stephb9959
02798de88a Adding WifiScan Parsing ERP Info
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 20:35:11 -07:00
stephb9959
d7bd812f97 Adding WifiScan Parsing ERP Info
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 20:25:23 -07:00
stephb9959
b692a7868e Fixing wifiscan country parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 20:06:38 -07:00
stephb9959
f57dfc62c0 Fixing wifiscan country parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 19:58:41 -07:00
stephb9959
21794d669e Fixing wifiscan country parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 16:28:48 -07:00
stephb9959
2139093a73 Fixing wifiscan country parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 16:27:08 -07:00
stephb9959
bc1f0670fb Fixing wifiscan country parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 16:21:02 -07:00
stephb9959
a0b0a169fa Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/framework/ConfigurationValidator.cpp
2022-05-27 16:20:07 -07:00
stephb9959
7feb9f3655 Fixing wifiscan country parsing.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 16:18:43 -07:00
stephb9959
3878d8abe6 Adding latest data model.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 07:39:59 -07:00
stephb9959
770b5969f8 Adding latest data model.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 07:36:57 -07:00
stephb9959
00bca216fc Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/framework/ConfigurationValidator.cpp
2022-05-27 07:32:34 -07:00
Stephane Bourque
64eb7748d1 Adding latest data model.
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-05-27 07:31:52 -07:00
stephb9959
d6434666b4 Adding latest data model. 2022-05-26 22:27:24 -07:00
stephb9959
747c84de4a Adding latest data model. 2022-05-26 22:23:34 -07:00
stephb9959
538bdb25b1 Adding latest data model. 2022-05-26 22:12:44 -07:00
stephb9959
07229e7e1f Adding latest data model. 2022-05-26 10:30:30 -07:00
stephb9959
a63a1785e2 Adding latest data model. 2022-05-26 09:21:17 -07:00
stephb9959
14820bd9c8 Adding latest data model. 2022-05-26 09:18:41 -07:00
stephb9959
aeeb333c62 Adding latest data model. 2022-05-26 09:13:33 -07:00
stephb9959
caa8f8c5a5 Adding latest data model. 2022-05-26 08:30:27 -07:00
stephb9959
02aada469b Adding ies request during WifiScan 2022-05-26 07:41:44 -07:00
stephb9959
020f9aea16 Adding ies request during WifiScan 2022-05-26 07:36:52 -07:00
stephb9959
a8d5717fd5 Adding ies request during WifiScan 2022-05-26 07:36:09 -07:00
stephb9959
51dd030419 Adding ies request during WifiScan 2022-05-26 07:11:07 -07:00
stephb9959
6a83895efc Adding ies request during WifiScan 2022-05-25 23:57:09 -07:00
stephb9959
c5e2574ab1 Adding ies request during WifiScan 2022-05-25 23:50:25 -07:00
stephb9959
5a1828eaea Adding ies request during WifiScan 2022-05-25 23:45:47 -07:00
stephb9959
c62f5a16f5 Adding ies request during WifiScan 2022-05-25 23:35:14 -07:00
stephb9959
b6e778ada3 Adding ies request during WifiScan 2022-05-25 23:26:42 -07:00
stephb9959
1b34ec8a78 Adding ies request during WifiScan 2022-05-25 22:43:02 -07:00
stephb9959
57eb7312c8 Adding ies request during WifiScan 2022-05-25 22:38:55 -07:00
stephb9959
368cdb72d4 Adding ies request during WifiScan 2022-05-25 22:36:30 -07:00
stephb9959
712d326560 Adding ies request during WifiScan 2022-05-25 22:33:49 -07:00
stephb9959
11df029ec0 Adding ies request during WifiScan 2022-05-25 22:32:13 -07:00
stephb9959
020542b751 Adding ies request during WifiScan 2022-05-25 22:28:14 -07:00
stephb9959
4b19163091 Adding ies request during WifiScan 2022-05-25 22:24:54 -07:00
stephb9959
852ae3fde7 Adding ies request during WifiScan 2022-05-25 22:22:30 -07:00
stephb9959
1ab9729ec1 Adding ies request during WifiScan 2022-05-25 22:17:55 -07:00
stephb9959
9b1711fff6 Adding ies request during WifiScan 2022-05-25 22:11:23 -07:00
stephb9959
929bc79136 Adding ies request during WifiScan 2022-05-25 22:05:00 -07:00
stephb9959
e8fec5075f Adding ies request during WifiScan 2022-05-25 21:59:44 -07:00
stephb9959
0bae840106 Adding ies request during WifiScan 2022-05-25 21:52:02 -07:00
stephb9959
bf519637aa Adding ies request during WifiScan 2022-05-25 21:47:24 -07:00
stephb9959
b15dc2b517 Adding ies request during WifiScan 2022-05-25 21:41:58 -07:00
stephb9959
44f2843a7f Adding ies request during WifiScan 2022-05-25 21:05:40 -07:00
stephb9959
e2eda25764 Adding ies request during WifiScan 2022-05-25 10:48:36 -07:00
stephb9959
b2411d97d6 Adding ies request during WifiScan 2022-05-25 10:46:20 -07:00
stephb9959
4a61f57912 Adding ies request during WifiScan 2022-05-25 10:38:27 -07:00
stephb9959
1cafe0b6fc Adding ies request during WifiScan 2022-05-25 10:27:33 -07:00
stephb9959
20763dedf6 Adding ies request during WifiScan 2022-05-25 10:15:23 -07:00
stephb9959
80c0a3c07e Adding ies request during WifiScan 2022-05-25 10:01:41 -07:00
stephb9959
0138cfdede Adding ies request during WifiScan 2022-05-25 09:56:26 -07:00
stephb9959
066bad7953 Adding ies request during WifiScan 2022-05-25 09:51:51 -07:00
stephb9959
2ca1508be1 Adding ies request during WifiScan 2022-05-25 09:45:28 -07:00
stephb9959
737e49a376 Adding ies request during WifiScan 2022-05-25 09:23:01 -07:00
stephb9959
251a4c2310 Adding ies request during WifiScan 2022-05-24 11:37:33 -07:00
stephb9959
4e4ad418b6 Merge remote-tracking branch 'origin/master' 2022-05-24 11:30:29 -07:00
stephb9959
b07c381bf7 Adding ies request during WifiScan 2022-05-24 11:30:21 -07:00
Dmitry Dunaev
6134c37d2b [WIFI-7555] Fix: helm path
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-05-23 15:09:38 +03:00
Johann Hoffmann
5e42202264 Enable CI for pull requests in release branches
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-05-23 13:13:39 +02:00
stephb9959
2f389599f8 Radius Proxy Configuration and routing. 2022-05-22 22:23:31 -07:00
stephb9959
36b633fcb7 Radius Proxy 2022-05-20 10:20:09 -07:00
stephb9959
5a1d56399c Fixed the memory reporting in the dashboard. 2022-05-19 22:59:02 -07:00
stephb9959
8ebb92b95a Adding ability to list devices ordered by field names. 2022-05-19 22:45:29 -07:00
stephb9959
69716f50c0 Framework update. 2022-05-19 16:10:53 -07:00
stephb9959
580e4ce052 Fixing Radius Proxy Processing. 2022-05-19 00:41:23 -07:00
stephb9959
ab663be084 Fixing Radius Proxy Processing. 2022-05-18 21:45:09 -07:00
stephb9959
d5350b4283 Adding RadiusProxy processing. 2022-05-18 21:42:48 -07:00
stephb9959
873d77adf0 Adding RadiusProxy processing. 2022-05-18 21:35:11 -07:00
stephb9959
530555ff26 Adding RadiusProxy processing. 2022-05-18 15:55:50 -07:00
stephb9959
3db8892e58 Adding RadiusProxy processing. 2022-05-18 10:23:34 -07:00
stephb9959
c1ba58be6e Adding RadiusProxy processing. 2022-05-18 10:20:56 -07:00
stephb9959
0750be2d81 Adding RadiusProxy processing. 2022-05-18 10:06:59 -07:00
stephb9959
adec21906f Adding RadiusProxy processing. 2022-05-18 10:04:11 -07:00
stephb9959
80b5c6f3b5 Merge remote-tracking branch 'origin/master' 2022-05-18 09:25:30 -07:00
stephb9959
e29a7589f2 Adding RadiusProxy processing. 2022-05-18 09:24:37 -07:00
Dmitry Dunaev
8255ff3218 Merge pull request #92 from Telecominfraproject/feature/wifi-7873--iploc-support
[WIFI-7873] Add: support for ipinfo
2022-05-18 15:35:53 +03:00
Dmitry Dunaev
5b70cdfe53 [WIFI-7873] Add: support for ipinfo
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-05-18 15:35:20 +03:00
stephb9959
2e94733c8d Framework update. 2022-05-17 12:48:02 -07:00
stephb9959
3d62625cf6 Framework update. 2022-05-17 12:34:22 -07:00
stephb9959
eb0eae90b6 Hardening Kafka errors in producer when there is a kafka disconnection. 2022-05-17 12:15:18 -07:00
stephb9959
d7dc43f0de Adding command to run script. 2022-05-15 13:44:19 -07:00
stephb9959
3c6ec00695 Adding command to run script. 2022-05-13 10:09:43 -07:00
stephb9959
eb705dfeb1 Framework update. 2022-05-12 23:18:57 -07:00
stephb9959
46bd78ba15 Framework update. 2022-05-12 23:09:28 -07:00
stephb9959
e730c60ebc Only allowing root users to run scripts. 2022-05-12 12:14:14 -07:00
stephb9959
3329781bc2 Fixing: https://telecominfraproject.atlassian.net/browse/WIFI-7909 2022-05-12 12:08:52 -07:00
stephb9959
dfcc59a7b8 Fixing: https://telecominfraproject.atlassian.net/browse/WIFI-7909 2022-05-12 12:08:18 -07:00
Stephane Bourque
b72fb379cd Merge pull request #90 from Telecominfraproject/feature/WIFI-7714
test_scripts/curl: add option to stream telemetry data to Kafka
2022-05-12 12:01:26 -07:00
stephb9959
74db8cd36d Fixing: https://telecominfraproject.atlassian.net/browse/WIFI-7909 2022-05-12 11:55:43 -07:00
stephb9959
1219a70da2 Fixing: https://telecominfraproject.atlassian.net/browse/WIFI-7909 2022-05-12 11:54:40 -07:00
stephb9959
dc95a8632a Adding new script command. 2022-05-12 08:50:22 -07:00
Stephane Bourque
8b0ecb464b Remove DEBUG/Add Script
Adding scripting definition to the protocol.
2022-05-11 10:08:03 -07:00
stephb9959
9f863c1cc2 Fixes for https://telecominfraproject.atlassian.net/browse/WIFI-7851 2022-05-11 08:22:10 -07:00
stephb9959
fda6f8b2d9 Fixes for https://telecominfraproject.atlassian.net/browse/WIFI-7851 2022-05-11 08:19:19 -07:00
stephb9959
9703ed035a RTTY troubleshooting. 2022-05-11 08:17:17 -07:00
stephb9959
4117ed927a RTTY troubleshooting. 2022-05-11 08:12:30 -07:00
stephb9959
8980eaa5ba RTTY troubleshooting. 2022-05-11 08:10:11 -07:00
stephb9959
d3d1ccee81 RTTY troubleshooting. 2022-05-11 07:42:00 -07:00
stephb9959
4a0aaa8f6b RTTY troubleshooting. 2022-05-11 07:26:04 -07:00
stephb9959
85e84e0672 RTTY troubleshooting. 2022-05-11 07:23:20 -07:00
stephb9959
7d63852d94 RTTY troubleshooting. 2022-05-11 07:17:34 -07:00
stephb9959
698a2b2fcb RTTY troubleshooting. 2022-05-11 07:04:15 -07:00
stephb9959
62e1c6eb0f RTTY troubleshooting. 2022-05-11 06:59:08 -07:00
stephb9959
1a8fa724d6 RTTY troubleshooting. 2022-05-11 06:54:02 -07:00
stephb9959
b4088519cf RTTY troubleshooting. 2022-05-11 06:45:44 -07:00
Stijn Tintel
58ce304e53 test_scripts/curl: add option to stream telemetry data to Kafka
Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
2022-05-11 13:57:20 +03:00
stephb9959
9fbc77a85a RTTY troubleshooting. 2022-05-10 23:15:59 -07:00
stephb9959
623c4c43d4 RTTY troubleshooting. 2022-05-10 22:47:39 -07:00
stephb9959
63ea97b435 RTTY troubleshooting. 2022-05-10 22:34:42 -07:00
stephb9959
d9f3d92736 RTTY troubleshooting. 2022-05-10 22:20:39 -07:00
stephb9959
7fc2239e59 RTTY troubleshooting. 2022-05-10 21:36:44 -07:00
stephb9959
badfe61d6a RTTY troubleshooting. 2022-05-10 21:16:30 -07:00
stephb9959
ab57221040 RTTY troubleshooting. 2022-05-10 21:06:18 -07:00
stephb9959
5ae62b8892 RTTY troubleshooting. 2022-05-10 20:43:54 -07:00
stephb9959
c5425fc9cf RTTY troubleshooting. 2022-05-10 20:16:26 -07:00
stephb9959
dbdc14891c RTTY troubleshooting. 2022-05-10 20:11:08 -07:00
stephb9959
f4b4627c78 RTTY troubleshooting. 2022-05-10 20:10:40 -07:00
stephb9959
35dbe47571 RTTY troubleshooting. 2022-05-10 20:00:25 -07:00
stephb9959
a97337234e RTTY troubleshooting. 2022-05-10 19:54:05 -07:00
stephb9959
a87b8de6e3 RTTY troubleshooting. 2022-05-10 19:52:56 -07:00
stephb9959
949d7a54ad RTTY troubleshooting. 2022-05-10 19:46:56 -07:00
stephb9959
5a3c97a529 RTTY troubleshooting. 2022-05-10 19:32:16 -07:00
stephb9959
0772898160 RTTY troubleshooting. 2022-05-10 19:25:41 -07:00
stephb9959
638ed3f5c8 RTTY troubleshooting. 2022-05-10 19:04:43 -07:00
stephb9959
d996e9e05e RTTY troubleshooting. 2022-05-10 18:43:59 -07:00
stephb9959
58fd622980 RTTY troubleshooting. 2022-05-10 16:20:32 -07:00
stephb9959
29113ac39c RTTY troubleshooting. 2022-05-10 16:08:15 -07:00
stephb9959
f947f472b9 RTTY troubleshooting. 2022-05-10 16:06:02 -07:00
stephb9959
393763fb9e RTTY troubleshooting. 2022-05-10 15:46:50 -07:00
stephb9959
eced94910d RTTY troubleshooting. 2022-05-10 15:36:59 -07:00
stephb9959
df000f35ee RTTY troubleshooting. 2022-05-10 11:03:10 -07:00
stephb9959
24d2de568f RTTY troubleshooting. 2022-05-10 10:53:57 -07:00
stephb9959
8508396ae6 RTTY troubleshooting. 2022-05-10 10:31:13 -07:00
stephb9959
9f6d38e6b7 RTTY troubleshooting. 2022-05-10 10:20:00 -07:00
stephb9959
b8f3b9b37a Framework update. 2022-05-10 08:56:19 -07:00
stephb9959
71cdcb5909 Framework update. 2022-05-10 07:46:23 -07:00
stephb9959
e92e852dcb Merge remote-tracking branch 'origin/master' 2022-05-10 07:45:54 -07:00
stephb9959
0ac5b3a39d Adding "Content-Type: application/json" to commands for https://telecominfraproject.atlassian.net/browse/WIFI-7867 2022-05-10 07:45:45 -07:00
Johann Hoffmann
3fbf460f81 Wait for AP to connect until timeout
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-05-10 10:50:24 +02:00
stephb9959
9b7db5c095 Framework Update. 2022-05-09 10:29:22 -07:00
stephb9959
eb9e88b54a Framework Update. 2022-05-09 09:58:49 -07:00
stephb9959
952b1c4562 Adding DEBUG for device. 2022-05-08 09:52:05 -07:00
stephb9959
cec50beecf Framework update. 2022-05-08 08:49:18 -07:00
stephb9959
2048107866 Error Framework migration. 2022-05-07 21:58:43 -07:00
stephb9959
2d72a15ec0 Error Framework migration. 2022-05-06 23:11:07 -07:00
stephb9959
d5c36aa2e9 Error Framework migration. 2022-05-06 23:10:40 -07:00
stephb9959
41079d9f0b Adding Notification. 2022-05-06 10:27:09 -07:00
stephb9959
a47977b029 Framework update. 2022-05-05 21:28:52 -07:00
stephb9959
e20b71181f Framework update. 2022-05-05 21:19:11 -07:00
stephb9959
4f29e5a650 WebSocket Notification Framework update 2022-05-05 20:48:16 -07:00
stephb9959
e168c7b2c7 WebSocket Notification Framework update 2022-05-05 20:28:56 -07:00
stephb9959
1f6de95f16 WebSocket Notification Framework update 2022-05-05 20:26:08 -07:00
stephb9959
96995730c6 Proper Reactor Pool sizing. 2022-05-05 19:39:51 -07:00
stephb9959
9d000ca84d Proper Reactor Pool sizing. 2022-05-05 16:52:28 -07:00
stephb9959
9af6deaec3 Proper Reactor Pool sizing. 2022-05-05 16:08:38 -07:00
stephb9959
aaa13e1e2f Proper Reactor Pool sizing. 2022-05-05 15:26:11 -07:00
stephb9959
bd0419fb0c Proper Reactor Pool sizing. 2022-05-05 15:18:13 -07:00
stephb9959
656efd0d57 Proper Reactor Pool sizing. 2022-05-05 15:11:01 -07:00
stephb9959
863ff017b0 Increasing timeout for WifiScan. 2022-05-05 09:28:40 -07:00
stephb9959
8c26cc37d7 Increasing timeout for WifiScan. 2022-05-05 07:49:50 -07:00
stephb9959
4e9c26cd04 Cleaning up extra logging. 2022-05-04 23:51:31 -07:00
stephb9959
d098bca86f Cleaning up extra logging. 2022-05-04 23:38:00 -07:00
stephb9959
9980c2b175 Cleaning up extra logging. 2022-05-04 23:32:57 -07:00
stephb9959
a52daae4a5 Cleaning up extra logging. 2022-05-04 23:27:00 -07:00
stephb9959
1d8af05302 Cleaning up extra logging. 2022-05-04 23:06:22 -07:00
stephb9959
2efccedfba Fixing trace logging. 2022-05-04 22:57:46 -07:00
stephb9959
243b615814 Fixing OUI Caching issue. 2022-05-04 22:33:38 -07:00
stephb9959
dc37bcb5ff Fixing OUI Caching issue. 2022-05-04 22:19:35 -07:00
stephb9959
edac1d6ceb Fixing OUI Caching issue. 2022-05-04 22:11:19 -07:00
stephb9959
64848d8fdd Fixing OUI Caching issue. 2022-05-04 22:01:41 -07:00
stephb9959
c874b7633d Removing unused ReactorPool 2022-05-04 21:54:46 -07:00
stephb9959
2ca85970e4 Removing unused ReactorPool 2022-05-04 21:49:05 -07:00
stephb9959
0184aa8879 Removing unused ReactorPool 2022-05-04 21:35:56 -07:00
stephb9959
ac05fe833e Removing unused ReactorPool 2022-05-04 21:31:17 -07:00
stephb9959
998a686179 Removing unused ReactorPool 2022-05-04 21:27:04 -07:00
stephb9959
288b5e207f Trace queue ageing fix. 2022-05-04 18:32:56 -07:00
stephb9959
2ec0c923c3 Trace queue ageing fix. 2022-05-04 18:06:58 -07:00
stephb9959
4c9dd0cef7 Trace queue ageing fix. 2022-05-04 14:39:15 -07:00
stephb9959
8f16abd4ff Trace fixed. 2022-05-04 14:26:51 -07:00
stephb9959
c706ea4118 Trace fixed. 2022-05-04 12:24:16 -07:00
stephb9959
9c2fef1ee4 Trace fixed. 2022-05-04 12:07:49 -07:00
stephb9959
1648acca32 Trace fixed. 2022-05-04 11:59:16 -07:00
stephb9959
c11c0281ce Trace Upload failure. 2022-05-04 11:52:23 -07:00
stephb9959
58ee7344bf Trace Upload failure. 2022-05-04 11:47:59 -07:00
stephb9959
6c9dac79d5 Trace Upload failure. 2022-05-04 11:34:04 -07:00
stephb9959
7aa284e92c Trace Upload failure. 2022-05-04 11:29:43 -07:00
stephb9959
933b41e7c1 Trace Upload failure. 2022-05-04 11:17:54 -07:00
stephb9959
a39e586bc1 Trace Upload failure. 2022-05-04 11:11:51 -07:00
stephb9959
4e81683bcd Trace Upload failure. 2022-05-04 11:05:22 -07:00
stephb9959
6a74297cb3 Trace Upload failure. 2022-05-04 11:01:12 -07:00
stephb9959
67764ec5c1 Trace Upload failure. 2022-05-04 10:55:57 -07:00
stephb9959
ebbcd99453 Trace Upload failure. 2022-05-04 10:52:00 -07:00
stephb9959
3719df39fe Trace Upload failure. 2022-05-04 10:37:02 -07:00
stephb9959
70670117a7 Trace Upload failure. 2022-05-04 10:10:56 -07:00
stephb9959
31f77b84d6 Trace Upload failure. 2022-05-04 09:53:51 -07:00
stephb9959
924e2f0775 Trace Upload failure. 2022-05-04 09:50:37 -07:00
stephb9959
cb61ce3f9e Trace Upload failure. 2022-05-04 09:49:49 -07:00
stephb9959
d97033d6cf Trace Upload failure. 2022-05-04 09:48:56 -07:00
stephb9959
c2f547da0c Trace Upload failure. 2022-05-04 09:35:07 -07:00
stephb9959
7cc60e6063 Trace Upload failure. 2022-05-04 09:19:42 -07:00
stephb9959
4f117199f0 Merge remote-tracking branch 'origin/master' 2022-05-04 09:05:05 -07:00
stephb9959
0d444c4bc9 Trace Upload failure. 2022-05-04 09:04:57 -07:00
Johann Hoffmann
87646944dd Support older releases in test_service CLI command
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-05-04 17:24:33 +02:00
stephb9959
13c9633964 Trace Upload failure. 2022-05-04 08:19:36 -07:00
stephb9959
ab77f1371d Merge remote-tracking branch 'origin/master' 2022-05-04 07:55:24 -07:00
stephb9959
4ac71c4af2 Trace Upload failure. 2022-05-04 07:54:52 -07:00
Johann Hoffmann
1ca1fffa26 Add FLAGS variable in curl request
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-05-04 11:34:45 +02:00
stephb9959
4e623ab182 Trace Upload failure. 2022-05-03 23:44:09 -07:00
stephb9959
fb27ea8528 Trace Upload failure. 2022-05-03 23:30:52 -07:00
stephb9959
bc20d66694 Adding proper loggin to RTTYS 2022-05-03 23:15:25 -07:00
stephb9959
beadcd50e7 Adding proper loggin to RTTYS 2022-05-03 23:05:32 -07:00
stephb9959
5d1c9b10da Adding proper loggin to RTTYS 2022-05-03 22:58:38 -07:00
stephb9959
7e877b74a7 Adding proper loggin to RTTYS 2022-05-03 22:49:41 -07:00
stephb9959
47b569aa59 Adding proper loggin to RTTYS 2022-05-03 22:45:06 -07:00
stephb9959
2afa4b64e8 Adding proper loggin to RTTYS 2022-05-03 22:35:13 -07:00
stephb9959
315bad5451 Adding proper loggin to RTTYS 2022-05-03 22:18:02 -07:00
stephb9959
c8fa1d5405 Adding proper loggin to RTTYS 2022-05-03 22:07:52 -07:00
stephb9959
40a28015bd Adding proper loggin to RTTYS 2022-05-03 22:07:00 -07:00
stephb9959
4a25b0ba99 Adding proper loggin to RTTYS 2022-05-03 21:29:33 -07:00
stephb9959
9ea7ab14df Adding proper loggin to RTTYS 2022-05-03 21:25:39 -07:00
stephb9959
aa692d9f30 Adding proper loggin to RTTYS 2022-05-03 20:56:15 -07:00
stephb9959
044d978c46 Fixing CORS issues in RTTY WebService 2022-05-03 20:05:08 -07:00
stephb9959
b767dd3aa4 Fixing CORS issues in RTTY WebService 2022-05-03 19:55:57 -07:00
stephb9959
9acbd6cef6 Framework update 2022-05-03 19:22:42 -07:00
stephb9959
a20ec0587e Framework update 2022-05-03 18:57:03 -07:00
stephb9959
28b72a6303 Framework update 2022-05-03 18:02:46 -07:00
stephb9959
9540fc9a5f Fixing command manager 2022-05-03 17:24:58 -07:00
stephb9959
18eac29b1a Fixing command manager 2022-05-03 17:09:58 -07:00
stephb9959
76b2255716 Framework Update 2022-05-03 08:38:32 -07:00
stephb9959
17377aa8bc Fix missing dates for notes on device. 2022-05-03 07:35:39 -07:00
stephb9959
d1a50fcf22 Fixing RTTYs failure to detect bad socket. 2022-05-02 23:37:08 -07:00
stephb9959
cccd8f8fbd Fixing RTTYs failure to detect bad socket. 2022-05-02 22:42:37 -07:00
stephb9959
9c37d0760d Fixing RTTYs failure to detect bad socket. 2022-05-02 22:08:06 -07:00
stephb9959
90d56197e6 Fixing RTTYs failure t odetect bad socket. 2022-05-02 21:55:11 -07:00
stephb9959
6b91065468 Fixing FileUploader for NoSecurityAPI(). 2022-05-02 21:48:53 -07:00
stephb9959
f851957523 Framework Update 2022-05-02 13:53:21 -07:00
stephb9959
ec0574bfdf Framework Update 2022-05-02 11:43:51 -07:00
stephb9959
6bc279ac32 Framework Update 2022-05-02 11:26:59 -07:00
stephb9959
1cdb5ef2e3 Framework Update 2022-05-02 10:37:48 -07:00
stephb9959
d85854a1f2 Fixing NoAPISecurity for RTTY Server 2022-05-01 21:17:29 -07:00
stephb9959
e0d6fb0bcc Fixing NoAPISecurity for RTTY Server 2022-05-01 11:10:47 -07:00
stephb9959
6e864c14a1 Fixing NoAPISecurity for RTTY Server 2022-05-01 10:35:24 -07:00
stephb9959
8e49ffa904 Fixing NoAPISecurity for RTTY Server 2022-04-30 22:42:14 -07:00
stephb9959
4db50c0ed2 Added firmware updated notification. 2022-04-30 22:32:09 -07:00
stephb9959
191611bc24 New web socket notifications. 2022-04-30 22:20:34 -07:00
stephb9959
d10541afb7 New web socket notifications. 2022-04-30 21:42:04 -07:00
stephb9959
1887878088 New web socket notifications. 2022-04-29 14:20:45 -07:00
stephb9959
de3985191a New web socket notifications. 2022-04-29 14:08:38 -07:00
stephb9959
629a615f7c Framework Update. 2022-04-28 14:12:48 -07:00
stephb9959
ec947df8a0 Framework Update. 2022-04-28 12:57:24 -07:00
stephb9959
203095a6f7 Framework Update. 2022-04-28 12:55:57 -07:00
stephb9959
f71ce62c5b Framework Update. 2022-04-28 12:52:34 -07:00
stephb9959
89680d6be7 Framework Update. 2022-04-28 12:50:57 -07:00
stephb9959
e411f4f6ac Framework Update. 2022-04-28 12:48:45 -07:00
stephb9959
bbcb23b821 Framework Update. 2022-04-28 12:44:22 -07:00
stephb9959
75dfd49067 Framework Update. 2022-04-28 12:41:46 -07:00
stephb9959
39d4423a5e Framework Update. 2022-04-28 12:37:19 -07:00
stephb9959
6238fee522 Framework Update. 2022-04-28 12:27:14 -07:00
stephb9959
e301ea7cee Cleaning up logging for RTTYS. 2022-04-27 21:05:41 -07:00
stephb9959
42aff04610 Cleaning up logging for RTTYS. 2022-04-27 16:04:07 -07:00
stephb9959
345053bdba Cleaning up logging for RTTYS. 2022-04-27 09:28:06 -07:00
stephb9959
285fd26f99 Improving device command queue. 2022-04-27 08:38:08 -07:00
stephb9959
49c393a02f Improving device command queue. 2022-04-25 09:56:57 -07:00
stephb9959
7242b7b34f Improving device command queue. 2022-04-25 09:49:06 -07:00
stephb9959
a2aad9d1fa Improving device command queue. 2022-04-23 23:06:32 -07:00
stephb9959
8a27698d2b Improving device command queue. 2022-04-23 23:01:43 -07:00
stephb9959
5fecaaf891 Improving device command queue. 2022-04-23 22:51:34 -07:00
stephb9959
8a651613c6 Improving device command queue. 2022-04-23 22:49:05 -07:00
stephb9959
23f6eb7417 Improving device command queue. 2022-04-23 22:40:12 -07:00
stephb9959
6d0e58cb0f Improving device command queue. 2022-04-23 22:36:30 -07:00
stephb9959
317bbcbcd8 Improving device command queue. 2022-04-23 22:19:18 -07:00
stephb9959
5f3f1cada2 Improving device command queue. 2022-04-23 22:17:06 -07:00
stephb9959
5b83e39c46 Improving device command queue. 2022-04-23 22:14:26 -07:00
stephb9959
9342b1ece2 Improving device command queue. 2022-04-23 22:07:16 -07:00
stephb9959
ba1ef56b1f Improving device command queue. 2022-04-23 22:06:35 -07:00
stephb9959
6bf1b1b9e1 Improving device command queue. 2022-04-23 21:56:46 -07:00
stephb9959
fc5e5804ff Framework update. 2022-04-23 16:50:36 -07:00
stephb9959
5188615006 Trying to fix https://telecominfraproject.atlassian.net/browse/WIFI-7564 2022-04-23 11:46:25 -07:00
stephb9959
89d62109f9 Fixing OUI file request too often 2022-04-22 22:18:16 -07:00
stephb9959
a539fecfb4 Framework update 2022-04-22 14:28:46 -07:00
stephb9959
19b213bb08 Fixing RTTYS 2022-04-21 23:12:54 -07:00
stephb9959
391d2df605 Fixing RTTYS 2022-04-21 23:08:47 -07:00
stephb9959
d7859ef6f2 Fixing RTTYS 2022-04-21 22:57:11 -07:00
stephb9959
386c9ac217 Fixing RTTYS 2022-04-21 22:46:01 -07:00
stephb9959
567bb7140a Fixing RTTYS 2022-04-21 22:45:55 -07:00
stephb9959
787a80eec3 Improving RTTYS 2022-04-21 22:23:19 -07:00
stephb9959
87a6b2ae3f Improving RTTYS 2022-04-21 22:20:11 -07:00
stephb9959
bc1969e5f6 Improving RTTYS 2022-04-21 22:18:01 -07:00
stephb9959
aa654510e9 Improving RTTYS 2022-04-21 22:07:01 -07:00
stephb9959
2591ce2752 Improving RTTYS 2022-04-21 22:02:19 -07:00
stephb9959
118f79864f Improving RTTYS 2022-04-21 21:58:49 -07:00
stephb9959
fb074e16c1 Improving RTTYS 2022-04-21 21:44:52 -07:00
stephb9959
a687ea64bd Improving RTTYS 2022-04-21 21:41:55 -07:00
stephb9959
f07c87d198 Improving RTTYS 2022-04-21 21:39:41 -07:00
stephb9959
f2ec7b08a7 Improving RTTYS 2022-04-21 21:27:45 -07:00
stephb9959
9f2e6c77a5 Improving RTTYS 2022-04-21 21:24:28 -07:00
stephb9959
544272c6f8 Improving RTTYS 2022-04-21 21:18:15 -07:00
stephb9959
db033d1045 Improving RTTYS 2022-04-21 21:04:44 -07:00
stephb9959
073909f735 Improving RTTYS 2022-04-21 20:45:52 -07:00
stephb9959
c6516e3ac7 Improving RTTYS 2022-04-21 20:42:33 -07:00
stephb9959
d695b6994e Improving RTTYS 2022-04-21 20:22:22 -07:00
stephb9959
0fe158fc3e Improving RTTYS 2022-04-21 20:17:00 -07:00
stephb9959
a66d8e8845 Improving RTTYS 2022-04-20 23:30:29 -07:00
stephb9959
fef479e241 Improving RTTYS 2022-04-20 23:24:38 -07:00
stephb9959
ef84384324 Improving RTTYS 2022-04-20 23:17:22 -07:00
stephb9959
cee1894716 Improving RTTYS 2022-04-20 23:13:31 -07:00
stephb9959
6e9cb56ce8 Improving RTTYS 2022-04-20 23:05:47 -07:00
stephb9959
7c2fc66f93 Improving RTTYS 2022-04-20 23:01:05 -07:00
stephb9959
794040f3c7 Improving RTTYS 2022-04-20 22:51:07 -07:00
stephb9959
9c0c5f1772 Improving RTTYS 2022-04-20 22:47:21 -07:00
stephb9959
d289c4b242 Improving RTTYS 2022-04-20 22:43:30 -07:00
stephb9959
49aeea00ff Improving RTTYS 2022-04-20 22:38:25 -07:00
stephb9959
072191fbc4 Improving RTTYS 2022-04-20 22:35:09 -07:00
stephb9959
0a4249e615 Improving RTTYS 2022-04-20 22:30:14 -07:00
stephb9959
ebaa0ea59e Improving RTTYS 2022-04-20 22:24:57 -07:00
stephb9959
f12597d72f Improving RTTYS 2022-04-20 22:14:59 -07:00
stephb9959
87bf2fb413 Improving RTTYS 2022-04-20 22:12:45 -07:00
stephb9959
ce848f6057 Improving RTTYS 2022-04-20 22:09:26 -07:00
stephb9959
031a635c2d Improving RTTYS 2022-04-20 22:06:43 -07:00
stephb9959
52d5d147fa Improving RTTYS 2022-04-20 22:02:57 -07:00
stephb9959
ff1c85cbd6 Improving RTTYS 2022-04-20 21:54:18 -07:00
stephb9959
a7d661de27 Improving RTTYS 2022-04-20 21:51:57 -07:00
stephb9959
a8db90b554 Improving RTTYS 2022-04-20 21:51:05 -07:00
stephb9959
b01f9eab33 Improving RTTYS 2022-04-20 21:45:55 -07:00
stephb9959
cb29abf914 Improving RTTYS 2022-04-20 21:34:11 -07:00
stephb9959
48f2b62cf0 Improving RTTYS 2022-04-20 21:28:23 -07:00
stephb9959
90074096fc Improving RTTYS 2022-04-20 21:23:35 -07:00
stephb9959
ecf28c596b Improving RTTYS 2022-04-20 21:22:21 -07:00
stephb9959
caf53ef6ba Improving RTTYS 2022-04-20 21:19:53 -07:00
stephb9959
318d65ea1f Improving RTTYS 2022-04-20 12:24:54 -07:00
stephb9959
e9b39b57ff Improving RTTYS 2022-04-20 12:20:38 -07:00
stephb9959
c4a7c8dab2 Improving RTTYS 2022-04-20 11:58:34 -07:00
stephb9959
6a2a8d3b8c Improving RTTYS 2022-04-20 11:53:27 -07:00
stephb9959
74eb9450f0 Improving RTTYS 2022-04-20 11:49:39 -07:00
stephb9959
8183ae6314 Improving RTTYS 2022-04-20 11:43:06 -07:00
stephb9959
7f80252bf9 Improving RTTYS 2022-04-20 11:38:44 -07:00
stephb9959
430275cbf0 Improving RTTYS 2022-04-20 11:26:50 -07:00
stephb9959
617f8a8307 Improving RTTYS 2022-04-20 11:17:01 -07:00
stephb9959
49435f1cb8 Improving RTTYS 2022-04-20 11:15:25 -07:00
stephb9959
45f19e57f3 Improving RTTYS 2022-04-20 10:42:21 -07:00
stephb9959
02fb282698 Improving RTTYS 2022-04-20 10:39:00 -07:00
stephb9959
e4becc70ca Improving RTTYS 2022-04-20 10:33:20 -07:00
stephb9959
946ccdb9dc Improving RTTYS 2022-04-20 10:28:13 -07:00
stephb9959
be6eb734fe Improving RTTYS 2022-04-20 10:24:18 -07:00
stephb9959
4c9df3e574 Improving RTTYS 2022-04-20 10:22:03 -07:00
stephb9959
6745aa425d Improving RTTYS 2022-04-20 10:10:45 -07:00
stephb9959
659f45d4ef Improving RTTYS 2022-04-20 10:01:55 -07:00
stephb9959
2939efb7b0 Improving RTTYS 2022-04-20 09:50:32 -07:00
stephb9959
909efce91a Improving RTTYS 2022-04-20 09:41:51 -07:00
stephb9959
4e81e54fe3 Improving RTTYS 2022-04-20 09:37:55 -07:00
stephb9959
af355bd5a1 Improving RTTYS 2022-04-20 09:33:15 -07:00
stephb9959
52bb4acb2e Improving RTTYS 2022-04-20 09:27:48 -07:00
stephb9959
19f1238b1c Improving RTTYS 2022-04-20 09:18:36 -07:00
stephb9959
1e397077aa Improving RTTYS 2022-04-20 09:12:02 -07:00
stephb9959
dd78d52798 Improving RTTYS 2022-04-20 09:11:23 -07:00
stephb9959
56a20e475b Improving RTTYS 2022-04-20 09:07:07 -07:00
stephb9959
313e21a461 Improving RTTYS 2022-04-20 08:55:43 -07:00
stephb9959
ff37328806 Improving RTTYS 2022-04-20 08:52:06 -07:00
stephb9959
19dfe74ada Improving RTTYS 2022-04-20 08:34:25 -07:00
stephb9959
3a8254dfda Improving RTTYS 2022-04-20 08:30:22 -07:00
stephb9959
796db4db9a Improving RTTYS 2022-04-20 08:27:18 -07:00
stephb9959
a9fa9abad3 Improving RTTYS 2022-04-20 08:17:03 -07:00
stephb9959
4e5d9020ea Improving RTTYS 2022-04-20 08:01:30 -07:00
stephb9959
86d8cdda75 Improving RTTYS 2022-04-20 07:59:22 -07:00
stephb9959
77f91d041f Improving RTTYS 2022-04-20 07:46:56 -07:00
stephb9959
446fabb372 Improving RTTYS 2022-04-20 07:41:16 -07:00
stephb9959
d7bac5d731 Improving RTTYS 2022-04-20 07:21:35 -07:00
stephb9959
98e705bba4 Improving RTTYS 2022-04-20 07:14:21 -07:00
stephb9959
fcaa9efe81 Improving RTTYS 2022-04-20 06:53:09 -07:00
stephb9959
05b9c1d85f Improving RTTYS 2022-04-20 06:47:26 -07:00
stephb9959
b7775206db Improving RTTYS 2022-04-19 23:45:01 -07:00
stephb9959
79b7104319 Improving RTTYS 2022-04-19 23:36:44 -07:00
stephb9959
71ca079c83 Improving RTTYS 2022-04-19 23:21:22 -07:00
stephb9959
d132251e36 Improving RTTYS 2022-04-19 22:25:19 -07:00
stephb9959
9d0ed5e363 Improving RTTYS 2022-04-19 22:17:08 -07:00
stephb9959
b9d8e8ef67 Improving RTTYS 2022-04-19 22:07:42 -07:00
stephb9959
347eb883ea Improving RTTYS 2022-04-19 22:00:27 -07:00
stephb9959
5dd259901c Improving RTTYS 2022-04-19 21:55:11 -07:00
stephb9959
0797c719e4 Improving RTTYS 2022-04-19 21:53:06 -07:00
stephb9959
59b183f2d2 Improving RTTYS 2022-04-19 21:45:39 -07:00
stephb9959
c3c80d07a5 Improving RTTYS 2022-04-19 21:35:04 -07:00
stephb9959
8f68d44388 Improving RTTYS 2022-04-19 21:20:32 -07:00
stephb9959
68446b7807 Improving RTTYS 2022-04-19 21:07:05 -07:00
stephb9959
36bd0a9eb0 Improving RTTYS 2022-04-19 15:29:54 -07:00
stephb9959
0ad1ccfdf1 Improving RTTYS 2022-04-19 15:14:39 -07:00
stephb9959
851dc1372c Improving RTTYS 2022-04-19 15:11:33 -07:00
stephb9959
5093a80a88 Improving RTTYS 2022-04-19 15:09:33 -07:00
stephb9959
cac3e5f6ff Improving RTTYS 2022-04-19 15:05:28 -07:00
stephb9959
0d63037a6e Improving RTTYS 2022-04-19 14:57:23 -07:00
stephb9959
5ab641aeb7 Improving RTTYS 2022-04-19 14:50:22 -07:00
stephb9959
c87074cfb5 Improving RTTYS 2022-04-19 14:42:42 -07:00
stephb9959
1bc537dade Improving RTTYS 2022-04-19 14:41:11 -07:00
stephb9959
93b24fc292 Improving RTTYS 2022-04-19 14:39:41 -07:00
stephb9959
c1f6f1d50c Improving RTTYS 2022-04-19 14:32:03 -07:00
stephb9959
067a481e4a Improving RTTYS 2022-04-19 14:28:10 -07:00
stephb9959
3086675af5 Improving RTTYS 2022-04-19 14:25:40 -07:00
stephb9959
3c22fe8af2 Improving RTTYS 2022-04-19 14:20:54 -07:00
stephb9959
9a4e834c94 Improving RTTYS 2022-04-19 14:13:51 -07:00
stephb9959
53a8f4db1f Improving RTTYS 2022-04-19 14:08:17 -07:00
stephb9959
36c381ccbf Improving RTTYS 2022-04-19 14:02:09 -07:00
stephb9959
c74807993f Improving RTTYS 2022-04-19 13:59:10 -07:00
stephb9959
a9e7e1e514 Improving RTTYS 2022-04-19 13:55:03 -07:00
stephb9959
15286d07f0 Improving RTTYS 2022-04-19 13:48:52 -07:00
stephb9959
3baeea6833 Improving RTTYS 2022-04-19 13:40:57 -07:00
stephb9959
ef8db87ee7 Improving RTTYS 2022-04-19 12:40:35 -07:00
stephb9959
4372c66e32 Improving RTTYS 2022-04-19 12:37:44 -07:00
stephb9959
bd38bb71d3 Improving RTTYS 2022-04-19 12:34:54 -07:00
stephb9959
0d0c310280 Improving RTTYS 2022-04-19 12:30:11 -07:00
stephb9959
2ca0f6ddcd Improving RTTYS 2022-04-19 12:20:57 -07:00
stephb9959
a2ad4f58ad Improving RTTYS 2022-04-19 12:16:35 -07:00
stephb9959
02d0daff14 Improving RTTYS 2022-04-19 12:12:30 -07:00
stephb9959
3c37b60f74 Improving RTTYS 2022-04-19 12:08:26 -07:00
stephb9959
6626567a5f Improving RTTYS 2022-04-19 12:04:47 -07:00
stephb9959
adc1b4c61f Improving RTTYS 2022-04-19 12:00:36 -07:00
stephb9959
2764821f21 Improving RTTYS 2022-04-19 11:57:50 -07:00
stephb9959
abd4219304 Improving RTTYS 2022-04-19 07:59:11 -07:00
stephb9959
fc8bcdecdb Improving RTTYS 2022-04-19 07:54:52 -07:00
stephb9959
82e4cd157a Improving RTTYS 2022-04-18 23:47:31 -07:00
stephb9959
29ad904c53 Merge remote-tracking branch 'origin/master' 2022-04-18 23:44:07 -07:00
stephb9959
05a069efda Improving RTTYS 2022-04-18 23:43:59 -07:00
Dmitry Dunaev
6f6f85f40b [WIFI-7555] Fix: release body workdir
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-04-18 11:13:01 +03:00
Dmitry Dunaev
5f709ac70f Merge pull request #89 from Telecominfraproject/feature/wifi-7555--add-release-workflow
[WIFI-7555] Add: Helm packaging and GitHub release step
2022-04-18 11:08:13 +03:00
stephb9959
977fca2887 Merge remote-tracking branch 'origin/master' 2022-04-14 14:27:53 -04:00
stephb9959
0bbfda3de5 Update framework. 2022-04-14 14:27:47 -04:00
Dmitry Dunaev
784795b21a [WIFI-7555] Add: Helm packaging and GitHub release step
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-04-14 15:52:33 +03:00
Dmitry Dunaev
00a1309040 Merge pull request #88 from Telecominfraproject/feature/wifi-7461--add-dev-trigger-deployment
[WIFI-7461] Add: CI step for master branch to trigger deployment of the latest version to dev instance
2022-04-12 16:51:27 +03:00
Dmitry Dunaev
db95129339 [WIFI-7461] Add: CI step for master branch to trigger deployment of the latest version to dev instance
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-04-12 15:45:56 +03:00
stephb9959
0c41105c94 Merge remote-tracking branch 'origin/master' 2022-04-10 07:27:35 -07:00
stephb9959
ccead902ec Update framework. 2022-04-10 07:27:07 -07:00
Johann Hoffmann
cf582f8899 Set default value for RTTY_ASSETS in docker-entrypoint.sh
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-04-07 16:29:27 +02:00
stephb9959
3a5c1c1218 Update framework. 2022-04-06 09:44:03 -07:00
stephb9959
7e5e998265 Updated the OUI db download link 2022-04-05 10:59:39 -07:00
stephb9959
306dc49bc1 Fixing framework. 2022-04-04 07:52:41 -07:00
stephb9959
297510c2e2 Merge remote-tracking branch 'origin/master' 2022-04-03 18:39:54 -07:00
stephb9959
0ec0cea131 Fixing framework. 2022-04-03 18:39:45 -07:00
Johann Hoffmann
0cd78ad1d8 Fix syntax error
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-04-01 15:15:20 +02:00
Johann Hoffmann
46c7361f55 Fix test_service command after switch to built-in RTTYS
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-04-01 14:24:03 +02:00
Dmitry Dunaev
9b55ce0f45 Merge pull request #87 from Telecominfraproject/feature/wifi-7221--add-owsub-trigger-testing
[WIFI-7221] Chg: trigger-testing inputs with new services
2022-04-01 13:52:35 +03:00
Dmitry Dunaev
77c7420700 [WIFI-7221] Chg: trigger-testing inputs with new services
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-04-01 13:50:35 +03:00
stephb9959
b7e7541d7d DeviceReactor registration. 2022-03-31 07:31:54 -07:00
stephb9959
dac7b7ca93 Merge remote-tracking branch 'origin/master' 2022-03-29 15:40:39 -07:00
stephb9959
7160dbdaa7 Fixing fmt::format errors 2022-03-29 15:40:31 -07:00
Johann Hoffmann
164d8e12a3 [WIFI-7436] Switch to built-in RTTYS (#85)
* Add config options to enable built-in RTTYS

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>

* Adapt rttys config in Helm chart

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>

* Fix typo in config template

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-03-29 10:51:31 +02:00
Dmitry Dunaev
90625f5e3a [WIFI-4884] Add: more clear slack message on failure
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-28 12:59:35 +03:00
stephb9959
4ec83bdc59 Fixing warnings 2022-03-27 23:47:51 -07:00
stephb9959
3a1dcdb026 Fixing warnings 2022-03-27 23:47:05 -07:00
stephb9959
ed5a18805c Fixing warnings 2022-03-27 23:45:36 -07:00
stephb9959
ba9075d46e Fixing asan flags 2022-03-27 08:15:51 -07:00
stephb9959
391ebebc70 Cleaning up CMakeLists.txt 2022-03-26 08:17:36 -07:00
stephb9959
0ce355004b Sanitized 2022-03-25 20:31:16 -07:00
stephb9959
187a2c7168 Sanitized 2022-03-25 20:28:01 -07:00
stephb9959
b8a646a011 Sanitized 2022-03-25 20:26:01 -07:00
stephb9959
9cb99ef9cd Sanitized 2022-03-25 20:24:10 -07:00
stephb9959
53761649f8 Sanitized 2022-03-25 15:52:38 -07:00
stephb9959
13bbb011a9 Framework fix "}" crash 2022-03-25 07:39:18 -07:00
stephb9959
bc14a41152 Framework fix. 2022-03-24 21:13:57 -07:00
stephb9959
adacc8b3fe Framework fix. 2022-03-24 20:40:14 -07:00
stephb9959
47323d2eee Framework fix. 2022-03-24 14:40:04 -07:00
stephb9959
283f9f7bf6 Framework fix. 2022-03-24 14:23:20 -07:00
stephb9959
5895613ada Merge remote-tracking branch 'origin/master' 2022-03-24 11:56:28 -07:00
stephb9959
8b99e863eb Framework fix. 2022-03-24 11:56:20 -07:00
Dmitry Dunaev
dfb6395b30 [WIFI-4884] Add: github slack icon
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-24 14:23:00 +03:00
Dmitry Dunaev
64e2cba3ae Merge pull request #84 from Telecominfraproject/feature/wifi-4884--add-slack-notify-on-failure
[WIFI-4884] Add: notification step via Slack on failure in CI on master branch
2022-03-24 13:03:20 +03:00
stephb9959
6337f6e61a Change to fmt:: 2022-03-23 16:05:50 -07:00
Dmitry Dunaev
5c286f4efe [WIFI-4884] Add: notification step via Slack on failure in CI on master branch
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-23 15:13:21 +03:00
stephb9959
55d320b4d0 Fixing:https://telecominfraproject.atlassian.net/browse/WIFI-7433 2022-03-22 23:31:18 -07:00
stephb9959
2377497497 Fixing:https://telecominfraproject.atlassian.net/browse/WIFI-7433 2022-03-22 21:28:18 -07:00
stephb9959
ee9963ad8a Fixing:https://telecominfraproject.atlassian.net/browse/WIFI-7433 2022-03-22 21:17:15 -07:00
stephb9959
43d631ba3e Fixing:https://telecominfraproject.atlassian.net/browse/WIFI-7433 2022-03-22 14:58:02 -07:00
stephb9959
5ae2e0b945 Fixing: https://telecominfraproject.atlassian.net/browse/WIFI-7434 2022-03-22 14:00:27 -07:00
stephb9959
6f1dec06d5 Framework update: support for insecure RESTAPI for ALB support. 2022-03-21 21:40:53 -07:00
stephb9959
9fae68766c Framework update: support for insecure RESTAPI for ALB support. 2022-03-21 21:40:46 -07:00
stephb9959
eeffefb1ce Adding support for compress_sz when receiving large messages. 2022-03-19 22:02:57 -07:00
stephb9959
dced0b97cc Fixing stats message size uncompressing too large. 2022-03-18 09:28:30 -07:00
stephb9959
c4e7835a6f Fixing stats message size uncompressing too large. 2022-03-18 08:48:16 -07:00
stephb9959
7a56629478 Adjusting incoming buffer size for large stats blocks 2022-03-18 08:42:56 -07:00
stephb9959
20cf7d2484 Adjusting incoming buffer size for large stats blocks 2022-03-18 08:22:28 -07:00
stephb9959
f5d06b68a5 Adjusting incoming buffer size for large stats blocks 2022-03-18 08:15:56 -07:00
stephb9959
e213a4f71d Adjusting incoming buffer size for large stats blocks 2022-03-18 08:13:51 -07:00
stephb9959
08b1a9da4b Adjusting incoming buffer size for large stats blocks 2022-03-18 08:09:01 -07:00
stephb9959
3467b6a264 Adjusting incoming buffer size for large stats blocks 2022-03-18 08:00:05 -07:00
stephb9959
38d4c5bc79 Adjusting incoming buffer size for large stats blocks 2022-03-18 07:42:31 -07:00
stephb9959
f4a2041d09 Adjusting incoming buffer size for large stats blocks 2022-03-17 21:26:54 -07:00
stephb9959
7d25da17d1 Merge remote-tracking branch 'origin/master' 2022-03-17 21:21:32 -07:00
stephb9959
a15e47183a Adjusting incoming buffer size for large stats blocks 2022-03-17 21:21:24 -07:00
Johann Hoffmann
407f82e480 [WIFI-7229] Integrate virtual AP in Docker Compose testing workflow (#82)
* Add required input

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>

* Change ref to master since PR was merged

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-03-15 13:14:22 +01:00
stephb9959
398aae824e Merge remote-tracking branch 'origin/master' 2022-03-14 10:18:29 -07:00
stephb9959
04b0446fff Adding details on some kafka messages. 2022-03-14 10:18:19 -07:00
Dmitry Dunaev
dd1a08ea91 Merge pull request #81 from Telecominfraproject/feature/wifi-7223--kafka-ssl-params
[WIFI-7223] Add: secure Kafka connection params
2022-03-09 10:06:24 +03:00
Dmitry Dunaev
1c9f710b52 [WIFI-7223] Add: secure Kafka connection params
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-09 10:05:46 +03:00
stephb9959
e8ef49e36f Fixing framework: OpenAPIRequestDelete 2022-03-08 14:40:40 -08:00
stephb9959
9c43176556 Fixing framework: internal external <-> mismatch. 2022-03-08 14:25:26 -08:00
stephb9959
36473cb179 Merge remote-tracking branch 'origin/master' 2022-03-03 22:37:51 -08:00
stephb9959
eac18f8fa4 Framework update 2022-03-03 22:37:42 -08:00
Dmitry Dunaev
ab40792866 Merge pull request #80 from Telecominfraproject/feature/wifi-1998--ingress-deprecation
[WIFI-1998] Add: gracefull ingress deprecation
2022-03-01 16:22:34 +03:00
Dmitry Dunaev
5a2dfdff13 [WIFI-1998] Add: gracefull ingress deprecation
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-01 16:14:37 +03:00
Johann Hoffmann
131d0fe76e [WIFI-6925] Explore CLI commands and virtual APs for deployment tests (#79)
* Add test_service and related functions

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>

* Add short description for test_service

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>

* Fix indentation

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>

* Adapt command help

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-28 13:34:21 +01:00
stephb9959
ce10b746ba Framework update 2022-02-25 22:31:42 -08:00
stephb9959
6cefac1967 Framework update 2022-02-25 22:31:30 -08:00
stephb9959
33801c552a Framework update 2022-02-24 16:25:16 -08:00
stephb9959
7c7121e9d7 Framework update 2022-02-24 16:22:05 -08:00
stephb9959
9ce7422e88 Framework update 2022-02-24 16:14:30 -08:00
stephb9959
87808dd447 Framework update 2022-02-24 12:22:17 -08:00
stephb9959
b0e47cd937 Adding locale support on connection to support subscriber and local regulations. 2022-02-24 11:10:55 -08:00
stephb9959
46339ebfde Adding locale support on connection to support subscriber and local regulations. 2022-02-24 10:03:38 -08:00
stephb9959
962a481306 Adding locale support on connection to support subscriber and local regulations. 2022-02-24 10:00:51 -08:00
stephb9959
64fa1777c9 Adding locale support on connection to support subscriber and local regulations. 2022-02-24 09:57:28 -08:00
stephb9959
60fc22ac68 Adding locale support on connection to support subscriber and local regulations. 2022-02-24 09:52:28 -08:00
stephb9959
cf7e8e667f Adding locale support on connection to support subscriber and local regulations. 2022-02-24 09:44:31 -08:00
stephb9959
cc22fe38a0 Adding locale support on connection to support subscriber and local regulations. 2022-02-24 09:36:45 -08:00
stephb9959
a18f8ed0f7 Adding entity, subscriber, modified fields to device. 2022-02-23 09:06:02 -08:00
stephb9959
5b99a2a366 Adding entity, subscriber, modified fields to device. 2022-02-23 09:04:55 -08:00
stephb9959
09126a7562 Fixing trace: simgle duration or packets. 2022-02-23 08:17:39 -08:00
stephb9959
64a0430c28 Fixing trace: simgle duration or packets. 2022-02-21 23:23:58 -08:00
stephb9959
121f6dc95e Fixing trace: simgle duration or packets. 2022-02-21 23:17:05 -08:00
stephb9959
4b0398365b Fixing device command when devices are not connected. 2022-02-21 22:15:45 -08:00
stephb9959
2be219112a Refactor of ow includes. 2022-02-21 08:40:44 -08:00
stephb9959
972a702b32 Adding "bandwidth" for wifi scanning. 2022-02-21 08:05:50 -08:00
stephb9959
e6d510b9bb Adding Kafka SSL. 2022-02-20 10:38:32 -08:00
stephb9959
88e5416088 Move to 2.6 2022-02-10 12:13:09 -08:00
172 changed files with 20634 additions and 9486 deletions

View File

@@ -13,6 +13,7 @@ on:
pull_request:
branches:
- master
- 'release/*'
defaults:
run:
@@ -39,6 +40,16 @@ jobs:
registry_user: ucentral
registry_password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
- name: Notify on failure via Slack
if: failure() && github.ref == 'refs/heads/master'
uses: rtCamp/action-slack-notify@v2
env:
SLACK_USERNAME: GitHub Actions failure notifier
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_COLOR: "${{ job.status }}"
SLACK_ICON: https://raw.githubusercontent.com/quintessence/slack-icons/master/images/github-logo-slack-icon.png
SLACK_TITLE: Docker build failed for OWGW service
trigger-testing:
if: startsWith(github.ref, 'refs/pull/')
runs-on: ubuntu-latest
@@ -65,4 +76,26 @@ jobs:
workflow: ow_docker-compose.yml
token: ${{ secrets.WLAN_TESTING_PAT }}
ref: master
inputs: '{"owgw_version": "${{ github.sha }}", "owgwui_version": "${{ env.BASE_BRANCH }}", "owsec_version": "${{ env.BASE_BRANCH }}", "owfms_version": "${{ env.BASE_BRANCH }}", "owprov_version": "main", "owprovui_version": "main"}'
inputs: '{"deployment_version": "${{ env.BASE_BRANCH }}", "owgw_version": "${{ github.sha }}", "owsec_version": "${{ env.BASE_BRANCH }}", "owfms_version": "${{ env.BASE_BRANCH }}", "owprov_version": "${{ env.BASE_BRANCH }}", "owanalytics_version": "${{ env.BASE_BRANCH }}", "owsub_version": "${{ env.BASE_BRANCH }}", "microservice": "owgw"}'
trigger-deploy-to-dev:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master'
needs:
- docker
steps:
- name: Checkout actions repo
uses: actions/checkout@v2
with:
repository: Telecominfraproject/.github
path: github
- name: Trigger deployment of the latest version to dev instance and wait for result
uses: ./github/composite-actions/trigger-workflow-and-wait
with:
owner: Telecominfraproject
repo: wlan-testing
workflow: ucentralgw-dev-deployment.yaml
token: ${{ secrets.WLAN_TESTING_PAT }}
ref: master
inputs: '{"force_latest": "true"}'

View File

@@ -17,4 +17,10 @@ jobs:
- name: Cleanup Docker image with PR branch tag
run: |
export PR_BRANCH_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
curl -uucentral:${{ secrets.DOCKER_REGISTRY_PASSWORD }} -X DELETE "https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral/owgw/$PR_BRANCH_TAG"
if [[ ! $PR_BRANCH_TAG =~ (main|master|release-*) ]]; then
echo "PR branch is $PR_BRANCH_TAG, deleting Docker image"
curl -s -uucentral:${{ secrets.DOCKER_REGISTRY_PASSWORD }} -X DELETE "https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral/owgw/$PR_BRANCH_TAG"
else
echo "PR branch is $PR_BRANCH_TAG, not deleting Docker image"
fi

46
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,46 @@
name: Release chart package
on:
push:
tags:
- 'v*'
defaults:
run:
shell: bash
jobs:
helm-package:
runs-on: ubuntu-20.04
env:
HELM_REPO_URL: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
HELM_REPO_USERNAME: ucentral
steps:
- name: Checkout uCentral assembly chart repo
uses: actions/checkout@v2
with:
path: wlan-cloud-ucentralgw
- name: Build package
working-directory: wlan-cloud-ucentralgw/helm
run: |
helm plugin install https://github.com/aslafy-z/helm-git --version 0.10.0
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm dependency update
mkdir dist
helm package . -d dist
- name: Generate GitHub release body
working-directory: wlan-cloud-ucentralgw/helm
run: |
pip3 install yq -q
echo "Docker image - tip-tip-wlan-cloud-ucentral.jfrog.io/owgw:$GITHUB_REF_NAME" > release.txt
echo "Helm charted may be attached to this release" >> release.txt
echo "Deployment artifacts may be found in https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/$GITHUB_REF_NAME" >> release.txt
- name: Create GitHub release
uses: softprops/action-gh-release@v1
with:
body_path: wlan-cloud-ucentralgw/helm/release.txt
files: wlan-cloud-ucentralgw/helm/dist/*

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.13)
project(owgw VERSION 2.5.0)
project(owgw VERSION 2.7.1)
set(CMAKE_CXX_STANDARD 17)
@@ -30,6 +30,13 @@ else()
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
endif()
if(ASAN)
add_compile_options(-fsanitize=address)
add_link_options(-fsanitize=address)
add_compile_options(-fsanitize=undefined)
add_link_options(-fsanitize=undefined)
endif()
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --tags
@@ -42,14 +49,11 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
endif()
add_definitions(-DTIP_GATEWAY_SERVICE="1")
add_definitions(-DTIP_GATEWAY_SERVICE="1" -DPOCO_LOG_DEBUG="1")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost REQUIRED system)
find_package(OpenSSL REQUIRED)
find_package(ZLIB REQUIRED)
find_package(fmt REQUIRED)
find_package(nlohmann_json REQUIRED)
find_package(nlohmann_json_schema_validator REQUIRED)
@@ -66,6 +70,8 @@ include_directories(/usr/local/include /usr/local/opt/openssl/include src inclu
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
add_compile_options(-Wall -Wextra)
add_executable( owgw
build
src/ow_version.h.in
@@ -73,11 +79,10 @@ add_executable( owgw
src/framework/KafkaTopics.h
src/framework/MicroService.h
src/framework/OpenWifiTypes.h
src/framework/MicroServiceErrorHandler.h
src/framework/orm.h
src/framework/RESTAPI_errors.h
src/framework/RESTAPI_protocol.h
src/framework/StorageClass.h
src/framework/uCentral_Protocol.h
src/framework/MicroServiceErrorHandler.h
src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
@@ -97,16 +102,15 @@ add_executable( owgw
src/RESTAPI/RESTAPI_RPC.cpp src/RESTAPI/RESTAPI_RPC.h
src/RESTAPI/RESTAPI_deviceDashboardHandler.cpp src/RESTAPI/RESTAPI_deviceDashboardHandler.h
src/RESTAPI/RESTAPI_telemetryWebSocket.cpp src/RESTAPI/RESTAPI_telemetryWebSocket.h
src/RESTAPI/RESTAPI_webSocketServer.cpp src/RESTAPI/RESTAPI_webSocketServer.h
src/storage/storage_blacklist.cpp src/storage/storage_tables.cpp src/storage/storage_logs.cpp
src/storage/storage_command.cpp src/storage/storage_healthcheck.cpp src/storage/storage_statistics.cpp
src/storage/storage_device.cpp src/storage/storage_capabilities.cpp src/storage/storage_defconfig.cpp
src/storage/storage_tables.cpp
src/RESTAPI/RESTAPI_routers.cpp
src/Daemon.cpp src/Daemon.h
src/WS_Server.cpp src/WS_Server.h
src/AP_WS_Server.cpp src/AP_WS_Server.h
src/StorageService.cpp src/StorageService.h
src/DeviceRegistry.cpp src/DeviceRegistry.h
# src/DeviceRegistry.cpp src/DeviceRegistry.h
src/CommandManager.cpp src/CommandManager.h
src/CentralConfig.cpp src/CentralConfig.h
src/FileUploader.cpp src/FileUploader.h
@@ -117,7 +121,20 @@ add_executable( owgw
src/TelemetryStream.cpp src/TelemetryStream.h
src/framework/ConfigurationValidator.cpp src/framework/ConfigurationValidator.h
src/ConfigurationCache.h
src/CapabilitiesCache.h src/FindCountry.h src/rttys/RTTYS_server.cpp src/rttys/RTTYS_server.h src/rttys/RTTYS_device.cpp src/rttys/RTTYS_device.h src/rttys/RTTYS_ClientConnection.cpp src/rttys/RTTYS_ClientConnection.h src/rttys/RTTYS_WebServer.cpp src/rttys/RTTYS_WebServer.h src/RESTAPI/RESTAPI_device_helper.h src/SDKcalls.cpp src/SDKcalls.h src/StateUtils.cpp src/StateUtils.h src/WS_ReactorPool.h src/WS_Connection.h src/WS_Connection.cpp src/TelemetryClient.h src/TelemetryClient.cpp src/RESTAPI/RESTAPI_iptocountry_handler.cpp src/RESTAPI/RESTAPI_iptocountry_handler.h)
src/CapabilitiesCache.h src/FindCountry.h
src/rttys/RTTYS_server.cpp
src/rttys/RTTYS_server.h
src/rttys/RTTYS_device.cpp
src/rttys/RTTYS_device.h
src/rttys/RTTYS_ClientConnection.cpp
src/rttys/RTTYS_ClientConnection.h
src/rttys/RTTYS_WebServer.cpp
src/rttys/RTTYS_WebServer.h src/RESTAPI/RESTAPI_device_helper.h src/SDKcalls.cpp src/SDKcalls.h src/StateUtils.cpp src/StateUtils.h src/AP_WS_ReactorPool.h src/AP_WS_Connection.h src/AP_WS_Connection.cpp src/TelemetryClient.h src/TelemetryClient.cpp src/RESTAPI/RESTAPI_iptocountry_handler.cpp src/RESTAPI/RESTAPI_iptocountry_handler.h src/framework/ow_constants.h src/GwWebSocketClient.cpp src/GwWebSocketClient.h src/framework/WebSocketClientNotifications.h src/RADIUS_proxy_server.cpp src/RADIUS_proxy_server.h src/RESTAPI/RESTAPI_radiusProxyConfig_handler.cpp src/RESTAPI/RESTAPI_radiusProxyConfig_handler.h src/ParseWifiScan.h src/RADIUS_helpers.h src/VenueBroadcaster.h src/sdks/sdk_prov.h
src/AP_WS_Process_connect.cpp
src/AP_WS_Process_state.cpp
src/AP_WS_Process_healthcheck.cpp
src/AP_WS_Process_log.cpp
src/AP_WS_Process_crashlog.cpp src/AP_WS_Process_ping.cpp src/AP_WS_Process_cfgpending.cpp src/AP_WS_Process_recovery.cpp src/AP_WS_Process_deviceupdate.cpp src/AP_WS_Process_telemetry.cpp src/AP_WS_Process_venuebroadcast.cpp src/RADSECserver.h)
if(NOT SMALL_BUILD)
@@ -128,12 +145,15 @@ INSTALL(TARGETS owgw
)
target_link_libraries(owgw PUBLIC
${Poco_LIBRARIES} ${Boost_LIBRARIES} ${ZLIB_LIBRARIES})
${Poco_LIBRARIES}
${ZLIB_LIBRARIES})
if(NOT SMALL_BUILD)
target_link_libraries(owgw PUBLIC
${MySQL_LIBRARIES} ${ZLIB_LIBRARIES}
CppKafka::cppkafka
nlohmann_json_schema_validator
fmt::fmt
)
if(UNIX AND NOT APPLE)
target_link_libraries(owgw PUBLIC PocoJSON)

View File

@@ -1,15 +1,23 @@
FROM alpine:3.15 AS build-base
ARG DEBIAN_VERSION=11.5-slim
ARG POCO_VERSION=poco-tip-v1
ARG FMTLIB_VERSION=9.0.0
ARG CPPKAFKA_VERSION=tip-v1
ARG JSON_VALIDATOR_VERSION=2.1.0
RUN apk add --update --no-cache \
FROM debian:$DEBIAN_VERSION AS build-base
RUN apt-get update && apt-get install --no-install-recommends -y \
make cmake g++ git \
unixodbc-dev postgresql-dev mariadb-dev \
librdkafka-dev boost-dev openssl-dev \
zlib-dev nlohmann-json
libpq-dev libmariadb-dev libmariadbclient-dev-compat \
librdkafka-dev libboost-all-dev libssl-dev \
zlib1g-dev nlohmann-json3-dev ca-certificates
FROM build-base AS poco-build
ADD https://api.github.com/repos/stephb9959/poco/git/refs/heads/master version.json
RUN git clone https://github.com/stephb9959/poco /poco
ARG POCO_VERSION
ADD https://api.github.com/repos/AriliaWireless/poco/git/refs/tags/${POCO_VERSION} version.json
RUN git clone https://github.com/AriliaWireless/poco --branch ${POCO_VERSION} /poco
WORKDIR /poco
RUN mkdir cmake-build
@@ -18,10 +26,26 @@ RUN cmake ..
RUN cmake --build . --config Release -j8
RUN cmake --build . --target install
FROM build-base AS fmtlib-build
ARG FMTLIB_VERSION
ADD https://api.github.com/repos/fmtlib/fmt/git/refs/tags/${FMTLIB_VERSION} version.json
RUN git clone https://github.com/fmtlib/fmt --branch ${FMTLIB_VERSION} /fmtlib
WORKDIR /fmtlib
RUN mkdir cmake-build
WORKDIR cmake-build
RUN cmake ..
RUN make
RUN make install
FROM build-base AS cppkafka-build
ADD https://api.github.com/repos/stephb9959/cppkafka/git/refs/heads/master version.json
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
ARG CPPKAFKA_VERSION
ADD https://api.github.com/repos/AriliaWireless/cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json
RUN git clone https://github.com/AriliaWireless/cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka
WORKDIR /cppkafka
RUN mkdir cmake-build
@@ -32,8 +56,10 @@ RUN cmake --build . --target install
FROM build-base AS json-schema-validator-build
ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/heads/master version.json
RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
ARG JSON_VALIDATOR_VERSION
ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/tags/${JSON_VALIDATOR_VERSION} version.json
RUN git clone https://github.com/pboettch/json-schema-validator --branch ${JSON_VALIDATOR_VERSION} /json-schema-validator
WORKDIR /json-schema-validator
RUN mkdir cmake-build
@@ -55,6 +81,8 @@ COPY --from=cppkafka-build /usr/local/include /usr/local/include
COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
COPY --from=json-schema-validator-build /usr/local/include /usr/local/include
COPY --from=json-schema-validator-build /usr/local/lib /usr/local/lib
COPY --from=fmtlib-build /usr/local/include /usr/local/include
COPY --from=fmtlib-build /usr/local/lib /usr/local/lib
WORKDIR /owgw
RUN mkdir cmake-build
@@ -62,21 +90,21 @@ WORKDIR /owgw/cmake-build
RUN cmake ..
RUN cmake --build . --config Release -j8
FROM alpine:3.15
FROM debian:$DEBIAN_VERSION
ENV OWGW_USER=owgw \
OWGW_ROOT=/owgw-data \
OWGW_CONFIG=/owgw-data
RUN addgroup -S "$OWGW_USER" && \
adduser -S -G "$OWGW_USER" "$OWGW_USER"
RUN useradd "$OWGW_USER"
RUN mkdir /openwifi
RUN mkdir -p "$OWGW_ROOT" "$OWGW_CONFIG" && \
chown "$OWGW_USER": "$OWGW_ROOT" "$OWGW_CONFIG"
RUN apk add --update --no-cache librdkafka su-exec gettext ca-certificates bash jq curl \
mariadb-connector-c libpq unixodbc postgresql-client
RUN apt-get update && apt-get install --no-install-recommends -y \
librdkafka++1 gosu gettext ca-certificates bash jq curl wget \
libmariadb-dev-compat libpq5 unixodbc postgresql-client
COPY readiness_check /readiness_check
COPY test_scripts/curl/cli /cli
@@ -84,13 +112,16 @@ COPY test_scripts/curl/cli /cli
COPY owgw.properties.tmpl /
COPY docker-entrypoint.sh /
COPY wait-for-postgres.sh /
COPY rtty_ui /dist/rtty_ui
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.pem
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.crt
COPY --from=owgw-build /owgw/cmake-build/owgw /openwifi/owgw
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib /usr/local/lib/
COPY --from=poco-build /poco/cmake-build/lib /usr/local/lib
RUN ldconfig
EXPOSE 15002 16002 16003 17002 16102
ENTRYPOINT ["/docker-entrypoint.sh"]

194
MICRO_SERVICE_PROTOCOL.md Normal file
View File

@@ -0,0 +1,194 @@
# Micro-service backbone responsibilities
## Bus management
Each microservice must get onto kafka and consume/produce messages on the kafka bus. The topic to subscribe to is `service_events`.
## System messages
System messages are what maintains the collection of micro-services working on the system. Each message has the format
```json
{
"event": <event-type>,
"id": 1234567890,
"type": "owrrm",
"publicEndPoint": "https://myhostname.com:16020",
"privateEndPoint": "https://localhost:17020",
"key" : "289479847948794870749",
"version" : "1.0"
}
```
### Responsibilities
Each micro service is responsible to generate its own messages and keep track of messages coming from other
micro services. This is necessary so that any micro service may reach our any other micro service. This provides
discovery for any micro service. All current micro services provided in OpenWiFi perform these functions. If you leverage
the C++ framework, this functionality if performed automatically.
### `event-type`
Each micro service is responsible to generate and consume these events
#### `join` event
When a service start and joins the bus, it should generate an event-type of `join`.
### `leave` event
When a service shuts down, it should generate a `leave` event-type.
### `keep-alive` event
Every 30 seconds, a service should generate a `keep-alive` message.
### `id`
You should generate a random number from some unique factor for the system. This ID is used to identify different services. You should reuse that ID
when you restart.
## The `type`
The `type` in the system message is oen of the following:
```c++
static const std::string uSERVICE_SECURITY{"owsec"};
static const std::string uSERVICE_GATEWAY{"owgw"};
static const std::string uSERVICE_FIRMWARE{ "owfms"};
static const std::string uSERVICE_TOPOLOGY{ "owtopo"};
static const std::string uSERVICE_PROVISIONING{ "owprov"};
static const std::string uSERVICE_OWLS{ "owls"};
static const std::string uSERVICE_SUBCRIBER{ "owsub"};
static const std::string uSERVICE_INSTALLER{ "owinst"};
static const std::string uSERVICE_ANALYTICS{ "owanalytics"};
static const std::string uSERVICE_OWRRM{ "owrrm"};
```
The `type` is what you should use to find the `privateEndPoint` you are looking to communicate with.
### Example
Assume you want to communicate with the gateway to configure a device.
```text
1. Look into my list of current Micro-services for the type=owgw.
2. Use the privateEndPoint associated with that entry
```
## REST API calls on the private interface
For inter-service REST calls, you should never use the `Authorization: Bearer token` method. Instead, the following headers should be included in all API calls
```json
{
"X-API-KEY" : "289479847948794870749",
"X-INTERNAL-NAME" : "https://myhostname.com:16020"
}
```
### `X-API-KEY`
This is the `key` you included in your `system-messages`.
### `X-INTERNAL-NAME`
This is the `publicEndPoint` you included in your `system-messages`.
This method can _only_ be used to any another `privateEndPoint` in the system. You can use the exact same EndPoints provided in the OpenAPI files for any of the services.
## OpenAPI Integration
To appear in the UI consoles, a microservice should be able to handle a get to the `/api/v1/system` endpoint on its `publicEndPoint` interface.
Here is a brief description of what the microservice should answer:
```yaml
/system:
get:
tags:
- System Commands
summary: Retrieve different values from the running service.
operationId: getSystemCommand
parameters:
- in: query
description: Get a value
name: command
schema:
type: string
enum:
- info
required: true
responses:
200:
description: Successful command execution
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/SystemInfoResults'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
```
The relevant data structures are:
```yaml
SystemInfoResults:
type: object
properties:
version:
type: string
uptime:
type: integer
format: integer64
start:
type: integer
format: integer64
os:
type: string
processors:
type: integer
hostname:
type: string
certificates:
type: array
items:
type: object
properties:
filename:
type: string
expires:
type: integer
format: int64
```
and
```yaml
responses:
NotFound:
description: The specified resource was not found.
content:
application/json:
schema:
properties:
ErrorCode:
type: integer
ErrorDetails:
type: string
ErrorDescription:
type: string
Unauthorized:
description: The requested does not have sufficient rights to perform the operation.
content:
application/json:
schema:
properties:
ErrorCode:
type: integer
enum:
- 0 # Success
- 1 # PASSWORD_CHANGE_REQUIRED,
- 2 # INVALID_CREDENTIALS,
- 3 # PASSWORD_ALREADY_USED,
- 4 # USERNAME_PENDING_VERIFICATION,
- 5 # PASSWORD_INVALID,
- 6 # INTERNAL_ERROR,
- 7 # ACCESS_DENIED,
- 8 # INVALID_TOKEN
- 9 # EXPIRED_TOKEN
- 10 # RATE_LIMIT_EXCEEDED
- 11 # BAD_MFA_TRANSACTION
- 12 # MFA_FAILURE
- 13 # SECURITY_SERVICE_UNREACHABLE
ErrorDetails:
type: string
ErrorDescription:
type: string
```

View File

@@ -30,7 +30,7 @@ In this RPC, here are some common interpretations:
#### Connection event
Device Sends connection notification to the controller after establishing a connection. The controller
my decide to send the AP a newer configuration. The controller will record the device capabilities provided.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "connect" ,
"params" : {
@@ -47,7 +47,7 @@ my decide to send the AP a newer configuration. The controller will record the d
#### State event
The device sends device state information periodically. If the controller detects that it has a newer configuration, it
may decide to send this new configuration to the AP.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "state" ,
"params" : {
@@ -62,7 +62,7 @@ may decide to send this new configuration to the AP.
#### Healthcheck event
Device sends a `healthcheck` periodically. This message contains information about how vital subsystems are operating and
if they need attention.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "healthcheck" ,
"params" : {
@@ -77,7 +77,7 @@ if they need attention.
#### Log event
Device sends a log message whenever necessary. The controller will log this message to the log system for the device.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "log" ,
"params" : {
@@ -102,7 +102,7 @@ The `severity` matches the `syslog` levels. Here are the details:
#### Crash Log event
Device may send a crash log event after rebooting after a crash. The event cannot be sent until a connection event has been sent.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "crashlog" ,
"params" : {
@@ -117,7 +117,7 @@ Device may send a crash log event after rebooting after a crash. The event canno
Device sends this message to tell the controller that the device
has received a configuration but is still running an older configuration. The controller will not
reply to this message.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "cfgpending" ,
"params" : {
@@ -131,7 +131,7 @@ reply to this message.
#### DeviceUpdate event
Device sends this message to tell the controller it is changing something is its configuration because
of some requirement or some changes.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "deviceupdate" ,
"params" : {
@@ -145,7 +145,7 @@ of some requirement or some changes.
#### Send a keepalive to the controller event
Device sends a keepalive whenever necessary. The device will send this message to tell the controller
which version it is running. The Controller may decide to send the device a newer configuration.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "ping" ,
"params" : {
@@ -157,7 +157,7 @@ which version it is running. The Controller may decide to send the device a newe
#### Recovery Event
Device may decide it has to do into recovery mode. This event should be used.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "recovery" ,
"params" : {
@@ -170,6 +170,34 @@ Device may decide it has to do into recovery mode. This event should be used.
}
```
The device should answer:
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
"status" : {
"error" : 0 or an error number,
"text" : <description of the error or success>
}
},
"id" : <same number>
}
```
#### Device requests a venue broadcast message
Device send this message when it wants to reach out to all other APs in the same venue. The GW will find the
venue where this device belongs and resend the same message to all other devices in the venue.
```json
{ "jsonrpc" : "2.0" ,
"method" : "venue_broadcast" ,
"params" : {
"serial" : <serial number> ,
"timestamp" : <the UTC timestamp when the message was sent>,
"data" : <an opaque string from the AP. This could be Zipped and so on and most likely base64 encoded>
}
}
```
Upon receiving a `venue_broadcast` message, the GW will simply resent the message to all the APs in the venue.
### Controller commands
Most controller commands include a `when` member. This is a UTC clock time asking the AP
@@ -180,7 +208,7 @@ always a numeric parameter.
#### Controller wants the device to apply a given configuration
Controller sends this command when it believes the device should load a new configuration. The device
should send message with `pending change` events until this version has been applied and running.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "configure" ,
"params" : {
@@ -194,7 +222,7 @@ should send message with `pending change` events until this version has been app
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -233,7 +261,7 @@ The rejected section is an array containing the following:
#### Controller wants the device to reboot
Controller sends this command when it believes the device should reboot.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "reboot" ,
"params" : {
@@ -245,7 +273,7 @@ Controller sends this command when it believes the device should reboot.
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -264,7 +292,7 @@ The device should answer:
#### Controller wants the device to upgrade its firmware
Controller sends this command when it believes the device should upgrade its firmware.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "upgrade" ,
"params" : {
@@ -277,7 +305,7 @@ Controller sends this command when it believes the device should upgrade its fir
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -293,7 +321,7 @@ The device should answer:
#### Controller wants the device to perform a factory reset
Controller sends this command when it believes the device should upgrade its firmware.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "factory" ,
"params" : {
@@ -306,7 +334,7 @@ Controller sends this command when it believes the device should upgrade its fir
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -320,9 +348,50 @@ The device should answer:
}
```
#### Controller issuing RRM commands to the AP
Controller sends this command to perform several RRM commands.
```json
{ "jsonrpc" : "2.0" ,
"method" : "rrm" ,
"params" : {
"serial" : <serial number> ,
"actions": [
{
"type": "roam",
"bss": [ "00:11:22:33:44:55", ... ],
"params" : { action specific data }
}, {
"type": "tx-power",
"bss": [ "00:11:22:33:44:55", ... ],
“params”: { action specific data }
}, {
"type": "beacon-request",
"bss": [ "00:11:22:33:44:55", ... ],
"params": { action specific data }
}
]
},
"id" : <some number>
}
```
The device should answer:
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
"status" : {
"error" : 0 or an error number,
"text" : <description of the error or success>,
}
},
"id" : <same number>
}
```
#### Controller wants the device to flash its LEDs
Controller sends this command when it wants the device to flash its LEDs.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "leds" ,
"params" : {
@@ -336,14 +405,13 @@ Controller sends this command when it wants the device to flash its LEDs.
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
"status" : {
"error" : 0 or an error number,
"text" : <description of the error or success>,
"when" : <time when this will be performed as UTC seconds>,
}
},
"id" : <same number>
@@ -358,7 +426,7 @@ The device should answer:
#### Controller sends a device specific command
Controller sends this command specific to this device. The command is proprietary and must be agreed upon by the device
and the controller.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "perform" ,
"params" : {
@@ -372,7 +440,7 @@ and the controller.
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -395,7 +463,7 @@ The device should answer with teh above message. The `error` value should be int
#### Controller wants the device to perform a trace
Controller sends this command when it needs the device to perform a trace (i.e. tcpdump).
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "trace" ,
"params" : {
@@ -412,7 +480,7 @@ Controller sends this command when it needs the device to perform a trace (i.e.
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -438,7 +506,7 @@ uploaded or the timeout occurs, the upload will be rejected.
#### Controller wants the device to perform a WiFi Scan
Controller sends this command when it needs the device to perform a WiFi Scan.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "wifiscan" ,
"params" : {
@@ -446,14 +514,16 @@ Controller sends this command when it needs the device to perform a WiFi Scan.
"bands" : [ "2","5","5l","5u",6" ], <optional this is a list of bands to scan: on or more bands >
"channels" : [ 1,2,3...] , <optional list of discreet channels to scan >
"verbose" : <optional boolean: true or false> (by default false),
"active" : 0 or 1 (to select passive or active scan)
"bandwidth" : <optional int: 20,40,80 in MHz>,
"active" : 0 or 1 (to select passive or active scan),
"ies": <optional: array of unsigned int 8 bits: i.e. [1,4,34,58,91]>
},
"id" : <some number>
}
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -476,7 +546,7 @@ Controller sends this command when it needs the device to provide a message back
supported messages are "state" and "healthcheck". More messages maybe added later. The messages will
be returned the usual way. The RPC response to this message just says that the request has been accepted and the
message will be returned "soon".
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "request" ,
"params" : {
@@ -490,7 +560,7 @@ message will be returned "soon".
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -506,7 +576,7 @@ The device should answer:
#### Controller requesting eventqueue buffers
Controller sends this command when it needs the device to provide the content of ist ring buffers.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "event" ,
"params" : {
@@ -520,7 +590,7 @@ Controller sends this command when it needs the device to provide the content of
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -536,7 +606,7 @@ The device should answer:
#### Controller requesting telemetry stream information
Controller sends this command when it needs the device to telemetry streaming.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "telemetry" ,
"params" : {
@@ -549,7 +619,7 @@ Controller sends this command when it needs the device to telemetry streaming.
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -563,7 +633,7 @@ The device should answer:
```
When the interval is greater than 0, the gateway will start to receive messages
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "telemetry" ,
"params" : {
@@ -578,7 +648,7 @@ The device will stop sending data after 30 minutes or if it receives a `telemetr
#### Controller requesting an `rtty` session
Controller sends this command an administrator requests to start an `rtty` session with the AP.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "remote_access" ,
"params" : {
@@ -596,7 +666,7 @@ Controller sends this command an administrator requests to start an `rtty` sessi
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -612,7 +682,7 @@ The device should answer:
#### Controller wants to ping the device
Controller sends this command when it tries to establish latency to the device.
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "ping" ,
"params" : {
@@ -623,7 +693,7 @@ Controller sends this command when it tries to establish latency to the device.
```
The device should answer:
```
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
@@ -634,8 +704,41 @@ The device should answer:
}
```
#### Controller wants the device to perform a script
Controller sends this command to run a predefined script. Extreme care must be taken.
```json
{ "jsonrpc" : "2.0" ,
"method" : "script" ,
"params" : {
"serial" : <serial number>,
"type" : <one of "shell", "ucode">,
"script" : <text blob containing the script>,
"timeout" : <max timeout in seconds, default is 30>,
"when" : <time when this will be performed as UTC seconds>
},
"id" : <some number>
}
```
#### `rtty server`
The device should answer:
```json
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
"status" : {
"error" : <0 or the value of $? from the shell running the command, 255 signifies a timeout>,
one of either
"result_64" : <gzipped base64 result of running the command>,
"result_sz" : <size of unzipped content>
or
"result" : <a single text blob of the result>
}
},
"id" : <same number>
}
```
### `rtty server`
More information about the [rtty server](https://github.com/zhaojh329/rtty) can be found here.
### Message compression
@@ -646,21 +749,48 @@ Should other messages get larger, the client may decide to compress the. Only me
#### Identifying a compressed message
A compressed message has a single member to the `params` field. It's only parameter must be called `compress_64`. Any other elements under
params will be dropped. Additional compression schemes may be developed later.
params will be dropped. Additional compression schemes may be developed later. The device should also include
a hint to the actual size of the uncompressed data. This would allow listeners to create sufficiently sized
buffers right away instead of guessing. If the device includes `compressed_sz` as the second field in the
params objects. This should be an unsigned int representing the total size of the uncompressed data.
#### How to compress
The original `params` element should be run through `zlib:compress` and then encoded using base64, and passed as a string. Here is an example
of the completed message. The following should how the `state` event could be compressed:
```
```json
{ "jsonrpc" : "2.0" ,
"method" : "state" ,
"params" : {
"compress_64" : "kqlwhfoihffhwleihfi3uhfkjehfqlkwhfqkhfiu3hffhkjwehfqkwjehfqwiefkjehq.....qwjqkfhqjwk"
"compress_64" : "kqlwhfoihffhwleihfi3uhfkjehfqlkwhfqkhfiu3hffhkjwehfqkwjehfqwiefkjehq.....qwjqkfhqjwk",
"compress_sz" : 212322
}
}
```
### 'Radius Proxying'
The gateway can receive RADIUS messages from the device and forward them. It can also receive messages
on its behalf and send them to the device.
```json
{
"radius" : <type, can be auth, acct, coa> ,
"data" : <base 64 encoded raw RADIUS payload>
}
```
The GW will include a TLV to mark the sender MAC. The RADIUS server must use the same TLV to
identify the destination for its messages.
#### Incoming RADIUS messages configuration
The GW must be configured with the following:
```asm
radius.proxy.enable = true
radius.proxy.accounting.port = 1813
radius.proxy.authentication.port = 1812
radius.proxy.coa.port = 3799
```

146
README.md
View File

@@ -11,16 +11,16 @@ In order to build the uCentralGW, you will need to install its dependencies, whi
- boost
- POCO 1.10.1 or later
- a C++17 compiler
- libyaml
- openssl
- libpq-dev (PortgreSQL development libraries)
- mysql-client (MySQL client)
- librdkafka
- cppkafka
-
The build is done in 2 parts. The first part is to build a local copy of the framework tailored to your environment. This
framework is called [Poco](https://github.com/pocoproject/poco). The version used in this project has a couple of fixes
from the master copy needed for cmake. Please use the version of this [Poco fix](https://github.com/stephb9959/poco). Building
from the master copy needed for cmake. Please use the version of this [Poco fix](https://github.com/AriliaWireless/poco). Building
Poco may take several minutes depending on the platform you are building on.
### Ubuntu
@@ -29,9 +29,10 @@ These instructions have proven to work on Ubuntu 20.4.
sudo apt install git cmake g++ libssl-dev libmariadb-dev
sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
sudo apt install librdkafka-dev // default-libmysqlclient-dev
sudo apt install nlohmann-json-dev
cd ~
git clone https://github.com/stephb9959/poco
git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1
cd poco
mkdir cmake-build
cd cmake-build
@@ -40,7 +41,7 @@ cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/stephb9959/cppkafka
git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1
cd cppkafka
mkdir cmake-build
cd cmake-build
@@ -49,16 +50,7 @@ cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/nlohmann/json.git
cd json
mkdir cmake-build
cd cmake-build
cmake ..
make -j
sudo make install
cd ~
git clone https://github.com/pboettch/json-schema-validator.git
git clone https://github.com/pboettch/json-schema-validator.git --branch 2.1.0
cd json-schema-validator
mkdir cmake-build
cd cmake-build
@@ -66,6 +58,14 @@ cmake ..
make -j
sudo make install
git clone https://github.com/fmtlib/fmt --branch 9.0.0 /fmtlib
cd fmtlib
mkdir cmake-build
cd cmake-build
cmake ..
make
make install
cd ~
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
cd wlan-cloud-ucentralgw
@@ -80,12 +80,12 @@ make -j 8
### Fedora
The following instructions have proven to work on Fedora 33
```
sudo yum install cmake g++ openssl-devel unixODBC-devel mysql-devel mysql apr-util-devel boost boost-devel
sudo yum install cmake g++ openssl-devel mysql-devel mysql apr-util-devel boost boost-devel
sudo yum install yaml-cpp-devel lua-devel
sudo dnf install postgresql.x86_64 librdkafka-devel
sudo dnf install postgresql-devel
sudo dnf install postgresql-devel json-devel
git clone https://github.com/stephb9959/poco
git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1
cd poco
mkdir cmake-build
cd cmake-build
@@ -93,7 +93,7 @@ cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
git clone https://github.com/stephb9959/cppkafka
git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1
cd cppkafka
mkdir cmake-build
cd cmake-build
@@ -101,6 +101,15 @@ cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/pboettch/json-schema-validator.git --branch 2.1.0
cd json-schema-validator
mkdir cmake-build
cd cmake-build
cmake ..
make -j
sudo make install
cd ~
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
cd wlan-cloud-ucentralgw
@@ -110,45 +119,61 @@ cmake ..
make
```
### OSX Build
The following instructions have proven to work on OSX Big Sur. You need to install [Homebrew](https://brew.sh/). You must also have installed [XCode for OS X](https://www.freecodecamp.org/news/how-to-download-and-install-xcode/).
### macOS Build
The following instructions have proven to work on macOS Big Sur. You need to install [Homebrew](https://brew.sh/). You must also have installed [XCode for OS X](https://www.freecodecamp.org/news/how-to-download-and-install-xcode/).
```
brew install openssl
brew install cmake
brew install libpq
brew install mysql-client
brew install apr
brew install apr-util
brew install boost
brew install yaml-cpp
brew install postgresql
brew install unixodbc
brew install librdkafka
brew install openssl \
cmake \
libpq \
mysql-client \
apr \
apr-util \
boost \
yaml-cpp \
postgresql \
librdkafka \
nlohmann-json \
fmt
git clone https://github.com/stephb9959/poco
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release -j
sudo cmake --build . --target install
git clone https://github.com/stephb9959/cppkafka
cd cppkafka
git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1
pushd poco
mkdir cmake-build
cd cmake-build
push cmake-build
cmake -DOPENSSL_ROOT_DIR=</path/to/openssl> -DENABLE_NETSSL=1 -DENABLE_JWT=1 -DENABLE_CRYPTO=1 ..
cmake --build . --config Release
sudo cmake --build . --target install
popd
popd
git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1
pushd cppkafka
mkdir cmake-build
pushd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
popd
popd
cd ~
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
cd wlan-cloud-ucentralgw
git clone https://github.com/pboettch/json-schema-validator.git --branch 2.1.0
pushd json-schema-validator
mkdir cmake-build
cd cmake-build
pushd cmake-build
cmake ..
make -j
sudo make install
popd
popd
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
pushd wlan-cloud-ucentralgw
mkdir cmake-build
pushd cmake-build
cmake ..
make -j
popd
popd
```
### Raspberry
@@ -248,7 +273,7 @@ little changes if you keep the suggested directory structure. For the sample con
environment variables.
```
export OWGW_ROOT=`pwd`
export UCENTRALGW_CONFIG=`pwd`
export OWGW_CONFIG=`pwd`
```
If you current working directory is the root of the project, this will set the variables properly. Otherwise, you can set the variables
to point to wherever is necessary.
@@ -560,6 +585,31 @@ Toe read more about Kafka, follow the [document](https://github.com/Telecominfra
#### Securing `kafka`
This is beyond the scope of this document. As it stands today, the communication between the gateway and `kafka` is expected to be behind a firewall.
#### `iptocountry` feature
In the UI, you will notice the presence of small flags showing where the device connections are from. This feature is
available through the `iptocountry` settings in the configuration. This feature is then also available through the `OpenAPI` for the CLI
and other applications.
##### Config file entries
In the configuration file, you must include the following lines:
```asm
iptocountry.default = US
iptocountry.provider = ipinfo
#iptocountry.provider = ipdata
#iptocountry.provider = ipdata
iptocountry.ipinfo.token =
#ip2location.ipinfo.token =
#iptocountry.ipdata.apikey =
#iptocountry.ip2location.apikey =
```
So you select your provider with the `iptocountry.provider` be specifying ipinfo, or ipdata, or ip2location.
And then you provide the corresponding api key or token.
Only select one. If you select 2, undefined behaviour. All the line you do not need, just put a `#` before to comment it
out.
You will find the supported providers at: `ip2location.com`, `ipinfo.io`, or `ipdata.co`. You MUST supply a valid default
country code in `iptocountry.default`.
## Contributors
We love ya! We need more of ya! If you want to contribute, make sure you review
the [coding style](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/CODING_STYLE.md) document.

2
build
View File

@@ -1 +1 @@
171
6

View File

@@ -1,4 +0,0 @@
#include <librdkafka/rdkafka.h>
#if RD_KAFKA_VERSION >= 0x00090400
int main() { }
#endif

Binary file not shown.

View File

@@ -1,637 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6"/>
<Project>
<Option title="ucentralgw"/>
<Option makefile_is_custom="1"/>
<Option compiler="gcc"/>
<Option virtualFolders="CMake Files\;CMake Files\..\;CMake Files\..\..\;CMake Files\..\..\..\;CMake Files\..\..\..\..\;CMake Files\..\..\..\..\..\;CMake Files\..\..\..\..\..\..\;CMake Files\..\..\..\..\..\..\usr\;CMake Files\..\..\..\..\..\..\usr\local\;CMake Files\..\..\..\..\..\..\usr\local\lib\;CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\;CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Boost-1.75.0\;CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_headers-1.75.0\;CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_system-1.75.0\;CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\CppKafka\;CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\;CMake Files\cmake\;CMake Files\cmake-build-debug\;"/>
<Build>
<Target title="all">
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option type="4"/>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 all"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="install/local">
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option type="4"/>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 install/local"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="rebuild_cache">
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option type="4"/>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 rebuild_cache"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="edit_cache">
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option type="4"/>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 edit_cache"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="install/strip">
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option type="4"/>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 install/strip"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="install">
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option type="4"/>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 install"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="list_install_components">
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option type="4"/>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 list_install_components"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="ucentralgw">
<Option output="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/ucentralgw" prefix_auto="0" extension_auto="0"/>
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option object_output="./"/>
<Option type="1"/>
<Option compiler="gcc"/>
<Compiler>
<Add option="-DAPP_VERSION=&quot;0.7.0&quot;"/>
<Add option="-DBUILD_NUMBER=&quot;120&quot;"/>
<Add option="-DTIP_GATEWAY_SERVICE=&quot;1&quot;"/>
<Add option="-D_DEBUG"/>
<Add option="-DPOCO_ENABLE_CPP14"/>
<Add option="-DPOCO_ENABLE_CPP11"/>
<Add option="-DPOCO_OS_FAMILY_UNIX"/>
<Add option="-DPOCO_HAVE_IPv6"/>
<Add option="-DPOCO_NO_STAT64"/>
<Add option="-DXML_DTD"/>
<Add option="-DTHREADSAFE"/>
<Add option="-DNO_TCL"/>
<Add option="-DBOOST_ALL_NO_LIB"/>
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src"/>
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/include/kafka"/>
<Add directory="/usr/local/opt/mysql-client/include"/>
<Add directory="/usr/local/include"/>
<Add directory="/usr/local/opt/openssl/include"/>
<Add directory="/usr/local/opt/mysql-client/include/mysql"/>
<Add directory="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1"/>
<Add directory="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.5/include"/>
<Add directory="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include"/>
<Add directory="/System/Library/Frameworks"/>
<Add directory="/Library/Frameworks"/>
</Compiler>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 ucentralgw"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="ucentralgw/fast">
<Option output="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/ucentralgw" prefix_auto="0" extension_auto="0"/>
<Option working_dir="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug"/>
<Option object_output="./"/>
<Option type="1"/>
<Option compiler="gcc"/>
<Compiler>
<Add option="-DAPP_VERSION=&quot;0.7.0&quot;"/>
<Add option="-DBUILD_NUMBER=&quot;120&quot;"/>
<Add option="-DTIP_GATEWAY_SERVICE=&quot;1&quot;"/>
<Add option="-D_DEBUG"/>
<Add option="-DPOCO_ENABLE_CPP14"/>
<Add option="-DPOCO_ENABLE_CPP11"/>
<Add option="-DPOCO_OS_FAMILY_UNIX"/>
<Add option="-DPOCO_HAVE_IPv6"/>
<Add option="-DPOCO_NO_STAT64"/>
<Add option="-DXML_DTD"/>
<Add option="-DTHREADSAFE"/>
<Add option="-DNO_TCL"/>
<Add option="-DBOOST_ALL_NO_LIB"/>
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src"/>
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/include/kafka"/>
<Add directory="/usr/local/opt/mysql-client/include"/>
<Add directory="/usr/local/include"/>
<Add directory="/usr/local/opt/openssl/include"/>
<Add directory="/usr/local/opt/mysql-client/include/mysql"/>
<Add directory="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1"/>
<Add directory="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.5/include"/>
<Add directory="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include"/>
<Add directory="/System/Library/Frameworks"/>
<Add directory="/Library/Frameworks"/>
</Compiler>
<MakeCommands>
<Build command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 ucentralgw/fast"/>
<CompileFile command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/local/bin/gmake -j16 -f &quot;/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
</Build>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/build">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/ALBHealthCheckServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/AuthClient.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/AuthClient.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CentralConfig.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CentralConfig.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandChannel.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandChannel.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandManager.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandManager.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Daemon.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Daemon.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/DeviceRegistry.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/DeviceRegistry.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/FileUploader.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/FileUploader.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/KafkaManager.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/KafkaManager.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Kafka_topics.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/MicroService.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/MicroService.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OUIServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OUIServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OpenAPIRequest.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OpenAPIRequest.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_BlackList.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_BlackList.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_GWobjects.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_GWobjects.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_InternalServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_InternalServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_RPC.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_RPC.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_SecurityObjects.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_SecurityObjects.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_command.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_command.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_commands.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_commands.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_default_configuration.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_default_configuration.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_default_configurations.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_default_configurations.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_device_commandHandler.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_device_commandHandler.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_device_handler.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_device_handler.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_devices_handler.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_devices_handler.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_file.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_file.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_handler.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_handler.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_ouis.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_ouis.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_protocol.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_server.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_server.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_system_command.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_system_command.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_utils.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_utils.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StateProcessor.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StateProcessor.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageArchiver.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageArchiver.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageService.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageService.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/SubSystemServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/SubSystemServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Utils.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Utils.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/WebSocketServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/WebSocketServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_blacklist.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_capabilities.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_command.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_defconfig.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_device.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_healthcheck.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_lifetime_stats.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_logs.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_mysql.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_pgql.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_sqlite.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_statistics.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_tables.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralProtocol.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralTypes.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/CMakeLists.txt">
<Option virtualFolder="CMake Files\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/BoostDetectToolset-1.75.0.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Boost-1.75.0/BoostConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Boost-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Boost-1.75.0/BoostConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Boost-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/boost_headers-1.75.0/boost_headers-config-version.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_headers-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/boost_headers-1.75.0/boost_headers-config.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_headers-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/boost_system-1.75.0/boost_system-config-version.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_system-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/boost_system-1.75.0/boost_system-config.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_system-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/boost_system-1.75.0/libboost_system-variant-mt-shared.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_system-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/boost_system-1.75.0/libboost_system-variant-mt-static.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_system-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/boost_system-1.75.0/libboost_system-variant-shared.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_system-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/boost_system-1.75.0/libboost_system-variant-static.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\boost_system-1.75.0\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/CppKafka/CppKafkaConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\CppKafka\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/CppKafka/CppKafkaConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\CppKafka\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/CppKafka/CppKafkaTargets-noconfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\CppKafka\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/CppKafka/CppKafkaTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\CppKafka\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake/FindMySQL.cmake">
<Option virtualFolder="CMake Files\cmake\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake/FindPostgreSQL.cmake">
<Option virtualFolder="CMake Files\cmake\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake/FindRdKafka.cmake">
<Option virtualFolder="CMake Files\cmake\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/cmake-build-debug/rdkafka_version_test.cpp">
<Option virtualFolder="CMake Files\cmake-build-debug\"/>
</Unit>
</Project>
</CodeBlocks_project_file>

View File

@@ -1,26 +0,0 @@
tip:
port: 6051
server: ssc.wlan.local
username: support@example.com
password: support
certificates:
keyfile: keyfile.pem
certfile: certfile.pem
password: mypassword
ucentral:
port: 1991
listeners: 100
logger:
size: 10
days: 31
ui:
port: 9771
username: support@example.com
password: support

View File

@@ -1,71 +1,101 @@
#!/bin/sh
#!/bin/bash
set -e
if [ "$SELFSIGNED_CERTS" = 'true' ]; then
update-ca-certificates
fi
if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWGW_CONFIG"/owgw.properties ]]; then
WEBSOCKET_HOST_ROOTCA=${WEBSOCKET_HOST_ROOTCA:-"\$OWGW_ROOT/certs/root.pem"} \
WEBSOCKET_HOST_ISSUER=${WEBSOCKET_HOST_ISSUER:-"\$OWGW_ROOT/certs/issuer.pem"} \
WEBSOCKET_HOST_CERT=${WEBSOCKET_HOST_CERT:-"\$OWGW_ROOT/certs/websocket-cert.pem"} \
WEBSOCKET_HOST_KEY=${WEBSOCKET_HOST_KEY:-"\$OWGW_ROOT/certs/websocket-key.pem"} \
WEBSOCKET_HOST_CLIENTCAS=${WEBSOCKET_HOST_CLIENTCAS:-"\$OWGW_ROOT/certs/clientcas.pem"} \
WEBSOCKET_HOST_CAS=${WEBSOCKET_HOST_CAS:-"\$OWGW_ROOT/certs/cas"} \
WEBSOCKET_HOST_PORT=${WEBSOCKET_HOST_PORT:-"15002"} \
WEBSOCKET_HOST_KEY_PASSWORD=${WEBSOCKET_HOST_KEY_PASSWORD:-"mypassword"} \
RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$OWGW_ROOT/certs/restapi-ca.pem"} \
RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16002"} \
RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$OWGW_ROOT/certs/restapi-cert.pem"} \
RESTAPI_HOST_KEY=${RESTAPI_HOST_KEY:-"\$OWGW_ROOT/certs/restapi-key.pem"} \
RESTAPI_HOST_KEY_PASSWORD=${RESTAPI_HOST_KEY_PASSWORD:-"mypassword"} \
INTERNAL_RESTAPI_HOST_ROOTCA=${INTERNAL_RESTAPI_HOST_ROOTCA:-"\$OWGW_ROOT/certs/restapi-ca.pem"} \
INTERNAL_RESTAPI_HOST_PORT=${INTERNAL_RESTAPI_HOST_PORT:-"17002"} \
INTERNAL_RESTAPI_HOST_CERT=${INTERNAL_RESTAPI_HOST_CERT:-"\$OWGW_ROOT/certs/restapi-cert.pem"} \
INTERNAL_RESTAPI_HOST_KEY=${INTERNAL_RESTAPI_HOST_KEY:-"\$OWGW_ROOT/certs/restapi-key.pem"} \
INTERNAL_RESTAPI_HOST_KEY_PASSWORD=${INTERNAL_RESTAPI_HOST_KEY_PASSWORD:-"mypassword"} \
FILEUPLOADER_HOST_ROOTCA=${FILEUPLOADER_HOST_ROOTCA:-"\$OWGW_ROOT/certs/restapi-ca.pem"} \
FILEUPLOADER_HOST_NAME=${FILEUPLOADER_HOST_NAME:-"localhost"} \
FILEUPLOADER_HOST_PORT=${FILEUPLOADER_HOST_PORT:-"16003"} \
FILEUPLOADER_HOST_CERT=${FILEUPLOADER_HOST_CERT:-"\$OWGW_ROOT/certs/restapi-cert.pem"} \
FILEUPLOADER_HOST_KEY=${FILEUPLOADER_HOST_KEY:-"\$OWGW_ROOT/certs/restapi-key.pem"} \
FILEUPLOADER_HOST_KEY_PASSWORD=${FILEUPLOADER_HOST_KEY_PASSWORD:-"mypassword"} \
FILEUPLOADER_PATH=${FILEUPLOADER_PATH:-"\$OWGW_ROOT/uploads"} \
FILEUPLOADER_URI=${FILEUPLOADER_URI:-"https://localhost:16003"} \
SERVICE_KEY=${SERVICE_KEY:-"\$OWGW_ROOT/certs/restapi-key.pem"} \
SERVICE_KEY_PASSWORD=${SERVICE_KEY_PASSWORD:-"mypassword"} \
SYSTEM_DATA=${SYSTEM_DATA:-"\$OWGW_ROOT/data"} \
SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17002"} \
SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16002"} \
SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
SIMULATORID=${SIMULATORID:-""} \
RTTY_ENABLED=${RTTY_ENABLED:-"false"} \
RTTY_SERVER=${RTTY_SERVER:-"localhost"} \
RTTY_PORT=${RTTY_PORT:-"5912"} \
RTTY_TOKEN=${RTTY_TOKEN:-"96181c567b4d0d98c50f127230068fa8"} \
RTTY_TIMEOUT=${RTTY_TIMEOUT:-"60"} \
RTTY_VIEWPORT=${RTTY_VIEWPORT:-"5913"} \
KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \
KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \
STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \
STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \
STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"owgw"} \
STORAGE_TYPE_POSTGRESQL_PASSWORD=${STORAGE_TYPE_POSTGRESQL_PASSWORD:-"owgw"} \
STORAGE_TYPE_POSTGRESQL_DATABASE=${STORAGE_TYPE_POSTGRESQL_DATABASE:-"owgw"} \
STORAGE_TYPE_POSTGRESQL_PORT=${STORAGE_TYPE_POSTGRESQL_PORT:-"5432"} \
STORAGE_TYPE_MYSQL_HOST=${STORAGE_TYPE_MYSQL_HOST:-"localhost"} \
STORAGE_TYPE_MYSQL_USERNAME=${STORAGE_TYPE_MYSQL_USERNAME:-"owgw"} \
STORAGE_TYPE_MYSQL_PASSWORD=${STORAGE_TYPE_MYSQL_PASSWORD:-"owgw"} \
STORAGE_TYPE_MYSQL_DATABASE=${STORAGE_TYPE_MYSQL_DATABASE:-"owgw"} \
STORAGE_TYPE_MYSQL_PORT=${STORAGE_TYPE_MYSQL_PORT:-"3306"} \
envsubst < /owgw.properties.tmpl > $OWGW_CONFIG/owgw.properties
if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
WEBSOCKET_HOST_ROOTCA=${WEBSOCKET_HOST_ROOTCA:-"\$OWGW_ROOT/certs/root.pem"} \
WEBSOCKET_HOST_ISSUER=${WEBSOCKET_HOST_ISSUER:-"\$OWGW_ROOT/certs/issuer.pem"} \
WEBSOCKET_HOST_CERT=${WEBSOCKET_HOST_CERT:-"\$OWGW_ROOT/certs/websocket-cert.pem"} \
WEBSOCKET_HOST_KEY=${WEBSOCKET_HOST_KEY:-"\$OWGW_ROOT/certs/websocket-key.pem"} \
WEBSOCKET_HOST_CLIENTCAS=${WEBSOCKET_HOST_CLIENTCAS:-"\$OWGW_ROOT/certs/clientcas.pem"} \
WEBSOCKET_HOST_CAS=${WEBSOCKET_HOST_CAS:-"\$OWGW_ROOT/certs/cas"} \
WEBSOCKET_HOST_PORT=${WEBSOCKET_HOST_PORT:-"15002"} \
WEBSOCKET_HOST_KEY_PASSWORD=${WEBSOCKET_HOST_KEY_PASSWORD:-"mypassword"} \
RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$OWGW_ROOT/certs/restapi-ca.pem"} \
RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16002"} \
RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$OWGW_ROOT/certs/restapi-cert.pem"} \
RESTAPI_HOST_KEY=${RESTAPI_HOST_KEY:-"\$OWGW_ROOT/certs/restapi-key.pem"} \
RESTAPI_HOST_KEY_PASSWORD=${RESTAPI_HOST_KEY_PASSWORD:-"mypassword"} \
INTERNAL_RESTAPI_HOST_ROOTCA=${INTERNAL_RESTAPI_HOST_ROOTCA:-"\$OWGW_ROOT/certs/restapi-ca.pem"} \
INTERNAL_RESTAPI_HOST_PORT=${INTERNAL_RESTAPI_HOST_PORT:-"17002"} \
INTERNAL_RESTAPI_HOST_CERT=${INTERNAL_RESTAPI_HOST_CERT:-"\$OWGW_ROOT/certs/restapi-cert.pem"} \
INTERNAL_RESTAPI_HOST_KEY=${INTERNAL_RESTAPI_HOST_KEY:-"\$OWGW_ROOT/certs/restapi-key.pem"} \
INTERNAL_RESTAPI_HOST_KEY_PASSWORD=${INTERNAL_RESTAPI_HOST_KEY_PASSWORD:-"mypassword"} \
FILEUPLOADER_HOST_ROOTCA=${FILEUPLOADER_HOST_ROOTCA:-"\$OWGW_ROOT/certs/restapi-ca.pem"} \
FILEUPLOADER_HOST_NAME=${FILEUPLOADER_HOST_NAME:-"localhost"} \
FILEUPLOADER_HOST_PORT=${FILEUPLOADER_HOST_PORT:-"16003"} \
FILEUPLOADER_HOST_CERT=${FILEUPLOADER_HOST_CERT:-"\$OWGW_ROOT/certs/restapi-cert.pem"} \
FILEUPLOADER_HOST_KEY=${FILEUPLOADER_HOST_KEY:-"\$OWGW_ROOT/certs/restapi-key.pem"} \
FILEUPLOADER_HOST_KEY_PASSWORD=${FILEUPLOADER_HOST_KEY_PASSWORD:-"mypassword"} \
FILEUPLOADER_PATH=${FILEUPLOADER_PATH:-"\$OWGW_ROOT/uploads"} \
FILEUPLOADER_URI=${FILEUPLOADER_URI:-"https://localhost:16003"} \
SERVICE_KEY=${SERVICE_KEY:-"\$OWGW_ROOT/certs/restapi-key.pem"} \
SERVICE_KEY_PASSWORD=${SERVICE_KEY_PASSWORD:-"mypassword"} \
SYSTEM_DATA=${SYSTEM_DATA:-"\$OWGW_ROOT/data"} \
SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17002"} \
SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16002"} \
SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
SECURITY_RESTAPI_DISABLE=${SECURITY_RESTAPI_DISABLE:-"false"} \
SIMULATORID=${SIMULATORID:-""} \
IPTOCOUNTRY_PROVIDER=${IPTOCOUNTRY_PROVIDER:-"ipinfo"} \
IPTOCOUNTRY_IPINFO_TOKEN=${IPTOCOUNTRY_IPINFO_TOKEN:-""} \
IPTOCOUNTRY_IPDATA_APIKEY=${IPTOCOUNTRY_IPDATA_APIKEY:-""} \
AUTOPROVISIONING_PROCESS=${AUTOPROVISIONING_PROCESS:-"prov,default"} \
RTTY_INTERNAL=${RTTY_INTERNAL:-"true"} \
RTTY_ENABLED=${RTTY_ENABLED:-"true"} \
RTTY_SERVER=${RTTY_SERVER:-"localhost"} \
RTTY_PORT=${RTTY_PORT:-"5912"} \
RTTY_TOKEN=${RTTY_TOKEN:-""} \
RTTY_TIMEOUT=${RTTY_TIMEOUT:-"60"} \
RTTY_VIEWPORT=${RTTY_VIEWPORT:-"5913"} \
RTTY_ASSETS=${RTTY_ASSETS:-"\$OWGW_ROOT/rtty_ui"} \
RADIUS_PROXY_ENABLE=${RADIUS_PROXY_ENABLE:-"false"} \
RADIUS_PROXY_ACCOUNTING_PORT=${RADIUS_PROXY_ACCOUNTING_PORT:-"1813"} \
RADIUS_PROXY_AUTHENTICATION_PORT=${RADIUS_PROXY_AUTHENTICATION_PORT:-"1812"} \
RADIUS_PROXY_COA_PORT=${RADIUS_PROXY_COA_PORT:-"3799"} \
KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \
KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \
KAFKA_SSL_CA_LOCATION=${KAFKA_SSL_CA_LOCATION:-""} \
KAFKA_SSL_CERTIFICATE_LOCATION=${KAFKA_SSL_CERTIFICATE_LOCATION:-""} \
KAFKA_SSL_KEY_LOCATION=${KAFKA_SSL_KEY_LOCATION:-""} \
KAFKA_SSL_KEY_PASSWORD=${KAFKA_SSL_KEY_PASSWORD:-""} \
STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \
STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \
STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"owgw"} \
STORAGE_TYPE_POSTGRESQL_PASSWORD=${STORAGE_TYPE_POSTGRESQL_PASSWORD:-"owgw"} \
STORAGE_TYPE_POSTGRESQL_DATABASE=${STORAGE_TYPE_POSTGRESQL_DATABASE:-"owgw"} \
STORAGE_TYPE_POSTGRESQL_PORT=${STORAGE_TYPE_POSTGRESQL_PORT:-"5432"} \
STORAGE_TYPE_MYSQL_HOST=${STORAGE_TYPE_MYSQL_HOST:-"localhost"} \
STORAGE_TYPE_MYSQL_USERNAME=${STORAGE_TYPE_MYSQL_USERNAME:-"owgw"} \
STORAGE_TYPE_MYSQL_PASSWORD=${STORAGE_TYPE_MYSQL_PASSWORD:-"owgw"} \
STORAGE_TYPE_MYSQL_DATABASE=${STORAGE_TYPE_MYSQL_DATABASE:-"owgw"} \
STORAGE_TYPE_MYSQL_PORT=${STORAGE_TYPE_MYSQL_PORT:-"3306"} \
envsubst < /owgw.properties.tmpl > $OWGW_CONFIG/owgw.properties
fi
# Check if rtty_ui directory exists
export RTTY_ASSETS=$(grep 'rtty.assets' $OWGW_CONFIG/owgw.properties | awk -F '=' '{print $2}' | xargs | envsubst)
if [ -z "$RTTY_ASSETS" ]; then
export RTTY_ASSETS="$OWGW_ROOT/rtty_ui"
fi
if [[ ! -d "$(dirname $RTTY_ASSETS)" ]]; then
mkdir -p $(dirname $RTTY_ASSETS)
fi
if [[ ! -d "$RTTY_ASSETS" ]]; then
cp -r /dist/rtty_ui $RTTY_ASSETS
fi
if [ "$1" = '/openwifi/owgw' -a "$(id -u)" = '0' ]; then
if [ "$RUN_CHOWN" = 'true' ]; then
chown -R "$OWGW_USER": "$OWGW_ROOT" "$OWGW_CONFIG"
chown -R "$OWGW_USER": "$OWGW_ROOT" "$OWGW_CONFIG"
fi
exec su-exec "$OWGW_USER" "$@"
exec gosu "$OWGW_USER" "$@"
fi
exec "$@"

View File

@@ -1,14 +0,0 @@
USERNAME=arilia
HUBNAME=tip-tip-wlan-cloud-ucentral.jfrog.io
IMAGE_NAME=ucentralgw
echo "Removing docker images before build..."
docker rmi -f $(docker images -a -q)
echo "Building $IMAGE_NAME image..."
docker build --no-cache --tag $IMAGE_NAME .
IMAGE_ID=`docker images -q $IMAGE_NAME`
docker login --username=$USERNAME $HUBNAME
docker tag $IMAGE_ID $HUBNAME/$IMAGE_NAME:latest
echo "Updating $HUBNAME with the latest $IMAGE_NAME image..."
docker push $HUBNAME/$IMAGE_NAME
docker logout $HUBNAME

View File

@@ -1,5 +0,0 @@
#!/bin/sh
# Removes all local images. This is dangerous but good when debugging
docker rmi -f $(docker images -a -q)

View File

@@ -1,43 +0,0 @@
#!/bin/sh
HUBNAME=tip-tip-wlan-cloud-ucentral.jfrog.io
IMAGE_NAME=ucentralgw
DOCKER_NAME=$HUBNAME/$IMAGE_NAME:master
CONTAINER_NAME=ucentralgw
#stop previously running images
docker container stop $CONTAINER_NAME
docker container rm $CONTAINER_NAME --force
if [[ ! -d logs ]]
then
mkdir logs
fi
if [[ ! -d uploads ]]
then
mkdir uploads
fi
if [[ ! -d certs ]]
then
echo "certs directory does not exist. Please create and add the proper certificates."
exit 1
fi
if [[ ! -f owgw.properties ]]
then
echo "Configuration file ucentral.properties is missing in the current directory"
exit 2
fi
docker run -d -p 15002:15002 \
-p 16001:16001 \
-p 16003:16003 \
--init \
--volume="$PWD:/ucentral-data" \
-e UCENTRALGW_ROOT="/ucentral-data" \
-e UCENTRALGW_CONFIG="/ucentral-data" \
--name="ucentralgw" $DOCKER_NAME

View File

@@ -1,12 +1,12 @@
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 10.9.2
- name: mysql
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 8.8.3
- name: mariadb
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 9.4.2
digest: sha256:1fdae7cbea906e41dccd8618ff9e2c68d0c684724ae27c79a12bb6089968df5c
generated: "2021-08-17T12:18:40.341427893+03:00"
digest: sha256:e9df5a5d8a0a193bfda33ea06060203aace01f0f7df9eda662a84185322c7ab5
generated: "2022-06-03T15:38:31.063022252+03:00"

View File

@@ -5,14 +5,14 @@ name: owgw
version: 0.1.0
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 10.9.2
condition: postgresql.enabled
- name: mysql
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 8.8.3
condition: mysql.enabled
- name: mariadb
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 9.4.2
condition: mariadb.enabled

View File

@@ -79,7 +79,8 @@ The following table lists the configurable parameters of the chart and their def
| persistence.size | string | Defines PV size | `'10Gi'` |
| public_env_variables | hash | Defines list of environment variables to be passed to the Gateway | |
| configProperties | hash | Configuration properties that should be passed to the application in `owgw.properties`. May be passed by key in set (i.e. `configProperties."rtty\.token"`) | |
| certs | hash | Defines files (keys and certificates) that should be passed to the Gateway (PEM format is adviced to be used) (see `volumes.owgw` on where it is mounted) | |
| existingCertsSecret | string | Existing Kubernetes secret containing all required certificates and private keys for microservice operation. If set, certificates from `certs` key are ignored | `""` |
| certs | hash | Defines files (keys and certificates) that should be passed to the Gateway (PEM format is adviced to be used) (see `volumes.owgw` on where it is mounted). If `existingCertsSecret` is set, certificates passed this way will not be used. | |
| certsCAs | hash | Defines files with CAs that should be passed to the Gateway (see `volumes.owgw` on where it is mounted) | |

View File

@@ -30,3 +30,13 @@ Create chart name and version as used by the chart label.
{{- define "owgw.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- define "owgw.ingress.apiVersion" -}}
{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" -}}
{{- print "networking.k8s.io/v1" -}}
{{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}}
{{- print "networking.k8s.io/v1beta1" -}}
{{- else -}}
{{- print "extensions/v1beta1" -}}
{{- end -}}
{{- end -}}

View File

@@ -1,4 +1,5 @@
{{- $root := . -}}
{{- $storageType := index .Values.configProperties "storage.type" -}}
---
apiVersion: apps/v1
kind: Deployment
@@ -48,6 +49,38 @@ spec:
- tcp://{{ index .Values.configProperties "openwifi.kafka.brokerlist" }}
- -timeout
- 600s
{{- if eq $storageType "postgresql" }}
- name: wait-postgres
image: "{{ .Values.images.owgw.repository }}:{{ .Values.images.owgw.tag }}"
imagePullPolicy: {{ .Values.images.owgw.pullPolicy }}
command:
- /wait-for-postgres.sh
- {{ index .Values.configProperties "storage.type.postgresql.host" }}
- echo
- "PostgreSQL is ready"
env:
- name: KUBERNETES_DEPLOYED
value: "{{ now }}"
{{- range $key, $value := .Values.public_env_variables }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- end }}
{{- range $key, $value := .Values.secret_env_variables }}
- name: {{ $key }}
valueFrom:
secretKeyRef:
name: {{ include "owgw.fullname" $root }}-env
key: {{ $key }}
{{- end }}
volumeMounts:
{{- range .Values.volumes.owgw }}
- name: {{ .name }}
mountPath: {{ .mountPath }}
{{- if .subPath }}
subPath: {{ .subPath }}
{{- end }}
{{- end }}
{{- end }}
containers:
@@ -76,6 +109,11 @@ spec:
containerPort: {{ $portValue.targetPort }}
protocol: {{ $portValue.protocol }}
{{- end }}
{{- range $port, $portValue := .Values.services.radius.ports }}
- name: {{ $port }}
containerPort: {{ $portValue.targetPort }}
protocol: {{ $portValue.protocol }}
{{- end }}
volumeMounts:
{{- range .Values.volumes.owgw }}

View File

@@ -2,7 +2,7 @@
{{- range $ingress, $ingressValue := .Values.ingresses }}
{{- if $ingressValue.enabled }}
---
apiVersion: extensions/v1beta1
apiVersion: {{ include "owgw.ingress.apiVersion" $root }}
kind: Ingress
metadata:
name: {{ include "owgw.fullname" $root }}-{{ $ingress }}
@@ -36,9 +36,23 @@ spec:
paths:
{{- range $ingressValue.paths }}
- path: {{ .path }}
{{- if $root.Capabilities.APIVersions.Has "networking.k8s.io/v1" }}
pathType: {{ .pathType | default "ImplementationSpecific" }}
{{- end }}
backend:
{{- if $root.Capabilities.APIVersions.Has "networking.k8s.io/v1" }}
service:
name: {{ include "owgw.fullname" $root }}-{{ .serviceName }}
port:
{{- if kindIs "string" .servicePort }}
name: {{ .servicePort }}
{{- else }}
number: {{ .servicePort }}
{{- end }}
{{- else }}
serviceName: {{ include "owgw.fullname" $root }}-{{ .serviceName }}
servicePort: {{ .servicePort }}
{{- end }}
{{- end }}
{{- end }}

View File

@@ -9,7 +9,7 @@ fullnameOverride: ""
images:
owgw:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
tag: master
tag: v2.7.1-RC2
pullPolicy: Always
# regcred:
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
@@ -40,6 +40,27 @@ services:
servicePort: 16003
targetPort: 16003
protocol: TCP
rttys:
servicePort: 5912
targetPort: 5912
rttys-view:
servicePort: 5913
targetPort: 5913
radius:
type: ClusterIP
ports:
acc:
servicePort: 1813
targetPort: 1813
protocol: UDP
auth:
servicePort: 1812
targetPort: 1812
protocol: UDP
coa:
servicePort: 3799
targetPort: 3799
protocol: UDP
checks:
owgw:
@@ -62,6 +83,7 @@ ingresses:
- restapi.chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
serviceName: owgw
servicePort: restapi
fileuploader:
@@ -73,6 +95,7 @@ ingresses:
- fileuploader.chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
serviceName: owgw
servicePort: fileuploader
@@ -89,7 +112,7 @@ volumes:
mountPath: /owgw-data/certs
volumeDefinition: |
secret:
secretName: {{ include "owgw.fullname" . }}-certs
secretName: {{ if .Values.existingCertsSecret }}{{ .Values.existingCertsSecret }}{{ else }}{{ include "owgw.fullname" . }}-certs{{ end }}
- name: certs-cas
mountPath: /owgw-data/certs/cas
volumeDefinition: |
@@ -115,7 +138,7 @@ resources: {}
# memory: 128Mi
securityContext:
fsGroup: 101
fsGroup: 1000
# Usage of unsafe sysctls requires multiple things:
# - allow these unsafe sysctls on kubelet level (by adding --allowed-unsafe-sysctls flag)
# - enabling addition of PodSecurityContext setting podSecurityPolicy.enabled to "true" below
@@ -207,19 +230,27 @@ configProperties:
openwifi.devicetypes.0: AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
openwifi.devicetypes.1: SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2: IOT:esp32
oui.download.uri: https://linuxnet.ca/ieee/oui.txt
oui.download.uri: https://standards-oui.ieee.org/oui/oui.txt
firmware.autoupdate.policy.default: auto
iptocountry.provider: ipinfo
# Callback
openwifi.callback.enable: "false"
openwifi.callback.0.local: localhost:16001
openwifi.callback.0.remote: localhost:15055
openwifi.callback.0.topics: owfws
# rtty
rtty.internal: "true"
rtty.enabled: "true"
rtty.server: localhost
rtty.port: 5912
rtty.timeout: 60
rtty.viewport: 5913
rtty.assets: $OWGW_ROOT/rtty_ui
# RADIUS proxy
radius.proxy.enable: "true"
radius.proxy.accounting.port: 1813
radius.proxy.authentication.port: 1812
radius.proxy.coa.port: 3799
# ALB
alb.enable: "true"
alb.port: 16102
@@ -230,6 +261,10 @@ configProperties:
openwifi.kafka.brokerlist: localhost:9092
openwifi.kafka.auto.commit: false
openwifi.kafka.queue.buffering.max.ms: 50
openwifi.kafka.ssl.ca.location: ""
openwifi.kafka.ssl.certificate.location: ""
openwifi.kafka.ssl.key.location: ""
openwifi.kafka.ssl.key.password: ""
# Storage
storage.type: sqlite # (sqlite|postgresql|mysql|odbc)
## SQLite
@@ -256,6 +291,7 @@ configProperties:
openwifi.system.debug: "true"
openwifi.system.uri.private: https://localhost:17002
openwifi.system.uri.public: https://localhost:16002
openwifi.system.uri.ui: https://localhost
openwifi.system.commandchannel: /tmp/app_owgw
# Logging
logging.type: console
@@ -295,166 +331,22 @@ configProperties:
storage.type.mysql.username: stephb
storage.type.mysql.password: snoopy99
# NOTE: List of required certificates may be found in "certs" key. Alternative way to pass required certificates is to create external secret with all required certificates and set secret name in "existingCertsSecret" key. Details may be found in https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/main/chart#tldr
existingCertsSecret: ""
certs:
clientcas.pem: |
-----BEGIN CERTIFICATE-----
MIIEnDCCA4SgAwIBAgIUVpyCUx1MUeUwxg+7I1BvGFTz7HkwDQYJKoZIhvcNAQEL
BQAwaTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG1RlbGVjb20gSW5mcmEgUHJvamVj
dCwgSW5jLjEMMAoGA1UECxMDVElQMSYwJAYDVQQDEx1UZWxlY29tIEluZnJhIFBy
b2plY3QgUm9vdCBDQTAeFw0yMTA0MTMyMjUxMjZaFw0yNjA0MTMyMjM4NDZaMGwx
CzAJBgNVBAYTAlVTMSQwIgYDVQQKExtUZWxlY29tIEluZnJhIFByb2plY3QsIElu
Yy4xDDAKBgNVBAsTA1RJUDEpMCcGA1UEAxMgVGVsZWNvbSBJbmZyYSBQcm9qZWN0
IElzc3VpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtKBrq
qd2aKVSk25KfL5xHu8X7/8rJrz3IvyPuVKWhk/N1zabot3suBcGaYNKjnRHxg78R
yKwKzajKYWtiQFqztu24g16LQeAnoUxZnF6a0z3JkkRPsz14A2y8TUhdEe1tx+UU
4VGsk3n+FMmOQHL+79FO57zQC1LwylgfLSltrI6mF3jowVUQvnwzKhUzT87AJ6EO
ndK/q0T/Bgi+aI39zfVOjJjsTJwghvrmYW3iarP1THSKxeib2s02bZKrvvHa5HL4
UI8+LvREpVZl4mzt1z6Nl344Y6f+UeJlYa/Ci0jJqaXJmyVnUbAz+c0i5JfwAVn3
YQzfC4eLnZCmdF8zAgMBAAGjggE3MIIBMzAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
DgQWBBSzG1S44EerPfM4gOQ85f0AYW3R6DAfBgNVHSMEGDAWgBQCRpZgebFT9qny
98WfIUDk6ZEB+jAOBgNVHQ8BAf8EBAMCAYYwgYMGCCsGAQUFBwEBBHcwdTAoBggr
BgEFBQcwAYYcaHR0cDovL29jc3Aub25lLmRpZ2ljZXJ0LmNvbTBJBggrBgEFBQcw
AoY9aHR0cDovL2NhY2VydHMub25lLmRpZ2ljZXJ0LmNvbS9UZWxlY29tSW5mcmFQ
cm9qZWN0Um9vdENBLmNydDBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vY3JsLm9u
ZS5kaWdpY2VydC5jb20vVGVsZWNvbUluZnJhUHJvamVjdFJvb3RDQS5jcmwwDQYJ
KoZIhvcNAQELBQADggEBAFbz+K94bHIkBMJqps0dApniUmOn0pO6Q6cGh47UP/kX
IiPIsnYgG+hqYD/qtsiqJhaWi0hixRWn38UmvZxMRk27aSTGE/TWx0JTC3qDGsSe
XkUagumbSfmS0ZyiTwMPeGAjXwyzGorqZWeA95eKfImntMiOf3E7//GK0K7HpCx8
IPCnLZsZD2q/mLyBsduImFIRQJbLAhwIxpcd1qYJk+BlGFL+HtBpEbq6JxW2Xy+v
DpNWc2WIsUTle0rTc9JNJrLX4ChUJmKqf8obKHap3Xh3//qw/jDB9pOAinA33FLJ
EmCnwBvQr9mfNmPBGMYZVU8cPruDQJ57GjmmvdisbJY=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIUPVYBpqNbcLYygF6Mx+qxSWwQyFowDQYJKoZIhvcNAQEL
BQAwaTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG1RlbGVjb20gSW5mcmEgUHJvamVj
dCwgSW5jLjEMMAoGA1UECxMDVElQMSYwJAYDVQQDEx1UZWxlY29tIEluZnJhIFBy
b2plY3QgUm9vdCBDQTAeFw0yMTA0MTMyMjQyNDRaFw0zMTA0MTMyMjM4NDZaMGkx
CzAJBgNVBAYTAlVTMSQwIgYDVQQKExtUZWxlY29tIEluZnJhIFByb2plY3QsIElu
Yy4xDDAKBgNVBAsTA1RJUDEmMCQGA1UEAxMdVGVsZWNvbSBJbmZyYSBQcm9qZWN0
IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIGCibwf5u
AAwZ+1H8U0e3u2V+0d2gSctucoK86XwUmfe1V2a/qlCYZd29r80IuN1IIeB0naIm
KnK/MzXW87clF6tFd1+HzEvmlY/W4KyIXalVCTEzirFSvBEG2oZpM0yC3AefytAO
aOpA00LaM3xTfTqMKIRhJBuLy0I4ANUVG6ixVebbGuc78IodleqiLoWy2Q9QHyEO
t/7hZndJhiVogh0PveRhho45EbsACu7ymDY+JhlIleevqwlE3iQoq0YcmYADHno6
Eq8vcwLpZFxihupUafkd1T3WJYQAJf9coCjBu2qIhNgrcrGD8R9fGswwNRzMRMpX
720+GjcDW3bJAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAJG
lmB5sVP2qfL3xZ8hQOTpkQH6MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
AAOCAQEAVjl9dm4epG9NUYnagT9sg7scVQEPfz3Lt6w1NXJXgD8mAUlK0jXmEyvM
dCPD4514n+8+lM7US8fh+nxc7jO//LwK17Wm9FblgjNFR7+anv0Q99T9fP19DLlF
PSNHL2emogy1bl1lLTAoj8nxg2wVKPDSHBGviQ5LR9fsWUIJDv9Bs5k0qWugWYSj
19S6qnHeskRDB8MqRLhKMG82oDVLerSnhD0P6HjySBHgTTU7/tYS/OZr1jI6MPbG
L+/DtiR5fDVMNdBSGU89UNTi0wHY9+RFuNlIuvZC+x/swF0V9R5mN+ywquTPtDLA
5IOM7ItsRmen6u3qu+JXros54e4juQ==
-----END CERTIFICATE-----
issuer.pem: |
-----BEGIN CERTIFICATE-----
MIIEnDCCA4SgAwIBAgIUVpyCUx1MUeUwxg+7I1BvGFTz7HkwDQYJKoZIhvcNAQEL
BQAwaTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG1RlbGVjb20gSW5mcmEgUHJvamVj
dCwgSW5jLjEMMAoGA1UECxMDVElQMSYwJAYDVQQDEx1UZWxlY29tIEluZnJhIFBy
b2plY3QgUm9vdCBDQTAeFw0yMTA0MTMyMjUxMjZaFw0yNjA0MTMyMjM4NDZaMGwx
CzAJBgNVBAYTAlVTMSQwIgYDVQQKExtUZWxlY29tIEluZnJhIFByb2plY3QsIElu
Yy4xDDAKBgNVBAsTA1RJUDEpMCcGA1UEAxMgVGVsZWNvbSBJbmZyYSBQcm9qZWN0
IElzc3VpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtKBrq
qd2aKVSk25KfL5xHu8X7/8rJrz3IvyPuVKWhk/N1zabot3suBcGaYNKjnRHxg78R
yKwKzajKYWtiQFqztu24g16LQeAnoUxZnF6a0z3JkkRPsz14A2y8TUhdEe1tx+UU
4VGsk3n+FMmOQHL+79FO57zQC1LwylgfLSltrI6mF3jowVUQvnwzKhUzT87AJ6EO
ndK/q0T/Bgi+aI39zfVOjJjsTJwghvrmYW3iarP1THSKxeib2s02bZKrvvHa5HL4
UI8+LvREpVZl4mzt1z6Nl344Y6f+UeJlYa/Ci0jJqaXJmyVnUbAz+c0i5JfwAVn3
YQzfC4eLnZCmdF8zAgMBAAGjggE3MIIBMzAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
DgQWBBSzG1S44EerPfM4gOQ85f0AYW3R6DAfBgNVHSMEGDAWgBQCRpZgebFT9qny
98WfIUDk6ZEB+jAOBgNVHQ8BAf8EBAMCAYYwgYMGCCsGAQUFBwEBBHcwdTAoBggr
BgEFBQcwAYYcaHR0cDovL29jc3Aub25lLmRpZ2ljZXJ0LmNvbTBJBggrBgEFBQcw
AoY9aHR0cDovL2NhY2VydHMub25lLmRpZ2ljZXJ0LmNvbS9UZWxlY29tSW5mcmFQ
cm9qZWN0Um9vdENBLmNydDBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vY3JsLm9u
ZS5kaWdpY2VydC5jb20vVGVsZWNvbUluZnJhUHJvamVjdFJvb3RDQS5jcmwwDQYJ
KoZIhvcNAQELBQADggEBAFbz+K94bHIkBMJqps0dApniUmOn0pO6Q6cGh47UP/kX
IiPIsnYgG+hqYD/qtsiqJhaWi0hixRWn38UmvZxMRk27aSTGE/TWx0JTC3qDGsSe
XkUagumbSfmS0ZyiTwMPeGAjXwyzGorqZWeA95eKfImntMiOf3E7//GK0K7HpCx8
IPCnLZsZD2q/mLyBsduImFIRQJbLAhwIxpcd1qYJk+BlGFL+HtBpEbq6JxW2Xy+v
DpNWc2WIsUTle0rTc9JNJrLX4ChUJmKqf8obKHap3Xh3//qw/jDB9pOAinA33FLJ
EmCnwBvQr9mfNmPBGMYZVU8cPruDQJ57GjmmvdisbJY=
-----END CERTIFICATE-----
# restapi-ca.pem: ""
# restapi-cert.pem: ""
# restapi-key.pem: ""
root.pem: |
-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIUPVYBpqNbcLYygF6Mx+qxSWwQyFowDQYJKoZIhvcNAQEL
BQAwaTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG1RlbGVjb20gSW5mcmEgUHJvamVj
dCwgSW5jLjEMMAoGA1UECxMDVElQMSYwJAYDVQQDEx1UZWxlY29tIEluZnJhIFBy
b2plY3QgUm9vdCBDQTAeFw0yMTA0MTMyMjQyNDRaFw0zMTA0MTMyMjM4NDZaMGkx
CzAJBgNVBAYTAlVTMSQwIgYDVQQKExtUZWxlY29tIEluZnJhIFByb2plY3QsIElu
Yy4xDDAKBgNVBAsTA1RJUDEmMCQGA1UEAxMdVGVsZWNvbSBJbmZyYSBQcm9qZWN0
IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIGCibwf5u
AAwZ+1H8U0e3u2V+0d2gSctucoK86XwUmfe1V2a/qlCYZd29r80IuN1IIeB0naIm
KnK/MzXW87clF6tFd1+HzEvmlY/W4KyIXalVCTEzirFSvBEG2oZpM0yC3AefytAO
aOpA00LaM3xTfTqMKIRhJBuLy0I4ANUVG6ixVebbGuc78IodleqiLoWy2Q9QHyEO
t/7hZndJhiVogh0PveRhho45EbsACu7ymDY+JhlIleevqwlE3iQoq0YcmYADHno6
Eq8vcwLpZFxihupUafkd1T3WJYQAJf9coCjBu2qIhNgrcrGD8R9fGswwNRzMRMpX
720+GjcDW3bJAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAJG
lmB5sVP2qfL3xZ8hQOTpkQH6MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
AAOCAQEAVjl9dm4epG9NUYnagT9sg7scVQEPfz3Lt6w1NXJXgD8mAUlK0jXmEyvM
dCPD4514n+8+lM7US8fh+nxc7jO//LwK17Wm9FblgjNFR7+anv0Q99T9fP19DLlF
PSNHL2emogy1bl1lLTAoj8nxg2wVKPDSHBGviQ5LR9fsWUIJDv9Bs5k0qWugWYSj
19S6qnHeskRDB8MqRLhKMG82oDVLerSnhD0P6HjySBHgTTU7/tYS/OZr1jI6MPbG
L+/DtiR5fDVMNdBSGU89UNTi0wHY9+RFuNlIuvZC+x/swF0V9R5mN+ywquTPtDLA
5IOM7ItsRmen6u3qu+JXros54e4juQ==
-----END CERTIFICATE-----
# websocket-cert.pem: ""
# websocket-key.pem: ""
clientcas.pem: ""
issuer.pem: ""
restapi-ca.pem: ""
restapi-cert.pem: ""
restapi-key.pem: ""
root.pem: ""
websocket-cert.pem: ""
websocket-key.pem: ""
certsCAs:
issuer.pem: |
-----BEGIN CERTIFICATE-----
MIIEnDCCA4SgAwIBAgIUVpyCUx1MUeUwxg+7I1BvGFTz7HkwDQYJKoZIhvcNAQEL
BQAwaTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG1RlbGVjb20gSW5mcmEgUHJvamVj
dCwgSW5jLjEMMAoGA1UECxMDVElQMSYwJAYDVQQDEx1UZWxlY29tIEluZnJhIFBy
b2plY3QgUm9vdCBDQTAeFw0yMTA0MTMyMjUxMjZaFw0yNjA0MTMyMjM4NDZaMGwx
CzAJBgNVBAYTAlVTMSQwIgYDVQQKExtUZWxlY29tIEluZnJhIFByb2plY3QsIElu
Yy4xDDAKBgNVBAsTA1RJUDEpMCcGA1UEAxMgVGVsZWNvbSBJbmZyYSBQcm9qZWN0
IElzc3VpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtKBrq
qd2aKVSk25KfL5xHu8X7/8rJrz3IvyPuVKWhk/N1zabot3suBcGaYNKjnRHxg78R
yKwKzajKYWtiQFqztu24g16LQeAnoUxZnF6a0z3JkkRPsz14A2y8TUhdEe1tx+UU
4VGsk3n+FMmOQHL+79FO57zQC1LwylgfLSltrI6mF3jowVUQvnwzKhUzT87AJ6EO
ndK/q0T/Bgi+aI39zfVOjJjsTJwghvrmYW3iarP1THSKxeib2s02bZKrvvHa5HL4
UI8+LvREpVZl4mzt1z6Nl344Y6f+UeJlYa/Ci0jJqaXJmyVnUbAz+c0i5JfwAVn3
YQzfC4eLnZCmdF8zAgMBAAGjggE3MIIBMzAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
DgQWBBSzG1S44EerPfM4gOQ85f0AYW3R6DAfBgNVHSMEGDAWgBQCRpZgebFT9qny
98WfIUDk6ZEB+jAOBgNVHQ8BAf8EBAMCAYYwgYMGCCsGAQUFBwEBBHcwdTAoBggr
BgEFBQcwAYYcaHR0cDovL29jc3Aub25lLmRpZ2ljZXJ0LmNvbTBJBggrBgEFBQcw
AoY9aHR0cDovL2NhY2VydHMub25lLmRpZ2ljZXJ0LmNvbS9UZWxlY29tSW5mcmFQ
cm9qZWN0Um9vdENBLmNydDBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vY3JsLm9u
ZS5kaWdpY2VydC5jb20vVGVsZWNvbUluZnJhUHJvamVjdFJvb3RDQS5jcmwwDQYJ
KoZIhvcNAQELBQADggEBAFbz+K94bHIkBMJqps0dApniUmOn0pO6Q6cGh47UP/kX
IiPIsnYgG+hqYD/qtsiqJhaWi0hixRWn38UmvZxMRk27aSTGE/TWx0JTC3qDGsSe
XkUagumbSfmS0ZyiTwMPeGAjXwyzGorqZWeA95eKfImntMiOf3E7//GK0K7HpCx8
IPCnLZsZD2q/mLyBsduImFIRQJbLAhwIxpcd1qYJk+BlGFL+HtBpEbq6JxW2Xy+v
DpNWc2WIsUTle0rTc9JNJrLX4ChUJmKqf8obKHap3Xh3//qw/jDB9pOAinA33FLJ
EmCnwBvQr9mfNmPBGMYZVU8cPruDQJ57GjmmvdisbJY=
-----END CERTIFICATE-----
root.pem: |
-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIUPVYBpqNbcLYygF6Mx+qxSWwQyFowDQYJKoZIhvcNAQEL
BQAwaTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG1RlbGVjb20gSW5mcmEgUHJvamVj
dCwgSW5jLjEMMAoGA1UECxMDVElQMSYwJAYDVQQDEx1UZWxlY29tIEluZnJhIFBy
b2plY3QgUm9vdCBDQTAeFw0yMTA0MTMyMjQyNDRaFw0zMTA0MTMyMjM4NDZaMGkx
CzAJBgNVBAYTAlVTMSQwIgYDVQQKExtUZWxlY29tIEluZnJhIFByb2plY3QsIElu
Yy4xDDAKBgNVBAsTA1RJUDEmMCQGA1UEAxMdVGVsZWNvbSBJbmZyYSBQcm9qZWN0
IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIGCibwf5u
AAwZ+1H8U0e3u2V+0d2gSctucoK86XwUmfe1V2a/qlCYZd29r80IuN1IIeB0naIm
KnK/MzXW87clF6tFd1+HzEvmlY/W4KyIXalVCTEzirFSvBEG2oZpM0yC3AefytAO
aOpA00LaM3xTfTqMKIRhJBuLy0I4ANUVG6ixVebbGuc78IodleqiLoWy2Q9QHyEO
t/7hZndJhiVogh0PveRhho45EbsACu7ymDY+JhlIleevqwlE3iQoq0YcmYADHno6
Eq8vcwLpZFxihupUafkd1T3WJYQAJf9coCjBu2qIhNgrcrGD8R9fGswwNRzMRMpX
720+GjcDW3bJAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAJG
lmB5sVP2qfL3xZ8hQOTpkQH6MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
AAOCAQEAVjl9dm4epG9NUYnagT9sg7scVQEPfz3Lt6w1NXJXgD8mAUlK0jXmEyvM
dCPD4514n+8+lM7US8fh+nxc7jO//LwK17Wm9FblgjNFR7+anv0Q99T9fP19DLlF
PSNHL2emogy1bl1lLTAoj8nxg2wVKPDSHBGviQ5LR9fsWUIJDv9Bs5k0qWugWYSj
19S6qnHeskRDB8MqRLhKMG82oDVLerSnhD0P6HjySBHgTTU7/tYS/OZr1jI6MPbG
L+/DtiR5fDVMNdBSGU89UNTi0wHY9+RFuNlIuvZC+x/swF0V9R5mN+ywquTPtDLA
5IOM7ItsRmen6u3qu+JXros54e4juQ==
-----END CERTIFICATE-----
issuer.pem: ""
root.pem: ""
# PostgreSQL (https://github.com/bitnami/charts/tree/master/bitnami/postgresql)
postgresql:

View File

@@ -31,58 +31,13 @@ components:
responses:
NotFound:
description: The specified resource was not found.
content:
application/json:
schema:
properties:
ErrorCode:
type: integer
ErrorDetails:
type: string
ErrorDescription:
type: string
$ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/NotFound'
Unauthorized:
description: The requested does not have sufficient rights to perform the operation.
content:
application/json:
schema:
properties:
ErrorCode:
type: integer
enum:
- 0 # Success
- 1 # PASSWORD_CHANGE_REQUIRED,
- 2 # INVALID_CREDENTIALS,
- 3 # PASSWORD_ALREADY_USED,
- 4 # USERNAME_PENDING_VERIFICATION,
- 5 # PASSWORD_INVALID,
- 6 # INTERNAL_ERROR,
- 7 # ACCESS_DENIED,
- 8 # INVALID_TOKEN
- 9 # EXPIRED_TOKEN
- 10 # RATE_LIMIT_EXCEEDED
- 11 # BAD_MFA_TRANSACTION
- 12 # MFA_FAILURE
- 13 # SECURITY_SERVICE_UNREACHABLE
ErrorDetails:
type: string
ErrorDescription:
type: string
$ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/Unauthorized'
Success:
description: The requested operation was performed.
content:
application/json:
schema:
properties:
Operation:
type: string
Details:
type: string
Code:
type: integer
$ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/Success'
BadRequest:
$ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/BadRequest'
schemas:
DeviceType:
@@ -139,6 +94,19 @@ components:
type: string
devicePassword:
type: string
subscriber:
type: string
format: uuid
entity:
type: string
format: uuid
modified:
type: integer
format: int64
locale:
type: string
minLength: 2
maxLength: 2
DeviceWithStatus:
type: object
@@ -209,6 +177,31 @@ components:
lastContact:
type: integer
format: int64
subscriber:
type: string
format: uuid
entity:
type: string
format: uuid
modified:
type: integer
format: int64
locale:
type: string
minLength: 2
maxLength: 2
started:
type: integer
format: int64
sessionId:
type: integer
format: int64
connectionCompletionTime:
type: number
format: double
totalConnectionTime:
type: integer
format: int64
DeviceList:
type: object
@@ -301,6 +294,17 @@ components:
type: integer
format: int64
DeviceConnectionStatistics:
type: object
description: Return some basic device statistics.
properties:
connectedDevices:
type: integer
format: int64
averageConnectionTime:
type: integer
format: int64
StatisticsDetails:
type: object
properties:
@@ -484,6 +488,31 @@ components:
type: integer
format: int64
ScriptRequest:
type: object
properties:
serialNumber:
type: string
timeout:
type: integer
format: int64
default: 30
type:
type: string
enum:
- uci
- ucode
- shell
script:
type: string
scriptId:
type: string
format: uuid
when:
type: integer
format: int64
default: 0
FactoryRequest:
type: object
properties:
@@ -950,6 +979,12 @@ components:
oneOf:
- $ref: '#/components/schemas/WifiBands'
- $ref: '#/components/schemas/WifiChannels'
ies:
type: array
items:
type: integer
minimum: 0
maximum: 255
required:
- serialNumber
@@ -1021,6 +1056,99 @@ components:
items:
$ref: '#/components/schemas/CapabilitiesModel'
RadiusProxyServerEntry:
type: object
properties:
name:
type: string
ip:
type: string
format: ip-addr
port:
type: integer
weight:
type: integer
secret:
type: string
certificate:
type: string
radsec:
type: boolean
default: false
radsecPort:
type: integer
minimum: 1
maximum: 65535
radsecSecret:
type: string
radsecCacerts:
type: array
items:
type: string
radsecCert:
type: string
description: this must be the base64 encoded of the entire content of the certificate file, including the -----BEGIN lines
radsecKey:
type: string
description: this must be the base64 encoded of the entire content of the key file, including the -----BEGIN lines
radsecRealms:
description: each entry must be the base64 encoded of the entire content of the ca files, including the -----BEGIN lines
type: array
items:
type: string
ignore:
type: boolean
default: false
RadiusProxyServerConfig:
type: object
properties:
strategy:
type: string
enum:
- random
- round_robin
- weighted
monitor:
type: boolean
default: false
monitorMethod:
type: string
enum:
- none
- https
- radius
methodParameters:
type: array
items:
type: string
servers:
type: array
items:
$ref: '#/components/schemas/RadiusProxyServerEntry'
RadiusProxyPool:
type: object
properties:
name:
type: string
description:
type: string
authConfig:
$ref: '#/components/schemas/RadiusProxyServerConfig'
acctConfig:
$ref: '#/components/schemas/RadiusProxyServerConfig'
coaConfig:
$ref: '#/components/schemas/RadiusProxyServerConfig'
RadiusProxyPoolList:
type: object
properties:
pools:
type: array
items:
$ref: '#/components/schemas/RadiusProxyPool'
paths:
/devices:
get:
@@ -1070,6 +1198,27 @@ paths:
name: deviceWithStatus
schema:
type: boolean
- in: query
description: return extended information
name: orderBy
schema:
type: string
example: serialNumber:a,created:d
required: false
- in: query
description: return extended information
name: orderSpec
schema:
type: boolean
default: false
required: false
- in: query
description: return extended information
name: connectionStatistics
schema:
type: boolean
default: false
required: false
responses:
200:
description: List devices
@@ -1081,6 +1230,7 @@ paths:
- $ref: '#/components/schemas/DeviceListWithStatus'
- $ref: '#/components/schemas/SerialNumberList'
- $ref: '#/components/schemas/DeviceCount'
- $ref: '#/components/schemas/DeviceConnectionStatistics'
403:
$ref: '#/components/responses/Unauthorized'
404:
@@ -1966,6 +2116,32 @@ paths:
404:
$ref: '#/components/responses/NotFound'
/device/{serialNumber}/script:
post:
tags:
- Commands
summary: Debug a device.
operationId: debugDevice
parameters:
- in: path
name: serialNumber
schema:
type: string
required: true
requestBody:
description: Command details
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptRequest'
responses:
200:
$ref: '#/components/schemas/CommandInfo'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/device/{serialNumber}/factory:
post:
tags:
@@ -2407,6 +2583,45 @@ paths:
404:
$ref: '#/components/responses/NotFound'
/radiusProxyConfig:
get:
tags:
- RADIUSProxy
summary: Retrieve RADIUS Proxy configuration.
operationId: getRadiusProxyConfig
responses:
200:
$ref: '#/components/schemas/RadiusProxyPoolList'
403:
$ref: '#/components/responses/Unauthorized'
put:
tags:
- RADIUSProxy
summary: Modify RADIUS Proxy configuration.
operationId: modifyRadiusProxyConfig
requestBody:
description: Change RADIUS configuration pool config
content:
application/json:
schema:
$ref: '#/components/schemas/RadiusProxyPoolList'
responses:
200:
$ref: '#/components/schemas/RadiusProxyPoolList'
403:
$ref: '#/components/responses/Unauthorized'
delete:
tags:
- RADIUSProxy
summary: Delete RADIUS Proxy configuration.
operationId: deleteRadiusProxyConfig
responses:
204:
$ref: '#/components/responses/Success'
403:
$ref: '#/components/responses/Unauthorized'
/deviceDashboard:
get:
tags:

View File

@@ -65,6 +65,7 @@ openwifi.system.debug = true
openwifi.system.uri.private = https://localhost:17002
openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16002
openwifi.system.uri.ui = https://ucentral-ui.arilia.com
openwifi.security.restapi.disable = false
openwifi.system.commandchannel = /tmp/app.ucentralgw
#
@@ -74,7 +75,7 @@ openwifi.autoprovisioning = true
openwifi.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2 = IOT:esp32
oui.download.uri = https://linuxnet.ca/ieee/oui.txt
oui.download.uri = https://standards-oui.ieee.org/oui/oui.txt
iptocountry.default = US
iptocountry.provider = ipinfo
@@ -96,6 +97,12 @@ rtty.timeout = 60
rtty.viewport = 5913
rtty.assets = $OWGW_ROOT/rtty_ui
### RADIUS proxy config
radius.proxy.enable = false
radius.proxy.accounting.port = 1813
radius.proxy.authentication.port = 1812
radius.proxy.coa.port = 3799
#############################
# Generic information for all micro services
#############################
@@ -115,6 +122,11 @@ openwifi.kafka.brokerlist = a1.arilia.com:9092
openwifi.kafka.auto.commit = false
openwifi.kafka.queue.buffering.max.ms = 50
openwifi.kafka.ssl.ca.location =
openwifi.kafka.ssl.certificate.location =
openwifi.kafka.ssl.key.location =
openwifi.kafka.ssl.key.password =
#
# This section select which form of persistence you need
# Only one selected at a time. If you select multiple, this service will die if a horrible
@@ -166,4 +178,4 @@ archiver.db.3.keep = 7
########################################################################
logging.type = file
logging.path = $OWGW_ROOT/logs
logging.level = debug
logging.level = information

View File

@@ -52,8 +52,8 @@ openwifi.fileuploader.host.0.cert = ${FILEUPLOADER_HOST_CERT}
openwifi.fileuploader.host.0.key = ${FILEUPLOADER_HOST_KEY}
openwifi.fileuploader.host.0.key.password = ${FILEUPLOADER_HOST_KEY_PASSWORD}
openwifi.fileuploader.path = ${FILEUPLOADER_PATH}
openwifi.fileuploader.uri = ${FILEUPLOADER_URI}
openwifi.fileuploader.maxsize = 10000
openwifi.fileuploader.uri = ${FILEUPLOADER_URI}
#
# Generic section that all microservices must have
@@ -65,6 +65,7 @@ openwifi.system.debug = true
openwifi.system.uri.private = ${SYSTEM_URI_PRIVATE}
openwifi.system.uri.public = ${SYSTEM_URI_PUBLIC}
openwifi.system.uri.ui = ${SYSTEM_URI_UI}
openwifi.security.restapi.disable = ${SECURITY_RESTAPI_DISABLE}
openwifi.system.commandchannel = /tmp/app.ucentralgw
#
@@ -74,19 +75,32 @@ openwifi.autoprovisioning = true
openwifi.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2 = IOT:esp32
oui.download.uri = https://linuxnet.ca/ieee/oui.txt
firmware.autoupdate.policy.default = auto
oui.download.uri = https://standards-oui.ieee.org/oui/oui.txt
simulatorid = ${SIMULATORID}
iptocountry.default = US
iptocountry.provider = ${IPTOCOUNTRY_PROVIDER}
iptocountry.ipinfo.token = ${IPTOCOUNTRY_IPINFO_TOKEN}
iptocountry.ipdata.apikey = ${IPTOCOUNTRY_IPDATA_APIKEY}
autoprovisioning.process = ${AUTOPROVISIONING_PROCESS}
#
# rtty
#
rtty.internal = ${RTTY_INTERNAL}
rtty.enabled = ${RTTY_ENABLED}
rtty.server = ${RTTY_SERVER}
rtty.port = ${RTTY_PORT}
rtty.token = ${RTTY_TOKEN}
rtty.timeout = ${RTTY_TIMEOUT}
rtty.viewport = ${RTTY_VIEWPORT}
rtty.assets = ${RTTY_ASSETS}
### RADIUS proxy config
radius.proxy.enable = ${RADIUS_PROXY_ENABLE}
radius.proxy.accounting.port = ${RADIUS_PROXY_ACCOUNTING_PORT}
radius.proxy.authentication.port = ${RADIUS_PROXY_AUTHENTICATION_PORT}
radius.proxy.coa.port = ${RADIUS_PROXY_COA_PORT}
#############################
# Generic information for all micro services
@@ -107,6 +121,11 @@ openwifi.kafka.brokerlist = ${KAFKA_BROKERLIST}
openwifi.kafka.auto.commit = false
openwifi.kafka.queue.buffering.max.ms = 50
openwifi.kafka.ssl.ca.location = ${KAFKA_SSL_CA_LOCATION}
openwifi.kafka.ssl.certificate.location = ${KAFKA_SSL_CERTIFICATE_LOCATION}
openwifi.kafka.ssl.key.location = ${KAFKA_SSL_KEY_LOCATION}
openwifi.kafka.ssl.key.password = ${KAFKA_SSL_KEY_PASSWORD}
#
# This section select which form of persistence you need
# Only one selected at a time. If you select multiple, this service will die if a horrible
@@ -155,4 +174,4 @@ archiver.db.3.keep = 7
########################################################################
logging.type = console
logging.path = $OWGW_ROOT/logs
logging.level = debug
logging.level = information

205
radius-proxy-orion.json Normal file
View File

@@ -0,0 +1,205 @@
{
"interfaces": [
{
"ethernet": [
{
"select-ports": [
"WAN*"
]
}
],
"ipv4": {
"addressing": "dynamic"
},
"ipv6": {
"addressing": "dynamic"
},
"name": "wan",
"role": "upstream",
"services": [
"ssh"
],
"ssids": []
},
{
"ethernet": [
{
"select-ports": [
"LAN*"
]
}
],
"ipv4": {
"addressing": "static",
"dhcp": {
"lease-count": 100,
"lease-first": 10,
"lease-time": "6h"
},
"gateway": "192.168.1.1",
"send-hostname": true,
"subnet": "192.168.1.1/24",
"use-dns": []
},
"ipv6": {
"addressing": "dynamic"
},
"name": "lan",
"role": "downstream",
"services": [
"wifi-steering",
"ssh"
],
"ssids": [
{
"bss-mode": "ap",
"encryption": {
"ieee80211w": "required",
"proto": "wpa"
},
"hidden-ssid": false,
"isolate-clients": false,
"maximum-clients": 64,
"name": "arilia-rad",
"radius": {
"authentication": {
"host": "0.0.0.0",
"port": 1812,
"secret": "radsec"
},
"accounting": {
"host": "0.0.0.0",
"port": 1813,
"secret": "radsec"
}
},
"services": [
"radius-gw-proxy"
],
"wifi-bands": [
"2G",
"5G"
],
"pass-point": {
"venue-name": [
"eng:Example passpoint_venue",
"fra:Exemple de lieu"
],
"domain-name": [
"onboard.almondlabs.net",
"test.com"
],
"asra": false,
"internet": true,
"esr": false,
"uesa": false,
"access-network-type": 0,
"hessid":"11:22:33:44:55:66",
"venue-group": 2,
"venue-type": 8,
"connection-capability":[
"1:0:2",
"6:22:1",
"17:5060:0"
],
"roaming-consortium": [
"F4F5E8F5F4",
"BAA2D00100",
"BAA2D00000"
],
"disable-dgaf": true,
"anqp-domain": 8888,
"ipaddr-type-available": 14,
"nai-realm": [
],
"osen": false,
"anqp-3gpp-cell-net": [
],
"friendly-name": [
"eng:AlmondLabs",
"fra:AlmondLabs"
],
"venue-url": [
"http://www.example.com/info-fra",
"http://www.example.com/info-eng"
],
"auth-type": {
"type": "terms-and-conditions"
}
}
}
]
}
],
"metrics": {
"dhcp-snooping": {
"filters": [
"ack",
"discover",
"offer",
"request",
"solicit",
"reply",
"renew"
]
},
"health": {
"interval": 60
},
"statistics": {
"interval": 60,
"types": [
"ssids",
"lldp",
"clients"
]
},
"wifi-frames": {
"filters": [
"probe",
"auth",
"assoc",
"disassoc",
"deauth",
"local-deauth",
"inactive-deauth",
"key-mismatch",
"beacon-report",
"radar-detected"
]
}
},
"radios": [
{
"band": "2G",
"bandwidth": 10,
"beacon-interval": 100,
"channel": "auto",
"channel-mode": "HT",
"channel-width": 20,
"country": "CA",
"dtim-period": 2,
"maximum-clients": 64,
"tx-power": 0
},
{
"band": "5G",
"bandwidth": 20,
"beacon-interval": 100,
"channel": "auto",
"channel-mode": "HE",
"channel-width": 40,
"country": "CA",
"dtim-period": 2,
"maximum-clients": 64,
"tx-power": 0
}
],
"services": {
"ssh": {
"password-authentication": true,
"port": 22
}
},
"uuid": 1661312631
}

72
radius_config_sample.json Normal file
View File

@@ -0,0 +1,72 @@
{
"pools" : [
{
"name" : "master" ,
"description" : "master pool",
"useByDefault" : true,
"authConfig" : {
"strategy" : "weighted",
"monitor" : false,
"monitorMethod" : "none",
"methodParameters" : [],
"servers" : [ {
"name" : "svr1",
"ip" : "10.100.0.1",
"port" : 1812,
"weight" : 10,
"secret" : "my_secret!"
},
{
"name" : "svr2",
"ip" : "10.100.10.1",
"port" : 1812,
"weight" : 20,
"secret" : "my_secret!"
}
]
},
"acctConfig" : {
"strategy" : "random",
"monitor" : false,
"monitorMethod" : "none",
"methodParameters" : [],
"servers" : [ {
"name" : "svr1",
"ip" : "10.100.0.1",
"port" : 1813,
"weight" : 10,
"secret" : "my_secret!"
},
{
"name" : "svr2",
"ip" : "10.100.10.1",
"port" : 1813,
"weight" : 20,
"secret" : "my_secret!"
}
]
},
"coaConfig" : {
"strategy" : "round_robin",
"monitor" : false,
"monitorMethod" : "none",
"methodParameters" : [],
"servers" : [ {
"name" : "svr1",
"ip" : "10.100.0.1",
"port" : 3799,
"weight" : 10,
"secret" : "my_secret!"
},
{
"name" : "svr2",
"ip" : "10.100.10.1",
"port" : 3799,
"weight" : 20,
"secret" : "my_secret!"
}
]
}
}
]
}

32
radsec-config-sample.json Normal file
View File

@@ -0,0 +1,32 @@
{
"pools" : [
{
"name" : "master" ,
"description" : "master pool",
"useByDefault" : true,
"authConfig" : {
"strategy" : "weighted",
"monitor" : false,
"monitorMethod" : "none",
"methodParameters" : [],
"servers" : [ {
"name" : "orion",
"ip" : "216.239.32.91",
"port" : 2083,
"weight" : 10,
"radsec" : true,
"radsecPort" : 2083,
"radsecSecret" : "radsec",
"radsecKey" : "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUR6RnpXeTZlYXg0QVoxTySG9VUURRZ0FFS3BnWVBHMktPTVd2S0w1Z3NMRXpUc09rREg1M3NHaEQyS3RsRXBDTXVnNDNIZlFnTFVpUgpTR1R2S1l0bDFmbmJaU1lnY0RJdncxdjNYRy9hVDhOY2JBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=",
"radsecCert" : "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNRVENDQWVpZ0F3SUJBZ0lVY3BKS3pVM0Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBb1RDa0oxZEhSdmJuZHZiMlF4SFRBYkJnTlZCQU1URkVKMQpkSFJ2Ym5kdmIyUWdVbUZrYzJWaklFTkJNQjRYRFRJeU1EY3dNekExTWpVeE5Gb1hEVEkzTURVeE9UQTFNalV4Ck5Gb3dkVEVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFvVENrSjFkSFJ2Ym5kdmIyUXhOakEwQmdOVkJBTVQKTFdGeWFXeHBZUzVqWWpFd2FtTnVjemgxYlhCbk9HWnBjRFowTUM1dmNtbHZiaTVoY21WaE1USXdMbU52YlRFWgpNQmNHQ2dtU0pvbVQ4aXhrQVFFVENVZHZiMmRzWlRwVlV6QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VICkEwSUFCQ3FZR0R4dGlqakZyeWkrWUxDeE0wN0RwQXgrZDdCb1E5aXJaUktRakxvT054MzBJQzFJa1Voazd5bUwKWmRYNTIyVW1JSEF5TDhOYjkxeHYyay9EWEd5amdZa3dnWVl3RGdZRFZSMFBBUUgvQkFRREFnZUFNQk1HQTFVZApKUVFNTUFvR0NDc0dBUVVGQndNQ01Bd0dBMVVkRXdFQi93UUNNQUF3T0FZRFZSMFJCREV3TDRJdFlYSnBiR2xoCkxtTmlNVEJxWTI1ek9IVnRjR2M0Wm1sd05uUXdMbTl5YVc5dUxtRnlaV0V4TWpBdVkyOXRNQmNHQTFVZElBUVEKTUE0d0RBWUtLd1lCQkFIdUtnRUJCVEFLQmdncWhrak9QUVFEQWdOSEFEQkVBaUFwTmM1dUNBSkp6KzVyakdqdwpCWGtOdHE3UU83bWU5dUg5bkNsTDZnSVE5Z0lnUHM2VkVKVW5CcEZ0RktXbFF4eWJ1YlBxYnpJNjBPSERHQ0ExCmhXUk1PS1U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
"radsecCacerts" : [
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ0akNDQVZ1Z0F3SUJBZ0lCQyOXZaREVkTUJzR0ExVUVBeE1VUW5WMGRHOXVkMjl2WkNCU1lXUnpaV01nUTBFdwpJQmNOTVRrd05qQTJNVFV4TlRNeVdoZ1BNalV4T1RBMk1EY3hOVEUxTXpKYU1FRXhDekFKQmdOVkJBWVRBbFZUCk1STXdFUVlEVlFRS0V3cENkWFIwYjI1M2IyOWtNUjB3R3dZRFZRUURFeFJDZFhSMGIyNTNiMjlrSUZKaFpITmwKWXlCRFFUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJJUW40QVBKaXdvUVFQblR1cFgrZTk1Ugp0ZzVoQVFVbUhCN1E0UkpwSG4welF6TUJpMDdSejkxV05RamFHeERydktLVlQ1OThIM2dxYkI4TTViOHN3aytqClFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQ2hEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBZ1lJS3dZQkJRVUgKQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQTkrbHUwN2NlaGc1OQpxSi81dWtzN05oL3F2aXFHWCs1WDFwSVVxdENGVlJjQ0lRREZmUGhwZzZJOFE0SUdBbzNuamlHRTdDWC9nMm56CkRzSW5FcG9vRlkxV0xRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
],
"radsecRealms" : [],
"ignore" : false
}
]
}
}
]
}

View File

@@ -1 +1,26 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>Rttys</title><link href="/css/app.0e046291.css" rel="preload" as="style"><link href="/css/chunk-vendors.b221ddbd.css" rel="preload" as="style"><link href="/js/app.79bf330a.js" rel="preload" as="script"><link href="/js/chunk-vendors.7fd2577a.js" rel="preload" as="script"><link href="/css/chunk-vendors.b221ddbd.css" rel="stylesheet"><link href="/css/app.0e046291.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but Rttys doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.7fd2577a.js"></script><script src="/js/app.79bf330a.js"></script></body></html>
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="/favicon.ico">
<title>RTTYs</title>
<link href="/css/app.0e046291.css" rel="preload" as="style">
<link href="/css/chunk-vendors.b221ddbd.css" rel="preload" as="style">
<link href="/css/chunk-vendors.b221ddbd.css" rel="stylesheet">
<link href="/css/app.0e046291.css" rel="stylesheet">
<link href="/js/app.79bf330a.js" rel="preload" as="script">
<link href="/js/chunk-vendors.7fd2577a.js" rel="preload" as="script">
</head>
<body>
<noscript>
<strong>We're sorry but Rttys doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<script src="/js/chunk-vendors.7fd2577a.js">
</script><script src="/js/app.79bf330a.js">
</script>
</body>
</html>

24
run.sh
View File

@@ -1,24 +0,0 @@
#!/bin/bash
daemon=ucentralgw
if [[ "$1" == "aws" ]]
then
cp ${daemon}.properties.aws ${daemon}.properties
. ./set_env.sh
cd cmake-build
./${daemon} --daemon
echo "Running AWS version as daemon..."
fi
if [[ "$1" == "priv" ]]
then
cp ${daemon}.properties.priv ${daemon}.properties
. ./set_env.sh
cd cmake-build
./${daemon} --daemon
echo "Running private version as daemon..."
fi

813
src/AP_WS_Connection.cpp Normal file
View File

@@ -0,0 +1,813 @@
//
// Created by stephane bourque on 2022-02-03.
//
#include "AP_WS_Connection.h"
#include "Poco/Net/SecureStreamSocketImpl.h"
#include "Poco/Net/HTTPServerResponseImpl.h"
#include "Poco/Net/HTTPServerRequestImpl.h"
#include "Poco/Net/NetException.h"
#include "Poco/Net/SSLException.h"
#include "Poco/Net/Context.h"
#include "Poco/Base64Decoder.h"
#include "Poco/zlib.h"
#include "AP_WS_Server.h"
#include "CentralConfig.h"
#include "CommandManager.h"
#include "ConfigurationCache.h"
#include "StorageService.h"
#include "TelemetryStream.h"
#include "framework/WebSocketClientNotifications.h"
#include "Poco/Net/WebSocketImpl.h"
#include "RADIUS_proxy_server.h"
namespace OpenWifi {
#define DBL { std::cout << __LINE__ << " ID: " << ConnectionId_ << " Ser: " << SerialNumber_ << std::endl; }
void AP_WS_Connection::LogException(const Poco::Exception &E) {
poco_information(Logger_,fmt::format("EXCEPTION({}): {}", CId_, E.displayText()));
}
AP_WS_Connection::AP_WS_Connection(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response,
std::uint64_t connection_id,
Poco::Logger &L,
Poco::Net::SocketReactor &R)
: Logger_(L) ,
Reactor_(R)
{
State_.sessionId = connection_id;
WS_ = std::make_unique<Poco::Net::WebSocket>(request,response);
auto TS = Poco::Timespan(360, 0);
WS_->setMaxPayloadSize(BufSize);
WS_->setReceiveTimeout(TS);
WS_->setNoDelay(true);
WS_->setKeepAlive(true);
WS_->setBlocking(false);
Reactor_.addEventHandler(
*WS_, Poco::NObserver<AP_WS_Connection, Poco::Net::ReadableNotification>(
*this, &AP_WS_Connection::OnSocketReadable));
Reactor_.addEventHandler(
*WS_, Poco::NObserver<AP_WS_Connection, Poco::Net::ShutdownNotification>(
*this, &AP_WS_Connection::OnSocketShutdown));
Reactor_.addEventHandler(
*WS_, Poco::NObserver<AP_WS_Connection, Poco::Net::ErrorNotification>(
*this, &AP_WS_Connection::OnSocketError));
Registered_ = true;
Valid_ = true;
}
class ThreadedCounter {
public:
ThreadedCounter(bool T, std::atomic_uint64_t &C) :
C_(C),
Threaded_(T) {
if(Threaded_) {
C_++;
}
}
~ThreadedCounter() {
if(Threaded_ && C_>0) {
C_--;
}
}
private:
std::atomic_uint64_t &C_;
bool Threaded_;
};
bool AP_WS_Connection::ValidatedDevice() {
if(DeviceValidated_)
return true;
if(!Valid_)
return false;
try {
auto SockImpl = dynamic_cast<Poco::Net::WebSocketImpl *>(WS_->impl());
auto SS = dynamic_cast<Poco::Net::SecureStreamSocketImpl*>(SockImpl->streamSocketImpl());
PeerAddress_ = SS->peerAddress().host();
CId_ = Utils::FormatIPv6(SS->peerAddress().toString());
State_.started = OpenWifi::Now();
if (!SS->secure()) {
poco_warning(Logger_,fmt::format("TLS-CONNECTION({}): Session={} Connection is NOT secure. Device is not allowed.", CId_, State_.sessionId ));
EndConnection();
return false;
}
poco_debug(Logger_,fmt::format("TLS-CONNECTION({}): Session={} Connection is secure.", CId_, State_.sessionId ));
if (!SS->havePeerCertificate()) {
State_.VerifiedCertificate = GWObjects::NO_CERTIFICATE;
poco_warning(Logger_,fmt::format("TLS-CONNECTION({}): Session={} No certificates available..", CId_, State_.sessionId ));
EndConnection();
return false;
}
Poco::Crypto::X509Certificate PeerCert(SS->peerCertificate());
if (!AP_WS_Server()->ValidateCertificate(CId_, PeerCert)) {
State_.VerifiedCertificate = GWObjects::NO_CERTIFICATE;
poco_warning(Logger_, fmt::format("TLS-CONNECTION({}): Session={} Device certificate is not valid. Device is not allowed.",
CId_, State_.sessionId ));
EndConnection();
return false;
}
CN_ = Poco::trim(Poco::toLower(PeerCert.commonName()));
State_.VerifiedCertificate = GWObjects::VALID_CERTIFICATE;
poco_debug(Logger_,
fmt::format("TLS-CONNECTION({}): Session={} Valid certificate: CN={}", CId_, State_.sessionId , CN_));
if (AP_WS_Server::IsSim(CN_) && !AP_WS_Server()->IsSimEnabled()) {
poco_warning(
Logger_,
fmt::format("TLS-CONNECTION({}): Session={} Sim Device {} is not allowed. Disconnecting.",
CId_, State_.sessionId , CN_));
EndConnection();
return false;
}
if (!CN_.empty() && StorageService()->IsBlackListed(SerialNumber_)) {
poco_warning(
Logger_,
fmt::format("TLS-CONNECTION({}): Session={} Device {} is black listed. Disconnecting.",
CId_, State_.sessionId , CN_));
EndConnection();
return false;
}
SerialNumber_ = CN_;
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
poco_debug(Logger_, fmt::format("TLS-CONNECTION({}): Session={} CN={} Completed. (t={})", CId_, State_.sessionId , CN_, ConcurrentStartingDevices_));
DeviceValidated_ = true;
return true;
} catch (const Poco::Net::CertificateValidationException &E) {
poco_error(Logger_,fmt::format("CONNECTION({}): Session:{} Poco::CertificateValidationException Certificate Validation failed during connection. Device will have to retry.",
CId_, State_.sessionId ));
Logger_.log(E);
} catch (const Poco::Net::WebSocketException &E) {
poco_error(Logger_,fmt::format("CONNECTION({}): Session:{} Poco::WebSocketException WebSocket error during connection. Device will have to retry.",
CId_, State_.sessionId ));
Logger_.log(E);
} catch (const Poco::Net::ConnectionAbortedException &E) {
poco_error(Logger_,fmt::format("CONNECTION({}):Session:{} Poco::ConnectionAbortedException Connection was aborted during connection. Device will have to retry.",
CId_, State_.sessionId ));
Logger_.log(E);
} catch (const Poco::Net::ConnectionResetException &E) {
poco_error(Logger_,fmt::format("CONNECTION({}): Session:{} Poco::ConnectionResetException Connection was reset during connection. Device will have to retry.",
CId_, State_.sessionId ));
Logger_.log(E);
} catch (const Poco::Net::InvalidCertificateException &E) {
poco_error(Logger_,fmt::format(
"CONNECTION({}): Session:{} Poco::InvalidCertificateException Invalid certificate. Device will have to retry.",
CId_, State_.sessionId ));
Logger_.log(E);
} catch (const Poco::Net::SSLException &E) {
poco_error(Logger_,fmt::format("CONNECTION({}): Session:{} Poco::SSLException SSL Exception during connection. Device will have to retry.",
CId_, State_.sessionId ));
Logger_.log(E);
} catch (const Poco::Exception &E) {
poco_error(Logger_,fmt::format("CONNECTION({}): Session:{} Poco::Exception caught during device connection. Device will have to retry.",
CId_, State_.sessionId ));
Logger_.log(E);
} catch (...) {
poco_error(Logger_,fmt::format("CONNECTION({}): Session:{} Exception caught during device connection. Device will have to retry. Unsecure connect denied.",
CId_, State_.sessionId ));
}
EndConnection();
return false;
}
static void NotifyKafkaDisconnect(const std::string & SerialNumber) {
try {
Poco::JSON::Object Disconnect;
Poco::JSON::Object Details;
Details.set(uCentralProtocol::SERIALNUMBER, SerialNumber);
Details.set(uCentralProtocol::TIMESTAMP, OpenWifi::Now());
Disconnect.set(uCentralProtocol::DISCONNECTION, Details);
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(Disconnect, OS);
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber, OS.str());
} catch (...) {
}
}
AP_WS_Connection::~AP_WS_Connection() {
Valid_=false;
EndConnection();
}
void AP_WS_Connection::EndConnection() {
Valid_=false;
if(!Dead_.test_and_set()) {
if (Registered_) {
Registered_ = false;
Reactor_.removeEventHandler(
*WS_, Poco::NObserver<AP_WS_Connection, Poco::Net::ReadableNotification>(
*this, &AP_WS_Connection::OnSocketReadable));
Reactor_.removeEventHandler(
*WS_, Poco::NObserver<AP_WS_Connection, Poco::Net::ShutdownNotification>(
*this, &AP_WS_Connection::OnSocketShutdown));
Reactor_.removeEventHandler(
*WS_, Poco::NObserver<AP_WS_Connection, Poco::Net::ErrorNotification>(
*this, &AP_WS_Connection::OnSocketError));
}
WS_->close();
if (KafkaManager()->Enabled() && !SerialNumber_.empty()) {
std::string s(SerialNumber_);
std::thread t([s]() { NotifyKafkaDisconnect(s); });
t.detach();
}
auto SessionDeleted = AP_WS_Server()->EndSession(State_.sessionId, SerialNumberInt_);
if (SessionDeleted)
WebSocketClientNotificationDeviceDisconnected(SerialNumber_);
}
}
bool AP_WS_Connection::LookForUpgrade(const uint64_t UUID, uint64_t & UpgradedUUID) {
// A UUID of zero means ignore updates for that connection.
if (UUID == 0)
return false;
uint64_t GoodConfig = ConfigurationCache().CurrentConfig(SerialNumberInt_);
if (GoodConfig && (GoodConfig == UUID || GoodConfig == State_.PendingUUID)) {
UpgradedUUID = UUID;
return false;
}
GWObjects::Device D;
if (StorageService()->GetDevice(SerialNumber_, D)) {
// This is the case where the cache is empty after a restart. So GoodConfig will 0. If the device already has the right UUID, we just return.
if (D.UUID == UUID) {
UpgradedUUID = UUID;
ConfigurationCache().Add(SerialNumberInt_, UUID);
return false;
}
if(UUID>D.UUID) {
// so we have a problem, the device has a newer config than we have. So we need to make sure our config
// is newer.
Config::Config Cfg(D.Configuration);
D.UUID = UUID+2;
UpgradedUUID = D.UUID;
Cfg.SetUUID(D.UUID);
D.Configuration = Cfg.get();
StorageService()->UpdateDevice(D);
}
UpgradedUUID = D.UUID;
State_.PendingUUID = D.UUID;
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = uCentralProtocol::SUBMITTED_BY_SYSTEM;
Cmd.Status = uCentralProtocol::PENDING;
Cmd.Command = uCentralProtocol::CONFIGURE;
Poco::JSON::Parser P;
auto ParsedConfig = P.parse(D.Configuration).extract<Poco::JSON::Object::Ptr>();
Poco::JSON::Object Params;
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentralProtocol::UUID, D.UUID);
Params.set(uCentralProtocol::WHEN, 0);
Params.set(uCentralProtocol::CONFIG, ParsedConfig);
std::ostringstream O;
Poco::JSON::Stringifier::stringify(Params, O);
Cmd.Details = O.str();
poco_information(Logger_,fmt::format("CFG-UPGRADE({}): Current ID: {}, newer configuration {}.",
CId_, UUID, D.UUID));
bool Sent;
StorageService()->AddCommand(SerialNumber_, Cmd, Storage::CommandExecutionType::COMMAND_EXECUTED);
CommandManager()->PostCommand(CommandManager()->NextRPCId(),SerialNumber_, Cmd.Command, Params, Cmd.UUID, Sent);
WebSocketClientNotificationDeviceConfigurationChange(D.SerialNumber, UUID, UpgradedUUID);
return true;
}
return false;
}
void AP_WS_Connection::ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc) {
poco_debug(Logger_,fmt::format("RECEIVED-RPC({}): {}.", CId_, Doc->get(uCentralProtocol::ID).toString()));
CommandManager()->PostCommandResult(SerialNumber_, *Doc);
}
void AP_WS_Connection::ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc) {
auto Method = Doc->get(uCentralProtocol::METHOD).toString();
auto EventType = uCentralProtocol::Events::EventFromString(Method);
if (EventType == uCentralProtocol::Events::ET_UNKNOWN) {
poco_warning(Logger_,fmt::format("ILLEGAL-PROTOCOL({}): Unknown message type '{}'", CId_, Method));
Errors_++;
return;
}
if (!Doc->isObject(uCentralProtocol::PARAMS)) {
poco_warning(Logger_,fmt::format("MISSING-PARAMS({}): params must be an object.", CId_));
Errors_++;
return;
}
// expand params if necessary
auto ParamsObj = Doc->get(uCentralProtocol::PARAMS).extract<Poco::JSON::Object::Ptr>();
if (ParamsObj->has(uCentralProtocol::COMPRESS_64)) {
std::string UncompressedData;
try {
auto CompressedData = ParamsObj->get(uCentralProtocol::COMPRESS_64).toString();
uint64_t compress_sz = 0 ;
if(ParamsObj->has("compress_sz")) {
compress_sz = ParamsObj->get("compress_sz");
}
if (Utils::ExtractBase64CompressedData(CompressedData, UncompressedData, compress_sz)) {
poco_trace(Logger_,fmt::format("EVENT({}): Found compressed payload expanded to '{}'.",
CId_, UncompressedData));
Poco::JSON::Parser Parser;
ParamsObj = Parser.parse(UncompressedData).extract<Poco::JSON::Object::Ptr>();
} else {
poco_warning(Logger_,fmt::format("INVALID-COMPRESSED-DATA({}): Compressed cannot be uncompressed - content must be corrupt..: size={}",
CId_, CompressedData.size()));
Errors_++;
return;
}
} catch (const Poco::Exception &E) {
poco_warning(Logger_,fmt::format("INVALID-COMPRESSED-JSON-DATA({}): Compressed cannot be parsed - JSON must be corrupt..",
CId_));
Logger_.log(E);
return;
}
}
if (!ParamsObj->has(uCentralProtocol::SERIAL)) {
poco_warning(Logger_,fmt::format("MISSING-PARAMS({}): Serial number is missing in message.", CId_));
return;
}
auto Serial = Poco::trim(Poco::toLower(ParamsObj->get(uCentralProtocol::SERIAL).toString()));
if (!Utils::ValidSerialNumber(Serial)) {
Poco::Exception E(
fmt::format(
"ILLEGAL-DEVICE-NAME({}): device name is illegal and not allowed to connect.",
Serial),
EACCES);
E.rethrow();
}
if (StorageService()->IsBlackListed(Serial)) {
Poco::Exception E(
fmt::format("BLACKLIST({}): device is blacklisted and not allowed to connect.",
Serial),
EACCES);
E.rethrow();
}
switch (EventType) {
case uCentralProtocol::Events::ET_CONNECT: {
Process_connect(ParamsObj, Serial);
} break;
case uCentralProtocol::Events::ET_STATE: {
Process_state(ParamsObj);
} break;
case uCentralProtocol::Events::ET_HEALTHCHECK: {
Process_healthcheck(ParamsObj);
} break;
case uCentralProtocol::Events::ET_LOG: {
Process_log(ParamsObj);
} break;
case uCentralProtocol::Events::ET_CRASHLOG: {
Process_crashlog(ParamsObj);
} break;
case uCentralProtocol::Events::ET_PING: {
Process_ping(ParamsObj);
} break;
case uCentralProtocol::Events::ET_CFGPENDING: {
Process_cfgpending(ParamsObj);
} break;
case uCentralProtocol::Events::ET_RECOVERY: {
Process_recovery(ParamsObj);
} break;
case uCentralProtocol::Events::ET_DEVICEUPDATE: {
Process_deviceupdate(ParamsObj, Serial);
} break;
case uCentralProtocol::Events::ET_TELEMETRY: {
Process_telemetry(ParamsObj);
} break;
case uCentralProtocol::Events::ET_VENUEBROADCAST: {
Process_venuebroadcast(ParamsObj);
} break;
// this will never be called but some compilers will complain if we do not have a case for
// every single values of an enum
case uCentralProtocol::Events::ET_UNKNOWN: {
poco_warning(Logger_, fmt::format("ILLEGAL-EVENT({}): Event '{}' unknown. CN={}", CId_, Method, CN_));
Errors_++;
}
}
}
bool AP_WS_Connection::StartTelemetry(std::uint64_t RPCID) {
poco_information(Logger_, fmt::format("TELEMETRY({}): Starting.", CId_));
Poco::JSON::Object StartMessage;
StartMessage.set("jsonrpc", "2.0");
StartMessage.set("method", "telemetry");
Poco::JSON::Object Params;
Params.set("serial", SerialNumber_);
Params.set("interval", TelemetryInterval_);
Poco::JSON::Array Types;
Types.add("wifi-frames");
Types.add("dhcp-snooping");
Types.add("state");
Params.set(RESTAPI::Protocol::TYPES, Types);
StartMessage.set("id", RPCID);
StartMessage.set("params", Params);
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(StartMessage, OS);
return Send(OS.str());
}
bool AP_WS_Connection::StopTelemetry(std::uint64_t RPCID) {
poco_information(Logger_, fmt::format("TELEMETRY({}): Stopping.", CId_));
Poco::JSON::Object StopMessage;
StopMessage.set("jsonrpc", "2.0");
StopMessage.set("method", "telemetry");
Poco::JSON::Object Params;
Params.set("serial", SerialNumber_);
Params.set("interval", 0);
StopMessage.set("id", RPCID);
StopMessage.set("params", Params);
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(StopMessage, OS);
TelemetryKafkaPackets_ = TelemetryWebSocketPackets_ = TelemetryInterval_ =
TelemetryKafkaTimer_ = TelemetryWebSocketTimer_ = 0;
return Send(OS.str());
}
void AP_WS_Connection::UpdateCounts() {
State_.kafkaClients = TelemetryKafkaRefCount_;
State_.webSocketClients = TelemetryWebSocketRefCount_;
}
bool AP_WS_Connection::SetWebSocketTelemetryReporting(std::uint64_t RPCID, uint64_t Interval,
uint64_t LifeTime) {
std::unique_lock Lock(TelemetryMutex_);
TelemetryWebSocketRefCount_++;
TelemetryInterval_ = TelemetryInterval_ ? std::min(Interval, TelemetryInterval_) : Interval;
auto TelemetryWebSocketTimer = LifeTime + OpenWifi::Now();
TelemetryWebSocketTimer_ = std::max(TelemetryWebSocketTimer, TelemetryWebSocketTimer_);
UpdateCounts();
if (!TelemetryReporting_) {
TelemetryReporting_ = true;
return StartTelemetry(RPCID);
}
return true;
}
bool AP_WS_Connection::SetKafkaTelemetryReporting(std::uint64_t RPCID, uint64_t Interval, uint64_t LifeTime) {
std::unique_lock Lock(TelemetryMutex_);
TelemetryKafkaRefCount_++;
TelemetryInterval_ = TelemetryInterval_ ? std::min(Interval, TelemetryInterval_) : Interval;
auto TelemetryKafkaTimer = LifeTime + OpenWifi::Now();
TelemetryKafkaTimer_ = std::max(TelemetryKafkaTimer, TelemetryKafkaTimer_);
UpdateCounts();
if (!TelemetryReporting_) {
TelemetryReporting_ = true;
return StartTelemetry(RPCID);
}
return true;
}
bool AP_WS_Connection::StopWebSocketTelemetry(std::uint64_t RPCID) {
std::unique_lock Lock(TelemetryMutex_);
if (TelemetryWebSocketRefCount_)
TelemetryWebSocketRefCount_--;
UpdateCounts();
if (TelemetryWebSocketRefCount_ == 0 && TelemetryKafkaRefCount_ == 0) {
TelemetryReporting_ = false;
StopTelemetry(RPCID);
}
return true;
}
bool AP_WS_Connection::StopKafkaTelemetry(std::uint64_t RPCID) {
std::unique_lock Lock(TelemetryMutex_);
if (TelemetryKafkaRefCount_)
TelemetryKafkaRefCount_--;
UpdateCounts();
if (TelemetryWebSocketRefCount_ == 0 && TelemetryKafkaRefCount_ == 0) {
TelemetryReporting_ = false;
StopTelemetry(RPCID);
}
return true;
}
void AP_WS_Connection::OnSocketShutdown([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
poco_trace(Logger_, fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_));
return EndConnection();
}
void AP_WS_Connection::OnSocketError([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
poco_trace(Logger_, fmt::format("SOCKET-ERROR({}): Closing.", CId_));
return EndConnection();
}
void AP_WS_Connection::OnSocketReadable([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ReadableNotification> &pNf) {
if(!Valid_)
return;
if(!AP_WS_Server()->Running())
return EndConnection();
if(!ValidatedDevice())
return;
try {
return ProcessIncomingFrame();
} catch (const Poco::Exception &E) {
Logger_.log(E);
return EndConnection();
} catch (const std::exception &E) {
std::string W = E.what();
poco_information(Logger_, fmt::format("std::exception caught: {}. Connection terminated with {}", W, CId_));
return EndConnection();
} catch (...) {
poco_information(Logger_, fmt::format("Unknown exception for {}. Connection terminated.", CId_));
return EndConnection();
}
}
void AP_WS_Connection::ProcessIncomingFrame() {
Poco::Buffer<char> IncomingFrame(0);
try {
int Op, flags;
auto IncomingSize = WS_->receiveFrame(IncomingFrame, flags);
Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
if (IncomingSize == 0 && flags == 0 && Op == 0) {
poco_information(Logger_, fmt::format("DISCONNECT({}): device has disconnected. Session={}", CId_, State_.sessionId));
return EndConnection();
}
IncomingFrame.append(0);
State_.RX += IncomingSize;
State_.MessageCount++;
State_.LastContact = OpenWifi::Now();
switch (Op) {
case Poco::Net::WebSocket::FRAME_OP_PING: {
poco_trace(Logger_, fmt::format("WS-PING({}): received. PONG sent back.", CId_));
WS_->sendFrame("", 0,
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
State_.MessageCount++;
if (KafkaManager()->Enabled()) {
Poco::JSON::Object PingObject;
Poco::JSON::Object PingDetails;
PingDetails.set(uCentralProtocol::FIRMWARE, State_.Firmware);
PingDetails.set(uCentralProtocol::SERIALNUMBER, SerialNumber_);
PingDetails.set(uCentralProtocol::COMPATIBLE, Compatible_);
PingDetails.set(uCentralProtocol::CONNECTIONIP, CId_);
PingDetails.set(uCentralProtocol::TIMESTAMP, OpenWifi::Now());
PingDetails.set("locale", State_.locale );
PingObject.set(uCentralProtocol::PING, PingDetails);
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(PingObject, OS);
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_, OS.str());
}
return;
} break;
case Poco::Net::WebSocket::FRAME_OP_PONG: {
poco_trace(Logger_, fmt::format("PONG({}): received and ignored.", CId_));
return;
} break;
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
poco_trace(Logger_, fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}", CId_,
IncomingSize, flags, IncomingFrame.begin()));
Poco::JSON::Parser parser;
auto ParsedMessage = parser.parse(IncomingFrame.begin());
auto IncomingJSON = ParsedMessage.extract<Poco::JSON::Object::Ptr>();
if (IncomingJSON->has(uCentralProtocol::JSONRPC)) {
if (IncomingJSON->has(uCentralProtocol::METHOD) &&
IncomingJSON->has(uCentralProtocol::PARAMS)) {
ProcessJSONRPCEvent(IncomingJSON);
} else if (IncomingJSON->has(uCentralProtocol::RESULT) &&
IncomingJSON->has(uCentralProtocol::ID)) {
poco_trace(Logger_, fmt::format("RPC-RESULT({}): payload: {}", CId_, IncomingFrame.begin()));
ProcessJSONRPCResult(IncomingJSON);
} else {
poco_warning(Logger_,
fmt::format("INVALID-PAYLOAD({}): Payload is not JSON-RPC 2.0: {}",
CId_, IncomingFrame.begin()));
}
} else if (IncomingJSON->has(uCentralProtocol::RADIUS)) {
ProcessIncomingRadiusData(IncomingJSON);
} else {
std::ostringstream iS;
IncomingJSON->stringify(iS);
std::cout << iS.str() << std::endl;
poco_warning(Logger_, fmt::format(
"FRAME({}): illegal transaction header, missing 'jsonrpc'", CId_));
Errors_++;
}
return;
} break;
case Poco::Net::WebSocket::FRAME_OP_CLOSE: {
poco_information(Logger_,
fmt::format("CLOSE({}): Device is closing its connection.", CId_));
return EndConnection();
} break;
default: {
poco_warning(Logger_, fmt::format("UNKNOWN({}): unknown WS Frame operation: {}", CId_,
std::to_string(Op)));
} break;
}
} catch (const Poco::Net::ConnectionResetException &E) {
poco_warning(Logger_, fmt::format("ConnectionResetException({}): Text:{} Payload:{} Session:{}",
CId_,
E.displayText(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (const Poco::JSON::JSONException &E) {
poco_warning(Logger_, fmt::format("JSONException({}): Text:{} Payload:{} Session:{}",
CId_,
E.displayText(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (const Poco::Net::WebSocketException &E) {
poco_warning(Logger_, fmt::format("WebSocketException({}): Text:{} Payload:{} Session:{}",
CId_,
E.displayText(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (const Poco::Net::SSLConnectionUnexpectedlyClosedException &E) {
poco_warning(Logger_, fmt::format("SSLConnectionUnexpectedlyClosedException({}): Text:{} Payload:{} Session:{}",
CId_,
E.displayText(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (const Poco::Net::SSLException &E) {
poco_warning(Logger_, fmt::format("SSLException({}): Text:{} Payload:{} Session:{}",
CId_,
E.displayText(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (const Poco::Net::NetException &E) {
poco_warning(Logger_, fmt::format("NetException({}): Text:{} Payload:{} Session:{}",
CId_,
E.displayText(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (const Poco::IOException &E) {
poco_warning(Logger_, fmt::format("IOException({}): Text:{} Payload:{} Session:{}",
CId_,
E.displayText(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (const Poco::Exception &E) {
poco_warning(Logger_, fmt::format("Exception({}): Text:{} Payload:{} Session:{}",
CId_,
E.displayText(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (const std::exception &E) {
poco_warning(Logger_, fmt::format("std::exception({}): Text:{} Payload:{} Session:{}",
CId_,
E.what(),
IncomingFrame.begin()==nullptr ? "" : IncomingFrame.begin(),
State_.sessionId));
return EndConnection();
} catch (...) {
poco_error(Logger_,fmt::format("UnknownException({}): Device must be disconnected. Unknown exception. Session:{}", CId_, State_.sessionId));
return EndConnection();
}
if (Errors_ < 10)
return;
poco_warning(Logger_, fmt::format("DISCONNECTING({}): Too many errors", CId_));
return EndConnection();
}
bool AP_WS_Connection::Send(const std::string &Payload) {
try {
size_t BytesSent = WS_->sendFrame(Payload.c_str(), (int)Payload.size());
State_.TX += BytesSent;
return BytesSent == Payload.size();
} catch(const Poco::Exception &E) {
Logger_.log(E);
}
return false;
}
std::string Base64Encode(const unsigned char *buffer, std::size_t size) {
return Utils::base64encode(buffer,size);
}
std::string Base64Decode(const std::string &F) {
std::istringstream ifs(F);
Poco::Base64Decoder b64in(ifs);
std::ostringstream ofs;
Poco::StreamCopier::copyStream(b64in, ofs);
return ofs.str();
}
bool AP_WS_Connection::SendRadiusAuthenticationData(const unsigned char * buffer, std::size_t size) {
Poco::JSON::Object Answer;
Answer.set(uCentralProtocol::RADIUS,uCentralProtocol::RADIUSAUTH);
Answer.set(uCentralProtocol::RADIUSDATA, Base64Encode(buffer,size));
std::ostringstream Payload;
Answer.stringify(Payload);
return Send(Payload.str());
}
bool AP_WS_Connection::SendRadiusAccountingData(const unsigned char * buffer, std::size_t size) {
Poco::JSON::Object Answer;
Answer.set(uCentralProtocol::RADIUS,uCentralProtocol::RADIUSACCT);
Answer.set(uCentralProtocol::RADIUSDATA, Base64Encode(buffer,size));
std::ostringstream Payload;
Answer.stringify(Payload);
return Send(Payload.str());
}
bool AP_WS_Connection::SendRadiusCoAData(const unsigned char * buffer, std::size_t size) {
Poco::JSON::Object Answer;
Answer.set(uCentralProtocol::RADIUS,uCentralProtocol::RADIUSCOA);
Answer.set(uCentralProtocol::RADIUSDATA, Base64Encode(buffer,size));
std::ostringstream Payload;
Answer.stringify(Payload);
return Send(Payload.str());
}
void AP_WS_Connection::ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc) {
if( Doc->has(uCentralProtocol::RADIUSDATA)) {
auto Type = Doc->get(uCentralProtocol::RADIUS).toString();
if(Type==uCentralProtocol::RADIUSACCT) {
auto Data = Doc->get(uCentralProtocol::RADIUSDATA).toString();
auto DecodedData = Base64Decode(Data);
RADIUS_proxy_server()->SendAccountingData(SerialNumber_,DecodedData.c_str(),DecodedData.size());
} else if(Type==uCentralProtocol::RADIUSAUTH) {
auto Data = Doc->get(uCentralProtocol::RADIUSDATA).toString();
auto DecodedData = Base64Decode(Data);
RADIUS_proxy_server()->SendAuthenticationData(SerialNumber_,DecodedData.c_str(),DecodedData.size());
} else if(Type==uCentralProtocol::RADIUSCOA) {
auto Data = Doc->get(uCentralProtocol::RADIUSDATA).toString();
auto DecodedData = Base64Decode(Data);
RADIUS_proxy_server()->SendCoAData(SerialNumber_,DecodedData.c_str(),DecodedData.size());
}
}
}
}

128
src/AP_WS_Connection.h Normal file
View File

@@ -0,0 +1,128 @@
//
// Created by stephane bourque on 2022-02-03.
//
#pragma once
#include <string>
#include <shared_mutex>
#include "Poco/Net/SocketReactor.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/JSON/Object.h"
#include "Poco/Net/SocketNotification.h"
#include "Poco/Logger.h"
#include "Poco/Net/WebSocket.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
namespace OpenWifi {
class AP_WS_Connection {
static constexpr int BufSize = 256000;
public:
explicit AP_WS_Connection( Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response,
std::uint64_t connection_id,
Poco::Logger &L,
Poco::Net::SocketReactor &R);
~AP_WS_Connection();
void EndConnection();
void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr & Doc);
void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc);
void ProcessIncomingFrame();
void ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc);
bool Send(const std::string &Payload);
bool SendRadiusAuthenticationData(const unsigned char * buffer, std::size_t size);
bool SendRadiusAccountingData(const unsigned char * buffer, std::size_t size);
bool SendRadiusCoAData(const unsigned char * buffer, std::size_t size);
void OnSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf);
void OnSocketShutdown(const Poco::AutoPtr<Poco::Net::ShutdownNotification>& pNf);
void OnSocketError(const Poco::AutoPtr<Poco::Net::ErrorNotification>& pNf);
bool LookForUpgrade(const uint64_t UUID, uint64_t & UpgradedUUID);
static bool ExtractBase64CompressedData(const std::string & CompressedData, std::string & UnCompressedData, uint64_t compress_sz);
void LogException(const Poco::Exception &E);
inline Poco::Logger & Logger() { return Logger_; }
bool SetWebSocketTelemetryReporting(std::uint64_t RPCID, uint64_t interval, uint64_t TelemetryWebSocketTimer);
bool SetKafkaTelemetryReporting(std::uint64_t RPCID, uint64_t interval, uint64_t TelemetryKafkaTimer);
bool StopWebSocketTelemetry(std::uint64_t RPCID);
bool StopKafkaTelemetry(std::uint64_t RPCID);
void Process_connect(Poco::JSON::Object::Ptr ParamsObj, const std::string &Serial);
void Process_state(Poco::JSON::Object::Ptr ParamsObj);
void Process_healthcheck(Poco::JSON::Object::Ptr ParamsObj);
void Process_log(Poco::JSON::Object::Ptr ParamsObj);
void Process_crashlog(Poco::JSON::Object::Ptr ParamsObj);
void Process_ping(Poco::JSON::Object::Ptr ParamsObj);
void Process_cfgpending(Poco::JSON::Object::Ptr ParamsObj);
void Process_recovery(Poco::JSON::Object::Ptr ParamsObj);
void Process_deviceupdate(Poco::JSON::Object::Ptr ParamsObj, std::string &Serial);
void Process_telemetry(Poco::JSON::Object::Ptr ParamsObj);
void Process_venuebroadcast(Poco::JSON::Object::Ptr ParamsObj);
bool ValidatedDevice();
inline bool GetTelemetryParameters(bool & Reporting, uint64_t & Interval,
uint64_t & WebSocketTimer, uint64_t & KafkaTimer,
uint64_t &WebSocketCount, uint64_t & KafkaCount,
uint64_t &WebSocketPackets,
uint64_t &KafkaPackets ) const {
Reporting = TelemetryReporting_;
WebSocketTimer = TelemetryWebSocketTimer_;
KafkaTimer = TelemetryKafkaTimer_;
WebSocketCount = TelemetryWebSocketRefCount_;
KafkaCount = TelemetryKafkaRefCount_;
Interval = TelemetryInterval_;
WebSocketPackets = TelemetryWebSocketPackets_;
KafkaPackets = TelemetryKafkaPackets_;
return true;
}
friend class DeviceRegistry;
friend class AP_WS_Server;
private:
// std::recursive_mutex LocalMutex_;
std::shared_mutex TelemetryMutex_;
Poco::Logger &Logger_;
Poco::Net::SocketReactor &Reactor_;
std::unique_ptr<Poco::Net::WebSocket> WS_;
std::string SerialNumber_;
uint64_t SerialNumberInt_=0;
std::string Compatible_;
std::atomic_bool Registered_ = false ;
std::string CId_;
std::string CN_;
uint64_t Errors_=0;
Poco::Net::IPAddress PeerAddress_;
std::atomic_bool TelemetryReporting_ = false;
std::atomic_uint64_t TelemetryWebSocketRefCount_ = 0;
std::atomic_uint64_t TelemetryKafkaRefCount_ = 0;
uint64_t TelemetryWebSocketTimer_ = 0;
uint64_t TelemetryKafkaTimer_ = 0 ;
uint64_t TelemetryInterval_ = 0;
std::atomic_uint64_t TelemetryWebSocketPackets_=0;
std::atomic_uint64_t TelemetryKafkaPackets_=0;
GWObjects::ConnectionState State_;
std::string LastStats_;
GWObjects::HealthCheck LastHealthcheck_;
std::chrono::time_point<std::chrono::high_resolution_clock> ConnectionStart_ = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> ConnectionCompletionTime_{0.0};
bool Threaded_=false;
std::atomic_flag Dead_=false;
std::atomic_bool DeviceValidated_=false;
std::atomic_bool Valid_=false;
static inline std::atomic_uint64_t ConcurrentStartingDevices_=0;
bool StartTelemetry(std::uint64_t RPCID);
bool StopTelemetry(std::uint64_t RPCID);
void UpdateCounts();
};
}

View File

@@ -0,0 +1,26 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "fmt/format.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void AP_WS_Connection::Process_cfgpending(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) {
poco_warning(Logger_, fmt::format(
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_));
Errors_++;
return;
}
if (ParamsObj->has(uCentralProtocol::UUID) && ParamsObj->has(uCentralProtocol::ACTIVE)) {
[[maybe_unused]] uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
[[maybe_unused]] uint64_t Active = ParamsObj->get(uCentralProtocol::ACTIVE);
poco_trace(Logger_, fmt::format("CFG-PENDING({}): Active: {} Target: {}", CId_, Active, UUID));
} else {
poco_warning(Logger_, fmt::format("CFG-PENDING({}): Missing some parameters", CId_));
}
}
}

View File

@@ -0,0 +1,135 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "AP_WS_Server.h"
#include "StorageService.h"
#include "FindCountry.h"
#include "framework/WebSocketClientNotifications.h"
#include "Daemon.h"
#include "CentralConfig.h"
#include "CommandManager.h"
namespace OpenWifi {
void AP_WS_Connection::Process_connect(Poco::JSON::Object::Ptr ParamsObj, const std::string &Serial) {
if (ParamsObj->has(uCentralProtocol::UUID) &&
ParamsObj->has(uCentralProtocol::FIRMWARE) &&
ParamsObj->has(uCentralProtocol::CAPABILITIES)) {
uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
auto Firmware = ParamsObj->get(uCentralProtocol::FIRMWARE).toString();
auto CapabilitiesString = ParamsObj->get(uCentralProtocol::CAPABILITIES).toString();
Config::Capabilities Caps(CapabilitiesString);
Compatible_ = Caps.Compatible();
SerialNumber_ = Serial;
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
CommandManager()->ClearQueue(SerialNumberInt_);
AP_WS_Server()->SetSessionDetails(State_.sessionId,SerialNumberInt_);
State_.UUID = UUID;
State_.Firmware = Firmware;
State_.PendingUUID = 0;
State_.Address = Utils::FormatIPv6(WS_->peerAddress().toString());
CId_ = SerialNumber_ + "@" + CId_;
auto IP = PeerAddress_.toString();
if(IP.substr(0,7)=="::ffff:") {
IP = IP.substr(7);
}
State_.locale = FindCountryFromIP()->Get(IP);
GWObjects::Device DeviceInfo;
auto DeviceExists = StorageService()->GetDevice(SerialNumber_,DeviceInfo);
if (Daemon()->AutoProvisioning() && !DeviceExists) {
StorageService()->CreateDefaultDevice(SerialNumber_, CapabilitiesString, Firmware,
Compatible_, PeerAddress_);
} else if (DeviceExists) {
StorageService()->UpdateDeviceCapabilities(SerialNumber_, CapabilitiesString,
Compatible_);
bool Updated = false;
if(!Firmware.empty()) {
if(Firmware!=DeviceInfo.Firmware) {
DeviceInfo.Firmware = Firmware;
DeviceInfo.LastFWUpdate = OpenWifi::Now();
Updated = true;
WebSocketClientNotificationDeviceFirmwareUpdated(SerialNumber_, Firmware);
} else if(DeviceInfo.LastFWUpdate==0) {
DeviceInfo.LastFWUpdate = OpenWifi::Now();
Updated = true;
}
}
if(DeviceInfo.locale != State_.locale) {
DeviceInfo.locale = State_.locale;
Updated = true;
}
if(Compatible_ != DeviceInfo.DeviceType) {
DeviceInfo.DeviceType = Compatible_;
Updated = true;
}
if(Updated) {
StorageService()->UpdateDevice(DeviceInfo);
}
uint64_t UpgradedUUID=0;
LookForUpgrade(UUID,UpgradedUUID);
State_.UUID = UpgradedUUID;
}
State_.Compatible = Compatible_;
State_.Connected = true;
ConnectionCompletionTime_ = std::chrono::high_resolution_clock::now() - ConnectionStart_;
State_.connectionCompletionTime = ConnectionCompletionTime_.count();
if(State_.VerifiedCertificate == GWObjects::VALID_CERTIFICATE) {
if (( Utils::SerialNumberMatch(CN_, SerialNumber_, AP_WS_Server()->MismatchDepth())) ||
AP_WS_Server()->IsSimSerialNumber(CN_)) {
State_.VerifiedCertificate = GWObjects::VERIFIED;
poco_information(Logger_, fmt::format("CONNECT({}): Fully validated and authenticated device. Session={} ConnectionCompletion Time={}",
CId_,
State_.sessionId,
State_.connectionCompletionTime ));
} else {
State_.VerifiedCertificate = GWObjects::MISMATCH_SERIAL;
if(AP_WS_Server()->AllowSerialNumberMismatch()) {
poco_information(
Logger_, fmt::format("CONNECT({}): Serial number mismatch allowed. CN={} Serial={} Session={} ConnectionCompletion Time={}",
CId_, CN_, SerialNumber_, State_.sessionId,
State_.connectionCompletionTime));
} else {
poco_information(
Logger_, fmt::format("CONNECT({}): Serial number mismatch disallowed. Device rejected. CN={} Serial={} Session={} ConnectionCompletion Time={}",
CId_, CN_, SerialNumber_, State_.sessionId,
State_.connectionCompletionTime));
return EndConnection();
}
}
}
WebSocketClientNotificationDeviceConnected(SerialNumber_);
// std::cout << "Serial: " << SerialNumber_ << "Session: " << State_.sessionId << std::endl;
if (KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify;
ParamsObj->set(uCentralProtocol::CONNECTIONIP, CId_);
ParamsObj->set("locale", State_.locale );
ParamsObj->set(uCentralProtocol::TIMESTAMP, OpenWifi::Now());
std::ostringstream OS;
Stringify.condense(ParamsObj, OS);
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_, OS.str());
}
} else {
poco_warning(Logger_,fmt::format("INVALID-PROTOCOL({}): Missing one of uuid, firmware, or capabilities", CId_));
Errors_++;
}
}
}

View File

@@ -0,0 +1,34 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
namespace OpenWifi {
void AP_WS_Connection::Process_crashlog(Poco::JSON::Object::Ptr ParamsObj) {
if (ParamsObj->has(uCentralProtocol::UUID) && ParamsObj->has(uCentralProtocol::LOGLINES)) {
poco_trace(Logger_, fmt::format("CRASH-LOG({}): new entry.", CId_));
auto LogLines = ParamsObj->get(uCentralProtocol::LOGLINES);
std::string LogText;
if (LogLines.isArray()) {
auto LogLinesArray = LogLines.extract<Poco::JSON::Array::Ptr>();
for (const auto &i : *LogLinesArray)
LogText += i.toString() + "\r\n";
}
GWObjects::DeviceLog DeviceLog{.SerialNumber = SerialNumber_,
.Log = LogText,
.Data = "",
.Severity = GWObjects::DeviceLog::LOG_EMERG,
.Recorded = (uint64_t)time(nullptr),
.LogType = 1,
.UUID = 0};
StorageService()->AddLog(DeviceLog);
} else {
poco_warning(Logger_, fmt::format("LOG({}): Missing parameters.", CId_));
return;
}
}
}

View File

@@ -0,0 +1,25 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
namespace OpenWifi {
void AP_WS_Connection::Process_deviceupdate(Poco::JSON::Object::Ptr ParamsObj, std::string &Serial) {
if (!State_.Connected) {
poco_warning(Logger_, fmt::format(
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_));
Errors_++;
return;
}
if (ParamsObj->has("currentPassword")) {
auto Password = ParamsObj->get("currentPassword").toString();
StorageService()->SetDevicePassword(Serial, Password);
poco_trace(Logger_, fmt::format("DEVICEUPDATE({}): Device is updating its login password.", Serial));
}
}
}

View File

@@ -0,0 +1,71 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
namespace OpenWifi {
void AP_WS_Connection::Process_healthcheck(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) {
poco_warning(Logger_, fmt::format(
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_));
Errors_++;
return;
}
if (ParamsObj->has(uCentralProtocol::UUID) && ParamsObj->has(uCentralProtocol::SANITY) &&
ParamsObj->has(uCentralProtocol::DATA)) {
uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
auto Sanity = ParamsObj->get(uCentralProtocol::SANITY);
auto CheckData = ParamsObj->get(uCentralProtocol::DATA).toString();
if (CheckData.empty())
CheckData = uCentralProtocol::EMPTY_JSON_DOC;
std::string request_uuid;
if (ParamsObj->has(uCentralProtocol::REQUEST_UUID))
request_uuid = ParamsObj->get(uCentralProtocol::REQUEST_UUID).toString();
if (request_uuid.empty()) {
poco_trace(Logger_,
fmt::format("HEALTHCHECK({}): UUID={} Updating.", CId_, UUID));
} else {
poco_trace(Logger_,
fmt::format("HEALTHCHECK({}): UUID={} Updating for CMD={}.", CId_,
UUID, request_uuid));
}
uint64_t UpgradedUUID;
LookForUpgrade(UUID,UpgradedUUID);
State_.UUID = UpgradedUUID;
GWObjects::HealthCheck Check;
Check.SerialNumber = SerialNumber_;
Check.Recorded = OpenWifi::Now();
Check.UUID = UUID;
Check.Data = CheckData;
Check.Sanity = Sanity;
StorageService()->AddHealthCheckData(Check);
if (!request_uuid.empty()) {
StorageService()->SetCommandResult(request_uuid, CheckData);
}
LastHealthcheck_ = Check;
if (KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
ParamsObj->set("timestamp", OpenWifi::Now());
Stringify.condense(ParamsObj, OS);
KafkaManager()->PostMessage(KafkaTopics::HEALTHCHECK, SerialNumber_, OS.str());
}
} else {
poco_warning(Logger_, fmt::format("HEALTHCHECK({}): Missing parameter", CId_));
return;
}
}
}

41
src/AP_WS_Process_log.cpp Normal file
View File

@@ -0,0 +1,41 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
namespace OpenWifi {
void AP_WS_Connection::Process_log(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) {
poco_warning(
Logger_,
fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_));
Errors_++;
return;
}
if (ParamsObj->has(uCentralProtocol::LOG) && ParamsObj->has(uCentralProtocol::SEVERITY)) {
poco_trace(Logger_, fmt::format("LOG({}): new entry.", CId_));
auto Log = ParamsObj->get(uCentralProtocol::LOG).toString();
auto Severity = ParamsObj->get(uCentralProtocol::SEVERITY);
std::string DataStr = uCentralProtocol::EMPTY_JSON_DOC;
if (ParamsObj->has(uCentralProtocol::DATA)) {
auto DataObj = ParamsObj->get(uCentralProtocol::DATA);
if (DataObj.isStruct())
DataStr = DataObj.toString();
}
GWObjects::DeviceLog DeviceLog{.SerialNumber = SerialNumber_,
.Log = Log,
.Data = DataStr,
.Severity = Severity,
.Recorded = (uint64_t)time(nullptr),
.LogType = 0,
.UUID = State_.UUID};
StorageService()->AddLog(DeviceLog);
} else {
poco_warning(Logger_, fmt::format("LOG({}): Missing parameters.", CId_));
return;
}
}
}

View File

@@ -0,0 +1,18 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "fmt/format.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void AP_WS_Connection::Process_ping(Poco::JSON::Object::Ptr ParamsObj) {
if (ParamsObj->has(uCentralProtocol::UUID)) {
[[maybe_unused]] uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
poco_trace(Logger_, fmt::format("PING({}): Current config is {}", CId_, UUID));
} else {
poco_warning(Logger_, fmt::format("PING({}): Missing parameter.", CId_));
}
}
}

View File

@@ -0,0 +1,62 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
#include "CommandManager.h"
namespace OpenWifi {
void AP_WS_Connection::Process_recovery(Poco::JSON::Object::Ptr ParamsObj) {
if (ParamsObj->has(uCentralProtocol::SERIAL) &&
ParamsObj->has(uCentralProtocol::FIRMWARE) && ParamsObj->has(uCentralProtocol::UUID) &&
ParamsObj->has(uCentralProtocol::REBOOT) &&
ParamsObj->has(uCentralProtocol::LOGLINES)) {
auto LogLines = ParamsObj->get(uCentralProtocol::LOGLINES);
std::string LogText;
LogText = "Firmware: " + ParamsObj->get(uCentralProtocol::FIRMWARE).toString() + "\r\n";
if (LogLines.isArray()) {
auto LogLinesArray = LogLines.extract<Poco::JSON::Array::Ptr>();
for (const auto &i : *LogLinesArray)
LogText += i.toString() + "\r\n";
}
GWObjects::DeviceLog DeviceLog{.SerialNumber = SerialNumber_,
.Log = LogText,
.Data = "",
.Severity = GWObjects::DeviceLog::LOG_EMERG,
.Recorded = (uint64_t)time(nullptr),
.LogType = 1,
.UUID = 0};
StorageService()->AddLog(DeviceLog);
if (ParamsObj->get(uCentralProtocol::REBOOT).toString() == "true") {
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = uCentralProtocol::SUBMITTED_BY_SYSTEM;
Cmd.Status = uCentralProtocol::PENDING;
Cmd.Command = uCentralProtocol::REBOOT;
Poco::JSON::Object Params;
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentralProtocol::WHEN, 0);
std::ostringstream O;
Poco::JSON::Stringifier::stringify(Params, O);
Cmd.Details = O.str();
bool Sent;
CommandManager()->PostCommand(CommandManager()->NextRPCId(),SerialNumber_, Cmd.Command, Params, Cmd.UUID, Sent);
StorageService()->AddCommand(SerialNumber_, Cmd, Storage::CommandExecutionType::COMMAND_EXECUTED);
poco_information(Logger_, fmt::format("RECOVERY({}): Recovery mode received, need for a reboot.", CId_));
} else {
poco_information(Logger_, fmt::format(
"RECOVERY({}): Recovery mode received, no need for a reboot.", CId_));
}
} else {
poco_warning(Logger_, fmt::format("RECOVERY({}): Recovery missing one of serialnumber, firmware, uuid, loglines, reboot",
CId_));
}
}
}

View File

@@ -0,0 +1,67 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
#include "framework/WebSocketClientNotifications.h"
#include "StateUtils.h"
namespace OpenWifi {
void AP_WS_Connection::Process_state(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) {
poco_warning(Logger_, fmt::format(
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_));
Errors_++;
return;
}
if (ParamsObj->has(uCentralProtocol::UUID) && ParamsObj->has(uCentralProtocol::STATE)) {
uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
auto StateStr = ParamsObj->get(uCentralProtocol::STATE).toString();
auto StateObj = ParamsObj->getObject(uCentralProtocol::STATE);
std::string request_uuid;
if (ParamsObj->has(uCentralProtocol::REQUEST_UUID))
request_uuid = ParamsObj->get(uCentralProtocol::REQUEST_UUID).toString();
if (request_uuid.empty()) {
poco_trace(Logger_, fmt::format("STATE({}): UUID={} Updating.", CId_, UUID));
} else {
poco_trace(Logger_, fmt::format("STATE({}): UUID={} Updating for CMD={}.",
CId_, UUID, request_uuid));
}
uint64_t UpgradedUUID;
LookForUpgrade(UUID,UpgradedUUID);
State_.UUID = UpgradedUUID;
LastStats_ = StateStr;
GWObjects::Statistics Stats{
.SerialNumber = SerialNumber_, .UUID = UUID, .Data = StateStr};
Stats.Recorded = OpenWifi::Now();
StorageService()->AddStatisticsData(Stats);
if (!request_uuid.empty()) {
StorageService()->SetCommandResult(request_uuid, StateStr);
}
StateUtils::ComputeAssociations(StateObj, State_.Associations_2G,
State_.Associations_5G);
if (KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(ParamsObj, OS);
KafkaManager()->PostMessage(KafkaTopics::STATE, SerialNumber_, OS.str());
}
WebSocketNotification<WebNotificationSingleDevice> N;
N.content.serialNumber = SerialNumber_;
N.type = "device_statistics";
WebSocketClientServer()->SendNotification(N);
} else {
poco_warning(Logger_, fmt::format("STATE({}): Invalid request. Missing serial, uuid, or state", CId_));
}
}
}

View File

@@ -0,0 +1,54 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "TelemetryStream.h"
#include "CommandManager.h"
namespace OpenWifi {
void AP_WS_Connection::Process_telemetry(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) {
poco_warning(Logger_, fmt::format(
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_));
Errors_++;
return;
}
if (TelemetryReporting_) {
if (ParamsObj->has("data")) {
auto Payload = ParamsObj->get("data").extract<Poco::JSON::Object::Ptr>();
Payload->set("timestamp", OpenWifi::Now());
std::ostringstream SS;
Payload->stringify(SS);
auto now=OpenWifi::Now();
if (TelemetryWebSocketRefCount_) {
if(now<TelemetryWebSocketTimer_) {
// std::cout << SerialNumber_ << ": Updating WebSocket telemetry" << std::endl;
TelemetryWebSocketPackets_++;
State_.websocketPackets = TelemetryWebSocketPackets_;
TelemetryStream()->UpdateEndPoint(SerialNumberInt_, SS.str());
} else {
StopWebSocketTelemetry(CommandManager()->NextRPCId());
}
}
if (TelemetryKafkaRefCount_) {
if(KafkaManager()->Enabled() && now<TelemetryKafkaTimer_) {
// std::cout << SerialNumber_ << ": Updating Kafka telemetry" << std::endl;
TelemetryKafkaPackets_++;
State_.kafkaPackets = TelemetryKafkaPackets_;
KafkaManager()->PostMessage(KafkaTopics::DEVICE_TELEMETRY, SerialNumber_,
SS.str());
} else {
StopKafkaTelemetry(CommandManager()->NextRPCId());
}
}
} else {
poco_debug(Logger_,fmt::format("TELEMETRY({}): Invalid telemetry packet.",SerialNumber_));
}
} else {
// if we are ignoring telemetry, then close it down on the device.
poco_debug(Logger_,fmt::format("TELEMETRY({}): Stopping runaway telemetry.",SerialNumber_));
StopTelemetry(CommandManager()->NextRPCId());
}
}
}

View File

@@ -0,0 +1,17 @@
//
// Created by stephane bourque on 2022-07-26.
//
#include "AP_WS_Connection.h"
#include "VenueBroadcaster.h"
namespace OpenWifi {
void AP_WS_Connection::Process_venuebroadcast(Poco::JSON::Object::Ptr ParamsObj) {
if(ParamsObj->has("data") && ParamsObj->has("serial") && ParamsObj->has("timestamp")) {
VenueBroadcaster()->Broadcast(
ParamsObj->get("serial").toString(),
ParamsObj->get("data").toString(),
ParamsObj->get("timestamp"));
}
}
}

View File

@@ -5,21 +5,31 @@
#pragma once
#include <string>
#include <shared_mutex>
#include "Poco/Net/SocketAcceptor.h"
#include "Poco/Environment.h"
namespace OpenWifi {
class ReactorPool {
class AP_WS_ReactorThreadPool {
public:
explicit ReactorPool(unsigned int NumberOfThreads = Poco::Environment::processorCount())
: NumberOfThreads_(NumberOfThreads) {}
explicit AP_WS_ReactorThreadPool() {
NumberOfThreads_ = Poco::Environment::processorCount()*2;
if(NumberOfThreads_==0)
NumberOfThreads_=4;
}
void Start(const std::string & ThreadNamePrefix) {
for (auto i = 0; i < NumberOfThreads_; ++i) {
~ AP_WS_ReactorThreadPool() {
Stop();
}
void Start() {
for (uint64_t i = 0; i < NumberOfThreads_; ++i) {
auto NewReactor = std::make_unique<Poco::Net::SocketReactor>();
auto NewThread = std::make_unique<Poco::Thread>();
NewThread->start(*NewReactor);
NewThread->setName(ThreadNamePrefix + std::to_string(i));
std::string ThreadName{"ap:react:" + std::to_string(i)};
Utils::SetThreadName(*NewThread,ThreadName.c_str());
Reactors_.emplace_back(std::move(NewReactor));
Threads_.emplace_back(std::move(NewThread));
}
@@ -31,17 +41,21 @@ namespace OpenWifi {
for (auto &i : Threads_) {
i->join();
}
Reactors_.clear();
Threads_.clear();
}
Poco::Net::SocketReactor &NextReactor() {
std::shared_lock Lock(Mutex_);
NextReactor_++;
NextReactor_ %= NumberOfThreads_;
return *Reactors_[NextReactor_];
}
private:
unsigned int NumberOfThreads_;
unsigned int NextReactor_ = 0;
std::shared_mutex Mutex_;
uint64_t NumberOfThreads_;
uint64_t NextReactor_ = 0;
std::vector<std::unique_ptr<Poco::Net::SocketReactor>> Reactors_;
std::vector<std::unique_ptr<Poco::Thread>> Threads_;
};

410
src/AP_WS_Server.cpp Normal file
View File

@@ -0,0 +1,410 @@
//
// License type: BSD 3-Clause License
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
//
// Created by Stephane Bourque on 2021-03-04.
// Arilia Wireless Inc.
//
#include "Poco/Net/HTTPHeaderStream.h"
#include "Poco/JSON/Array.h"
#include "Poco/Net/Context.h"
#include "AP_WS_Server.h"
#include "AP_WS_Connection.h"
#include "ConfigurationCache.h"
#include "TelemetryStream.h"
#include "framework/WebSocketClientNotifications.h"
namespace OpenWifi {
void AP_WS_RequestHandler::handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) {
try {
AP_WS_Server()->AddConnection(id_,std::make_shared<AP_WS_Connection>(request,response,id_, Logger_, AP_WS_Server()->NextReactor()));
} catch (...) {
poco_warning(Logger_,"Exception during WS creation");
}
};
bool AP_WS_Server::ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate) {
if(IsCertOk()) {
if(!Certificate.issuedBy(*IssuerCert_)) {
poco_warning(Logger(),fmt::format("CERTIFICATE({}): issuer mismatch. Local='{}' Incoming='{}'", ConnectionId, IssuerCert_->issuerName(), Certificate.issuerName()));
return false;
}
return true;
}
return false;
}
int AP_WS_Server::Start() {
AllowSerialNumberMismatch_ = MicroService::instance().ConfigGetBool("openwifi.certificates.allowmismatch",true);
MismatchDepth_ = MicroService::instance().ConfigGetInt("openwifi.certificates.mismatchdepth",2);
Reactor_pool_ = std::make_unique<AP_WS_ReactorThreadPool>();
Reactor_pool_->Start();
for(const auto & Svr : ConfigServersList_ ) {
poco_notice(Logger(),fmt::format("Starting: {}:{} Keyfile:{} CertFile: {}", Svr.Address(),
Svr.Port(), Svr.KeyFile(), Svr.CertFile()));
Svr.LogCert(Logger());
if (!Svr.RootCA().empty())
Svr.LogCas(Logger());
if (!IsCertOk()) {
IssuerCert_ = std::make_unique<Poco::Crypto::X509Certificate>(Svr.IssuerCertFile());
poco_information(Logger(),
fmt::format("Certificate Issuer Name:{}", IssuerCert_->issuerName()));
}
Poco::Net::Context::Params P;
P.verificationMode = Poco::Net::Context::VERIFY_ONCE;
P.verificationDepth = 9;
P.loadDefaultCAs = Svr.RootCA().empty();
P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
P.dhUse2048Bits = true;
P.caLocation = Svr.Cas();
auto Context = Poco::AutoPtr<Poco::Net::Context>(new Poco::Net::Context(Poco::Net::Context::TLS_SERVER_USE, P));
if(!Svr.KeyFilePassword().empty()) {
auto PassphraseHandler = Poco::SharedPtr<MyPrivateKeyPassphraseHandler>( new MyPrivateKeyPassphraseHandler(Svr.KeyFilePassword(),Logger()));
Poco::Net::SSLManager::instance().initializeServer(PassphraseHandler, nullptr,Context);
}
Poco::Crypto::X509Certificate Cert(Svr.CertFile());
Poco::Crypto::X509Certificate Root(Svr.RootCA());
Context->useCertificate(Cert);
Context->addChainCertificate(Root);
Context->addCertificateAuthority(Root);
Poco::Crypto::X509Certificate Issuing(Svr.IssuerCertFile());
Context->addChainCertificate(Issuing);
Context->addCertificateAuthority(Issuing);
Poco::Crypto::RSAKey Key("", Svr.KeyFile(), Svr.KeyFilePassword());
Context->usePrivateKey(Key);
Context->setSessionCacheSize(0);
Context->setSessionTimeout(120);
Context->flushSessionCache();
Context->enableSessionCache(true);
Context->enableExtendedCertificateVerification(false);
// Context->disableStatelessSessionResumption();
Context->disableProtocols(Poco::Net::Context::PROTO_TLSV1 | Poco::Net::Context::PROTO_TLSV1_1);
auto WebServerHttpParams = new Poco::Net::HTTPServerParams;
WebServerHttpParams->setMaxThreads(50);
WebServerHttpParams->setMaxQueued(200);
WebServerHttpParams->setKeepAlive(true);
WebServerHttpParams->setName("ws:ap_dispatch");
if (Svr.Address() == "*") {
Poco::Net::IPAddress Addr(Poco::Net::IPAddress::wildcard(
Poco::Net::Socket::supportsIPv6() ? Poco::Net::AddressFamily::IPv6
: Poco::Net::AddressFamily::IPv4));
Poco::Net::SocketAddress SockAddr(Addr, Svr.Port());
auto NewWebServer = std::make_unique<Poco::Net::HTTPServer>(
new AP_WS_RequestHandlerFactory(Logger()), DeviceConnectionPool_, Poco::Net::SecureServerSocket(SockAddr, Svr.Backlog(), Context), WebServerHttpParams);
WebServers_.push_back(std::move(NewWebServer));
} else {
Poco::Net::IPAddress Addr(Svr.Address());
Poco::Net::SocketAddress SockAddr(Addr, Svr.Port());
auto NewWebServer = std::make_unique<Poco::Net::HTTPServer>(
new AP_WS_RequestHandlerFactory(Logger()), DeviceConnectionPool_, Poco::Net::SecureServerSocket(SockAddr, Svr.Backlog(), Context), WebServerHttpParams);
WebServers_.push_back(std::move(NewWebServer));
}
}
for(auto &server:WebServers_) {
server->start();
}
ReactorThread_.start(Reactor_);
auto ProvString = MicroService::instance().ConfigGetString("autoprovisioning.process","default");
if(ProvString!="default") {
auto Tokens = Poco::StringTokenizer(ProvString, ",");
for (const auto &i : Tokens) {
if (i == "prov")
LookAtProvisioning_ = true;
else
UseDefaultConfig_ = true;
}
} else {
UseDefaultConfig_ = true;
}
SimulatorId_ = MicroService::instance().ConfigGetString("simulatorid","");
SimulatorEnabled_ = !SimulatorId_.empty();
Utils::SetThreadName(ReactorThread_,"dev:react:head");
GarbageCollectorCallback_ = std::make_unique<Poco::TimerCallback<AP_WS_Server>>(*this,&AP_WS_Server::onGarbageCollecting);
Timer_.setStartInterval(10 * 1000);
Timer_.setPeriodicInterval(5 * 1000); // every minute
Timer_.start(*GarbageCollectorCallback_, MicroService::instance().TimerPool());
Running_ = true;
return 0;
}
void AP_WS_Server::onGarbageCollecting([[maybe_unused]] Poco::Timer &timer) {
std::lock_guard Lock(LocalMutex_);
if(Garbage_.size()>0) {
std::cout << "Removing " << Garbage_.size() << " old connections." << std::endl;
Garbage_.clear();
}
static std::uint64_t last_log = OpenWifi::Now();
NumberOfConnectedDevices_ = 0;
NumberOfConnectingDevices_ = 0;
AverageDeviceConnectionTime_ = 0;
std::uint64_t total_connected_time=0;
auto now = OpenWifi::Now();
for (auto connection=SerialNumbers_.begin(); connection!=SerialNumbers_.end();) {
if(connection->second.second== nullptr) {
connection++;
continue;
}
if (connection->second.second->State_.Connected) {
NumberOfConnectedDevices_++;
total_connected_time += (now - connection->second.second->State_.started);
connection++;
} else {
NumberOfConnectingDevices_++;
connection++;
}
}
AverageDeviceConnectionTime_ = (NumberOfConnectedDevices_!=0) ? total_connected_time/NumberOfConnectedDevices_ : 0;
if((now-last_log)>120) {
last_log = now;
poco_information(Logger(),
fmt::format("Active AP connections: {} Connecting: {} Average connection time: {} seconds",
NumberOfConnectedDevices_, NumberOfConnectingDevices_, AverageDeviceConnectionTime_));
}
WebSocketClientNotificationNumberOfConnections(NumberOfConnectedDevices_,
AverageDeviceConnectionTime_,
NumberOfConnectingDevices_);
}
void AP_WS_Server::Stop() {
poco_information(Logger(),"Stopping...");
Running_ = false;
Timer_.stop();
for(auto &server:WebServers_) {
server->stopAll();
}
Reactor_pool_->Stop();
Reactor_.stop();
ReactorThread_.join();
poco_information(Logger(),"Stopped...");
}
bool AP_WS_Server::GetStatistics(std::uint64_t SerialNumber, std::string &Statistics) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
Statistics = Device->second.second->LastStats_;
return true;
}
bool AP_WS_Server::GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
State = Device->second.second->State_;
return true;
}
bool AP_WS_Server::GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
CheckData = Device->second.second->LastHealthcheck_;
return true;
}
void AP_WS_Server::SetSessionDetails(std::uint64_t connection_id, uint64_t SerialNumber) {
std::lock_guard Lock(LocalMutex_);
auto Conn = Sessions_.find(connection_id);
if(Conn == end(Sessions_))
return;
auto CurrentSerialNumber = SerialNumbers_.find(SerialNumber);
if( (CurrentSerialNumber==SerialNumbers_.end()) ||
(CurrentSerialNumber->second.first<connection_id)) {
SerialNumbers_[SerialNumber] = std::make_pair(connection_id, Conn->second.first);
return;
}
}
bool AP_WS_Server::EndSession(std::uint64_t session_id, std::uint64_t serial_number) {
std::unique_lock G(LocalMutex_);
auto Session = Sessions_.find(session_id);
if(Session==end(Sessions_))
return false;
Garbage_.push_back(Session->second.first);
auto Device = SerialNumbers_.find(serial_number);
if (Device == end(SerialNumbers_)) {
Sessions_.erase(Session);
return false;
}
if(Device->second.first==session_id) {
Sessions_.erase(Session);
SerialNumbers_.erase(Device);
return true;
}
Sessions_.erase(Session);
return false;
}
bool AP_WS_Server::Connected(uint64_t SerialNumber) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return false;
return Device->second.second->State_.Connected;
}
bool AP_WS_Server::SendFrame(uint64_t SerialNumber, const std::string & Payload) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
try {
// std::cout << "Device connection pointer: " << (std::uint64_t) Device->second.second << std::endl;
return Device->second.second->Send(Payload);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendFrame: Could not send data to device '{}'", Utils::IntToSerialNumber(SerialNumber)));
}
return false;
}
void AP_WS_Server::StopWebSocketTelemetry(std::uint64_t RPCID, uint64_t SerialNumber) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second==nullptr)
return;
Device->second.second->StopWebSocketTelemetry(RPCID);
}
void AP_WS_Server::SetWebSocketTelemetryReporting(std::uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second==nullptr)
return;
Device->second.second->SetWebSocketTelemetryReporting(RPCID, Interval, Lifetime);
}
void AP_WS_Server::SetKafkaTelemetryReporting(std::uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return;
Device->second.second->SetKafkaTelemetryReporting(RPCID, Interval, Lifetime);
}
void AP_WS_Server::StopKafkaTelemetry(std::uint64_t RPCID, uint64_t SerialNumber) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return;
Device->second.second->StopKafkaTelemetry(RPCID);
}
void AP_WS_Server::GetTelemetryParameters(uint64_t SerialNumber , bool & TelemetryRunning,
uint64_t & TelemetryInterval,
uint64_t & TelemetryWebSocketTimer,
uint64_t & TelemetryKafkaTimer,
uint64_t & TelemetryWebSocketCount,
uint64_t & TelemetryKafkaCount,
uint64_t & TelemetryWebSocketPackets,
uint64_t & TelemetryKafkaPackets) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_)|| Device->second.second== nullptr)
return;
Device->second.second->GetTelemetryParameters(TelemetryRunning,
TelemetryInterval,
TelemetryWebSocketTimer,
TelemetryKafkaTimer,
TelemetryWebSocketCount,
TelemetryKafkaCount,
TelemetryWebSocketPackets,
TelemetryKafkaPackets);
}
bool AP_WS_Server::SendRadiusAccountingData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
try {
return Device->second.second->SendRadiusAccountingData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusAuthenticationData: Could not send data to device '{}'", SerialNumber));
}
return false;
}
bool AP_WS_Server::SendRadiusAuthenticationData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
try {
return Device->second.second->SendRadiusAuthenticationData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusAuthenticationData: Could not send data to device '{}'", SerialNumber));
}
return false;
}
bool AP_WS_Server::SendRadiusCoAData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
try {
return Device->second.second->SendRadiusCoAData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusCoAData: Could not send data to device '{}'", SerialNumber));
}
return false;
}
} //namespace

203
src/AP_WS_Server.h Normal file
View File

@@ -0,0 +1,203 @@
//
// License type: BSD 3-Clause License
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
//
// Created by Stephane Bourque on 2021-03-04.
// Arilia Wireless Inc.
//
#pragma once
#include <mutex>
#include <thread>
#include <array>
#include <ctime>
#include "framework/MicroService.h"
#include "Poco/AutoPtr.h"
#include "Poco/Net/SocketReactor.h"
#include "Poco/Net/ParallelSocketAcceptor.h"
#include "Poco/Net/SocketAcceptor.h"
#include "Poco/Timer.h"
#include "AP_WS_Connection.h"
#include "AP_WS_ReactorPool.h"
namespace OpenWifi {
class AP_WS_RequestHandler : public Poco::Net::HTTPRequestHandler {
public:
explicit AP_WS_RequestHandler(Poco::Logger &L, std::uint64_t id)
: Logger_(L),
id_(id){
};
void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override;
private:
Poco::Logger &Logger_;
std::uint64_t id_=0;
};
class AP_WS_RequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
public:
inline explicit AP_WS_RequestHandlerFactory(Poco::Logger &L)
: Logger_(L) {
}
inline Poco::Net::HTTPRequestHandler *
createRequestHandler(const Poco::Net::HTTPServerRequest &request) override {
if (request.find("Upgrade") != request.end() &&
Poco::icompare(request["Upgrade"], "websocket") == 0) {
Utils::SetThreadName("ws:conn-init");
return new AP_WS_RequestHandler(Logger_,id_++);
} else {
return nullptr;
}
}
private:
Poco::Logger &Logger_;
inline static std::uint64_t id_=1;
};
class AP_WS_Server : public SubSystemServer {
public:
static auto instance() {
static auto instance_ = new AP_WS_Server;
return instance_;
}
int Start() override;
void Stop() override;
bool IsCertOk() { return IssuerCert_!= nullptr; }
bool ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate);
// Poco::Net::SocketReactor & GetNextReactor() { return ReactorPool_.NextReactor(); }
inline bool IsSimSerialNumber(const std::string & SerialNumber) const {
return IsSim(Poco::toLower(SerialNumber)) && Poco::toLower(SerialNumber) == Poco::toLower(SimulatorId_);
}
inline static bool IsSim(const std::string & SerialNumber) {
return SerialNumber.substr(0,6) == "53494d";
}
inline bool IsSimEnabled() const {
return SimulatorEnabled_;
}
inline bool AllowSerialNumberMismatch() const {
return AllowSerialNumberMismatch_;
}
inline std::uint64_t MismatchDepth() const {
return MismatchDepth_;
}
inline bool UseProvisioning() const { return LookAtProvisioning_; }
inline bool UseDefaults() const { return UseDefaultConfig_; }
[[nodiscard]] inline Poco::Net::SocketReactor & NextReactor() { return Reactor_pool_->NextReactor(); }
[[nodiscard]] inline bool Running() const { return Running_; }
inline void AddConnection(std::uint64_t session_id, std::shared_ptr<AP_WS_Connection> Connection ) {
std::lock_guard Lock(LocalMutex_);
Sessions_[session_id] = std::make_pair(std::move(Connection),false);
}
inline std::shared_ptr<AP_WS_Connection> FindConnection(std::uint64_t session_id) const {
std::lock_guard Lock(LocalMutex_);
auto Connection = Sessions_.find(session_id);
if(Connection!=end(Sessions_))
return Connection->second.first;
return nullptr;
}
inline bool GetStatistics(const std::string &SerialNumber, std::string & Statistics) const {
return GetStatistics(Utils::SerialNumberToInt(SerialNumber),Statistics);
}
bool GetStatistics(std::uint64_t SerialNumber, std::string & Statistics) const ;
inline bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State) const {
return GetState(Utils::SerialNumberToInt(SerialNumber), State);
}
bool GetState(std::uint64_t SerialNumber, GWObjects::ConnectionState & State) const;
inline bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) const {
return GetHealthcheck(Utils::SerialNumberToInt(SerialNumber), CheckData);
}
bool GetHealthcheck(std::uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) const ;
bool Connected(uint64_t SerialNumber) const ;
inline bool SendFrame(const std::string & SerialNumber, const std::string & Payload) const {
return SendFrame(Utils::SerialNumberToInt(SerialNumber), Payload);
}
bool SendFrame(std::uint64_t SerialNumber, const std::string & Payload) const ;
bool SendRadiusAuthenticationData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size);
bool SendRadiusAccountingData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size);
bool SendRadiusCoAData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size);
void SetSessionDetails(std::uint64_t connection_id, uint64_t SerialNumber);
bool EndSession(std::uint64_t connection_id, std::uint64_t serial_number);
void SetWebSocketTelemetryReporting(std::uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime);
void StopWebSocketTelemetry(std::uint64_t RPCID, uint64_t SerialNumber);
void SetKafkaTelemetryReporting(std::uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime);
void StopKafkaTelemetry(std::uint64_t RPCID, uint64_t SerialNumber);
void GetTelemetryParameters(uint64_t SerialNumber , bool & TelemetryRunning,
uint64_t & TelemetryInterval,
uint64_t & TelemetryWebSocketTimer,
uint64_t & TelemetryKafkaTimer,
uint64_t & TelemetryWebSocketCount,
uint64_t & TelemetryKafkaCount,
uint64_t & TelemetryWebSocketPackets,
uint64_t & TelemetryKafkaPackets);
void onGarbageCollecting(Poco::Timer & timer);
inline void AverageDeviceStatistics( std::uint64_t & Connections, std::uint64_t & AverageConnectionTime, std::uint64_t & NumberOfConnectingDevices) const {
Connections = NumberOfConnectedDevices_;
AverageConnectionTime = AverageDeviceConnectionTime_;
NumberOfConnectingDevices = NumberOfConnectingDevices_;
}
private:
mutable std::recursive_mutex LocalMutex_;
std::unique_ptr<Poco::Crypto::X509Certificate> IssuerCert_;
std::list<std::unique_ptr<Poco::Net::HTTPServer>> WebServers_;
Poco::Net::SocketReactor Reactor_;
Poco::Thread ReactorThread_;
std::string SimulatorId_;
Poco::ThreadPool DeviceConnectionPool_{"ws:dev-pool", 2, 64};
bool LookAtProvisioning_ = false;
bool UseDefaultConfig_ = true;
bool SimulatorEnabled_=false;
std::unique_ptr<AP_WS_ReactorThreadPool> Reactor_pool_;
std::atomic_bool Running_=false;
std::map<std::uint64_t, std::pair<std::shared_ptr<AP_WS_Connection>,bool>> Sessions_;
std::map<std::uint64_t, std::pair<std::uint64_t,std::shared_ptr<AP_WS_Connection>>> SerialNumbers_;
std::atomic_bool AllowSerialNumberMismatch_=true;
std::atomic_uint64_t MismatchDepth_=2;
std::atomic_uint64_t NumberOfConnectedDevices_=0;
std::atomic_uint64_t AverageDeviceConnectionTime_=0;
std::atomic_uint64_t NumberOfConnectingDevices_=0;
std::vector<std::shared_ptr<AP_WS_Connection>> Garbage_;
std::unique_ptr<Poco::TimerCallback<AP_WS_Server>> GarbageCollectorCallback_;
Poco::Timer Timer_;
Poco::Thread GarbageCollector_;
AP_WS_Server() noexcept:
SubSystemServer("WebSocketServer", "WS-SVR", "ucentral.websocket") {
}
};
inline auto AP_WS_Server() { return AP_WS_Server::instance(); }
} //namespace

View File

@@ -5,6 +5,7 @@
#pragma once
#include "framework/MicroService.h"
#include "nlohmann/json.hpp"
namespace OpenWifi {

View File

@@ -7,115 +7,148 @@
//
#include <fstream>
#include "framework/MicroService.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h"
#include "Poco/File.h"
#include "CentralConfig.h"
#include "framework/MicroService.h"
#include "Daemon.h"
namespace OpenWifi::Config {
const static std::string BasicConfig {
R"lit({
"uuid": 1,
"radios": [
{
"band": "5G",
"country": "CA",
"channel-mode": "HE",
"channel-width": 80,
"channel": 32
}
],
"interfaces": [
{
"name": "WAN",
"role": "upstream",
"services": [ "lldp" ],
"ethernet": [
{
"select-ports": [
"WAN*"
]
}
],
"ipv4": {
"addressing": "dynamic"
},
"ssids": [
{
"name": "OpenWifi",
"wifi-bands": [
"5G"
],
"bss-mode": "ap",
"encryption": {
"proto": "psk2",
"key": "OpenWifi",
"ieee80211w": "optional"
}
}
]
},
{
"name": "LAN",
"role": "downstream",
"services": [ "ssh", "lldp" ],
"ethernet": [
{
"select-ports": [
"LAN*"
]
}
],
"ipv4": {
"addressing": "static",
"subnet": "192.168.1.1/24",
"dhcp": {
"lease-first": 10,
"lease-count": 100,
"lease-time": "6h"
}
},
"ssids": [
{
"name": "OpenWifi",
"wifi-bands": [
"5G"
],
"bss-mode": "ap",
"encryption": {
"proto": "psk2",
"key": "OpenWifi",
"ieee80211w": "optional"
}
}
]
}
],
"metrics": {
"statistics": {
"interval": 120,
"types": [ "ssids", "lldp", "clients" ]
},
"health": {
"interval": 120
}
},
"services": {
"lldp": {
"describe": "uCentral",
"location": "universe"
},
"ssh": {
"port": 22
}
}
})lit"};
R"lit(
{
"interfaces": [
{
"ethernet": [
{
"select-ports": [
"WAN*"
]
}
],
"ipv4": {
"addressing": "dynamic"
},
"name": "WAN",
"role": "upstream",
"services": [
"ssh",
"lldp",
"dhcp-snooping"
],
"ssids": [
{
"bss-mode": "ap",
"encryption": {
"ieee80211w": "optional",
"key": "OpenWifi",
"proto": "psk2"
},
"name": "OpenWifi",
"services": [
"wifi-frames"
],
"wifi-bands": [
"2G","5G"
]
}
]
},
{
"ethernet": [
{
"select-ports": [
"LAN*"
]
}
],
"ipv4": {
"addressing": "static",
"dhcp": {
"lease-count": 10000,
"lease-first": 10,
"lease-time": "6h"
},
"subnet": "192.168.1.1/16"
},
"name": "LAN",
"role": "downstream",
"services": [
"ssh",
"lldp",
"dhcp-snooping"
]
}
],
"metrics": {
"dhcp-snooping": {
"filters": [
"ack",
"discover",
"offer",
"request",
"solicit",
"reply",
"renew"
]
},
"health": {
"interval": 120
},
"statistics": {
"interval": 60,
"types": [
"ssids",
"lldp",
"clients"
]
},
"wifi-frames": {
"filters": [
"probe",
"auth",
"assoc",
"disassoc",
"deauth",
"local-deauth",
"inactive-deauth",
"key-mismatch",
"beacon-report",
"radar-detected"
]
}
},
"radios": [
{
"band": "2G",
"channel": "auto",
"channel-mode": "HE",
"country": "CA"
},
{
"allow-dfs": true,
"band": "5G",
"channel": "auto",
"channel-mode": "HE",
"country": "CA"
}
],
"services": {
"lldp": {
"describe": "TIP OpenWiFi",
"location": "QA"
},
"ssh": {
"port": 22
}
},
"uuid": 2
}
)lit"};
void Config::SetBasicConfigFile() {
try {

View File

@@ -8,176 +8,277 @@
#include <algorithm>
#include "framework/MicroService.h"
#include "Poco/JSON/Parser.h"
#include "CommandManager.h"
#include "DeviceRegistry.h"
#include "RESTObjects//RESTAPI_GWobjects.h"
#include "AP_WS_Server.h"
#include "StorageService.h"
#include "framework/MicroService.h"
#include "framework/uCentral_Protocol.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void CommandManager::run() {
Utils::SetThreadName("cmd:mgr");
Running_ = true;
while(Running_)
{
Poco::Thread::trySleep(30000);
if(!Running_)
break;
std::vector<GWObjects::CommandDetails> Commands;
if(StorageService()->GetReadyToExecuteCommands(0,200,Commands))
{
for(auto & Cmd: Commands)
{
if(!Running_)
break;
try {
Poco::JSON::Parser P;
bool Sent;
Logger().information(Poco::format("Parsing: %s", Cmd.UUID));
auto Params = P.parse(Cmd.Details).extract<Poco::JSON::Object::Ptr>();
Logger().information(Poco::format("Parsed: %s", Cmd.UUID));
auto Result = PostCommandDisk( Cmd.SerialNumber,
Cmd.Command,
*Params,
Cmd.UUID,
Sent);
if(Sent) {
StorageService()->SetCommandExecuted(Cmd.UUID);
Logger().information(Poco::format("%s: Sent command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
} else {
Logger().information(Poco::format("%s: Could not send command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
Poco::AutoPtr<Poco::Notification> NextMsg(ResponseQueue_.waitDequeueNotification());
while (NextMsg && Running_) {
auto Resp = dynamic_cast<RPCResponseNotification *>(NextMsg.get());
try {
if (Resp != nullptr) {
const Poco::JSON::Object &Payload = Resp->Payload_;
const std::string &SerialNumber = Resp->SerialNumber_;
std::ostringstream SS;
Payload.stringify(SS);
if (!Payload.has(uCentralProtocol::ID)) {
poco_error(Logger(), fmt::format("({}): Invalid RPC response.", SerialNumber));
} else {
uint64_t ID = Payload.get(uCentralProtocol::ID);
poco_debug(Logger(),fmt::format("({}): Processing {} response.", SerialNumber, ID));
if (ID > 1) {
std::lock_guard Lock(LocalMutex_);
auto RPC = OutStandingRequests_.find(ID);
if (RPC == OutStandingRequests_.end() ||
RPC->second.SerialNumber !=
Utils::SerialNumberToInt(Resp->SerialNumber_)) {
poco_debug(Logger(),
fmt::format("({}): RPC {} completed.", SerialNumber, ID));
} else {
std::chrono::duration<double, std::milli> rpc_execution_time =
std::chrono::high_resolution_clock::now() -
RPC->second.submitted;
StorageService()->CommandCompleted(RPC->second.UUID, Payload,
rpc_execution_time, true);
if (RPC->second.rpc_entry) {
RPC->second.rpc_entry->set_value(Payload);
}
poco_debug(Logger(),
fmt::format("({}): Received RPC answer {}. Command={}",
SerialNumber, ID, RPC->second.Command));
OutStandingRequests_.erase(ID);
}
}
} catch (const Poco::Exception &E) {
Logger().information(Poco::format("%s: Failed command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
Logger().log(E);
StorageService()->SetCommandExecuted(Cmd.UUID);
} catch (...) {
Logger().information(Poco::format("%s: Exception - hard fail - Failed command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
StorageService()->SetCommandExecuted(Cmd.UUID);
}
}
}
}
}
}
} catch (const Poco::Exception &E) {
Logger().log(E);
} catch (...) {
poco_warning(Logger(),"Exception occurred during run.");
}
NextMsg = ResponseQueue_.waitDequeueNotification();
}
poco_information(Logger(),"RPC Command processor stopping.");
}
int CommandManager::Start() {
Logger().notice("Starting...");
ManagerThread.start(*this);
JanitorCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(*this,&CommandManager::onTimer);
Timer_.setStartInterval( 10000 );
Timer_.setPeriodicInterval(5 * 60 * 1000); // 1 hours
Timer_.start(*JanitorCallback_);
poco_notice(Logger(),"Starting...");
ManagerThread.start(*this);
JanitorCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(*this,&CommandManager::onJanitorTimer);
JanitorTimer_.setStartInterval( 10000 );
JanitorTimer_.setPeriodicInterval(10 * 60 * 1000); // 1 hours
JanitorTimer_.start(*JanitorCallback_, MicroService::instance().TimerPool());
CommandRunnerCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(*this,&CommandManager::onCommandRunnerTimer);
CommandRunnerTimer_.setStartInterval( 10000 );
CommandRunnerTimer_.setPeriodicInterval(30 * 1000); // 1 hours
CommandRunnerTimer_.start(*CommandRunnerCallback_, MicroService::instance().TimerPool());
return 0;
}
void CommandManager::Stop() {
Logger().notice("Stopping...");
poco_notice(Logger(),"Stopping...");
Running_ = false;
Timer_.stop();
JanitorTimer_.stop();
CommandRunnerTimer_.stop();
ResponseQueue_.wakeUpAll();
ManagerThread.wakeUp();
ManagerThread.join();
poco_notice(Logger(),"Stopped...");
}
void CommandManager::WakeUp() {
Logger().notice("Waking up...");
poco_notice(Logger(),"Waking up...");
ManagerThread.wakeUp();
}
void CommandManager::onTimer(Poco::Timer & timer) {
std::lock_guard G(Mutex_);
Logger().information("Removing expired commands: start");
auto Now = std::chrono::high_resolution_clock::now();
for(auto i=OutStandingRequests_.begin();i!=OutStandingRequests_.end();) {
std::chrono::duration<double, std::milli> delta = Now - i->second->submitted;
if(delta > 120000ms) {
i = OutStandingRequests_.erase(i);
void CommandManager::onJanitorTimer([[maybe_unused]] Poco::Timer & timer) {
std::lock_guard Lock(LocalMutex_);
Utils::SetThreadName("cmd:janitor");
Poco::Logger & MyLogger = Poco::Logger::get("CMD-MGR-JANITOR");
auto now = std::chrono::high_resolution_clock::now();
for(auto request=OutStandingRequests_.begin();request!=OutStandingRequests_.end();) {
std::chrono::duration<double, std::milli> delta = now - request->second.submitted;
if(delta > 10min) {
MyLogger.debug(fmt::format("{}: Command={} for {} Timed out.",
request->second.UUID,
request->second.Command,
Utils::IntToSerialNumber(request->second.SerialNumber)));
request = OutStandingRequests_.erase(request);
} else {
++i;
++request;
}
}
Logger().information("Removing expired commands: done");
poco_information(MyLogger,
fmt::format("Outstanding-requests {}", OutStandingRequests_.size()));
}
std::shared_ptr<CommandManager::promise_type_t> CommandManager::PostCommand( const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool oneway_rpc,
bool disk_only,
bool & Sent) {
Sent=false;
if(!DeviceRegistry()->Connected(SerialNumber)) {
return nullptr;
bool CommandManager::IsCommandRunning(const std::string &C) {
std::lock_guard Lock(LocalMutex_);
for (const auto &request : OutStandingRequests_) {
if (request.second.UUID == C) {
return true;
}
}
return false;
}
void CommandManager::onCommandRunnerTimer([[maybe_unused]] Poco::Timer &timer) {
Utils::SetThreadName("cmd:schdlr");
Poco::Logger &MyLogger = Poco::Logger::get("CMD-MGR-SCHEDULER");
poco_trace(MyLogger,"Scheduler starting.");
try {
StorageService()->RemovedExpiredCommands();
StorageService()->RemoveTimedOutCommands();
std::vector<GWObjects::CommandDetails> Commands;
if (StorageService()->GetReadyToExecuteCommands(0, 200, Commands)) {
poco_trace(MyLogger,fmt::format("Scheduler about to process {} commands.", Commands.size()));
for (auto &Cmd : Commands) {
if (!Running_) {
poco_warning(MyLogger,"Scheduler quitting because service is stopping.");
break;
}
poco_trace(
MyLogger, fmt::format("{}: Serial={} Command={} Starting processing.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
try {
// Skip an already running command
if(IsCommandRunning(Cmd.UUID))
continue;
auto now = OpenWifi::Now();
// 2 hour timeout for commands
if ((now - Cmd.Submitted) > (1 * 60 * 60)) {
poco_information(
MyLogger, fmt::format("{}: Serial={} Command={} has expired.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
StorageService()->SetCommandTimedOut(Cmd.UUID);
continue;
}
if (!AP_WS_Server()->Connected(
Utils::SerialNumberToInt(Cmd.SerialNumber))) {
poco_trace(
MyLogger,
fmt::format(
"{}: Serial={} Command={} Device is not connected.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
continue;
}
std::string ExecutingCommand, ExecutingUUID;
if (CommandRunningForDevice(Utils::SerialNumberToInt(Cmd.SerialNumber),
ExecutingUUID, ExecutingCommand)) {
poco_trace(
MyLogger,
fmt::format(
"{}: Serial={} Command={} Device is already busy with command {} (Command={})."
, Cmd.UUID, Cmd.SerialNumber, Cmd.Command,ExecutingUUID, ExecutingCommand));
continue;
}
Poco::JSON::Parser P;
bool Sent;
poco_information(MyLogger, fmt::format("{}: Serial={} Command={} Preparing execution.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
auto Params = P.parse(Cmd.Details).extract<Poco::JSON::Object::Ptr>();
auto Result = PostCommandDisk(NextRPCId(), Cmd.SerialNumber, Cmd.Command,
*Params, Cmd.UUID, Sent);
if (Sent) {
StorageService()->SetCommandExecuted(Cmd.UUID);
poco_debug(MyLogger,
fmt::format("{}: Serial={} Command={} Sent.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
} else {
poco_debug(MyLogger,
fmt::format("{}: Serial={} Command={} Re-queued command.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
}
} catch (const Poco::Exception &E) {
poco_debug(MyLogger,
fmt::format("{}: Serial={} Command={} Failed. Command marked as completed.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
MyLogger.log(E);
StorageService()->SetCommandExecuted(Cmd.UUID);
} catch (...) {
poco_debug(MyLogger,
fmt::format("{}: Serial={} Command={} Hard failure. Command marked as completed.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
StorageService()->SetCommandExecuted(Cmd.UUID);
}
}
}
} catch (Poco::Exception &E) {
MyLogger.log(E);
} catch (...) {
poco_warning(MyLogger,"Exception during command processing.");
}
poco_trace(MyLogger,"Scheduler done.");
}
std::shared_ptr<CommandManager::promise_type_t> CommandManager::PostCommand(
uint64_t RPCID,
const std::string &SerialNumber,
const std::string &Command,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool oneway_rpc,
bool disk_only,
bool & Sent) {
auto SerialNumberInt = Utils::SerialNumberToInt(SerialNumber);
Sent=false;
std::stringstream ToSend;
auto Object = std::make_shared<RpcObject>();
CommandTagIndex Idx;
{
std::lock_guard M(Mutex_);
if (oneway_rpc)
Idx.Id = 1;
else
Idx.Id = ++Id_;
Idx.SerialNumber = SerialNumber;
CommandInfo Idx;
Idx.Id = oneway_rpc ? 1 : RPCID;
Idx.SerialNumber = SerialNumberInt;
Idx.Command = Command;
Idx.UUID = UUID;
Poco::JSON::Object CompleteRPC;
CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
CompleteRPC.set(uCentralProtocol::ID, Idx.Id);
CompleteRPC.set(uCentralProtocol::METHOD, Method);
CompleteRPC.set(uCentralProtocol::PARAMS, Params);
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
Logger().information(
Poco::format("(%s): Sending command '%s', ID: %lu", SerialNumber, Method, Idx.Id));
Poco::JSON::Object CompleteRPC;
CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
CompleteRPC.set(uCentralProtocol::ID, RPCID);
CompleteRPC.set(uCentralProtocol::METHOD, Command);
CompleteRPC.set(uCentralProtocol::PARAMS, Params);
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
Idx.rpc_entry = disk_only ? nullptr : std::make_shared<CommandManager::promise_type_t>();
Object->submitted = std::chrono::high_resolution_clock::now();
Object->uuid = UUID;
if(disk_only) {
Object->rpc_entry = nullptr;
} else {
Object->rpc_entry = std::make_shared<CommandManager::promise_type_t>();
poco_debug(Logger(), fmt::format("{}: Sending command. ID: {}", UUID, RPCID));
if(AP_WS_Server()->SendFrame(SerialNumber, ToSend.str())) {
if(!oneway_rpc) {
std::lock_guard M(Mutex_);
OutStandingRequests_[RPCID] = Idx;
}
OutStandingRequests_[Idx] = Object;
poco_debug(Logger(), fmt::format("{}: Sent command. ID: {}", UUID, RPCID));
Sent=true;
return Idx.rpc_entry;
}
if(DeviceRegistry()->SendFrame(SerialNumber, ToSend.str())) {
Sent=true;
return Object->rpc_entry;
}
poco_warning(Logger(), fmt::format("{}: Failed to send command. ID: {}", UUID, RPCID));
return nullptr;
}
void CommandManager::PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj) {
if(!Obj->has(uCentralProtocol::ID)){
Logger().error(Poco::format("(%s): Invalid RPC response.",SerialNumber));
return;
}
uint64_t ID = Obj->get(uCentralProtocol::ID);
if(ID<2) {
Logger().error(Poco::format("(%s): Ignoring RPC response.",SerialNumber));
return;
}
std::lock_guard G(Mutex_);
auto Idx = CommandTagIndex{.Id = ID, .SerialNumber = SerialNumber};
auto RPC = OutStandingRequests_.find(Idx);
if (RPC == OutStandingRequests_.end()) {
Logger().warning(Poco::format("(%s): Outdated RPC %lu", SerialNumber, ID));
return;
}
std::chrono::duration<double, std::milli> rpc_execution_time = std::chrono::high_resolution_clock::now() - RPC->second->submitted;
StorageService()->CommandCompleted(RPC->second->uuid, Obj, rpc_execution_time, true);
if(RPC->second->rpc_entry) {
RPC->second->rpc_entry->set_value(Obj);
}
Logger().information(Poco::format("(%s): Received RPC answer %lu", SerialNumber, ID));
}
} // namespace

View File

@@ -13,58 +13,73 @@
#include <map>
#include <utility>
#include <functional>
#include <shared_mutex>
#include "framework/MicroService.h"
#include "Poco/JSON/Object.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Timer.h"
#include "RESTObjects//RESTAPI_GWobjects.h"
#include "framework/MicroService.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
namespace OpenWifi {
struct CommandTagIndex {
uint64_t Id=0;
std::string SerialNumber;
class RPCResponseNotification: public Poco::Notification {
public:
RPCResponseNotification(const std::string &ser,
const Poco::JSON::Object &pl) :
SerialNumber_(ser),
Payload_(pl)
{
}
std::string SerialNumber_;
Poco::JSON::Object Payload_;
};
inline bool operator <(const CommandTagIndex& lhs, const CommandTagIndex& rhs) {
if(lhs.Id<rhs.Id)
return true;
if(lhs.Id>rhs.Id)
return false;
return lhs.SerialNumber<rhs.SerialNumber;
}
inline bool operator ==(const CommandTagIndex& lhs, const CommandTagIndex& rhs) {
if(lhs.Id == rhs.Id && lhs.SerialNumber == rhs.SerialNumber)
return true;
return false;
}
class CommandManager : public SubSystemServer, Poco::Runnable {
class CommandManager : public SubSystemServer, Poco::Runnable {
public:
typedef Poco::JSON::Object::Ptr objtype_t;
typedef Poco::JSON::Object objtype_t;
typedef std::promise<objtype_t> promise_type_t;
struct RpcObject {
std::string uuid;
struct CommandInfo {
std::uint64_t Id=0;
std::uint64_t SerialNumber=0;
std::string Command;
std::string UUID;
std::chrono::time_point<std::chrono::high_resolution_clock> submitted = std::chrono::high_resolution_clock::now();
std::shared_ptr<promise_type_t> rpc_entry;
};
struct RPCResponse {
std::string serialNumber;
Poco::JSON::Object payload;
explicit RPCResponse(const std::string &ser, const Poco::JSON::Object &pl)
:
serialNumber(ser),
payload(pl) {
}
};
int Start() override;
void Stop() override;
void WakeUp();
void PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj);
inline void PostCommandResult(const std::string &SerialNumber, const Poco::JSON::Object &Obj) {
// RPCResponseQueue_->Write(RPCResponse{.serialNumber=SerialNumber, .payload = Obj});
ResponseQueue_.enqueueNotification(new RPCResponseNotification(SerialNumber,Obj));
}
std::shared_ptr<promise_type_t> PostCommandOneWayDisk(
std::shared_ptr<promise_type_t> PostCommandOneWayDisk(uint64_t RPCID,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(SerialNumber,
return PostCommand(RPCID, SerialNumber,
Method,
Params,
UUID,
@@ -72,12 +87,14 @@ namespace OpenWifi {
}
std::shared_ptr<promise_type_t> PostCommandDisk(
uint64_t RPCID,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(SerialNumber,
return PostCommand(RPCID,
SerialNumber,
Method,
Params,
UUID,
@@ -85,12 +102,13 @@ namespace OpenWifi {
}
std::shared_ptr<promise_type_t> PostCommand(
uint64_t RPCID,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(SerialNumber,
return PostCommand(RPCID, SerialNumber,
Method,
Params,
UUID,
@@ -99,12 +117,14 @@ namespace OpenWifi {
}
std::shared_ptr<promise_type_t> PostCommandOneWay(
uint64_t RPCID,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(SerialNumber,
return PostCommand(RPCID,
SerialNumber,
Method,
Params,
UUID,
@@ -112,6 +132,8 @@ namespace OpenWifi {
false, Sent );
}
bool IsCommandRunning(const std::string &C);
void run() override;
static auto instance() {
@@ -120,17 +142,53 @@ namespace OpenWifi {
}
inline bool Running() const { return Running_; }
void onTimer(Poco::Timer & timer);
void onJanitorTimer(Poco::Timer & timer);
void onCommandRunnerTimer(Poco::Timer & timer);
void onRPCAnswer(bool& b);
inline uint64_t NextRPCId() { return ++Id_; }
void RemovePendingCommand(std::uint64_t Id) {
std::unique_lock Lock(LocalMutex_);
OutStandingRequests_.erase(Id);
}
inline bool CommandRunningForDevice(std::uint64_t SerialNumber, std::string & uuid, std::string &command) {
std::lock_guard Lock(LocalMutex_);
for(const auto &[Request,Command]:OutStandingRequests_) {
if(Command.SerialNumber==SerialNumber) {
uuid = Command.UUID;
command = Command.Command;
return true;
}
}
return false;
}
inline void ClearQueue(std::uint64_t SerialNumber) {
std::lock_guard Lock(LocalMutex_);
for(auto Request = OutStandingRequests_.begin(); Request != OutStandingRequests_.end() ; ) {
if(Request->second.SerialNumber==SerialNumber)
Request = OutStandingRequests_.erase(Request);
else
++Request;
}
}
private:
mutable std::recursive_mutex LocalMutex_;
std::atomic_bool Running_ = false;
Poco::Thread ManagerThread;
uint64_t Id_=3; // do not start @1. We ignore ID=1 & 0 is illegal..
std::map<CommandTagIndex,std::shared_ptr<RpcObject>> OutStandingRequests_;
Poco::Timer Timer_;
std::atomic_uint64_t Id_=3; // do not start @1. We ignore ID=1 & 0 is illegal..
std::map<std::uint64_t , CommandInfo> OutStandingRequests_;
Poco::Timer JanitorTimer_;
std::unique_ptr<Poco::TimerCallback<CommandManager>> JanitorCallback_;
Poco::Timer CommandRunnerTimer_;
std::unique_ptr<Poco::TimerCallback<CommandManager>> CommandRunnerCallback_;
Poco::NotificationQueue ResponseQueue_;
std::shared_ptr<promise_type_t> PostCommand(
uint64_t RPCID,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,

View File

@@ -6,25 +6,27 @@
// Arilia Wireless Inc.
//
#include <boost/algorithm/string.hpp>
#include "framework/MicroService.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/Option.h"
#include "Poco/Environment.h"
#include "Poco/Net/SSLManager.h"
#include "CentralConfig.h"
#include "AP_WS_Server.h"
#include "CommandManager.h"
#include "Daemon.h"
#include "DeviceRegistry.h"
#include "FileUploader.h"
#include "FindCountry.h"
#include "OUIServer.h"
#include "RADIUS_proxy_server.h"
#include "SerialNumberCache.h"
#include "StorageArchiver.h"
#include "StorageService.h"
#include "TelemetryStream.h"
#include "WS_Server.h"
#include "VenueBroadcaster.h"
#include "framework/ConfigurationValidator.h"
#include "framework/MicroService.h"
#include "FindCountry.h"
#include "rttys/RTTYS_server.h"
namespace OpenWifi {
@@ -38,15 +40,18 @@ namespace OpenWifi {
StorageService(),
SerialNumberCache(),
ConfigurationValidator(),
WebSocketClientServer(),
OUIServer(),
FindCountryFromIP(),
DeviceRegistry(),
// DeviceRegistry(),
CommandManager(),
FileUploader(),
StorageArchiver(),
TelemetryStream(),
RTTYS_server(),
WebSocketServer()
RADIUS_proxy_server(),
VenueBroadcaster(),
AP_WS_Server()
});
return &instance;
}
@@ -84,14 +89,12 @@ namespace OpenWifi {
{"wallys_dr40x9","AP"}
};
void Daemon::initialize() {
void Daemon::PostInitialization([[maybe_unused]] Poco::Util::Application &self) {
AutoProvisioning_ = config().getBool("openwifi.autoprovisioning",false);
DeviceTypes_ = DefaultDeviceTypes;
}
void MicroServicePostInitialization() {
Daemon()->initialize();
}
WebSocketProcessor_ = std::make_unique<GwWebSocketClient>(logger());
}
[[nodiscard]] std::string Daemon::IdentifyDevice(const std::string & Id ) const {
for(const auto &[DeviceType,Type]:DeviceTypes_)
@@ -104,16 +107,25 @@ namespace OpenWifi {
}
int main(int argc, char **argv) {
int ExitCode;
try {
Poco::Net::SSLManager::instance().initializeServer(nullptr, nullptr, nullptr);
auto App = OpenWifi::Daemon::instance();
auto ExitCode = App->run(argc, argv);
return ExitCode;
ExitCode = App->run(argc, argv);
Poco::Net::SSLManager::instance().shutdown();
} catch (Poco::Exception &exc) {
std::cerr << exc.displayText() << std::endl;
return Poco::Util::Application::EXIT_SOFTWARE;
ExitCode = Poco::Util::Application::EXIT_SOFTWARE;
std::cout << exc.displayText() << std::endl;
} catch (std::exception &exc) {
ExitCode = Poco::Util::Application::EXIT_TEMPFAIL;
std::cout << exc.what() << std::endl;
} catch (...) {
ExitCode = Poco::Util::Application::EXIT_TEMPFAIL;
std::cout << "Exception on closure" << std::endl;
}
std::cout << "Exitcode: " << ExitCode << std::endl;
return ExitCode;
}
// end of namespace

View File

@@ -14,6 +14,8 @@
#include <vector>
#include <set>
#include "framework/MicroService.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/ServerApplication.h"
#include "Poco/Util/Option.h"
@@ -25,16 +27,16 @@
#include "Poco/Crypto/Cipher.h"
#include "Dashboard.h"
#include "framework/MicroService.h"
#include "framework/OpenWifiTypes.h"
#include "GwWebSocketClient.h"
namespace OpenWifi {
static const char * vDAEMON_PROPERTIES_FILENAME = "owgw.properties";
static const char * vDAEMON_ROOT_ENV_VAR = "OWGW_ROOT";
static const char * vDAEMON_CONFIG_ENV_VAR = "OWGW_CONFIG";
static const char * vDAEMON_APP_NAME = uSERVICE_GATEWAY.c_str();
static const uint64_t vDAEMON_BUS_TIMER = 10000;
[[maybe_unused]] static const char * vDAEMON_PROPERTIES_FILENAME = "owgw.properties";
[[maybe_unused]] static const char * vDAEMON_ROOT_ENV_VAR = "OWGW_ROOT";
[[maybe_unused]] static const char * vDAEMON_CONFIG_ENV_VAR = "OWGW_CONFIG";
[[maybe_unused]] static const char * vDAEMON_APP_NAME = uSERVICE_GATEWAY.c_str();
[[maybe_unused]] static const uint64_t vDAEMON_BUS_TIMER = 10000;
class Daemon : public MicroService {
public:
@@ -48,17 +50,20 @@ namespace OpenWifi {
bool AutoProvisioning() const { return AutoProvisioning_ ; }
[[nodiscard]] std::string IdentifyDevice(const std::string & Compatible) const;
void initialize();
static Daemon *instance();
inline DeviceDashboard & GetDashboard() { return DB_; }
Poco::Logger & Log() { return Poco::Logger::get(AppName()); }
void PostInitialization(Poco::Util::Application &self);
private:
bool AutoProvisioning_ = false;
std::vector<std::pair<std::string,std::string>> DeviceTypes_;
DeviceDashboard DB_;
std::unique_ptr<GwWebSocketClient> WebSocketProcessor_;
};
inline Daemon * Daemon() { return Daemon::instance(); }
inline void DaemonPostInitialization(Poco::Util::Application &self) {
Daemon()->PostInitialization(self);
}
}

View File

@@ -3,12 +3,11 @@
//
#include "Dashboard.h"
#include "DeviceRegistry.h"
#include "StorageService.h"
namespace OpenWifi {
void DeviceDashboard::Create() {
uint64_t Now = std::time(nullptr);
uint64_t Now = OpenWifi::Now();
if(LastRun_==0 || (Now-LastRun_)>120) {
DB_.reset();

View File

@@ -7,144 +7,258 @@
//
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h"
#include "AP_WS_Server.h"
#include "DeviceRegistry.h"
#include "WS_Server.h"
#include "OUIServer.h"
#include "CommandManager.h"
#include "framework/WebSocketClientNotifications.h"
namespace OpenWifi {
int DeviceRegistry::Start() {
std::lock_guard Guard(Mutex_);
Logger().notice("Starting ");
return 0;
poco_notice(Logger(),"Starting");
ArchiverCallback_ = std::make_unique<Poco::TimerCallback<DeviceRegistry>>(*this,&DeviceRegistry::onConnectionJanitor);
Timer_.setStartInterval(60 * 1000);
Timer_.setPeriodicInterval(20 * 1000); // every minute
Timer_.start(*ArchiverCallback_, MicroService::instance().TimerPool());
return 0;
}
void DeviceRegistry::Stop() {
poco_notice(Logger(),"Stopping...");
std::lock_guard Guard(Mutex_);
Logger().notice("Stopping ");
Timer_.stop();
poco_notice(Logger(),"Stopped...");
}
bool DeviceRegistry::GetStatistics(uint64_t SerialNumber, std::string & Statistics) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device == Devices_.end())
return false;
Statistics = Device->second->LastStats;
return true;
}
void DeviceRegistry::onConnectionJanitor([[maybe_unused]] Poco::Timer &timer) {
void DeviceRegistry::SetStatistics(uint64_t SerialNumber, const std::string &Statistics) {
std::lock_guard Guard(Mutex_);
static std::uint64_t last_log = OpenWifi::Now();
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end())
{
Device->second->Conn_.LastContact = time(nullptr);
Device->second->LastStats = Statistics;
}
}
std::shared_lock Guard(LocalMutex_);
bool DeviceRegistry::GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device == Devices_.end())
return false;
NumberOfConnectedDevices_ = 0;
NumberOfConnectingDevices_ = 0;
AverageDeviceConnectionTime_ = 0;
std::uint64_t total_connected_time=0;
State = Device->second->Conn_;
return true;
}
auto now = OpenWifi::Now();
for (auto connection=SerialNumbers_.begin(); connection!=SerialNumbers_.end();) {
void DeviceRegistry::SetState(uint64_t SerialNumber, const GWObjects::ConnectionState & State) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end())
{
Device->second->Conn_.LastContact = time(nullptr);
Device->second->Conn_ = State;
}
}
if(connection->second.second== nullptr) {
connection++;
continue;
}
bool DeviceRegistry::GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end()) {
CheckData = Device->second->LastHealthcheck;
return true;
}
return false;
}
void DeviceRegistry::SetHealthcheck(uint64_t SerialNumber, const GWObjects::HealthCheck & CheckData) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end())
{
Device->second->LastHealthcheck = CheckData;
}
}
std::shared_ptr<DeviceRegistry::ConnectionEntry> DeviceRegistry::Register(uint64_t SerialNumber, WSConnection *Ptr, uint64_t & ConnectionId )
{
std::lock_guard Guard(Mutex_);
const auto & E = Devices_[SerialNumber] = std::make_shared<ConnectionEntry>();
E->WSConn_ = Ptr;
E->Conn_.LastContact = std::time(nullptr);
E->Conn_.Connected = true ;
E->Conn_.UUID = 0 ;
E->Conn_.MessageCount = 0 ;
E->Conn_.Address = "";
E->Conn_.TX = 0 ;
E->Conn_.RX = 0;
E->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
ConnectionId = E->ConnectionId = ++Id_;
return E;
}
bool DeviceRegistry::Connected(uint64_t SerialNumber) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device == Devices_.end())
return false;
return Device->second->Conn_.Connected;
}
void DeviceRegistry::UnRegister(uint64_t SerialNumber, uint64_t ConnectionId) {
std::lock_guard Guard(Mutex_);
auto It = Devices_.find(SerialNumber);
if(It!=Devices_.end()) {
if(It->second->ConnectionId == ConnectionId)
Devices_.erase(SerialNumber);
}
}
bool DeviceRegistry::SendFrame(uint64_t SerialNumber, const std::string & Payload) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device!=Devices_.end() && Device->second->WSConn_!= nullptr) {
try {
return Device->second->WSConn_->Send(Payload);
} catch (...) {
Logger().debug(Poco::format("Could not send data to device '%s'", SerialNumber));
Device->second->Conn_.Address = "";
Device->second->WSConn_ = nullptr;
Device->second->Conn_.Connected = false;
Device->second->Conn_.VerifiedCertificate = GWObjects::NO_CERTIFICATE;
if (connection->second.second->State_.Connected) {
NumberOfConnectedDevices_++;
total_connected_time += (now - connection->second.second->State_.started);
connection++;
} else {
NumberOfConnectingDevices_++;
connection++;
}
}
AverageDeviceConnectionTime_ = (NumberOfConnectedDevices_!=0) ? total_connected_time/NumberOfConnectedDevices_ : 0;
if((now-last_log)>120) {
last_log = now;
poco_information(Logger(),
fmt::format("Active AP connections: {} Connecting: {} Average connection time: {} seconds",
NumberOfConnectedDevices_, NumberOfConnectingDevices_, AverageDeviceConnectionTime_));
}
WebSocketClientNotificationNumberOfConnections(NumberOfConnectedDevices_,
AverageDeviceConnectionTime_,
NumberOfConnectingDevices_);
}
bool DeviceRegistry::GetStatistics(uint64_t SerialNumber, std::string & Statistics) const {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
Statistics = Device->second.second->LastStats_;
return true;
}
bool DeviceRegistry::GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State) const {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
State = Device->second.second->State_;
return true;
}
bool DeviceRegistry::GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) const {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
CheckData = Device->second.second->LastHealthcheck_;
return true;
}
bool DeviceRegistry::EndSession(std::uint64_t connection_id, std::uint64_t serial_number) {
std::unique_lock G(LocalMutex_);
auto Connection = SerialNumbers_.find(serial_number);
if (Connection == end(SerialNumbers_)) {
return false;
}
if (Connection->second.first != connection_id) {
return false;
}
SerialNumbers_.erase(Connection);
return true;
}
void DeviceRegistry::SetSessionDetails(std::uint64_t connection_id, uint64_t SerialNumber) {
auto Connection = AP_WS_Server()->FindConnection(connection_id);
if(Connection== nullptr)
return;
std::unique_lock G(LocalMutex_);
auto CurrentSerialNumber = SerialNumbers_.find(SerialNumber);
if( (CurrentSerialNumber==SerialNumbers_.end()) ||
(CurrentSerialNumber->second.first<connection_id)) {
SerialNumbers_[SerialNumber] = std::make_pair(connection_id, Connection);
return;
}
}
bool DeviceRegistry::Connected(uint64_t SerialNumber) const {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return false;
return Device->second.second->State_.Connected;
}
bool DeviceRegistry::SendFrame(uint64_t SerialNumber, const std::string & Payload) const {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
try {
// std::cout << "Device connection pointer: " << (std::uint64_t) Device->second.second << std::endl;
return Device->second.second->Send(Payload);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendFrame: Could not send data to device '{}'", Utils::IntToSerialNumber(SerialNumber)));
}
return false;
}
void DeviceRegistry::SetPendingUUID(uint64_t SerialNumber, uint64_t PendingUUID) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device!=Devices_.end()) {
Device->second->Conn_.PendingUUID = PendingUUID;
void DeviceRegistry::StopWebSocketTelemetry(std::uint64_t RPCID, uint64_t SerialNumber) {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second==nullptr)
return;
Device->second.second->StopWebSocketTelemetry(RPCID);
}
void DeviceRegistry::SetWebSocketTelemetryReporting(std::uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime) {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second==nullptr)
return;
Device->second.second->SetWebSocketTelemetryReporting(RPCID, Interval, Lifetime);
}
void DeviceRegistry::SetKafkaTelemetryReporting(std::uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime) {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return;
Device->second.second->SetKafkaTelemetryReporting(RPCID, Interval, Lifetime);
}
void DeviceRegistry::StopKafkaTelemetry(std::uint64_t RPCID, uint64_t SerialNumber) {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return;
Device->second.second->StopKafkaTelemetry(RPCID);
}
void DeviceRegistry::GetTelemetryParameters(uint64_t SerialNumber , bool & TelemetryRunning,
uint64_t & TelemetryInterval,
uint64_t & TelemetryWebSocketTimer,
uint64_t & TelemetryKafkaTimer,
uint64_t & TelemetryWebSocketCount,
uint64_t & TelemetryKafkaCount,
uint64_t & TelemetryWebSocketPackets,
uint64_t & TelemetryKafkaPackets) {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_)|| Device->second.second== nullptr)
return;
Device->second.second->GetTelemetryParameters(TelemetryRunning,
TelemetryInterval,
TelemetryWebSocketTimer,
TelemetryKafkaTimer,
TelemetryWebSocketCount,
TelemetryKafkaCount,
TelemetryWebSocketPackets,
TelemetryKafkaPackets);
}
bool DeviceRegistry::SendRadiusAccountingData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
try {
return Device->second.second->SendRadiusAccountingData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusAuthenticationData: Could not send data to device '{}'", SerialNumber));
}
return false;
}
bool DeviceRegistry::SendRadiusAuthenticationData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
try {
return Device->second.second->SendRadiusAuthenticationData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusAuthenticationData: Could not send data to device '{}'", SerialNumber));
}
return false;
}
bool DeviceRegistry::SendRadiusCoAData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::shared_lock Guard(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
try {
return Device->second.second->SendRadiusCoAData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusCoAData: Could not send data to device '{}'", SerialNumber));
}
return false;
}
} // namespace

View File

@@ -8,25 +8,23 @@
#pragma once
#include "Poco/JSON/Object.h"
#include <shared_mutex>
#include "RESTObjects//RESTAPI_GWobjects.h"
#include "framework/MicroService.h"
// class uCentral::WebSocket::WSConnection;
#include "Poco/JSON/Object.h"
#include "Poco/Timer.h"
#include "RESTObjects//RESTAPI_GWobjects.h"
namespace OpenWifi {
class WSConnection;
class AP_WS_Connection;
class DeviceRegistry : public SubSystemServer {
public:
struct ConnectionEntry {
WSConnection * WSConn_ = nullptr;
GWObjects::ConnectionState Conn_;
std::string LastStats;
GWObjects::HealthCheck LastHealthcheck;
uint64_t ConnectionId=0;
};
DeviceRegistry() noexcept:
SubSystemServer("DeviceRegistry", "DevStatus", "devicestatus") {
}
static auto instance() {
static auto instance_ = new DeviceRegistry;
@@ -36,80 +34,68 @@ namespace OpenWifi {
int Start() override;
void Stop() override;
inline bool GetStatistics(const std::string &SerialNumber, std::string & Statistics) {
inline bool GetStatistics(const std::string &SerialNumber, std::string & Statistics) const {
return GetStatistics(Utils::SerialNumberToInt(SerialNumber),Statistics);
}
bool GetStatistics(uint64_t SerialNumber, std::string & Statistics);
bool GetStatistics(std::uint64_t SerialNumber, std::string & Statistics) const;
inline void SetStatistics(const std::string &SerialNumber, const std::string &Statistics) {
return SetStatistics(Utils::SerialNumberToInt(SerialNumber),Statistics);
}
void SetStatistics(uint64_t SerialNumber, const std::string &stats);
inline bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State) {
inline bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State) const {
return GetState(Utils::SerialNumberToInt(SerialNumber), State);
}
bool GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State);
bool GetState(std::uint64_t SerialNumber, GWObjects::ConnectionState & State) const;
inline void SetState(const std::string & SerialNumber, const GWObjects::ConnectionState & State) {
return SetState(Utils::SerialNumberToInt(SerialNumber), State);
}
void SetState(uint64_t SerialNumber, const GWObjects::ConnectionState & State);
inline bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) {
inline bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) const {
return GetHealthcheck(Utils::SerialNumberToInt(SerialNumber), CheckData);
}
bool GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData);
bool GetHealthcheck(std::uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) const ;
inline void SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck &H) {
return SetHealthcheck(Utils::SerialNumberToInt(SerialNumber),H);
}
void SetHealthcheck(uint64_t SerialNumber, const GWObjects::HealthCheck &H);
bool Connected(uint64_t SerialNumber) const ;
std::shared_ptr<ConnectionEntry> Register(uint64_t SerialNumber, WSConnection *Conn, uint64_t & ConnectionId);
inline void UnRegister(const std::string & SerialNumber, uint64_t ConnectionId) {
return UnRegister(Utils::SerialNumberToInt(SerialNumber),ConnectionId);
}
void UnRegister(uint64_t SerialNumber, uint64_t ConnectionId);
inline bool Connected(const std::string & SerialNumber) {
return Connected(Utils::SerialNumberToInt(SerialNumber));
}
bool Connected(uint64_t SerialNumber);
inline bool SendFrame(const std::string & SerialNumber, const std::string & Payload) {
inline bool SendFrame(const std::string & SerialNumber, const std::string & Payload) const {
return SendFrame(Utils::SerialNumberToInt(SerialNumber), Payload);
}
bool SendFrame(uint64_t SerialNumber, const std::string & Payload);
bool SendFrame(std::uint64_t SerialNumber, const std::string & Payload) const ;
inline void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID) {
return SetPendingUUID(Utils::SerialNumberToInt(SerialNumber), PendingUUID);
}
void SetPendingUUID(uint64_t SerialNumber, uint64_t PendingUUID);
bool SendRadiusAuthenticationData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size);
bool SendRadiusAccountingData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size);
bool SendRadiusCoAData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size);
[[nodiscard]] inline std::shared_ptr<ConnectionEntry> GetDeviceConnection(const std::string & SerialNumber) {
return GetDeviceConnection(Utils::SerialNumberToInt(SerialNumber));
}
void SetSessionDetails(std::uint64_t connection_id, uint64_t SerialNumber);
bool EndSession(std::uint64_t connection_id, std::uint64_t serial_number);
[[nodiscard]] inline std::shared_ptr<ConnectionEntry> GetDeviceConnection(uint64_t SerialNumber) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device!=Devices_.end() && Device->second->WSConn_!= nullptr) {
return Device->second;
}
return nullptr;
void SetWebSocketTelemetryReporting(std::uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime);
void StopWebSocketTelemetry(std::uint64_t RPCID, uint64_t SerialNumber);
void SetKafkaTelemetryReporting(std::uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime);
void StopKafkaTelemetry(std::uint64_t RPCID, uint64_t SerialNumber);
void GetTelemetryParameters(uint64_t SerialNumber , bool & TelemetryRunning,
uint64_t & TelemetryInterval,
uint64_t & TelemetryWebSocketTimer,
uint64_t & TelemetryKafkaTimer,
uint64_t & TelemetryWebSocketCount,
uint64_t & TelemetryKafkaCount,
uint64_t & TelemetryWebSocketPackets,
uint64_t & TelemetryKafkaPackets);
void onConnectionJanitor(Poco::Timer & timer);
inline void AverageDeviceStatistics( std::uint64_t & Connections, std::uint64_t & AverageConnectionTime, std::uint64_t & NumberOfConnectingDevices) const {
Connections = NumberOfConnectedDevices_;
AverageConnectionTime = AverageDeviceConnectionTime_;
NumberOfConnectingDevices = NumberOfConnectingDevices_;
}
private:
inline static std::atomic_uint64_t Id_=1;
std::map<uint64_t ,std::shared_ptr<ConnectionEntry>> Devices_;
mutable std::shared_mutex LocalMutex_;
std::map<std::uint64_t, std::pair<std::uint64_t,std::shared_ptr<AP_WS_Connection>>> SerialNumbers_;
std::unique_ptr<Poco::TimerCallback<DeviceRegistry>> ArchiverCallback_;
Poco::Timer Timer_;
Poco::Thread ConnectionJanitor_;
std::atomic_uint64_t NumberOfConnectedDevices_=0;
std::atomic_uint64_t AverageDeviceConnectionTime_=0;
std::atomic_uint64_t NumberOfConnectingDevices_=0;
DeviceRegistry() noexcept:
SubSystemServer("DeviceRegistry", "DevStatus", "devicestatus") {
}
};
inline auto DeviceRegistry() { return DeviceRegistry::instance(); }

View File

@@ -7,29 +7,28 @@
//
#include <iostream>
#include <fstream>
#include <cstdio>
#include "framework/MicroService.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/DynamicAny.h"
#include "Poco/Net/HTMLForm.h"
#include "Poco/Net/PartHandler.h"
#include "Poco/Net/MessageHeader.h"
#include "Poco/Net/MultipartReader.h"
#include "Poco/CountingStream.h"
#include "Poco/StreamCopier.h"
#include "Poco/Exception.h"
#include "FileUploader.h"
#include "StorageService.h"
#include "framework/MicroService.h"
namespace OpenWifi {
static const std::string URI_BASE{"/v1/upload/"};
int FileUploader::Start() {
Logger().notice("Starting.");
poco_notice(Logger(),"Starting.");
Poco::File UploadsDir(MicroService::instance().ConfigPath("openwifi.fileuploader.path","/tmp"));
Path_ = UploadsDir.path();
@@ -41,37 +40,68 @@ namespace OpenWifi {
Path_ = "/tmp";
}
}
for(const auto & Svr: ConfigServersList_) {
std::string l{"Starting: " +
Svr.Address() + ":" + std::to_string(Svr.Port()) +
" key:" + Svr.KeyFile() +
" cert:" + Svr.CertFile()};
Logger().information(l);
if(MicroService::instance().NoAPISecurity()) {
poco_notice(Logger(), fmt::format("Starting: {}:{}",Svr.Address(),Svr.Port()));
auto Sock{Svr.CreateSecureSocket(Logger())};
auto Sock{Svr.CreateSocket(Logger())};
Svr.LogCert(Logger());
if(!Svr.RootCA().empty())
Svr.LogCas(Logger());
auto Params = new Poco::Net::HTTPServerParams;
Params->setMaxThreads(16);
Params->setMaxQueued(100);
Params->setName("ws:upldr");
auto Params = new Poco::Net::HTTPServerParams;
Params->setMaxThreads(16);
Params->setMaxQueued(100);
if (FullName_.empty()) {
std::string TmpName =
MicroService::instance().ConfigGetString("openwifi.fileuploader.uri", "");
if (TmpName.empty()) {
FullName_ =
"https://" + Svr.Name() + ":" + std::to_string(Svr.Port()) + URI_BASE;
} else {
FullName_ = TmpName + URI_BASE;
}
poco_information(Logger(),fmt::format("Uploader URI base is '{}'", FullName_));
}
if(FullName_.empty()) {
std::string TmpName = MicroService::instance().ConfigGetString("openwifi.fileuploader.uri","");
if(TmpName.empty()) {
FullName_ =
"https://" + Svr.Name() + ":" + std::to_string(Svr.Port()) + URI_BASE;
} else {
FullName_ = TmpName + URI_BASE ;
}
Logger().information(Poco::format("Uploader URI base is '%s'", FullName_));
}
auto NewServer = std::make_unique<Poco::Net::HTTPServer>(
new FileUpLoaderRequestHandlerFactory(Logger()), Sock, Params);
Params->setName("file-upldr");
NewServer->start();
Servers_.push_back(std::move(NewServer));
} else {
std::string l{"Starting: " + Svr.Address() + ":" + std::to_string(Svr.Port()) +
" key:" + Svr.KeyFile() + " cert:" + Svr.CertFile()};
poco_information(Logger(),l);
auto NewServer = std::make_unique<Poco::Net::HTTPServer>(new FileUpLoaderRequestHandlerFactory(Logger()), Pool_, Sock, Params);
NewServer->start();
Servers_.push_back(std::move(NewServer));
auto Sock{Svr.CreateSecureSocket(Logger())};
Svr.LogCert(Logger());
if (!Svr.RootCA().empty())
Svr.LogCas(Logger());
auto Params = new Poco::Net::HTTPServerParams;
Params->setMaxThreads(16);
Params->setMaxQueued(100);
Params->setName("ws:upldr");
if (FullName_.empty()) {
std::string TmpName =
MicroService::instance().ConfigGetString("openwifi.fileuploader.uri", "");
if (TmpName.empty()) {
FullName_ =
"https://" + Svr.Name() + ":" + std::to_string(Svr.Port()) + URI_BASE;
} else {
FullName_ = TmpName + URI_BASE;
}
poco_information(Logger(), fmt::format("Uploader URI base is '{}'", FullName_));
}
auto NewServer = std::make_unique<Poco::Net::HTTPServer>(
new FileUpLoaderRequestHandlerFactory(Logger()), Sock, Params);
NewServer->start();
Servers_.push_back(std::move(NewServer));
}
}
MaxSize_ = 1000 * MicroService::instance().ConfigGetInt("openwifi.fileuploader.maxsize", 10000);
@@ -79,9 +109,9 @@ namespace OpenWifi {
return 0;
}
void FileUploader::reinitialize(Poco::Util::Application &self) {
void FileUploader::reinitialize([[maybe_unused]] Poco::Util::Application &self) {
MicroService::instance().LoadConfigurationFile();
Logger().information("Reinitializing.");
poco_information(Logger(),"Reinitializing.");
Stop();
Start();
}
@@ -94,18 +124,18 @@ namespace OpenWifi {
bool FileUploader::AddUUID( const std::string & UUID) {
std::lock_guard Guard(Mutex_);
uint64_t Now = time(nullptr) ;
uint64_t now = OpenWifi::Now();
// remove old stuff...
for(auto i=OutStandingUploads_.cbegin();i!=OutStandingUploads_.end();) {
if ((Now-i->second) > (60 * 30))
OutStandingUploads_.erase(i++);
for(auto i=OutStandingUploads_.begin();i!=OutStandingUploads_.end();) {
if ((now-i->second) > (60 * 30))
i = OutStandingUploads_.erase(i);
else
++i;
}
if(!UUID.empty())
OutStandingUploads_[UUID] = Now;
OutStandingUploads_[UUID] = now;
return true;
}
@@ -121,64 +151,39 @@ namespace OpenWifi {
OutStandingUploads_.erase(UUID);
}
class FileUploaderPartHandler: public Poco::Net::PartHandler
{
public:
FileUploaderPartHandler(std::string UUID, Poco::Logger & Logger):
UUID_(std::move(UUID)),
Logger_(Logger)
{
}
void handlePart(const Poco::Net::MessageHeader& Header, std::istream& Stream) override
{
try {
Name_ = "(unnamed)";
if (Header.has("Content-Disposition")) {
std::string Disposition;
Poco::Net::NameValueCollection Parameters;
Poco::Net::MessageHeader::splitParameters(Header["Content-Disposition"],
Disposition, Parameters);
Name_ = Parameters.get("filename", "(unnamed)");
}
std::string FinalFileName = FileUploader()->Path() + "/" + UUID_;
Logger().information(Poco::format("FILE-UPLOADER: uploading trace for %s", FinalFileName));
Poco::CountingInputStream InputStream(Stream);
std::ofstream OutputStream(FinalFileName, std::ofstream::out);
Poco::StreamCopier::copyStream(InputStream, OutputStream);
Poco::File TmpFile(FinalFileName);
Length_ = TmpFile.getSize();
if (Length_ < FileUploader()->MaxSize()) {
Good_=true;
} else {
TmpFile.remove();
Error_ = "File is too large.";
}
return;
} catch (const Poco::Exception &E ) {
Logger().log(E);
Error_ = std::string("Upload caused an internal error: ") + E.what() ;
}
class FileUploaderPartHandler2 : public Poco::Net::PartHandler {
public:
FileUploaderPartHandler2(std::string Id, Poco::Logger &Logger, std::stringstream & ofs) :
Id_(std::move(Id)),
Logger_(Logger),
OutputStream_(ofs){
}
void handlePart(const Poco::Net::MessageHeader &Header, std::istream &Stream) {
FileType_ = Header.get(RESTAPI::Protocol::CONTENTTYPE, RESTAPI::Protocol::UNSPECIFIED);
if (Header.has(RESTAPI::Protocol::CONTENTDISPOSITION)) {
std::string Disposition;
Poco::Net::NameValueCollection Parameters;
Poco::Net::MessageHeader::splitParameters(Header[RESTAPI::Protocol::CONTENTDISPOSITION], Disposition, Parameters);
Name_ = Parameters.get(RESTAPI::Protocol::NAME, RESTAPI::Protocol::UNNAMED);
}
Poco::CountingInputStream InputStream(Stream);
Poco::StreamCopier::copyStream(InputStream, OutputStream_);
Length_ = OutputStream_.str().size();
}
[[nodiscard]] uint64_t Length() const { return Length_; }
[[nodiscard]] std::string &Name() { return Name_; }
[[nodiscard]] std::string &ContentType() { return FileType_; }
[[nodiscard]] uint64_t Length() const { return Length_; }
[[nodiscard]] const std::string& Name() const { return Name_; }
[[nodiscard]] bool Good() const { return Good_; }
std::string & Error() { return Error_; }
inline Poco::Logger & Logger() { return Logger_; }
private:
uint64_t Length_=0;
bool Good_=false;
std::string Name_;
std::string UUID_;
std::string Error_;
Poco::Logger & Logger_;
};
private:
uint64_t Length_ = 0;
std::string FileType_;
std::string Name_;
std::string Id_;
Poco::Logger &Logger_;
std::stringstream &OutputStream_;
inline Poco::Logger & Logger() { return Logger_; };
};
class FormRequestHandler: public Poco::Net::HTTPRequestHandler
{
@@ -189,40 +194,71 @@ namespace OpenWifi {
{
}
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override
{
try {
FileUploaderPartHandler partHandler(UUID_,Logger());
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) final {
Poco::Net::HTMLForm form(Request, Request.stream(), partHandler);
Utils::SetThreadName("FileUploader");
const auto ContentType = Request.getContentType();
const auto Tokens = Poco::StringTokenizer(ContentType,";",Poco::StringTokenizer::TOK_TRIM);
Response.setChunkedTransferEncoding(true);
Response.setContentType("application/json");
poco_debug(Logger(),fmt::format("{}: Preparing to upload trace file.",UUID_));
Poco::JSON::Object Answer;
Poco::JSON::Object Answer;
if (partHandler.Good()) {
Answer.set("filename", UUID_);
Answer.set("error", 0);
StorageService()->AttachFileToCommand(UUID_);
} else {
Answer.set("filename", UUID_);
Answer.set("error", 13);
Answer.set("errorText", partHandler.Error() );
StorageService()->CancelWaitFile(UUID_, partHandler.Error() );
try {
if (Poco::icompare(Tokens[0], "multipart/form-data") == 0 ||
Poco::icompare(Tokens[0], "multipart/mixed") == 0) {
const auto &BoundaryTokens =
Poco::StringTokenizer(Tokens[1], "=", Poco::StringTokenizer::TOK_TRIM);
if (BoundaryTokens[0] == "boundary") {
const std::string &Boundary = BoundaryTokens[1];
Poco::Net::MultipartReader Reader(Request.stream(), Boundary);
bool Done = false;
while (!Done) {
Poco::Net::MessageHeader Hdr;
Reader.nextPart(Hdr);
const auto PartContentType = Hdr.get("Content-Type", "");
if (PartContentType == "application/octet-stream") {
std::stringstream FileContent;
Poco::StreamCopier::copyStream(Reader.stream(), FileContent);
Answer.set("filename", UUID_);
Answer.set("error", 0);
poco_debug(Logger(),fmt::format("{}: Trace file uploaded.", UUID_));
StorageService()->AttachFileDataToCommand(UUID_, FileContent);
std::ostream &ResponseStream = Response.send();
Poco::JSON::Stringifier::stringify(Answer, ResponseStream);
return;
} else {
std::stringstream OO;
Poco::StreamCopier::copyStream(Reader.stream(), OO);
}
if (!Reader.hasNextPart())
Done = true;
}
}
}
std::ostream &ResponseStream = Response.send();
Poco::JSON::Stringifier::stringify(Answer, ResponseStream);
return;
}
catch( const Poco::Exception & E )
{
Logger().warning(Poco::format("Error occurred while performing upload. Error='%s'",E.displayText()));
}
catch( ... )
{
}
}
} catch (const Poco::Exception &E) {
Logger().log(E);
} catch (...) {
poco_debug(Logger(),"Exception while receiving trace file.");
}
poco_debug(Logger(),fmt::format("{}: Failed to upload trace file.",UUID_));
std::string Error{"Trace file rejected"};
StorageService()->CancelWaitFile(UUID_, Error);
Answer.set("filename", UUID_);
Answer.set("error", 13);
Answer.set("errorText", "Attached file is too large");
StorageService()->CancelWaitFile(UUID_, Error);
std::ostream &ResponseStream = Response.send();
Poco::JSON::Stringifier::stringify(Answer, ResponseStream);
}
inline Poco::Logger & Logger() { return Logger_; }
private:
std::string UUID_;
Poco::Logger & Logger_;
@@ -230,7 +266,13 @@ namespace OpenWifi {
Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
Logger().debug(Poco::format("REQUEST(%s): %s %s", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
poco_debug(Logger(),fmt::format("REQUEST({}): {} {}", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
if(Request.getMethod()!=Poco::Net::HTTPRequest::HTTP_POST ||
Request.getURI().size()<(URI_BASE.size()+36)) {
poco_warning(Logger(),fmt::format("ILLEGAL-REQUEST({}): {} {}. Dropped.", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
return nullptr;
}
// The UUID should be after the /v1/upload/ part...
auto UUIDLocation = Request.getURI().find_first_of(URI_BASE);
@@ -246,17 +288,18 @@ namespace OpenWifi {
}
else
{
Logger().warning(Poco::format("Unknown UUID=%s",UUID));
poco_warning(Logger(),fmt::format("Unknown UUID={}",UUID));
}
}
return nullptr;
}
void FileUploader::Stop() {
Logger().notice("Stopping ");
poco_notice(Logger(),"Stopping...");
for( const auto & svr : Servers_ )
svr->stop();
svr->stopAll(true);
Servers_.clear();
poco_notice(Logger(),"Stopped...");
}
} // Namespace

View File

@@ -8,12 +8,13 @@
#pragma once
#include "framework/MicroService.h"
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPServer.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "framework/MicroService.h"
namespace OpenWifi {
@@ -37,15 +38,13 @@ namespace OpenWifi {
private:
std::vector<std::unique_ptr<Poco::Net::HTTPServer>> Servers_;
Poco::ThreadPool Pool_;
std::string FullName_;
std::map<std::string,uint64_t> OutStandingUploads_;
std::string Path_;
uint64_t MaxSize_=10000000;
explicit FileUploader() noexcept:
SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader"),
Pool_("FileUpLoaderPool")
SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader")
{
}
};

View File

@@ -5,6 +5,7 @@
#pragma once
#include "framework/MicroService.h"
#include "Poco/Net/IPAddress.h"
#include "nlohmann/json.hpp"
@@ -133,6 +134,7 @@ namespace OpenWifi {
}
inline int Start() final {
poco_notice(Logger(),"Starting...");
ProviderName_ = MicroService::instance().ConfigGetString("iptocountry.provider","");
if(!ProviderName_.empty()) {
Provider_ = IPLocationProvider<IPToCountryProvider, IPInfo, IPData, IP2Location>(ProviderName_);
@@ -145,6 +147,9 @@ namespace OpenWifi {
}
inline void Stop() final {
poco_notice(Logger(),"Stopping...");
// Nothing to do - just to provide the same look at the others.
poco_notice(Logger(),"Stopped...");
}
[[nodiscard]] static inline std::string ReformatAddress(const std::string & I )

66
src/GwWebSocketClient.cpp Normal file
View File

@@ -0,0 +1,66 @@
//
// Created by stephane bourque on 2022-04-28.
//
#include "GwWebSocketClient.h"
#include "SerialNumberCache.h"
namespace OpenWifi {
GwWebSocketClient::GwWebSocketClient(Poco::Logger &Logger):
Logger_(Logger){
WebSocketClientServer()->SetProcessor(this);
}
GwWebSocketClient::~GwWebSocketClient() {
WebSocketClientServer()->SetProcessor(nullptr);
}
void GwWebSocketClient::Processor(const Poco::JSON::Object::Ptr &O, std::string &Answer, bool &Done ) {
try {
if (O->has("command")) {
auto Command = O->get("command").toString();
if (Command == "serial_number_search" && O->has("serial_prefix")) {
ws_command_serial_number_search(O,Done,Answer);
} else if (Command=="exit") {
ws_command_exit(O,Done,Answer);
} else {
ws_command_invalid(O, Done, Answer);
}
}
} catch (const Poco::Exception &E) {
Logger_.log(E);
}
}
void GwWebSocketClient::ws_command_serial_number_search(const Poco::JSON::Object::Ptr &O,
bool &Done, std::string &Answer) {
Done = false;
auto Prefix = O->get("serial_prefix").toString();
if (!Prefix.empty() && Prefix.length() < 13) {
std::vector<uint64_t> Numbers;
SerialNumberCache()->FindNumbers(Prefix, 50, Numbers);
Poco::JSON::Array Arr;
for (const auto &i : Numbers)
Arr.add(Utils::int_to_hex(i));
Poco::JSON::Object RetObj;
RetObj.set("serialNumbers", Arr);
std::ostringstream SS;
Poco::JSON::Stringifier::stringify(RetObj, SS);
Answer = SS.str();
}
}
void GwWebSocketClient::ws_command_exit([[maybe_unused]] const Poco::JSON::Object::Ptr &O, bool &Done, std::string &Answer) {
Done = true;
Answer = R"lit({ "closing" : "Goodbye! Aurevoir! Hasta la vista!" })lit";
}
void GwWebSocketClient::ws_command_invalid([[maybe_unused]] const Poco::JSON::Object::Ptr &O, bool &Done, std::string &Answer) {
Done = false;
Answer = std::string{R"lit({ "error" : "invalid command" })lit"};
}
}

23
src/GwWebSocketClient.h Normal file
View File

@@ -0,0 +1,23 @@
//
// Created by stephane bourque on 2022-04-28.
//
#pragma once
#include "framework/MicroService.h"
namespace OpenWifi {
class GwWebSocketClient : public WebSocketClientProcessor {
public:
explicit GwWebSocketClient(Poco::Logger &Logger);
virtual ~GwWebSocketClient();
virtual void Processor(const Poco::JSON::Object::Ptr &O, std::string &Answer, bool &Done );
void ws_command_serial_number_search( const Poco::JSON::Object::Ptr &O, bool &Done, std::string &Answer);
void ws_command_exit( const Poco::JSON::Object::Ptr &O, bool &Done, std::string &Answer);
void ws_command_invalid( const Poco::JSON::Object::Ptr &O, bool &Done, std::string &Answer);
private:
Poco::Logger & Logger_;
inline Poco::Logger & Logger() { return Logger_; }
};
}

View File

@@ -5,13 +5,10 @@
#include <fstream>
#include <vector>
#include "OUIServer.h"
#include "Poco/String.h"
#include "Poco/StringTokenizer.h"
#include "Poco/URIStreamOpener.h"
#include "Poco/StreamCopier.h"
#include "Poco/URI.h"
#include "Poco/File.h"
#include "OUIServer.h"
@@ -21,38 +18,59 @@ namespace OpenWifi {
int OUIServer::Start() {
Running_ = true;
LatestOUIFileName_ = MicroService::instance().DataDir() + "/newOUIFile.txt";
CurrentOUIFileName_ = MicroService::instance().DataDir() + "/current_oui.txt";
bool Recovered = false;
Poco::File OuiFile(CurrentOUIFileName_);
if(OuiFile.exists()) {
std::unique_lock Lock(LocalMutex_);
Recovered = ProcessFile(CurrentOUIFileName_,OUIs_);
if(Recovered) {
poco_notice(Logger(),
fmt::format("Recovered last OUI file - {}", CurrentOUIFileName_));
}
} else {
poco_notice(Logger(),
fmt::format("No existing OUIFile.", CurrentOUIFileName_));
}
UpdaterCallBack_ = std::make_unique<Poco::TimerCallback<OUIServer>>(*this, &OUIServer::onTimer);
Timer_.setStartInterval(30 * 1000); // first run in 5 minutes
if(Recovered) {
Timer_.setStartInterval(60 * 60 * 1000); // first run in 1 hour
} else {
Timer_.setStartInterval(30 * 1000); // first run in 5 minutes
}
Timer_.setPeriodicInterval(7 * 24 * 60 * 60 * 1000);
Timer_.start(*UpdaterCallBack_);
Timer_.start(*UpdaterCallBack_, MicroService::instance().TimerPool());
return 0;
}
void OUIServer::Stop() {
poco_notice(Logger(),"Stopping...");
Running_=false;
Timer_.stop();
poco_notice(Logger(),"Stopped...");
}
void OUIServer::reinitialize(Poco::Util::Application &self) {
void OUIServer::reinitialize([[maybe_unused]] Poco::Util::Application &self) {
MicroService::instance().LoadConfigurationFile();
Logger().information("Reinitializing.");
poco_information(Logger(),"Reinitializing.");
Stop();
Start();
}
bool OUIServer::GetFile(const std::string &FileName) {
try {
Logger().information(Poco::format("Start: Retrieving OUI file: %s",MicroService::instance().ConfigGetString("oui.download.uri")));
LastUpdate_ = OpenWifi::Now();
poco_information(Logger(), fmt::format("Start: Retrieving OUI file: {}",MicroService::instance().ConfigGetString("oui.download.uri")));
std::unique_ptr<std::istream> pStr(
Poco::URIStreamOpener::defaultOpener().open(MicroService::instance().ConfigGetString("oui.download.uri")));
std::ofstream OS;
Poco::File F(FileName);
if(F.exists())
F.remove();
OS.open(FileName);
Poco::StreamCopier::copyStream(*pStr, OS);
OS.close();
Logger().information(Poco::format("Done: Retrieving OUI file: %s",MicroService::instance().ConfigGetString("oui.download.uri")));
poco_information(Logger(), fmt::format("Done: Retrieving OUI file: {}",MicroService::instance().ConfigGetString("oui.download.uri")));
return true;
} catch (const Poco::Exception &E) {
Logger().log(E);
@@ -80,7 +98,7 @@ namespace OpenWifi {
auto MAC = Utils::SerialNumberToOUI(Tokens[0]);
if (MAC > 0) {
std::string Manufacturer;
for (auto i = 2; i < Tokens.count(); i++)
for (size_t i = 2; i < Tokens.count(); i++)
Manufacturer += Tokens[i] + " ";
auto M = Poco::trim(Manufacturer);
if (!M.empty())
@@ -96,38 +114,58 @@ namespace OpenWifi {
return false;
}
void OUIServer::onTimer(Poco::Timer & timer) {
void OUIServer::onTimer([[maybe_unused]] Poco::Timer & timer) {
Utils::SetThreadName("ouisvr-timer");
if(Updating_)
return;
Updating_ = true;
poco_information(Logger(),"Starting to process OUI file...");
// fetch data from server, if not available, just use the file we already have.
std::string LatestOUIFileName{ MicroService::instance().DataDir() + "/newOUIFile.txt"};
std::string CurrentOUIFileName{ MicroService::instance().DataDir() + "/current_oui.txt"};
Poco::File Current(CurrentOUIFileName_);
if(Current.exists()) {
if((OpenWifi::Now()-Current.getLastModified().epochTime()) < (7*24*60*60)) {
if(!Initialized_) {
if(ProcessFile(CurrentOUIFileName_, OUIs_)) {
Initialized_ = true;
Updating_=false;
poco_information(Logger(), "Using cached file.");
return;
}
} else {
Updating_=false;
return;
}
}
}
OUIMap TmpOUIs;
if(GetFile(LatestOUIFileName) && ProcessFile(LatestOUIFileName, TmpOUIs)) {
std::lock_guard G(Mutex_);
if(GetFile(LatestOUIFileName_) && ProcessFile(LatestOUIFileName_, TmpOUIs)) {
std::unique_lock G(LocalMutex_);
OUIs_ = std::move(TmpOUIs);
LastUpdate_ = std::time(nullptr);
Poco::File F1(CurrentOUIFileName);
LastUpdate_ = OpenWifi::Now();
Poco::File F1(CurrentOUIFileName_);
if(F1.exists())
F1.remove();
Poco::File F2(LatestOUIFileName);
F2.renameTo(CurrentOUIFileName);
Logger().information(Poco::format("New OUI file %s downloaded.",LatestOUIFileName));
Poco::File F2(LatestOUIFileName_);
F2.renameTo(CurrentOUIFileName_);
poco_information(Logger(), fmt::format("New OUI file {} downloaded.",LatestOUIFileName_));
} else if(OUIs_.empty()) {
if(ProcessFile(CurrentOUIFileName, TmpOUIs)) {
LastUpdate_ = std::time(nullptr);
std::lock_guard G(Mutex_);
if(ProcessFile(CurrentOUIFileName_, TmpOUIs)) {
LastUpdate_ = OpenWifi::Now();
std::unique_lock G(LocalMutex_);
OUIs_ = std::move(TmpOUIs);
}
}
Initialized_=true;
Updating_ = false;
poco_information(Logger(),"Done processing OUI file...");
}
std::string OUIServer::GetManufacturer(const std::string &MAC) {
std::lock_guard Guard(Mutex_);
std::shared_lock Lock(LocalMutex_);
auto Manufacturer = OUIs_.find(Utils::SerialNumberToOUI(MAC));
if(Manufacturer != OUIs_.end())
return Manufacturer->second;

View File

@@ -4,6 +4,8 @@
#pragma once
#include <shared_mutex>
#include "framework/MicroService.h"
#include "Poco/Timer.h"
@@ -30,13 +32,15 @@ namespace OpenWifi {
[[nodiscard]] bool ProcessFile(const std::string &FileName, OUIMap &Map);
private:
std::shared_mutex LocalMutex_;
uint64_t LastUpdate_ = 0 ;
bool ValidFile_=false;
bool Initialized_ = false;
OUIMap OUIs_;
std::atomic_bool Updating_=false;
std::atomic_bool Running_=false;
volatile std::atomic_bool Updating_=false;
volatile std::atomic_bool Running_=false;
Poco::Timer Timer_;
std::unique_ptr<Poco::TimerCallback<OUIServer>> UpdaterCallBack_;
std::string LatestOUIFileName_,CurrentOUIFileName_;
OUIServer() noexcept:
SubSystemServer("OUIServer", "OUI-SVR", "ouiserver")

1856
src/ParseWifiScan.h Normal file

File diff suppressed because it is too large Load Diff

672
src/RADIUS_helpers.h Normal file
View File

@@ -0,0 +1,672 @@
//
// Created by stephane bourque on 2022-06-20.
//
#pragma once
#include <list>
#include <string>
#include <iostream>
#include <iomanip>
#include "Poco/HMACEngine.h"
#include "Poco/MD5Engine.h"
namespace OpenWifi::RADIUS {
#define RADCMD_ACCESS_REQ 1 /* Access-Request */
#define RADCMD_ACCESS_ACC 2 /* Access-Accept */
#define RADCMD_ACCESS_REJ 3 /* Access-Reject */
#define RADCMD_ACCOUN_REQ 4 /* Accounting-Request */
#define RADCMD_ACCOUN_RES 5 /* Accounting-Response */
#define RADCMD_ACCOUN_STATUS 6 /* Accounting-Status */
#define RADCMD_PASSWORD_REQUEST 7 /* Password-Request [RFC3575] */
#define RADCMD_PASSWORD_ACK 8 /* Password-Ack [RFC3575] */
#define RADCMD_PASSWORD_REJECT 9 /* Password-Reject [RFC3575] */
#define RADCMD_ACCOUN_MESSAGE 10 /* Accounting-Message [RFC3575] */
#define RADCMD_RES_FREE_REQ 21 /* Resource-Free-Request [RFC3575] */
#define RADCMD_RES_FREE_RES 22 /* Resource-Free-Response [RFC3575] */
#define RADCMD_RES_QUERY_REQ 23 /* Resource-Query-Request [RFC3575] */
#define RADCMD_RES_QUERY_RES 24 /* Resource-Query-Response [RFC3575] */
#define RADCMD_RES_ALT_RECLAIM_REQ 25 /* Alternate-Resource-Reclaim-Request [RFC3575] */
#define RADCMD_ACCESS_CHA 11 /* Access-Challenge */
#define RADCMD_STATUS_SER 12 /* Status-Server */
#define RADCMD_STATUS_CLI 13 /* Status-Client */
#define RADCMD_DISCON_REQ 40 /* Disconnect-Request */
#define RADCMD_DISCON_ACK 41 /* Disconnect-ACK */
#define RADCMD_DISCON_NAK 42 /* Disconnect-NAK */
#define RADCMD_COA_REQ 43 /* CoA-Request */
#define RADCMD_COA_ACK 44 /* CoA-ACK */
#define RADCMD_COA_NAK 45 /* CoA-NAK */
#define RADCMD_RESERVED 255 /* Reserved */
/*
21 Resource-Free-Request [RFC3575]
22 Resource-Free-Response [RFC3575]
23 Resource-Query-Request [RFC3575]
24 Resource-Query-Response [RFC3575]
25 Alternate-Resource-Reclaim-Request [RFC3575]
26 NAS-Reboot-Request [RFC3575]
27 NAS-Reboot-Response [RFC3575]
28 Reserved
29 Next-Passcode [RFC3575]
30 New-Pin [RFC3575]
31 Terminate-Session [RFC3575]
32 Password-Expired [RFC3575]
33 Event-Request [RFC3575]
34 Event-Response [RFC3575]
35-39 Unassigned
40 Disconnect-Request [RFC3575][RFC5176]
41 Disconnect-ACK [RFC3575][RFC5176]
42 Disconnect-NAK [RFC3575][RFC5176]
43 CoA-Request [RFC3575][RFC5176]
44 CoA-ACK [RFC3575][RFC5176]
45 CoA-NAK [RFC3575][RFC5176]
46-49 Unassigned
50 IP-Address-Allocate [RFC3575]
51 IP-Address-Release [RFC3575]
52 Protocol-Error [RFC7930]
53-249 Unassigned
250-253 Experimental Use [RFC3575]
254 Reserved [RFC3575]
255 Reserved [RFC3575]
*/
struct tok {
uint cmd;
const char * name;
};
/*
Radius commands
char const *fr_packet_codes[FR_MAX_PACKET_CODE] = {
"", //!< 0
"Access-Request",
"Access-Accept",
"Access-Reject",
"Accounting-Request",
"Accounting-Response",
"Accounting-Status",
"Password-Request",
"Password-Accept",
"Password-Reject",
"Accounting-Message", //!< 10
"Access-Challenge",
"Status-Server",
"Status-Client",
"14",
"15",
"16",
"17",
"18",
"19",
"20", //!< 20
"Resource-Free-Request",
"Resource-Free-Response",
"Resource-Query-Request",
"Resource-Query-Response",
"Alternate-Resource-Reclaim-Request",
"NAS-Reboot-Request",
"NAS-Reboot-Response",
"28",
"Next-Passcode",
"New-Pin", //!< 30
"Terminate-Session",
"Password-Expired",
"Event-Request",
"Event-Response",
"35",
"36",
"37",
"38",
"39",
"Disconnect-Request", //!< 40
"Disconnect-ACK",
"Disconnect-NAK",
"CoA-Request",
"CoA-ACK",
"CoA-NAK",
"46",
"47",
"48",
"49",
"IP-Address-Allocate",
"IP-Address-Release", //!< 50
};
*/
static const struct tok radius_command_values[] = {
{ RADCMD_ACCESS_REQ, "Access-Request" },
{ RADCMD_ACCESS_ACC, "Access-Accept" },
{ RADCMD_ACCESS_REJ, "Access-Reject" },
{ RADCMD_ACCOUN_REQ, "Accounting-Request" },
{ RADCMD_ACCOUN_RES, "Accounting-Response" },
{ RADCMD_ACCESS_CHA, "Access-Challenge" },
{ RADCMD_STATUS_SER, "Status-Server" },
{ RADCMD_STATUS_CLI, "Status-Client" },
{ RADCMD_DISCON_REQ, "Disconnect-Request" },
{ RADCMD_DISCON_ACK, "Disconnect-ACK" },
{ RADCMD_DISCON_NAK, "Disconnect-NAK" },
{ RADCMD_COA_REQ, "CoA-Request" },
{ RADCMD_COA_ACK, "CoA-ACK" },
{ RADCMD_COA_NAK, "CoA-NAK" },
{ RADCMD_RESERVED, "Reserved" },
{ RADCMD_ACCOUN_STATUS, "Accounting-Status"},
{ RADCMD_PASSWORD_REQUEST, "Password-Request"},
{ RADCMD_PASSWORD_ACK, "Password-Ack"},
{ RADCMD_PASSWORD_REJECT, "Password-Reject"},
{ RADCMD_ACCOUN_MESSAGE, "Accounting-Message"},
{ RADCMD_RES_FREE_REQ, "Resource-Free-Request"},
{ RADCMD_RES_FREE_RES, "Resource-Free-Response"},
{ RADCMD_RES_QUERY_REQ, "Resource-Query-Request"},
{ RADCMD_RES_QUERY_RES, "Resource-Query-Response"},
{ RADCMD_RES_ALT_RECLAIM_REQ, "Alternate-Resource-Reclaim-Request"},
{ 0, nullptr}
};
static const struct tok radius_attribute_names[] = {
{1,"User-Name"},
{2,"User-Password"},
{3,"CHAP-Password"},
{4,"NAS-IP Address"},
{5,"NAS-Port"},
{6,"Service-Type"},
{7,"Framed-Protocol"},
{8,"Framed-IP-Address"},
{9,"Framed-IP-Netmask"},
{10,"Framed-Routing"},
{11,"Filter-Id"},
{12,"Framed-MTU"},
{13,"Framed-Compression"},
{14,"Login-IP-Host"},
{15,"Login-Service"},
{16,"Login-TCP-Port"},
{18,"Reply-Message"},
{19,"Callback-Number"},
{20,"Callback-ID"},
{22,"Framed-Route"},
{23,"Framed-IPX-Network"},
{24,"State"},
{25,"Class"},
{26,"Vendor-Specific"},
{27,"Session-Timeout"},
{28,"Idle-Timeout"},
{29,"Termination-Action"},
{30,"Called-Station-Id"},
{31,"Calling-Station-Id"},
{32,"NAS-Identifier"},
{33,"Proxy-State"},
{34,"Login-LAT-Service"},
{35,"Login-LAT-Node"},
{36,"Login-LAT-Group"},
{37,"Framed-AppleTalk-Link"},
{38,"Framed-AppleTalk-Network"},
{39,"Framed-AppleTalk-Zone"},
{40,"Acct-Status-Type"},
{41,"Acct-Delay-Time"},
{42,"Acct-Input-Octets"},
{43,"Acct-Output-Octets"},
{44,"Acct-Session-Id"},
{45,"Acct-Authentic"},
{46,"Acct-Session-Time"},
{47,"Acct-Input-Packets"},
{48,"Acct-Output-Packets"},
{49,"Acct-Terminate-Cause"},
{50,"Acct-Multi-Session-Id"},
{51,"Acct-Link-Count"},
{52,"Acct-Input-Gigawords"},
{53,"Acct-Output-Gigawords"},
{55,"Event-Timestamp"},
{60,"CHAP-Challenge"},
{61,"NAS-Port-Type"},
{62,"Port-Limit"},
{63,"Login-LAT-Port"},
{64,"Tunnel-Type3"},
{65,"Tunnel-Medium-Type1"},
{66,"Tunnel-Client-Endpoint"},
{67,"Tunnel-Server-Endpoint1"},
{68,"Acct-Tunnel-Connection-ID"},
{69,"Tunnel-Password1"},
{70,"ARAP-Password"},
{71,"ARAP-Features"},
{72,"ARAP-Zone-Access"},
{73,"ARAP-Security"},
{74,"ARAP-Security-Data"},
{75,"Password-Retry"},
{76,"Prompt"},
{77,"Connect-Info"},
{78,"Configuration-Token"},
{79,"EAP-Message"},
{80,"Message-Authenticator"},
{81,"Tunnel-Private-Group-ID"},
{82,"Tunnel-Assignment-ID1"},
{83,"Tunnel-Preference"},
{84,"ARAP-Challenge-Response"},
{85,"Acct-Interim-Interval"},
{86,"Acct-Tunnel-Packets-Lost"},
{87,"NAS-Port-ID"},
{88,"Framed-Pool"},
{90,"Tunnel-Client-Auth-ID"},
{91,"Tunnel-Server-Auth-ID"},
{0, nullptr}
};
#pragma pack(push,1)
struct RadiusAttribute {
unsigned char type{0};
uint16_t pos{0};
unsigned len{0};
};
struct RawRadiusPacket {
unsigned char code{1};
unsigned char identifier{0};
uint16_t rawlen{0};
unsigned char authenticator[16]{0};
unsigned char attributes[4096]{0};
};
#pragma pack(pop)
constexpr unsigned char Access_Request = 1;
constexpr unsigned char Access_Accept = 2;
constexpr unsigned char Access_Reject = 3;
constexpr unsigned char Access_Challenge = 11;
constexpr unsigned char Accounting_Request = 4;
constexpr unsigned char Accounting_Response = 5;
constexpr unsigned char Accounting_Status = 6;
constexpr unsigned char Accounting_Message = 10;
constexpr unsigned char Disconnect_Request = 40;
constexpr unsigned char Disconnect_ACK = 41;
constexpr unsigned char Disconnect_NAK = 42;
constexpr unsigned char CoA_Request = 43;
constexpr unsigned char CoA_ACK = 44;
constexpr unsigned char CoA_NAK = 45;
inline bool IsAuthentication(unsigned char t) {
return (t == RADIUS::Access_Request ||
t == RADIUS::Access_Accept ||
t == RADIUS::Access_Challenge ||
t == RADIUS::Access_Reject);
}
inline bool IsAccounting(unsigned char t) {
return (t == RADIUS::Accounting_Request ||
t == RADIUS::Accounting_Response ||
t == RADIUS::Accounting_Status ||
t == RADIUS::Accounting_Message);
}
inline bool IsAuthority(unsigned char t) {
return (t == RADIUS::Disconnect_Request ||
t == RADIUS::Disconnect_ACK ||
t == RADIUS::Disconnect_NAK ||
t == RADIUS::CoA_Request ||
t == RADIUS::CoA_ACK ||
t == RADIUS::CoA_NAK);
}
inline const char * CommandName(uint cmd) {
auto cmds = radius_command_values;
while(cmds->cmd && (cmds->cmd!=cmd))
cmds++;
if(cmds->cmd==cmd) return cmds->name;
return "Unknown";
}
inline const char * AttributeName(uint cmd) {
auto cmds = radius_attribute_names;
while(cmds->cmd && (cmds->cmd!=cmd))
cmds++;
if(cmds->cmd==cmd) return cmds->name;
return "Unknown";
}
//
// From: https://github.com/Telecominfraproject/wlan-dictionary/blob/main/dictionary.tip
//
static const uint32_t TIP_vendor_id = 58888;
static const unsigned char TIP_serial = 1;
static const unsigned char TIP_AAAipaddr = 2;
static const unsigned char TIP_AAAipv6addr = 3;
using AttributeList = std::list<RadiusAttribute>;
inline std::ostream &operator<<(std::ostream &os, AttributeList const &P) {
for(const auto &attr:P) {
os << "\tAttr: " << (uint16_t) attr.type << " Size: " << (uint16_t) attr.len << std::endl;
}
return os;
}
inline bool ParseRadius(uint32_t offset, const unsigned char *Buffer, uint16_t Size, AttributeList &Attrs) {
Attrs.clear();
uint16_t pos=0;
auto x=25;
while(pos<Size && x) {
RadiusAttribute Attr{ .type=Buffer[pos], .pos=(uint16_t)(pos+2+offset), .len=(unsigned int)(Buffer[pos+1]-2)};
if(pos+Attr.len<=Size) {
Attrs.emplace_back(Attr);
} else {
std::cout << "Bad parse1: " << (uint32_t) (pos+Attr.len) << " S:" << Size << std::endl;
return false;
}
if(Buffer[pos+1]==0) {
std::cout << "Bad parse2: " << (uint32_t) (pos+Attr.len) << " S:" << Size << std::endl;
return false;
}
pos+=Buffer[pos+1];
x--;
}
return true;
}
class RadiusPacket {
public:
explicit RadiusPacket(const Poco::Buffer<char> & Buf) {
if(Buf.size() >= sizeof(RawRadiusPacket)) {
Valid_ = false;
return;
}
memcpy((void *)&P_,Buf.begin(), Buf.size());
Size_=Buf.size();
Valid_ = (Size_== htons(P_.rawlen));
if(Valid_)
Valid_ = ParseRadius(0,(unsigned char *)&P_.attributes[0],Size_-20,Attrs_);
}
explicit RadiusPacket(const unsigned char *buffer, uint16_t size) {
if(size >= sizeof(RawRadiusPacket)) {
Valid_ = false;
return;
}
memcpy((void *)&P_,buffer, size);
Size_=size;
Valid_ = (Size_== htons(P_.rawlen));
if(Valid_)
Valid_ = ParseRadius(0,(unsigned char *)&P_.attributes[0],Size_-20,Attrs_);
}
explicit RadiusPacket(const std::string &p) {
if(p.size() >= sizeof(RawRadiusPacket)) {
Valid_ = false;
return;
}
memcpy((void *)&P_,(const unsigned char*) p.c_str(), p.size());
Size_=p.size();
Valid_ = (Size_== htons(P_.rawlen));
if(Valid_)
Valid_ = ParseRadius(0,(unsigned char *)&P_.attributes[0],Size_-20,Attrs_);
}
explicit RadiusPacket(const RadiusPacket &P) {
Valid_ = P.Valid_;
Size_ = P.Size_;
P_ = P.P_;
Attrs_ = P.Attrs_;
}
explicit RadiusPacket() = default;
unsigned char * Buffer() { return (unsigned char *)&P_; }
[[nodiscard]] uint16_t BufferLen() const { return sizeof(P_);}
void Evaluate(uint16_t size) {
Size_ = size;
Valid_ = ParseRadius(0,(unsigned char *)&P_.attributes[0],Size_-20,Attrs_);
}
[[nodiscard]] uint16_t Len() const { return htons(P_.rawlen); }
[[nodiscard]] uint16_t Size() const { return Size_; }
friend std::ostream &operator<<(std::ostream &os, RadiusPacket const &P);
inline bool IsAuthentication() {
return (P_.code == RADIUS::Access_Request ||
P_.code == RADIUS::Access_Accept ||
P_.code == RADIUS::Access_Challenge ||
P_.code == RADIUS::Access_Reject ||
P_.code == RADCMD_RES_FREE_REQ ||
P_.code == RADCMD_RES_FREE_RES ||
P_.code == RADCMD_RES_QUERY_REQ ||
P_.code == RADCMD_RES_QUERY_RES ||
P_.code == RADCMD_RES_ALT_RECLAIM_REQ);
}
inline bool IsAccounting() {
return (P_.code == RADIUS::Accounting_Request ||
P_.code == RADIUS::Accounting_Response ||
P_.code == RADIUS::Accounting_Status ||
P_.code == RADIUS::Accounting_Message);
}
inline bool IsAuthority() {
return (P_.code == RADIUS::Disconnect_Request ||
P_.code == RADIUS::Disconnect_ACK ||
P_.code == RADIUS::Disconnect_NAK ||
P_.code == RADIUS::CoA_Request ||
P_.code == RADIUS::CoA_ACK ||
P_.code == RADIUS::CoA_NAK);
}
void Log(std::ostream &os) {
uint16_t p = 0;
while(p<Size_) {
os << std::setfill('0') << std::setw(4) << p << ": ";
uint16_t v=0;
while(v<16 && p+v<Size_) {
os << std::setfill('0') << std::setw(2) << std::right << std::hex << (uint16_t )((const unsigned char *)&P_)[p+v] << " ";
v++;
}
os << std::endl;
p+=16;
}
os << std::dec << std::endl << std::endl;
Print(os);
}
inline const char * PacketType() {
return CommandName(P_.code);
}
inline int PacketTypeInt() {
return (int)(P_.code);
}
void ComputeMessageAuthenticator(const std::string &secret) {
RawRadiusPacket P = P_;
if(P_.code==1) {
unsigned char OldAuthenticator[16]{0};
for (const auto &attr : Attrs_) {
if (attr.type == 80) {
memcpy(OldAuthenticator, &P_.attributes[attr.pos], 16);
memset(&P.attributes[attr.pos], 0, 16);
}
}
unsigned char NewAuthenticator[16]{0};
Poco::HMACEngine<Poco::MD5Engine> H(secret);
H.update((const unsigned char *)&P, Size_);
auto digest = H.digest();
int p = 0;
for (const auto &i : digest)
NewAuthenticator[p++] = i;
if (memcmp(OldAuthenticator, NewAuthenticator, 16) == 0) {
std::cout << "Authenticator match..." << std::endl;
} else {
std::cout << "Authenticator MIS-match..." << std::endl;
for (const auto &attr : Attrs_) {
if (attr.type == 80) {
memcpy(&P_.attributes[attr.pos], NewAuthenticator, 16);
}
}
}
}
}
bool VerifyMessageAuthenticator(const std::string &secret) {
RawRadiusPacket P = P_;
if(P_.code==1) {
unsigned char OldAuthenticator[16]{0};
for (const auto &attr : Attrs_) {
if (attr.type == 80) {
memcpy(OldAuthenticator, &P_.attributes[attr.pos], 16);
memset(&P.attributes[attr.pos], 0, 16);
}
}
unsigned char NewAuthenticator[16]{0};
Poco::HMACEngine<Poco::MD5Engine> H(secret);
H.update((const unsigned char *)&P, Size_);
auto digest = H.digest();
int p = 0;
for (const auto &i : digest)
NewAuthenticator[p++] = i;
return memcmp(OldAuthenticator, NewAuthenticator, 16) == 0;
}
return true;
}
static void BufLog(std::ostream & os, const char * pre, const unsigned char *b, uint s) {
uint16_t p = 0;
while(p<s) {
os << pre << std::setfill('0') << std::setw(4) << p << ": ";
uint16_t v=0;
while(v<16 && p+v<s) {
os << std::setfill('0') << std::setw(2) << std::right << std::hex << (uint16_t )b[p+v] << " ";
v++;
}
os << std::endl;
p+=16;
}
os << std::dec ;
}
inline void Print(std::ostream &os) {
os << "Packet type: (" << (uint) P_.code << ") " << CommandName(P_.code) << std::endl;
os << " Identifier: " << (uint) P_.identifier << std::endl;
os << " Length: " << Size_ << std::endl;
os << " Authenticator: " ;
BufLog(os, "", P_.authenticator, sizeof(P_.authenticator));
os << " Attributes: " << std::endl;
for(const auto &attr:Attrs_) {
os << " " << std::setfill(' ') << "(" << std::setw(4) << (uint) attr.type << ") " << AttributeName(attr.type) << " Len:" << attr.len << std::endl;
BufLog(os, " " , &P_.attributes[attr.pos], attr.len);
}
os << std::dec << std::endl << std::endl;
}
std::string ExtractSerialNumberTIP() {
std::string R;
for(const auto &attribute:Attrs_) {
if(attribute.type==26) {
AttributeList VendorAttributes;
uint32_t VendorId = htonl( *(const uint32_t *)&(P_.attributes[attribute.pos]));
// std::cout << VendorId << std::endl;
if(VendorId==TIP_vendor_id && attribute.len>(4+2)) {
if (ParseRadius(attribute.pos + 4, &P_.attributes[attribute.pos + 4], attribute.len - 4 - 2,
VendorAttributes)) {
// std::cout << VendorAttributes << std::endl;
for (const auto &vendorAttr: VendorAttributes) {
if (vendorAttr.type == TIP_serial) {
for (uint16_t i = 0; i < vendorAttr.len; i++) {
if (P_.attributes[vendorAttr.pos + i] == '-')
continue;
R += (char) P_.attributes[vendorAttr.pos + i];
}
return R;
}
}
}
}
}
}
return R;
}
std::string ExtractSerialNumberFromProxyState() {
std::string Result;
for(const auto &attribute:Attrs_) {
if(attribute.type==33) {
const char * SN = (const char *)&P_.attributes[attribute.pos];
auto i=0;
while(*SN!=':' && i<12) {
Result+=*SN++;
i++;
}
return Result;
}
}
return Result;
}
std::string ExtractProxyStateDestination() {
std::string Result;
for(const auto &attribute:Attrs_) {
if(attribute.type==33 && attribute.len>2) {
std::string Attr33;
// format is serial:IP:port:interface
Attr33.assign((const char *)(const char *)&P_.attributes[attribute.pos],attribute.len-2);
auto Parts = Poco::StringTokenizer(Attr33,":");
if(Parts.count()==4)
return Parts[1]+":"+Parts[2];
return Result;
}
}
return Result;
}
std::string ExtractCallingStationID() {
std::string Result;
for(const auto &attribute:Attrs_) {
if(attribute.type==31 && attribute.len>2) {
Result.assign((const char *)(const char *)&P_.attributes[attribute.pos],attribute.len-2);
return Result;
}
}
return Result;
}
std::string ExtractCalledStationID() {
std::string Result;
for(const auto &attribute:Attrs_) {
if(attribute.type==30 && attribute.len>2) {
Result.assign((const char *)(const char *)&P_.attributes[attribute.pos],attribute.len-2);
return Result;
}
}
return Result;
}
[[nodiscard]] std::string UserName() const {
for(const auto &attr:Attrs_) {
if(attr.type==1) {
std::string user_name{(const char *)&P_.attributes[attr.pos],attr.len};
return user_name;
}
}
return "";
}
private:
RawRadiusPacket P_;
uint16_t Size_{0};
AttributeList Attrs_;
bool Valid_=false;
};
inline std::ostream &operator<<(std::ostream &os, RadiusPacket const &P) {
os << P.Attrs_ ;
return os;
}
}

653
src/RADIUS_proxy_server.cpp Normal file
View File

@@ -0,0 +1,653 @@
//
// Created by stephane bourque on 2022-05-18.
//
#include "RADIUS_proxy_server.h"
#include "RADIUS_helpers.h"
#include "AP_WS_Server.h"
namespace OpenWifi {
const int SMALLEST_RADIUS_PACKET = 20+19+4;
const int DEFAULT_RADIUS_AUTHENTICATION_PORT = 1812;
const int DEFAULT_RADIUS_ACCOUNTING_PORT = 1813;
const int DEFAULT_RADIUS_CoA_PORT = 3799;
int RADIUS_proxy_server::Start() {
ConfigFilename_ = MicroService::instance().DataDir()+"/radius_pool_config.json";
Poco::File Config(ConfigFilename_);
enabled_ = MicroService::instance().ConfigGetBool("radius.proxy.enable",false);
if(!enabled_ && !Config.exists())
return 0;
enabled_ = true;
Poco::Net::SocketAddress AuthSockAddrV4(Poco::Net::AddressFamily::IPv4,
MicroService::instance().ConfigGetInt("radius.proxy.authentication.port",DEFAULT_RADIUS_AUTHENTICATION_PORT));
AuthenticationSocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(AuthSockAddrV4,true);
Poco::Net::SocketAddress AuthSockAddrV6(Poco::Net::AddressFamily::IPv6,
MicroService::instance().ConfigGetInt("radius.proxy.authentication.port",DEFAULT_RADIUS_AUTHENTICATION_PORT));
AuthenticationSocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(AuthSockAddrV6,true);
Poco::Net::SocketAddress AcctSockAddrV4(Poco::Net::AddressFamily::IPv4,
MicroService::instance().ConfigGetInt("radius.proxy.accounting.port",DEFAULT_RADIUS_ACCOUNTING_PORT));
AccountingSocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(AcctSockAddrV4,true);
Poco::Net::SocketAddress AcctSockAddrV6(Poco::Net::AddressFamily::IPv6,
MicroService::instance().ConfigGetInt("radius.proxy.accounting.port",DEFAULT_RADIUS_ACCOUNTING_PORT));
AccountingSocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(AcctSockAddrV6,true);
Poco::Net::SocketAddress CoASockAddrV4(Poco::Net::AddressFamily::IPv4,
MicroService::instance().ConfigGetInt("radius.proxy.coa.port",DEFAULT_RADIUS_CoA_PORT));
CoASocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(CoASockAddrV4,true);
Poco::Net::SocketAddress CoASockAddrV6(Poco::Net::AddressFamily::IPv6,
MicroService::instance().ConfigGetInt("radius.proxy.coa.port",DEFAULT_RADIUS_CoA_PORT));
CoASocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(CoASockAddrV6,true);
RadiusReactor_.addEventHandler(*AuthenticationSocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAuthenticationSocketReadable));
RadiusReactor_.addEventHandler(*AuthenticationSocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAuthenticationSocketReadable));
RadiusReactor_.addEventHandler(*AccountingSocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAccountingSocketReadable));
RadiusReactor_.addEventHandler(*AccountingSocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAccountingSocketReadable));
RadiusReactor_.addEventHandler(*CoASocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnCoASocketReadable));
RadiusReactor_.addEventHandler(*CoASocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnCoASocketReadable));
ParseConfig();
// start RADSEC servers...
StartRADSECServers();
RadiusReactorThread_.start(RadiusReactor_);
Utils::SetThreadName(RadiusReactorThread_,"rad:reactor");
running_ = true;
return 0;
}
void RADIUS_proxy_server::Stop() {
poco_information(Logger(),"Stopping...");
if(enabled_ && running_) {
RadiusReactor_.removeEventHandler(
*AuthenticationSocketV4_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAuthenticationSocketReadable));
RadiusReactor_.removeEventHandler(
*AuthenticationSocketV6_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAuthenticationSocketReadable));
RadiusReactor_.removeEventHandler(
*AccountingSocketV4_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAccountingSocketReadable));
RadiusReactor_.removeEventHandler(
*AccountingSocketV6_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAccountingSocketReadable));
RadiusReactor_.removeEventHandler(
*CoASocketV4_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnCoASocketReadable));
RadiusReactor_.removeEventHandler(
*CoASocketV6_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnCoASocketReadable));
for(auto &[_,radsec_server]:RADSECservers_)
radsec_server->Stop();
RadiusReactor_.stop();
RadiusReactorThread_.join();
enabled_=false;
running_=false;
}
poco_information(Logger(),"Stopped...");
}
void RADIUS_proxy_server::StartRADSECServers() {
for(const auto &pool:PoolList_.pools) {
for(const auto &entry:pool.authConfig.servers) {
if(entry.radsec) {
StartRADSECServer(entry);
}
}
}
}
void RADIUS_proxy_server::StartRADSECServer(const GWObjects::RadiusProxyServerEntry &E) {
RADSECservers_[ Poco::Net::SocketAddress(E.ip,0) ] = std::make_unique<RADSECserver>(RadiusReactor_,E);
}
void RADIUS_proxy_server::OnAccountingSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf) {
Poco::Net::SocketAddress Sender;
RADIUS::RadiusPacket P;
auto ReceiveSize = pNf->socket().impl()->receiveBytes(P.Buffer(),P.BufferLen());
if(ReceiveSize<SMALLEST_RADIUS_PACKET) {
poco_warning(Logger(),"Accounting: bad packet received.");
return;
}
P.Evaluate(ReceiveSize);
auto SerialNumber = P.ExtractSerialNumberFromProxyState();
if(SerialNumber.empty()) {
poco_warning(Logger(),"Accounting: missing serial number.");
return;
}
auto CallingStationID = P.ExtractCallingStationID();
auto CalledStationID = P.ExtractCalledStationID();
poco_debug(Logger(), fmt::format("Accounting Packet received for {}, CalledStationID: {}, CallingStationID:{}",SerialNumber, CalledStationID, CallingStationID));
AP_WS_Server()->SendRadiusAccountingData(SerialNumber,P.Buffer(),P.Size());
}
void RADIUS_proxy_server::OnAuthenticationSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf) {
Poco::Net::SocketAddress Sender;
RADIUS::RadiusPacket P;
auto ReceiveSize = pNf->socket().impl()->receiveBytes(P.Buffer(),P.BufferLen());
if(ReceiveSize<SMALLEST_RADIUS_PACKET) {
poco_warning(Logger(),"Authentication: bad packet received.");
return;
}
P.Evaluate(ReceiveSize);
auto SerialNumber = P.ExtractSerialNumberFromProxyState();
if(SerialNumber.empty()) {
poco_warning(Logger(),"Authentication: missing serial number.");
return;
}
auto CallingStationID = P.ExtractCallingStationID();
auto CalledStationID = P.ExtractCalledStationID();
poco_debug(Logger(), fmt::format("Authentication Packet received for {}, CalledStationID: {}, CallingStationID:{}",SerialNumber, CalledStationID, CallingStationID));
AP_WS_Server()->SendRadiusAuthenticationData(SerialNumber,P.Buffer(),P.Size());
}
void RADIUS_proxy_server::OnCoASocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf) {
Poco::Net::SocketAddress Sender;
RADIUS::RadiusPacket P;
auto ReceiveSize = pNf.get()->socket().impl()->receiveBytes(P.Buffer(),P.BufferLen());
if(ReceiveSize<SMALLEST_RADIUS_PACKET) {
poco_warning(Logger(),"CoA/DM: bad packet received.");
return;
}
P.Evaluate(ReceiveSize);
auto SerialNumber = P.ExtractSerialNumberTIP();
if(SerialNumber.empty()) {
poco_warning(Logger(),"CoA/DM: missing serial number.");
return;
}
auto CallingStationID = P.ExtractCallingStationID();
auto CalledStationID = P.ExtractCalledStationID();
poco_debug(Logger(), fmt::format("CoA Packet received for {}, CalledStationID: {}, CallingStationID:{}",SerialNumber, CalledStationID, CallingStationID));
AP_WS_Server()->SendRadiusCoAData(SerialNumber,P.Buffer(),P.Size());
}
void RADIUS_proxy_server::SendAccountingData(const std::string &serialNumber, const char *buffer, std::size_t size) {
if(Pools_.empty() || !enabled_)
return;
try {
RADIUS::RadiusPacket P((unsigned char *)buffer, size);
auto Destination = P.ExtractProxyStateDestination();
auto CallingStationID = P.ExtractCallingStationID();
auto CalledStationID = P.ExtractCalledStationID();
Poco::Net::SocketAddress Dst(Destination);
std::lock_guard G(Mutex_);
bool UseRADSEC = false;
auto FinalDestination = Route(radius_type::acct, Dst, P, UseRADSEC);
if (UseRADSEC) {
Poco::Net::SocketAddress RSP(FinalDestination.host(), 0);
auto DestinationServer = RADSECservers_.find(RSP);
if (DestinationServer != end(RADSECservers_)) {
DestinationServer->second->SendData(serialNumber, (const unsigned char *)buffer,
size);
}
} else {
if ((Dst.family() == Poco::Net::SocketAddress::IPv4 &&
AccountingSocketV4_ == nullptr) ||
(Dst.family() == Poco::Net::SocketAddress::IPv6 &&
AccountingSocketV6_ == nullptr)) {
poco_debug(
Logger(),
fmt::format(
"ACCT: Trying to use RADIUS GW PROXY but not configured. Device={}",
serialNumber));
return;
}
auto AllSent =
SendData(Dst.family() == Poco::Net::SocketAddress::IPv4 ? *AccountingSocketV4_
: *AccountingSocketV6_,
(const unsigned char *)buffer, size, FinalDestination);
if (!AllSent)
poco_error(Logger(),
fmt::format("{}: Could not send Accounting packet packet to {}.",
serialNumber, Destination));
else
poco_debug(Logger(), fmt::format("{}: Sending Accounting Packet to {}, CalledStationID: {}, CallingStationID:{}",
serialNumber, FinalDestination.toString(),
CalledStationID, CallingStationID));
}
} catch (const Poco::Exception &E) {
Logger().log(E);
} catch (...) {
poco_warning(Logger(),fmt::format("Bad RADIUS ACCT Packet from {}. Dropped.",serialNumber));
}
}
bool RADIUS_proxy_server::SendData( Poco::Net::DatagramSocket & Sock, const unsigned char *buf , std::size_t size, const Poco::Net::SocketAddress &S) {
return Sock.sendTo(buf, size, S)==(int)size;
}
void RADIUS_proxy_server::SendAuthenticationData(const std::string &serialNumber, const char *buffer, std::size_t size) {
if(Pools_.empty() || !enabled_)
return;
try {
RADIUS::RadiusPacket P((unsigned char *)buffer,size);
auto Destination = P.ExtractProxyStateDestination();
auto CallingStationID = P.ExtractCallingStationID();
auto CalledStationID = P.ExtractCalledStationID();
Poco::Net::SocketAddress Dst(Destination);
std::lock_guard G(Mutex_);
bool UseRADSEC = false;
auto FinalDestination = Route(radius_type::auth, Dst, P, UseRADSEC);
if(UseRADSEC) {
Poco::Net::SocketAddress RSP(FinalDestination.host(),0);
auto DestinationServer = RADSECservers_.find(RSP);
if(DestinationServer!=end(RADSECservers_)) {
DestinationServer->second->SendData(serialNumber, (const unsigned char *)buffer, size);
}
} else {
if ((Dst.family() == Poco::Net::SocketAddress::IPv4 &&
AuthenticationSocketV4_ == nullptr) ||
(Dst.family() == Poco::Net::SocketAddress::IPv6 &&
AuthenticationSocketV6_ == nullptr)) {
poco_debug(
Logger(),
fmt::format("AUTH: Trying to use RADIUS GW PROXY but not configured. Device={}",
serialNumber));
return;
}
auto AllSent =
SendData(Dst.family() == Poco::Net::SocketAddress::IPv4 ? *AuthenticationSocketV4_
: *AuthenticationSocketV6_,
(const unsigned char *)buffer, size, FinalDestination);
if (!AllSent)
poco_error(Logger(),
fmt::format("{}: Could not send Authentication packet packet to {}.",
serialNumber, Destination));
else
poco_debug(Logger(), fmt::format("{}: Sending Authentication Packet to {}, CalledStationID: {}, CallingStationID:{}",
serialNumber, FinalDestination.toString(),
CalledStationID, CallingStationID));
}
} catch (const Poco::Exception &E) {
Logger().log(E);
} catch (...) {
poco_warning(Logger(),fmt::format("Bad RADIUS AUTH Packet from {}. Dropped.",serialNumber));
}
}
void RADIUS_proxy_server::SendCoAData(const std::string &serialNumber, const char *buffer, std::size_t size) {
if(Pools_.empty() || !enabled_)
return;
try {
RADIUS::RadiusPacket P((unsigned char *)buffer,size);
auto Destination = P.ExtractProxyStateDestination();
if(Destination.empty()) {
Destination = "0.0.0.0:0";
}
Poco::Net::SocketAddress Dst(Destination);
std::lock_guard G(Mutex_);
bool UseRADSEC = false;
auto FinalDestination = Route(radius_type::coa, Dst, P, UseRADSEC);
if(UseRADSEC) {
Poco::Net::SocketAddress RSP(FinalDestination.host(),0);
auto DestinationServer = RADSECservers_.find(RSP);
if(DestinationServer!=end(RADSECservers_)) {
DestinationServer->second->SendData(serialNumber, (const unsigned char *)buffer, size);
}
} else {
if( (Dst.family() == Poco::Net::SocketAddress::IPv4 && CoASocketV4_== nullptr) ||
(Dst.family() == Poco::Net::SocketAddress::IPv6 && CoASocketV6_== nullptr)) {
poco_debug(Logger(),fmt::format("CoA: Trying to use RADIUS GW PROXY but not configured. Device={}",serialNumber));
return;
}
auto AllSent = SendData(Dst.family() == Poco::Net::SocketAddress::IPv4 ? *CoASocketV4_
: *CoASocketV6_,
(const unsigned char *)buffer, size, FinalDestination);
if (!AllSent)
poco_error(Logger(),fmt::format("{}: Could not send CoA packet packet to {}.",
serialNumber, Destination));
else
poco_debug(Logger(), fmt::format("{}: Sending CoA Packet to {}", serialNumber,
FinalDestination.toString()));
}
} catch (const Poco::Exception &E) {
Logger().log(E);
} catch (...) {
poco_warning(Logger(),fmt::format("Bad RADIUS CoA/DM Packet from {}. Dropped.",serialNumber));
}
}
void RADIUS_proxy_server::ParseServerList(const GWObjects::RadiusProxyServerConfig & Config, std::vector<Destination> &V4, std::vector<Destination> &V6, bool setAsDefault) {
uint64_t TotalV4=0, TotalV6=0;
for(const auto &server:Config.servers) {
Poco::Net::IPAddress a;
if(!Poco::Net::IPAddress::tryParse(server.ip,a)) {
poco_error(Logger(),fmt::format("RADIUS-PARSE Config: server address {} is nto a valid address in v4 or v6. Entry skipped.",server.ip));
continue;
}
auto S = Poco::Net::SocketAddress(fmt::format("{}:{}",server.ip,server.port));
Destination D{
.Addr = S,
.state = 0,
.step = 0,
.weight = server.weight,
.available = true,
.strategy = Config.strategy,
.monitor = Config. monitor,
.monitorMethod = Config.monitorMethod,
.methodParameters = Config.methodParameters,
.useAsDefault = setAsDefault,
.useRADSEC = server.radsec,
.realms = server.radsecRealms
};
if(setAsDefault && D.useRADSEC)
defaultIsRADSEC_ = true;
if(S.family()==Poco::Net::IPAddress::IPv4) {
TotalV4 += server.weight;
V4.push_back(D);
} else {
TotalV6 += server.weight;
V6.push_back(D);
}
}
for(auto &i:V4) {
if(TotalV4==0) {
i.step = 1000;
} else {
i.step = 1000 - ((1000 * i.weight) / TotalV4);
}
}
for(auto &i:V6) {
if(TotalV6==0) {
i.step = 1000;
} else {
i.step = 1000 - ((1000 * i.weight) / TotalV6);
}
}
}
void RADIUS_proxy_server::ParseConfig() {
try {
Poco::File F(ConfigFilename_);
std::lock_guard G(Mutex_);
if(F.exists()) {
std::ifstream ifs(ConfigFilename_,std::ios_base::binary);
Poco::JSON::Parser P;
auto RawConfig = P.parse(ifs).extract<Poco::JSON::Object::Ptr>();
GWObjects::RadiusProxyPoolList RPC;
if(RPC.from_json(RawConfig)) {
ResetConfig();
PoolList_ = RPC;
for(const auto &pool:RPC.pools) {
RadiusPool NewPool;
ParseServerList(pool.authConfig, NewPool.AuthV4, NewPool.AuthV6, pool.useByDefault);
ParseServerList(pool.acctConfig, NewPool.AcctV4, NewPool.AcctV6, pool.useByDefault);
ParseServerList(pool.coaConfig, NewPool.CoaV4, NewPool.CoaV6, pool.useByDefault);
Pools_.push_back(NewPool);
}
} else {
poco_warning(Logger(),fmt::format("Configuration file '{}' is bad.",ConfigFilename_));
}
} else {
poco_warning(Logger(),fmt::format("No configuration file '{}' exists.",ConfigFilename_));
}
} catch (const Poco::Exception &E) {
Logger().log(E);
} catch (...) {
poco_error(Logger(),fmt::format("Error while parsing configuration file '{}'",ConfigFilename_));
}
}
static bool RealmMatch(const std::string &user_realm, const std::string & realm) {
if(realm.find_first_of('*') == std::string::npos)
return user_realm == realm;
return realm.find(user_realm) != std::string::npos;
}
Poco::Net::SocketAddress RADIUS_proxy_server::DefaultRoute(radius_type rtype, const Poco::Net::SocketAddress &RequestedAddress, const RADIUS::RadiusPacket &P, bool &UseRADSEC) {
bool IsV4 = RequestedAddress.family()==Poco::Net::SocketAddress::IPv4;
// find the realm...
auto UserName = P.UserName();
if(!UserName.empty()) {
auto UserTokens = Poco::StringTokenizer(UserName, "@");
auto UserRealm = ((UserTokens.count() > 1) ? UserTokens[1] : UserName);
Poco::toLowerInPlace(UserRealm);
for(const auto &pool:Pools_) {
for(const auto &server:pool.AuthV4) {
if(!server.realms.empty()) {
for(const auto &realm:server.realms) {
if (RealmMatch(UserRealm,realm)) {
std::cout << "Realm match..." << std::endl;
UseRADSEC = true;
return server.Addr;
}
}
}
}
}
}
if(defaultIsRADSEC_) {
UseRADSEC = true;
return (IsV4 ? Pools_[defaultPoolIndex_].AuthV4[0].Addr : Pools_[defaultPoolIndex_].AuthV6[0].Addr );
}
switch(rtype) {
case radius_type::auth: {
return ChooseAddress(IsV4 ? Pools_[defaultPoolIndex_].AuthV4
: Pools_[defaultPoolIndex_].AuthV6,
RequestedAddress);
}
case radius_type::acct:
default: {
return ChooseAddress(IsV4 ? Pools_[defaultPoolIndex_].AcctV4
: Pools_[defaultPoolIndex_].AcctV6,
RequestedAddress);
}
case radius_type::coa: {
return ChooseAddress(IsV4 ? Pools_[defaultPoolIndex_].CoaV4
: Pools_[defaultPoolIndex_].CoaV6,
RequestedAddress);
}
}
}
Poco::Net::SocketAddress RADIUS_proxy_server::Route([[maybe_unused]] radius_type rtype, const Poco::Net::SocketAddress &RequestedAddress, const RADIUS::RadiusPacket &P, bool &UseRADSEC) {
std::lock_guard G(Mutex_);
if(Pools_.empty()) {
UseRADSEC = false;
return RequestedAddress;
}
bool IsV4 = RequestedAddress.family()==Poco::Net::SocketAddress::IPv4;
bool useDefault;
useDefault = IsV4 ? RequestedAddress.host() == Poco::Net::IPAddress::wildcard(Poco::Net::IPAddress::IPv4) : RequestedAddress.host() == Poco::Net::IPAddress::wildcard(Poco::Net::IPAddress::IPv6) ;
if(useDefault) {
return DefaultRoute(rtype, RequestedAddress, P, UseRADSEC);
}
auto isAddressInPool = [&](const std::vector<Destination> & D, bool &UseRADSEC) -> bool {
for(const auto &entry:D)
if(entry.Addr.host()==RequestedAddress.host()) {
UseRADSEC = entry.useRADSEC;
return true;
}
return false;
};
for(auto &i:Pools_) {
switch(rtype) {
case radius_type::coa: {
if (isAddressInPool((IsV4 ? i.CoaV4 : i.CoaV6), UseRADSEC)) {
return ChooseAddress(IsV4 ? i.CoaV4 : i.CoaV6, RequestedAddress);
}
} break;
case radius_type::auth: {
if (isAddressInPool((IsV4 ? i.AuthV4 : i.AuthV6), UseRADSEC)) {
return ChooseAddress(IsV4 ? i.AuthV4 : i.AuthV6, RequestedAddress);
}
} break;
case radius_type::acct: {
if (isAddressInPool((IsV4 ? i.AcctV4 : i.AcctV6), UseRADSEC)) {
return ChooseAddress(IsV4 ? i.AcctV4 : i.AcctV6, RequestedAddress);
}
} break;
}
}
UseRADSEC = false;
return RequestedAddress;
}
Poco::Net::SocketAddress RADIUS_proxy_server::ChooseAddress(std::vector<Destination> &Pool, const Poco::Net::SocketAddress & OriginalAddress) {
if(Pool.size()==1) {
return Pool[0].Addr;
}
if (Pool[0].strategy == "weighted") {
bool found = false;
uint64_t cur_state = std::numeric_limits<uint64_t>::max();
std::size_t pos = 0, index = 0;
for (auto &i : Pool) {
if (!i.available) {
i.state += i.step;
continue;
}
if (i.state < cur_state) {
index = pos;
cur_state = i.state;
found = true;
}
pos++;
}
if (!found) {
return OriginalAddress;
}
Pool[index].state += Pool[index].step;
return Pool[index].Addr;
} else if (Pool[0].strategy == "round_robin") {
bool found = false;
uint64_t cur_state = std::numeric_limits<uint64_t>::max();
std::size_t pos = 0, index = 0;
for (auto &i : Pool) {
if (!i.available) {
i.state += 1;
continue;
}
if (i.state < cur_state) {
index = pos;
cur_state = i.state;
found = true;
}
pos++;
}
if (!found) {
return OriginalAddress;
}
Pool[index].state += 1;
return Pool[index].Addr;
} else if (Pool[0].strategy == "random") {
if (Pool.size() > 1) {
return Pool[std::rand() % Pool.size()].Addr;
} else {
return OriginalAddress;
}
}
return OriginalAddress;
}
void RADIUS_proxy_server::SetConfig(const GWObjects::RadiusProxyPoolList &C) {
std::lock_guard G(Mutex_);
PoolList_ = C;
Poco::JSON::Object Disk;
C.to_json(Disk);
std::ofstream ofs(ConfigFilename_, std::ios_base::trunc | std::ios_base::binary );
Disk.stringify(ofs);
ofs.close();
if(!running_) {
Start();
}
ParseConfig();
}
void RADIUS_proxy_server::ResetConfig() {
PoolList_.pools.clear();
Pools_.clear();
defaultPoolIndex_=0;
}
void RADIUS_proxy_server::DeleteConfig() {
std::lock_guard G(Mutex_);
try {
Poco::File F(ConfigFilename_);
if (F.exists())
F.remove();
} catch (...) {
}
ResetConfig();
Stop();
}
void RADIUS_proxy_server::GetConfig(GWObjects::RadiusProxyPoolList &C) {
std::lock_guard G(Mutex_);
C = PoolList_;
}
}

111
src/RADIUS_proxy_server.h Normal file
View File

@@ -0,0 +1,111 @@
//
// Created by stephane bourque on 2022-05-18.
//
#pragma once
#include "framework/MicroService.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
#include "Poco/Net/DatagramSocket.h"
#include "Poco/Net/SocketReactor.h"
#include "RADSECserver.h"
namespace OpenWifi {
enum class radius_type {
auth, acct, coa
};
class RADIUS_proxy_server : public SubSystemServer {
public:
inline static auto instance() {
static auto instance_= new RADIUS_proxy_server;
return instance_;
}
int Start() final;
void Stop() final;
inline bool Enabled() const { return enabled_; }
void OnAccountingSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf);
void OnAuthenticationSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf);
void OnCoASocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf);
void SendAccountingData(const std::string &serialNumber, const char *buffer, std::size_t size);
void SendAuthenticationData(const std::string &serialNumber, const char *buffer, std::size_t size);
void SendCoAData(const std::string &serialNumber, const char *buffer, std::size_t size);
void SetConfig(const GWObjects::RadiusProxyPoolList &C);
void DeleteConfig();
void GetConfig(GWObjects::RadiusProxyPoolList &C);
void StartRADSECServers();
void StartRADSECServer(const GWObjects::RadiusProxyServerEntry &E);
struct Destination {
Poco::Net::SocketAddress Addr;
uint64_t state = 0;
uint64_t step = 0;
uint64_t weight=0;
bool available = true;
std::string strategy;
bool monitor=false;
std::string monitorMethod;
std::vector<std::string> methodParameters;
bool useAsDefault=false;
bool useRADSEC=false;
std::vector<std::string> realms;
};
private:
std::unique_ptr<Poco::Net::DatagramSocket> AccountingSocketV4_;
std::unique_ptr<Poco::Net::DatagramSocket> AccountingSocketV6_;
std::unique_ptr<Poco::Net::DatagramSocket> AuthenticationSocketV4_;
std::unique_ptr<Poco::Net::DatagramSocket> AuthenticationSocketV6_;
std::unique_ptr<Poco::Net::DatagramSocket> CoASocketV4_;
std::unique_ptr<Poco::Net::DatagramSocket> CoASocketV6_;
Poco::Net::SocketReactor RadiusReactor_;
Poco::Thread RadiusReactorThread_;
GWObjects::RadiusProxyPoolList PoolList_;
std::string ConfigFilename_;
std::map<Poco::Net::SocketAddress, std::unique_ptr<RADSECserver>> RADSECservers_;
struct RadiusPool {
std::vector<Destination> AuthV4;
std::vector<Destination> AuthV6;
std::vector<Destination> AcctV4;
std::vector<Destination> AcctV6;
std::vector<Destination> CoaV4;
std::vector<Destination> CoaV6;
};
std::vector<RadiusPool> Pools_;
uint defaultPoolIndex_=0;
bool enabled_=false;
bool defaultIsRADSEC_=false;
std::atomic_bool running_=false;
RADIUS_proxy_server() noexcept:
SubSystemServer("RADIUS-PROXY", "RADIUS-PROXY", "radius.proxy")
{
}
static bool SendData( Poco::Net::DatagramSocket & Sock, const unsigned char *buf , std::size_t size, const Poco::Net::SocketAddress &S);
void ParseConfig();
void ResetConfig();
Poco::Net::SocketAddress Route(radius_type rtype, const Poco::Net::SocketAddress &A, const RADIUS::RadiusPacket &P, bool &UseRADSEC);
void ParseServerList(const GWObjects::RadiusProxyServerConfig & Config, std::vector<Destination> &V4, std::vector<Destination> &V6, bool setAsDefault);
static Poco::Net::SocketAddress ChooseAddress(std::vector<Destination> &Pool, const Poco::Net::SocketAddress & OriginalAddress);
Poco::Net::SocketAddress DefaultRoute([[maybe_unused]] radius_type rtype, const Poco::Net::SocketAddress &RequestedAddress, const RADIUS::RadiusPacket &P, bool &UseRADSEC);
};
inline auto RADIUS_proxy_server() { return RADIUS_proxy_server::instance(); }
}

263
src/RADSECserver.h Normal file
View File

@@ -0,0 +1,263 @@
//
// Created by stephane bourque on 2022-08-15.
//
#pragma once
#include <iostream>
#include <fstream>
#include "framework/MicroService.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
#include "Poco/Net/SocketReactor.h"
#include "Poco/Net/SecureStreamSocket.h"
#include "Poco/Net/Context.h"
#include "Poco/Crypto/X509Certificate.h"
#include "Poco/Net/NetException.h"
#include "Poco/TemporaryFile.h"
#include "RADIUS_helpers.h"
#include "AP_WS_Server.h"
namespace OpenWifi {
class RADSECserver : public Poco::Runnable {
public:
RADSECserver(Poco::Net::SocketReactor & R, GWObjects::RadiusProxyServerEntry E) :
Reactor_(R),
Server_(std::move(E)),
Logger_(Poco::Logger::get(fmt::format("RADSEC: {}@{}:{}",
Server_.name ,
Server_.ip,
Server_.port)))
{
ReconnectorThr_.start(*this);
}
inline void run() final {
while(TryAgain_) {
if(!Connected_) {
std::unique_lock G(Mutex_);
Connect();
}
Poco::Thread::trySleep(1000);
}
}
inline bool SendData(const std::string &serial_number, const unsigned char *buffer, int length) {
try {
if (Connected_) {
RADIUS::RadiusPacket P(buffer, length);
// std::cout << serial_number << " Sending " << P.PacketType() << " " << length << " bytes" << std::endl;
int sent_bytes;
if (P.VerifyMessageAuthenticator(Server_.radsecSecret)) {
poco_debug(Logger_,fmt::format("{}: {} Sending {} bytes", serial_number,
P.PacketType(), length));
sent_bytes = Socket_->sendBytes(buffer, length);
} else {
poco_debug(Logger_,fmt::format("{}: {} Sending {} bytes", serial_number,
P.PacketType(), length));
P.ComputeMessageAuthenticator(Server_.radsecSecret);
sent_bytes = Socket_->sendBytes(P.Buffer(), length);
}
return (sent_bytes == length);
}
} catch (...) {
}
return false;
}
inline void onData([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf) {
unsigned char Buffer[4096];
try {
auto NumberOfReceivedBytes = Socket_->receiveBytes(Buffer,sizeof(Buffer));
if(NumberOfReceivedBytes>40) {
RADIUS::RadiusPacket P(Buffer,NumberOfReceivedBytes);
if (P.IsAuthentication()) {
auto SerialNumber = P.ExtractSerialNumberFromProxyState();
if(!SerialNumber.empty()) {
poco_debug(Logger_,
fmt::format("{}: {} Received {} bytes.", SerialNumber,
P.PacketType(), NumberOfReceivedBytes));
AP_WS_Server()->SendRadiusAuthenticationData(SerialNumber, Buffer,
NumberOfReceivedBytes);
} else {
poco_debug(Logger_,
fmt::format("Invalid AUTH packet received in proxy dropped. No serial number Source={}",
Socket_->address().toString()));
}
} else if (P.IsAccounting()) {
auto SerialNumber = P.ExtractSerialNumberFromProxyState();
if(!SerialNumber.empty()) {
poco_debug(Logger_,
fmt::format("{}: {} Received {} bytes.", SerialNumber,
P.PacketType(), NumberOfReceivedBytes));
AP_WS_Server()->SendRadiusAccountingData(SerialNumber, Buffer,
NumberOfReceivedBytes);
} else {
poco_debug(Logger_,
fmt::format("Invalid ACCT packet received in proxy dropped. No serial number Source={}",
Socket_->address().toString()));
}
} else if (P.IsAuthority()) {
}
} else {
Disconnect();
}
} catch (const Poco::Exception &E) {
Logger_.log(E);
Disconnect();
}
}
inline void onError([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification>& pNf) {
std::cout << "onError" << std::endl;
Disconnect();
}
inline void onShutdown([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification>& pNf) {
std::cout << "onShutdown" << std::endl;
Disconnect();
}
inline bool Connect() {
if(TryAgain_) {
Poco::TemporaryFile CertFile_(MicroService::instance().DataDir());
Poco::TemporaryFile KeyFile_(MicroService::instance().DataDir());
std::vector<Poco::TemporaryFile> CaCertFiles_;
DecodeFile(CertFile_.path(), Server_.radsecCert);
DecodeFile(KeyFile_.path(), Server_.radsecKey);
for(auto &cert:Server_.radsecCacerts) {
CaCertFiles_.emplace_back(Poco::TemporaryFile(MicroService::instance().DataDir()));
DecodeFile(CaCertFiles_[CaCertFiles_.size()-1].path(), cert);
}
Poco::Net::Context::Ptr SecureContext = Poco::AutoPtr<Poco::Net::Context>(
new Poco::Net::Context(Poco::Net::Context::TLS_CLIENT_USE,
KeyFile_.path(),
CertFile_.path(),""));
for(const auto &ca:CaCertFiles_) {
Poco::Crypto::X509Certificate cert(ca.path());
SecureContext->addCertificateAuthority(cert);
}
Socket_ = std::make_unique<Poco::Net::SecureStreamSocket>(SecureContext);
Poco::Net::SocketAddress Destination(Server_.ip, Server_.port);
try {
poco_information(Logger_, "Attempting to connect");
Socket_->connect(Destination, Poco::Timespan(100, 0));
Socket_->completeHandshake();
Socket_->verifyPeerCertificate();
if(Socket_->havePeerCertificate()) {
Peer_Cert_ = std::make_unique<Poco::Crypto::X509Certificate>(Socket_->peerCertificate());
}
Socket_->setBlocking(false);
Socket_->setNoDelay(true);
Socket_->setKeepAlive(true);
Reactor_.addEventHandler(
*Socket_,
Poco::NObserver<RADSECserver, Poco::Net::ReadableNotification>(
*this, &RADSECserver::onData));
Reactor_.addEventHandler(
*Socket_, Poco::NObserver<RADSECserver, Poco::Net::ErrorNotification>(
*this, &RADSECserver::onError));
Reactor_.addEventHandler(
*Socket_,
Poco::NObserver<RADSECserver, Poco::Net::ShutdownNotification>(
*this, &RADSECserver::onShutdown));
Socket_->setBlocking(false);
Socket_->setNoDelay(true);
Socket_->setKeepAlive(true);
Connected_ = true;
poco_information(Logger_,fmt::format("Connected. CN={}",CommonName()));
return true;
} catch (const Poco::Net::NetException &E) {
poco_information(Logger_,"Could not connect.");
Logger_.log(E);
} catch (const Poco::Exception &E) {
poco_information(Logger_,"Could not connect.");
Logger_.log(E);
} catch (...) {
poco_information(Logger_,"Could not connect.");
}
}
return false;
}
inline void Disconnect() {
if(Connected_) {
std::unique_lock G(Mutex_);
Reactor_.removeEventHandler(
*Socket_, Poco::NObserver<RADSECserver, Poco::Net::ReadableNotification>(
*this, &RADSECserver::onData));
Reactor_.removeEventHandler(
*Socket_, Poco::NObserver<RADSECserver, Poco::Net::ErrorNotification>(
*this, &RADSECserver::onError));
Reactor_.removeEventHandler(
*Socket_, Poco::NObserver<RADSECserver, Poco::Net::ShutdownNotification>(
*this, &RADSECserver::onShutdown));
Connected_ = false;
}
poco_information(Logger_,"Disconnecting.");
}
inline void Stop() {
TryAgain_ = false;
Disconnect();
ReconnectorThr_.wakeUp();
ReconnectorThr_.join();
}
static void DecodeFile(const std::string &filename, const std::string &s) {
std::ofstream sec_file(filename,std::ios_base::out|std::ios_base::trunc|std::ios_base::binary);
std::stringstream is(s);
Poco::Base64Decoder ds(is);
Poco::StreamCopier::copyStream(ds,sec_file);
sec_file.close();
}
[[nodiscard]] inline std::string CommonName() {
if(Peer_Cert_)
return Peer_Cert_->commonName();
return "";
}
[[nodiscard]] inline std::string IssuerName() {
if(Peer_Cert_)
return Peer_Cert_->issuerName();
return "";
}
[[nodiscard]] inline std::string SubjectName() {
if(Peer_Cert_)
return Peer_Cert_->subjectName();
return "";
}
private:
std::shared_mutex Mutex_;
Poco::Net::SocketReactor &Reactor_;
GWObjects::RadiusProxyServerEntry Server_;
Poco::Logger &Logger_;
std::atomic_bool Connected_=false;
std::atomic_bool TryAgain_=true;
std::unique_ptr<Poco::Net::SecureStreamSocket> Socket_;
Poco::Thread ReconnectorThr_;
std::unique_ptr<Poco::Crypto::X509Certificate> Peer_Cert_;
};
}

View File

@@ -1,36 +1,39 @@
//
// Created by stephane bourque on 2021-06-28.
//
#include <cctype>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <future>
#include <numeric>
#include <chrono>
#include "RESTAPI_RPC.h"
#include "CommandManager.h"
#include "DeviceRegistry.h"
#include "AP_WS_Server.h"
#include "StorageService.h"
#include "framework/uCentral_Protocol.h"
#include "framework/ow_constants.h"
#include "ParseWifiScan.h"
namespace OpenWifi::RESTAPI_RPC {
void SetCommandStatus(GWObjects::CommandDetails &Cmd,
Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response,
RESTAPIHandler *Handler,
OpenWifi::Storage::CommandExecutionType Status,
Poco::Logger &Logger) {
[[maybe_unused]] Poco::Net::HTTPServerRequest &Request,
[[maybe_unused]] Poco::Net::HTTPServerResponse &Response,
RESTAPIHandler *Handler,
OpenWifi::Storage::CommandExecutionType Status,
[[maybe_unused]] Poco::Logger &Logger) {
if (StorageService()->AddCommand(Cmd.SerialNumber, Cmd, Status)) {
Poco::JSON::Object RetObj;
Cmd.to_json(RetObj);
return Handler->ReturnObject(RetObj);
if(Handler!= nullptr)
return Handler->ReturnObject(RetObj);
return;
}
return Handler->ReturnStatus(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR);
if(Handler!= nullptr)
return Handler->ReturnStatus(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR);
}
void WaitForCommand(GWObjects::CommandDetails &Cmd,
void WaitForCommand(uint64_t RPCID,
bool RetryLater,
GWObjects::CommandDetails &Cmd,
Poco::JSON::Object & Params,
Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response,
@@ -39,87 +42,118 @@ namespace OpenWifi::RESTAPI_RPC {
RESTAPIHandler * Handler,
Poco::Logger &Logger) {
Logger.information(fmt::format("{},{}: New {} command. User={} Serial={}. ", Cmd.UUID, RPCID, Cmd.Command, Cmd.SubmittedBy, Cmd.SerialNumber));
// if the command should be executed in the future, or if the device is not connected,
// then we should just add the command to
// the DB and let it figure out when to deliver the command.
if (Cmd.RunAt || !DeviceRegistry()->Connected(Cmd.SerialNumber)) {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::COMMAND_PENDING, Logger);
auto SerialNumberInt = Utils::SerialNumberToInt(Cmd.SerialNumber);
if (Cmd.RunAt || (!AP_WS_Server()->Connected(SerialNumberInt) && RetryLater)) {
Logger.information(fmt::format("{},{}: Command will be run in the future or when device is connected again.", Cmd.UUID, RPCID));
SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_PENDING, Logger);
return;
} else if ((!AP_WS_Server()->Connected(SerialNumberInt) && !RetryLater)){
Logger.information(fmt::format("{},{}: Command canceled. Device is not connected. Command will not be retried.", Cmd.UUID, RPCID));
return SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_FAILED, Logger);
}
Cmd.Executed = std::time(nullptr);
Cmd.Executed = OpenWifi::Now();
bool Sent;
std::chrono::time_point<std::chrono::high_resolution_clock> rpc_submitted = std::chrono::high_resolution_clock::now();
std::shared_ptr<CommandManager::promise_type_t> rpc_endpoint =
CommandManager()->PostCommand(Cmd.SerialNumber, Cmd.Command, Params, Cmd.UUID, Sent);
CommandManager()->PostCommand(RPCID, Cmd.SerialNumber, Cmd.Command, Params, Cmd.UUID, Sent);
if (Sent && rpc_endpoint!= nullptr) {
std::future<CommandManager::objtype_t> rpc_future(rpc_endpoint->get_future());
auto rpc_result = rpc_future.wait_for(WaitTimeInMs);
if (rpc_result == std::future_status::ready && rpc_future.valid()) {
std::chrono::duration<double, std::milli> rpc_execution_time = std::chrono::high_resolution_clock::now() - rpc_submitted;
auto rpc_answer = rpc_future.get();
if (rpc_answer) {
if (rpc_answer->has("result") && rpc_answer->isObject("result")) {
auto ResultFields =
rpc_answer->get("result").extract<Poco::JSON::Object::Ptr>();
if (ResultFields->has("status") && ResultFields->isObject("status")) {
auto StatusInnerObj =
ResultFields->get("status").extract<Poco::JSON::Object::Ptr>();
if (StatusInnerObj->has("error"))
Cmd.ErrorCode = StatusInnerObj->get("error");
if (StatusInnerObj->has("text"))
Cmd.ErrorText = StatusInnerObj->get("text").toString();
std::stringstream ResultText;
Poco::JSON::Stringifier::stringify(rpc_answer->get("result"),
ResultText);
Cmd.Results = ResultText.str();
Cmd.Status = "completed";
Cmd.Completed = time(nullptr);
Cmd.executionTime = rpc_execution_time.count();
if(RetryLater && (!Sent || rpc_endpoint== nullptr)) {
Logger.information(fmt::format("{},{}: Pending completion. Device is not connected.", Cmd.UUID, RPCID));
return SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_PENDING, Logger);
}
if (Cmd.ErrorCode && Cmd.Command == uCentralProtocol::TRACE) {
Cmd.WaitingForFile = 0;
Cmd.AttachDate = Cmd.AttachSize = 0;
Cmd.AttachType = "";
}
if(!RetryLater && !Sent) {
Logger.information(fmt::format("{},{}: Command canceled. Device is not connected. Command will not be retried.", Cmd.UUID, RPCID));
return SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_FAILED, Logger);
}
// Add the completed command to the database...
StorageService()->AddCommand(Cmd.SerialNumber, Cmd, Storage::COMMAND_COMPLETED);
if (ObjectToReturn) {
Handler->ReturnObject(*ObjectToReturn);
} else {
Poco::JSON::Object O;
Cmd.to_json(O);
Handler->ReturnObject(O);
}
Logger.information(Poco::format("Command(%s): completed in %8.3fms.", Cmd.UUID, Cmd.executionTime));
return;
} else {
SetCommandStatus(Cmd, Request, Response, Handler,
Storage::COMMAND_FAILED, Logger);
Logger.information(Poco::format(
"Invalid response for command '%s'. Missing status.", Cmd.UUID));
return;
}
} else {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::COMMAND_FAILED,
Logger);
Logger.information(Poco::format(
"Invalid response for command '%s'. Missing status.", Cmd.UUID));
return;
}
}
} else if (rpc_result == std::future_status::timeout) {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::COMMAND_TIMEDOUT,
Logger);
} else {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::COMMAND_PENDING, Logger);
Logger.information(fmt::format("{},{}: Command sent.", Cmd.UUID, RPCID));
std::future<CommandManager::objtype_t> rpc_future(rpc_endpoint->get_future());
auto rpc_result = rpc_future.wait_for(WaitTimeInMs);
if (rpc_result == std::future_status::ready) {
std::chrono::duration<double, std::milli> rpc_execution_time = std::chrono::high_resolution_clock::now() - rpc_submitted;
auto rpc_answer = rpc_future.get();
if (!rpc_answer.has(uCentralProtocol::RESULT) || !rpc_answer.isObject(uCentralProtocol::RESULT)) {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_FAILED, Logger);
Logger.information(fmt::format("{},{}: Invalid response. Missing result.", Cmd.UUID, RPCID));
return;
}
auto ResultFields = rpc_answer.get(uCentralProtocol::RESULT).extract<Poco::JSON::Object::Ptr>();
if (!ResultFields->has(uCentralProtocol::STATUS) || !ResultFields->isObject(uCentralProtocol::STATUS)) {
Cmd.executionTime = rpc_execution_time.count();
if(Cmd.Command=="ping") {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_COMPLETED, Logger);
Logger.information(fmt::format("{},{}: Invalid response from device (ping: fix override). Missing status.", Cmd.UUID, RPCID));
} else {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_FAILED, Logger);
Logger.information(fmt::format("{},{}: Invalid response from device. Missing status.", Cmd.UUID,RPCID));
}
return;
}
auto StatusInnerObj = ResultFields->get(uCentralProtocol::STATUS).extract<Poco::JSON::Object::Ptr>();
if (StatusInnerObj->has(uCentralProtocol::ERROR))
Cmd.ErrorCode = StatusInnerObj->get(uCentralProtocol::ERROR);
if (StatusInnerObj->has(uCentralProtocol::TEXT))
Cmd.ErrorText = StatusInnerObj->get(uCentralProtocol::TEXT).toString();
std::stringstream ResultText;
if(rpc_answer.has(uCentralProtocol::RESULT)) {
if(Cmd.Command==uCentralProtocol::WIFISCAN) {
auto ScanObj = rpc_answer.get(uCentralProtocol::RESULT).extract<Poco::JSON::Object::Ptr>();
ParseWifiScan(ScanObj, ResultText, Logger);
} else {
Poco::JSON::Stringifier::stringify(
rpc_answer.get(uCentralProtocol::RESULT), ResultText);
}
} if (rpc_answer.has(uCentralProtocol::RESULT_64)) {
uint64_t sz=0;
if(rpc_answer.has(uCentralProtocol::RESULT_SZ))
sz=rpc_answer.get(uCentralProtocol::RESULT_SZ);
std::string UnCompressedData;
Utils::ExtractBase64CompressedData(rpc_answer.get(uCentralProtocol::RESULT_64).toString(),
UnCompressedData,sz);
Poco::JSON::Stringifier::stringify(UnCompressedData, ResultText);
}
Cmd.Results = ResultText.str();
Cmd.Status = "completed";
Cmd.Completed = OpenWifi::Now();
Cmd.executionTime = rpc_execution_time.count();
if (Cmd.ErrorCode && Cmd.Command == uCentralProtocol::TRACE) {
Cmd.WaitingForFile = 0;
Cmd.AttachDate = Cmd.AttachSize = 0;
Cmd.AttachType = "";
}
// Add the completed command to the database...
StorageService()->AddCommand(Cmd.SerialNumber, Cmd, Storage::CommandExecutionType::COMMAND_COMPLETED);
if (ObjectToReturn && Handler) {
Handler->ReturnObject(*ObjectToReturn);
} else {
Poco::JSON::Object O;
Cmd.to_json(O);
if(Handler)
Handler->ReturnObject(O);
}
Logger.information( fmt::format("{},{}: Completed in {:.3f}ms.", Cmd.UUID, RPCID, Cmd.executionTime));
return;
}
CommandManager()->RemovePendingCommand(RPCID);
if(RetryLater) {
Logger.information(fmt::format("{},{}: Pending completion.", Cmd.UUID, RPCID));
SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_PENDING, Logger);
} else {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::COMMAND_PENDING, Logger);
Logger.information(fmt::format("{},{}: Command canceled. Device is not connected. Command will not be retried.", Cmd.UUID, RPCID));
return SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_FAILED, Logger);
}
}
}

View File

@@ -14,20 +14,23 @@
#include "Poco/File.h"
#include "Poco/JSON/Object.h"
#include "RESTObjects//RESTAPI_GWobjects.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
#include "StorageService.h"
#include "framework/MicroService.h"
namespace OpenWifi::RESTAPI_RPC {
void WaitForCommand( GWObjects::CommandDetails &Cmd,
Poco::JSON::Object & Params,
Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response,
std::chrono::milliseconds WaitTimeInMs,
Poco::JSON::Object * ObjectToReturn,
RESTAPIHandler * Handler,
Poco::Logger &Logger);
void WaitForCommand(
uint64_t RPCID,
bool RetryLater,
GWObjects::CommandDetails &Cmd,
Poco::JSON::Object & Params,
Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response,
std::chrono::milliseconds WaitTimeInMs,
Poco::JSON::Object * ObjectToReturn,
RESTAPIHandler * Handler,
Poco::Logger &Logger);
void SetCommandStatus( GWObjects::CommandDetails &Cmd,
Poco::Net::HTTPServerRequest &Request,

View File

@@ -12,14 +12,13 @@
#include "Poco/JSON/Stringifier.h"
#include "RESTAPI_blacklist.h"
#include "StorageService.h"
#include "framework/RESTAPI_errors.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void RESTAPI_blacklist::DoDelete() {
auto SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if(SerialNumber.empty()) {
if(!Utils::NormalizeMac(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
@@ -37,7 +36,7 @@ namespace OpenWifi {
void RESTAPI_blacklist::DoGet() {
auto SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if(SerialNumber.empty()) {
if(!Utils::NormalizeMac(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
@@ -52,14 +51,14 @@ namespace OpenWifi {
}
void RESTAPI_blacklist::DoPost() {
auto Obj = ParseStream();
const auto &Obj = ParsedBody_;
GWObjects::BlackListedDevice D;
if(!D.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if(D.serialNumber.empty()) {
if(D.serialNumber.empty() || !Utils::NormalizeMac(D.serialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
@@ -69,7 +68,7 @@ namespace OpenWifi {
}
D.author = UserInfo_.userinfo.email;
D.created = std::time(nullptr);
D.created = OpenWifi::Now();
if(StorageService()->AddBlackListDevice(D)) {
GWObjects::BlackListedDevice CreatedDevice;
@@ -85,12 +84,11 @@ namespace OpenWifi {
void RESTAPI_blacklist::DoPut() {
auto SerialNumber = Poco::toLower(GetBinding(RESTAPI::Protocol::SERIALNUMBER, ""));
if(SerialNumber.empty()) {
if(!Utils::NormalizeMac(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
auto Obj = ParseStream();
const auto &Obj = ParsedBody_;
GWObjects::BlackListedDevice Existing;
if(!StorageService()->GetBlackListDevice(SerialNumber, Existing)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);

View File

@@ -23,7 +23,7 @@ namespace OpenWifi {
Server,
TransactionId,
Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/blacklist/{serialNumber}"};}
static auto PathName() { return std::list<std::string>{"/api/v1/blacklist/{serialNumber}"};}
void DoGet() final;
void DoDelete() final;
void DoPost() final;

View File

@@ -16,7 +16,7 @@ namespace OpenWifi {
Server,
TransactionId,
Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/blacklist"};}
static auto PathName() { return std::list<std::string>{"/api/v1/blacklist"};}
void DoGet() final;
void DoDelete() final {};
void DoPost() final {};

View File

@@ -16,7 +16,7 @@ namespace OpenWifi {
Server,
TransactionId,
Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/capabilities"};}
static auto PathName() { return std::list<std::string>{"/api/v1/capabilities"};}
void DoGet() final;
void DoDelete() final {};
void DoPost() final {};

View File

@@ -9,12 +9,15 @@
#include "RESTAPI_command.h"
#include "StorageService.h"
#include "framework/RESTAPI_errors.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void RESTAPI_command::DoGet() {
auto CommandUUID = GetBinding(RESTAPI::Protocol::COMMANDUUID, "");
if(!Utils::ValidUUID(CommandUUID)) {
return NotFound();
}
GWObjects::CommandDetails Command;
if (StorageService()->GetCommand(CommandUUID, Command)) {
Poco::JSON::Object RetObj;
@@ -25,20 +28,23 @@ namespace OpenWifi {
}
void RESTAPI_command::DoDelete() {
auto UUID = GetBinding(RESTAPI::Protocol::COMMANDUUID, "");
if(UUID.empty()) {
auto CommandUUID = GetBinding(RESTAPI::Protocol::COMMANDUUID, "");
if(CommandUUID.empty()) {
return BadRequest(RESTAPI::Errors::MissingUUID);
}
GWObjects::CommandDetails C;
if(!StorageService()->GetCommand(UUID, C)) {
if(!Utils::ValidUUID(CommandUUID)) {
return NotFound();
}
if (StorageService()->DeleteCommand(UUID)) {
GWObjects::CommandDetails C;
if(!StorageService()->GetCommand(CommandUUID, C)) {
return NotFound();
}
if (StorageService()->DeleteCommand(CommandUUID)) {
return OK();
}
return InternalError();
return InternalError(RESTAPI::Errors::NoRecordsDeleted);
}
}

View File

@@ -21,7 +21,7 @@ class RESTAPI_command : public RESTAPIHandler {
Server,
TransactionId,
Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/command/{commandUUID}"};}
static auto PathName() { return std::list<std::string>{"/api/v1/command/{commandUUID}"};}
void DoGet() final;
void DoDelete() final;
void DoPost() final {};

View File

@@ -8,12 +8,15 @@
#include "RESTAPI_commands.h"
#include "StorageService.h"
#include "framework/RESTAPI_errors.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void RESTAPI_commands::DoGet() {
auto SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
if(!Utils::NormalizeMac(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
std::vector<GWObjects::CommandDetails> Commands;
if (QB_.Newest) {
StorageService()->GetNewestCommands(SerialNumber, QB_.Limit, Commands);
@@ -34,13 +37,13 @@ namespace OpenWifi {
void RESTAPI_commands::DoDelete() {
auto SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
if(SerialNumber.empty()) {
if(!Utils::NormalizeMac(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
if (StorageService()->DeleteCommands(SerialNumber, QB_.StartDate, QB_.EndDate)) {
return OK();
}
InternalError();
InternalError(RESTAPI::Errors::NoRecordsDeleted);
}
}

View File

@@ -21,7 +21,7 @@ namespace OpenWifi {
Server,
TransactionId,
Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/commands"};}
static auto PathName() { return std::list<std::string>{"/api/v1/commands"};}
void DoGet() final;
void DoDelete() final;
void DoPost() final {};

View File

@@ -12,13 +12,13 @@
#include "RESTObjects/RESTAPI_GWobjects.h"
#include "StorageService.h"
#include "framework/RESTAPI_errors.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
#include "framework/ConfigurationValidator.h"
#include "framework/orm.h"
namespace OpenWifi {
void RESTAPI_default_configuration::DoGet() {
std::string Name = GetBinding(RESTAPI::Protocol::NAME, "");
std::string Name = ORM::Escape(GetBinding(RESTAPI::Protocol::NAME, ""));
GWObjects::DefaultConfiguration DefConfig;
if (StorageService()->GetDefaultConfiguration(Name, DefConfig)) {
Poco::JSON::Object Obj;
@@ -29,7 +29,7 @@ namespace OpenWifi {
}
void RESTAPI_default_configuration::DoDelete() {
std::string Name = GetBinding(RESTAPI::Protocol::NAME, "");
std::string Name = ORM::Escape(GetBinding(RESTAPI::Protocol::NAME, ""));
if(Name.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
@@ -48,17 +48,17 @@ namespace OpenWifi {
}
if(StorageService()->DefaultConfigurationAlreadyExists(Name)) {
return BadRequest("Configuration name already exists.");
return BadRequest(RESTAPI::Errors::DefConfigNameExists);
}
auto Obj = ParseStream();
const auto &Obj = ParsedBody_;
GWObjects::DefaultConfiguration DefConfig;
if (!DefConfig.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if(DefConfig.Models.empty()) {
return BadRequest("modelIds cannot be empty");
return BadRequest(RESTAPI::Errors::ModelIDListCannotBeEmpty);
}
std::string Error;
@@ -66,7 +66,7 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::ConfigBlockInvalid);
}
DefConfig.Created = DefConfig.LastModified = std::time(nullptr);
DefConfig.Created = DefConfig.LastModified = OpenWifi::Now();
if (StorageService()->CreateDefaultConfiguration(Name, DefConfig)) {
return OK();
}
@@ -77,7 +77,7 @@ namespace OpenWifi {
void RESTAPI_default_configuration::DoPut() {
std::string Name = GetBinding(RESTAPI::Protocol::NAME, "");
auto Obj = ParseStream();
const auto &Obj = ParsedBody_;
GWObjects::DefaultConfiguration NewConfig;
if (!NewConfig.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
@@ -96,7 +96,7 @@ namespace OpenWifi {
Existing.Configuration = NewConfig.Configuration;
}
Existing.LastModified = std::time(nullptr);
Existing.LastModified = OpenWifi::Now();
AssignIfPresent(Obj,"description",Existing.Description);
if(Obj->has("modelIds"))
Existing.Models = NewConfig.Models;

View File

@@ -22,7 +22,7 @@ namespace OpenWifi {
Server,
TransactionId,
Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/default_configuration/{name}"};}
static auto PathName() { return std::list<std::string>{"/api/v1/default_configuration/{name}"};}
void DoGet() final;
void DoDelete() final;
void DoPost() final;

View File

@@ -11,7 +11,7 @@
#include "RESTAPI_default_configurations.h"
#include "StorageService.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void RESTAPI_default_configurations::DoGet() {

View File

@@ -20,7 +20,7 @@ class RESTAPI_default_configurations : public RESTAPIHandler {
Server,
TransactionId,
Internal){};
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/default_configurations"};}
static auto PathName() { return std::list<std::string>{"/api/v1/default_configurations"};}
void DoGet() final;
void DoDelete() final {};
void DoPost() final {};

View File

@@ -14,7 +14,7 @@ namespace OpenWifi {
std::vector<std::string>{
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_OPTIONS}, Server, TransactionId,Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/deviceDashboard"};}
static auto PathName() { return std::list<std::string>{"/api/v1/deviceDashboard"};}
void DoGet() final;
void DoDelete() final {};
void DoPost() final {};

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@
#pragma once
#include "framework/MicroService.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
class RESTAPI_device_commandHandler : public RESTAPIHandler {
@@ -31,28 +31,32 @@ namespace OpenWifi {
void GetStatistics();
void DeleteStatistics();
void GetStatus();
void ExecuteCommand();
void Configure();
void GetChecks();
void DeleteChecks();
void Upgrade();
void Reboot();
void Factory();
void LEDs();
void Trace();
void MakeRequest();
void WifiScan();
void EventQueue();
void Rtty();
void Telemetry();
void Ping();
void ExecuteCommand(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Configure(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Upgrade(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Reboot(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Factory(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void LEDs(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Trace(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void MakeRequest(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void WifiScan(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void EventQueue(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Rtty(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Telemetry(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Ping(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Script(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/device/{serialNumber}/{command}"}; };
static auto PathName() { return std::list<std::string>{"/api/v1/device/{serialNumber}/{command}"}; };
void DoGet() final;
void DoDelete() final;
void DoPost() final;
void DoPut() final {};
void CallCanceled(const char * Cmd,const std::string &UUID, uint64_t RPC, const OpenWifi::RESTAPI::Errors::msg & Err);
void CallCanceled(const char * Cmd, const OpenWifi::RESTAPI::Errors::msg &Err, const std::string & Details="");
inline bool ValidateParameters() {
Command_ = GetBinding(RESTAPI::Protocol::COMMAND, "");
if (Command_.empty()) {
@@ -66,6 +70,8 @@ namespace OpenWifi {
}
private:
std::string SerialNumber_, Command_;
std::string SerialNumber_,
Command_;
std::uint64_t SerialNumberInt_=0;
};
}

View File

@@ -13,15 +13,14 @@
#include "StorageService.h"
#include "framework/ConfigurationValidator.h"
#include "framework/MicroService.h"
#include "framework/RESTAPI_errors.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
#include "RESTAPI_device_helper.h"
namespace OpenWifi {
void RESTAPI_device_handler::DoGet() {
std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if(SerialNumber.empty()) {
if(!Utils::NormalizeMac(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
@@ -43,7 +42,7 @@ namespace OpenWifi {
void RESTAPI_device_handler::DoDelete() {
std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if(SerialNumber.empty()) {
if(!Utils::NormalizeMac(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
@@ -87,17 +86,17 @@ namespace OpenWifi {
void RESTAPI_device_handler::DoPost() {
std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if(SerialNumber.empty()) {
if(!Utils::NormalizeMac(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
const auto &Obj = ParsedBody_;
std::string Arg;
if(HasParameter("validateOnly",Arg) && Arg=="true") {
auto Body = ParseStream();
if(!Body->has("configuration")) {
return BadRequest("Must have 'configuration' element.");
if(!Obj->has("configuration")) {
return BadRequest(RESTAPI::Errors::MustHaveConfigElement);
}
auto Config=Body->get("configuration").toString();
auto Config=Obj->get("configuration").toString();
Poco::JSON::Object Answer;
std::string Error;
auto Res = ValidateUCentralConfiguration(Config, Error);
@@ -108,16 +107,19 @@ namespace OpenWifi {
}
if (!Utils::ValidSerialNumber(SerialNumber)) {
Logger_.warning(Poco::format("CREATE-DEVICE(%s): Illegal serial number.", SerialNumber));
Logger_.warning(fmt::format("CREATE-DEVICE({}): Illegal serial number.", SerialNumber));
return BadRequest( RESTAPI::Errors::InvalidSerialNumber);
}
auto Obj = ParseStream();
GWObjects::Device Device;
if (!Device.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if(!Utils::NormalizeMac(Device.SerialNumber)) {
return BadRequest( RESTAPI::Errors::InvalidSerialNumber);
}
if(SerialNumber!=Device.SerialNumber) {
return BadRequest(RESTAPI::Errors::SerialNumberMismatch);
}
@@ -127,11 +129,13 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::ConfigBlockInvalid);
}
for(auto &i:Device.Notes)
for(auto &i:Device.Notes) {
i.createdBy = UserInfo_.userinfo.email;
i.created = OpenWifi::Now();
}
Config::Config NewConfig(Device.Configuration);
Device.UUID = std::time(nullptr);
Device.UUID = OpenWifi::Now();
NewConfig.SetUUID(Device.UUID);
Device.Configuration = NewConfig.get();
@@ -149,11 +153,11 @@ namespace OpenWifi {
void RESTAPI_device_handler::DoPut() {
std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if(SerialNumber.empty()) {
if(!Utils::ValidSerialNumber(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
auto Obj = ParseStream();
const auto &Obj = ParsedBody_;
GWObjects::Device NewDevice;
if (!NewDevice.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
@@ -170,7 +174,7 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::ConfigBlockInvalid);
}
Config::Config NewConfig(NewDevice.Configuration);
uint64_t NewConfigUUID = std::time(nullptr);
uint64_t NewConfigUUID = OpenWifi::Now();
NewConfig.SetUUID(NewConfigUUID);
Existing.Configuration = NewConfig.get();
Existing.UUID = NewConfigUUID;
@@ -179,13 +183,16 @@ namespace OpenWifi {
AssignIfPresent(Obj, "venue", Existing.Venue);
AssignIfPresent(Obj, "owner", Existing.Owner);
AssignIfPresent(Obj, "location", Existing.Location);
AssignIfPresent(Obj, "subscriber", Existing.subscriber);
AssignIfPresent(Obj, "entity", Existing.entity);
for(auto &i:NewDevice.Notes) {
i.createdBy = UserInfo_.userinfo.email;
i.created = OpenWifi::Now();
Existing.Notes.push_back(i);
}
Existing.LastConfigurationChange = std::time(nullptr);
Existing.LastConfigurationChange = OpenWifi::Now();
if (StorageService()->UpdateDevice(Existing)) {
SetCurrentConfigurationID(SerialNumber, Existing.UUID);
Poco::JSON::Object DevObj;

View File

@@ -24,7 +24,7 @@ namespace OpenWifi {
Server,
TransactionId,
Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/device/{serialNumber}"}; };
static auto PathName() { return std::list<std::string>{"/api/v1/device/{serialNumber}"}; };
void DoGet() final;
void DoDelete() final;
void DoPost() final;

View File

@@ -6,17 +6,17 @@
#include "RESTObjects/RESTAPI_GWobjects.h"
#include "StorageService.h"
#include "DeviceRegistry.h"
#include "AP_WS_Server.h"
namespace OpenWifi {
inline void CompleteDeviceInfo(const GWObjects::Device & Device, Poco::JSON::Object & Answer) {
GWObjects::ConnectionState CS;
DeviceRegistry()->GetState(Device.SerialNumber,CS);
AP_WS_Server()->GetState(Device.SerialNumber,CS);
GWObjects::HealthCheck HC;
DeviceRegistry()->GetHealthcheck(Device.SerialNumber, HC);
AP_WS_Server()->GetHealthcheck(Device.SerialNumber, HC);
std::string Stats;
DeviceRegistry()->GetStatistics(Device.SerialNumber, Stats);
AP_WS_Server()->GetStatistics(Device.SerialNumber, Stats);
Poco::JSON::Object DeviceInfo;
Device.to_json(DeviceInfo);

View File

@@ -11,14 +11,78 @@
#include "RESTAPI_devices_handler.h"
#include "StorageService.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
#include "framework/MicroService.h"
#include "RESTAPI/RESTAPI_device_helper.h"
#include "Poco/StringTokenizer.h"
#include "framework/orm.h"
#include "AP_WS_Server.h"
namespace OpenWifi {
bool PrepareOrderBy(const std::string &OrderByListRaw, std::string &OrderByString) {
auto OrderByList = ORM::Escape(OrderByListRaw);
auto items = Poco::StringTokenizer(OrderByList,",");
std::string ItemList;
Types::StringVec Fields;
StorageService()->GetDeviceDbFieldList(Fields);
std::set<std::string> FieldNames;
for(const auto &field:Fields)
FieldNames.insert(Poco::toLower(field));
for(const auto &i:items) {
auto T = Poco::StringTokenizer(i,":");
if(T.count()!=2) {
return false;
}
if(T[1]!="a" && T[1]!="d") {
return false;
}
if(!ItemList.empty())
ItemList += " , ";
auto hint = FieldNames.find(Poco::toLower(T[0]));
if(hint==FieldNames.end()) {
return false;
}
ItemList += T[0] + (T[1]=="a" ? " ASC" : " DESC");
}
if(!ItemList.empty()) {
OrderByString = " ORDER BY " + ItemList;
}
return true;
}
void RESTAPI_devices_handler::DoGet() {
if(GetBoolParameter("connectionStatistics")) {
GWObjects::DeviceConnectionStatistics DCS;
Poco::JSON::Object Answer;
AP_WS_Server()->AverageDeviceStatistics(DCS.connectedDevices,DCS.averageConnectionTime, DCS.connectingDevices);
DCS.to_json(Answer);
return ReturnObject(Answer);
}
if(GetBoolParameter("orderSpec")) {
Types::StringVec Fields;
StorageService()->GetDeviceDbFieldList(Fields);
std::sort(Fields.begin(),Fields.end());
Poco::JSON::Object Answer;
RESTAPI_utils::field_to_json(Answer,"list",Fields);
return ReturnObject(Answer);
}
std::string OrderBy{" ORDER BY serialNumber ASC "}, Arg;
if(HasParameter("orderBy",Arg)) {
if(!PrepareOrderBy(Arg,OrderBy)) {
return BadRequest(RESTAPI::Errors::InvalidLOrderBy);
}
}
auto serialOnly = GetBoolParameter(RESTAPI::Protocol::SERIALONLY, false);
auto deviceWithStatus = GetBoolParameter(RESTAPI::Protocol::DEVICEWITHSTATUS, false);
auto completeInfo = GetBoolParameter("completeInfo",false);
@@ -28,6 +92,8 @@ namespace OpenWifi {
Poco::JSON::Array Objects;
for (auto &i : SelectedRecords()) {
auto SerialNumber = i;
if(!Utils::ValidSerialNumber(i))
continue;
GWObjects::Device D;
if (StorageService()->GetDevice(SerialNumber, D)) {
if(completeInfo) {
@@ -44,7 +110,7 @@ namespace OpenWifi {
}
} else {
Logger_.error(
Poco::format("DEVICE(%s): device in select cannot be found.", i));
fmt::format("DEVICE({}): device in select cannot be found.", i));
}
}
if (deviceWithStatus)
@@ -59,7 +125,7 @@ namespace OpenWifi {
}
} else if (serialOnly) {
std::vector<std::string> SerialNumbers;
StorageService()->GetDeviceSerialNumbers(QB_.Offset, QB_.Limit, SerialNumbers);
StorageService()->GetDeviceSerialNumbers(QB_.Offset, QB_.Limit, SerialNumbers, OrderBy);
Poco::JSON::Array Objects;
for (const auto &i : SerialNumbers) {
Objects.add(i);
@@ -67,7 +133,7 @@ namespace OpenWifi {
RetObj.set(RESTAPI::Protocol::SERIALNUMBERS, Objects);
} else {
std::vector<GWObjects::Device> Devices;
StorageService()->GetDevices(QB_.Offset, QB_.Limit, Devices);
StorageService()->GetDevices(QB_.Offset, QB_.Limit, Devices, OrderBy);
Poco::JSON::Array Objects;
for (const auto &i : Devices) {
Poco::JSON::Object Obj;

View File

@@ -20,7 +20,7 @@ namespace OpenWifi {
Server,
TransactionId,
Internal){};
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/devices"}; };
static auto PathName() { return std::list<std::string>{"/api/v1/devices"}; };
void DoGet() final;
void DoDelete() final {};
void DoPost() final {};

View File

@@ -12,8 +12,7 @@
#include "Poco/File.h"
#include "StorageService.h"
#include "framework/RESTAPI_errors.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/ow_constants.h"
#include <fstream>
namespace OpenWifi {
@@ -21,15 +20,12 @@ namespace OpenWifi {
auto UUID = GetBinding(RESTAPI::Protocol::FILEUUID, "");
auto SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
// does the file exist
Poco::File DownloadFile(FileUploader()->Path() + "/" + UUID);
std::string FileType;
if (!StorageService()->GetAttachedFile(UUID, SerialNumber, DownloadFile.path(), FileType)) {
std::string FileContent;
if (!StorageService()->GetAttachedFileContent(UUID, SerialNumber, FileContent, FileType)) {
return NotFound();
}
SendFile(DownloadFile, UUID);
DownloadFile.remove();
SendFileContent(FileContent,"pcap",UUID+".pcap");
}
void RESTAPI_file::DoDelete() {

View File

@@ -21,7 +21,7 @@ namespace OpenWifi {
Server,
TransactionId,
Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/file/{uuid}"};}
static auto PathName() { return std::list<std::string>{"/api/v1/file/{uuid}"};}
void DoGet() final;
void DoDelete() final;
void DoPost() final {};

View File

@@ -16,7 +16,7 @@ class RESTAPI_iptocountry_handler : public RESTAPIHandler {
Server,
TransactionId,
Internal){};
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/iptocountry"}; };
static auto PathName() { return std::list<std::string>{"/api/v1/iptocountry"}; };
void DoGet() final;
void DoDelete() final {};
void DoPost() final {};

View File

@@ -14,7 +14,7 @@ namespace OpenWifi {
std::vector<std::string>{
Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_OPTIONS}, Server, TransactionId,Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/ouis"};}
static auto PathName() { return std::list<std::string>{"/api/v1/ouis"};}
void DoGet() final;
void DoDelete() final {};
void DoPost() final {};

View File

@@ -0,0 +1,72 @@
//
// Created by stephane bourque on 2022-05-20.
//
#include "RESTAPI_radiusProxyConfig_handler.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
#include "RADIUS_proxy_server.h"
namespace OpenWifi {
void RESTAPI_radiusProxyConfig_handler::DoGet() {
GWObjects::RadiusProxyPoolList C;
RADIUS_proxy_server()->GetConfig(C);
Poco::JSON::Object Answer;
C.to_json(Answer);
return ReturnObject(Answer);
}
void RESTAPI_radiusProxyConfig_handler::DoDelete() {
if(!Internal_ && (UserInfo_.userinfo.userRole!=SecurityObjects::ROOT && UserInfo_.userinfo.userRole!=SecurityObjects::ADMIN)) {
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
}
RADIUS_proxy_server()->DeleteConfig();
return OK();
}
void RESTAPI_radiusProxyConfig_handler::DoPut() {
if(!Internal_ && (UserInfo_.userinfo.userRole!=SecurityObjects::ROOT && UserInfo_.userinfo.userRole!=SecurityObjects::ADMIN)) {
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
}
GWObjects::RadiusProxyPoolList C;
if(!C.from_json(ParsedBody_) || C.pools.empty()) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
// Logically validate the config.
for(const auto &pool:C.pools) {
if(pool.name.empty()) {
return BadRequest(RESTAPI::Errors::PoolNameInvalid);
}
for(const auto &config:{pool.acctConfig,pool.authConfig,pool.coaConfig}) {
if(config.servers.empty())
continue;
if(config.strategy!="random" && config.strategy!="round_robin" && config.strategy!="weighted") {
return BadRequest(RESTAPI::Errors::InvalidRadiusProxyStrategy);
}
if(config.monitorMethod!="none" && config.monitorMethod!="https" && config.monitorMethod!="radius") {
return BadRequest(RESTAPI::Errors::InvalidRadiusProxyMonitorMethod);
}
if(config.servers.empty()) {
return BadRequest(RESTAPI::Errors::MustHaveAtLeastOneRadiusServer);
}
for(auto &server:config.servers) {
Poco::Net::IPAddress Addr;
if(!Poco::Net::IPAddress::tryParse(server.ip,Addr) || server.port==0) {
return BadRequest(RESTAPI::Errors::InvalidRadiusServerEntry);
}
if(config.strategy=="weighted" && server.weight==0) {
return BadRequest(RESTAPI::Errors::InvalidRadiusServerWeigth);
}
}
}
}
RADIUS_proxy_server()->SetConfig(C);
return ReturnObject(*ParsedBody_);
}
}

View File

@@ -0,0 +1,27 @@
//
// Created by stephane bourque on 2022-05-20.
//
#pragma once
#include "framework/MicroService.h"
namespace OpenWifi {
class RESTAPI_radiusProxyConfig_handler : public RESTAPIHandler {
public:
RESTAPI_radiusProxyConfig_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
RESTAPI_GenericServer &Server, uint64_t TransactionId,
bool Internal)
: RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_PUT,
Poco::Net::HTTPRequest::HTTP_OPTIONS},
Server, TransactionId, Internal) {}
static auto PathName() { return std::list<std::string>{"/api/v1/radiusProxyConfig"}; }
void DoGet() final;
void DoDelete() final;
void DoPost() final{};
void DoPut() final;
};
}

View File

@@ -16,18 +16,16 @@
#include "RESTAPI/RESTAPI_devices_handler.h"
#include "RESTAPI/RESTAPI_file.h"
#include "RESTAPI/RESTAPI_ouis.h"
#include "RESTAPI/RESTAPI_capabilities_handler.h"
#include "RESTAPI/RESTAPI_telemetryWebSocket.h"
#include "RESTAPI/RESTAPI_webSocketServer.h"
#include "RESTAPI/RESTAPI_iptocountry_handler.h"
#include "RESTAPI/RESTAPI_radiusProxyConfig_handler.h"
namespace OpenWifi {
Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const char *Path, RESTAPIHandler::BindingMap &Bindings,
Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) {
Poco::Thread::current()->setName("ExtWebServerThread_" + std::to_string(TransactionId));
return RESTAPI_Router<
RESTAPI_devices_handler,
RESTAPI_device_handler,
@@ -44,13 +42,13 @@ namespace OpenWifi {
RESTAPI_blacklist,
RESTAPI_blacklist_list,
RESTAPI_iptocountry_handler,
RESTAPI_radiusProxyConfig_handler,
RESTAPI_capabilities_handler, RESTAPI_telemetryWebSocket>(Path,Bindings,L, S, TransactionId);
}
Poco::Net::HTTPRequestHandler * RESTAPI_IntRouter(const char *Path, RESTAPIHandler::BindingMap &Bindings,
Poco::Net::HTTPRequestHandler * RESTAPI_IntRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) {
Poco::Thread::current()->setName("IntWebServerThread_" + std::to_string(TransactionId));
return RESTAPI_Router_I<
RESTAPI_devices_handler,
RESTAPI_device_handler,
@@ -63,6 +61,7 @@ namespace OpenWifi {
RESTAPI_file,
RESTAPI_blacklist,
RESTAPI_iptocountry_handler,
RESTAPI_radiusProxyConfig_handler,
RESTAPI_blacklist_list>(Path,Bindings,L, S, TransactionId);
}
}

View File

@@ -25,14 +25,23 @@ void RESTAPI_telemetryWebSocket::DoGet() {
}
}
if(!Utils::NormalizeMac(SNum)) {
return BadRequest(RESTAPI::Errors::InvalidSerialNumber);
}
auto SerialNumber = Utils::SerialNumberToInt(SNum);
if(!TelemetryStream()->IsValidEndPoint(SerialNumber,UUID)) {
Logger_.warning(Poco::format("Illegal telemetry request for S: %s, UUID: %s", SerialNumber, UUID));
Logger_.warning(fmt::format("Illegal telemetry request for S: {}, UUID: {}", SerialNumber, UUID));
Response->setStatusAndReason(Poco::Net::HTTPResponse::HTTP_BAD_REQUEST);
Response->setContentLength(0);
Response->send();
return;
}
auto WS = Poco::SharedPtr<Poco::Net::WebSocket>( new Poco::Net::WebSocket(*Request, *Response));
new TelemetryClient(UUID, SerialNumber, WS, TelemetryStream()->NextReactor(), Logger_);
auto WS = std::make_unique<Poco::Net::WebSocket>(*Request, *Response);
new TelemetryClient(UUID, SerialNumber, std::move(WS), TelemetryStream()->NextReactor(), Logger_);
} catch (const Poco::Net::WebSocketException &E) {
Logger_.log(E);
switch (E.code()) {
@@ -49,7 +58,21 @@ void RESTAPI_telemetryWebSocket::DoGet() {
}
} catch (const Poco::Exception &E) {
Logger_.log(E);
Response->setStatusAndReason(Poco::Net::HTTPResponse::HTTP_BAD_REQUEST);
Response->setContentLength(0);
Response->send();
return;
} catch (...) {
Response->setStatusAndReason(Poco::Net::HTTPResponse::HTTP_BAD_REQUEST);
Response->setContentLength(0);
Response->send();
return;
}
} else {
SetCommonHeaders(true);
Response->setStatus(Poco::Net::HTTPResponse::HTTP_METHOD_NOT_ALLOWED);
Response->send();
return;
}
}
}

View File

@@ -14,7 +14,7 @@ namespace OpenWifi {
std::vector<std::string>{ Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_OPTIONS},
Server, TransactionId, Internal, false) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/ws_telemetry"};}
static auto PathName() { return std::list<std::string>{"/api/v1/ws_telemetry"};}
void DoGet() final;
void DoDelete() final {};
void DoPost() final {};

Some files were not shown because too many files have changed in this diff Show More