190 Commits

Author SHA1 Message Date
i-chvets
f774c40654 Merge pull request #32 from Telecominfraproject/WIFI-13597-fix-kafka-producer-using-poll
fix: modified kafka manager to use poll in producer
2024-06-13 14:35:26 -04:00
Ivan Chvets
1434ed92a5 fix: modified kafka manager to use poll in producer
https://telecominfraproject.atlassian.net/browse/WIFI-13597

NOTE: This fix is port of https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/pull/360

Summary of changes:
- Modified code in KafkaManager to use poll instead of flush for every messages sent. flush is used only on empty internal notification queue in idle times.

Signed-off-by: Ivan Chvets <ivan.chvets@kinarasystems.com>
2024-06-13 14:13:32 -04:00
Stephane Bourque
abacfb0bdb Merge pull request #31 from Telecominfraproject/WIFI-12939
WIFI-12939: change to TIP repos for libraries
2024-03-19 19:48:06 -07:00
Carsten Schafer
3da3e70697 WIFI-12939: change to TIP repos for libraries
Signed-off-by: Carsten Schafer <Carsten.Schafer@kinarasystems.com>
2024-03-19 16:43:43 -04:00
stephb9959
9f9922dded https://telecominfraproject.atlassian.net/browse/WIFI-7831
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-10-26 13:56:59 -07:00
stephb9959
a930553b2e https://telecominfraproject.atlassian.net/browse/WIFI-7831
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-10-26 13:42:06 -07:00
stephb9959
8db0769327 https://telecominfraproject.atlassian.net/browse/WIFI-7831
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-10-23 21:13:23 -07:00
stephb9959
4c0f7ff408 https://telecominfraproject.atlassian.net/browse/WIFI-7831
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-09-28 20:36:14 -07:00
stephb9959
f94d4ea0a8 https://telecominfraproject.atlassian.net/browse/WIFI-12954
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-09-24 11:06:23 -07:00
stephb9959
09be4ec780 https://telecominfraproject.atlassian.net/browse/WIFI-12954
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-09-23 15:26:02 -07:00
stephb9959
2f3a300045 https://telecominfraproject.atlassian.net/browse/WIFI-12868
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-09-19 22:07:12 -07:00
stephb9959
57115894c9 https://telecominfraproject.atlassian.net/browse/WIFI-12868
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-09-13 13:14:24 -07:00
stephb9959
005ee48435 https://telecominfraproject.atlassian.net/browse/WIFI-12868
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-09-13 12:24:35 -07:00
stephb9959
64ba6f4d67 https://telecominfraproject.atlassian.net/browse/WIFI-12868
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-09-01 09:24:19 -07:00
stephb9959
3d83d6a80e https://telecominfraproject.atlassian.net/browse/WIFI-12868
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-09-01 09:19:19 -07:00
stephb9959
43cae660de https://telecominfraproject.atlassian.net/browse/WIFI-12868
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-08-03 22:29:28 -07:00
stephb9959
d71be33cc3 https://telecominfraproject.atlassian.net/browse/WIFI-12868
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-08-03 11:07:01 -07:00
stephb9959
965ea73a13 https://telecominfraproject.atlassian.net/browse/WIFI-12868
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-08-03 10:56:44 -07:00
Jaspreet Sachdev
faa678d4e7 Fixed the $#
Signed-off-by: Jaspreet Sachdev <jaspreetsachdev@meta.com>
2023-06-13 17:50:19 -04:00
stephb9959
3c2503bc79 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-30 22:44:15 -07:00
stephb9959
e8d11c8631 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-30 22:42:10 -07:00
stephb9959
c0eda00485 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-30 08:39:10 -07:00
stephb9959
43ee46ea8a https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-30 08:32:05 -07:00
stephb9959
9584e1833c https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-30 08:16:13 -07:00
stephb9959
ba0ae691bf https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-30 08:01:01 -07:00
stephb9959
9dc9d11bce https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-30 07:52:39 -07:00
stephb9959
c9f692a067 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 22:48:03 -07:00
stephb9959
b8f7e8528e https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 22:38:08 -07:00
stephb9959
3cf1013fcb https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 22:30:47 -07:00
stephb9959
69772aaef2 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 22:20:02 -07:00
stephb9959
9382999719 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 22:12:30 -07:00
stephb9959
06e69405c0 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 22:08:13 -07:00
stephb9959
bcaee74193 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 22:01:25 -07:00
stephb9959
260543096d https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 21:44:35 -07:00
stephb9959
c11de3598f https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 21:22:03 -07:00
stephb9959
1173e5b088 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 14:45:22 -07:00
stephb9959
be893a0b08 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 08:31:05 -07:00
stephb9959
eeec24cd11 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-29 08:14:04 -07:00
stephb9959
bf8d73c947 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-26 14:28:50 -07:00
stephb9959
06fffea197 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-26 14:19:58 -07:00
stephb9959
39f012a429 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-26 14:02:13 -07:00
stephb9959
4a1e4d9cba https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 23:52:40 -07:00
stephb9959
b8d5f9e2b4 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 23:43:51 -07:00
stephb9959
033f67fac4 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 23:29:41 -07:00
stephb9959
9c75e989b5 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 23:19:41 -07:00
stephb9959
0d5c42fe9f https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 23:12:32 -07:00
stephb9959
adfbd2d52b https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 22:47:42 -07:00
stephb9959
93aa2e300f https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 13:33:48 -07:00
stephb9959
218da6d7d5 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 13:29:42 -07:00
stephb9959
f0fea163e4 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 13:14:22 -07:00
stephb9959
dc90ad1698 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 13:03:35 -07:00
stephb9959
d13526606d https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 11:09:57 -07:00
stephb9959
45126be0dc https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 08:27:45 -07:00
stephb9959
cf0677910f https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 08:18:52 -07:00
stephb9959
475522d5dc https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-25 08:04:15 -07:00
stephb9959
7be435a27b https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-24 15:47:48 -07:00
stephb9959
487a038903 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-24 09:46:15 -07:00
stephb9959
e4fd1c4f7e https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-24 09:42:21 -07:00
stephb9959
3c529dbba0 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-05-24 09:06:42 -07:00
stephb9959
94636ea1dc https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-24 08:56:47 -07:00
stephb9959
b4b2b08336 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-05-24 07:29:07 -07:00
stephb9959
fda78a1d8b https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-24 07:27:59 -07:00
stephb9959
f4e7c212fa Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-05-22 10:51:05 -07:00
stephb9959
77c46ad267 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 10:50:42 -07:00
stephb9959
8b67aa61c0 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-05-22 10:46:08 -07:00
stephb9959
f2fdf68130 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 10:45:11 -07:00
stephb9959
9edba2c9c7 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-05-22 10:31:01 -07:00
stephb9959
e427b4cd25 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 10:30:53 -07:00
stephb9959
81c872151b Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-05-22 10:25:38 -07:00
stephb9959
18257c8247 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-05-22 10:25:14 -07:00
stephb9959
a51746f396 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	build
2023-04-19 13:44:45 -07:00
stephb9959
0057483346 https://telecominfraproject.atlassian.net/browse/WIFI-12525
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2023-04-19 13:44:12 -07:00
stephb9959
3163684eac Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-19 08:58:50 -07:00
Stephane Bourque
1033985339 Merge pull request #29 from Telecominfraproject/WIFI-12378
https://telecominfraproject.atlassian.net/browse/WIFI-12378
2023-04-19 08:44:10 -07:00
stephb9959
e07d472142 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-19 08:39:43 -07:00
stephb9959
8e0a21fd9a Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 23:23:48 -07:00
stephb9959
26f49c254f Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 23:15:40 -07:00
stephb9959
d9ecc1aac7 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 23:09:06 -07:00
stephb9959
b7ba377a0c Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 22:58:50 -07:00
stephb9959
91e27fe0c4 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 22:40:02 -07:00
stephb9959
28f4ea5145 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 22:15:44 -07:00
stephb9959
e98c8f2340 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 22:06:12 -07:00
stephb9959
132bbfc597 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 22:04:47 -07:00
stephb9959
03e0031429 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 21:57:23 -07:00
stephb9959
a2d44f3d64 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 21:56:08 -07:00
stephb9959
1de06904c6 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 21:32:53 -07:00
stephb9959
8b570d8d62 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 21:25:53 -07:00
stephb9959
d0106a9687 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 16:41:00 -07:00
stephb9959
3bbe5e2d1b Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 15:05:54 -07:00
stephb9959
eff23f22d9 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 14:31:01 -07:00
stephb9959
5bc6232a89 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 14:12:58 -07:00
stephb9959
aefd6ccf37 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 14:07:41 -07:00
stephb9959
eafe534aad Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 14:04:15 -07:00
stephb9959
50b8113d18 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 13:59:50 -07:00
stephb9959
050ad3c3d3 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 13:49:15 -07:00
stephb9959
6c8fa9dba7 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 12:50:38 -07:00
stephb9959
d719d9b9ce Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 12:35:25 -07:00
stephb9959
6f52e8bf85 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 12:25:41 -07:00
stephb9959
259d2722dc Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 12:19:41 -07:00
stephb9959
eedfce997d Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 12:16:29 -07:00
stephb9959
0dbe8e2c81 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 12:08:26 -07:00
stephb9959
1899728e21 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 11:40:34 -07:00
stephb9959
28e6362b32 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 11:07:18 -07:00
stephb9959
7bd9fe147f Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 10:55:29 -07:00
stephb9959
c8002c55ea Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 10:46:39 -07:00
stephb9959
f978ff0f06 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-18 07:47:41 -07:00
stephb9959
1d61ee6539 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-17 11:00:15 -07:00
stephb9959
acdce83ef9 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-17 10:12:52 -07:00
stephb9959
f44d135acf Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-17 09:45:10 -07:00
stephb9959
f199cbdaec Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-17 09:26:34 -07:00
stephb9959
0eef450565 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-17 08:46:28 -07:00
stephb9959
1c4bd5835c Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-17 08:41:33 -07:00
stephb9959
2129861184 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-17 08:27:26 -07:00
stephb9959
dbf8fd4a9d Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 23:24:21 -07:00
stephb9959
3b8efb40ef Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 23:17:12 -07:00
stephb9959
bb23cb22ad Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 23:10:22 -07:00
stephb9959
716cf134f1 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 22:24:31 -07:00
stephb9959
0b8d7fdc5c Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 22:09:34 -07:00
stephb9959
01d099c586 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 21:37:30 -07:00
stephb9959
21df075a8a Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 21:29:24 -07:00
stephb9959
6f710c0344 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 21:27:48 -07:00
stephb9959
7eb9e0c6cd Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 21:19:16 -07:00
stephb9959
ffaf5428d1 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 11:17:13 -07:00
stephb9959
ae508dcfd6 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 11:14:53 -07:00
stephb9959
8fe56ded3a Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 10:09:40 -07:00
stephb9959
1f2c3f609c Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 10:02:58 -07:00
stephb9959
051612334d Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 09:54:33 -07:00
stephb9959
52225e355b Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 09:42:24 -07:00
stephb9959
a17a5ec74b Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 09:07:10 -07:00
stephb9959
856f868af9 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 08:44:43 -07:00
stephb9959
d7dc336fa9 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-16 08:34:01 -07:00
stephb9959
cf50a7125a Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 23:39:53 -07:00
stephb9959
0164794f50 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 23:34:42 -07:00
stephb9959
389743a6d0 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 23:28:01 -07:00
stephb9959
75a491d2dd Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 23:23:46 -07:00
stephb9959
3cd669f4a3 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 23:05:45 -07:00
stephb9959
61b5f9bf3a Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 22:55:53 -07:00
stephb9959
656b32f1db Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 22:37:01 -07:00
stephb9959
55871aa07e Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 22:23:10 -07:00
stephb9959
ea8bdb1f65 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 22:07:45 -07:00
stephb9959
b266e5f450 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 22:00:36 -07:00
stephb9959
96e89ba0dd Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 21:54:00 -07:00
stephb9959
cbc7c8c564 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 21:47:45 -07:00
stephb9959
a8963de508 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 21:39:31 -07:00
stephb9959
bf10713b7f Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 21:37:57 -07:00
stephb9959
9a0156dea9 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 21:27:45 -07:00
stephb9959
47092ac303 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 20:55:26 -07:00
stephb9959
d7d487856d Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 07:00:02 -07:00
stephb9959
00f4be21ff Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-15 06:56:11 -07:00
stephb9959
2f57241432 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 10:14:50 -07:00
stephb9959
7035049b7d Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 10:11:15 -07:00
stephb9959
d28056a43c Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 10:05:56 -07:00
stephb9959
d9c8274bee Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:59:58 -07:00
stephb9959
9ff09e8a13 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:57:35 -07:00
stephb9959
987abb64ab Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:54:37 -07:00
stephb9959
265cd1ed5c Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:49:56 -07:00
stephb9959
dcad05dd85 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:43:06 -07:00
stephb9959
0499fb51dc Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:41:45 -07:00
stephb9959
10a55031e4 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:39:29 -07:00
stephb9959
fe23a777d0 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:36:37 -07:00
stephb9959
1f0fa3ae6c Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:31:03 -07:00
stephb9959
7ae8498b18 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:29:30 -07:00
stephb9959
5afac8092e Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 09:19:39 -07:00
stephb9959
2615d0113a Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 08:58:46 -07:00
stephb9959
641ab1ad50 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-14 08:55:06 -07:00
stephb9959
8300d387f4 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-13 16:56:45 -07:00
stephb9959
44efafa206 Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-13 16:34:15 -07:00
stephb9959
82e8f3373c Merge branch 'WIFI-12378' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-04-13 16:31:45 -07:00
stephb9959
2e59557b3e Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-03-02 13:01:25 -08:00
stephb9959
e39e58b09b Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2023-01-08 11:54:31 -08:00
stephb9959
0118650be6 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-12-20 11:27:02 -08:00
stephb9959
85858d40b9 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-12-14 12:25:34 -08:00
stephb9959
1e77c7a746 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-11-27 22:03:48 -08:00
stephb9959
2493511ad6 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-11-18 20:05:39 -08:00
stephb9959
1310865a70 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-11-17 21:42:23 -08:00
stephb9959
9d77130c5d Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-11-17 11:48:29 -08:00
stephb9959
b0a59f97e5 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-11-16 10:43:01 -08:00
stephb9959
d4e8b468e9 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-11-07 15:55:25 -08:00
stephb9959
6cf96051bc Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-11-03 10:17:40 -07:00
stephb9959
e0bae5e975 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-10-30 23:40:25 -07:00
stephb9959
4ed5cda4d0 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-10-27 09:46:55 -07:00
stephb9959
6059927eea Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-10-27 09:38:56 -07:00
stephb9959
90738bcc29 Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-10-04 08:36:01 -07:00
stephb9959
f36ede98dc Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-09-30 20:33:30 -07:00
stephb9959
54079e014a Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-09-30 15:16:03 -07:00
stephb9959
39abb170dd Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-09-30 15:07:01 -07:00
stephb9959
bccbbf685d Merge branch 'main' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-09-14 15:44:12 -07:00
stephb9959
7fc9273484 Merge branch 'WIFI-10713' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-09-14 15:40:43 -07:00
stephb9959
43f3dff19b Merge branch 'WIFI-10713' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-09-14 15:22:14 -07:00
stephb9959
9d21987fd1 Merge branch 'WIFI-10713' of https://github.com/telecominfraproject/wlan-cloud-owls into main 2022-09-14 15:14:31 -07:00
69 changed files with 3763 additions and 3758 deletions

1
.gitignore vendored
View File

@@ -37,6 +37,7 @@ git_rsa
/cmake-build/
/cmake-build-debug/
/data/
/owls.properties.good
# Helm
*.swp

2
.idea/.name generated
View File

@@ -1 +1 @@
ucentral_clnt
owls

View File

