Compare commits

...

1047 Commits

Author SHA1 Message Date
TIP Automation User
67aef046ac Chg: update image tag in helm values to v2.10.0 2023-06-30 15:30:31 +00:00
TIP Automation User
ed47e1d7e9 Chg: update image tag in helm values to v2.10.0-RC2 2023-06-21 16:24:21 +00:00
Stephane Bourque
abfe38b6fc Merge pull request #330 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-12689
2023-06-20 08:59:27 -07:00
stephb9959
b8673c2dcc https://telecominfraproject.atlassian.net/browse/WIFI-12689
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-06-20 08:40:29 -07:00
TIP Automation User
1974622104 Chg: update image tag in helm values to v2.10.0-RC1 2023-06-09 13:34:11 +00:00
stephb9959
13e8ceb7e3 https://telecominfraproject.atlassian.net/browse/WIFI-12634
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-30 23:08:44 -07:00
stephb9959
6c112c21a7 https://telecominfraproject.atlassian.net/browse/WIFI-12630
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 07:54:28 -07:00
stephb9959
1ca76459fe https://telecominfraproject.atlassian.net/browse/WIFI-12630
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 14:32:23 -07:00
stephb9959
52ebfd30b9 https://telecominfraproject.atlassian.net/browse/WIFI-12630
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 14:05:06 -07:00
stephb9959
44822e5a63 https://telecominfraproject.atlassian.net/browse/WIFI-12630
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 13:58:56 -07:00
stephb9959
2561fb5cd4 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 13:37:24 -07:00
stephb9959
96f25fd949 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 13:36:11 -07:00
stephb9959
ccbc6307e6 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 13:35:28 -07:00
stephb9959
39e625bb34 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 13:33:15 -07:00
stephb9959
8fd4e57fe8 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 12:23:36 -07:00
stephb9959
192b2d50b4 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 12:20:37 -07:00
stephb9959
6dd67a8218 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 12:17:17 -07:00
stephb9959
3edfb11c33 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 12:12:02 -07:00
stephb9959
fd607bf963 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 08:51:35 -07:00
stephb9959
c68cd6aad8 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-18 08:51:29 -07:00
stephb9959
f4674e93c7 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-18 08:50:08 -07:00
stephb9959
21a4eb2a71 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-18 08:46:04 -07:00
stephb9959
ed336bec0c https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 14:17:25 -07:00
stephb9959
b5f8063ab7 https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 14:12:18 -07:00
stephb9959
69dc1b8056 https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 10:24:59 -07:00
stephb9959
a933376bf6 https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 10:14:04 -07:00
stephb9959
21a4245204 https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 10:08:28 -07:00
stephb9959
bcfbc0d2c0 https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 09:48:48 -07:00
stephb9959
f453205a5d https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 09:09:43 -07:00
stephb9959
a8d3ed0dba https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 08:56:57 -07:00
stephb9959
42ab4717d5 https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 08:52:00 -07:00
stephb9959
a36796ab4e https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-17 08:11:16 -07:00
stephb9959
cd9a4f9902 https://telecominfraproject.atlassian.net/browse/WIFI-12590
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-16 09:38:13 -07:00
stephb9959
806f39bc88 https://telecominfraproject.atlassian.net/browse/WIFI-12610
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-16 09:07:41 -07:00
stephb9959
6afeb470d9 https://telecominfraproject.atlassian.net/browse/WIFI-12572
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-15 09:49:57 -07:00
stephb9959
991d60e019 https://telecominfraproject.atlassian.net/browse/WIFI-12572
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-15 09:33:30 -07:00
stephb9959
5cebcdd675 Merge remote-tracking branch 'origin/master' 2023-05-02 09:05:57 -07:00
stephb9959
fdb09654c2 https://telecominfraproject.atlassian.net/browse/WIFI-12572
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-02 09:05:44 -07:00
jaspreetsachdev
a657ce2f52 Update values.yaml 2023-05-02 10:44:14 -04:00
stephb9959
7b17af5575 https://telecominfraproject.atlassian.net/browse/WIFI-12567
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-01 07:59:57 -07:00
stephb9959
cc2b9e536f https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-27 07:47:33 -07:00
stephb9959
1a8a0b2ebc https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-21 09:51:40 -07:00
stephb9959
c808d0146c https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-21 09:40:17 -07:00
stephb9959
0bb107b48d https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-21 09:30:03 -07:00
stephb9959
a4f2b8fd5e https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-21 09:27:27 -07:00
stephb9959
4fd9b4f540 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-20 06:40:58 -07:00
stephb9959
d51980e0e5 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-19 22:19:45 -07:00
stephb9959
5ece25ebac https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-19 22:04:22 -07:00
stephb9959
d578174b23 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-19 22:00:00 -07:00
stephb9959
08689107da https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-19 14:27:46 -07:00
stephb9959
0d680934f8 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-19 13:28:30 -07:00
stephb9959
907d739943 https://telecominfraproject.atlassian.net/browse/WIFI-12378
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-18 16:29:18 -07:00
stephb9959
e5665769ef https://telecominfraproject.atlassian.net/browse/WIFI-12378
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-18 16:23:52 -07:00
stephb9959
8abbc73546 https://telecominfraproject.atlassian.net/browse/WIFI-12378
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-18 15:57:31 -07:00
stephb9959
0c86ffdfff https://telecominfraproject.atlassian.net/browse/WIFI-12378
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-18 15:09:14 -07:00
stephb9959
c0f59756ae https://telecominfraproject.atlassian.net/browse/WIFI-12378
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-18 15:05:15 -07:00
stephb9959
41dd567630 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-17 07:57:10 -07:00
stephb9959
6d87fafbc0 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-17 07:40:47 -07:00
stephb9959
dddc4f34ac https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-06 10:27:49 -07:00
stephb9959
9a99bcd2c2 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-06 10:23:24 -07:00
stephb9959
e849a3eba0 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-06 09:23:11 -07:00
stephb9959
decb2bf8c2 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-06 09:07:37 -07:00
stephb9959
0ae5dc5cf9 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-06 08:59:15 -07:00
stephb9959
9160497b28 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-04 23:36:19 -07:00
stephb9959
9a4e19c651 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-04 23:33:59 -07:00
stephb9959
62bfb10ca3 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-04 22:59:44 -07:00
stephb9959
9e3d80f1ea https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-04 14:30:13 -07:00
stephb9959
fc3b516c76 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-04 09:45:50 -07:00
stephb9959
ac183fcde6 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-04 09:21:13 -07:00
stephb9959
7ebc977601 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-04 09:18:12 -07:00
stephb9959
ec94cdb2df https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-04 09:04:29 -07:00
stephb9959
9c61451f0f https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 22:50:00 -07:00
stephb9959
d08afb6d75 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 22:18:29 -07:00
stephb9959
087ea5372b https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 21:53:30 -07:00
stephb9959
b882796c90 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 21:49:18 -07:00
stephb9959
91c6a8fba1 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 21:27:29 -07:00
stephb9959
2e69ca7444 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 21:19:23 -07:00
stephb9959
58c08c3ff7 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 21:15:18 -07:00
stephb9959
737f1146a1 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 21:05:12 -07:00
stephb9959
0f85f2453b https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 20:47:13 -07:00
stephb9959
a8c4cf1940 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 20:44:38 -07:00
stephb9959
cf320e63ee https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 15:34:07 -07:00
stephb9959
95a11e8f96 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 15:28:23 -07:00
stephb9959
bf611d36cc https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 15:22:03 -07:00
stephb9959
b543e03660 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 15:03:30 -07:00
stephb9959
c1e101366e https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 14:28:29 -07:00
stephb9959
47f21ae17e https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 13:01:32 -07:00
stephb9959
c1dd0151f9 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 12:54:56 -07:00
stephb9959
80efb654d5 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 12:49:47 -07:00
stephb9959
2ef9a9220f https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 12:42:42 -07:00
stephb9959
c27edec0f7 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 12:29:41 -07:00
stephb9959
c8a65d6137 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 12:26:22 -07:00
stephb9959
f408a44898 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 12:15:51 -07:00
stephb9959
4f289427ca https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 12:11:42 -07:00
stephb9959
2b89cc187b https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 12:04:54 -07:00
stephb9959
59dc2ad032 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-03 11:45:47 -07:00
stephb9959
0d6e2c0e33 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-02 23:32:09 -07:00
stephb9959
37a02b699d https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-02 20:56:58 -07:00
stephb9959
9772e95238 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-02 17:27:20 -07:00
stephb9959
f4d86120c4 https://telecominfraproject.atlassian.net/browse/WIFI-12423
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-02 16:21:19 -07:00
Stephane Bourque
384d11d998 Merge pull request #329 from Telecominfraproject/WIFI-12334
https://telecominfraproject.atlassian.net/browse/WIFI-12334
2023-04-02 15:43:35 -07:00
stephb9959
5f8ea6a474 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-30 08:59:32 -07:00
Stephane Bourque
9769a9fa24 Merge pull request #328 from Telecominfraproject/WIFI-12334
https://telecominfraproject.atlassian.net/browse/WIFI-12334
2023-03-28 10:39:00 -07:00
stephb9959
4d16155aec https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-28 10:36:31 -07:00
stephb9959
00ca2a6d92 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-28 10:25:10 -07:00
stephb9959
ecddb5ba63 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-28 10:21:13 -07:00
stephb9959
6fe5298602 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-28 10:18:09 -07:00
stephb9959
1c3c7ec842 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-28 09:59:55 -07:00
stephb9959
e547ee40b0 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-28 08:49:13 -07:00
stephb9959
81806df5cb https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-28 08:42:01 -07:00
stephb9959
3b9c574149 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 23:44:10 -07:00
stephb9959
4159ba4dca https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 23:39:22 -07:00
stephb9959
a1eb8ab3d0 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 23:31:58 -07:00
stephb9959
2fb316b79e https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 23:23:28 -07:00
stephb9959
ad3319496d https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 23:18:10 -07:00
stephb9959
38a7d35c4b https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 23:00:05 -07:00
stephb9959
3c6e24e50f https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 22:56:59 -07:00
stephb9959
b127f38081 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 22:56:36 -07:00
Stephane Bourque
82cdc4cc03 Merge pull request #327 from Telecominfraproject/WIFI-12428
https://telecominfraproject.atlassian.net/browse/WIFI-12428
2023-03-27 22:46:47 -07:00
Stephane Bourque
2566237c91 Merge branch 'master' into WIFI-12428 2023-03-27 22:46:37 -07:00
stephb9959
562c952d52 https://telecominfraproject.atlassian.net/browse/WIFI-12428
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 14:35:19 -07:00
stephb9959
23d160cba1 https://telecominfraproject.atlassian.net/browse/WIFI-12428
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 14:33:14 -07:00
stephb9959
8cbe0b7c4f https://telecominfraproject.atlassian.net/browse/WIFI-12428
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 14:17:58 -07:00
stephb9959
d804dad1f0 https://telecominfraproject.atlassian.net/browse/WIFI-12428
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-27 11:25:26 -07:00
Stephane Bourque
72595922eb Merge pull request #326 from Telecominfraproject/WIFI-12337
https://telecominfraproject.atlassian.net/browse/WIFI-12337
2023-03-23 21:36:54 -07:00
Stephane Bourque
f1c330eac7 Merge branch 'master' into WIFI-12337 2023-03-23 21:36:30 -07:00
stephb9959
f143471723 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 21:31:29 -07:00
stephb9959
957e6acf03 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 21:27:54 -07:00
stephb9959
a6bc509c3d https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 21:26:17 -07:00
stephb9959
5fd145c7d6 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 21:21:20 -07:00
stephb9959
f9b431e566 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 21:16:34 -07:00
stephb9959
a35acfeb88 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 21:10:52 -07:00
stephb9959
e028b2dd41 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 21:09:24 -07:00
stephb9959
69e539ffbe https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 21:03:40 -07:00
stephb9959
4a8506f4fe https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 19:26:46 -07:00
stephb9959
2621e2fdde https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 19:25:44 -07:00
stephb9959
8425632453 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 19:20:17 -07:00
stephb9959
bce03ee024 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 19:19:03 -07:00
stephb9959
b6f76b70ab https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 18:54:03 -07:00
stephb9959
30e62dd203 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 17:56:46 -07:00
stephb9959
ae9179eb0e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 17:36:56 -07:00
stephb9959
0d59e8b0c2 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 17:33:45 -07:00
stephb9959
545f787a4e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 15:25:28 -07:00
stephb9959
64199bbb62 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 15:04:21 -07:00
stephb9959
1ac4625947 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 14:47:38 -07:00
stephb9959
b45c16f2c0 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 14:35:27 -07:00
stephb9959
86a33ed818 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 11:21:52 -07:00
stephb9959
65c4a96f41 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 11:04:36 -07:00
stephb9959
b7908816a9 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 10:54:25 -07:00
stephb9959
dc55a3a180 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 10:49:50 -07:00
stephb9959
4b953d968b https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 10:40:15 -07:00
stephb9959
81324da9e8 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 10:26:03 -07:00
Stephane Bourque
54d94eef84 Merge pull request #323 from Telecominfraproject/WIFI-12337
https://telecominfraproject.atlassian.net/browse/WIFI-12337
2023-03-23 09:15:43 -07:00
Stephane Bourque
397799278c Merge branch 'master' into WIFI-12337 2023-03-23 09:14:57 -07:00
stephb9959
4b32a9cae0 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 09:07:46 -07:00
stephb9959
6f6fc32ed4 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 09:02:11 -07:00
stephb9959
429e0345d0 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 08:58:27 -07:00
stephb9959
67c3f39ae0 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 08:47:11 -07:00
stephb9959
50911d8a54 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-23 08:18:16 -07:00
stephb9959
d8d0eed1fb https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-22 10:24:32 -07:00
stephb9959
d1eb584430 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-22 10:23:33 -07:00
stephb9959
c76e10299d https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-22 09:27:28 -07:00
stephb9959
2949231f67 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-22 09:08:43 -07:00
stephb9959
d6731e4e5b https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-22 08:22:08 -07:00
stephb9959
d92b064561 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-22 07:35:59 -07:00
stephb9959
ec4a7f64de https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-21 16:44:31 -07:00
stephb9959
14877301e4 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-21 16:24:09 -07:00
stephb9959
d92cba15bb https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-21 16:14:12 -07:00
stephb9959
33d92c9240 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-21 15:56:23 -07:00
stephb9959
737ed24d91 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-21 15:10:51 -07:00
stephb9959
670f497af4 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-21 11:01:25 -07:00
stephb9959
11ba1cc6e4 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-21 10:40:40 -07:00
TIP Automation User
e43ff02c3d Chg: update image tag in helm values to v2.9.0-RC2 2023-03-20 16:53:20 +00:00
Stephane Bourque
c69c4754cf Merge pull request #321 from Telecominfraproject/WIFI-12407
https://telecominfraproject.atlassian.net/browse/WIFI-12407
2023-03-20 09:51:59 -07:00
Stephane Bourque
8478d761db Merge branch 'master' into WIFI-12407 2023-03-20 09:51:36 -07:00
stephb9959
500a4dc130 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-20 08:58:36 -07:00
Stephane Bourque
3e2a32544a Merge pull request #320 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-12337
2023-03-20 08:52:52 -07:00
stephb9959
83e0f88827 https://telecominfraproject.atlassian.net/browse/WIFI-1237
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-20 08:50:53 -07:00
stephb9959
c420d9c572 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-20 08:15:19 -07:00
stephb9959
c94d90911f https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-20 07:47:19 -07:00
stephb9959
04fd524b52 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 22:44:39 -07:00
stephb9959
b49744779e https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 22:38:52 -07:00
stephb9959
60de792147 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 22:37:17 -07:00
stephb9959
e6d6da53c7 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 22:28:58 -07:00
stephb9959
cd62cb8b84 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 21:51:49 -07:00
Stephane Bourque
3439eeb7b7 Merge pull request #319 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-12337
2023-03-19 21:49:36 -07:00
stephb9959
85eb8546c3 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 21:47:17 -07:00
stephb9959
bc5a8bbe5b https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 21:04:51 -07:00
stephb9959
6e413643de Merge remote-tracking branch 'origin/master' 2023-03-19 21:00:57 -07:00
stephb9959
bd64ceb82d https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 21:00:23 -07:00
stephb9959
d92a93a872 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 16:32:39 -07:00
stephb9959
0def242b40 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 16:21:48 -07:00
stephb9959
eeb5e2d3be https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 16:14:56 -07:00
stephb9959
e76132f464 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 15:54:27 -07:00
stephb9959
ac41327bf8 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 15:45:12 -07:00
stephb9959
0084b5d21c https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 15:06:54 -07:00
stephb9959
69b4de1b74 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 15:02:26 -07:00
stephb9959
0c3e8d4630 https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 14:55:29 -07:00
stephb9959
af739bc32b https://telecominfraproject.atlassian.net/browse/WIFI-12407
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-19 14:19:22 -07:00
Stephane Bourque
b535ca2b35 Merge pull request #318 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-12337
2023-03-17 20:45:29 -07:00
jaspreetsachdev
42a3f7f9c3 Update values.yaml 2023-03-17 23:05:11 -04:00
jaspreetsachdev
a244a7ea09 Update values.yaml 2023-03-17 22:45:43 -04:00
stephb9959
c03a3c336d https://telecominfraproject.atlassian.net/browse/WIFI-12416
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-17 15:58:04 -07:00
stephb9959
59d648517f https://telecominfraproject.atlassian.net/browse/WIFI-12416
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-17 15:43:42 -07:00
stephb9959
e24e62a556 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-17 12:22:45 -07:00
stephb9959
a61ab8f0fb https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-17 11:39:16 -07:00
stephb9959
6841322a99 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-17 11:25:26 -07:00
stephb9959
3b7dab4c6a https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-17 11:09:55 -07:00
stephb9959
229a403167 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-17 11:05:06 -07:00
stephb9959
8513601a77 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-17 10:53:10 -07:00
stephb9959
a13da08652 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 23:38:53 -07:00
stephb9959
5b19f4fdeb https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 22:38:42 -07:00
stephb9959
ba9fab427b https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 22:22:06 -07:00
stephb9959
72ffcbbb45 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 22:06:53 -07:00
stephb9959
e028768252 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 22:06:42 -07:00
stephb9959
a7d07f8c60 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 22:05:42 -07:00
stephb9959
9a16b51c28 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 21:59:31 -07:00
stephb9959
fd1edc0a10 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 21:46:17 -07:00
stephb9959
8deaeb26a7 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 20:56:02 -07:00
stephb9959
518d9232ca https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 11:33:49 -07:00
stephb9959
a3e16eb1e2 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 11:33:43 -07:00
stephb9959
1d630e4770 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 11:27:00 -07:00
stephb9959
e843cf4575 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 11:20:03 -07:00
stephb9959
3cd4ef228c https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 11:03:57 -07:00
stephb9959
7240a9aa51 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 11:00:29 -07:00
stephb9959
213323d713 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 10:59:05 -07:00
stephb9959
64cd687635 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 10:37:57 -07:00
stephb9959
3db5c9ac48 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 09:55:32 -07:00
stephb9959
acd0e46768 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 09:55:22 -07:00
stephb9959
b52c19cde9 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 09:37:09 -07:00
stephb9959
18c3902a7f https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 09:05:28 -07:00
stephb9959
bfb6f3b662 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 08:45:31 -07:00
stephb9959
12d13df907 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-16 08:17:06 -07:00
stephb9959
d25c7cbdb9 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 21:14:09 -07:00
stephb9959
3e40b9312a https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 21:10:17 -07:00
stephb9959
e74623ba75 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 21:09:54 -07:00
stephb9959
fe4f977848 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 21:09:19 -07:00
stephb9959
5884db2e53 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 21:04:04 -07:00
stephb9959
9a0b23e683 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 21:00:12 -07:00
stephb9959
5309c8fd08 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 20:55:07 -07:00
stephb9959
1f8912aa2e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 20:47:23 -07:00
stephb9959
873c348d50 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 20:38:22 -07:00
stephb9959
47d08002bf https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 20:29:13 -07:00
stephb9959
47c2f21884 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 20:22:01 -07:00
stephb9959
da6aec9cf9 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 20:17:28 -07:00
stephb9959
703788a1c6 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 20:11:53 -07:00
stephb9959
fc0de059bb https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 20:08:18 -07:00
stephb9959
448594e724 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 19:46:10 -07:00
stephb9959
ffbd3d8246 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 16:00:54 -07:00
stephb9959
128e4e99e7 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 15:52:22 -07:00
stephb9959
6983b0c2dd https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 08:46:51 -07:00
stephb9959
87281b450b https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-15 07:25:16 -07:00
stephb9959
3482057a68 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 23:31:16 -07:00
stephb9959
0c960010f7 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 23:22:26 -07:00
stephb9959
6bda58b24e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 23:21:26 -07:00
stephb9959
0c086a5e56 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 23:10:06 -07:00
stephb9959
53f738f39c https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 23:07:00 -07:00
stephb9959
9be08e1921 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 22:39:30 -07:00
stephb9959
afccb5d0f2 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 22:36:25 -07:00
stephb9959
9769787337 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 22:36:10 -07:00
stephb9959
7d3a4dbfc7 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:46:18 -07:00
stephb9959
0b6b1c7e9d https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:25:02 -07:00
stephb9959
f3ea96ca23 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:22:49 -07:00
stephb9959
e314b33d05 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:19:55 -07:00
stephb9959
68eff53911 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:16:46 -07:00
stephb9959
86b4c2a64e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:12:47 -07:00
stephb9959
dd6f845fe8 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:10:23 -07:00
stephb9959
8f183d4dfa https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:07:59 -07:00
stephb9959
23fe484670 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 21:05:12 -07:00
stephb9959
aba5e50ddb https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:57:45 -07:00
stephb9959
fc6e8802a3 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:54:41 -07:00
stephb9959
5414bb4757 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:50:28 -07:00
stephb9959
1f8b119b67 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:47:34 -07:00
stephb9959
54cfa15b29 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:45:19 -07:00
stephb9959
9b3dfafdcd https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:42:21 -07:00
stephb9959
ec03dbae5e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:34:17 -07:00
stephb9959
e360ab3995 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:21:15 -07:00
stephb9959
b843c6e0db https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:20:25 -07:00
stephb9959
b68e7c5fb4 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:09:27 -07:00
stephb9959
e184e3230c https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 20:03:11 -07:00
stephb9959
532a1d135e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 19:59:33 -07:00
stephb9959
f940d10ca4 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 19:42:37 -07:00
stephb9959
11eb93b280 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 19:30:41 -07:00
stephb9959
68f34b0cc4 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 16:04:16 -07:00
stephb9959
d5c69dd634 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 16:01:39 -07:00
stephb9959
b512a83a5c https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 15:05:45 -07:00
stephb9959
7c5f81dbde https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 14:47:17 -07:00
stephb9959
370f3ac523 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 14:34:00 -07:00
stephb9959
4c75b784dd https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 13:56:00 -07:00
stephb9959
efa481f624 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 13:51:55 -07:00
stephb9959
14c686b92f https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 13:38:38 -07:00
stephb9959
c503f9fb03 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 13:38:00 -07:00
stephb9959
bdfaad90c5 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 13:06:23 -07:00
stephb9959
e2fafe6e8c https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 13:06:04 -07:00
stephb9959
01902d9df3 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 11:59:54 -07:00
stephb9959
95d953b3ca https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 11:52:59 -07:00
stephb9959
572ed17ac8 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 10:59:44 -07:00
stephb9959
c148825631 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 10:40:16 -07:00
stephb9959
3f92eb3025 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 10:15:00 -07:00
stephb9959
01f6986d6e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-14 08:29:53 -07:00
stephb9959
317236505d https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-13 23:42:22 -07:00
Stephane Bourque
3836e9aa69 Merge pull request #317 from Telecominfraproject/WIFI-12337
https://telecominfraproject.atlassian.net/browse/WIFI-12337
2023-03-13 23:21:43 -07:00
stephb9959
9436adc9ed https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-13 23:14:50 -07:00
Stephane Bourque
c826435268 Merge pull request #316 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-12068
2023-03-13 15:22:36 -07:00
stephb9959
c748d162a7 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-13 15:17:03 -07:00
Stephane Bourque
3ad15178e0 Merge pull request #315 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-12068
2023-03-13 12:06:34 -07:00
stephb9959
a01aabba40 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-13 12:01:10 -07:00
stephb9959
a196e03c8e https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-13 10:01:46 -07:00
stephb9959
00698ce31c https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-13 08:16:20 -07:00
stephb9959
e93d8904dc https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-13 08:09:39 -07:00
stephb9959
1a10f84e15 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-12 14:10:49 -07:00
stephb9959
cb1b290ec2 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-12 13:31:08 -07:00
stephb9959
2cb4129d03 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-12 12:33:46 -07:00
stephb9959
942bf438f4 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-12 12:28:49 -07:00
stephb9959
89bb47b913 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-12 12:19:08 -07:00
stephb9959
c35f8e1664 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-12 11:58:55 -07:00
stephb9959
4c8e1fe1f5 https://telecominfraproject.atlassian.net/browse/WIFI-12337
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-12 09:45:55 -07:00
stephb9959
1c2e349cb7 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 22:53:17 -08:00
stephb9959
41f551018b https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 22:32:37 -08:00
stephb9959
b71b8e8c34 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 22:16:15 -08:00
stephb9959
ea91aec1fc https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 22:04:19 -08:00
stephb9959
381b62b65b https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:44:59 -08:00
stephb9959
4def172286 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:41:43 -08:00
stephb9959
be30a63c68 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:28:15 -08:00
stephb9959
d03fc90227 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:24:23 -08:00
stephb9959
904def81f1 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:16:08 -08:00
stephb9959
dd0fe0834a https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:13:15 -08:00
stephb9959
89f516c3c8 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:10:06 -08:00
stephb9959
ff0028a7fd https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:07:06 -08:00
stephb9959
4a41cda137 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 21:01:15 -08:00
stephb9959
208fd40ea1 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 20:50:25 -08:00
stephb9959
ef78269c86 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-11 20:38:56 -08:00
stephb9959
2469101020 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 23:37:56 -08:00
stephb9959
ee6dbc0c7d https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 23:19:55 -08:00
stephb9959
7e2d4368be https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 23:12:07 -08:00
stephb9959
99c4509793 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 23:11:25 -08:00
stephb9959
d102674c61 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 22:56:36 -08:00
stephb9959
d5085938fa https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 22:54:01 -08:00
stephb9959
0dc43670c1 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 22:51:31 -08:00
stephb9959
b16e4026dd https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 22:45:59 -08:00
stephb9959
dedfea75ef https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 22:37:38 -08:00
stephb9959
2044a8f8b2 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 22:25:37 -08:00
stephb9959
d4cb886293 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 22:21:19 -08:00
stephb9959
eb62730693 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 22:13:16 -08:00
stephb9959
57531f147b https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 21:52:58 -08:00
stephb9959
ea9868404a https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 21:47:10 -08:00
stephb9959
1a2769c5bf https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 21:39:03 -08:00
stephb9959
2708542410 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 21:27:46 -08:00
stephb9959
008eed2b67 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 21:20:09 -08:00
stephb9959
97d45125ba https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 21:10:23 -08:00
stephb9959
f6ddfc7725 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 21:04:51 -08:00
stephb9959
c59d84ff59 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 20:46:56 -08:00
stephb9959
de37559249 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 20:43:24 -08:00
stephb9959
498a79f418 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 20:41:04 -08:00
stephb9959
179737df72 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 20:35:17 -08:00
stephb9959
c448e2bdb9 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 20:27:03 -08:00
stephb9959
d45f7044d9 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 20:17:13 -08:00
stephb9959
7e556af27e https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-10 20:13:47 -08:00
stephb9959
45d9cd1bd6 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 23:50:59 -08:00
stephb9959
567b14da00 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 23:36:07 -08:00
stephb9959
e526ac1daa https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 23:22:57 -08:00
stephb9959
6be14ff514 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 22:32:36 -08:00
stephb9959
7b1daefd53 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 22:21:58 -08:00
stephb9959
cc61983763 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 22:17:37 -08:00
stephb9959
b2444e454c https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 21:56:32 -08:00
stephb9959
d6e94f5df4 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 21:44:08 -08:00
stephb9959
b6480f071a https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 21:37:44 -08:00
stephb9959
c5404455f3 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 21:30:12 -08:00
stephb9959
651457304b https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 20:42:54 -08:00
stephb9959
953826c516 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 12:38:01 -08:00
stephb9959
c658db6cfd https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 12:24:21 -08:00
stephb9959
699a7d25ff https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-09 12:16:34 -08:00
stephb9959
ddf209ebc5 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-08 11:10:41 -08:00
stephb9959
9f632ad794 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-08 11:00:17 -08:00
stephb9959
13eae2f5c4 https://telecominfraproject.atlassian.net/browse/WIFI-12361
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-08 09:28:56 -08:00
stephb9959
56cf0da5cd https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-08 07:51:15 -08:00
stephb9959
301b76292e https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 23:01:31 -08:00
stephb9959
04747ca43d https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 15:54:35 -08:00
stephb9959
dbd976cd2f https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 15:37:48 -08:00
stephb9959
0166fec840 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 15:33:08 -08:00
stephb9959
313776c724 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 15:27:55 -08:00
stephb9959
87ea75809a https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 15:06:49 -08:00
stephb9959
8405a42cb4 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 14:57:49 -08:00
stephb9959
6e3edff660 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 14:51:43 -08:00
stephb9959
76eb301ace https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 14:45:06 -08:00
stephb9959
f65f927544 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 14:38:42 -08:00
stephb9959
de5ea6c4bd https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 14:23:19 -08:00
stephb9959
770183f0ad https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 11:34:17 -08:00
stephb9959
cc5c7b5e26 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 11:13:37 -08:00
stephb9959
f43118abee https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 11:09:28 -08:00
stephb9959
1e57f66e17 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 11:06:42 -08:00
stephb9959
4f781690dd https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 10:52:04 -08:00
stephb9959
61dbd740b9 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 10:16:46 -08:00
stephb9959
407a14b018 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 09:57:56 -08:00
stephb9959
2df967d8be https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 09:40:05 -08:00
stephb9959
b336ee4e23 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 08:02:02 -08:00
stephb9959
0cc023c4b0 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-07 07:35:09 -08:00
stephb9959
e323edd373 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-06 22:20:05 -08:00
stephb9959
bd08d60298 https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-06 21:44:48 -08:00
stephb9959
0138a37f3a https://telecominfraproject.atlassian.net/browse/WIFI-12358
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-06 21:10:49 -08:00
stephb9959
d00a94e673 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-03-02 14:49:49 -08:00
TIP Automation User
5b1f7406fb Chg: update image tag in helm values to v2.9.0-RC1 2023-02-28 18:27:22 +00:00
stephb9959
462b91a6d3 https://telecominfraproject.atlassian.net/browse/WIFI-12334
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-28 10:12:04 -08:00
stephb9959
b861f8b48c https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-27 22:25:27 -08:00
stephb9959
1c9664febe https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-27 22:23:58 -08:00
stephb9959
48e4e2a120 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-27 00:19:01 -08:00
stephb9959
bf82bf6cb5 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-27 00:10:25 -08:00
stephb9959
86131a642d https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-27 00:05:32 -08:00
stephb9959
bd2034fa5b https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 23:54:01 -08:00
stephb9959
26ebf360e6 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 23:28:11 -08:00
stephb9959
917da04b6d https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 23:13:24 -08:00
stephb9959
85b8acd1b7 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 23:06:18 -08:00
stephb9959
699b28b9af https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 22:42:56 -08:00
stephb9959
6739b42162 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 22:05:35 -08:00
stephb9959
657f62228d https://telecominfraproject.atlassian.net/browse/WIFI-12336
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 10:28:07 -08:00
stephb9959
cd547c168d https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 09:49:18 -08:00
stephb9959
d85ff96a77 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-26 09:46:49 -08:00
stephb9959
31e5617e82 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 23:26:47 -08:00
stephb9959
80377ccc93 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 23:04:08 -08:00
stephb9959
bd88b31a0c https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 22:50:08 -08:00
stephb9959
01d20b8162 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 22:30:10 -08:00
stephb9959
ecc7c813fd https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 16:08:41 -08:00
stephb9959
c0ca83596d https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 16:05:24 -08:00
stephb9959
62e4941ad4 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 15:59:51 -08:00
stephb9959
96a2e9133f https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 15:52:59 -08:00
stephb9959
6b6f6a9055 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-24 09:21:49 -08:00
stephb9959
9907e92f66 https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 14:58:37 -08:00
stephb9959
14f3e23216 https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 12:49:52 -08:00
stephb9959
7deeb14b7e https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 12:48:01 -08:00
stephb9959
fd0212f474 https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 10:32:25 -08:00
stephb9959
4a708b7afe https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 10:23:39 -08:00
stephb9959
b7ef3f61be https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 09:52:31 -08:00
stephb9959
8e1f7cadca https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 09:51:45 -08:00
stephb9959
71c40d6122 https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 09:45:15 -08:00
stephb9959
6544bc27fe https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 09:23:59 -08:00
stephb9959
62ac98157e https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 09:19:49 -08:00
stephb9959
929ede64dd https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 09:11:04 -08:00
stephb9959
9f5d52fc93 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 09:08:13 -08:00
stephb9959
2616674785 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 09:03:35 -08:00
stephb9959
52c1ec1150 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 08:43:39 -08:00
stephb9959
d3bf54ad85 https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 08:34:57 -08:00
stephb9959
2bc928849e https://telecominfraproject.atlassian.net/browse/WIFI-12270
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-23 07:42:30 -08:00
stephb9959
8088b9054a https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-22 08:50:03 -08:00
stephb9959
d30170f6cb https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 22:45:41 -08:00
stephb9959
1cb2d78863 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 22:43:23 -08:00
stephb9959
54318b8dfd https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 22:38:31 -08:00
stephb9959
2fc8cabb7d https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 22:37:47 -08:00
stephb9959
8427a29843 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 22:35:46 -08:00
stephb9959
3bb48bbc64 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 22:04:17 -08:00
Stephane Bourque
83fdb1c38a Create CONTRIBUTING.md 2023-02-21 22:02:30 -08:00
stephb9959
5d6ff4cc47 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 21:58:32 -08:00
stephb9959
14235886f5 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 14:07:59 -08:00
stephb9959
2968bcd9a0 https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 11:15:02 -08:00
stephb9959
1df3fd1185 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 09:18:12 -08:00
stephb9959
dd9a498813 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 08:51:40 -08:00
stephb9959
81401186f5 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 08:36:35 -08:00
stephb9959
2bb0a652e8 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 08:36:02 -08:00
stephb9959
6cc5c9e6b0 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 08:33:41 -08:00
stephb9959
c0e3303e49 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 08:31:20 -08:00
stephb9959
c7d8da1b69 https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-21 08:00:02 -08:00
stephb9959
184debe26f https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 22:50:18 -08:00
stephb9959
f1e6a9b708 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 22:25:42 -08:00
stephb9959
017d4ec40b https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 21:45:27 -08:00
stephb9959
b41d31423c https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 21:44:44 -08:00
stephb9959
3a9ca2ff04 https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 21:35:30 -08:00
stephb9959
ddb037c70c https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 21:24:20 -08:00
stephb9959
703cae55e8 https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 21:12:07 -08:00
stephb9959
4ee2a523f1 https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 12:31:21 -08:00
stephb9959
587ed9fa9c https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 10:58:20 -08:00
stephb9959
7214b0fdd5 https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 10:54:34 -08:00
stephb9959
41ba33da43 https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 09:59:21 -08:00
stephb9959
9a268c3f4e https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 09:53:22 -08:00
stephb9959
0393f2eeb2 https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 09:41:11 -08:00
stephb9959
4f02ce7880 https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-20 09:29:33 -08:00
stephb9959
75b24e6035 https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-19 23:47:24 -08:00
stephb9959
1739e74dad https://telecominfraproject.atlassian.net/browse/WIFI-12316
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-19 23:25:54 -08:00
stephb9959
33fd644931 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-19 21:29:36 -08:00
stephb9959
cfdcc9bea0 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-19 21:24:24 -08:00
stephb9959
f986e4356c https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-18 23:46:55 -08:00
stephb9959
6f2db198ec https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-18 23:43:19 -08:00
stephb9959
d8ad6eedd8 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-18 23:34:40 -08:00
stephb9959
b188d2bc95 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-18 23:33:27 -08:00
stephb9959
61a32163a1 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-18 23:18:12 -08:00
stephb9959
7b1b97d430 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-15 08:25:44 -08:00
stephb9959
e42fd2c3ee https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-14 10:01:21 -08:00
stephb9959
486bc21908 https://telecominfraproject.atlassian.net/browse/WIFI-12308
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-14 09:58:40 -08:00
stephb9959
4bb997b5ee https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-14 08:47:57 -08:00
stephb9959
76f7861cd9 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-14 08:46:26 -08:00
stephb9959
36b558ab88 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-14 08:41:51 -08:00
stephb9959
551a749c5d https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-14 08:09:36 -08:00
stephb9959
6609d3f86a https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-14 08:00:00 -08:00
stephb9959
5c59766538 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-14 07:52:01 -08:00
stephb9959
9bc97fab98 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 22:39:16 -08:00
stephb9959
e46d551baa https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 22:33:48 -08:00
stephb9959
2b38ddc764 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 22:32:44 -08:00
stephb9959
08772d3816 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 22:31:55 -08:00
stephb9959
1d7135bb51 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 22:30:59 -08:00
stephb9959
6bc6e588b0 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 18:53:15 -08:00
stephb9959
199e827566 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 15:45:02 -08:00
stephb9959
23af7e44ee https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 15:40:04 -08:00
stephb9959
b640093f63 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 15:22:28 -08:00
stephb9959
c3d7dd14c9 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 15:14:07 -08:00
stephb9959
1150ade401 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 15:09:04 -08:00
stephb9959
8b7737141f https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 15:04:40 -08:00
stephb9959
6f4354a82f https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 14:26:44 -08:00
stephb9959
1042c00188 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 14:21:52 -08:00
stephb9959
9739985141 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 14:17:17 -08:00
stephb9959
3ddfb2f411 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 14:12:40 -08:00
stephb9959
4a66cb7a24 https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 13:59:43 -08:00
stephb9959
f2012e396c https://telecominfraproject.atlassian.net/browse/WIFI-12306
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-13 13:51:51 -08:00
Stephane Bourque
2f14700f10 Merge pull request #314 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2023-02-13 12:23:39 -08:00
stephb9959
49e226e4c1 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-12 08:43:23 -08:00
stephb9959
8263eb0e5e https://telecominfraproject.atlassian.net/browse/WIFI-11175
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-09 09:24:52 -08:00
stephb9959
c1da544a9d https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-09 09:05:52 -08:00
stephb9959
e74df56e0c https://telecominfraproject.atlassian.net/browse/WIFI-10516
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-09 08:56:37 -08:00
stephb9959
111b50b437 https://telecominfraproject.atlassian.net/browse/WIFI-12058
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-07 08:47:56 -08:00
stephb9959
0bf22d3406 https://telecominfraproject.atlassian.net/browse/WIFI-12270
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-06 11:07:19 -08:00
stephb9959
61bb2db3d1 https://telecominfraproject.atlassian.net/browse/WIFI-12270
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-06 10:56:36 -08:00
stephb9959
9fff261779 https://telecominfraproject.atlassian.net/browse/WIFI-12270
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-06 10:44:51 -08:00
stephb9959
b627ee7516 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-02-02 10:11:18 -08:00
stephb9959
a2ba11277e https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-31 08:49:01 -08:00
stephb9959
d1a0f7954b https://telecominfraproject.atlassian.net/browse/WIFI-12225
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-30 08:31:21 -08:00
Stephane Bourque
74e6264b47 Merge pull request #311 from Telecominfraproject/WIFI-12225
https://telecominfraproject.atlassian.net/browse/WIFI-12225
2023-01-26 21:53:35 -08:00
stephb9959
ced1522c61 https://telecominfraproject.atlassian.net/browse/WIFI-12225
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-26 21:49:16 -08:00
stephb9959
426845b192 https://telecominfraproject.atlassian.net/browse/WIFI-12225
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-26 21:20:06 -08:00
stephb9959
0be833e73c https://telecominfraproject.atlassian.net/browse/WIFI-12225
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-26 17:57:34 -08:00
stephb9959
64b1c9171c https://telecominfraproject.atlassian.net/browse/WIFI-12225
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-26 15:56:31 -08:00
stephb9959
ee33bc365e https://telecominfraproject.atlassian.net/browse/WIFI-12225
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-26 15:33:36 -08:00
stephb9959
bc02666ff0 https://telecominfraproject.atlassian.net/browse/WIFI-12190
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-25 09:56:33 -08:00
stephb9959
9c4a7a7a27 https://telecominfraproject.atlassian.net/browse/WIFI-12190
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-25 09:37:54 -08:00
stephb9959
3021e1b20d https://telecominfraproject.atlassian.net/browse/WIFI-12190
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-25 09:19:24 -08:00
stephb9959
99018fba32 https://telecominfraproject.atlassian.net/browse/WIFI-12190
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-25 09:10:41 -08:00
stephb9959
84e14c9f80 https://telecominfraproject.atlassian.net/browse/WIFI-12190
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-24 10:39:18 -08:00
stephb9959
2a375ed98d https://telecominfraproject.atlassian.net/browse/WIFI-12190
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-24 10:37:18 -08:00
stephb9959
0e9c8ce944 https://telecominfraproject.atlassian.net/browse/WIFI-12190
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-23 21:27:00 -08:00
Stephane Bourque
2312513a27 Merge pull request #310 from Telecominfraproject/WIFI-12072_Dev
WIFI-12072_Dev
2023-01-23 08:31:25 -08:00
Rohit Kumar
2d495b070f WIFI-12070 : Changes done to log AP response message 2023-01-20 05:15:47 +00:00
stephb9959
1f1d40e166 https://telecominfraproject.atlassian.net/browse/WIFI-12093
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-16 08:58:40 -08:00
stephb9959
90e2b2e71f https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-12 09:52:10 -08:00
stephb9959
08b3d5e316 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-10 21:45:46 -08:00
stephb9959
1ac475d48f Merge remote-tracking branch 'origin/master'
# Conflicts:
#	build
2023-01-08 11:30:47 -08:00
stephb9959
6f874baa54 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-08 11:30:32 -08:00
Stephane Bourque
a9ffe80d27 Merge pull request #309 from Telecominfraproject/WIFI-12068
https://telecominfraproject.atlassian.net/browse/WIFI-12068
2023-01-08 11:14:53 -08:00
Stephane Bourque
83b4f3341e Merge branch 'master' into WIFI-12068 2023-01-08 11:14:43 -08:00
stephb9959
801704f065 https://telecominfraproject.atlassian.net/browse/WIFI-12068
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-01-08 10:40:44 -08:00
Stephane Bourque
45b25c4e75 Merge pull request #307 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-20 10:07:01 -08:00
stephb9959
ea311f70a0 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 09:03:59 -08:00
stephb9959
e3265c86a5 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 08:46:44 -08:00
stephb9959
e537259208 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 08:46:34 -08:00
stephb9959
b9c7990344 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 00:02:11 -08:00
stephb9959
d5c1cfe2f1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 00:00:18 -08:00
stephb9959
1a4f27cbbf https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 23:44:44 -08:00
stephb9959
11ad381534 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 23:35:26 -08:00
stephb9959
0b548a40f3 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 23:16:08 -08:00
stephb9959
28e5463196 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 23:13:03 -08:00
stephb9959
37ea632ac7 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:52:08 -08:00
stephb9959
2f641077e6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:49:47 -08:00
stephb9959
78318f47c6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:38:21 -08:00
stephb9959
c83c73a3ae https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:31:47 -08:00
stephb9959
6305be8c55 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:20:45 -08:00
stephb9959
4b325ef22c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:09:01 -08:00
stephb9959
a422dff7ae https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 21:57:06 -08:00
stephb9959
271ff4f6c4 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 21:45:17 -08:00
stephb9959
4cdd275d0b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 21:18:41 -08:00
stephb9959
9a36e86949 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 18:16:35 -08:00
stephb9959
fa806ed16c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 17:43:34 -08:00
stephb9959
57c270973e https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 17:43:10 -08:00
stephb9959
17ebfb24f2 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 14:41:29 -08:00
stephb9959
26072691ab https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 14:30:36 -08:00
stephb9959
e8b3ea56e0 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 14:17:50 -08:00
stephb9959
2b1a72b838 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 14:10:19 -08:00
stephb9959
352afc487a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 13:57:37 -08:00
stephb9959
6fae29981a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 13:46:05 -08:00
stephb9959
9569de1b21 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 12:05:56 -08:00
stephb9959
1a952946b2 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 11:36:14 -08:00
stephb9959
3b52cf6111 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 23:43:00 -08:00
stephb9959
74197e2aee https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 22:15:17 -08:00
stephb9959
7152067b09 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 21:56:26 -08:00
stephb9959
ac3d061eee https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 21:47:45 -08:00
stephb9959
8ee67713bf https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 21:36:54 -08:00
stephb9959
e57cd4fea2 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 21:30:30 -08:00
stephb9959
5e3a71a6e7 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:23:00 -08:00
stephb9959
a602b8f844 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:15:01 -08:00
stephb9959
89da7d187a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:10:16 -08:00
stephb9959
6c5533aa8b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:05:59 -08:00
stephb9959
66249b258c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:00:36 -08:00
stephb9959
e03512ebf3 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:50:37 -08:00
stephb9959
b152c8477a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:40:52 -08:00
stephb9959
a298c4254b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:33:11 -08:00
stephb9959
b8f04c6d4a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:28:10 -08:00
stephb9959
753dc5c068 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:23:26 -08:00
stephb9959
bf70d6b512 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:17:55 -08:00
stephb9959
760f11ca70 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:08:52 -08:00
stephb9959
2bcd0ccbcb https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:05:37 -08:00
stephb9959
0aee258af4 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:02:13 -08:00
stephb9959
9e879f306c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 18:58:41 -08:00
stephb9959
fb4a4d935a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 18:55:40 -08:00
stephb9959
282552cdfa https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 17:55:05 -08:00
stephb9959
1d316ff28a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 17:50:15 -08:00
stephb9959
1da866a7da https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 17:44:45 -08:00
stephb9959
1c628c28fa https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 16:17:07 -08:00
stephb9959
a350b30a9c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 16:10:48 -08:00
stephb9959
cf6c3f9337 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 15:56:40 -08:00
stephb9959
2388eac41d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 08:33:34 -08:00
stephb9959
f0e0f2ba5b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 08:28:53 -08:00
stephb9959
0c8b9caaf3 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 08:11:33 -08:00
stephb9959
c0edeb8b23 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 08:02:00 -08:00
stephb9959
fdcf74788d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:59:20 -08:00
stephb9959
df9c82a4ae https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:37:37 -08:00
stephb9959
2963cec1fb https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:32:37 -08:00
stephb9959
8053e32c9c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:24:13 -08:00
stephb9959
1750ac5fb5 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:12:18 -08:00
stephb9959
b4d775db0c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:03:09 -08:00
stephb9959
3031483209 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 06:55:52 -08:00
stephb9959
97b990581d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 06:47:52 -08:00
stephb9959
98fa4799cc https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 23:32:34 -08:00
stephb9959
95a853fc0e https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:58:49 -08:00
stephb9959
7a14cadbf5 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:56:45 -08:00
stephb9959
ab5efcc8c1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:52:05 -08:00
stephb9959
bb71ff2bad https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:34:27 -08:00
stephb9959
c1a2efd32c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:11:10 -08:00
stephb9959
ca4d92fd66 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 16:21:32 -08:00
stephb9959
efb354031a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 16:18:32 -08:00
stephb9959
180d01c89d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 15:37:22 -08:00
stephb9959
f6c1a5e97f https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 15:29:58 -08:00
stephb9959
54e7caafc1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 15:20:24 -08:00
stephb9959
e76c97540c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 15:09:09 -08:00
stephb9959
3f01ef6d5e https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:57:12 -08:00
stephb9959
8e118c7f7b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:55:29 -08:00
stephb9959
6dc5622bf2 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:50:49 -08:00
stephb9959
27a9ef01b6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:38:38 -08:00
stephb9959
9390b9a646 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:25:20 -08:00
stephb9959
871f3c3436 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:16:19 -08:00
stephb9959
a41095a797 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:13:24 -08:00
stephb9959
bb94c9a813 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:02:13 -08:00
stephb9959
fcd991b8d6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 13:56:05 -08:00
stephb9959
2df43cfd62 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 13:48:15 -08:00
stephb9959
014aafbd3d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 13:42:49 -08:00
stephb9959
d1d058a848 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 12:34:21 -08:00
stephb9959
d492396182 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 12:30:55 -08:00
stephb9959
2c710412a1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 12:16:27 -08:00
stephb9959
7dcade3d79 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 12:08:33 -08:00
stephb9959
dc73a2d54b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 11:57:31 -08:00
Stephane Bourque
6c2bb5b395 Merge pull request #306 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 11:39:49 -08:00
stephb9959
fccf99cca5 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 11:39:19 -08:00
Stephane Bourque
0d91dd9a6e Merge pull request #305 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 11:14:13 -08:00
stephb9959
d84af0f18e https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 11:13:38 -08:00
Stephane Bourque
6b6c9ce0ae Merge pull request #304 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 10:11:31 -08:00
stephb9959
5a31d6427f https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 10:10:36 -08:00
Stephane Bourque
8b3ff4a560 Merge pull request #303 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 09:34:19 -08:00
stephb9959
53c81d2c76 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 09:33:25 -08:00
Stephane Bourque
518bfc0b2c Merge pull request #302 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 08:57:49 -08:00
stephb9959
c6851819d4 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 08:56:37 -08:00
Stephane Bourque
d5851753c2 Merge pull request #301 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 08:04:23 -08:00
stephb9959
379b1446f6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 08:03:27 -08:00
Stephane Bourque
6d50ef72b7 Merge pull request #299 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-15 11:39:58 -08:00
stephb9959
f0954081c1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:57:38 -08:00
stephb9959
9653d0affb https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:51:03 -08:00
stephb9959
dd626461e8 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:39:32 -08:00
stephb9959
048b33e134 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:36:29 -08:00
stephb9959
eff7a70f6b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:08:05 -08:00
stephb9959
5f73966010 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:52:35 -08:00
stephb9959
911c9ac210 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:30:07 -08:00
stephb9959
f59c369b61 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:26:13 -08:00
stephb9959
526d239fe9 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:20:11 -08:00
stephb9959
939d704460 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:08:47 -08:00
stephb9959
b7e8da5e76 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:07:44 -08:00
Stephane Bourque
c5d68e5397 Merge pull request #297 from Telecominfraproject/WIFI-11974
https://telecominfraproject.atlassian.net/browse/WIFI-11974
2022-12-14 11:55:50 -08:00
stephb9959
a2bbe71e53 https://telecominfraproject.atlassian.net/browse/WIFI-11974
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-14 11:55:27 -08:00
Stephane Bourque
1c0cf65145 Merge pull request #296 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2022-12-14 11:40:53 -08:00
stephb9959
60d41e8569 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-14 11:32:43 -08:00
stephb9959
76698476b6 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-14 11:25:54 -08:00
Stephane Bourque
4e4ac89401 Merge pull request #295 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2022-12-13 23:53:56 -08:00
stephb9959
e3e6a27348 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-13 23:29:06 -08:00
stephb9959
b419472fd7 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-13 16:11:42 -08:00
Dmitry Dunaev
bd2af4df1d Merge pull request #292 from Telecominfraproject/feature/wifi-11905--docker-certificates-allowmismatch
[WIFI-11905] Add: docker option to set openwifi.certificates.allowmismatch
2022-12-13 20:09:35 +03:00
Dmitry Dunaev
bbbb4cd4fe [WIFI-11905] Chg: CERTIFICATES_ALLOWMISMATCH to false by def
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-12-13 17:08:24 +01:00
Stephane Bourque
445568152c Merge pull request #294 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2022-12-13 07:03:42 -08:00
stephb9959
ce70ff0f21 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-13 07:03:11 -08:00
Stephane Bourque
6dbf16793e Merge pull request #293 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2022-12-12 13:21:17 -08:00
stephb9959
eba69c8c35 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 12:31:42 -08:00
stephb9959
ae2e6c5ce6 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 12:06:01 -08:00
stephb9959
5a2a0cd074 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 12:04:08 -08:00
stephb9959
9c3a23a8a1 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 12:02:46 -08:00
stephb9959
b6f0f07bec https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:44:05 -08:00
stephb9959
e060e11cd2 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:40:42 -08:00
stephb9959
883245de68 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:36:56 -08:00
stephb9959
9cfc411a51 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:32:36 -08:00
stephb9959
fb3a785227 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:28:20 -08:00
stephb9959
3fe8958323 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 10:17:42 -08:00
stephb9959
117f0e1637 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 10:15:17 -08:00
stephb9959
b09b1d5690 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 10:10:53 -08:00
stephb9959
e073e2b713 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 10:00:07 -08:00
stephb9959
8343443bd7 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 09:56:15 -08:00
stephb9959
c5ed66c40c https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 09:51:24 -08:00
stephb9959
de65b2396c https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 08:56:22 -08:00
Dmitry Dunaev
c85cef57c8 [WIFI-11905] Add: docker option to set openwifi.certificates.allowmismatch
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-12-12 13:36:03 +01:00
stephb9959
6c9bae518a https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-11 10:44:06 -08:00
stephb9959
7232168037 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-11 10:18:54 -08:00
stephb9959
9da06d8384 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-11 09:45:47 -08:00
stephb9959
296a4721db https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-11 09:43:11 -08:00
stephb9959
f2badf7b6d https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 23:01:31 -08:00
Stephane Bourque
766be1aa3c Merge pull request #291 from Telecominfraproject/WIFI-11429
https://telecominfraproject.atlassian.net/browse/WIFI-11429
2022-12-10 10:24:19 -08:00
stephb9959
4812219e0d https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 10:20:36 -08:00
stephb9959
7b4e39aad2 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 10:08:43 -08:00
stephb9959
fbff951e22 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 10:08:14 -08:00
stephb9959
09198d5ec2 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 10:03:22 -08:00
stephb9959
3666995f7f https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 09:48:42 -08:00
stephb9959
0572674279 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:52:33 -08:00
stephb9959
19f2265161 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:40:09 -08:00
stephb9959
f613449dff https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:36:06 -08:00
stephb9959
a1291b1b16 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:31:22 -08:00
stephb9959
39ebc28396 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:25:53 -08:00
stephb9959
6017714363 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:20:29 -08:00
stephb9959
bff7092ce1 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 07:43:11 -08:00
stephb9959
1741742617 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 23:39:55 -08:00
stephb9959
b4a6bea1b4 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 23:37:18 -08:00
stephb9959
57e06b2d2f https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 23:24:24 -08:00
stephb9959
0bc7363dae https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 23:09:29 -08:00
stephb9959
44b2140230 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 22:58:44 -08:00
stephb9959
49bc934066 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 22:50:11 -08:00
Stephane Bourque
53d337f462 Merge pull request #290 from Telecominfraproject/WIFI-11333
https://telecominfraproject.atlassian.net/browse/WIFI-11333
2022-12-09 14:41:11 -08:00
stephb9959
66e7791b95 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 14:39:14 -08:00
stephb9959
2180c5ff23 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 14:10:59 -08:00
stephb9959
2f4fa7572e https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 13:39:47 -08:00
stephb9959
5923506237 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 13:38:58 -08:00
stephb9959
b9600654f8 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 13:35:11 -08:00
stephb9959
6b0a082ac9 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 12:17:52 -08:00
stephb9959
c5a108d672 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 11:59:46 -08:00
stephb9959
23c2925baf https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 11:55:14 -08:00
stephb9959
fa4c72d59c https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 11:42:54 -08:00
stephb9959
d66d901204 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 10:33:40 -08:00
stephb9959
b09eaf98cc https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 10:19:02 -08:00
Stephane Bourque
7f9bf85958 Merge pull request #289 from Telecominfraproject/WIFI-11909
https://telecominfraproject.atlassian.net/browse/WIFI-11909
2022-12-07 10:00:58 -08:00
stephb9959
d1d89fcd74 https://telecominfraproject.atlassian.net/browse/WIFI-11909
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-07 10:00:17 -08:00
Stephane Bourque
bc3f5700d4 Merge pull request #288 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11333
2022-12-07 09:45:25 -08:00
stephb9959
3a938fd615 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-07 09:44:18 -08:00
Stephane Bourque
dc3729aec2 Merge pull request #287 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11333
2022-12-07 08:37:33 -08:00
stephb9959
dd214ae5d1 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-07 08:36:48 -08:00
Stephane Bourque
8f7f8c5736 Merge pull request #286 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11869
2022-12-05 08:37:54 -08:00
stephb9959
00701a8de4 https://telecominfraproject.atlassian.net/browse/WIFI-11869
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-05 08:37:12 -08:00
Stephane Bourque
fc41c9aa2f Merge pull request #285 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11869
2022-12-05 08:36:40 -08:00
stephb9959
a5442eee0d https://telecominfraproject.atlassian.net/browse/WIFI-11869
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-05 08:35:14 -08:00
Stephane Bourque
9dcf5b5320 Merge pull request #284 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11869
2022-12-01 21:59:30 -08:00
stephb9959
28b5295a6e https://telecominfraproject.atlassian.net/browse/WIFI-11869
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 21:58:40 -08:00
stephb9959
8261ae34bd https://telecominfraproject.atlassian.net/browse/WIFI-11869
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 21:54:08 -08:00
Stephane Bourque
02baa9329c Merge pull request #283 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11865
2022-12-01 15:44:25 -08:00
stephb9959
7f01c7b861 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 12:25:49 -08:00
stephb9959
8d0f0c227a https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 11:00:52 -08:00
stephb9959
c8170bc9f3 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 10:53:22 -08:00
stephb9959
83003b66b9 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 10:34:14 -08:00
stephb9959
cbdb15bc32 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 10:23:16 -08:00
stephb9959
712e15407d https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 09:21:05 -08:00
stephb9959
e424e19d1c https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 08:44:01 -08:00
stephb9959
546d8dee98 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 08:26:34 -08:00
stephb9959
60b9fc679a https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 08:17:14 -08:00
Stephane Bourque
79a4f24bc2 Merge pull request #282 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11865
2022-12-01 07:47:04 -08:00
stephb9959
02b8ecf300 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 07:45:25 -08:00
stephb9959
bdbc5a7a9d https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 07:33:49 -08:00
Stephane Bourque
680fe18bac Merge pull request #281 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11779
2022-12-01 06:59:22 -08:00
stephb9959
dd08b2e426 https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 06:57:56 -08:00
stephb9959
285b1630ee https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 06:55:09 -08:00
stephb9959
fdcaf9054f https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 06:41:27 -08:00
stephb9959
65b5585797 https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 06:39:56 -08:00
stephb9959
b31fdb202c https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 05:16:07 -08:00
Dmitry Dunaev
d13d906d11 [WIFI-11729] Fix: doc generation error
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-12-01 13:17:10 +03:00
Stephane Bourque
6a403ac916 Merge pull request #280 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11779
2022-11-30 21:59:40 -08:00
stephb9959
eff54e3202 https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 21:53:44 -08:00
Stephane Bourque
0a7dd7c3f7 Merge pull request #279 from Telecominfraproject/WIFI-11430
https://telecominfraproject.atlassian.net/browse/WIFI-11430
2022-11-30 16:21:00 -08:00
stephb9959
cf7f962ed1 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 16:19:53 -08:00
stephb9959
f412df29b5 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 16:16:13 -08:00
stephb9959
31204bae6a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 15:33:52 -08:00
stephb9959
a57cf08c00 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 11:43:22 -08:00
stephb9959
c0171156fa https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 11:38:27 -08:00
stephb9959
a456e95139 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 11:34:53 -08:00
stephb9959
7f8e2d0f7f https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 22:34:31 -08:00
stephb9959
d80aa68c40 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 22:06:12 -08:00
stephb9959
81c9090ec9 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 22:03:26 -08:00
stephb9959
0fa5c46f4b https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 21:54:20 -08:00
stephb9959
d75977140a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:30:22 -08:00
stephb9959
b65440ba4e https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:26:45 -08:00
stephb9959
ee15f8b8c2 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:22:45 -08:00
stephb9959
aebf8ba783 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:18:35 -08:00
stephb9959
9f2436b123 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:17:32 -08:00
stephb9959
cd774ea2df https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:13:46 -08:00
stephb9959
007f54bc26 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:09:36 -08:00
stephb9959
9c03f3a9e3 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 13:45:09 -08:00
stephb9959
292365a837 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 13:36:05 -08:00
stephb9959
1091478e11 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 13:22:52 -08:00
Stephane Bourque
47b94b3c5a Merge pull request #278 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11779
2022-11-28 14:54:42 -08:00
stephb9959
7cd62e7b26 https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-28 14:54:04 -08:00
Stephane Bourque
3397f2407a Merge pull request #277 from Telecominfraproject/WIFI-11778
https://telecominfraproject.atlassian.net/browse/WIFI-11778
2022-11-28 11:44:47 -08:00
stephb9959
52799659c8 https://telecominfraproject.atlassian.net/browse/WIFI-11778
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-28 11:43:13 -08:00
Stephane Bourque
86e88942b0 Merge pull request #276 from Telecominfraproject/WIFI-11777
https://telecominfraproject.atlassian.net/browse/WIFI-11777
2022-11-28 11:19:55 -08:00
stephb9959
11592ebb98 https://telecominfraproject.atlassian.net/browse/WIFI-11777
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-28 11:19:01 -08:00
Stephane Bourque
83f4bfc53d Merge pull request #275 from Telecominfraproject/WIFI-11754
https://telecominfraproject.atlassian.net/browse/WIFI-11755
2022-11-27 21:47:01 -08:00
stephb9959
43ed818015 https://telecominfraproject.atlassian.net/browse/WIFI-11755
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-27 21:24:26 -08:00
stephb9959
fd7f5b991a https://telecominfraproject.atlassian.net/browse/WIFI-11755
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-27 14:31:26 -08:00
Stephane Bourque
feebcb339a Merge pull request #274 from Telecominfraproject/WIFI-11754
https://telecominfraproject.atlassian.net/browse/WIFI-11754
2022-11-27 14:13:30 -08:00
stephb9959
0368d4e435 https://telecominfraproject.atlassian.net/browse/WIFI-11754
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-27 14:12:26 -08:00
Stephane Bourque
a57bad5bb9 Merge pull request #273 from Telecominfraproject/WIFI-11430
https://telecominfraproject.atlassian.net/browse/WIFI-11430
2022-11-27 13:56:47 -08:00
Dmitry Dunaev
a0ee1a40d4 [WIFI-11729] Fix: branch set for pages pushing
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-11-25 22:00:37 +03:00
Dmitry Dunaev
5c5aa3551b [WIFI-11729] Fix: pages generation
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-11-25 21:59:10 +03:00
Dmitry Dunaev
bd7daf4072 Merge pull request #272 from Telecominfraproject/feature/wifi-11729--openapi-gh-pages
[WIFI-11729] Add: workflow to generate OpenAPI docs
2022-11-25 21:48:14 +03:00
Dmitry Dunaev
dad844795f [WIFI-11729] Add: workflow to generate OpenAPI docs
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-11-25 21:47:59 +03:00
stephb9959
1ef20f232a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-25 07:59:17 -08:00
stephb9959
78deaf8b38 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-25 07:53:35 -08:00
Johann Hoffmann
41107af0d0 Merge pull request #271 from Telecominfraproject/WIFI-11419-patch-workflows
[WIFI-11419] Patch workflows with regard to deprecated Github actions commands
2022-11-25 15:26:35 +01:00
stephb9959
a1aec29ffd https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:57:50 -08:00
stephb9959
07dc8617a4 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:50:27 -08:00
stephb9959
34cef1ae0a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:17:22 -08:00
stephb9959
144841d88d https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:11:59 -08:00
stephb9959
b46a713968 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:01:08 -08:00
stephb9959
4ec7c30e28 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 09:53:33 -08:00
stephb9959
16c5825e3a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 08:04:24 -08:00
stephb9959
0f1129e51e https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 22:18:00 -08:00
stephb9959
3e54201be8 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:39:06 -08:00
stephb9959
c34fba4c22 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:28:51 -08:00
stephb9959
625f8c7a2b https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:22:28 -08:00
stephb9959
41a4a98c0a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:12:36 -08:00
stephb9959
c858d954a9 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:04:14 -08:00
stephb9959
aa0410edb3 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:02:21 -08:00
stephb9959
97cb61b7cf https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:00:17 -08:00
stephb9959
0408d98538 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 11:53:25 -08:00
stephb9959
69e2f9640e https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-22 22:10:46 -08:00
stephb9959
efd20dc370 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-22 08:21:35 -08:00
stephb9959
7a42598150 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-22 07:57:35 -08:00
stephb9959
7a45d96d9a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-22 07:28:20 -08:00
Johann Hoffmann
468a2553f8 Update checkout action version and replace set-output commands
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-11-22 11:54:46 +01:00
stephb9959
a4f7ccdba1 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 16:04:36 -08:00
stephb9959
a0b47aa4b3 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 15:43:39 -08:00
stephb9959
ee6dd54ab3 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 15:39:52 -08:00
stephb9959
518ca7cc9d https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 15:29:36 -08:00
stephb9959
37053a40b7 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 09:16:06 -08:00
stephb9959
7eff8c9699 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 07:38:30 -08:00
stephb9959
49d9030bf4 https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-20 13:12:37 -08:00
stephb9959
9e741c0348 https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-19 22:25:24 -08:00
stephb9959
95dc3c1a6c https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-19 22:19:20 -08:00
stephb9959
2fa7081f3f https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-19 21:32:24 -08:00
stephb9959
288773a727 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-18 19:52:37 -08:00
stephb9959
06079115e6 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-18 07:45:39 -08:00
stephb9959
5db21677dc https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-17 21:23:18 -08:00
stephb9959
5c7db88f10 https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-17 21:02:45 -08:00
stephb9959
0060e81fae https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-17 11:35:33 -08:00
stephb9959
1a6bf2d71b https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 22:49:46 -08:00
stephb9959
59a6de92d0 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:31:30 -08:00
stephb9959
b7b013f669 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:18:07 -08:00
stephb9959
d8be1eca90 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:14:18 -08:00
stephb9959
d04f8965c3 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:03:57 -08:00
stephb9959
ffdbe6f4da https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:01:28 -08:00
stephb9959
fafa915613 https://telecominfraproject.atlassian.net/browse/WIFI-11620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-15 10:24:06 -08:00
stephb9959
f5f0af0dcd https://telecominfraproject.atlassian.net/browse/WIFI-11251
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 23:55:27 -08:00
stephb9959
23eb4d6b0b https://telecominfraproject.atlassian.net/browse/WIFI-11251
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 23:52:30 -08:00
stephb9959
f9d6020c4f https://telecominfraproject.atlassian.net/browse/WIFI-11251
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 23:28:22 -08:00
stephb9959
b9dfbdd5e8 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 13:53:47 -08:00
stephb9959
8f9d708285 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 10:09:18 -08:00
stephb9959
05b06d3eac https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-13 22:01:12 -08:00
stephb9959
8b68ab8ac7 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-10 23:39:44 -08:00
stephb9959
80021d520f https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-10 23:32:52 -08:00
stephb9959
363cfa1998 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-10 23:13:58 -08:00
stephb9959
9ea1a5cde6 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-10 23:04:45 -08:00
stephb9959
faeb6bf6b8 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-09 22:49:55 -08:00
stephb9959
1917b1346b https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-09 22:48:14 -08:00
stephb9959
3feaf9221d https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-08 23:07:31 -08:00
stephb9959
943b735150 Merge remote-tracking branch 'origin/master' 2022-11-08 23:07:20 -08:00
stephb9959
02ce04261d https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-08 23:07:10 -08:00
Dmitry Dunaev
eae5f4f5f9 Merge pull request #270 from Telecominfraproject/fix/wifi-11490--git-hash
[WIFI-11490] Fix: Get Git hash command in CMakeLists
2022-11-08 13:42:16 +03:00
Dmitry Dunaev
8ec8a02924 [WIFI-11490] Fix: Get Git hash command in CMakeLists
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-11-08 13:07:22 +03:00
stephb9959
12c34ef63d https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 15:31:34 -08:00
stephb9959
a54848b636 https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:58:49 -08:00
stephb9959
35c09940b4 https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:34:18 -08:00
stephb9959
cb4fdaab28 https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:25:12 -08:00
stephb9959
3501de22ed https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:08:00 -08:00
stephb9959
1f59fccc97 https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:01:48 -08:00
stephb9959
4307d23b00 https://telecominfraproject.atlassian.net/browse/WIFI-11542
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 10:59:13 -08:00
stephb9959
b83345c91a https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-04 11:42:31 -07:00
stephb9959
76feb208bc https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 12:19:23 -07:00
stephb9959
efa49593da https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 10:44:27 -07:00
stephb9959
361d6fa22f https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 09:53:04 -07:00
stephb9959
f7d1b8f972 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 09:16:36 -07:00
stephb9959
a9afc2dc2b https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 08:56:44 -07:00
stephb9959
8d949b97ea https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 22:54:47 -07:00
stephb9959
0d5a07ffe1 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 22:30:11 -07:00
stephb9959
11972c2511 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 21:37:32 -07:00
stephb9959
3081efebd8 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:07:09 -07:00
stephb9959
b27039dcc8 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:05:08 -07:00
stephb9959
847f107ac2 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:03:14 -07:00
stephb9959
ec9766a544 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:01:47 -07:00
stephb9959
7bdc148063 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:00:00 -07:00
stephb9959
7284e9f100 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:53:55 -07:00
stephb9959
03ecfbea25 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:49:44 -07:00
stephb9959
eb1716e078 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:46:50 -07:00
stephb9959
b11b8a2f22 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:43:30 -07:00
stephb9959
845bb37c8c https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:29:49 -07:00
stephb9959
6f9f6495a0 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:21:57 -07:00
stephb9959
04ef327a86 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:20:50 -07:00
stephb9959
913b595587 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:16:39 -07:00
stephb9959
7628af35ba https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:14:14 -07:00
stephb9959
cad8b7752b https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:10:54 -07:00
stephb9959
7175546f54 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 14:50:38 -07:00
stephb9959
6186f46ec2 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 14:48:35 -07:00
stephb9959
2413867bf3 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 14:46:21 -07:00
stephb9959
545c539a08 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 12:30:49 -07:00
stephb9959
b0cfed809f https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 12:23:10 -07:00
stephb9959
d5502e1527 https://telecominfraproject.atlassian.net/browse/WIFI-11434
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 09:36:16 -07:00
stephb9959
714d02060c Merge remote-tracking branch 'origin/master' 2022-11-01 09:03:02 -07:00
stephb9959
c8d0739692 https://telecominfraproject.atlassian.net/browse/WIFI-11434
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-01 09:02:53 -07:00
stephb9959
d4b9d61e2b https://telecominfraproject.atlassian.net/browse/WIFI-11434
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-01 09:02:37 -07:00
stephb9959
1f7f2f64ad https://telecominfraproject.atlassian.net/browse/WIFI-11433
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 14:53:00 -07:00
stephb9959
f26ca31dbc https://telecominfraproject.atlassian.net/browse/WIFI-11433
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 14:42:15 -07:00
stephb9959
92b6edc9a4 https://telecominfraproject.atlassian.net/browse/WIFI-11432
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 14:34:47 -07:00
stephb9959
e1a2b46333 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 10:45:41 -07:00
stephb9959
5744905f5a https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 08:27:06 -07:00
stephb9959
d7c27150d3 Merge remote-tracking branch 'origin/master' 2022-10-31 08:24:21 -07:00
stephb9959
76a8260f1c https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 08:24:11 -07:00
Dmitry Dunaev
0d8f43dba2 Merge pull request #267 from Telecominfraproject/feature/wifi-9942--sqlite
[WIFI-9942] Add: sqlite package
2022-10-31 12:02:58 +03:00
Dmitry Dunaev
104c07cf6d [WIFI-9942] Add: sqlite package
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-10-31 12:02:37 +03:00
stephb9959
43f244a076 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-27 23:55:50 -07:00
stephb9959
e4bc41ed56 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-27 09:48:35 -07:00
stephb9959
1c2275537d Merge remote-tracking branch 'origin/master' 2022-10-26 21:56:49 -07:00
stephb9959
a062ff084e https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-26 21:56:39 -07:00
Stephane Bourque
7a78cd33eb Merge pull request #259 from Telecominfraproject/WIFI-10959-switch-fmtlib-and-awssdk
[WIFI-10959] Switch fmtlib and aws to prebuilt packages in Dockerfiles
2022-10-26 15:05:40 -07:00
stephb9959
ff2dff5a51 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-26 15:02:50 -07:00
stephb9959
d122b86913 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-26 14:04:21 -07:00
stephb9959
43e45f7c28 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-26 13:24:48 -07:00
stephb9959
ba93725f62 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-26 13:22:39 -07:00
stephb9959
c32f0dfb02 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-26 13:20:11 -07:00
stephb9959
73dcd49d92 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-25 18:21:54 -07:00
stephb9959
56c2640900 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-25 18:18:03 -07:00
stephb9959
b33c52616d https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-25 18:15:19 -07:00
stephb9959
7edc427ea7 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-25 12:04:22 -07:00
stephb9959
3c8549b872 https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-25 11:56:35 -07:00
stephb9959
471b992d2d https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-25 11:47:25 -07:00
stephb9959
ab2ed7492b https://telecominfraproject.atlassian.net/browse/WIFI-11280
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-25 11:24:44 -07:00
stephb9959
330cb7552c https://telecominfraproject.atlassian.net/browse/WIFI-11268
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-24 10:11:54 -07:00
stephb9959
b31fb67eda https://telecominfraproject.atlassian.net/browse/WIFI-11268
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-24 10:04:13 -07:00
stephb9959
874b8a5510 https://telecominfraproject.atlassian.net/browse/WIFI-11268
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-24 09:44:46 -07:00
stephb9959
624899b65c https://telecominfraproject.atlassian.net/browse/WIFI-11270
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-24 08:41:57 -07:00
stephb9959
d0bc6b96c4 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 21:54:45 -07:00
stephb9959
1781e58189 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 21:47:14 -07:00
stephb9959
9e536b5235 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 21:38:58 -07:00
stephb9959
208956d5c6 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 18:58:50 -07:00
stephb9959
60aba09614 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 18:56:20 -07:00
stephb9959
da1c3346d1 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 18:48:31 -07:00
stephb9959
ea4ee0d0f6 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 18:42:10 -07:00
stephb9959
d940bebb90 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 16:38:44 -07:00
stephb9959
77c6ce8a1e https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 16:33:29 -07:00
stephb9959
98c761c375 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 16:19:17 -07:00
stephb9959
7166ad2ce7 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 16:12:25 -07:00
stephb9959
7f24aee8fa https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 15:54:31 -07:00
stephb9959
8b16c08baa https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 15:33:53 -07:00
stephb9959
f7045d6b40 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 15:25:27 -07:00
stephb9959
6b64b02192 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 15:18:03 -07:00
stephb9959
43f37a6e12 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 15:09:55 -07:00
stephb9959
9fc6d4efee https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 14:59:59 -07:00
stephb9959
ac375e468d https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-23 14:16:50 -07:00
stephb9959
1c8ce086df https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 23:10:11 -07:00
stephb9959
8b73e4b232 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 23:02:01 -07:00
stephb9959
7c10d83b6b https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 22:54:30 -07:00
stephb9959
99259cc6c5 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 22:45:30 -07:00
stephb9959
8062bb8bf7 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 22:38:06 -07:00
stephb9959
0bb51d2ac0 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 22:20:49 -07:00
stephb9959
cd9a30be4d https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 22:10:39 -07:00
stephb9959
98fd924bd1 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 21:59:05 -07:00
stephb9959
20e0fe860f https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 21:47:36 -07:00
stephb9959
10d87dab92 https://telecominfraproject.atlassian.net/browse/WIFI-11264
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 15:28:51 -07:00
stephb9959
cfb7ad21a2 https://telecominfraproject.atlassian.net/browse/WIFI-11241
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 15:21:48 -07:00
stephb9959
cc90306052 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 14:33:14 -07:00
stephb9959
b8f781b890 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 12:14:17 -07:00
stephb9959
f4af3da4c2 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 11:45:39 -07:00
stephb9959
a3f4143a67 https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 11:33:48 -07:00
stephb9959
b8c1a35c3a https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 11:18:13 -07:00
stephb9959
cd9345a54f https://telecominfraproject.atlassian.net/browse/WIFI-11259
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-21 11:13:07 -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
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
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
Johann Hoffmann
8837b23e79 Switch to pre-built libfmt packages
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-10-04 19:46:02 +02: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
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
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
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
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
280 changed files with 63335 additions and 26312 deletions

View File

@@ -1,7 +1,178 @@
---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignArrayOfStructures: None
AlignConsecutiveMacros: None
AlignConsecutiveAssignments: None
AlignConsecutiveBitFields: None
AlignConsecutiveDeclarations: None
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
AttributeMacros:
- __capability
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: true
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 100
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: '.*'
Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseLabels: false
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentExternBlock: AfterExternBlock
IndentRequires: false
IndentWidth: 4
IndentWrappedFunctionNames: false
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
LambdaBodyIndentation: Signature
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PenaltyIndentedWhitespace: 0
PointerAlignment: Right
PPIndentWidth: -1
ReferenceAlignment: Pointer
ReflowComments: true
ShortNamespaceLines: 1
SortIncludes: CaseSensitive
SortJavaStaticImport: Before
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceAroundPointerQualifiers: Default
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
BitFieldColonSpacing: Both
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
UseCRLF: false
UseTab: Always
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
...
BasedOnStyle: LLVM
TabWidth: 4
IndentWidth: 4
UseTab: Always
ColumnLimit: 100
Language: Cpp

View File

@@ -27,7 +27,7 @@ jobs:
DOCKER_REGISTRY_USERNAME: ucentral DOCKER_REGISTRY_USERNAME: ucentral
steps: steps:
- name: Checkout actions repo - name: Checkout actions repo
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
repository: Telecominfraproject/.github repository: Telecominfraproject/.github
path: github path: github
@@ -58,10 +58,10 @@ jobs:
- name: Get base branch name and set as output - name: Get base branch name and set as output
id: get_base_branch id: get_base_branch
run: | run: |
echo ::set-output name=branch::$(echo ${GITHUB_BASE_REF##*/} | sed 's/master/main/g') echo "branch=$(echo ${GITHUB_BASE_REF##*/} | sed 's/master/main/g')" >> $GITHUB_OUTPUT
- name: Checkout actions repo - name: Checkout actions repo
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
repository: Telecominfraproject/.github repository: Telecominfraproject/.github
path: github path: github
@@ -85,7 +85,7 @@ jobs:
- docker - docker
steps: steps:
- name: Checkout actions repo - name: Checkout actions repo
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
repository: Telecominfraproject/.github repository: Telecominfraproject/.github
path: github path: github

View File

@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout actions repo - name: Checkout actions repo
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
repository: Telecominfraproject/.github repository: Telecominfraproject/.github
path: github path: github

41
.github/workflows/openapi-pages.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Update OpenAPI docs on GitHub Pages
on:
push:
paths:
- 'openapi/**'
branches:
- master
workflow_dispatch:
defaults:
run:
shell: bash
jobs:
docsgen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Generate static HTML page with docs from OpenAPI definition
run: |
docker run --rm -v "${PWD}:/local" openapitools/openapi-generator-cli:v6.2.1 generate -i https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentralgw/master/openapi/owgw.yaml -g html2 --skip-validate-spec -o /local/
- name: Update OpenAPI docs
run: |
mkdir tmp-docs
mv index.html tmp-docs/index.html
mkdir -p ~/.ssh
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
echo https://tip-automation:${{ secrets.GIT_PUSH_PAT }}@github.com > ~/.git-credentials
git config --global credential.helper store
git config --global user.email "tip-automation@telecominfraproject.com"
git config --global user.name "TIP Automation User"
git pull
git checkout gh-pages || git checkout -b gh-pages
rm -rf docs
mv tmp-docs docs
git add docs
git commit -m'Update OpenAPI docs for GitHub pages'
git push --set-upstream origin gh-pages

View File

@@ -17,7 +17,7 @@ jobs:
HELM_REPO_USERNAME: ucentral HELM_REPO_USERNAME: ucentral
steps: steps:
- name: Checkout uCentral assembly chart repo - name: Checkout uCentral assembly chart repo
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
path: wlan-cloud-ucentralgw path: wlan-cloud-ucentralgw

1
.idea/vcs.xml generated
View File

@@ -2,5 +2,6 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/cmake-build-debug/rapidjson-test" vcs="Git" />
</component> </component>
</project> </project>

190
BUILDING.md Normal file
View File

@@ -0,0 +1,190 @@
# Building from source
In order to build the OWGW, you will need to install its dependencies, which includes the following:
- cmake
- boost
- POCO 1.10.1 or later
- a C++17 compiler
- 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/AriliaWireless/poco). Building
Poco may take several minutes depending on the platform you are building on.
## Ubuntu
These instructions have proven to work on Ubuntu 20.4.
```bash
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/AriliaWireless/poco --branch poco-tip-v1
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1
cd cppkafka
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/AriliaWireless/valijson --branch tip-v1
cd valijson
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target 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
mkdir cmake-build
cd cmake-build
cmake ..
make -j 8
```
## Fedora
The following instructions have proven to work on Fedora 33
```bash
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 json-devel
git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1
cd cppkafka
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/AriliaWireless/valijson --branch tip-v1
cd valijson
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
cd wlan-cloud-ucentralgw
mkdir cmake-build
cd cmake-build
cmake ..
make
```
## 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/).
```bash
brew install openssl \
cmake \
libpq \
mysql-client \
apr \
apr-util \
boost \
yaml-cpp \
postgresql \
librdkafka \
nlohmann-json \
fmt
git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1
pushd poco
mkdir 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
git clone https://github.com/AriliaWireless/valijson --branch tip-v1
cd valijson
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target 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
The build on a rPI takes a while. You can shorten that build time and requirements by disabling all the larger database
support. You can build with only SQLite support by not installing the packages for PostgreSQL, and MySQL by
adding -DSMALL_BUILD=1 on the cmake build line.
```bash
sudo apt install git cmake g++ libssl-dev libaprutil1-dev apache2-dev libboost-all-dev libyaml-cpp-dev
git clone https://github.com/stephb9959/poco
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
cd wlan-cloud-ucentralgw
mkdir cmake-build
cd cmake-build
cmake -DSMALL_BUILD=1 ..
make
```

77
CLI.md
View File

@@ -7,139 +7,139 @@ cli help
## The commands ## The commands
### getdevice <serial> ### getdevice `serial`
Get the device JSON document. Get the device JSON document.
### deletedevice <serial> ### deletedevice `serial`
Delete the device. Delete the device.
### createdevice <serial> <cfg> <MAC> ### createdevice `serial` `cfg` `MAC`
Create a device using the default configuration. Create a device using the default configuration.
- `serial`: device serial number - `serial`: device serial number
- `cfg`: JSON config file name - `cfg`: JSON config file name
- `MAC`: string MAC Address - `MAC`: string MAC Address
### getdevicestatus <serial> ### getdevicestatus `serial`
Get the device status JSON document. Get the device status JSON document.
- `serial`: device serial number - `serial`: device serial number
### getstats <serial> ### getstats `serial`
Get statistics for the device. Get statistics for the device.
- `serial`: device serial number - `serial`: device serial number
### gethealthchecks <serial> ### gethealthchecks `serial`
Get healthchecks for a device. Get healthchecks for a device.
- `serial`: device serial number - `serial`: device serial number
### newesthealthchecks <serial> ### newesthealthchecks `serial`
Get newest healthchecks for a device. Get newest healthchecks for a device.
- `serial`: device serial number - `serial`: device serial number
### lasthealthcheck <serial> ### lasthealthcheck `serial`
Get the last healthcheck Get the last healthcheck
- `serial`: device serial number - `serial`: device serial number
### getcapababilities <serial> ### getcapababilities `serial`
Get the device capabilities JSON document. Get the device capabilities JSON document.
- `serial`: device serial number - `serial`: device serial number
### deletecapababilities <serial> ### deletecapababilities `serial`
Delete the device capabilities JSON. Delete the device capabilities JSON.
- `serial`: device serial number - `serial`: device serial number
### reboot <serial> ### reboot `serial`
Reboot the device. Reboot the device.
- `serial`: device serial number - `serial`: device serial number
### upgrade <serial> <URI> ### upgrade `serial` `URI`
Do firmware upgrade for a device. Do firmware upgrade for a device.
- `serial`: device serial number - `serial`: device serial number
- `URI`: complete URI where the upgrade file exists. No validation is performed. - `URI`: complete URI where the upgrade file exists. No validation is performed.
### leds <serial> <pattern> <duration> ### leds `serial` `pattern` `duration`
Activate LEDs a device. Activate LEDs a device.
- `serial`: device serial number - `serial`: device serial number
- `pattern`: on/off/blink - `pattern`: on/off/blink
- `duration`: number in seconds - `duration`: number in seconds
### configure <serial> <cfg> ### configure `serial` `cfg`
Change configuration for a device. Change configuration for a device.
- `serial`: device serial number - `serial`: device serial number
- `cfg`: JSON config file name - `cfg`: JSON config file name
### factory <serial> <keep_redirector> ### factory `serial` `keep_redirector`
Do factory reset for device. Do factory reset for device.
- `serial`: device serial number - `serial`: device serial number
- `keep_redirector`: true=keep redirector, false=reset redirector - `keep_redirector`: true=keep redirector, false=reset redirector
### request <serial> <message> ### request `serial` `message`
Force a message from the device. Force a message from the device.
- `serial`: device serial number - `serial`: device serial number
- `message`: state or healthcheck - `message`: state or healthcheck
### wifiscan <serial> <verbose> ### wifiscan `serial` `verbose`
Do wifiscan for a device. Do wifiscan for a device.
- `serial`: device serial number - `serial`: device serial number
- `verbose`: verbose=true/false - `verbose`: verbose=true/false
### telemetry <serial> ### telemetry `serial`
Start `telemetry` stream for a device. Start `telemetry` stream for a device.
### trace <serial> <duration> <network> ### trace `serial` `duration` `network`
Launch a remote trace for a device. Launch a remote trace for a device.
- `serial`: device serial number - `serial`: device serial number
- `duration`: number in seconds - `duration`: number in seconds
- `network`: which network to perform trace on: lan or wan - `network`: which network to perform trace on: lan or wan
### getcommand <command-uuid> ### getcommand `command-uuid`
Get the command JSON document. Get the command JSON document.
- `command-uuid`: command UUID - `command-uuid`: command UUID
### deletecommand <command-uuid> ### deletecommand `command-uuid`
Delete the command. Delete the command.
- `command-uuid`: command UUID - `command-uuid`: command UUID
### newestcommands <serial> ### newestcommands `serial`
Get the newest commands for a device. Get the newest commands for a device.
- `serial`: device serial number - `serial`: device serial number
### listdevices ### listdevices
List devices. List devices.
### listcommands <serial> ### listcommands `serial`
List commands for a specific device. List commands for a specific device.
- `serial`: device serial number - `serial`: device serial number
### deletecommands <serial> ### deletecommands `serial`
Delete commands for a device. Delete commands for a device.
- `serial`: device serial number - `serial`: device serial number
### getlogs <serial> ### getlogs `serial`
Get logs for the device. Get logs for the device.
- `serial`: device serial number - `serial`: device serial number
### newestlogs <serial> ### newestlogs `serial`
Get the latest logs for the device. Get the latest logs for the device.
- `serial`: device serial number - `serial`: device serial number
### deletelogs <serial> ### deletelogs `serial`
Delete logs for the device. Delete logs for the device.
- `serial`: device serial number - `serial`: device serial number
### eventqueue <serial> ### eventqueue `serial`
Request event queue for the device. Request event queue for the device.
- `serial`: device serial number - `serial`: device serial number
### listdefaultconfigs ### listdefaultconfigs
List default configurations. List default configurations.
### createdefaultconfig <name> <ids> <cfg> ### createdefaultconfig `name` `ids` `cfg`
Create a default configuration Create a default configuration
- `name`: unique name, no spaces - `name`: unique name, no spaces
- `ids`: comma separated list of models - `ids`: comma separated list of models
- `cfg`: JSON config file name - `cfg`: JSON config file name
### addblacklistdevice <serial> <reason> ### addblacklistdevice `serial` `reason`
Add a device to the black list Add a device to the black list
- `serial`: serial number of the device to add - `serial`: serial number of the device to add
- `reason`: reason for blacklisting - `reason`: reason for blacklisting
@@ -147,7 +147,7 @@ Add a device to the black list
### getblacklist ### getblacklist
List all blacklisted devices List all blacklisted devices
### deleteblacklistdevice <serial> ### deleteblacklistdevice `serial`
Add a device to the black list. Add a device to the black list.
- `serial`: device serial number - `serial`: device serial number
@@ -157,7 +157,7 @@ Get the number of devices in the DB.
### deviceserialnumbers ### deviceserialnumbers
Get only the serial numbers. Get only the serial numbers.
### selectdevices <serial_list> ### selectdevices `serial_list`
Get a list of devices based on a list. Get a list of devices based on a list.
- `serial_list`: serial numbers (must be comma separated). - `serial_list`: serial numbers (must be comma separated).
@@ -179,27 +179,30 @@ Get the list of subsystems.
### systeminfo ### systeminfo
Get basic system information. Get basic system information.
### reloadsubsystem <subsystem name> ### reloadsubsystem `subsystem name`
Reload the configuration for a subsystem.### getfile <uuid> Reload the configuration for a subsystem.### getfile <uuid>
Get the file associated with trace command <uuid>. Get the file associated with trace command <uuid>.
- `uuid`: UUID of file to retrieve - `uuid`: UUID of file to retrieve
### rtty <serial> ### rtty `serial number`
Get the details for an rtty session. Get the details for an rtty session.
- `serial`: device serial number - `serial`: device serial number
### lifetimestats <serial> ### lifetimestats `serial number`
Get the lifetime stats counters for a device Get the lifetime stats counters for a device
- `serial`: device serial number - `serial`: device serial number
### laststats <serial> ### laststats `serial number`
Get the last statistics for a device. Get the last statistics for a device.
- `serial`: device serial number - `serial`: device serial number
### neweststats <serial> ### neweststats `serial number`
Get the newest statistics for a device. Get the newest statistics for a device.
- `serial`: device serial number - `serial`: device serial number
### deviceping `serial number`
This will return you the end-to-end latency from command-line to return value.
## Notes ## Notes
To pass additional flags to the CURL command, create an environment variable called FLAGS and git ve the values you To pass additional flags to the CURL command, create an environment variable called FLAGS and git ve the values you
want. For example, for force all call to use IPv6, set FLAGS=\"-6\", for verbose mode and IPv6, set FLAGS=\"-6 -v\" want. For example, for force all call to use IPv6, set FLAGS=\"-6\", for verbose mode and IPv6, set FLAGS=\"-6 -v\"

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.13) cmake_minimum_required(VERSION 3.13)
project(owgw VERSION 2.7.0) project(owgw VERSION 2.10.0)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
@@ -39,12 +39,12 @@ endif()
find_package(Git QUIET) find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --tags execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_RESULT RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_HASH) OUTPUT_VARIABLE GIT_HASH)
if(NOT GIT_RESULT EQUAL "0") if(NOT GIT_RESULT EQUAL "0")
message(FATAL_ERROR "git describe --always --tags failed with ${GIT_RESULT}") message(FATAL_ERROR "git rev-parse --short HEAD failed with ${GIT_RESULT}")
endif() endif()
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}") string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
endif() endif()
@@ -55,7 +55,7 @@ find_package(OpenSSL REQUIRED)
find_package(ZLIB REQUIRED) find_package(ZLIB REQUIRED)
find_package(fmt REQUIRED) find_package(fmt REQUIRED)
find_package(nlohmann_json REQUIRED) find_package(nlohmann_json REQUIRED)
find_package(nlohmann_json_schema_validator REQUIRED) # find_package(valijson REQUIRED)
if(SMALL_BUILD) if(SMALL_BUILD)
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite) find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
@@ -81,10 +81,54 @@ add_executable( owgw
src/framework/OpenWifiTypes.h src/framework/OpenWifiTypes.h
src/framework/orm.h src/framework/orm.h
src/framework/StorageClass.h src/framework/StorageClass.h
src/framework/MicroServiceErrorHandler.h
src/framework/UI_WebSocketClientServer.cpp
src/framework/UI_WebSocketClientServer.h
src/framework/UI_WebSocketClientNotifications.cpp
src/framework/UI_WebSocketClientNotifications.h
src/framework/utils.h
src/framework/utils.cpp
src/framework/AppServiceRegistry.h
src/framework/SubSystemServer.cpp
src/framework/SubSystemServer.h
src/framework/RESTAPI_utils.h
src/framework/AuthClient.cpp
src/framework/AuthClient.h
src/framework/MicroServiceNames.h
src/framework/MicroServiceFuncs.h
src/framework/OpenAPIRequests.cpp
src/framework/OpenAPIRequests.h
src/framework/MicroServiceFuncs.cpp
src/framework/ALBserver.cpp
src/framework/ALBserver.h
src/framework/KafkaManager.cpp
src/framework/KafkaManager.h
src/framework/RESTAPI_RateLimiter.h
src/framework/WebSocketLogger.h
src/framework/RESTAPI_GenericServerAccounting.h
src/framework/CIDR.h
src/framework/RESTAPI_Handler.cpp
src/framework/RESTAPI_Handler.h
src/framework/RESTAPI_ExtServer.h
src/framework/RESTAPI_ExtServer.cpp
src/framework/RESTAPI_IntServer.cpp
src/framework/RESTAPI_IntServer.h
src/framework/RESTAPI_SystemCommand.h
src/framework/RESTAPI_WebSocketServer.h
src/framework/RESTAPI_SystemConfiguration.h
src/framework/EventBusManager.cpp
src/framework/EventBusManager.h
src/framework/RESTAPI_PartHandler.h
src/framework/MicroService.cpp
src/framework/MicroServiceExtra.h
src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp 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 src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp
src/RESTObjects/RESTAPI_CertObjects.cpp src/RESTObjects/RESTAPI_CertObjects.h
src/RESTObjects/RESTAPI_OWLSobjects.cpp src/RESTObjects/RESTAPI_OWLSobjects.h
src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
src/RESTObjects/RESTAPI_AnalyticsObjects.cpp src/RESTObjects/RESTAPI_AnalyticsObjects.h
src/RESTObjects/RESTAPI_SubObjects.cpp src/RESTObjects/RESTAPI_SubObjects.h
src/RESTAPI/RESTAPI_devices_handler.cpp src/RESTAPI/RESTAPI_devices_handler.h src/RESTAPI/RESTAPI_devices_handler.cpp src/RESTAPI/RESTAPI_devices_handler.h
src/RESTAPI/RESTAPI_device_handler.cpp src/RESTAPI/RESTAPI_device_handler.h src/RESTAPI/RESTAPI_device_handler.cpp src/RESTAPI/RESTAPI_device_handler.h
src/RESTAPI/RESTAPI_device_commandHandler.cpp src/RESTAPI/RESTAPI_device_commandHandler.h src/RESTAPI/RESTAPI_device_commandHandler.cpp src/RESTAPI/RESTAPI_device_commandHandler.h
@@ -100,15 +144,19 @@ add_executable( owgw
src/RESTAPI/RESTAPI_RPC.cpp src/RESTAPI/RESTAPI_RPC.h src/RESTAPI/RESTAPI_RPC.cpp src/RESTAPI/RESTAPI_RPC.h
src/RESTAPI/RESTAPI_deviceDashboardHandler.cpp src/RESTAPI/RESTAPI_deviceDashboardHandler.h src/RESTAPI/RESTAPI_deviceDashboardHandler.cpp src/RESTAPI/RESTAPI_deviceDashboardHandler.h
src/RESTAPI/RESTAPI_telemetryWebSocket.cpp src/RESTAPI/RESTAPI_telemetryWebSocket.h src/RESTAPI/RESTAPI_telemetryWebSocket.cpp src/RESTAPI/RESTAPI_telemetryWebSocket.h
src/RESTAPI/RESTAPI_scripts_handler.cpp src/RESTAPI/RESTAPI_scripts_handler.h
src/RESTAPI/RESTAPI_script_handler.cpp src/RESTAPI/RESTAPI_script_handler.h
src/RESTAPI/RESTAPI_regulatory.cpp src/RESTAPI/RESTAPI_regulatory.h
src/RESTAPI/RESTAPI_radiussessions_handler.cpp src/RESTAPI/RESTAPI_radiussessions_handler.h
src/storage/storage_blacklist.cpp src/storage/storage_tables.cpp src/storage/storage_logs.cpp 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_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_device.cpp src/storage/storage_capabilities.cpp src/storage/storage_defconfig.cpp
src/storage/storage_scripts.cpp src/storage/storage_scripts.h
src/storage/storage_tables.cpp src/storage/storage_tables.cpp
src/RESTAPI/RESTAPI_routers.cpp src/RESTAPI/RESTAPI_routers.cpp
src/Daemon.cpp src/Daemon.h src/Daemon.cpp src/Daemon.h
src/AP_WS_Server.cpp src/AP_WS_Server.h src/AP_WS_Server.cpp src/AP_WS_Server.h
src/StorageService.cpp src/StorageService.h src/StorageService.cpp src/StorageService.h
src/DeviceRegistry.cpp src/DeviceRegistry.h
src/CommandManager.cpp src/CommandManager.h src/CommandManager.cpp src/CommandManager.h
src/CentralConfig.cpp src/CentralConfig.h src/CentralConfig.cpp src/CentralConfig.h
src/FileUploader.cpp src/FileUploader.h src/FileUploader.cpp src/FileUploader.h
@@ -122,17 +170,48 @@ add_executable( owgw
src/CapabilitiesCache.h src/FindCountry.h src/CapabilitiesCache.h src/FindCountry.h
src/rttys/RTTYS_server.cpp src/rttys/RTTYS_server.cpp
src/rttys/RTTYS_server.h 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.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/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/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_connect.cpp
src/AP_WS_Process_state.cpp src/AP_WS_Process_state.cpp
src/AP_WS_Process_healthcheck.cpp src/AP_WS_Process_healthcheck.cpp
src/AP_WS_Process_log.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) 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/RADSEC_server.h
src/UI_GW_WebSocketNotifications.cpp src/UI_GW_WebSocketNotifications.h
src/framework/RESTAPI_SystemConfiguration.h
src/ScriptManager.cpp src/ScriptManager.h
src/SignatureMgr.h
src/AP_WS_Process_event.cpp
src/AP_WS_Process_wifiscan.cpp
src/AP_WS_Process_alarm.cpp
src/GWKafkaEvents.cpp src/GWKafkaEvents.h
src/RegulatoryInfo.cpp src/RegulatoryInfo.h
src/RADIUSSessionTracker.cpp src/RADIUSSessionTracker.h
src/libs/Scheduler.h src/libs/InterruptableSleep.h src/libs/ctpl_stl.h src/libs/Cron.h
src/GenericScheduler.cpp src/GenericScheduler.h src/framework/default_device_types.h src/AP_WS_Process_rebootLog.cpp src/AP_WS_ConfigAutoUpgrader.cpp src/AP_WS_ConfigAutoUpgrader.h)
if(NOT SMALL_BUILD) if(NOT SMALL_BUILD)
@@ -150,10 +229,9 @@ if(NOT SMALL_BUILD)
target_link_libraries(owgw PUBLIC target_link_libraries(owgw PUBLIC
${MySQL_LIBRARIES} ${ZLIB_LIBRARIES} ${MySQL_LIBRARIES} ${ZLIB_LIBRARIES}
CppKafka::cppkafka CppKafka::cppkafka
nlohmann_json_schema_validator
fmt::fmt fmt::fmt
) )
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
target_link_libraries(owgw PUBLIC PocoJSON) target_link_libraries(owgw PUBLIC PocoJSON)
endif() endif()
endif() endif()

View File

@@ -1,32 +0,0 @@
# Coding Style
I just want ot make sure we all follow the same rules when contributing
code back into this tree.
## Version of C++
This project is based on the C++17 standard. If compiles as-is on most platforms
using either clang or g++. Do not use C++21 features for now. I would love to do some
of the new stuff but let's wait for these features to be available on
all compilers first. `coroutine` has to wait.
## Naming
Naming of pretty much anything uses Pascal naming. I know... You might not be a big fan or have
fallen to the JS gods and use camelNaming. Well, let's all make an effort to keep
this coherent. Member variable naming adds a `_` at the end of the vars. Try to
keep this standard going. Sometimes you must override a base class function and then of course
you need to follow the base class. Let's be real...
## File Sizes
Do you best to keep your file sizes < 300 lines. It just makes the code more readable
and shortens compile times.
## This is a cmake project
This is a cmake project and you need to adhere to the cmake rules. If you need
to add a package to the CMakeList, you need to ensure that the package is available
on all required platforms and compiles. Remember that this project runs on Linux, OS X,
and the Raspberry PI.
## Licensed packages
When adding a package, you must also state the licensing for the package. MIT, BSD, Apache licenses
are acceptable. No commercial licenses are allowed.

415
CONFIGURATION.md Normal file
View File

@@ -0,0 +1,415 @@
# Controller Configuration Parameters
## OWGW Specific Parameters
### Websocket parameters
This is the crucial section. I bet that 97.4% of all your problems will come from here, and it's boring. So put some good music on,
give the kids the iPad, get a cup of coffee, and pay attention. Every field will be explained.
```properties
ucentral.websocket.host.0.backlog = 500
ucentral.websocket.host.0.rootca = $OWGW_ROOT/certs/root.pem
ucentral.websocket.host.0.issuer = $OWGW_ROOT/certs/issuer.pem
ucentral.websocket.host.0.cert = $OWGW_ROOT/certs/websocket-cert.pem
ucentral.websocket.host.0.key = $OWGW_ROOT/certs/websocket-key.pem
ucentral.websocket.host.0.clientcas = $OWGW_ROOT/certs/clientcas.pem
ucentral.websocket.host.0.cas = $OWGW_ROOT/certs/cas
ucentral.websocket.host.0.address = *
ucentral.websocket.host.0.port = 15002
ucentral.websocket.host.0.security = strict
ucentral.websocket.host.0.key.password = mypassword
ucentral.websocket.maxreactors = 20
```
#### ucentral.websocket.host.0.backlog
This is the number of concurrent devices you are expecting to call all at once. Not the current number of devices. This is how many will connect in the same exact second.
Take the total number of devices you have and divide by 100. That's a good rule of thumb. Never go above 500.
#### ucentral.websocket.host.0.rootca
This is the root file as supplied by Digicert. You can find it [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/root.pem)
#### ucentral.websocket.host.0.issuer
This is the issuer file as supplied by Digicert. You can find it [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/issuer.pem)
#### ucentral.websocket.host.0.cert
This is a `pem` file that you will receive from Digicert for the gateway itself. This is the certificate for the gateway.
#### ucentral.websocket.host.0.key
This is a `pem` file that you will receive from Digicert for the gateway itself. The is the private key for the gateway.
#### ucentral.websocket.host.0.clientcas
This is a `pem` file that contains both the issuer and the root CA certificates. You can find it You can find it [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/clientcas.pem)
#### ucentral.websocket.host.0.cas
This is a directory where you will copy your own `cert.pem`, the `root.pem`, and the `issuer.pem` files.
#### ucentral.websocket.host.0.address
Leve this a `*` in the case you want to bind to all interfaces on your gateway host or select the address of a single interface.
#### ucentral.websocket.host.0.port
Leave to 15002 for now.
#### ucentral.websocket.host.0.security
Leave this as strict for now for devices.
#### ucentral.websocket.host.0.key.password
If you key file uses a password, please enter it here.
#### ucentral.websocket.maxreactors
A single reactor can handle between 1000-2000 devices. Never leave this smaller than 5 or larger than 50.
### File uploader parameters
Certain commands may require the Access Point to upload a file into the Controller. For this reason, there is a special embedded HTTP
server to receive these files.
```properties
openwifi.fileuploader.host.0.backlog = 100
openwifi.fileuploader.host.0.rootca = $OWGW_ROOT/certs/restapi-ca.pem
openwifi.fileuploader.host.0.security = relaxed
openwifi.fileuploader.host.0.address = *
openwifi.fileuploader.host.0.name = ucentral.dpaas.arilia.com
openwifi.fileuploader.host.0.port = 16003
openwifi.fileuploader.host.0.cert = $OWGW_ROOT/certs/restapi-cert.pem
openwifi.fileuploader.host.0.key = $OWGW_ROOT/certs/restapi-key.pem
openwifi.fileuploader.host.0.key.password = mypassword
openwifi.fileuploader.path = $OWGW_ROOT/uploads
openwifi.fileuploader.maxsize = 10000
openwifi.fileuploader.uri = https://ucentral.dpaas.arilia.com:16003
```
#### openwifi.fileuploader.host.0.backlog
This is the number of concurrent REST API calls that maybe be kept in the backlog for processing. That's a good rule of thumb. Never go above 500.
#### openwifi.fileuploader.host.0.rootca
This is the root file of your own certificate CA in `pem` format.
#### openwifi.fileuploader.host.0.cert
This is your own server certificate in `pem` format..
#### openwifi.fileuploader.host.0.key
This is the private key associated with your own certificate in `pem` format.
#### openwifi.intfileuploaderernal.host.0.address
Leve this a `*` in the case you want to bind to all interfaces on your gateway host or select the address of a single interface.
#### openwifi.fileuploader.host.0.port
The port on which the REST API server is listening. By default, this is 16003.
#### openwifi.fileuploader.host.0.security
Leave this as `relaxed` for now for devices.
#### openwifi.fileuploader.host.0.key.password
If you key file uses a password, please enter it here.
#### openwifi.fileuploader.path
This is the location where the files will be stored temporarily before processing. This `path` must exist.
#### openwifi.fileuploader.maxsize
This is the maximum uploaded file size. The default maximum size if 10MB. This size is in KB.
#### openwifi.fileuploader.uri
This is the URI that will be passed to the AP. You must make sure that the AP can resolve this URI.
### OUI Service
The controller has a built-in OUI resolver for MAC addresses. The GW will periodically load this file to obtain the latest.
This is ths URI for this file.
```properties
oui.download.uri = https://standards-oui.ieee.org/oui/oui.txt
```
### Data-model Source
The gateway can make use of the latest uCentral data-model or use the built-in model. These 2 parameters allow you to
choose which method you want. If you select the internal method, the URI is ignored. If for some reason you choose
the on-line data-model from the URI and the URI is not reachable, the system will fall back on the internal model.
```properties
ucentral.datamodel.internal = true
ucentral.datamodel.uri = https://raw.githubusercontent.com/Telecominfraproject/wlan-ucentral-schema/main/ucentral.schema.json
```
### Command Manager
The command manager is responsible for managing command sent and responses received with the APs. Several parameters allow you
to fine tune its behaviour. Unless you have some particular reasons to change tem the defaults are usually just fine.
```properties
command.timeout = 14400
command.retry = 120
command.janitor = 120
command.queue = 30
```
#### command.timeout
How long will the GW wait in seconds before considering a commands has timed out.
#### command.retry
How long between command retries.
#### command.janitor
How long between outstanding RPC clean-ups.
#### command.queue
How long should te gateway wait between running its queue.
### IP to Country Parameters
The controller has the ability to find the location of the IP of each Access Points. This uses an external IP location service. Currently,
the controller supports 3 services. Please note that these services will require to obtain an API key or token, and these may cause you to incur
additional fees. Here is the list of the services supported:
- ip2location: ip2location.com
- ipdata: ipdata.co
- ipinfo: ipinfo.io
```properties
iptocountry.default = US
iptocountry.provider = ipinfo
#iptocountry.provider = ipdata
#iptocountry.provider = ip2location
iptocountry.ipinfo.token =
iptocountry.ipdata.apikey =
iptocountry.ip2location.apikey =
```
#### iptocountry.default
This is the country code to be used if no information can be found at one of the providers or you have not configured any of the providers.
#### iptocountry.provider
You must select onf of the possible services and the fill the appropriate token or api key parameter.
### Provisioning link
This parameter tells the controller how to behave when it receives a request from a device for the first time. In this case, we tell
the controller to look at the provisioning service first, then apply any local configurations.
```properties
autoprovisioning.process = prov,default
```
### Restricted Device Signature Manager
If are using restricted devices, then you can include different keys for each vendor who provided
you with their information. This allows the controller to automatically sign requests to the device. You can have as many vendors
as it is necessary.
```properties
signature.manager.0.key.public = $OWGW_ROOT/certs/signatures/test1-public-key.pem
signature.manager.0.key.private = $OWGW_ROOT/certs/signatures/test1-private-key.pem
signature.manager.0.vendor = test1
signature.manager.1.key.public = $OWGW_ROOT/certs/signatures/test2-public-key.pem
signature.manager.1.key.private = $OWGW_ROOT/certs/signatures/test2-private-key.pem
signature.manager.1.vendor = test2
```
### OWLS Simulator ID
If you plan on using OWLS (OpenWifi Load Simulator), then you will need to put your Simulator ID right here.
This ID must be obtained from TIP.
```properties
simulatorid = 53494dFFEEDD
```
### RTTY Service
The controller comes with the ability to run an RTTY service. The service can either be internal (the prefered choice)
or external. If you decide to use the internal RTTY, the you only need to specify `rtty.internal = true`. If you choose
to use an external RTTY, you must specify the remainder of the parameters.
```properties
rtty.internal = true
rtty.enabled = true
rtty.server = rtty-tip.arilia.com
rtty.port = 5912
rtty.token = 96181c567b4d0d98c50f127230068fa8
rtty.timeout = 60
rtty.viewport = 5913
rtty.assets = $OWGW_ROOT/rtty_ui
```
### RADIUS proxy config
If you are going to use the buil-in RADIUS proxy service, you need to enable this parameter and provide
the ports for you PROXY.
```properties
radius.proxy.enable = false
radius.proxy.accounting.port = 1813
radius.proxy.authentication.port = 1812
radius.proxy.coa.port = 3799
radsec.keepalive = 120
```
### Auto Archiver Parameters
The auto archiver is responsible for removing all stale data. The default is to remove old data after 7 days.
```properties
archiver.enabled = true
archiver.schedule = 03:00
archiver.db.0.name = healthchecks
archiver.db.0.keep = 7
archiver.db.1.name = statistics
archiver.db.1.keep = 7
archiver.db.2.name = devicelogs
archiver.db.2.keep = 7
archiver.db.3.name = commandlist
archiver.db.3.keep = 7
```
## Generic OpenWiFi SDK parameters
### REST API External parameters
These are the parameters required for the configuration of the external facing REST API server
```properties
openwifi.restapi.host.0.backlog = 100
openwifi.restapi.host.0.security = relaxed
openwifi.restapi.host.0.rootca = $OWGW_ROOT/certs/restapi-ca.pem
openwifi.restapi.host.0.address = *
openwifi.restapi.host.0.port = 16004
openwifi.restapi.host.0.cert = $OWGW_ROOT/certs/restapi-cert.pem
openwifi.restapi.host.0.key = $OWGW_ROOT/certs/restapi-key.pem
openwifi.restapi.host.0.key.password = mypassword
```
#### openwifi.restapi.host.0.backlog
This is the number of concurrent REST API calls that maybe be kept in the backlog for processing. That's a good rule of thumb. Never go above 500.
#### openwifi.restapi.host.0.rootca
This is the root file of your own certificate CA in `pem` format.
#### openwifi.restapi.host.0.cert
This is your own server certificate in `pem` format..
#### openwifi.restapi.host.0.key
This is the private key associated with your own certificate in `pem` format.
#### openwifi.restapi.host.0.address
Leve this a `*` in the case you want to bind to all interfaces on your gateway host or select the address of a single interface.
#### openwifi.restapi.host.0.port
The port on which the REST API server is listening. By default, this is 16002.
#### openwifi.restapi.host.0.security
Leave this as `relaxed` for now for devices.
#### openwifi.restapi.host.0.key.password
If you key file uses a password, please enter it here.
### REST API Intra microservice parameters
The following parameters describe the configuration for the inter-microservice HTTP server. You may use the same certificate/key
you are using for your extenral server or another certificate.
```properties
openwifi.internal.restapi.host.0.backlog = 100
openwifi.internal.restapi.host.0.security = relaxed
openwifi.internal.restapi.host.0.rootca = $OWGW_ROOT/certs/restapi-ca.pem
openwifi.internal.restapi.host.0.address = *
openwifi.internal.restapi.host.0.port = 17004
openwifi.internal.restapi.host.0.cert = $OWGW_ROOT/certs/restapi-cert.pem
openwifi.internal.restapi.host.0.key = $OWGW_ROOT/certs/restapi-key.pem
openwifi.internal.restapi.host.0.key.password = mypassword
```
#### openwifi.internal.host.0.backlog
This is the number of concurrent REST API calls that maybe be kept in the backlog for processing. That's a good rule of thumb. Never go above 500.
#### openwifi.internal.host.0.rootca
This is the root file of your own certificate CA in `pem` format.
#### openwifi.internal.host.0.cert
This is your own server certificate in `pem` format..
#### openwifi.internal.host.0.key
This is the private key associated with your own certificate in `pem` format.
#### openwifi.internal.host.0.address
Leve this a `*` in the case you want to bind to all interfaces on your gateway host or select the address of a single interface.
#### openwifi.internal.host.0.port
The port on which the REST API server is listening. By default, this is 17002.
#### openwifi.internal.host.0.security
Leave this as `relaxed` for now for devices.
#### openwifi.internal.host.0.key.password
If you key file uses a password, please enter it here.
### Microservice information
These are different Microservie parameters. Following is a brief explanation.
```properties
openwifi.service.key = $OWGW_ROOT/certs/restapi-key.pem
openwifi.service.key.password = mypassword
openwifi.system.data = $OWGW_ROOT/data
openwifi.system.uri.private = https://localhost:17004
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.ucentralfms
openwifi.autoprovisioning = true
```
#### openwifi.service.key
From time to time, the microservice must encrypt information. This is the key it should use. You may use the
same keey as you RESTAPI or your server.
#### openwifi.service.key.password
The password for the `openwifi.service.key`
#### openwifi.system.data
The location of system data. This path must exist.
#### openwifi.system.uri.private
The URI to reach the controller on the internal port.
#### openwifi.system.uri.public
The URI to reach the controller from the outside world.
#### openwifi.system.uri.ui
The URI of the UI to manage this service
#### openwifi.security.restapi.disable
This allows to disable security for internal and external API calls. This should only be used if the controller
sits behind an application load balancer that will actually do TLS. Setting this to `true` disables security.
#### openwifi.system.commandchannel
The UNIX socket command channel used by this service.
#### openwifi.autoprovisioning
Allow unknown devices to be provisioned by the system.
### ALB Support
In order to support an application load balancer health check verification, your need to provide the following parameters.
```properties
alb.enable = true
alb.port = 16102
```
### Kafka
The controller use Kafka, like all the other microservices. You must configure the kafka section in order for the
system to work.
```properties
openwifi.kafka.group.id = gateway
openwifi.kafka.client.id = gateway1
openwifi.kafka.enable = true
openwifi.kafka.brokerlist = my_Kafka.example.com:9092
openwifi.kafka.auto.commit = false
openwifi.kafka.queue.buffering.max.ms = 50
```
### openwifi.kafka.group.id
The group ID is a single word that should identify the type of service tuning. In the case `gateway`
### openwifi.kafka.client.id
The client ID is a single service within that group ID. Each participant must have a unique client ID.
### openwifi.kafka.enable
Kafka should always be enabled.
### openwifi.kafka.brokerlist
The list of servers where your Kafka server is running. Comma separated.
### openwifi.kafka.auto.commit
Auto commit flag in Kafka. Leave as `false`.
### openwifi.kafka.queue.buffering.max.ms
Kafka buffering. Leave as `50`.
### Kafka security
If you intend to use SSL, you should look into Kafka Connect and specify the certificates below.
```properties
penwifi.kafka.ssl.ca.location =
openwifi.kafka.ssl.certificate.location =
openwifi.kafka.ssl.key.location =
openwifi.kafka.ssl.key.password =
```
### DB Type
The controller supports 3 types of Database. SQLite should only be used for sites with less than 100 APs or for testing in the lab.
In order to select which database to use, you must set the `storage.type` value to sqlite, postgresql, or mysql.
```properties
storage.type = sqlite
#storage.type = postgresql
#storage.type = mysql
```
### Storage SQLite parameters
Additional parameters to set for SQLite. The only important one is `storage.type.sqlite.db` which is the database name on disk.
```properties
storage.type.sqlite.db = gateway.db
storage.type.sqlite.idletime = 120
storage.type.sqlite.maxsessions = 128
```
### Storage Postgres
Additional parameters to set if you select Postgres for your database. You must specify `host`, `username`, `password`,
`database`, and `port`.
```properties
storage.type.postgresql.maxsessions = 64
storage.type.postgresql.idletime = 60
storage.type.postgresql.host = localhost
storage.type.postgresql.username = gateway
storage.type.postgresql.password = gateway
storage.type.postgresql.database = gateway
storage.type.postgresql.port = 5432
storage.type.postgresql.connectiontimeout = 60
```
### Storage MySQL/MariaDB
Additional parameters to set if you select mysql for your database. You must specify `host`, `username`, `password`,
`database`, and `port`.
```properties
storage.type.mysql.maxsessions = 64
storage.type.mysql.idletime = 60
storage.type.mysql.host = localhost
storage.type.postgresql.username = gateway
storage.type.postgresql.password = gateway
storage.type.postgresql.database = gateway
storage.type.mysql.port = 3306
storage.type.mysql.connectiontimeout = 60
```
### Logging Parameters
The microservice provides extensive logging. If you would like to keep logging on disk, set the `logging.type = file`. If you only want
console logging, `set logging.type = console`. When selecting file, `logging.path` must exist. `logging.level` sets the
basic logging level for the entire controller. `logging.websocket` disables WebSocket logging.
```properties
logging.type = file
logging.path = $OWGW_ROOT/logs
logging.level = information
logging.asynch = true
logging.websocket = false
```

38
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,38 @@
# How to Contribute
We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.
## Version of C++
This project is based on the C++17 standard and compiles as-is on most platforms
using either clang or g++. Do not use C++21 or C++23 features for now. Some core
libraries used in this project do not support C++21 or C++23 yet.
## Variable Naming
Naming of pretty much anything uses Pascal naming. Longer explicit names using casing.
Member variable naming adds a `_` at the end of the vars. Try to
keep this standard going. Sometimes you must override a base class function and then of course
you need to follow the base class.
## This is a cmake project
This is a cmake project, and you need to adhere to the cmake rules. If you need
to add a package to the CMakeList, you need to ensure that the package is available
on all required platforms and compiles. Remember that this project runs on Linux, OS X,
and the Raspberry PI.
## Licensed packages
When adding a package, you must also state the licensing for the package. MIT, BSD, Apache licenses
are acceptable. No commercial licenses are allowed.
## clang formatting
Please format your code using the included `.clang-format` file included in the project.
```bash
clang-format -i --style=<project root>/.clang-format myfile.cpp
```
## Pull Requests
All submissions, including submissions by project members, require review. We
accept GitHub pull requests. Please create a branch with the Jira name for addressing the issue you are fixing or the
feature you are implementing.
Create a pull-request from the branch into master.

View File

@@ -1,16 +1,15 @@
ARG ALPINE_VERSION=3.16.2 ARG DEBIAN_VERSION=11.5-slim
ARG POCO_VERSION=poco-tip-v1 ARG POCO_VERSION=poco-tip-v2
ARG FMTLIB_VERSION=9.0.0
ARG CPPKAFKA_VERSION=tip-v1 ARG CPPKAFKA_VERSION=tip-v1
ARG JSON_VALIDATOR_VERSION=2.1.0 ARG VALIJASON_VERSION=tip-v1
FROM alpine:$ALPINE_VERSION AS build-base FROM debian:$DEBIAN_VERSION AS build-base
RUN apk add --update --no-cache \ RUN apt-get update && apt-get install --no-install-recommends -y \
make cmake g++ git \ make cmake g++ git \
unixodbc-dev postgresql-dev mariadb-dev \ libpq-dev libmariadb-dev libmariadbclient-dev-compat \
librdkafka-dev boost-dev openssl-dev \ librdkafka-dev libboost-all-dev libssl-dev \
zlib-dev nlohmann-json ca-certificates zlib1g-dev nlohmann-json3-dev ca-certificates libfmt-dev
FROM build-base AS poco-build FROM build-base AS poco-build
@@ -26,20 +25,6 @@ RUN cmake ..
RUN cmake --build . --config Release -j8 RUN cmake --build . --config Release -j8
RUN cmake --build . --target install 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 FROM build-base AS cppkafka-build
ARG CPPKAFKA_VERSION ARG CPPKAFKA_VERSION
@@ -54,19 +39,19 @@ RUN cmake ..
RUN cmake --build . --config Release -j8 RUN cmake --build . --config Release -j8
RUN cmake --build . --target install RUN cmake --build . --target install
FROM build-base AS json-schema-validator-build FROM build-base AS valijson-build
ARG JSON_VALIDATOR_VERSION ARG VALIJASON_VERSION
ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/tags/${JSON_VALIDATOR_VERSION} version.json ADD https://api.github.com/repos/AriliaWireless/valijson/git/refs/tags/${VALIJASON_VERSION} version.json
RUN git clone https://github.com/pboettch/json-schema-validator --branch ${JSON_VALIDATOR_VERSION} /json-schema-validator RUN git clone https://github.com/AriliaWireless/valijson --branch ${VALIJASON_VERSION} /valijson
WORKDIR /json-schema-validator WORKDIR /valijson
RUN mkdir cmake-build RUN mkdir cmake-build
WORKDIR cmake-build WORKDIR cmake-build
RUN cmake .. RUN cmake ..
RUN make RUN cmake --build . --config Release -j8
RUN make install RUN cmake --build . --target install
FROM build-base AS owgw-build FROM build-base AS owgw-build
@@ -79,10 +64,7 @@ COPY --from=poco-build /usr/local/include /usr/local/include
COPY --from=poco-build /usr/local/lib /usr/local/lib COPY --from=poco-build /usr/local/lib /usr/local/lib
COPY --from=cppkafka-build /usr/local/include /usr/local/include COPY --from=cppkafka-build /usr/local/include /usr/local/include
COPY --from=cppkafka-build /usr/local/lib /usr/local/lib COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
COPY --from=json-schema-validator-build /usr/local/include /usr/local/include COPY --from=valijson-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 WORKDIR /owgw
RUN mkdir cmake-build RUN mkdir cmake-build
@@ -90,21 +72,21 @@ WORKDIR /owgw/cmake-build
RUN cmake .. RUN cmake ..
RUN cmake --build . --config Release -j8 RUN cmake --build . --config Release -j8
FROM alpine:$ALPINE_VERSION FROM debian:$DEBIAN_VERSION
ENV OWGW_USER=owgw \ ENV OWGW_USER=owgw \
OWGW_ROOT=/owgw-data \ OWGW_ROOT=/owgw-data \
OWGW_CONFIG=/owgw-data OWGW_CONFIG=/owgw-data
RUN addgroup -S "$OWGW_USER" && \ RUN useradd "$OWGW_USER"
adduser -S -G "$OWGW_USER" "$OWGW_USER"
RUN mkdir /openwifi RUN mkdir /openwifi
RUN mkdir -p "$OWGW_ROOT" "$OWGW_CONFIG" && \ RUN mkdir -p "$OWGW_ROOT" "$OWGW_CONFIG" && \
chown "$OWGW_USER": "$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 \ RUN apt-get update && apt-get install --no-install-recommends -y \
mariadb-connector-c libpq unixodbc postgresql-client librdkafka++1 gosu gettext ca-certificates bash jq curl wget \
libmariadb-dev-compat libpq5 unixodbc postgresql-client libfmt7 sqlite3
COPY readiness_check /readiness_check COPY readiness_check /readiness_check
COPY test_scripts/curl/cli /cli COPY test_scripts/curl/cli /cli
@@ -114,11 +96,13 @@ COPY docker-entrypoint.sh /
COPY wait-for-postgres.sh / COPY wait-for-postgres.sh /
COPY rtty_ui /dist/rtty_ui COPY rtty_ui /dist/rtty_ui
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \ 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=owgw-build /owgw/cmake-build/owgw /openwifi/owgw
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib /usr/local/lib/ COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib /usr/local/lib/
COPY --from=poco-build /poco/cmake-build/lib /usr/local/lib COPY --from=poco-build /poco/cmake-build/lib /usr/local/lib/
RUN ldconfig
EXPOSE 15002 16002 16003 17002 16102 EXPOSE 15002 16002 16003 17002 16102

View File

@@ -4,15 +4,16 @@ This is a fast moving target, so please visit often or set an alert in GitHub.
## Current plans ## Current plans
Currently, most telemetry and reports created in the gateway will be issues as topics in Kafka. You should configure Currently, most telemetry and reports created in the gateway will be issues as topics in Kafka. You should configure
your Kafka service with the following topics: your Kafka service with the following topics:
- `connection` : This is emitted whenever a device connects to the gateway. The report contains all ths information about the connection.
- `state` : This is emitted for every `state` report coming from the AP. This state report contains all the information of state reports.
- `healthcheck` : These are the `healthcheck` report sent from the AP. - `healthcheck` : These are the `healthcheck` report sent from the AP.
- `state` : This is emitted for every `state` report coming from the AP. This state report contains all the information of state reports.
- `connection` : This is emitted whenever a device connects to the gateway. The report contains all ths information about the connection.
- `wifiscan` : Whenever a `wifiscan` report is generated, it will be submitted here. - `wifiscan` : Whenever a `wifiscan` report is generated, it will be submitted here.
- `service_events` : Inter-service traffic.
- `security` : This will have application information (future use).
- `command` : Allow to send commands (future use).
- `alerts` : Alerts originating from devices (future use). - `alerts` : Alerts originating from devices (future use).
- `command` : Allow to send commands (future use).
- `service_events` : Inter-service traffic.
- `device_event_queue` : device events
- `device_telemetry` : device telemetry. Telemetry must be started manually or through the device configuration.
- `provisioning_change` : venue, configuration, entity changes from provisioning.
## Structure of `kafka` messages ## Structure of `kafka` messages
Messages use 2 formats Messages use 2 formats

View File

@@ -5,6 +5,11 @@ This document will describe how the API is built and how to use it.
This uses OpenAPI definition 3.0 and can be found [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/openapi/ucentral/owgw.yaml). This uses OpenAPI definition 3.0 and can be found [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/openapi/ucentral/owgw.yaml).
All endpoints begin with `/api/v1`. All endpoints begin with `/api/v1`.
## OpenAPI docs
You may get static page with OpenAPI docs generated from the definition on [GitHub Page](https://telecominfraproject.github.io/wlan-cloud-ucentralgw).
Also you may use [Swagger UI](https://petstore.swagger.io/#/) with OpenAPI definition file raw link (i.e. [latest version file](https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentralgw/master/openapi/owgw.yaml)) to get interactive docs page.
## The flow ## The flow
In order to use any of the API calls, you must obtain a token (I know - shocking). You do so by calling the end-point In order to use any of the API calls, you must obtain a token (I know - shocking). You do so by calling the end-point
`/oauth2`. Once you obtain that `access-token`, you will need to pass it in the headers under `Authorization: Bearer <place your token here>`. `/oauth2`. Once you obtain that `access-token`, you will need to pass it in the headers under `Authorization: Bearer <place your token here>`.

View File

@@ -89,6 +89,54 @@ Device sends a log message whenever necessary. The controller will log this mess
} }
``` ```
#### Events Channel
Device sends unsolicited events to the controller.
```json
{ "jsonrpc" : "2.0" ,
"method" : "event" ,
"params" : {
"serial" : "001122334455" ,
"data" : {
"event" : [
1871263817263,
{
"type" : "the event type",
"payload" : {
"field1" : "value1"
}
}
]
}
}
}
```
The first element of the `event` array is always the `timestamp` of the event. The `payload` is a JSON document contains addition information about the event. This _may not_ be empty.
#### Alarms Channel
Device sends unsolicited alarms to the controller.
```json
{ "jsonrpc" : "2.0" ,
"method" : "alarm" ,
"params" : {
"serial" : <serial number> ,
"data" : <Optiona/may be empty: JSON Document providing additional information related to this event message>
}
}
```
#### Wifiscan Channel
Device sends unsolicited wifiscans to the controller.
```json
{ "jsonrpc" : "2.0" ,
"method" : "wifiscan" ,
"params" : {
"serial" : <serial number> ,
"data" : <Optiona/may be empty: JSON Document providing additional information related to this wifiscan message>
}
}
```
##### `severity` ##### `severity`
The `severity` matches the `syslog` levels. Here are the details: The `severity` matches the `syslog` levels. Here are the details:
- 0 : LOG_EMERG 0 /* system is unusable */ - 0 : LOG_EMERG 0 /* system is unusable */
@@ -101,18 +149,35 @@ The `severity` matches the `syslog` levels. Here are the details:
- 7 : LOG_DEBUG 7 /* debug-level messages */ - 7 : LOG_DEBUG 7 /* debug-level messages */
#### Crash Log event #### 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. Device may send a `crash log event` during rebooting after a crash. The event cannot be sent until a connection event has been established.
```json ```json
{ "jsonrpc" : "2.0" , { "jsonrpc" : "2.0" ,
"method" : "crashlog" , "method" : "crashlog" ,
"params" : { "params" : {
"serial" : <serial number> , "serial" : <serial number> ,
"uuid" : <the UUID of the configuration that generated the crash log>, "uuid" : <the UUID of the configuration that generated the crash log>,
"loglines" : [ an array of strings representing the logs from the log file ] "loglines" : [ an array of strings representing the logs from the log file ]
} }
} }
``` ```
#### Reboot Log event
The device may send a `reboot log event` after a reboot. This maybe a scheduled reboot or caused in some other way.
```json
{ "jsonrpc" : "2.0" ,
"method" : "rebootLog" ,
"params" : {
"serial" : <serial number> ,
"uuid" : <the UUID of the configuration that generated the reboot log>,
"date" : <Unix time when this reboot occurred>,
"type" : <string>,
"info" : [ "info 1", "info 2"]
}
}
```
Here is a possible list of reboot reasons:
#### Config change pending event #### Config change pending event
Device sends this message to tell the controller that the device 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 has received a configuration but is still running an older configuration. The controller will not
@@ -193,7 +258,7 @@ venue where this device belongs and resend the same message to all other devices
"params" : { "params" : {
"serial" : <serial number> , "serial" : <serial number> ,
"timestamp" : <the UTC timestamp when the message was sent>, "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> "data" : <JSON document to broadcast>
} }
} }
``` ```
@@ -298,7 +363,8 @@ Controller sends this command when it believes the device should upgrade its fir
"params" : { "params" : {
"serial" : <serial number> , "serial" : <serial number> ,
"when" : Optional - <UTC time when to upgrade the firmware, 0 mean immediate, this is a suggestion>, "when" : Optional - <UTC time when to upgrade the firmware, 0 mean immediate, this is a suggestion>,
"uri" : <URI to download the firmware> "uri" : <URI to download the firmware>,
"FWsignature" : <string representation of the signature for the FW> (optional)
}, },
"id" : <some number> "id" : <some number>
} }
@@ -318,6 +384,13 @@ The device should answer:
"id" : <same number> "id" : <same number>
} }
``` ```
Here are the error values
```text
0: No error
1: Bad firmware
2: Missing signature
```
#### Controller wants the device to perform a factory reset #### Controller wants the device to perform a factory reset
Controller sends this command when it believes the device should upgrade its firmware. Controller sends this command when it believes the device should upgrade its firmware.
@@ -423,44 +496,6 @@ The device should answer:
- 1 : device cannot flash LEDs because it does not have any. - 1 : device cannot flash LEDs because it does not have any.
- 2 : device rejects the request. `text` should include information as to why. - 2 : device rejects the request. `text` should include information as to why.
#### 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" : {
"serial" : <serial number> ,
"when" : Optional - <UTC time when to perform this command, 0 mean immediate, this is a suggestion>,
"command" : <this is device specific and is TEXT only>,
"payload" : <JSON Document: containing additional information about the command>
},
"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>,
"when" : <in UTC time in seconds>,
"resultCode" : <0 or an appropriate error code>,
"resultText" : <any text resulting from the command. This is propietary to each command>
}
},
"id" : <same number>
}
```
##### The device answer
The device should answer with teh above message. The `error` value should be interpreted the following way:
- 0 : the command was performed as requested and the reults of the command is available in the `resultCode` and `resultText` parameters.
- 1 : the command will be performed in the future and `when` shows that time. The `resultCode` and `resultText` dod not contain anything relevant.
- 2 : the command cannot be performed as indicated. `resultCode` and `resultText` may contain some indication as to why.
#### Controller wants the device to perform a trace #### Controller wants the device to perform a trace
Controller sends this command when it needs the device to perform a trace (i.e. tcpdump). Controller sends this command when it needs the device to perform a trace (i.e. tcpdump).
```json ```json
@@ -711,9 +746,11 @@ Controller sends this command to run a predefined script. Extreme care must be t
"method" : "script" , "method" : "script" ,
"params" : { "params" : {
"serial" : <serial number>, "serial" : <serial number>,
"type" : <one of "shell", "ucode">, "type" : <one of "shell", "ucode", "bundle">,
"script" : <text blob containing the script>, "script" : <text blob containing the script, This must be vase64 encoded>,
"timeout" : <max timeout in seconds, default is 30>, "timeout" : <max timeout in seconds, default is 30, unused if URI is supplied>,
"uri": "<upload script results using this URI>",
"signature" : "<signature for script>: must be supplied to restricted devices",
"when" : <time when this will be performed as UTC seconds> "when" : <time when this will be performed as UTC seconds>
}, },
"id" : <some number> "id" : <some number>

611
README.md
View File

@@ -1,220 +1,36 @@
# uCentralGW <p align="center">
<img src="images/project/logo.svg" width="200" alt="OpenWiFi Project"/>
</p>
## What is this? # OpenWiFI Gateway (OWGW)
The uCentralGW is an added service for the TIP controller that allows integration with the
uCentral protocol. It supports a complete OpenAPI definition and uses the ucentral communication protocol. To use the uCentralGW, ## What is it?
you either need to [build it](#building) or use the [Docker version](#docker). The OpenWiFi Gateway is a service for the TIP OpenWiFi CloudSDK (OWSDK).
OWGW manages Access Points that implement the OpenWiFi uCentral protocol. OWGW, like all other OWSDK microservices, is
defined using an OpenAPI definition and uses the ucentral communication protocol to interact with Access Points. To use
the OWGW, you either need to [build it](#building) or use the [Docker version](#docker).
## Building ## Building
In order to build the uCentralGW, you will need to install its dependencies, which includes the following: To build the microservice from source, please follow the instructions in [here](./BUILDING.md)
- cmake
- boost
- POCO 1.10.1 or later
- a C++17 compiler
- 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 ## Docker
framework is called [Poco](https://github.com/pocoproject/poco). The version used in this project has a couple of fixes To use the CLoudSDK deployment please follow [here](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy)
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
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/AriliaWireless/poco --branch poco-tip-v1
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1
cd cppkafka
mkdir cmake-build
cd cmake-build
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
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
mkdir cmake-build
cd cmake-build
cmake ..
make -j 8
```
### Fedora
The following instructions have proven to work on Fedora 33
```
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 json-devel
git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1
cd cppkafka
mkdir cmake-build
cd cmake-build
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
mkdir cmake-build
cd cmake-build
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/).
```
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 librdkafka
brew install nlohmann-json
git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1
cd cppkafka
mkdir cmake-build
cd cmake-build
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
mkdir cmake-build
cd cmake-build
cmake ..
make -j
```
### Raspberry
The build on a rPI takes a while. You can shorten that build time and requirements by disabling all the larger database
support. You can build with only SQLite support by not installing the packages for ODBC, PostgreSQL, and MySQL by
adding -DSMALL_BUILD=1 on the cmake build line.
```
sudo apt install git cmake g++ libssl-dev libaprutil1-dev apache2-dev libboost-all-dev libyaml-cpp-dev
git clone https://github.com/stephb9959/poco
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
cd wlan-cloud-ucentralgw
mkdir cmake-build
cd cmake-build
cmake -DSMALL_BUILD=1 ..
make
```
### After completing the build
After completing the build, you can remove the Poco source as it is no longer needed.
#### Expected directory layout #### Expected directory layout
From the directory where your cloned source is, you will need to create the `certs`, `logs`, and `uploads` directories. From the directory where your cloned source is, you will need to create the `certs`, `logs`, and `uploads` directories.
```shell ```bash
mkdir certs mkdir certs
mkdir certs/cas mkdir certs/cas
mkdir logs mkdir logs
mkdir uploads mkdir uploads
``` ```
You should now have the following: You should now have the following:
```text
``` --+-- certs
-- cert_scripts
|
+-- certs
| +--- cas | +--- cas
+-- cmake +-- cmake
+-- cmake-build +-- cmake-build
+-- logs (dir) +-- logs
+-- src +-- src
+-- test_scripts +-- test_scripts
+-- openapi +-- openapi
@@ -223,12 +39,16 @@ You should now have the following:
``` ```
### Certificates ### Certificates
Love'em of hate'em, we gotta use'em. So we tried to make this as easy as possible for you. The OWGW uses a number of certificates to provide security. There are 2 types of certificates required for
a normal deployment:
- A Server Certificate to secure the OWGW<->AP channel
- A REST API Certificate to secure the Northbound API
- Device Certificates
#### The `certs` directory #### The `certs` directory
For all deployments, you will need the following certs directory, populated with the proper files. For all deployments, you will need the following certs directory, populated with the proper files.
```asm ```text
certs ---+--- root.pem certs ---+--- root.pem
+--- issuer.pem +--- issuer.pem
+--- websocket-cert.pem +--- websocket-cert.pem
@@ -243,183 +63,69 @@ certs ---+--- root.pem
``` ```
#### DigiCert files #### DigiCert files
These are the files you should install on your gateway and devices. For your gateway, you will need to provide tge following files in the directory above These are the files you should install on your OWGW and devices. For your OWGW, you will need to provide tge following files in the directory above
- `root.pem` is [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/root.pem). - `root.pem` is [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/root.pem).
- `issuer.pem` is [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/issuer.pem). - `issuer.pem` is [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/issuer.pem).
- `clientcas.pem` is [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/clientcas.pem). - `clientcas.pem` is [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/clientcas.pem).
#### Gateway certificates: TIP portion (* must be obtained from TIP) #### OWGW Server certificate (must be obtained from TIP)
The gateway requires its own DigiCert certificate. Once obtained, you need to identify the `key` and the `certificate` rename The gateway requires its own DigiCert certificate. Once obtained, you need to identify the `key` and the `certificate` rename
them `websocket-key.pem` and `websocket-cert.pem`, and copy them in your `certs` directory. These files mus be obtained from TIP. them `websocket-key.pem` and `websocket-cert.pem`, and copy them in your `certs` directory. These files mus be obtained from TIP.
#### Gateway certificates: for REST API #### OWGW for certificate: for REST API (from your favourite Certificate Provider)
The gateway requires a key/vertificate/ca for the REST interface. These files you need to obtain on your own of generate them. This is beyond the scope of this The gateway requires a key/certificate/ca for the REST interface. These files you need to obtain on your own or generate them. This is beyond the scope of this
document. Once you have these files, you need to renamed them `restapi-key.pem`, `restapi-cert.pem`, and `restapi-ca.pem`. This will guarantee proper HTTPS document. You, may choose to select LestEncrypt or any other Certificate Authority. Once you have these files, you need to renamed them `restapi-key.pem`, `restapi-cert.pem`, and `restapi-ca.pem`.
in your browner This will guarantee proper HTTPS in your browser and RESTAPI.
#### Configuration ### OpenWiFi Device certificates
The configuration for this service is kept in a properties file. This file is called `owgw.properties` and you can This may have already done at the factory. If not, you will need to get the following in order to point your devices to use the OWGW:
see the latest version [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/owgw.properties). The file will be loaded from
the directory set by the environment variable `UCENTRALGW_CONFIG`. To use environment variables in the configuration,
you must use `$<varname>`. Only `path names` support the use of environment variables. The sample configuration requires very
little changes if you keep the suggested directory structure. For the sample configuration to work, you need to define 2
environment variables.
```
export OWGW_ROOT=`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.
##### Important config entries
###### This is the logging directory
```
logging.channels.c2.path = $OWGW_ROOT/logs/sample.log
```
###### This is the type of storage in use
```asm
storage.type = sqlite
```
###### Autoprovisioning settings
```asm
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
```
###### This is the RESTAPI endpoint
```asm
openwifi.restapi.host.0.backlog = 100
openwifi.restapi.host.0.security = relaxed
openwifi.restapi.host.0.rootca = $OWGW_ROOT/certs/restapi-ca.pem
openwifi.restapi.host.0.address = *
openwifi.restapi.host.0.port = 16002
openwifi.restapi.host.0.cert = $OWGW_ROOT/certs/restapi-cert.pem
openwifi.restapi.host.0.key = $OWGW_ROOT/certs/restapi-key.pem
openwifi.restapi.host.0.key.password = mypassword
```
##### This is the end point for the devices to connect with
This is the crucial section. I bet that 97.4% of all your problems will come from here, and it's boring. So put some good music on,
give the kids the iPad, get a cup of coffee, and pay attention. Every field will be explained.
###### ucentral.websocket.host.0.backlog
This is the number of concurrent devices you are expecting to call all at once. Not the current number of devices. This is how many will connect in the same exact second.
Take the total number of devices you have and divide by 100. That's a good rule of thumb. Never go above 500.
###### ucentral.websocket.host.0.rootca
This is the root file as supplied by Digicert. You can find it [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/root.pem)
###### ucentral.websocket.host.0.issuer
This is the issuer file as supplied by Digicert. You can find it [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/issuer.pem)
###### ucentral.websocket.host.0.cert
This is a `pem` file that you will receive from Digicert for the gateway itself. This is the certificate for the gateway.
###### ucentral.websocket.host.0.key
This is a `pem` file that you will receive from Digicert for the gateway itself. The is the private key for the gateway.
###### ucentral.websocket.host.0.clientcas
This is a `pem` file that contains both the issuer and the root CA certificates. You can find it You can find it [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/clientcas.pem)
###### ucentral.websocket.host.0.cas
This is a directory where you will copy your own `cert.pem`, the `root.pem`, and the `issuer.pem` files.
###### ucentral.websocket.host.0.address
Leve this a `*` in teh case you want to bind to all interfaces on your gateway host or select the address of a single interface.
###### ucentral.websocket.host.0.port
Leave to 15002 for now.
###### ucentral.websocket.host.0.security
Leave this as strict for now for devices.
###### ucentral.websocket.host.0.key.password
If you key file uses a password, please enter it here.
###### ucentral.websocket.maxreactors
A single reactor can handle between 1000-2000 devices. Never leave this smaller than 5 or larger than 50.
#### Conclusion
You will need to get the `cert.pem` and `key.pem` from Digicert. The rest is here.
```asm
ucentral.websocket.host.0.backlog = 500
ucentral.websocket.host.0.rootca = $OWGW_ROOT/certs/root.pem
ucentral.websocket.host.0.issuer = $OWGW_ROOT/certs/issuer.pem
ucentral.websocket.host.0.cert = $OWGW_ROOT/certs/websocket-cert.pem
ucentral.websocket.host.0.key = $OWGW_ROOT/certs/websocket-key.pem
ucentral.websocket.host.0.clientcas = $OWGW_ROOT/certs/clientcas.pem
ucentral.websocket.host.0.cas = $OWGW_ROOT/certs/cas
ucentral.websocket.host.0.address = *
ucentral.websocket.host.0.port = 15002
ucentral.websocket.host.0.security = strict
ucentral.websocket.host.0.key.password = mypassword
ucentral.websocket.maxreactors = 20
```
###### This is the end point for the devices when uploading files
```asm
openwifi.fileuploader.host.0.backlog = 100
openwifi.fileuploader.host.0.rootca = $OWGW_ROOT/certs/restapi-ca.pem
openwifi.fileuploader.host.0.security = relaxed
openwifi.fileuploader.host.0.address = *
openwifi.fileuploader.host.0.name = 192.168.1.176
openwifi.fileuploader.host.0.port = 16003
openwifi.fileuploader.host.0.cert = $OWGW_ROOT/certs/restapi-cert.pem
openwifi.fileuploader.host.0.key = $OWGW_ROOT/certs/restapi-key.pem
openwifi.fileuploader.host.0.key.password = mypassword
openwifi.fileuploader.path = $OWGW_ROOT/uploads
openwifi.fileuploader.maxsize = 10000
```
###### host.0.address entries
If you want to limit traffic to a specific interface, you should specify the IP address of that interface instead of
the `*`. Using the `*` means all interfaces will be able to accept connections. You can add multiple interfaces
by changing the `0` to another index. You need to repeat the whole configuration block for each index. Indexes must be sequential
start at `0`.
###### openwifi.fileuploader.host.0.name
This must point to the IP or FQDN of your uCentralGW.
#### Running the gateway
Tu run the gateway, you must run the executable `ucentralgw`. You can use several command line options to run as a daemon or specify the configuration file location.
#### Device configuration
Once you have the gateway configured, you will need to have some devices coming to it. For now, you will need to get
the following in order to use the gateway:
- A DigiCert certificate that you will call `cert.pem` - A DigiCert certificate that you will call `cert.pem`
- A DigiCert key that goes with that certificate. Please call this `key.pem` - A DigiCert key that goes with that certificate. Please call this `key.pem`
- The Digicert root certificate that you will find [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/root.pem). You must copy `root.pem` - The Digicert root certificate that you will find [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/certificates/root.pem). You must copy `root.pem`
and rename it `cas.pem` on the device. and rename it `cas.pem` on the device.
- A Device ID file called `dev-id` or something similar - A Device ID file called `dev-id` or something similar
- Copy all the 4 files to the `/certificates` directory of the AP (you must have firmware created Jun 15th or later). - Copy all the 4 files to the `/certificates` directory of the AP (you must have firmware created Jun 15th or later).
You will need to upgrade your device to the latest firmware. Once updated, you will need to copy the 4 files mentioned above in You will need to upgrade your device to the latest firmware. Once updated, you will need to copy the 4 files mentioned above in
the `/certificates` directory. Please remove all old keys or certificates from the `/etc/ucentral` directory the `/certificates` directory. Please remove all old keys or certificates from the `/etc/ucentral` directory
(anything ending in `.pem`). (anything ending in `.pem`).
#### Server key entry ### Environment variables
The gateway needs to encrypt information from time to time. In order to do so, it must have a crypto key. This key The following environment variables should be set from the root directory of the service. They tell the OWGW process where to find
can be any of the keys you are already using. You must keep that keep secret and always use it. In the configutation, the configuration and the root directory.
this is the entry ```bash
export OWGW_ROOT=`pwd`
```asm export OWGW_CONFIG=`pwd`
openwifi.service.key = $OWGW_ROOT/certs/websocket-key.pem
``` ```
You can run the shell script `set_env.sh` from the microservice root.
#### Command line options
### OWGW Service Configuration
The configuration is kept in a file called `owgw.properties`. To understand the content of this file,
please look [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/CONFIGURATION.md)
### Running the OWGW
Tu run the OWGW, you must run the executable `owgw`. You can use several command line options to run as a daemon or
specify the configuration file location.
### systemd: owgw.service
`owgw.service` is a skeleton to allow to run the OWGW in a systemd based operating system (i.e. Debian). You will need
to modify slightly to reflect your environment.
### Default device configuration
By default, the devices will receive a built-in default configuration. This built-in default configuration is probably not what you need.
So there are 2 options in order to specify your own default configuration:
- In the OWGW data directory, you can create a `default_config.json` file that contains your own personal configuration
- Using the OWGW UI, on the left hand pane, there is a `configurations` choice. There you can do the same but apply it with more granularity ot each device type
you may be deploying.
### Command line options
The current implementation supports the following. If you use the built-in configuration file, you do not need to use any command-line The current implementation supports the following. If you use the built-in configuration file, you do not need to use any command-line
options. However, you may decide to use the `--daemon` or `umask` options. options. However, you may decide to use the `--daemon` or `umask` options.
```bash ```bash
./ucentralgw --help ./owgw --help
usage: ucentralgw OPTIONS usage: owgw OPTIONS
A uCentral gateway implementation for TIP. A owgw gateway implementation for TIP.
--daemon Run application as a daemon. --daemon Run application as a daemon.
--umask=mask Set the daemon's umask (octal, e.g. 027). --umask=mask Set the daemon's umask (octal, e.g. 027).
@@ -430,119 +136,27 @@ A uCentral gateway implementation for TIP.
--logs=dir specify the log directory and file (i.e. dir/file.log) --logs=dir specify the log directory and file (i.e. dir/file.log)
``` ```
##### file #### file
This allows you to point to another file without specifying the UCENTRALGW_CONFIG variable. The file name must end in `.properties`. This allows you to point to another file without specifying the OWGW_CONFIG variable. The file name must end in `.properties`.
##### daemon #### daemon
Run this as a UNIX service Run this as a UNIX service
##### pidfile #### pidfile
When running as a daemon, the pid of the running service will be set in the speficied file When running as a daemon, the pid of the running service will be set in the speficied file
##### debug #### debug
Run the service in debug mode. Run the service in debug mode.
##### logs #### logs
Speficy where logs should be kept. You must include an existing directory and a file name. For example `/var/ucentral/logs/log.0`. Speficy where logs should be kept. You must include an existing directory and a file name. For example `/var/ucentral/logs/log.0`.
##### umask #### umask
Seet the umask for the running service. Seet the umask for the running service.
### ALB Support ## Docker
Support for AWS ALB is provided through the following configuration elements If you would rather launch the docker-compose or helm for the controller, please click [here](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy).
```asm
alb.enable = true
alb.port = 16102
```
### Docker
So building this thing from scratch is not your thing? I can't blame you. It takes some patience and
in the end, there's still more work. Here comes `docker` to the rescue. You can run a docker version following
these instructions. The following is the content of the `docker_run.sh` script you can find
[here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/docker_run.sh):
```bash
#!/bin/sh
HUBNAME=tip-tip-wlan-cloud-ucentral.jfrog.io
IMAGE_NAME=ucentralgw
DOCKER_NAME=$HUBNAME/$IMAGE_NAME
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 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 owgw.properties is missing in the current directory"
exit 2
fi
docker run -d -p 15002:15002 \
-p 16002:16002 \
-p 16003:16003 \
--init \
--volume="$PWD:/ucentral-data" \
-e UCENTRAL_ROOT="/ucentral-data" \
-e UCENTRALGW_CONFIG="/ucentral-data" \
--name="ucentralgw" $DOCKER_NAME
```
Create yourself a directory and copy that script which you can also get from [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/docker_run.sh).
You must have the basic configuration file copied in the directory. This file must be called `owgw.properties`. You can bring your own or
copy it from [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/owgw.properties). Please look at [this](#certificates-with-docker) to have the right
certificates. You need to make sure that the names match the content of the `owgw.properties`
file. Once all this is done, you can simply run `docker_run.sh`.
#### Docker installation directory layout
Here is the layout expected for your Docker installation
```asm
Run-time root
|
----- certs (same as above)
+---- logs (dir)
+---- uploads (dir)
+---- owgw.properties (file)
```
#### `owgw.properties` for Docker
If you use the pre-made configuration file, and you follow the directory layout, the only line you must change
is the following line:
```asm
openwifi.fileuploader.host.0.name = 192.168.1.176
```
This line should reflect the IP of your gateway or its FQDN. You must make sure that this name or IP is accessible
from your devices. This is used during file uploads from the devices.
#### Certificates with Docker
Please refer to the `certs` directory from the sections above.
#### Configuration with Docker
The configuration for this service is kept in a properties file. Currently, this configuration file must be kept in the
current directory of uCentral or one level up. This file is called `owgw.properties` and you can see the latest version
[here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/owgw.properties). The file will be loaded from
the directory set by the environment variable `UCENTRALGW_CONFIG`. To use environment variables in the configuration,
you must use `$<varname>`. The path for the logs for the service must exist prior to starting the
service. The path is defined under `logging.channels.c2.path`. Only `path names` support the use of
environment variables. Here is a sample configuration:
## uCentral communication protocol ## uCentral communication protocol
The communication protocol between the device and the controller is detailed in this [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/PROTOCOL.md). The communication protocol between the device and the OGWG is detailed in this [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/PROTOCOL.md).
## OpenAPI ## OpenAPI
The service supports an OpenAPI REST based interface for management. You can find the [definition here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/openapi/ucentral/owgw.yaml). The OWGW supports an OpenAPI REST based interface for management. You can find the [definition here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/openapi/ucentral/owgw.yaml).
And here is [how to use it](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/OPENAPI.md) And here is [how to use it](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/OPENAPI.md)
## Using the API ## Using the API
@@ -552,58 +166,31 @@ or [python](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/ma
More scripts will be added in the future. More scripts will be added in the future.
## Firewall Considerations ## Firewall Considerations
- The protocol uses TCP port 15002 between the devices and the gateway. This port must be opened. | Port | Description | Configurable |
- Devices use the TCP port 16003 to upload files. This port is configurable in the `owgw.properties` file. Look for `openwifi.fileuploader.host.0.port`. | :--- | :--- |:------------:|
- The RESTAPI is accessed through TCP port 16002 by default. This port is configurable in the `owgw.properties` file. Look for the entry `openwifi.restapi.host.0.port`. | 15002 | Default port from the devices to the OWGW | yes |
| 16002 | Default port for REST API Access to the OWGW | yes |
| 5912 | Default port for RTTY connection | yes |
| 5913 | Defailt port for RTTY connection | yes |
## Kafka integration ## Kafka topics
So what about Kafka? Well, the gateway has basic integration with Kafka. It is turned off by default, to turn it on, in the configuration:
```asm
openwifi.kafka.enable = false
openwifi.kafka.brokerlist = 127.0.0.1:9092
openwifi.kafka.commit = false
openwifi.kafka.queue.buffering.max.ms = 50
```
#### `openwifi.kafka.enable`
Kind of obvious but hey, set `true` or `false`. Default is `false`
#### `openwifi.kafka.brokerlist`
This is a comma separator list of the brokers in your `kafka` deployment.
#### Kafka topics
Toe read more about Kafka, follow the [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/KAFKA.md) Toe read more about Kafka, follow the [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/KAFKA.md)
#### Securing `kafka` ## Contributions
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. We need more contributors. Should you wish to contribute,
please follow the [contributions](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/CONTRIBUTING.md) document.
#### `iptocountry` feature ## Pull Requests
In the UI, you will notice the presence of small flags showing where the device connections are from. This feature is Please create a branch with the Jira addressing the issue you are fixing or the feature you are implementing.
available through the `iptocountry` settings in the configuration. This feature is then also available through the `OpenAPI` for the CLI Create a pull-request from the branch into master.
and other applications.
##### Config file entries ## Additional OWSDK Microservices
In the configuration file, you must include the following lines: Here is a list of additional OWSDK microservices
| Name | Description | Link | OpenAPI |
```asm | :--- | :--- | :---: | :---: |
iptocountry.default = US | OWSEC | Security Service | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralsec) | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml) |
iptocountry.provider = ipinfo | OWGW | Controller Service | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw) | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/openapi/owgw.yaml) |
#iptocountry.provider = ipdata | OWFMS | Firmware Management Service | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralfms) | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralfms/blob/main/openapi/owfms.yaml) |
#iptocountry.provider = ipdata | OWPROV | Provisioning Service | [here](https://github.com/Telecominfraproject/wlan-cloud-owprov) | [here](https://github.com/Telecominfraproject/wlan-cloud-owprov/blob/main/openapi/owprov.yaml) |
iptocountry.ipinfo.token = | OWANALYTICS | Analytics Service | [here](https://github.com/Telecominfraproject/wlan-cloud-analytics) | [here](https://github.com/Telecominfraproject/wlan-cloud-analytics/blob/main/openapi/owanalytics.yaml) |
#ip2location.ipinfo.token = | OWSUB | Subscriber Service | [here](https://github.com/Telecominfraproject/wlan-cloud-userportal) | [here](https://github.com/Telecominfraproject/wlan-cloud-userportal/blob/main/openapi/userportal.yaml) |
#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.
Feel free to ask questions and post issues.

82
RESTRICTED_DEVICES.md Normal file
View File

@@ -0,0 +1,82 @@
# Restricted devices
## What is a restricted device?
A restricted device is one that because of regulations or a desire for utmost security, requires signatures to access restricted or blocked
features. The restriction process is burnt in the device at manufacturing or later by running a specific command on the device. Once a device
is restricted, it cannot be unlocked.
## Current restrictions
Restrictions are stored on the AP in a protected partition. They are contained in a file called `restrictions.json`. Here is a sample:
```json
{
"country": [
"US", "CA"
],
"dfs": true,
"rtty": true,
"tty": true,
"developer": true,
"sysupgrade": true,
"commands": true,
"key_info": {
"vendor": "dummy",
"algo": "static"
}
}
```
- country
- List of countries where this device may be used
- dfs
- Disallow DFS Override during wifi-scan. If set to `true`, device will not allow to override DFS channels
- rtty
- Disallow the use of the RTTY command for this device
- tty
- Do not allow the AP to accept `tty` connection
- developer
- Internal use only.
- sysupgrade
- If set to `true`, only signed firmware upgrade command will be allowed.
- commands
- If set to `true`, do not allow commands.
- key_info
- This structure defines how signatures should be generated and verified in a secure system
- vendor
- An identified that must match the vendor name provided in the controller
- algo
- The signature algorithm. Here are the supported algorithms
- `static`
- A test algorithm that always returns and uses a value of `aaaaaaaaaa`. This should never be used in the field.
- `dgst-sha256`
- The default OpenSSL RSA signature generation and verification. The controller will use the following command to generate the signature
```sh
openssl dgst -sha256 -sign private-key.pem -out signature.txt myfile
```
- The AP will be using the following to verify the signature
```sh
openssl dgst -sha256 -verify public-key.pem -signature signature.txt myfile
```
## Creating signatures on the controller
When a device is restricted and a signature is required, the controller can generate the signature
for the specified `vendor`. However, on the controlelr side, you must configure the vendors. In
order to do so we suggest the following.
- Create a directory called `signatures` under your `certs` directory
- Copy the public and private keys for each `vendor` name. We suggest naming them accordingly
- `vendor`-private-key.pem
- `vendor`-public-key.pem
- In the `owgw.properties` file, you need to declare these signatures the following way
```properties
signature.manager.0.key.public = $OWGW_ROOT/certs/signatures/test1-public-key.pem
signature.manager.0.key.private = $OWGW_ROOT/certs/signatures/test1-private-key.pem
signature.manager.0.vendor = test1
signature.manager.1.key.public = $OWGW_ROOT/certs/signatures/test2-public-key.pem
signature.manager.1.key.private = $OWGW_ROOT/certs/signatures/test2-private-key.pem
signature.manager.1.vendor = test2
```
## How do you use the signatures?
There is nothing to do really. Now the controller will use the proper key to create the signatures
when it sends commands to the AP. It will use the algorithm that the device understands too. This is transparent
to the user. The `vendor` name used in the controller configuration must match the `vendor` name provided in the
`restrictions.json` file.

View File

View File

View File

View File

@@ -0,0 +1,36 @@
scripts:
- name: List Antennas
description: A script to list all antennas on a device
type: shell
runtype:
timeout: 30
filename: listantennas.sh
readme: listantennas.md
help: https://authors.com/scripts/index.html
- name: List AP Noise
description: A script to list all noise values on all APs
type: shell
runtype:
deferred: true
filename: listnoise.sh
readme: listnoise.md
help: https://authors.com/scripts/index.html
- name: Reset AP Statistics
description: A script to reset the statistics on a given AP
type: shell
runtype:
timeout: 30
filename: resetstats.sh
readme: resetstats.md
help: https://authors.com/scripts/index.html
- name: Gather kernel stats
description: A script to all the kernel stats for an AP
type: bundle
runtype:
deferred: true
filename: kstats.uci
readme: kstats.md
help: https://authors.com/scripts/index.html

View File

View File

View File

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

View File

@@ -0,0 +1,2 @@
#!/bin/sh

View File

View File

@@ -0,0 +1,2 @@
#!/bin/sh

1
ap_scripts/README.md Normal file
View File

@@ -0,0 +1 @@
# Repo for scripts

2
build
View File

@@ -1 +1 @@
125 64

View File

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

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,4 +1,4 @@
#!/bin/sh #!/bin/bash
set -e set -e
if [ "$SELFSIGNED_CERTS" = 'true' ]; then if [ "$SELFSIGNED_CERTS" = 'true' ]; then
@@ -73,6 +73,9 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
STORAGE_TYPE_MYSQL_PASSWORD=${STORAGE_TYPE_MYSQL_PASSWORD:-"owgw"} \ STORAGE_TYPE_MYSQL_PASSWORD=${STORAGE_TYPE_MYSQL_PASSWORD:-"owgw"} \
STORAGE_TYPE_MYSQL_DATABASE=${STORAGE_TYPE_MYSQL_DATABASE:-"owgw"} \ STORAGE_TYPE_MYSQL_DATABASE=${STORAGE_TYPE_MYSQL_DATABASE:-"owgw"} \
STORAGE_TYPE_MYSQL_PORT=${STORAGE_TYPE_MYSQL_PORT:-"3306"} \ STORAGE_TYPE_MYSQL_PORT=${STORAGE_TYPE_MYSQL_PORT:-"3306"} \
CERTIFICATES_ALLOWMISMATCH=${CERTIFICATES_ALLOWMISMATCH:-"false"} \
IPINFO_DEFAULT_COUNTRY=${IPINFO_DEFAULT_COUNTRY:-"US"} \
DEVICE_SESSION_TIMEOUT=${DEVICE_SESSION_TIMEOUT:-"600"} \
envsubst < /owgw.properties.tmpl > $OWGW_CONFIG/owgw.properties envsubst < /owgw.properties.tmpl > $OWGW_CONFIG/owgw.properties
fi fi
@@ -95,7 +98,7 @@ if [ "$1" = '/openwifi/owgw' -a "$(id -u)" = '0' ]; then
if [ "$RUN_CHOWN" = 'true' ]; then if [ "$RUN_CHOWN" = 'true' ]; then
chown -R "$OWGW_USER": "$OWGW_ROOT" "$OWGW_CONFIG" chown -R "$OWGW_USER": "$OWGW_ROOT" "$OWGW_CONFIG"
fi fi
exec su-exec "$OWGW_USER" "$@" exec gosu "$OWGW_USER" "$@"
fi fi
exec "$@" 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

@@ -9,7 +9,7 @@ fullnameOverride: ""
images: images:
owgw: owgw:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
tag: master tag: v2.10.0
pullPolicy: Always pullPolicy: Always
# regcred: # regcred:
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io # registry: tip-tip-wlan-cloud-ucentral.jfrog.io
@@ -43,6 +43,7 @@ services:
rttys: rttys:
servicePort: 5912 servicePort: 5912
targetPort: 5912 targetPort: 5912
protocol: TCP
rttys-view: rttys-view:
servicePort: 5913 servicePort: 5913
targetPort: 5913 targetPort: 5913
@@ -138,7 +139,7 @@ resources: {}
# memory: 128Mi # memory: 128Mi
securityContext: securityContext:
fsGroup: 101 fsGroup: 1000
# Usage of unsafe sysctls requires multiple things: # Usage of unsafe sysctls requires multiple things:
# - allow these unsafe sysctls on kubelet level (by adding --allowed-unsafe-sysctls flag) # - allow these unsafe sysctls on kubelet level (by adding --allowed-unsafe-sysctls flag)
# - enabling addition of PodSecurityContext setting podSecurityPolicy.enabled to "true" below # - enabling addition of PodSecurityContext setting podSecurityPolicy.enabled to "true" below
@@ -230,6 +231,7 @@ configProperties:
openwifi.devicetypes.0: AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi openwifi.devicetypes.0: AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
openwifi.devicetypes.1: SWITCH:edgecore_ecs4100-12ph openwifi.devicetypes.1: SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2: IOT:esp32 openwifi.devicetypes.2: IOT:esp32
openwifi.certificates.allowmismatch: "false"
oui.download.uri: https://standards-oui.ieee.org/oui/oui.txt oui.download.uri: https://standards-oui.ieee.org/oui/oui.txt
firmware.autoupdate.policy.default: auto firmware.autoupdate.policy.default: auto
iptocountry.provider: ipinfo iptocountry.provider: ipinfo

BIN
images/project/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

165
images/project/logo.svg Normal file
View File

@@ -0,0 +1,165 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 141.5 185.6" style="enable-background:new 0 0 141.5 185.6;" xml:space="preserve">
<style type="text/css">
.st0{fill:#414141;}
.st1{fill:#FFFFFF;}
.st2{fill:#FED206;}
.st3{fill:#EB6F53;}
.st4{fill:#3BA9B6;}
</style>
<g>
<g>
<path class="st0" d="M120.7,183.9H21.5c-10.8,0-19.5-8.7-19.5-19.5V20.5c0-10.8,8.7-19.5,19.5-19.5h99.2
c10.8,0,19.5,8.7,19.5,19.5v143.9C140.2,175.2,131.5,183.9,120.7,183.9z"/>
<g>
<g>
<g>
<path class="st1" d="M46.3,166.2v-3.4h-1.2v-0.6h3.1v0.6H47v3.4H46.3z"/>
</g>
<g>
<path class="st1" d="M49,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H49z"/>
</g>
<g>
<path class="st1" d="M52.6,166.2v-4h0.7v3.4h1.8v0.6H52.6z"/>
</g>
<g>
<path class="st1" d="M55.7,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H55.7z"/>
</g>
<g>
<path class="st1" d="M59.1,164.2c0-1.2,0.9-2.1,2.1-2.1c0.8,0,1.3,0.4,1.6,0.9l-0.6,0.3c-0.2-0.3-0.6-0.6-1-0.6
c-0.8,0-1.4,0.6-1.4,1.4c0,0.8,0.6,1.4,1.4,1.4c0.4,0,0.8-0.3,1-0.6l0.6,0.3c-0.3,0.5-0.8,0.9-1.6,0.9
C60,166.3,59.1,165.5,59.1,164.2z"/>
</g>
<g>
<path class="st1" d="M63.2,164.2c0-1.2,0.8-2.1,2-2.1c1.2,0,2,0.9,2,2.1c0,1.2-0.8,2.1-2,2.1C64,166.3,63.2,165.4,63.2,164.2z
M66.5,164.2c0-0.8-0.5-1.4-1.3-1.4c-0.8,0-1.3,0.6-1.3,1.4c0,0.8,0.5,1.4,1.3,1.4C66,165.7,66.5,165,66.5,164.2z"/>
</g>
<g>
<path class="st1" d="M71.3,166.2v-3.1l-1.2,3.1h-0.3l-1.2-3.1v3.1h-0.7v-4h1l1.1,2.7l1.1-2.7h1v4H71.3z"/>
</g>
<g>
<path class="st1" d="M75.7,166.2v-4h0.7v4H75.7z"/>
</g>
<g>
<path class="st1" d="M80.4,166.2l-2.1-2.8v2.8h-0.7v-4h0.7l2,2.8v-2.8h0.7v4H80.4z"/>
</g>
<g>
<path class="st1" d="M82.3,166.2v-4H85v0.6h-2v1h2v0.6h-2v1.7H82.3z"/>
</g>
<g>
<path class="st1" d="M87.9,166.2l-0.9-1.5h-0.7v1.5h-0.7v-4h1.7c0.8,0,1.3,0.5,1.3,1.2c0,0.7-0.5,1.1-0.9,1.2l1,1.6H87.9z
M88,163.5c0-0.4-0.3-0.6-0.7-0.6h-1v1.3h1C87.7,164.1,88,163.9,88,163.5z"/>
</g>
<g>
<path class="st1" d="M92.4,166.2l-0.3-0.8h-1.8l-0.3,0.8h-0.8l1.6-4h0.9l1.6,4H92.4z M91.2,162.9l-0.7,1.9h1.4L91.2,162.9z"/>
</g>
<g>
<path class="st1" d="M95.8,166.2v-4h1.5c0.8,0,1.2,0.5,1.2,1.2c0,0.6-0.4,1.2-1.2,1.2h-1.2v1.7H95.8z M98.2,163.4
c0-0.5-0.3-0.9-0.9-0.9h-1.1v1.7h1.1C97.8,164.3,98.2,163.9,98.2,163.4z"/>
</g>
<g>
<path class="st1" d="M101.5,166.2l-1.1-1.6h-0.9v1.6h-0.3v-4h1.5c0.7,0,1.2,0.4,1.2,1.2c0,0.7-0.5,1.1-1.1,1.1l1.2,1.7H101.5z
M101.6,163.4c0-0.5-0.4-0.9-0.9-0.9h-1.1v1.7h1.1C101.2,164.3,101.6,163.9,101.6,163.4z"/>
</g>
<g>
<path class="st1" d="M102.8,164.2c0-1.2,0.8-2.1,1.9-2.1c1.2,0,1.9,0.9,1.9,2.1c0,1.2-0.8,2.1-1.9,2.1
C103.6,166.3,102.8,165.4,102.8,164.2z M106.3,164.2c0-1-0.6-1.7-1.6-1.7c-1,0-1.6,0.7-1.6,1.7c0,1,0.6,1.7,1.6,1.7
C105.7,166,106.3,165.2,106.3,164.2z"/>
</g>
<g>
<path class="st1" d="M106.9,165.8l0.2-0.3c0.2,0.2,0.4,0.4,0.8,0.4c0.5,0,0.9-0.4,0.9-0.9v-2.8h0.3v2.8c0,0.8-0.5,1.2-1.2,1.2
C107.5,166.3,107.2,166.1,106.9,165.8z"/>
</g>
<g>
<path class="st1" d="M110.4,166.2v-4h2.5v0.3h-2.2v1.5h2.1v0.3h-2.1v1.6h2.2v0.3H110.4z"/>
</g>
<g>
<path class="st1" d="M113.5,164.2c0-1.2,0.9-2.1,2-2.1c0.6,0,1.1,0.3,1.5,0.7l-0.3,0.2c-0.3-0.3-0.7-0.6-1.2-0.6
c-0.9,0-1.7,0.7-1.7,1.7c0,1,0.7,1.7,1.7,1.7c0.5,0,0.9-0.2,1.2-0.6l0.3,0.2c-0.4,0.4-0.8,0.7-1.5,0.7
C114.4,166.3,113.5,165.5,113.5,164.2z"/>
</g>
<g>
<path class="st1" d="M118.7,166.2v-3.7h-1.3v-0.3h2.9v0.3H119v3.7H118.7z"/>
</g>
</g>
<g>
<polygon class="st1" points="26.3,163.8 31.6,158.5 36.9,163.8 37.7,163.8 31.6,157.6 25.5,163.8 "/>
<polygon class="st1" points="36.9,164.7 31.6,170 26.3,164.7 25.5,164.7 31.6,170.8 37.7,164.7 "/>
<polygon class="st1" points="31,163.8 36.3,158.5 41.6,163.8 42.5,163.8 36.3,157.6 30.2,163.8 "/>
<polygon class="st1" points="41.6,164.7 36.3,170 31,164.7 30.2,164.7 36.3,170.8 42.5,164.7 "/>
</g>
</g>
<g>
<path class="st1" d="M33.2,100.7c-4.6,0-8.3,3.7-8.3,8.3s3.7,8.3,8.3,8.3s8.3-3.7,8.3-8.3S37.8,100.7,33.2,100.7z"/>
</g>
<g>
<g>
<g>
<path class="st2" d="M33.2,35.2c40.7,0,73.8,33.1,73.8,73.8c0,0.7,0,1.4,0,2.1c0,1.7,0.6,3.3,1.7,4.6c1.2,1.2,2.8,1.9,4.5,2
l0.2,0c3.5,0,6.3-2.7,6.4-6.2c0-0.8,0-1.7,0-2.5c0-47.7-38.8-86.6-86.6-86.6c-0.8,0-1.7,0-2.5,0c-1.7,0-3.3,0.8-4.5,2
c-1.2,1.2-1.8,2.9-1.7,4.6c0.1,3.5,3,6.3,6.6,6.2C31.8,35.2,32.5,35.2,33.2,35.2z"/>
</g>
</g>
</g>
<g>
<g>
<g>
<path class="st3" d="M33.2,60.5c26.7,0,48.5,21.7,48.5,48.5c0,0.6,0,1.3,0,2c-0.1,1.7,0.5,3.3,1.7,4.6c1.2,1.3,2.7,2,4.4,2.1
c1.7,0.1,3.3-0.5,4.6-1.7c1.2-1.2,2-2.7,2-4.4c0-0.9,0.1-1.8,0.1-2.6c0-33.8-27.5-61.2-61.2-61.2c-0.8,0-1.6,0-2.6,0.1
c-1.7,0.1-3.3,0.8-4.4,2.1c-1.2,1.3-1.8,2.9-1.7,4.6s0.8,3.3,2.1,4.4c1.3,1.2,2.9,1.8,4.6,1.7C31.9,60.5,32.6,60.5,33.2,60.5z"
/>
</g>
</g>
</g>
<g>
<g>
<g>
<path class="st4" d="M33.2,86.7c12.3,0,22.3,10,22.3,22.3c0,0.5,0,1.1-0.1,1.8c-0.3,3.5,2.3,6.6,5.8,6.9
c3.5,0.3,6.6-2.3,6.9-5.8c0.1-1,0.1-1.9,0.1-2.8c0-19.3-15.7-35.1-35.1-35.1c-0.9,0-1.8,0-2.8,0.1c-1.7,0.1-3.2,0.9-4.3,2.2
c-1.1,1.3-1.6,2.9-1.5,4.6c0.1,1.7,0.9,3.2,2.2,4.3c1.3,1.1,2.9,1.6,4.6,1.5C32.1,86.7,32.7,86.7,33.2,86.7z"/>
</g>
</g>
</g>
</g>
<g>
<path class="st1" d="M35.8,130.4c1.1,0.6,2.1,1.5,2.7,2.6c0.7,1.1,1,2.3,1,3.7s-0.3,2.6-1,3.7c-0.7,1.1-1.6,2-2.7,2.6
c-1.1,0.6-2.4,1-3.8,1s-2.7-0.3-3.8-1c-1.1-0.6-2.1-1.5-2.7-2.6c-0.7-1.1-1-2.3-1-3.7c0-1.3,0.3-2.6,1-3.7c0.7-1.1,1.6-2,2.7-2.6
c1.1-0.6,2.4-0.9,3.8-0.9C33.4,129.5,34.7,129.8,35.8,130.4z M29.9,132.9c-0.7,0.4-1.2,0.9-1.6,1.6s-0.6,1.4-0.6,2.2
c0,0.8,0.2,1.6,0.6,2.3c0.4,0.7,0.9,1.2,1.6,1.6c0.7,0.4,1.4,0.6,2.1,0.6c0.8,0,1.5-0.2,2.1-0.6c0.6-0.4,1.2-0.9,1.5-1.6
c0.4-0.7,0.6-1.4,0.6-2.3c0-0.8-0.2-1.6-0.6-2.2s-0.9-1.2-1.5-1.6c-0.6-0.4-1.4-0.6-2.1-0.6C31.3,132.3,30.6,132.5,29.9,132.9z"/>
<path class="st1" d="M50.6,133.6c0.8,0.5,1.4,1.1,1.8,2c0.4,0.8,0.6,1.8,0.6,2.9c0,1.1-0.2,2-0.6,2.8c-0.4,0.8-1,1.5-1.8,1.9
c-0.8,0.5-1.6,0.7-2.6,0.7c-0.7,0-1.4-0.1-2-0.4s-1.1-0.7-1.5-1.2v5.4h-3.1V133h3.1v1.6c0.4-0.5,0.9-1,1.4-1.2s1.2-0.4,2-0.4
C48.9,132.9,49.8,133.1,50.6,133.6z M49.1,140.5c0.5-0.6,0.7-1.3,0.7-2.2c0-0.9-0.2-1.6-0.7-2.1c-0.5-0.6-1.1-0.8-1.9-0.8
s-1.4,0.3-1.9,0.8c-0.5,0.6-0.8,1.3-0.8,2.1c0,0.9,0.2,1.6,0.8,2.2s1.1,0.8,1.9,0.8S48.6,141,49.1,140.5z"/>
<path class="st1" d="M63.4,134.4c0.9,1,1.4,2.4,1.4,4.2c0,0.3,0,0.6,0,0.7H57c0.2,0.7,0.5,1.2,1,1.6c0.5,0.4,1.1,0.6,1.8,0.6
c0.5,0,1-0.1,1.5-0.3s0.9-0.5,1.3-0.9l1.6,1.6c-0.5,0.6-1.2,1.1-2,1.4c-0.8,0.3-1.6,0.5-2.6,0.5c-1.1,0-2.1-0.2-3-0.7
s-1.5-1.1-2-1.9c-0.5-0.8-0.7-1.8-0.7-2.9c0-1.1,0.2-2.1,0.7-2.9s1.1-1.5,2-1.9c0.8-0.5,1.8-0.7,2.9-0.7
C61.2,132.9,62.5,133.4,63.4,134.4z M61.8,137.5c0-0.7-0.3-1.3-0.7-1.7s-1-0.6-1.7-0.6c-0.7,0-1.2,0.2-1.7,0.6
c-0.4,0.4-0.7,1-0.9,1.7H61.8z"/>
<path class="st1" d="M76.2,134c0.7,0.7,1.1,1.7,1.1,3v6.8h-3.1v-5.9c0-0.7-0.2-1.2-0.6-1.6s-0.9-0.6-1.5-0.6
c-0.8,0-1.4,0.3-1.8,0.8c-0.4,0.5-0.7,1.2-0.7,2v5.3h-3.1V133h3.1v1.9c0.7-1.3,2-2,3.7-2C74.6,132.8,75.5,133.2,76.2,134z"/>
<path class="st1" d="M96,129.7h3.3l-4.7,14h-3.3l-2.9-10.1l-3,10.1h-3.2l-4.7-14h3.4l3,10.7l3-10.7H90l3.1,10.7L96,129.7z"/>
<path class="st1" d="M103.3,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C102.6,128.2,103,128.3,103.3,128.7z M100.6,133h3.1
v10.8h-3.1V133z"/>
<path class="st1" d="M106.5,129.7h10.1l0,2.6h-6.9v3.4h6.3v2.6h-6.3v5.3h-3.2V129.7z"/>
<path class="st1" d="M120.9,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C120.1,128.2,120.5,128.3,120.9,128.7z M118.1,133h3.1
v10.8h-3.1V133z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

22213
issues/OWGW Logs.txt Normal file

File diff suppressed because it is too large Load Diff

2158
issues/OWLS Logs.rtf Normal file

File diff suppressed because it is too large Load Diff

2154
issues/OWLS Logs.txt Normal file

File diff suppressed because it is too large Load Diff

18
issues/WIFI-11388.txt Normal file
View File

@@ -0,0 +1,18 @@
Issue: https://telecominfraproject.atlassian.net/browse/WIFI-11388
Problem:
If a configuration was accepted by the GW or Provisioning but is still not valid according to the firmware on teh device,
the device will reject the configuration, however, that configuration is known as the kast good configuration in the GW.
This mens that we will lock the device in a loop where it continuously wants to update the configuration to version X,
and the device will continuously reject it.
Workaround:
Simply send a valid configuration to the GW and this will allow the device you update and stop the cycle.
Fix:
When a new configuration is submitted, store is a "pending". If it is accepted, move it to the current configuration. If
not accepted, simply remove it. One corner case exists. For some configuration updates, the AP will never complete the
update cycle, even if it has updated the configuration. In that case, we can detect the configuration during a connect
later. At that moment, when we look for an upgrade, we must compare with the pending UUID and the current UUID. If it matches the pending,
we know the last update worked. If it does not, we know to revert.

View File

@@ -2,7 +2,7 @@ openapi: 3.0.1
info: info:
title: uCentral gateway API title: uCentral gateway API
description: A process to manage configuration for devices. description: A process to manage configuration for devices.
version: 2.5.0 version: 2.10.0
license: license:
name: BSD3 name: BSD3
url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
@@ -49,6 +49,38 @@ components:
- IOT - IOT
- MESH - MESH
DeviceRestrictionsKeyInfo:
type: object
properties:
vendor:
type: string
algo:
type: string
DeviceRestrictions:
type: object
properties:
dfs:
type: boolean
ssh:
type: boolean
rtty:
type: boolean
tty:
type: boolean
developer:
type: boolean
upgrade:
type: boolean
commands:
type: boolean
country:
type: array
items:
type: string
key_info:
$ref: '#/components/schemas/DeviceRestrictionsKeyInfo'
Device: Device:
type: object type: object
description: Definition of uCentral device description: Definition of uCentral device
@@ -107,6 +139,24 @@ components:
type: string type: string
minLength: 2 minLength: 2
maxLength: 2 maxLength: 2
restrictedDevice:
type: boolean
default: false
certificateExpiryDate:
type: integer
format: int64
pendingConfiguration:
type: string
pendingConfigurationCmd:
type: string
format: uuid
restrictionDetails:
$ref: '#/components/schemas/DeviceRestrictions'
simulated:
type: boolean
lastRecordedContact:
type: integer
format: int64
DeviceWithStatus: DeviceWithStatus:
type: object type: object
@@ -202,6 +252,35 @@ components:
totalConnectionTime: totalConnectionTime:
type: integer type: integer
format: int64 format: int64
restrictedDevice:
type: boolean
default: false
certificateDate:
type: integer
format: int64
pendingConfiguration:
type: string
pendingConfigurationCmd:
type: string
format: uuid
restrictionDetails:
$ref: '#/components/schemas/DeviceRestrictions'
hasGPS:
type: boolean
sanity:
type: integer
format: int64
memoryUsed:
type: number
format: float
load:
type: number
format: float
temperature:
type: number
format: float
connectReason:
type: string
DeviceList: DeviceList:
type: object type: object
@@ -271,6 +350,9 @@ components:
associations_5G: associations_5G:
type: integer type: integer
format: int64 format: int64
associations_6G:
type: integer
format: int64
verifiedCertificate: verifiedCertificate:
type: string type: string
enum: enum:
@@ -278,6 +360,7 @@ components:
- VALID_CERTIFICATE, - VALID_CERTIFICATE,
- MISMATCH_SERIAL, - MISMATCH_SERIAL,
- VERIFIED - VERIFIED
- SIMULATED
DeviceCapabilities: DeviceCapabilities:
type: object type: object
@@ -362,7 +445,7 @@ components:
type: string type: string
CommandSubmitSuccess: CommandSubmitSuccess:
description: The command was submitted succesfully. description: The command was submitted successfully.
properties: properties:
serialNumber: serialNumber:
type: string type: string
@@ -400,6 +483,10 @@ components:
logType: logType:
type: integer type: integer
format: int64 format: int64
example:
- 0 normal logs
- 1 crash logs
- 2 reboot logs
UUID: UUID:
type: integer type: integer
format: int64 format: int64
@@ -500,18 +587,70 @@ components:
type: type:
type: string type: string
enum: enum:
- uci
- ucode
- shell - shell
- bundle
- diagnostic
script: script:
type: string type: string
description: This is the content of the script and must be encoded with base64. This is only for a ScriptRequest
scriptId: scriptId:
type: string type: string
format: uuid
when: when:
type: integer type: integer
format: int64 format: int64
default: 0 default: 0
signature:
type: string
deferred:
type: boolean
uri:
type: string
ScriptEntry:
type: object
properties:
id:
type: string
name:
type: string
description:
type: string
uri:
type: string
content:
type: string
version:
type: string
type:
enum:
- shell
- bundle
created:
type: integer
modified:
type: integer
author:
type: string
restricted:
type: array
items:
type: string
deferred:
type: boolean
default: false
timeout:
type: integer
default: 30
defaultUploadURI:
type: string
ScriptEntryList:
type: object
properties:
scripts:
type: array
items:
$ref: '#/components/schemas/ScriptEntry'
FactoryRequest: FactoryRequest:
type: object type: object
@@ -921,9 +1060,19 @@ components:
items: items:
$ref: '#/components/schemas/TagValuePair' $ref: '#/components/schemas/TagValuePair'
ExtraSystemConfiguration:
type: array
items:
type: object
properties:
parameterName:
type: string
parameterValue:
type: string
######################################################################################### #########################################################################################
## ##
## End of uCentral system wide values ## End of uCentral system-wide values
## ##
######################################################################################### #########################################################################################
BlackDeviceInfo: BlackDeviceInfo:
@@ -1149,6 +1298,67 @@ components:
items: items:
$ref: '#/components/schemas/RadiusProxyPool' $ref: '#/components/schemas/RadiusProxyPool'
RadiusSession:
type: object
properties:
started:
type: integer
format: int64
lastTransaction:
type: integer
format: int64
inputPackets:
type: integer
format: int64
outputPackets:
type: integer
format: int64
inputOctets:
type: integer
format: int64
outputOctets:
type: integer
format: int64
inputGigaWords:
type: integer
format: int64
outputGigaWords:
type: integer
format: int64
sessionTime:
type: integer
format: int64
destination:
type: string
userName:
type: string
accountingSessionId:
type: string
accountingMultiSessionId:
type: string
callingStationId:
type: string
RadiusSessionList:
type: object
properties:
sessions:
type: array
items:
$ref: '#/components/schemas/RadiusSession'
RadiusCoADMParameters:
type: object
properties:
accountingSessionId:
type: string
accountingMultiSessionId:
type: string
callingStationId:
type: string
chargeableUserIdentity:
type: string
paths: paths:
/devices: /devices:
get: get:
@@ -1219,6 +1429,27 @@ paths:
type: boolean type: boolean
default: false default: false
required: false required: false
- in: query
description: return devices with their health value in between lowLimit and highLimit
name: health
schema:
type: boolean
default: false
required: false
- in: query
description: lowLimit for the health selection criteria
name: lowLimit
schema:
type: integer
default: 30
required: false
- in: query
description: highLimit for the health selection criteria
name: highLimits
schema:
type: integer
default: 70
required: false
responses: responses:
200: 200:
description: List devices description: List devices
@@ -1236,6 +1467,54 @@ paths:
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
delete:
tags:
- Devices
summary: Delete a list of devices matching a criteria
description: Delete a list of devices matching a criteria
operationId: deleteDeviceList
parameters:
- in: query
description: Supply a list of devices comma separated
name: select
schema:
type: string
example: serial1,serial2,serial3
required: false
- in: query
description: Only simulated devices
name: simulatedOnly
schema:
type: boolean
default: false
required: false
- in: query
description: MAC address must match this pattern. Mutually exclusive with oldestContact
name: macPattern
schema:
type: string
example:
- "aabbcc*"
- "*aabbcc*"
- "*cccddee"
required: false
- in: query
description: lastRecordedContact older than this value. Mutually exclusive with macPattern
name: oldestContact
schema:
type: integer
format: int64
required: false
responses:
200:
$ref: '#/components/responses/Success'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/commands: /commands:
get: get:
tags: tags:
@@ -1634,7 +1913,7 @@ paths:
format: int64 format: int64
- in: query - in: query
name: logType name: logType
description: 0=any kind of logs (default) 0=normal logs only 1=crash logs only description: 0=any kind of logs (default) 0=normal logs, 1=crash logs, 2=reboot logs only
schema: schema:
type: integer type: integer
format: int64 format: int64
@@ -1890,6 +2169,12 @@ paths:
schema: schema:
type: boolean type: boolean
required: false required: false
- in: query
description: Return the number of matching records.
name: countOnly
schema:
type: boolean
required: false
responses: responses:
200: 200:
@@ -1899,6 +2184,8 @@ paths:
schema: schema:
oneOf: oneOf:
- $ref: '#/components/schemas/StatisticsRecords' - $ref: '#/components/schemas/StatisticsRecords'
- $ref: '#/components/schemas/DeviceCount'
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
404: 404:
@@ -1964,32 +2251,6 @@ paths:
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
/device/{serialNumber}/command:
post:
tags:
- Commands
summary: Post a command to a device
operationId: executeCommand
parameters:
- in: path
name: serialNumber
schema:
type: string
required: true
requestBody:
description: Command details
content:
application/json:
schema:
$ref: '#/components/schemas/CommandDetails'
responses:
200:
$ref: '#/components/schemas/CommandInfo'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/device/{serialNumber}/configure: /device/{serialNumber}/configure:
post: post:
tags: tags:
@@ -2076,6 +2337,11 @@ paths:
schema: schema:
type: string type: string
required: true required: true
- in: query
name: FWsignature
schema:
type: string
required: false
requestBody: requestBody:
description: Command details description: Command details
content: content:
@@ -2116,7 +2382,7 @@ paths:
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
/device/{serialNumber}/script: /device/{serialNumber}/:
post: post:
tags: tags:
- Commands - Commands
@@ -2430,6 +2696,145 @@ paths:
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
/scripts:
get:
tags:
- Scripting
summary: Returns a list scripts.
description: Get a list of scripts.
operationId: getScripts
parameters:
- in: query
description: Pagination start (starts at 0. If not specified, 0 is assumed)
name: offset
schema:
type: integer
required: false
- in: query
description: Maximum number of entries to return (if absent, no limit is assumed)
name: limit
schema:
type: integer
required: false
- in: query
description: Filter the results
name: filter
schema:
type: string
required: false
responses:
200:
description: List all scripts
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptEntryList'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/script/{uuid}:
get:
tags:
- Scripting
summary: Returns a script entry.
description: Get a specific script entry.
operationId: getScript
parameters:
- in: path
description: The UUID of the script
name: uuid
schema:
type: string
format: uuid
required: true
responses:
200:
description: A script entry
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptEntry'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
post:
tags:
- Scripting
summary: Create a new script.
operationId: createScript
parameters:
- in: path
description: The UUID of the script. Must be set to 0 for creation
name: uuid
schema:
type: string
format: uuid
required: true
requestBody:
description: Complet script entry
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptEntry'
responses:
200:
$ref: '#/components/schemas/ScriptEntry'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
put:
tags:
- Scripting
summary: Modify a script.
operationId: modifyScript
parameters:
- in: path
description: The UUID of the script.
name: uuid
schema:
type: string
format: uuid
required: true
requestBody:
description: Complete script entry. You may only modify the name, description, version, uri, and content
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptEntry'
responses:
200:
$ref: '#/components/schemas/ScriptEntry'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
delete:
tags:
- Scripting
summary: Delete a script.
operationId: deleteScript
parameters:
- in: path
name: uuid
schema:
type: string
format: uuid
required: true
responses:
204:
$ref: '#/components/responses/Success'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/blacklist: /blacklist:
get: get:
tags: tags:
@@ -2622,6 +3027,82 @@ paths:
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
/radiusSessions/{serialNumber}:
get:
tags:
- Radius Sessions
summary: Retrieve the RADIUS sessions for a given AP
operationId: getAPRadiusSessions
parameters:
- in: path
name: serialNumber
schema:
type: string
example: for searches or listing only serial number, set the serialNumber to 0
required: true
- in: query
name: serialNumberOnly
schema:
type: boolean
required: false
- in: query
name: userName
schema:
type: string
required: false
- in: query
name: mac
schema:
type: string
required: false
example: aa:bb:cc:dd:ee:ff
responses:
200:
description: AP List
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/RadiusSessionList'
- $ref: '#/components/schemas/SerialNumberList'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
put:
tags:
- Radius Sessions
summary: Retrieve the RADIUS sessions for a given AP
operationId: putAPRadiusSessions
parameters:
- in: path
name: serialNumber
schema:
type: string
required: true
- in: query
name: operation
schema:
type: string
enum:
- coadm
requestBody:
description: operationParameters
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/RadiusCoADMParameters'
responses:
200:
$ref: '#/components/responses/Success'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/deviceDashboard: /deviceDashboard:
get: get:
tags: tags:
@@ -2731,4 +3212,67 @@ paths:
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
/systemConfiguration:
get:
tags:
- SystemConfiguration
summary: Retrieve system configuration items
operationId: getSystemConfiguration
parameters:
- in: query
description: Which parameters you want to retrieve
name: entries
schema:
type: string
example:
- element1
- element1,element2,element3
required: false
responses:
200:
description: List of configuration elements
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ExtraSystemConfiguration'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
put:
tags:
- SystemConfiguration
summary: Set some or all system configuration
operationId: setSystemConfiguration
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ExtraSystemConfiguration'
responses:
200:
$ref: '#/components/schemas/ExtraSystemConfiguration'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
delete:
tags:
- SystemConfiguration
summary: Delete all additional system configuration
operationId: deleteSystemConfiguration
responses:
200:
$ref: '#/components/responses/Success'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'

View File

@@ -178,4 +178,4 @@ archiver.db.3.keep = 7
######################################################################## ########################################################################
logging.type = file logging.type = file
logging.path = $OWGW_ROOT/logs logging.path = $OWGW_ROOT/logs
logging.level = debug logging.level = information

View File

@@ -75,6 +75,7 @@ openwifi.autoprovisioning = true
openwifi.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi openwifi.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2 = IOT:esp32 openwifi.devicetypes.2 = IOT:esp32
openwifi.certificates.allowmismatch = ${CERTIFICATES_ALLOWMISMATCH}
oui.download.uri = https://standards-oui.ieee.org/oui/oui.txt oui.download.uri = https://standards-oui.ieee.org/oui/oui.txt
simulatorid = ${SIMULATORID} simulatorid = ${SIMULATORID}
iptocountry.default = US iptocountry.default = US
@@ -84,6 +85,7 @@ iptocountry.ipdata.apikey = ${IPTOCOUNTRY_IPDATA_APIKEY}
autoprovisioning.process = ${AUTOPROVISIONING_PROCESS} autoprovisioning.process = ${AUTOPROVISIONING_PROCESS}
openwifi.session.timeout = ${DEVICE_SESSION_TIMEOUT}
# #
# rtty # rtty
# #
@@ -102,6 +104,12 @@ radius.proxy.accounting.port = ${RADIUS_PROXY_ACCOUNTING_PORT}
radius.proxy.authentication.port = ${RADIUS_PROXY_AUTHENTICATION_PORT} radius.proxy.authentication.port = ${RADIUS_PROXY_AUTHENTICATION_PORT}
radius.proxy.coa.port = ${RADIUS_PROXY_COA_PORT} radius.proxy.coa.port = ${RADIUS_PROXY_COA_PORT}
iptocountry.default = ${IPINFO_DEFAULT_COUNTRY}
#iptocountry.provider = ipinfo
#iptocountry.provider = ipdata
#iptocountry.ipinfo.token =
#iptocountry.ipdata.apikey =
############################# #############################
# Generic information for all micro services # Generic information for all micro services
############################# #############################
@@ -174,4 +182,4 @@ archiver.db.3.keep = 7
######################################################################## ########################################################################
logging.type = console logging.type = console
logging.path = $OWGW_ROOT/logs logging.path = $OWGW_ROOT/logs
logging.level = debug logging.level = information

View File

@@ -1,41 +0,0 @@
/* Frame (255 bytes) */
static const unsigned char pkt41[255] = {
0x14, 0x98, 0x77, 0x71, 0xc6, 0xe7, 0x34, 0xef, /* ..wq..4. */
0xb6, 0xaf, 0x4a, 0x5c, 0x08, 0x00, 0x45, 0x00, /* ..J\..E. */
0x00, 0xf1, 0x87, 0x50, 0x00, 0x00, 0x40, 0x11, /* ...P..@. */
0x0c, 0xdf, 0xc0, 0xa8, 0xb2, 0x1b, 0xc0, 0xa8, /* ........ */
0xb2, 0x60, 0xc3, 0xfe, 0x07, 0x14, 0x00, 0xdd, /* .`...... */
0x26, 0x63, 0x01, 0x04, 0x00, 0xd5, 0xcc, 0x29, /* &c.....) */
0x82, 0x36, 0xd6, 0x57, 0x3d, 0xa7, 0xd5, 0x62, /* .6.W=..b */
0x70, 0x12, 0x00, 0xc0, 0xf2, 0x19, 0x01, 0x03, /* p....... */
0x61, 0x1e, 0x1c, 0x33, 0x34, 0x2d, 0x45, 0x46, /* a..34-EF */
0x2d, 0x42, 0x36, 0x2d, 0x41, 0x46, 0x2d, 0x34, /* -B6-AF-4 */
0x41, 0x2d, 0x36, 0x30, 0x3a, 0x4f, 0x70, 0x65, /* A-60:Ope */
0x6e, 0x57, 0x69, 0x66, 0x69, 0x3d, 0x06, 0x00, /* nWifi=.. */
0x00, 0x00, 0x13, 0x06, 0x06, 0x00, 0x00, 0x00, /* ........ */
0x02, 0x05, 0x06, 0x00, 0x00, 0x00, 0x01, 0x1f, /* ........ */
0x13, 0x42, 0x36, 0x2d, 0x43, 0x34, 0x2d, 0x30, /* .B6-C4-0 */
0x36, 0x2d, 0x30, 0x39, 0x2d, 0x31, 0x35, 0x2d, /* 6-09-15- */
0x42, 0x37, 0x4d, 0x18, 0x43, 0x4f, 0x4e, 0x4e, /* B7M.CONN */
0x45, 0x43, 0x54, 0x20, 0x35, 0x34, 0x4d, 0x62, /* ECT 54Mb */
0x70, 0x73, 0x20, 0x38, 0x30, 0x32, 0x2e, 0x31, /* ps 802.1 */
0x31, 0x61, 0x2c, 0x12, 0x33, 0x42, 0x45, 0x44, /* 1a,.3BED */
0x37, 0x32, 0x39, 0x30, 0x44, 0x30, 0x43, 0x38, /* 7290D0C8 */
0x35, 0x36, 0x44, 0x33, 0xba, 0x06, 0x00, 0x0f, /* 56D3.... */
0xac, 0x04, 0xbb, 0x06, 0x00, 0x0f, 0xac, 0x04, /* ........ */
0xbc, 0x06, 0x00, 0x0f, 0xac, 0x05, 0xbd, 0x06, /* ........ */
0x00, 0x0f, 0xac, 0x06, 0x1a, 0x1b, 0x00, 0x00, /* ........ */
0xe6, 0x08, 0x47, 0x15, 0x01, 0x13, 0x33, 0x34, /* ..G...34 */
0x2d, 0x65, 0x66, 0x2d, 0x62, 0x36, 0x2d, 0x61, /* -ef-b6-a */
0x66, 0x2d, 0x34, 0x61, 0x2d, 0x35, 0x63, 0x0c, /* f-4a-5c. */
0x06, 0x00, 0x00, 0x05, 0x78, 0x4f, 0x08, 0x02, /* ....xO.. */
0x01, 0x00, 0x06, 0x01, 0x61, 0x50, 0x12, 0x20, /* ....aP. */
0x9c, 0xae, 0xe5, 0xe3, 0x77, 0xaf, 0x0b, 0x1b, /* ....w... */
0xaf, 0x0e, 0xb5, 0x08, 0x82, 0x9e, 0xeb /* ....... */
};
/* Reassembled EAP (6 bytes) */
static const unsigned char pkt41_1[6] = {
0x02, 0x01, 0x00, 0x06, 0x01, 0x61 /* .....a */
};

View File

@@ -1 +0,0 @@
192.168.178.1

Binary file not shown.

View File

@@ -16,6 +16,7 @@
"weight" : 10, "weight" : 10,
"radsec" : true, "radsec" : true,
"radsecPort" : 2083, "radsecPort" : 2083,
"allowSelfSigned" : false,
"radsecSecret" : "radsec", "radsecSecret" : "radsec",
"radsecKey" : "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUR6RnpXeTZlYXg0QVoxTySG9VUURRZ0FFS3BnWVBHMktPTVd2S0w1Z3NMRXpUc09rREg1M3NHaEQyS3RsRXBDTXVnNDNIZlFnTFVpUgpTR1R2S1l0bDFmbmJaU1lnY0RJdncxdjNYRy9hVDhOY2JBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=", "radsecKey" : "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUR6RnpXeTZlYXg0QVoxTySG9VUURRZ0FFS3BnWVBHMktPTVd2S0w1Z3NMRXpUc09rREg1M3NHaEQyS3RsRXBDTXVnNDNIZlFnTFVpUgpTR1R2S1l0bDFmbmJaU1lnY0RJdncxdjNYRy9hVDhOY2JBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=",
"radsecCert" : "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNRVENDQWVpZ0F3SUJBZ0lVY3BKS3pVM0Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBb1RDa0oxZEhSdmJuZHZiMlF4SFRBYkJnTlZCQU1URkVKMQpkSFJ2Ym5kdmIyUWdVbUZrYzJWaklFTkJNQjRYRFRJeU1EY3dNekExTWpVeE5Gb1hEVEkzTURVeE9UQTFNalV4Ck5Gb3dkVEVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFvVENrSjFkSFJ2Ym5kdmIyUXhOakEwQmdOVkJBTVQKTFdGeWFXeHBZUzVqWWpFd2FtTnVjemgxYlhCbk9HWnBjRFowTUM1dmNtbHZiaTVoY21WaE1USXdMbU52YlRFWgpNQmNHQ2dtU0pvbVQ4aXhrQVFFVENVZHZiMmRzWlRwVlV6QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VICkEwSUFCQ3FZR0R4dGlqakZyeWkrWUxDeE0wN0RwQXgrZDdCb1E5aXJaUktRakxvT054MzBJQzFJa1Voazd5bUwKWmRYNTIyVW1JSEF5TDhOYjkxeHYyay9EWEd5amdZa3dnWVl3RGdZRFZSMFBBUUgvQkFRREFnZUFNQk1HQTFVZApKUVFNTUFvR0NDc0dBUVVGQndNQ01Bd0dBMVVkRXdFQi93UUNNQUF3T0FZRFZSMFJCREV3TDRJdFlYSnBiR2xoCkxtTmlNVEJxWTI1ek9IVnRjR2M0Wm1sd05uUXdMbTl5YVc5dUxtRnlaV0V4TWpBdVkyOXRNQmNHQTFVZElBUVEKTUE0d0RBWUtLd1lCQkFIdUtnRUJCVEFLQmdncWhrak9QUVFEQWdOSEFEQkVBaUFwTmM1dUNBSkp6KzVyakdqdwpCWGtOdHE3UU83bWU5dUg5bkNsTDZnSVE5Z0lnUHM2VkVKVW5CcEZ0RktXbFF4eWJ1YlBxYnpJNjBPSERHQ0ExCmhXUk1PS1U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", "radsecCert" : "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNRVENDQWVpZ0F3SUJBZ0lVY3BKS3pVM0Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBb1RDa0oxZEhSdmJuZHZiMlF4SFRBYkJnTlZCQU1URkVKMQpkSFJ2Ym5kdmIyUWdVbUZrYzJWaklFTkJNQjRYRFRJeU1EY3dNekExTWpVeE5Gb1hEVEkzTURVeE9UQTFNalV4Ck5Gb3dkVEVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFvVENrSjFkSFJ2Ym5kdmIyUXhOakEwQmdOVkJBTVQKTFdGeWFXeHBZUzVqWWpFd2FtTnVjemgxYlhCbk9HWnBjRFowTUM1dmNtbHZiaTVoY21WaE1USXdMbU52YlRFWgpNQmNHQ2dtU0pvbVQ4aXhrQVFFVENVZHZiMmRzWlRwVlV6QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VICkEwSUFCQ3FZR0R4dGlqakZyeWkrWUxDeE0wN0RwQXgrZDdCb1E5aXJaUktRakxvT054MzBJQzFJa1Voazd5bUwKWmRYNTIyVW1JSEF5TDhOYjkxeHYyay9EWEd5amdZa3dnWVl3RGdZRFZSMFBBUUgvQkFRREFnZUFNQk1HQTFVZApKUVFNTUFvR0NDc0dBUVVGQndNQ01Bd0dBMVVkRXdFQi93UUNNQUF3T0FZRFZSMFJCREV3TDRJdFlYSnBiR2xoCkxtTmlNVEJxWTI1ek9IVnRjR2M0Wm1sd05uUXdMbTl5YVc5dUxtRnlaV0V4TWpBdVkyOXRNQmNHQTFVZElBUVEKTUE0d0RBWUtLd1lCQkFIdUtnRUJCVEFLQmdncWhrak9QUVFEQWdOSEFEQkVBaUFwTmM1dUNBSkp6KzVyakdqdwpCWGtOdHE3UU83bWU5dUg5bkNsTDZnSVE5Z0lnUHM2VkVKVW5CcEZ0RktXbFF4eWJ1YlBxYnpJNjBPSERHQ0ExCmhXUk1PS1U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",

1849
regulatory/regulatory.txt Normal file

File diff suppressed because it is too large Load Diff

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

View File

@@ -0,0 +1,59 @@
//
// Created by stephane bourque on 2023-05-23.
//
#include "AP_WS_ConfigAutoUpgrader.h"
#include <framework/utils.h>
#include <RESTObjects/RESTAPI_GWobjects.h>
#include <StorageService.h>
namespace OpenWifi {
int AP_WS_ConfigAutoUpgrader::Start() {
poco_notice(Logger(), "Starting...");
QueueManager_.start(*this);
return 0;
}
void AP_WS_ConfigAutoUpgrader::Stop() {
poco_notice(Logger(), "Stopping...");
Running_ = false;
Queue_.wakeUpAll();
QueueManager_.join();
poco_notice(Logger(), "Stopped...");
}
void AP_WS_ConfigAutoUpgrader::run() {
Utils::SetThreadName("auto:cfgmgr");
Running_ = true;
while (Running_) {
Poco::AutoPtr<Poco::Notification> NextMsg(Queue_.waitDequeueNotification());
try {
auto Entry = dynamic_cast<CheckConfiguration *>(NextMsg.get());
if (Entry != nullptr) {
GWObjects::Device DeviceInfo;
std::string SerialNumber = Utils::IntToSerialNumber(Entry->serial_);
if (StorageService()->GetDevice(SerialNumber, DeviceInfo)) {
if(DeviceInfo.pendingUUID!=0 && Entry->uuid_==DeviceInfo.pendingUUID) {
StorageService()->CompleteDeviceConfigurationChange(SerialNumber);
SetDeviceCacheEntry(Entry->serial_, Utils::Now(), Entry->uuid_, 0);
continue;
}
if(DeviceInfo.UUID==Entry->uuid_) {
SetDeviceCacheEntry(Entry->serial_, Utils::Now(), Entry->uuid_, 0);
continue;
}
}
}
return;
} catch (const Poco::Exception &E) {
Logger().log(E);
} catch (...) {
poco_warning(Logger(), "Exception occurred during run.");
}
}
}
} // namespace OpenWifi

View File

@@ -0,0 +1,137 @@
//
// Created by stephane bourque on 2023-05-23.
//
#pragma once
#include "Poco/Notification.h"
#include "Poco/NotificationQueue.h"
#include "Poco/Timer.h"
#include <framework/SubSystemServer.h>
#include <framework/utils.h>
namespace OpenWifi {
class CheckConfiguration : public Poco::Notification {
public:
explicit CheckConfiguration(std::uint64_t s, std::uint64_t c) :
serial_(s), uuid_(c) {
}
std::uint64_t serial_;
std::uint64_t uuid_;
};
struct ConfigurationCacheEntry {
std::uint64_t last_check_=0;
std::uint64_t current_config_=0;
std::uint64_t pending_config_=0;
};
class AP_WS_ConfigAutoUpgrader : public SubSystemServer, Poco::Runnable {
public:
int Start() final;
void Stop() final;
void run() final;
static auto instance() {
static auto instance = new AP_WS_ConfigAutoUpgrader;
return instance;
}
inline void AddConfiguration(std::uint64_t serial, std::uint64_t config_uuid) {
std::lock_guard Guard(CacheMutex_);
auto hint = Cache_.find(serial);
if(hint==end(Cache_)) {
Cache_[serial] = { Utils::Now(),config_uuid , 0 };
return;
}
if(hint->second.pending_config_==0) {
hint->second.last_check_ = Utils::Now();
hint->second.current_config_ = config_uuid;
return;
}
}
inline void AddConfiguration(std::uint64_t serial, std::uint64_t config_uuid, std::uint64_t pending_config_uuid) {
std::lock_guard Guard(CacheMutex_);
auto hint = Cache_.find(serial);
if(hint==end(Cache_)) {
Cache_[serial] = { Utils::Now(), config_uuid , pending_config_uuid };
return;
}
if(hint->second.pending_config_==0) {
hint->second.last_check_ = Utils::Now();
hint->second.current_config_ = config_uuid;
hint->second.pending_config_ = pending_config_uuid;
return;
}
}
[[nodiscard]] inline ConfigurationCacheEntry GetSerialInfo(std::uint64_t serial) const {
std::lock_guard Guard(CacheMutex_);
auto hint = Cache_.find(serial);
if(hint==end(Cache_)) {
return {0,0,0};
}
return hint->second;
}
inline bool UpdateConfiguration(std::uint64_t serial, std::uint64_t config) {
if(serial==0)
return false;
std::lock_guard Guard(CacheMutex_);
auto hint = Cache_.find(serial);
if(hint!=end(Cache_)) {
if(hint->second.current_config_==config) {
return false;
}
if(config==hint->second.pending_config_) {
Queue_.enqueueNotification(new CheckConfiguration(serial,config));
return true;
}
if(config!=hint->second.current_config_ && hint->second.pending_config_==0) {
Queue_.enqueueNotification(new CheckConfiguration(serial,config));
return true;
}
if((Utils::Now()-hint->second.last_check_)<60*5) {
return false;
}
if(hint->second.pending_config_!=0) {
return false;
}
}
return true;
}
inline void SetDeviceCacheEntry(std::uint64_t serial, std::uint64_t t, std::uint64_t uuid, std::uint64_t pending_uuid) {
std::lock_guard Guard(CacheMutex_);
Cache_[serial] = { t, uuid, pending_uuid };
}
private:
Poco::NotificationQueue Queue_;
Poco::Thread QueueManager_;
std::atomic_bool Running_=false;
mutable std::mutex CacheMutex_;
std::map<std::uint64_t, ConfigurationCacheEntry> Cache_;
AP_WS_ConfigAutoUpgrader() noexcept
: SubSystemServer("AutoConfigUpgrade", "AUTO-CFG-MGR", "auto.config.updater") {
}
};
inline auto AP_WS_ConfigAutoUpgrader() { return AP_WS_ConfigAutoUpgrader::instance(); }
} // namespace OpenWifi

File diff suppressed because it is too large Load Diff

View File

@@ -4,53 +4,118 @@
#pragma once #pragma once
#include <shared_mutex>
#include <string> #include <string>
#include "Poco/JSON/Object.h"
#include <Poco/JSON/Parser.h>
#include "Poco/Logger.h"
#include "Poco/Net/SocketNotification.h"
#include "Poco/Net/SocketReactor.h" #include "Poco/Net/SocketReactor.h"
#include "Poco/Net/StreamSocket.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 "Poco/Net/WebSocket.h"
#include "DeviceRegistry.h"
#include "RESTObjects/RESTAPI_GWobjects.h" #include "RESTObjects/RESTAPI_GWobjects.h"
namespace OpenWifi { namespace OpenWifi {
class AP_WS_Connection { class AP_WS_Connection {
static constexpr int BufSize = 256000; static constexpr int BufSize = 256000;
public: public:
explicit AP_WS_Connection( Poco::Net::HTTPServerRequest &request, explicit AP_WS_Connection(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response, Poco::Net::HTTPServerResponse &response, uint64_t connection_id,
std::uint64_t connection_id, Poco::Logger &L, Poco::Net::SocketReactor &R);
Poco::Logger &L,
Poco::Net::SocketReactor &R);
~AP_WS_Connection(); ~AP_WS_Connection();
void EndConnection(); void EndConnection(bool DeleteSession=true);
void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr & Doc); void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc);
void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc); void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc);
void ProcessIncomingFrame(); void ProcessIncomingFrame();
void ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc); void ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc);
bool Send(const std::string &Payload); [[nodiscard]] bool Send(const std::string &Payload);
bool SendRadiusAuthenticationData(const unsigned char * buffer, std::size_t size); bool SendRadiusAuthenticationData(const unsigned char *buffer, std::size_t size);
bool SendRadiusAccountingData(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); bool SendRadiusCoAData(const unsigned char *buffer, std::size_t size);
void OnSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf); void OnSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification> &pNf);
void OnSocketShutdown(const Poco::AutoPtr<Poco::Net::ShutdownNotification>& pNf); void OnSocketShutdown(const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf);
void OnSocketError(const Poco::AutoPtr<Poco::Net::ErrorNotification>& pNf); void OnSocketError(const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf);
bool LookForUpgrade(const uint64_t UUID, uint64_t & UpgradedUUID); bool LookForUpgrade(uint64_t UUID, uint64_t &UpgradedUUID);
static bool ExtractBase64CompressedData(const std::string & CompressedData, std::string & UnCompressedData, uint64_t compress_sz); static bool ExtractBase64CompressedData(const std::string &CompressedData,
std::string &UnCompressedData,
uint64_t compress_sz);
void LogException(const Poco::Exception &E); void LogException(const Poco::Exception &E);
inline Poco::Logger & Logger() { return Logger_; } inline Poco::Logger &Logger() { return Logger_; }
bool SetWebSocketTelemetryReporting(std::uint64_t RPCID, uint64_t interval, uint64_t TelemetryWebSocketTimer); bool SetWebSocketTelemetryReporting(uint64_t RPCID, uint64_t interval,
bool SetKafkaTelemetryReporting(std::uint64_t RPCID, uint64_t interval, uint64_t TelemetryKafkaTimer); uint64_t TelemetryWebSocketTimer,
bool StopWebSocketTelemetry(std::uint64_t RPCID); const std::vector<std::string> &TelemetryTypes);
bool StopKafkaTelemetry(std::uint64_t RPCID); bool SetKafkaTelemetryReporting(uint64_t RPCID, uint64_t interval,
uint64_t TelemetryKafkaTimer,
const std::vector<std::string> &TelemetryTypes);
bool StopWebSocketTelemetry(uint64_t RPCID);
bool StopKafkaTelemetry(uint64_t RPCID);
inline void GetLastStats(std::string &LastStats) {
std::shared_lock G(ConnectionMutex_);
LastStats = RawLastStats_;
}
inline void SetLastStats(const std::string &LastStats) {
std::unique_lock G(ConnectionMutex_);
RawLastStats_ = LastStats;
try {
Poco::JSON::Parser P;
auto Stats = P.parse(LastStats).extract<Poco::JSON::Object::Ptr>();
hasGPS = Stats->isObject("gps");
auto Unit = Stats->getObject("unit");
auto Memory = Unit->getObject("memory");
std::uint64_t TotalMemory = Memory->get("total");
std::uint64_t FreeMemory = Memory->get("free");
if(TotalMemory>0) {
memory_used_ =
(100.0 * ((double)TotalMemory - (double)FreeMemory)) / (double)TotalMemory;
}
if(Unit->isArray("load")) {
Poco::JSON::Array::Ptr Load = Unit->getArray("load");
if(Load->size()>1) {
cpu_load_ = Load->get(1);
}
}
if(Unit->isArray("temperature")) {
Poco::JSON::Array::Ptr Temperature = Unit->getArray("temperature");
if(Temperature->size()>1) {
temperature_ = Temperature->get(0);
}
}
} catch (...) {
}
}
inline void SetLastHealthCheck(const GWObjects::HealthCheck &H) {
std::unique_lock G(ConnectionMutex_);
RawLastHealthcheck_ = H;
}
inline void GetLastHealthCheck(GWObjects::HealthCheck &H) {
std::shared_lock G(ConnectionMutex_);
H = RawLastHealthcheck_;
}
inline void GetState(GWObjects::ConnectionState &State) const {
std::shared_lock G(ConnectionMutex_);
State = State_;
}
inline bool HasGPS() { return hasGPS; }
inline void GetRestrictions(GWObjects::DeviceRestrictions &R) const {
std::shared_lock G(ConnectionMutex_);
R = Restrictions_;
}
void Process_connect(Poco::JSON::Object::Ptr ParamsObj, const std::string &Serial); void Process_connect(Poco::JSON::Object::Ptr ParamsObj, const std::string &Serial);
void Process_state(Poco::JSON::Object::Ptr ParamsObj); void Process_state(Poco::JSON::Object::Ptr ParamsObj);
@@ -63,14 +128,18 @@ namespace OpenWifi {
void Process_deviceupdate(Poco::JSON::Object::Ptr ParamsObj, std::string &Serial); void Process_deviceupdate(Poco::JSON::Object::Ptr ParamsObj, std::string &Serial);
void Process_telemetry(Poco::JSON::Object::Ptr ParamsObj); void Process_telemetry(Poco::JSON::Object::Ptr ParamsObj);
void Process_venuebroadcast(Poco::JSON::Object::Ptr ParamsObj); void Process_venuebroadcast(Poco::JSON::Object::Ptr ParamsObj);
void Process_event(Poco::JSON::Object::Ptr ParamsObj);
void Process_wifiscan(Poco::JSON::Object::Ptr ParamsObj);
void Process_alarm(Poco::JSON::Object::Ptr ParamsObj);
void Process_rebootLog(Poco::JSON::Object::Ptr ParamsObj);
bool ValidatedDevice(); bool ValidatedDevice();
inline bool GetTelemetryParameters(bool & Reporting, uint64_t & Interval, inline bool GetTelemetryParameters(bool &Reporting, uint64_t &Interval,
uint64_t & WebSocketTimer, uint64_t & KafkaTimer, uint64_t &WebSocketTimer, uint64_t &KafkaTimer,
uint64_t &WebSocketCount, uint64_t & KafkaCount, uint64_t &WebSocketCount, uint64_t &KafkaCount,
uint64_t &WebSocketPackets, uint64_t &WebSocketPackets,
uint64_t &KafkaPackets ) const { uint64_t &KafkaPackets) const {
Reporting = TelemetryReporting_; Reporting = TelemetryReporting_;
WebSocketTimer = TelemetryWebSocketTimer_; WebSocketTimer = TelemetryWebSocketTimer_;
KafkaTimer = TelemetryKafkaTimer_; KafkaTimer = TelemetryKafkaTimer_;
@@ -82,45 +151,56 @@ namespace OpenWifi {
return true; return true;
} }
friend class DeviceRegistry; friend class AP_WS_Server;
inline GWObjects::DeviceRestrictions Restrictions() const {
std::shared_lock G(ConnectionMutex_);
return Restrictions_;
}
inline bool MustBeSecureRtty() const { return RttyMustBeSecure_; }
private: private:
std::recursive_mutex Mutex_; mutable std::shared_mutex ConnectionMutex_;
std::shared_mutex TelemetryMutex_; std::shared_mutex TelemetryMutex_;
Poco::Logger &Logger_; Poco::Logger &Logger_;
Poco::Net::SocketReactor &Reactor_; Poco::Net::SocketReactor &Reactor_;
std::unique_ptr<Poco::Net::WebSocket> WS_; std::unique_ptr<Poco::Net::WebSocket> WS_;
std::string SerialNumber_; std::string SerialNumber_;
uint64_t SerialNumberInt_=0; uint64_t SerialNumberInt_ = 0;
std::string Compatible_; std::string Compatible_;
std::atomic_bool Registered_ = false ; std::atomic_bool Registered_ = false;
std::string CId_; std::string CId_;
std::string CN_; std::string CN_;
uint64_t Errors_=0; uint64_t Errors_ = 0;
Poco::Net::IPAddress PeerAddress_; Poco::Net::IPAddress PeerAddress_;
std::atomic_bool TelemetryReporting_ = false; volatile bool TelemetryReporting_ = false;
std::atomic_uint64_t TelemetryWebSocketRefCount_ = 0; volatile uint64_t TelemetryWebSocketRefCount_ = 0;
std::atomic_uint64_t TelemetryKafkaRefCount_ = 0; volatile uint64_t TelemetryKafkaRefCount_ = 0;
uint64_t TelemetryWebSocketTimer_ = 0; volatile uint64_t TelemetryWebSocketTimer_ = 0;
uint64_t TelemetryKafkaTimer_ = 0 ; volatile uint64_t TelemetryKafkaTimer_ = 0;
uint64_t TelemetryInterval_ = 0; volatile uint64_t TelemetryInterval_ = 0;
std::atomic_uint64_t TelemetryWebSocketPackets_=0; volatile uint64_t TelemetryWebSocketPackets_ = 0;
std::atomic_uint64_t TelemetryKafkaPackets_=0; volatile uint64_t TelemetryKafkaPackets_ = 0;
GWObjects::ConnectionState State_; GWObjects::ConnectionState State_;
std::string LastStats_; std::string RawLastStats_;
GWObjects::HealthCheck LastHealthcheck_; GWObjects::HealthCheck RawLastHealthcheck_;
std::chrono::time_point<std::chrono::high_resolution_clock> ConnectionStart_ = std::chrono::high_resolution_clock::now(); 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}; std::chrono::duration<double, std::milli> ConnectionCompletionTime_{0.0};
bool Threaded_=false; std::atomic_flag Dead_ = false;
std::atomic_bool Dead_=false; std::atomic_bool DeviceValidated_ = false;
std::atomic_bool DeviceValidated_=false; std::atomic_bool Valid_ = false;
OpenWifi::GWObjects::DeviceRestrictions Restrictions_;
bool RttyMustBeSecure_ = false;
static inline std::atomic_uint64_t ConcurrentStartingDevices_=0; static inline std::atomic_uint64_t ConcurrentStartingDevices_ = 0;
void CompleteStartup(); bool StartTelemetry(uint64_t RPCID, const std::vector<std::string> &TelemetryTypes);
bool StartTelemetry(std::uint64_t RPCID); bool StopTelemetry(uint64_t RPCID);
bool StopTelemetry(std::uint64_t RPCID);
void UpdateCounts(); void UpdateCounts();
bool hasGPS=false;
std::double_t memory_used_=0.0, cpu_load_ = 0.0, temperature_ = 0.0;
}; };
} } // namespace OpenWifi

View File

@@ -0,0 +1,32 @@
//
// Created by stephane bourque on 2023-01-22.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
#include "fmt/format.h"
#include "framework/KafkaManager.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void AP_WS_Connection::Process_alarm(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) {
poco_warning(Logger_,
fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
CId_, CN_));
Errors_++;
return;
}
poco_trace(Logger_, fmt::format("Alarm data received for {}", SerialNumber_));
if (ParamsObj->has(uCentralProtocol::SERIAL) && ParamsObj->has(uCentralProtocol::DATA)) {
if (KafkaManager()->Enabled()) {
auto Data = ParamsObj->get(uCentralProtocol::DATA);
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(ParamsObj, OS);
KafkaManager()->PostMessage(KafkaTopics::ALERTS, SerialNumber_, std::make_shared<std::string>(OS.str()));
}
}
}
} // namespace OpenWifi

View File

@@ -3,12 +3,15 @@
// //
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "fmt/format.h"
#include "framework/ow_constants.h"
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_cfgpending(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_cfgpending(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) { if (!State_.Connected) {
poco_warning(Logger_, fmt::format( poco_warning(Logger_,
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_)); fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
CId_, CN_));
Errors_++; Errors_++;
return; return;
} }
@@ -16,9 +19,10 @@ namespace OpenWifi {
[[maybe_unused]] uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID); [[maybe_unused]] uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
[[maybe_unused]] uint64_t Active = ParamsObj->get(uCentralProtocol::ACTIVE); [[maybe_unused]] uint64_t Active = ParamsObj->get(uCentralProtocol::ACTIVE);
poco_trace(Logger_, fmt::format("CFG-PENDING({}): Active: {} Target: {}", CId_, Active, UUID)); poco_trace(Logger_,
fmt::format("CFG-PENDING({}): Active: {} Target: {}", CId_, Active, UUID));
} else { } else {
poco_warning(Logger_, fmt::format("CFG-PENDING({}): Missing some parameters", CId_)); poco_warning(Logger_, fmt::format("CFG-PENDING({}): Missing some parameters", CId_));
} }
} }
} } // namespace OpenWifi

View File

@@ -4,121 +4,243 @@
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "AP_WS_Server.h" #include "AP_WS_Server.h"
#include "StorageService.h" #include "CentralConfig.h"
#include "FindCountry.h"
#include "framework/WebSocketClientNotifications.h"
#include "Daemon.h" #include "Daemon.h"
#include "FindCountry.h"
#include "StorageService.h"
#include "CommandManager.h" #include "CommandManager.h"
#include "framework/KafkaManager.h"
#include "framework/utils.h"
#include "UI_GW_WebSocketNotifications.h"
#include <GWKafkaEvents.h>
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_connect(Poco::JSON::Object::Ptr ParamsObj, const std::string &Serial) { [[maybe_unused]] static void SendKafkaFirmwareUpdate(const std::string &SerialNumber,
if (ParamsObj->has(uCentralProtocol::UUID) && const std::string &OldFirmware,
ParamsObj->has(uCentralProtocol::FIRMWARE) && const std::string &NewFirmware) {
ParamsObj->has(uCentralProtocol::CAPABILITIES)) {
uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
auto Firmware = ParamsObj->get(uCentralProtocol::FIRMWARE).toString();
auto Capabilities = ParamsObj->get(uCentralProtocol::CAPABILITIES).toString();
//// change this
SerialNumber_ = Serial;
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
CommandManager()->ClearQueue(SerialNumberInt_);
DeviceRegistry()->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_, Capabilities, Firmware,
Compatible_, PeerAddress_);
} else if (DeviceExists) {
StorageService()->UpdateDeviceCapabilities(SerialNumber_, Capabilities,
Compatible_);
bool Updated = false;
if(!Firmware.empty() && Firmware!=DeviceInfo.Firmware) {
DeviceInfo.Firmware = Firmware;
Updated = true;
WebSocketClientNotificationDeviceFirmwareUpdated(SerialNumber_, Firmware);
}
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_);
if (KafkaManager()->Enabled()) { if (KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify; Poco::JSON::Object EventDetails;
ParamsObj->set(uCentralProtocol::CONNECTIONIP, CId_); EventDetails.set("oldFirmware", OldFirmware);
ParamsObj->set("locale", State_.locale ); EventDetails.set("newFirmware", NewFirmware);
ParamsObj->set(uCentralProtocol::TIMESTAMP, OpenWifi::Now()); Poco::JSON::Object Event;
Event.set("type", "device.firmware_change");
Event.set("timestamp", Utils::Now());
Event.set("payload", EventDetails);
std::ostringstream OS; std::ostringstream OS;
Stringify.condense(ParamsObj, OS); Event.stringify(OS);
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_, OS.str()); KafkaManager()->PostMessage(KafkaTopics::DEVICE_EVENT_QUEUE, SerialNumber, std::make_shared<std::string>(OS.str()));
} }
} else {
poco_warning(Logger_,fmt::format("INVALID-PROTOCOL({}): Missing one of uuid, firmware, or capabilities", CId_));
Errors_++;
} }
}
[[maybe_unused]] static void SendKafkaDeviceNotProvisioned( const std::string &SerialNumber,
const std::string &Firmware,
const std::string &DeviceType,
const std::string &IP) {
if (KafkaManager()->Enabled()) {
Poco::JSON::Object EventDetails;
EventDetails.set("firmware", Firmware);
EventDetails.set("deviceType", DeviceType);
EventDetails.set("IP", IP);
Poco::JSON::Object Event;
Event.set("type", "device.not_provisioned");
Event.set("timestamp", Utils::Now());
Event.set("payload", EventDetails);
std::ostringstream OS;
Event.stringify(OS);
KafkaManager()->PostMessage(KafkaTopics::DEVICE_EVENT_QUEUE, SerialNumber, std::make_shared<std::string>(OS.str()));
}
}
} 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 Capabilities = ParamsObj->getObject(uCentralProtocol::CAPABILITIES);
SerialNumber_ = Serial;
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
CommandManager()->ClearQueue(SerialNumberInt_);
AP_WS_Server()->SetSessionDetails(State_.sessionId, SerialNumberInt_);
std::lock_guard Lock(ConnectionMutex_);
Config::Capabilities Caps(Capabilities);
Compatible_ = Caps.Compatible();
State_.UUID = UUID;
State_.Firmware = Firmware;
State_.PendingUUID = 0;
State_.Address = Utils::FormatIPv6(WS_->peerAddress().toString());
CId_ = SerialNumber_ + "@" + CId_;
if(ParamsObj->has("reason")) {
State_.connectReason = ParamsObj->get("reason").toString();
}
auto IP = PeerAddress_.toString();
if (IP.substr(0, 7) == "::ffff:") {
IP = IP.substr(7);
}
bool RestrictedDevice = false;
if (Capabilities->has("restrictions")) {
RestrictedDevice = true;
Poco::JSON::Object::Ptr RestrictionObject = Capabilities->getObject("restrictions");
Restrictions_.from_json(RestrictionObject);
}
if (Capabilities->has("developer")) {
Restrictions_.developer = Capabilities->getValue<bool>("developer");
}
if(Capabilities->has("secure-rtty")) {
RttyMustBeSecure_ = Capabilities->getValue<bool>("secure-rtty");
}
State_.locale = FindCountryFromIP()->Get(IP);
GWObjects::Device DeviceInfo;
auto DeviceExists = StorageService()->GetDevice(SerialNumber_, DeviceInfo);
if (Daemon()->AutoProvisioning() && !DeviceExists) {
StorageService()->CreateDefaultDevice(SerialNumber_, Caps, Firmware, PeerAddress_, State_.VerifiedCertificate==GWObjects::SIMULATED );
} else if (!Daemon()->AutoProvisioning() && !DeviceExists) {
SendKafkaDeviceNotProvisioned(SerialNumber_, Firmware, Compatible_, CId_);
poco_warning(Logger(),fmt::format("Device {} is a {} from {} and cannot be provisioned.",SerialNumber_,Compatible_, CId_));
return EndConnection();
} else if (DeviceExists) {
StorageService()->UpdateDeviceCapabilities(SerialNumber_, Caps);
int Updated{0};
if (!Firmware.empty()) {
if (Firmware != DeviceInfo.Firmware) {
DeviceFirmwareChangeKafkaEvent KEvent(SerialNumberInt_, Utils::Now(),
DeviceInfo.Firmware, Firmware);
DeviceInfo.Firmware = Firmware;
DeviceInfo.LastFWUpdate = Utils::Now();
++Updated;
GWWebSocketNotifications::SingleDeviceFirmwareChange_t Notification;
Notification.content.serialNumber = SerialNumber_;
Notification.content.newFirmware = Firmware;
GWWebSocketNotifications::DeviceFirmwareUpdated(Notification);
} else if (DeviceInfo.LastFWUpdate == 0) {
DeviceInfo.LastFWUpdate = Utils::Now();
++Updated;
}
}
if (DeviceInfo.lastRecordedContact==0) {
DeviceInfo.lastRecordedContact = Utils::Now();
++Updated;
}
if (DeviceInfo.simulated && (State_.VerifiedCertificate!=GWObjects::SIMULATED)) {
DeviceInfo.simulated = false;
++Updated;
}
if (!DeviceInfo.simulated && (State_.VerifiedCertificate==GWObjects::SIMULATED)) {
DeviceInfo.simulated = true;
++Updated;
}
if (DeviceInfo.locale != State_.locale) {
DeviceInfo.locale = State_.locale;
++Updated;
}
if (Compatible_ != DeviceInfo.DeviceType) {
DeviceInfo.DeviceType = Compatible_;
++Updated;
}
if (RestrictedDevice != DeviceInfo.restrictedDevice) {
DeviceInfo.restrictedDevice = RestrictedDevice;
++Updated;
}
if (Restrictions_ != DeviceInfo.restrictionDetails) {
DeviceInfo.restrictionDetails = Restrictions_;
++Updated;
}
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_,
(int)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={}",
CId_, CN_, SerialNumber_, State_.sessionId));
return EndConnection();
}
}
} else {
poco_information(Logger_,
fmt::format("CONNECT({}): Simulator device. "
"Session={} ConnectionCompletion Time={}",
CId_, State_.sessionId,
State_.connectionCompletionTime));
}
GWWebSocketNotifications::SingleDevice_t Notification;
Notification.content.serialNumber = SerialNumber_;
GWWebSocketNotifications::DeviceConnected(Notification);
if (KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify;
ParamsObj->set(uCentralProtocol::CONNECTIONIP, CId_);
ParamsObj->set("locale", State_.locale);
ParamsObj->set(uCentralProtocol::TIMESTAMP, Utils::Now());
std::ostringstream OS;
Stringify.condense(ParamsObj, OS);
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_, std::make_shared<std::string>(OS.str()));
}
} else {
poco_warning(
Logger_,
fmt::format("INVALID-PROTOCOL({}): Missing one of uuid, firmware, or capabilities",
CId_));
Errors_++;
}
}
} // namespace OpenWifi

View File

@@ -5,9 +5,14 @@
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "StorageService.h" #include "StorageService.h"
#include "fmt/format.h"
#include "framework/ow_constants.h"
#include <GWKafkaEvents.h>
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_crashlog(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_crashlog(Poco::JSON::Object::Ptr ParamsObj) {
if (ParamsObj->has(uCentralProtocol::UUID) && ParamsObj->has(uCentralProtocol::LOGLINES)) { if (ParamsObj->has(uCentralProtocol::UUID)
&& ParamsObj->has(uCentralProtocol::LOGLINES)) {
poco_trace(Logger_, fmt::format("CRASH-LOG({}): new entry.", CId_)); poco_trace(Logger_, fmt::format("CRASH-LOG({}): new entry.", CId_));
auto LogLines = ParamsObj->get(uCentralProtocol::LOGLINES); auto LogLines = ParamsObj->get(uCentralProtocol::LOGLINES);
std::string LogText; std::string LogText;
@@ -21,14 +26,14 @@ namespace OpenWifi {
.Log = LogText, .Log = LogText,
.Data = "", .Data = "",
.Severity = GWObjects::DeviceLog::LOG_EMERG, .Severity = GWObjects::DeviceLog::LOG_EMERG,
.Recorded = (uint64_t)time(nullptr), .Recorded = Utils::Now(),
.LogType = 1, .LogType = 1,
.UUID = 0}; .UUID = ParamsObj->get(uCentralProtocol::UUID)};
StorageService()->AddLog(DeviceLog); StorageService()->AddLog(DeviceLog);
DeviceLogKafkaEvent E(DeviceLog);
} else { } else {
poco_warning(Logger_, fmt::format("LOG({}): Missing parameters.", CId_)); poco_warning(Logger_, fmt::format("LOG({}): Missing parameters.", CId_));
return; return;
} }
} }
} } // namespace OpenWifi

View File

@@ -5,12 +5,16 @@
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "StorageService.h" #include "StorageService.h"
#include "fmt/format.h"
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_deviceupdate(Poco::JSON::Object::Ptr ParamsObj, std::string &Serial) { void AP_WS_Connection::Process_deviceupdate(Poco::JSON::Object::Ptr ParamsObj,
std::string &Serial) {
if (!State_.Connected) { if (!State_.Connected) {
poco_warning(Logger_, fmt::format( poco_warning(Logger_,
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_)); fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
CId_, CN_));
Errors_++; Errors_++;
return; return;
} }
@@ -18,8 +22,10 @@ namespace OpenWifi {
auto Password = ParamsObj->get("currentPassword").toString(); auto Password = ParamsObj->get("currentPassword").toString();
StorageService()->SetDevicePassword(Serial, Password); StorageService()->SetDevicePassword(Serial, Password);
poco_trace(Logger_, fmt::format("DEVICEUPDATE({}): Device is updating its login password.", Serial)); poco_trace(
Logger_,
fmt::format("DEVICEUPDATE({}): Device is updating its login password.", Serial));
} }
} }
} } // namespace OpenWifi

View File

@@ -0,0 +1,49 @@
//
// Created by stephane bourque on 2023-01-22.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
#include "fmt/format.h"
#include "framework/KafkaManager.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void AP_WS_Connection::Process_event(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) {
poco_warning(Logger_,
fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
CId_, CN_));
Errors_++;
return;
}
poco_trace(Logger_, fmt::format("Event data received for {}", SerialNumber_));
try {
if (ParamsObj->has(uCentralProtocol::SERIAL) &&
ParamsObj->has(uCentralProtocol::DATA)) {
if (KafkaManager()->Enabled()) {
auto Data = ParamsObj->getObject(uCentralProtocol::DATA);
auto Event = Data->getArray("event");
auto EventTimeStamp = Event->getElement<std::uint64_t>(0);
auto EventDetails = Event->getObject(1);
auto EventType = EventDetails->get("type").extract<std::string>();
auto EventPayload = EventDetails->getObject("payload");
Poco::JSON::Object FullEvent;
FullEvent.set("type", EventType);
FullEvent.set("timestamp", EventTimeStamp);
FullEvent.set("payload", EventPayload);
std::ostringstream OS;
FullEvent.stringify(OS);
KafkaManager()->PostMessage(KafkaTopics::DEVICE_EVENT_QUEUE, SerialNumber_,
std::make_shared<std::string>(OS.str()));
}
}
} catch (const Poco::Exception &E) {
Logger_.log(E);
} catch (...) {
}
}
} // namespace OpenWifi

View File

@@ -5,67 +5,71 @@
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "StorageService.h" #include "StorageService.h"
#include "fmt/format.h"
#include "framework/KafkaManager.h"
#include "framework/utils.h"
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_healthcheck(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_healthcheck(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) { if (!State_.Connected) {
poco_warning(Logger_, fmt::format( poco_warning(Logger_,
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_)); fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
Errors_++; CId_, CN_));
return; Errors_++;
} return;
if (ParamsObj->has(uCentralProtocol::UUID) && ParamsObj->has(uCentralProtocol::SANITY) && }
ParamsObj->has(uCentralProtocol::DATA)) { if (ParamsObj->has(uCentralProtocol::UUID) &&
uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID); ParamsObj->has(uCentralProtocol::SANITY) &&
auto Sanity = ParamsObj->get(uCentralProtocol::SANITY); ParamsObj->has(uCentralProtocol::DATA)) {
auto CheckData = ParamsObj->get(uCentralProtocol::DATA).toString();
if (CheckData.empty())
CheckData = uCentralProtocol::EMPTY_JSON_DOC;
std::string request_uuid; uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
if (ParamsObj->has(uCentralProtocol::REQUEST_UUID)) auto Sanity = ParamsObj->get(uCentralProtocol::SANITY);
request_uuid = ParamsObj->get(uCentralProtocol::REQUEST_UUID).toString(); auto CheckData = ParamsObj->get(uCentralProtocol::DATA).toString();
if (CheckData.empty())
CheckData = uCentralProtocol::EMPTY_JSON_DOC;
if (request_uuid.empty()) { std::string request_uuid;
poco_trace(Logger_, if (ParamsObj->has(uCentralProtocol::REQUEST_UUID))
fmt::format("HEALTHCHECK({}): UUID={} Updating.", CId_, 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 = Utils::Now();
Check.UUID = UUID;
Check.Data = CheckData;
Check.Sanity = Sanity;
StorageService()->AddHealthCheckData(Check);
if (!request_uuid.empty()) {
StorageService()->SetCommandResult(request_uuid, CheckData);
}
SetLastHealthCheck(Check);
if (KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
ParamsObj->set("timestamp", Utils::Now());
Stringify.condense(ParamsObj, OS);
KafkaManager()->PostMessage(KafkaTopics::HEALTHCHECK, SerialNumber_, std::make_shared<std::string>(OS.str()));
}
} else { } else {
poco_trace(Logger_, poco_warning(Logger_, fmt::format("HEALTHCHECK({}): Missing parameter", CId_));
fmt::format("HEALTHCHECK({}): UUID={} Updating for CMD={}.", CId_, return;
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;
} }
}
} // namespace OpenWifi
}

View File

@@ -5,12 +5,16 @@
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "StorageService.h" #include "StorageService.h"
#include "fmt/format.h"
#include "framework/ow_constants.h"
#include <GWKafkaEvents.h>
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_log(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_log(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) { if (!State_.Connected) {
poco_warning( poco_warning(Logger_,
Logger_, fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_)); CId_, CN_));
Errors_++; Errors_++;
return; return;
} }
@@ -33,9 +37,10 @@ namespace OpenWifi {
.LogType = 0, .LogType = 0,
.UUID = State_.UUID}; .UUID = State_.UUID};
StorageService()->AddLog(DeviceLog); StorageService()->AddLog(DeviceLog);
DeviceLogKafkaEvent E(DeviceLog);
} else { } else {
poco_warning(Logger_, fmt::format("LOG({}): Missing parameters.", CId_)); poco_warning(Logger_, fmt::format("LOG({}): Missing parameters.", CId_));
return; return;
} }
} }
} } // namespace OpenWifi

View File

@@ -3,6 +3,8 @@
// //
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "fmt/format.h"
#include "framework/ow_constants.h"
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_ping(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_ping(Poco::JSON::Object::Ptr ParamsObj) {
@@ -13,4 +15,4 @@ namespace OpenWifi {
poco_warning(Logger_, fmt::format("PING({}): Missing parameter.", CId_)); poco_warning(Logger_, fmt::format("PING({}): Missing parameter.", CId_));
} }
} }
} } // namespace OpenWifi

View File

@@ -0,0 +1,44 @@
//
// Created by stephane bourque on 2023-05-16.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
#include "fmt/format.h"
#include "framework/ow_constants.h"
#include <GWKafkaEvents.h>
namespace OpenWifi {
void StripNulls(std::string &S) {
for(std::size_t i=0;i<S.size();++i) {
if(S[i]==0)
S[i]=' ';
}
}
void AP_WS_Connection::Process_rebootLog(Poco::JSON::Object::Ptr ParamsObj) {
if (ParamsObj->has(uCentralProtocol::UUID)
&& ParamsObj->isArray(uCentralProtocol::INFO)
&& ParamsObj->has(uCentralProtocol::TYPE)
&& ParamsObj->has(uCentralProtocol::DATE) ) {
poco_warning(Logger_, fmt::format("REBOOT-LOG({}): new entry.", CId_));
auto InfoLines = ParamsObj->getArray(uCentralProtocol::INFO);
std::ostringstream os;
InfoLines->stringify(os);
GWObjects::DeviceLog DeviceLog{.SerialNumber = SerialNumber_,
.Log = ParamsObj->get(uCentralProtocol::TYPE).toString(),
.Data = "{ \"info\" : " + os.str() + "}",
.Severity = GWObjects::DeviceLog::LOG_INFO,
.Recorded = ParamsObj->get(uCentralProtocol::DATE),
.LogType = 2,
.UUID = ParamsObj->get(uCentralProtocol::UUID)};
StorageService()->AddLog(DeviceLog);
DeviceLogKafkaEvent E(DeviceLog);
} else {
poco_warning(Logger_, fmt::format("REBOOT-LOG({}): Missing parameters.", CId_));
}
}
} // namespace OpenWifi

View File

@@ -3,8 +3,12 @@
// //
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "StorageService.h"
#include "CommandManager.h" #include "CommandManager.h"
#include "StorageService.h"
#include "fmt/format.h"
#include "framework/MicroServiceFuncs.h"
#include "framework/ow_constants.h"
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_recovery(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_recovery(Poco::JSON::Object::Ptr ParamsObj) {
@@ -36,7 +40,7 @@ namespace OpenWifi {
if (ParamsObj->get(uCentralProtocol::REBOOT).toString() == "true") { if (ParamsObj->get(uCentralProtocol::REBOOT).toString() == "true") {
GWObjects::CommandDetails Cmd; GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::CreateUUID(); Cmd.UUID = MicroServiceCreateUUID();
Cmd.SubmittedBy = uCentralProtocol::SUBMITTED_BY_SYSTEM; Cmd.SubmittedBy = uCentralProtocol::SUBMITTED_BY_SYSTEM;
Cmd.Status = uCentralProtocol::PENDING; Cmd.Status = uCentralProtocol::PENDING;
Cmd.Command = uCentralProtocol::REBOOT; Cmd.Command = uCentralProtocol::REBOOT;
@@ -47,16 +51,24 @@ namespace OpenWifi {
Poco::JSON::Stringifier::stringify(Params, O); Poco::JSON::Stringifier::stringify(Params, O);
Cmd.Details = O.str(); Cmd.Details = O.str();
bool Sent; bool Sent;
CommandManager()->PostCommand(CommandManager()->NextRPCId(),SerialNumber_, Cmd.Command, Params, Cmd.UUID, Sent); CommandManager()->PostCommand(CommandManager()->Next_RPC_ID(),
StorageService()->AddCommand(SerialNumber_, Cmd, Storage::CommandExecutionType::COMMAND_EXECUTED); APCommands::Commands::reboot, SerialNumber_,
poco_information(Logger_, fmt::format("RECOVERY({}): Recovery mode received, need for a reboot.", CId_)); Cmd.Command, Params, Cmd.UUID, Sent, false, false);
StorageService()->AddCommand(SerialNumber_, Cmd,
Storage::CommandExecutionType::COMMAND_EXECUTED);
poco_information(
Logger_,
fmt::format("RECOVERY({}): Recovery mode received, need for a reboot.", CId_));
} else { } else {
poco_information(Logger_, fmt::format( poco_information(
"RECOVERY({}): Recovery mode received, no need for a reboot.", CId_)); Logger_,
fmt::format("RECOVERY({}): Recovery mode received, no need for a reboot.",
CId_));
} }
} else { } else {
poco_warning(Logger_, fmt::format("RECOVERY({}): Recovery missing one of serialnumber, firmware, uuid, loglines, reboot", poco_warning(Logger_, fmt::format("RECOVERY({}): Recovery missing one of serialnumber, "
CId_)); "firmware, uuid, loglines, reboot",
CId_));
} }
} }
} } // namespace OpenWifi

View File

@@ -3,15 +3,22 @@
// //
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "StorageService.h"
#include "framework/WebSocketClientNotifications.h"
#include "StateUtils.h" #include "StateUtils.h"
#include "StorageService.h"
#include "UI_GW_WebSocketNotifications.h"
#include "framework/KafkaManager.h"
#include "framework/utils.h"
#include "fmt/format.h"
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_state(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_state(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) { if (!State_.Connected) {
poco_warning(Logger_, fmt::format( poco_warning(Logger_,
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_)); fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
CId_, CN_));
Errors_++; Errors_++;
return; return;
} }
@@ -28,40 +35,41 @@ namespace OpenWifi {
if (request_uuid.empty()) { if (request_uuid.empty()) {
poco_trace(Logger_, fmt::format("STATE({}): UUID={} Updating.", CId_, UUID)); poco_trace(Logger_, fmt::format("STATE({}): UUID={} Updating.", CId_, UUID));
} else { } else {
poco_trace(Logger_, fmt::format("STATE({}): UUID={} Updating for CMD={}.", poco_trace(Logger_, fmt::format("STATE({}): UUID={} Updating for CMD={}.", CId_,
CId_, UUID, request_uuid)); UUID, request_uuid));
} }
uint64_t UpgradedUUID; uint64_t UpgradedUUID;
LookForUpgrade(UUID,UpgradedUUID); LookForUpgrade(UUID, UpgradedUUID);
State_.UUID = UpgradedUUID; State_.UUID = UpgradedUUID;
LastStats_ = StateStr; SetLastStats(StateStr);
GWObjects::Statistics Stats{ GWObjects::Statistics Stats{
.SerialNumber = SerialNumber_, .UUID = UUID, .Data = StateStr}; .SerialNumber = SerialNumber_, .UUID = UUID, .Data = StateStr};
Stats.Recorded = OpenWifi::Now(); Stats.Recorded = Utils::Now();
StorageService()->AddStatisticsData(Stats); StorageService()->AddStatisticsData(Stats);
if (!request_uuid.empty()) { if (!request_uuid.empty()) {
StorageService()->SetCommandResult(request_uuid, StateStr); StorageService()->SetCommandResult(request_uuid, StateStr);
} }
StateUtils::ComputeAssociations(StateObj, State_.Associations_2G, StateUtils::ComputeAssociations(StateObj, State_.Associations_2G,
State_.Associations_5G); State_.Associations_5G, State_.Associations_6G);
if (KafkaManager()->Enabled()) { if (KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify; Poco::JSON::Stringifier Stringify;
std::ostringstream OS; std::ostringstream OS;
Stringify.condense(ParamsObj, OS); Stringify.condense(ParamsObj, OS);
KafkaManager()->PostMessage(KafkaTopics::STATE, SerialNumber_, OS.str()); KafkaManager()->PostMessage(KafkaTopics::STATE, SerialNumber_, std::make_shared<std::string>(OS.str()));
} }
WebSocketNotification<WebNotificationSingleDevice> N; GWWebSocketNotifications::SingleDevice_t N;
N.content.serialNumber = SerialNumber_; N.content.serialNumber = SerialNumber_;
N.type = "device_statistics"; GWWebSocketNotifications::DeviceStatistics(N);
WebSocketClientServer()->SendNotification(N);
} else { } else {
poco_warning(Logger_, fmt::format("STATE({}): Invalid request. Missing serial, uuid, or state", CId_)); poco_warning(
Logger_,
fmt::format("STATE({}): Invalid request. Missing serial, uuid, or state", CId_));
} }
} }
} } // namespace OpenWifi

View File

@@ -3,52 +3,67 @@
// //
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "TelemetryStream.h"
#include "CommandManager.h" #include "CommandManager.h"
#include "TelemetryStream.h"
#include "fmt/format.h"
#include "framework/KafkaManager.h"
#include "framework/utils.h"
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_telemetry(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_telemetry(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) { if (!State_.Connected) {
poco_warning(Logger_, fmt::format( poco_warning(Logger_,
"INVALID-PROTOCOL({}): Device '{}' is not following protocol", CId_, CN_)); fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
CId_, CN_));
Errors_++; Errors_++;
return; return;
} }
if (TelemetryReporting_) { poco_trace(Logger_, fmt::format("Telemetry data received for {}", SerialNumber_));
if (TelemetryReporting_ || ParamsObj->has("adhoc")) {
if (ParamsObj->has("data")) { if (ParamsObj->has("data")) {
auto Payload = ParamsObj->get("data").extract<Poco::JSON::Object::Ptr>(); auto Payload = ParamsObj->get("data").extract<Poco::JSON::Object::Ptr>();
Payload->set("timestamp", OpenWifi::Now()); Payload->set("timestamp", Utils::Now());
std::ostringstream SS; std::ostringstream SS;
Payload->stringify(SS); Payload->stringify(SS);
auto now=OpenWifi::Now(); auto now = Utils::Now();
auto KafkaPayload = std::make_shared<std::string>(SS.str());
if (ParamsObj->has("adhoc")) {
KafkaManager()->PostMessage(KafkaTopics::DEVICE_TELEMETRY, SerialNumber_,
KafkaPayload);
return;
}
if (TelemetryWebSocketRefCount_) { if (TelemetryWebSocketRefCount_) {
if(now<TelemetryWebSocketTimer_) { if (now < TelemetryWebSocketTimer_) {
// std::cout << SerialNumber_ << ": Updating WebSocket telemetry" << std::endl; // std::cout << SerialNumber_ << ": Updating WebSocket telemetry" <<
// std::endl;
TelemetryWebSocketPackets_++; TelemetryWebSocketPackets_++;
State_.websocketPackets = TelemetryWebSocketPackets_; State_.websocketPackets = TelemetryWebSocketPackets_;
TelemetryStream()->UpdateEndPoint(SerialNumberInt_, SS.str()); TelemetryStream()->NotifyEndPoint(SerialNumberInt_, *KafkaPayload);
} else { } else {
StopWebSocketTelemetry(CommandManager()->NextRPCId()); StopWebSocketTelemetry(CommandManager()->Next_RPC_ID());
} }
} }
if (TelemetryKafkaRefCount_) { if (TelemetryKafkaRefCount_) {
if(KafkaManager()->Enabled() && now<TelemetryKafkaTimer_) { if (KafkaManager()->Enabled() && now < TelemetryKafkaTimer_) {
// std::cout << SerialNumber_ << ": Updating Kafka telemetry" << std::endl; // std::cout << SerialNumber_ << ": Updating Kafka telemetry" << std::endl;
TelemetryKafkaPackets_++; TelemetryKafkaPackets_++;
State_.kafkaPackets = TelemetryKafkaPackets_; State_.kafkaPackets = TelemetryKafkaPackets_;
KafkaManager()->PostMessage(KafkaTopics::DEVICE_TELEMETRY, SerialNumber_, KafkaManager()->PostMessage(KafkaTopics::DEVICE_TELEMETRY, SerialNumber_,
SS.str()); KafkaPayload);
} else { } else {
StopKafkaTelemetry(CommandManager()->NextRPCId()); StopKafkaTelemetry(CommandManager()->Next_RPC_ID());
} }
} }
} else { } else {
poco_debug(Logger_,fmt::format("TELEMETRY({}): Invalid telemetry packet.",SerialNumber_)); poco_debug(Logger_,
fmt::format("TELEMETRY({}): Invalid telemetry packet.", SerialNumber_));
} }
} else { } else {
// if we are ignoring telemetry, then close it down on the device. // if we are ignoring telemetry, then close it down on the device.
poco_debug(Logger_,fmt::format("TELEMETRY({}): Stopping runaway telemetry.",SerialNumber_)); poco_debug(Logger_,
StopTelemetry(CommandManager()->NextRPCId()); fmt::format("TELEMETRY({}): Stopping runaway telemetry.", SerialNumber_));
StopTelemetry(CommandManager()->Next_RPC_ID());
} }
} }
} } // namespace OpenWifi

View File

@@ -7,11 +7,10 @@
namespace OpenWifi { namespace OpenWifi {
void AP_WS_Connection::Process_venuebroadcast(Poco::JSON::Object::Ptr ParamsObj) { void AP_WS_Connection::Process_venuebroadcast(Poco::JSON::Object::Ptr ParamsObj) {
if(ParamsObj->has("data") && ParamsObj->has("serial") && ParamsObj->has("timestamp")) { if (ParamsObj->has("data") && ParamsObj->has("serial") && ParamsObj->has("timestamp")) {
VenueBroadcaster()->Broadcast( VenueBroadcaster()->Broadcast(ParamsObj->get("serial").toString(),
ParamsObj->get("serial").toString(), ParamsObj->getObject("data"),
ParamsObj->get("data").toString(), ParamsObj->get("timestamp"));
ParamsObj->get("timestamp"));
} }
} }
} } // namespace OpenWifi

View File

@@ -0,0 +1,32 @@
//
// Created by stephane bourque on 2023-01-22.
//
#include "AP_WS_Connection.h"
#include "StorageService.h"
#include "fmt/format.h"
#include "framework/KafkaManager.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void AP_WS_Connection::Process_wifiscan(Poco::JSON::Object::Ptr ParamsObj) {
if (!State_.Connected) {
poco_warning(Logger_,
fmt::format("INVALID-PROTOCOL({}): Device '{}' is not following protocol",
CId_, CN_));
Errors_++;
return;
}
poco_trace(Logger_, fmt::format("Wifiscan data received for {}", SerialNumber_));
if (ParamsObj->has(uCentralProtocol::SERIAL) && ParamsObj->has(uCentralProtocol::DATA)) {
if (KafkaManager()->Enabled()) {
auto Data = ParamsObj->get(uCentralProtocol::DATA);
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(ParamsObj, OS);
KafkaManager()->PostMessage(KafkaTopics::WIFISCAN, SerialNumber_, std::make_shared<std::string>(OS.str()));
}
}
}
} // namespace OpenWifi

View File

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

View File

@@ -6,29 +6,42 @@
// Arilia Wireless Inc. // Arilia Wireless Inc.
// //
#include "Poco/Net/HTTPHeaderStream.h"
#include "Poco/JSON/Array.h"
#include "Poco/Net/Context.h" #include "Poco/Net/Context.h"
#include "Poco/Net/HTTPHeaderStream.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "AP_WS_Connection.h"
#include "AP_WS_Server.h" #include "AP_WS_Server.h"
#include "ConfigurationCache.h" #include "ConfigurationCache.h"
#include "TelemetryStream.h" #include "TelemetryStream.h"
#include "UI_GW_WebSocketNotifications.h"
#include "fmt/format.h"
#include "framework/MicroServiceFuncs.h"
#include "framework/utils.h"
#include <framework/KafkaManager.h>
namespace OpenWifi { namespace OpenWifi {
void AP_WS_RequestHandler::handleRequest(Poco::Net::HTTPServerRequest &request, void AP_WS_RequestHandler::handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) { Poco::Net::HTTPServerResponse &response) {
try { try {
AP_WS_Server()->AddConnection(id_,std::make_shared<AP_WS_Connection>(request,response,id_, Logger_, AP_WS_Server()->NextReactor())); AP_WS_Server()->AddConnection(
id_, std::make_shared<AP_WS_Connection>(request, response, id_, Logger_,
AP_WS_Server()->NextReactor()));
} catch (...) { } catch (...) {
poco_warning(Logger_,"Exception during WS creation"); poco_warning(Logger_, "Exception during WS creation");
} }
}; };
bool AP_WS_Server::ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate) { bool AP_WS_Server::ValidateCertificate(const std::string &ConnectionId,
if(IsCertOk()) { const Poco::Crypto::X509Certificate &Certificate) {
if(!Certificate.issuedBy(*IssuerCert_)) { if (IsCertOk()) {
poco_warning(Logger(),fmt::format("CERTIFICATE({}): issuer mismatch. Local='{}' Incoming='{}'", ConnectionId, IssuerCert_->issuerName(), Certificate.issuerName())); if (!Certificate.issuedBy(*IssuerCert_)) {
poco_warning(
Logger(),
fmt::format("CERTIFICATE({}): issuer mismatch. Local='{}' Incoming='{}'",
ConnectionId, IssuerCert_->issuerName(), Certificate.issuerName()));
return false; return false;
} }
return true; return true;
@@ -38,16 +51,20 @@ namespace OpenWifi {
int AP_WS_Server::Start() { int AP_WS_Server::Start() {
AllowSerialNumberMismatch_ = MicroService::instance().ConfigGetBool("openwifi.certificates.allowmismatch",true); AllowSerialNumberMismatch_ =
MismatchDepth_ = MicroService::instance().ConfigGetInt("openwifi.certificates.mismatchdepth",2); MicroServiceConfigGetBool("openwifi.certificates.allowmismatch", true);
MismatchDepth_ = MicroServiceConfigGetInt("openwifi.certificates.mismatchdepth", 2);
SessionTimeOut_ = MicroServiceConfigGetInt("openwifi.session.timeout", 10*60);
Reactor_pool_ = std::make_unique<AP_WS_ReactorThreadPool>(); Reactor_pool_ = std::make_unique<AP_WS_ReactorThreadPool>();
Reactor_pool_->Start(); Reactor_pool_->Start();
for(const auto & Svr : ConfigServersList_ ) { for (const auto &Svr : ConfigServersList_) {
poco_notice(Logger(),fmt::format("Starting: {}:{} Keyfile:{} CertFile: {}", Svr.Address(), poco_notice(Logger(),
Svr.Port(), Svr.KeyFile(), Svr.CertFile())); fmt::format("Starting: {}:{} Keyfile:{} CertFile: {}", Svr.Address(),
Svr.Port(), Svr.KeyFile(), Svr.CertFile()));
Svr.LogCert(Logger()); Svr.LogCert(Logger());
if (!Svr.RootCA().empty()) if (!Svr.RootCA().empty())
@@ -55,8 +72,8 @@ namespace OpenWifi {
if (!IsCertOk()) { if (!IsCertOk()) {
IssuerCert_ = std::make_unique<Poco::Crypto::X509Certificate>(Svr.IssuerCertFile()); IssuerCert_ = std::make_unique<Poco::Crypto::X509Certificate>(Svr.IssuerCertFile());
poco_information(Logger(), poco_information(
fmt::format("Certificate Issuer Name:{}", IssuerCert_->issuerName())); Logger(), fmt::format("Certificate Issuer Name:{}", IssuerCert_->issuerName()));
} }
Poco::Net::Context::Params P; Poco::Net::Context::Params P;
@@ -68,12 +85,8 @@ namespace OpenWifi {
P.dhUse2048Bits = true; P.dhUse2048Bits = true;
P.caLocation = Svr.Cas(); P.caLocation = Svr.Cas();
auto Context = Poco::AutoPtr<Poco::Net::Context>(new Poco::Net::Context(Poco::Net::Context::TLS_SERVER_USE, P)); 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 Cert(Svr.CertFile());
Poco::Crypto::X509Certificate Root(Svr.RootCA()); Poco::Crypto::X509Certificate Root(Svr.RootCA());
@@ -95,7 +108,8 @@ namespace OpenWifi {
Context->enableSessionCache(true); Context->enableSessionCache(true);
Context->enableExtendedCertificateVerification(false); Context->enableExtendedCertificateVerification(false);
// Context->disableStatelessSessionResumption(); // Context->disableStatelessSessionResumption();
Context->disableProtocols(Poco::Net::Context::PROTO_TLSV1 | Poco::Net::Context::PROTO_TLSV1_1); Context->disableProtocols(Poco::Net::Context::PROTO_TLSV1 |
Poco::Net::Context::PROTO_TLSV1_1);
auto WebServerHttpParams = new Poco::Net::HTTPServerParams; auto WebServerHttpParams = new Poco::Net::HTTPServerParams;
WebServerHttpParams->setMaxThreads(50); WebServerHttpParams->setMaxThreads(50);
@@ -109,25 +123,29 @@ namespace OpenWifi {
: Poco::Net::AddressFamily::IPv4)); : Poco::Net::AddressFamily::IPv4));
Poco::Net::SocketAddress SockAddr(Addr, Svr.Port()); Poco::Net::SocketAddress SockAddr(Addr, Svr.Port());
auto NewWebServer = std::make_unique<Poco::Net::HTTPServer>( auto NewWebServer = std::make_unique<Poco::Net::HTTPServer>(
new AP_WS_RequestHandlerFactory(Logger()), DeviceConnectionPool_, Poco::Net::SecureServerSocket(SockAddr, Svr.Backlog(), Context), WebServerHttpParams); new AP_WS_RequestHandlerFactory(Logger()), DeviceConnectionPool_,
Poco::Net::SecureServerSocket(SockAddr, Svr.Backlog(), Context),
WebServerHttpParams);
WebServers_.push_back(std::move(NewWebServer)); WebServers_.push_back(std::move(NewWebServer));
} else { } else {
Poco::Net::IPAddress Addr(Svr.Address()); Poco::Net::IPAddress Addr(Svr.Address());
Poco::Net::SocketAddress SockAddr(Addr, Svr.Port()); Poco::Net::SocketAddress SockAddr(Addr, Svr.Port());
auto NewWebServer = std::make_unique<Poco::Net::HTTPServer>( auto NewWebServer = std::make_unique<Poco::Net::HTTPServer>(
new AP_WS_RequestHandlerFactory(Logger()), DeviceConnectionPool_, Poco::Net::SecureServerSocket(SockAddr, Svr.Backlog(), Context), WebServerHttpParams); new AP_WS_RequestHandlerFactory(Logger()), DeviceConnectionPool_,
Poco::Net::SecureServerSocket(SockAddr, Svr.Backlog(), Context),
WebServerHttpParams);
WebServers_.push_back(std::move(NewWebServer)); WebServers_.push_back(std::move(NewWebServer));
} }
} }
for(auto &server:WebServers_) { for (auto &server : WebServers_) {
server->start(); server->start();
} }
ReactorThread_.start(Reactor_); ReactorThread_.start(Reactor_);
auto ProvString = MicroService::instance().ConfigGetString("autoprovisioning.process","default"); auto ProvString = MicroServiceConfigGetString("autoprovisioning.process", "default");
if(ProvString!="default") { if (ProvString != "default") {
auto Tokens = Poco::StringTokenizer(ProvString, ","); auto Tokens = Poco::StringTokenizer(ProvString, ",");
for (const auto &i : Tokens) { for (const auto &i : Tokens) {
if (i == "prov") if (i == "prov")
@@ -139,25 +157,403 @@ namespace OpenWifi {
UseDefaultConfig_ = true; UseDefaultConfig_ = true;
} }
SimulatorId_ = MicroService::instance().ConfigGetString("simulatorid",""); SimulatorId_ = MicroServiceConfigGetString("simulatorid", "");
SimulatorEnabled_ = !SimulatorId_.empty(); SimulatorEnabled_ = !SimulatorId_.empty();
Utils::SetThreadName(ReactorThread_,"dev:react:head"); 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(10 * 1000); // every minute
Timer_.start(*GarbageCollectorCallback_, MicroServiceTimerPool());
Running_ = true; Running_ = true;
return 0; return 0;
} }
void AP_WS_Server::onGarbageCollecting([[maybe_unused]] Poco::Timer &timer) {
static uint64_t last_log = Utils::Now();
auto now = Utils::Now();
{
std::lock_guard Lock(WSServerMutex_);
if (!Garbage_.empty()) {
Garbage_.clear();
}
NumberOfConnectedDevices_ = 0;
NumberOfConnectingDevices_ = 0;
AverageDeviceConnectionTime_ = 0;
uint64_t total_connected_time = 0;
auto hint = SerialNumbers_.begin();
while (hint != end(SerialNumbers_)) {
if (hint->second.second == nullptr) {
hint = SerialNumbers_.erase(hint);
} else if ((now - hint->second.second->State_.LastContact) > SessionTimeOut_) {
hint->second.second->EndConnection(false);
poco_information(Logger(),fmt::format("{}: Session seems idle. Controller disconnecting device.", hint->second.second->SerialNumber_));
Sessions_.erase(hint->second.second->State_.sessionId);
Garbage_.push_back(hint->second.second);
hint = SerialNumbers_.erase(hint);
} else if (hint->second.second->State_.Connected) {
NumberOfConnectedDevices_++;
total_connected_time += (now - hint->second.second->State_.started);
hint++;
} else {
NumberOfConnectingDevices_++;
hint++;
}
}
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_));
}
}
GWWebSocketNotifications::NumberOfConnection_t Notification;
Notification.content.numberOfConnectingDevices = NumberOfConnectingDevices_;
Notification.content.numberOfDevices = NumberOfConnectedDevices_;
Notification.content.averageConnectedTime = AverageDeviceConnectionTime_;
GetTotalDataStatistics(Notification.content.tx,Notification.content.rx);
GWWebSocketNotifications::NumberOfConnections(Notification);
Poco::JSON::Object KafkaNotification;
Notification.to_json(KafkaNotification);
Poco::JSON::Object FullEvent;
FullEvent.set("type", "load-update");
FullEvent.set("timestamp", now);
FullEvent.set("payload", KafkaNotification);
std::ostringstream OS;
FullEvent.stringify(OS);
KafkaManager()->PostMessage(KafkaTopics::DEVICE_EVENT_QUEUE, "system",
std::make_shared<std::string>(OS.str()));
}
void AP_WS_Server::Stop() { void AP_WS_Server::Stop() {
poco_information(Logger(),"Stopping..."); poco_information(Logger(), "Stopping...");
Running_ = false; Running_ = false;
for(auto &server:WebServers_) { Timer_.stop();
for (auto &server : WebServers_) {
server->stopAll(); server->stopAll();
} }
Reactor_pool_->Stop(); Reactor_pool_->Stop();
Reactor_.stop(); Reactor_.stop();
ReactorThread_.join(); ReactorThread_.join();
poco_information(Logger(),"Stopped..."); poco_information(Logger(), "Stopped...");
} }
} //namespace bool AP_WS_Server::GetStatistics(uint64_t SerialNumber, std::string &Statistics) const {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetLastStats(Statistics);
return true;
}
bool AP_WS_Server::GetState(uint64_t SerialNumber, GWObjects::ConnectionState &State) const {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetState(State);
return true;
}
bool AP_WS_Server::GetHealthcheck(uint64_t SerialNumber,
GWObjects::HealthCheck &CheckData) const {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetLastHealthCheck(CheckData);
return true;
}
void AP_WS_Server::SetSessionDetails(uint64_t connection_id, uint64_t SerialNumber) {
std::lock_guard Lock(WSServerMutex_);
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);
return;
}
}
bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t serial_number) {
std::lock_guard G(WSServerMutex_);
auto Session = Sessions_.find(session_id);
if (Session == end(Sessions_))
return false;
Garbage_.push_back(Session->second);
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::EndSessionUnSafe(uint64_t session_id, uint64_t serial_number) {
auto Session = Sessions_.find(session_id);
if (Session == end(Sessions_))
return false;
Garbage_.push_back(Session->second);
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,
GWObjects::DeviceRestrictions &Restrictions) const {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetRestrictions(Restrictions);
return DevicePtr->State_.Connected;
}
bool AP_WS_Server::Connected(uint64_t SerialNumber) const {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
return DevicePtr->State_.Connected;
}
bool AP_WS_Server::SendFrame(uint64_t SerialNumber, const std::string &Payload) const {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
try {
return DevicePtr->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(uint64_t RPCID, uint64_t SerialNumber) {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->StopWebSocketTelemetry(RPCID);
}
void
AP_WS_Server::SetWebSocketTelemetryReporting(uint64_t RPCID, uint64_t SerialNumber,
uint64_t Interval, uint64_t Lifetime,
const std::vector<std::string> &TelemetryTypes) {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->SetWebSocketTelemetryReporting(RPCID, Interval, Lifetime, TelemetryTypes);
}
void AP_WS_Server::SetKafkaTelemetryReporting(uint64_t RPCID, uint64_t SerialNumber,
uint64_t Interval, uint64_t Lifetime,
const std::vector<std::string> &TelemetryTypes) {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->SetKafkaTelemetryReporting(RPCID, Interval, Lifetime, TelemetryTypes);
}
void AP_WS_Server::StopKafkaTelemetry(uint64_t RPCID, uint64_t SerialNumber) {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->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::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->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::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
try {
return DevicePtr->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::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
try {
return DevicePtr->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::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
try {
return DevicePtr->SendRadiusCoAData(buffer, size);
} catch (...) {
poco_debug(Logger(),
fmt::format(": SendRadiusCoAData: Could not send data to device '{}'",
SerialNumber));
}
return false;
}
} // namespace OpenWifi

View File

@@ -8,56 +8,59 @@
#pragma once #pragma once
#include <mutex>
#include <thread>
#include <array> #include <array>
#include <ctime> #include <ctime>
#include <mutex>
#include "framework/MicroService.h" #include <thread>
#include "Poco/AutoPtr.h" #include "Poco/AutoPtr.h"
#include "Poco/Net/SocketReactor.h" #include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPServer.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/ParallelSocketAcceptor.h" #include "Poco/Net/ParallelSocketAcceptor.h"
#include "Poco/Net/SocketAcceptor.h" #include "Poco/Net/SocketAcceptor.h"
#include "Poco/Net/SocketReactor.h"
#include "Poco/Timer.h"
#include "AP_WS_Connection.h" #include "AP_WS_Connection.h"
#include "AP_WS_ReactorPool.h" #include "AP_WS_ReactorPool.h"
#include "framework/SubSystemServer.h"
#include "framework/utils.h"
namespace OpenWifi { namespace OpenWifi {
class AP_WS_RequestHandler : public Poco::Net::HTTPRequestHandler { class AP_WS_RequestHandler : public Poco::Net::HTTPRequestHandler {
public: public:
explicit AP_WS_RequestHandler(Poco::Logger &L, std::uint64_t id) explicit AP_WS_RequestHandler(Poco::Logger &L, uint64_t id) : Logger_(L), id_(id){};
: Logger_(L),
id_(id){
};
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
private: private:
Poco::Logger &Logger_; Poco::Logger &Logger_;
std::uint64_t id_=0; uint64_t id_ = 0;
}; };
class AP_WS_RequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory { class AP_WS_RequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
public: public:
inline explicit AP_WS_RequestHandlerFactory(Poco::Logger &L) inline explicit AP_WS_RequestHandlerFactory(Poco::Logger &L) : Logger_(L) {}
: Logger_(L) {
}
inline Poco::Net::HTTPRequestHandler * inline Poco::Net::HTTPRequestHandler *
createRequestHandler(const Poco::Net::HTTPServerRequest &request) override { createRequestHandler(const Poco::Net::HTTPServerRequest &request) override {
if (request.find("Upgrade") != request.end() && if (request.find("Upgrade") != request.end() &&
Poco::icompare(request["Upgrade"], "websocket") == 0) { Poco::icompare(request["Upgrade"], "websocket") == 0) {
Utils::SetThreadName("ws:conn-init"); Utils::SetThreadName("ws:conn-init");
return new AP_WS_RequestHandler(Logger_,id_++); return new AP_WS_RequestHandler(Logger_, id_++);
} else { } else {
return nullptr; return nullptr;
} }
} }
private: private:
Poco::Logger &Logger_; Poco::Logger &Logger_;
inline static std::uint64_t id_=1; inline static uint64_t id_ = 1;
}; };
class AP_WS_Server : public SubSystemServer { class AP_WS_Server : public SubSystemServer {
@@ -69,77 +72,202 @@ namespace OpenWifi {
int Start() override; int Start() override;
void Stop() override; void Stop() override;
bool IsCertOk() { return IssuerCert_!= nullptr; } bool IsCertOk() { return IssuerCert_ != nullptr; }
bool ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate); bool ValidateCertificate(const std::string &ConnectionId,
const Poco::Crypto::X509Certificate &Certificate);
// Poco::Net::SocketReactor & GetNextReactor() { return ReactorPool_.NextReactor(); } // Poco::Net::SocketReactor & GetNextReactor() { return ReactorPool_.NextReactor(); }
inline bool IsSimSerialNumber(const std::string & SerialNumber) const { inline bool IsSimSerialNumber(const std::string &SerialNumber) const {
return IsSim(Poco::toLower(SerialNumber)) && Poco::toLower(SerialNumber) == Poco::toLower(SimulatorId_); return IsSim(Poco::toLower(SerialNumber)) &&
Poco::toLower(SerialNumber) == Poco::toLower(SimulatorId_);
} }
inline static bool IsSim(const std::string & SerialNumber) { inline static bool IsSim(const std::string &SerialNumber) {
return SerialNumber.substr(0,6) == "53494d"; return SerialNumber.substr(0, 6) == "53494d";
} }
inline bool IsSimEnabled() const { inline bool IsSimEnabled() const { return SimulatorEnabled_; }
return SimulatorEnabled_;
}
inline bool AllowSerialNumberMismatch() const { inline bool AllowSerialNumberMismatch() const { return AllowSerialNumberMismatch_; }
return AllowSerialNumberMismatch_;
}
inline std::uint64_t MismatchDepth() const { inline uint64_t MismatchDepth() const { return MismatchDepth_; }
return MismatchDepth_;
}
inline bool UseProvisioning() const { return LookAtProvisioning_; } inline bool UseProvisioning() const { return LookAtProvisioning_; }
inline bool UseDefaults() const { return UseDefaultConfig_; } inline bool UseDefaults() const { return UseDefaultConfig_; }
[[nodiscard]] inline Poco::Net::SocketReactor & NextReactor() { return Reactor_pool_->NextReactor(); } [[nodiscard]] inline Poco::Net::SocketReactor &NextReactor() {
return Reactor_pool_->NextReactor();
}
[[nodiscard]] inline bool Running() const { return Running_; } [[nodiscard]] inline bool Running() const { return Running_; }
inline void AddConnection(std::uint64_t session_id, std::shared_ptr<AP_WS_Connection> Connection ) { inline void AddConnection(uint64_t session_id,
std::unique_lock Lock(LocalMutex_); std::shared_ptr<AP_WS_Connection> Connection) {
Connections_[session_id] = Connection; std::lock_guard Lock(WSServerMutex_);
Sessions_[session_id] = std::move(Connection);
} }
inline void DeleteConnection(std::uint64_t session_id) { inline std::shared_ptr<AP_WS_Connection> FindConnection(uint64_t session_id) const {
std::unique_lock Lock(LocalMutex_); std::lock_guard Lock(WSServerMutex_);
Connections_.erase(session_id);
}
inline std::shared_ptr<AP_WS_Connection> FindConnection(std::uint64_t session_id) const { auto Connection = Sessions_.find(session_id);
std::shared_lock Lock(LocalMutex_); if (Connection != end(Sessions_))
auto Connection = Connections_.find(session_id);
if(Connection!=end(Connections_))
return Connection->second; return Connection->second;
return nullptr; return nullptr;
} }
private: inline bool DeviceRequiresSecureRtty(uint64_t serialNumber) const {
mutable std::shared_mutex LocalMutex_; std::lock_guard Lock(WSServerMutex_);
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, 32};
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::shared_ptr<AP_WS_Connection>> Connections_;
std::atomic_bool AllowSerialNumberMismatch_=true;
std::atomic_uint64_t MismatchDepth_=2;
AP_WS_Server() noexcept: auto Connection = SerialNumbers_.find(serialNumber);
SubSystemServer("WebSocketServer", "WS-SVR", "ucentral.websocket") { if (Connection==end(SerialNumbers_) || Connection->second.second==nullptr)
return false;
return Connection->second.second->RttyMustBeSecure_;
} }
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) const;
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) const;
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) const;
bool Connected(uint64_t SerialNumber, GWObjects::DeviceRestrictions &Restrictions) 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(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(uint64_t connection_id, uint64_t SerialNumber);
bool EndSession(uint64_t connection_id, uint64_t serial_number);
bool EndSessionUnSafe(uint64_t session_id, uint64_t serial_number);
void SetWebSocketTelemetryReporting(uint64_t RPCID, uint64_t SerialNumber,
uint64_t Interval, uint64_t Lifetime,
const std::vector<std::string> &TelemetryTypes);
void StopWebSocketTelemetry(uint64_t RPCID, uint64_t SerialNumber);
void SetKafkaTelemetryReporting(uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval,
uint64_t Lifetime,
const std::vector<std::string> &TelemetryTypes);
void StopKafkaTelemetry(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(uint64_t &Connections, uint64_t &AverageConnectionTime,
uint64_t &NumberOfConnectingDevices) const {
Connections = NumberOfConnectedDevices_;
AverageConnectionTime = AverageDeviceConnectionTime_;
NumberOfConnectingDevices = NumberOfConnectingDevices_;
}
inline void AddRX(std::uint64_t bytes) {
std::lock_guard G(StatsMutex_);
RX_ += bytes;
}
inline void AddTX(std::uint64_t bytes) {
std::lock_guard G(StatsMutex_);
TX_ += bytes;
}
inline void GetTotalDataStatistics(std::uint64_t &TX, std::uint64_t &RX) const {
std::lock_guard G(StatsMutex_);
TX = TX_;
RX = RX_;
}
inline bool GetHealthDevices(std::uint64_t lowLimit, std::uint64_t highLimit, std::vector<std::string> & SerialNumbers) {
std::lock_guard G(WSServerMutex_);
for(const auto &connection:Sessions_) {
if( connection.second->RawLastHealthcheck_.Sanity>=lowLimit &&
connection.second->RawLastHealthcheck_.Sanity<=highLimit) {
SerialNumbers.push_back(connection.second->SerialNumber_);
}
}
return true;
}
inline bool ExtendedAttributes(const std::string &serialNumber,
bool & hasGPS,
std::uint64_t &Sanity,
std::double_t &MemoryUsed,
std::double_t &Load,
std::double_t &Temperature
) {
std::lock_guard G(WSServerMutex_);
auto session_hint = SerialNumbers_.find(Utils::SerialNumberToInt(serialNumber));
if(session_hint==end(SerialNumbers_)) {
return false;
}
hasGPS = session_hint->second.second->hasGPS;
Sanity = session_hint->second.second->RawLastHealthcheck_.Sanity;
MemoryUsed = session_hint->second.second->memory_used_;
Load = session_hint->second.second->cpu_load_;
Temperature = session_hint->second.second->temperature_;
return true;
}
private:
mutable std::recursive_mutex WSServerMutex_;
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::shared_ptr<AP_WS_Connection>> Sessions_;
std::map<uint64_t, std::pair<uint64_t, std::shared_ptr<AP_WS_Connection>>> SerialNumbers_;
std::atomic_bool AllowSerialNumberMismatch_ = true;
std::atomic_uint64_t MismatchDepth_ = 2;
std::uint64_t NumberOfConnectedDevices_ = 0;
std::uint64_t AverageDeviceConnectionTime_ = 0;
std::uint64_t NumberOfConnectingDevices_ = 0;
std::uint64_t SessionTimeOut_ = 10*60;
mutable std::mutex StatsMutex_;
std::atomic_uint64_t TX_=0,RX_=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(); } inline auto AP_WS_Server() { return AP_WS_Server::instance(); }
} //namespace } // namespace OpenWifi

View File

@@ -4,96 +4,104 @@
#pragma once #pragma once
#include "framework/MicroService.h" #include <fstream>
#include <map>
#include <mutex>
#include <string>
#include "framework/MicroServiceFuncs.h"
#include "CentralConfig.h"
#include "nlohmann/json.hpp" #include "nlohmann/json.hpp"
namespace OpenWifi { namespace OpenWifi {
const std::string PlatformCacheFileName{"/plat_cache.json"}; const std::string PlatformCacheFileName{"/plat_cache.json"};
const std::string CapabilitiesCacheFileName{"/caps_cache.json"}; const std::string CapabilitiesCacheFileName{"/caps_cache.json"};
typedef std::map<std::string,nlohmann::json> CapabilitiesCache_t; typedef std::map<std::string, nlohmann::json> CapabilitiesCache_t;
class CapabilitiesCache { class CapabilitiesCache {
public: public:
static auto instance() { static auto instance() {
static auto instance = new CapabilitiesCache; static auto instance = new CapabilitiesCache;
return instance; return instance;
} }
inline void Add(const std::string & DeviceType, const std::string & Platform, const std::string & FullCapabilities) { inline void Add(const Config::Capabilities &Caps) {
if(DeviceType.empty() || Platform.empty()) if (Caps.Compatible().empty() || Caps.Platform().empty())
return; return;
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);
if(!PlatformsLoaded_) if (!PlatformsLoaded_)
LoadPlatforms(); LoadPlatforms();
auto P = Poco::toUpper(Platform); auto P = Poco::toUpper(Caps.Platform());
auto Hint = Platforms_.find(DeviceType); auto Hint = Platforms_.find(Caps.Compatible());
if(Hint==Platforms_.end()) { if (Hint == Platforms_.end()) {
Platforms_.insert(std::make_pair(DeviceType,P)); Platforms_.insert(std::make_pair(Caps.Compatible(), P));
SavePlatforms(); SavePlatforms();
} else if(Hint->second != P) { } else if (Hint->second != P) {
Hint->second = P; Hint->second = P;
SavePlatforms(); SavePlatforms();
} }
if(!CapabilitiesLoaded_) if (!CapabilitiesLoaded_)
LoadCapabilities(); LoadCapabilities();
auto CapHint = Capabilities_.find(DeviceType); auto CapHint = Capabilities_.find(Caps.Compatible());
if(CapHint==Capabilities_.end()) { if (CapHint == Capabilities_.end()) {
Capabilities_[DeviceType] = nlohmann::json::parse(FullCapabilities); auto C = nlohmann::json::parse(Caps.AsString());
C.erase("restrictions");
Capabilities_[Caps.Compatible()] = nlohmann::json::parse(Caps.AsString());
SaveCapabilities(); SaveCapabilities();
} else { } else {
CapHint->second = nlohmann::json::parse(FullCapabilities); CapHint->second = nlohmann::json::parse(Caps.AsString());
SaveCapabilities(); SaveCapabilities();
} }
} }
inline std::string GetPlatform(const std::string & DeviceType) { inline std::string GetPlatform(const std::string &DeviceType) {
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);
if(!PlatformsLoaded_) { if (!PlatformsLoaded_) {
LoadPlatforms(); LoadPlatforms();
} }
auto Hint = Platforms_.find(DeviceType); auto Hint = Platforms_.find(DeviceType);
if(Hint==Platforms_.end()) if (Hint == Platforms_.end())
return "AP"; return "AP";
return Hint->second; return Hint->second;
} }
inline nlohmann::json GetCapabilities(const std::string & DeviceType) { inline nlohmann::json GetCapabilities(const std::string &DeviceType) {
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);
if(!CapabilitiesLoaded_) { if (!CapabilitiesLoaded_) {
LoadCapabilities(); LoadCapabilities();
} }
auto Hint = Capabilities_.find(DeviceType); auto Hint = Capabilities_.find(DeviceType);
if(Hint==Capabilities_.end()) if (Hint == Capabilities_.end())
return nlohmann::json{}; return nlohmann::json{};
return Hint->second; return Hint->second;
} }
inline const CapabilitiesCache_t & AllCapabilities() { inline const CapabilitiesCache_t &AllCapabilities() {
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);
if(!CapabilitiesLoaded_) { if (!CapabilitiesLoaded_) {
LoadCapabilities(); LoadCapabilities();
} }
return Capabilities_; return Capabilities_;
} }
private: private:
std::recursive_mutex Mutex_; std::recursive_mutex Mutex_;
std::atomic_bool PlatformsLoaded_=false; std::atomic_bool PlatformsLoaded_ = false;
std::atomic_bool CapabilitiesLoaded_=false; std::atomic_bool CapabilitiesLoaded_ = false;
std::map<std::string,std::string> Platforms_; std::map<std::string, std::string> Platforms_;
CapabilitiesCache_t Capabilities_; CapabilitiesCache_t Capabilities_;
std::string PlatformCacheFileName_{ MicroService::instance().DataDir()+PlatformCacheFileName }; std::string PlatformCacheFileName_{MicroServiceDataDirectory() + PlatformCacheFileName};
std::string CapabilitiesCacheFileName_{ MicroService::instance().DataDir()+CapabilitiesCacheFileName }; std::string CapabilitiesCacheFileName_{MicroServiceDataDirectory() +
CapabilitiesCacheFileName};
inline void LoadPlatforms() { inline void LoadPlatforms() {
try { try {
@@ -101,11 +109,10 @@ namespace OpenWifi {
nlohmann::json cache; nlohmann::json cache;
i >> cache; i >> cache;
for(const auto &[Type,Platform]:cache.items()) { for (const auto &[Type, Platform] : cache.items()) {
Platforms_[Type] = Platform; Platforms_[Type] = Platform;
} }
} catch(...) { } catch (...) {
} }
PlatformsLoaded_ = true; PlatformsLoaded_ = true;
} }
@@ -116,33 +123,35 @@ namespace OpenWifi {
nlohmann::json cache(Platforms_); nlohmann::json cache(Platforms_);
i << cache; i << cache;
} catch (...) { } catch (...) {
} }
} }
inline void LoadCapabilities() { inline void LoadCapabilities() {
try { try {
std::ifstream i(CapabilitiesCacheFileName_, std::ios_base::binary|std::ios_base::in); std::ifstream i(CapabilitiesCacheFileName_,
std::ios_base::binary | std::ios_base::in);
nlohmann::json cache; nlohmann::json cache;
i >> cache; i >> cache;
for(const auto &[Type,Caps]:cache.items()) { for (const auto &[Type, Caps] : cache.items()) {
Capabilities_[Type] = Caps; Capabilities_[Type] = Caps;
} }
} catch(...) { } catch (...) {
} }
CapabilitiesLoaded_ = true; CapabilitiesLoaded_ = true;
} }
inline void SaveCapabilities() { inline void SaveCapabilities() {
try { try {
std::ofstream i(CapabilitiesCacheFileName_, std::ios_base::trunc | std::ios_base::out | std::ios_base::binary ); std::ofstream i(CapabilitiesCacheFileName_,
std::ios_base::trunc | std::ios_base::out | std::ios_base::binary);
nlohmann::json cache(Capabilities_); nlohmann::json cache(Capabilities_);
i << cache; i << cache;
} catch (...) { } catch (...) {
} }
} }
}; };
}
inline auto CapabilitiesCache() { return CapabilitiesCache::instance(); };
} // namespace OpenWifi

View File

@@ -7,19 +7,17 @@
// //
#include <fstream> #include <fstream>
#include "framework/MicroService.h" #include "Poco/File.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h" #include "Poco/JSON/Parser.h"
#include "Poco/File.h"
#include "CentralConfig.h" #include "CentralConfig.h"
#include "Daemon.h" #include "Daemon.h"
namespace OpenWifi::Config { namespace OpenWifi::Config {
const static std::string BasicConfig { const static std::string BasicConfig{
R"lit( R"lit(
{ {
"interfaces": [ "interfaces": [
{ {
@@ -69,11 +67,11 @@ R"lit(
"ipv4": { "ipv4": {
"addressing": "static", "addressing": "static",
"dhcp": { "dhcp": {
"lease-count": 10000, "lease-count": 100,
"lease-first": 10, "lease-first": 10,
"lease-time": "6h" "lease-time": "6h"
}, },
"subnet": "192.168.1.1/16" "subnet": "192.168.1.1/24"
}, },
"name": "LAN", "name": "LAN",
"role": "downstream", "role": "downstream",
@@ -152,10 +150,11 @@ R"lit(
void Config::SetBasicConfigFile() { void Config::SetBasicConfigFile() {
try { try {
Poco::File DefaultConfigFileName{MicroService::instance().DataDir() + "/default_config.json"}; Poco::File DefaultConfigFileName{MicroService::instance().DataDir() +
"/default_config.json"};
DefaultConfiguration_ = BasicConfig; DefaultConfiguration_ = BasicConfig;
std::ofstream OS(DefaultConfigFileName.path(), std::ios::binary | std::ios::trunc ); std::ofstream OS(DefaultConfigFileName.path(), std::ios::binary | std::ios::trunc);
std::istringstream IS(DefaultConfiguration_); std::istringstream IS(DefaultConfiguration_);
Poco::StreamCopier::copyStream(IS, OS); Poco::StreamCopier::copyStream(IS, OS);
} catch (...) { } catch (...) {
DefaultConfiguration_ = BasicConfig; DefaultConfiguration_ = BasicConfig;
@@ -163,22 +162,23 @@ R"lit(
} }
Config::Config() { Config::Config() {
if(DefaultConfiguration_.empty()) if (DefaultConfiguration_.empty())
Init(); Init();
Config_ = DefaultConfiguration_; Config_ = DefaultConfiguration_;
} }
void Config::Init() { void Config::Init() {
if(DefaultConfiguration_.empty()) { if (DefaultConfiguration_.empty()) {
// open the file // open the file
try { try {
Poco::File DefaultConfigFileName{MicroService::instance().DataDir()+"/default_config.json"}; Poco::File DefaultConfigFileName{MicroService::instance().DataDir() +
"/default_config.json"};
if (!DefaultConfigFileName.exists()) { if (!DefaultConfigFileName.exists()) {
SetBasicConfigFile(); SetBasicConfigFile();
} else { } else {
std::ifstream F(DefaultConfigFileName.path(),std::ios::binary | std::ios::in); std::ifstream F(DefaultConfigFileName.path(), std::ios::binary | std::ios::in);
std::ostringstream C; std::ostringstream C;
Poco::StreamCopier::copyStream(F,C); Poco::StreamCopier::copyStream(F, C);
DefaultConfiguration_ = C.str(); DefaultConfiguration_ = C.str();
} }
} catch (...) { } catch (...) {
@@ -187,107 +187,89 @@ R"lit(
} }
} }
bool Config::SetUUID(uint64_t UUID) { bool Config::SetUUID(uint64_t UUID) {
try { try {
Poco::JSON::Parser Parser; Poco::JSON::Parser Parser;
auto Object = Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>(); auto Object = Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
Object->set("uuid", UUID); Object->set("uuid", UUID);
std::ostringstream NewConfig; std::ostringstream NewConfig;
Poco::JSON::Stringifier Stringifier; Poco::JSON::Stringifier Stringifier;
Stringifier.condense(Object, NewConfig); Stringifier.condense(Object, NewConfig);
Config_ = NewConfig.str(); Config_ = NewConfig.str();
return true; return true;
} } catch (const Poco::Exception &E) {
catch(const Poco::Exception &E) std::cout << __func__ << ": new Configuration failed with " << E.displayText()
{ << std::endl;
std::cout << __func__ << ": new Configuration failed with " << E.displayText() << std::endl; }
} return false;
return false; }
}
bool Config::Valid() { bool Config::Valid() {
try { try {
Poco::JSON::Parser Parser; Poco::JSON::Parser Parser;
auto object = Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>(); auto object = Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
if(object->has("uuid")) if (object->has("uuid"))
return true; return true;
return false;
}
catch (...)
{
return false; return false;
} } catch (...) {
} return false;
}
}
Poco::JSON::Object::Ptr Config::to_json() { Poco::JSON::Object::Ptr Config::to_json() {
Poco::JSON::Parser Parser; Poco::JSON::Parser Parser;
return Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>(); return Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
} }
std::string Config::Default() { std::string Config::Default() {
if(DefaultConfiguration_.empty()) if (DefaultConfiguration_.empty())
Init(); Init();
return DefaultConfiguration_; return DefaultConfiguration_;
} }
std::string Capabilities::Default() { /* std::string Capabilities::Default() {
return std::string(R"lit({"model":{"id":"linksys,ea8300","name":"Linksys EA8300 (Dallas)"}, return std::string(R"lit({"model":{"id":"linksys,ea8300","name":"Linksys EA8300
"network":{"lan":{"ifname":"eth0","protocol":"static"},"wan":{"ifname":"eth1","protocol":"dhcp"}}, (Dallas)"},
"switch":{"switch0":{"enable":true,"reset":true,"ports":[{"num":0,"device":"eth0","need_tag":false, "network":{"lan":{"ifname":"eth0","protocol":"static"},"wan":{"ifname":"eth1","protocol":"dhcp"}},
"want_untag":true},{"num":1,"role":"lan"},{"num":2,"role":"lan"},{"num":3,"role":"lan"},{"num":4,"role":"lan"}], "switch":{"switch0":{"enable":true,"reset":true,"ports":[{"num":0,"device":"eth0","need_tag":false,
"roles":[{"role":"lan","ports":"1 2 3 4 0","device":"eth0"}]}}, "want_untag":true},{"num":1,"role":"lan"},{"num":2,"role":"lan"},{"num":3,"role":"lan"},{"num":4,"role":"lan"}],
"wifi":{"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["5u"],"ht_capa":6639, "roles":[{"role":"lan","ports":"1 2 3 4 0","device":"eth0"}]}},
"vht_capa":865696178,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"tx_ant":3,"rx_ant":3, "wifi":{"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["5u"],"ht_capa":6639,
"channels":[100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165]}, "vht_capa":865696178,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"tx_ant":3,"rx_ant":3,
"platform/soc/a000000.wifi":{"band":["2"],"ht_capa":6639,"vht_capa":865687986, "channels":[100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165]},
"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"tx_ant":3,"rx_ant":3,"channels":[1,2,3,4,5,6,7,8,9,10,11]}, "platform/soc/a000000.wifi":{"band":["2"],"ht_capa":6639,"vht_capa":865687986,
"platform/soc/a800000.wifi":{"band":["5l"],"ht_capa":6639,"vht_capa":865687986,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"], "htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"tx_ant":3,"rx_ant":3,"channels":[1,2,3,4,5,6,7,8,9,10,11]},
"tx_ant":3,"rx_ant":3,"channels":[36,40,44,48,52,56,60,64]}}})lit"); "platform/soc/a800000.wifi":{"band":["5l"],"ht_capa":6639,"vht_capa":865687986,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],
} "tx_ant":3,"rx_ant":3,"channels":[36,40,44,48,52,56,60,64]}}})lit");
}
*/
void Capabilities::Parse() { Capabilities::Capabilities(const Poco::JSON::Object::Ptr &Caps) {
if(Capabilities_.empty()) try {
Capabilities_=Default();
try { if (Caps->has("compatible"))
Poco::JSON::Parser parser; Compatible_ = Caps->get("compatible").toString();
auto Result = parser.parse(Capabilities_); if (Caps->has("model"))
auto Objects = Result.extract<Poco::JSON::Object::Ptr>(); Model_ = Caps->get("model").toString();
if(Objects->has("compatible")) if (Caps->has("platform"))
Compatible_ = Objects->get("compatible").toString(); Platform_ = Caps->get("platform").toString();
if(Objects->has("model")) std::ostringstream OS;
Model_ = Objects->get("model").toString(); Caps->stringify(OS);
AsString_ = OS.str();
if(Objects->has("platform")) } catch (const Poco::Exception &E) {
Platform_ = Objects->get("platform").toString(); Daemon()->logger().log(E);
}
Parsed_ = true ;
}
catch ( const Poco::Exception & E )
{
Daemon()->logger().log(E);
}
}
const std::string & Capabilities::Compatible() {
if(!Parsed_)
Parse();
return Compatible_;
} }
const std::string & Capabilities::Model() { const std::string &Capabilities::Compatible() const { return Compatible_; }
if(!Parsed_)
Parse();
return Model_;
}
const std::string & Capabilities::Platform() { const std::string &Capabilities::Model() const { return Model_; }
if(!Parsed_)
Parse();
return Platform_;
}
} // namespace const std::string &Capabilities::Platform() const { return Platform_; }
const std::string &Capabilities::AsString() const { return AsString_; }
} // namespace OpenWifi::Config

View File

@@ -8,59 +8,55 @@
#pragma once #pragma once
#include <string>
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include <string>
namespace OpenWifi::Config { namespace OpenWifi::Config {
class Config { class Config {
public: public:
explicit Config(const std::string &Config) explicit Config(const std::string &Config) : Config_(Config) {}
:Config_(Config) {
}
Config(); Config();
bool SetUUID(uint64_t UUID); bool SetUUID(uint64_t UUID);
[[nodiscard]] bool Valid(); [[nodiscard]] bool Valid();
[[nodiscard]] std::string get() { return Config_; }; [[nodiscard]] std::string get() { return Config_; };
[[nodiscard]] std::string Default(); [[nodiscard]] std::string Default();
[[nodiscard]] Poco::JSON::Object::Ptr to_json(); [[nodiscard]] Poco::JSON::Object::Ptr to_json();
private: private:
void Init(); void Init();
void SetBasicConfigFile(); void SetBasicConfigFile();
inline static std::string DefaultConfiguration_ = ""; inline static std::string DefaultConfiguration_ = "";
std::string Config_; std::string Config_;
}; };
class Capabilities { class Capabilities {
public: public:
explicit Capabilities(std::string Caps) explicit Capabilities(const Poco::JSON::Object::Ptr &Caps);
: Capabilities_(std::move(Caps))
{
} /* Capabilities()
{
Capabilities_ = Default();
}
Capabilities() static std::string Default();
{
Capabilities_ = Default();
}
static std::string Default(); [[nodiscard]] const std::string & Get() const { return Capabilities_; };
[[nodiscard]] const std::string & Get() const { return Capabilities_; }; */
[[nodiscard]] const std::string & Compatible();
[[nodiscard]] const std::string & Model();
[[nodiscard]] const std::string & Platform();
private: [[nodiscard]] const std::string &Compatible() const;
std::string Capabilities_; [[nodiscard]] const std::string &Model() const;
bool Parsed_=false; [[nodiscard]] const std::string &Platform() const;
std::string Compatible_; [[nodiscard]] const std::string &AsString() const;
std::string Model_;
private:
std::string Compatible_;
std::string Model_;
std::string Platform_; std::string Platform_;
std::string AsString_;
void Parse(); void Parse();
}; };
} // namespace
} // namespace OpenWifi::Config

View File

@@ -8,14 +8,16 @@
#include <algorithm> #include <algorithm>
#include "framework/MicroService.h"
#include "Poco/JSON/Parser.h" #include "Poco/JSON/Parser.h"
#include "AP_WS_Server.h"
#include "CommandManager.h" #include "CommandManager.h"
#include "DeviceRegistry.h"
#include "StorageService.h" #include "StorageService.h"
#include "framework/MicroServiceFuncs.h"
#include "framework/ow_constants.h" #include "framework/ow_constants.h"
#include "framework/utils.h"
using namespace std::chrono_literals;
namespace OpenWifi { namespace OpenWifi {
@@ -29,38 +31,59 @@ namespace OpenWifi {
try { try {
if (Resp != nullptr) { if (Resp != nullptr) {
const Poco::JSON::Object &Payload = Resp->Payload_; Poco::JSON::Object::Ptr Payload = Resp->Payload_;
const std::string &SerialNumber = Resp->SerialNumber_; std::string SerialNumberStr = Utils::IntToSerialNumber(Resp->SerialNumber_);
std::ostringstream SS; if (!Payload->has(uCentralProtocol::ID)) {
Payload.stringify(SS); poco_error(Logger(),
fmt::format("({}): Invalid RPC response.", SerialNumberStr));
if (!Payload.has(uCentralProtocol::ID)) {
poco_error(Logger(), fmt::format("({}): Invalid RPC response.", SerialNumber));
} else { } else {
uint64_t ID = Payload.get(uCentralProtocol::ID); uint64_t ID = Payload->get(uCentralProtocol::ID);
poco_debug(Logger(),fmt::format("({}): Processing {} response.", SerialNumber, ID));
if (ID > 1) { if (ID > 1) {
std::unique_lock Lock(LocalMutex_); poco_debug(Logger(), fmt::format("({}): Processing {} response.",
SerialNumberStr, ID));
std::lock_guard Lock(LocalMutex_);
auto RPC = OutStandingRequests_.find(ID); auto RPC = OutStandingRequests_.find(ID);
if (RPC == OutStandingRequests_.end() || if (RPC == OutStandingRequests_.end()) {
RPC->second.SerialNumber != // std::cout << __LINE__ << std::endl;
Utils::SerialNumberToInt(Resp->SerialNumber_)) { poco_debug(Logger(), fmt::format("({}): RPC {} cannot be found.",
poco_debug(Logger(), SerialNumberStr, ID));
fmt::format("({}): RPC {} completed.", SerialNumber, ID)); } else if (RPC->second.SerialNumber != Resp->SerialNumber_) {
// std::cout << __LINE__ << std::endl;
poco_debug(
Logger(),
fmt::format("({}): RPC {} serial number mismatch {}!={}.",
SerialNumberStr, ID, RPC->second.SerialNumber,
Resp->SerialNumber_));
} else { } else {
std::shared_ptr<promise_type_t> TmpRpcEntry;
std::chrono::duration<double, std::milli> rpc_execution_time = std::chrono::duration<double, std::milli> rpc_execution_time =
std::chrono::high_resolution_clock::now() - std::chrono::high_resolution_clock::now() -
RPC->second.submitted; RPC->second.submitted;
StorageService()->CommandCompleted(RPC->second.UUID, Payload, // std::cout << __LINE__ << std::endl;
rpc_execution_time, true);
if (RPC->second.rpc_entry) {
RPC->second.rpc_entry->set_value(Payload);
}
poco_debug(Logger(), poco_debug(Logger(),
fmt::format("({}): Received RPC answer {}. Command={}", fmt::format("({}): Received RPC answer {}. Command={}",
SerialNumber, ID, RPC->second.Command)); SerialNumberStr, ID,
OutStandingRequests_.erase(ID); APCommands::to_string(RPC->second.Command)));
if (RPC->second.Command == APCommands::Commands::script) {
CompleteScriptCommand(RPC->second, Payload, rpc_execution_time);
} else if (RPC->second.Command == APCommands::Commands::telemetry) {
CompleteTelemetryCommand(RPC->second, Payload,
rpc_execution_time);
} else if (RPC->second.Command == APCommands::Commands::configure && RPC->second.rpc_entry==nullptr) {
CompleteConfigureCommand(RPC->second, Payload,
rpc_execution_time);
} else {
StorageService()->CommandCompleted(RPC->second.UUID, Payload,
rpc_execution_time, true);
if (RPC->second.rpc_entry) {
TmpRpcEntry = RPC->second.rpc_entry;
}
RPC->second.State = 0;
OutStandingRequests_.erase(ID);
if (TmpRpcEntry != nullptr)
TmpRpcEntry->set_value(Payload);
}
} }
} }
} }
@@ -68,217 +91,380 @@ namespace OpenWifi {
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger().log(E); Logger().log(E);
} catch (...) { } catch (...) {
poco_warning(Logger(),"Exception occurred during run."); poco_warning(Logger(), "Exception occurred during run.");
} }
NextMsg = ResponseQueue_.waitDequeueNotification(); NextMsg = ResponseQueue_.waitDequeueNotification();
} }
poco_information(Logger(),"RPC Command processor stopping."); poco_information(Logger(), "RPC Command processor stopping.");
} }
int CommandManager::Start() { bool CommandManager::CompleteTelemetryCommand(
poco_notice(Logger(),"Starting..."); CommandInfo &Command, [[maybe_unused]] const Poco::JSON::Object::Ptr &Payload,
std::chrono::duration<double, std::milli> rpc_execution_time) {
std::shared_ptr<promise_type_t> TmpRpcEntry;
StorageService()->CommandCompleted(Command.UUID, Payload, rpc_execution_time, true);
if (Command.rpc_entry) {
TmpRpcEntry = Command.rpc_entry;
}
Command.State = 0;
OutStandingRequests_.erase(Command.Id);
if (TmpRpcEntry != nullptr)
TmpRpcEntry->set_value(Payload);
return true;
}
bool CommandManager::CompleteConfigureCommand(
CommandInfo &Command, [[maybe_unused]] const Poco::JSON::Object::Ptr &Payload,
std::chrono::duration<double, std::milli> rpc_execution_time) {
std::shared_ptr<promise_type_t> TmpRpcEntry;
if (Command.rpc_entry) {
TmpRpcEntry = Command.rpc_entry;
}
StorageService()->CommandCompleted(Command.UUID, Payload, rpc_execution_time, true);
if (Payload->has("result")) {
auto Result = Payload->getObject("result");
if (Result->has("status") && Result->has("serial")) {
auto Status = Result->getObject("status");
auto SerialNumber = Result->get("serial").toString();
std::uint64_t Error = Status->get("error");
if (Error == 2) {
StorageService()->RollbackDeviceConfigurationChange(SerialNumber);
} else {
StorageService()->CompleteDeviceConfigurationChange(SerialNumber);
}
}
} else {
// std::cout << __LINE__ << std::endl;
}
Command.State = 0;
if (Command.rpc_entry) {
TmpRpcEntry = Command.rpc_entry;
}
OutStandingRequests_.erase(Command.Id);
if (TmpRpcEntry != nullptr)
TmpRpcEntry->set_value(Payload);
return true;
}
bool CommandManager::CompleteScriptCommand(
CommandInfo &Command, const Poco::JSON::Object::Ptr &Payload,
std::chrono::duration<double, std::milli> rpc_execution_time) {
bool Reply = true;
std::shared_ptr<promise_type_t> TmpRpcEntry;
if (Command.rpc_entry) {
TmpRpcEntry = Command.rpc_entry;
}
// std::cout << __LINE__ << " State=" << Command.State << std::endl;
if (Command.State == 2) {
// look at the payload to see if we should continue or not...
if (Payload->has("result")) {
auto Result = Payload->getObject("result");
if (Result->has("status")) {
auto Status = Result->getObject("status");
std::uint64_t Error = Status->get("error");
if (Error == 0) {
// std::cout << __LINE__ << std::endl;
StorageService()->CommandCompleted(Command.UUID, Payload,
rpc_execution_time, true);
Command.State = 1;
} else {
// std::cout << __LINE__ << std::endl;
StorageService()->CommandCompleted(Command.UUID, Payload,
rpc_execution_time, true);
std::string ErrorTxt = Status->get("result");
StorageService()->CancelWaitFile(Command.UUID, ErrorTxt);
Command.State = 0;
}
} else {
// std::cout << __LINE__ << std::endl;
}
} else {
// std::cout << __LINE__ << std::endl;
Command.State = 0;
}
} else if (Command.State == 1) {
// std::cout << "Completing script 2 phase commit." << std::endl;
StorageService()->CommandCompleted(Command.UUID, Payload, rpc_execution_time, true);
if (Command.Deferred) {
Reply = false;
}
Command.State = 0;
}
if (Command.State == 0) {
// std::cout << __LINE__ << " State=" << Command.State << std::endl;
OutStandingRequests_.erase(Command.Id);
}
if (Reply && TmpRpcEntry != nullptr)
TmpRpcEntry->set_value(Payload);
return true;
}
int CommandManager::Start() {
poco_notice(Logger(), "Starting...");
commandTimeOut_ = MicroServiceConfigGetInt("command.timeout", 4 * 60 * 60);
commandRetry_ = MicroServiceConfigGetInt("command.retry", 120);
janitorInterval_ = MicroServiceConfigGetInt("command.janitor", 2 * 60); // 1 hour
queueInterval_ = MicroServiceConfigGetInt("command.queue", 30);
ManagerThread.start(*this); ManagerThread.start(*this);
JanitorCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(*this,&CommandManager::onJanitorTimer); JanitorCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(
JanitorTimer_.setStartInterval( 10000 ); *this, &CommandManager::onJanitorTimer);
JanitorTimer_.setPeriodicInterval(10 * 60 * 1000); // 1 hours JanitorTimer_.setStartInterval(10000);
JanitorTimer_.start(*JanitorCallback_, MicroService::instance().TimerPool()); JanitorTimer_.setPeriodicInterval(janitorInterval_ * 1000); // 1 hours
JanitorTimer_.start(*JanitorCallback_, MicroServiceTimerPool());
CommandRunnerCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(*this,&CommandManager::onCommandRunnerTimer); CommandRunnerCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(
CommandRunnerTimer_.setStartInterval( 10000 ); *this, &CommandManager::onCommandRunnerTimer);
CommandRunnerTimer_.setPeriodicInterval(30 * 1000); // 1 hours CommandRunnerTimer_.setStartInterval(10000);
CommandRunnerTimer_.start(*CommandRunnerCallback_, MicroService::instance().TimerPool()); CommandRunnerTimer_.setPeriodicInterval(queueInterval_ * 1000); // 1 hours
CommandRunnerTimer_.start(*CommandRunnerCallback_, MicroServiceTimerPool());
return 0; return 0;
} }
void CommandManager::Stop() { void CommandManager::Stop() {
poco_notice(Logger(),"Stopping..."); poco_notice(Logger(), "Stopping...");
Running_ = false; Running_ = false;
JanitorTimer_.stop(); JanitorTimer_.stop();
CommandRunnerTimer_.stop(); CommandRunnerTimer_.stop();
ResponseQueue_.wakeUpAll(); ResponseQueue_.wakeUpAll();
ManagerThread.wakeUp(); ManagerThread.wakeUp();
ManagerThread.join(); ManagerThread.join();
poco_notice(Logger(),"Stopped..."); poco_notice(Logger(), "Stopped...");
} }
void CommandManager::WakeUp() { void CommandManager::WakeUp() {
poco_notice(Logger(),"Waking up..."); poco_notice(Logger(), "Waking up...");
ManagerThread.wakeUp(); ManagerThread.wakeUp();
} }
void CommandManager::onJanitorTimer([[maybe_unused]] Poco::Timer & timer) { void CommandManager::onJanitorTimer([[maybe_unused]] Poco::Timer &timer) {
std::unique_lock Lock(LocalMutex_); std::lock_guard Lock(LocalMutex_);
Utils::SetThreadName("cmd:janitor"); Utils::SetThreadName("cmd:janitor");
Poco::Logger & MyLogger = Poco::Logger::get("CMD-MGR-JANITOR"); Poco::Logger &MyLogger = Poco::Logger::get("CMD-MGR-JANITOR");
std::string TimeOutError("No response.");
auto now = std::chrono::high_resolution_clock::now(); auto now = std::chrono::high_resolution_clock::now();
for(auto request=OutStandingRequests_.begin();request!=OutStandingRequests_.end();) { for (auto request = OutStandingRequests_.begin(); request != OutStandingRequests_.end();) {
std::chrono::duration<double, std::milli> delta = now - request->second.submitted; std::chrono::duration<double, std::milli> delta = now - request->second.submitted;
if(delta > 10min) { if (delta > 10min) {
MyLogger.debug(fmt::format("{}: Command={} for {} Timed out.", // std::cout << __LINE__ << " -->> " << request->second.Id <<
request->second.UUID, // std::endl;
request->second.Command, MyLogger.debug(fmt::format("{}: Command={} for {} Timed out.", request->second.UUID,
APCommands::to_string(request->second.Command),
Utils::IntToSerialNumber(request->second.SerialNumber))); Utils::IntToSerialNumber(request->second.SerialNumber)));
if ((request->second.Command == APCommands::Commands::script &&
request->second.Deferred) ||
(request->second.Command == APCommands::Commands::trace)) {
StorageService()->CancelWaitFile(request->second.UUID, TimeOutError);
}
StorageService()->SetCommandTimedOut(request->second.UUID);
request = OutStandingRequests_.erase(request); request = OutStandingRequests_.erase(request);
} else { } else {
// std::cout << __LINE__ << " -->> " << request->second.Id <<
// std::endl;
++request; ++request;
} }
} }
poco_information(MyLogger, poco_information(MyLogger,
fmt::format("Outstanding-requests {}", OutStandingRequests_.size())); fmt::format("Outstanding-requests {}", OutStandingRequests_.size()));
} }
bool CommandManager::IsCommandRunning(const std::string &C) { bool CommandManager::IsCommandRunning(const std::string &C) {
std::shared_lock Lock(LocalMutex_); std::lock_guard Lock(LocalMutex_);
for (const auto &request : OutStandingRequests_) { return std::any_of(
if (request.second.UUID == C) { OutStandingRequests_.begin(), OutStandingRequests_.end(),
return true; [C](const std::pair<std::uint64_t, CommandInfo> &r) { return r.second.UUID == C; });
}
}
return false;
} }
void CommandManager::onCommandRunnerTimer([[maybe_unused]] Poco::Timer &timer) { void CommandManager::onCommandRunnerTimer([[maybe_unused]] Poco::Timer &timer) {
Utils::SetThreadName("cmd:schdlr"); Utils::SetThreadName("cmd:schdlr");
Poco::Logger &MyLogger = Poco::Logger::get("CMD-MGR-SCHEDULER"); Poco::Logger &MyLogger = Poco::Logger::get("CMD-MGR-SCHEDULER");
poco_trace(MyLogger,"Scheduler starting."); poco_trace(MyLogger, "Scheduler starting.");
try { try {
StorageService()->RemovedExpiredCommands(); StorageService()->RemovedExpiredCommands();
StorageService()->RemoveTimedOutCommands(); StorageService()->RemoveTimedOutCommands();
std::vector<GWObjects::CommandDetails> Commands; std::uint64_t offset = 0;
if (StorageService()->GetReadyToExecuteCommands(0, 200, Commands)) { bool Done = false;
poco_trace(MyLogger,fmt::format("Scheduler about to process {} commands.", Commands.size())); while (!Done) {
for (auto &Cmd : Commands) { std::vector<GWObjects::CommandDetails> Commands;
if (!Running_) { if (StorageService()->GetReadyToExecuteCommands(offset, 200, Commands)) {
poco_warning(MyLogger,"Scheduler quitting because service is stopping."); if(Commands.empty()) {
break; Done=true;
continue;
} }
poco_trace( poco_trace(MyLogger, fmt::format("Scheduler about to process {} commands.",
MyLogger, fmt::format("{}: Serial={} Command={} Starting processing.", Commands.size()));
Cmd.UUID, Cmd.SerialNumber, Cmd.Command)); for (auto &Cmd : Commands) {
try { 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 // Skip an already running command
if(IsCommandRunning(Cmd.UUID)) if (IsCommandRunning(Cmd.UUID)) {
continue; continue;
}
auto now = OpenWifi::Now(); auto now = Utils::Now();
// 2 hour timeout for commands // 2 hour timeout for commands
if ((now - Cmd.Submitted) > (1 * 60 * 60)) { if ((now - Cmd.Submitted) > commandTimeOut_) {
poco_information(
MyLogger, fmt::format("{}: Serial={} Command={} has expired.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
StorageService()->SetCommandTimedOut(Cmd.UUID);
continue;
}
auto SerialNumberInt = Utils::SerialNumberToInt(Cmd.SerialNumber);
if (!AP_WS_Server()->Connected(SerialNumberInt)) {
poco_trace(
MyLogger,
fmt::format("{}: Serial={} Command={} Device is not connected.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
StorageService()->SetCommandLastTry(Cmd.UUID);
continue;
}
std::string ExecutingUUID;
APCommands::Commands ExecutingCommand = APCommands::Commands::unknown;
if (CommandRunningForDevice(SerialNumberInt, ExecutingUUID,
ExecutingCommand)) {
poco_trace(
MyLogger,
fmt::format("{}: Serial={} Command={} Device is already busy "
"with command {} (Command={}).",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command,
ExecutingUUID,
APCommands::to_string(ExecutingCommand)));
continue;
}
Poco::JSON::Parser P;
bool Sent;
poco_information( poco_information(
MyLogger, fmt::format("{}: Serial={} Command={} has expired.", MyLogger,
Cmd.UUID, Cmd.SerialNumber, Cmd.Command)); fmt::format("{}: Serial={} Command={} Preparing execution.",
StorageService()->SetCommandTimedOut(Cmd.UUID); Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
continue; auto Params = P.parse(Cmd.Details).extract<Poco::JSON::Object::Ptr>();
} auto Result = PostCommandDisk(
Next_RPC_ID(), APCommands::to_apcommand(Cmd.Command.c_str()),
if (!DeviceRegistry()->Connected( Cmd.SerialNumber, Cmd.Command, *Params, Cmd.UUID, Sent);
Utils::SerialNumberToInt(Cmd.SerialNumber))) { if (Sent) {
poco_trace( 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));
StorageService()->SetCommandLastTry(Cmd.UUID);
}
} catch (const Poco::Exception &E) {
poco_debug(
MyLogger, MyLogger,
fmt::format( fmt::format(
"{}: Serial={} Command={} Device is not connected.", "{}: Serial={} Command={} Failed. Command marked as completed.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command)); Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
continue; MyLogger.log(E);
}
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); StorageService()->SetCommandExecuted(Cmd.UUID);
} catch (...) {
poco_debug(MyLogger, poco_debug(MyLogger,
fmt::format("{}: Serial={} Command={} Sent.", fmt::format("{}: Serial={} Command={} Hard failure. "
Cmd.UUID, Cmd.SerialNumber, Cmd.Command)); "Command marked as completed.",
} else { Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
poco_debug(MyLogger, StorageService()->SetCommandExecuted(Cmd.UUID);
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);
} }
offset += Commands.size();
} else {
Done=true;
continue;
} }
} }
} catch (Poco::Exception &E) {
MyLogger.log(E);
} catch (...) {
poco_warning(MyLogger,"Exception during command processing.");
} }
poco_trace(MyLogger,"Scheduler done."); 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( std::shared_ptr<CommandManager::promise_type_t> CommandManager::PostCommand(
uint64_t RPCID, uint64_t RPC_ID, APCommands::Commands Command, const std::string &SerialNumber,
const std::string &SerialNumber, const std::string &CommandStr, const Poco::JSON::Object &Params, const std::string &UUID,
const std::string &Command, bool oneway_rpc, [[maybe_unused]] bool disk_only, bool &Sent, bool rpc, bool Deferred) {
const Poco::JSON::Object &Params,
const std::string &UUID,
bool oneway_rpc,
bool disk_only,
bool & Sent) {
auto SerialNumberInt = Utils::SerialNumberToInt(SerialNumber); auto SerialNumberInt = Utils::SerialNumberToInt(SerialNumber);
Sent=false; Sent = false;
std::stringstream ToSend; std::stringstream ToSend;
CommandInfo Idx; CommandInfo CInfo;
Idx.Id = oneway_rpc ? 1 : RPCID; CInfo.Id = oneway_rpc ? 1 : RPC_ID;
Idx.SerialNumber = SerialNumberInt; CInfo.SerialNumber = SerialNumberInt;
Idx.Command = Command; CInfo.Command = Command;
Idx.UUID = UUID; CInfo.Deferred = Deferred;
CInfo.UUID = UUID;
if (Command == APCommands::Commands::script && Deferred) {
CInfo.State = 2;
} else {
CInfo.State = 1;
}
Poco::JSON::Object CompleteRPC; Poco::JSON::Object CompleteRPC;
CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION); CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
CompleteRPC.set(uCentralProtocol::ID, RPCID); CompleteRPC.set(uCentralProtocol::ID, RPC_ID);
CompleteRPC.set(uCentralProtocol::METHOD, Command); CompleteRPC.set(uCentralProtocol::METHOD, CommandStr);
CompleteRPC.set(uCentralProtocol::PARAMS, Params); CompleteRPC.set(uCentralProtocol::PARAMS, Params);
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend); Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
Idx.rpc_entry = disk_only ? nullptr : std::make_shared<CommandManager::promise_type_t>(); CInfo.rpc_entry = rpc ? std::make_shared<CommandManager::promise_type_t>() : nullptr;
poco_debug(Logger(), fmt::format("{}: Sending command. ID: {}", UUID, RPCID)); poco_debug(Logger(), fmt::format("{}: Sending command {} to {}. ID: {}", UUID, CommandStr,
if(DeviceRegistry()->SendFrame(SerialNumber, ToSend.str())) { SerialNumber, RPC_ID));
if(!oneway_rpc) { // Do not change the order. It is possible that an RPC completes before it is entered in
std::lock_guard M(Mutex_); // the map. So we insert it first, even if we may need to remove it later upon failure.
OutStandingRequests_[RPCID] = Idx; if (!oneway_rpc) {
} std::lock_guard M(Mutex_);
poco_debug(Logger(), fmt::format("{}: Sent command. ID: {}", UUID, RPCID)); OutStandingRequests_[RPC_ID] = CInfo;
Sent=true; }
return Idx.rpc_entry; if (AP_WS_Server()->SendFrame(SerialNumber, ToSend.str())) {
poco_debug(Logger(), fmt::format("{}: Sent command. ID: {}", UUID, RPC_ID));
Sent = true;
return CInfo.rpc_entry;
} else if (!oneway_rpc) {
std::lock_guard M(Mutex_);
OutStandingRequests_.erase(RPC_ID);
} }
poco_warning(Logger(), fmt::format("{}: Failed to send command. ID: {}", UUID, RPCID)); poco_warning(Logger(), fmt::format("{}: Failed to send command. ID: {}", UUID, RPC_ID));
return nullptr; return nullptr;
} }
} // namespace } // namespace OpenWifi

View File

@@ -9,200 +9,192 @@
#pragma once #pragma once
#include <chrono> #include <chrono>
#include <functional>
#include <future> #include <future>
#include <map> #include <map>
#include <utility>
#include <functional>
#include <shared_mutex> #include <shared_mutex>
#include <utility>
#include "framework/MicroService.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h" #include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Notification.h"
#include "Poco/NotificationQueue.h"
#include "Poco/Timer.h" #include "Poco/Timer.h"
#include "fmt/format.h"
#include "framework/SubSystemServer.h"
#include "RESTObjects/RESTAPI_GWobjects.h" #include "RESTObjects/RESTAPI_GWobjects.h"
namespace OpenWifi { namespace OpenWifi {
class RPCResponseNotification: public Poco::Notification { class RPCResponseNotification : public Poco::Notification {
public: public:
RPCResponseNotification(const std::string &ser, RPCResponseNotification(std::uint64_t ser, Poco::JSON::Object::Ptr pl)
const Poco::JSON::Object &pl) : : SerialNumber_(ser), Payload_(std::move(pl)) {}
SerialNumber_(ser), std::uint64_t SerialNumber_;
Payload_(pl) Poco::JSON::Object::Ptr Payload_;
{
}
std::string SerialNumber_;
Poco::JSON::Object Payload_;
}; };
class CommandManager : public SubSystemServer, Poco::Runnable { class CommandManager : public SubSystemServer, Poco::Runnable {
public: public:
typedef Poco::JSON::Object objtype_t; using objtype_t = Poco::JSON::Object::Ptr;
typedef std::promise<objtype_t> promise_type_t; using promise_type_t = std::promise<objtype_t>;
struct CommandInfo { struct CommandInfo {
std::uint64_t Id=0; std::uint64_t Id = 0;
std::uint64_t SerialNumber=0; std::uint64_t SerialNumber = 0;
std::string Command; APCommands::Commands Command;
std::string UUID; std::string UUID;
std::chrono::time_point<std::chrono::high_resolution_clock> submitted = std::chrono::high_resolution_clock::now(); std::uint64_t State = 1;
std::shared_ptr<promise_type_t> rpc_entry; std::chrono::time_point<std::chrono::high_resolution_clock> submitted =
}; std::chrono::high_resolution_clock::now();
std::shared_ptr<promise_type_t> rpc_entry;
bool Deferred = false;
};
struct RPCResponse { struct RPCResponse {
std::string serialNumber; std::uint64_t serialNumber;
Poco::JSON::Object payload; Poco::JSON::Object::Ptr payload;
explicit RPCResponse(const std::string &ser, const Poco::JSON::Object &pl) explicit RPCResponse(std::uint64_t ser, Poco::JSON::Object::Ptr pl)
: : serialNumber(ser), payload(std::move(pl)) {}
serialNumber(ser), };
payload(pl) {
}
};
int Start() override; int Start() override;
void Stop() override; void Stop() override;
void WakeUp(); void WakeUp();
inline void PostCommandResult(const std::string &SerialNumber, const Poco::JSON::Object &Obj) { inline void PostCommandResult(const std::string &SerialNumber,
// RPCResponseQueue_->Write(RPCResponse{.serialNumber=SerialNumber, .payload = Obj}); Poco::JSON::Object::Ptr Obj) {
ResponseQueue_.enqueueNotification(new RPCResponseNotification(SerialNumber,Obj)); ResponseQueue_.enqueueNotification(new RPCResponseNotification(
} Utils::SerialNumberToInt(SerialNumber), std::move(Obj)));
}
std::shared_ptr<promise_type_t> PostCommandOneWayDisk(uint64_t RPCID, std::shared_ptr<promise_type_t> PostCommandOneWayDisk(uint64_t RPC_ID,
const std::string &SerialNumber, APCommands::Commands Command,
const std::string &Method, const std::string &SerialNumber,
const Poco::JSON::Object &Params, const std::string &Method,
const std::string &UUID, const Poco::JSON::Object &Params,
bool & Sent) { const std::string &UUID, bool &Sent) {
return PostCommand(RPCID, SerialNumber, return PostCommand(RPC_ID, Command, SerialNumber, Method, Params, UUID, true, true,
Method, Sent, false);
Params, }
UUID,
true, true, Sent );
}
std::shared_ptr<promise_type_t> PostCommandDisk( std::shared_ptr<promise_type_t>
uint64_t RPCID, PostCommandDisk(uint64_t RPC_ID, APCommands::Commands Command,
const std::string &SerialNumber, const std::string &SerialNumber, const std::string &Method,
const std::string &Method, const Poco::JSON::Object &Params, const std::string &UUID, bool &Sent) {
const Poco::JSON::Object &Params, return PostCommand(RPC_ID, Command, SerialNumber, Method, Params, UUID, false, true,
const std::string &UUID, Sent, false);
bool & Sent) { }
return PostCommand(RPCID,
SerialNumber,
Method,
Params,
UUID,
false, true, Sent );
}
std::shared_ptr<promise_type_t> PostCommand( std::shared_ptr<promise_type_t>
uint64_t RPCID, PostCommand(uint64_t RPC_ID, APCommands::Commands Command, const std::string &SerialNumber,
const std::string &SerialNumber, const std::string &Method, const Poco::JSON::Object &Params,
const std::string &Method, const std::string &UUID, bool &Sent, bool rpc, bool Deferred) {
const Poco::JSON::Object &Params, return PostCommand(RPC_ID, Command, SerialNumber, Method, Params, UUID, false, false,
const std::string &UUID, Sent, rpc, Deferred);
bool & Sent) { }
return PostCommand(RPCID, SerialNumber,
Method,
Params,
UUID,
false,
false, Sent );
}
std::shared_ptr<promise_type_t> PostCommandOneWay( std::shared_ptr<promise_type_t>
uint64_t RPCID, PostCommandOneWay(uint64_t RPC_ID, APCommands::Commands Command,
const std::string &SerialNumber, const std::string &SerialNumber, const std::string &Method,
const std::string &Method, const Poco::JSON::Object &Params, const std::string &UUID, bool &Sent) {
const Poco::JSON::Object &Params, return PostCommand(RPC_ID, Command, SerialNumber, Method, Params, UUID, true, false,
const std::string &UUID, Sent, false);
bool & Sent) { }
return PostCommand(RPCID,
SerialNumber,
Method,
Params,
UUID,
true,
false, Sent );
}
bool IsCommandRunning(const std::string &C); bool IsCommandRunning(const std::string &C);
void run() override; void run() override;
static auto instance() { static auto instance() {
static auto instance_ = new CommandManager; static auto instance_ = new CommandManager;
return instance_; return instance_;
} }
inline bool Running() const { return Running_; } inline bool Running() const { return Running_; }
void onJanitorTimer(Poco::Timer & timer); void onJanitorTimer(Poco::Timer &timer);
void onCommandRunnerTimer(Poco::Timer & timer); void onCommandRunnerTimer(Poco::Timer &timer);
void onRPCAnswer(bool& b); inline uint64_t Next_RPC_ID() { return ++Id_; }
inline uint64_t NextRPCId() { return ++Id_; }
void RemovePendingCommand(std::uint64_t Id) { void RemovePendingCommand(std::uint64_t Id) {
std::unique_lock Lock(LocalMutex_); std::unique_lock Lock(LocalMutex_);
OutStandingRequests_.erase(Id); OutStandingRequests_.erase(Id);
} }
inline bool CommandRunningForDevice(std::uint64_t SerialNumber, std::string & uuid, std::string &command) { inline bool CommandRunningForDevice(std::uint64_t SerialNumber, std::string &uuid,
std::shared_lock Lock(LocalMutex_); APCommands::Commands &command) {
std::lock_guard Lock(LocalMutex_);
for(const auto &[Request,Command]:OutStandingRequests_) { for (const auto &[Request, Command] : OutStandingRequests_) {
if(Command.SerialNumber==SerialNumber) { if (Command.SerialNumber == SerialNumber) {
uuid = Command.UUID; uuid = Command.UUID;
command = Command.Command; command = Command.Command;
return true; return true;
}
}
return false;
}
inline void ClearQueue(std::uint64_t SerialNumber) {
std::unique_lock Lock(LocalMutex_);
for(auto Request = OutStandingRequests_.begin(); Request != OutStandingRequests_.end() ; ) {
if(Request->second.SerialNumber==SerialNumber)
Request = OutStandingRequests_.erase(Request);
else
++Request;
} }
} }
return false;
}
private: inline void ClearQueue(std::uint64_t SerialNumber) {
mutable std::shared_mutex LocalMutex_; std::lock_guard Lock(LocalMutex_);
std::atomic_bool Running_ = false; for (auto Request = OutStandingRequests_.begin();
Poco::Thread ManagerThread; Request != OutStandingRequests_.end();) {
std::atomic_uint64_t Id_=3; // do not start @1. We ignore ID=1 & 0 is illegal.. if (Request->second.SerialNumber == SerialNumber)
std::map<std::uint64_t , CommandInfo> OutStandingRequests_; Request = OutStandingRequests_.erase(Request);
Poco::Timer JanitorTimer_; else
std::unique_ptr<Poco::TimerCallback<CommandManager>> JanitorCallback_; ++Request;
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,
const std::string &UUID,
bool oneway_rpc,
bool disk_only,
bool & Sent);
CommandManager() noexcept:
SubSystemServer("CommandManager", "CMD-MGR", "command.manager") {
} }
}
inline void RemoveCommand(const std::string &UUID) {
std::lock_guard Lock(LocalMutex_);
for (const auto &[Id, Cmd] : OutStandingRequests_) {
if (Cmd.UUID == UUID) {
OutStandingRequests_.erase(Id);
return;
}
}
}
inline auto CommandTimeout() const { return commandTimeOut_; }
inline auto CommandRetry() const { return commandRetry_; }
private:
mutable std::recursive_mutex LocalMutex_;
std::atomic_bool Running_ = false;
Poco::Thread ManagerThread;
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::uint64_t commandTimeOut_ = 0;
std::uint64_t commandRetry_ = 0;
std::uint64_t janitorInterval_ = 0;
std::uint64_t queueInterval_ = 0;
std::shared_ptr<promise_type_t>
PostCommand(uint64_t RPCID, APCommands::Commands Command, 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,
bool rpc_call, bool Deferred = false);
bool CompleteScriptCommand(CommandInfo &Command, const Poco::JSON::Object::Ptr &Payload,
std::chrono::duration<double, std::milli> rpc_execution_time);
bool CompleteTelemetryCommand(CommandInfo &Command, const Poco::JSON::Object::Ptr &Payload,
std::chrono::duration<double, std::milli> rpc_execution_time);
bool CompleteConfigureCommand(CommandInfo &Command, const Poco::JSON::Object::Ptr &Payload,
std::chrono::duration<double, std::milli> rpc_execution_time);
CommandManager() noexcept
: SubSystemServer("CommandManager", "CMD-MGR", "command.manager") {}
}; };
inline auto CommandManager() { return CommandManager::instance(); } inline auto CommandManager() { return CommandManager::instance(); }
} // namespace } // namespace OpenWifi

View File

@@ -5,15 +5,13 @@
#pragma once #pragma once
#include <map> #include <map>
#include <string>
#include <mutex> #include <mutex>
#include "framework/MicroService.h" #include <string>
namespace OpenWifi { namespace OpenWifi {
class ConfigurationCache { class ConfigurationCache {
public: public:
static ConfigurationCache &instance() {
static ConfigurationCache & instance() {
static ConfigurationCache instance; static ConfigurationCache instance;
return instance; return instance;
} }
@@ -21,30 +19,30 @@ namespace OpenWifi {
inline uint64_t CurrentConfig(uint64_t SerialNumber) { inline uint64_t CurrentConfig(uint64_t SerialNumber) {
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);
const auto Hint = Cache_.find(SerialNumber); const auto Hint = Cache_.find(SerialNumber);
if(Hint==end(Cache_)) if (Hint == end(Cache_))
return 0; return 0;
return Hint->second; return Hint->second;
} }
inline void Add(uint64_t SerialNumber, uint64_t Id) { inline void Add(uint64_t SerialNumber, uint64_t Id) {
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);
Cache_[SerialNumber]=Id; Cache_[SerialNumber] = Id;
} }
private: private:
std::recursive_mutex Mutex_; std::recursive_mutex Mutex_;
std::map<uint64_t,uint64_t> Cache_; std::map<uint64_t, uint64_t> Cache_;
}; };
inline uint64_t GetCurrentConfigurationID(uint64_t SerialNumber) { inline uint64_t GetCurrentConfigurationID(uint64_t SerialNumber) {
return ConfigurationCache::instance().CurrentConfig(SerialNumber); return ConfigurationCache::instance().CurrentConfig(SerialNumber);
} }
inline void SetCurrentConfigurationID(const std::string & SerialNumber, uint64_t ID) { inline void SetCurrentConfigurationID(const std::string &SerialNumber, uint64_t ID) {
return ConfigurationCache::instance().Add(Utils::SerialNumberToInt(SerialNumber), ID); return ConfigurationCache::instance().Add(Utils::SerialNumberToInt(SerialNumber), ID);
} }
inline void SetCurrentConfigurationID(uint64_t SerialNumber, uint64_t ID) { inline void SetCurrentConfigurationID(uint64_t SerialNumber, uint64_t ID) {
return ConfigurationCache::instance().Add(SerialNumber, ID); return ConfigurationCache::instance().Add(SerialNumber, ID);
} }
} } // namespace OpenWifi

View File

@@ -6,113 +6,79 @@
// Arilia Wireless Inc. // Arilia Wireless Inc.
// //
#include "framework/MicroService.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/Option.h"
#include "Poco/Environment.h" #include "Poco/Environment.h"
#include "Poco/Net/SSLManager.h" #include "Poco/Net/SSLManager.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/Option.h"
#include <framework/ConfigurationValidator.h>
#include <framework/UI_WebSocketClientServer.h>
#include <framework/default_device_types.h>
#include "AP_WS_Server.h" #include "AP_WS_Server.h"
#include "CommandManager.h" #include "CommandManager.h"
#include "Daemon.h" #include "Daemon.h"
#include "DeviceRegistry.h"
#include "FileUploader.h" #include "FileUploader.h"
#include "FindCountry.h" #include "FindCountry.h"
#include "OUIServer.h" #include "OUIServer.h"
#include "RADIUSSessionTracker.h"
#include "RADIUS_proxy_server.h" #include "RADIUS_proxy_server.h"
#include "RegulatoryInfo.h"
#include "ScriptManager.h"
#include "SerialNumberCache.h" #include "SerialNumberCache.h"
#include "SignatureMgr.h"
#include "StorageArchiver.h" #include "StorageArchiver.h"
#include "StorageService.h" #include "StorageService.h"
#include "TelemetryStream.h" #include "TelemetryStream.h"
#include "GenericScheduler.h"
#include "UI_GW_WebSocketNotifications.h"
#include "VenueBroadcaster.h" #include "VenueBroadcaster.h"
#include "framework/ConfigurationValidator.h" #include "AP_WS_ConfigAutoUpgrader.h"
#include "rttys/RTTYS_server.h" #include "rttys/RTTYS_server.h"
namespace OpenWifi { namespace OpenWifi {
class Daemon *Daemon::instance() { class Daemon *Daemon::instance() {
static Daemon instance(vDAEMON_PROPERTIES_FILENAME, static Daemon instance(
vDAEMON_ROOT_ENV_VAR, vDAEMON_PROPERTIES_FILENAME, vDAEMON_ROOT_ENV_VAR, vDAEMON_CONFIG_ENV_VAR,
vDAEMON_CONFIG_ENV_VAR, vDAEMON_APP_NAME, vDAEMON_BUS_TIMER,
vDAEMON_APP_NAME, SubSystemVec{GenericScheduler(), StorageService(), SerialNumberCache(), ConfigurationValidator(),
vDAEMON_BUS_TIMER, UI_WebSocketClientServer(), OUIServer(), FindCountryFromIP(),
SubSystemVec{ CommandManager(), FileUploader(), StorageArchiver(), TelemetryStream(),
StorageService(), RTTYS_server(), RADIUS_proxy_server(), VenueBroadcaster(), ScriptManager(),
SerialNumberCache(), SignatureManager(), AP_WS_Server(),
ConfigurationValidator(), RegulatoryInfo(),
WebSocketClientServer(), RADIUSSessionTracker(),
OUIServer(), AP_WS_ConfigAutoUpgrader()
FindCountryFromIP(), });
DeviceRegistry(), return &instance;
CommandManager(),
FileUploader(),
StorageArchiver(),
TelemetryStream(),
RTTYS_server(),
RADIUS_proxy_server(),
VenueBroadcaster(),
AP_WS_Server()
});
return &instance;
} }
static const std::vector<std::pair<std::string,std::string>> DefaultDeviceTypes{
{"cig_wf160d","AP"},
{"cig_wf188","AP"},
{"cig_wf188n","AP"},
{"cig_wf194c","AP"},
{"cig_wf194c4","AP"},
{"edgecore_eap101","AP"},
{"edgecore_eap102","AP"},
{"edgecore_ecs4100-12ph","AP"},
{"edgecore_ecw5211","AP"},
{"edgecore_ecw5410","AP"},
{"edgecore_oap100","AP"},
{"edgecore_spw2ac1200","SWITCH"},
{"edgecore_spw2ac1200-lan-poe","SWITCH"},
{"edgecore_ssw2ac2600","SWITCH"},
{"hfcl_ion4","AP"},
{"indio_um-305ac","AP"},
{"linksys_e8450-ubi","AP"},
{"linksys_ea6350","AP"},
{"linksys_ea6350-v4","AP"},
{"linksys_ea8300","AP"},
{"mikrotik_nand","AP"},
{"tp-link_ec420-g1","AP"},
{"tplink_cpe210_v3","AP"},
{"tplink_cpe510_v3","AP"},
{"tplink_eap225_outdoor_v1","AP"},
{"tplink_ec420","AP"},
{"tplink_ex227","AP"},
{"tplink_ex228","AP"},
{"tplink_ex447","AP"},
{"wallys_dr40x9","AP"}
};
void Daemon::PostInitialization([[maybe_unused]] Poco::Util::Application &self) { void Daemon::PostInitialization([[maybe_unused]] Poco::Util::Application &self) {
AutoProvisioning_ = config().getBool("openwifi.autoprovisioning",false); AutoProvisioning_ = config().getBool("openwifi.autoprovisioning", false);
DeviceTypes_ = DefaultDeviceTypes; DeviceTypes_ = DefaultDeviceTypeList;
WebSocketProcessor_ = std::make_unique<GwWebSocketClient>(logger()); WebSocketProcessor_ = std::make_unique<GwWebSocketClient>(logger());
} }
[[nodiscard]] std::string Daemon::IdentifyDevice(const std::string & Id ) const { [[nodiscard]] std::string Daemon::IdentifyDevice(const std::string &Id) const {
for(const auto &[DeviceType,Type]:DeviceTypes_) for (const auto &[DeviceType, Type] : DeviceTypes_) {
{ if (Id == DeviceType)
if(Id == DeviceType) return Type;
return Type; }
} return "AP";
return "AP"; }
}
} void DaemonPostInitialization(Poco::Util::Application &self) {
Daemon()->PostInitialization(self);
GWWebSocketNotifications::Register();
}
} // namespace OpenWifi
int main(int argc, char **argv) { int main(int argc, char **argv) {
int ExitCode; int ExitCode;
try { try {
Poco::Net::SSLManager::instance().initializeServer(nullptr, nullptr, nullptr); Poco::Net::SSLManager::instance().initializeServer(nullptr, nullptr, nullptr);
auto App = OpenWifi::Daemon::instance(); auto App = OpenWifi::Daemon::instance();
ExitCode = App->run(argc, argv); ExitCode = App->run(argc, argv);
Poco::Net::SSLManager::instance().shutdown(); Poco::Net::SSLManager::instance().shutdown();
} catch (Poco::Exception &exc) { } catch (Poco::Exception &exc) {
ExitCode = Poco::Util::Application::EXIT_SOFTWARE; ExitCode = Poco::Util::Application::EXIT_SOFTWARE;

View File

@@ -9,61 +9,47 @@
#pragma once #pragma once
#include <array> #include <array>
#include <iostream>
#include <cstdlib> #include <cstdlib>
#include <vector> #include <iostream>
#include <set> #include <set>
#include <vector>
#include "framework/MicroService.h" #include "framework/MicroService.h"
#include "framework/MicroServiceNames.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/ServerApplication.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/UUIDGenerator.h"
#include "Poco/ErrorHandler.h"
#include "Poco/Crypto/RSAKey.h"
#include "Poco/Crypto/CipherFactory.h"
#include "Poco/Crypto/Cipher.h"
#include "Dashboard.h" #include "Dashboard.h"
#include "framework/OpenWifiTypes.h"
#include "GwWebSocketClient.h" #include "GwWebSocketClient.h"
#include "framework/OpenWifiTypes.h"
namespace OpenWifi { namespace OpenWifi {
[[maybe_unused]] static const char * vDAEMON_PROPERTIES_FILENAME = "owgw.properties"; [[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_ROOT_ENV_VAR = "OWGW_ROOT";
[[maybe_unused]] static const char * vDAEMON_CONFIG_ENV_VAR = "OWGW_CONFIG"; [[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 char *vDAEMON_APP_NAME = uSERVICE_GATEWAY.c_str();
[[maybe_unused]] static const uint64_t vDAEMON_BUS_TIMER = 10000; [[maybe_unused]] static const uint64_t vDAEMON_BUS_TIMER = 10000;
class Daemon : public MicroService { class Daemon : public MicroService {
public: public:
explicit Daemon(const std::string & PropFile, explicit Daemon(const std::string &PropFile, const std::string &RootEnv,
const std::string & RootEnv, const std::string &ConfigEnv, const std::string &AppName, uint64_t BusTimer,
const std::string & ConfigEnv, const SubSystemVec &SubSystems)
const std::string & AppName, : MicroService(PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems){};
uint64_t BusTimer,
const SubSystemVec & SubSystems) :
MicroService( PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems) {};
bool AutoProvisioning() const { return AutoProvisioning_ ; } bool AutoProvisioning() const { return AutoProvisioning_; }
[[nodiscard]] std::string IdentifyDevice(const std::string & Compatible) const; [[nodiscard]] std::string IdentifyDevice(const std::string &Compatible) const;
static Daemon *instance(); static Daemon *instance();
inline DeviceDashboard & GetDashboard() { return DB_; } inline DeviceDashboard &GetDashboard() { return DB_; }
Poco::Logger & Log() { return Poco::Logger::get(AppName()); } Poco::Logger &Log() { return Poco::Logger::get(AppName()); }
void PostInitialization(Poco::Util::Application &self); 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(); } private:
inline void DaemonPostInitialization(Poco::Util::Application &self) { bool AutoProvisioning_ = false;
Daemon()->PostInitialization(self); std::vector<std::pair<std::string, std::string>> DeviceTypes_;
} DeviceDashboard DB_;
} std::unique_ptr<GwWebSocketClient> WebSocketProcessor_;
};
inline Daemon *Daemon() { return Daemon::instance(); }
void DaemonPostInitialization(Poco::Util::Application &self);
} // namespace OpenWifi

View File

@@ -3,18 +3,48 @@
// //
#include "Dashboard.h" #include "Dashboard.h"
#include "DeviceRegistry.h"
#include "StorageService.h" #include "StorageService.h"
#include "framework/utils.h"
namespace OpenWifi { namespace OpenWifi {
void DeviceDashboard::Create() {
uint64_t Now = OpenWifi::Now();
if(LastRun_==0 || (Now-LastRun_)>120) { bool DeviceDashboard::Get(GWObjects::Dashboard &D, Poco::Logger &Logger) {
DB_.reset(); uint64_t Now = Utils::Now();
StorageService()->AnalyzeCommands(DB_.commands); if (!ValidDashboard_ || LastRun_ == 0 || (Now - LastRun_) > 120) {
StorageService()->AnalyzeDevices(DB_); Generate(D, Logger);
LastRun_ = Now; } else {
std::lock_guard G(DataMutex_);
D = DB_;
}
return ValidDashboard_;
};
void DeviceDashboard::Generate(GWObjects::Dashboard &D, Poco::Logger &Logger) {
if (GeneratingDashboard_.load()) {
// std::cout << "Trying to generate dashboard but already being generated" << std::endl;
while (GeneratingDashboard_.load()) {
Poco::Thread::trySleep(100);
}
std::lock_guard G(DataMutex_);
D = DB_;
} else {
GeneratingDashboard_ = true;
ValidDashboard_ = false;
try {
// std::cout << "Generating dashboard." << std::endl;
poco_information(Logger, "DASHBOARD: Generating a new dashboard.");
GWObjects::Dashboard NewData;
StorageService()->AnalyzeCommands(NewData.commands);
StorageService()->AnalyzeDevices(NewData);
LastRun_ = Utils::Now();
NewData.snapshot = LastRun_;
D = NewData;
std::lock_guard G(DataMutex_);
DB_ = NewData;
ValidDashboard_ = true;
} catch (...) {
}
GeneratingDashboard_ = false;
} }
} }
} } // namespace OpenWifi

View File

@@ -4,19 +4,24 @@
#pragma once #pragma once
#include <mutex>
#include "Poco/Logger.h"
#include "RESTObjects//RESTAPI_GWobjects.h" #include "RESTObjects//RESTAPI_GWobjects.h"
#include "framework/OpenWifiTypes.h" #include "framework/OpenWifiTypes.h"
namespace OpenWifi { namespace OpenWifi {
class DeviceDashboard { class DeviceDashboard {
public: public:
DeviceDashboard() { DB_.reset(); } bool Get(GWObjects::Dashboard &D, Poco::Logger &Logger);
void Create();
[[nodiscard]] const GWObjects::Dashboard & Report() const { return DB_;}
private:
GWObjects::Dashboard DB_;
uint64_t LastRun_=0;
inline void Reset() { DB_.reset(); }
};
}
private:
std::mutex DataMutex_;
volatile std::atomic_bool GeneratingDashboard_ = false;
volatile bool ValidDashboard_ = false;
GWObjects::Dashboard DB_;
uint64_t LastRun_ = 0;
void Generate(GWObjects::Dashboard &D, Poco::Logger &Logger);
};
} // namespace OpenWifi

View File

@@ -1,263 +0,0 @@
//
// 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/JSON/Object.h"
#include "AP_WS_Server.h"
#include "DeviceRegistry.h"
#include "CommandManager.h"
#include "framework/WebSocketClientNotifications.h"
namespace OpenWifi {
int DeviceRegistry::Start() {
std::lock_guard Guard(Mutex_);
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_);
Timer_.stop();
poco_notice(Logger(),"Stopped...");
}
void DeviceRegistry::onConnectionJanitor([[maybe_unused]] Poco::Timer &timer) {
static std::uint64_t last_log = OpenWifi::Now();
std::shared_lock Guard(LocalMutex_);
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_);
}
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::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

@@ -1,104 +0,0 @@
//
// 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 <shared_mutex>
#include "framework/MicroService.h"
#include "Poco/JSON/Object.h"
#include "Poco/Timer.h"
#include "RESTObjects//RESTAPI_GWobjects.h"
namespace OpenWifi {
class AP_WS_Connection;
class DeviceRegistry : public SubSystemServer {
public:
DeviceRegistry() noexcept:
SubSystemServer("DeviceRegistry", "DevStatus", "devicestatus") {
}
static auto instance() {
static auto instance_ = new DeviceRegistry;
return instance_;
}
int Start() override;
void Stop() override;
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 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:
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;
};
inline auto DeviceRegistry() { return DeviceRegistry::instance(); }
} // namespace

View File

@@ -8,42 +8,47 @@
#include <iostream> #include <iostream>
#include "framework/MicroService.h" #include "Poco/CountingStream.h"
#include "Poco/DynamicAny.h"
#include "Poco/Exception.h"
#include "Poco/File.h"
#include "Poco/Net/HTTPServerParams.h" #include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/HTTPServerResponse.h" #include "Poco/Net/HTTPServerResponse.h"
#include "Poco/DynamicAny.h"
#include "Poco/Net/PartHandler.h"
#include "Poco/Net/MessageHeader.h" #include "Poco/Net/MessageHeader.h"
#include "Poco/Net/MultipartReader.h" #include "Poco/Net/MultipartReader.h"
#include "Poco/CountingStream.h" #include "Poco/Net/PartHandler.h"
#include "Poco/StreamCopier.h" #include "Poco/StreamCopier.h"
#include "Poco/Exception.h" #include "Poco/StringTokenizer.h"
#include "framework/MicroServiceFuncs.h"
#include "framework/ow_constants.h"
#include "framework/utils.h"
#include "FileUploader.h" #include "FileUploader.h"
#include "StorageService.h" #include "StorageService.h"
#include "fmt/format.h"
namespace OpenWifi { namespace OpenWifi {
static const std::string URI_BASE{"/v1/upload/"}; static const std::string URI_BASE{"/v1/upload/"};
int FileUploader::Start() { int FileUploader::Start() {
poco_notice(Logger(),"Starting."); poco_notice(Logger(), "Starting.");
Poco::File UploadsDir(MicroService::instance().ConfigPath("openwifi.fileuploader.path","/tmp")); Poco::File UploadsDir(MicroServiceConfigPath("openwifi.fileuploader.path", "/tmp"));
Path_ = UploadsDir.path(); Path_ = UploadsDir.path();
if(!UploadsDir.exists()) { if (!UploadsDir.exists()) {
try { try {
UploadsDir.createDirectory(); UploadsDir.createDirectory();
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger().log(E); Logger().log(E);
Path_ = "/tmp"; Path_ = "/tmp";
} }
} }
for(const auto & Svr: ConfigServersList_) { for (const auto &Svr : ConfigServersList_) {
if(MicroService::instance().NoAPISecurity()) { if (MicroServiceNoAPISecurity()) {
poco_notice(Logger(), fmt::format("Starting: {}:{}",Svr.Address(),Svr.Port())); poco_notice(Logger(), fmt::format("Starting: {}:{}", Svr.Address(), Svr.Port()));
auto Sock{Svr.CreateSocket(Logger())}; auto Sock{Svr.CreateSocket(Logger())};
@@ -54,14 +59,14 @@ namespace OpenWifi {
if (FullName_.empty()) { if (FullName_.empty()) {
std::string TmpName = std::string TmpName =
MicroService::instance().ConfigGetString("openwifi.fileuploader.uri", ""); MicroServiceConfigGetString("openwifi.fileuploader.uri", "");
if (TmpName.empty()) { if (TmpName.empty()) {
FullName_ = FullName_ =
"https://" + Svr.Name() + ":" + std::to_string(Svr.Port()) + URI_BASE; "https://" + Svr.Name() + ":" + std::to_string(Svr.Port()) + URI_BASE;
} else { } else {
FullName_ = TmpName + URI_BASE; FullName_ = TmpName + URI_BASE;
} }
poco_information(Logger(),fmt::format("Uploader URI base is '{}'", FullName_)); poco_information(Logger(), fmt::format("Uploader URI base is '{}'", FullName_));
} }
auto NewServer = std::make_unique<Poco::Net::HTTPServer>( auto NewServer = std::make_unique<Poco::Net::HTTPServer>(
@@ -72,7 +77,7 @@ namespace OpenWifi {
} else { } else {
std::string l{"Starting: " + Svr.Address() + ":" + std::to_string(Svr.Port()) + std::string l{"Starting: " + Svr.Address() + ":" + std::to_string(Svr.Port()) +
" key:" + Svr.KeyFile() + " cert:" + Svr.CertFile()}; " key:" + Svr.KeyFile() + " cert:" + Svr.CertFile()};
poco_information(Logger(),l); poco_information(Logger(), l);
auto Sock{Svr.CreateSecureSocket(Logger())}; auto Sock{Svr.CreateSecureSocket(Logger())};
@@ -87,7 +92,7 @@ namespace OpenWifi {
if (FullName_.empty()) { if (FullName_.empty()) {
std::string TmpName = std::string TmpName =
MicroService::instance().ConfigGetString("openwifi.fileuploader.uri", ""); MicroServiceConfigGetString("openwifi.fileuploader.uri", "");
if (TmpName.empty()) { if (TmpName.empty()) {
FullName_ = FullName_ =
"https://" + Svr.Name() + ":" + std::to_string(Svr.Port()) + URI_BASE; "https://" + Svr.Name() + ":" + std::to_string(Svr.Port()) + URI_BASE;
@@ -102,68 +107,62 @@ namespace OpenWifi {
NewServer->start(); NewServer->start();
Servers_.push_back(std::move(NewServer)); Servers_.push_back(std::move(NewServer));
} }
} }
MaxSize_ = 1000 * MicroService::instance().ConfigGetInt("openwifi.fileuploader.maxsize", 10000); MaxSize_ = 1000 * MicroServiceConfigGetInt("openwifi.fileuploader.maxsize", 10000);
return 0; return 0;
} }
void FileUploader::reinitialize([[maybe_unused]] Poco::Util::Application &self) { void FileUploader::reinitialize([[maybe_unused]] Poco::Util::Application &self) {
MicroService::instance().LoadConfigurationFile(); MicroServiceLoadConfigurationFile();
poco_information(Logger(),"Reinitializing."); poco_information(Logger(), "Reinitializing.");
Stop(); Stop();
Start(); Start();
} }
const std::string & FileUploader::FullName() { const std::string &FileUploader::FullName() { return FullName_; }
return FullName_;
}
// if you pass in an empty UUID, it will just clean the list and not add it. // if you pass in an empty UUID, it will just clean the list and not add it.
bool FileUploader::AddUUID( const std::string & UUID) { bool FileUploader::AddUUID(const std::string &UUID, std::chrono::seconds WaitTimeInSeconds,
std::lock_guard Guard(Mutex_); const std::string &Type) {
std::lock_guard Guard(Mutex_);
uint64_t now = OpenWifi::Now(); uint64_t now = Utils::Now();
auto Func = [now](const UploadId &I) -> bool { return (now > I.Expires); };
OutStandingUploads_.erase(
std::remove_if(OutStandingUploads_.begin(), OutStandingUploads_.end(), Func),
OutStandingUploads_.end());
OutStandingUploads_.emplace_back(UploadId{UUID, now + WaitTimeInSeconds.count(), Type});
return true;
}
// remove old stuff... bool FileUploader::ValidRequest(const std::string &UUID) {
for(auto i=OutStandingUploads_.begin();i!=OutStandingUploads_.end();) { std::lock_guard Guard(Mutex_);
if ((now-i->second) > (60 * 30)) auto Func = [UUID](const UploadId &P) -> bool { return (P.UUID == UUID); };
i = OutStandingUploads_.erase(i); return std::find_if(OutStandingUploads_.begin(), OutStandingUploads_.end(), Func) !=
else end(OutStandingUploads_);
++i; }
}
if(!UUID.empty()) void FileUploader::RemoveRequest(const std::string &UUID) {
OutStandingUploads_[UUID] = now; std::lock_guard Guard(Mutex_);
auto Func = [UUID](const UploadId &P) -> bool { return (P.UUID == UUID); };
return true; OutStandingUploads_.erase(
} std::remove_if(OutStandingUploads_.begin(), OutStandingUploads_.end(), Func),
OutStandingUploads_.end());
bool FileUploader::ValidRequest(const std::string &UUID) { }
std::lock_guard Guard(Mutex_);
return OutStandingUploads_.find(UUID)!=OutStandingUploads_.end();
}
void FileUploader::RemoveRequest(const std::string &UUID) {
std::lock_guard Guard(Mutex_);
OutStandingUploads_.erase(UUID);
}
class FileUploaderPartHandler2 : public Poco::Net::PartHandler { class FileUploaderPartHandler2 : public Poco::Net::PartHandler {
public: public:
FileUploaderPartHandler2(std::string Id, Poco::Logger &Logger, std::stringstream & ofs) : FileUploaderPartHandler2(std::string Id, Poco::Logger &Logger, std::stringstream &ofs)
Id_(std::move(Id)), : Id_(std::move(Id)), Logger_(Logger), OutputStream_(ofs) {}
Logger_(Logger),
OutputStream_(ofs){
}
void handlePart(const Poco::Net::MessageHeader &Header, std::istream &Stream) { void handlePart(const Poco::Net::MessageHeader &Header, std::istream &Stream) {
FileType_ = Header.get(RESTAPI::Protocol::CONTENTTYPE, RESTAPI::Protocol::UNSPECIFIED); FileType_ = Header.get(RESTAPI::Protocol::CONTENTTYPE, RESTAPI::Protocol::UNSPECIFIED);
if (Header.has(RESTAPI::Protocol::CONTENTDISPOSITION)) { if (Header.has(RESTAPI::Protocol::CONTENTDISPOSITION)) {
std::string Disposition; std::string Disposition;
Poco::Net::NameValueCollection Parameters; Poco::Net::NameValueCollection Parameters;
Poco::Net::MessageHeader::splitParameters(Header[RESTAPI::Protocol::CONTENTDISPOSITION], Disposition, Parameters); Poco::Net::MessageHeader::splitParameters(
Header[RESTAPI::Protocol::CONTENTDISPOSITION], Disposition, Parameters);
Name_ = Parameters.get(RESTAPI::Protocol::NAME, RESTAPI::Protocol::UNNAMED); Name_ = Parameters.get(RESTAPI::Protocol::NAME, RESTAPI::Protocol::UNNAMED);
} }
Poco::CountingInputStream InputStream(Stream); Poco::CountingInputStream InputStream(Stream);
@@ -175,32 +174,30 @@ namespace OpenWifi {
[[nodiscard]] std::string &ContentType() { return FileType_; } [[nodiscard]] std::string &ContentType() { return FileType_; }
private: private:
uint64_t Length_ = 0; uint64_t Length_ = 0;
std::string FileType_; std::string FileType_;
std::string Name_; std::string Name_;
std::string Id_; std::string Id_;
Poco::Logger &Logger_; Poco::Logger &Logger_;
std::stringstream &OutputStream_; std::stringstream &OutputStream_;
inline Poco::Logger & Logger() { return Logger_; }; inline Poco::Logger &Logger() { return Logger_; };
}; };
class FormRequestHandler: public Poco::Net::HTTPRequestHandler class FormRequestHandler : public Poco::Net::HTTPRequestHandler {
{ public:
public: explicit FormRequestHandler(std::string UUID, Poco::Logger &L, const std::string &Type)
explicit FormRequestHandler(std::string UUID, Poco::Logger & L): : UUID_(std::move(UUID)), Logger_(L), Type_(Type) {}
UUID_(std::move(UUID)),
Logger_(L)
{
}
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) final { void handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) final {
Utils::SetThreadName("FileUploader"); Utils::SetThreadName("FileUploader");
const auto ContentType = Request.getContentType(); const auto ContentType = Request.getContentType();
const auto Tokens = Poco::StringTokenizer(ContentType,";",Poco::StringTokenizer::TOK_TRIM); const auto Tokens =
Poco::StringTokenizer(ContentType, ";", Poco::StringTokenizer::TOK_TRIM);
poco_debug(Logger(),fmt::format("{}: Preparing to upload trace file.",UUID_)); poco_debug(Logger(), fmt::format("{}: Preparing to upload a file.", UUID_));
Poco::JSON::Object Answer; Poco::JSON::Object Answer;
try { try {
@@ -225,8 +222,9 @@ namespace OpenWifi {
Poco::StreamCopier::copyStream(Reader.stream(), FileContent); Poco::StreamCopier::copyStream(Reader.stream(), FileContent);
Answer.set("filename", UUID_); Answer.set("filename", UUID_);
Answer.set("error", 0); Answer.set("error", 0);
poco_debug(Logger(),fmt::format("{}: Trace file uploaded.", UUID_)); poco_debug(Logger(), fmt::format("{}: File uploaded.", UUID_));
StorageService()->AttachFileDataToCommand(UUID_, FileContent); StorageService()->AttachFileDataToCommand(UUID_, FileContent,
Type_);
std::ostream &ResponseStream = Response.send(); std::ostream &ResponseStream = Response.send();
Poco::JSON::Stringifier::stringify(Answer, ResponseStream); Poco::JSON::Stringifier::stringify(Answer, ResponseStream);
return; return;
@@ -243,11 +241,11 @@ namespace OpenWifi {
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger().log(E); Logger().log(E);
} catch (...) { } catch (...) {
poco_debug(Logger(),"Exception while receiving trace file."); poco_debug(Logger(), "Exception while receiving uploaded file.");
} }
poco_debug(Logger(),fmt::format("{}: Failed to upload trace file.",UUID_)); poco_debug(Logger(), fmt::format("{}: Failed to upload a file.", UUID_));
std::string Error{"Trace file rejected"}; std::string Error{"File rejected"};
StorageService()->CancelWaitFile(UUID_, Error); StorageService()->CancelWaitFile(UUID_, Error);
Answer.set("filename", UUID_); Answer.set("filename", UUID_);
Answer.set("error", 13); Answer.set("error", 13);
@@ -257,49 +255,64 @@ namespace OpenWifi {
Poco::JSON::Stringifier::stringify(Answer, ResponseStream); Poco::JSON::Stringifier::stringify(Answer, ResponseStream);
} }
inline Poco::Logger & Logger() { return Logger_; } inline Poco::Logger &Logger() { return Logger_; }
private: private:
std::string UUID_; std::string UUID_;
Poco::Logger & Logger_; Poco::Logger &Logger_;
}; std::string Type_;
};
Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) { Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(
const Poco::Net::HTTPServerRequest &Request) {
poco_debug(Logger(),fmt::format("REQUEST({}): {} {}", 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 || if (Request.getMethod() != Poco::Net::HTTPRequest::HTTP_POST ||
Request.getURI().size()<(URI_BASE.size()+36)) { Request.getURI().size() < (URI_BASE.size() + 36)) {
poco_warning(Logger(),fmt::format("ILLEGAL-REQUEST({}): {} {}. Dropped.", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI())); poco_warning(Logger(),
fmt::format("ILLEGAL-REQUEST({}): {} {}. Dropped.",
Utils::FormatIPv6(Request.clientAddress().toString()),
Request.getMethod(), Request.getURI()));
return nullptr; return nullptr;
} }
// The UUID should be after the /v1/upload/ part... // The UUID should be after the /v1/upload/ part...
auto UUIDLocation = Request.getURI().find_first_of(URI_BASE); auto UUIDLocation = Request.getURI().find_first_of(URI_BASE);
if( UUIDLocation != std::string::npos ) if (UUIDLocation != std::string::npos) {
{ auto UUID = Request.getURI().substr(UUIDLocation + URI_BASE.size());
auto UUID = Request.getURI().substr(UUIDLocation+URI_BASE.size());
if(FileUploader()->ValidRequest(UUID)) FileUploader::UploadId E;
{ if (FileUploader()->Find(UUID, E)) {
// make sure we do not allow anyone else to overwrite our file
FileUploader()->RemoveRequest(UUID); FileUploader()->RemoveRequest(UUID);
return new FormRequestHandler(UUID,Logger()); return new FormRequestHandler(UUID, Logger(), E.Type);
} } else {
else poco_warning(Logger(), fmt::format("Unknown UUID={}", UUID));
{ }
poco_warning(Logger(),fmt::format("Unknown UUID={}",UUID)); }
} return nullptr;
} }
return nullptr;
}
void FileUploader::Stop() { bool FileUploader::Find(const std::string &UUID, UploadId &V) {
poco_notice(Logger(),"Stopping..."); std::lock_guard G(Mutex_);
for( const auto & svr : Servers_ ) for (const auto &E : OutStandingUploads_) {
svr->stopAll(true); if (E.UUID == UUID) {
V = E;
return true;
}
}
return false;
}
void FileUploader::Stop() {
poco_notice(Logger(), "Stopping...");
for (const auto &svr : Servers_)
svr->stopAll(true);
Servers_.clear(); Servers_.clear();
poco_notice(Logger(),"Stopped..."); poco_notice(Logger(), "Stopped...");
} }
} // Namespace } // namespace OpenWifi

View File

@@ -8,58 +8,64 @@
#pragma once #pragma once
#include "framework/MicroService.h"
#include "Poco/Net/HTTPRequestHandler.h" #include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h" #include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPServer.h" #include "Poco/Net/HTTPServer.h"
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "framework/SubSystemServer.h"
namespace OpenWifi { namespace OpenWifi {
class FileUploader : public SubSystemServer { class FileUploader : public SubSystemServer {
public: public:
struct UploadId {
std::string UUID;
std::uint64_t Expires;
std::string Type;
};
int Start() override; int Start() override;
void Stop() override; void Stop() override;
void reinitialize(Poco::Util::Application &self) override; void reinitialize(Poco::Util::Application &self) override;
const std::string & FullName(); const std::string &FullName();
bool AddUUID( const std::string & UUID); bool AddUUID(const std::string &UUID, std::chrono::seconds WaitTimeInSecond,
bool ValidRequest(const std::string & UUID); const std::string &Type);
bool ValidRequest(const std::string &UUID);
void RemoveRequest(const std::string &UUID); void RemoveRequest(const std::string &UUID);
const std::string & Path() { return Path_; }; const std::string &Path() { return Path_; };
static auto instance() { static auto instance() {
static auto instance_ = new FileUploader; static auto instance_ = new FileUploader;
return instance_; return instance_;
} }
[[nodiscard]] inline uint64_t MaxSize() const { return MaxSize_; } [[nodiscard]] inline uint64_t MaxSize() const { return MaxSize_; }
private: bool Find(const std::string &UUID, UploadId &V);
std::vector<std::unique_ptr<Poco::Net::HTTPServer>> Servers_;
std::string FullName_;
std::map<std::string,uint64_t> OutStandingUploads_;
std::string Path_;
uint64_t MaxSize_=10000000;
explicit FileUploader() noexcept: private:
SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader") std::vector<std::unique_ptr<Poco::Net::HTTPServer>> Servers_;
{ std::string FullName_;
} std::list<UploadId> OutStandingUploads_;
}; std::string Path_;
uint64_t MaxSize_ = 10000000;
class FileUpLoaderRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory { explicit FileUploader() noexcept
public: : SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader") {}
explicit FileUpLoaderRequestHandlerFactory(Poco::Logger &L) : };
Logger_(L){}
Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &request) override; class FileUpLoaderRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
inline Poco::Logger & Logger() { return Logger_; } public:
private: explicit FileUpLoaderRequestHandlerFactory(Poco::Logger &L) : Logger_(L) {}
Poco::Logger & Logger_;
}; Poco::Net::HTTPRequestHandler *
createRequestHandler(const Poco::Net::HTTPServerRequest &request) override;
inline Poco::Logger &Logger() { return Logger_; }
private:
Poco::Logger &Logger_;
};
inline auto FileUploader() { return FileUploader::instance(); } inline auto FileUploader() { return FileUploader::instance(); }
} // namespace } // namespace OpenWifi

View File

@@ -4,80 +4,79 @@
#pragma once #pragma once
#include "framework/MicroService.h"
#include "Poco/Net/IPAddress.h" #include "Poco/Net/IPAddress.h"
#include "framework/MicroServiceFuncs.h"
#include "framework/SubSystemServer.h"
#include "nlohmann/json.hpp" #include "nlohmann/json.hpp"
namespace OpenWifi { namespace OpenWifi {
class IPToCountryProvider { class IPToCountryProvider {
public: public:
virtual bool Init() = 0 ; virtual bool Init() = 0;
virtual Poco::URI URI(const std::string & IPAddress) = 0; virtual Poco::URI URI(const std::string &IPAddress) = 0;
virtual std::string Country( const std::string & Response ) = 0 ; virtual std::string Country(const std::string &Response) = 0;
virtual ~IPToCountryProvider() { virtual ~IPToCountryProvider(){};
};
}; };
class IPInfo : public IPToCountryProvider { class IPInfo : public IPToCountryProvider {
public: public:
static std::string Name() { return "ipinfo"; } static std::string Name() { return "ipinfo"; }
inline bool Init() override { inline bool Init() override {
Key_ = MicroService::instance().ConfigGetString("iptocountry.ipinfo.token", ""); Key_ = MicroServiceConfigGetString("iptocountry.ipinfo.token", "");
return !Key_.empty(); return !Key_.empty();
} }
[[nodiscard]] inline Poco::URI URI(const std::string & IPAddress) override { [[nodiscard]] inline Poco::URI URI(const std::string &IPAddress) override {
Poco::URI U("https://ipinfo.io"); Poco::URI U("https://ipinfo.io");
U.setPath("/" + IPAddress); U.setPath("/" + IPAddress);
U.addQueryParameter("token",Key_); U.addQueryParameter("token", Key_);
return U; return U;
} }
inline std::string Country( const std::string & Response ) override { inline std::string Country(const std::string &Response) override {
try { try {
nlohmann::json IPInfo = nlohmann::json::parse(Response); nlohmann::json IPInfo = nlohmann::json::parse(Response);
if (IPInfo.contains("country") && IPInfo["country"].is_string()) { if (IPInfo.contains("country") && IPInfo["country"].is_string()) {
return IPInfo["country"]; return IPInfo["country"];
} }
} catch (...) { } catch (...) {
} }
return ""; return "";
} }
private: private:
std::string Key_; std::string Key_;
}; };
class IPData : public IPToCountryProvider { class IPData : public IPToCountryProvider {
public: public:
static std::string Name() { return "ipdata"; } static std::string Name() { return "ipdata"; }
inline bool Init() override { inline bool Init() override {
Key_ = MicroService::instance().ConfigGetString("iptocountry.ipdata.apikey", ""); Key_ = MicroServiceConfigGetString("iptocountry.ipdata.apikey", "");
return !Key_.empty(); return !Key_.empty();
} }
[[nodiscard]] inline Poco::URI URI(const std::string & IPAddress) override { [[nodiscard]] inline Poco::URI URI(const std::string &IPAddress) override {
Poco::URI U("https://api.ipdata.co"); Poco::URI U("https://api.ipdata.co");
U.setPath("/" + IPAddress); U.setPath("/" + IPAddress);
U.addQueryParameter("api-key",Key_); U.addQueryParameter("api-key", Key_);
return U; return U;
} }
inline std::string Country( const std::string & Response ) override { inline std::string Country(const std::string &Response) override {
try { try {
nlohmann::json IPInfo = nlohmann::json::parse(Response); nlohmann::json IPInfo = nlohmann::json::parse(Response);
if (IPInfo.contains("country_code") && IPInfo["country_code"].is_string()) { if (IPInfo.contains("country_code") && IPInfo["country_code"].is_string()) {
return IPInfo["country_code"]; return IPInfo["country_code"];
} }
} catch (...) { } catch (...) {
} }
return ""; return "";
} }
private: private:
std::string Key_; std::string Key_;
}; };
@@ -86,37 +85,37 @@ namespace OpenWifi {
public: public:
static std::string Name() { return "ip2location"; } static std::string Name() { return "ip2location"; }
inline bool Init() override { inline bool Init() override {
Key_ = MicroService::instance().ConfigGetString("iptocountry.ip2location.apikey", ""); Key_ = MicroServiceConfigGetString("iptocountry.ip2location.apikey", "");
return !Key_.empty(); return !Key_.empty();
} }
[[nodiscard]] inline Poco::URI URI(const std::string & IPAddress) override { [[nodiscard]] inline Poco::URI URI(const std::string &IPAddress) override {
Poco::URI U("https://api.ip2location.com/v2"); Poco::URI U("https://api.ip2location.com/v2");
U.setPath("/"); U.setPath("/");
U.addQueryParameter("ip", IPAddress); U.addQueryParameter("ip", IPAddress);
U.addQueryParameter("package", "WS1"); U.addQueryParameter("package", "WS1");
U.addQueryParameter("key",Key_); U.addQueryParameter("key", Key_);
return U; return U;
} }
inline std::string Country( const std::string & Response ) override { inline std::string Country(const std::string &Response) override {
try { try {
nlohmann::json IPInfo = nlohmann::json::parse(Response); nlohmann::json IPInfo = nlohmann::json::parse(Response);
if (IPInfo.contains("country_code") && IPInfo["country_code"].is_string()) { if (IPInfo.contains("country_code") && IPInfo["country_code"].is_string()) {
return IPInfo["country_code"]; return IPInfo["country_code"];
} }
} catch (...) { } catch (...) {
} }
return ""; return "";
} }
private: private:
std::string Key_; std::string Key_;
}; };
template<typename BaseClass, typename T, typename... Args> template <typename BaseClass, typename T, typename... Args>
std::unique_ptr<BaseClass> IPLocationProvider(const std::string & RequestProvider ) { std::unique_ptr<BaseClass> IPLocationProvider(const std::string &RequestProvider) {
if(T::Name()==RequestProvider) { if (T::Name() == RequestProvider) {
return std::make_unique<T>(); return std::make_unique<T>();
} }
if constexpr (sizeof...(Args) == 0) { if constexpr (sizeof...(Args) == 0) {
@@ -134,41 +133,40 @@ namespace OpenWifi {
} }
inline int Start() final { inline int Start() final {
poco_notice(Logger(),"Starting..."); poco_notice(Logger(), "Starting...");
ProviderName_ = MicroService::instance().ConfigGetString("iptocountry.provider",""); ProviderName_ = MicroServiceConfigGetString("iptocountry.provider", "");
if(!ProviderName_.empty()) { if (!ProviderName_.empty()) {
Provider_ = IPLocationProvider<IPToCountryProvider, IPInfo, IPData, IP2Location>(ProviderName_); Provider_ = IPLocationProvider<IPToCountryProvider, IPInfo, IPData, IP2Location>(
if(Provider_!= nullptr) { ProviderName_);
if (Provider_ != nullptr) {
Enabled_ = Provider_->Init(); Enabled_ = Provider_->Init();
} }
} }
Default_ = MicroService::instance().ConfigGetString("iptocountry.default", "US"); Default_ = MicroServiceConfigGetString("iptocountry.default", "US");
return 0; return 0;
} }
inline void Stop() final { inline void Stop() final {
poco_notice(Logger(),"Stopping..."); poco_notice(Logger(), "Stopping...");
// Nothing to do - just to provide the same look at the others. // Nothing to do - just to provide the same look at the others.
poco_notice(Logger(),"Stopped..."); poco_notice(Logger(), "Stopped...");
} }
[[nodiscard]] static inline std::string ReformatAddress(const std::string & I ) [[nodiscard]] static inline std::string ReformatAddress(const std::string &I) {
{ if (I.substr(0, 7) == "::ffff:") {
if(I.substr(0,7) == "::ffff:") std::string ip = I.substr(7);
{
std::string ip = I.substr(7 );
return ip; return ip;
} }
return I; return I;
} }
inline std::string Get(const Poco::Net::IPAddress & IP) { inline std::string Get(const Poco::Net::IPAddress &IP) {
if (!Enabled_) if (!Enabled_)
return Default_; return Default_;
return Get(ReformatAddress(IP.toString())); return Get(ReformatAddress(IP.toString()));
} }
inline std::string Get(const std::string & IP) { inline std::string Get(const std::string &IP) {
if (!Enabled_) if (!Enabled_)
return Default_; return Default_;
try { try {
@@ -176,10 +174,10 @@ namespace OpenWifi {
std::string Response; std::string Response;
if (Utils::wgets(URL, Response)) { if (Utils::wgets(URL, Response)) {
auto Answer = Provider_->Country(Response); auto Answer = Provider_->Country(Response);
if(!Answer.empty()) if (!Answer.empty())
return Answer; return Answer;
} }
} catch(...) { } catch (...) {
} }
return Default_; return Default_;
} }
@@ -187,17 +185,14 @@ namespace OpenWifi {
inline auto Enabled() const { return Enabled_; } inline auto Enabled() const { return Enabled_; }
private: private:
bool Enabled_=false; bool Enabled_ = false;
std::string Default_; std::string Default_;
std::unique_ptr<IPToCountryProvider> Provider_; std::unique_ptr<IPToCountryProvider> Provider_;
std::string ProviderName_; std::string ProviderName_;
FindCountryFromIP() noexcept: FindCountryFromIP() noexcept : SubSystemServer("IpToCountry", "IPTOC-SVR", "iptocountry") {}
SubSystemServer("IpToCountry", "IPTOC-SVR", "iptocountry")
{
}
}; };
inline auto FindCountryFromIP() { return FindCountryFromIP::instance(); } inline auto FindCountryFromIP() { return FindCountryFromIP::instance(); }
} } // namespace OpenWifi

22
src/GWKafkaEvents.cpp Normal file
View File

@@ -0,0 +1,22 @@
//
// Created by stephane bourque on 2023-02-03.
//
#include "GWKafkaEvents.h"
namespace OpenWifi {
void GWKafkaEvents::Send() {
if (KafkaManager()->Enabled()) {
Poco::JSON::Object Event;
Event.set("type", type_);
Event.set("timestamp", timestamp_);
Event.set("payload", payload_);
std::ostringstream OS;
Event.stringify(OS);
auto payload = std::make_shared<std::string>(OS.str());
KafkaManager()->PostMessage(KafkaTopics::DEVICE_EVENT_QUEUE, Utils::IntToSerialNumber(serialNumber_), payload);
}
}
} // namespace OpenWifi

106
src/GWKafkaEvents.h Normal file
View File

@@ -0,0 +1,106 @@
//
// Created by stephane bourque on 2023-02-03.
//
#pragma once
#include <string>
#include <Poco/JSON/Object.h>
#include <RESTObjects/RESTAPI_GWobjects.h>
#include <framework/KafkaManager.h>
namespace OpenWifi {
class GWKafkaEvents {
public:
GWKafkaEvents(std::uint64_t serialNumber, const std::string &type,
std::uint64_t timestamp)
: serialNumber_(serialNumber), type_(type), timestamp_(timestamp) {
payload_ = Poco::SharedPtr<Poco::JSON::Object>(new Poco::JSON::Object);
}
void Send();
[[nodiscard]] inline std::uint64_t Serial() const { return serialNumber_;};
protected:
std::uint64_t serialNumber_;
std::string type_;
std::uint64_t timestamp_ = 0;
Poco::JSON::Object::Ptr payload_;
};
class DeviceFirmwareChangeKafkaEvent : public GWKafkaEvents {
public:
DeviceFirmwareChangeKafkaEvent(std::uint64_t serialNumber, std::uint64_t timestamp,
const std::string &oldFirmware,
const std::string &newFirmware)
: GWKafkaEvents(serialNumber, "unit.firmware_change", timestamp),
oldFirmware_(oldFirmware), newFirmware_(newFirmware) {}
~DeviceFirmwareChangeKafkaEvent() {
payload_->set("oldFirmware", oldFirmware_);
payload_->set("newFirmware", newFirmware_);
Send();
}
private:
std::string oldFirmware_, newFirmware_;
};
class DeviceConfigurationChangeKafkaEvent : public GWKafkaEvents {
public:
DeviceConfigurationChangeKafkaEvent(std::uint64_t serialNumber,
std::uint64_t timestamp, const std::string config)
: GWKafkaEvents(serialNumber, "unit.configuration_change", timestamp), config_(config) {
}
~DeviceConfigurationChangeKafkaEvent() {
payload_->set("configuration", config_);
Send();
}
private:
std::string config_;
};
class DeviceBlacklistedKafkaEvent : public GWKafkaEvents {
public:
explicit DeviceBlacklistedKafkaEvent(std::uint64_t serialNumber,
std::uint64_t timestamp, const std::string &reason,
const std::string &author, std::uint64_t created,
std::string &IP)
: GWKafkaEvents(serialNumber, "blacklisted_device", timestamp), reason_(reason),
author_(author), created_(created), IP_(IP) {}
~DeviceBlacklistedKafkaEvent() {
payload_->set("reason", reason_);
payload_->set("author", author_);
payload_->set("created", created_);
payload_->set("ipaddress", IP_);
Send();
}
private:
std::string reason_, author_;
std::uint64_t created_;
std::string IP_;
};
class DeviceLogKafkaEvent : public GWKafkaEvents {
public:
explicit DeviceLogKafkaEvent( const GWObjects::DeviceLog &L)
: GWKafkaEvents(Utils::MACToInt(L.SerialNumber), "device_log", L.Recorded),
DL_(L)
{
}
~DeviceLogKafkaEvent() {
DL_.to_json(*payload_);
Send();
}
private:
GWObjects::DeviceLog DL_;
};
} // namespace OpenWifi

19
src/GenericScheduler.cpp Normal file
View File

@@ -0,0 +1,19 @@
//
// Created by stephane bourque on 2023-04-19.
//
#include "GenericScheduler.h"
namespace OpenWifi {
int GenericScheduler::Start() {
poco_information(Logger(),"Starting...");
return 0;
}
void GenericScheduler::Stop() {
poco_information(Logger(),"Stopping...");
poco_information(Logger(),"Stopped...");
}
} // namespace OpenWifi

37
src/GenericScheduler.h Normal file
View File

@@ -0,0 +1,37 @@
//
// Created by stephane bourque on 2023-04-19.
//
#pragma once
#include <framework/SubSystemServer.h>
#include <libs/Scheduler.h>
#include <Poco/Environment.h>
namespace OpenWifi {
class GenericScheduler : public SubSystemServer {
public:
static auto instance() {
static auto instance_ = new GenericScheduler;
return instance_;
}
int Start() override;
void Stop() override;
auto & Scheduler() { return Scheduler_; }
private:
GenericScheduler() noexcept
: SubSystemServer("Scheduler", "SCHEDULER", "scheduler"),
Scheduler_(Poco::Environment::processorCount()*2) {
}
Bosma::Scheduler Scheduler_;
};
inline auto GenericScheduler() { return GenericScheduler::instance(); }
} // namespace OpenWifi

View File

@@ -7,23 +7,22 @@
namespace OpenWifi { namespace OpenWifi {
GwWebSocketClient::GwWebSocketClient(Poco::Logger &Logger): GwWebSocketClient::GwWebSocketClient(Poco::Logger &Logger) : Logger_(Logger) {
Logger_(Logger){ UI_WebSocketClientServer()->SetProcessor(this);
WebSocketClientServer()->SetProcessor(this);
} }
GwWebSocketClient::~GwWebSocketClient() { GwWebSocketClient::~GwWebSocketClient() { UI_WebSocketClientServer()->SetProcessor(nullptr); }
WebSocketClientServer()->SetProcessor(nullptr);
}
void GwWebSocketClient::Processor(const Poco::JSON::Object::Ptr &O, std::string &Answer, bool &Done ) { void GwWebSocketClient::Processor(const Poco::JSON::Object::Ptr &O, std::string &Answer,
bool &Done,
[[maybe_unused]] const SecurityObjects::UserInfo &UserInfo) {
try { try {
if (O->has("command")) { if (O->has("command")) {
auto Command = O->get("command").toString(); auto Command = O->get("command").toString();
if (Command == "serial_number_search" && O->has("serial_prefix")) { if (Command == "serial_number_search" && O->has("serial_prefix")) {
ws_command_serial_number_search(O,Done,Answer); ws_command_serial_number_search(O, Done, Answer);
} else if (Command=="exit") { } else if (Command == "exit") {
ws_command_exit(O,Done,Answer); ws_command_exit(O, Done, Answer);
} else { } else {
ws_command_invalid(O, Done, Answer); ws_command_invalid(O, Done, Answer);
} }
@@ -34,7 +33,7 @@ namespace OpenWifi {
} }
void GwWebSocketClient::ws_command_serial_number_search(const Poco::JSON::Object::Ptr &O, void GwWebSocketClient::ws_command_serial_number_search(const Poco::JSON::Object::Ptr &O,
bool &Done, std::string &Answer) { bool &Done, std::string &Answer) {
Done = false; Done = false;
auto Prefix = O->get("serial_prefix").toString(); auto Prefix = O->get("serial_prefix").toString();
if (!Prefix.empty() && Prefix.length() < 13) { if (!Prefix.empty() && Prefix.length() < 13) {
@@ -51,16 +50,15 @@ namespace OpenWifi {
} }
} }
void GwWebSocketClient::ws_command_exit([[maybe_unused]] const Poco::JSON::Object::Ptr &O, bool &Done, std::string &Answer) { void GwWebSocketClient::ws_command_exit([[maybe_unused]] const Poco::JSON::Object::Ptr &O,
bool &Done, std::string &Answer) {
Done = true; Done = true;
Answer = R"lit({ "closing" : "Goodbye! Aurevoir! Hasta la vista!" })lit"; 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) { void GwWebSocketClient::ws_command_invalid([[maybe_unused]] const Poco::JSON::Object::Ptr &O,
bool &Done, std::string &Answer) {
Done = false; Done = false;
Answer = std::string{R"lit({ "error" : "invalid command" })lit"}; Answer = std::string{R"lit({ "error" : "invalid command" })lit"};
} }
} // namespace OpenWifi
}

View File

@@ -4,20 +4,22 @@
#pragma once #pragma once
#include "framework/MicroService.h" #include "framework/UI_WebSocketClientServer.h"
namespace OpenWifi { namespace OpenWifi {
class GwWebSocketClient : public WebSocketClientProcessor { class GwWebSocketClient : public UI_WebSocketClientProcessor {
public: public:
explicit GwWebSocketClient(Poco::Logger &Logger); explicit GwWebSocketClient(Poco::Logger &Logger);
virtual ~GwWebSocketClient(); virtual ~GwWebSocketClient();
virtual void Processor(const Poco::JSON::Object::Ptr &O, std::string &Answer, bool &Done ); 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); const SecurityObjects::UserInfo &UserInfo);
void ws_command_exit( const Poco::JSON::Object::Ptr &O, bool &Done, std::string &Answer); void ws_command_serial_number_search(const Poco::JSON::Object::Ptr &O, bool &Done,
void ws_command_invalid( const Poco::JSON::Object::Ptr &O, bool &Done, std::string &Answer); 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: private:
Poco::Logger & Logger_; Poco::Logger &Logger_;
inline Poco::Logger & Logger() { return Logger_; } inline Poco::Logger &Logger() { return Logger_; }
}; };
} } // namespace OpenWifi

View File

@@ -1,58 +1,84 @@
// //
// Created by stephane bourque on 2021-06-17. // Created by stephane bourque on 2021-06-17.
// //
#include <thread>
#include <fstream> #include <fstream>
#include <thread>
#include <vector> #include <vector>
#include "Poco/File.h"
#include "Poco/StreamCopier.h"
#include "Poco/String.h" #include "Poco/String.h"
#include "Poco/StringTokenizer.h" #include "Poco/StringTokenizer.h"
#include "Poco/URIStreamOpener.h" #include "Poco/URIStreamOpener.h"
#include "Poco/StreamCopier.h"
#include "Poco/File.h" #include "framework/MicroServiceFuncs.h"
#include "framework/utils.h"
#include "fmt/format.h"
#include "OUIServer.h" #include "OUIServer.h"
#include "framework/MicroService.h"
namespace OpenWifi { namespace OpenWifi {
int OUIServer::Start() { int OUIServer::Start() {
Running_ = true; Running_ = true;
LatestOUIFileName_ = MicroService::instance().DataDir() + "/newOUIFile.txt"; LatestOUIFileName_ = MicroServiceDataDirectory() + "/newOUIFile.txt";
CurrentOUIFileName_ = MicroService::instance().DataDir() + "/current_oui.txt"; CurrentOUIFileName_ = MicroServiceDataDirectory() + "/current_oui.txt";
UpdaterCallBack_ = std::make_unique<Poco::TimerCallback<OUIServer>>(*this, &OUIServer::onTimer); bool Recovered = false;
Timer_.setStartInterval(30 * 1000); // first run in 5 minutes 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);
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_.setPeriodicInterval(7 * 24 * 60 * 60 * 1000);
Timer_.start(*UpdaterCallBack_, MicroService::instance().TimerPool()); Timer_.start(*UpdaterCallBack_, MicroServiceTimerPool());
return 0; return 0;
} }
void OUIServer::Stop() { void OUIServer::Stop() {
poco_notice(Logger(),"Stopping..."); poco_notice(Logger(), "Stopping...");
Running_=false; Running_ = false;
Timer_.stop(); Timer_.stop();
poco_notice(Logger(),"Stopped..."); poco_notice(Logger(), "Stopped...");
} }
void OUIServer::reinitialize([[maybe_unused]] Poco::Util::Application &self) { void OUIServer::reinitialize([[maybe_unused]] Poco::Util::Application &self) {
MicroService::instance().LoadConfigurationFile(); MicroServiceLoadConfigurationFile();
poco_information(Logger(),"Reinitializing."); poco_information(Logger(), "Reinitializing.");
Stop(); Stop();
Start(); Start();
} }
bool OUIServer::GetFile(const std::string &FileName) { bool OUIServer::GetFile(const std::string &FileName) {
try { try {
LastUpdate_ = OpenWifi::Now(); LastUpdate_ = Utils::Now();
poco_information(Logger(), fmt::format("Start: Retrieving OUI file: {}",MicroService::instance().ConfigGetString("oui.download.uri"))); poco_information(Logger(),
std::unique_ptr<std::istream> pStr( fmt::format("Start: Retrieving OUI file: {}",
Poco::URIStreamOpener::defaultOpener().open(MicroService::instance().ConfigGetString("oui.download.uri"))); MicroServiceConfigGetString("oui.download.uri", "")));
std::unique_ptr<std::istream> pStr(Poco::URIStreamOpener::defaultOpener().open(
MicroServiceConfigGetString("oui.download.uri", "")));
std::ofstream OS; std::ofstream OS;
OS.open(FileName); OS.open(FileName);
Poco::StreamCopier::copyStream(*pStr, OS); Poco::StreamCopier::copyStream(*pStr, OS);
OS.close(); OS.close();
poco_information(Logger(), fmt::format("Done: Retrieving OUI file: {}",MicroService::instance().ConfigGetString("oui.download.uri"))); poco_information(Logger(),
fmt::format("Done: Retrieving OUI file: {}",
MicroServiceConfigGetString("oui.download.uri", "")));
return true; return true;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger().log(E); Logger().log(E);
@@ -60,13 +86,13 @@ namespace OpenWifi {
return false; return false;
} }
bool OUIServer::ProcessFile( const std::string &FileName, OUIMap &Map) { bool OUIServer::ProcessFile(const std::string &FileName, OUIMap &Map) {
try { try {
std::ifstream Input; std::ifstream Input;
Input.open(FileName, std::ios::binary); Input.open(FileName, std::ios::binary);
while (!Input.eof()) { while (!Input.eof()) {
if(!Running_) if (!Running_)
return false; return false;
char buf[1024]; char buf[1024];
Input.getline(buf, sizeof(buf)); Input.getline(buf, sizeof(buf));
@@ -90,63 +116,68 @@ namespace OpenWifi {
} }
} }
return true; return true;
} catch ( const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger().log(E); Logger().log(E);
} }
return false; return false;
} }
void OUIServer::onTimer([[maybe_unused]] Poco::Timer & timer) { void OUIServer::onTimer([[maybe_unused]] Poco::Timer &timer) {
Utils::SetThreadName("ouisvr-timer"); Utils::SetThreadName("ouisvr-timer");
if(Updating_) if (Updating_)
return; return;
Updating_ = true; Updating_ = true;
poco_information(Logger(), "Starting to process OUI file...");
// fetch data from server, if not available, just use the file we already have. // fetch data from server, if not available, just use the file we already have.
Poco::File Current(CurrentOUIFileName_); Poco::File Current(CurrentOUIFileName_);
if(Current.exists()) { if (Current.exists()) {
if((OpenWifi::Now()-Current.getLastModified().epochTime()) < (7*24*60*60)) { if ((Utils::Now() - Current.getLastModified().epochTime()) < (7 * 24 * 60 * 60)) {
if(!Initialized_) { if (!Initialized_) {
if(ProcessFile(CurrentOUIFileName_, OUIs_)) { if (ProcessFile(CurrentOUIFileName_, OUIs_)) {
Initialized_ = true; Initialized_ = true;
Updating_=false; Updating_ = false;
poco_information(Logger(), "Using cached file."); poco_information(Logger(), "Using cached file.");
return; return;
} }
} else { } else {
Updating_=false; Updating_ = false;
return; return;
} }
} }
} }
OUIMap TmpOUIs; OUIMap TmpOUIs;
if(GetFile(LatestOUIFileName_) && ProcessFile(LatestOUIFileName_, TmpOUIs)) { if (GetFile(LatestOUIFileName_) && ProcessFile(LatestOUIFileName_, TmpOUIs)) {
std::lock_guard G(Mutex_); std::unique_lock G(LocalMutex_);
OUIs_ = std::move(TmpOUIs); OUIs_ = std::move(TmpOUIs);
LastUpdate_ = OpenWifi::Now(); LastUpdate_ = Utils::Now();
Poco::File F1(CurrentOUIFileName_); Poco::File F1(CurrentOUIFileName_);
if(F1.exists()) if (F1.exists())
F1.remove(); F1.remove();
Poco::File F2(LatestOUIFileName_); Poco::File F2(LatestOUIFileName_);
F2.renameTo(CurrentOUIFileName_); F2.renameTo(CurrentOUIFileName_);
poco_information(Logger(), fmt::format("New OUI file {} downloaded.",LatestOUIFileName_)); poco_information(Logger(),
} else if(OUIs_.empty()) { fmt::format("New OUI file {} downloaded.", LatestOUIFileName_));
if(ProcessFile(CurrentOUIFileName_, TmpOUIs)) { } else if (OUIs_.empty()) {
LastUpdate_ = OpenWifi::Now(); if (ProcessFile(CurrentOUIFileName_, TmpOUIs)) {
std::lock_guard G(Mutex_); LastUpdate_ = Utils::Now();
std::unique_lock G(LocalMutex_);
OUIs_ = std::move(TmpOUIs); OUIs_ = std::move(TmpOUIs);
} }
} }
Initialized_=true; Initialized_ = true;
Updating_ = false; Updating_ = false;
poco_information(Logger(), "Done processing OUI file...");
} }
std::string OUIServer::GetManufacturer(const std::string &MAC) { 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)); auto Manufacturer = OUIs_.find(Utils::SerialNumberToOUI(MAC));
if(Manufacturer != OUIs_.end()) if (Manufacturer != OUIs_.end())
return Manufacturer->second; return Manufacturer->second;
return ""; return "";
} }
}; }; // namespace OpenWifi

View File

@@ -4,25 +4,27 @@
#pragma once #pragma once
#include "framework/MicroService.h" #include <shared_mutex>
#include "framework/SubSystemServer.h"
#include "Poco/Timer.h" #include "Poco/Timer.h"
namespace OpenWifi { namespace OpenWifi {
class OUIServer : public SubSystemServer { class OUIServer : public SubSystemServer {
public: public:
typedef std::map<uint64_t, std::string> OUIMap;
typedef std::map<uint64_t,std::string> OUIMap;
static auto instance() { static auto instance() {
static auto instance_ = new OUIServer; static auto instance_ = new OUIServer;
return instance_; return instance_;
} }
int Start() override; int Start() override;
void Stop() override; void Stop() override;
void onTimer(Poco::Timer & timer); void onTimer(Poco::Timer &timer);
void reinitialize(Poco::Util::Application &self) override; void reinitialize(Poco::Util::Application &self) override;
[[nodiscard]] std::string GetManufacturer(const std::string &MAC); [[nodiscard]] std::string GetManufacturer(const std::string &MAC);
@@ -30,22 +32,19 @@ namespace OpenWifi {
[[nodiscard]] bool ProcessFile(const std::string &FileName, OUIMap &Map); [[nodiscard]] bool ProcessFile(const std::string &FileName, OUIMap &Map);
private: private:
uint64_t LastUpdate_ = 0 ; std::shared_mutex LocalMutex_;
bool Initialized_ = false; uint64_t LastUpdate_ = 0;
OUIMap OUIs_; bool Initialized_ = false;
volatile std::atomic_bool Updating_=false; OUIMap OUIs_;
volatile std::atomic_bool Running_=false; volatile std::atomic_bool Updating_ = false;
Poco::Timer Timer_; volatile std::atomic_bool Running_ = false;
std::unique_ptr<Poco::TimerCallback<OUIServer>> UpdaterCallBack_; Poco::Timer Timer_;
std::string LatestOUIFileName_,CurrentOUIFileName_; std::unique_ptr<Poco::TimerCallback<OUIServer>> UpdaterCallBack_;
std::string LatestOUIFileName_, CurrentOUIFileName_;
OUIServer() noexcept: OUIServer() noexcept : SubSystemServer("OUIServer", "OUI-SVR", "ouiserver") {}
SubSystemServer("OUIServer", "OUI-SVR", "ouiserver")
{
}
}; };
inline auto OUIServer() { return OUIServer::instance(); } inline auto OUIServer() { return OUIServer::instance(); }
} } // namespace OpenWifi

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