Compare commits

...

374 Commits

Author SHA1 Message Date
TIP Automation User
70299b0238 Chg: update image tag in helm values to v2.8.0 2023-01-03 21:56:50 +00:00
TIP Automation User
3101cb1205 Chg: update image tag in helm values to v2.8.0-RC3 2022-12-20 20:40:47 +00:00
Stephane Bourque
cb5613ce7f Merge pull request #308 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-20 11:07:59 -08:00
Stephane Bourque
45b25c4e75 Merge pull request #307 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-20 10:07:01 -08:00
stephb9959
ea311f70a0 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 09:03:59 -08:00
stephb9959
e3265c86a5 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 08:46:44 -08:00
stephb9959
e537259208 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 08:46:34 -08:00
stephb9959
b9c7990344 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 00:02:11 -08:00
stephb9959
d5c1cfe2f1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-20 00:00:18 -08:00
stephb9959
1a4f27cbbf https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 23:44:44 -08:00
stephb9959
11ad381534 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 23:35:26 -08:00
stephb9959
0b548a40f3 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 23:16:08 -08:00
stephb9959
28e5463196 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 23:13:03 -08:00
stephb9959
37ea632ac7 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:52:08 -08:00
stephb9959
2f641077e6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:49:47 -08:00
stephb9959
78318f47c6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:38:21 -08:00
stephb9959
c83c73a3ae https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:31:47 -08:00
stephb9959
6305be8c55 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:20:45 -08:00
stephb9959
4b325ef22c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 22:09:01 -08:00
stephb9959
a422dff7ae https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 21:57:06 -08:00
stephb9959
271ff4f6c4 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 21:45:17 -08:00
stephb9959
4cdd275d0b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 21:18:41 -08:00
stephb9959
9a36e86949 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 18:16:35 -08:00
stephb9959
fa806ed16c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 17:43:34 -08:00
stephb9959
57c270973e https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 17:43:10 -08:00
stephb9959
17ebfb24f2 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 14:41:29 -08:00
stephb9959
26072691ab https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 14:30:36 -08:00
stephb9959
e8b3ea56e0 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 14:17:50 -08:00
stephb9959
2b1a72b838 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 14:10:19 -08:00
stephb9959
352afc487a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 13:57:37 -08:00
stephb9959
6fae29981a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 13:46:05 -08:00
stephb9959
9569de1b21 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 12:05:56 -08:00
stephb9959
1a952946b2 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-19 11:36:14 -08:00
stephb9959
3b52cf6111 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 23:43:00 -08:00
stephb9959
74197e2aee https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 22:15:17 -08:00
stephb9959
7152067b09 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 21:56:26 -08:00
stephb9959
ac3d061eee https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 21:47:45 -08:00
stephb9959
8ee67713bf https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 21:36:54 -08:00
stephb9959
e57cd4fea2 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 21:30:30 -08:00
stephb9959
5e3a71a6e7 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:23:00 -08:00
stephb9959
a602b8f844 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:15:01 -08:00
stephb9959
89da7d187a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:10:16 -08:00
stephb9959
6c5533aa8b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:05:59 -08:00
stephb9959
66249b258c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 20:00:36 -08:00
stephb9959
e03512ebf3 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:50:37 -08:00
stephb9959
b152c8477a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:40:52 -08:00
stephb9959
a298c4254b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:33:11 -08:00
stephb9959
b8f04c6d4a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:28:10 -08:00
stephb9959
753dc5c068 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:23:26 -08:00
stephb9959
bf70d6b512 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:17:55 -08:00
stephb9959
760f11ca70 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:08:52 -08:00
stephb9959
2bcd0ccbcb https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:05:37 -08:00
stephb9959
0aee258af4 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 19:02:13 -08:00
stephb9959
9e879f306c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 18:58:41 -08:00
stephb9959
fb4a4d935a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 18:55:40 -08:00
stephb9959
282552cdfa https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 17:55:05 -08:00
stephb9959
1d316ff28a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 17:50:15 -08:00
stephb9959
1da866a7da https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 17:44:45 -08:00
stephb9959
1c628c28fa https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 16:17:07 -08:00
stephb9959
a350b30a9c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 16:10:48 -08:00
stephb9959
cf6c3f9337 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-18 15:56:40 -08:00
stephb9959
2388eac41d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 08:33:34 -08:00
stephb9959
f0e0f2ba5b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 08:28:53 -08:00
stephb9959
0c8b9caaf3 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 08:11:33 -08:00
stephb9959
c0edeb8b23 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 08:02:00 -08:00
stephb9959
fdcf74788d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:59:20 -08:00
stephb9959
df9c82a4ae https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:37:37 -08:00
stephb9959
2963cec1fb https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:32:37 -08:00
stephb9959
8053e32c9c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:24:13 -08:00
stephb9959
1750ac5fb5 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:12:18 -08:00
stephb9959
b4d775db0c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 07:03:09 -08:00
stephb9959
3031483209 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 06:55:52 -08:00
stephb9959
97b990581d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-17 06:47:52 -08:00
stephb9959
98fa4799cc https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 23:32:34 -08:00
stephb9959
95a853fc0e https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:58:49 -08:00
stephb9959
7a14cadbf5 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:56:45 -08:00
stephb9959
ab5efcc8c1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:52:05 -08:00
stephb9959
bb71ff2bad https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:34:27 -08:00
stephb9959
c1a2efd32c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 22:11:10 -08:00
stephb9959
ca4d92fd66 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 16:21:32 -08:00
stephb9959
efb354031a https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 16:18:32 -08:00
stephb9959
180d01c89d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 15:37:22 -08:00
stephb9959
f6c1a5e97f https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 15:29:58 -08:00
stephb9959
54e7caafc1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 15:20:24 -08:00
stephb9959
e76c97540c https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 15:09:09 -08:00
stephb9959
3f01ef6d5e https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:57:12 -08:00
stephb9959
8e118c7f7b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:55:29 -08:00
stephb9959
6dc5622bf2 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:50:49 -08:00
stephb9959
27a9ef01b6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:38:38 -08:00
stephb9959
9390b9a646 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:25:20 -08:00
stephb9959
871f3c3436 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:16:19 -08:00
stephb9959
a41095a797 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:13:24 -08:00
stephb9959
bb94c9a813 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 14:02:13 -08:00
stephb9959
fcd991b8d6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 13:56:05 -08:00
stephb9959
2df43cfd62 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 13:48:15 -08:00
stephb9959
014aafbd3d https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 13:42:49 -08:00
stephb9959
d1d058a848 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 12:34:21 -08:00
stephb9959
d492396182 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 12:30:55 -08:00
stephb9959
2c710412a1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 12:16:27 -08:00
stephb9959
7dcade3d79 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 12:08:33 -08:00
stephb9959
dc73a2d54b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 11:57:31 -08:00
Stephane Bourque
6c2bb5b395 Merge pull request #306 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 11:39:49 -08:00
stephb9959
fccf99cca5 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 11:39:19 -08:00
Stephane Bourque
0d91dd9a6e Merge pull request #305 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 11:14:13 -08:00
stephb9959
d84af0f18e https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 11:13:38 -08:00
Stephane Bourque
6b6c9ce0ae Merge pull request #304 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 10:11:31 -08:00
stephb9959
5a31d6427f https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 10:10:36 -08:00
Stephane Bourque
8b3ff4a560 Merge pull request #303 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 09:34:19 -08:00
stephb9959
53c81d2c76 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 09:33:25 -08:00
Stephane Bourque
518bfc0b2c Merge pull request #302 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 08:57:49 -08:00
stephb9959
c6851819d4 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 08:56:37 -08:00
Stephane Bourque
d5851753c2 Merge pull request #301 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-16 08:04:23 -08:00
stephb9959
379b1446f6 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-16 08:03:27 -08:00
TIP Automation User
86a254e1b3 Chg: update image tag in helm values to v2.8.0-RC2 2022-12-16 14:51:51 +00:00
Stephane Bourque
de260ecddc Merge pull request #300 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-15 11:40:55 -08:00
Stephane Bourque
6d50ef72b7 Merge pull request #299 from Telecominfraproject/WIFI-11956
https://telecominfraproject.atlassian.net/browse/WIFI-11956
2022-12-15 11:39:58 -08:00
stephb9959
f0954081c1 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:57:38 -08:00
stephb9959
9653d0affb https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:51:03 -08:00
stephb9959
dd626461e8 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:39:32 -08:00
stephb9959
048b33e134 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:36:29 -08:00
stephb9959
eff7a70f6b https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 09:08:05 -08:00
stephb9959
5f73966010 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:52:35 -08:00
stephb9959
911c9ac210 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:30:07 -08:00
stephb9959
f59c369b61 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:26:13 -08:00
stephb9959
526d239fe9 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:20:11 -08:00
stephb9959
939d704460 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:08:47 -08:00
stephb9959
b7e8da5e76 https://telecominfraproject.atlassian.net/browse/WIFI-11956
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-15 08:07:44 -08:00
Stephane Bourque
ad20736a14 Merge pull request #298 from Telecominfraproject/master
https://telecominfraproject.atlassian.net/browse/WIFI-11974
2022-12-14 20:52:58 -08:00
Stephane Bourque
c5d68e5397 Merge pull request #297 from Telecominfraproject/WIFI-11974
https://telecominfraproject.atlassian.net/browse/WIFI-11974
2022-12-14 11:55:50 -08:00
stephb9959
a2bbe71e53 https://telecominfraproject.atlassian.net/browse/WIFI-11974
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-14 11:55:27 -08:00
Stephane Bourque
1c0cf65145 Merge pull request #296 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2022-12-14 11:40:53 -08:00
stephb9959
60d41e8569 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-14 11:32:43 -08:00
stephb9959
76698476b6 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-14 11:25:54 -08:00
Stephane Bourque
4e4ac89401 Merge pull request #295 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2022-12-13 23:53:56 -08:00
stephb9959
e3e6a27348 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-13 23:29:06 -08:00
stephb9959
b419472fd7 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-13 16:11:42 -08:00
TIP Automation User
8f43f5945d Chg: update image tag in helm values to v2.8.0-RC1 2022-12-13 23:08:38 +00:00
Dmitry Dunaev
bd2af4df1d Merge pull request #292 from Telecominfraproject/feature/wifi-11905--docker-certificates-allowmismatch
[WIFI-11905] Add: docker option to set openwifi.certificates.allowmismatch
2022-12-13 20:09:35 +03:00
Dmitry Dunaev
bbbb4cd4fe [WIFI-11905] Chg: CERTIFICATES_ALLOWMISMATCH to false by def
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-12-13 17:08:24 +01:00
Stephane Bourque
445568152c Merge pull request #294 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2022-12-13 07:03:42 -08:00
stephb9959
ce70ff0f21 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-13 07:03:11 -08:00
Stephane Bourque
6dbf16793e Merge pull request #293 from Telecominfraproject/WIFI-11388
https://telecominfraproject.atlassian.net/browse/WIFI-11388
2022-12-12 13:21:17 -08:00
stephb9959
eba69c8c35 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 12:31:42 -08:00
stephb9959
ae2e6c5ce6 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 12:06:01 -08:00
stephb9959
5a2a0cd074 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 12:04:08 -08:00
stephb9959
9c3a23a8a1 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 12:02:46 -08:00
stephb9959
b6f0f07bec https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:44:05 -08:00
stephb9959
e060e11cd2 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:40:42 -08:00
stephb9959
883245de68 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:36:56 -08:00
stephb9959
9cfc411a51 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:32:36 -08:00
stephb9959
fb3a785227 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 11:28:20 -08:00
stephb9959
3fe8958323 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 10:17:42 -08:00
stephb9959
117f0e1637 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 10:15:17 -08:00
stephb9959
b09b1d5690 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 10:10:53 -08:00
stephb9959
e073e2b713 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 10:00:07 -08:00
stephb9959
8343443bd7 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 09:56:15 -08:00
stephb9959
c5ed66c40c https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 09:51:24 -08:00
stephb9959
de65b2396c https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-12 08:56:22 -08:00
Dmitry Dunaev
c85cef57c8 [WIFI-11905] Add: docker option to set openwifi.certificates.allowmismatch
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-12-12 13:36:03 +01:00
stephb9959
6c9bae518a https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-11 10:44:06 -08:00
stephb9959
7232168037 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-11 10:18:54 -08:00
stephb9959
9da06d8384 https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-11 09:45:47 -08:00
stephb9959
296a4721db https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-11 09:43:11 -08:00
stephb9959
f2badf7b6d https://telecominfraproject.atlassian.net/browse/WIFI-11388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 23:01:31 -08:00
Stephane Bourque
766be1aa3c Merge pull request #291 from Telecominfraproject/WIFI-11429
https://telecominfraproject.atlassian.net/browse/WIFI-11429
2022-12-10 10:24:19 -08:00
stephb9959
4812219e0d https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 10:20:36 -08:00
stephb9959
7b4e39aad2 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 10:08:43 -08:00
stephb9959
fbff951e22 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 10:08:14 -08:00
stephb9959
09198d5ec2 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 10:03:22 -08:00
stephb9959
3666995f7f https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 09:48:42 -08:00
stephb9959
0572674279 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:52:33 -08:00
stephb9959
19f2265161 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:40:09 -08:00
stephb9959
f613449dff https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:36:06 -08:00
stephb9959
a1291b1b16 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:31:22 -08:00
stephb9959
39ebc28396 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:25:53 -08:00
stephb9959
6017714363 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 08:20:29 -08:00
stephb9959
bff7092ce1 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-10 07:43:11 -08:00
stephb9959
1741742617 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 23:39:55 -08:00
stephb9959
b4a6bea1b4 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 23:37:18 -08:00
stephb9959
57e06b2d2f https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 23:24:24 -08:00
stephb9959
0bc7363dae https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 23:09:29 -08:00
stephb9959
44b2140230 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 22:58:44 -08:00
stephb9959
49bc934066 https://telecominfraproject.atlassian.net/browse/WIFI-11429
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 22:50:11 -08:00
Stephane Bourque
53d337f462 Merge pull request #290 from Telecominfraproject/WIFI-11333
https://telecominfraproject.atlassian.net/browse/WIFI-11333
2022-12-09 14:41:11 -08:00
stephb9959
66e7791b95 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 14:39:14 -08:00
stephb9959
2180c5ff23 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 14:10:59 -08:00
stephb9959
2f4fa7572e https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 13:39:47 -08:00
stephb9959
5923506237 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 13:38:58 -08:00
stephb9959
b9600654f8 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 13:35:11 -08:00
stephb9959
6b0a082ac9 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 12:17:52 -08:00
stephb9959
c5a108d672 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 11:59:46 -08:00
stephb9959
23c2925baf https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 11:55:14 -08:00
stephb9959
fa4c72d59c https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 11:42:54 -08:00
stephb9959
d66d901204 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 10:33:40 -08:00
stephb9959
b09eaf98cc https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-09 10:19:02 -08:00
Stephane Bourque
7f9bf85958 Merge pull request #289 from Telecominfraproject/WIFI-11909
https://telecominfraproject.atlassian.net/browse/WIFI-11909
2022-12-07 10:00:58 -08:00
stephb9959
d1d89fcd74 https://telecominfraproject.atlassian.net/browse/WIFI-11909
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-07 10:00:17 -08:00
Stephane Bourque
bc3f5700d4 Merge pull request #288 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11333
2022-12-07 09:45:25 -08:00
stephb9959
3a938fd615 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-07 09:44:18 -08:00
Stephane Bourque
dc3729aec2 Merge pull request #287 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11333
2022-12-07 08:37:33 -08:00
stephb9959
dd214ae5d1 https://telecominfraproject.atlassian.net/browse/WIFI-11333
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-07 08:36:48 -08:00
Stephane Bourque
8f7f8c5736 Merge pull request #286 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11869
2022-12-05 08:37:54 -08:00
stephb9959
00701a8de4 https://telecominfraproject.atlassian.net/browse/WIFI-11869
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-05 08:37:12 -08:00
Stephane Bourque
fc41c9aa2f Merge pull request #285 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11869
2022-12-05 08:36:40 -08:00
stephb9959
a5442eee0d https://telecominfraproject.atlassian.net/browse/WIFI-11869
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-05 08:35:14 -08:00
Stephane Bourque
9dcf5b5320 Merge pull request #284 from Telecominfraproject/WIFI-11869
https://telecominfraproject.atlassian.net/browse/WIFI-11869
2022-12-01 21:59:30 -08:00
stephb9959
28b5295a6e https://telecominfraproject.atlassian.net/browse/WIFI-11869
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 21:58:40 -08:00
stephb9959
8261ae34bd https://telecominfraproject.atlassian.net/browse/WIFI-11869
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 21:54:08 -08:00
Stephane Bourque
02baa9329c Merge pull request #283 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11865
2022-12-01 15:44:25 -08:00
stephb9959
7f01c7b861 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 12:25:49 -08:00
stephb9959
8d0f0c227a https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 11:00:52 -08:00
stephb9959
c8170bc9f3 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 10:53:22 -08:00
stephb9959
83003b66b9 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 10:34:14 -08:00
stephb9959
cbdb15bc32 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 10:23:16 -08:00
stephb9959
712e15407d https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 09:21:05 -08:00
stephb9959
e424e19d1c https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 08:44:01 -08:00
stephb9959
546d8dee98 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 08:26:34 -08:00
stephb9959
60b9fc679a https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 08:17:14 -08:00
Stephane Bourque
79a4f24bc2 Merge pull request #282 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11865
2022-12-01 07:47:04 -08:00
stephb9959
02b8ecf300 https://telecominfraproject.atlassian.net/browse/WIFI-11865
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 07:45:25 -08:00
stephb9959
bdbc5a7a9d https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 07:33:49 -08:00
Stephane Bourque
680fe18bac Merge pull request #281 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11779
2022-12-01 06:59:22 -08:00
stephb9959
dd08b2e426 https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 06:57:56 -08:00
stephb9959
285b1630ee https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 06:55:09 -08:00
stephb9959
fdcaf9054f https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 06:41:27 -08:00
stephb9959
65b5585797 https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 06:39:56 -08:00
stephb9959
b31fdb202c https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-12-01 05:16:07 -08:00
Dmitry Dunaev
d13d906d11 [WIFI-11729] Fix: doc generation error
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-12-01 13:17:10 +03:00
Stephane Bourque
6a403ac916 Merge pull request #280 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11779
2022-11-30 21:59:40 -08:00
stephb9959
eff54e3202 https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 21:53:44 -08:00
Stephane Bourque
0a7dd7c3f7 Merge pull request #279 from Telecominfraproject/WIFI-11430
https://telecominfraproject.atlassian.net/browse/WIFI-11430
2022-11-30 16:21:00 -08:00
stephb9959
cf7f962ed1 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 16:19:53 -08:00
stephb9959
f412df29b5 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 16:16:13 -08:00
stephb9959
31204bae6a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 15:33:52 -08:00
stephb9959
a57cf08c00 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 11:43:22 -08:00
stephb9959
c0171156fa https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 11:38:27 -08:00
stephb9959
a456e95139 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-30 11:34:53 -08:00
stephb9959
7f8e2d0f7f https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 22:34:31 -08:00
stephb9959
d80aa68c40 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 22:06:12 -08:00
stephb9959
81c9090ec9 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 22:03:26 -08:00
stephb9959
0fa5c46f4b https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 21:54:20 -08:00
stephb9959
d75977140a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:30:22 -08:00
stephb9959
b65440ba4e https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:26:45 -08:00
stephb9959
ee15f8b8c2 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:22:45 -08:00
stephb9959
aebf8ba783 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:18:35 -08:00
stephb9959
9f2436b123 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:17:32 -08:00
stephb9959
cd774ea2df https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:13:46 -08:00
stephb9959
007f54bc26 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 14:09:36 -08:00
stephb9959
9c03f3a9e3 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 13:45:09 -08:00
stephb9959
292365a837 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 13:36:05 -08:00
stephb9959
1091478e11 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-29 13:22:52 -08:00
Stephane Bourque
47b94b3c5a Merge pull request #278 from Telecominfraproject/WIFI-11779
https://telecominfraproject.atlassian.net/browse/WIFI-11779
2022-11-28 14:54:42 -08:00
stephb9959
7cd62e7b26 https://telecominfraproject.atlassian.net/browse/WIFI-11779
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-28 14:54:04 -08:00
Stephane Bourque
3397f2407a Merge pull request #277 from Telecominfraproject/WIFI-11778
https://telecominfraproject.atlassian.net/browse/WIFI-11778
2022-11-28 11:44:47 -08:00
stephb9959
52799659c8 https://telecominfraproject.atlassian.net/browse/WIFI-11778
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-28 11:43:13 -08:00
Stephane Bourque
86e88942b0 Merge pull request #276 from Telecominfraproject/WIFI-11777
https://telecominfraproject.atlassian.net/browse/WIFI-11777
2022-11-28 11:19:55 -08:00
stephb9959
11592ebb98 https://telecominfraproject.atlassian.net/browse/WIFI-11777
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-28 11:19:01 -08:00
Stephane Bourque
83f4bfc53d Merge pull request #275 from Telecominfraproject/WIFI-11754
https://telecominfraproject.atlassian.net/browse/WIFI-11755
2022-11-27 21:47:01 -08:00
stephb9959
43ed818015 https://telecominfraproject.atlassian.net/browse/WIFI-11755
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-27 21:24:26 -08:00
stephb9959
fd7f5b991a https://telecominfraproject.atlassian.net/browse/WIFI-11755
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-27 14:31:26 -08:00
Stephane Bourque
feebcb339a Merge pull request #274 from Telecominfraproject/WIFI-11754
https://telecominfraproject.atlassian.net/browse/WIFI-11754
2022-11-27 14:13:30 -08:00
stephb9959
0368d4e435 https://telecominfraproject.atlassian.net/browse/WIFI-11754
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-27 14:12:26 -08:00
Stephane Bourque
a57bad5bb9 Merge pull request #273 from Telecominfraproject/WIFI-11430
https://telecominfraproject.atlassian.net/browse/WIFI-11430
2022-11-27 13:56:47 -08:00
Dmitry Dunaev
a0ee1a40d4 [WIFI-11729] Fix: branch set for pages pushing
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-11-25 22:00:37 +03:00
Dmitry Dunaev
5c5aa3551b [WIFI-11729] Fix: pages generation
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-11-25 21:59:10 +03:00
Dmitry Dunaev
bd7daf4072 Merge pull request #272 from Telecominfraproject/feature/wifi-11729--openapi-gh-pages
[WIFI-11729] Add: workflow to generate OpenAPI docs
2022-11-25 21:48:14 +03:00
Dmitry Dunaev
dad844795f [WIFI-11729] Add: workflow to generate OpenAPI docs
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-11-25 21:47:59 +03:00
stephb9959
1ef20f232a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-25 07:59:17 -08:00
stephb9959
78deaf8b38 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-25 07:53:35 -08:00
Johann Hoffmann
41107af0d0 Merge pull request #271 from Telecominfraproject/WIFI-11419-patch-workflows
[WIFI-11419] Patch workflows with regard to deprecated Github actions commands
2022-11-25 15:26:35 +01:00
stephb9959
a1aec29ffd https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:57:50 -08:00
stephb9959
07dc8617a4 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:50:27 -08:00
stephb9959
34cef1ae0a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:17:22 -08:00
stephb9959
144841d88d https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:11:59 -08:00
stephb9959
b46a713968 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 11:01:08 -08:00
stephb9959
4ec7c30e28 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 09:53:33 -08:00
stephb9959
16c5825e3a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-24 08:04:24 -08:00
stephb9959
0f1129e51e https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 22:18:00 -08:00
stephb9959
3e54201be8 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:39:06 -08:00
stephb9959
c34fba4c22 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:28:51 -08:00
stephb9959
625f8c7a2b https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:22:28 -08:00
stephb9959
41a4a98c0a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:12:36 -08:00
stephb9959
c858d954a9 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:04:14 -08:00
stephb9959
aa0410edb3 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:02:21 -08:00
stephb9959
97cb61b7cf https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 12:00:17 -08:00
stephb9959
0408d98538 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-23 11:53:25 -08:00
stephb9959
69e2f9640e https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-22 22:10:46 -08:00
stephb9959
efd20dc370 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-22 08:21:35 -08:00
stephb9959
7a42598150 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-22 07:57:35 -08:00
stephb9959
7a45d96d9a https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-22 07:28:20 -08:00
Johann Hoffmann
468a2553f8 Update checkout action version and replace set-output commands
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-11-22 11:54:46 +01:00
stephb9959
a4f7ccdba1 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 16:04:36 -08:00
stephb9959
a0b47aa4b3 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 15:43:39 -08:00
stephb9959
ee6dd54ab3 https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 15:39:52 -08:00
stephb9959
518ca7cc9d https://telecominfraproject.atlassian.net/browse/WIFI-11430
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 15:29:36 -08:00
stephb9959
37053a40b7 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 09:16:06 -08:00
stephb9959
7eff8c9699 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-21 07:38:30 -08:00
stephb9959
49d9030bf4 https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-20 13:12:37 -08:00
stephb9959
9e741c0348 https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-19 22:25:24 -08:00
stephb9959
95dc3c1a6c https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-19 22:19:20 -08:00
stephb9959
2fa7081f3f https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-19 21:32:24 -08:00
stephb9959
288773a727 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-18 19:52:37 -08:00
stephb9959
06079115e6 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-18 07:45:39 -08:00
stephb9959
5db21677dc https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-17 21:23:18 -08:00
stephb9959
5c7db88f10 https://telecominfraproject.atlassian.net/browse/WIFI-11691
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-17 21:02:45 -08:00
stephb9959
0060e81fae https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-17 11:35:33 -08:00
stephb9959
1a6bf2d71b https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 22:49:46 -08:00
stephb9959
59a6de92d0 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:31:30 -08:00
stephb9959
b7b013f669 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:18:07 -08:00
stephb9959
d8be1eca90 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:14:18 -08:00
stephb9959
d04f8965c3 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:03:57 -08:00
stephb9959
ffdbe6f4da https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-16 10:01:28 -08:00
stephb9959
fafa915613 https://telecominfraproject.atlassian.net/browse/WIFI-11620
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-15 10:24:06 -08:00
stephb9959
f5f0af0dcd https://telecominfraproject.atlassian.net/browse/WIFI-11251
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 23:55:27 -08:00
stephb9959
23eb4d6b0b https://telecominfraproject.atlassian.net/browse/WIFI-11251
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 23:52:30 -08:00
stephb9959
f9d6020c4f https://telecominfraproject.atlassian.net/browse/WIFI-11251
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 23:28:22 -08:00
stephb9959
b9dfbdd5e8 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 13:53:47 -08:00
stephb9959
8f9d708285 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-14 10:09:18 -08:00
stephb9959
05b06d3eac https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-13 22:01:12 -08:00
stephb9959
8b68ab8ac7 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-10 23:39:44 -08:00
stephb9959
80021d520f https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-10 23:32:52 -08:00
stephb9959
363cfa1998 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-10 23:13:58 -08:00
stephb9959
9ea1a5cde6 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-10 23:04:45 -08:00
stephb9959
faeb6bf6b8 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-09 22:49:55 -08:00
stephb9959
1917b1346b https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-09 22:48:14 -08:00
stephb9959
3feaf9221d https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-08 23:07:31 -08:00
stephb9959
943b735150 Merge remote-tracking branch 'origin/master' 2022-11-08 23:07:20 -08:00
stephb9959
02ce04261d https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-08 23:07:10 -08:00
Dmitry Dunaev
eae5f4f5f9 Merge pull request #270 from Telecominfraproject/fix/wifi-11490--git-hash
[WIFI-11490] Fix: Get Git hash command in CMakeLists
2022-11-08 13:42:16 +03:00
Dmitry Dunaev
8ec8a02924 [WIFI-11490] Fix: Get Git hash command in CMakeLists
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-11-08 13:07:22 +03:00
stephb9959
12c34ef63d https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 15:31:34 -08:00
stephb9959
a54848b636 https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:58:49 -08:00
stephb9959
35c09940b4 https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:34:18 -08:00
stephb9959
cb4fdaab28 https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:25:12 -08:00
stephb9959
3501de22ed https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:08:00 -08:00
stephb9959
1f59fccc97 https://telecominfraproject.atlassian.net/browse/WIFI-10918
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 14:01:48 -08:00
stephb9959
4307d23b00 https://telecominfraproject.atlassian.net/browse/WIFI-11542
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-07 10:59:13 -08:00
stephb9959
b83345c91a https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-04 11:42:31 -07:00
stephb9959
76feb208bc https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 12:19:23 -07:00
stephb9959
efa49593da https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 10:44:27 -07:00
stephb9959
361d6fa22f https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 09:53:04 -07:00
stephb9959
f7d1b8f972 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 09:16:36 -07:00
stephb9959
a9afc2dc2b https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-03 08:56:44 -07:00
stephb9959
8d949b97ea https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 22:54:47 -07:00
stephb9959
0d5a07ffe1 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 22:30:11 -07:00
stephb9959
11972c2511 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 21:37:32 -07:00
stephb9959
3081efebd8 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:07:09 -07:00
stephb9959
b27039dcc8 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:05:08 -07:00
stephb9959
847f107ac2 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:03:14 -07:00
stephb9959
ec9766a544 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:01:47 -07:00
stephb9959
7bdc148063 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 16:00:00 -07:00
stephb9959
7284e9f100 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:53:55 -07:00
stephb9959
03ecfbea25 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:49:44 -07:00
stephb9959
eb1716e078 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:46:50 -07:00
stephb9959
b11b8a2f22 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:43:30 -07:00
stephb9959
845bb37c8c https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:29:49 -07:00
stephb9959
6f9f6495a0 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:21:57 -07:00
stephb9959
04ef327a86 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:20:50 -07:00
stephb9959
913b595587 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:16:39 -07:00
stephb9959
7628af35ba https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:14:14 -07:00
stephb9959
cad8b7752b https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 15:10:54 -07:00
stephb9959
7175546f54 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 14:50:38 -07:00
stephb9959
6186f46ec2 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 14:48:35 -07:00
stephb9959
2413867bf3 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 14:46:21 -07:00
stephb9959
545c539a08 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 12:30:49 -07:00
stephb9959
b0cfed809f https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 12:23:10 -07:00
stephb9959
d5502e1527 https://telecominfraproject.atlassian.net/browse/WIFI-11434
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-02 09:36:16 -07:00
stephb9959
714d02060c Merge remote-tracking branch 'origin/master' 2022-11-01 09:03:02 -07:00
stephb9959
c8d0739692 https://telecominfraproject.atlassian.net/browse/WIFI-11434
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-01 09:02:53 -07:00
stephb9959
d4b9d61e2b https://telecominfraproject.atlassian.net/browse/WIFI-11434
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-11-01 09:02:37 -07:00
stephb9959
1f7f2f64ad https://telecominfraproject.atlassian.net/browse/WIFI-11433
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 14:53:00 -07:00
stephb9959
f26ca31dbc https://telecominfraproject.atlassian.net/browse/WIFI-11433
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 14:42:15 -07:00
stephb9959
92b6edc9a4 https://telecominfraproject.atlassian.net/browse/WIFI-11432
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 14:34:47 -07:00
stephb9959
e1a2b46333 https://telecominfraproject.atlassian.net/browse/WIFI-11303
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-31 10:45:41 -07:00
142 changed files with 7821 additions and 5088 deletions

View File

@@ -4,4 +4,4 @@ TabWidth: 4
IndentWidth: 4
UseTab: Always
ColumnLimit: 100
Language: Cpp
Language: Cpp