@@ -52,7 +52,7 @@ include_directories(/usr/local/include /usr/local/opt/openssl/include src inclu
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
add_definitions(-DPOCO_LOG_DEBUG="1")
add_definitions(-DPOCO_LOG_DEBUG="1" -DBOOST_NO_CXX98_FUNCTION_BASE=1)
add_compile_options(-Wall -Wextra)
if(ASAN)
@@ -108,6 +108,7 @@ add_executable( owls
src/framework/RESTAPI_PartHandler.h
src/framework/MicroService.cpp
src/framework/MicroServiceExtra.h
src/framework/default_device_types.h
src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp
@@ -115,7 +116,6 @@ add_executable( owls
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/RESTAPI/RESTAPI_routers.cpp
src/Daemon.cpp src/Daemon.h
src/Dashboard.cpp src/Dashboard.h
@@ -134,4 +134,6 @@ target_link_libraries(owls PRIVATE
${MySQL_LIBRARIES}
${ZLIB_LIBRARIES}
fmt::fmt
CppKafka::cppkafka)
CppKafka::cppkafka
resolv
)

View File

@@ -15,8 +15,8 @@ FROM build-base AS poco-build
ARG POCO_VERSION
ADD https://api.github.com/repos/AriliaWireless/poco/git/refs/tags/${POCO_VERSION} version.json
RUN git clone https://github.com/AriliaWireless/poco --branch ${POCO_VERSION} /poco
ADD https://api.github.com/repos/Telecominfraproject/wlan-cloud-lib-poco/git/refs/tags/${POCO_VERSION} version.json
RUN git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch ${POCO_VERSION} /poco
WORKDIR /poco
RUN mkdir cmake-build
@@ -29,8 +29,8 @@ FROM build-base AS cppkafka-build
ARG CPPKAFKA_VERSION
ADD https://api.github.com/repos/AriliaWireless/cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json
RUN git clone https://github.com/AriliaWireless/cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka
ADD https://api.github.com/repos/Telecominfraproject/wlan-cloud-lib-cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json
RUN git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka
WORKDIR /cppkafka
RUN mkdir cmake-build
@@ -43,8 +43,8 @@ FROM build-base AS valijson-build
ARG VALIJASON_VERSION
ADD https://api.github.com/repos/AriliaWireless/valijson/git/refs/tags/${VALIJASON_VERSION} version.json
RUN git clone https://github.com/AriliaWireless/valijson --branch ${VALIJASON_VERSION} /valijson
ADD https://api.github.com/repos/Telecominfraproject/wlan-cloud-lib-valijson/git/refs/tags/${VALIJASON_VERSION} version.json
RUN git clone https://github.com/Telecominfraproject/wlan-cloud-lib-valijson --branch ${VALIJASON_VERSION} /valijson
WORKDIR /valijson
RUN mkdir cmake-build

2
build
View File

@@ -1 +1 @@
25
19

File diff suppressed because it is too large Load Diff

View File

@@ -146,12 +146,6 @@ components:
- $ref: '#/components/schemas/StringList'
- $ref: '#/components/schemas/TagValuePairList'
SystemCommandResults:
type: object
oneOf:
- $ref: '#/components/schemas/StringList'
- $ref: '#/components/schemas/TagValuePairList'
SystemInfoResults:
type: object
properties:
@@ -180,6 +174,33 @@ components:
type: integer
format: int64
SystemResources:
type: object
properties:
numberOfFileDescriptors:
type: integer
format: int64
currRealMem:
type: integer
format: int64
peakRealMem:
type: integer
format: int64
currVirtMem:
type: integer
format: int64
peakVirtMem:
type: integer
format: int64
SystemCommandResults:
type: object
oneOf:
- $ref: '#/components/schemas/SystemResources'
- $ref: '#/components/schemas/SystemInfoResults'
- $ref: '#/components/schemas/StringList'
- $ref: '#/components/schemas/TagValuePairList'
SystemCommandSetLogLevel:
type: object
properties:
@@ -453,6 +474,7 @@ paths:
type: string
format: uuid
required: true
example: must be set to 0 to create a new simulation
requestBody:
description: Simulation details
content:
@@ -685,18 +707,12 @@ paths:
type: string
enum:
- info
- extraConfiguration
- resources
required: true
responses:
200:
description: Successful command execution
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/SystemInfoResults'
400:
$ref: '#/components/responses/BadRequest'
$ref: '#/components/schemas/SystemCommandResults'
403:
$ref: '#/components/responses/Unauthorized'
404:

View File

@@ -6,14 +6,14 @@
// Arilia Wireless Inc.
//
#include <Poco/Net/SSLManager.h>
#include <framework/UI_WebSocketClientServer.h>
#include "Daemon.h"
#include "SimStats.h"
#include "SimulationCoordinator.h"
#include "StorageService.h"
#include "Poco/Net/SSLManager.h"
#include "UI_Owls_WebSocketNotifications.h"
#include "framework/UI_WebSocketClientServer.h"
namespace OpenWifi {
class Daemon *Daemon::instance_ = nullptr;

View File

@@ -8,9 +8,10 @@
#pragma once
#include <framework/MicroService.h>
#include <framework/MicroServiceNames.h>
#include "Dashboard.h"
#include "framework/MicroService.h"
#include "framework/MicroServiceNames.h"
namespace OpenWifi {

View File

@@ -2,8 +2,8 @@
// Created by stephane bourque on 2021-07-21.
//
#include "Dashboard.h"
#include "framework/utils.h"
#include <framework/utils.h>
#include <Dashboard.h>
namespace OpenWifi {
void OWLSDashboard::Create() {

View File

@@ -2,11 +2,10 @@
// Created by stephane bourque on 2021-07-21.
//
#ifndef UCENTRALGW_DASHBOARD_H
#define UCENTRALGW_DASHBOARD_H
#pragma once
#include "RESTObjects/RESTAPI_OWLSobjects.h"
#include "framework/OpenWifiTypes.h"
#include <framework/OpenWifiTypes.h>
#include <RESTObjects/RESTAPI_OWLSobjects.h>
namespace OpenWifi {
class OWLSDashboard {
@@ -21,4 +20,3 @@ namespace OpenWifi {
};
} // namespace OpenWifi
#endif // UCENTRALGW_DASHBOARD_H

View File

@@ -5,6 +5,7 @@
#pragma once
#include <framework/MicroServiceFuncs.h>
#include "OWLS_utils.h"
namespace OpenWifi {

View File

@@ -2,19 +2,24 @@
// Created by stephane bourque on 2023-04-12.
//
#include <fmt/format.h>
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclientEvents.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
/*
void Connect(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
void Connect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
std::lock_guard G(Client->Mutex_);
if(!Runner->Running()) {
return;
}
std::lock_guard ClientGuard(Client->Mutex_);
if(Client->Valid_) {
try {
Runner->Report().ev_connect++;
@@ -36,22 +41,23 @@ namespace OpenWifi::OWLSclientEvents {
if (Client->SendObject(ConnectMessage)) {
Client->Reset();
Runner->Scheduler().in(std::chrono::seconds(Client->StatisticsInterval_),
OWLSclientEvents::State, Client, Runner);
OWLSClientEvents::State, Client, Runner);
Runner->Scheduler().in(std::chrono::seconds(Client->HealthInterval_),
OWLSclientEvents::HealthCheck, Client, Runner);
OWLSClientEvents::HealthCheck, Client, Runner);
Runner->Scheduler().in(std::chrono::seconds(MicroServiceRandom(120, 200)),
OWLSclientEvents::Log, Client, Runner, 1, "Device started");
OWLSClientEvents::Log, Client, Runner, 1, "Device started");
Runner->Scheduler().in(std::chrono::seconds(60 * 4),
OWLSclientEvents::WSPing, Client, Runner);
OWLSClientEvents::WSPing, Client, Runner);
Runner->Scheduler().in(std::chrono::seconds(30),
OWLSclientEvents::Update, Client, Runner);
OWLSClientEvents::Update, Client, Runner);
Client->Logger_.information(fmt::format("connect({}): completed.", Client->SerialNumber_));
return;
}
} catch (const Poco::Exception &E) {
Client->Logger().log(E);
}
OWLSclientEvents::Disconnect(Client, Runner, "Error occurred during connection", true);
OWLSClientEvents::Disconnect(ClientGuard,Client, Runner, "Error occurred during connection", true);
}
}
*/
}

View File

@@ -1,21 +1,20 @@
//
// Created by stephane bourque on 2023-04-12.
//
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include "OWLSclientEvents.h"
#include "OWLSevent.h"
namespace OpenWifi::OWLSclientEvents {
void CrashLog(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
std::lock_guard G(Client->Mutex_);
namespace OpenWifi::OWLSClientEvents {
void CrashLog([[
maybe_unused]] std::lock_guard<std::mutex> &ClientGuard, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
if(Client->Valid_) {
Runner->Report().ev_crashlog++;
}

View File

@@ -1,32 +1,42 @@
//
// Created by stephane bourque on 2023-04-12.
//
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include "OWLSclientEvents.h"
#include "OWLSevent.h"
#include "OWLS_utils.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
void Disconnect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner, const std::string &Reason, bool Reconnect) {
std::lock_guard G(Client->Mutex_);
void Disconnect(const char *context, std::lock_guard<std::mutex> &ClientGuard, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner,
const std::string &Reason, bool Reconnect) {
if(Client->Valid_) {
Runner->Report().ev_disconnect++;
Client->Disconnect();
poco_debug(Client->Logger(),fmt::format("{}: disconnecting. Reason: {}", Client->SerialNumber_, Reason));
if(Reconnect) {
Runner->Scheduler().in(std::chrono::seconds(OWLSutils::local_random(3, 15)),
OWLSclientEvents::EstablishConnection, Client, Runner);
} else {
if(!Runner->Running()) {
return;
}
try {
if (Client->Valid_) {
Client->Disconnect(context, ClientGuard);
poco_debug(Client->Logger(),
fmt::format("Disconnecting({}): Reason: {}", Client->SerialNumber_, Reason));
if (Reconnect) {
poco_debug(Client->Logger_, fmt::format( "Reconnecting({}): {}", context, Client->SerialNumber_ ));
Runner->Scheduler().in(std::chrono::seconds(Client->Backoff()),
OWLSClientEvents::EstablishConnection, Client, Runner);
} else {
// DEBUG_LINE("not reconnecting");
}
}
} catch (const Poco::Exception &E) {
poco_warning(Client->Logger_,fmt::format("Disconnect({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
poco_warning(Client->Logger_,fmt::format("Disconnect({}): std::exception {}", Client->SerialNumber_, E.what()));
}
}

View File

@@ -2,19 +2,22 @@
// Created by stephane bourque on 2023-04-12.
//
#include <fmt/format.h>
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclientEvents.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
void EstablishConnection( const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
void EstablishConnection(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
Poco::URI uri(Runner->Details().gateway);
Poco::Net::Context::Params P;
@@ -47,8 +50,8 @@ namespace OpenWifi::OWLSclientEvents {
SSL_CTX *SSLCtx = Context->sslContext();
if (!SSL_CTX_check_private_key(SSLCtx)) {
std::cout << "Wrong Certificate: " << SimulationCoordinator()->GetCertFileName()
<< " for " << SimulationCoordinator()->GetKeyFileName() << std::endl;
poco_error(Client->Logger_,fmt::format("Wrong Certificate: {} for {}",SimulationCoordinator()->GetCertFileName() ,
SimulationCoordinator()->GetKeyFileName()));
}
if (SimulationCoordinator()->GetLevel() == Poco::Net::Context::VERIFY_STRICT) {
@@ -60,7 +63,9 @@ namespace OpenWifi::OWLSclientEvents {
Request.set("origin", "http://www.websocket.org");
Poco::Net::HTTPResponse Response;
Client->Logger_.information(fmt::format("connecting({}): host={} port={}", Client->SerialNumber_,
std::lock_guard ClientGuard(Client->Mutex_);
Client->Logger_.information(fmt::format("Connecting({}): host={} port={}", Client->SerialNumber_,
uri.getHost(), uri.getPort()));
try {
@@ -71,30 +76,78 @@ namespace OpenWifi::OWLSclientEvents {
(*Client->WS_).setNoDelay(true);
(*Client->WS_).setBlocking(false);
(*Client->WS_).setMaxPayloadSize(128000);
Runner->AddClientFd(Client->WS_->impl()->sockfd(), Client);
Client->Connected_ = true;
Runner->Reactor().addEventHandler(
*Client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ReadableNotification>(
*Runner, &SimulationRunner::OnSocketReadable));
Runner->Reactor().addEventHandler(
*Client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ErrorNotification>(
*Runner, &SimulationRunner::OnSocketError));
Runner->Reactor().addEventHandler(
*Client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ShutdownNotification>(
*Runner, &SimulationRunner::OnSocketShutdown));
Runner->Scheduler().in(std::chrono::seconds(1), Connect, Client, Runner);
SimStats()->Connect(Runner->Id());
if(Connect(ClientGuard, Client, Runner)) {
Client->fd_ = Client->WS_->impl()->sockfd();
Runner->AddClientFd(Client->fd_, Client);
Client->Reactor_.addEventHandler(
*Client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ReadableNotification>(
*Runner, &SimulationRunner::OnSocketReadable));
Client->Reactor_.addEventHandler(
*Client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ErrorNotification>(
*Runner, &SimulationRunner::OnSocketError));
Client->Reactor_.addEventHandler(
*Client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ShutdownNotification>(
*Runner, &SimulationRunner::OnSocketShutdown));
Client->Connected_ = true;
Client->Logger_.information(fmt::format("connecting({}): connected.", Client->SerialNumber_));
return;
}
} catch (const Poco::Exception &E) {
Client->Logger_.warning(
fmt::format("connecting({}): exception. {}", Client->SerialNumber_, E.displayText()));
Runner->Scheduler().in(std::chrono::seconds(60), Reconnect, Client, Runner);
fmt::format("Connecting({}): exception. {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
Client->Logger_.warning(
fmt::format("connecting({}): std::exception. {}", Client->SerialNumber_, E.what()));
Runner->Scheduler().in(std::chrono::seconds(60), Reconnect, Client, Runner);
fmt::format("Connecting({}): std::exception. {}", Client->SerialNumber_, E.what()));
} catch (...) {
Client->Logger_.warning(fmt::format("connecting({}): unknown exception. {}", Client->SerialNumber_));
Runner->Scheduler().in(std::chrono::seconds(60), Reconnect, Client, Runner);
Client->Logger_.warning(fmt::format("Connecting({}): unknown exception. {}", Client->SerialNumber_));
}
Runner->Scheduler().in(std::chrono::seconds(Client->Backoff()), Reconnect, Client, Runner);
}
}
bool Connect([[
maybe_unused]] std::lock_guard<std::mutex> & ClientGuard, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
try {
Runner->Report().ev_connect++;
Poco::JSON::Object::Ptr ConnectMessage{new Poco::JSON::Object}, Params{new Poco::JSON::Object},
TmpCapabilities{new Poco::JSON::Object}, Capabilities{new Poco::JSON::Object}, MacAddr{new Poco::JSON::Object};
auto LabelMac = Utils::SerialNumberToInt(Client->SerialNumber_);
Params->set("serial", Client->SerialNumber_);
Params->set("uuid", Client->UUID_);
Params->set("firmware", Client->Firmware_);
MacAddr->set("wan", Client->SerialNumber_);
MacAddr->set("lan", Utils::SerialToMAC(Utils::IntToSerialNumber(LabelMac + 1)));
TmpCapabilities = SimulationCoordinator()->GetSimCapabilitiesPtr();
TmpCapabilities->set("label_macaddr", Client->SerialNumber_);
TmpCapabilities->set("macaddr", MacAddr);
Params->set("capabilities", TmpCapabilities);
OWLSutils::MakeHeader(ConnectMessage,"connect",Params);
if (Client->SendObject(__func__, ConnectMessage)) {
Client->Reset();
Runner->Scheduler().in(std::chrono::seconds(Client->StatisticsInterval_ + MicroServiceRandom(5, 15)),
OWLSClientEvents::State, Client, Runner);
Runner->Scheduler().in(std::chrono::seconds(Client->HealthInterval_ + MicroServiceRandom(5, 15)),
OWLSClientEvents::HealthCheck, Client, Runner);
Runner->Scheduler().in(std::chrono::seconds(MicroServiceRandom(120, 200)),
OWLSClientEvents::Log, Client, Runner, 1, "Device started");
Runner->Scheduler().in(std::chrono::seconds(60 * 4 + MicroServiceRandom(5, 15) ),
OWLSClientEvents::WSPing, Client, Runner);
/* Runner->Scheduler().in(std::chrono::seconds(30),
OWLSClientEvents::Update, Client, Runner);
*/
Client->Logger_.information(fmt::format("connect({}): completed.", Client->SerialNumber_));
Client->Backoff_=0;
SimStats()->Connect(Runner->Id());
return true;
}
} catch (const Poco::Exception &E) {
Client->Logger().log(E);
}
return false;
}
}

View File

@@ -1,48 +1,45 @@
//
// Created by stephane bourque on 2023-04-12.
//
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include "OWLSclientEvents.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
void HealthCheck(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
std::lock_guard G(Client->Mutex_);
void HealthCheck(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
std::lock_guard ClientGuard(Client->Mutex_);
// DEBUG_LINE("start");
if(Client->Valid_ && Client->Connected_) {
Runner->Report().ev_healthcheck++;
try {
Poco::JSON::Object Message, Params, Data, Memory;
Memory.set("memory", 23);
Data.set("data", Memory);
Params.set(uCentralProtocol::SERIAL, Client->SerialNumber_);
Params.set(uCentralProtocol::UUID, Client->UUID_);
Params.set(uCentralProtocol::SANITY, 100);
Params.set(uCentralProtocol::DATA, Data);
Poco::JSON::Object::Ptr Message{new Poco::JSON::Object}, Params{new Poco::JSON::Object}, Data{new Poco::JSON::Object}, Memory{new Poco::JSON::Object};
Memory->set("memory", 23);
Data->set("data", Memory);
Params->set(uCentralProtocol::SERIAL, Client->SerialNumber_);
Params->set(uCentralProtocol::UUID, Client->UUID_);
Params->set(uCentralProtocol::SANITY, 100);
Params->set(uCentralProtocol::DATA, Data);
OWLSutils::MakeHeader(Message, uCentralProtocol::HEALTHCHECK, Params);
std::cout << Client->SerialNumber_ << " H: " << Client->UUID_ << std::endl;
if (Client->SendObject(Message)) {
if (Client->SendObject(__func__, Message)) {
Runner->Scheduler().in(std::chrono::seconds(Client->HealthInterval_),
OWLSclientEvents::HealthCheck, Client, Runner);
OWLSClientEvents::HealthCheck, Client, Runner);
return;
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Client->Logger().log(E);
poco_warning(Client->Logger_,fmt::format("HealthCheck({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
poco_warning(Client->Logger_,fmt::format("HealthCheck({}): std::exception {}", Client->SerialNumber_, E.what()));
}
OWLSclientEvents::Disconnect(Client, Runner, "Error while sending HealthCheck", true);
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Runner, "Error while sending HealthCheck", true);
}
}

View File

@@ -1,41 +1,41 @@
//
// Created by stephane bourque on 2023-04-12.
//
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include "OWLSclientEvents.h"
namespace OpenWifi::OWLSclientEvents {
void KeepAlive(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
std::lock_guard G(Client->Mutex_);
namespace OpenWifi::OWLSClientEvents {
void KeepAlive(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
std::lock_guard ClientGuard(Client->Mutex_);
if(Client->Valid_ && Client->Connected_) {
Runner->Report().ev_keepalive++;
try {
Poco::JSON::Object Message, Params;
Params.set("serial", Client->SerialNumber_);
Params.set("uuid", Client->UUID_);
Poco::JSON::Object::Ptr Message{new Poco::JSON::Object},
Params{new Poco::JSON::Object};
Params->set("serial", Client->SerialNumber_);
Params->set("uuid", Client->UUID_);
OWLSutils::MakeHeader(Message,"ping",Params);
if (Client->SendObject(Message)) {
if (Client->SendObject(__func__, Message)) {
Runner->Scheduler().in(std::chrono::seconds(Runner->Details().keepAlive),
OWLSclientEvents::KeepAlive, Client, Runner);
OWLSClientEvents::KeepAlive, Client, Runner);
return;
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Client->Logger().log(E);
poco_warning(Client->Logger_,fmt::format("KeepAlive({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
poco_warning(Client->Logger_,fmt::format("KeepAlive({}): std::exception {}", Client->SerialNumber_, E.what()));
}
OWLSclientEvents::Disconnect(Client, Runner, "Error while sending keepalive", true);
OWLSClientEvents::Disconnect(__func__, ClientGuard,Client, Runner, "Error while sending keepalive", true);
}
}

View File

@@ -1,40 +1,40 @@
//
// Created by stephane bourque on 2023-04-12.
//
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include "OWLSclientEvents.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
void Log(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner, std::uint64_t Severity, const std::string & LogLine) {
std::lock_guard G(Client->Mutex_);
void Log(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner, std::uint64_t Severity, const std::string & LogLine) {
if(!Runner->Running()) {
return;
}
std::lock_guard ClientGuard(Client->Mutex_);
if(Client->Valid_ && Client->Connected_ ) {
Runner->Report().ev_log++;
try {
Poco::JSON::Object Message, Params;
Params.set("serial", Client->SerialNumber_);
Params.set("uuid", Client->UUID_);
Params.set("severity", Severity);
Params.set("log", LogLine);
Poco::JSON::Object::Ptr Message{new Poco::JSON::Object}, Params{new Poco::JSON::Object};
Params->set("serial", Client->SerialNumber_);
Params->set("uuid", Client->UUID_);
Params->set("severity", Severity);
Params->set("log", LogLine);
OWLSutils::MakeHeader(Message,"log",Params);
if (Client->SendObject(Message)) {
if (Client->SendObject(__func__,Message)) {
return;
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Client->Logger().log(E);
poco_warning(Client->Logger_,fmt::format("Log({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
poco_warning(Client->Logger_,fmt::format("KeLogepAlive({}): std::exception {}", Client->SerialNumber_, E.what()));
}
OWLSclientEvents::Disconnect(Client, Runner, "Error while sending a Log event", true);
OWLSClientEvents::Disconnect(__func__, ClientGuard,Client, Runner, "Error while sending a Log event", true);
}
}

View File

@@ -1,40 +1,39 @@
//
// Created by stephane bourque on 2023-04-12.
//
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include "OWLSclientEvents.h"
#include "OWLSevent.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
void PendingConfig(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
std::lock_guard G(Client->Mutex_);
void PendingConfig(std::lock_guard<std::mutex> &ClientGuard, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
if(Client->Valid_ && Client->Connected_) {
Runner->Report().ev_configpendingchange++;
try {
Poco::JSON::Object Message, Params;
Params.set("serial", Client->SerialNumber_);
Params.set("uuid", Client->UUID_);
Params.set("active", Client->Active_);
Poco::JSON::Object::Ptr Message{new Poco::JSON::Object}, Params{new Poco::JSON::Object};
Params->set("serial", Client->SerialNumber_);
Params->set("uuid", Client->UUID_);
Params->set("active", Client->Active_);
OWLSutils::MakeHeader(Message,"cfgpending",Params);
if (Client->SendObject(Message)) {
if (Client->SendObject(__func__,Message)) {
return;
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Client->Logger().log(E);
poco_warning(Client->Logger_,fmt::format("PendingConfig({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
poco_warning(Client->Logger_,fmt::format("PendingConfig({}): std::exception {}", Client->SerialNumber_, E.what()));
}
OWLSclientEvents::Disconnect(Client, Runner, "Error while sending ConfigPendingEvent", true);
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Runner, "Error while sending ConfigPendingEvent", true);
}
}

View File

@@ -2,32 +2,32 @@
// Created by stephane bourque on 2023-04-12.
//
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include "OWLSclientEvents.h"
#include "OWLS_utils.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
void Reconnect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
std::lock_guard G(Client->Mutex_);
void Reconnect(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
std::lock_guard ClientGuard(Client->Mutex_);
try {
if(Client->Valid_) {
Runner->Report().ev_reconnect++;
Client->Connected_ = false;
Runner->Scheduler().in(std::chrono::seconds(OWLSutils::local_random(3,15)), OWLSclientEvents::EstablishConnection, Client, Runner);
Runner->Scheduler().in(std::chrono::seconds(Client->Backoff()), OWLSClientEvents::EstablishConnection, Client, Runner);
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Client->Logger().log(E);
poco_warning(Client->Logger_,fmt::format("Reconnect({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
poco_warning(Client->Logger_,fmt::format("Reconnect({}): std::exception {}", Client->SerialNumber_, E.what()));
}
}

View File

@@ -2,61 +2,58 @@
// Created by stephane bourque on 2023-04-12.
//
#include <fmt/format.h>
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSdefinitions.h"
#include "OWLSclientEvents.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
void State(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
void State(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
std::lock_guard G(Client->Mutex_);
std::lock_guard ClientGuard(Client->Mutex_);
if(Client->Valid_ && Client->Connected_) {
Runner->Report().ev_state++;
try {
Poco::JSON::Object Message, TempParams, Params;
Poco::JSON::Object::Ptr Message{new Poco::JSON::Object}, TempParams{new Poco::JSON::Object}, Params{new Poco::JSON::Object};
TempParams.set(uCentralProtocol::SERIAL, Client->SerialNumber_);
TempParams.set(uCentralProtocol::UUID, Client->UUID_);
TempParams.set(uCentralProtocol::STATE, Client->CreateStatePtr());
TempParams->set(uCentralProtocol::SERIAL, Client->SerialNumber_);
TempParams->set(uCentralProtocol::UUID, Client->UUID_);
TempParams->set(uCentralProtocol::STATE, Client->CreateStatePtr());
std::ostringstream os;
TempParams.stringify(os);
// std::cout << "State: " << os.str() << std::endl;
TempParams->stringify(os);
unsigned long BufSize = os.str().size() + 4000;
std::vector<Bytef> Buffer(BufSize);
compress(&Buffer[0], &BufSize, (Bytef *)os.str().c_str(), os.str().size());
auto CompressedBase64Encoded = OpenWifi::Utils::base64encode(&Buffer[0], BufSize);
Params.set("compress_64", CompressedBase64Encoded);
Params.set("compress_sz", os.str().size());
Params->set("compress_64", CompressedBase64Encoded);
Params->set("compress_sz", os.str().size());
OWLSutils::MakeHeader(Message,uCentralProtocol::STATE,Params);
std::cout << Client->SerialNumber_ << " S: " << Client->UUID_ << std::endl;
if (Client->SendObject(Message)) {
if (Client->SendObject(__func__, Message)) {
Runner->Scheduler().in(std::chrono::seconds(Client->StatisticsInterval_),
OWLSclientEvents::State, Client, Runner);
OWLSClientEvents::State, Client, Runner);
return;
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Client->Logger().log(E);
poco_warning(Client->Logger_,fmt::format("State({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
poco_warning(Client->Logger_,fmt::format("State({}): std::exception {}", Client->SerialNumber_, E.what()));
}
DEBUG_LINE("failed");
OWLSclientEvents::Disconnect(Client, Runner, "Error sending stats event", true);
OWLSClientEvents::Disconnect(__func__, ClientGuard,Client, Runner, "Error sending stats event", true);
}
}

View File

@@ -1,29 +1,33 @@
//
// Created by stephane bourque on 2023-04-12.
//
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclientEvents.h"
namespace OpenWifi::OWLSclientEvents {
namespace OpenWifi::OWLSClientEvents {
void Update(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
std::lock_guard G(Client->Mutex_);
void Update(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
std::lock_guard ClientGuard(Client->Mutex_);
try {
if(Client->Valid_ && Client->Connected_) {
Runner->Report().ev_update++;
Client->Update();
Runner->Scheduler().in(std::chrono::seconds(30),
OWLSclientEvents::Update, Client, Runner);
OWLSClientEvents::Update, Client, Runner);
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Client->Logger().log(E);
poco_warning(Client->Logger_,fmt::format("Update({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
poco_warning(Client->Logger_,fmt::format("Update({}): std::exception {}", Client->SerialNumber_, E.what()));
}
}

View File

@@ -1,35 +1,34 @@
//
// Created by stephane bourque on 2023-04-12.
//
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimulationCoordinator.h"
#include <fmt/format.h>
#include "SimStats.h"
#include <Poco/NObserver.h>
#include "OWLSclient.h"
#include "SimulationRunner.h"
#include "SimStats.h"
#include "OWLSclientEvents.h"
namespace OpenWifi::OWLSclientEvents {
void WSPing(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner) {
std::lock_guard G(Client->Mutex_);
namespace OpenWifi::OWLSClientEvents {
void WSPing(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner) {
if(!Runner->Running()) {
return;
}
std::lock_guard<std::mutex> ClientGuard(Client->Mutex_);
if(Client->Valid_ && Client->Connected_) {
Runner->Report().ev_wsping++;
try {
Client->WS_->sendFrame(
"", 0, Poco::Net::WebSocket::FRAME_OP_PING | Poco::Net::WebSocket::FRAME_FLAG_FIN);
Runner->Scheduler().in(std::chrono::seconds(60 * 4),
OWLSclientEvents::WSPing, Client, Runner);
Runner->Scheduler().in(std::chrono::seconds(60 * 3),
OWLSClientEvents::WSPing, Client, Runner);
return;
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Client->Logger().log(E);
poco_warning(Client->Logger_,fmt::format("WSPing({}): exception {}", Client->SerialNumber_, E.displayText()));
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
poco_warning(Client->Logger_,fmt::format("WSPing({}): std::exception {}", Client->SerialNumber_, E.what()));
}
OWLSclientEvents::Disconnect(Client, Runner, "Error in WSPing", true);
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Runner, "Error in WSPing", true);
}
}

View File

@@ -5,6 +5,7 @@
#pragma once
#include <random>
#include <framework/MicroServiceFuncs.h>
#include <framework/ow_constants.h>
@@ -205,16 +206,16 @@ namespace OpenWifi {
return Channels_2G[std::rand() % Channels_2G.size()];
}
inline void MakeHeader(Poco::JSON::Object &Message, const char *method, const Poco::JSON::Object &Params) {
Message.set(uCentralProtocol::JSONRPC, "2.0");
Message.set(uCentralProtocol::METHOD, method);
Message.set(uCentralProtocol::PARAMS, Params);
inline void MakeHeader(Poco::JSON::Object::Ptr Message, const char *method, const Poco::JSON::Object::Ptr &Params) {
Message->set(uCentralProtocol::JSONRPC, "2.0");
Message->set(uCentralProtocol::METHOD, method);
Message->set(uCentralProtocol::PARAMS, Params);
}
inline void MakeRPCHeader(Poco::JSON::Object &Message, std::uint64_t Id, const Poco::JSON::Object &Result) {
Message.set(uCentralProtocol::JSONRPC, "2.0");
Message.set(uCentralProtocol::ID, Id);
Message.set(uCentralProtocol::RESULT, Result);
inline void MakeRPCHeader(Poco::JSON::Object::Ptr Message, std::uint64_t Id, const Poco::JSON::Object::Ptr &Result) {
Message->set(uCentralProtocol::JSONRPC, "2.0");
Message->set(uCentralProtocol::ID, Id);
Message->set(uCentralProtocol::RESULT, Result);
}
inline bool is_integer(const std::string &s) {

View File

@@ -7,30 +7,32 @@
#include <thread>
#include <tuple>
#include "OWLS_utils.h"
#include <fmt/format.h>
#include <Poco/NObserver.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/URI.h>
#include "Poco/NObserver.h"
#include "Poco/Net/HTTPRequest.h"
#include "Poco/URI.h"
#include "OWLSclient.h"
#include "OWLSdefinitions.h"
#include "framework/MicroServiceFuncs.h"
#include "OWLS_utils.h"
#include "OWLSclient.h"
#include "OWLSdefinitions.h"
#include "SimStats.h"
#include "SimulationCoordinator.h"
#include "fmt/format.h"
using namespace std::chrono_literals;
namespace OpenWifi {
OWLSclient::OWLSclient(std::string SerialNumber,
Poco::Logger &Logger, SimulationRunner *runner)
Poco::Logger &Logger, SimulationRunner *runner,
Poco::Net::SocketReactor &R)
: Logger_(Logger), SerialNumber_(std::move(SerialNumber)),
Memory_(1),
Load_(1),
Runner_(runner) {
Runner_(runner),
Reactor_(R) {
AllInterfaceNames_[ap_interface_types::upstream] = "up0v0";
AllInterfaceNames_[ap_interface_types::downstream] = "down0v0";
@@ -245,64 +247,66 @@ namespace OpenWifi {
}
}
Poco::JSON::Object OWLSclient::CreateLinkStatePtr() {
Poco::JSON::Object res;
Poco::JSON::Object::Ptr OWLSclient::CreateLinkStatePtr() {
Poco::JSON::Object::Ptr res{new Poco::JSON::Object};
for (const auto &[interface_type, _] : AllCounters_) {
Poco::JSON::Object InterfaceInfo, InterfacePort;
InterfaceInfo.set("carrier",1);
InterfaceInfo.set("duplex","full");
InterfaceInfo.set("speed",1000);
InterfacePort.set(AllPortNames_[interface_type],InterfaceInfo);
res.set(AllInterfaceRoles_[interface_type], InterfacePort);
res->set(AllInterfaceRoles_[interface_type], InterfacePort);
}
return res;
}
Poco::JSON::Object OWLSclient::CreateStatePtr() {
Poco::JSON::Object State,Unit;
Poco::JSON::Object::Ptr OWLSclient::CreateStatePtr() {
Poco::JSON::Object::Ptr State{new Poco::JSON::Object},Unit{new Poco::JSON::Object};
auto now = Utils::Now();
Memory_.to_json(Unit);
Load_.to_json(Unit);
Unit.set("localtime", now);
Unit.set("uptime", now - StartTime_);
Unit.set("temperature", std::vector<std::int64_t> { OWLSutils::local_random(48,58), OWLSutils::local_random(48,58)});
Memory_.to_json(*Unit);
Load_.to_json(*Unit);
Unit->set("localtime", now);
Unit->set("uptime", now - StartTime_);
Unit->set("temperature", std::vector<std::int64_t> { OWLSutils::local_random(48,58), OWLSutils::local_random(48,58)});
Poco::JSON::Array RadioArray;
Poco::JSON::Array::Ptr RadioArray{new Poco::JSON::Array};
for (auto &[_, radio] : AllRadios_) {
Poco::JSON::Object doc;
radio.to_json(doc);
RadioArray.add(doc);
RadioArray->add(doc);
}
Poco::JSON::Array all_interfaces;
Poco::JSON::Array::Ptr all_interfaces{new Poco::JSON::Array};
for (const auto &ap_interface_type :
{ap_interface_types::upstream, ap_interface_types::downstream}) {
if (AllCounters_.find(ap_interface_type) != AllCounters_.end()) {
Poco::JSON::Object current_interface;
Poco::JSON::Array ue_clients, up_ssids;
Poco::JSON::Object::Ptr current_interface{new Poco::JSON::Object};
Poco::JSON::Array::Ptr ue_clients{new Poco::JSON::Array}, up_ssids{new Poco::JSON::Array};
uint64_t ssid_num = 0, interfaces = 0;
for (auto &[interface, associations] : AllAssociations_) {
auto &[interface_type, ssid, band] = interface;
if (interface_type == ap_interface_type) {
Poco::JSON::Array association_list;
Poco::JSON::Array::Ptr association_list{new Poco::JSON::Array};
std::string bssid;
for (auto &association : associations) {
bssid = association.bssid;
Poco::JSON::Object doc;
association.to_json(doc);
association_list.add(doc);
association_list->add(doc);
Poco::JSON::Object ue;
ue.set("mac", association.station);
ue.set("ipv4_addresses", std::vector<std::string>{association.ipaddr_v4});
ue.set("ipv6_addresses", std::vector<std::string>{association.ipaddr_v6});
if(interface_type==upstream)
if(interface_type==upstream) {
ue.set("ports", std::vector<std::string>{"wwan0"});
else
ue.set("ports", std::vector<std::string>{"wlan0"});
}
else {
ue.set("ports", std::vector<std::string>{"wlan0"});
}
ue.set("last_seen", 0);
ue_clients.add(ue);
ue_clients->add(ue);
}
Poco::JSON::Object ssid_info;
ssid_info.set("associations", association_list);
@@ -323,13 +327,13 @@ namespace OpenWifi {
R.set("$ref",
"#/radios/" + std::to_string(AllRadios_[band].index));
ssid_info.set("radio", R);
up_ssids.add(ssid_info);
up_ssids->add(ssid_info);
}
}
current_interface.set("ssids", up_ssids);
current_interface->set("ssids", up_ssids);
Poco::JSON::Object C;
AllCounters_[ap_interface_type].to_json(C);
current_interface.set("counters", C);
current_interface->set("counters", C);
// if we have 2 interfaces, then the clients go to the downstream interface
// if we only have 1 interface then this is bridged and therefore clients go on the
@@ -338,62 +342,69 @@ namespace OpenWifi {
ap_interface_type == ap_interface_types::upstream) ||
(AllCounters_.size() == 2 &&
ap_interface_type == ap_interface_types::downstream)) {
Poco::JSON::Array ip_clients;
Poco::JSON::Array::Ptr ip_clients{new Poco::JSON::Array};
for (const auto &lan_client : AllLanClients_) {
Poco::JSON::Object d;
lan_client.to_json(d);
ip_clients.add(d);
ip_clients->add(d);
}
for (const auto &ue_client : ue_clients) {
ip_clients.add(ue_client);
for (const auto &ue_client : *ue_clients) {
ip_clients->add(ue_client);
}
current_interface.set("clients", ip_clients);
current_interface->set("clients", ip_clients);
}
current_interface.set("name", AllInterfaceNames_[ap_interface_type]);
all_interfaces.add(current_interface);
current_interface->set("name", AllInterfaceNames_[ap_interface_type]);
all_interfaces->add(current_interface);
}
}
State.set("version" , 1 );
State.set("radios", RadioArray);
State.set("link-state", CreateLinkStatePtr());
State.set("unit", Unit);
State.set("interfaces", all_interfaces);
State->set("version" , 1 );
State->set("radios", RadioArray);
State->set("link-state", CreateLinkStatePtr());
State->set("unit", Unit);
State->set("interfaces", all_interfaces);
return State;
}
void OWLSclient::DoConfigure([[maybe_unused]] std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params) {
void OWLSclient::DoConfigure(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params) {
std::lock_guard ClientGuard(Client->Mutex_);
try {
std::lock_guard G(Client->Mutex_);
if (Params->has(uCentralProtocol::SERIAL) &&
Params->has(uCentralProtocol::CONFIG) &&
Params->has(uCentralProtocol::UUID)) {
std::string Serial = Params->get(uCentralProtocol::SERIAL);
std::uint64_t NewUUID = Params->get(uCentralProtocol::UUID);
std::cout << Client->SerialNumber_ << " C: " << Client->UUID_ << " New: " << NewUUID << std::endl;
auto Configuration = Params->getObject("config");
Client->UUID_ = Client->Active_ = NewUUID;
Client->CurrentConfig_ = Configuration;
auto Metrics = Configuration->getObject("metrics");
auto Health = Metrics->getObject("health");
Client->HealthInterval_ = Health->get("interval");
auto Statistics = Metrics->getObject("statistics");
Client->StatisticsInterval_ = Statistics->get("interval");
if(Configuration->isObject("metrics")) {
auto Metrics = Configuration->getObject("metrics");
if(Metrics->isObject("health")) {
auto Health = Metrics->getObject("health");
Client->HealthInterval_ = Health->get("interval");
}
if(Metrics->isObject("statistics")) {
auto Statistics = Metrics->getObject("statistics");
Client->StatisticsInterval_ = Statistics->get("interval");
}
}
// prepare response...
Poco::JSON::Object Answer, Result, Status;
Status.set(uCentralProtocol::ERROR, 0);
Status.set(uCentralProtocol::TEXT, "Success");
Result.set(uCentralProtocol::SERIAL, Serial);
Result.set(uCentralProtocol::UUID, Client->UUID_);
Result.set(uCentralProtocol::STATUS, Status);
Poco::JSON::Object::Ptr Answer{new Poco::JSON::Object}, Result{new Poco::JSON::Object}, Status{new Poco::JSON::Object};
Status->set(uCentralProtocol::ERROR, 0);
Status->set(uCentralProtocol::TEXT, "Success");
Result->set(uCentralProtocol::SERIAL, Serial);
Result->set(uCentralProtocol::UUID, Client->UUID_);
Result->set(uCentralProtocol::STATUS, Status);
OWLSutils::MakeRPCHeader(Answer, Id, Result);
poco_information(Client->Logger_,fmt::format("configure({}): done.", Client->SerialNumber_));
// std::this_thread::sleep_for(std::chrono::seconds(OWLSutils::local_random(10,30)));
Client->SendObject(Answer);
if(!Client->SendObject(__func__,Answer)) {
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: configure - failed.", true);
}
} else {
poco_warning(Client->Logger_,fmt::format("configure({}): Illegal command.", Client->SerialNumber_));
}
@@ -406,47 +417,54 @@ namespace OpenWifi {
}
}
void OWLSclient::Disconnect() {
void OWLSclient::Disconnect(const char *context, [[maybe_unused]] std::lock_guard<std::mutex> &Guard) {
if(fd_!=-1) {
Runner_->RemoveClientFd(fd_);
fd_ = -1;
}
if(Valid_) {
Runner_->Report().ev_disconnect++;
SimStats()->Disconnect(Runner_->Id());
if (Connected_) {
Runner_->RemoveClientFd(fd_);
fd_ = -1;
Runner_->Reactor().removeEventHandler(
Reactor_.removeEventHandler(
*WS_, Poco::NObserver<SimulationRunner, Poco::Net::ReadableNotification>(
*Runner_, &SimulationRunner::OnSocketReadable));
Runner_->Reactor().removeEventHandler(
Reactor_.removeEventHandler(
*WS_, Poco::NObserver<SimulationRunner, Poco::Net::ErrorNotification>(
*Runner_, &SimulationRunner::OnSocketError));
Runner_->Reactor().removeEventHandler(
Reactor_.removeEventHandler(
*WS_, Poco::NObserver<SimulationRunner, Poco::Net::ShutdownNotification>(
*Runner_, &SimulationRunner::OnSocketShutdown));
(*WS_).close();
Connected_ = false;
poco_debug(Logger_, fmt::format("Disconnecting a client({}){}: ", context, SerialNumber_));
}
Connected_ = false;
}
}
void OWLSclient::DoReboot(std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params) {
void OWLSclient::DoReboot(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params) {
std::lock_guard ClientGuard(Client->Mutex_);
try {
std::lock_guard G(Client->Mutex_);
if (Params->has("serial") && Params->has("when")) {
std::string Serial = Params->get("serial");
Poco::JSON::Object Answer, Result, Status;
Status.set(uCentralProtocol::ERROR, 0);
Status.set(uCentralProtocol::TEXT, "Success");
Result.set(uCentralProtocol::SERIAL, Serial);
Result.set(uCentralProtocol::UUID, Client->UUID_);
Result.set(uCentralProtocol::STATUS, Status);
Poco::JSON::Object::Ptr Answer{new Poco::JSON::Object}, Result{new Poco::JSON::Object}, Status{new Poco::JSON::Object};
Status->set(uCentralProtocol::ERROR, 0);
Status->set(uCentralProtocol::TEXT, "Success");
Result->set(uCentralProtocol::SERIAL, Serial);
Result->set(uCentralProtocol::UUID, Client->UUID_);
Result->set(uCentralProtocol::STATUS, Status);
OWLSutils::MakeRPCHeader(Answer,Id,Result);
poco_information(Client->Logger_,fmt::format("reboot({}): done.", Client->SerialNumber_));
Client->SendObject(Answer);
Client->Disconnect();
Client->Reset();
std::this_thread::sleep_for(std::chrono::seconds(20));
OWLSclientEvents::Disconnect(Client, Client->Runner_, "Command: reboot", true);
if(!Client->SendObject(__func__ ,Answer)) {
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: reboot failed", true);
} else {
Client->Disconnect(__func__, ClientGuard);
Client->Reset();
std::this_thread::sleep_for(std::chrono::seconds(20));
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: reboot", true);
}
} else {
Client->Logger_.warning(fmt::format("reboot({}): Illegal command.", Client->SerialNumber_));
}
@@ -473,28 +491,31 @@ namespace OpenWifi {
return p;
}
void OWLSclient::DoUpgrade(std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params) {
void OWLSclient::DoUpgrade(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params) {
std::lock_guard ClientGuard(Client->Mutex_);
try {
std::lock_guard G(Client->Mutex_);
if (Params->has("serial") && Params->has("uri")) {
std::string Serial = Params->get("serial");
std::string URI = Params->get("uri");
Poco::JSON::Object Answer, Result, Status;
Status.set(uCentralProtocol::ERROR, 0);
Status.set(uCentralProtocol::TEXT, "Success");
Result.set(uCentralProtocol::SERIAL, Serial);
Result.set(uCentralProtocol::UUID, Client->UUID_);
Result.set(uCentralProtocol::STATUS, Status);
Poco::JSON::Object::Ptr Answer{new Poco::JSON::Object}, Result{new Poco::JSON::Object}, Status{new Poco::JSON::Object};
Status->set(uCentralProtocol::ERROR, 0);
Status->set(uCentralProtocol::TEXT, "Success");
Result->set(uCentralProtocol::SERIAL, Serial);
Result->set(uCentralProtocol::UUID, Client->UUID_);
Result->set(uCentralProtocol::STATUS, Status);
OWLSutils::MakeRPCHeader(Answer, Id, Result);
poco_information(Client->Logger_,fmt::format("upgrade({}): from URI={}.", Client->SerialNumber_, URI));
Client->SendObject(Answer);
Client->Disconnect();
Client->Version_++;
Client->SetFirmware(GetFirmware(URI));
std::this_thread::sleep_for(std::chrono::seconds(30));
Client->Reset();
OWLSclientEvents::Disconnect(Client, Client->Runner_, "Command: upgrade", true);
if(!Client->SendObject(__func__ , Answer)) {
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: upgrade failed", true);
} else {
Client->Disconnect(__func__,ClientGuard);
Client->Version_++;
Client->SetFirmware(GetFirmware(URI));
std::this_thread::sleep_for(std::chrono::seconds(30));
Client->Reset();
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: upgrade", true);
}
} else {
Client->Logger_.warning(fmt::format("upgrade({}): Illegal command.", Client->SerialNumber_));
}
@@ -504,30 +525,33 @@ namespace OpenWifi {
}
}
void OWLSclient::DoFactory(std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params) {
void OWLSclient::DoFactory(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params) {
std::lock_guard ClientGuard(Client->Mutex_);
try {
std::lock_guard G(Client->Mutex_);
if (Params->has("serial") && Params->has("when")) {
std::string Serial = Params->get("serial");
Client->Version_ = 1;
Client->SetFirmware();
Poco::JSON::Object Answer, Result, Status;
Status.set(uCentralProtocol::ERROR, 0);
Status.set(uCentralProtocol::TEXT, "Success");
Result.set(uCentralProtocol::SERIAL, Serial);
Result.set(uCentralProtocol::UUID, Client->UUID_);
Result.set(uCentralProtocol::STATUS, Status);
Poco::JSON::Object::Ptr Answer{new Poco::JSON::Object}, Result{new Poco::JSON::Object}, Status{new Poco::JSON::Object};
Status->set(uCentralProtocol::ERROR, 0);
Status->set(uCentralProtocol::TEXT, "Success");
Result->set(uCentralProtocol::SERIAL, Serial);
Result->set(uCentralProtocol::UUID, Client->UUID_);
Result->set(uCentralProtocol::STATUS, Status);
OWLSutils::MakeRPCHeader(Answer, Id, Result);
poco_information(Client->Logger_, fmt::format("factory({}): done.", Client->SerialNumber_));
Client->SendObject(Answer);
Client->Disconnect();
Client->CurrentConfig_ = SimulationCoordinator()->GetSimConfigurationPtr(Utils::Now());
Client->UpdateConfiguration();
std::this_thread::sleep_for(std::chrono::seconds(5));
Client->Reset();
OWLSclientEvents::Disconnect(Client, Client->Runner_, "Command: upgrade", true);
if(!Client->SendObject(__func__ , Answer)) {
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: factory failed", true);
} else {
Client->Disconnect(__func__, ClientGuard);
Client->CurrentConfig_ = SimulationCoordinator()->GetSimConfigurationPtr(Utils::Now());
Client->UpdateConfiguration();
std::this_thread::sleep_for(std::chrono::seconds(5));
Client->Reset();
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: upgrade", true);
}
} else {
Client->Logger_.warning(fmt::format("factory({}): Illegal command.", Client->SerialNumber_));
}
@@ -537,24 +561,26 @@ namespace OpenWifi {
}
}
void OWLSclient::DoLEDs([[maybe_unused]] std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params) {
void OWLSclient::DoLEDs(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params) {
std::lock_guard ClientGuard(Client->Mutex_);
try {
std::lock_guard G(Client->Mutex_);
if (Params->has("serial") && Params->has("pattern")) {
std::string Serial = Params->get("serial");
auto Pattern = Params->get("pattern").toString();
uint64_t Duration = Params->has("when") ? (uint64_t)Params->get("durarion") : 10;
Poco::JSON::Object Answer, Result, Status;
Status.set(uCentralProtocol::ERROR, 0);
Status.set(uCentralProtocol::TEXT, "Success");
Result.set(uCentralProtocol::SERIAL, Serial);
Result.set(uCentralProtocol::UUID, Client->UUID_);
Result.set(uCentralProtocol::STATUS, Status);
Poco::JSON::Object::Ptr Answer{new Poco::JSON::Object}, Result{new Poco::JSON::Object}, Status{new Poco::JSON::Object};
Status->set(uCentralProtocol::ERROR, 0);
Status->set(uCentralProtocol::TEXT, "Success");
Result->set(uCentralProtocol::SERIAL, Serial);
Result->set(uCentralProtocol::UUID, Client->UUID_);
Result->set(uCentralProtocol::STATUS, Status);
OWLSutils::MakeRPCHeader(Answer, Id, Result);
poco_information(Client->Logger_,fmt::format("LEDs({}): pattern set to: {} for {} ms.",
Client->SerialNumber_, Duration, Pattern));
Client->SendObject(Answer);
if(!Client->SendObject(__func__ , Answer)) {
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: LEDs failed", true);
}
} else {
Client->Logger_.warning(fmt::format("LEDs({}): Illegal command.", Client->SerialNumber_));
}
@@ -563,74 +589,43 @@ namespace OpenWifi {
}
}
void OWLSclient::UNsupportedCommand(std::shared_ptr<OWLSclient> Client, uint64_t Id,
void OWLSclient::UnSupportedCommand([[
maybe_unused]] std::lock_guard<std::mutex> &ClientGuard,const std::shared_ptr<OWLSclient> &Client, uint64_t Id,
const std::string & Method) {
try {
Poco::JSON::Object Answer, Result, Status;
Status.set("error", 1);
Status.set("text", "Command not supported");
Result.set("serial", Client->SerialNumber_);
Result.set("status", Status);
Poco::JSON::Object::Ptr Answer{new Poco::JSON::Object}, Result{new Poco::JSON::Object}, Status{new Poco::JSON::Object};
Status->set("error", 1);
Status->set("text", "Command not supported");
Result->set("serial", Client->SerialNumber_);
Result->set("status", Status);
OWLSutils::MakeRPCHeader(Answer, Id, Result);
poco_information(Logger_,fmt::format("UNSUPPORTED({}): command {} not allowed for simulated devices.",
SerialNumber_, Method));
SendObject(Answer);
if(!SendObject(__func__, Answer)) {
OWLSClientEvents::Disconnect(__func__, ClientGuard, Client, Client->Runner_, "Command: unsupported failed", true);
}
} catch(const Poco::Exception &E) {
}
}
bool OWLSclient::Send(const std::string &Cmd) {
try {
uint32_t BytesSent = WS_->sendFrame(Cmd.c_str(), Cmd.size());
if (BytesSent == Cmd.size()) {
SimStats()->AddOutMsg(Runner_->Id(),Cmd.size());
return true;
} else {
DEBUG_LINE("fail to send");
Logger_.warning(
fmt::format("SEND({}): incomplete. Sent: {}", SerialNumber_, BytesSent));
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
Logger_.log(E);
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
bool OWLSclient::SendObject(const char *context, const Poco::JSON::Object::Ptr &Object) {
if(!Runner_->Running()) {
return false;
}
return false;
}
bool OWLSclient::SendWSPing() {
try {
WS_->sendFrame(
"", 0, Poco::Net::WebSocket::FRAME_OP_PING | Poco::Net::WebSocket::FRAME_FLAG_FIN);
return true;
} catch (const Poco::Exception &E) {
DEBUG_LINE("failed");
Logger_.log(E);
} catch (const std::exception &E) {
DEBUG_LINE("exception2");
}
return false;
}
bool OWLSclient::SendObject(const Poco::JSON::Object &O) {
auto os = std::make_unique<std::ostringstream>();
try {
std::ostringstream os;
O.stringify(os);
uint32_t BytesSent = WS_->sendFrame(os.str().c_str(), os.str().size());
if (BytesSent == os.str().size()) {
Object->stringify(*os);
uint32_t BytesSent = WS_->sendFrame(os->str().c_str(), os->str().size());
if (BytesSent == os->str().size()) {
SimStats()->AddOutMsg(Runner_->Id(),BytesSent);
return true;
} else {
DEBUG_LINE("failed");
Logger_.warning(
fmt::format("SEND({}): incomplete send. Sent: {}", SerialNumber_, BytesSent));
std::cout << fmt::format("SendObject({},{}): size={} sent={}", context, SerialNumber_, os->str().size(), BytesSent) << std::endl;
Logger_.warning(fmt::format("SendObject({},{}): size={} sent={}", context, SerialNumber_, os->str().size(), BytesSent));
}
} catch (const Poco::Exception &E) {
DEBUG_LINE("exception1");
std::cout << fmt::format("SendObject({},{}): size={} exception={}", context, SerialNumber_, os->str().size(), E.displayText()) << std::endl;
Logger_.log(E);
} catch (const std::exception &E) {
DEBUG_LINE("exception2");

View File

@@ -9,20 +9,21 @@
#include <random>
#include <tuple>
#include "Poco/AutoPtr.h"
#include "Poco/JSON/Object.h"
#include "Poco/Logger.h"
#include "Poco/Net/SocketNotification.h"
#include "Poco/Net/SocketReactor.h"
#include "Poco/Net/WebSocket.h"
#include "Poco/Thread.h"
#include <fmt/format.h>
#include <Poco/AutoPtr.h>
#include <Poco/JSON/Object.h>
#include <Poco/Logger.h>
#include <Poco/Net/SocketNotification.h>
#include <Poco/Net/SocketReactor.h>
#include <Poco/Net/WebSocket.h>
#include <Poco/Thread.h>
#include "framework/utils.h"
#include "OWLSdefinitions.h"
#include "OWLSdefinitions.h"
#include "MockElements.h"
#include "OWLSclientEvents.h"
#include <fmt/format.h>
namespace OpenWifi {
@@ -31,14 +32,14 @@ namespace OpenWifi {
class OWLSclient {
public:
OWLSclient(std::string SerialNumber,
Poco::Logger &Logger, SimulationRunner *runner);
Poco::Logger &Logger, SimulationRunner *runner, Poco::Net::SocketReactor &R);
~OWLSclient() {
poco_debug(Logger_,fmt::format("{} simulator client done.", SerialNumber_));
}
bool Send(const std::string &Cmd);
bool SendWSPing();
bool SendObject(const Poco::JSON::Object &O);
// bool Send(const std::string &Cmd);
// bool SendWSPing();
[[nodiscard]] bool SendObject(const char *context, const Poco::JSON::Object::Ptr &O);
void SetFirmware(const std::string &S = "sim-firmware-1") { Firmware_ = S; }
[[nodiscard]] const std::string &Serial() const { return SerialNumber_; }
@@ -48,24 +49,25 @@ namespace OpenWifi {
[[nodiscard]] bool Connected() const { return Connected_; }
[[nodiscard]] inline uint64_t GetStartTime() const { return StartTime_; }
static void DoConfigure(std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params);
static void DoReboot(std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params);
static void DoUpgrade(std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params);
static void DoFactory(std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params);
static void DoLEDs(std::shared_ptr<OWLSclient> Client, uint64_t Id, const Poco::JSON::Object::Ptr Params);
void UNsupportedCommand(std::shared_ptr<OWLSclient> Client, uint64_t Id, const std::string &Method);
static void DoConfigure(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params);
static void DoReboot(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params);
static void DoUpgrade(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params);
static void DoFactory(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params);
static void DoLEDs(const std::shared_ptr<OWLSclient> &Client, uint64_t Id, Poco::JSON::Object::Ptr Params);
void UnSupportedCommand(std::lock_guard<std::mutex> &G,const std::shared_ptr<OWLSclient> &Client, uint64_t Id, const std::string &Method);
using interface_location_t = std::tuple<ap_interface_types, std::string, radio_bands>;
using associations_map_t = std::map<interface_location_t, MockAssociations>;
void Disconnect();
void Disconnect(const char *context, std::lock_guard<std::mutex> &Guard);
void CreateAssociations(const interface_location_t &interface,const std::string &bssid, uint64_t min,
uint64_t max);
void CreateLanClients(uint64_t min, uint64_t max);
Poco::JSON::Object CreateStatePtr();
Poco::JSON::Object CreateLinkStatePtr();
Poco::JSON::Object::Ptr CreateStatePtr();
Poco::JSON::Object::Ptr CreateLinkStatePtr();
Poco::Logger &Logger() { return Logger_; };
@@ -90,21 +92,30 @@ namespace OpenWifi {
inline const auto & Load() { return Load_; }
void Update();
[[nodiscard ]] inline auto Backoff() {
if(Backoff_>300) {
Backoff_ = 15;
} else {
Backoff_ *=2;
}
return Backoff_;
}
friend class SimulationRunner;
friend void OWLSclientEvents::EstablishConnection(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::Reconnect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::Connect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::Log(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner, std::uint64_t Severity, const std::string & LogLine);
friend void OWLSclientEvents::State(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::HealthCheck(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::Update(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::WSPing(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::KeepAlive(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::Disconnect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner, const std::string &Reason, bool Reconnect);
friend void OWLSclientEvents::CrashLog(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSclientEvents::PendingConfig(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
friend void OWLSClientEvents::EstablishConnection(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend void OWLSClientEvents::Reconnect(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
// friend void OWLSClientEvents::Connect(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend bool OWLSClientEvents::Connect(std::lock_guard<std::mutex> & ClientGuard, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend void OWLSClientEvents::Log(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner, std::uint64_t Severity, const std::string & LogLine);
friend void OWLSClientEvents::State(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend void OWLSClientEvents::HealthCheck(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend void OWLSClientEvents::Update(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend void OWLSClientEvents::WSPing(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend void OWLSClientEvents::KeepAlive(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend void OWLSClientEvents::Disconnect(const char *context, std::lock_guard<std::mutex> &g, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner, const std::string &Reason, bool Reconnect);
friend void OWLSClientEvents::CrashLog(std::lock_guard<std::mutex> &g, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
friend void OWLSClientEvents::PendingConfig(std::lock_guard<std::mutex> &g, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
private:
// std::recursive_mutex Mutex_;
@@ -124,13 +135,16 @@ namespace OpenWifi {
std::string mac_lan;
std::uint64_t HealthInterval_ = 60;
std::uint64_t StatisticsInterval_ = 60;
uint64_t bssid_index = 1;
std::int64_t fd_=-1;
uint64_t bssid_index = 1;
std::int64_t fd_=-1;
MockMemory Memory_;
MockCPULoad Load_;
MockMemory Memory_;
MockCPULoad Load_;
SimulationRunner *Runner_ = nullptr;
std::uint16_t Backoff_=0;
SimulationRunner *Runner_ = nullptr;
Poco::Net::SocketReactor &Reactor_;
MockLanClients AllLanClients_;
associations_map_t AllAssociations_;

View File

@@ -11,17 +11,17 @@ namespace OpenWifi {
class SimulationRunner;
}
namespace OpenWifi::OWLSclientEvents {
void EstablishConnection(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void Reconnect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void Connect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void State(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void HealthCheck(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void Log(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner, std::uint64_t Severity, const std::string & LogLine);
void WSPing(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void Update(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void KeepAlive(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void Disconnect(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner, const std::string &Reason, bool Reconnect);
void CrashLog(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
void PendingConfig(std::shared_ptr<OWLSclient> Client, SimulationRunner *Runner);
namespace OpenWifi::OWLSClientEvents {
void EstablishConnection(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
void Reconnect(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
bool Connect(std::lock_guard<std::mutex> & ClientGuard, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
void State(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
void HealthCheck(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
void Log(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner, std::uint64_t Severity, const std::string & LogLine);
void WSPing(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
void Update(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
void KeepAlive(const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
void Disconnect(const char *context, std::lock_guard<std::mutex> &g, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner, const std::string &Reason, bool Reconnect);
void CrashLog(std::lock_guard<std::mutex> &g, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
void PendingConfig(std::lock_guard<std::mutex> &g, const std::shared_ptr<OWLSclient> &Client, SimulationRunner *Runner);
};

View File

@@ -1,202 +0,0 @@
//
// Created by stephane bourque on 2021-04-03.
//
#include <cstdlib>
#include "Poco/zlib.h"
#include "nlohmann/json.hpp"
#include "SimulationCoordinator.h"
#include "OWLSevent.h"
#include "framework/MicroServiceFuncs.h"
namespace OpenWifi {
bool OWLSConnectEvent::Send() {
try {
nlohmann::json M;
M["jsonrpc"] = "2.0";
M["method"] = "connect";
M["params"]["serial"] = Client_->Serial();
M["params"]["uuid"] = Client_->UUID();
M["params"]["firmware"] = Client_->Firmware();
auto TmpCapabilities = SimulationCoordinator()->GetSimCapabilities();
auto LabelMac = Utils::SerialNumberToInt(Client_->Serial());
auto LabelMacFormatted = Utils::SerialToMAC(Utils::IntToSerialNumber(LabelMac));
auto LabelLanMacFormatted = Utils::SerialToMAC(Utils::IntToSerialNumber(LabelMac + 1));
TmpCapabilities["label_macaddr"] = LabelMac;
TmpCapabilities["macaddr"]["wan"] = LabelMac;
TmpCapabilities["macaddr"]["lan"] = LabelLanMacFormatted;
M["params"]["capabilities"] = TmpCapabilities;
if (Client_->Send(to_string(M))) {
Client_->Reset();
Client_->AddEvent(ev_state,
SimulationCoordinator()->GetSimulationInfo().stateInterval);
Client_->AddEvent(ev_healthcheck,
SimulationCoordinator()->GetSimulationInfo().healthCheckInterval);
Client_->AddEvent(ev_log, MicroServiceRandom(120, 200));
Client_->AddEvent(ev_wsping, 60 * 5);
return true;
}
} catch (const Poco::Exception &E) {
Client_->Logger().log(E);
}
Client_->Disconnect("Error occurred during connection", true);
return false;
}
bool OWLSStateEvent::Send() {
try {
nlohmann::json M;
M["jsonrpc"] = "2.0";
M["method"] = "state";
nlohmann::json ParamsObj;
ParamsObj["serial"] = Client_->Serial();
ParamsObj["uuid"] = Client_->UUID();
ParamsObj["state"] = Client_->CreateState();
auto ParamsStr = to_string(ParamsObj);
unsigned long BufSize = ParamsStr.size() + 4000;
std::vector<Bytef> Buffer(BufSize);
compress(&Buffer[0], &BufSize, (Bytef *)ParamsStr.c_str(), ParamsStr.size());
auto CompressedBase64Encoded = OpenWifi::Utils::base64encode(&Buffer[0], BufSize);
M["params"]["compress_64"] = CompressedBase64Encoded;
M["params"]["compress_sz"] = ParamsStr.size();
if (Client_->Send(to_string(M))) {
Client_->AddEvent(ev_state, Client_->GetStateInterval());
return true;
}
} catch (const Poco::Exception &E) {
Client_->Logger().log(E);
}
Client_->Disconnect("Error sending stats event", true);
return false;
}
bool OWLSHealthCheckEvent::Send() {
try {
nlohmann::json M, P;
P["memory"] = 23;
M["jsonrpc"] = "2.0";
M["method"] = "healthcheck";
M["params"]["serial"] = Client_->Serial();
M["params"]["uuid"] = Client_->UUID();
M["params"]["sanity"] = 100;
M["params"]["data"] = P;
if (Client_->Send(to_string(M))) {
Client_->AddEvent(ev_healthcheck, Client_->GetHealthInterval());
return true;
}
} catch (const Poco::Exception &E) {
Client_->Logger().log(E);
}
Client_->Disconnect("Error while sending HealthCheck", true);
return false;
}
bool OWLSLogEvent::Send() {
try {
nlohmann::json M;
M["jsonrpc"] = "2.0";
M["method"] = "log";
M["params"]["serial"] = Client_->Serial();
M["params"]["uuid"] = Client_->UUID();
M["params"]["severity"] = Severity_;
M["params"]["log"] = LogLine_;
if (Client_->Send(to_string(M))) {
Client_->AddEvent(ev_log, MicroServiceRandom(300, 600));
return true;
}
} catch (const Poco::Exception &E) {
Client_->Logger().log(E);
}
Client_->Disconnect("Error while sending a Log event", true);
return false;
};
bool OWLSCrashLogEvent::Send() { return false; };
bool OWLSConfigChangePendingEvent::Send() {
try {
nlohmann::json M;
M["jsonrpc"] = "2.0";
M["method"] = "cfgpending";
M["params"]["serial"] = Client_->Serial();
M["params"]["uuid"] = Client_->UUID();
M["params"]["active"] = Client_->Active();
if (Client_->Send(to_string(M))) {
Client_->AddEvent(ev_configpendingchange,
SimulationCoordinator()->GetSimulationInfo().clientInterval);
return true;
}
} catch (const Poco::Exception &E) {
Client_->Logger().log(E);
}
Client_->Disconnect("Error while sending ConfigPendingEvent", true);
return false;
}
bool OWLSKeepAliveEvent::Send() {
try {
nlohmann::json M;
M["jsonrpc"] = "2.0";
M["method"] = "ping";
M["params"]["serial"] = Client_->Serial();
M["params"]["uuid"] = Client_->UUID();
if (Client_->Send(to_string(M))) {
Client_->AddEvent(ev_keepalive,
SimulationCoordinator()->GetSimulationInfo().keepAlive);
return true;
}
} catch (const Poco::Exception &E) {
Client_->Logger().log(E);
}
Client_->Disconnect("Error while sending keepalive", true);
return false;
};
// This is just a fake event, reboot is handled somewhere else.
bool OWLSRebootEvent::Send() { return true; }
// This is just a fake event, disconnect is handled somewhere else.
bool OWLSDisconnectEvent::Send() { return true; }
bool OWLSWSPingEvent::Send() {
try {
if (Client_->SendWSPing()) {
Client_->AddEvent(ev_wsping, 60 * 5);
return true;
}
} catch (const Poco::Exception &E) {
Client_->Logger().log(E);
}
Client_->Disconnect("Error in WSPing", true);
return false;
}
bool OWLSUpdate::Send() {
try {
Client_->Update();
} catch (const Poco::Exception &E) {
Client_->Logger().log(E);
}
return false;
}
} // namespace OpenWifi

View File

@@ -1,130 +0,0 @@
//
// Created by stephane bourque on 2021-04-03.
//
#ifndef UCENTRAL_CLNT_OWLSEVENT_H
#define UCENTRAL_CLNT_OWLSEVENT_H
#include "Poco/JSON/Object.h"
#include "OWLSclient.h"
#include "OWLSclient.h"
#include "OWLSdefinitions.h"
namespace OpenWifi {
class OWLSevent {
public:
explicit OWLSevent(std::shared_ptr<OWLSclient> Client)
: Client_(std::move(Client)) {}
virtual bool Send() = 0;
protected:
bool SendObject(Poco::JSON::Object &Obj);
std::shared_ptr<OWLSclient> Client_;
};
class OWLSConnectEvent : public OWLSevent {
public:
explicit OWLSConnectEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSStateEvent : public OWLSevent {
public:
explicit OWLSStateEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSHealthCheckEvent : public OWLSevent {
public:
explicit OWLSHealthCheckEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSLogEvent : public OWLSevent {
public:
explicit OWLSLogEvent(std::shared_ptr<OWLSclient> Client, std::string LogLine,
uint64_t Severity)
: OWLSevent(std::move(Client)), LogLine_(std::move(LogLine)), Severity_(Severity){};
bool Send() override;
private:
std::string LogLine_;
uint64_t Severity_;
};
class OWLSCrashLogEvent : public OWLSevent {
public:
explicit OWLSCrashLogEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSConfigChangePendingEvent : public OWLSevent {
public:
explicit OWLSConfigChangePendingEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSKeepAliveEvent : public OWLSevent {
public:
explicit OWLSKeepAliveEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSRebootEvent : public OWLSevent {
public:
explicit OWLSRebootEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSDisconnectEvent : public OWLSevent {
public:
explicit OWLSDisconnectEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSWSPingEvent : public OWLSevent {
public:
explicit OWLSWSPingEvent(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
class OWLSUpdate : public OWLSevent {
public:
explicit OWLSUpdate(std::shared_ptr<OWLSclient> Client)
: OWLSevent(std::move(Client)){};
bool Send() override;
private:
};
} // namespace OpenWifi
#endif // UCENTRAL_CLNT_OWLSEVENT_H

View File

@@ -9,65 +9,16 @@
#include "Poco/Net/HTTPCookie.h"
#include "Poco/Net/NameValueCollection.h"
#include "framework/MicroServiceFuncs.h"
#include <framework/default_device_types.h>
namespace OpenWifi {
static const std::vector<std::string> DefaultDeviceTypes{"actiontec_web7200",
"cig_wf188n",
"cig_wf194c",
"cig_wf194c4",
"cig_wf196",
"cig_wf610d",
"cig_wf808",
"cybertan_eww622-a1",
"edgecore_eap101",
"edgecore_eap102",
"edgecore_eap104",
"edgecore_ecs4100-12ph",
"edgecore_ecw5211",
"edgecore_ecw5410",
"edgecore_oap100",
"edgecore_spw2ac1200",
"edgecore_spw2ac1200-lan-poe",
"edgecore_ssw2ac2600",
"hfcl_ion4",
"hfcl_ion4x",
"hfcl_ion4x_2",
"hfcl_ion4xe",
"hfcl_ion4xi",
"indio_um-305ac",
"indio_um-305ax",
"indio_um-310ax-v1",
"indio_um-325ac",
"indio_um-510ac-v3",
"indio_um-510axm-v1",
"indio_um-510axp-v1",
"indio_um-550ac",
"linksys_e8450-ubi",
"linksys_ea6350-v4",
"linksys_ea8300",
"liteon_wpx8324",
"meshpp_s618_cp01",
"meshpp_s618_cp03",
"tp-link_ec420-g1",
"tplink_ex227",
"tplink_ex228",
"tplink_ex447",
"udaya_a5-id2",
"wallys_dr40x9",
"wallys_dr6018",
"wallys_dr6018_v4",
"x64_vm",
"yuncore_ax840",
"yuncore_fap640",
"yuncore_fap650"};
static bool GooDeviceType(const std::string &D) {
for (const auto &i : DefaultDeviceTypes) {
if (i == D)
return true;
}
return false;
for(const auto &[name,_]:DefaultDeviceTypeList) {
if(name==D) return true;
}
return false;
}
void RESTAPI_simulation_handler::DoGet() {

View File

@@ -13,6 +13,7 @@
#ifdef TIP_GATEWAY_SERVICE
#include "AP_WS_Server.h"
#include "CapabilitiesCache.h"
#include "RADIUSSessionTracker.h"
#endif
#include "RESTAPI_GWobjects.h"
@@ -29,6 +30,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj, "serialNumber", SerialNumber);
#ifdef TIP_GATEWAY_SERVICE
field_to_json(Obj, "deviceType", CapabilitiesCache::instance()->GetPlatform(Compatible));
field_to_json(Obj, "hasRADIUSSessions", RADIUSSessionTracker()->HasSessions(SerialNumber));
#endif
field_to_json(Obj, "macAddress", MACAddress);
field_to_json(Obj, "manufacturer", Manufacturer);
@@ -54,6 +56,9 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj, "pendingConfiguration", pendingConfiguration);
field_to_json(Obj, "pendingConfigurationCmd", pendingConfigurationCmd);
field_to_json(Obj, "restrictionDetails", restrictionDetails);
field_to_json(Obj, "pendingUUID", pendingUUID);
field_to_json(Obj, "simulated", simulated);
field_to_json(Obj, "lastRecordedContact", lastRecordedContact);
}
void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
@@ -63,7 +68,7 @@ namespace OpenWifi::GWObjects {
ConnectionState ConState;
if (AP_WS_Server()->GetState(SerialNumber, ConState)) {
ConState.to_json(Obj);
ConState.to_json(SerialNumber,Obj);
} else {
field_to_json(Obj, "ipAddress", "");
field_to_json(Obj, "txBytes", (uint64_t)0);
@@ -75,6 +80,13 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj, "associations_2G", (uint64_t)0);
field_to_json(Obj, "associations_5G", (uint64_t)0);
field_to_json(Obj, "associations_6G", (uint64_t)0);
field_to_json(Obj, "hasRADIUSSessions", false);
field_to_json(Obj, "hasGPS", ConState.hasGPS);
field_to_json(Obj, "sanity", ConState.sanity);
field_to_json(Obj, "memoryUsed", ConState.memoryUsed);
field_to_json(Obj, "sanity", ConState.sanity);
field_to_json(Obj, "load", ConState.load);
field_to_json(Obj, "temperature", ConState.temperature);
}
#endif
}
@@ -84,20 +96,32 @@ namespace OpenWifi::GWObjects {
field_from_json(Obj, "serialNumber", SerialNumber);
field_from_json(Obj, "deviceType", DeviceType);
field_from_json(Obj, "macAddress", MACAddress);
field_from_json(Obj, "manufacturer", Manufacturer);
field_from_json(Obj, "UUID", UUID);
field_from_json(Obj, "configuration", Configuration);
field_from_json(Obj, "notes", Notes);
field_from_json(Obj, "manufacturer", Manufacturer);
field_from_json(Obj, "createdTimestamp", CreationTimestamp);
field_from_json(Obj, "lastConfigurationChange", LastConfigurationChange);
field_from_json(Obj, "lastConfigurationDownload", LastConfigurationDownload);
field_from_json(Obj, "lastFWUpdate", LastFWUpdate);
field_from_json(Obj, "owner", Owner);
field_from_json(Obj, "location", Location);
field_from_json(Obj, "venue", Venue);
field_from_json(Obj, "firmware", Firmware);
field_from_json(Obj, "compatible", Compatible);
field_from_json(Obj, "fwUpdatePolicy", FWUpdatePolicy);
field_from_json(Obj, "devicePassword", DevicePassword);
field_from_json(Obj, "subscriber", subscriber);
field_from_json(Obj, "entity", entity);
field_from_json(Obj, "modified", modified);
field_from_json(Obj, "locale", locale);
field_from_json(Obj, "restrictedDevice", restrictedDevice);
field_from_json(Obj, "pendingConfiguration", pendingConfiguration);
field_from_json(Obj, "pendingConfigurationCmd", pendingConfigurationCmd);
field_from_json(Obj, "restrictionDetails", restrictionDetails);
field_from_json(Obj, "pendingUUID", pendingUUID);
field_from_json(Obj, "simulated", simulated);
field_from_json(Obj, "lastRecordedContact", lastRecordedContact);
return true;
} catch (const Poco::Exception &E) {
}
@@ -147,6 +171,31 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj, "lastModified", LastModified);
}
void DefaultFirmware::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "deviceType", deviceType);
field_to_json(Obj, "description", Description);
field_to_json(Obj, "uri", uri);
field_to_json(Obj, "revision", revision);
field_to_json(Obj, "imageCreationDate", imageCreationDate);
field_to_json(Obj, "created", Created);
field_to_json(Obj, "lastModified", LastModified);
}
bool DefaultFirmware::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "deviceType", deviceType);
field_from_json(Obj, "description", Description);
field_from_json(Obj, "uri", uri);
field_from_json(Obj, "revision", revision);
field_from_json(Obj, "imageCreationDate", imageCreationDate);
field_from_json(Obj, "created", Created);
field_from_json(Obj, "lastModified", LastModified);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void CommandDetails::to_json(Poco::JSON::Object &Obj) const {
EmbedDocument("details", Obj, Details);
EmbedDocument("results", Obj, Results);
@@ -165,6 +214,8 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj, "waitingForFile", WaitingForFile);
field_to_json(Obj, "attachFile", AttachDate);
field_to_json(Obj, "executionTime", executionTime);
field_to_json(Obj, "lastTry", lastTry);
field_to_json(Obj, "deferred", deferred);
}
bool DefaultConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -198,7 +249,7 @@ namespace OpenWifi::GWObjects {
return false;
}
void ConnectionState::to_json(Poco::JSON::Object &Obj) const {
void ConnectionState::to_json([[maybe_unused]] const std::string &SerialNumber, Poco::JSON::Object &Obj) {
field_to_json(Obj, "ipAddress", Address);
field_to_json(Obj, "txBytes", TX);
field_to_json(Obj, "rxBytes", RX);
@@ -220,6 +271,22 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
field_to_json(Obj, "totalConnectionTime", Utils::Now() - started);
field_to_json(Obj, "certificateExpiryDate", certificateExpiryDate);
field_to_json(Obj, "connectReason", connectReason);
#ifdef TIP_GATEWAY_SERVICE
hasRADIUSSessions = RADIUSSessionTracker()->HasSessions(SerialNumber);
AP_WS_Server()->ExtendedAttributes(SerialNumber, hasGPS, sanity,
memoryUsed,
load,
temperature);
#endif
field_to_json(Obj, "hasRADIUSSessions", hasRADIUSSessions );
field_to_json(Obj, "hasGPS", hasGPS);
field_to_json(Obj, "sanity", sanity);
field_to_json(Obj, "memoryUsed", memoryUsed);
field_to_json(Obj, "sanity", sanity);
field_to_json(Obj, "load", load);
field_to_json(Obj, "temperature", temperature);
switch (VerifiedCertificate) {
case NO_CERTIFICATE:
@@ -234,6 +301,9 @@ namespace OpenWifi::GWObjects {
case VERIFIED:
field_to_json(Obj, "verifiedCertificate", "VERIFIED");
break;
case SIMULATED:
field_to_json(Obj, "verifiedCertificate", "SIMULATED");
break;
default:
field_to_json(Obj, "verifiedCertificate", "NO_CERTIFICATE");
break;
@@ -360,6 +430,10 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj, "acctConfig", acctConfig);
field_to_json(Obj, "coaConfig", coaConfig);
field_to_json(Obj, "useByDefault", useByDefault);
field_to_json(Obj, "radsecKeepAlive", radsecKeepAlive);
field_to_json(Obj, "poolProxyIp", poolProxyIp);
field_to_json(Obj, "radsecPoolType", radsecPoolType);
field_to_json(Obj, "enabled", enabled);
}
bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -370,6 +444,10 @@ namespace OpenWifi::GWObjects {
field_from_json(Obj, "acctConfig", acctConfig);
field_from_json(Obj, "coaConfig", coaConfig);
field_from_json(Obj, "useByDefault", useByDefault);
field_from_json(Obj, "radsecKeepAlive", radsecKeepAlive);
field_from_json(Obj, "poolProxyIp", poolProxyIp);
field_from_json(Obj, "radsecPoolType", radsecPoolType);
field_from_json(Obj, "enabled", enabled);
return true;
} catch (const Poco::Exception &E) {
}
@@ -490,6 +568,29 @@ namespace OpenWifi::GWObjects {
return false;
}
void RangeOptions::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "NO_IR", NO_IR);
field_to_json(Obj, "AUTO_BW", AUTO_BW);
field_to_json(Obj, "DFS", DFS);
field_to_json(Obj, "NO_OUTDOOR", NO_OUTDOOR);
field_to_json(Obj, "wmmrule_ETSI", wmmrule_ETSI);
field_to_json(Obj, "NO_OFDM", NO_OFDM);
}
void FrequencyRange::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "from", from);
field_to_json(Obj, "to", to);
field_to_json(Obj, "channelWidth", channelWidth);
field_to_json(Obj, "powerDb", powerDb);
field_to_json(Obj, "options", options);
}
void RegulatoryCountryInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "country", country);
field_to_json(Obj, "domain", domain);
field_to_json(Obj, "ranges", ranges);
}
void DeviceRestrictionsKeyInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "vendor", vendor);
field_to_json(Obj, "algo", algo);
@@ -544,4 +645,74 @@ namespace OpenWifi::GWObjects {
(T.commands != commands) || (T.developer != developer) || (T.ssh != ssh) ||
(T.key_info != key_info) || (T.country != country));
}
void RADIUSSession::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "started", started);
field_to_json(Obj, "lastTransaction", lastTransaction);
field_to_json(Obj, "destination", destination);
field_to_json(Obj, "serialNumber", serialNumber);
field_to_json(Obj, "userName", userName);
field_to_json(Obj, "accountingSessionId", accountingSessionId);
field_to_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
field_to_json(Obj, "inputPackets", inputPackets);
field_to_json(Obj, "outputPackets", outputPackets);
field_to_json(Obj, "inputOctets", inputOctets);
field_to_json(Obj, "outputOctets", outputOctets);
field_to_json(Obj, "inputGigaWords", inputGigaWords);
field_to_json(Obj, "outputGigaWords", outputGigaWords);
field_to_json(Obj, "sessionTime", sessionTime);
field_to_json(Obj, "callingStationId", callingStationId);
field_to_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
field_to_json(Obj, "interface", interface);
field_to_json(Obj, "secret", secret);
field_to_json(Obj, "nasId", nasId);
field_to_json(Obj, "calledStationId", calledStationId);
}
void RADIUSSessionList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "sessions", sessions);
}
void RadiusCoADMParameters::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "accountingSessionId", accountingSessionId);
field_to_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
field_to_json(Obj, "callingStationId", callingStationId);
field_to_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
field_to_json(Obj, "userName", userName);
}
bool RadiusCoADMParameters::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "accountingSessionId", accountingSessionId);
field_from_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
field_from_json(Obj, "callingStationId", callingStationId);
field_from_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
field_from_json(Obj, "userName", userName);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
bool DeviceTransferRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "serialNumber", serialNumber);
field_from_json(Obj, "server", server);
field_from_json(Obj, "port", port);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
bool DeviceCertificateUpdateRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "serialNumber", serialNumber);
field_from_json(Obj, "encodedCertificate", encodedCertificate);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
} // namespace OpenWifi::GWObjects

View File

@@ -11,9 +11,13 @@
#include "Poco/JSON/Object.h"
#include "RESTAPI_SecurityObjects.h"
#ifdef TIP_GATEWAY_SERVICE
#include <RADIUS_helpers.h>
#endif
namespace OpenWifi::GWObjects {
enum CertificateValidation { NO_CERTIFICATE, VALID_CERTIFICATE, MISMATCH_SERIAL, VERIFIED };
enum CertificateValidation { NO_CERTIFICATE, VALID_CERTIFICATE, MISMATCH_SERIAL, VERIFIED, SIMULATED };
struct ConnectionState {
uint64_t MessageCount = 0;
@@ -38,8 +42,15 @@ namespace OpenWifi::GWObjects {
uint64_t sessionId = 0;
double connectionCompletionTime = 0.0;
std::uint64_t certificateExpiryDate = 0;
std::uint64_t hasRADIUSSessions = 0;
bool hasGPS = false;
std::uint64_t sanity=0;
std::double_t memoryUsed=0.0;
std::double_t load=0.0;
std::double_t temperature=0.0;
std::string connectReason;
void to_json(Poco::JSON::Object &Obj) const;
void to_json(const std::string &SerialNumber, Poco::JSON::Object &Obj) ;
};
struct DeviceRestrictionsKeyInfo {
@@ -96,6 +107,9 @@ namespace OpenWifi::GWObjects {
std::string pendingConfiguration;
std::string pendingConfigurationCmd;
DeviceRestrictions restrictionDetails;
std::uint64_t pendingUUID = 0;
bool simulated=false;
std::uint64_t lastRecordedContact=0;
void to_json(Poco::JSON::Object &Obj) const;
void to_json_with_status(Poco::JSON::Object &Obj) const;
@@ -168,6 +182,26 @@ namespace OpenWifi::GWObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DefaultFirmware {
std::string deviceType;
std::string Description;
std::string uri;
std::string revision;
uint64_t imageCreationDate;
uint64_t Created;
uint64_t LastModified;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DefaultFirmwareList {
std::vector<DefaultFirmware> firmwares;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct CommandDetails {
std::string UUID;
std::string SerialNumber;
@@ -188,7 +222,11 @@ namespace OpenWifi::GWObjects {
uint64_t AttachSize = 0;
std::string AttachType;
double executionTime = 0.0;
std::uint64_t lastTry = 0;
bool deferred = false;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct BlackListedDevice {
@@ -322,6 +360,10 @@ namespace OpenWifi::GWObjects {
RadiusProxyServerConfig acctConfig;
RadiusProxyServerConfig coaConfig;
bool useByDefault = false;
std::string radsecPoolType;
std::string poolProxyIp;
std::uint64_t radsecKeepAlive=25;
bool enabled=true;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -334,4 +376,139 @@ namespace OpenWifi::GWObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct RangeOptions {
bool NO_IR=false;
bool AUTO_BW=false;
bool DFS=false;
bool NO_OUTDOOR=false;
bool wmmrule_ETSI=false;
bool NO_OFDM=false;
void to_json(Poco::JSON::Object &Obj) const;
};
struct FrequencyRange {
float from = 0.0;
float to = 0.0;
int channelWidth = 0;
int powerDb = 0;
RangeOptions options;
void to_json(Poco::JSON::Object &Obj) const;
};
struct RegulatoryCountryInfo {
std::string country;
std::string domain;
std::vector<FrequencyRange> ranges;
void to_json(Poco::JSON::Object &Obj) const;
};
using RegulatoryInfoCountryMap = std::map<std::string,RegulatoryCountryInfo>;
struct RADIUSSession {
std::uint64_t started=0,
lastTransaction=0;
std::string serialNumber,
destination,
userName,
accountingSessionId,
accountingMultiSessionId,
callingStationId,
chargeableUserIdentity,
secret,
interface,
nasId;
std::uint64_t inputPackets = 0,
outputPackets = 0,
inputOctets = 0,
outputOctets = 0,
inputGigaWords = 0,
outputGigaWords = 0;
std::uint32_t sessionTime = 0;
std::string calledStationId;
#ifdef TIP_GATEWAY_SERVICE
RADIUS::RadiusPacket accountingPacket;
#endif
void to_json(Poco::JSON::Object &Obj) const;
};
struct RADIUSSessionList {
std::vector<RADIUSSession> sessions;
void to_json(Poco::JSON::Object &Obj) const;
};
struct RadiusCoADMParameters {
std::string accountingSessionId,
accountingMultiSessionId,
callingStationId,
chargeableUserIdentity,
userName;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
void to_json(Poco::JSON::Object &Obj) const;
};
enum class RadiusPoolStrategy {
round_robin, random, weighted, unknown
};
enum class RadiusEndpointType {
generic, radsec, globalreach, orion, unknown
};
static inline RadiusEndpointType RadiusEndpointType(const std::string &T) {
if(T=="generic") return RadiusEndpointType::generic;
if(T=="radsec") return RadiusEndpointType::radsec;
if(T=="globalreach") return RadiusEndpointType::globalreach;
if(T=="orion") return RadiusEndpointType::orion;
return RadiusEndpointType::unknown;
}
static inline RadiusPoolStrategy RadiusPoolStrategy(const std::string &T) {
if(T=="round_robin") return RadiusPoolStrategy::round_robin;
if(T=="random") return RadiusPoolStrategy::random;
if(T=="weighted") return RadiusPoolStrategy::weighted;
return RadiusPoolStrategy::unknown;
}
static inline std::string to_string(enum RadiusEndpointType T) {
switch(T) {
case RadiusEndpointType::generic: return "generic";
case RadiusEndpointType::radsec: return "radsec";
case RadiusEndpointType::globalreach: return "globalreach";
case RadiusEndpointType::orion: return "orion";
default:
return "unknown";
}
}
static inline std::string to_string(enum RadiusPoolStrategy T) {
switch(T) {
case RadiusPoolStrategy::round_robin: return "round_robin";
case RadiusPoolStrategy::random: return "random";
case RadiusPoolStrategy::weighted: return "weighted";
default:
return "unknown";
}
}
struct DeviceTransferRequest {
std::string serialNumber;
std::string server;
std::uint64_t port;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DeviceCertificateUpdateRequest {
std::string serialNumber;
std::string encodedCertificate;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
} // namespace OpenWifi::GWObjects

View File

@@ -78,22 +78,22 @@ namespace OpenWifi::OWLSObjects {
return false;
}
void SimulationStatus::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "id", id);
field_to_json(Obj, "simulationId", simulationId);
field_to_json(Obj, "state", state);
field_to_json(Obj, "tx", tx);
field_to_json(Obj, "rx", rx);
field_to_json(Obj, "msgsTx", msgsTx);
field_to_json(Obj, "msgsRx", msgsRx);
field_to_json(Obj, "liveDevices", liveDevices);
field_to_json(Obj, "timeToFullDevices", timeToFullDevices);
field_to_json(Obj, "startTime", startTime);
field_to_json(Obj, "endTime", endTime);
field_to_json(Obj, "errorDevices", errorDevices);
field_to_json(Obj, "owner", owner);
void SimulationStatus::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "id", id);
field_to_json(Obj, "simulationId", simulationId);
field_to_json(Obj, "state", state);
field_to_json(Obj, "tx", tx);
field_to_json(Obj, "rx", rx);
field_to_json(Obj, "msgsTx", msgsTx);
field_to_json(Obj, "msgsRx", msgsRx);
field_to_json(Obj, "liveDevices", liveDevices);
field_to_json(Obj, "timeToFullDevices", timeToFullDevices);
field_to_json(Obj, "startTime", startTime);
field_to_json(Obj, "endTime", endTime);
field_to_json(Obj, "errorDevices", errorDevices);
field_to_json(Obj, "owner", owner);
field_to_json(Obj, "expectedDevices", expectedDevices);
}
}
void Dashboard::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {}

View File

@@ -18,13 +18,13 @@ namespace OpenWifi::OWLSObjects {
std::string key;
std::string macPrefix;
std::string deviceType;
uint64_t devices = 10;
uint64_t devices = 5;
uint64_t healthCheckInterval = 60;
uint64_t stateInterval = 60;
uint64_t minAssociations = 2;
uint64_t maxAssociations = 8;
uint64_t minClients = 2;
uint64_t maxClients = 4;
uint64_t minAssociations = 1;
uint64_t maxAssociations = 3;
uint64_t minClients = 1;
uint64_t maxClients = 3;
uint64_t simulationLength = 60 * 60;
uint64_t threads = 16;
uint64_t clientInterval = 1;
@@ -43,24 +43,24 @@ namespace OpenWifi::OWLSObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct SimulationStatus {
std::string id;
std::string simulationId;
std::string state;
uint64_t tx;
uint64_t rx;
uint64_t msgsTx;
uint64_t msgsRx;
uint64_t liveDevices;
uint64_t timeToFullDevices;
uint64_t startTime;
uint64_t endTime;
uint64_t errorDevices;
std::string owner;
struct SimulationStatus {
std::string id;
std::string simulationId;
std::string state;
uint64_t tx;
uint64_t rx;
uint64_t msgsTx;
uint64_t msgsRx;
uint64_t liveDevices;
uint64_t timeToFullDevices;
uint64_t startTime;
uint64_t endTime;
uint64_t errorDevices;
std::string owner;
uint64_t expectedDevices;
void to_json(Poco::JSON::Object &Obj) const;
};
void to_json(Poco::JSON::Object &Obj) const;
};
struct Dashboard {
int O;

View File

@@ -1194,4 +1194,243 @@ namespace OpenWifi::ProvObjects {
return false;
}
void GLBLRAccountInfo::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json(Obj, "privateKey", privateKey);
field_to_json(Obj, "country", country);
field_to_json(Obj, "province", province);
field_to_json(Obj, "city", city);
field_to_json(Obj, "organization", organization);
field_to_json(Obj, "commonName", commonName);
field_to_json(Obj, "CSR", CSR);
field_to_json(Obj, "CSRPrivateKey", CSRPrivateKey);
field_to_json(Obj, "CSRPublicKey", CSRPublicKey);
field_to_json(Obj, "GlobalReachAcctId", GlobalReachAcctId);
}
bool GLBLRAccountInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json(Obj, "privateKey", privateKey);
field_from_json(Obj, "country", country);
field_from_json(Obj, "province", province);
field_from_json(Obj, "city", city);
field_from_json(Obj, "organization", organization);
field_from_json(Obj, "commonName", commonName);
field_from_json(Obj, "CSR", CSR);
field_from_json(Obj, "CSRPrivateKey", CSRPrivateKey);
field_from_json(Obj, "CSRPublicKey", CSRPublicKey);
field_from_json(Obj, "GlobalReachAcctId", GlobalReachAcctId);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void GLBLRCertificateInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "id", id);
field_to_json(Obj, "name", name);
field_to_json(Obj, "accountId", accountId);
field_to_json(Obj, "csr", csr);
field_to_json(Obj, "certificate", certificate);
field_to_json(Obj, "certificateChain", certificateChain);
field_to_json(Obj, "certificateId", certificateId);
field_to_json(Obj, "expiresAt", expiresAt);
field_to_json(Obj, "created", created);
}
bool GLBLRCertificateInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "id", id);
field_from_json(Obj, "name", name);
field_from_json(Obj, "accountId", accountId);
field_from_json(Obj, "csr", csr);
field_from_json(Obj, "certificate", certificate);
field_from_json(Obj, "certificateChain", certificateChain);
field_from_json(Obj, "certificateId", certificateId);
field_from_json(Obj, "expiresAt", expiresAt);
field_from_json(Obj, "created", created);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void GooglOrionAccountInfo::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json(Obj, "privateKey", privateKey);
field_to_json(Obj, "certificate", certificate);
field_to_json(Obj, "cacerts", cacerts);
}
bool GooglOrionAccountInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json(Obj, "privateKey", privateKey);
field_from_json(Obj, "certificate", certificate);
field_from_json(Obj, "cacerts", cacerts);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RADIUSServer::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "Hostname", Hostname);
field_to_json(Obj, "IP", IP);
field_to_json(Obj, "Port", Port);
field_to_json(Obj, "Secret", Secret);
}
bool RADIUSServer::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "Hostname", Hostname);
field_from_json(Obj, "IP", IP);
field_from_json(Obj, "Port", Port);
field_from_json(Obj, "Secret", Secret);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RADIUSEndPointRadiusType::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "Authentication", Authentication);
field_to_json(Obj, "Accounting", Accounting);
field_to_json(Obj, "CoA", CoA);
field_to_json(Obj, "AccountingInterval", AccountingInterval);
}
bool RADIUSEndPointRadiusType::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "Authentication", Authentication);
field_from_json(Obj, "Accounting", Accounting);
field_from_json(Obj, "CoA", CoA);
field_from_json(Obj, "AccountingInterval", AccountingInterval);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RADIUSEndPointRadsecType::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "Hostname", Hostname);
field_to_json(Obj, "IP", IP);
field_to_json(Obj, "Port", Port);
field_to_json(Obj, "Secret", Secret);
field_to_json(Obj, "OpenRoamingType", OpenRoamingType);
field_to_json(Obj, "UseOpenRoamingAccount", UseOpenRoamingAccount);
field_to_json(Obj, "Weight", Weight);
field_to_json(Obj, "Certificate", Certificate);
field_to_json(Obj, "PrivateKey", PrivateKey);
field_to_json(Obj, "CaCerts", CaCerts);
field_to_json(Obj, "AllowSelfSigned", AllowSelfSigned);
}
bool RADIUSEndPointRadsecType::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "Hostname", Hostname);
field_from_json(Obj, "IP", IP);
field_from_json(Obj, "Port", Port);
field_from_json(Obj, "Secret", Secret);
field_from_json(Obj, "OpenRoamingType", OpenRoamingType);
field_from_json(Obj, "UseOpenRoamingAccount", UseOpenRoamingAccount);
field_from_json(Obj, "Weight", Weight);
field_from_json(Obj, "Certificate", Certificate);
field_from_json(Obj, "PrivateKey", PrivateKey);
field_from_json(Obj, "CaCerts", CaCerts);
field_from_json(Obj, "AllowSelfSigned", AllowSelfSigned);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RADIUSEndPoint::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json(Obj, "Type", Type);
field_to_json(Obj, "RadsecServers", RadsecServers);
field_to_json(Obj, "RadiusServers", RadiusServers);
field_to_json(Obj, "PoolStrategy", PoolStrategy);
field_to_json(Obj, "Index", Index);
field_to_json(Obj, "UsedBy", UsedBy);
field_to_json(Obj, "UseGWProxy", UseGWProxy);
field_to_json(Obj, "NasIdentifier", NasIdentifier);
field_to_json(Obj, "AccountingInterval", AccountingInterval);
}
bool RADIUSEndPoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json(Obj, "Type", Type);
field_from_json(Obj, "RadsecServers", RadsecServers);
field_from_json(Obj, "RadiusServers", RadiusServers);
field_from_json(Obj, "PoolStrategy", PoolStrategy);
field_from_json(Obj, "Index", Index);
field_from_json(Obj, "UsedBy", UsedBy);
field_from_json(Obj, "UseGWProxy", UseGWProxy);
field_from_json(Obj, "NasIdentifier", NasIdentifier);
field_from_json(Obj, "AccountingInterval", AccountingInterval);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RADIUSEndpointUpdateStatus::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "lastUpdate", lastUpdate);
field_to_json(Obj, "lastConfigurationChange", lastConfigurationChange);
}
bool RADIUSEndpointUpdateStatus::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "lastUpdate", lastUpdate);
field_from_json(Obj, "lastConfigurationChange", lastConfigurationChange);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
bool RADIUSEndpointUpdateStatus::Read() {
Poco::File F(OpenWifi::MicroServiceDataDirectory()+"/RADIUSEndpointUpdateStatus.json");
try {
if (F.exists()) {
Poco::JSON::Parser P;
std::ifstream ifs(F.path(), std::ios_base::in | std::ios_base::binary);
auto Obj = P.parse(ifs);
return from_json(Obj.extract<Poco::JSON::Object::Ptr>());
}
} catch (...) {
}
return false;
}
bool RADIUSEndpointUpdateStatus::Save() {
Poco::File F(OpenWifi::MicroServiceDataDirectory()+"/RADIUSEndpointUpdateStatus.json");
try {
Poco::JSON::Object Obj;
to_json(Obj);
std::ofstream O(F.path(), std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
Poco::JSON::Stringifier::stringify(Obj, O);
return true;
} catch (...) {
}
return false;
}
bool RADIUSEndpointUpdateStatus::ChangeConfiguration() {
Read();
lastConfigurationChange = Utils::Now();
return Save();
}
} // namespace OpenWifi::ProvObjects

File diff suppressed because it is too large Load Diff

View File

@@ -721,4 +721,20 @@ namespace OpenWifi::SecurityObjects {
return false;
}
void ExtraSystemConfiguration::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "parameterName", parameterName);
field_to_json(Obj, "parameterValue", parameterValue);
}
bool ExtraSystemConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "parameterName", parameterName);
field_from_json(Obj, "parameterValue", parameterValue);
return true;
} catch (...) {
std::cout << "Cannot parse: Token" << std::endl;
}
return false;
}
} // namespace OpenWifi::SecurityObjects

View File

@@ -367,5 +367,13 @@ namespace OpenWifi {
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
} // namespace SecurityObjects
struct ExtraSystemConfiguration {
std::string parameterName;
std::string parameterValue;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
} // namespace SecurityObjects
} // namespace OpenWifi

View File

@@ -4,9 +4,8 @@
#pragma once
#include "framework/SubSystemServer.h"
#include "framework/utils.h"
#include <framework/SubSystemServer.h>
#include <framework/utils.h>
#include <RESTObjects/RESTAPI_OWLSobjects.h>
#include <RESTObjects/RESTAPI_SecurityObjects.h>

View File

@@ -2,15 +2,16 @@
// Created by stephane bourque on 2021-11-03.
//
#include <fmt/format.h>
#include <Poco/JSON/Parser.h>
#include <framework/MicroServiceFuncs.h>
#include <framework/utils.h>
#include "SimulationCoordinator.h"
#include "SimStats.h"
#include "StorageService.h"
#include "fmt/format.h"
#include "framework/MicroServiceFuncs.h"
#include "framework/utils.h"
#include <Poco/JSON/Parser.h>
namespace OpenWifi {

View File

@@ -7,11 +7,12 @@
#include <chrono>
#include <random>
#include "RESTObjects/RESTAPI_OWLSobjects.h"
#include "SimulationRunner.h"
#include "framework/SubSystemServer.h"
#include <framework/SubSystemServer.h>
#include <RESTObjects/RESTAPI_OWLSobjects.h>
#include <RESTObjects/RESTAPI_SecurityObjects.h>
#include "SimulationRunner.h"
namespace OpenWifi {
struct SimulationRecord {

View File

@@ -5,20 +5,18 @@
#include <thread>
#include <chrono>
#include "Poco/Logger.h"
#include "SimStats.h"
#include "SimulationRunner.h"
#include "OWLSevent.h"
#include "fmt/format.h"
#include "UI_Owls_WebSocketNotifications.h"
#include <fmt/format.h>
#include <Poco/Logger.h>
#include <Poco/Net/NetException.h>
#include <Poco/Net/SSLException.h>
#include <Poco/NObserver.h>
#include "SimStats.h"
#include "SimulationRunner.h"
#include "UI_Owls_WebSocketNotifications.h"
namespace OpenWifi {
void SimulationRunner::Start() {
std::random_device rd;
@@ -28,38 +26,77 @@ namespace OpenWifi {
Running_ = true;
std::lock_guard Lock(Mutex_);
SocketReactorThread_.start(Reactor_);
NumberOfReactors_ = Poco::Environment::processorCount() * 2;
for(std::uint64_t i=0;i<NumberOfReactors_;i++) {
auto NewReactor = std::make_unique<Poco::Net::SocketReactor>();
auto NewReactorThread = std::make_unique<Poco::Thread>();
NewReactorThread->start(*NewReactor);
SocketReactorPool_.push_back(std::move(NewReactor));
SocketReactorThreadPool_.push_back(std::move(NewReactorThread));
}
std::uint64_t ReactorIndex=0;
for (uint64_t i = 0; i < Details_.devices; i++) {
char Buffer[32];
snprintf(Buffer, sizeof(Buffer), "%s%05x0", Details_.macPrefix.c_str(), (unsigned int)i);
auto Client = std::make_shared<OWLSclient>(Buffer, Logger_, this);
auto Client = std::make_shared<OWLSclient>(Buffer, Logger_, this, *SocketReactorPool_[ReactorIndex++ % NumberOfReactors_]);
Client->SerialNumber_ = Buffer;
Client->Valid_ = true;
Scheduler_.in(std::chrono::seconds(distrib(gen)), OWLSclientEvents::EstablishConnection, Client, this);
Scheduler_.in(std::chrono::seconds(distrib(gen)), OWLSClientEvents::EstablishConnection, Client, this);
Clients_[Buffer] = Client;
}
Scheduler_.in(std::chrono::seconds(10), ProgressUpdate, this);
UpdateTimerCallback_ = std::make_unique<Poco::TimerCallback<SimulationRunner>>(
*this, &SimulationRunner::onUpdateTimer);
UpdateTimer_.setStartInterval(10000);
UpdateTimer_.setPeriodicInterval(2 * 1000);
UpdateTimer_.start(*UpdateTimerCallback_, MicroServiceTimerPool());
}
void SimulationRunner::onUpdateTimer([[maybe_unused]] Poco::Timer &timer) {
if(Running_) {
OWLSNotifications::SimulationUpdate_t Notification;
SimStats()->GetCurrent(Id_, Notification.content, UInfo_);
OWLSNotifications::SimulationUpdate(Notification);
++StatsUpdates_;
if((StatsUpdates_ % 15) == 0) {
std::lock_guard Lock(Mutex_);
for(auto &client:Clients_) {
if(!Running_) {
return;
}
if(client.second->Mutex_.try_lock()) {
if (client.second->Connected_) {
client.second->Update();
}
client.second->Mutex_.unlock();
}
}
}
}
}
void SimulationRunner::ProgressUpdate(SimulationRunner *sim) {
if(sim->Running_) {
OWLSNotifications::SimulationUpdate_t Notification;
SimStats()->GetCurrent(sim->Id_, Notification.content, sim->UInfo_);
OWLSNotifications::SimulationUpdate(Notification);
sim->Scheduler_.in(std::chrono::seconds(10), ProgressUpdate, sim);
// sim->Scheduler_.in(std::chrono::seconds(10), ProgressUpdate, sim);
}
}
void SimulationRunner::Stop() {
if (Running_) {
Running_ = false;
for(auto &client:Clients_) {
OWLSclientEvents::Disconnect(client.second, this, "Simulation shutting down", false);
client.second->Valid_ = false;
}
Reactor_.stop();
SocketReactorThread_.join();
UpdateTimer_.stop();
std::lock_guard Guard(Mutex_);
std::for_each(SocketReactorPool_.begin(),SocketReactorPool_.end(),[](auto &reactor) { reactor->stop(); });
std::for_each(SocketReactorThreadPool_.begin(),SocketReactorThreadPool_.end(),[](auto &t){ t->join(); });
SocketReactorThreadPool_.clear();
SocketReactorPool_.clear();
Clients_.clear();
}
}
@@ -67,59 +104,61 @@ namespace OpenWifi {
void SimulationRunner::OnSocketError(const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
std::lock_guard G(Mutex_);
std::cout << "SimulationRunner::OnSocketError" << std::endl;
auto socket = pNf->socket().impl()->sockfd();
std::map<std::int64_t, std::shared_ptr<OWLSclient>>::iterator client_hint;
std::shared_ptr<OWLSclient> client;
client_hint = Clients_fd_.find(socket);
if (client_hint == end(Clients_fd_)) {
poco_warning(Logger_, fmt::format("{}: Invalid socket", socket));
return;
{
std::lock_guard GG(SocketFdMutex_);
client_hint = Clients_fd_.find(socket);
if (client_hint == end(Clients_fd_)) {
pNf->socket().impl()->close();
poco_warning(Logger_, fmt::format("{}: Invalid socket", socket));
return;
}
client = client_hint->second;
}
{
std::lock_guard Guard(client->Mutex_);
client->Disconnect(__func__, Guard);
}
if (Running_) {
OWLSClientEvents::Reconnect(client, this);
}
client = client_hint->second;
client->Disconnect();
Reactor_.removeEventHandler(
*client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ReadableNotification>(
*this, &SimulationRunner::OnSocketReadable));
Reactor_.removeEventHandler(
*client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ErrorNotification>(
*this, &SimulationRunner::OnSocketError));
Reactor_.removeEventHandler(
*client->WS_, Poco::NObserver<SimulationRunner, Poco::Net::ShutdownNotification>(
*this, &SimulationRunner::OnSocketShutdown));
client->fd_ = -1;
if(Running_)
OWLSclientEvents::Reconnect(client,this);
}
void SimulationRunner::OnSocketShutdown(const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
std::lock_guard G(Mutex_);
auto socket = pNf->socket().impl()->sockfd();
std::map<std::int64_t, std::shared_ptr<OWLSclient>>::iterator client_hint;
std::shared_ptr<OWLSclient> client;
client_hint = Clients_fd_.find(socket);
if (client_hint == end(Clients_fd_)) {
poco_warning(Logger_, fmt::format("{}: Invalid socket", socket));
return;
{
std::lock_guard G(SocketFdMutex_);
auto client_hint = Clients_fd_.find(socket);
if (client_hint == end(Clients_fd_)) {
pNf->socket().impl()->close();
poco_warning(Logger_, fmt::format("{}: Invalid socket", socket));
return;
}
client = client_hint->second;
}
{
std::lock_guard Guard(client->Mutex_);
client->Disconnect(__func__ , Guard);
}
client = client_hint->second;
client->Disconnect();
if(Running_)
OWLSclientEvents::Reconnect(client,this);
OWLSClientEvents::Reconnect(client,this);
}
void SimulationRunner::OnSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification> &pNf) {
std::map<std::int64_t, std::shared_ptr<OWLSclient>>::iterator client_hint;
std::shared_ptr<OWLSclient> client;
int socket;
{
std::lock_guard G(Mutex_);
std::lock_guard G(SocketFdMutex_);
socket = pNf->socket().impl()->sockfd();
client_hint = Clients_fd_.find(socket);
auto client_hint = Clients_fd_.find(socket);
if (client_hint == end(Clients_fd_)) {
poco_warning(Logger_, fmt::format("{}: Invalid socket", socket));
return;
@@ -137,8 +176,7 @@ namespace OpenWifi {
auto Op = Flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
if (MessageSize == 0 && Flags == 0 && Op == 0) {
Clients_fd_.erase(socket);
OWLSclientEvents::Disconnect(client, this, "Error while waiting for data in WebSocket", true);
OWLSClientEvents::Disconnect(__func__, Guard, client, this, "Error while waiting for data in WebSocket", true);
return;
}
IncomingFrame.append(0);
@@ -161,7 +199,7 @@ namespace OpenWifi {
if (Frame->has("jsonrpc") && Frame->has("id") &&
Frame->has("method") && Frame->has("params")) {
ProcessCommand(client, Frame);
ProcessCommand(Guard,client, Frame);
} else {
Logger_.warning(
fmt::format("MESSAGE({}): invalid incoming message.", client->SerialNumber_));
@@ -179,12 +217,10 @@ namespace OpenWifi {
Logger_.warning(fmt::format("Exception({}): Generic exception: {}", client->SerialNumber_,
E.displayText()));
}
Clients_fd_.erase(socket);
OWLSclientEvents::Disconnect(client, this, "Error while waiting for data in WebSocket", true);
OWLSClientEvents::Disconnect(__func__, Guard,client, this, "Error while waiting for data in WebSocket", true);
}
void SimulationRunner::ProcessCommand(std::shared_ptr<OWLSclient> Client, Poco::JSON::Object::Ptr Frame) {
void SimulationRunner::ProcessCommand(std::lock_guard<std::mutex> &ClientGuard, const std::shared_ptr<OWLSclient> & Client, Poco::JSON::Object::Ptr Frame) {
std::string Method = Frame->get("method");
std::uint64_t Id = Frame->get("id");
@@ -212,7 +248,7 @@ namespace OpenWifi {
t.detach();
} else {
Logger_.warning(fmt::format("COMMAND({}): unknown method '{}'", Client->SerialNumber_, Method));
Client->UNsupportedCommand(Client, Id, Method);
Client->UnSupportedCommand(ClientGuard,Client, Id, Method);
}
}

View File

@@ -10,13 +10,15 @@
#include <Poco/Thread.h>
#include <Poco/Environment.h>
#include "OWLSclient.h"
#include <RESTObjects/RESTAPI_OWLSobjects.h>
#include <Poco/Timer.h>
#include "CensusReport.h"
#include <RESTObjects/RESTAPI_OWLSobjects.h>
#include <libs/Scheduler.h>
#include <RESTObjects/RESTAPI_SecurityObjects.h>
#include "OWLSclient.h"
#include "CensusReport.h"
namespace OpenWifi {
class SimulationRunner {
@@ -38,35 +40,44 @@ namespace OpenWifi {
const std::string & Id() const { return Id_; }
inline void AddClientFd(std::int64_t fd, std::shared_ptr<OWLSclient> c) {
std::lock_guard G(Mutex_);
inline void AddClientFd(std::int64_t fd, const std::shared_ptr<OWLSclient> &c) {
std::lock_guard G(SocketFdMutex_);
Clients_fd_[fd] = c;
}
inline void RemoveClientFd(std::int64_t fd) {
std::lock_guard G(Mutex_);
std::lock_guard G(SocketFdMutex_);
Clients_fd_.erase(fd);
}
void ProcessCommand(std::shared_ptr<OWLSclient> Client, Poco::JSON::Object::Ptr Vars);
Poco::Net::SocketReactor & Reactor() { return Reactor_; }
void ProcessCommand(std::lock_guard<std::mutex> &G, const std::shared_ptr<OWLSclient> &Client, Poco::JSON::Object::Ptr Vars);
inline auto & Scheduler() { return Scheduler_; }
inline bool Running() { return Running_; }
void onUpdateTimer(Poco::Timer &timer);
private:
std::mutex SocketFdMutex_;
my_mutex Mutex_;
OWLSObjects::SimulationDetails Details_;
Poco::Logger &Logger_;
Poco::Net::SocketReactor Reactor_;
std::vector<std::unique_ptr<Poco::Net::SocketReactor>> SocketReactorPool_;
std::vector<std::unique_ptr<Poco::Thread>> SocketReactorThreadPool_;
std::map<std::string, std::shared_ptr<OWLSclient>> Clients_;
std::map<std::int64_t, std::shared_ptr<OWLSclient>> Clients_fd_;
Poco::Thread SocketReactorThread_;
std::atomic_bool Running_ = false;
CensusReport CensusReport_;
std::string State_{"stopped"};
std::string Id_;
Bosma::Scheduler Scheduler_;
SecurityObjects::UserInfo UInfo_;
std::uint64_t NumberOfReactors_=0;
std::uint64_t StatsUpdates_=0;
Poco::Timer UpdateTimer_;
std::unique_ptr<Poco::TimerCallback<SimulationRunner>> UpdateTimerCallback_;
static void ProgressUpdate(SimulationRunner *s);

View File

@@ -8,9 +8,9 @@
#pragma once
#include "framework/StorageClass.h"
#include "storage/storage_results.h"
#include "storage/storage_simulations.h"
#include <framework/StorageClass.h>
#include <storage/storage_results.h>
#include <storage/storage_simulations.h>
namespace OpenWifi {

View File

@@ -2,8 +2,9 @@
// Created by stephane bourque on 2022-10-30.
//
#include "UI_Owls_WebSocketNotifications.h"
#include "framework/UI_WebSocketClientServer.h"
#include <framework/UI_WebSocketClientServer.h>
#include <UI_Owls_WebSocketNotifications.h>
namespace OpenWifi::OWLSNotifications {

View File

@@ -4,8 +4,8 @@
#pragma once
#include "RESTObjects/RESTAPI_OWLSobjects.h"
#include "framework/UI_WebSocketClientNotifications.h"
#include <framework/UI_WebSocketClientNotifications.h>
#include <RESTObjects/RESTAPI_OWLSobjects.h>
namespace OpenWifi::OWLSNotifications {

View File

@@ -26,7 +26,7 @@ namespace OpenWifi {
Response.set("Connection", "keep-alive");
Response.setVersion(Poco::Net::HTTPMessage::HTTP_1_1);
std::ostream &Answer = Response.send();
Answer << "process Alive and kicking!";
Answer << ALBHealthCheckServer()->CallbackText();
} catch (...) {
}
}

View File

@@ -37,6 +37,8 @@ namespace OpenWifi {
inline static std::atomic_uint64_t req_id_ = 1;
};
typedef std::string ALBHealthMessageCallback();
class ALBHealthCheckServer : public SubSystemServer {
public:
ALBHealthCheckServer();
@@ -48,10 +50,22 @@ namespace OpenWifi {
int Start() override;
void Stop() override;
inline void RegisterExtendedHealthMessage(ALBHealthMessageCallback *F) {
Callback_=F;
};
inline std::string CallbackText() {
if(Callback_== nullptr) {
return "process Alive and kicking!";
} else {
return Callback_();
}
}
private:
std::unique_ptr<Poco::Net::HTTPServer> Server_;
std::unique_ptr<Poco::Net::ServerSocket> Socket_;
ALBHealthMessageCallback *Callback_= nullptr;
int Port_ = 0;
mutable std::atomic_bool Running_ = false;
};

View File

@@ -11,10 +11,12 @@
#include "Poco/File.h"
#include "Poco/StreamCopier.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h"
#include "framework/MicroServiceFuncs.h"
#include "nlohmann/json.hpp"
// #include "nlohmann/json.hpp"
namespace OpenWifi {
@@ -28,11 +30,11 @@ namespace OpenWifi {
if (F.exists()) {
std::ostringstream OS;
std::ifstream IF(FileName);
Poco::StreamCopier::copyStream(IF, OS);
Registry_ = nlohmann::json::parse(OS.str());
Poco::JSON::Parser P;
Registry_ = P.parse(IF).extract<Poco::JSON::Object::Ptr>();
}
} catch (...) {
Registry_ = nlohmann::json::parse("{}");
Registry_ = Poco::makeShared<Poco::JSON::Object>();
}
}
@@ -44,54 +46,47 @@ namespace OpenWifi {
inline ~AppServiceRegistry() { Save(); }
inline void Save() {
std::istringstream IS(to_string(Registry_));
std::ofstream OF;
OF.open(FileName, std::ios::binary | std::ios::trunc);
Poco::StreamCopier::copyStream(IS, OF);
Registry_->stringify(OF);
}
inline void Set(const char *Key, uint64_t Value) {
Registry_[Key] = Value;
void Set(const char *key, const std::vector<std::string> &V) {
Poco::JSON::Array Arr;
for(const auto &s:V) {
Arr.add(s);
}
Registry_->set(key,Arr);
Save();
}
template<class T> void Set(const char *key, const T &Value) {
Registry_->set(key,Value);
Save();
}
inline void Set(const char *Key, const std::string &Value) {
Registry_[Key] = Value;
Save();
}
bool Get(const char *key, std::vector<std::string> &Value) {
if(Registry_->has(key) && !Registry_->isNull(key) && Registry_->isArray(key)) {
auto Arr = Registry_->get(key);
for(const auto &v:Arr) {
Value.emplace_back(v);
}
return true;
}
return false;
}
inline void Set(const char *Key, bool Value) {
Registry_[Key] = Value;
Save();
}
inline bool Get(const char *Key, bool &Value) {
if (Registry_[Key].is_boolean()) {
Value = Registry_[Key].get<bool>();
return true;
}
return false;
}
inline bool Get(const char *Key, uint64_t &Value) {
if (Registry_[Key].is_number_unsigned()) {
Value = Registry_[Key].get<uint64_t>();
return true;
}
return false;
}
inline bool Get(const char *Key, std::string &Value) {
if (Registry_[Key].is_string()) {
Value = Registry_[Key].get<std::string>();
return true;
}
return false;
}
template<class T> bool Get(const char *key, T &Value) {
if(Registry_->has(key) && !Registry_->isNull(key)) {
Value = Registry_->getValue<T>(key);
return true;
}
return false;
}
private:
std::string FileName;
nlohmann::json Registry_;
Poco::JSON::Object::Ptr Registry_;
};
inline auto AppServiceRegistry() { return AppServiceRegistry::instance(); }

View File

@@ -34,9 +34,17 @@ static std::string DefaultUCentralSchema = R"foo(
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"strict": {
"type": "boolean",
"default": false
},
"uuid": {
"type": "integer"
},
"public_ip_lookup": {
"type": "string",
"format": "uc-fqdn"
},
"unit": {
"$ref": "#/$defs/unit"
},
@@ -110,6 +118,20 @@ static std::string DefaultUCentralSchema = R"foo(
"random-password": {
"type": "boolean",
"default": false
},
"beacon-advertisement": {
"type": "object",
"properties": {
"device-name": {
"type": "boolean"
},
"device-serial": {
"type": "boolean"
},
"network-id": {
"type": "integer"
}
}
}
}
},
@@ -218,6 +240,52 @@ static std::string DefaultUCentralSchema = R"foo(
}
}
},
"interface.ssid.encryption": {
"type": "object",
"properties": {
"proto": {
"type": "string",
"enum": [
"none",
"owe",
"owe-transition",
"psk",
"psk2",
"psk-mixed",
"psk2-radius",
"wpa",
"wpa2",
"wpa-mixed",
"sae",
"sae-mixed",
"wpa3",
"wpa3-192",
"wpa3-mixed"
],
"examples": [
"psk2"
]
},
"key": {
"type": "string",
"maxLength": 63,
"minLength": 8
},
"ieee80211w": {
"type": "string",
"enum": [
"disabled",
"optional",
"required"
],
"default": "disabled"
},
"key-caching": {
"type": "boolean",
"default": true
}
}
},
"definitions": {
"type": "object",
"properties": {
@@ -634,26 +702,6 @@ static std::string DefaultUCentralSchema = R"foo(
"type": "string",
"format": "uc-timeout",
"default": "6h"
},
"relay-server": {
"type": "string",
"format": "ipv4",
"example": "192.168.2.1"
},
"circuit-id-format": {
"type": "string",
"example": [
"\\{Interface\\}:\\{VLAN-Id\\}:\\{SSID\\}:\\{Model\\}:\\{Name\\}:\\{AP-MAC\\}:\\{Location\\}",
"\\{AP-MAC\\};\\{SSID\\};\\{Crypto\\}",
"\\{Name\\} \\{ESSID\\}"
]
},
"remote-id-format": {
"type": "string",
"example": [
"\\{Client-MAC-hex\\} \\{SSID\\}",
"\\{AP-MAC-hex\\} \\{SSID\\}"
]
}
}
},
@@ -732,7 +780,8 @@ static std::string DefaultUCentralSchema = R"foo(
"type": "string",
"enum": [
"dynamic",
"static"
"static",
"none"
],
"examples": [
"static"
@@ -1022,52 +1071,6 @@ static std::string DefaultUCentralSchema = R"foo(
}
]
},
"interface.ssid.encryption": {
"type": "object",
"properties": {
"proto": {
"type": "string",
"enum": [
"none",
"owe",
"owe-transition",
"psk",
"psk2",
"psk-mixed",
"psk2-radius",
"wpa",
"wpa2",
"wpa-mixed",
"sae",
"sae-mixed",
"wpa3",
"wpa3-192",
"wpa3-mixed"
],
"examples": [
"psk2"
]
},
"key": {
"type": "string",
"maxLength": 63,
"minLength": 8
},
"ieee80211w": {
"type": "string",
"enum": [
"disabled",
"optional",
"required"
],
"default": "disabled"
},
"key-caching": {
"type": "boolean",
"default": true
}
}
},
"interface.ssid.multi-psk": {
"type": "object",
"properties": {
@@ -1232,6 +1235,32 @@ static std::string DefaultUCentralSchema = R"foo(
"secret"
]
},
"secondary": {
"type": "object",
"properties": {
"host": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"examples": [
1812
]
},
"secret": {
"type": "string",
"examples": [
"secret"
]
}
}
},
"request-attribute": {
"type": "array",
"items": {
@@ -1309,6 +1338,25 @@ static std::string DefaultUCentralSchema = R"foo(
"value": "Example Operator"
}
]
},
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"maximum": 255,
"minimum": 1
},
"hex-value": {
"type": "string"
}
},
"examples": [
{
"id": 32,
"value": "0a0b0c0d"
}
]
}
]
}
@@ -1658,6 +1706,236 @@ static std::string DefaultUCentralSchema = R"foo(
}
}
},
"service.captive.click": {
"type": "object",
"properties": {
"auth-mode": {
"type": "string",
"const": "click-to-continue"
}
}
},
"service.captive.radius": {
"type": "object",
"properties": {
"auth-mode": {
"type": "string",
"const": "radius"
},
"auth-server": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"auth-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 1812
},
"auth-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-server": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"acct-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 1812
},
"acct-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-interval": {
"type": "integer",
"default": 600
}
}
},
"service.captive.credentials": {
"type": "object",
"properties": {
"auth-mode": {
"type": "string",
"const": "credentials"
},
"credentials": {
"type": "array",
"items": {
"type": "object",
"properties": {
"username": {
"type": "string"
},
"password": {
"type": "string"
}
}
}
}
}
},
"service.captive.uam": {
"type": "object",
"properties": {
"auth-mode": {
"type": "string",
"const": "uam"
},
"uam-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 3990
},
"uam-secret": {
"type": "string"
},
"uam-server": {
"type": "string"
},
"nasid": {
"type": "string"
},
"nasmac": {
"type": "string"
},
"auth-server": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"auth-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 1812
},
"auth-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-server": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"acct-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 1812
},
"acct-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-interval": {
"type": "integer",
"default": 600
},
"ssid": {
"type": "string"
},
"mac-format": {
"type": "string",
"enum": [
"aabbccddeeff",
"aa-bb-cc-dd-ee-ff",
"aa:bb:cc:dd:ee:ff",
"AABBCCDDEEFF",
"AA:BB:CC:DD:EE:FF",
"AA-BB-CC-DD-EE-FF"
]
},
"final-redirect-url": {
"type": "string",
"enum": [
"default",
"uam"
]
},
"mac-auth": {
"type": "boolean",
"default": "default"
},
"radius-gw-proxy": {
"type": "boolean",
"default": false
}
}
},
"service.captive": {
"allOf": [
{
"oneOf": [
{
"$ref": "#/$defs/service.captive.click"
},
{
"$ref": "#/$defs/service.captive.radius"
},
{
"$ref": "#/$defs/service.captive.credentials"
},
{
"$ref": "#/$defs/service.captive.uam"
}
]
},
{
"type": "object",
"properties": {
"walled-garden-fqdn": {
"type": "array",
"items": {
"type": "string"
}
},
"walled-garden-ipaddr": {
"type": "array",
"items": {
"type": "string",
"format": "uc-ip"
}
},
"web-root": {
"type": "string",
"format": "uc-base64"
},
"idle-timeout": {
"type": "integer",
"default": 600
},
"session-timeout": {
"type": "integer"
}
}
}
]
},
"interface.ssid": {
"type": "object",
"properties": {
@@ -1710,6 +1988,10 @@ static std::string DefaultUCentralSchema = R"foo(
"isolate-clients": {
"type": "boolean"
},
"strict-forwarding": {
"type": "boolean",
"default": false
},
"power-save": {
"type": "boolean"
},
@@ -1757,6 +2039,11 @@ static std::string DefaultUCentralSchema = R"foo(
"decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.",
"type": "string"
},
"tip-information-element": {
"decription": "The device will broadcast the TIP vendor IE inside its beacons if this option is enabled.",
"type": "boolean",
"default": true
},
"fils-discovery-interval": {
"type": "integer",
"default": 20,
@@ -1778,7 +2065,14 @@ static std::string DefaultUCentralSchema = R"foo(
"$ref": "#/$defs/interface.ssid.rate-limit"
},
"roaming": {
"$ref": "#/$defs/interface.ssid.roaming"
"anyOf": [
{
"$ref": "#/$defs/interface.ssid.roaming"
},
{
"type": "boolean"
}
]
},
"radius": {
"$ref": "#/$defs/interface.ssid.radius"
@@ -1795,6 +2089,9 @@ static std::string DefaultUCentralSchema = R"foo(
"access-control-list": {
"$ref": "#/$defs/interface.ssid.acl"
},
"captive": {
"$ref": "#/$defs/service.captive"
},
"hostapd-bss-raw": {
"type": "array",
"items": {
@@ -1962,6 +2259,17 @@ static std::string DefaultUCentralSchema = R"foo(
]
}
},
"vlan-awareness": {
"type": "object",
"properties": {
"first": {
"type": "integer"
},
"last": {
"type": "integer"
}
}
},
"vlan": {
"$ref": "#/$defs/interface.vlan"
},
@@ -2084,6 +2392,10 @@ static std::string DefaultUCentralSchema = R"foo(
"examples": [
"01234567890123456789012345678901"
]
},
"mutual-tls": {
"type": "boolean",
"default": true
}
}
},
@@ -2155,6 +2467,24 @@ static std::string DefaultUCentralSchema = R"foo(
"type": "boolean",
"default": false
},
"mode": {
"type": "string",
"enum": [
"radius",
"user"
]
},
"port-filter": {
"type": "array",
"items": {
"type": "string",
"examples": [
{
"LAN1": null
}
]
}
},
"server-certificate": {
"type": "string"
},
@@ -2166,6 +2496,77 @@ static std::string DefaultUCentralSchema = R"foo(
"items": {
"$ref": "#/$defs/interface.ssid.radius.local-user"
}
},
"radius": {
"type": "object",
"properties": {
"nas-identifier": {
"type": "string"
},
"auth-server-addr": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"auth-server-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"examples": [
1812
]
},
"auth-server-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-server-addr": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"acct-server-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"examples": [
1813
]
},
"acct-server-secret": {
"type": "string",
"examples": [
"secret"
]
},
"coa-server-addr": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"coa-server-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"examples": [
1814
]
},
"coa-server-secret": {
"type": "string",
"examples": [
"secret"
]
}
}
}
}
},
@@ -2489,6 +2890,12 @@ static std::string DefaultUCentralSchema = R"foo(
}
}
},
"services": {
"type": "array",
"items": {
"type": "string"
}
},
"classifier": {
"type": "array",
"items": {
@@ -2693,236 +3100,6 @@ static std::string DefaultUCentralSchema = R"foo(
}
}
},
"service.captive.click": {
"type": "object",
"properties": {
"auth-mode": {
"type": "string",
"const": "click-to-continue"
}
}
},
"service.captive.radius": {
"type": "object",
"properties": {
"auth-mode": {
"type": "string",
"const": "radius"
},
"auth-server": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"auth-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 1812
},
"auth-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-server": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"acct-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 1812
},
"acct-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-interval": {
"type": "integer",
"default": 600
}
}
},
"service.captive.credentials": {
"type": "object",
"properties": {
"auth-mode": {
"type": "string",
"const": "credentials"
},
"credentials": {
"type": "array",
"items": {
"type": "object",
"properties": {
"username": {
"type": "string"
},
"password": {
"type": "string"
}
}
}
}
}
},
"service.captive.uam": {
"type": "object",
"properties": {
"auth-mode": {
"type": "string",
"const": "uam"
},
"uam-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 3990
},
"uam-secret": {
"type": "string"
},
"uam-server": {
"type": "string"
},
"nasid": {
"type": "string"
},
"nasmac": {
"type": "string"
},
"auth-server": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"auth-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 1812
},
"auth-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-server": {
"type": "string",
"format": "uc-host",
"examples": [
"192.168.1.10"
]
},
"acct-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"default": 1812
},
"acct-secret": {
"type": "string",
"examples": [
"secret"
]
},
"acct-interval": {
"type": "integer",
"default": 600
},
"ssid": {
"type": "string"
},
"mac-format": {
"type": "string",
"enum": [
"aabbccddeeff",
"aa-bb-cc-dd-ee-ff",
"aa:bb:cc:dd:ee:ff",
"AABBCCDDEEFF",
"AA:BB:CC:DD:EE:FF",
"AA-BB-CC-DD-EE-FF"
]
},
"final-redirect-url": {
"type": "string",
"enum": [
"default",
"uam"
]
},
"mac-auth": {
"type": "boolean",
"default": "default"
},
"radius-gw-proxy": {
"type": "boolean",
"default": false
}
}
},
"service.captive": {
"allOf": [
{
"oneOf": [
{
"$ref": "#/$defs/service.captive.click"
},
{
"$ref": "#/$defs/service.captive.radius"
},
{
"$ref": "#/$defs/service.captive.credentials"
},
{
"$ref": "#/$defs/service.captive.uam"
}
]
},
{
"type": "object",
"properties": {
"walled-garden-fqdn": {
"type": "array",
"items": {
"type": "string"
}
},
"walled-garden-ipaddr": {
"type": "array",
"items": {
"type": "string",
"format": "uc-ip"
}
},
"web-root": {
"type": "string",
"format": "uc-base64"
},
"idle-timeout": {
"type": "integer",
"default": 600
},
"session-timeout": {
"type": "integer"
}
}
}
]
},
"service.gps": {
"type": "object",
"properties": {
@@ -2941,6 +3118,50 @@ static std::string DefaultUCentralSchema = R"foo(
}
}
},
"service.dhcp-relay": {
"type": "object",
"properties": {
"select-ports": {
"type": "array",
"items": {
"type": "string"
}
},
"vlans": {
"type": "array",
"items": {
"type": "object",
"properties": {
"vlan": {
"type": "number"
},
"relay-server": {
"type": "string",
"format": "uc-ip"
},
"circuit-id-format": {
"type": "string",
"enum": [
"vlan-id",
"ap-mac",
"ssid"
],
"default": "vlan-id"
},
"remote-id-format": {
"type": "string",
"enum": [
"vlan-id",
"ap-mac",
"ssid"
],
"default": "ap-mac"
}
}
}
}
}
},
"service": {
"type": "object",
"properties": {
@@ -3000,6 +3221,9 @@ static std::string DefaultUCentralSchema = R"foo(
},
"gps": {
"$ref": "#/$defs/service.gps"
},
"dhcp-relay": {
"$ref": "#/$defs/service.dhcp-relay"
}
}
},

View File

@@ -14,18 +14,18 @@ namespace OpenWifi {
void EventBusManager::run() {
Running_ = true;
Utils::SetThreadName("fmwk:EventMgr");
auto Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN);
auto Msg = (MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN));
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
false);
while (Running_) {
Poco::Thread::trySleep((unsigned long)MicroServiceDaemonBusTimer());
if (!Running_)
break;
Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE);
Msg = (MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE));
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(),
Msg, false);
}
Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_LEAVE);
Msg = (MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_LEAVE));
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
false);
};

View File

@@ -6,6 +6,7 @@
#include "fmt/format.h"
#include "framework/MicroServiceFuncs.h"
#include "cppkafka/utils/consumer_dispatcher.h"
namespace OpenWifi {
@@ -99,9 +100,12 @@ namespace OpenWifi {
try {
auto Msg = dynamic_cast<KafkaMessage *>(Note.get());
if (Msg != nullptr) {
Producer.produce(cppkafka::MessageBuilder(Msg->Topic())
.key(Msg->Key())
.payload(Msg->Payload()));
auto NewMessage = cppkafka::MessageBuilder(Msg->Topic());
NewMessage.key(Msg->Key());
NewMessage.partition(0);
NewMessage.payload(Msg->Payload());
Producer.produce(NewMessage);
Producer.poll((std::chrono::milliseconds) 0);
}
} catch (const cppkafka::HandleException &E) {
poco_warning(Logger_,
@@ -111,6 +115,10 @@ namespace OpenWifi {
} catch (...) {
poco_error(Logger_, "std::exception");
}
if (Queue_.size() == 0) {
// message queue is empty, flush all previously sent messages
Producer.flush();
}
Note = Queue_.waitDequeueNotification();
}
poco_information(Logger_, "Stopped...");
@@ -156,43 +164,49 @@ namespace OpenWifi {
}
});
bool AutoCommit = MicroServiceConfigGetBool("openwifi.kafka.auto.commit", false);
auto BatchSize = MicroServiceConfigGetInt("openwifi.kafka.consumer.batchsize", 20);
// bool AutoCommit = MicroServiceConfigGetBool("openwifi.kafka.auto.commit", false);
// auto BatchSize = MicroServiceConfigGetInt("openwifi.kafka.consumer.batchsize", 100);
Types::StringVec Topics;
KafkaManager()->Topics(Topics);
std::for_each(Topics_.begin(),Topics_.end(),
[&](const std::string & T) { Topics.emplace_back(T); });
Consumer.subscribe(Topics);
Running_ = true;
while (Running_) {
try {
std::vector<cppkafka::Message> MsgVec =
Consumer.poll_batch(BatchSize, std::chrono::milliseconds(100));
for (auto const &Msg : MsgVec) {
if (!Msg)
continue;
if (Msg.get_error()) {
if (!Msg.is_eof()) {
poco_error(Logger_,
fmt::format("Error: {}", Msg.get_error().to_string()));
std::vector<cppkafka::Message> MsgVec;
Dispatcher_ = std::make_unique<cppkafka::ConsumerDispatcher>(Consumer);
Dispatcher_->run(
// Callback executed whenever a new message is consumed
[&](cppkafka::Message msg) {
// Print the key (if any)
std::lock_guard G(ConsumerMutex_);
auto It = Notifiers_.find(msg.get_topic());
if (It != Notifiers_.end()) {
const auto &FL = It->second;
for (const auto &[CallbackFunc, _] : FL) {
try {
CallbackFunc(msg.get_key(), msg.get_payload());
} catch(const Poco::Exception &E) {
} catch(...) {
}
if (!AutoCommit)
Consumer.async_commit(Msg);
continue;
}
KafkaManager()->Dispatch(Msg.get_topic(), Msg.get_key(), Msg.get_payload());
if (!AutoCommit)
Consumer.async_commit(Msg);
}
} catch (const cppkafka::HandleException &E) {
poco_warning(Logger_,
fmt::format("Caught a Kafka exception (consumer): {}", E.what()));
} catch (const Poco::Exception &E) {
Logger_.log(E);
} catch (...) {
poco_error(Logger_, "std::exception");
Consumer.commit(msg);
},
// Whenever there's an error (other than the EOF soft error)
[&Logger_](cppkafka::Error error) {
poco_warning(Logger_,fmt::format("Error: {}", error.to_string()));
},
// Whenever EOF is reached on a partition, print this
[&Logger_](cppkafka::ConsumerDispatcher::EndOfFile, const cppkafka::TopicPartition& topic_partition) {
poco_debug(Logger_,fmt::format("Partition {} EOF", topic_partition.get_partition()));
}
}
);
Consumer.unsubscribe();
poco_information(Logger_, "Stopped...");
}
@@ -212,7 +226,7 @@ namespace OpenWifi {
}
}
void KafkaProducer::Produce(const std::string &Topic, const std::string &Key,
void KafkaProducer::Produce(const char *Topic, const std::string &Key,
const std::string &Payload) {
std::lock_guard G(Mutex_);
Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload));
@@ -220,7 +234,6 @@ namespace OpenWifi {
void KafkaConsumer::Start() {
if (!Running_) {
Running_ = true;
Worker_.start(*this);
}
}
@@ -228,29 +241,16 @@ namespace OpenWifi {
void KafkaConsumer::Stop() {
if (Running_) {
Running_ = false;
Worker_.wakeUp();
if(Dispatcher_) {
Dispatcher_->stop();
}
Worker_.join();
}
}
void KafkaDispatcher::Start() {
if (!Running_) {
Running_ = true;
Worker_.start(*this);
}
}
void KafkaDispatcher::Stop() {
if (Running_) {
Running_ = false;
Queue_.wakeUpAll();
Worker_.join();
}
}
auto KafkaDispatcher::RegisterTopicWatcher(const std::string &Topic,
std::uint64_t KafkaConsumer::RegisterTopicWatcher(const std::string &Topic,
Types::TopicNotifyFunction &F) {
std::lock_guard G(Mutex_);
std::lock_guard G(ConsumerMutex_);
auto It = Notifiers_.find(Topic);
if (It == Notifiers_.end()) {
Types::TopicNotifyFunctionList L;
@@ -259,11 +259,12 @@ namespace OpenWifi {
} else {
It->second.emplace(It->second.end(), std::make_pair(F, FunctionId_));
}
Topics_.insert(Topic);
return FunctionId_++;
}
void KafkaDispatcher::UnregisterTopicWatcher(const std::string &Topic, int Id) {
std::lock_guard G(Mutex_);
void KafkaConsumer::UnregisterTopicWatcher(const std::string &Topic, int Id) {
std::lock_guard G(ConsumerMutex_);
auto It = Notifiers_.find(Topic);
if (It != Notifiers_.end()) {
Types::TopicNotifyFunctionList &L = It->second;
@@ -275,56 +276,17 @@ namespace OpenWifi {
}
}
void KafkaDispatcher::Dispatch(const std::string &Topic, const std::string &Key,
const std::string &Payload) {
std::lock_guard G(Mutex_);
auto It = Notifiers_.find(Topic);
if (It != Notifiers_.end()) {
Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload));
}
}
void KafkaDispatcher::run() {
Poco::Logger &Logger_ =
Poco::Logger::create("KAFKA-DISPATCHER", KafkaManager()->Logger().getChannel());
poco_information(Logger_, "Starting...");
Poco::AutoPtr<Poco::Notification> Note(Queue_.waitDequeueNotification());
Utils::SetThreadName("kafka:dispatch");
while (Note && Running_) {
auto Msg = dynamic_cast<KafkaMessage *>(Note.get());
if (Msg != nullptr) {
auto It = Notifiers_.find(Msg->Topic());
if (It != Notifiers_.end()) {
const auto &FL = It->second;
for (const auto &[CallbackFunc, _] : FL) {
CallbackFunc(Msg->Key(), Msg->Payload());
}
}
}
Note = Queue_.waitDequeueNotification();
}
poco_information(Logger_, "Stopped...");
}
void KafkaDispatcher::Topics(std::vector<std::string> &T) {
T.clear();
for (const auto &[TopicName, _] : Notifiers_)
T.push_back(TopicName);
}
int KafkaManager::Start() {
if (!KafkaEnabled_)
return 0;
ConsumerThr_.Start();
ProducerThr_.Start();
Dispatcher_.Start();
return 0;
}
void KafkaManager::Stop() {
if (KafkaEnabled_) {
poco_information(Logger(), "Stopping...");
Dispatcher_.Stop();
ProducerThr_.Stop();
ConsumerThr_.Stop();
poco_information(Logger(), "Stopped...");
@@ -332,39 +294,27 @@ namespace OpenWifi {
}
}
void KafkaManager::PostMessage(const std::string &topic, const std::string &key,
const std::string &PayLoad, bool WrapMessage) {
void KafkaManager::PostMessage(const char *topic, const std::string &key,
const std::string & PayLoad, bool WrapMessage) {
if (KafkaEnabled_) {
ProducerThr_.Produce(topic, key, WrapMessage ? WrapSystemId(PayLoad) : PayLoad);
}
}
void KafkaManager::Dispatch(const std::string &Topic, const std::string &Key,
const std::string &Payload) {
Dispatcher_.Dispatch(Topic, Key, Payload);
}
[[nodiscard]] std::string KafkaManager::WrapSystemId(const std::string &PayLoad) {
return SystemInfoWrapper_ + PayLoad + "}";
}
uint64_t KafkaManager::RegisterTopicWatcher(const std::string &Topic,
Types::TopicNotifyFunction &F) {
void KafkaManager::PostMessage(const char *topic, const std::string &key,
const Poco::JSON::Object &Object, bool WrapMessage) {
if (KafkaEnabled_) {
return Dispatcher_.RegisterTopicWatcher(Topic, F);
} else {
return 0;
std::ostringstream ObjectStr;
Object.stringify(ObjectStr);
ProducerThr_.Produce(topic, key, WrapMessage ? WrapSystemId(ObjectStr.str()) : ObjectStr.str());
}
}
void KafkaManager::UnregisterTopicWatcher(const std::string &Topic, uint64_t Id) {
if (KafkaEnabled_) {
Dispatcher_.UnregisterTopicWatcher(Topic, Id);
}
[[nodiscard]] std::string KafkaManager::WrapSystemId(const std::string & PayLoad) {
return fmt::format( R"lit({{ "system" : {{ "id" : {}, "host" : "{}" }}, "payload" : {} }})lit",
MicroServiceID(), MicroServicePrivateEndPoint(), PayLoad ) ;
}
void KafkaManager::Topics(std::vector<std::string> &T) { Dispatcher_.Topics(T); }
void KafkaManager::PartitionAssignment(const cppkafka::TopicPartitionList &partitions) {
poco_information(
Logger(), fmt::format("Partition assigned: {}...", partitions.front().get_partition()));
@@ -375,4 +325,4 @@ namespace OpenWifi {
partitions.front().get_partition()));
}
} // namespace OpenWifi
} // namespace OpenWifi

View File

@@ -6,7 +6,7 @@
#include "Poco/Notification.h"
#include "Poco/NotificationQueue.h"
#include "Poco/JSON/Object.h"
#include "framework/KafkaTopics.h"
#include "framework/OpenWifiTypes.h"
#include "framework/SubSystemServer.h"
@@ -18,15 +18,15 @@ namespace OpenWifi {
class KafkaMessage : public Poco::Notification {
public:
KafkaMessage(const std::string &Topic, const std::string &Key, const std::string &Payload)
KafkaMessage(const char * Topic, const std::string &Key, const std::string &Payload)
: Topic_(Topic), Key_(Key), Payload_(Payload) {}
inline const std::string &Topic() { return Topic_; }
inline const char * Topic() { return Topic_; }
inline const std::string &Key() { return Key_; }
inline const std::string &Payload() { return Payload_; }
private:
std::string Topic_;
const char *Topic_;
std::string Key_;
std::string Payload_;
};
@@ -36,10 +36,10 @@ namespace OpenWifi {
void run() override;
void Start();
void Stop();
void Produce(const std::string &Topic, const std::string &Key, const std::string &Payload);
void Produce(const char *Topic, const std::string &Key, const std::string & Payload);
private:
std::recursive_mutex Mutex_;
std::mutex Mutex_;
Poco::Thread Worker_;
mutable std::atomic_bool Running_ = false;
Poco::NotificationQueue Queue_;
@@ -47,33 +47,22 @@ namespace OpenWifi {
class KafkaConsumer : public Poco::Runnable {
public:
void run() override;
void Start();
void Stop();
private:
std::recursive_mutex Mutex_;
Poco::Thread Worker_;
std::mutex ConsumerMutex_;
Types::NotifyTable Notifiers_;
Poco::Thread Worker_;
mutable std::atomic_bool Running_ = false;
};
uint64_t FunctionId_ = 1;
std::unique_ptr<cppkafka::ConsumerDispatcher> Dispatcher_;
std::set<std::string> Topics_;
class KafkaDispatcher : public Poco::Runnable {
public:
void Start();
void Stop();
auto RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
void run() override;
friend class KafkaManager;
std::uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
void UnregisterTopicWatcher(const std::string &Topic, int Id);
void Dispatch(const std::string &Topic, const std::string &Key, const std::string &Payload);
void run() override;
void Topics(std::vector<std::string> &T);
private:
std::recursive_mutex Mutex_;
Types::NotifyTable Notifiers_;
Poco::Thread Worker_;
mutable std::atomic_bool Running_ = false;
uint64_t FunctionId_ = 1;
Poco::NotificationQueue Queue_;
};
class KafkaManager : public SubSystemServer {
@@ -91,21 +80,25 @@ namespace OpenWifi {
int Start() override;
void Stop() override;
void PostMessage(const std::string &topic, const std::string &key,
void PostMessage(const char *topic, const std::string &key,
const std::string &PayLoad, bool WrapMessage = true);
void Dispatch(const std::string &Topic, const std::string &Key, const std::string &Payload);
[[nodiscard]] std::string WrapSystemId(const std::string &PayLoad);
void PostMessage(const char *topic, const std::string &key,
const Poco::JSON::Object &Object, bool WrapMessage = true);
[[nodiscard]] std::string WrapSystemId(const std::string & PayLoad);
[[nodiscard]] inline bool Enabled() const { return KafkaEnabled_; }
uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
void UnregisterTopicWatcher(const std::string &Topic, uint64_t Id);
void Topics(std::vector<std::string> &T);
inline std::uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F) {
return ConsumerThr_.RegisterTopicWatcher(Topic,F);
}
inline void UnregisterTopicWatcher(const std::string &Topic, uint64_t Id) {
return ConsumerThr_.UnregisterTopicWatcher(Topic,Id);
}
private:
bool KafkaEnabled_ = false;
std::string SystemInfoWrapper_;
KafkaProducer ProducerThr_;
KafkaConsumer ConsumerThr_;
KafkaDispatcher Dispatcher_;
void PartitionAssignment(const cppkafka::TopicPartitionList &partitions);
void PartitionRevocation(const cppkafka::TopicPartitionList &partitions);

View File

@@ -10,32 +10,33 @@
#include <string>
namespace OpenWifi::KafkaTopics {
static const std::string HEALTHCHECK{"healthcheck"};
static const std::string STATE{"state"};
static const std::string CONNECTION{"connection"};
static const std::string WIFISCAN{"wifiscan"};
static const std::string ALERTS{"alerts"};
static const std::string COMMAND{"command"};
static const std::string SERVICE_EVENTS{"service_events"};
static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"};
static const std::string DEVICE_TELEMETRY{"device_telemetry"};
static const std::string PROVISIONING_CHANGE{"provisioning_change"};
inline const char * HEALTHCHECK = "healthcheck";
inline const char * STATE = "state";
inline const char * CONNECTION = "connection";
inline const char * WIFISCAN = "wifiscan";
inline const char * ALERTS = "alerts";
inline const char * COMMAND = "command";
inline const char * SERVICE_EVENTS = "service_events";
inline const char * DEVICE_EVENT_QUEUE = "device_event_queue";
inline const char * DEVICE_TELEMETRY = "device_telemetry";
inline const char * PROVISIONING_CHANGE = "provisioning_change";
inline const char * RRM = "rrm";
namespace ServiceEvents {
static const std::string EVENT_JOIN{"join"};
static const std::string EVENT_LEAVE{"leave"};
static const std::string EVENT_KEEP_ALIVE{"keep-alive"};
static const std::string EVENT_REMOVE_TOKEN{"remove-token"};
inline const char * EVENT_JOIN = "join";
inline const char * EVENT_LEAVE = "leave";
inline const char * EVENT_KEEP_ALIVE = "keep-alive";
inline const char * EVENT_REMOVE_TOKEN = "remove-token";
namespace Fields {
static const std::string EVENT{"event"};
static const std::string ID{"id"};
static const std::string TYPE{"type"};
static const std::string PUBLIC{"publicEndPoint"};
static const std::string PRIVATE{"privateEndPoint"};
static const std::string KEY{"key"};
static const std::string VRSN{"version"};
static const std::string TOKEN{"token"};
inline const char * EVENT = "event";
inline const char * ID = "id";
inline const char * TYPE = "type";
inline const char * PUBLIC = "publicEndPoint";
inline const char * PRIVATE = "privateEndPoint";
inline const char * KEY = "key";
inline const char * VRSN = "version";
inline const char * TOKEN = "token";
} // namespace Fields
} // namespace ServiceEvents
} // namespace OpenWifi::KafkaTopics

View File

@@ -129,6 +129,8 @@ namespace OpenWifi {
}
} else {
poco_error(logger(), "Bad bus message.");
std::ostringstream os;
Object->stringify(std::cout);
}
auto i = Services_.begin();

View File

@@ -5,6 +5,8 @@
#include "framework/MicroServiceFuncs.h"
#include "framework/MicroService.h"
#include "framework/ALBserver.h"
namespace OpenWifi {
const std::string &MicroServiceDataDirectory() { return MicroService::instance().DataDir(); }
@@ -47,11 +49,11 @@ namespace OpenWifi {
void MicroServiceReload(const std::string &Type) { MicroService::instance().Reload(Type); }
const Types::StringVec MicroServiceGetLogLevelNames() {
Types::StringVec MicroServiceGetLogLevelNames() {
return MicroService::instance().GetLogLevelNames();
}
const Types::StringVec MicroServiceGetSubSystems() {
Types::StringVec MicroServiceGetSubSystems() {
return MicroService::instance().GetSubSystems();
}
@@ -79,7 +81,7 @@ namespace OpenWifi {
std::string MicroServiceGetUIURI() { return MicroService::instance().GetUIURI(); }
const SubSystemVec MicroServiceGetFullSubSystems() {
SubSystemVec MicroServiceGetFullSubSystems() {
return MicroService::instance().GetFullSubSystems();
}
@@ -87,7 +89,7 @@ namespace OpenWifi {
std::uint64_t MicroServiceDaemonBusTimer() { return MicroService::instance().DaemonBusTimer(); }
std::string MicroServiceMakeSystemEventMessage(const std::string &Type) {
std::string MicroServiceMakeSystemEventMessage(const char *Type) {
return MicroService::instance().MakeSystemEventMessage(Type);
}
@@ -123,4 +125,8 @@ namespace OpenWifi {
return MicroService::instance().AllowExternalMicroServices();
}
void MicroServiceALBCallback( std::string Callback()) {
return ALBHealthCheckServer()->RegisterExtendedHealthMessage(Callback);
}
} // namespace OpenWifi

View File

@@ -31,8 +31,8 @@ namespace OpenWifi {
void MicroServiceLoadConfigurationFile();
void MicroServiceReload();
void MicroServiceReload(const std::string &Type);
const Types::StringVec MicroServiceGetLogLevelNames();
const Types::StringVec MicroServiceGetSubSystems();
Types::StringVec MicroServiceGetLogLevelNames();
Types::StringVec MicroServiceGetSubSystems();
Types::StringPairVec MicroServiceGetLogLevels();
bool MicroServiceSetSubsystemLogLevel(const std::string &SubSystem, const std::string &Level);
void MicroServiceGetExtraConfiguration(Poco::JSON::Object &Answer);
@@ -40,10 +40,10 @@ namespace OpenWifi {
std::uint64_t MicroServiceUptimeTotalSeconds();
std::uint64_t MicroServiceStartTimeEpochTime();
std::string MicroServiceGetUIURI();
const SubSystemVec MicroServiceGetFullSubSystems();
SubSystemVec MicroServiceGetFullSubSystems();
std::string MicroServiceCreateUUID();
std::uint64_t MicroServiceDaemonBusTimer();
std::string MicroServiceMakeSystemEventMessage(const std::string &Type);
std::string MicroServiceMakeSystemEventMessage(const char *Type);
Poco::ThreadPool &MicroServiceTimerPool();
std::string MicroServiceConfigPath(const std::string &Key, const std::string &DefaultValue);
std::string MicroServiceWWWAssetsDir();
@@ -53,4 +53,5 @@ namespace OpenWifi {
std::string MicroServiceGetPublicAPIEndPoint();
void MicroServiceDeleteOverrideConfiguration();
bool AllowExternalMicroServices();
void MicroServiceALBCallback( std::string Callback());
} // namespace OpenWifi

View File

@@ -28,6 +28,9 @@ namespace OpenWifi::Types {
typedef std::string UUID_t;
typedef std::vector<UUID_t> UUIDvec_t;
typedef std::map<std::string, std::map<uint32_t, uint64_t>> Counted3DMapSII;
typedef std::vector<int64_t> IntList;
typedef std::vector<uint64_t> UIntList;
typedef std::vector<double> DoubleList;
struct MicroServiceMeta {
uint64_t Id = 0;

View File

@@ -574,7 +574,37 @@ namespace OpenWifi {
Poco::JSON::Stringifier::stringify(Object, Answer);
}
inline void ReturnRawJSON(const std::string &json_doc) {
inline void ReturnObject(const std::vector<std::string> &Strings) {
Poco::JSON::Array Arr;
for(const auto &String:Strings) {
Arr.add(String);
}
std::ostringstream os;
Arr.stringify(os);
return ReturnRawJSON(os.str());
}
template<class T> void ReturnObject(const std::vector<T> &Objects) {
Poco::JSON::Array Arr;
for(const auto &Object:Objects) {
Poco::JSON::Object O;
Object.to_json(O);
Arr.add(O);
}
std::ostringstream os;
Arr.stringify(os);
return ReturnRawJSON(os.str());
}
template<class T> void ReturnObject(const T &Object) {
Poco::JSON::Object O;
Object.to_json(O);
std::ostringstream os;
O.stringify(os);
return ReturnRawJSON(os.str());
}
inline void ReturnRawJSON(const std::string &json_doc) {
PrepareResponse();
if (Request != nullptr) {
// can we compress ???

View File

@@ -24,50 +24,63 @@ namespace OpenWifi {
Server, TransactionId, Internal) {}
static auto PathName() { return std::list<std::string>{"/api/v1/system"}; }
inline void DoGet() {
inline void DoGet() final {
std::string Arg;
if (HasParameter("command", Arg) && Arg == "info") {
Poco::JSON::Object Answer;
Answer.set(RESTAPI::Protocol::VERSION, MicroServiceVersion());
Answer.set(RESTAPI::Protocol::UPTIME, MicroServiceUptimeTotalSeconds());
Answer.set(RESTAPI::Protocol::START, MicroServiceStartTimeEpochTime());
Answer.set(RESTAPI::Protocol::OS, Poco::Environment::osName());
Answer.set(RESTAPI::Protocol::PROCESSORS, Poco::Environment::processorCount());
Answer.set(RESTAPI::Protocol::HOSTNAME, Poco::Environment::nodeName());
Answer.set(RESTAPI::Protocol::UI, MicroServiceGetUIURI());
if (HasParameter("command", Arg)) {
if (Arg == "info") {
Poco::JSON::Object Answer;
Answer.set(RESTAPI::Protocol::VERSION, MicroServiceVersion());
Answer.set(RESTAPI::Protocol::UPTIME, MicroServiceUptimeTotalSeconds());
Answer.set(RESTAPI::Protocol::START, MicroServiceStartTimeEpochTime());
Answer.set(RESTAPI::Protocol::OS, Poco::Environment::osName());
Answer.set(RESTAPI::Protocol::PROCESSORS, Poco::Environment::processorCount());
Answer.set(RESTAPI::Protocol::HOSTNAME, Poco::Environment::nodeName());
Answer.set(RESTAPI::Protocol::UI, MicroServiceGetUIURI());
Poco::JSON::Array Certificates;
auto SubSystems = MicroServiceGetFullSubSystems();
std::set<std::string> CertNames;
Poco::JSON::Array Certificates;
auto SubSystems = MicroServiceGetFullSubSystems();
std::set<std::string> CertNames;
for (const auto &i : SubSystems) {
auto Hosts = i->HostSize();
for (uint64_t j = 0; j < Hosts; ++j) {
auto CertFileName = i->Host(j).CertFile();
if (!CertFileName.empty()) {
Poco::File F1(CertFileName);
if (F1.exists()) {
auto InsertResult = CertNames.insert(CertFileName);
if (InsertResult.second) {
Poco::JSON::Object Inner;
Poco::Path F(CertFileName);
Inner.set("filename", F.getFileName());
Poco::Crypto::X509Certificate C(CertFileName);
auto ExpiresOn = C.expiresOn();
Inner.set("expiresOn", ExpiresOn.timestamp().epochTime());
Certificates.add(Inner);
for (const auto &i : SubSystems) {
auto Hosts = i->HostSize();
for (uint64_t j = 0; j < Hosts; ++j) {
auto CertFileName = i->Host(j).CertFile();
if (!CertFileName.empty()) {
Poco::File F1(CertFileName);
if (F1.exists()) {
auto InsertResult = CertNames.insert(CertFileName);
if (InsertResult.second) {
Poco::JSON::Object Inner;
Poco::Path F(CertFileName);
Inner.set("filename", F.getFileName());
Poco::Crypto::X509Certificate C(CertFileName);
auto ExpiresOn = C.expiresOn();
Inner.set("expiresOn", ExpiresOn.timestamp().epochTime());
Certificates.add(Inner);
}
}
}
}
}
Answer.set("certificates", Certificates);
return ReturnObject(Answer);
}
if (Arg == "extraConfiguration") {
Poco::JSON::Object Answer;
MicroServiceGetExtraConfiguration(Answer);
return ReturnObject(Answer);
}
if (Arg == "resources") {
Poco::JSON::Object Answer;
Answer.set("numberOfFileDescriptors", Utils::get_open_fds());
std::uint64_t currRealMem, peakRealMem, currVirtMem, peakVirtMem;
Utils::getMemory(currRealMem, peakRealMem, currVirtMem, peakVirtMem);
Answer.set("currRealMem", currRealMem);
Answer.set("peakRealMem", peakRealMem);
Answer.set("currVirtMem", currVirtMem);
Answer.set("peakVirtMem", peakVirtMem);
return ReturnObject(Answer);
}
Answer.set("certificates", Certificates);
return ReturnObject(Answer);
}
if (GetBoolParameter("extraConfiguration")) {
Poco::JSON::Object Answer;
MicroServiceGetExtraConfiguration(Answer);
return ReturnObject(Answer);
}
BadRequest(RESTAPI::Errors::InvalidCommand);
}

View File

@@ -14,8 +14,15 @@
#include "framework/OpenWifiTypes.h"
#include "framework/utils.h"
#include <RESTObjects/RESTAPI_SecurityObjects.h>
namespace OpenWifi::RESTAPI_utils {
inline bool IsRootOrAdmin(const SecurityObjects::UserInfo &UI) {
return UI.userRole==SecurityObjects::ROOT ||
UI.userRole==SecurityObjects::ADMIN;
}
inline void EmbedDocument(const std::string &ObjName, Poco::JSON::Object &Obj,
const std::string &ObjStr) {
std::string D = ObjStr.empty() ? "{}" : ObjStr;
@@ -95,6 +102,20 @@ namespace OpenWifi::RESTAPI_utils {
Obj.set(Field, A);
}
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::DoubleList &V) {
Poco::JSON::Array A;
for (const auto &i : V)
A.add(i);
Obj.set(Field, A);
}
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::IntList &V) {
Poco::JSON::Array A;
for (const auto &i : V)
A.add(i);
Obj.set(Field, A);
}
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::TagList &V) {
Poco::JSON::Array A;
for (const auto &i : V)
@@ -277,6 +298,28 @@ namespace OpenWifi::RESTAPI_utils {
}
}
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field,
Types::DoubleList &Value) {
if (Obj->isArray(Field) && !Obj->isNull(Field)) {
Value.clear();
Poco::JSON::Array::Ptr A = Obj->getArray(Field);
for (const auto &i : *A) {
Value.push_back(i);
}
}
}
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field,
Types::IntList &Value) {
if (Obj->isArray(Field) && !Obj->isNull(Field)) {
Value.clear();
Poco::JSON::Array::Ptr A = Obj->getArray(Field);
for (const auto &i : *A) {
Value.push_back(i);
}
}
}
template <class T>
void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field,
std::vector<T> &Value) {

View File

@@ -22,9 +22,8 @@ namespace OpenWifi {
class StorageClass : public SubSystemServer {
public:
StorageClass() noexcept : SubSystemServer("StorageClass", "STORAGE-SVR", "storage") {}
int Start() override {
inline int Start() override {
std::lock_guard Guard(Mutex_);
Logger().notice("Starting.");
@@ -40,17 +39,22 @@ namespace OpenWifi {
return 0;
}
void Stop() override { Pool_->shutdown(); }
inline void Stop() override { Pool_->shutdown(); }
DBType Type() const { return dbType_; };
StorageClass() noexcept : SubSystemServer("StorageClass", "STORAGE-SVR", "storage") {
}
private:
inline int Setup_SQLite();
inline int Setup_MySQL();
inline int Setup_PostgreSQL();
protected:
std::unique_ptr<Poco::Data::SessionPool> Pool_;
protected:
std::shared_ptr<Poco::Data::SessionPool> Pool_;
Poco::Data::SQLite::Connector SQLiteConn_;
Poco::Data::PostgreSQL::Connector PostgresConn_;
Poco::Data::MySQL::Connector MySQLConn_;
@@ -81,7 +85,7 @@ namespace OpenWifi {
// Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 8,
// (int)NumSessions,
// (int)IdleTime));
Pool_ = std::make_unique<Poco::Data::SessionPool>(SQLiteConn_.name(), DBName, 8,
Pool_ = std::make_shared<Poco::Data::SessionPool>(SQLiteConn_.name(), DBName, 8,
(int)NumSessions, (int)IdleTime);
return 0;
}
@@ -102,7 +106,7 @@ namespace OpenWifi {
";compress=true;auto-reconnect=true";
Poco::Data::MySQL::Connector::registerConnector();
Pool_ = std::make_unique<Poco::Data::SessionPool>(MySQLConn_.name(), ConnectionStr, 8,
Pool_ = std::make_shared<Poco::Data::SessionPool>(MySQLConn_.name(), ConnectionStr, 8,
NumSessions, IdleTime);
return 0;
@@ -126,7 +130,7 @@ namespace OpenWifi {
" connect_timeout=" + ConnectionTimeout;
Poco::Data::PostgreSQL::Connector::registerConnector();
Pool_ = std::make_unique<Poco::Data::SessionPool>(PostgresConn_.name(), ConnectionStr, 8,
Pool_ = std::make_shared<Poco::Data::SessionPool>(PostgresConn_.name(), ConnectionStr, 8,
NumSessions, IdleTime);
return 0;

View File

@@ -37,6 +37,7 @@ namespace OpenWifi {
P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
P.dhUse2048Bits = true;
P.caLocation = cas_;
// P.securityLevel =
auto Context = Poco::AutoPtr<Poco::Net::Context>(
new Poco::Net::Context(Poco::Net::Context::TLS_SERVER_USE, P));
@@ -53,7 +54,6 @@ namespace OpenWifi {
Context->useCertificate(Cert);
Context->addChainCertificate(Root);
Context->addCertificateAuthority(Root);
if (level_ == Poco::Net::Context::VERIFY_STRICT) {
@@ -76,18 +76,18 @@ namespace OpenWifi {
L.fatal(fmt::format("Wrong Certificate({}) for Key({})", cert_file_, key_file_));
}
SSL_CTX_set_verify(SSLCtx, SSL_VERIFY_PEER, nullptr);
SSL_CTX_set_verify(SSLCtx, level_==Poco::Net::Context::VERIFY_NONE ? SSL_VERIFY_NONE : SSL_VERIFY_PEER, nullptr);
if (level_ == Poco::Net::Context::VERIFY_STRICT) {
SSL_CTX_set_client_CA_list(SSLCtx, SSL_load_client_CA_file(client_cas_.c_str()));
SSL_CTX_enable_ct(SSLCtx, SSL_CT_VALIDATION_STRICT);
}
SSL_CTX_enable_ct(SSLCtx, SSL_CT_VALIDATION_STRICT);
SSL_CTX_dane_enable(SSLCtx);
Context->enableSessionCache();
Context->setSessionCacheSize(0);
Context->setSessionTimeout(60);
Context->enableExtendedCertificateVerification(true);
Context->enableExtendedCertificateVerification( level_!= Poco::Net::Context::VERIFY_NONE );
Context->disableStatelessSessionResumption();
}

View File

@@ -0,0 +1,63 @@
//
// Created by stephane bourque on 2023-04-19.
//
#pragma once
#include <vector>
#include <string>
namespace OpenWifi {
inline const std::vector<std::pair<std::string, std::string>> DefaultDeviceTypeList{
{"actiontec_web7200", "AP"},
{"cig_wf186w", "AP"},
{"cig_wf188n", "AP"},
{"cig_wf194c4", "AP"},
{"cig_wf196", "AP"},
{"cig_wf196-ca", "AP"},
{"cig_wf196-ca-ath12", "AP"},
{"cig_wf196-us", "AP"},
{"cig_wf610d", "AP"},
{"cig_wf660a", "AP"},
{"cig_wf808", "AP"},
{"cybertan_eww622-a1", "AP"},
{"edgecore_eap101", "AP"},
{"edgecore_eap101-ath12", "AP"},
{"edgecore_eap102", "AP"},
{"edgecore_eap104", "AP"},
{"edgecore_eap104-ath12", "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"},
{"hfcl_ion4x", "AP"},
{"hfcl_ion4x_2", "AP"},
{"hfcl_ion4xe", "AP"},
{"hfcl_ion4xi", "AP"},
{"indio_um-305ac", "AP"},
{"indio_um-305ax", "AP"},
{"indio_um-310ax-v1", "AP"},
{"indio_um-325ac", "AP"},
{"indio_um-510ac-v3", "AP"},
{"indio_um-510axm-v1", "AP"},
{"indio_um-510axp-v1", "AP"},
{"indio_um-550ac", "AP"},
{"linksys_e8450-ubi", "AP"},
{"linksys_ea6350-v4", "AP"},
{"linksys_ea8300", "AP"},
{"liteon_wpx8324", "AP"},
{"meshpp_s618_cp01", "AP"},
{"meshpp_s618_cp03", "AP"},
{"udaya_a5-id2", "AP"},
{"wallys_dr40x9", "AP"},
{"wallys_dr6018", "AP"},
{"wallys_dr6018_v4", "AP"},
{"x64_vm", "AP"},
{"yuncore_ax840", "AP"},
{"yuncore_fap640", "AP"},
{"yuncore_fap650", "AP"}};
}

View File

@@ -40,6 +40,7 @@ namespace OpenWifi {
};
}
#define DBGLINE std::cout << __LINE__ << ":" << __FILE__ << ", " << __func__ << std::endl;
namespace OpenWifi::RESTAPI::Errors {
struct msg {
uint64_t err_num;
@@ -401,6 +402,37 @@ namespace OpenWifi::RESTAPI::Errors {
1171, "Command not supported on simulated device."
};
static const struct msg VenuesNameAlreadyExists {
1172, "The venue name already exists."
};
static const struct msg InvalidGlobalReachAccount {
1173, "Invalid Global Reach account information."
};
static const struct msg CannotCreateCSR {
1174, "Cannot create a CSR certificate."
};
static const struct msg DefFirmwareNameExists { 1175, "Firmware name already exists." };
static const struct msg NotAValidECKey { 1176, "Not a valid Signing Key." };
static const struct msg NotAValidRadiusPoolType { 1177, "Not a valid RADIUS pool type." };
static const struct msg InvalidRadiusTypeEndpoint { 1178, "Invalid RADIUS Server Endpoint type." };
static const struct msg InvalidRadiusEndpointPoolStrategy { 1179, "Invalid RADIUS Server Endpoint Pool strategy." };
static const struct msg EndpointMustHaveOneTypeOfServers { 1180, "All servers must be either RADIUS or RADSEC." };
static const struct msg RadiusEndpointIndexInvalid { 1181, "Index must be an address between 0.0.1.1 and 0.0.2.254" };
static const struct msg RadiusEndpointIndexMustBeUnique { 1182, "Index must be unique." };
static const struct msg OrionAccountMustExist { 1183, "Orion account must exist." };
static const struct msg GlobalReachCertMustExist { 1184, "Global Reach certificate must exist." };
static const struct msg InvalidRadsecMainCertificate { 1185, "Invalid Radsec main certificate." };
static const struct msg InvalidRadsecCaCertificate { 1186, "Invalid Radsec CA certificates." };
static const struct msg InvalidRadsecPrivteKey { 1187, "Invalid Radsec Private key." };
static const struct msg InvalidRadsecIPAddress { 1188, "Invalid Radsec IP Address." };
static const struct msg InvalidRadsecPort { 1189, "Invalid Radsec Port." };
static const struct msg InvalidRadsecSecret { 1190, "Invalid Radsec Secret." };
static const struct msg InvalidRadiusServer { 1191, "Invalid Radius Server." };
static const struct msg InvalidRRMAction { 1192, "Invalid RRM Action." };
static const struct msg SimulationDoesNotExist {
7000, "Simulation Instance ID does not exist."
};
@@ -531,6 +563,10 @@ namespace OpenWifi::RESTAPI::Protocol {
static const char *CONTENTDISPOSITION = "Content-Disposition";
static const char *CONTENTTYPE = "Content-Type";
static const char *TRANSFER = "transfer";
static const char *CERTUPDATE = "certupdate";
static const char *RRM = "rrm";
static const char *REQUIREMENTS = "requirements";
static const char *PASSWORDPATTERN = "passwordPattern";
static const char *ACCESSPOLICY = "accessPolicy";
@@ -566,6 +602,7 @@ namespace OpenWifi::uCentralProtocol {
static const char *HEALTHCHECK = "healthcheck";
static const char *LOG = "log";
static const char *CRASHLOG = "crashlog";
static const char *REBOOTLOG = "rebootLog";
static const char *PING = "ping";
static const char *CFGPENDING = "cfgpending";
static const char *RECOVERY = "recovery";
@@ -624,6 +661,8 @@ namespace OpenWifi::uCentralProtocol {
static const char *DEVICEUPDATE = "deviceupdate";
static const char *FWSIGNATURE = "FWsignature";
static const char *SIGNATURE = "signature";
static const char *INFO = "info";
static const char *DATE = "date";
static const char *SERIALNUMBER = "serialNumber";
static const char *COMPATIBLE = "compatible";
@@ -645,6 +684,12 @@ namespace OpenWifi::uCentralProtocol {
static const char *RADIUSCOA = "coa";
static const char *RADIUSDST = "dst";
static const char *IES = "ies";
static const char *TRANSFER = "transfer";
static const char *CERTUPDATE = "certupdate";
static const char *RRM = "rrm";
static const char *ACTIONS = "actions";
} // namespace OpenWifi::uCentralProtocol
namespace OpenWifi::uCentralProtocol::Events {
@@ -654,6 +699,7 @@ namespace OpenWifi::uCentralProtocol::Events {
static const char *HEALTHCHECK = "healthcheck";
static const char *LOG = "log";
static const char *CRASHLOG = "crashlog";
static const char *REBOOTLOG = "rebootLog";
static const char *PING = "ping";
static const char *CFGPENDING = "cfgpending";
static const char *RECOVERY = "recovery";
@@ -677,7 +723,8 @@ namespace OpenWifi::uCentralProtocol::Events {
ET_VENUEBROADCAST,
ET_EVENT,
ET_WIFISCAN,
ET_ALARM
ET_ALARM,
ET_REBOOTLOG
};
inline EVENT_MSG EventFromString(const std::string &Method) {
@@ -708,8 +755,10 @@ namespace OpenWifi::uCentralProtocol::Events {
else if (strcmp(WIFISCAN, Method.c_str()) == 0)
return ET_WIFISCAN;
else if (strcmp(ALARM, Method.c_str()) == 0)
return ET_WIFISCAN;
return ET_ALARM;
return ET_ALARM;
else if (strcmp(REBOOTLOG, Method.c_str()) == 0)
return ET_REBOOTLOG;
return ET_UNKNOWN;
};
} // namespace OpenWifi::uCentralProtocol::Events
@@ -733,6 +782,9 @@ namespace OpenWifi::APCommands {
telemetry,
ping,
script,
rrm,
certupdate,
transfer,
unknown
};
@@ -745,7 +797,10 @@ namespace OpenWifi::APCommands {
RESTAPI::Protocol::LEDS, RESTAPI::Protocol::TRACE,
RESTAPI::Protocol::REQUEST, RESTAPI::Protocol::WIFISCAN,
RESTAPI::Protocol::EVENTQUEUE, RESTAPI::Protocol::TELEMETRY,
RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT};
RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT,
RESTAPI::Protocol::RRM, RESTAPI::Protocol::CERTUPDATE,
RESTAPI::Protocol::TRANSFER
};
inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }

View File

@@ -3,10 +3,19 @@
//
#include "Poco/Path.h"
#include "Poco/TemporaryFile.h"
#include "Poco/Crypto/ECKey.h"
#include "framework/AppServiceRegistry.h"
#include "framework/utils.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <algorithm>
#include <resolv.h>
namespace OpenWifi::Utils {
bool NormalizeMac(std::string &Mac) {
@@ -27,6 +36,10 @@ namespace OpenWifi::Utils {
std::all_of(Serial.begin(), Serial.end(), [](auto i) { return std::isxdigit(i); }));
}
[[nodiscard]] bool ValidSerialNumbers(const std::vector<std::string> &numbers) {
return std::all_of(numbers.begin(),numbers.end(),[](auto &number) {return ValidSerialNumber(number);});
}
[[nodiscard]] bool ValidUUID(const std::string &UUID) {
if (UUID.size() > 36)
return false;
@@ -128,6 +141,15 @@ namespace OpenWifi::Utils {
return std::regex_match(Hostname, HostNameRegex);
}
[[nodiscard]] bool ValidNumber(const std::string &number, bool isSigned)
{
static std::regex IntRegex("^-?[0-9]\\d*(\\.\\d+)?$");
if(!isSigned) {
IntRegex = "^[0-9]\\d*(\\.\\d+)?$";
}
return std::regex_match(number, IntRegex);
}
[[nodiscard]] std::string ToHex(const std::vector<unsigned char> &B) {
std::string R;
R.reserve(B.size() * 2);
@@ -595,4 +617,329 @@ namespace OpenWifi::Utils {
return DT.timestamp().epochTime();
}
static std::string FileToString(const std::string &Filename) {
std::ifstream ifs(Filename.c_str(),std::ios_base::in|std::ios_base::binary);
std::ostringstream os;
Poco::StreamCopier::copyStream(ifs,os);
return os.str();
}
bool CreateX509CSR(const CSRCreationParameters & Parameters, CSRCreationResults & Results) {
int ret = 0;
RSA *r = nullptr;
BIGNUM *bne = nullptr;
int nVersion = 0;
unsigned long e = RSA_F4;
X509_REQ *x509_req = nullptr;
X509_NAME *x509_name = nullptr;
EVP_PKEY *pKey = nullptr;
// RSA *tem = nullptr;
// BIO *bio_err = nullptr;
const char *szCountry = Parameters.Country.c_str();
const char *szProvince = Parameters.Province.c_str();
const char *szCity = Parameters.City.c_str();
const char *szOrganization = Parameters.Organization.c_str();
const char *szCommon = Parameters.CommonName.c_str();
Poco::TemporaryFile CsrPath, PubKey, PrivateKey;
std::string Result;
std::ifstream ifs;
std::ostringstream ss;
BIO *bp_public = nullptr,
*bp_private = nullptr,
*bp_csr = nullptr;
// 1. generate rsa key
bne = BN_new();
ret = BN_set_word(bne,e);
if(ret != 1){
goto free_all;
}
r = RSA_new();
ret = RSA_generate_key_ex(r, Parameters.bits, bne, nullptr);
if(ret != 1){
goto free_all;
}
bp_public = BIO_new_file(PubKey.path().c_str(), "w+");
ret = PEM_write_bio_RSAPublicKey(bp_public, r);
if(ret != 1) {
goto free_all;
}
bp_private = BIO_new_file(PrivateKey.path().c_str(), "w+");
ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL);
if(ret != 1) {
goto free_all;
}
// 2. set version of x509 req
x509_req = X509_REQ_new();
ret = X509_REQ_set_version(x509_req, nVersion);
if (ret != 1){
goto free_all;
}
// 3. set subject of x509 req
x509_name = X509_REQ_get_subject_name(x509_req);
ret = X509_NAME_add_entry_by_txt(x509_name,"C", MBSTRING_ASC, (const unsigned char*)szCountry, -1, -1, 0);
if (ret != 1){
goto free_all;
}
ret = X509_NAME_add_entry_by_txt(x509_name,"ST", MBSTRING_ASC, (const unsigned char*)szProvince, -1, -1, 0);
if (ret != 1){
goto free_all;
}
ret = X509_NAME_add_entry_by_txt(x509_name,"L", MBSTRING_ASC, (const unsigned char*)szCity, -1, -1, 0);
if (ret != 1){
goto free_all;
}
ret = X509_NAME_add_entry_by_txt(x509_name,"O", MBSTRING_ASC, (const unsigned char*)szOrganization, -1, -1, 0);
if (ret != 1){
goto free_all;
}
ret = X509_NAME_add_entry_by_txt(x509_name,"CN", MBSTRING_ASC, (const unsigned char*)szCommon, -1, -1, 0);
if (ret != 1){
goto free_all;
}
// 4. set public key of x509 req
pKey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pKey, r);
r = nullptr; // will be free rsa when EVP_PKEY_free(pKey)
ret = X509_REQ_set_pubkey(x509_req, pKey);
if (ret != 1){
goto free_all;
}
// 5. set sign key of x509 req
ret = X509_REQ_sign(x509_req, pKey, EVP_sha1()); // return x509_req->signature->length
if (ret <= 0){
goto free_all;
}
bp_csr = BIO_new_file(CsrPath.path().c_str(),"w");
ret = PEM_write_bio_X509_REQ(bp_csr, x509_req);
// 6. free
free_all:
X509_REQ_free(x509_req);
BIO_free_all(bp_csr);
BIO_free_all(bp_public);
BIO_free_all(bp_private);
EVP_PKEY_free(pKey);
BN_free(bne);
if(ret==1) {
Results.CSR = FileToString(CsrPath.path());
Results.PrivateKey = FileToString(PrivateKey.path());
Results.PublicKey = FileToString(PubKey.path());
}
return ret;
}
bool VerifyECKey(const std::string &key) {
try {
Poco::TemporaryFile F;
std::ofstream of(F.path().c_str(), std::ios_base::trunc | std::ios_base::out | std::ios_base::binary);
of << key;
of.close();
auto Key = Poco::SharedPtr<Poco::Crypto::ECKey>(
new Poco::Crypto::ECKey("", F.path(),""));
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
bool VerifyRSAKey([[
maybe_unused]] const std::string &key) {
try {
Poco::TemporaryFile F;
std::ofstream of(F.path().c_str(), std::ios_base::trunc | std::ios_base::out | std::ios_base::binary);
of << key;
of.close();
auto Key = Poco::SharedPtr<Poco::Crypto::RSAKey>(
new Poco::Crypto::RSAKey("", F.path(),""));
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
bool VerifyPrivateKey(const std::string &key) {
return VerifyECKey(key) || VerifyRSAKey(key);
}
bool ValidX509Certificate([[
maybe_unused]] const std::string &Cert) {
try {
Poco::TemporaryFile F;
std::ofstream of(F.path().c_str(), std::ios_base::trunc | std::ios_base::out | std::ios_base::binary);
of << Cert;
of.close();
auto Key = Poco::SharedPtr<Poco::Crypto::X509Certificate>(
new Poco::Crypto::X509Certificate(F.path()));
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
bool ValidX509Certificate([[
maybe_unused]] const std::vector<std::string> &Certs) {
auto F = [](const std::string &C) -> bool { return ValidX509Certificate(C); };
return std::all_of(Certs.begin(),Certs.end(), F);
}
std::string generateStrongPassword(int minLength, int maxLength, int numDigits, int minLowercase, int minSpecial, int minUppercase) {
// Define character sets for each category
const std::string lowercaseChars = "abcdefghijklmnopqrstuvwxyz";
const std::string uppercaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const std::string digitChars = "0123456789";
const std::string specialChars = "!@#$%^&*()_+[]{}|;:,.<>?";
// Check if parameters are valid
if (minLength < 1 || minLength > maxLength || minLowercase + minUppercase + numDigits + minSpecial > maxLength) {
return "Invalid parameters";
}
// Initialize random seed
std::random_device rd;
std::mt19937 g(rd());
// Initialize the password string
std::string password;
// Generate the required number of each character type
for (int i = 0; i < minLowercase; ++i) {
password += lowercaseChars[g() % lowercaseChars.length()];
}
for (int i = 0; i < minUppercase; ++i) {
password += uppercaseChars[g() % uppercaseChars.length()];
}
for (int i = 0; i < numDigits; ++i) {
password += digitChars[g() % digitChars.length()];
}
for (int i = 0; i < minSpecial; ++i) {
password += specialChars[g() % specialChars.length()];
}
// Calculate how many more characters are needed
int remainingLength = maxLength - (int)password.length();
// Generate random characters to fill the remaining length
for (int i = 0; i < remainingLength; ++i) {
int category = g() % 4; // Randomly select a category
if (category == 0) {
password += lowercaseChars[g() % lowercaseChars.length()];
} else if (category == 1) {
password += uppercaseChars[g() % uppercaseChars.length()];
} else if (category == 2) {
password += digitChars[g() % digitChars.length()];
} else {
password += specialChars[g() % specialChars.length()];
}
}
// Shuffle the password to randomize the character order
std::shuffle(password.begin(), password.end(),g);
return password;
}
// Function to query NAPTR records for a domain and return them in a vector
std::vector<NAPTRRecord> getNAPTRRecords(const std::string& domain) {
std::vector<NAPTRRecord> naptrRecords;
unsigned char buf[4096];
ns_msg handle;
ns_initparse(buf, NS_PACKETSZ, &handle);
// Query NAPTR records for the given domain
int response = res_query(domain.c_str(), ns_c_in, ns_t_naptr, buf, sizeof(buf));
if (response < 0) {
return naptrRecords;
}
if(ns_initparse(buf, response, &handle) < 0) {
return naptrRecords;
}
// Iterate through the DNS response and extract NAPTR records
int count = ns_msg_count(handle, ns_s_an);
for (int i = 0; i < count; ++i) {
ns_rr rr;
if (ns_parserr(&handle, ns_s_an, i, &rr) == 0) {
char rdata[256];
ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata));
NAPTRRecord record;
std::istringstream os(rdata);
os >> record.name >> record.ttl >> record.rclass >> record.rtype >> record.order >> record.preference >> record.flags
>> record.service >> record.regexp >> record.replacement;
naptrRecords.push_back(record);
}
}
return naptrRecords;
}
std::vector<SrvRecord> getSRVRecords(const std::string& domain) {
std::vector<SrvRecord> srvRecords;
// Buffer to hold the DNS response
unsigned char buf[4096];
ns_msg handle;
ns_initparse(buf, NS_PACKETSZ, &handle);
// Query NAPTR records for the given domain
int response = res_query(domain.c_str(), ns_c_in, ns_t_srv, buf, sizeof(buf));
if (response < 0) {
std::cerr << "DNS query failed for " << domain << ": " << hstrerror(h_errno) << std::endl;
return srvRecords;
}
if(ns_initparse(buf, response, &handle) < 0) {
return srvRecords;
}
// Iterate through the DNS response and extract NAPTR records
int count = ns_msg_count(handle, ns_s_an);
for (int i = 0; i < count; ++i) {
ns_rr rr;
if (ns_parserr(&handle, ns_s_an, i, &rr) == 0) {
char rdata[256];
ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata));
SrvRecord record;
std::istringstream os(rdata);
os >> record.name >> record.ttl >> record.rclass >> record.rtype >> record.pref >> record.weight >>
record.port >> record.srvname ;
srvRecords.push_back(record);
}
}
return srvRecords;
}
} // namespace OpenWifi::Utils

View File

@@ -13,6 +13,8 @@
#include <string>
#include <thread>
#include <dirent.h>
#include "Poco/Base64Decoder.h"
#include "Poco/Base64Encoder.h"
#include "Poco/File.h"
@@ -68,8 +70,10 @@ namespace OpenWifi::Utils {
};
[[nodiscard]] bool ValidSerialNumber(const std::string &Serial);
[[nodiscard]] bool ValidSerialNumbers(const std::vector<std::string> &Serial);
[[nodiscard]] bool ValidUUID(const std::string &UUID);
[[nodiscard]] bool ValidHostname(const std::string &hostname);
[[nodiscard]] bool ValidNumber(const std::string &number, bool isSigned);
template <typename... Args> std::string ComputeHash(Args &&...args) {
Poco::SHA2Engine E;
@@ -146,4 +150,171 @@ namespace OpenWifi::Utils {
bool ExtractBase64CompressedData(const std::string &CompressedData,
std::string &UnCompressedData, uint64_t compress_sz);
inline bool match(const char* first, const char* second)
{
// If we reach at the end of both strings, we are done
if (*first == '\0' && *second == '\0')
return true;
// Make sure to eliminate consecutive '*'
if (*first == '*') {
while (*(first + 1) == '*')
first++;
}
// Make sure that the characters after '*' are present
// in second string. This function assumes that the
// first string will not contain two consecutive '*'
if (*first == '*' && *(first + 1) != '\0'
&& *second == '\0')
return false;
// If the first string contains '?', or current
// characters of both strings match
if (*first == '?' || *first == *second)
return match(first + 1, second + 1);
// If there is *, then there are two possibilities
// a) We consider current character of second string
// b) We ignore current character of second string.
if (*first == '*')
return match(first + 1, second)
|| match(first, second + 1);
return false;
}
static inline std::uint64_t GetValue(FILE *file) {
unsigned long v=0;
char factor[32];
if(fscanf(file, " %lu %31s", &v, factor)==2) {
switch (factor[0]) {
case 'k':
return v * 1000;
case 'M':
return v * 1000000;
case 'G':
return v * 1000000000;
}
}
return v;
}
inline bool getMemory(
std::uint64_t &currRealMem, std::uint64_t &peakRealMem,
std::uint64_t &currVirtMem, std::uint64_t &peakVirtMem) {
// stores each word in status file
char buffer[1024] = "";
currRealMem = peakRealMem = currVirtMem = peakVirtMem = 0;
// linux file contains this-process info
FILE * file = std::fopen("/proc/self/status", "r");
if (file == nullptr) {
return false;
}
// read the entire file, recording mems in kB
while (fscanf(file, " %1023s", buffer) == 1) {
if (strcmp(buffer, "VmRSS:") == 0) {
currRealMem= GetValue(file);
} else if (strcmp(buffer, "VmHWM:") == 0) {
peakRealMem= GetValue(file);
} else if (strcmp(buffer, "VmSize:") == 0) {
currVirtMem= GetValue(file);
} else if (strcmp(buffer, "VmPeak:") == 0) {
peakVirtMem= GetValue(file);
}
}
fclose(file);
return true;
}
inline int get_open_fds() {
DIR *dp = opendir("/proc/self/fd");
struct dirent *de;
int count = -3; // '.', '..', dp
if (dp == nullptr)
return -1;
while ((de = readdir(dp)) != nullptr)
count++;
(void)closedir(dp);
return count;
}
inline std::uint32_t IPtoInt(const std::string &A) {
Poco::Net::IPAddress IP;
std::uint32_t Result=0;
if(Poco::Net::IPAddress::tryParse(A,IP)) {
for(const auto i:IP.toBytes()) {
Result <<= 8;
Result += i;
}
}
return Result;
}
inline bool ValidIP(const std::string &IPstr) {
Poco::Net::IPAddress IP;
return Poco::Net::IPAddress::tryParse(IPstr,IP);
}
struct CSRCreationParameters {
std::string Country, Province, City,
Organization, CommonName;
int bits=2048;
};
struct CSRCreationResults {
std::string CSR, PublicKey, PrivateKey;
};
bool CreateX509CSR(const CSRCreationParameters & Parameters, CSRCreationResults & Results);
std::string generateStrongPassword(int minLength, int maxLength, int numDigits, int minLowercase, int minSpecial, int minUppercase);
bool VerifyECKey(const std::string &key);
bool VerifyRSAKey(const std::string &key);
bool VerifyPrivateKey(const std::string &key);
bool ValidX509Certificate(const std::string &Cert);
bool ValidX509Certificate(const std::vector<std::string> &Certs);
struct NAPTRRecord {
std::string name;
std::string ttl;
std::string rclass;
std::string rtype;
uint32_t order=0;
uint32_t preference=0;
std::string flags;
std::string service;
std::string regexp;
std::string replacement;
};
// Function to query NAPTR records for a domain and return them in a vector
std::vector<NAPTRRecord> getNAPTRRecords(const std::string& domain);
struct SrvRecord {
std::string name;
std::string ttl;
std::string rclass;
std::string rtype;
uint32_t pref = 0;
uint32_t weight = 0;
uint32_t port = 0;
std::string srvname;
};
std::vector<SrvRecord> getSRVRecords(const std::string& domain);
struct HostNameServerResult{
std::string Hostname;
uint32_t Port;
};
} // namespace OpenWifi::Utils

View File

@@ -135,7 +135,7 @@ createsim() {
echo "Simulation file is not passed as an argument. Please pass the simulation. To get example simulation definition, run 'examplesim' command and check 'example-sim.json' file"
exit 1
else
curl ${FLAGS} -X POST "https://${OWLS}/api/v1/simulation" \
curl ${FLAGS} -X POST "https://${OWLS}/api/v1/simulation/0" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \
-H "accept: application/json" \
@@ -145,7 +145,7 @@ createsim() {
}
listsims() {
testargcount 0 #$
testargcount 0 $#
curl ${FLAGS} -X GET "https://${OWLS}/api/v1/simulation/*" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
@@ -153,7 +153,7 @@ listsims() {
}
getsim() {
testargcount 1 #$
testargcount 1 $#
curl ${FLAGS} -X GET "https://${OWLS}/api/v1/simulation/$1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
@@ -161,7 +161,7 @@ getsim() {
}
deletesim() {
testargcount 1 #$
testargcount 1 $#
curl ${FLAGS} -X DELETE "https://${OWLS}/api/v1/simulation?id=$1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
@@ -169,7 +169,7 @@ deletesim() {
}
startsim() {
testargcount 1 #$
testargcount 1 $#
curl ${FLAGS} -X POST "https://${OWLS}/api/v1/operation/$1?operation=start" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
@@ -177,7 +177,7 @@ startsim() {
}
stopsim() {
testargcount 2 #$
testargcount 2 $#
curl ${FLAGS} -X POST "https://${OWLS}/api/v1/operation/$1?operation=stop&runningId=$2" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
@@ -185,7 +185,7 @@ stopsim() {
}
cancelsim() {
testargcount 2 #$
testargcount 2 $#
curl ${FLAGS} -X POST "https://${OWLS}/api/v1/operation/$1?operation=cancel" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
@@ -193,7 +193,7 @@ cancelsim() {
}
getsimstats() {
testargcount 1 #$
testargcount 1 $#
curl ${FLAGS} -X GET "https://${OWLS}/api/v1/status/$1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
@@ -201,7 +201,7 @@ getsimstats() {
}
liststatuses() {
testargcount 0 #$
testargcount 0 $#
curl ${FLAGS} -X GET "https://${OWLS}/api/v1/status/*" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
@@ -209,7 +209,7 @@ liststatuses() {
}
results() {
testargcount 1 #$
testargcount 1 $#
curl ${FLAGS} -X GET "https://${OWLS}/api/v1/results/$1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}