View File

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

View File

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

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

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

View File

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

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.13)
project(owgw VERSION 2.7.1)
project(owgw VERSION 2.8.0)
set(CMAKE_CXX_STANDARD 17)
@@ -39,12 +39,12 @@ endif()
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --tags
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_HASH)
if(NOT GIT_RESULT EQUAL "0")
message(FATAL_ERROR "git describe --always --tags failed with ${GIT_RESULT}")
message(FATAL_ERROR "git rev-parse --short HEAD failed with ${GIT_RESULT}")
endif()
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
endif()
@@ -115,6 +115,7 @@ add_executable( owgw
src/framework/RESTAPI_IntServer.h
src/framework/RESTAPI_SystemCommand.h
src/framework/RESTAPI_WebSocketServer.h
src/framework/RESTAPI_SystemConfiguration.h
src/framework/EventBusManager.cpp
src/framework/EventBusManager.h
src/framework/RESTAPI_PartHandler.h
@@ -164,10 +165,6 @@ add_executable( owgw
src/CapabilitiesCache.h src/FindCountry.h
src/rttys/RTTYS_server.cpp
src/rttys/RTTYS_server.h
src/rttys/RTTYS_device.cpp
src/rttys/RTTYS_device.h
src/rttys/RTTYS_ClientConnection.cpp
src/rttys/RTTYS_ClientConnection.h
src/rttys/RTTYS_WebServer.cpp
src/rttys/RTTYS_WebServer.h src/RESTAPI/RESTAPI_device_helper.h
src/SDKcalls.cpp
@@ -198,7 +195,7 @@ add_executable( owgw
src/AP_WS_Process_telemetry.cpp
src/AP_WS_Process_venuebroadcast.cpp
src/RADSEC_server.h
src/UI_GW_WebSocketNotifications.cpp src/UI_GW_WebSocketNotifications.h)
src/UI_GW_WebSocketNotifications.cpp src/UI_GW_WebSocketNotifications.h src/framework/RESTAPI_SystemConfiguration.h src/ScriptManager.cpp src/ScriptManager.h src/RESTAPI/RESTAPI_scripts_handler.cpp src/RESTAPI/RESTAPI_scripts_handler.h src/RESTAPI/RESTAPI_script_handler.cpp src/RESTAPI/RESTAPI_script_handler.h src/storage/storage_scripts.cpp src/storage/storage_scripts.h src/SignatureMgr.cpp src/SignatureMgr.h)
if(NOT SMALL_BUILD)
@@ -222,4 +219,4 @@ if(NOT SMALL_BUILD)
if(UNIX AND NOT APPLE)
target_link_libraries(owgw PUBLIC PocoJSON)
endif()
endif()
endif()

View File

@@ -1,5 +1,5 @@
ARG DEBIAN_VERSION=11.5-slim
ARG POCO_VERSION=poco-tip-v1
ARG POCO_VERSION=poco-tip-v2
ARG CPPKAFKA_VERSION=tip-v1
ARG JSON_VALIDATOR_VERSION=2.1.0
@@ -101,7 +101,7 @@ RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentr
COPY --from=owgw-build /owgw/cmake-build/owgw /openwifi/owgw
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib /usr/local/lib/
COPY --from=poco-build /poco/cmake-build/lib /usr/local/lib
COPY --from=poco-build /poco/cmake-build/lib /usr/local/lib/
RUN ldconfig

View File

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

View File

@@ -298,7 +298,8 @@ Controller sends this command when it believes the device should upgrade its fir
"params" : {
"serial" : <serial number> ,
"when" : Optional - <UTC time when to upgrade the firmware, 0 mean immediate, this is a suggestion>,
"uri" : <URI to download the firmware>
"uri" : <URI to download the firmware>,
"FWsignature" : <string representation of the signature for the FW> (optional)
},
"id" : <some number>
}
@@ -318,6 +319,13 @@ The device should answer:
"id" : <same number>
}
```
Here are the error values
```text
0: No error
1: Bad firmware
2: Missing signature
```
#### Controller wants the device to perform a factory reset
Controller sends this command when it believes the device should upgrade its firmware.
@@ -673,9 +681,11 @@ Controller sends this command to run a predefined script. Extreme care must be t
"method" : "script" ,
"params" : {
"serial" : <serial number>,
"type" : <one of "shell", "ucode">,
"script" : <text blob containing the script>,
"timeout" : <max timeout in seconds, default is 30>,
"type" : <one of "shell", "ucode", "bundle">,
"script" : <text blob containing the script, This must be vase64 encoded>,
"timeout" : <max timeout in seconds, default is 30, unused if URI is supplied>,
"uri": "<upload script results using this URI>",
"signature" : "<signature for script>: must be supplied to restricted devices",
"when" : <time when this will be performed as UTC seconds>
},
"id" : <some number>

82
RESTRICTED_DEVICES.md Normal file
View File

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

View File

View File

View File

View File

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

View File

View File

View File

View File

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

View File

View File

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

View File

View File

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

1
ap_scripts/README.md Normal file
View File

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

2
build
View File

@@ -1 +1 @@
41
94

View File

@@ -73,6 +73,7 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
STORAGE_TYPE_MYSQL_PASSWORD=${STORAGE_TYPE_MYSQL_PASSWORD:-"owgw"} \
STORAGE_TYPE_MYSQL_DATABASE=${STORAGE_TYPE_MYSQL_DATABASE:-"owgw"} \
STORAGE_TYPE_MYSQL_PORT=${STORAGE_TYPE_MYSQL_PORT:-"3306"} \
CERTIFICATES_ALLOWMISMATCH=${CERTIFICATES_ALLOWMISMATCH:-"false"} \
envsubst < /owgw.properties.tmpl > $OWGW_CONFIG/owgw.properties
fi

View File

@@ -9,7 +9,7 @@ fullnameOverride: ""
images:
owgw:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
tag: master
tag: v2.8.0
pullPolicy: Always
# regcred:
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
@@ -230,6 +230,7 @@ configProperties:
openwifi.devicetypes.0: AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
openwifi.devicetypes.1: SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2: IOT:esp32
openwifi.certificates.allowmismatch: "false"
oui.download.uri: https://standards-oui.ieee.org/oui/oui.txt
firmware.autoupdate.policy.default: auto
iptocountry.provider: ipinfo

View File

@@ -49,6 +49,38 @@ components:
- IOT
- MESH
DeviceRestrictionsKeyInfo:
type: object
properties:
vendor:
type: string
algo:
type: string
DeviceRestrictions:
type: object
properties:
dfs:
type: boolean
ssh:
type: boolean
rtty:
type: boolean
tty:
type: boolean
developer:
type: boolean
upgrade:
type: boolean
commands:
type: boolean
country:
type: array
items:
type: string
key_info:
$ref: '#/components/schemas/DeviceRestrictionsKeyInfo'
Device:
type: object
description: Definition of uCentral device
@@ -107,6 +139,19 @@ components:
type: string
minLength: 2
maxLength: 2
restrictedDevice:
type: boolean
default: false
certificateExpiryDate:
type: integer
format: int64
pendingConfiguration:
type: string
pendingConfigurationCmd:
type: string
format: uuid
restrictionDetails:
$ref: '#/components/schemas/DeviceRestrictions'
DeviceWithStatus:
type: object
@@ -202,6 +247,19 @@ components:
totalConnectionTime:
type: integer
format: int64
restrictedDevice:
type: boolean
default: false
certificateDate:
type: integer
format: int64
pendingConfiguration:
type: string
pendingConfigurationCmd:
type: string
format: uuid
restrictionDetails:
$ref: '#/components/schemas/DeviceRestrictions'
DeviceList:
type: object
@@ -500,18 +558,69 @@ components:
type:
type: string
enum:
- uci
- ucode
- shell
- bundle
- diagnostic
script:
type: string
scriptId:
type: string
format: uuid
when:
type: integer
format: int64
default: 0
signature:
type: string
deferred:
type: boolean
uri:
type: string
ScriptEntry:
type: object
properties:
id:
type: string
name:
type: string
description:
type: string
uri:
type: string
content:
type: string
version:
type: string
type:
enum:
- shell
- bundle
created:
type: integer
modified:
type: integer
author:
type: string
restricted:
type: array
items:
type: string
deferred:
type: boolean
default: false
timeout:
type: integer
default: 30
defaultUploadURI:
type: string
ScriptEntryList:
type: object
properties:
scripts:
type: array
items:
$ref: '#/components/schemas/ScriptEntry'
FactoryRequest:
type: object
@@ -921,9 +1030,26 @@ components:
items:
$ref: '#/components/schemas/TagValuePair'
ExtraSystemConfiguration:
type: array
items:
type: object
properties:
parameterName:
type: string
parameterType:
type: string
enum:
- string
- integer
- boolean
- path
parameterValue:
{}
#########################################################################################
##
## End of uCentral system wide values
## End of uCentral system-wide values
##
#########################################################################################
BlackDeviceInfo:
@@ -1890,6 +2016,12 @@ paths:
schema:
type: boolean
required: false
- in: query
description: Return the number of matching records.
name: countOnly
schema:
type: boolean
required: false
responses:
200:
@@ -1899,6 +2031,8 @@ paths:
schema:
oneOf:
- $ref: '#/components/schemas/StatisticsRecords'
- $ref: '#/components/schemas/DeviceCount'
403:
$ref: '#/components/responses/Unauthorized'
404:
@@ -2076,6 +2210,11 @@ paths:
schema:
type: string
required: true
- in: query
name: FWsignature
schema:
type: string
required: false
requestBody:
description: Command details
content:
@@ -2430,6 +2569,148 @@ paths:
404:
$ref: '#/components/responses/NotFound'
/scripts:
get:
tags:
- Scripting
summary: Returns a list scripts.
description: Get a list of scripts.
operationId: getScripts
parameters:
- in: query
description: Pagination start (starts at 0. If not specified, 0 is assumed)
name: offset
schema:
type: integer
required: false
- in: query
description: Maximum number of entries to return (if absent, no limit is assumed)
name: limit
schema:
type: integer
required: false
- in: query
description: Filter the results
name: filter
schema:
type: string
required: false
responses:
200:
description: List all scripts
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptEntryList'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/script/{uuid}:
get:
tags:
- Scripting
summary: Returns a script entry.
description: Get a specific script entry.
operationId: getScript
parameters:
- in: path
description: The UUID of the script
name: uuid
schema:
type: string
format: uuid
required: true
responses:
200:
description: A script entry
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptEntry'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
post:
tags:
- Scripting
summary: Create a new script.
operationId: createScript
parameters:
- in: path
description: The UUID of the script. Must be set to 0 for creation
name: uuid
schema:
type: string
format: uuid
required: true
requestBody:
description: Complet script entry
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptEntry'
responses:
200:
$ref: '#/components/schemas/ScriptEntry'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
put:
tags:
- Scripting
summary: Modify a script.
operationId: modifyScript
parameters:
- in: path
description: The UUID of the script.
name: uuid
schema:
type: string
format: uuid
required: true
requestBody:
description: Complete script entry. You may only modify the name, description, version, uri, and content
content:
application/json:
schema:
$ref: '#/components/schemas/ScriptEntry'
responses:
200:
$ref: '#/components/schemas/ScriptEntry'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
delete:
tags:
- Scripting
summary: Delete a script.
operationId: deleteScript
parameters:
- in: path
name: uuid
schema:
type: string
format: uuid
required: true
responses:
204:
$ref: '#/components/responses/Success'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/blacklist:
get:
tags:
@@ -2731,4 +3012,51 @@ paths:
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
$ref: '#/components/responses/NotFound'
/systemConfiguration:
get:
tags:
- SystemConfiguration
summary: Retrieve system configuration items
operationId: getSystemConfiguration
responses:
200:
$ref: '#/components/schemas/ExtraSystemConfiguration'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
put:
tags:
- SystemConfiguration
summary: Set some or all system configuration
operationId: setSystemConfiguration
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ExtraSystemConfiguration'
responses:
200:
$ref: '#/components/schemas/ExtraSystemConfiguration'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
delete:
tags:
- SystemConfiguration
summary: Delete all additional system configuration
operationId: deleteSystemConfiguration
responses:
200:
$ref: '#/components/responses/Success'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'

View File

@@ -75,6 +75,7 @@ openwifi.autoprovisioning = true
openwifi.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2 = IOT:esp32
openwifi.certificates.allowmismatch = ${CERTIFICATES_ALLOWMISMATCH}
oui.download.uri = https://standards-oui.ieee.org/oui/oui.txt
simulatorid = ${SIMULATORID}
iptocountry.default = US

View File

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

View File

@@ -28,6 +28,8 @@
#include "fmt/format.h"
#include "framework/ow_constants.h"
#include "RADIUS_proxy_server.h"
@@ -71,27 +73,6 @@ namespace OpenWifi {
Valid_ = true;
}
class ThreadedCounter {
public:
ThreadedCounter(bool T, std::atomic_uint64_t &C) :
C_(C),
Threaded_(T) {
if(Threaded_) {
C_++;
}
}
~ThreadedCounter() {
if(Threaded_ && C_>0) {
C_--;
}
}
private:
std::atomic_uint64_t &C_;
bool Threaded_;
};
bool AP_WS_Connection::ValidatedDevice() {
if(DeviceValidated_)
return true;
@@ -99,6 +80,7 @@ namespace OpenWifi {
if(!Valid_)
return false;
std::lock_guard Lock(ConnectionMutex_);
try {
auto SockImpl = dynamic_cast<Poco::Net::WebSocketImpl *>(WS_->impl());
auto SS = dynamic_cast<Poco::Net::SecureStreamSocketImpl*>(SockImpl->streamSocketImpl());
@@ -155,6 +137,7 @@ namespace OpenWifi {
return false;
}
State_.certificateExpiryDate = PeerCert.expiresOn().timestamp().epochTime();
SerialNumber_ = CN_;
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
@@ -245,9 +228,9 @@ namespace OpenWifi {
auto SessionDeleted = AP_WS_Server()->EndSession(State_.sessionId, SerialNumberInt_);
if (SessionDeleted) {
WebNotificationSingleDevice_t N;
GWWebSocketNotifications::SingleDevice_t N;
N.content.serialNumber = SerialNumber_;
WebSocketClientNotificationDeviceDisconnected(N);
GWWebSocketNotifications::DeviceDisconnected(N);
}
}
}
@@ -309,13 +292,13 @@ namespace OpenWifi {
bool Sent;
StorageService()->AddCommand(SerialNumber_, Cmd, Storage::CommandExecutionType::COMMAND_EXECUTED);
CommandManager()->PostCommand(CommandManager()->NextRPCId(),SerialNumber_, Cmd.Command, Params, Cmd.UUID, Sent);
CommandManager()->PostCommand(CommandManager()->Next_RPC_ID(), APCommands::to_apcommand(Cmd.Command.c_str()),SerialNumber_, Cmd.Command, Params, Cmd.UUID, Sent);
WebNotificationSingleDeviceConfigurationChange_t Notification;
GWWebSocketNotifications::SingleDeviceConfigurationChange_t Notification;
Notification.content.serialNumber = D.SerialNumber;
Notification.content.oldUUID = UUID;
Notification.content.newUUID = UpgradedUUID;
WebSocketClientNotificationDeviceConfigurationChange(Notification);
GWWebSocketNotifications::DeviceConfigurationChange(Notification);
return true;
}
@@ -324,7 +307,7 @@ namespace OpenWifi {
void AP_WS_Connection::ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc) {
poco_debug(Logger_,fmt::format("RECEIVED-RPC({}): {}.", CId_, Doc->get(uCentralProtocol::ID).toString()));
CommandManager()->PostCommandResult(SerialNumber_, *Doc);
CommandManager()->PostCommandResult(SerialNumber_, Doc);
}
void AP_WS_Connection::ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc) {
@@ -607,7 +590,6 @@ namespace OpenWifi {
WS_->sendFrame("", 0,
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
State_.MessageCount++;
if (KafkaManager()->Enabled()) {
Poco::JSON::Object PingObject;

View File

@@ -16,7 +16,6 @@
#include "RESTObjects/RESTAPI_GWobjects.h"
namespace OpenWifi {
class AP_WS_Connection {
@@ -44,7 +43,7 @@ namespace OpenWifi {
void OnSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf);
void OnSocketShutdown(const Poco::AutoPtr<Poco::Net::ShutdownNotification>& pNf);
void OnSocketError(const Poco::AutoPtr<Poco::Net::ErrorNotification>& pNf);
bool LookForUpgrade(const uint64_t UUID, uint64_t & UpgradedUUID);
bool LookForUpgrade(uint64_t UUID, uint64_t & UpgradedUUID);
static bool ExtractBase64CompressedData(const std::string & CompressedData, std::string & UnCompressedData, uint64_t compress_sz);
void LogException(const Poco::Exception &E);
inline Poco::Logger & Logger() { return Logger_; }
@@ -53,6 +52,36 @@ namespace OpenWifi {
bool StopWebSocketTelemetry(uint64_t RPCID);
bool StopKafkaTelemetry(uint64_t RPCID);
inline void GetLastStats(std::string &LastStats) const {
std::shared_lock G(ConnectionMutex_);
LastStats = RawLastStats_;
}
inline void SetLastStats(const std::string &LastStats) {
std::unique_lock G(ConnectionMutex_);
RawLastStats_ = LastStats;
}
inline void SetLastHealthCheck(const GWObjects::HealthCheck &H) {
std::unique_lock G(ConnectionMutex_);
RawLastHealthcheck_ = H;
}
inline void GetLastHealthCheck(GWObjects::HealthCheck &H) {
std::shared_lock G(ConnectionMutex_);
H = RawLastHealthcheck_;
}
inline void GetState(GWObjects::ConnectionState &State) const {
std::shared_lock G(ConnectionMutex_);
State = State_;
}
inline void GetRestrictions(GWObjects::DeviceRestrictions & R) const {
std::shared_lock G(ConnectionMutex_);
R = Restrictions_;
}
void Process_connect(Poco::JSON::Object::Ptr ParamsObj, const std::string &Serial);
void Process_state(Poco::JSON::Object::Ptr ParamsObj);
void Process_healthcheck(Poco::JSON::Object::Ptr ParamsObj);
@@ -83,11 +112,15 @@ namespace OpenWifi {
return true;
}
friend class DeviceRegistry;
friend class AP_WS_Server;
inline GWObjects::DeviceRestrictions Restrictions() const {
std::shared_lock G(ConnectionMutex_);
return Restrictions_;
}
private:
// std::recursive_mutex LocalMutex_;
mutable std::shared_mutex ConnectionMutex_;
std::shared_mutex TelemetryMutex_;
Poco::Logger &Logger_;
Poco::Net::SocketReactor &Reactor_;
@@ -101,22 +134,22 @@ namespace OpenWifi {
uint64_t Errors_=0;
Poco::Net::IPAddress PeerAddress_;
volatile bool TelemetryReporting_ = false;
volatile uint64_t TelemetryWebSocketRefCount_ = 0;
volatile uint64_t TelemetryKafkaRefCount_ = 0;
volatile uint64_t TelemetryWebSocketTimer_ = 0;
volatile uint64_t TelemetryKafkaTimer_ = 0 ;
volatile uint64_t TelemetryInterval_ = 0;
volatile uint64_t TelemetryWebSocketPackets_=0;
volatile uint64_t TelemetryKafkaPackets_=0;
volatile uint64_t TelemetryWebSocketRefCount_ = 0;
volatile uint64_t TelemetryKafkaRefCount_ = 0;
volatile uint64_t TelemetryWebSocketTimer_ = 0;
volatile uint64_t TelemetryKafkaTimer_ = 0 ;
volatile uint64_t TelemetryInterval_ = 0;
volatile uint64_t TelemetryWebSocketPackets_=0;
volatile uint64_t TelemetryKafkaPackets_=0;
GWObjects::ConnectionState State_;
std::string LastStats_;
GWObjects::HealthCheck LastHealthcheck_;
std::string RawLastStats_;
GWObjects::HealthCheck RawLastHealthcheck_;
std::chrono::time_point<std::chrono::high_resolution_clock> ConnectionStart_ = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> ConnectionCompletionTime_{0.0};
bool Threaded_=false;
std::atomic_flag Dead_=false;
std::atomic_bool DeviceValidated_=false;
std::atomic_bool Valid_=false;
OpenWifi::GWObjects::DeviceRestrictions Restrictions_;
static inline std::atomic_uint64_t ConcurrentStartingDevices_=0;

View File

@@ -24,10 +24,7 @@ namespace OpenWifi {
ParamsObj->has(uCentralProtocol::CAPABILITIES)) {
uint64_t UUID = ParamsObj->get(uCentralProtocol::UUID);
auto Firmware = ParamsObj->get(uCentralProtocol::FIRMWARE).toString();
auto CapabilitiesString = ParamsObj->get(uCentralProtocol::CAPABILITIES).toString();
Config::Capabilities Caps(CapabilitiesString);
Compatible_ = Caps.Compatible();
auto Capabilities = ParamsObj->getObject(uCentralProtocol::CAPABILITIES);
SerialNumber_ = Serial;
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
@@ -35,6 +32,12 @@ namespace OpenWifi {
CommandManager()->ClearQueue(SerialNumberInt_);
AP_WS_Server()->SetSessionDetails(State_.sessionId,SerialNumberInt_);
std::lock_guard Lock(ConnectionMutex_);
Config::Capabilities Caps(Capabilities);
Compatible_ = Caps.Compatible();
State_.UUID = UUID;
State_.Firmware = Firmware;
State_.PendingUUID = 0;
@@ -46,45 +49,61 @@ namespace OpenWifi {
IP = IP.substr(7);
}
bool RestrictedDevice = false;
if(Capabilities->has("restrictions")){
RestrictedDevice = true;
Poco::JSON::Object::Ptr RestrictionObject = Capabilities->getObject("restrictions");
Restrictions_.from_json(RestrictionObject);
}
State_.locale = FindCountryFromIP()->Get(IP);
GWObjects::Device DeviceInfo;
auto DeviceExists = StorageService()->GetDevice(SerialNumber_,DeviceInfo);
if (Daemon()->AutoProvisioning() && !DeviceExists) {
StorageService()->CreateDefaultDevice(SerialNumber_, CapabilitiesString, Firmware,
Compatible_, PeerAddress_);
StorageService()->CreateDefaultDevice(SerialNumber_, Caps, Firmware, PeerAddress_);
} else if (DeviceExists) {
StorageService()->UpdateDeviceCapabilities(SerialNumber_, CapabilitiesString,
Compatible_);
bool Updated = false;
StorageService()->UpdateDeviceCapabilities(SerialNumber_, Caps );
int Updated{0};
if(!Firmware.empty()) {
if(Firmware!=DeviceInfo.Firmware) {
DeviceInfo.Firmware = Firmware;
DeviceInfo.LastFWUpdate = Utils::Now();
Updated = true;
++Updated;
WebNotificationSingleDeviceFirmwareChange_t Notification;
GWWebSocketNotifications::SingleDeviceFirmwareChange_t Notification;
Notification.content.serialNumber = SerialNumber_;
Notification.content.newFirmware = Firmware;
WebSocketClientNotificationDeviceFirmwareUpdated(Notification);
GWWebSocketNotifications::DeviceFirmwareUpdated(Notification);
} else if(DeviceInfo.LastFWUpdate==0) {
DeviceInfo.LastFWUpdate = Utils::Now();
Updated = true;
++Updated;
}
}
if(DeviceInfo.locale != State_.locale) {
DeviceInfo.locale = State_.locale;
Updated = true;
++Updated;
}
if(Compatible_ != DeviceInfo.DeviceType) {
DeviceInfo.DeviceType = Compatible_;
Updated = true;
++Updated;
}
if(RestrictedDevice != DeviceInfo.restrictedDevice) {
DeviceInfo.restrictedDevice = RestrictedDevice;
++Updated;
}
if(Restrictions_ != DeviceInfo.restrictionDetails) {
DeviceInfo.restrictionDetails = Restrictions_;
++Updated;
}
if(Updated) {
StorageService()->UpdateDevice(DeviceInfo);
}
uint64_t UpgradedUUID=0;
LookForUpgrade(UUID,UpgradedUUID);
State_.UUID = UpgradedUUID;
@@ -96,7 +115,7 @@ namespace OpenWifi {
State_.connectionCompletionTime = ConnectionCompletionTime_.count();
if(State_.VerifiedCertificate == GWObjects::VALID_CERTIFICATE) {
if (( Utils::SerialNumberMatch(CN_, SerialNumber_, AP_WS_Server()->MismatchDepth())) ||
if (( Utils::SerialNumberMatch(CN_, SerialNumber_, (int)AP_WS_Server()->MismatchDepth())) ||
AP_WS_Server()->IsSimSerialNumber(CN_)) {
State_.VerifiedCertificate = GWObjects::VERIFIED;
poco_information(Logger_, fmt::format("CONNECT({}): Fully validated and authenticated device. Session={} ConnectionCompletion Time={}",
@@ -112,17 +131,16 @@ namespace OpenWifi {
State_.connectionCompletionTime));
} else {
poco_information(
Logger_, fmt::format("CONNECT({}): Serial number mismatch disallowed. Device rejected. CN={} Serial={} Session={} ConnectionCompletion Time={}",
CId_, CN_, SerialNumber_, State_.sessionId,
State_.connectionCompletionTime));
Logger_, fmt::format("CONNECT({}): Serial number mismatch disallowed. Device rejected. CN={} Serial={} Session={}",
CId_, CN_, SerialNumber_, State_.sessionId));
return EndConnection();
}
}
}
WebNotificationSingleDevice_t Notification;
GWWebSocketNotifications::SingleDevice_t Notification;
Notification.content.serialNumber = SerialNumber_;
WebSocketClientNotificationDeviceConnected(Notification);
GWWebSocketNotifications::DeviceConnected(Notification);
// std::cout << "Serial: " << SerialNumber_ << "Session: " << State_.sessionId << std::endl;

View File

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

View File

@@ -9,6 +9,7 @@
#include "framework/ow_constants.h"
#include "framework/MicroServiceFuncs.h"
#include "fmt/format.h"
#include "framework/ow_constants.h"
namespace OpenWifi {
void AP_WS_Connection::Process_recovery(Poco::JSON::Object::Ptr ParamsObj) {
@@ -51,7 +52,7 @@ namespace OpenWifi {
Poco::JSON::Stringifier::stringify(Params, O);
Cmd.Details = O.str();
bool Sent;
CommandManager()->PostCommand(CommandManager()->NextRPCId(),SerialNumber_, Cmd.Command, Params, Cmd.UUID, Sent);
CommandManager()->PostCommand(CommandManager()->Next_RPC_ID(), APCommands::Commands::reboot, SerialNumber_, Cmd.Command, Params, Cmd.UUID, Sent);
StorageService()->AddCommand(SerialNumber_, Cmd, Storage::CommandExecutionType::COMMAND_EXECUTED);
poco_information(Logger_, fmt::format("RECOVERY({}): Recovery mode received, need for a reboot.", CId_));
} else {

View File

@@ -41,7 +41,7 @@ namespace OpenWifi {
uint64_t UpgradedUUID;
LookForUpgrade(UUID,UpgradedUUID);
State_.UUID = UpgradedUUID;
LastStats_ = StateStr;
SetLastStats(StateStr);
GWObjects::Statistics Stats{
.SerialNumber = SerialNumber_, .UUID = UUID, .Data = StateStr};
@@ -52,7 +52,9 @@ namespace OpenWifi {
}
StateUtils::ComputeAssociations(StateObj, State_.Associations_2G,
State_.Associations_5G);
State_.Associations_5G,
State_.Associations_6G
);
if (KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify;
@@ -61,9 +63,9 @@ namespace OpenWifi {
KafkaManager()->PostMessage(KafkaTopics::STATE, SerialNumber_, OS.str());
}
WebNotificationSingleDevice_t N;
GWWebSocketNotifications::SingleDevice_t N;
N.content.serialNumber = SerialNumber_;
WebSocketClientNotificationDeviceStatistics(N);
GWWebSocketNotifications::DeviceStatistics(N);
} else {
poco_warning(Logger_, fmt::format("STATE({}): Invalid request. Missing serial, uuid, or state", CId_));

View File

@@ -33,7 +33,7 @@ namespace OpenWifi {
State_.websocketPackets = TelemetryWebSocketPackets_;
TelemetryStream()->NotifyEndPoint(SerialNumberInt_, SS.str());
} else {
StopWebSocketTelemetry(CommandManager()->NextRPCId());
StopWebSocketTelemetry(CommandManager()->Next_RPC_ID());
}
}
if (TelemetryKafkaRefCount_) {
@@ -44,7 +44,7 @@ namespace OpenWifi {
KafkaManager()->PostMessage(KafkaTopics::DEVICE_TELEMETRY, SerialNumber_,
SS.str());
} else {
StopKafkaTelemetry(CommandManager()->NextRPCId());
StopKafkaTelemetry(CommandManager()->Next_RPC_ID());
}
}
} else {
@@ -53,7 +53,7 @@ namespace OpenWifi {
} else {
// if we are ignoring telemetry, then close it down on the device.
poco_debug(Logger_,fmt::format("TELEMETRY({}): Stopping runaway telemetry.",SerialNumber_));
StopTelemetry(CommandManager()->NextRPCId());
StopTelemetry(CommandManager()->Next_RPC_ID());
}
}
}

View File

@@ -159,9 +159,8 @@ namespace OpenWifi {
}
void AP_WS_Server::onGarbageCollecting([[maybe_unused]] Poco::Timer &timer) {
std::lock_guard Lock(LocalMutex_);
if(Garbage_.size()>0) {
std::cout << "Removing " << Garbage_.size() << " old connections." << std::endl;
std::lock_guard Lock(WSServerMutex_);
if(!Garbage_.empty()) {
Garbage_.clear();
}
@@ -173,20 +172,15 @@ namespace OpenWifi {
uint64_t total_connected_time=0;
auto now = Utils::Now();
for (auto connection=SerialNumbers_.begin(); connection!=SerialNumbers_.end();) {
if(connection->second.second== nullptr) {
connection++;
for (const auto & connection:SerialNumbers_) {
if(connection.second.second == nullptr) {
continue;
}
if (connection->second.second->State_.Connected) {
if (connection.second.second->State_.Connected) {
NumberOfConnectedDevices_++;
total_connected_time += (now - connection->second.second->State_.started);
connection++;
total_connected_time += (now - connection.second.second->State_.started);
} else {
NumberOfConnectingDevices_++;
connection++;
}
}
@@ -198,11 +192,11 @@ namespace OpenWifi {
NumberOfConnectedDevices_, NumberOfConnectingDevices_, AverageDeviceConnectionTime_));
}
WebSocketClientNotificationNumberOfConnection_t Notification;
GWWebSocketNotifications::NumberOfConnection_t Notification;
Notification.content.numberOfConnectingDevices = NumberOfConnectingDevices_;
Notification.content.numberOfDevices = NumberOfConnectedDevices_;
Notification.content.averageConnectedTime = AverageDeviceConnectionTime_;
WebSocketClientNotificationNumberOfConnections(Notification);
GWWebSocketNotifications::NumberOfConnections(Notification);
}
void AP_WS_Server::Stop() {
@@ -221,36 +215,49 @@ namespace OpenWifi {
}
bool AP_WS_Server::GetStatistics(uint64_t SerialNumber, std::string &Statistics) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
Statistics = Device->second.second->LastStats_;
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetLastStats(Statistics);
return true;
}
bool AP_WS_Server::GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
State = Device->second.second->State_;
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetState(State);
return true;
}
bool AP_WS_Server::GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device == SerialNumbers_.end() || Device->second.second==nullptr)
return false;
CheckData = Device->second.second->LastHealthcheck_;
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetLastHealthCheck(CheckData);
return true;
}
void AP_WS_Server::SetSessionDetails(uint64_t connection_id, uint64_t SerialNumber) {
std::lock_guard Lock(LocalMutex_);
std::lock_guard Lock(WSServerMutex_);
auto Conn = Sessions_.find(connection_id);
if(Conn == end(Sessions_))
@@ -259,19 +266,19 @@ namespace OpenWifi {
auto CurrentSerialNumber = SerialNumbers_.find(SerialNumber);
if( (CurrentSerialNumber==SerialNumbers_.end()) ||
(CurrentSerialNumber->second.first<connection_id)) {
SerialNumbers_[SerialNumber] = std::make_pair(connection_id, Conn->second.first);
SerialNumbers_[SerialNumber] = std::make_pair(connection_id, Conn->second);
return;
}
}
bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t serial_number) {
std::unique_lock G(LocalMutex_);
std::lock_guard G(WSServerMutex_);
auto Session = Sessions_.find(session_id);
if(Session==end(Sessions_))
return false;
Garbage_.push_back(Session->second.first);
Garbage_.push_back(Session->second);
auto Device = SerialNumbers_.find(serial_number);
if (Device == end(SerialNumbers_)) {
@@ -289,24 +296,45 @@ namespace OpenWifi {
return false;
}
bool AP_WS_Server::Connected(uint64_t SerialNumber) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return false;
bool AP_WS_Server::Connected(uint64_t SerialNumber, GWObjects::DeviceRestrictions & Restrictions) const {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetRestrictions(Restrictions);
return DevicePtr->State_.Connected;
}
return Device->second.second->State_.Connected;
bool AP_WS_Server::Connected(uint64_t SerialNumber) const {
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
return DevicePtr->State_.Connected;
}
bool AP_WS_Server::SendFrame(uint64_t SerialNumber, const std::string & Payload) const {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
try {
// std::cout << "Device connection pointer: " << (uint64_t) Device->second.second << std::endl;
return Device->second.second->Send(Payload);
return DevicePtr->Send(Payload);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendFrame: Could not send data to device '{}'", Utils::IntToSerialNumber(SerialNumber)));
}
@@ -314,39 +342,56 @@ namespace OpenWifi {
}
void AP_WS_Server::StopWebSocketTelemetry(uint64_t RPCID, uint64_t SerialNumber) {
std::lock_guard Lock(LocalMutex_);
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second==nullptr)
return;
Device->second.second->StopWebSocketTelemetry(RPCID);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->StopWebSocketTelemetry(RPCID);
}
void AP_WS_Server::SetWebSocketTelemetryReporting(uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second==nullptr)
return;
Device->second.second->SetWebSocketTelemetryReporting(RPCID, Interval, Lifetime);
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->SetWebSocketTelemetryReporting(RPCID, Interval, Lifetime);
}
void AP_WS_Server::SetKafkaTelemetryReporting(uint64_t RPCID, uint64_t SerialNumber, uint64_t Interval, uint64_t Lifetime) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return;
Device->second.second->SetKafkaTelemetryReporting(RPCID, Interval, Lifetime);
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->SetKafkaTelemetryReporting(RPCID, Interval, Lifetime);
}
void AP_WS_Server::StopKafkaTelemetry(uint64_t RPCID, uint64_t SerialNumber) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_) || Device->second.second== nullptr)
return;
Device->second.second->StopKafkaTelemetry(RPCID);
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->StopKafkaTelemetry(RPCID);
}
void AP_WS_Server::GetTelemetryParameters(uint64_t SerialNumber , bool & TelemetryRunning,
@@ -357,29 +402,34 @@ namespace OpenWifi {
uint64_t & TelemetryKafkaCount,
uint64_t & TelemetryWebSocketPackets,
uint64_t & TelemetryKafkaPackets) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if(Device==end(SerialNumbers_)|| Device->second.second== nullptr)
return;
Device->second.second->GetTelemetryParameters(TelemetryRunning,
TelemetryInterval,
TelemetryWebSocketTimer,
TelemetryKafkaTimer,
TelemetryWebSocketCount,
TelemetryKafkaCount,
TelemetryWebSocketPackets,
TelemetryKafkaPackets);
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(SerialNumber);
if (Device == end(SerialNumbers_) || Device->second.second == nullptr) {
return;
}
DevicePtr = Device->second.second;
}
DevicePtr->GetTelemetryParameters(
TelemetryRunning, TelemetryInterval, TelemetryWebSocketTimer, TelemetryKafkaTimer,
TelemetryWebSocketCount, TelemetryKafkaCount, TelemetryWebSocketPackets,
TelemetryKafkaPackets);
}
bool AP_WS_Server::SendRadiusAccountingData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
try {
return Device->second.second->SendRadiusAccountingData(buffer,size);
return DevicePtr->SendRadiusAccountingData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusAuthenticationData: Could not send data to device '{}'", SerialNumber));
}
@@ -387,13 +437,18 @@ namespace OpenWifi {
}
bool AP_WS_Server::SendRadiusAuthenticationData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
try {
return Device->second.second->SendRadiusAuthenticationData(buffer,size);
return DevicePtr->SendRadiusAuthenticationData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusAuthenticationData: Could not send data to device '{}'", SerialNumber));
}
@@ -401,13 +456,18 @@ namespace OpenWifi {
}
bool AP_WS_Server::SendRadiusCoAData(const std::string & SerialNumber, const unsigned char * buffer, std::size_t size) {
std::lock_guard Lock(LocalMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if(Device==SerialNumbers_.end() || Device->second.second== nullptr)
return false;
std::shared_ptr<AP_WS_Connection> DevicePtr;
{
std::lock_guard Lock(WSServerMutex_);
auto Device = SerialNumbers_.find(Utils::SerialNumberToInt(SerialNumber));
if (Device == SerialNumbers_.end() || Device->second.second == nullptr) {
return false;
}
DevicePtr = Device->second.second;
}
try {
return Device->second.second->SendRadiusCoAData(buffer,size);
return DevicePtr->SendRadiusCoAData(buffer,size);
} catch (...) {
poco_debug(Logger(),fmt::format(": SendRadiusCoAData: Could not send data to device '{}'", SerialNumber));
}

View File

@@ -106,16 +106,16 @@ namespace OpenWifi {
[[nodiscard]] inline bool Running() const { return Running_; }
inline void AddConnection(uint64_t session_id, std::shared_ptr<AP_WS_Connection> Connection ) {
std::lock_guard Lock(LocalMutex_);
Sessions_[session_id] = std::make_pair(std::move(Connection),false);
std::lock_guard Lock(WSServerMutex_);
Sessions_[session_id] = std::move(Connection);
}
inline std::shared_ptr<AP_WS_Connection> FindConnection(uint64_t session_id) const {
std::lock_guard Lock(LocalMutex_);
std::lock_guard Lock(WSServerMutex_);
auto Connection = Sessions_.find(session_id);
if(Connection!=end(Sessions_))
return Connection->second.first;
return Connection->second;
return nullptr;
}
@@ -134,6 +134,7 @@ namespace OpenWifi {
}
bool GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) const ;
bool Connected(uint64_t SerialNumber, GWObjects::DeviceRestrictions & Restrictions) const ;
bool Connected(uint64_t SerialNumber) const ;
inline bool SendFrame(const std::string & SerialNumber, const std::string & Payload) const {
@@ -171,7 +172,7 @@ namespace OpenWifi {
}
private:
mutable std::recursive_mutex LocalMutex_;
mutable std::recursive_mutex WSServerMutex_;
std::unique_ptr<Poco::Crypto::X509Certificate> IssuerCert_;
std::list<std::unique_ptr<Poco::Net::HTTPServer>> WebServers_;
Poco::Net::SocketReactor Reactor_;
@@ -183,7 +184,8 @@ namespace OpenWifi {
bool SimulatorEnabled_=false;
std::unique_ptr<AP_WS_ReactorThreadPool> Reactor_pool_;
std::atomic_bool Running_=false;
std::map<uint64_t, std::pair<std::shared_ptr<AP_WS_Connection>,bool>> Sessions_;
// std::map<uint64_t, std::pair<std::shared_ptr<AP_WS_Connection>,bool>> Sessions_;
std::map<std::uint64_t, std::shared_ptr<AP_WS_Connection>> Sessions_;
std::map<uint64_t, std::pair<uint64_t,std::shared_ptr<AP_WS_Connection>>> SerialNumbers_;
std::atomic_bool AllowSerialNumberMismatch_=true;
std::atomic_uint64_t MismatchDepth_=2;

View File

@@ -12,6 +12,7 @@
#include "framework/MicroServiceFuncs.h"
#include "nlohmann/json.hpp"
#include "CentralConfig.h"
namespace OpenWifi {
const std::string PlatformCacheFileName{"/plat_cache.json"};
@@ -27,17 +28,17 @@ namespace OpenWifi {
return instance;
}
inline void Add(const std::string & DeviceType, const std::string & Platform, const std::string & FullCapabilities) {
if(DeviceType.empty() || Platform.empty())
inline void Add(const Config::Capabilities &Caps) {
if(Caps.Compatible().empty() || Caps.Platform().empty())
return;
std::lock_guard G(Mutex_);
if(!PlatformsLoaded_)
LoadPlatforms();
auto P = Poco::toUpper(Platform);
auto Hint = Platforms_.find(DeviceType);
auto P = Poco::toUpper(Caps.Platform());
auto Hint = Platforms_.find(Caps.Compatible());
if(Hint==Platforms_.end()) {
Platforms_.insert(std::make_pair(DeviceType,P));
Platforms_.insert(std::make_pair(Caps.Compatible(),P));
SavePlatforms();
} else if(Hint->second != P) {
Hint->second = P;
@@ -47,12 +48,14 @@ namespace OpenWifi {
if(!CapabilitiesLoaded_)
LoadCapabilities();
auto CapHint = Capabilities_.find(DeviceType);
auto CapHint = Capabilities_.find(Caps.Compatible());
if(CapHint==Capabilities_.end()) {
Capabilities_[DeviceType] = nlohmann::json::parse(FullCapabilities);
auto C = nlohmann::json::parse(Caps.AsString());
C.erase("restrictions");
Capabilities_[Caps.Compatible()] = nlohmann::json::parse(Caps.AsString());
SaveCapabilities();
} else {
CapHint->second = nlohmann::json::parse(FullCapabilities);
CapHint->second = nlohmann::json::parse(Caps.AsString());
SaveCapabilities();
}
}
@@ -150,4 +153,7 @@ namespace OpenWifi {
}
}
};
inline auto CapabilitiesCache() { return CapabilitiesCache::instance(); };
}

View File

@@ -67,11 +67,11 @@ R"lit(
"ipv4": {
"addressing": "static",
"dhcp": {
"lease-count": 10000,
"lease-count": 100,
"lease-first": 10,
"lease-time": "6h"
},
"subnet": "192.168.1.1/16"
"subnet": "192.168.1.1/24"
},
"name": "LAN",
"role": "downstream",
@@ -228,7 +228,7 @@ R"lit(
return DefaultConfiguration_;
}
std::string Capabilities::Default() {
/* std::string Capabilities::Default() {
return std::string(R"lit({"model":{"id":"linksys,ea8300","name":"Linksys EA8300 (Dallas)"},
"network":{"lan":{"ifname":"eth0","protocol":"static"},"wan":{"ifname":"eth1","protocol":"dhcp"}},
"switch":{"switch0":{"enable":true,"reset":true,"ports":[{"num":0,"device":"eth0","need_tag":false,
@@ -242,27 +242,23 @@ R"lit(
"platform/soc/a800000.wifi":{"band":["5l"],"ht_capa":6639,"vht_capa":865687986,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],
"tx_ant":3,"rx_ant":3,"channels":[36,40,44,48,52,56,60,64]}}})lit");
}
*/
void Capabilities::Parse() {
if(Capabilities_.empty())
Capabilities_=Default();
Capabilities::Capabilities(const Poco::JSON::Object::Ptr &Caps) {
try {
Poco::JSON::Parser parser;
auto Result = parser.parse(Capabilities_);
auto Objects = Result.extract<Poco::JSON::Object::Ptr>();
if(Caps->has("compatible"))
Compatible_ = Caps->get("compatible").toString();
if(Objects->has("compatible"))
Compatible_ = Objects->get("compatible").toString();
if(Caps->has("model"))
Model_ = Caps->get("model").toString();
if(Objects->has("model"))
Model_ = Objects->get("model").toString();
if(Caps->has("platform"))
Platform_ = Caps->get("platform").toString();
if(Objects->has("platform"))
Platform_ = Objects->get("platform").toString();
Parsed_ = true ;
std::ostringstream OS;
Caps->stringify(OS);
AsString_ = OS.str();
}
catch ( const Poco::Exception & E )
{
@@ -270,22 +266,20 @@ R"lit(
}
}
const std::string & Capabilities::Compatible() {
if(!Parsed_)
Parse();
const std::string & Capabilities::Compatible() const {
return Compatible_;
}
const std::string & Capabilities::Model() {
if(!Parsed_)
Parse();
const std::string & Capabilities::Model() const {
return Model_;
}
const std::string & Capabilities::Platform() {
if(!Parsed_)
Parse();
const std::string & Capabilities::Platform() const {
return Platform_;
}
const std::string & Capabilities::AsString() const {
return AsString_;
}
} // namespace

View File

@@ -35,29 +35,28 @@ namespace OpenWifi::Config {
class Capabilities {
public:
explicit Capabilities(std::string Caps)
: Capabilities_(std::move(Caps))
{
explicit Capabilities(const Poco::JSON::Object::Ptr &Caps);
}
Capabilities()
/* Capabilities()
{
Capabilities_ = Default();
}
static std::string Default();
[[nodiscard]] const std::string & Get() const { return Capabilities_; };
[[nodiscard]] const std::string & Compatible();
[[nodiscard]] const std::string & Model();
[[nodiscard]] const std::string & Platform();
*/
[[nodiscard]] const std::string & Compatible() const;
[[nodiscard]] const std::string & Model() const;
[[nodiscard]] const std::string & Platform() const;
[[nodiscard]] const std::string & AsString() const;
private:
std::string Capabilities_;
bool Parsed_=false;
std::string Compatible_;
std::string Model_;
std::string Platform_;
std::string AsString_;
void Parse();
};

View File

@@ -31,39 +31,87 @@ namespace OpenWifi {
try {
if (Resp != nullptr) {
const Poco::JSON::Object &Payload = Resp->Payload_;
const std::string &SerialNumber = Resp->SerialNumber_;
Poco::JSON::Object::Ptr Payload = Resp->Payload_;
std::string SerialNumberStr = Utils::IntToSerialNumber(Resp->SerialNumber_);
std::ostringstream SS;
Payload.stringify(SS);
bool NoReply = false;
if (!Payload.has(uCentralProtocol::ID)) {
poco_error(Logger(), fmt::format("({}): Invalid RPC response.", SerialNumber));
if (!Payload->has(uCentralProtocol::ID)) {
poco_error(Logger(), fmt::format("({}): Invalid RPC response.", SerialNumberStr));
} else {
uint64_t ID = Payload.get(uCentralProtocol::ID);
poco_debug(Logger(),fmt::format("({}): Processing {} response.", SerialNumber, ID));
uint64_t ID = Payload->get(uCentralProtocol::ID);
std::shared_ptr<promise_type_t> TmpRpcEntry;
poco_debug(Logger(),fmt::format("({}): Processing {} response.", SerialNumberStr, ID));
if (ID > 1) {
std::lock_guard Lock(LocalMutex_);
auto RPC = OutStandingRequests_.find(ID);
if (RPC == OutStandingRequests_.end() ||
RPC->second.SerialNumber !=
Utils::SerialNumberToInt(Resp->SerialNumber_)) {
RPC->second.SerialNumber != Resp->SerialNumber_) {
poco_debug(Logger(),
fmt::format("({}): RPC {} completed.", SerialNumber, ID));
fmt::format("({}): RPC {} completed.", SerialNumberStr, ID));
} else {
std::chrono::duration<double, std::milli> rpc_execution_time =
std::chrono::high_resolution_clock::now() -
RPC->second.submitted;
StorageService()->CommandCompleted(RPC->second.UUID, Payload,
rpc_execution_time, true);
if (RPC->second.rpc_entry) {
RPC->second.rpc_entry->set_value(Payload);
}
poco_debug(Logger(),
fmt::format("({}): Received RPC answer {}. Command={}",
SerialNumber, ID, RPC->second.Command));
OutStandingRequests_.erase(ID);
SerialNumberStr, ID, APCommands::to_string(RPC->second.Command)));
if(RPC->second.Command==APCommands::Commands::script) {
if(RPC->second.State==2) {
// look at the payload to see if we should continue or not...
if (RPC->second.rpc_entry) {
TmpRpcEntry = RPC->second.rpc_entry;
}
// Payload->stringify(std::cout);
if (Payload->has("result")) {
auto Result = Payload->getObject("result");
if (Result->has("status")) {
auto Status = Result->getObject("status");
// Status->stringify(std::cout);
std::uint64_t Error = Status->get("error");
if(Error==0) {
StorageService()->CommandCompleted(RPC->second.UUID, Payload,
rpc_execution_time, true);
RPC->second.State = 1 ;
} else {
StorageService()->CommandCompleted(RPC->second.UUID, Payload,
rpc_execution_time, true);
std::string ErrorTxt = Status->get("result");
StorageService()->CancelWaitFile(RPC->second.UUID, ErrorTxt);
RPC->second.State = 0 ;
}
}
} else {
// std::cout << "Bad payload on command result" << std::endl;
RPC->second.State=0;
}
} else {
// std::cout << "Completing script 2 phase commit." << std::endl;
StorageService()->CommandCompleted(RPC->second.UUID, Payload,
rpc_execution_time, true);
NoReply = true;
RPC->second.State=0;
}
} else {
if(RPC->second.Command!=APCommands::Commands::telemetry) {
StorageService()->CommandCompleted(
RPC->second.UUID, Payload, rpc_execution_time, true);
}
if (RPC->second.rpc_entry) {
TmpRpcEntry = RPC->second.rpc_entry;
}
RPC->second.State = 0 ;
}
if(RPC->second.State==0) {
OutStandingRequests_.erase(ID);
}
}
if(!NoReply && TmpRpcEntry != nullptr)
TmpRpcEntry->set_value(Payload);
}
}
}
@@ -121,7 +169,7 @@ namespace OpenWifi {
if(delta > 10min) {
MyLogger.debug(fmt::format("{}: Command={} for {} Timed out.",
request->second.UUID,
request->second.Command,
APCommands::to_string(request->second.Command),
Utils::IntToSerialNumber(request->second.SerialNumber)));
request = OutStandingRequests_.erase(request);
} else {
@@ -190,14 +238,15 @@ namespace OpenWifi {
continue;
}
std::string ExecutingCommand, ExecutingUUID;
std::string ExecutingUUID;
APCommands::Commands ExecutingCommand=APCommands::Commands::unknown;
if (CommandRunningForDevice(Utils::SerialNumberToInt(Cmd.SerialNumber),
ExecutingUUID, ExecutingCommand)) {
poco_trace(
MyLogger,
fmt::format(
"{}: Serial={} Command={} Device is already busy with command {} (Command={})."
, Cmd.UUID, Cmd.SerialNumber, Cmd.Command,ExecutingUUID, ExecutingCommand));
, Cmd.UUID, Cmd.SerialNumber, Cmd.Command, ExecutingUUID, APCommands::to_string(ExecutingCommand)));
continue;
}
@@ -206,7 +255,7 @@ namespace OpenWifi {
poco_information(MyLogger, fmt::format("{}: Serial={} Command={} Preparing execution.",
Cmd.UUID, Cmd.SerialNumber, Cmd.Command));
auto Params = P.parse(Cmd.Details).extract<Poco::JSON::Object::Ptr>();
auto Result = PostCommandDisk(NextRPCId(), Cmd.SerialNumber, Cmd.Command,
auto Result = PostCommandDisk(Next_RPC_ID(), APCommands::to_apcommand(Cmd.Command.c_str()), Cmd.SerialNumber, Cmd.Command,
*Params, Cmd.UUID, Sent);
if (Sent) {
StorageService()->SetCommandExecuted(Cmd.UUID);
@@ -241,9 +290,10 @@ namespace OpenWifi {
}
std::shared_ptr<CommandManager::promise_type_t> CommandManager::PostCommand(
uint64_t RPCID,
uint64_t RPC_ID,
APCommands::Commands Command,
const std::string &SerialNumber,
const std::string &Command,
const std::string &CommandStr,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool oneway_rpc,
@@ -256,31 +306,33 @@ namespace OpenWifi {
std::stringstream ToSend;
CommandInfo Idx;
Idx.Id = oneway_rpc ? 1 : RPCID;
Idx.Id = oneway_rpc ? 1 : RPC_ID;
Idx.SerialNumber = SerialNumberInt;
Idx.Command = Command;
if(Command == APCommands::Commands::script)
Idx.State=2;
Idx.UUID = UUID;
Poco::JSON::Object CompleteRPC;
CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
CompleteRPC.set(uCentralProtocol::ID, RPCID);
CompleteRPC.set(uCentralProtocol::METHOD, Command);
CompleteRPC.set(uCentralProtocol::ID, RPC_ID);
CompleteRPC.set(uCentralProtocol::METHOD, CommandStr);
CompleteRPC.set(uCentralProtocol::PARAMS, Params);
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
Idx.rpc_entry = disk_only ? nullptr : std::make_shared<CommandManager::promise_type_t>();
poco_debug(Logger(), fmt::format("{}: Sending command. ID: {}", UUID, RPCID));
poco_debug(Logger(), fmt::format("{}: Sending command {} to {}. ID: {}", UUID, CommandStr, SerialNumber, RPC_ID));
if(AP_WS_Server()->SendFrame(SerialNumber, ToSend.str())) {
if(!oneway_rpc) {
std::lock_guard M(Mutex_);
OutStandingRequests_[RPCID] = Idx;
OutStandingRequests_[RPC_ID] = Idx;
}
poco_debug(Logger(), fmt::format("{}: Sent command. ID: {}", UUID, RPCID));
poco_debug(Logger(), fmt::format("{}: Sent command. ID: {}", UUID, RPC_ID));
Sent=true;
return Idx.rpc_entry;
}
poco_warning(Logger(), fmt::format("{}: Failed to send command. ID: {}", UUID, RPCID));
poco_warning(Logger(), fmt::format("{}: Failed to send command. ID: {}", UUID, RPC_ID));
return nullptr;
}
} // namespace

View File

@@ -31,58 +31,61 @@ namespace OpenWifi {
class RPCResponseNotification: public Poco::Notification {
public:
RPCResponseNotification(const std::string &ser,
const Poco::JSON::Object &pl) :
RPCResponseNotification(std::uint64_t ser,
Poco::JSON::Object::Ptr pl) :
SerialNumber_(ser),
Payload_(pl)
Payload_(std::move(pl))
{
}
std::string SerialNumber_;
Poco::JSON::Object Payload_;
std::uint64_t SerialNumber_;
Poco::JSON::Object::Ptr Payload_;
};
class CommandManager : public SubSystemServer, Poco::Runnable {
public:
typedef Poco::JSON::Object objtype_t;
typedef std::promise<objtype_t> promise_type_t;
using objtype_t = Poco::JSON::Object::Ptr;
using promise_type_t = std::promise<objtype_t>;
struct CommandInfo {
std::uint64_t Id=0;
std::uint64_t SerialNumber=0;
std::string Command;
std::string UUID;
std::uint64_t Id=0;
std::uint64_t SerialNumber=0;
APCommands::Commands Command;
std::string UUID;
std::uint64_t State=1;
std::chrono::time_point<std::chrono::high_resolution_clock> submitted = std::chrono::high_resolution_clock::now();
std::shared_ptr<promise_type_t> rpc_entry;
};
struct RPCResponse {
std::string serialNumber;
Poco::JSON::Object payload;
std::uint64_t serialNumber;
Poco::JSON::Object::Ptr payload;
explicit RPCResponse(const std::string &ser, const Poco::JSON::Object &pl)
explicit RPCResponse(std::uint64_t ser, Poco::JSON::Object::Ptr pl)
:
serialNumber(ser),
payload(pl) {
payload(std::move(pl)) {
}
};
int Start() override;
void Stop() override;
void WakeUp();
inline void PostCommandResult(const std::string &SerialNumber, const Poco::JSON::Object &Obj) {
// RPCResponseQueue_->Write(RPCResponse{.serialNumber=SerialNumber, .payload = Obj});
ResponseQueue_.enqueueNotification(new RPCResponseNotification(SerialNumber,Obj));
inline void PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj) {
ResponseQueue_.enqueueNotification(new RPCResponseNotification(Utils::SerialNumberToInt(SerialNumber),std::move(Obj)));
}
std::shared_ptr<promise_type_t> PostCommandOneWayDisk(uint64_t RPCID,
std::shared_ptr<promise_type_t> PostCommandOneWayDisk(uint64_t RPC_ID,
APCommands::Commands Command,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(RPCID, SerialNumber,
return PostCommand(RPC_ID,
Command,
SerialNumber,
Method,
Params,
UUID,
@@ -90,13 +93,15 @@ namespace OpenWifi {
}
std::shared_ptr<promise_type_t> PostCommandDisk(
uint64_t RPCID,
uint64_t RPC_ID,
APCommands::Commands Command,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(RPCID,
return PostCommand(RPC_ID,
Command,
SerialNumber,
Method,
Params,
@@ -105,13 +110,16 @@ namespace OpenWifi {
}
std::shared_ptr<promise_type_t> PostCommand(
uint64_t RPCID,
uint64_t RPC_ID,
APCommands::Commands Command,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(RPCID, SerialNumber,
return PostCommand(RPC_ID,
Command,
SerialNumber,
Method,
Params,
UUID,
@@ -120,13 +128,15 @@ namespace OpenWifi {
}
std::shared_ptr<promise_type_t> PostCommandOneWay(
uint64_t RPCID,
uint64_t RPC_ID,
APCommands::Commands Command,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(RPCID,
return PostCommand(RPC_ID,
Command,
SerialNumber,
Method,
Params,
@@ -147,15 +157,14 @@ namespace OpenWifi {
inline bool Running() const { return Running_; }
void onJanitorTimer(Poco::Timer & timer);
void onCommandRunnerTimer(Poco::Timer & timer);
void onRPCAnswer(bool& b);
inline uint64_t NextRPCId() { return ++Id_; }
inline uint64_t Next_RPC_ID() { return ++Id_; }
void RemovePendingCommand(std::uint64_t Id) {
std::unique_lock Lock(LocalMutex_);
OutStandingRequests_.erase(Id);
}
inline bool CommandRunningForDevice(std::uint64_t SerialNumber, std::string & uuid, std::string &command) {
inline bool CommandRunningForDevice(std::uint64_t SerialNumber, std::string & uuid, APCommands::Commands &command) {
std::lock_guard Lock(LocalMutex_);
for(const auto &[Request,Command]:OutStandingRequests_) {
@@ -192,6 +201,7 @@ namespace OpenWifi {
std::shared_ptr<promise_type_t> PostCommand(
uint64_t RPCID,
APCommands::Commands Command,
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,

View File

@@ -27,6 +27,9 @@
#include "framework/ConfigurationValidator.h"
#include "rttys/RTTYS_server.h"
#include "framework/UI_WebSocketClientServer.h"
#include "UI_GW_WebSocketNotifications.h"
#include "ScriptManager.h"
#include "SignatureMgr.h"
namespace OpenWifi {
class Daemon *Daemon::instance() {
@@ -49,6 +52,8 @@ namespace OpenWifi {
RTTYS_server(),
RADIUS_proxy_server(),
VenueBroadcaster(),
ScriptManager(),
SignatureManager(),
AP_WS_Server()
});
return &instance;
@@ -105,6 +110,7 @@ namespace OpenWifi {
void DaemonPostInitialization(Poco::Util::Application &self) {
Daemon()->PostInitialization(self);
GWWebSocketNotifications::Register();
}
}

View File

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

View File

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

View File

@@ -126,34 +126,32 @@ namespace OpenWifi {
}
// if you pass in an empty UUID, it will just clean the list and not add it.
bool FileUploader::AddUUID( const std::string & UUID) {
bool FileUploader::AddUUID( const std::string & UUID, std::chrono::seconds WaitTimeInSeconds, const std::string &Type) {
std::lock_guard Guard(Mutex_);
uint64_t now = Utils::Now();
// remove old stuff...
for(auto i=OutStandingUploads_.begin();i!=OutStandingUploads_.end();) {
if ((now-i->second) > (60 * 30))
i = OutStandingUploads_.erase(i);
else
++i;
}
if(!UUID.empty())
OutStandingUploads_[UUID] = now;
auto Func=[now](const UploadId &I) -> bool {
return (now > I.Expires);
};
OutStandingUploads_.erase(std::remove_if(OutStandingUploads_.begin(),OutStandingUploads_.end(),Func),OutStandingUploads_.end());
OutStandingUploads_.emplace_back(UploadId{UUID, now + WaitTimeInSeconds.count(), Type});
return true;
}
bool FileUploader::ValidRequest(const std::string &UUID) {
std::lock_guard Guard(Mutex_);
return OutStandingUploads_.find(UUID)!=OutStandingUploads_.end();
auto Func = [UUID](const UploadId &P) -> bool {
return (P.UUID==UUID);
};
return std::find_if(OutStandingUploads_.begin(), OutStandingUploads_.end(), Func) != end(OutStandingUploads_);
}
void FileUploader::RemoveRequest(const std::string &UUID) {
std::lock_guard Guard(Mutex_);
OutStandingUploads_.erase(UUID);
auto Func = [UUID](const UploadId &P) -> bool {
return (P.UUID==UUID);
};
OutStandingUploads_.erase(std::remove_if(OutStandingUploads_.begin(),OutStandingUploads_.end(),Func),OutStandingUploads_.end());
}
class FileUploaderPartHandler2 : public Poco::Net::PartHandler {
@@ -193,9 +191,10 @@ namespace OpenWifi {
class FormRequestHandler: public Poco::Net::HTTPRequestHandler
{
public:
explicit FormRequestHandler(std::string UUID, Poco::Logger & L):
explicit FormRequestHandler(std::string UUID, Poco::Logger & L, const std::string &Type):
UUID_(std::move(UUID)),
Logger_(L)
Logger_(L),
Type_(Type)
{
}
@@ -230,8 +229,8 @@ namespace OpenWifi {
Poco::StreamCopier::copyStream(Reader.stream(), FileContent);
Answer.set("filename", UUID_);
Answer.set("error", 0);
poco_debug(Logger(),fmt::format("{}: Trace file uploaded.", UUID_));
StorageService()->AttachFileDataToCommand(UUID_, FileContent);
poco_debug(Logger(),fmt::format("{}: File uploaded.", UUID_));
StorageService()->AttachFileDataToCommand(UUID_, FileContent, Type_);
std::ostream &ResponseStream = Response.send();
Poco::JSON::Stringifier::stringify(Answer, ResponseStream);
return;
@@ -267,6 +266,7 @@ namespace OpenWifi {
private:
std::string UUID_;
Poco::Logger & Logger_;
std::string Type_;
};
Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
@@ -285,11 +285,12 @@ namespace OpenWifi {
if( UUIDLocation != std::string::npos )
{
auto UUID = Request.getURI().substr(UUIDLocation+URI_BASE.size());
if(FileUploader()->ValidRequest(UUID))
FileUploader::UploadId E;
if(FileUploader()->Find(UUID,E))
{
// make sure we do not allow anyone else to overwrite our file
FileUploader()->RemoveRequest(UUID);
return new FormRequestHandler(UUID,Logger());
return new FormRequestHandler(UUID,Logger(),E.Type);
}
else
{
@@ -299,6 +300,17 @@ namespace OpenWifi {
return nullptr;
}
bool FileUploader::Find(const std::string &UUID, UploadId &V) {
std::lock_guard G(Mutex_);
for(const auto &E:OutStandingUploads_) {
if (E.UUID == UUID) {
V = E;
return true;
}
}
return false;
}
void FileUploader::Stop() {
poco_notice(Logger(),"Stopping...");
for( const auto & svr : Servers_ )

View File

@@ -19,11 +19,18 @@ namespace OpenWifi {
class FileUploader : public SubSystemServer {
public:
struct UploadId {
std::string UUID;
std::uint64_t Expires;
std::string Type;
};
int Start() override;
void Stop() override;
void reinitialize(Poco::Util::Application &self) override;
const std::string & FullName();
bool AddUUID( const std::string & UUID);
bool AddUUID( const std::string & UUID, std::chrono::seconds WaitTimeInSecond, const std::string &Type);
bool ValidRequest(const std::string & UUID);
void RemoveRequest(const std::string &UUID);
const std::string & Path() { return Path_; };
@@ -35,12 +42,13 @@ namespace OpenWifi {
[[nodiscard]] inline uint64_t MaxSize() const { return MaxSize_; }
bool Find(const std::string &UUID, UploadId &V);
private:
std::vector<std::unique_ptr<Poco::Net::HTTPServer>> Servers_;
std::string FullName_;
std::map<std::string,uint64_t> OutStandingUploads_;
std::string Path_;
uint64_t MaxSize_=10000000;
std::string FullName_;
std::list<UploadId> OutStandingUploads_;
std::string Path_;
uint64_t MaxSize_=10000000;
explicit FileUploader() noexcept:
SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader")
@@ -51,10 +59,13 @@ namespace OpenWifi {
class FileUpLoaderRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
public:
explicit FileUpLoaderRequestHandlerFactory(Poco::Logger &L) :
Logger_(L){}
Logger_(L) {
}
Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &request) override;
inline Poco::Logger & Logger() { return Logger_; }
inline Poco::Logger & Logger() {
return Logger_;
}
private:
Poco::Logger & Logger_;
};

View File

@@ -291,6 +291,8 @@ static const struct tok radius_attribute_names[] = {
constexpr unsigned char CoA_ACK = 44;
constexpr unsigned char CoA_NAK = 45;
constexpr unsigned char ATTR_MessageAuthenticator = 80;
inline bool IsAuthentication(unsigned char t) {
return (t == RADIUS::Access_Request ||
t == RADIUS::Access_Accept ||
@@ -330,6 +332,11 @@ static const struct tok radius_attribute_names[] = {
return "Unknown";
}
inline void MakeRadiusAuthenticator(unsigned char *authenticator) {
for(int i=0;i<16;i++)
authenticator[i]=std::rand() & 0xff;
}
//
// From: https://github.com/Telecominfraproject/wlan-dictionary/blob/main/dictionary.tip
//
@@ -666,6 +673,44 @@ static const struct tok radius_attribute_names[] = {
bool Valid_=false;
};
class RadiusOutputPacket {
public:
explicit RadiusOutputPacket(const std::string &Secret)
: Secret_(Secret) {
}
inline void MakeStatusMessage() {
P_.code = RADCMD_STATUS_SER;
P_.identifier = std::rand() & 0x00ff;
MakeRadiusAuthenticator(P_.authenticator);
unsigned char MessageAuthenticator[16]{0};
AddAttribute(ATTR_MessageAuthenticator,sizeof(MessageAuthenticator),MessageAuthenticator);
P_.rawlen = 1 + 1 + 2 + 16 + 1 + 1 + 16;
Poco::HMACEngine<Poco::MD5Engine> H(Secret_);
H.update((const unsigned char *)&P_, P_.rawlen);
auto digest = H.digest();
int p = 0;
for (const auto &i : digest)
P_.attributes[1 + 1 + p++] = i;
}
inline void AddAttribute(unsigned char attr, uint8_t len, const unsigned char * data) {
P_.attributes[AttributesLen_++] = attr;
P_.attributes[AttributesLen_++] = len;
memcpy(&P_.attributes[AttributesLen_],data,len);
AttributesLen_+=len;
}
[[nodiscard]] inline const unsigned char * Data() const { return (const unsigned char *) &P_;}
[[nodiscard]] inline std::uint16_t Len() const { return P_.rawlen; }
private:
RawRadiusPacket P_;
uint16_t AttributesLen_=0;
std::string Secret_;
};
inline std::ostream &operator<<(std::ostream &os, RadiusPacket const &P) {
os << P.Attrs_ ;
return os;

View File

@@ -22,124 +22,132 @@ namespace OpenWifi {
ConfigFilename_ = MicroServiceDataDirectory()+"/radius_pool_config.json";
Poco::File Config(ConfigFilename_);
enabled_ = MicroServiceConfigGetBool("radius.proxy.enable",false);
if(!enabled_ && !Config.exists()) {
Enabled_ = MicroServiceConfigGetBool("radius.proxy.enable",false);
if(!Enabled_ && !Config.exists()) {
StopRADSECServers();
return 0;
}
poco_notice(Logger(),"Starting...");
enabled_ = true;
Enabled_ = true;
Poco::Net::SocketAddress AuthSockAddrV4(Poco::Net::AddressFamily::IPv4,
MicroServiceConfigGetInt("radius.proxy.authentication.port",DEFAULT_RADIUS_AUTHENTICATION_PORT));
AuthenticationSocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(AuthSockAddrV4,true);
AuthenticationSocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(AuthSockAddrV4,true,true);
Poco::Net::SocketAddress AuthSockAddrV6(Poco::Net::AddressFamily::IPv6,
MicroServiceConfigGetInt("radius.proxy.authentication.port",DEFAULT_RADIUS_AUTHENTICATION_PORT));
AuthenticationSocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(AuthSockAddrV6,true);
AuthenticationSocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(AuthSockAddrV6,true,true);
Poco::Net::SocketAddress AcctSockAddrV4(Poco::Net::AddressFamily::IPv4,
MicroServiceConfigGetInt("radius.proxy.accounting.port",DEFAULT_RADIUS_ACCOUNTING_PORT));
AccountingSocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(AcctSockAddrV4,true);
AccountingSocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(AcctSockAddrV4,true,true);
Poco::Net::SocketAddress AcctSockAddrV6(Poco::Net::AddressFamily::IPv6,
MicroServiceConfigGetInt("radius.proxy.accounting.port",DEFAULT_RADIUS_ACCOUNTING_PORT));
AccountingSocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(AcctSockAddrV6,true);
AccountingSocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(AcctSockAddrV6,true,true);
Poco::Net::SocketAddress CoASockAddrV4(Poco::Net::AddressFamily::IPv4,
MicroServiceConfigGetInt("radius.proxy.coa.port",DEFAULT_RADIUS_CoA_PORT));
CoASocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(CoASockAddrV4,true);
CoASocketV4_ = std::make_unique<Poco::Net::DatagramSocket>(CoASockAddrV4,true,true);
Poco::Net::SocketAddress CoASockAddrV6(Poco::Net::AddressFamily::IPv6,
MicroServiceConfigGetInt("radius.proxy.coa.port",DEFAULT_RADIUS_CoA_PORT));
CoASocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(CoASockAddrV6,true);
CoASocketV6_ = std::make_unique<Poco::Net::DatagramSocket>(CoASockAddrV6,true,true);
RadiusReactor_.addEventHandler(*AuthenticationSocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
RadiusReactor_.reset();
RadiusReactor_ = std::make_unique<Poco::Net::SocketReactor>();
RadiusReactor_->addEventHandler(*AuthenticationSocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAuthenticationSocketReadable));
RadiusReactor_.addEventHandler(*AuthenticationSocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
RadiusReactor_->addEventHandler(*AuthenticationSocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAuthenticationSocketReadable));
RadiusReactor_.addEventHandler(*AccountingSocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
RadiusReactor_->addEventHandler(*AccountingSocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAccountingSocketReadable));
RadiusReactor_.addEventHandler(*AccountingSocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
RadiusReactor_->addEventHandler(*AccountingSocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAccountingSocketReadable));
RadiusReactor_.addEventHandler(*CoASocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
RadiusReactor_->addEventHandler(*CoASocketV4_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnCoASocketReadable));
RadiusReactor_.addEventHandler(*CoASocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
RadiusReactor_->addEventHandler(*CoASocketV6_,Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnCoASocketReadable));
ParseConfig();
// start RADSEC servers...
StopRADSECServers();
StartRADSECServers();
RadiusReactorThread_.start(RadiusReactor_);
RadiusReactorThread_.start(*RadiusReactor_);
Utils::SetThreadName(RadiusReactorThread_,"rad:reactor");
running_ = true;
Running_ = true;
return 0;
}
void RADIUS_proxy_server::Stop() {
poco_information(Logger(),"Stopping...");
if(enabled_ && running_) {
RadiusReactor_.removeEventHandler(
if(Enabled_ && Running_) {
poco_information(Logger(),"Stopping...");
RadiusReactor_->removeEventHandler(
*AuthenticationSocketV4_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAuthenticationSocketReadable));
RadiusReactor_.removeEventHandler(
RadiusReactor_->removeEventHandler(
*AuthenticationSocketV6_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAuthenticationSocketReadable));
RadiusReactor_.removeEventHandler(
RadiusReactor_->removeEventHandler(
*AccountingSocketV4_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAccountingSocketReadable));
RadiusReactor_.removeEventHandler(
RadiusReactor_->removeEventHandler(
*AccountingSocketV6_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnAccountingSocketReadable));
RadiusReactor_.removeEventHandler(
RadiusReactor_->removeEventHandler(
*CoASocketV4_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnCoASocketReadable));
RadiusReactor_.removeEventHandler(
RadiusReactor_->removeEventHandler(
*CoASocketV6_,
Poco::NObserver<RADIUS_proxy_server, Poco::Net::ReadableNotification>(
*this, &RADIUS_proxy_server::OnCoASocketReadable));
AuthenticationSocketV4_->close();
AuthenticationSocketV6_->close();
AccountingSocketV4_->close();
AccountingSocketV6_->close();
CoASocketV4_->close();
CoASocketV6_->close();
AuthenticationSocketV4_.reset();
AuthenticationSocketV6_.reset();
AccountingSocketV4_.reset();
AccountingSocketV6_.reset();
CoASocketV4_.reset();
CoASocketV6_.reset();
StopRADSECServers();
RadiusReactor_.stop();
RadiusReactor_->stop();
RadiusReactorThread_.join();
enabled_=false;
running_=false;
Running_=false;
poco_information(Logger(),"Stopped...");
}
poco_information(Logger(),"Stopped...");
}
void RADIUS_proxy_server::StartRADSECServers() {
std::lock_guard G(Mutex_);
for(const auto &pool:PoolList_.pools) {
for(const auto &entry:pool.authConfig.servers) {
if(entry.radsec) {
StartRADSECServer(entry);
RADSECservers_[ Poco::Net::SocketAddress(entry.ip,0) ] = std::make_unique<RADSEC_server>(*RadiusReactor_,entry);
}
}
}
}
void RADIUS_proxy_server::StopRADSECServers() {
std::lock_guard G(Mutex_);
RADSECservers_.clear();
}
void RADIUS_proxy_server::StartRADSECServer(const GWObjects::RadiusProxyServerEntry &E) {
RADSECservers_[ Poco::Net::SocketAddress(E.ip,0) ] = std::make_unique<RADSEC_server>(RadiusReactor_,E);
}
void RADIUS_proxy_server::OnAccountingSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf) {
Poco::Net::SocketAddress Sender;
RADIUS::RadiusPacket P;
@@ -208,7 +216,7 @@ namespace OpenWifi {
void RADIUS_proxy_server::SendAccountingData(const std::string &serialNumber, const char *buffer, std::size_t size) {
if(Pools_.empty() || !enabled_)
if(!Continue())
return;
try {
@@ -266,7 +274,7 @@ namespace OpenWifi {
void RADIUS_proxy_server::SendAuthenticationData(const std::string &serialNumber, const char *buffer, std::size_t size) {
if(Pools_.empty() || !enabled_)
if(!Continue())
return;
try {
@@ -319,7 +327,7 @@ namespace OpenWifi {
void RADIUS_proxy_server::SendCoAData(const std::string &serialNumber, const char *buffer, std::size_t size) {
if(Pools_.empty() || !enabled_)
if(!Continue())
return;
try {
@@ -389,7 +397,7 @@ namespace OpenWifi {
};
if(setAsDefault && D.useRADSEC)
defaultIsRADSEC_ = true;
DefaultIsRADSEC_ = true;
if(S.family()==Poco::Net::IPAddress::IPv4) {
TotalV4 += server.weight;
@@ -483,26 +491,26 @@ namespace OpenWifi {
}
}
if(defaultIsRADSEC_) {
if(DefaultIsRADSEC_) {
UseRADSEC = true;
return (IsV4 ? Pools_[defaultPoolIndex_].AuthV4[0].Addr : Pools_[defaultPoolIndex_].AuthV6[0].Addr );
return (IsV4 ? Pools_[DefaultPoolIndex_].AuthV4[0].Addr : Pools_[DefaultPoolIndex_].AuthV6[0].Addr );
}
switch(rtype) {
case radius_type::auth: {
return ChooseAddress(IsV4 ? Pools_[defaultPoolIndex_].AuthV4
: Pools_[defaultPoolIndex_].AuthV6,
return ChooseAddress(IsV4 ? Pools_[DefaultPoolIndex_].AuthV4
: Pools_[DefaultPoolIndex_].AuthV6,
RequestedAddress);
}
case radius_type::acct:
default: {
return ChooseAddress(IsV4 ? Pools_[defaultPoolIndex_].AcctV4
: Pools_[defaultPoolIndex_].AcctV6,
return ChooseAddress(IsV4 ? Pools_[DefaultPoolIndex_].AcctV4
: Pools_[DefaultPoolIndex_].AcctV6,
RequestedAddress);
}
case radius_type::coa: {
return ChooseAddress(IsV4 ? Pools_[defaultPoolIndex_].CoaV4
: Pools_[defaultPoolIndex_].CoaV6,
return ChooseAddress(IsV4 ? Pools_[DefaultPoolIndex_].CoaV4
: Pools_[DefaultPoolIndex_].CoaV6,
RequestedAddress);
}
}
@@ -621,7 +629,6 @@ namespace OpenWifi {
void RADIUS_proxy_server::SetConfig(const GWObjects::RadiusProxyPoolList &C) {
std::lock_guard G(Mutex_);
PoolList_ = C;
Poco::JSON::Object Disk;
C.to_json(Disk);
@@ -630,17 +637,17 @@ namespace OpenWifi {
Disk.stringify(ofs);
ofs.close();
if(!running_) {
Start();
}
ParseConfig();
Stop();
ResetConfig();
PoolList_ = C;
Start();
}
void RADIUS_proxy_server::ResetConfig() {
PoolList_.pools.clear();
Pools_.clear();
defaultPoolIndex_=0;
DefaultPoolIndex_=0;
DefaultIsRADSEC_=false;
}
void RADIUS_proxy_server::DeleteConfig() {
@@ -653,8 +660,8 @@ namespace OpenWifi {
} catch (...) {
}
ResetConfig();
Stop();
ResetConfig();
}
void RADIUS_proxy_server::GetConfig(GWObjects::RadiusProxyPoolList &C) {

View File

@@ -29,7 +29,7 @@ namespace OpenWifi {
int Start() final;
void Stop() final;
inline bool Enabled() const { return enabled_; }
inline bool Enabled() const { return Enabled_; }
void OnAccountingSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf);
void OnAuthenticationSocketReadable(const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf);
@@ -44,7 +44,6 @@ namespace OpenWifi {
void GetConfig(GWObjects::RadiusProxyPoolList &C);
void StartRADSECServers();
void StartRADSECServer(const GWObjects::RadiusProxyServerEntry &E);
void StopRADSECServers();
struct Destination {
@@ -62,6 +61,10 @@ namespace OpenWifi {
std::vector<std::string> realms;
};
inline bool Continue() const {
return Running_ && Enabled_ && !Pools_.empty();
}
private:
std::unique_ptr<Poco::Net::DatagramSocket> AccountingSocketV4_;
std::unique_ptr<Poco::Net::DatagramSocket> AccountingSocketV6_;
@@ -69,8 +72,8 @@ namespace OpenWifi {
std::unique_ptr<Poco::Net::DatagramSocket> AuthenticationSocketV6_;
std::unique_ptr<Poco::Net::DatagramSocket> CoASocketV4_;
std::unique_ptr<Poco::Net::DatagramSocket> CoASocketV6_;
Poco::Net::SocketReactor RadiusReactor_;
Poco::Thread RadiusReactorThread_;
std::unique_ptr<Poco::Net::SocketReactor> RadiusReactor_;
Poco::Thread RadiusReactorThread_;
GWObjects::RadiusProxyPoolList PoolList_;
std::string ConfigFilename_;
@@ -87,10 +90,10 @@ namespace OpenWifi {
};
std::vector<RadiusPool> Pools_;
uint defaultPoolIndex_=0;
bool enabled_=false;
bool defaultIsRADSEC_=false;
std::atomic_bool running_=false;
uint DefaultPoolIndex_=0;
bool Enabled_=false;
bool DefaultIsRADSEC_=false;
std::atomic_bool Running_=false;
RADIUS_proxy_server() noexcept:
SubSystemServer("RADIUS-PROXY", "RADIUS-PROXY", "radius.proxy")

View File

@@ -33,15 +33,17 @@ namespace OpenWifi {
Logger_(Poco::Logger::get(fmt::format("RADSEC: {}@{}:{}",
Server_.name ,
Server_.ip,
Server_.port)))
{
ReconnectThread_.start(*this);
Server_.port))) {
Start();
}
~RADSEC_server() {
if(ReconnectThread_.isRunning()) {
Stop();
}
Stop();
}
inline int Start() {
ReconnectThread_.start(*this);
return 0;
}
inline void Stop() {
@@ -52,12 +54,22 @@ namespace OpenWifi {
}
inline void run() final {
Poco::Thread::trySleep(3000);
std::uint64_t LastStatus=0 ;
auto RadSecKeepAlive = MicroServiceConfigGetInt("radsec.keepalive",120);
while(TryAgain_) {
if(!Connected_) {
std::unique_lock G(Mutex_);
std::lock_guard G(LocalMutex_);
LastStatus = Utils::Now() ;
Connect();
} else if( (Utils::Now() - LastStatus) > RadSecKeepAlive) {
RADIUS::RadiusOutputPacket P(Server_.radsecSecret);
P.MakeStatusMessage();
poco_information(Logger_,"Keep-Alive message.");
Socket_->sendBytes(P.Data(), P.Len());
LastStatus = Utils::Now();
}
Poco::Thread::trySleep(3000);
Poco::Thread::trySleep(!Connected_ ? 3000 : 10000);
}
}
@@ -65,22 +77,23 @@ namespace OpenWifi {
try {
if (Connected_) {
RADIUS::RadiusPacket P(buffer, length);
// std::cout << serial_number << " Sending " << P.PacketType() << " " << length << " bytes" << std::endl;
int sent_bytes;
if (P.VerifyMessageAuthenticator(Server_.radsecSecret)) {
poco_debug(Logger_,fmt::format("{}: {} Sending {} bytes", serial_number,
P.PacketType(), length));
poco_debug(Logger_, fmt::format("{}: {} Sending {} bytes", serial_number,
P.PacketType(), length));
sent_bytes = Socket_->sendBytes(buffer, length);
} else {
poco_debug(Logger_,fmt::format("{}: {} Sending {} bytes", serial_number,
P.PacketType(), length));
poco_debug(Logger_, fmt::format("{}: {} Sending {} bytes", serial_number,
P.PacketType(), length));
P.ComputeMessageAuthenticator(Server_.radsecSecret);
sent_bytes = Socket_->sendBytes(P.Buffer(), length);
}
return (sent_bytes == length);
}
} catch (const Poco::Exception &E) {
Logger_.log(E);
} catch (...) {
poco_warning(Logger_,"Exception occurred: while sending data.");
}
return false;
}
@@ -90,7 +103,7 @@ namespace OpenWifi {
try {
auto NumberOfReceivedBytes = Socket_->receiveBytes(Buffer,sizeof(Buffer));
if(NumberOfReceivedBytes>40) {
if(NumberOfReceivedBytes>=20) {
RADIUS::RadiusPacket P(Buffer,NumberOfReceivedBytes);
if (P.IsAuthentication()) {
auto SerialNumber = P.ExtractSerialNumberFromProxyState();
@@ -101,9 +114,7 @@ namespace OpenWifi {
AP_WS_Server()->SendRadiusAuthenticationData(SerialNumber, Buffer,
NumberOfReceivedBytes);
} else {
poco_debug(Logger_,
fmt::format("Invalid AUTH packet received in proxy dropped. No serial number Source={}",
Socket_->address().toString()));
poco_debug(Logger_, "AUTH packet dropped.");
}
} else if (P.IsAccounting()) {
auto SerialNumber = P.ExtractSerialNumberFromProxyState();
@@ -114,53 +125,72 @@ namespace OpenWifi {
AP_WS_Server()->SendRadiusAccountingData(SerialNumber, Buffer,
NumberOfReceivedBytes);
} else {
poco_debug(Logger_,
fmt::format("Invalid ACCT packet received in proxy dropped. No serial number Source={}",
Socket_->address().toString()));
poco_debug(Logger_, "ACCT packet dropped.");
}
} else if (P.IsAuthority()) {
auto SerialNumber = P.ExtractSerialNumberTIP();
if(!SerialNumber.empty()) {
poco_debug(Logger_,
fmt::format("{}: {} Received {} bytes.", SerialNumber,
P.PacketType(), NumberOfReceivedBytes));
AP_WS_Server()->SendRadiusCoAData(SerialNumber, Buffer,
NumberOfReceivedBytes);
} else {
poco_debug(Logger_, "CoA/DM packet dropped.");
}
} else {
poco_warning(Logger_,fmt::format("Unknown packet: Type: {} (type={}) Length={}", P.PacketType(), P.PacketTypeInt(), P.BufferLen()));
}
} else {
poco_warning(Logger_,"Invalid packet received. Resetting the connection.");
Disconnect();
}
} catch (const Poco::Exception &E) {
Logger_.log(E);
Disconnect();
} catch (...) {
Disconnect();
poco_warning(Logger_,"Exception occurred. Resetting the connection.");
}
}
inline void onError([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification>& pNf) {
std::cout << "onError" << std::endl;
poco_warning(Logger_,"Socker error. Terminating connection.");
Disconnect();
}
inline void onShutdown([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification>& pNf) {
std::cout << "onShutdown" << std::endl;
poco_warning(Logger_,"Socker socket shutdown. Terminating connection.");
Disconnect();
}
inline bool Connect() {
if(TryAgain_) {
std::lock_guard G(LocalMutex_);
Poco::TemporaryFile CertFile_(MicroServiceDataDirectory());
Poco::TemporaryFile KeyFile_(MicroServiceDataDirectory());
std::vector<Poco::TemporaryFile> CaCertFiles_;
std::vector<std::unique_ptr<Poco::TemporaryFile>> CaCertFiles_;
DecodeFile(CertFile_.path(), Server_.radsecCert);
DecodeFile(KeyFile_.path(), Server_.radsecKey);
for(auto &cert:Server_.radsecCacerts) {
CaCertFiles_.emplace_back(Poco::TemporaryFile(MicroServiceDataDirectory()));
DecodeFile(CaCertFiles_[CaCertFiles_.size()-1].path(), cert);
CaCertFiles_.emplace_back(std::make_unique<Poco::TemporaryFile>(MicroServiceDataDirectory()));
DecodeFile(CaCertFiles_[CaCertFiles_.size()-1]->path(), cert);
}
Poco::Net::Context::Ptr SecureContext = Poco::AutoPtr<Poco::Net::Context>(
new Poco::Net::Context(Poco::Net::Context::TLS_CLIENT_USE,
KeyFile_.path(),
CertFile_.path(),""));
if(Server_.allowSelfSigned) {
SecureContext->setSecurityLevel(Poco::Net::Context::SECURITY_LEVEL_NONE);
SecureContext->enableExtendedCertificateVerification(false);
}
for(const auto &ca:CaCertFiles_) {
Poco::Crypto::X509Certificate cert(ca.path());
Poco::Crypto::X509Certificate cert(ca->path());
SecureContext->addCertificateAuthority(cert);
}
@@ -172,7 +202,10 @@ namespace OpenWifi {
poco_information(Logger_, "Attempting to connect");
Socket_->connect(Destination, Poco::Timespan(100, 0));
Socket_->completeHandshake();
Socket_->verifyPeerCertificate();
if(!Server_.allowSelfSigned) {
Socket_->verifyPeerCertificate();
}
if(Socket_->havePeerCertificate()) {
Peer_Cert_ = std::make_unique<Poco::Crypto::X509Certificate>(Socket_->peerCertificate());
@@ -194,9 +227,6 @@ namespace OpenWifi {
*Socket_,
Poco::NObserver<RADSEC_server, Poco::Net::ShutdownNotification>(
*this, &RADSEC_server::onShutdown));
Socket_->setBlocking(false);
Socket_->setNoDelay(true);
Socket_->setKeepAlive(true);
Connected_ = true;
poco_information(Logger_,fmt::format("Connected. CN={}",CommonName()));
@@ -216,7 +246,7 @@ namespace OpenWifi {
inline void Disconnect() {
if(Connected_) {
std::unique_lock G(Mutex_);
std::lock_guard G(LocalMutex_);
Reactor_.removeEventHandler(
*Socket_, Poco::NObserver<RADSEC_server, Poco::Net::ReadableNotification>(
@@ -227,6 +257,7 @@ namespace OpenWifi {
Reactor_.removeEventHandler(
*Socket_, Poco::NObserver<RADSEC_server, Poco::Net::ShutdownNotification>(
*this, &RADSEC_server::onShutdown));
Socket_->close();
Connected_ = false;
}
poco_information(Logger_,"Disconnecting.");
@@ -259,7 +290,7 @@ namespace OpenWifi {
}
private:
std::recursive_mutex Mutex_;
std::recursive_mutex LocalMutex_;
Poco::Net::SocketReactor &Reactor_;
GWObjects::RadiusProxyServerEntry Server_;
Poco::Logger &Logger_;

View File

@@ -34,6 +34,7 @@ namespace OpenWifi::RESTAPI_RPC {
}
void WaitForCommand(uint64_t RPCID,
APCommands::Commands Command,
bool RetryLater,
GWObjects::CommandDetails &Cmd,
Poco::JSON::Object & Params,
@@ -64,7 +65,7 @@ namespace OpenWifi::RESTAPI_RPC {
bool Sent;
std::chrono::time_point<std::chrono::high_resolution_clock> rpc_submitted = std::chrono::high_resolution_clock::now();
std::shared_ptr<CommandManager::promise_type_t> rpc_endpoint =
CommandManager()->PostCommand(RPCID, Cmd.SerialNumber, Cmd.Command, Params, Cmd.UUID, Sent);
CommandManager()->PostCommand(RPCID, Command, Cmd.SerialNumber, Cmd.Command, Params, Cmd.UUID, Sent);
if(RetryLater && (!Sent || rpc_endpoint== nullptr)) {
Logger.information(fmt::format("{},{}: Pending completion. Device is not connected.", Cmd.UUID, RPCID));
@@ -82,13 +83,13 @@ namespace OpenWifi::RESTAPI_RPC {
if (rpc_result == std::future_status::ready) {
std::chrono::duration<double, std::milli> rpc_execution_time = std::chrono::high_resolution_clock::now() - rpc_submitted;
auto rpc_answer = rpc_future.get();
if (!rpc_answer.has(uCentralProtocol::RESULT) || !rpc_answer.isObject(uCentralProtocol::RESULT)) {
if (!rpc_answer->has(uCentralProtocol::RESULT) || !rpc_answer->isObject(uCentralProtocol::RESULT)) {
SetCommandStatus(Cmd, Request, Response, Handler, Storage::CommandExecutionType::COMMAND_FAILED, Logger);
Logger.information(fmt::format("{},{}: Invalid response. Missing result.", Cmd.UUID, RPCID));
return;
}
auto ResultFields = rpc_answer.get(uCentralProtocol::RESULT).extract<Poco::JSON::Object::Ptr>();
auto ResultFields = rpc_answer->get(uCentralProtocol::RESULT).extract<Poco::JSON::Object::Ptr>();
if (!ResultFields->has(uCentralProtocol::STATUS) || !ResultFields->isObject(uCentralProtocol::STATUS)) {
Cmd.executionTime = rpc_execution_time.count();
if(Cmd.Command=="ping") {
@@ -107,20 +108,20 @@ namespace OpenWifi::RESTAPI_RPC {
if (StatusInnerObj->has(uCentralProtocol::TEXT))
Cmd.ErrorText = StatusInnerObj->get(uCentralProtocol::TEXT).toString();
std::stringstream ResultText;
if(rpc_answer.has(uCentralProtocol::RESULT)) {
if(rpc_answer->has(uCentralProtocol::RESULT)) {
if(Cmd.Command==uCentralProtocol::WIFISCAN) {
auto ScanObj = rpc_answer.get(uCentralProtocol::RESULT).extract<Poco::JSON::Object::Ptr>();
auto ScanObj = rpc_answer->get(uCentralProtocol::RESULT).extract<Poco::JSON::Object::Ptr>();
ParseWifiScan(ScanObj, ResultText, Logger);
} else {
Poco::JSON::Stringifier::stringify(
rpc_answer.get(uCentralProtocol::RESULT), ResultText);
rpc_answer->get(uCentralProtocol::RESULT), ResultText);
}
} if (rpc_answer.has(uCentralProtocol::RESULT_64)) {
} if (rpc_answer->has(uCentralProtocol::RESULT_64)) {
uint64_t sz=0;
if(rpc_answer.has(uCentralProtocol::RESULT_SZ))
sz=rpc_answer.get(uCentralProtocol::RESULT_SZ);
if(rpc_answer->has(uCentralProtocol::RESULT_SZ))
sz=rpc_answer->get(uCentralProtocol::RESULT_SZ);
std::string UnCompressedData;
Utils::ExtractBase64CompressedData(rpc_answer.get(uCentralProtocol::RESULT_64).toString(),
Utils::ExtractBase64CompressedData(rpc_answer->get(uCentralProtocol::RESULT_64).toString(),
UnCompressedData,sz);
Poco::JSON::Stringifier::stringify(UnCompressedData, ResultText);
}
@@ -129,7 +130,7 @@ namespace OpenWifi::RESTAPI_RPC {
Cmd.Completed = Utils::Now();
Cmd.executionTime = rpc_execution_time.count();
if (Cmd.ErrorCode && Cmd.Command == uCentralProtocol::TRACE) {
if (Cmd.ErrorCode && (Cmd.Command == uCentralProtocol::TRACE || Cmd.Command == uCentralProtocol::SCRIPT)) {
Cmd.WaitingForFile = 0;
Cmd.AttachDate = Cmd.AttachSize = 0;
Cmd.AttachType = "";

View File

@@ -18,10 +18,13 @@
#include "StorageService.h"
#include "framework/RESTAPI_Handler.h"
#include "framework/ow_constants.h"
namespace OpenWifi::RESTAPI_RPC {
void WaitForCommand(
uint64_t RPCID,
APCommands::Commands Command,
bool RetryLater,
GWObjects::CommandDetails &Cmd,
Poco::JSON::Object & Params,

View File

@@ -20,6 +20,8 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
poco_debug(Logger(),fmt::format("BLACKLIST-DELETE: {}", SerialNumber));
GWObjects::BlackListedDevice D;
if(!StorageService()->GetBlackListDevice(SerialNumber, D)) {
return NotFound();
@@ -38,14 +40,12 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
poco_debug(Logger(),fmt::format("BLACKLIST-GET: {}", SerialNumber));
GWObjects::BlackListedDevice D;
if(!StorageService()->GetBlackListDevice(SerialNumber, D)) {
return NotFound();
}
Poco::JSON::Object Answer;
D.to_json(Answer);
return ReturnObject(Answer);
return Object(D);
}
void RESTAPI_blacklist::DoPost() {
@@ -60,6 +60,8 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
poco_debug(Logger(),fmt::format("BLACKLIST-POST: {}", D.serialNumber));
Poco::toLowerInPlace(D.serialNumber);
if(StorageService()->IsBlackListed(D.serialNumber)) {
return BadRequest(RESTAPI::Errors::SerialNumberExists);
@@ -70,12 +72,8 @@ namespace OpenWifi {
if(StorageService()->AddBlackListDevice(D)) {
GWObjects::BlackListedDevice CreatedDevice;
StorageService()->GetBlackListDevice(D.serialNumber,CreatedDevice);
Poco::JSON::Object Answer;
CreatedDevice.to_json(Answer);
return ReturnObject(Answer);
return Object(CreatedDevice);
}
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
@@ -92,6 +90,8 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
poco_debug(Logger(),fmt::format("BLACKLIST-PUT: {}", SerialNumber));
GWObjects::BlackListedDevice NewDevice;
if(!NewDevice.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
@@ -104,10 +104,7 @@ namespace OpenWifi {
GWObjects::BlackListedDevice CreatedDevice;
StorageService()->GetBlackListDevice(SerialNumber,CreatedDevice);
Poco::JSON::Object Answer;
CreatedDevice.to_json(Answer);
return ReturnObject(Answer);
return Object(CreatedDevice);
}
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}

View File

@@ -10,22 +10,16 @@
namespace OpenWifi {
void RESTAPI_blacklist_list::DoGet() {
std::vector<GWObjects::BlackListedDevice> Devices;
poco_debug(Logger(),fmt::format("BLACKLIST-GET: Device serial number list"));
Poco::JSON::Array Arr;
Poco::JSON::Object Answer;
std::vector<GWObjects::BlackListedDevice> Devices;
if(QB_.CountOnly) {
auto Count = StorageService()->GetBlackListDeviceCount();
return ReturnCountOnly(Count);
} else if(StorageService()->GetBlackListDevices(QB_.Offset, QB_.Limit, Devices)) {
for(const auto &i:Devices) {
Poco::JSON::Object O;
i.to_json(O);
Arr.add(O);
}
return Object("devices",Devices);
}
Answer.set("devices", Arr);
return ReturnObject(Answer);
NotFound();
}
}

View File

@@ -8,7 +8,7 @@
namespace OpenWifi {
void RESTAPI_capabilities_handler::DoGet() {
CapabilitiesCache_t Caps = CapabilitiesCache().AllCapabilities();
CapabilitiesCache_t Caps = CapabilitiesCache()->AllCapabilities();
Poco::JSON::Array ObjArr;
for(const auto &[deviceType,capabilities]:Caps) {

View File

@@ -20,9 +20,7 @@ namespace OpenWifi {
GWObjects::CommandDetails Command;
if (StorageService()->GetCommand(CommandUUID, Command)) {
Poco::JSON::Object RetObj;
Command.to_json(RetObj);
return ReturnObject(RetObj);
return Object(Command);
}
return NotFound();
}

View File

@@ -24,15 +24,7 @@ namespace OpenWifi {
StorageService()->GetCommands(SerialNumber, QB_.StartDate, QB_.EndDate, QB_.Offset, QB_.Limit,
Commands);
}
Poco::JSON::Array ArrayObj;
for (const auto &i : Commands) {
Poco::JSON::Object Obj;
i.to_json(Obj);
ArrayObj.add(Obj);
}
Poco::JSON::Object RetObj;
RetObj.set(RESTAPI::Protocol::COMMANDS, ArrayObj);
ReturnObject(RetObj);
return Object(RESTAPI::Protocol::COMMANDS, Commands);
}
void RESTAPI_commands::DoDelete() {

View File

@@ -22,9 +22,7 @@ namespace OpenWifi {
std::string Name = ORM::Escape(GetBinding(RESTAPI::Protocol::NAME, ""));
GWObjects::DefaultConfiguration DefConfig;
if (StorageService()->GetDefaultConfiguration(Name, DefConfig)) {
Poco::JSON::Object Obj;
DefConfig.to_json(Obj);
return ReturnObject(Obj);
return Object(DefConfig);
}
NotFound();
}
@@ -106,12 +104,9 @@ namespace OpenWifi {
GWObjects::DefaultConfiguration ModifiedConfig;
StorageService()->GetDefaultConfiguration(Name,ModifiedConfig);
Poco::JSON::Object Answer;
ModifiedConfig.to_json(Answer);
return ReturnObject(Answer);
return Object(ModifiedConfig);
}
BadRequest(RESTAPI::Errors::RecordNotUpdated);
}
}

View File

@@ -23,16 +23,6 @@ namespace OpenWifi {
std::vector<GWObjects::DefaultConfiguration> DefConfigs;
StorageService()->GetDefaultConfigurations(QB_.Offset, QB_.Limit, DefConfigs);
Poco::JSON::Array Objects;
for (const auto &i : DefConfigs) {
Poco::JSON::Object Obj;
i.to_json(Obj);
Objects.add(Obj);
}
Poco::JSON::Object RetObj;
RetObj.set(RESTAPI::Protocol::CONFIGURATIONS, Objects);
ReturnObject(RetObj);
return Object(RESTAPI::Protocol::CONFIGURATIONS, DefConfigs);
}
}

View File

@@ -8,9 +8,11 @@
namespace OpenWifi {
void RESTAPI_deviceDashboardHandler::DoGet() {
Daemon()->GetDashboard().Create();
Poco::JSON::Object Answer;
Daemon()->GetDashboard().Report().to_json(Answer);
ReturnObject(Answer);
poco_information(Logger(),fmt::format("GET-DASHBOARD: {}", Requester()));
GWObjects::Dashboard Data;
if(Daemon()->GetDashboard().Get(Data, Logger())) {
return Object(Data);
}
return BadRequest(RESTAPI::Errors::InternalError);
}
}

View File

@@ -21,6 +21,8 @@
#include "TelemetryStream.h"
#include "CommandManager.h"
#include "SignatureMgr.h"
#include "framework/ConfigurationValidator.h"
#include "framework/KafkaTopics.h"
#include "framework/ow_constants.h"
@@ -33,7 +35,7 @@
namespace OpenWifi {
void RESTAPI_device_commandHandler::CallCanceled(const char * Cmd, const OpenWifi::RESTAPI::Errors::msg &Err, const std::string & Details) {
Logger_.warning(fmt::format("{},{}: TID={} Canceled. Error:{} Reason:{} Details={}", Cmd, SerialNumber_, TransactionId_, Err.err_num, Err.err_txt, Details));
poco_warning(Logger_,fmt::format("{},{}: TID={} Canceled. Error:{} Reason:{} Details={}", Cmd, SerialNumber_, TransactionId_, Err.err_num, Err.err_txt, Details));
}
void RESTAPI_device_commandHandler::DoGet() {
@@ -50,32 +52,40 @@ namespace OpenWifi {
return NotFound();
}
auto Command = APCommands::to_apcommand(Command_.c_str());
if(Command==APCommands::Commands::unknown) {
return BadRequest(RESTAPI::Errors::InvalidCommand);
}
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
Poco::Thread::current()->setName(fmt::format("{}:{}:{}", Command_, TransactionId_, SerialNumber_));
if (Command_ == RESTAPI::Protocol::CAPABILITIES){
return GetCapabilities();
} else if (Command_ == RESTAPI::Protocol::LOGS) {
return GetLogs();
} else if (Command_ == RESTAPI::Protocol::HEALTHCHECKS) {
return GetChecks();
} else if (Command_ == RESTAPI::Protocol::STATISTICS) {
return GetStatistics();
} else if (Command_ == RESTAPI::Protocol::STATUS) {
return GetStatus();
} else if (Command_ == RESTAPI::Protocol::RTTY) {
if(!AP_WS_Server()->Connected(SerialNumberInt_)) {
CallCanceled(Command_.c_str(), RESTAPI::Errors::DeviceNotConnected);
return BadRequest(RESTAPI::Errors::DeviceNotConnected);
}
auto UUID = MicroServiceCreateUUID();
auto RPC = CommandManager()->NextRPCId();
poco_debug(Logger_,fmt::format("Command rtty TID={} can proceed. Identified as {} and RPCID as {}. thr_id={}",
TransactionId_, UUID, RPC,
Poco::Thread::current()->id()));
return Rtty(UUID,RPC,60000ms);
} else {
return BadRequest(RESTAPI::Errors::InvalidCommand);
switch(Command) {
case APCommands::Commands::capabilities:
return GetCapabilities();
case APCommands::Commands::logs:
return GetLogs();
case APCommands::Commands::healthchecks:
return GetChecks();
case APCommands::Commands::statistics:
return GetStatistics();
case APCommands::Commands::status:
return GetStatus();
case APCommands::Commands::rtty: {
GWObjects::DeviceRestrictions Restrictions;
if(!AP_WS_Server()->Connected(SerialNumberInt_, Restrictions)) {
CallCanceled(Command_.c_str(), RESTAPI::Errors::DeviceNotConnected);
return BadRequest(RESTAPI::Errors::DeviceNotConnected);
}
auto UUID = MicroServiceCreateUUID();
auto RPC = CommandManager()->Next_RPC_ID();
poco_debug(Logger_,fmt::format("Command rtty TID={} can proceed. Identified as {} and RPCID as {}. thr_id={}",
TransactionId_, UUID, RPC,
Poco::Thread::current()->id()));
return Rtty(UUID,RPC,60000ms, Restrictions);
};
default:
return BadRequest(RESTAPI::Errors::InvalidCommand);
}
}
@@ -93,48 +103,51 @@ namespace OpenWifi {
return NotFound();
}
auto Command = APCommands::to_apcommand(Command_.c_str());
if(Command==APCommands::Commands::unknown) {
return BadRequest(RESTAPI::Errors::InvalidCommand);
}
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
Poco::Thread::current()->setName(fmt::format("{}:{}:{}",Command_, TransactionId_,SerialNumber_));
if (Command_ == RESTAPI::Protocol::CAPABILITIES) {
switch(Command) {
case APCommands::Commands::capabilities:
return DeleteCapabilities();
} else if (Command_ == RESTAPI::Protocol::LOGS){
case APCommands::Commands::logs:
return DeleteLogs();
} else if (Command_ == RESTAPI::Protocol::HEALTHCHECKS){
case APCommands::Commands::healthchecks:
return DeleteChecks();
} else if (Command_ == RESTAPI::Protocol::STATISTICS) {
case APCommands::Commands::statistics:
return DeleteStatistics();
} else {
default:
return BadRequest(RESTAPI::Errors::InvalidCommand);
}
}
struct PostDeviceCommand {
const char * Command;
bool AllowParallel=false;
bool RequireConnection = true;
void (RESTAPI_device_commandHandler::*funPtr)(const std::string &, std::uint64_t, std::chrono::milliseconds );
APCommands::Commands Command=APCommands::Commands::unknown;
bool AllowParallel=false;
bool RequireConnection = true;
void (RESTAPI_device_commandHandler::*funPtr)(const std::string &, std::uint64_t, std::chrono::milliseconds, const GWObjects::DeviceRestrictions &R );
std::chrono::milliseconds Timeout=120ms;
};
/*
const static std::vector<PostDeviceCommand> PostCommands
static const std::vector<PostDeviceCommand> PostCommands =
{
{ RESTAPI::Protocol::PERFORM, false, true, &RESTAPI_device_commandHandler::ExecuteCommand },
{ RESTAPI::Protocol::CONFIGURE, false, false, &RESTAPI_device_commandHandler::Configure },
{ RESTAPI::Protocol::UPGRADE, false, false, &RESTAPI_device_commandHandler::Upgrade },
{ RESTAPI::Protocol::REBOOT, false, true, &RESTAPI_device_commandHandler::Reboot },
{ RESTAPI::Protocol::FACTORY, false, false, &RESTAPI_device_commandHandler::Factory },
{ RESTAPI::Protocol::LEDS, false, true, &RESTAPI_device_commandHandler::LEDs },
{ RESTAPI::Protocol::TRACE, false, true, &RESTAPI_device_commandHandler::Trace },
{ RESTAPI::Protocol::REQUEST, false, true, &RESTAPI_device_commandHandler::MakeRequest },
{ RESTAPI::Protocol::WIFISCAN, false, true, &RESTAPI_device_commandHandler::WifiScan },
{ RESTAPI::Protocol::EVENTQUEUE, false, true, &RESTAPI_device_commandHandler::EventQueue },
{ RESTAPI::Protocol::TELEMETRY, false, true, &RESTAPI_device_commandHandler::Telemetry },
{ RESTAPI::Protocol::PING, false, true, &RESTAPI_device_commandHandler::Ping },
{ RESTAPI::Protocol::SCRIPT, false, true, &RESTAPI_device_commandHandler::Script }
};
*/
{ APCommands::Commands::configure, false, false, &RESTAPI_device_commandHandler::Configure, 120000ms },
{ APCommands::Commands::upgrade, false, false, &RESTAPI_device_commandHandler::Upgrade, 30000ms },
{ APCommands::Commands::reboot, false, true, &RESTAPI_device_commandHandler::Reboot, 30000ms },
{ APCommands::Commands::factory, false, false, &RESTAPI_device_commandHandler::Factory, 30000ms },
{ APCommands::Commands::leds, false, true, &RESTAPI_device_commandHandler::LEDs, 120000ms },
{ APCommands::Commands::trace, false, true, &RESTAPI_device_commandHandler::Trace, 300000ms },
{ APCommands::Commands::request, false, true, &RESTAPI_device_commandHandler::MakeRequest, 120000ms },
{ APCommands::Commands::wifiscan, false, true, &RESTAPI_device_commandHandler::WifiScan, 120000ms },
{ APCommands::Commands::eventqueue, false, true, &RESTAPI_device_commandHandler::EventQueue, 30000ms },
{ APCommands::Commands::telemetry, false, true, &RESTAPI_device_commandHandler::Telemetry, 30000ms },
{ APCommands::Commands::ping, false, true, &RESTAPI_device_commandHandler::Ping, 60000ms },
{ APCommands::Commands::script, false, true, &RESTAPI_device_commandHandler::Script, 300000ms }
};
void RESTAPI_device_commandHandler::DoPost() {
if(!ValidateParameters()) {
@@ -143,55 +156,46 @@ namespace OpenWifi {
if(!Utils::NormalizeMac(SerialNumber_)) {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
auto Command = APCommands::to_apcommand(Command_.c_str());
if(Command==APCommands::Commands::unknown) {
return BadRequest(RESTAPI::Errors::InvalidCommand);
}
SerialNumberInt_ = Utils::SerialNumberToInt(SerialNumber_);
GWObjects::Device TheDevice;
if(!StorageService()->GetDevice(SerialNumber_,TheDevice)) {
return NotFound();
}
const std::vector<PostDeviceCommand> PostCommands =
{
{ RESTAPI::Protocol::PERFORM, false, true, &RESTAPI_device_commandHandler::ExecuteCommand, 120000ms },
{ RESTAPI::Protocol::CONFIGURE, false, false, &RESTAPI_device_commandHandler::Configure, 120000ms },
{ RESTAPI::Protocol::UPGRADE, false, false, &RESTAPI_device_commandHandler::Upgrade, 30000ms },
{ RESTAPI::Protocol::REBOOT, false, true, &RESTAPI_device_commandHandler::Reboot, 30000ms },
{ RESTAPI::Protocol::FACTORY, false, false, &RESTAPI_device_commandHandler::Factory, 30000ms },
{ RESTAPI::Protocol::LEDS, false, true, &RESTAPI_device_commandHandler::LEDs, 120000ms },
{ RESTAPI::Protocol::TRACE, false, true, &RESTAPI_device_commandHandler::Trace, 300000ms },
{ RESTAPI::Protocol::REQUEST, false, true, &RESTAPI_device_commandHandler::MakeRequest, 120000ms },
{ RESTAPI::Protocol::WIFISCAN, false, true, &RESTAPI_device_commandHandler::WifiScan, 120000ms },
{ RESTAPI::Protocol::EVENTQUEUE, false, true, &RESTAPI_device_commandHandler::EventQueue, 30000ms },
{ RESTAPI::Protocol::TELEMETRY, false, true, &RESTAPI_device_commandHandler::Telemetry, 30000ms },
{ RESTAPI::Protocol::PING, false, true, &RESTAPI_device_commandHandler::Ping, 60000ms },
{ RESTAPI::Protocol::SCRIPT, false, true, &RESTAPI_device_commandHandler::Script, 300000ms }
};
for(const auto &Command:PostCommands) {
if(Command_==Command.Command) {
Poco::Thread::current()->setName(fmt::format("{}:{}:{}",Command.Command, TransactionId_,SerialNumber_));
if(Command.RequireConnection && !AP_WS_Server()->Connected(SerialNumberInt_)) {
CallCanceled(Command.Command, RESTAPI::Errors::DeviceNotConnected);
for(const auto &PostCommand:PostCommands) {
if(Command==PostCommand.Command) {
Poco::Thread::current()->setName(fmt::format("{}:{}:{}",Command_, TransactionId_,SerialNumber_));
GWObjects::DeviceRestrictions Restrictions;
if(PostCommand.RequireConnection && !AP_WS_Server()->Connected(SerialNumberInt_, Restrictions)) {
CallCanceled(Command_.c_str(), RESTAPI::Errors::DeviceNotConnected);
return BadRequest(RESTAPI::Errors::DeviceNotConnected);
}
std::string Command_UUID, CommandName;
if(!Command.AllowParallel && CommandManager()->CommandRunningForDevice(SerialNumberInt_,Command_UUID,CommandName)) {
auto Extra = fmt::format("UUID={} Command={}", Command_UUID, CommandName);
CallCanceled(Command.Command, RESTAPI::Errors::DeviceIsAlreadyBusy, Extra);
std::string Command_UUID;
APCommands::Commands CommandName;
if(!PostCommand.AllowParallel && CommandManager()->CommandRunningForDevice(SerialNumberInt_,Command_UUID,CommandName)) {
auto Extra = fmt::format("UUID={} Command={}", Command_UUID, APCommands::to_string(CommandName));
CallCanceled(Command_.c_str(), RESTAPI::Errors::DeviceIsAlreadyBusy, Extra);
return BadRequest(RESTAPI::Errors::DeviceIsAlreadyBusy, Extra);
}
auto UUID = MicroServiceCreateUUID();
auto RPC = CommandManager()->NextRPCId();
auto RPC = CommandManager()->Next_RPC_ID();
poco_debug(Logger_,fmt::format("Command {} TID={} can proceed. Identified as {} and RPCID as {}. thr_id={}",
Command.Command, TransactionId_, UUID, RPC,
Command_, TransactionId_, UUID, RPC,
Poco::Thread::current()->id()));
return (*this.*Command.funPtr)(UUID,RPC,Command.Timeout);
return (*this.*PostCommand.funPtr)(UUID,RPC,PostCommand.Timeout, Restrictions);
}
}
return BadRequest(RESTAPI::Errors::InvalidCommand);
}
void RESTAPI_device_commandHandler::GetCapabilities() {
Logger_.information(fmt::format("GET-CAPABILITIES: TID={} user={} serial={}. thr_id={}",
poco_information(Logger_,fmt::format("GET-CAPABILITIES: TID={} user={} serial={}. thr_id={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
GWObjects::Capabilities Caps;
@@ -205,7 +209,7 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::DeleteCapabilities() {
Logger_.information(fmt::format("DELETE-CAPABILITIES: TID={} user={} serial={}. thr_id={}",
poco_information(Logger_,fmt::format("DELETE-CAPABILITIES: TID={} user={} serial={}. thr_id={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
if (StorageService()->DeleteDeviceCapabilities(SerialNumber_)) {
@@ -215,17 +219,18 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::GetStatistics() {
Logger_.information(fmt::format("GET-STATISTICS: TID={} user={} serial={}. thr_id={}",
std::string StatsType = QB_.LastOnly ? "LastOnly" : ( QB_.Newest ? "Newest" :
( QB_.CountOnly ? "CountOnly" : "Timed"));
poco_information(Logger_,fmt::format("GET-STATISTICS: TID={} user={} serial={}. thr_id={}, TYPE={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
Poco::Thread::current()->id(),StatsType));
if (QB_.LastOnly) {
std::string Stats;
if (AP_WS_Server()->GetStatistics(SerialNumber_, Stats) && !Stats.empty()) {
Poco::JSON::Parser P;
if (Stats.empty())
Stats = uCentralProtocol::EMPTY_JSON_DOC;
auto Obj = P.parse(Stats).extract<Poco::JSON::Object::Ptr>();
return ReturnObject(*Obj);
return ReturnRawJSON(Stats);
}
if(AP_WS_Server()->Connected(SerialNumberInt_)) {
return BadRequest(RESTAPI::Errors::NoDeviceStatisticsYet);
}
return BadRequest(RESTAPI::Errors::DeviceNotConnected);
}
@@ -234,16 +239,25 @@ namespace OpenWifi {
if (QB_.Newest) {
StorageService()->GetNewestStatisticsData(SerialNumber_, QB_.Limit, Stats);
} else {
if(QB_.CountOnly) {
std::uint64_t Count = 0 ;
StorageService()->GetNumberOfStatisticsDataRecords(SerialNumber_, QB_.StartDate, QB_.EndDate,Count);
return ReturnCountOnly(Count);
}
if(QB_.Limit>100)
QB_.Limit=100;
StorageService()->GetStatisticsData(SerialNumber_, QB_.StartDate, QB_.EndDate,
QB_.Offset, QB_.Limit, Stats);
}
Poco::JSON::Array ArrayObj;
Poco::JSON::Array::Ptr ArrayObj = Poco::SharedPtr<Poco::JSON::Array>(new Poco::JSON::Array);
for (const auto &i : Stats) {
Poco::JSON::Object Obj;
i.to_json(Obj);
ArrayObj.add(Obj);
Poco::JSON::Object::Ptr Obj = Poco::SharedPtr<Poco::JSON::Object>(new Poco::JSON::Object);
i.to_json(*Obj);
ArrayObj->add(Obj);
}
Poco::JSON::Object RetObj;
RetObj.set(RESTAPI::Protocol::DATA, ArrayObj);
RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
@@ -252,7 +266,7 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::DeleteStatistics() {
Logger_.information(fmt::format("DELETE-STATISTICS: TID={} user={} serial={}. thr_id={}",
poco_information(Logger_,fmt::format("DELETE-STATISTICS: TID={} user={} serial={}. thr_id={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
if (StorageService()->DeleteStatisticsData(SerialNumber_, QB_.StartDate, QB_.EndDate)) {
@@ -262,7 +276,7 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::GetStatus() {
Logger_.information(fmt::format("GET-STATUS: TID={} user={} serial={}. thr_id={}",
poco_information(Logger_,fmt::format("GET-STATUS: TID={} user={} serial={}. thr_id={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
GWObjects::ConnectionState State;
@@ -280,7 +294,7 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::GetLogs() {
Logger_.information(fmt::format("GET-LOGS: TID={} user={} serial={}. thr_id={}",
poco_information(Logger_,fmt::format("GET-LOGS: TID={} user={} serial={}. thr_id={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
std::vector<GWObjects::DeviceLog> Logs;
@@ -304,7 +318,7 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::DeleteLogs() {
Logger_.information(fmt::format("DELETE-LOGS: TID={} user={} serial={}. thr_id={}",
poco_information(Logger_,fmt::format("DELETE-LOGS: TID={} user={} serial={}. thr_id={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
if (StorageService()->DeleteLogData(SerialNumber_, QB_.StartDate, QB_.EndDate,
@@ -315,12 +329,10 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::GetChecks() {
Logger_.information(fmt::format("GET-HEALTHCHECKS: TID={} user={} serial={}. thr_id={}",
poco_information(Logger_,fmt::format("GET-HEALTHCHECKS: TID={} user={} serial={}. thr_id={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
std::vector<GWObjects::HealthCheck> Checks;
if (QB_.LastOnly) {
GWObjects::HealthCheck HC;
if (AP_WS_Server()->GetHealthcheck(SerialNumber_, HC)) {
@@ -331,6 +343,7 @@ namespace OpenWifi {
return NotFound();
}
} else {
std::vector<GWObjects::HealthCheck> Checks;
if (QB_.Newest) {
StorageService()->GetNewestHealthCheckData(SerialNumber_, QB_.Limit, Checks);
} else {
@@ -353,7 +366,7 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::DeleteChecks() {
Logger_.information(fmt::format("DELETE-HEALTHCHECKS: TID={} user={} serial={}. thr_id={}",
poco_information(Logger_,fmt::format("DELETE-HEALTHCHECKS: TID={} user={} serial={}. thr_id={}",
TransactionId_, Requester(), SerialNumber_,
Poco::Thread::current()->id()));
if (StorageService()->DeleteHealthCheckData(SerialNumber_, QB_.StartDate, QB_.EndDate)) {
@@ -362,8 +375,8 @@ namespace OpenWifi {
BadRequest(RESTAPI::Errors::NoRecordsDeleted);
}
void RESTAPI_device_commandHandler::Ping(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("PING({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::Ping(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("PING({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
@@ -386,7 +399,7 @@ namespace OpenWifi {
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, nullptr, Logger_);
RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::ping,false,Cmd, Params, *Request, *Response, timeout, nullptr, nullptr, Logger_);
GWObjects::CommandDetails Cmd2;
if(StorageService()->GetCommand(CMD_UUID,Cmd2)) {
@@ -415,15 +428,15 @@ namespace OpenWifi {
}
void RESTAPI_device_commandHandler::CallCanceled(const char * Cmd, const std::string &UUID, uint64_t RPC, const OpenWifi::RESTAPI::Errors::msg &Err) {
Logger_.warning(fmt::format("{}({},{}): Canceled. Error:{} Reason:{}", Cmd, UUID, RPC, Err.err_num, Err.err_txt));
poco_warning(Logger_,fmt::format("{}({},{}): Canceled. Error:{} Reason:{}", Cmd, UUID, RPC, Err.err_num, Err.err_txt));
}
void RESTAPI_device_commandHandler::Script(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("SCRIPT({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
if(!Internal_ && UserInfo_.userinfo.userRole!=SecurityObjects::ROOT) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::ACCESS_DENIED);
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
}
static bool ValidateScriptType(const std::string &t) {
return t=="shell" || t=="bundle";
}
void RESTAPI_device_commandHandler::Script(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("SCRIPT({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
GWObjects::ScriptRequest SCR;
@@ -432,13 +445,25 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if (SCR.serialNumber.empty() ||
SCR.script.empty() ||
SCR.type.empty() ||
SCR.scriptId.empty() ||
(SCR.type!="shell" && SCR.type!="ucode")) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::MissingOrInvalidParameters);
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
bool DiagnosticScript = (SCR.type=="diagnostic");
if(!SCR.script.empty() && !SCR.scriptId.empty()) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::InvalidScriptSelection);
return UnAuthorized(RESTAPI::Errors::InvalidScriptSelection);
}
if(!Internal_ && UserInfo_.userinfo.userRole!=SecurityObjects::ROOT && SCR.scriptId.empty()) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::ACCESS_DENIED);
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
}
if (SCR.script.empty() && SCR.scriptId.empty() && !DiagnosticScript) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::InvalidScriptSelection);
return BadRequest(RESTAPI::Errors::InvalidScriptSelection);
}
if(DiagnosticScript && (!SCR.scriptId.empty() || !SCR.script.empty())){
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::InvalidScriptSelection);
return BadRequest(RESTAPI::Errors::InvalidScriptSelection);
}
if (SerialNumber_ != SCR.serialNumber) {
@@ -446,6 +471,50 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::SerialNumberMismatch);
}
if(!SCR.uri.empty() && !Utils::ValidateURI(SCR.uri)) {
return BadRequest(RESTAPI::Errors::InvalidURI);
}
GWObjects::Device D;
if(!StorageService()->GetDevice(SerialNumber_,D)) {
return NotFound();
}
if(!SCR.scriptId.empty()) {
GWObjects::ScriptEntry Existing;
if(!StorageService()->ScriptDB().GetRecord("id",SCR.scriptId,Existing)) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::MissingOrInvalidParameters);
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
// verify the role...
if(Existing.restricted.empty() && UserInfo_.userinfo.userRole!=SecurityObjects::ROOT) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::ACCESS_DENIED);
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
}
if(UserInfo_.userinfo.userRole!=SecurityObjects::ROOT) {
if (std::find(Existing.restricted.begin(), Existing.restricted.end(),
SecurityObjects::UserTypeToString(UserInfo_.userinfo.userRole)) ==
end(Existing.restricted)) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC, RESTAPI::Errors::ACCESS_DENIED);
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
}
}
poco_information(Logger_,fmt::format("SCRIPT({},{}): TID={} Name={}", CMD_UUID, CMD_RPC, TransactionId_, Existing.name));
SCR.script = Existing.content;
SCR.type = Existing.type;
if(!ParsedBody_->has("deferred"))
SCR.deferred = Existing.deferred;
if(!ParsedBody_->has("timeout"))
SCR.timeout = Existing.timeout;
} else {
if(!DiagnosticScript && !ValidateScriptType(SCR.type)) {
CallCanceled("SCRIPT", CMD_UUID, CMD_RPC,RESTAPI::Errors::MissingOrInvalidParameters);
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
}
uint64_t ap_timeout = SCR.timeout==0 ? 30 : SCR.timeout;
GWObjects::CommandDetails Cmd;
@@ -454,23 +523,50 @@ namespace OpenWifi {
Cmd.SubmittedBy = Requester();
Cmd.Command = uCentralProtocol::SCRIPT;
Cmd.RunAt = 0;
Cmd.WaitingForFile = SCR.deferred ? 1 : 0;
Poco::JSON::Object Params;
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentralProtocol::TIMEOUT, ap_timeout);
if(SCR.deferred && SCR.uri.empty()) {
SCR.uri = FileUploader()->FullName() + CMD_UUID ;
}
if(SCR.deferred) {
Params.set(uCentralProtocol::URI, SCR.uri);
} else {
Params.set(uCentralProtocol::TIMEOUT, ap_timeout);
}
if(!SCR.signature.empty()) {
Params.set(uCentralProtocol::SIGNATURE, SCR.signature);
}
if(D.restrictedDevice && SCR.signature.empty()) {
SCR.signature = SignatureManager()->Sign(R, SCR.script);
}
if(D.restrictedDevice && SCR.signature.empty()) {
return BadRequest(RESTAPI::Errors::DeviceRequiresSignature);
}
// convert script to base64 ...
auto EncodedScript = Utils::base64encode((const unsigned char *)SCR.script.c_str(),SCR.script.size());
Params.set(uCentralProtocol::TYPE, SCR.type);
Params.set(uCentralProtocol::SCRIPT, SCR.script);
if(!DiagnosticScript) {
Params.set(uCentralProtocol::SCRIPT, EncodedScript);
}
Params.set(uCentralProtocol::WHEN, SCR.when);
std::stringstream ParamStream;
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
FileUploader()->AddUUID(CMD_UUID, 15min, "script_result");
return RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::script,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
}
void RESTAPI_device_commandHandler::Configure(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("CONFIGURE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::Configure(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("CONFIGURE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
@@ -514,15 +610,15 @@ namespace OpenWifi {
Cmd.Details = ParamStream.str();
// AP_WS_Server()->SetPendingUUID(SerialNumber_, NewUUID);
return RESTAPI_RPC::WaitForCommand(CMD_RPC,true,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::configure,true,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
}
return BadRequest(RESTAPI::Errors::RecordNotUpdated);
}
BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
void RESTAPI_device_commandHandler::Upgrade(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("UPGRADE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::Upgrade(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("UPGRADE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
@@ -535,6 +631,12 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::SerialNumberMismatch);
}
GWObjects::Device DeviceInfo;
if(!StorageService()->GetDevice(SerialNumber_,DeviceInfo)) {
return NotFound();
}
std::string FWSignature = GetParameter("FWsignature","");
auto URI = GetS(RESTAPI::Protocol::URI, Obj);
auto When = GetWhen(Obj);
@@ -553,68 +655,33 @@ namespace OpenWifi {
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentralProtocol::URI, URI);
Params.set(uCentralProtocol::KEEP_REDIRECTOR, KeepRedirector ? 1 : 0);
Params.set(uCentralProtocol::WHEN, When);
std::stringstream ParamStream;
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
return RESTAPI_RPC::WaitForCommand(CMD_RPC,true,Cmd,Params, *Request, *Response, timeout, nullptr, this, Logger_);
}
BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
void RESTAPI_device_commandHandler::ExecuteCommand(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("EXECUTE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
if (Obj->has(RESTAPI::Protocol::COMMAND) &&
Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
Obj->has(RESTAPI::Protocol::PAYLOAD)) {
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) {
CallCanceled("EXECUTE", CMD_UUID, CMD_RPC,RESTAPI::Errors::SerialNumberMismatch);
return BadRequest(RESTAPI::Errors::SerialNumberMismatch);
if(DeviceInfo.restrictionDetails.upgrade && FWSignature.empty()) {
Poco::URI uri(URI);
FWSignature = SignatureManager()->Sign(DeviceInfo.restrictionDetails,uri);
}
auto Command = GetS(RESTAPI::Protocol::COMMAND, Obj);
auto Payload = GetS(RESTAPI::Protocol::PAYLOAD, Obj);
auto When = GetWhen(Obj);
if(FWSignature.empty() && DeviceInfo.restrictionDetails.upgrade) {
return BadRequest(RESTAPI::Errors::DeviceRequiresSignature);
}
GWObjects::CommandDetails Cmd;
if(!FWSignature.empty()) {
Params.set(uCentralProtocol::SIGNATURE, FWSignature);
}
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = CMD_UUID;
Cmd.SubmittedBy = Requester();
Cmd.Command = Command;
Cmd.Custom = 1;
Cmd.RunAt = When;
Poco::JSON::Parser parser2;
Poco::Dynamic::Var result = parser2.parse(Payload);
const auto &PayloadObject = result.extract<Poco::JSON::Object::Ptr>();
Poco::JSON::Object Params;
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentralProtocol::COMMAND, Command);
Params.set(uCentralProtocol::WHEN, When);
Params.set(uCentralProtocol::PAYLOAD, PayloadObject);
std::stringstream ParamStream;
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
return RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::upgrade,true,Cmd,Params, *Request, *Response, timeout, nullptr, this, Logger_);
}
BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
void RESTAPI_device_commandHandler::Reboot(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("REBOOT({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::Reboot(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("REBOOT({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
@@ -642,13 +709,13 @@ namespace OpenWifi {
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
return RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::reboot, false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
}
BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
void RESTAPI_device_commandHandler::Factory(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("FACTORY-RESET({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::Factory(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("FACTORY-RESET({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
if (Obj->has(RESTAPI::Protocol::KEEPREDIRECTOR) &&
@@ -682,13 +749,13 @@ namespace OpenWifi {
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
return RESTAPI_RPC::WaitForCommand(CMD_RPC,true,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::factory,true,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
}
BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
void RESTAPI_device_commandHandler::LEDs(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("LEDS({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::LEDs(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("LEDS({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
@@ -730,13 +797,13 @@ namespace OpenWifi {
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
return RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::leds,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
}
BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
void RESTAPI_device_commandHandler::Trace(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("TRACE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::Trace(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("TRACE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
@@ -782,14 +849,14 @@ namespace OpenWifi {
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
FileUploader()->AddUUID(CMD_UUID);
return RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
FileUploader()->AddUUID(CMD_UUID, 10min, "trace");
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::trace,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
}
BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
void RESTAPI_device_commandHandler::WifiScan(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("WIFISCAN({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::WifiScan(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("WIFISCAN({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
@@ -817,6 +884,11 @@ namespace OpenWifi {
Poco::JSON::Object Params;
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
if(R.dfs && OverrideDFS) {
return BadRequest(RESTAPI::Errors::DeviceIsRestricted);
}
Params.set(uCentralProtocol::OVERRIDEDFS, OverrideDFS);
Params.set(uCentralProtocol::ACTIVE, ActiveScan);
if(ies)
@@ -827,14 +899,14 @@ namespace OpenWifi {
std::stringstream ParamStream;
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::wifiscan,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
if (Cmd.ErrorCode == 0) {
KafkaManager()->PostMessage(KafkaTopics::WIFISCAN, SerialNumber_, Cmd.Results);
}
}
void RESTAPI_device_commandHandler::EventQueue(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("EVENT-QUEUE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::EventQueue(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("EVENT-QUEUE({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
@@ -862,7 +934,7 @@ namespace OpenWifi {
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::eventqueue,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_);
if(Cmd.ErrorCode==0) {
KafkaManager()->PostMessage(KafkaTopics::DEVICE_EVENT_QUEUE, SerialNumber_,
Cmd.Results);
@@ -872,8 +944,8 @@ namespace OpenWifi {
BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
void RESTAPI_device_commandHandler::MakeRequest(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("FORCE-REQUEST({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::MakeRequest(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("FORCE-REQUEST({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
@@ -909,47 +981,45 @@ namespace OpenWifi {
Params.stringify(ParamStream);
Cmd.Details = ParamStream.str();
return RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_ );
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::request,false,Cmd, Params, *Request, *Response, timeout, nullptr, this, Logger_ );
}
BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
void RESTAPI_device_commandHandler::Rtty(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout) {
Logger_.information(fmt::format("RTTY({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
#define DBGLINE { std::cout << __LINE__ << std::endl; }
void RESTAPI_device_commandHandler::Rtty(const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R) {
poco_information(Logger_,fmt::format("RTTY({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
if(R.rtty) {
return BadRequest(RESTAPI::Errors::DeviceIsRestricted);
}
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
if (MicroServiceConfigGetBool("rtty.enabled", false)) {
GWObjects::Device Device;
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
if (StorageService()->GetDevice(SerialNumber_, Device)) {
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
static std::uint64_t rtty_sid = 0;
rtty_sid += std::rand();
GWObjects::RttySessionDetails Rtty{
.SerialNumber = SerialNumber_,
.Server = MicroServiceConfigGetString("rtty.server", "localhost"),
.Port = MicroServiceConfigGetInt("rtty.port", 5912),
.Token = MicroServiceConfigGetString("rtty.token", "nothing"),
.TimeOut = MicroServiceConfigGetInt("rtty.timeout", 60),
.ConnectionId = Utils::ComputeHash(SerialNumber_,Utils::Now()).substr(0,RTTY_DEVICE_TOKEN_LENGTH),
.ConnectionId = Utils::ComputeHash(SerialNumber_,Utils::Now(),rtty_sid).substr(0,RTTY_DEVICE_TOKEN_LENGTH),
.Started = Utils::Now(),
.CommandUUID = CMD_UUID,
.ViewPort = MicroServiceConfigGetInt("rtty.viewport", 5913),
.DevicePassword = ""
};
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
if(RTTYS_server()->UseInternal()) {
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
Rtty.Token = Utils::ComputeHash(UserInfo_.webtoken.refresh_token_,Utils::Now()).substr(0,RTTY_DEVICE_TOKEN_LENGTH);
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
if(!RTTYS_server()->CreateEndPoint(Rtty.ConnectionId, Rtty.Token, Requester(), SerialNumber_)) {
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
return BadRequest(RESTAPI::Errors::MaximumRTTYSessionsReached);
}
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
}
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
Poco::JSON::Object ReturnedObject;
Rtty.to_json(ReturnedObject);
@@ -961,7 +1031,6 @@ namespace OpenWifi {
Cmd.UUID = CMD_UUID;
Cmd.Command = uCentralProtocol::RTTY;
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
Poco::JSON::Object Params;
Params.set(uCentralProtocol::METHOD, uCentralProtocol::RTTY);
@@ -974,27 +1043,20 @@ namespace OpenWifi {
Params.set(uCentralProtocol::TIMEOUT, Rtty.TimeOut);
Params.set(uCentralProtocol::PASSWORD, Device.DevicePassword);
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
std::stringstream ParamStream;
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
Params.stringify(ParamStream);
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
Cmd.Details = ParamStream.str();
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
Logger_.information(fmt::format("RTTY: user={} serial={} rttyid={} token={} cmd={}.", Requester(), SerialNumber_, Rtty.ConnectionId, Rtty.Token, CMD_UUID));
// poco_debug(Logger_,fmt::format("RTTY_DEBUG {} ", __LINE__ ));
return RESTAPI_RPC::WaitForCommand(CMD_RPC,false,Cmd, Params, *Request, *Response, timeout, &ReturnedObject, this, Logger_);
poco_information(Logger_,fmt::format("RTTY: user={} serial={} rttyid={} token={} cmd={}.", Requester(), SerialNumber_, Rtty.ConnectionId, Rtty.Token, CMD_UUID));
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::rtty,false,Cmd, Params, *Request, *Response, timeout, &ReturnedObject, this, Logger_);
}
return NotFound();
}
Logger_.information(fmt::format("RTTY: user={} serial={}. Internal error.", Requester(), SerialNumber_));
poco_information(Logger_,fmt::format("RTTY: user={} serial={}. Internal error.", Requester(), SerialNumber_));
return ReturnStatus(Poco::Net::HTTPResponse::HTTP_SERVICE_UNAVAILABLE);
}
// #define DBG { std::cout << __LINE__ << std::endl; }
void RESTAPI_device_commandHandler::Telemetry(const std::string &CMD_UUID, uint64_t CMD_RPC, [[maybe_unused]] std::chrono::milliseconds timeout){
Logger_.information(fmt::format("TELEMETRY({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
void RESTAPI_device_commandHandler::Telemetry(const std::string &CMD_UUID, uint64_t CMD_RPC, [[maybe_unused]] std::chrono::milliseconds timeout, [[maybe_unused]] const GWObjects::DeviceRestrictions &R){
poco_information(Logger_,fmt::format("TELEMETRY({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, TransactionId_, Requester(), SerialNumber_));
const auto &Obj = ParsedBody_;
@@ -1010,7 +1072,6 @@ namespace OpenWifi {
std::stringstream oooss;
Obj->stringify(oooss);
// std::cout << "Payload:" << oooss.str() << std::endl;
std::uint64_t Lifetime = 60 * 60 ; // 1 hour
std::uint64_t Interval = 5;

View File

@@ -9,6 +9,7 @@
#pragma once
#include "framework/RESTAPI_Handler.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
namespace OpenWifi {
class RESTAPI_device_commandHandler : public RESTAPIHandler {
@@ -32,20 +33,20 @@ namespace OpenWifi {
void GetStatus();
void GetChecks();
void DeleteChecks();
void ExecuteCommand(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Configure(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Upgrade(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Reboot(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Factory(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void LEDs(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Trace(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void MakeRequest(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void WifiScan(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void EventQueue(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Rtty(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Telemetry(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Ping(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Script(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout);
void Configure(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void Upgrade(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void Reboot(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void Factory(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void LEDs(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void Trace(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void MakeRequest(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void WifiScan(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void EventQueue(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void Rtty(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void Telemetry(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void Ping(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
void Script(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R);
static auto PathName() { return std::list<std::string>{"/api/v1/device/{serialNumber}/{command}"}; };
void DoGet() final;

View File

@@ -32,9 +32,7 @@ namespace OpenWifi {
CompleteDeviceInfo(Device, Answer);
return ReturnObject(Answer);
} else {
Poco::JSON::Object Obj;
Device.to_json(Obj);
return ReturnObject(Obj);
return Object(Device);
}
}
NotFound();
@@ -107,11 +105,6 @@ namespace OpenWifi {
return ReturnObject(Answer);
}
if (!Utils::ValidSerialNumber(SerialNumber)) {
Logger_.warning(fmt::format("CREATE-DEVICE({}): Illegal serial number.", SerialNumber));
return BadRequest( RESTAPI::Errors::InvalidSerialNumber);
}
GWObjects::Device Device;
if (!Device.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
@@ -144,9 +137,7 @@ namespace OpenWifi {
if (StorageService()->CreateDevice(Device)) {
SetCurrentConfigurationID(SerialNumber, Device.UUID);
Poco::JSON::Object DevObj;
Device.to_json(DevObj);
return ReturnObject(DevObj);
return Object(Device);
}
InternalError(RESTAPI::Errors::RecordNotCreated);
}
@@ -196,9 +187,9 @@ namespace OpenWifi {
Existing.LastConfigurationChange = Utils::Now();
if (StorageService()->UpdateDevice(Existing)) {
SetCurrentConfigurationID(SerialNumber, Existing.UUID);
Poco::JSON::Object DevObj;
NewDevice.to_json(DevObj);
return ReturnObject(DevObj);
GWObjects::Device UpdatedDevice;
StorageService()->GetDevice(SerialNumber, UpdatedDevice);
return Object(UpdatedDevice);
}
InternalError(RESTAPI::Errors::RecordNotUpdated);
}

View File

@@ -26,7 +26,7 @@ namespace OpenWifi {
std::string ItemList;
Types::StringVec Fields;
StorageService()->GetDeviceDbFieldList(Fields);
Storage::GetDeviceDbFieldList(Fields);
std::set<std::string> FieldNames;
for(const auto &field:Fields)
@@ -68,7 +68,7 @@ namespace OpenWifi {
if(GetBoolParameter("orderSpec")) {
Types::StringVec Fields;
StorageService()->GetDeviceDbFieldList(Fields);
Storage::GetDeviceDbFieldList(Fields);
std::sort(Fields.begin(),Fields.end());
Poco::JSON::Object Answer;
RESTAPI_utils::field_to_json(Answer,"list",Fields);

View File

@@ -25,7 +25,12 @@ namespace OpenWifi {
if (!StorageService()->GetAttachedFileContent(UUID, SerialNumber, FileContent, FileType)) {
return NotFound();
}
SendFileContent(FileContent,"pcap",UUID+".pcap");
if(FileType=="pcap")
SendFileContent(FileContent,"application/vnd.tcpdump.pcap",UUID+".pcap");
else if(FileType=="gzip")
SendFileContent(FileContent,"application/gzip",UUID+".tar.gz");
else
SendFileContent(FileContent,"application/txt",UUID+".txt");
}
void RESTAPI_file::DoDelete() {

View File

@@ -14,9 +14,7 @@ namespace OpenWifi {
Poco::Thread::current()->id()));
GWObjects::RadiusProxyPoolList C;
RADIUS_proxy_server()->GetConfig(C);
Poco::JSON::Object Answer;
C.to_json(Answer);
return ReturnObject(Answer);
return Object(C);
}
void RESTAPI_radiusProxyConfig_handler::DoDelete() {
@@ -77,7 +75,7 @@ namespace OpenWifi {
TransactionId_, Requester(),
Poco::Thread::current()->id()));
RADIUS_proxy_server()->SetConfig(C);
return ReturnObject(*ParsedBody_);
return Object(C);
}
}

View File

@@ -18,8 +18,12 @@
#include "RESTAPI/RESTAPI_telemetryWebSocket.h"
#include "RESTAPI/RESTAPI_iptocountry_handler.h"
#include "RESTAPI/RESTAPI_radiusProxyConfig_handler.h"
#include "RESTAPI/RESTAPI_script_handler.h"
#include "RESTAPI/RESTAPI_scripts_handler.h"
#include "framework/RESTAPI_SystemCommand.h"
#include "framework/RESTAPI_WebSocketServer.h"
#include "framework/RESTAPI_SystemConfiguration.h"
namespace OpenWifi {
@@ -37,12 +41,15 @@ namespace OpenWifi {
RESTAPI_ouis,
RESTAPI_file,
RESTAPI_system_command,
RESTAPI_system_configuration,
RESTAPI_deviceDashboardHandler,
RESTAPI_webSocketServer,
RESTAPI_blacklist,
RESTAPI_blacklist_list,
RESTAPI_iptocountry_handler,
RESTAPI_radiusProxyConfig_handler,
RESTAPI_scripts_handler,
RESTAPI_script_handler,
RESTAPI_capabilities_handler, RESTAPI_telemetryWebSocket>(Path,Bindings,L, S, TransactionId);
}
@@ -62,6 +69,8 @@ namespace OpenWifi {
RESTAPI_blacklist,
RESTAPI_iptocountry_handler,
RESTAPI_radiusProxyConfig_handler,
RESTAPI_scripts_handler,
RESTAPI_script_handler,
RESTAPI_blacklist_list>(Path,Bindings,L, S, TransactionId);
}
}

View File

@@ -0,0 +1,160 @@
//
// Created by stephane bourque on 2022-11-21.
//
#include "RESTAPI_script_handler.h"
namespace OpenWifi {
void RESTAPI_script_handler::DoGet() {
std::string UUID = GetBinding("uuid","");
if(UUID.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
GWObjects::ScriptEntry SE;
if(DB_.GetRecord("id",UUID, SE)) {
return Object(SE);
}
return NotFound();
}
void RESTAPI_script_handler::DoDelete() {
std::string UUID = GetBinding("uuid","");
if(UserInfo_.userinfo.userRole!=SecurityObjects::ROOT) {
return BadRequest(RESTAPI::Errors::ACCESS_DENIED);
}
if(UUID.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
if(DB_.DeleteRecord("id",UUID)) {
return OK();
}
return NotFound();
}
void RESTAPI_script_handler::DoPost() {
std::string UUID = GetBinding("uuid","");
if(UserInfo_.userinfo.userRole!=SecurityObjects::ROOT) {
return BadRequest(RESTAPI::Errors::ACCESS_DENIED);
}
if(UUID.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
GWObjects::ScriptEntry SE;
if(!SE.from_json(ParsedBody_)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if( SE.name.empty() ||
SE.author.empty() ||
(SE.type!="bundle" && SE.type!="shell") ||
SE.content.empty() ||
SE.version.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
if(!SE.restricted.empty()) {
for(const auto &role:SE.restricted) {
if(SecurityObjects::UserTypeFromString(role)==SecurityObjects::UNKNOWN) {
return BadRequest(RESTAPI::Errors::InvalidUserRole);
}
}
std::sort(SE.restricted.begin(),SE.restricted.end());
}
if(!SE.uri.empty() && !Utils::ValidateURI(SE.uri)) {
return BadRequest(RESTAPI::Errors::InvalidURI);
}
if(!SE.defaultUploadURI.empty() && !Utils::ValidateURI(SE.defaultUploadURI)) {
return BadRequest(RESTAPI::Errors::InvalidURI);
}
SE.id = MicroServiceCreateUUID();
SE.created = SE.modified = Utils::Now();
if(DB_.CreateRecord(SE)) {
return Object(SE);
}
return BadRequest(RESTAPI::Errors::RecordNotCreated);
}
void RESTAPI_script_handler::DoPut() {
std::string UUID = GetBinding("uuid","");
if(UserInfo_.userinfo.userRole!=SecurityObjects::ROOT) {
return BadRequest(RESTAPI::Errors::ACCESS_DENIED);
}
if(UUID.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
GWObjects::ScriptEntry SE;
if(!SE.from_json(ParsedBody_)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
}
if(!SE.restricted.empty()) {
for(const auto &role:SE.restricted) {
if(SecurityObjects::UserTypeFromString(role)==SecurityObjects::UNKNOWN) {
return BadRequest(RESTAPI::Errors::InvalidUserRole);
}
}
std::sort(SE.restricted.begin(),SE.restricted.end());
}
GWObjects::ScriptEntry Existing;
if(!DB_.GetRecord("id", UUID, Existing)) {
return NotFound();
}
if(ParsedBody_->has("name") && SE.name.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
if(ParsedBody_->has("content") && SE.content.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
if(ParsedBody_->has("version") && SE.version.empty()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
if(!SE.uri.empty() && !Utils::ValidateURI(SE.uri)) {
return BadRequest(RESTAPI::Errors::InvalidURI);
}
if(!SE.defaultUploadURI.empty() && !Utils::ValidateURI(SE.defaultUploadURI)) {
return BadRequest(RESTAPI::Errors::InvalidURI);
}
if(ParsedBody_->has("restricted")) {
Existing.restricted = SE.restricted;
}
AssignIfPresent(ParsedBody_, "name", Existing.name);
AssignIfPresent(ParsedBody_, "description", Existing.description);
AssignIfPresent(ParsedBody_, "uri", Existing.uri);
AssignIfPresent(ParsedBody_, "content", Existing.content);
AssignIfPresent(ParsedBody_, "version", Existing.version);
AssignIfPresent(ParsedBody_, "deferred", Existing.deferred);
AssignIfPresent(ParsedBody_, "timeout", Existing.timeout);
AssignIfPresent(ParsedBody_, "defaultUploadURI", Existing.defaultUploadURI);
Existing.modified = Utils::Now();
if(DB_.UpdateRecord("id", UUID, Existing)) {
return Object(Existing);
}
return BadRequest(RESTAPI::Errors::RecordNotUpdated);
}
} // namespace OpenWifi

View File

@@ -0,0 +1,31 @@
//
// Created by stephane bourque on 2022-11-21.
//
#pragma once
#include "framework/RESTAPI_Handler.h"
#include "StorageService.h"
namespace OpenWifi {
class RESTAPI_script_handler : public RESTAPIHandler {
public:
RESTAPI_script_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId,
bool Internal)
: RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_PUT,
Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_OPTIONS},
Server, TransactionId, Internal){};
static auto PathName() { return std::list<std::string>{"/api/v1/script/{uuid}"}; };
private:
ScriptDB & DB_{ StorageService()->ScriptDB() };
void DoGet() final;
void DoDelete() final;
void DoPost() final;
void DoPut() final;
};
}

View File

@@ -0,0 +1,20 @@
//
// Created by stephane bourque on 2022-11-21.
//
#include "RESTAPI_scripts_handler.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
#include "StorageService.h"
namespace OpenWifi {
void RESTAPI_scripts_handler::DoGet() {
GWObjects::ScriptEntryList L;
StorageService()->ScriptDB().GetRecords(QB_.Offset,QB_.Limit,L.scripts);
Poco::JSON::Object Answer;
L.to_json(Answer);
return ReturnObject(Answer);
}
} // namespace OpenWifi

View File

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

View File

@@ -50,6 +50,10 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"entity", entity);
field_to_json(Obj,"modified", modified);
field_to_json(Obj,"locale", locale);
field_to_json(Obj,"restrictedDevice", restrictedDevice);
field_to_json(Obj,"pendingConfiguration", pendingConfiguration);
field_to_json(Obj,"pendingConfigurationCmd", pendingConfigurationCmd);
field_to_json(Obj,"restrictionDetails", restrictionDetails);
}
void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
@@ -70,6 +74,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE");
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);
}
#endif
}
@@ -89,6 +94,10 @@ namespace OpenWifi::GWObjects {
field_from_json(Obj,"subscriber", subscriber);
field_from_json(Obj,"entity", entity);
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);
return true;
} catch (const Poco::Exception &E) {
}
@@ -199,6 +208,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"lastContact", LastContact);
field_to_json(Obj,"associations_2G", Associations_2G);
field_to_json(Obj,"associations_5G", Associations_5G);
field_to_json(Obj,"associations_6G", Associations_6G);
field_to_json(Obj,"webSocketClients", webSocketClients);
field_to_json(Obj,"websocketPackets", websocketPackets);
field_to_json(Obj,"kafkaClients", kafkaClients);
@@ -208,6 +218,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"sessionId", sessionId);
field_to_json(Obj,"connectionCompletionTime", connectionCompletionTime);
field_to_json(Obj,"totalConnectionTime", Utils::Now() - started);
field_to_json(Obj,"certificateExpiryDate", certificateExpiryDate);
switch(VerifiedCertificate) {
case NO_CERTIFICATE:
@@ -298,9 +309,12 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"serialNumber",serialNumber);
field_to_json(Obj,"timeout",timeout);
field_to_json(Obj,"type",type);
field_to_json(Obj,"script",script);
field_to_json(Obj,"scriptId",scriptId);
field_to_json(Obj,"script",script);
field_to_json(Obj,"when",when);
field_to_json(Obj,"signature", signature);
field_to_json(Obj,"deferred", deferred);
field_to_json(Obj,"uri", uri);
}
bool ScriptRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -311,6 +325,9 @@ namespace OpenWifi::GWObjects {
field_from_json(Obj,"script",script);
field_from_json(Obj,"scriptId",scriptId);
field_from_json(Obj,"when",when);
field_from_json(Obj,"signature", signature);
field_from_json(Obj,"deferred", deferred);
field_from_json(Obj,"uri", uri);
return true;
} catch (const Poco::Exception &E) {
}
@@ -382,6 +399,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"secret",secret);
field_to_json(Obj,"certificate",certificate);
field_to_json(Obj,"radsec",radsec);
field_to_json(Obj,"allowSelfSigned",allowSelfSigned);
field_to_json(Obj,"radsecPort",radsecPort);
field_to_json(Obj,"radsecSecret",radsecSecret);
field_to_json(Obj,"radsecCacerts",radsecCacerts);
@@ -400,6 +418,7 @@ namespace OpenWifi::GWObjects {
field_from_json(Obj,"secret",secret);
field_from_json(Obj,"certificate",certificate);
field_from_json(Obj,"radsec",radsec);
field_from_json(Obj,"allowSelfSigned",allowSelfSigned);
field_from_json(Obj,"radsecSecret",radsecSecret);
field_from_json(Obj,"radsecPort",radsecPort);
field_from_json(Obj,"radsecCacerts",radsecCacerts);
@@ -412,5 +431,117 @@ namespace OpenWifi::GWObjects {
}
return false;
}
void ScriptEntry::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"id", id);
field_to_json(Obj,"name", name);
field_to_json(Obj,"description", description);
field_to_json(Obj,"uri", uri);
field_to_json(Obj,"content", content);
field_to_json(Obj,"version", version);
field_to_json(Obj,"type", type);
field_to_json(Obj,"created", created);
field_to_json(Obj,"modified", modified);
field_to_json(Obj,"author", author);
field_to_json(Obj,"restricted", restricted);
field_to_json(Obj,"deferred", deferred);
field_to_json(Obj,"timeout", timeout);
field_to_json(Obj,"defaultUploadURI", defaultUploadURI);
}
bool ScriptEntry::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,"description", description);
field_from_json(Obj,"uri", uri);
field_from_json(Obj,"content", content);
field_from_json(Obj,"version", version);
field_from_json(Obj,"type", type);
field_from_json(Obj,"created", created);
field_from_json(Obj,"modified", modified);
field_from_json(Obj,"author", author);
field_from_json(Obj,"restricted", restricted);
field_from_json(Obj,"deferred", deferred);
field_from_json(Obj,"timeout", timeout);
field_from_json(Obj,"defaultUploadURI", defaultUploadURI);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void ScriptEntryList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"scripts",scripts);
}
bool ScriptEntryList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"scripts",scripts);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void DeviceRestrictionsKeyInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"vendor", vendor);
field_to_json(Obj,"algo", algo);
}
bool DeviceRestrictionsKeyInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"vendor", vendor);
field_from_json(Obj,"algo", algo);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void DeviceRestrictions::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"dfs", dfs);
field_to_json(Obj,"ssh", ssh);
field_to_json(Obj,"rtty", rtty);
field_to_json(Obj,"tty", tty);
field_to_json(Obj,"developer", developer);
field_to_json(Obj,"upgrade", upgrade);
field_to_json(Obj,"commands", commands);
field_to_json(Obj,"country", country);
field_to_json(Obj,"key_info", key_info);
}
bool DeviceRestrictions::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"dfs", dfs);
field_from_json(Obj,"ssh", ssh);
field_from_json(Obj,"rtty", rtty);
field_from_json(Obj,"tty", tty);
field_from_json(Obj,"developer", developer);
field_from_json(Obj,"upgrade", upgrade);
field_from_json(Obj,"commands", commands);
field_from_json(Obj,"country", country);
field_from_json(Obj,"key_info", key_info);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
bool DeviceRestrictionsKeyInfo::operator!=(const OpenWifi::GWObjects::DeviceRestrictionsKeyInfo &T) const {
return (T.algo!=algo) || (T.vendor!=vendor);
}
bool DeviceRestrictions::operator!=(const OpenWifi::GWObjects::DeviceRestrictions &T) const {
return ( (T.dfs!=dfs) ||
(T.rtty!=rtty) ||
(T.upgrade!=upgrade) ||
(T.commands != commands) ||
(T.developer != developer) ||
(T.ssh !=ssh) ||
(T.key_info != key_info) ||
(T.country != country) );
}
}

View File

@@ -28,23 +28,52 @@ namespace OpenWifi::GWObjects {
uint64_t TX = 0, RX = 0;
uint64_t Associations_2G=0;
uint64_t Associations_5G=0;
uint64_t Associations_6G=0;
bool Connected = false;
uint64_t LastContact=0;
std::string Firmware;
CertificateValidation VerifiedCertificate = NO_CERTIFICATE;
std::string Compatible;
uint64_t kafkaClients=0;
uint64_t webSocketClients=0;
uint64_t kafkaPackets=0;
uint64_t websocketPackets=0;
std::string locale;
uint64_t started=0;
uint64_t sessionId=0;
double connectionCompletionTime=0.0;
std::string Compatible;
uint64_t kafkaClients=0;
uint64_t webSocketClients=0;
uint64_t kafkaPackets=0;
uint64_t websocketPackets=0;
std::string locale;
uint64_t started=0;
uint64_t sessionId=0;
double connectionCompletionTime=0.0;
std::uint64_t certificateExpiryDate=0;
void to_json(Poco::JSON::Object &Obj) const;
};
struct DeviceRestrictionsKeyInfo {
std::string vendor;
std::string algo;
bool operator !=(const DeviceRestrictionsKeyInfo &b) const;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DeviceRestrictions {
bool dfs = false;
bool ssh = false;
bool rtty = false;
bool tty = false;
bool developer = false;
bool upgrade = false;
bool commands = false;
std::vector<std::string> country;
DeviceRestrictionsKeyInfo key_info;
bool operator !=(const DeviceRestrictions &D) const;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct Device {
std::string SerialNumber;
std::string DeviceType;
@@ -68,6 +97,10 @@ namespace OpenWifi::GWObjects {
std::string entity;
uint64_t modified=0;
std::string locale;
bool restrictedDevice=false;
std::string pendingConfiguration;
std::string pendingConfigurationCmd;
DeviceRestrictions restrictionDetails;
void to_json(Poco::JSON::Object &Obj) const;
void to_json_with_status(Poco::JSON::Object &Obj) const;
@@ -213,13 +246,44 @@ namespace OpenWifi::GWObjects {
void to_json(Poco::JSON::Object &Obj) const;
};
struct ScriptEntry {
std::string id;
std::string name;
std::string description;
std::string uri;
std::string content;
std::string version;
std::string type;
std::uint64_t created;
std::uint64_t modified;
std::string author;
Types::StringVec restricted;
bool deferred=false;
std::uint64_t timeout=30;
std::string defaultUploadURI;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ScriptEntryList {
std::vector<ScriptEntry> scripts;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ScriptRequest {
uint64_t timeout=30;
std::string serialNumber;
uint64_t timeout=30;
std::string type;
std::string script;
std::string scriptId;
uint64_t when=0;
std::uint64_t when;
std::string signature;
bool deferred;
std::string uri;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
@@ -232,6 +296,7 @@ namespace OpenWifi::GWObjects {
std::string secret;
std::string certificate;
bool radsec=false;
bool allowSelfSigned=false;
uint16_t radsecPort=2083;
std::string radsecSecret;
std::string radsecKey;
@@ -273,4 +338,5 @@ namespace OpenWifi::GWObjects {
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
}

View File

@@ -602,6 +602,7 @@ namespace OpenWifi::ProvObjects {
field_to_json( Obj, "devClass",devClass);
field_to_json( Obj, "locale",locale);
field_to_json( Obj, "realMacAddress",realMacAddress);
field_to_json( Obj, "doNotAllowOverrides",doNotAllowOverrides);
}
bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -623,6 +624,7 @@ namespace OpenWifi::ProvObjects {
field_from_json( Obj,"devClass",devClass);
field_from_json( Obj,"locale",locale);
field_from_json( Obj,"realMacAddress",realMacAddress);
field_from_json( Obj, "doNotAllowOverrides",doNotAllowOverrides);
return true;
} catch(...) {
@@ -1195,6 +1197,48 @@ namespace OpenWifi::ProvObjects {
return false;
}
void ConfigurationOverride::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"source",source);
field_to_json(Obj,"reason",reason);
field_to_json(Obj,"parameterName",parameterName);
field_to_json(Obj,"parameterType",parameterType);
field_to_json(Obj,"parameterValue",parameterValue);
field_to_json(Obj,"modified",modified);
}
bool ConfigurationOverride::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"source",source);
field_from_json(Obj,"reason",reason);
field_from_json(Obj,"parameterName",parameterName);
field_from_json(Obj,"parameterType",parameterType);
field_from_json(Obj,"parameterValue",parameterValue);
field_from_json(Obj,"modified",modified);
return true;
} catch(...) {
}
return false;
}
void ConfigurationOverrideList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"serialNumber",serialNumber);
field_to_json(Obj,"managementPolicy",managementPolicy);
field_to_json(Obj,"overrides",overrides);
}
bool ConfigurationOverrideList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"serialNumber",serialNumber);
field_from_json(Obj,"managementPolicy",managementPolicy);
field_from_json(Obj,"overrides",overrides);
return true;
} catch(...) {
}
return false;
}
}

View File

@@ -428,6 +428,7 @@ namespace OpenWifi::ProvObjects {
std::string devClass;
std::string locale;
std::string realMacAddress;
bool doNotAllowOverrides=false;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -693,6 +694,27 @@ namespace OpenWifi::ProvObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ConfigurationOverride {
std::string source;
std::string reason;
std::string parameterName;
std::string parameterType;
std::string parameterValue;
std::uint64_t modified;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ConfigurationOverrideList {
std::string serialNumber;
Types::UUID_t managementPolicy;
std::vector<ConfigurationOverride> overrides;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I);

View File

@@ -619,5 +619,80 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"login",login);
field_to_json(Obj,"logout",logout);
}
void ApiKeyAccessRight::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "service", service);
field_to_json(Obj, "access", access);
}
bool ApiKeyAccessRight::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "service", service);
field_from_json(Obj, "access", access);
return true;
} catch(...) {
std::cout << "Cannot parse: Token" << std::endl;
}
return false;
}
void ApiKeyAccessRightList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "acls", acls);
}
bool ApiKeyAccessRightList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "acls", acls);
return true;
} catch(...) {
std::cout << "Cannot parse: Token" << std::endl;
}
return false;
}
void ApiKeyEntry::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "id", id);
field_to_json(Obj, "userUuid", userUuid);
field_to_json(Obj, "name", name);
field_to_json(Obj, "apiKey", apiKey);
field_to_json(Obj, "salt", salt);
field_to_json(Obj, "description", description);
field_to_json(Obj, "expiresOn", expiresOn);
field_to_json(Obj, "rights", rights);
field_to_json(Obj, "lastUse", lastUse);
}
bool ApiKeyEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "id", id);
field_from_json(Obj, "userUuid", userUuid);
field_from_json(Obj, "name", name);
field_from_json(Obj, "apiKey", apiKey);
field_from_json(Obj, "salt", salt);
field_from_json(Obj, "description", description);
field_from_json(Obj, "expiresOn", expiresOn);
field_from_json(Obj, "rights", rights);
field_from_json(Obj, "lastUse", lastUse);
return true;
} catch(...) {
std::cout << "Cannot parse: Token" << std::endl;
}
return false;
}
void ApiKeyEntryList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "apiKeys", apiKeys);
}
bool ApiKeyEntryList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "apiKeys", apiKeys);
return true;
} catch(...) {
std::cout << "Cannot parse: Token" << std::endl;
}
return false;
}
}

View File

@@ -325,5 +325,44 @@ namespace OpenWifi {
void to_json(Poco::JSON::Object &Obj) const;
};
struct ApiKeyAccessRight {
std::string service;
std::string access;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ApiKeyAccessRightList {
std::vector<ApiKeyAccessRight> acls;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ApiKeyEntry {
Types::UUID_t id;
Types::UUID_t userUuid;
std::string name;
std::string description;
std::string apiKey;
std::string salt;
std::uint64_t created;
std::uint64_t expiresOn=0;
ApiKeyAccessRightList rights;
std::uint64_t lastUse=0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ApiKeyEntryList {
std::vector<ApiKeyEntry> apiKeys;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
}
}

23
src/ScriptManager.cpp Normal file
View File

@@ -0,0 +1,23 @@
//
// Created by stephane bourque on 2022-11-21.
//
#include "ScriptManager.h"
#include "framework/MicroServiceFuncs.h"
#include <fstream>
#include "Poco/JSON/Parser.h"
namespace OpenWifi {
int ScriptManager::Start() {
poco_notice(Logger(),"Starting...");
ScriptDir_ = MicroServiceConfigPath("script.manager.directory", MicroServiceDataDirectory() + "/included_scripts" );
return 0;
}
void ScriptManager::Stop() {
poco_notice(Logger(),"Stopping...");
poco_notice(Logger(),"Stopped...");
}
} // namespace OpenWifi

34
src/ScriptManager.h Normal file
View File

@@ -0,0 +1,34 @@
//
// Created by stephane bourque on 2022-11-21.
//
#pragma once
#include "framework/SubSystemServer.h"
namespace OpenWifi {
class ScriptManager : public SubSystemServer {
public:
static auto instance() {
auto static instance_ = new ScriptManager;
return instance_;
}
int Start();
void Stop();
private:
std::string ScriptDir_;
explicit ScriptManager() noexcept:
SubSystemServer("ScriptManager", "SCRIPT-MGR", "script.manager")
{
}
};
inline auto ScriptManager() { return ScriptManager::instance(); }
} // namespace OpenWifi

7
src/SignatureMgr.cpp Normal file
View File

@@ -0,0 +1,7 @@
//
// Created by stephane bourque on 2022-11-22.
//
#include "SignatureMgr.h"
namespace OpenWifi {} // namespace OpenWifi

176
src/SignatureMgr.h Normal file
View File

@@ -0,0 +1,176 @@
//
// Created by stephane bourque on 2022-11-22.
//
#pragma once
#include <fstream>
#include <shared_mutex>
#include "framework/SubSystemServer.h"
#include "framework/MicroServiceFuncs.h"
#include "framework/utils.h"
#include "RESTObjects/RESTAPI_GWobjects.h"
#include "Poco/DigestStream.h"
#include "Poco/DigestEngine.h"
#include "Poco/Crypto/RSADigestEngine.h"
#include "Poco/StreamCopier.h"
#include "Poco/File.h"
#include "Poco/StringTokenizer.h"
#include "Poco/TemporaryFile.h"
#include "fmt/format.h"
namespace OpenWifi {
class SignatureManager : public SubSystemServer {
public:
inline static auto instance() {
static auto instance_ = new SignatureManager;
return instance_;
}
struct SignatureCacheEntry {
std::string vendor_uri_hash;
std::string signature;
};
inline int Start() final {
poco_notice(Logger(),"Starting...");
std::shared_lock L(KeyMutex_);
CacheFilename_ = MicroServiceDataDirectory() + "/signature_cache";
Poco::File CacheFile(CacheFilename_);
if(CacheFile.exists()) {
std::fstream CacheFileContent(CacheFilename_, std::ios_base::in);
std::string line;
while(std::getline(CacheFileContent, line)) {
auto Tokens = Poco::StringTokenizer(line,":");
if(Tokens.count()==2) {
SignatureCache_[Tokens[0]] = Tokens[1];
}
}
}
poco_information(Logger(),fmt::format("Found {} entries in signature cache.", SignatureCache_.size()));
// read all the key vendors.
// signature.manager.0.key.public
// signature.manager.0.key.private
// signature.manager.0.vendor
int i=0;
while(true) {
auto Vendor = MicroServiceConfigGetString("signature.manager." + std::to_string(i) + ".vendor","");
auto PrivateKey = MicroServiceConfigPath("signature.manager." + std::to_string(i) + ".key.private","");
auto PublicKey = MicroServiceConfigPath("signature.manager." + std::to_string(i) + ".key.public","");
if(Vendor.empty() || PrivateKey.empty() || PublicKey.empty()) {
break;
}
Poco::File PubKey(PublicKey), PrivKey(PrivateKey);
if(PubKey.exists() && PrivKey.exists()) {
Keys_[Vendor] = Poco::SharedPtr<Poco::Crypto::RSAKey>(
new Poco::Crypto::RSAKey(PublicKey, PrivateKey, ""));
}
++i;
}
poco_information(Logger(),fmt::format("{} signatures in dictionary.", Keys_.size()));
return 0;
}
inline void Stop() final {
poco_notice(Logger(),"Stopping...");
poco_notice(Logger(),"Stopped...");
}
inline std::string Sign(const GWObjects::DeviceRestrictions &Restrictions, const std::string &Data) const {
std::shared_lock L(KeyMutex_);
try {
if (Restrictions.key_info.algo == "static") {
return "aaaaaaaaaa";
}
auto Vendor = Keys_.find(Restrictions.key_info.vendor);
if (Vendor == Keys_.end()) {
poco_error( Logger(), fmt::format("{}: vendor unknown.", Vendor->first));
return "";
}
if (Restrictions.key_info.algo == "dgst-sha256") {
Poco::Crypto::RSADigestEngine R(*Vendor->second, "SHA256");
Poco::DigestOutputStream ostr(R);
ostr << Data;
ostr.flush();
auto Signature = Utils::base64encode(
(const unsigned char *)R.signature().data(), R.signature().size());
return Signature;
}
} catch (const Poco::Exception &E) {
Logger().log(E);
}
return "";
}
inline std::string Sign(const GWObjects::DeviceRestrictions &Restrictions, const Poco::URI &uri) {
std::shared_lock L(KeyMutex_);
try {
if (Restrictions.key_info.algo == "static") {
return "aaaaaaaaaa";
}
auto Vendor = Keys_.find(Restrictions.key_info.vendor);
if (Vendor == Keys_.end()) {
poco_error( Logger(), fmt::format("{}: vendor unknown.", Restrictions.key_info.vendor));
return "";
}
if (Restrictions.key_info.algo == "dgst-sha256") {
auto FileHash =
Utils::ComputeHash(Restrictions.key_info.vendor, Restrictions.key_info.algo, uri.getPathAndQuery());
auto CacheEntry = SignatureCache_.find(FileHash);
if (CacheEntry != end(SignatureCache_)) {
return CacheEntry->second;
}
Poco::TemporaryFile TempDownloadedFile;
if (Utils::wgetfile(uri, TempDownloadedFile.path())) {
Poco::Crypto::RSADigestEngine R(*Vendor->second, "SHA256");
Poco::DigestOutputStream ofs(R);
std::fstream ifs(TempDownloadedFile.path(),
std::ios_base::in | std::ios_base::binary);
Poco::StreamCopier::copyStream(ifs, ofs);
ofs.flush();
auto Signature = Utils::base64encode((const unsigned char *)R.signature().data(),R.signature().size());
SignatureCache_[FileHash] = Signature;
SaveCache();
return Signature;
}
}
} catch (const Poco::Exception &E) {
Logger().log(E);
}
return "";
}
void SaveCache() {
std::ofstream ofs(CacheFilename_, std::ios_base::trunc | std::ios_base::out);
for(const auto &[hash,signature]:SignatureCache_) {
ofs << hash << ":" << signature << std::endl;
}
}
private:
mutable std::shared_mutex KeyMutex_;
std::map<std::string, Poco::SharedPtr<Poco::Crypto::RSAKey>> Keys_;
std::map<std::string,std::string> SignatureCache_;
std::string CacheFilename_;
explicit SignatureManager() noexcept
: SubSystemServer("SignatureManager", "SIGNATURE-MGR", "signature.manager") {}
};
inline auto SignatureManager() { return SignatureManager::instance(); }
}

View File

@@ -12,56 +12,75 @@ namespace OpenWifi::StateUtils {
return 5;
}
bool ComputeAssociations(const Poco::JSON::Object::Ptr RawObject, uint64_t &Radios_2G,
uint64_t &Radios_5G) {
static int BandToInt(const std::string &band) {
if(band=="2G") return 2;
if(band=="5G") return 5;
if(band=="6G") return 6;
return 2;
}
bool ComputeAssociations(const Poco::JSON::Object::Ptr RawObject,
uint64_t &Radios_2G,
uint64_t &Radios_5G, uint64_t &Radios_6G) {
Radios_2G = 0 ;
Radios_5G = 0;
Radios_6G = 0;
if(RawObject->isArray("radios") && RawObject->isArray("interfaces")) {
auto RA = RawObject->getArray("radios");
// map of phy to 2g/5g
std::map<std::string,int> RadioPHYs;
// parse radios and get the phy out with the band
bool UseBandInfo = false;
for(auto const &i:*RA) {
Poco::JSON::Parser p2;
// Poco::JSON::Parser p2;
auto RadioObj = i.extract<Poco::JSON::Object::Ptr>();
if(RadioObj->has("phy") && RadioObj->has("channel")) {
if(RadioObj->has("band")) {
// std::cout << "Use band info" << std::endl;
UseBandInfo = true ;
} else if(RadioObj->has("phy") && RadioObj->has("channel")) {
if(RadioObj->isArray("channel")) {
auto ChannelArray = RadioObj->getArray("channel");
if(ChannelArray->size()) {
RadioPHYs[RadioObj->get("phy").toString()] =
RadioPHYs[RadioObj->get("phy")] =
ChannelToBand( ChannelArray->getElement<uint64_t>(0) );
}
} else {
RadioPHYs[RadioObj->get("phy").toString()] =
RadioPHYs[RadioObj->get("phy")] =
ChannelToBand(RadioObj->get("channel"));
}
}
}
auto IA = RawObject->getArray("interfaces");
for(auto const &i:*IA) {
auto InterfaceObj = i.extract<Poco::JSON::Object::Ptr>();
auto InterfaceArray = RawObject->getArray("interfaces");
for(auto const &interface:*InterfaceArray) {
auto InterfaceObj = interface.extract<Poco::JSON::Object::Ptr>();
if(InterfaceObj->isArray("ssids")) {
auto SSIDA = InterfaceObj->getArray("ssids");
for(const auto &s:*SSIDA) {
auto SSIDinfo = s.extract<Poco::JSON::Object::Ptr>();
if(SSIDinfo->isArray("associations") && SSIDinfo->has("phy")) {
auto PHY = SSIDinfo->get("phy").toString();
auto SSIDArray = InterfaceObj->getArray("ssids");
for(const auto &ssid:*SSIDArray) {
auto SSID_info = ssid.extract<Poco::JSON::Object::Ptr>();
if(SSID_info->isArray("associations") && SSID_info->has("phy")) {
int Radio = 2;
auto Rit = RadioPHYs.find(PHY);
if(Rit!=RadioPHYs.end())
Radio = Rit->second;
auto AssocA = SSIDinfo->getArray("associations");
if(Radio==2) {
Radios_2G += AssocA->size();
if(UseBandInfo) {
Radio = BandToInt(SSID_info->get("band"));
} else {
auto PHY = SSID_info->get("phy");
auto Rit = RadioPHYs.find(PHY);
if (Rit != RadioPHYs.end())
Radio = Rit->second;
}
else {
Radios_5G += AssocA->size();
auto AssocA = SSID_info->getArray("associations");
switch(Radio) {
case 2: Radios_2G += AssocA->size(); break;
case 5: Radios_5G += AssocA->size(); break;
case 6: Radios_6G += AssocA->size(); break;
default: Radios_2G += AssocA->size(); break;
}
}
}
}
}
// std::cout << Radios_2G << " " << Radios_5G << " " << Radios_6G << std::endl;
return true;
}
return false;

View File

@@ -8,5 +8,5 @@
namespace OpenWifi::StateUtils {
bool ComputeAssociations(const Poco::JSON::Object::Ptr RawObject, uint64_t &Radios_2G,
uint64_t &Radios_5G);
uint64_t &Radios_5G, uint64_t &Radio_6G);
}

View File

@@ -18,36 +18,40 @@ namespace OpenWifi {
void Archiver::onTimer([[maybe_unused]] Poco::Timer &timer){
Utils::SetThreadName("strg-archiver");
auto now = Utils::Now();
for(const auto &i:DBs_) {
if (!Poco::icompare(i.DBName, "healthchecks")) {
for(const auto &[DBName, Keep]:DBs_) {
if (!Poco::icompare(DBName, "healthchecks")) {
poco_information(Logger(),"Archiving HealthChecks...");
StorageService()->RemoveHealthChecksRecordsOlderThan(
now - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "statistics")) {
now - (Keep * 24 * 60 * 60));
} else if (!Poco::icompare(DBName, "statistics")) {
poco_information(Logger(),"Archiving Statistics...");
StorageService()->RemoveStatisticsRecordsOlderThan(
now - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "devicelogs")) {
now - (Keep * 24 * 60 * 60));
} else if (!Poco::icompare(DBName, "devicelogs")) {
poco_information(Logger(),"Archiving Device Logs...");
StorageService()->RemoveDeviceLogsRecordsOlderThan(
now - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "commandlist")) {
now - (Keep * 24 * 60 * 60));
} else if (!Poco::icompare(DBName, "commandlist")) {
poco_information(Logger(),"Archiving Command History...");
StorageService()->RemoveCommandListRecordsOlderThan(
now - (i.HowManyDays * 24 * 60 * 60));
now - (Keep * 24 * 60 * 60));
} else if (!Poco::icompare(DBName, "fileuploads")) {
poco_information(Logger(),"Archiving Upload files...");
StorageService()->RemoveUploadedFilesRecordsOlderThan(
now - (Keep * 24 * 60 * 60));
} else {
poco_information(Logger(),fmt::format("Cannot archive DB '{}'", i.DBName));
poco_information(Logger(),fmt::format("Cannot archive DB '{}'", DBName));
}
}
AppServiceRegistry().Set("lastStorageArchiverRun", (uint64_t) now);
}
static auto CalculateDelta(int H, int M) {
static auto CalculateDelta(std::uint64_t H, std::uint64_t M) {
Poco::LocalDateTime dt;
Poco::LocalDateTime scheduled(dt.year(), dt.month(), dt.day(), H, M, 0);
Poco::LocalDateTime scheduled(dt.year(), dt.month(), dt.day(), (int)H, (int)M, 0);
size_t delta = 0;
if ((dt.hour() < H) || (dt.hour()==H && dt.minute()<M)) {
std::uint64_t delta = 0;
if ((dt.hour() < (int)H) || (dt.hour()==(int)H && dt.minute()<(int)M)) {
delta = scheduled.timestamp().epochTime() - dt.timestamp().epochTime();
} else {
delta = (24*60*60) - (dt.timestamp().epochTime() - scheduled.timestamp().epochTime());
@@ -69,13 +73,13 @@ namespace OpenWifi {
auto Schedule = MicroServiceConfigGetString("archiver.schedule","03:00");
auto S = Poco::StringTokenizer(Schedule,":");
int RunAtHour_, RunAtMin_;
std::uint64_t RunAtHour_, RunAtMin_;
if(S.count()!=2) {
RunAtHour_ = 3 ;
RunAtMin_ = 0;
} else {
RunAtHour_ = std::atoi(S[0].c_str());
RunAtMin_ = std::atoi(S[1].c_str());
RunAtHour_ = std::strtoull(S[0].c_str(), nullptr, 10);
RunAtMin_ = std::strtoull(S[1].c_str(), nullptr, 10);
}
for(int i=0;i<20;i++) {
@@ -86,10 +90,7 @@ namespace OpenWifi {
if(Poco::icompare(DBName,DB)==0) {
std::string Key = "archiver.db." + std::to_string(i) + ".keep";
auto Keep = MicroServiceConfigGetInt(Key,7);
Archiver_->AddDb(Archiver::ArchiverDBEntry{
.DBName = DB,
.HowManyDays = Keep
});
Archiver_->AddDb(DB, Keep);
}
}
}

View File

@@ -13,28 +13,26 @@
namespace OpenWifi {
static const std::list<std::string> AllInternalDBNames{"healthchecks", "statistics", "devicelogs" , "commandlist" };
static const std::list<std::string> AllInternalDBNames{"healthchecks", "statistics", "devicelogs" , "commandlist", "fileuploads"};
class Archiver {
public:
struct ArchiverDBEntry {
std::string DBName;
uint64_t HowManyDays=7;
};
typedef std::vector<ArchiverDBEntry> ArchiverDBEntryVec;
explicit Archiver(Poco::Logger &Logger):
Logger_(Logger) {
for(const auto &db:AllInternalDBNames) {
DBs_[db] = 7 ;
}
}
void onTimer(Poco::Timer & timer);
inline void AddDb(const ArchiverDBEntry &E ) {
DBs_.push_back(E);
inline void AddDb(const std::string &dbname, std::uint64_t retain) {
DBs_[dbname] = retain;
}
inline Poco::Logger & Logger() { return Logger_; }
private:
Poco::Logger &Logger_;
ArchiverDBEntryVec DBs_;
Poco::Logger &Logger_;
std::map<std::string,std::uint64_t> DBs_;
};
class StorageArchiver : public SubSystemServer {

View File

@@ -17,6 +17,10 @@ namespace OpenWifi {
Create_Tables();
InitializeBlackListCache();
ScriptDB_ = std::make_unique<OpenWifi::ScriptDB>("Scripts", "scr", dbType_,*Pool_, Logger());
ScriptDB_->Create();
ScriptDB_->Initialize();
return 0;
}

View File

@@ -11,6 +11,8 @@
#include "framework/StorageClass.h"
#include "RESTObjects//RESTAPI_GWobjects.h"
#include "Poco/Net/IPAddress.h"
#include "CentralConfig.h"
#include "storage/storage_scripts.h"
namespace OpenWifi {
@@ -28,6 +30,8 @@ namespace OpenWifi {
COMMAND_EXECUTING
};
inline OpenWifi::ScriptDB & ScriptDB() { return *ScriptDB_; }
inline std::string to_string(const CommandExecutionType &C) {
switch(C) {
case CommandExecutionType::COMMAND_PENDING: return "pending";
@@ -84,6 +88,7 @@ namespace OpenWifi {
bool AddStatisticsData(const GWObjects::Statistics & Stats);
bool GetStatisticsData(std::string &SerialNumber, uint64_t FromDate, uint64_t ToDate, uint64_t Offset, uint64_t HowMany,
std::vector<GWObjects::Statistics> &Stats);
bool GetNumberOfStatisticsDataRecords(std::string &SerialNumber, uint64_t FromDate, uint64_t ToDate, std::uint64_t &Count);
bool DeleteStatisticsData(std::string &SerialNumber, uint64_t FromDate, uint64_t ToDate );
bool GetNewestStatisticsData(std::string &SerialNumber, uint64_t HowMany, std::vector<GWObjects::Statistics> &Stats);
@@ -97,7 +102,7 @@ namespace OpenWifi {
bool UpdateDeviceConfiguration(std::string &SerialNumber, std::string &Configuration, uint64_t & NewUUID );
bool CreateDevice(GWObjects::Device &);
bool CreateDefaultDevice(std::string & SerialNumber, std::string & Capabilities, std::string & Firmware, std::string &Compatible,const Poco::Net::IPAddress & IPAddress);
bool CreateDefaultDevice(std::string &SerialNumber, const Config::Capabilities &Caps, std::string & Firmware, const Poco::Net::IPAddress & IPAddress);
bool GetDevice(std::string &SerialNumber, GWObjects::Device &);
bool GetDevices(uint64_t From, uint64_t HowMany, std::vector<GWObjects::Device> &Devices, const std::string & orderBy="");
@@ -111,14 +116,14 @@ namespace OpenWifi {
bool GetDeviceFWUpdatePolicy(std::string & SerialNumber, std::string & Policy);
bool SetDevicePassword(std::string & SerialNumber, std::string & Password);
bool UpdateSerialNumberCache();
void GetDeviceDbFieldList( Types::StringVec & Fields);
static void GetDeviceDbFieldList( Types::StringVec & Fields);
bool ExistingConfiguration(std::string &SerialNumber, uint64_t CurrentConfig, std::string &NewConfig, uint64_t &);
bool UpdateDeviceCapabilities(std::string &SerialNumber, std::string &State, std::string & Compatible);
bool UpdateDeviceCapabilities(std::string &SerialNumber, const Config::Capabilities & Capabilities);
bool GetDeviceCapabilities(std::string &SerialNumber, GWObjects::Capabilities &);
bool DeleteDeviceCapabilities(std::string & SerialNumber);
bool CreateDeviceCapabilities(std::string & SerialNumber, std::string & Capabilities);
bool CreateDeviceCapabilities(std::string & SerialNumber, const Config::Capabilities & Capabilities);
bool InitCapabilitiesCache();
bool GetLogData(std::string &SerialNumber, uint64_t FromDate, uint64_t ToDate, uint64_t Offset, uint64_t HowMany,
@@ -144,11 +149,9 @@ namespace OpenWifi {
bool DeleteCommand( std::string &UUID );
bool GetReadyToExecuteCommands( uint64_t Offset, uint64_t HowMany, std::vector<GWObjects::CommandDetails> & Commands );
bool CommandExecuted(std::string & UUID);
bool CommandCompleted(std::string & UUID, const Poco::JSON::Object & ReturnVars, const std::chrono::duration<double, std::milli> & execution_time, bool FullCommand);
// bool AttachFileToCommand(std::string & UUID);
bool AttachFileDataToCommand(std::string & UUID, const std::stringstream &s);
bool CommandCompleted(std::string & UUID, Poco::JSON::Object::Ptr ReturnVars, const std::chrono::duration<double, std::milli> & execution_time, bool FullCommand);
bool AttachFileDataToCommand(std::string & UUID, const std::stringstream &s, const std::string &Type);
bool CancelWaitFile( std::string & UUID, std::string & ErrorText );
// bool GetAttachedFile(std::string & UUID, const std::string & SerialNumber, const std::string & FileName, std::string &Type);
bool GetAttachedFileContent(std::string & UUID, const std::string & SerialNumber, std::string & FileContent, std::string &Type);
bool RemoveAttachedFile(std::string & UUID);
bool SetCommandResult(std::string & UUID, std::string & Result);
@@ -175,6 +178,7 @@ namespace OpenWifi {
bool RemoveDeviceLogsRecordsOlderThan(uint64_t Date);
bool RemoveStatisticsRecordsOlderThan(uint64_t Date);
bool RemoveCommandListRecordsOlderThan(uint64_t Date);
bool RemoveUploadedFilesRecordsOlderThan(uint64_t Date);
int Create_Tables();
int Create_Statistics();
@@ -195,6 +199,8 @@ namespace OpenWifi {
private:
std::unique_ptr<OpenWifi::ScriptDB> ScriptDB_;
};
inline auto StorageService() { return Storage::instance(); }

View File

@@ -80,7 +80,7 @@ namespace OpenWifi {
void TelemetryClient::SendTelemetryShutdown() {
poco_information(Logger(),fmt::format("TELEMETRY-SHUTDOWN({}): Closing.",CId_));
DeRegister();
AP_WS_Server()->StopWebSocketTelemetry(CommandManager()->NextRPCId(), SerialNumber_);
AP_WS_Server()->StopWebSocketTelemetry(CommandManager()->Next_RPC_ID(), SerialNumber_);
TelemetryStream()->DeRegisterClient(UUID_);
}

View File

@@ -4,12 +4,13 @@
#include "UI_GW_WebSocketNotifications.h"
namespace OpenWifi {
inline void WebNotificationSingleDevice::to_json(Poco::JSON::Object &Obj) const {
namespace OpenWifi::GWWebSocketNotifications {
inline void SingleDevice::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"serialNumber", serialNumber);
}
inline bool WebNotificationSingleDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
inline bool SingleDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"serialNumber", serialNumber);
return true;
@@ -19,13 +20,13 @@ namespace OpenWifi {
return false;
}
inline void WebNotificationSingleDeviceConfigurationChange::to_json(Poco::JSON::Object &Obj) const {
inline void SingleDeviceConfigurationChange::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"serialNumber", serialNumber);
RESTAPI_utils::field_to_json(Obj,"oldUUID", oldUUID);
RESTAPI_utils::field_to_json(Obj,"newUUID", newUUID);
}
inline bool WebNotificationSingleDeviceConfigurationChange::from_json(const Poco::JSON::Object::Ptr &Obj) {
inline bool SingleDeviceConfigurationChange::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"serialNumber", serialNumber);
RESTAPI_utils::field_from_json(Obj,"oldUUID", oldUUID);
@@ -37,12 +38,12 @@ namespace OpenWifi {
return false;
}
inline void WebNotificationSingleDeviceFirmwareChange::to_json(Poco::JSON::Object &Obj) const {
inline void SingleDeviceFirmwareChange::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"serialNumber", serialNumber);
RESTAPI_utils::field_to_json(Obj,"newFirmware", newFirmware);
}
inline bool WebNotificationSingleDeviceFirmwareChange::from_json(const Poco::JSON::Object::Ptr &Obj) {
inline bool SingleDeviceFirmwareChange::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"serialNumber", serialNumber);
RESTAPI_utils::field_from_json(Obj,"newFirmware", newFirmware);
@@ -53,13 +54,13 @@ namespace OpenWifi {
return false;
}
inline void WebSocketClientNotificationNumberOfConnection::to_json(Poco::JSON::Object &Obj) const {
inline void NumberOfConnection::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"numberOfDevices", numberOfDevices);
RESTAPI_utils::field_to_json(Obj,"averageConnectedTime", averageConnectedTime);
RESTAPI_utils::field_to_json(Obj,"numberOfConnectingDevices", numberOfConnectingDevices);
}
inline bool WebSocketClientNotificationNumberOfConnection::from_json(const Poco::JSON::Object::Ptr &Obj) {
inline bool NumberOfConnection::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"numberOfDevices", numberOfDevices);
RESTAPI_utils::field_from_json(Obj,"averageConnectedTime", averageConnectedTime);
@@ -71,64 +72,89 @@ namespace OpenWifi {
return false;
}
void WebSocketClientNotificationNumberOfConnections(WebSocketClientNotificationNumberOfConnection_t &N) {
N.type = "device_connections_statistics";
UI_WebSocketClientServer()->SendNotification(N);
}
void WebSocketClientNotificationNumberOfConnections(const std::string & User, WebSocketClientNotificationNumberOfConnection_t &N) {
N.type = "device_connections_statistics";
UI_WebSocketClientServer()->SendUserNotification(User,N);
}
void WebSocketClientNotificationDeviceConfigurationChange(WebNotificationSingleDeviceConfigurationChange_t &N) {
N.type = "device_configuration_upgrade";
void NumberOfConnections(NumberOfConnection_t &N) {
// N.type = "device_connections_statistics";
N.type_id = 1000 ;
UI_WebSocketClientServer()->SendNotification(N);
}
void WebSocketClientNotificationDeviceConfigurationChange(const std::string & User, WebNotificationSingleDeviceConfigurationChange_t &N) {
N.type = "device_configuration_upgrade";
void NumberOfConnections(const std::string & User, NumberOfConnection_t &N) {
// N.type = "device_connections_statistics";
N.type_id = 1000 ;
UI_WebSocketClientServer()->SendUserNotification(User,N);
}
void WebSocketClientNotificationDeviceFirmwareUpdated(WebNotificationSingleDeviceFirmwareChange_t &N) {
N.type = "device_firmware_upgrade";
void DeviceConfigurationChange(SingleDeviceConfigurationChange_t &N) {
// N.type = "device_configuration_upgrade";
N.type_id = 2000 ;
UI_WebSocketClientServer()->SendNotification(N);
}
void WebSocketClientNotificationDeviceFirmwareUpdated(const std::string & User, WebNotificationSingleDeviceFirmwareChange_t &N){
N.type = "device_firmware_upgrade";
void DeviceConfigurationChange(const std::string & User, SingleDeviceConfigurationChange_t &N) {
// N.type = "device_configuration_upgrade";
N.type_id = 2000 ;
UI_WebSocketClientServer()->SendUserNotification(User,N);
}
void WebSocketClientNotificationDeviceConnected(WebNotificationSingleDevice_t &N){
N.type = "device_connection";
void DeviceFirmwareUpdated(SingleDeviceFirmwareChange_t &N) {
// N.type = "device_firmware_upgrade";
N.type_id = 3000 ;
UI_WebSocketClientServer()->SendNotification(N);
}
void WebSocketClientNotificationDeviceConnected(const std::string & User, WebNotificationSingleDevice_t &N){
N.type = "device_connection";
void DeviceFirmwareUpdated(const std::string & User, SingleDeviceFirmwareChange_t &N){
// N.type = "device_firmware_upgrade";
N.type_id = 3000 ;
UI_WebSocketClientServer()->SendUserNotification(User,N);
}
void WebSocketClientNotificationDeviceDisconnected(const std::string & User, WebNotificationSingleDevice_t &N){
N.type = "device_disconnection";
UI_WebSocketClientServer()->SendUserNotification(User,N);
}
void WebSocketClientNotificationDeviceDisconnected(WebNotificationSingleDevice_t &N){
N.type = "device_disconnection";
void DeviceConnected(SingleDevice_t &N){
// N.type = "device_connection";
N.type_id = 4000 ;
UI_WebSocketClientServer()->SendNotification(N);
}
void WebSocketClientNotificationDeviceStatistics(const std::string & User, WebNotificationSingleDevice_t &N){
N.type = "device_statistics";
void DeviceConnected(const std::string & User, SingleDevice_t &N){
// N.type = "device_connection";
N.type_id = 4000 ;
UI_WebSocketClientServer()->SendUserNotification(User,N);
}
void WebSocketClientNotificationDeviceStatistics(WebNotificationSingleDevice_t &N){
N.type = "device_statistics";
void DeviceDisconnected(const std::string & User, SingleDevice_t &N){
// N.type = "device_disconnection";
N.type_id = 5000 ;
UI_WebSocketClientServer()->SendUserNotification(User,N);
}
void DeviceDisconnected(SingleDevice_t &N){
// N.type = "device_disconnection";
N.type_id = 5000 ;
UI_WebSocketClientServer()->SendNotification(N);
}
void DeviceStatistics(const std::string & User, SingleDevice_t &N){
// N.type = "device_statistics";
N.type_id = 6000 ;
UI_WebSocketClientServer()->SendUserNotification(User,N);
}
void DeviceStatistics(SingleDevice_t &N){
// N.type = "device_statistics";
N.type_id = 6000 ;
UI_WebSocketClientServer()->SendNotification(N);
}
void Register() {
static const UI_WebSocketClientServer::NotificationTypeIdVec Notifications = {
{ 1000, "device_connections_statistics" },
{ 2000, "device_configuration_upgrade" },
{ 3000, "device_firmware_upgrade" },
{ 4000, "device_connection" },
{ 5000, "device_disconnection" },
{ 6000, "device_statistics" }
};
UI_WebSocketClientServer()->RegisterNotifications(Notifications);
}
}

View File

@@ -7,14 +7,15 @@
#include "framework/UI_WebSocketClientNotifications.h"
#include "framework/UI_WebSocketClientServer.h"
namespace OpenWifi {
struct WebNotificationSingleDevice {
namespace OpenWifi::GWWebSocketNotifications {
struct SingleDevice {
std::string serialNumber;
inline void to_json(Poco::JSON::Object &Obj) const ;
inline bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct WebNotificationSingleDeviceConfigurationChange {
struct SingleDeviceConfigurationChange {
std::string serialNumber;
uint64_t oldUUID;
uint64_t newUUID;
@@ -23,14 +24,14 @@ namespace OpenWifi {
inline bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct WebNotificationSingleDeviceFirmwareChange {
struct SingleDeviceFirmwareChange {
std::string serialNumber;
std::string newFirmware;
inline void to_json(Poco::JSON::Object &Obj) const ;
inline bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct WebSocketClientNotificationNumberOfConnection {
struct NumberOfConnection {
std::uint64_t numberOfDevices=0;
std::uint64_t averageConnectedTime=0;
std::uint64_t numberOfConnectingDevices=0;
@@ -39,23 +40,25 @@ namespace OpenWifi {
inline bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
typedef WebSocketNotification<WebNotificationSingleDevice> WebNotificationSingleDevice_t;
typedef WebSocketNotification<WebNotificationSingleDeviceConfigurationChange> WebNotificationSingleDeviceConfigurationChange_t;
typedef WebSocketNotification<WebNotificationSingleDeviceFirmwareChange> WebNotificationSingleDeviceFirmwareChange_t;
typedef WebSocketNotification<WebSocketClientNotificationNumberOfConnection> WebSocketClientNotificationNumberOfConnection_t;
void Register();
void WebSocketClientNotificationNumberOfConnections(WebSocketClientNotificationNumberOfConnection_t &N);
void WebSocketClientNotificationDeviceConfigurationChange(WebNotificationSingleDeviceConfigurationChange_t &N);
void WebSocketClientNotificationDeviceFirmwareUpdated(WebNotificationSingleDeviceFirmwareChange_t &);
void WebSocketClientNotificationDeviceConnected(WebNotificationSingleDevice_t &N);
void WebSocketClientNotificationDeviceDisconnected(WebNotificationSingleDevice_t &N);
void WebSocketClientNotificationDeviceStatistics(WebNotificationSingleDevice_t &N);
typedef WebSocketNotification<SingleDevice> SingleDevice_t;
typedef WebSocketNotification<SingleDeviceConfigurationChange> SingleDeviceConfigurationChange_t;
typedef WebSocketNotification<SingleDeviceFirmwareChange> SingleDeviceFirmwareChange_t;
typedef WebSocketNotification<NumberOfConnection> NumberOfConnection_t;
void WebSocketClientNotificationNumberOfConnections(const std::string & User, WebSocketClientNotificationNumberOfConnection_t &N);
void WebSocketClientNotificationDeviceConfigurationChange(const std::string & User, WebNotificationSingleDeviceConfigurationChange_t &N);
void WebSocketClientNotificationDeviceFirmwareUpdated(const std::string & User, WebNotificationSingleDeviceFirmwareChange_t &);
void WebSocketClientNotificationDeviceConnected(const std::string & User, WebNotificationSingleDevice_t &N);
void WebSocketClientNotificationDeviceDisconnected(const std::string & User, WebNotificationSingleDevice_t &N);
void WebSocketClientNotificationDeviceStatistics(const std::string & User, WebNotificationSingleDevice_t &N);
void NumberOfConnections(NumberOfConnection_t &N);
void DeviceConfigurationChange(SingleDeviceConfigurationChange_t &N);
void DeviceFirmwareUpdated(SingleDeviceFirmwareChange_t &);
void DeviceConnected(SingleDevice_t &N);
void DeviceDisconnected(SingleDevice_t &N);
void DeviceStatistics(SingleDevice_t &N);
void NumberOfConnections(const std::string & User, NumberOfConnection_t &N);
void DeviceConfigurationChange(const std::string & User, SingleDeviceConfigurationChange_t &N);
void DeviceFirmwareUpdated(const std::string & User, SingleDeviceFirmwareChange_t &);
void DeviceConnected(const std::string & User, SingleDevice_t &N);
void DeviceDisconnected(const std::string & User, SingleDevice_t &N);
void DeviceStatistics(const std::string & User, SingleDevice_t &N);
};

View File

@@ -51,7 +51,13 @@ namespace OpenWifi {
poco_information(Logger(),"Starting...");
Running_=true;
Port_ = (int)MicroServiceConfigGetInt("alb.port",15015);
Socket_ = std::make_unique<Poco::Net::ServerSocket>(Port_);
Poco::Net::IPAddress Addr(Poco::Net::IPAddress::wildcard(
Poco::Net::Socket::supportsIPv6() ? Poco::Net::AddressFamily::IPv6
: Poco::Net::AddressFamily::IPv4));
Poco::Net::SocketAddress SockAddr(Addr, Port_);
Poco::Net::ServerSocket ClientSocket(SockAddr, 64);
Socket_ = std::make_unique<Poco::Net::ServerSocket>(SockAddr, Port_);
auto Params = new Poco::Net::HTTPServerParams;
Params->setName("ws:alb");
Server_ = std::make_unique<Poco::Net::HTTPServer>(new ALBRequestHandlerFactory(Logger()), *Socket_, Params);

View File

@@ -7,6 +7,7 @@
#include "framework/AuthClient.h"
#include "framework/MicroServiceNames.h"
#include "framework/OpenAPIRequests.h"
#include "framework/utils.h"
#include "fmt/format.h"
namespace OpenWifi {
@@ -18,10 +19,13 @@ namespace OpenWifi {
try {
Types::StringPairVec QueryData;
QueryData.push_back(std::make_pair("token",SessionToken));
std::string AlternateURIForLogging = fmt::format("{}?token={}", Sub ? "/api/v1/validateSubToken" : "/api/v1/validateToken", Utils::SanitizeToken(SessionToken));
OpenAPIRequestGet Req( uSERVICE_SECURITY,
Sub ? "/api/v1/validateSubToken" : "/api/v1/validateToken",
QueryData,
10000);
10000,
AlternateURIForLogging
);
Poco::JSON::Object::Ptr Response;
auto StatusCode = Req.Do(Response);
@@ -46,7 +50,7 @@ namespace OpenWifi {
}
}
} catch (...) {
poco_error(Logger(),fmt::format("Failed to retrieve token={} for TID={}", SessionToken, TID));
poco_error(Logger(),fmt::format("Failed to retrieve token={} for TID={}", Utils::SanitizeToken(SessionToken), TID));
}
Expired = false;
return false;
@@ -59,6 +63,7 @@ namespace OpenWifi {
if(!User.isNull()) {
if(IsTokenExpired(User->webtoken)) {
Expired = true;
Cache_.remove(SessionToken);
return false;
}
Expired = false;
@@ -68,4 +73,57 @@ namespace OpenWifi {
return RetrieveTokenInformation(SessionToken, UInfo, TID, Expired, Contacted, Sub);
}
bool AuthClient::RetrieveApiKeyInformation(const std::string & SessionToken,
SecurityObjects::UserInfoAndPolicy & UInfo,
std::uint64_t TID,
bool & Expired, bool & Contacted) {
try {
Types::StringPairVec QueryData;
QueryData.push_back(std::make_pair("apikey",SessionToken));
std::string AlternateURIForLogging = fmt::format("/api/v1/validateApiKey?apiKey={}", Utils::SanitizeToken(SessionToken));
OpenAPIRequestGet Req( uSERVICE_SECURITY,
"/api/v1/validateApiKey" ,
QueryData,
10000,
AlternateURIForLogging);
Poco::JSON::Object::Ptr Response;
auto StatusCode = Req.Do(Response);
if(StatusCode==Poco::Net::HTTPServerResponse::HTTP_GATEWAY_TIMEOUT) {
Contacted = false;
return false;
}
Contacted = true;
if(StatusCode==Poco::Net::HTTPServerResponse::HTTP_OK) {
if(Response->has("tokenInfo") && Response->has("userInfo") && Response->has("expiresOn")) {
UInfo.from_json(Response);
Expired = false;
ApiKeyCache_.update(SessionToken, ApiKeyCacheEntry{ .UserInfo = UInfo, .ExpiresOn = Response->get("expiresOn")});
return true;
} else {
return false;
}
}
} catch (...) {
poco_error(Logger(),fmt::format("Failed to retrieve api key={} for TID={}", Utils::SanitizeToken(SessionToken), TID));
}
Expired = false;
return false;
}
bool AuthClient::IsValidApiKey(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy &UInfo,
std::uint64_t TID, bool &Expired, bool &Contacted) {
auto User = ApiKeyCache_.get(SessionToken);
if (!User.isNull()) {
if(User->ExpiresOn < Utils::Now()) {
Expired = false;
UInfo = User->UserInfo;
return true;
}
ApiKeyCache_.remove(SessionToken);
}
return RetrieveApiKeyInformation(SessionToken, UInfo, TID, Expired, Contacted);
}
} // namespace OpenWifi

View File

@@ -12,6 +12,7 @@
namespace OpenWifi {
class AuthClient : public SubSystemServer {
public:
explicit AuthClient() noexcept:
SubSystemServer("Authentication", "AUTH-CLNT", "authentication")
@@ -23,7 +24,12 @@ namespace OpenWifi {
return instance_;
}
inline int Start() override {
struct ApiKeyCacheEntry {
OpenWifi::SecurityObjects::UserInfoAndPolicy UserInfo;
std::uint64_t ExpiresOn;
};
inline int Start() override {
return 0;
}
@@ -36,6 +42,7 @@ namespace OpenWifi {
inline void RemovedCachedToken(const std::string &Token) {
Cache_.remove(Token);
ApiKeyCache_.remove(Token);
}
inline static bool IsTokenExpired(const SecurityObjects::WebToken &T) {
@@ -46,12 +53,24 @@ namespace OpenWifi {
SecurityObjects::UserInfoAndPolicy & UInfo,
std::uint64_t TID,
bool & Expired, bool & Contacted, bool Sub=false);
bool RetrieveApiKeyInformation(const std::string & SessionToken,
SecurityObjects::UserInfoAndPolicy & UInfo,
std::uint64_t TID,
bool & Expired, bool & Contacted);
bool IsAuthorized(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo,
std::uint64_t TID,
bool & Expired, bool & Contacted, bool Sub = false);
bool IsValidApiKey(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo,
std::uint64_t TID,
bool & Expired, bool & Contacted);
private:
Poco::ExpireLRUCache<std::string,OpenWifi::SecurityObjects::UserInfoAndPolicy> Cache_{512,1200000 };
Poco::ExpireLRUCache<std::string,ApiKeyCacheEntry> ApiKeyCache_{512,1200000 };
};
inline auto AuthClient() { return AuthClient::instance(); }

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,7 @@
#include "Poco/FormattingChannel.h"
#include "Poco/AsyncChannel.h"
#include "Poco/NullChannel.h"
#include "Poco/SplitterChannel.h"
#include "Poco/Net/HTTPStreamFactory.h"
#include "Poco/Net/HTTPSStreamFactory.h"
#include "Poco/Net/FTPSStreamFactory.h"
@@ -26,7 +27,7 @@
#include "framework/RESTAPI_ExtServer.h"
#include "framework/RESTAPI_IntServer.h"
#include "framework/utils.h"
#include "framework/WebSocketLogger.h"
namespace OpenWifi {
@@ -77,7 +78,7 @@ namespace OpenWifi {
else
SvcList += ", " + Svc.second.Type;
}
logger().information(fmt::format("Current list of microservices: {}", SvcList));
poco_information(logger(),fmt::format("Current list of microservices: {}", SvcList));
}
} else {
poco_error(logger(),fmt::format("KAFKA-MSG: invalid event '{}', missing a field.",Event));
@@ -180,8 +181,6 @@ namespace OpenWifi {
MyHash_ = Utils::ComputeHash(MyPublicEndPoint_);
}
void MicroServicePostInitialization();
void MicroService::InitializeLoggingSystem() {
static auto initialized = false;
@@ -192,75 +191,144 @@ namespace OpenWifi {
auto LoggingDestination = MicroService::instance().ConfigGetString("logging.type", "file");
auto LoggingFormat = MicroService::instance().ConfigGetString("logging.format",
"%Y-%m-%d %H:%M:%S.%i %s: [%p][thr:%I] %t");
auto UseAsyncLogs_ = MicroService::instance().ConfigGetBool("logging.asynch",false);
auto UseAsyncLogs_ = MicroService::instance().ConfigGetBool("logging.asynch", true);
auto DisableWebSocketLogging = MicroService::instance().ConfigGetBool("logging.websocket",false);
if (LoggingDestination == "null") {
Poco::AutoPtr<Poco::NullChannel> DevNull(new Poco::NullChannel);
Poco::Logger::root().setChannel(DevNull);
} else if (LoggingDestination == "console") {
Poco::AutoPtr<Poco::ConsoleChannel> Console(new Poco::ConsoleChannel);
if(UseAsyncLogs_) {
Poco::AutoPtr<Poco::AsyncChannel> Async(new Poco::AsyncChannel(Console));
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", LoggingFormat);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(
new Poco::FormattingChannel(Formatter, Async));
Poco::Logger::root().setChannel(FormattingChannel);
} else {
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", LoggingFormat);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(
new Poco::FormattingChannel(Formatter, Console));
Poco::Logger::root().setChannel(FormattingChannel);
}
SetConsoleLogs(UseAsyncLogs_, DisableWebSocketLogging, LoggingFormat);
} else if (LoggingDestination == "colorconsole") {
Poco::AutoPtr<Poco::ColorConsoleChannel> ColorConsole(new Poco::ColorConsoleChannel);
if(UseAsyncLogs_) {
Poco::AutoPtr<Poco::AsyncChannel> Async(new Poco::AsyncChannel(ColorConsole));
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", LoggingFormat);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(
new Poco::FormattingChannel(Formatter, Async));
Poco::Logger::root().setChannel(FormattingChannel);
} else {
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", LoggingFormat);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(
new Poco::FormattingChannel(Formatter, ColorConsole));
Poco::Logger::root().setChannel(FormattingChannel);
}
SetColorConsoleLogs(UseAsyncLogs_, DisableWebSocketLogging, LoggingFormat);
} else if (LoggingDestination == "sql") {
//"CREATE TABLE T_POCO_LOG (Source VARCHAR, Name VARCHAR, ProcessId INTEGER, Thread VARCHAR, ThreadId INTEGER, Priority INTEGER, Text VARCHAR, DateTime DATE)"
SetSQLLogs(UseAsyncLogs_, DisableWebSocketLogging, LoggingFormat);
} else if (LoggingDestination == "syslog") {
SetSyslogLogs(UseAsyncLogs_, DisableWebSocketLogging, LoggingFormat);
} else {
auto LoggingLocation =
MicroService::instance().ConfigPath("logging.path", "$OWCERT_ROOT/logs") + "/log";
SetFileLogs(UseAsyncLogs_, DisableWebSocketLogging, LoggingFormat, DAEMON_ROOT_ENV_VAR);
}
Poco::AutoPtr<Poco::FileChannel> FileChannel(new Poco::FileChannel);
FileChannel->setProperty("rotation", "10 M");
FileChannel->setProperty("archive", "timestamp");
FileChannel->setProperty("path", LoggingLocation);
if(UseAsyncLogs_) {
Poco::AutoPtr<Poco::AsyncChannel> Async_File(
new Poco::AsyncChannel(FileChannel));
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", LoggingFormat);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(
new Poco::FormattingChannel(Formatter, Async_File));
Poco::Logger::root().setChannel(FormattingChannel);
} else {
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", LoggingFormat);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(
new Poco::FormattingChannel(Formatter, FileChannel));
Poco::Logger::root().setChannel(FormattingChannel);
}
}
auto Level = Poco::Logger::parseLevel(MicroService::instance().ConfigGetString("logging.level", "debug"));
Poco::Logger::root().setLevel(Level);
if(!DisableWebSocketLogging) {
static const UI_WebSocketClientServer::NotificationTypeIdVec Notifications = {
{1, "log"}};
UI_WebSocketClientServer()->RegisterNotifications(Notifications);
}
}
}
}
void MicroService::SetConsoleLogs(bool UseAsync, bool DisableWebSocketLogging, const std::string & FormatterPattern) {
Poco::AutoPtr<Poco::ConsoleChannel> Console(new Poco::ConsoleChannel);
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", FormatterPattern);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(new Poco::FormattingChannel(Formatter, Console));
if(DisableWebSocketLogging) {
if(UseAsync) {
Poco::AutoPtr<Poco::AsyncChannel> Async(new Poco::AsyncChannel(FormattingChannel));
Poco::Logger::root().setChannel(Async);
} else {
Poco::Logger::root().setChannel(FormattingChannel);
}
} else {
Poco::AutoPtr<WebSocketLogger> WSLogger(new WebSocketLogger);
Poco::AutoPtr<Poco::SplitterChannel> Splitter(new Poco::SplitterChannel);
Splitter->addChannel(WSLogger);
Splitter->addChannel(FormattingChannel);
if(UseAsync) {
Poco::AutoPtr<Poco::AsyncChannel> Async(new Poco::AsyncChannel(Splitter));
Poco::Logger::root().setChannel(Async);
} else {
Poco::Logger::root().setChannel(Splitter);
}
}
Poco::Logger::root().information(fmt::format("Enabled console logs: asynch={} websocket={}",UseAsync,DisableWebSocketLogging));
}
void MicroService::SetColorConsoleLogs(bool UseAsync, bool DisableWebSocketLogging, const std::string & FormatterPattern) {
Poco::AutoPtr<Poco::ColorConsoleChannel> Console(new Poco::ColorConsoleChannel);
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", FormatterPattern);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(new Poco::FormattingChannel(Formatter, Console));
if(DisableWebSocketLogging) {
if(UseAsync) {
Poco::AutoPtr<Poco::AsyncChannel> Async(new Poco::AsyncChannel(FormattingChannel));
Poco::Logger::root().setChannel(Async);
} else {
Poco::Logger::root().setChannel(FormattingChannel);
}
} else {
Poco::AutoPtr<WebSocketLogger> WSLogger(new WebSocketLogger);
Poco::AutoPtr<Poco::SplitterChannel> Splitter(new Poco::SplitterChannel);
Splitter->addChannel(WSLogger);
Splitter->addChannel(FormattingChannel);
if(UseAsync) {
Poco::AutoPtr<Poco::AsyncChannel> Async(new Poco::AsyncChannel(Splitter));
Poco::Logger::root().setChannel(Async);
} else {
Poco::Logger::root().setChannel(Splitter);
}
}
Poco::Logger::root().information(fmt::format("Enabled color console logs: asynch={} websocket={}",UseAsync,DisableWebSocketLogging));
}
void MicroService::SetSQLLogs([[maybe_unused]] bool UseAsync,[[maybe_unused]] bool DisableWebSocketLogging,[[maybe_unused]] const std::string & FormatterPattern) {
//"CREATE TABLE T_POCO_LOG (Source VARCHAR, Name VARCHAR, ProcessId INTEGER, Thread VARCHAR, ThreadId INTEGER, Priority INTEGER, Text VARCHAR, DateTime DATE)"
}
void MicroService::SetSyslogLogs([[maybe_unused]] bool UseAsync,[[maybe_unused]] bool DisableWebSocketLogging,[[maybe_unused]] const std::string & FormatterPattern) {
}
void MicroService::SetFileLogs(bool UseAsync, bool DisableWebSocketLogging, const std::string & FormatterPattern, const std::string & root_env_var) {
std::string DefaultLogPath = fmt::format("${}/logs",root_env_var);
auto LoggingLocationDir = MicroService::instance().ConfigPath("logging.path", DefaultLogPath);
Poco::File LD(LoggingLocationDir);
try {
if(!LD.exists()) {
LD.createDirectory();
}
} catch(const Poco::Exception &E) {
std::cout << "Cannot create " << LD.path() << " Error: " << E.message() << std::endl;
}
auto LoggingLocationDirFilePattern = LoggingLocationDir + "/log";
Poco::AutoPtr<Poco::FileChannel> FileChannel(new Poco::FileChannel);
FileChannel->setProperty("rotation", "10 M");
FileChannel->setProperty("archive", "timestamp");
FileChannel->setProperty("purgeCount", "10");
FileChannel->setProperty("path", LoggingLocationDirFilePattern);
Poco::AutoPtr<Poco::PatternFormatter> Formatter(new Poco::PatternFormatter);
Formatter->setProperty("pattern", FormatterPattern);
Poco::AutoPtr<Poco::FormattingChannel> FormattingChannel(new Poco::FormattingChannel(Formatter, FileChannel));
if(DisableWebSocketLogging) {
if(UseAsync) {
Poco::AutoPtr<Poco::AsyncChannel> Async(new Poco::AsyncChannel(FormattingChannel));
Poco::Logger::root().setChannel(Async);
} else {
Poco::Logger::root().setChannel(FormattingChannel);
}
} else {
Poco::AutoPtr<WebSocketLogger> WSLogger(new WebSocketLogger);
Poco::AutoPtr<Poco::SplitterChannel> Splitter(new Poco::SplitterChannel);
Splitter->addChannel(WSLogger);
Splitter->addChannel(FormattingChannel);
if(UseAsync) {
Poco::AutoPtr<Poco::AsyncChannel> Async(new Poco::AsyncChannel(Splitter));
Poco::Logger::root().setChannel(Async);
} else {
Poco::Logger::root().setChannel(Splitter);
}
}
Poco::Logger::root().information(fmt::format("Enabled file logs: asynch={} websocket={}",UseAsync,DisableWebSocketLogging));
}
void DaemonPostInitialization(Poco::Util::Application &self);
@@ -590,15 +658,15 @@ namespace OpenWifi {
logger.notice(fmt::format("Starting {} version {}.",DAEMON_APP_NAME, Version()));
if(Poco::Net::Socket::supportsIPv6())
logger.information("System supports IPv6.");
poco_information(logger,"System supports IPv6.");
else
logger.information("System does NOT support IPv6.");
poco_information(logger,"System does NOT support IPv6.");
if (config().getBool("application.runAsDaemon", false)) {
logger.information("Starting as a daemon.");
poco_information(logger,"Starting as a daemon.");
}
logger.information(fmt::format("System ID set to {}",ID_));
poco_information(logger,fmt::format("System ID set to {}",ID_));
StartSubSystemServers();
waitForTerminationRequest();
StopSubSystemServers();
@@ -630,4 +698,15 @@ namespace OpenWifi {
}
}
void MicroService::DeleteOverrideConfiguration() {
Poco::File F(DataDir_ + ExtraConfigurationFilename);
try {
if(F.exists())
F.remove();
} catch (...) {
}
}
}

View File

@@ -81,6 +81,8 @@ namespace OpenWifi {
// Logger_ = Poco::Logger::root().get("BASE-SVC");
}
inline static const char * ExtraConfigurationFilename = "/configuration_override.json";
inline void SaveConfig() { PropConfigurationFile_->save(ConfigFileName_); }
inline auto UpdateConfig() { return PropConfigurationFile_; }
inline bool NoAPISecurity() const { return NoAPISecurity_; }
@@ -151,9 +153,17 @@ namespace OpenWifi {
int main(const ArgVec &args) override;
void InitializeLoggingSystem();
void DeleteOverrideConfiguration();
[[nodiscard]] std::string Sign(Poco::JWT::Token &T, const std::string &Algo);
void AddActivity(const std::string &Activity);
static void SetConsoleLogs(bool UseAsync, bool AllowWebSocket, const std::string & FormatterPattern);
static void SetColorConsoleLogs(bool UseAsync, bool AllowWebSocket, const std::string & FormatterPattern);
static void SetSQLLogs(bool UseAsync, bool AllowWebSocket, const std::string & FormatterPattern);
static void SetSyslogLogs(bool UseAsync, bool AllowWebSocket, const std::string & FormatterPattern);
static void SetFileLogs(bool UseAsync, bool AllowWebSocket, const std::string & FormatterPattern, const std::string & root_env_var);
private:
static MicroService * instance_;
bool HelpRequested_ = false;

View File

@@ -10,6 +10,7 @@
#include "Poco/Net/NetException.h"
#include "Poco/Net/SSLException.h"
#include "Poco/JSON/Template.h"
#include "Poco/JSON/JSONException.h"
#include "Poco/Thread.h"
namespace OpenWifi {
@@ -101,6 +102,48 @@ namespace OpenWifi {
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::TimeoutException &E) {
poco_error(App_.logger(), fmt::format("Poco::TimeoutException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::NoThreadAvailableException &E) {
poco_error(App_.logger(), fmt::format("Poco::NoThreadAvailableException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::OutOfMemoryException &E) {
poco_error(App_.logger(), fmt::format("Poco::OutOfMemoryException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::BadCastException &E) {
poco_error(App_.logger(), fmt::format("Poco::BadCastException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::DataException &E) {
poco_error(App_.logger(), fmt::format("Poco::DataException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::PoolOverflowException &E) {
poco_error(App_.logger(), fmt::format("Poco::PoolOverflowException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::SystemException &E) {
poco_error(App_.logger(), fmt::format("Poco::SystemException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::RuntimeException &E) {
poco_error(App_.logger(), fmt::format("Poco::RuntimeException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),

View File

@@ -114,4 +114,8 @@ namespace OpenWifi {
std::string MicroServiceGetPublicAPIEndPoint() {
return MicroService::instance().GetPublicAPIEndPoint();
}
void MicroServiceDeleteOverrideConfiguration() {
return MicroService::instance().DeleteOverrideConfiguration();
}
}

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