Compare commits

...

210 Commits

Author SHA1 Message Date
TIP Automation User
7fc16581c7 Chg: update image tag in helm values to v2.7.0 2022-10-05 11:32:52 +00:00
TIP Automation User
2244e20be2 Chg: update image tag in helm values to v2.7.0-RC5 2022-10-05 02:45:53 +00:00
jaspreetsachdev
129458f7b6 Merge pull request #68 from Telecominfraproject/main
Fix for WIFI-10942
2022-10-04 22:43:00 -04:00
stephb9959
c187710ddf Merge remote-tracking branch 'origin/main' 2022-10-04 08:17:26 -07:00
stephb9959
c04a0c47ba https://telecominfraproject.atlassian.net/browse/WIFI-10942
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-10-04 08:17:14 -07:00
Dmitry Dunaev
8e16986e2d Merge pull request #67 from Telecominfraproject/main
[WIFI-10581] Fix: securityContext fsGroup in helm
2022-10-03 15:52:04 +03:00
Dmitry Dunaev
7492e68a73 [WIFI-10581] Fix: securityContext fsGroup in helm
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-10-03 15:51:35 +03:00
TIP Automation User
3df36a2e9d Chg: update image tag in helm values to v2.7.0-RC4 2022-10-03 11:14:20 +00:00
Dmitry Dunaev
c74507948d Merge pull request #66 from Telecominfraproject/main
[WIFI-10581] Add: postgresql-client in Dockerfile
2022-10-03 14:05:18 +03:00
Dmitry Dunaev
912903cc49 [WIFI-10581] Fix: Helm image to main
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-10-03 12:10:40 +03:00
Dmitry Dunaev
2a1cc8dc2a Merge pull request #65 from Telecominfraproject/fix/wifi-10581--postgres-client
[WIFI-10581] Add: postgresql-client in Dockerfile
2022-10-03 11:23:42 +03:00
Dmitry Dunaev
4e344eac03 [WIFI-10581] Add: postgresql-client in Dockerfile
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-10-03 11:23:28 +03:00
Stephane Bourque
838b6d016c Merge pull request #63 from Telecominfraproject/main
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-02 23:07:17 -07:00
Stephane Bourque
9be24a146d Merge pull request #64 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-02 23:05:55 -07:00
Stephane Bourque
2b9e934ac1 https://telecominfraproject.atlassian.net/browse/WIFI-10942 2022-10-02 23:05:15 -07:00
Stephane Bourque
db5dffe2b8 Merge branch 'release/v2.7.0' into main 2022-10-02 11:16:51 -07:00
Stephane Bourque
e527983fa6 Merge pull request #62 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-02 11:14:56 -07:00
Stephane Bourque
e0ef8d1dbf Merge branch 'main' into WIFI-10942 2022-10-02 11:14:49 -07:00
Stephane Bourque
bc1a2b2ab8 https://telecominfraproject.atlassian.net/browse/WIFI-10942 2022-10-02 11:13:20 -07:00
Stephane Bourque
06da583a6d Merge pull request #61 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-10-02 11:12:41 -07:00
Stephane Bourque
39e8fbc863 https://telecominfraproject.atlassian.net/browse/WIFI-10942 2022-10-02 11:11:34 -07:00
Stephane Bourque
88adcf6e78 Merge pull request #51 from Telecominfraproject/WIFI-10581-switch-images-to-debian-slim
[WIFI-10581] Switch microservice Docker images from Alpine to Debian-slim
2022-10-02 11:06:57 -07:00
TIP Automation User
dc6455813a Chg: update image tag in helm values to v2.7.0-RC3 2022-09-30 16:31:31 +00:00
Stephane Bourque
fed5739afc Merge pull request #60 from Telecominfraproject/WIFI-10942
https://telecominfraproject.atlassian.net/browse/WIFI-10942
2022-09-30 08:54:24 -07:00
stephb9959
f2fd761558 https://telecominfraproject.atlassian.net/browse/WIFI-10942 2022-09-30 08:52:34 -07:00
TIP Automation User
139c3ba217 Chg: update image tag in helm values to v2.7.0-RC2 2022-09-29 23:27:35 +00:00
jaspreetsachdev
ec8d304ae7 Merge pull request #59 from Telecominfraproject/main
Fixes for WIFI-10245
2022-09-29 19:18:39 -04:00
Dmitry Dunaev
578580ad95 Merge pull request #58 from Telecominfraproject/feature/wifi-10932--docker-support-http
[WIFI-10932] Add: restapi disable property in docker entrypoint
2022-09-28 17:33:39 +03:00
Dmitry Dunaev
5e719c9b90 [WIFI-10932] Add: restapi disable property in docker entrypoint
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-28 17:33:15 +03:00
Dmitry Dunaev
96b59c700a Merge pull request #57 from Telecominfraproject/feature/wifi-10582--helm-global-cert-secret
[WIFI-10582] Add: functionality to use external existing certificates secret
2022-09-28 17:06:18 +03:00
Dmitry Dunaev
bbaa5da556 [WIFI-10582] Add: functionality to use external existing certificates secret
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-28 13:32:28 +03:00
Stephane Bourque
5df2701c21 Merge pull request #56 from Telecominfraproject/WIFI-10900
https://telecominfraproject.atlassian.net/browse/WIFI-10900
2022-09-22 21:32:15 -07:00
stephb9959
ebd890dc79 https://telecominfraproject.atlassian.net/browse/WIFI-10900
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 21:31:08 -07:00
Stephane Bourque
23729bdde0 Merge pull request #55 from Telecominfraproject/WIFI-10900
https://telecominfraproject.atlassian.net/browse/WIFI-10900
2022-09-22 20:37:26 -07:00
stephb9959
f02d932059 https://telecominfraproject.atlassian.net/browse/WIFI-10900
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 20:36:59 -07:00
Stephane Bourque
c450328e05 Merge pull request #54 from Telecominfraproject/WIFI-10900
https://telecominfraproject.atlassian.net/browse/WIFI-10900
2022-09-22 07:47:42 -07:00
stephb9959
cf461eadb0 https://telecominfraproject.atlassian.net/browse/WIFI-10900
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 07:40:01 -07:00
stephb9959
73ee40acde https://telecominfraproject.atlassian.net/browse/WIFI-10900
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-22 07:23:07 -07:00
Dmitry Dunaev
acd5800206 Revert: "https://telecominfraproject.atlassian.net/browse/WIFI-10245"
This reverts commit 892a756aae.
2022-09-22 14:27:15 +03:00
Stephane Bourque
c5b613ecff Merge pull request #53 from Telecominfraproject/WIFI-10245
https://telecominfraproject.atlassian.net/browse/WIFI-10245
2022-09-21 19:45:55 -07:00
stephb9959
892a756aae https://telecominfraproject.atlassian.net/browse/WIFI-10245
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-09-21 19:45:15 -07:00
TIP Automation User
ccf1834c0b Chg: update image tag in helm values to v2.7.0-RC1 2022-09-16 19:54:53 +00:00
Dmitry Dunaev
f5c4b3b37b Merge pull request #52 from Telecominfraproject/feature/wifi-10069--add-wait-postgres-initcontainer
[WIFI-10069] Add: helm - wait-postgres init container
2022-09-02 14:37:11 +03:00
Dmitry Dunaev
33f8d5afb2 [WIFI-10069] Add: helm - wait-postgres init container
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-09-02 14:36:48 +03:00
Johann Hoffmann
8b37fe2c8c Fix self-signed cert file extension for Debian
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-08-19 17:19:58 +02:00
Johann Hoffmann
66433efb61 Create necessary library links in Docker image
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-08-19 16:13:43 +02:00
Johann Hoffmann
085aa109c3 Switch to Debian-slim base images
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-08-18 18:07:06 +02:00
Dmitry Dunaev
63043acce8 Merge pull request #50 from Telecominfraproject/fix/wifi-10413--cve-fix
[WIFI-10413] Fix: vulnerable base Docker image version
2022-08-15 13:31:05 +03:00
Dmitry Dunaev
2612a74567 [WIFI-10413] Fix: vulnerable base Docker image version
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-08-15 11:18:02 +03:00
Stephane Bourque
38e86e4de6 Merge pull request #49 from Telecominfraproject/WIFI-10245
https://telecominfraproject.atlassian.net/browse/WIFI-10245
2022-08-10 16:33:40 -07:00
stephb9959
d0ba0eac22 https://telecominfraproject.atlassian.net/browse/WIFI-10245
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-10 16:33:14 -07:00
Stephane Bourque
0a59afa1fa Merge pull request #48 from Telecominfraproject/feature/wifi-10388--versioning
[WIFI-10388] Chg: use Docker build arg to define dependency version
2022-08-08 12:13:14 -07:00
Dmitry Dunaev
7df6151da8 [WIFI-10388] Chg: use Docker build arg to define dependency version
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-08-08 17:42:09 +03:00
Stephane Bourque
6351082acf Merge pull request #47 from Telecominfraproject/WIFI-10388
https://telecominfraproject.atlassian.net/browse/WIFI-10388
2022-08-07 22:39:18 -07:00
stephb9959
de6abed9ae https://telecominfraproject.atlassian.net/browse/WIFI-10388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-07 22:38:19 -07:00
Stephane Bourque
ba97fd59df Merge pull request #46 from Telecominfraproject/WIFI-10388
https://telecominfraproject.atlassian.net/browse/WIFI-10388
2022-08-07 22:25:39 -07:00
stephb9959
8ef97f6300 https://telecominfraproject.atlassian.net/browse/WIFI-10388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-07 22:25:14 -07:00
Stephane Bourque
f24fb790eb Merge pull request #44 from Telecominfraproject/WIFI-10388
https://telecominfraproject.atlassian.net/browse/WIFI-10388
2022-08-01 22:37:12 -07:00
stephb9959
1c786ec360 https://telecominfraproject.atlassian.net/browse/WIFI-10388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-01 22:36:38 -07:00
Stephane Bourque
c001eb77d8 Merge pull request #43 from Telecominfraproject/WIFI-10388
https://telecominfraproject.atlassian.net/browse/WIFI-10388
2022-08-01 09:17:39 -07:00
stephb9959
7e7ddd953f https://telecominfraproject.atlassian.net/browse/WIFI-10388
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-08-01 09:12:34 -07:00
stephb9959
477f59ca9b https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-26 14:52:46 -07:00
stephb9959
e0548a2696 https://telecominfraproject.atlassian.net/browse/WIFI-10345
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-24 18:16:18 -07:00
Stephane Bourque
a900b7e28e Merge pull request #42 from Telecominfraproject/WIFI-10040
https://telecominfraproject.atlassian.net/browse/WIFI-10040
2022-07-04 21:40:02 -07:00
stephb9959
ef63dcd5b9 https://telecominfraproject.atlassian.net/browse/WIFI-10040
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-04 14:00:17 -07:00
Stephane Bourque
946c4bc1df Merge pull request #40 from Telecominfraproject/WIFI-10040
https://telecominfraproject.atlassian.net/browse/WIFI-10040
2022-07-01 10:15:38 -07:00
stephb9959
7fb5be32be https://telecominfraproject.atlassian.net/browse/WIFI-10040
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-07-01 09:41:31 -07:00
Johann Hoffmann
7cc719fcd6 Always re-generate config file if TEMPLATE_CONFIG is set to true (#37)
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-06-24 18:41:16 +02:00
stephb9959
9ea29b6088 Merge remote-tracking branch 'origin/main' 2022-06-18 22:00:10 -07:00
Stephane Bourque
24e25daa11 Framework update
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
2022-06-18 22:00:03 -07:00
Johann Hoffmann
9a5063b6cf [WIFI-9534] Add condition to avoid deleting default and release branch images
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-06-17 13:48:38 +02:00
stephb9959
f0188afdc1 Merge remote-tracking branch 'origin/main' 2022-06-15 09:09:20 -07:00
stephb9959
f5c1f808d8 Framework update. 2022-06-15 09:09:12 -07:00
Johann Hoffmann
eb2e039d48 Temporarily disable cleanup for merges into release branches
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-06-15 14:49:02 +02:00
Dmitry Dunaev
adafc84cb8 Merge pull request #34 from Telecominfraproject/fix/wifi-9174--dep-charts
[WIFI-9174] Fix: switch from deprecated bitnami charts to mirrored ones
2022-06-03 19:14:54 +03:00
Dmitry Dunaev
2eff4174c3 [WIFI-9174] Fix: switch from deprecated bitnami charts to mirrored ones
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-06-03 19:14:29 +03:00
stephb9959
dcc39392cf Framework update. 2022-05-31 23:54:23 -07:00
stephb9959
f19276e63e Framework update. 2022-05-31 23:25:04 -07:00
stephb9959
9ba9b82c31 Merge remote-tracking branch 'origin/main' 2022-05-31 12:34:09 -07:00
stephb9959
602ca394ed Framework update. 2022-05-31 12:34:02 -07:00
Dmitry Dunaev
29d961323b [WIFI-7555] Fix: helm path
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-05-23 15:20:20 +03:00
Johann Hoffmann
0530f255b4 Enable CI for pull requests in release branches
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-05-23 13:11:22 +02:00
stephb9959
6ff02c5f06 Framework update. 2022-05-22 22:27:54 -07:00
stephb9959
cfb0e6e219 Framework update. 2022-05-19 16:10:22 -07:00
stephb9959
bb19c0e70b Framework update. 2022-05-19 00:42:42 -07:00
stephb9959
d197323dba Framework update. 2022-05-17 12:48:37 -07:00
stephb9959
a374baceb8 Framework update. 2022-05-17 12:33:42 -07:00
stephb9959
63fb788653 Hardening Kafka errors in producer when there is a kafka disconnection. 2022-05-17 12:16:15 -07:00
stephb9959
8ccb95bf45 Framework update. 2022-05-15 13:44:56 -07:00
stephb9959
4433e1b189 Framework update. 2022-05-12 23:19:11 -07:00
stephb9959
c592af964a Framework update. 2022-05-12 23:08:52 -07:00
stephb9959
4fef783d30 Adding ability to retrieve the latest RC Only firmware. 2022-05-12 21:06:18 -07:00
stephb9959
2267fe7fc0 Framework update. 2022-05-12 08:51:03 -07:00
stephb9959
354c17ed3a Framework update 2022-05-10 08:01:33 -07:00
stephb9959
bfb9018642 Fix for https://telecominfraproject.atlassian.net/browse/WIFI-7867 2022-05-10 08:01:17 -07:00
stephb9959
e075b8d7ab Framework Update. 2022-05-09 10:29:49 -07:00
stephb9959
7328728006 Framework Update. 2022-05-09 09:59:23 -07:00
stephb9959
c61236d613 Framework update 2022-05-09 09:51:51 -07:00
stephb9959
fc09604442 Framework update 2022-05-08 08:48:29 -07:00
stephb9959
72aeafde48 Framework update 2022-05-07 21:58:28 -07:00
stephb9959
f55705ff64 Framework update 2022-05-06 23:12:06 -07:00
stephb9959
adfd583f9f Framework update 2022-05-06 22:48:38 -07:00
stephb9959
e0b160cdc4 Framework update 2022-05-05 21:31:49 -07:00
stephb9959
b18f178601 Framework update 2022-05-05 20:53:55 -07:00
stephb9959
1bf2d5c413 Framework update 2022-05-05 09:28:55 -07:00
stephb9959
1908217e38 Framework update 2022-05-04 23:50:55 -07:00
stephb9959
8dc2c4645d Framework update 2022-05-04 23:41:09 -07:00
stephb9959
63d5d8ac92 Framework update 2022-05-04 16:10:29 -07:00
stephb9959
5dd1a87376 Framework update 2022-05-03 19:23:43 -07:00
stephb9959
7a3827a425 Framework update 2022-05-03 18:03:36 -07:00
stephb9959
672d92ad96 Framework update 2022-05-03 08:39:37 -07:00
stephb9959
aef714855b Framework update 2022-05-02 14:06:34 -07:00
stephb9959
98ef247fab Framework update 2022-05-02 11:46:08 -07:00
stephb9959
1831bb59c7 Framework update 2022-05-02 11:28:08 -07:00
stephb9959
714742cf58 Framework update 2022-05-02 10:41:05 -07:00
stephb9959
dec87434d2 Framework update 2022-04-30 21:41:19 -07:00
stephb9959
83e957fd2e Framework update 2022-04-29 15:22:44 -07:00
stephb9959
3cc000c4c3 Framework update 2022-04-27 16:04:58 -07:00
stephb9959
60e5d45e74 Framework update 2022-04-23 23:13:29 -07:00
stephb9959
15215a4c7d Framework update 2022-04-23 16:54:49 -07:00
stephb9959
2d3717bb98 Framework update 2022-04-22 14:29:11 -07:00
stephb9959
ea0caa0815 Fixing building FMS container issue. 2022-04-18 22:45:24 -07:00
stephb9959
e46170f138 Fixing building FMS container issue. 2022-04-18 14:28:50 -07:00
stephb9959
9387c82b0d Fixing building FMS container issue. 2022-04-18 14:14:30 -07:00
stephb9959
b1a480fa6e Fixing building FMS container issue. 2022-04-18 13:49:01 -07:00
stephb9959
25b841915f Fixing building FMS container issue. 2022-04-18 13:37:49 -07:00
stephb9959
48d20ad443 Fixing building FMS container issue. 2022-04-18 13:15:02 -07:00
stephb9959
b908255a8d Fixing building FMS container issue. 2022-04-18 12:51:07 -07:00
stephb9959
c6baee3c7e Fixing building FMS container issue. 2022-04-18 12:29:28 -07:00
stephb9959
1116245f78 Fixing building FMS container issue. 2022-04-18 12:07:31 -07:00
stephb9959
833ef911b7 Fixing building FMS container issue. 2022-04-18 11:53:02 -07:00
stephb9959
fcc93770bd Fixing building FMS container issue. 2022-04-18 11:39:46 -07:00
stephb9959
496eabf20c Fixing building FMS container issue. 2022-04-18 10:02:53 -07:00
stephb9959
3819ce4fbe Fixing building FMS container issue. 2022-04-18 09:47:12 -07:00
stephb9959
36f6f8088b Fixing https://telecominfraproject.atlassian.net/browse/WIFI-7674 2022-04-18 09:14:48 -07:00
stephb9959
ec8b32ed0c Merge remote-tracking branch 'origin/main' 2022-04-18 09:10:26 -07:00
stephb9959
f27f5078b4 Fixing https://telecominfraproject.atlassian.net/browse/WIFI-7674 2022-04-18 09:10:17 -07:00
Dmitry Dunaev
400ee5d767 [WIFI-7555] Add: Helm packaging and GitHub release step
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-04-18 11:17:08 +03:00
stephb9959
bea6a172ac Trying to fix AWS SDK build issue. 2022-04-15 11:01:00 -04:00
stephb9959
51abcf9f0d Trying to fix AWS SDK build issue. 2022-04-15 09:32:47 -04:00
stephb9959
7c39080ba2 Trying to fix AWS SDK build issue. 2022-04-15 09:27:37 -04:00
stephb9959
932dd65df4 Trying to fix AWS SDK build issue. 2022-04-15 09:10:51 -04:00
stephb9959
7e1dbea118 Trying to fix AWS SDK build issue. 2022-04-15 08:53:39 -04:00
stephb9959
762b3ac60d Trying to fix AWS SDK build issue. 2022-04-15 08:24:09 -04:00
stephb9959
d3eebf5b89 Trying to fix AWS SDK build issue. 2022-04-15 07:58:47 -04:00
stephb9959
6e35848cd5 Trying to fix AWS SDK build issue. 2022-04-15 07:41:59 -04:00
stephb9959
8afbec7c64 Framework update. 2022-04-14 15:05:11 -04:00
Dmitry Dunaev
70b63704c0 [WIFI-7461] Add: trigger-deploy-to-dev step in CI
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-04-13 12:57:51 +03:00
stephb9959
773c72a0cc Fixing framework. 2022-04-06 09:44:27 -07:00
stephb9959
2904d7c258 Fixing framework. 2022-04-04 07:52:27 -07:00
stephb9959
d05aec1276 Merge remote-tracking branch 'origin/main' 2022-04-03 18:41:30 -07:00
stephb9959
d03f767a1f Fixing framework. 2022-04-03 18:41:23 -07:00
Dmitry Dunaev
9b5f30ce91 Merge pull request #33 from Telecominfraproject/feature/wifi-7221--add-owsub-trigger-testing
[WIFI-7221] Chg: trigger-testing inputs with new services
2022-04-01 13:52:33 +03:00
Dmitry Dunaev
3067d5c90b [WIFI-7221] Chg: trigger-testing inputs with new services
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-04-01 13:50:11 +03:00
stephb9959
7a13576746 Adding API for unknown and known firmware for serial number. 2022-03-31 15:17:22 -07:00
stephb9959
85d8667da5 Fixing for size=0; 2022-03-31 10:49:58 -07:00
stephb9959
a2a0aa2e49 Fixing for size=0; 2022-03-31 10:49:14 -07:00
stephb9959
902c5e2837 Fixing default syntax for bool. 2022-03-31 10:13:32 -07:00
stephb9959
caf86af949 Merge remote-tracking branch 'origin/main' 2022-03-31 10:13:16 -07:00
stephb9959
2a90955d3c Fixing default syntax for bool. 2022-03-31 10:13:03 -07:00
Dmitry Dunaev
d0e7bbfb09 [WIFI-4884] Add: more clear slack message on failure
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-28 12:58:18 +03:00
stephb9959
cb1b843c87 Fixing asan flags 2022-03-27 08:14:01 -07:00
stephb9959
0af7ee372f Cleaning CMakeLists.txt 2022-03-26 08:32:32 -07:00
stephb9959
35ef1d5182 Code sanitizer 2022-03-25 20:47:38 -07:00
stephb9959
ea66f54339 Code sanitizer 2022-03-25 20:42:44 -07:00
stephb9959
17052b1841 Code sanitizer 2022-03-25 20:39:17 -07:00
stephb9959
c5649f4b42 Code sanitizer 2022-03-25 20:35:58 -07:00
stephb9959
1836265c08 Code sanitizer 2022-03-25 20:33:04 -07:00
stephb9959
9bebaea65f Code sanitizer 2022-03-25 15:14:20 -07:00
stephb9959
45b5e77060 Framework fix "}" crash 2022-03-25 07:38:49 -07:00
stephb9959
b018d6c941 Framework fix. 2022-03-24 21:14:10 -07:00
stephb9959
c5135d4d72 Framework fix. 2022-03-24 20:43:20 -07:00
stephb9959
66edc4026e Framework fix. 2022-03-24 14:40:30 -07:00
stephb9959
e6d8d4b7e5 Framework fix. 2022-03-24 14:23:07 -07:00
stephb9959
7eb724ffe0 Merge remote-tracking branch 'origin/main' 2022-03-24 11:57:54 -07:00
stephb9959
6e6d39a309 Framework fix. 2022-03-24 11:57:46 -07:00
Dmitry Dunaev
f4944c1ab9 Merge pull request #32 from Telecominfraproject/feature/wifi-4647--trigger-add-chart-version
[WIFI-4884] Add: notification on CI failure in Slack
2022-03-24 14:49:47 +03:00
Dmitry Dunaev
d9bf707579 [WIFI-4884] Add: notification on CI failure in Slack
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-24 14:49:12 +03:00
stephb9959
6b09a373d2 Adding fmtlib/fmt to project 2022-03-23 10:56:06 -07:00
stephb9959
084c9c2a38 Fixing framework update to support insecure RESTAPI for ALB 2022-03-22 23:31:31 -07:00
stephb9959
5f5f8f6af5 Fixing framework update to support insecure RESTAPI for ALB 2022-03-22 21:28:03 -07:00
stephb9959
5f922377d3 Merge remote-tracking branch 'origin/main' 2022-03-22 21:18:05 -07:00
stephb9959
208fd05389 Fixing framework update to support insecure RESTAPI for ALB 2022-03-22 21:17:58 -07:00
Dmitry Dunaev
0055320331 Merge pull request #31 from Telecominfraproject/feature/wifi-4647--trigger-add-chart-version
[WIFI-4647] Add: deployment_version as trigger testing input
2022-03-22 14:27:20 +03:00
stephb9959
fc4e66418a Fixing framework update to support insecure RESTAPI for ALB 2022-03-21 21:42:21 -07:00
Dmitry Dunaev
3b394627ba [WIFI-4647] Add: deployment_version as trigger testing input
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-21 17:08:29 +03:00
stephb9959
21815a6f85 Fixing framework: OpenAPIRequestDelete 2022-03-16 11:55:54 -07:00
stephb9959
24f93004d5 Merge remote-tracking branch 'origin/main' 2022-03-16 11:46:55 -07:00
stephb9959
2023ca4cf9 Fixing framework: OpenAPIRequestDelete 2022-03-16 11:46:47 -07:00
Johann Hoffmann
694191f1d9 Add required input (#30)
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-03-14 18:31:01 +01:00
Dmitry Dunaev
27bad516d2 Merge pull request #29 from Telecominfraproject/feature/wifi-7223--kafka-ssl-params
[WIFI-7223] Add: secure Kafka connection params
2022-03-09 10:13:11 +03:00
Dmitry Dunaev
9b1cae679d [WIFI-7223] Add: secure Kafka connection params
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-09 10:12:50 +03:00
stephb9959
a53fc99753 Fixing framework: OpenAPIRequestDelete 2022-03-08 14:40:16 -08:00
stephb9959
1b0c11cbe0 Fixing framework: internal external <-> mismatch. 2022-03-08 14:25:45 -08:00
stephb9959
68028c1137 Adding DeviceInformation API 2022-03-04 10:59:34 -08:00
stephb9959
8d63fa2bda Adding DeviceInformation API 2022-03-04 10:23:49 -08:00
stephb9959
0c015595d9 Merge remote-tracking branch 'origin/main' 2022-03-04 10:23:13 -08:00
stephb9959
b17fd923ed Adding DeviceInformation API 2022-03-04 10:23:04 -08:00
stephb9959
b6f035b54e Framework update 2022-03-03 22:38:43 -08:00
Dmitry Dunaev
c22765896e [WIFI-1998] Fix: helm template typo
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-01 16:36:34 +03:00
Dmitry Dunaev
4b0d2e6a18 Merge pull request #28 from Telecominfraproject/feature/wifi-1998--ingress-deprecation
[WIFI-1998] Add: gracefull ingress deprecation
2022-03-01 16:22:21 +03:00
Dmitry Dunaev
75d3ee7722 [WIFI-1998] Add: gracefull ingress deprecation
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-03-01 16:11:36 +03:00
Johann Hoffmann
2a5d864b2a Add test_service and related functions (#27)
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-28 13:34:43 +01:00
stephb9959
419dd9d12f Framework update 2022-02-25 22:30:30 -08:00
stephb9959
7474727d91 Framework update 2022-02-25 22:30:20 -08:00
stephb9959
2e842918bc Framework update 2022-02-24 12:21:53 -08:00
stephb9959
0f36f15b64 Framework update 2022-02-23 08:20:44 -08:00
stephb9959
0262d00b0d Refactor 2022-02-21 08:59:28 -08:00
stephb9959
da2f8341db Adding Kafka SSL 2022-02-20 10:46:28 -08:00
stephb9959
47b014d502 Move to 2.6 2022-02-10 12:14:28 -08:00
83 changed files with 9012 additions and 4087 deletions

View File

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

View File

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

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

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

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.13) cmake_minimum_required(VERSION 3.13)
project(owfms VERSION 2.5.0) project(owfms VERSION 2.7.0)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
@@ -37,19 +37,13 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}") string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
endif() endif()
add_definitions(-DAWS_CUSTOM_MEMORY_MANAGEMENT) # set(BUILD_SHARED_LIBS 1)
# add_definitions(-DAWS_CUSTOM_MEMORY_MANAGEMENT)
set(BUILD_SHARED_LIBS 1)
add_definitions(-DAWS_CUSTOM_MEMORY_MANAGEMENT)
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost REQUIRED system)
find_package(OpenSSL REQUIRED) find_package(OpenSSL REQUIRED)
find_package(AWSSDK REQUIRED COMPONENTS s3) find_package(fmt REQUIRED)
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite) find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
find_package(AWSSDK REQUIRED COMPONENTS s3)
if(SMALL_BUILD) if(SMALL_BUILD)
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite) find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
@@ -64,6 +58,14 @@ include_directories(/usr/local/include /usr/local/opt/openssl/include src inclu
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY) configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
add_compile_options(-Wall -Wextra)
add_definitions(-DPOCO_LOG_DEBUG="1")
if(ASAN)
add_compile_options(-fsanitize=address)
add_link_options(-fsanitize=address)
endif()
add_executable( owfms add_executable( owfms
build build
src/ow_version.h.in src/ow_version.h.in
@@ -72,10 +74,11 @@ add_executable( owfms
src/framework/MicroService.h src/framework/MicroService.h
src/framework/OpenWifiTypes.h src/framework/OpenWifiTypes.h
src/framework/orm.h src/framework/orm.h
src/framework/RESTAPI_errors.h
src/framework/RESTAPI_protocol.h
src/framework/StorageClass.h src/framework/StorageClass.h
src/framework/uCentral_Protocol.h src/framework/ow_constants.h
src/framework/MicroServiceErrorHandler.h
src/framework/WebSocketClientNotifications.h
src/framework/MicroServiceErrorHandler.h
src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
@@ -102,11 +105,14 @@ add_executable( owfms
src/NewCommandHandler.cpp src/NewCommandHandler.h src/NewCommandHandler.cpp src/NewCommandHandler.h
src/storage/orm_history.cpp src/storage/orm_history.h src/storage/orm_history.cpp src/storage/orm_history.h
src/storage/orm_firmwares.cpp src/storage/orm_firmwares.h src/storage/orm_firmwares.cpp src/storage/orm_firmwares.h
src/storage/orm_deviceInfo.cpp src/storage/orm_deviceInfo.h) src/storage/orm_deviceInfo.cpp src/storage/orm_deviceInfo.h src/RESTAPI/RESTAPI_deviceInformation_handler.cpp src/RESTAPI/RESTAPI_deviceInformation_handler.h)
target_link_libraries(owfms PUBLIC target_link_libraries( owfms PUBLIC
${Poco_LIBRARIES} ${MySQL_LIBRARIES} ${Poco_LIBRARIES}
${Boost_LIBRARIES} ${MySQL_LIBRARIES}
${ZLIB_LIBRARIES} ${AWSSDK_LINK_LIBRARIES} ${ZLIB_LIBRARIES}
CppKafka::cppkafka ) ${AWSSDK_LINK_LIBRARIES}
fmt::fmt
CppKafka::cppkafka
)

View File

@@ -1,16 +1,24 @@
FROM alpine:3.15 AS build-base ARG DEBIAN_VERSION=11.4-slim
ARG POCO_VERSION=poco-tip-v1
ARG FMTLIB_VERSION=9.0.0
ARG CPPKAFKA_VERSION=tip-v1
ARG JSON_VALIDATOR_VERSION=2.1.0
ARG AWS_SDK_VERSION=1.9.315
RUN apk add --update --no-cache \ FROM debian:$DEBIAN_VERSION AS build-base
RUN apt-get update && apt-get install --no-install-recommends -y \
make cmake g++ git \ make cmake g++ git \
unixodbc-dev postgresql-dev mariadb-dev \ libpq-dev libmariadb-dev libmariadbclient-dev-compat \
librdkafka-dev boost-dev openssl-dev \ librdkafka-dev libboost-all-dev libssl-dev \
zlib-dev nlohmann-json \ zlib1g-dev nlohmann-json3-dev ca-certificates libcurl4-openssl-dev
curl-dev
FROM build-base AS poco-build FROM build-base AS poco-build
ADD https://api.github.com/repos/stephb9959/poco/git/refs/heads/master version.json ARG POCO_VERSION
RUN git clone https://github.com/stephb9959/poco /poco
ADD https://api.github.com/repos/AriliaWireless/poco/git/refs/tags/${POCO_VERSION} version.json
RUN git clone https://github.com/AriliaWireless/poco --branch ${POCO_VERSION} /poco
WORKDIR /poco WORKDIR /poco
RUN mkdir cmake-build RUN mkdir cmake-build
@@ -19,10 +27,26 @@ RUN cmake ..
RUN cmake --build . --config Release -j8 RUN cmake --build . --config Release -j8
RUN cmake --build . --target install RUN cmake --build . --target install
FROM build-base AS fmtlib-build
ARG FMTLIB_VERSION
ADD https://api.github.com/repos/fmtlib/fmt/git/refs/tags/${FMTLIB_VERSION} version.json
RUN git clone https://github.com/fmtlib/fmt --branch ${FMTLIB_VERSION} /fmtlib
WORKDIR /fmtlib
RUN mkdir cmake-build
WORKDIR cmake-build
RUN cmake ..
RUN make
RUN make install
FROM build-base AS cppkafka-build FROM build-base AS cppkafka-build
ADD https://api.github.com/repos/stephb9959/cppkafka/git/refs/heads/master version.json ARG CPPKAFKA_VERSION
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
ADD https://api.github.com/repos/AriliaWireless/cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json
RUN git clone https://github.com/AriliaWireless/cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka
WORKDIR /cppkafka WORKDIR /cppkafka
RUN mkdir cmake-build RUN mkdir cmake-build
@@ -33,8 +57,10 @@ RUN cmake --build . --target install
FROM build-base AS json-schema-validator-build FROM build-base AS json-schema-validator-build
ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/heads/master version.json ARG JSON_VALIDATOR_VERSION
RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/tags/${JSON_VALIDATOR_VERSION} version.json
RUN git clone https://github.com/pboettch/json-schema-validator --branch ${JSON_VALIDATOR_VERSION} /json-schema-validator
WORKDIR /json-schema-validator WORKDIR /json-schema-validator
RUN mkdir cmake-build RUN mkdir cmake-build
@@ -45,14 +71,19 @@ RUN make install
FROM build-base AS aws-sdk-cpp-build FROM build-base AS aws-sdk-cpp-build
ADD https://api.github.com/repos/aws/aws-sdk-cpp/git/refs/heads/main version.json ARG AWS_SDK_VERSION
RUN git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp /aws-sdk-cpp
ADD https://api.github.com/repos/aws/aws-sdk-cpp/git/refs/tags/${AWS_SDK_VERSION} version.json
RUN git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp --branch ${AWS_SDK_VERSION} /aws-sdk-cpp
WORKDIR /aws-sdk-cpp WORKDIR /aws-sdk-cpp
RUN mkdir cmake-build RUN mkdir cmake-build
WORKDIR cmake-build WORKDIR cmake-build
RUN cmake .. -DBUILD_ONLY="sns;s3" \ RUN cmake .. -DBUILD_ONLY="sns;s3" \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DUSE_OPENSSL=ON \
-DCPP_STANDARD=17 \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_CXX_FLAGS="-Wno-error=stringop-overflow -Wno-error=uninitialized" \ -DCMAKE_CXX_FLAGS="-Wno-error=stringop-overflow -Wno-error=uninitialized" \
-DAUTORUN_UNIT_TESTS=OFF -DAUTORUN_UNIT_TESTS=OFF
RUN cmake --build . --config Release -j8 RUN cmake --build . --config Release -j8
@@ -73,6 +104,8 @@ COPY --from=json-schema-validator-build /usr/local/include /usr/local/include
COPY --from=json-schema-validator-build /usr/local/lib /usr/local/lib COPY --from=json-schema-validator-build /usr/local/lib /usr/local/lib
COPY --from=aws-sdk-cpp-build /usr/local/include /usr/local/include COPY --from=aws-sdk-cpp-build /usr/local/include /usr/local/include
COPY --from=aws-sdk-cpp-build /usr/local/lib /usr/local/lib COPY --from=aws-sdk-cpp-build /usr/local/lib /usr/local/lib
COPY --from=fmtlib-build /usr/local/include /usr/local/include
COPY --from=fmtlib-build /usr/local/lib /usr/local/lib
WORKDIR /owfms WORKDIR /owfms
RUN mkdir cmake-build RUN mkdir cmake-build
@@ -80,21 +113,21 @@ WORKDIR /owfms/cmake-build
RUN cmake .. RUN cmake ..
RUN cmake --build . --config Release -j8 RUN cmake --build . --config Release -j8
FROM alpine:3.15 FROM debian:$DEBIAN_VERSION
ENV OWFMS_USER=owfms \ ENV OWFMS_USER=owfms \
OWFMS_ROOT=/owfms-data \ OWFMS_ROOT=/owfms-data \
OWFMS_CONFIG=/owfms-data OWFMS_CONFIG=/owfms-data
RUN addgroup -S "$OWFMS_USER" && \ RUN useradd "$OWFMS_USER"
adduser -S -G "$OWFMS_USER" "$OWFMS_USER"
RUN mkdir /openwifi RUN mkdir /openwifi
RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \ RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \
chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG" chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
RUN apk add --update --no-cache librdkafka su-exec gettext ca-certificates bash jq curl \ RUN apt-get update && apt-get install --no-install-recommends -y \
mariadb-connector-c libpq unixodbc postgresql-client librdkafka++1 gosu gettext ca-certificates bash jq curl wget \
libmariadb-dev-compat libpq5 unixodbc postgresql-client
COPY readiness_check /readiness_check COPY readiness_check /readiness_check
COPY test_scripts/curl/cli /cli COPY test_scripts/curl/cli /cli
@@ -103,7 +136,7 @@ COPY owfms.properties.tmpl /
COPY docker-entrypoint.sh / COPY docker-entrypoint.sh /
COPY wait-for-postgres.sh / COPY wait-for-postgres.sh /
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \ RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.pem -O /usr/local/share/ca-certificates/restapi-ca-selfsigned.crt
COPY --from=owfms-build /owfms/cmake-build/owfms /openwifi/owfms COPY --from=owfms-build /owfms/cmake-build/owfms /openwifi/owfms
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/* /usr/local/lib COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/* /usr/local/lib
@@ -112,6 +145,8 @@ COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-core/libaws-c
COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-s3/libaws-cpp-sdk-s3.so /usr/local/lib COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-s3/libaws-cpp-sdk-s3.so /usr/local/lib
COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-sns/libaws-cpp-sdk-sns.so /usr/local/lib COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-sns/libaws-cpp-sdk-sns.so /usr/local/lib
RUN ldconfig
EXPOSE 16004 17004 16104 EXPOSE 16004 17004 16104
ENTRYPOINT ["/docker-entrypoint.sh"] ENTRYPOINT ["/docker-entrypoint.sh"]

2
build
View File

@@ -1 +1 @@
36 18

View File

@@ -1,11 +1,11 @@
#!/bin/sh #!/bin/bash
set -e set -e
if [ "$SELFSIGNED_CERTS" = 'true' ]; then if [ "$SELFSIGNED_CERTS" = 'true' ]; then
update-ca-certificates update-ca-certificates
fi fi
if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWFMS_CONFIG"/owfms.properties ]]; then if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$OWFMS_ROOT/certs/restapi-ca.pem"} \ RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$OWFMS_ROOT/certs/restapi-ca.pem"} \
RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16004"} \ RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16004"} \
RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$OWFMS_ROOT/certs/restapi-cert.pem"} \ RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$OWFMS_ROOT/certs/restapi-cert.pem"} \
@@ -22,6 +22,7 @@ if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWFMS_CONFIG"/owfms.properties ]]; t
SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17004"} \ SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17004"} \
SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16004"} \ SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16004"} \
SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \ SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
SECURITY_RESTAPI_DISABLE=${SECURITY_RESTAPI_DISABLE:-"false"} \
S3_BUCKETNAME=${S3_BUCKETNAME:-"ucentral-ap-firmware"} \ S3_BUCKETNAME=${S3_BUCKETNAME:-"ucentral-ap-firmware"} \
S3_REGION=${S3_REGION:-"us-east-1"} \ S3_REGION=${S3_REGION:-"us-east-1"} \
S3_SECRET=${S3_SECRET:-"*******************************************"} \ S3_SECRET=${S3_SECRET:-"*******************************************"} \
@@ -29,6 +30,10 @@ if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWFMS_CONFIG"/owfms.properties ]]; t
S3_BUCKET_URI=${S3_BUCKET_URI:-"ucentral-ap-firmware.s3.amazonaws.com"} \ S3_BUCKET_URI=${S3_BUCKET_URI:-"ucentral-ap-firmware.s3.amazonaws.com"} \
KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \ KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \
KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \ KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \
KAFKA_SSL_CA_LOCATION=${KAFKA_SSL_CA_LOCATION:-""} \
KAFKA_SSL_CERTIFICATE_LOCATION=${KAFKA_SSL_CERTIFICATE_LOCATION:-""} \
KAFKA_SSL_KEY_LOCATION=${KAFKA_SSL_KEY_LOCATION:-""} \
KAFKA_SSL_KEY_PASSWORD=${KAFKA_SSL_KEY_PASSWORD:-""} \
STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \ STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \
STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \ STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \
STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"owfms"} \ STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"owfms"} \
@@ -47,7 +52,7 @@ if [ "$1" = '/openwifi/owfms' -a "$(id -u)" = '0' ]; then
if [ "$RUN_CHOWN" = 'true' ]; then if [ "$RUN_CHOWN" = 'true' ]; then
chown -R "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG" chown -R "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
fi fi
exec su-exec "$OWFMS_USER" "$@" exec gosu "$OWFMS_USER" "$@"
fi fi
exec "$@" exec "$@"

2
helm/.gitignore vendored
View File

@@ -1 +1,3 @@
*.swp *.swp
Chart.lock
charts/

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,5 @@
{{- $root := . -}} {{- $root := . -}}
{{- $storageType := index .Values.configProperties "storage.type" -}}
--- ---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
@@ -46,6 +47,39 @@ spec:
- -timeout - -timeout
- 600s - 600s
{{- if eq $storageType "postgresql" }}
- name: wait-postgres
image: "{{ .Values.images.owfms.repository }}:{{ .Values.images.owfms.tag }}"
imagePullPolicy: {{ .Values.images.owfms.pullPolicy }}
command:
- /wait-for-postgres.sh
- {{ index .Values.configProperties "storage.type.postgresql.host" }}
- echo
- "PostgreSQL is ready"
env:
- name: KUBERNETES_DEPLOYED
value: "{{ now }}"
{{- range $key, $value := .Values.public_env_variables }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- end }}
{{- range $key, $value := .Values.secret_env_variables }}
- name: {{ $key }}
valueFrom:
secretKeyRef:
name: {{ include "owfms.fullname" $root }}-env
key: {{ $key }}
{{- end }}
volumeMounts:
{{- range .Values.volumes.owfms }}
- name: {{ .name }}
mountPath: {{ .mountPath }}
{{- if .subPath }}
subPath: {{ .subPath }}
{{- end }}
{{- end }}
{{- end }}
containers: containers:
- name: owfms - name: owfms
@@ -97,8 +131,10 @@ spec:
{{- toYaml . | nindent 12 }} {{- toYaml . | nindent 12 }}
{{- end }} {{- end }}
{{- with .Values.securityContext }}
securityContext: securityContext:
fsGroup: 101 {{- toYaml . | nindent 8 }}
{{- end }}
imagePullSecrets: imagePullSecrets:
{{- range $image, $imageValue := .Values.images }} {{- range $image, $imageValue := .Values.images }}

View File

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

View File

@@ -9,7 +9,7 @@ fullnameOverride: ""
images: images:
owfms: owfms:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms
tag: main tag: v2.7.0
pullPolicy: Always pullPolicy: Always
# regcred: # regcred:
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io # registry: tip-tip-wlan-cloud-ucentral.jfrog.io
@@ -54,6 +54,7 @@ ingresses:
- restapi.chart-example.local - restapi.chart-example.local
paths: paths:
- path: / - path: /
pathType: ImplementationSpecific
serviceName: owfms serviceName: owfms
servicePort: restapi servicePort: restapi
@@ -70,7 +71,7 @@ volumes:
mountPath: /owfms-data/certs mountPath: /owfms-data/certs
volumeDefinition: | volumeDefinition: |
secret: secret:
secretName: {{ include "owfms.fullname" . }}-certs secretName: {{ if .Values.existingCertsSecret }}{{ .Values.existingCertsSecret }}{{ else }}{{ include "owfms.fullname" . }}-certs{{ end }}
# Change this if you want to use another volume type # Change this if you want to use another volume type
- name: persist - name: persist
mountPath: /owfms-data/persist mountPath: /owfms-data/persist
@@ -90,6 +91,9 @@ resources: {}
# cpu: 100m # cpu: 100m
# memory: 128Mi # memory: 128Mi
securityContext:
fsGroup: 1000
nodeSelector: {} nodeSelector: {}
tolerations: [] tolerations: []
@@ -154,6 +158,10 @@ configProperties:
openwifi.kafka.brokerlist: localhost:9092 openwifi.kafka.brokerlist: localhost:9092
openwifi.kafka.auto.commit: false openwifi.kafka.auto.commit: false
openwifi.kafka.queue.buffering.max.ms: 50 openwifi.kafka.queue.buffering.max.ms: 50
openwifi.kafka.ssl.ca.location: ""
openwifi.kafka.ssl.certificate.location: ""
openwifi.kafka.ssl.key.location: ""
openwifi.kafka.ssl.key.password: ""
# Storage # Storage
storage.type: sqlite # (sqlite|postgresql|mysql|odbc) storage.type: sqlite # (sqlite|postgresql|mysql|odbc)
## SQLite ## SQLite
@@ -202,6 +210,9 @@ configProperties:
storage.type.mysql.username: stephb storage.type.mysql.username: stephb
storage.type.mysql.password: snoopy99 storage.type.mysql.password: snoopy99
# NOTE: List of required certificates may be found in "certs" key. Alternative way to pass required certificates is to create external secret with all required certificates and set secret name in "existingCertsSecret" key. Details may be found in https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/main/chart#tldr
existingCertsSecret: ""
certs: certs:
# restapi-ca.pem: "" # restapi-ca.pem: ""
# restapi-cert.pem: "" # restapi-cert.pem: ""

View File

@@ -30,58 +30,13 @@ components:
responses: responses:
NotFound: NotFound:
description: The specified resource was not found. $ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/NotFound'
content:
application/json:
schema:
properties:
ErrorCode:
type: integer
ErrorDetails:
type: string
ErrorDescription:
type: string
Unauthorized: Unauthorized:
description: The requested does not have sufficient rights to perform the operation. $ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/Unauthorized'
content:
application/json:
schema:
properties:
ErrorCode:
type: integer
enum:
- 0 # Success
- 1 # PASSWORD_CHANGE_REQUIRED,
- 2 # INVALID_CREDENTIALS,
- 3 # PASSWORD_ALREADY_USED,
- 4 # USERNAME_PENDING_VERIFICATION,
- 5 # PASSWORD_INVALID,
- 6 # INTERNAL_ERROR,
- 7 # ACCESS_DENIED,
- 8 # INVALID_TOKEN
- 9 # EXPIRED_TOKEN
- 10 # RATE_LIMIT_EXCEEDED
- 11 # BAD_MFA_TRANSACTION
- 12 # MFA_FAILURE
- 13 # SECURITY_SERVICE_UNREACHABLE
ErrorDetails:
type: string
ErrorDescription:
type: string
Success: Success:
description: The requested operation was performed. $ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/Success'
content: BadRequest:
application/json: $ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/BadRequest'
schema:
properties:
Operation:
type: string
Details:
type: string
Code:
type: integer
schemas: schemas:
FirmwareDetails: FirmwareDetails:
@@ -140,6 +95,25 @@ components:
items: items:
$ref: '#/components/schemas/FirmwareDetails' $ref: '#/components/schemas/FirmwareDetails'
DeviceCurrentInfo:
type: object
properties:
serialNumber:
type: string
revision:
type: string
upgraded:
type: integer
format: int64
DeviceCurrentInfoList:
type: object
properties:
devices:
type: array
items:
$ref: '#/components/schemas/DeviceCurrentInfo'
RevisionHistoryEntry: RevisionHistoryEntry:
type: object type: object
properties: properties:
@@ -257,6 +231,26 @@ components:
totalSecondsOld: totalSecondsOld:
$ref: '#/components/schemas/TagIntPairList' $ref: '#/components/schemas/TagIntPairList'
DeviceInformation:
type: object
properties:
serialNumber:
type: string
history:
$ref: '#/components/schemas/RevisionHistoryEntryList'
currentFirmware:
type: string
currentFirmwareDate:
type: integer
format: int64
latestFirmware:
type: string
latestFirmwareDate:
type: integer
format: int64
latestFirmwareAvailable:
type: boolean
######################################################################################### #########################################################################################
## ##
## These are endpoints that all services in the uCentral stack must provide ## These are endpoints that all services in the uCentral stack must provide
@@ -455,9 +449,10 @@ paths:
required: false required: false
- in: query - in: query
name: latestOnly name: latestOnly
description: Return only the latest firwares description: Return only the latest firmware
schema: schema:
type: boolean type: boolean
default: false
required: false required: false
- in: query - in: query
name: deviceType name: deviceType
@@ -468,19 +463,28 @@ paths:
name: revisionSet name: revisionSet
schema: schema:
type: boolean type: boolean
default: false
required: false required: false
- in: query - in: query
name: deviceSet name: deviceSet
schema: schema:
type: boolean type: boolean
required: false required: false
- in: query
name: rcOnly
schema:
type: boolean
default: false
required: false
responses: responses:
200: 200:
description: List firmwares description: List firmwares
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/FirmwareDetailsList' oneOf:
- $ref: '#/components/schemas/FirmwareDetailsList'
- $ref: '#/components/schemas/FirmwareDetails'
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
404: 404:
@@ -627,13 +631,31 @@ paths:
schema: schema:
type: string type: string
required: false required: false
- in: query
description: Return current device list and current firmware
name: currentList
schema:
type: boolean
default: false
required: false
example: You must set {serialNumber} to 000000000000
- in: query
description: Return current device list and current firmware
name: unknownList
schema:
type: boolean
default: false
required: false
example: You must set {serialNumber} to 000000000000
responses: responses:
200: 200:
description: List of device history upgrade. description: List of device history upgrade.
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/RevisionHistoryEntryList' oneOf:
- $ref: '#/components/schemas/RevisionHistoryEntryList'
- $ref: '#/components/schemas/DeviceCurrentInfoList'
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
404: 404:
@@ -788,6 +810,28 @@ paths:
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
/deviceInformation/{serialNumber}:
get:
tags:
- Device Information
summary: receive a repor on a single decide
parameters:
- in: path
name: serialNumber
schema:
type: string
example:
aabbccdd1234
required: true
responses:
200:
$ref: '#/components/schemas/DeviceInformation'
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
######################################################################################### #########################################################################################
## ##
## These are endpoints that all services in the uCentral stack must provide ## These are endpoints that all services in the uCentral stack must provide

View File

@@ -35,6 +35,7 @@ openwifi.system.uri.private = https://localhost:17004
openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16004 openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16004
openwifi.system.commandchannel = /tmp/app.owfms openwifi.system.commandchannel = /tmp/app.owfms
openwifi.system.uri.ui = ucentral-ui.arilia.com openwifi.system.uri.ui = ucentral-ui.arilia.com
openwifi.security.restapi.disable = false
firmwaredb.refresh = 1800 firmwaredb.refresh = 1800
firmwaredb.maxage = 90 firmwaredb.maxage = 90
@@ -69,6 +70,10 @@ openwifi.kafka.enable = true
openwifi.kafka.brokerlist = a1.arilia.com:9092 openwifi.kafka.brokerlist = a1.arilia.com:9092
openwifi.kafka.auto.commit = false openwifi.kafka.auto.commit = false
openwifi.kafka.queue.buffering.max.ms = 50 openwifi.kafka.queue.buffering.max.ms = 50
openwifi.kafka.ssl.ca.location =
openwifi.kafka.ssl.certificate.location =
openwifi.kafka.ssl.key.location =
openwifi.kafka.ssl.key.password =
# #
# This section select which form of persistence you need # This section select which form of persistence you need

View File

@@ -36,6 +36,8 @@ openwifi.system.uri.private = ${SYSTEM_URI_PRIVATE}
openwifi.system.uri.public = ${SYSTEM_URI_PUBLIC} openwifi.system.uri.public = ${SYSTEM_URI_PUBLIC}
openwifi.system.commandchannel = /tmp/app.ucentralfms openwifi.system.commandchannel = /tmp/app.ucentralfms
openwifi.system.uri.ui = ${SYSTEM_URI_UI} openwifi.system.uri.ui = ${SYSTEM_URI_UI}
openwifi.security.restapi.disable = ${SECURITY_RESTAPI_DISABLE}
firmwaredb.refresh = 1800 firmwaredb.refresh = 1800
firmwaredb.maxage = 90 firmwaredb.maxage = 90
@@ -67,6 +69,10 @@ openwifi.kafka.enable = ${KAFKA_ENABLE}
openwifi.kafka.brokerlist = ${KAFKA_BROKERLIST} openwifi.kafka.brokerlist = ${KAFKA_BROKERLIST}
openwifi.kafka.auto.commit = false openwifi.kafka.auto.commit = false
openwifi.kafka.queue.buffering.max.ms = 50 openwifi.kafka.queue.buffering.max.ms = 50
openwifi.kafka.ssl.ca.location = ${KAFKA_SSL_CA_LOCATION}
openwifi.kafka.ssl.certificate.location = ${KAFKA_SSL_CERTIFICATE_LOCATION}
openwifi.kafka.ssl.key.location = ${KAFKA_SSL_KEY_LOCATION}
openwifi.kafka.ssl.key.password = ${KAFKA_SSL_KEY_PASSWORD}
# #
# This section select which form of persistence you need # This section select which form of persistence you need

View File

@@ -11,6 +11,7 @@
namespace OpenWifi { namespace OpenWifi {
int AutoUpdater::Start() { int AutoUpdater::Start() {
poco_information(Logger(),"Starting...");
AutoUpdaterEnabled_ = MicroService::instance().ConfigGetBool("autoupdater.enabled", false); AutoUpdaterEnabled_ = MicroService::instance().ConfigGetBool("autoupdater.enabled", false);
if(AutoUpdaterEnabled_) { if(AutoUpdaterEnabled_) {
Running_ = false; Running_ = false;
@@ -24,10 +25,12 @@ namespace OpenWifi {
} }
void AutoUpdater::Stop() { void AutoUpdater::Stop() {
poco_information(Logger(),"Stopping...");
Running_ = false; Running_ = false;
if(AutoUpdaterEnabled_) { if(AutoUpdaterEnabled_) {
Timer_.stop(); Timer_.stop();
} }
poco_information(Logger(),"Stopped...");
} }
void AutoUpdater::ToBeUpgraded(std::string serialNumber, std::string DeviceType) { void AutoUpdater::ToBeUpgraded(std::string serialNumber, std::string DeviceType) {
@@ -37,28 +40,29 @@ namespace OpenWifi {
Queue_.emplace_back(std::make_pair(std::move(serialNumber),std::move(DeviceType))); Queue_.emplace_back(std::make_pair(std::move(serialNumber),std::move(DeviceType)));
} }
void AutoUpdater::onTimer(Poco::Timer & timer) { void AutoUpdater::onTimer([[maybe_unused]] Poco::Timer & timer) {
Utils::SetThreadName("auto-updater");
Running_ = true; Running_ = true;
std::unique_lock L(Mutex_); std::unique_lock L(Mutex_);
while(!Queue_.empty() && Running_) { while(!Queue_.empty() && Running_) {
auto Entry = Queue_.front(); auto Entry = Queue_.front();
Queue_.pop_front(); Queue_.pop_front();
try { try {
Logger().debug(Poco::format("Preparing to upgrade %s",Entry.first)); poco_debug(Logger(),fmt::format("Preparing to upgrade {}",Entry.first));
auto CacheEntry = Cache_.find(Entry.first); auto CacheEntry = Cache_.find(Entry.first);
uint64_t Now = std::time(nullptr); uint64_t now = OpenWifi::Now();
std::string firmwareUpgrade; std::string firmwareUpgrade;
if(CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck-Now)>300) { if(CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck-now)>300) {
// get the firmware settings for that device. // get the firmware settings for that device.
SerialCache C; SerialCache C;
C.LastCheck = Now; C.LastCheck = now;
bool firmwareRCOnly; bool firmwareRCOnly;
if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) { if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) {
Logger().debug(Poco::format("Found firmware options for %s",Entry.first)); poco_debug(Logger(),fmt::format("Found firmware options for {}",Entry.first));
C.firmwareRCOnly = firmwareRCOnly; C.firmwareRCOnly = firmwareRCOnly;
C.firmwareUpgrade = firmwareUpgrade; C.firmwareUpgrade = firmwareUpgrade;
} else { } else {
Logger().debug(Poco::format("Found no firmware options for %s",Entry.first)); poco_debug(Logger(),fmt::format("Found no firmware options for {}",Entry.first));
C.firmwareRCOnly = firmwareRCOnly; C.firmwareRCOnly = firmwareRCOnly;
C.firmwareUpgrade = firmwareUpgrade; C.firmwareUpgrade = firmwareUpgrade;
} }
@@ -68,7 +72,7 @@ namespace OpenWifi {
} }
if(firmwareUpgrade=="no") { if(firmwareUpgrade=="no") {
Logger().information(Poco::format("Device %s not upgradable. Provisioning service settings.",Entry.first)); poco_information(Logger(),fmt::format("Device {} not upgradable. Provisioning service settings.",Entry.first));
continue; continue;
} }
@@ -78,26 +82,26 @@ namespace OpenWifi {
if(LF) { if(LF) {
if(StorageService()->FirmwaresDB().GetFirmware(fwEntry.Id,fwDetails)) { if(StorageService()->FirmwaresDB().GetFirmware(fwEntry.Id,fwDetails)) {
// send the command to upgrade this device... // send the command to upgrade this device...
Logger().information(Poco::format("Upgrading %s to version %s", Entry.first, fwEntry.Revision)); poco_information(Logger(),fmt::format("Upgrading {} to version {}", Entry.first, fwEntry.Revision));
if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) { if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) {
Logger().information(Poco::format("Upgrade command sent for %s",Entry.first)); poco_information(Logger(),fmt::format("Upgrade command sent for {}",Entry.first));
} else { } else {
Logger().information(Poco::format("Upgrade command not sent for %s",Entry.first)); poco_information(Logger(),fmt::format("Upgrade command not sent for {}",Entry.first));
} }
} else { } else {
Logger().information(Poco::format("Firmware for device %s (%s) cannot be found.", Entry.first, Entry.second )); poco_information(Logger(),fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second ));
} }
} else { } else {
Logger().information(Poco::format("Firmware for device %s (%s) cannot be found.", Entry.first, Entry.second )); poco_information(Logger(),fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second ));
} }
} catch (...) { } catch (...) {
Logger().information(Poco::format("Exception during auto update for device %s.", Entry.first )); poco_information(Logger(),fmt::format("Exception during auto update for device {}.", Entry.first ));
} }
} }
} }
void AutoUpdater::reinitialize(Poco::Util::Application &self) { void AutoUpdater::reinitialize([[maybe_unused]] Poco::Util::Application &self) {
Logger().information("Reinitializing."); poco_information(Logger(),"Reinitializing.");
Reset(); Reset();
} }
} }

View File

@@ -43,12 +43,7 @@ namespace OpenWifi {
return instance_; return instance_;
} }
void Daemon::initialize(Poco::Util::Application &self) { void Daemon::PostInitialization([[maybe_unused]] Poco::Util::Application &self) {
MicroService::initialize(*this);
}
void MicroServicePostInitialization() {
} }
} }

View File

@@ -12,11 +12,11 @@
namespace OpenWifi { namespace OpenWifi {
static const char * vDAEMON_PROPERTIES_FILENAME = "owfms.properties"; [[maybe_unused]] static const char * vDAEMON_PROPERTIES_FILENAME = "owfms.properties";
static const char * vDAEMON_ROOT_ENV_VAR = "OWFMS_ROOT"; [[maybe_unused]] static const char * vDAEMON_ROOT_ENV_VAR = "OWFMS_ROOT";
static const char * vDAEMON_CONFIG_ENV_VAR = "OWFMS_CONFIG"; [[maybe_unused]] static const char * vDAEMON_CONFIG_ENV_VAR = "OWFMS_CONFIG";
static const char * vDAEMON_APP_NAME = uSERVICE_FIRMWARE.c_str(); [[maybe_unused]] static const char * vDAEMON_APP_NAME = uSERVICE_FIRMWARE.c_str();
static const uint64_t vDAEMON_BUS_TIMER = 10000; [[maybe_unused]] static const uint64_t vDAEMON_BUS_TIMER = 10000;
class Daemon : public MicroService { class Daemon : public MicroService {
public: public:
@@ -28,7 +28,7 @@ namespace OpenWifi {
const SubSystemVec & SubSystems) : const SubSystemVec & SubSystems) :
MicroService( PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems) {}; MicroService( PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems) {};
void initialize(Poco::Util::Application &self); void PostInitialization(Poco::Util::Application &self);
static Daemon *instance(); static Daemon *instance();
inline void ResetDashboard() { DB_.Reset(); } inline void ResetDashboard() { DB_.Reset(); }
inline void CreateDashboard() { DB_.Create(); } inline void CreateDashboard() { DB_.Create(); }
@@ -40,6 +40,9 @@ namespace OpenWifi {
}; };
inline Daemon * Daemon() { return Daemon::instance(); } inline Daemon * Daemon() { return Daemon::instance(); }
inline void DaemonPostInitialization(Poco::Util::Application &self) {
Daemon()->PostInitialization(self);
}
} }
#endif //UCENTRALFWS_DAEMON_H #endif //UCENTRALFWS_DAEMON_H

View File

@@ -7,7 +7,7 @@
namespace OpenWifi { namespace OpenWifi {
void DeviceDashboard::Create() { void DeviceDashboard::Create() {
uint64_t Now = std::time(nullptr); uint64_t Now = OpenWifi::Now();
if(LastRun_==0 || (Now-LastRun_)>120) { if(LastRun_==0 || (Now-LastRun_)>120) {
DB_.reset(); DB_.reset();

View File

@@ -7,10 +7,13 @@
namespace OpenWifi { namespace OpenWifi {
int DeviceCache::Start() { int DeviceCache::Start() {
poco_information(Logger(),"Starting...");
return 0; return 0;
} }
void DeviceCache::Stop() { void DeviceCache::Stop() {
poco_information(Logger(),"Stopping...");
poco_information(Logger(),"Stopped...");
} }
void DeviceCache::AddToCache( void DeviceCache::AddToCache(

View File

@@ -7,18 +7,20 @@
namespace OpenWifi { namespace OpenWifi {
int FirmwareCache::Start() { int FirmwareCache::Start() {
poco_information(Logger(),"Starting...");
return 0; return 0;
} }
void FirmwareCache::Stop() { void FirmwareCache::Stop() {
poco_information(Logger(),"Stopping...");
poco_information(Logger(),"Stopped...");
} }
std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision) { std::shared_ptr<FMSObjects::Firmware> GetFirmware([[maybe_unused]] const std::string & DeviceType, [[maybe_unused]] const std::string & Revision) {
return nullptr; return nullptr;
} }
std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F) { std::shared_ptr<FMSObjects::Firmware> AddFirmware([[maybe_unused]] const FMSObjects::Firmware &F) {
return nullptr; return nullptr;
} }

View File

@@ -28,7 +28,6 @@ namespace OpenWifi {
std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision); std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision);
std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F); std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F);
private: private:
std::atomic_bool Running_=false; std::atomic_bool Running_=false;
FirmwareCacheMap Cache_; FirmwareCacheMap Cache_;

View File

@@ -8,11 +8,14 @@
namespace OpenWifi { namespace OpenWifi {
int LatestFirmwareCache::Start() { int LatestFirmwareCache::Start() {
poco_information(Logger(),"Starting...");
StorageService()->FirmwaresDB().PopulateLatestFirmwareCache(); StorageService()->FirmwaresDB().PopulateLatestFirmwareCache();
return 0; return 0;
} }
void LatestFirmwareCache::Stop() { void LatestFirmwareCache::Stop() {
poco_information(Logger(),"Stopping...");
poco_information(Logger(),"Stopped...");
} }
bool LatestFirmwareCache::AddToCache(const std::string & DeviceType, const std::string &Revision, const std::string &Id, uint64_t TimeStamp) { bool LatestFirmwareCache::AddToCache(const std::string & DeviceType, const std::string &Revision, const std::string &Id, uint64_t TimeStamp) {
@@ -20,14 +23,26 @@ namespace OpenWifi {
RevisionSet_.insert(Revision); RevisionSet_.insert(Revision);
DeviceSet_.insert(DeviceType); DeviceSet_.insert(DeviceType);
auto E = Cache_.find(DeviceType); auto E = Cache_.find(DeviceType);
if((E==Cache_.end()) || (TimeStamp >= E->second.TimeStamp)) { if((E==Cache_.end()) || (TimeStamp >= E->second.TimeStamp)) {
Cache_[DeviceType] = LatestFirmwareCacheEntry{ .Id=Id, Cache_[DeviceType] = LatestFirmwareCacheEntry{
.TimeStamp=TimeStamp, .Id=Id,
.Revision=Revision}; .TimeStamp=TimeStamp,
return true; .Revision=Revision};
} }
return false;
if(!IsRC(Revision))
return true;
auto rcE = rcCache_.find(DeviceType);
if((rcE==rcCache_.end()) || (TimeStamp >= rcE->second.TimeStamp)) {
rcCache_[DeviceType] = LatestFirmwareCacheEntry{
.Id=Id,
.TimeStamp=TimeStamp,
.Revision=Revision};
}
return true;
} }
bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) { bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
@@ -38,10 +53,21 @@ namespace OpenWifi {
Entry = E->second; Entry = E->second;
return true; return true;
} }
return false; return false;
} }
bool LatestFirmwareCache::FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
std::lock_guard G(Mutex_);
auto E=rcCache_.find(DeviceType);
if(E!=rcCache_.end()) {
Entry = E->second;
return true;
}
return false;
}
bool LatestFirmwareCache::IsLatest(const std::string &DeviceType, const std::string &Revision) { bool LatestFirmwareCache::IsLatest(const std::string &DeviceType, const std::string &Revision) {
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);
@@ -52,6 +78,16 @@ namespace OpenWifi {
return false; return false;
} }
bool LatestFirmwareCache::IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision) {
std::lock_guard G(Mutex_);
auto E=rcCache_.find(DeviceType);
if(E!=rcCache_.end()) {
return E->second.Revision==Revision;
}
return false;
}
void LatestFirmwareCache::DumpCache() { void LatestFirmwareCache::DumpCache() {
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);

View File

@@ -21,6 +21,7 @@ namespace OpenWifi {
std::string Revision; std::string Revision;
}; };
typedef std::map<std::string, LatestFirmwareCacheEntry> LatestFirmwareCacheMap; typedef std::map<std::string, LatestFirmwareCacheEntry> LatestFirmwareCacheMap;
typedef std::map<std::string, LatestFirmwareCacheEntry> rcOnlyLatestFirmwareCacheMap;
class LatestFirmwareCache : public SubSystemServer { class LatestFirmwareCache : public SubSystemServer {
public: public:
@@ -34,17 +35,29 @@ namespace OpenWifi {
bool AddToCache(const std::string & DeviceType, const std::string & Revision, const std::string &Id, uint64_t TimeStamp); bool AddToCache(const std::string & DeviceType, const std::string & Revision, const std::string &Id, uint64_t TimeStamp);
// void AddRevision(const std::string &Revision); // void AddRevision(const std::string &Revision);
bool FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ); bool FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
bool FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
inline static bool IsRC(const std::string & Revision) {
// OpenWrt 21.02-SNAPSHOT r16399+120-c67509efd7 / TIP-v2.5.0-36b5478
auto Tokens = Poco::StringTokenizer(Revision,"/", Poco::StringTokenizer::TOK_TRIM);
if(Tokens.count()!=2)
return false;
return (Tokens[1].substr(0,5) == "IP-v");
}
void DumpCache(); void DumpCache();
inline Types::StringSet GetRevisions() { std::lock_guard G(Mutex_); return RevisionSet_; }; inline Types::StringSet GetRevisions() { std::lock_guard G(Mutex_); return RevisionSet_; };
inline Types::StringSet GetDevices() { std::lock_guard G(Mutex_); return DeviceSet_; }; inline Types::StringSet GetDevices() { std::lock_guard G(Mutex_); return DeviceSet_; };
bool IsLatest(const std::string &DeviceType, const std::string &Revision); bool IsLatest(const std::string &DeviceType, const std::string &Revision);
bool IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision);
private: private:
LatestFirmwareCacheMap Cache_; LatestFirmwareCacheMap Cache_;
rcOnlyLatestFirmwareCacheMap rcCache_;
Types::StringSet RevisionSet_; Types::StringSet RevisionSet_;
Types::StringSet DeviceSet_; Types::StringSet DeviceSet_;
explicit LatestFirmwareCache() noexcept: explicit LatestFirmwareCache() noexcept:
SubSystemServer("FirmwareCache", "FIRMWARE-CACHE", "FirmwareCache") SubSystemServer("LatestFirmwareCache", "LATEST-FIRMWARE-CACHE", "LatestFirmwareCache")
{ {
} }
}; };

View File

@@ -16,19 +16,20 @@
namespace OpenWifi { namespace OpenWifi {
void ManifestCreator::onTimer(Poco::Timer &timer) { void ManifestCreator::onTimer([[maybe_unused]] Poco::Timer &timer) {
Logger().information("Performing DB refresh"); Utils::SetThreadName("manifest");
poco_information(Logger(),"Performing DB refresh");
S3BucketContent BucketList; S3BucketContent BucketList;
StorageService()->FirmwaresDB().RemoveOldFirmware(); StorageService()->FirmwaresDB().RemoveOldFirmware();
ReadBucket(BucketList); ReadBucket(BucketList);
Logger().information(Poco::format("Found %Lu firmware entries in S3 repository.",(uint64_t)BucketList.size())); poco_information(Logger(),fmt::format("Found {} firmware entries in S3 repository.", BucketList.size()));
ComputeManifest(BucketList); ComputeManifest(BucketList);
AddManifestToDB(BucketList); AddManifestToDB(BucketList);
} }
bool ManifestCreator::ComputeManifest(S3BucketContent &BucketContent) { bool ManifestCreator::ComputeManifest(S3BucketContent &BucketContent) {
uint64_t Limit = std::time(nullptr) - MaxAge_, Rejected=0, Accepted=0, BadFormat=0, MissingJson=0; uint64_t Limit = OpenWifi::Now() - MaxAge_, Rejected=0, Accepted=0, BadFormat=0, MissingJson=0;
for(auto &[Name,Entry]:BucketContent) { for(auto &[Name,Entry]:BucketContent) {
std::string C = Entry.S3ContentManifest; std::string C = Entry.S3ContentManifest;
@@ -48,7 +49,7 @@ namespace OpenWifi {
Entry.Image = ParsedContent->get("image").toString(); Entry.Image = ParsedContent->get("image").toString();
auto FullNme = Name + "-upgrade.bin"; auto FullNme = Name + "-upgrade.bin";
if(FullNme!=Entry.Image) { if(FullNme!=Entry.Image) {
Logger().error(Poco::format("MANIFEST(%s): Image name does not match manifest name (%s).",Name,Entry.Image)); poco_error(Logger(),fmt::format("MANIFEST({}): Image name does not match manifest name ({}).",Name,Entry.Image));
Entry.Valid = false; Entry.Valid = false;
BadFormat++; BadFormat++;
continue; continue;
@@ -60,7 +61,7 @@ namespace OpenWifi {
Entry.Valid = false; Entry.Valid = false;
} }
} else { } else {
Logger().error(Poco::format("MANIFEST(%s): Entry does not have a valid JSON manifest.",Name)); poco_error(Logger(),fmt::format("MANIFEST({}): Entry does not have a valid JSON manifest.",Name));
MissingJson++; MissingJson++;
Entry.Valid = false; Entry.Valid = false;
} }
@@ -69,10 +70,10 @@ namespace OpenWifi {
} }
} }
Logger().information(Poco::format("Accepted %Lu firmwares.", Accepted)); poco_information(Logger(),fmt::format("Accepted {} firmwares.", Accepted));
Logger().information(Poco::format("Rejected %Lu too old firmwares.", Rejected)); poco_information(Logger(),fmt::format("Rejected {} too old firmwares.", Rejected));
Logger().information(Poco::format("Rejected %Lu bad JSON.", BadFormat)); poco_information(Logger(),fmt::format("Rejected {} bad JSON.", BadFormat));
Logger().information(Poco::format("Rejected %Lu missing JSON.", MissingJson)); poco_information(Logger(),fmt::format("Rejected {} missing JSON.", MissingJson));
return true; return true;
} }
@@ -91,14 +92,14 @@ namespace OpenWifi {
F.id = MicroService::instance().CreateUUID(); F.id = MicroService::instance().CreateUUID();
F.release = Release; F.release = Release;
F.size = BucketEntry.S3Size; F.size = BucketEntry.S3Size;
F.created = std::time(nullptr); F.created = OpenWifi::Now();
F.imageDate = BucketEntry.S3TimeStamp; F.imageDate = BucketEntry.S3TimeStamp;
F.image = BucketEntry.S3Name; F.image = BucketEntry.Image;
F.uri = BucketEntry.URI; F.uri = BucketEntry.URI;
F.revision = BucketEntry.Revision; F.revision = BucketEntry.Revision;
F.deviceType = BucketEntry.Compatible; F.deviceType = BucketEntry.Compatible;
if(StorageService()->FirmwaresDB().AddFirmware(F)) { if(StorageService()->FirmwaresDB().AddFirmware(F)) {
Logger().information(Poco::format("Adding firmware '%s'",Release)); poco_information(Logger(),fmt::format("Adding firmware '{}', size={}",Release,F.size));
} else { } else {
} }
} }
@@ -126,8 +127,8 @@ namespace OpenWifi {
AwsCreds_.SetAWSSecretKey(S3Secret_); AwsCreds_.SetAWSSecretKey(S3Secret_);
ManifestCreatorCallBack_ = std::make_unique<Poco::TimerCallback<ManifestCreator>>(*this, &ManifestCreator::onTimer); ManifestCreatorCallBack_ = std::make_unique<Poco::TimerCallback<ManifestCreator>>(*this, &ManifestCreator::onTimer);
Timer_.setStartInterval(5 * 60 * 1000); // first run in 5 minutes Timer_.setStartInterval(1 * 60 * 1000); // first run in 1 minutes
Timer_.setPeriodicInterval(DBRefresh_ * 1000); Timer_.setPeriodicInterval((long)(DBRefresh_ * 1000));
Timer_.start(*ManifestCreatorCallBack_); Timer_.start(*ManifestCreatorCallBack_);
return 0; return 0;
@@ -184,7 +185,7 @@ namespace OpenWifi {
while(!isDone) { while(!isDone) {
Outcome = S3Client.ListObjectsV2(Request); Outcome = S3Client.ListObjectsV2(Request);
if(!Outcome.IsSuccess()) { if(!Outcome.IsSuccess()) {
Logger().error(Poco::format("Error while doing ListObjectsV2: %s, %s", poco_error(Logger(),fmt::format("Error while doing ListObjectsV2: {}, {}",
std::string{Outcome.GetError().GetExceptionName()}, std::string{Outcome.GetError().GetExceptionName()},
std::string{Outcome.GetError().GetMessage()})); std::string{Outcome.GetError().GetMessage()}));
return false; return false;
@@ -223,12 +224,17 @@ namespace OpenWifi {
It->second.Image = Image; It->second.Image = Image;
It->second.S3ContentManifest = Content; It->second.S3ContentManifest = Content;
} else { } else {
Bucket.emplace(Release, S3BucketEntry{ Bucket.emplace(Release, S3BucketEntry{
.Valid = false,
.S3Name = "",
.S3ContentManifest = Content, .S3ContentManifest = Content,
.S3TimeStamp = 0 ,
.S3Size = 0 ,
.Revision = Revision, .Revision = Revision,
.Image = Image, .Image = Image,
.Compatible = Compatible, .Compatible = Compatible,
.Timestamp = TimeStamp}); .Timestamp = TimeStamp,
.URI = ""});
} }
} }
} }
@@ -245,10 +251,17 @@ namespace OpenWifi {
It->second.S3Name = ReleaseName; It->second.S3Name = ReleaseName;
It->second.URI = URI; It->second.URI = URI;
} else { } else {
Bucket.emplace(ReleaseName, S3BucketEntry{ Bucket.emplace(ReleaseName, S3BucketEntry{
.S3Name = ReleaseName, .Valid = false,
.S3Name = "",
.S3ContentManifest = "",
.S3TimeStamp = S3TimeStamp, .S3TimeStamp = S3TimeStamp,
.S3Size = S3Size, .S3Size = S3Size ,
.Revision = "",
.Image = "",
.Compatible = "",
.Timestamp = 0 ,
.URI = URI}); .URI = URI});
} }
} else { } else {
@@ -268,7 +281,7 @@ namespace OpenWifi {
// std::cout << "Count:" << Count << " Runs:" << Runs << std::endl; // std::cout << "Count:" << Count << " Runs:" << Runs << std::endl;
if(!Outcome.IsSuccess()) { if(!Outcome.IsSuccess()) {
Logger().error(Poco::format("Error while doing ListObjectsV2: %s, %s", poco_error(Logger(),fmt::format("Error while doing ListObjectsV2: {}, {}",
std::string{Outcome.GetError().GetExceptionName()}, std::string{Outcome.GetError().GetExceptionName()},
std::string{Outcome.GetError().GetMessage()})); std::string{Outcome.GetError().GetMessage()}));
return false; return false;

View File

@@ -9,6 +9,7 @@ namespace OpenWifi {
void NewCommandHandler::run() { void NewCommandHandler::run() {
Running_ = true ; Running_ = true ;
Utils::SetThreadName("cmd-handler");
while(Running_) { while(Running_) {
Poco::Thread::trySleep(2000); Poco::Thread::trySleep(2000);
@@ -45,9 +46,9 @@ namespace OpenWifi {
if(Command=="delete_device") { if(Command=="delete_device") {
auto pSerialNumber = PayloadSection["payload"]["serialNumber"]; auto pSerialNumber = PayloadSection["payload"]["serialNumber"];
if(pSerialNumber==SerialNumber) { if(pSerialNumber==SerialNumber) {
Logger().debug(Poco::format("Removing device '%s' from upgrade history.",SerialNumber)); poco_debug(Logger(),fmt::format("Removing device '{}' from upgrade history.",SerialNumber));
StorageService()->HistoryDB().DeleteHistory(SerialNumber); StorageService()->HistoryDB().DeleteHistory(SerialNumber);
Logger().debug(Poco::format("Removing device '%s' from device table.",SerialNumber)); poco_debug(Logger(),fmt::format("Removing device '{}' from device table.",SerialNumber));
StorageService()->DevicesDB().DeleteDevice(SerialNumber); StorageService()->DevicesDB().DeleteDevice(SerialNumber);
} }
} }

View File

@@ -5,11 +5,11 @@
#include "NewConnectionHandler.h" #include "NewConnectionHandler.h"
#include "framework/KafkaTopics.h" #include "framework/KafkaTopics.h"
#include "framework/OpenWifiTypes.h" #include "framework/OpenWifiTypes.h"
#include "framework/ow_constants.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h" #include "Poco/JSON/Parser.h"
#include "StorageService.h" #include "StorageService.h"
#include "LatestFirmwareCache.h" #include "LatestFirmwareCache.h"
#include "framework/uCentral_Protocol.h"
#include "DeviceCache.h" #include "DeviceCache.h"
#include "AutoUpdater.h" #include "AutoUpdater.h"
@@ -22,6 +22,7 @@
namespace OpenWifi { namespace OpenWifi {
void NewConnectionHandler::run() { void NewConnectionHandler::run() {
Utils::SetThreadName("conn-handler");
Running_ = true ; Running_ = true ;
while(Running_) { while(Running_) {
Poco::Thread::trySleep(2000); Poco::Thread::trySleep(2000);
@@ -67,12 +68,12 @@ namespace OpenWifi {
if(StorageService()->FirmwaresDB().ComputeFirmwareAge(DeviceType, Revision, FA)) { if(StorageService()->FirmwaresDB().ComputeFirmwareAge(DeviceType, Revision, FA)) {
StorageService()->DevicesDB().SetDeviceRevision(SerialNumber, Revision, DeviceType, EndPoint); StorageService()->DevicesDB().SetDeviceRevision(SerialNumber, Revision, DeviceType, EndPoint);
if(FA.age) if(FA.age)
Logger().information(Poco::format("Device %s connection. Firmware is %s older than latest.",SerialNumber, Utils::SecondsToNiceText(FA.age))); poco_information(Logger(),fmt::format("Device {} connection. Firmware is {} older than latest.",SerialNumber, Utils::SecondsToNiceText(FA.age)));
else else
Logger().information(Poco::format("Device %s connection. Device firmware is up to date.",SerialNumber)); poco_information(Logger(),fmt::format("Device {} connection. Device firmware is up to date.",SerialNumber));
} }
else { else {
Logger().information(Poco::format("Device %s connection. Firmware age cannot be determined",SerialNumber)); poco_information(Logger(),fmt::format("Device {} connection. Firmware age cannot be determined.",SerialNumber));
} }
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) { if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
@@ -115,6 +116,7 @@ namespace OpenWifi {
}; };
int NewConnectionHandler::Start() { int NewConnectionHandler::Start() {
poco_information(Logger(),"Starting...");
Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->ConnectionReceived(s1,s2); }; Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->ConnectionReceived(s1,s2); };
ConnectionWatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::CONNECTION, F); ConnectionWatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::CONNECTION, F);
Worker_.start(*this); Worker_.start(*this);
@@ -122,10 +124,12 @@ namespace OpenWifi {
}; };
void NewConnectionHandler::Stop() { void NewConnectionHandler::Stop() {
poco_information(Logger(),"Stopping...");
KafkaManager()->UnregisterTopicWatcher(KafkaTopics::CONNECTION, ConnectionWatcherId_); KafkaManager()->UnregisterTopicWatcher(KafkaTopics::CONNECTION, ConnectionWatcherId_);
Running_ = false; Running_ = false;
Worker_.wakeUp(); Worker_.wakeUp();
Worker_.join(); Worker_.join();
poco_information(Logger(),"Stopped...");
}; };
bool NewConnectionHandler::Update() { bool NewConnectionHandler::Update() {

View File

@@ -29,8 +29,7 @@ namespace OpenWifi {
private: private:
Poco::Thread Worker_; Poco::Thread Worker_;
std::atomic_bool Running_ = false; std::atomic_bool Running_ = false;
int ConnectionWatcherId_=0; uint64_t ConnectionWatcherId_=0;
int HealthcheckWatcherId_=0;
Types::StringPairQueue NewConnections_; Types::StringPairQueue NewConnections_;
NewConnectionHandler() noexcept: NewConnectionHandler() noexcept:

View File

@@ -11,31 +11,37 @@
#include "RESTAPI/RESTAPI_connectedDevicesHandler.h" #include "RESTAPI/RESTAPI_connectedDevicesHandler.h"
#include "RESTAPI/RESTAPI_historyHandler.h" #include "RESTAPI/RESTAPI_historyHandler.h"
#include "RESTAPI/RESTAPI_deviceReportHandler.h" #include "RESTAPI/RESTAPI_deviceReportHandler.h"
#include "RESTAPI/RESTAPI_deviceInformation_handler.h"
namespace OpenWifi { namespace OpenWifi {
Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const char *Path, RESTAPIHandler::BindingMap &Bindings, Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) { Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) {
return RESTAPI_Router< return RESTAPI_Router<
RESTAPI_firmwaresHandler, RESTAPI_firmwaresHandler,
RESTAPI_firmwareHandler, RESTAPI_firmwareHandler,
RESTAPI_system_command, RESTAPI_system_command,
RESTAPI_firmwareAgeHandler, RESTAPI_firmwareAgeHandler,
RESTAPI_connectedDevicesHandler, RESTAPI_connectedDevicesHandler,
RESTAPI_connectedDeviceHandler, RESTAPI_connectedDeviceHandler,
RESTAPI_historyHandler, RESTAPI_historyHandler,
RESTAPI_deviceReportHandler RESTAPI_deviceReportHandler,
RESTAPI_deviceInformation_handler
>(Path,Bindings,L, S, TransactionId); >(Path,Bindings,L, S, TransactionId);
} }
Poco::Net::HTTPRequestHandler * RESTAPI_IntRouter(const char *Path, RESTAPIHandler::BindingMap &Bindings, Poco::Net::HTTPRequestHandler * RESTAPI_IntRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) { Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) {
return RESTAPI_Router_I< return RESTAPI_Router_I<
RESTAPI_firmwaresHandler, RESTAPI_firmwaresHandler,
RESTAPI_firmwareHandler, RESTAPI_firmwareHandler,
RESTAPI_system_command, RESTAPI_system_command,
RESTAPI_connectedDevicesHandler, RESTAPI_firmwareAgeHandler,
RESTAPI_connectedDeviceHandler RESTAPI_connectedDevicesHandler,
RESTAPI_connectedDeviceHandler,
RESTAPI_historyHandler,
RESTAPI_deviceReportHandler,
RESTAPI_deviceInformation_handler
>(Path, Bindings, L, S, TransactionId); >(Path, Bindings, L, S, TransactionId);
} }
} }

View File

@@ -5,8 +5,7 @@
#include "RESTAPI_connectedDeviceHandler.h" #include "RESTAPI_connectedDeviceHandler.h"
#include "RESTObjects/RESTAPI_FMSObjects.h" #include "RESTObjects/RESTAPI_FMSObjects.h"
#include "StorageService.h" #include "StorageService.h"
#include "framework/RESTAPI_protocol.h" #include "framework/ow_constants.h"
#include "framework/RESTAPI_errors.h"
namespace OpenWifi { namespace OpenWifi {

View File

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

View File

@@ -8,7 +8,7 @@
#include "RESTAPI_connectedDevicesHandler.h" #include "RESTAPI_connectedDevicesHandler.h"
#include "RESTObjects/RESTAPI_FMSObjects.h" #include "RESTObjects/RESTAPI_FMSObjects.h"
#include "StorageService.h" #include "StorageService.h"
#include "framework/RESTAPI_protocol.h" #include "framework/ow_constants.h"
namespace OpenWifi { namespace OpenWifi {
void RESTAPI_connectedDevicesHandler::DoGet() { void RESTAPI_connectedDevicesHandler::DoGet() {

View File

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

View File

@@ -0,0 +1,47 @@
//
// Created by stephane bourque on 2022-03-04.
//
#include "RESTAPI_deviceInformation_handler.h"
#include "StorageService.h"
#include "LatestFirmwareCache.h"
namespace OpenWifi {
void RESTAPI_deviceInformation_handler::DoGet() {
auto SerialNumber = GetBinding("serialNumber","");
if(SerialNumber.empty() || !Utils::ValidSerialNumber(SerialNumber)) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
FMSObjects::DeviceInformation DI;
// Let's get the history
StorageService()->HistoryDB().GetHistory(SerialNumber,0,100,DI.history.history);
// Let's get the DeviceConnectionInformation
FMSObjects::DeviceConnectionInformation DCI;
StorageService()->DevicesDB().GetDevice(SerialNumber,DCI);
LatestFirmwareCacheEntry LFE;
LatestFirmwareCache()->FindLatestFirmware(DCI.deviceType,LFE);
FMSObjects::Firmware Latest;
StorageService()->FirmwaresDB().GetFirmware(LFE.Id,Latest);
DI.serialNumber = SerialNumber;
DI.currentFirmware = DCI.revision;
DI.latestFirmware = LFE.Revision;
DI.latestFirmwareDate = LFE.TimeStamp;
DI.latestFirmwareURI = Latest.uri;
FirmwaresDB::RecordName FI;
StorageService()->FirmwaresDB().GetFirmwareByRevision(DCI.revision,DCI.deviceType,FI);
DI.currentFirmwareDate = FI.imageDate;
DI.latestFirmwareAvailable = (LFE.Revision != DCI.revision);
Poco::JSON::Object Answer;
DI.to_json(Answer);
return ReturnObject(Answer);
}
}

View File

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

View File

@@ -3,7 +3,6 @@
// //
#include "RESTAPI_deviceReportHandler.h" #include "RESTAPI_deviceReportHandler.h"
#include "StorageService.h"
#include "RESTObjects/RESTAPI_FMSObjects.h" #include "RESTObjects/RESTAPI_FMSObjects.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "Daemon.h" #include "Daemon.h"

View File

@@ -2,8 +2,7 @@
// Created by stephane bourque on 2021-07-19. // Created by stephane bourque on 2021-07-19.
// //
#ifndef UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H #pragma once
#define UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H
#include "framework/MicroService.h" #include "framework/MicroService.h"
@@ -18,13 +17,10 @@ namespace OpenWifi {
Server, Server,
TransactionId, TransactionId,
Internal) {} Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/deviceReport"};} static auto PathName() { return std::list<std::string>{"/api/v1/deviceReport"};}
void DoGet() final; void DoGet() final;
void DoDelete() final {}; void DoDelete() final {};
void DoPost() final {}; void DoPost() final {};
void DoPut() final {}; void DoPut() final {};
}; };
} }
#endif //UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H

View File

@@ -7,10 +7,7 @@
#include "StorageService.h" #include "StorageService.h"
#include "Poco/JSON/Parser.h" #include "Poco/JSON/Parser.h"
#include "DeviceCache.h" #include "DeviceCache.h"
#include "framework/uCentral_Protocol.h" #include "framework/ow_constants.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/RESTAPI_errors.h"
namespace OpenWifi { namespace OpenWifi {
void RESTAPI_firmwareAgeHandler::DoGet() { void RESTAPI_firmwareAgeHandler::DoGet() {

View File

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

View File

@@ -6,14 +6,12 @@
#include "RESTAPI_firmwareHandler.h" #include "RESTAPI_firmwareHandler.h"
#include "StorageService.h" #include "StorageService.h"
#include "framework/uCentral_Protocol.h" #include "framework/ow_constants.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/RESTAPI_errors.h"
namespace OpenWifi { namespace OpenWifi {
void void
RESTAPI_firmwareHandler::DoPost() { RESTAPI_firmwareHandler::DoPost() {
auto Obj = ParseStream(); const auto &Obj = ParsedBody_;
FMSObjects::Firmware F; FMSObjects::Firmware F;
if (!F.from_json(Obj)) { if (!F.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument); return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
@@ -68,7 +66,7 @@ namespace OpenWifi {
return NotFound(); return NotFound();
} }
auto Obj = ParseStream(); const auto & Obj = ParsedBody_;
FMSObjects::Firmware NewFirmware; FMSObjects::Firmware NewFirmware;
if(!NewFirmware.from_json(Obj)) { if(!NewFirmware.from_json(Obj)) {
return BadRequest(RESTAPI::Errors::InvalidJSONDocument); return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
@@ -80,7 +78,7 @@ namespace OpenWifi {
SecurityObjects::NoteInfoVec NIV; SecurityObjects::NoteInfoVec NIV;
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get(RESTAPI::Protocol::NOTES).toString()); NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get(RESTAPI::Protocol::NOTES).toString());
for(auto const &i:NIV) { for(auto const &i:NIV) {
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UserInfo_.userinfo.email, .note=i.note}; SecurityObjects::NoteInfo ii{.created=(uint64_t)OpenWifi::Now(), .createdBy=UserInfo_.userinfo.email, .note=i.note};
F.notes.push_back(ii); F.notes.push_back(ii);
} }
} }

View File

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

View File

@@ -5,18 +5,17 @@
#include "RESTAPI_firmwaresHandler.h" #include "RESTAPI_firmwaresHandler.h"
#include "StorageService.h" #include "StorageService.h"
#include "LatestFirmwareCache.h" #include "LatestFirmwareCache.h"
#include "framework/RESTAPI_protocol.h" #include "framework/ow_constants.h"
namespace OpenWifi { namespace OpenWifi {
void void
RESTAPI_firmwaresHandler::DoGet() { RESTAPI_firmwaresHandler::DoGet() {
std::string DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, ""); std::string DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, "");
bool IdOnly = GetBoolParameter(RESTAPI::Protocol::IDONLY, false); bool IdOnly = GetBoolParameter(RESTAPI::Protocol::IDONLY);
bool RevisionSet = GetBoolParameter(RESTAPI::Protocol::REVISIONSET, false); bool LatestOnly = GetBoolParameter(RESTAPI::Protocol::LATESTONLY);
bool LatestOnly = GetBoolParameter(RESTAPI::Protocol::LATESTONLY, false); bool rcOnly = GetBoolParameter("rcOnly");
bool DeviceSet = GetBoolParameter(RESTAPI::Protocol::DEVICESET, false);
if(DeviceSet) { if(GetBoolParameter(RESTAPI::Protocol::DEVICESET)) {
auto Revisions = LatestFirmwareCache()->GetDevices(); auto Revisions = LatestFirmwareCache()->GetDevices();
Poco::JSON::Array ObjectArray; Poco::JSON::Array ObjectArray;
for (const auto &i:Revisions) { for (const auto &i:Revisions) {
@@ -27,7 +26,7 @@ namespace OpenWifi {
return ReturnObject(RetObj); return ReturnObject(RetObj);
} }
if(RevisionSet) { if(GetBoolParameter(RESTAPI::Protocol::REVISIONSET)) {
auto Revisions = LatestFirmwareCache()->GetRevisions(); auto Revisions = LatestFirmwareCache()->GetRevisions();
Poco::JSON::Array ObjectArray; Poco::JSON::Array ObjectArray;
for (const auto &i:Revisions) { for (const auto &i:Revisions) {
@@ -42,8 +41,14 @@ namespace OpenWifi {
if(!DeviceType.empty()) { if(!DeviceType.empty()) {
if(LatestOnly) { if(LatestOnly) {
LatestFirmwareCacheEntry Entry; LatestFirmwareCacheEntry Entry;
if(!LatestFirmwareCache()->FindLatestFirmware(DeviceType,Entry)) { if(rcOnly) {
return NotFound(); if (!LatestFirmwareCache()->FindLatestRCOnlyFirmware(DeviceType, Entry)) {
return NotFound();
}
} else {
if (!LatestFirmwareCache()->FindLatestFirmware(DeviceType, Entry)) {
return NotFound();
}
} }
FMSObjects::Firmware F; FMSObjects::Firmware F;
@@ -58,6 +63,8 @@ namespace OpenWifi {
if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) { if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
Poco::JSON::Array ObjectArray; Poco::JSON::Array ObjectArray;
for (const auto &i:List) { for (const auto &i:List) {
if(rcOnly && !LatestFirmwareCache::IsRC(i.revision))
continue;
if(IdOnly) { if(IdOnly) {
ObjectArray.add(i.id); ObjectArray.add(i.id);
} else { } else {
@@ -80,6 +87,8 @@ namespace OpenWifi {
Poco::JSON::Object Answer; Poco::JSON::Object Answer;
if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) { if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
for (const auto &i:List) { for (const auto &i:List) {
if(rcOnly && !LatestFirmwareCache::IsRC(i.revision))
continue;
if(IdOnly) { if(IdOnly) {
ObjectArray.add(i.id); ObjectArray.add(i.id);
} else { } else {

View File

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

View File

@@ -4,8 +4,7 @@
#include "RESTAPI_historyHandler.h" #include "RESTAPI_historyHandler.h"
#include "StorageService.h" #include "StorageService.h"
#include "framework/RESTAPI_protocol.h" #include "framework/ow_constants.h"
#include "framework/RESTAPI_errors.h"
namespace OpenWifi { namespace OpenWifi {
void void
@@ -16,6 +15,26 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::MissingSerialNumber); return BadRequest(RESTAPI::Errors::MissingSerialNumber);
} }
auto unknownList = GetBoolParameter("unknownList");
if(SerialNumber=="000000000000" && unknownList) {
// so let's get all the devices, filter the latest record
FMSObjects::DeviceCurrentInfoList L;
StorageService()->HistoryDB().GetUnknownDeviceFirmwares(QB_.Offset,QB_.Limit,L.devices);
Poco::JSON::Object Answer;
L.to_json(Answer);
return ReturnObject(Answer);
}
auto currentList = GetBoolParameter("currentList");
if(SerialNumber=="000000000000" && currentList) {
// so let's get all the devices, filter the latest record
FMSObjects::DeviceCurrentInfoList L;
StorageService()->HistoryDB().GetDeviceFirmwares(QB_.Offset,QB_.Limit,L.devices);
Poco::JSON::Object Answer;
L.to_json(Answer);
return ReturnObject(Answer);
}
FMSObjects::RevisionHistoryEntryVec H; FMSObjects::RevisionHistoryEntryVec H;
if (StorageService()->HistoryDB().GetHistory(SerialNumber, QB_.Offset, QB_.Limit, H)) { if (StorageService()->HistoryDB().GetHistory(SerialNumber, QB_.Offset, QB_.Limit, H)) {
Poco::JSON::Array A; Poco::JSON::Array A;

View File

@@ -2,9 +2,7 @@
// Created by stephane bourque on 2021-07-13. // Created by stephane bourque on 2021-07-13.
// //
#ifndef UCENTRALFMS_RESTAPI_HISTORYHANDLER_H #pragma once
#define UCENTRALFMS_RESTAPI_HISTORYHANDLER_H
#include "framework/MicroService.h" #include "framework/MicroService.h"
@@ -20,13 +18,10 @@ namespace OpenWifi {
Server, Server,
TransactionId, TransactionId,
Internal) {} Internal) {}
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/revisionHistory/{serialNumber}"};} static auto PathName() { return std::list<std::string>{"/api/v1/revisionHistory/{serialNumber}"};}
void DoGet() final; void DoGet() final;
void DoDelete() final; void DoDelete() final;
void DoPost() final {}; void DoPost() final {};
void DoPut() final {}; void DoPut() final {};
}; };
} }
#endif //UCENTRALFMS_RESTAPI_HISTORYHANDLER_H

View File

@@ -0,0 +1,624 @@
//
// Created by stephane bourque on 2022-01-10.
//
#include "RESTAPI_AnalyticsObjects.h"
#include "RESTAPI_ProvObjects.h"
#include "framework/MicroService.h"
using OpenWifi::RESTAPI_utils::field_to_json;
using OpenWifi::RESTAPI_utils::field_from_json;
namespace OpenWifi::AnalyticsObjects {
void Report::reset() {
}
void Report::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {
}
void VenueInfo::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,"retention",retention);
field_to_json(Obj,"interval",interval);
field_to_json(Obj,"monitorSubVenues",monitorSubVenues);
}
bool VenueInfo::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,"retention",retention);
field_from_json(Obj,"interval",interval);
field_from_json(Obj,"monitorSubVenues",monitorSubVenues);
return true;
} catch(...) {
}
return false;
}
void BoardInfo::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json(Obj,"venueList",venueList);
}
bool BoardInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json(Obj,"venueList",venueList);
return true;
} catch(...) {
}
return false;
}
void DeviceInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"boardId",boardId);
field_to_json(Obj,"type",type);
field_to_json(Obj,"serialNumber",serialNumber);
field_to_json(Obj,"deviceType",deviceType);
field_to_json(Obj,"lastContact",lastContact);
field_to_json(Obj,"lastPing",lastPing);
field_to_json(Obj,"lastState",lastState);
field_to_json(Obj,"lastFirmware",lastFirmware);
field_to_json(Obj,"lastFirmwareUpdate",lastFirmwareUpdate);
field_to_json(Obj,"lastConnection",lastConnection);
field_to_json(Obj,"lastDisconnection",lastDisconnection);
field_to_json(Obj,"pings",pings);
field_to_json(Obj,"states",states);
field_to_json(Obj,"connected",connected);
field_to_json(Obj,"connectionIp",connectionIp);
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,"health",health);
field_to_json(Obj,"lastHealth",lastHealth);
field_to_json(Obj,"locale",locale);
field_to_json(Obj,"uptime",uptime);
field_to_json(Obj,"memory",memory);
}
bool DeviceInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"boardId",boardId);
field_from_json(Obj,"type",type);
field_from_json(Obj,"serialNumber",serialNumber);
field_from_json(Obj,"deviceType",deviceType);
field_from_json(Obj,"lastContact",lastContact);
field_from_json(Obj,"lastPing",lastPing);
field_from_json(Obj,"lastState",lastState);
field_from_json(Obj,"lastFirmware",lastFirmware);
field_from_json(Obj,"lastFirmwareUpdate",lastFirmwareUpdate);
field_from_json(Obj,"lastConnection",lastConnection);
field_from_json(Obj,"lastDisconnection",lastDisconnection);
field_from_json(Obj,"pings",pings);
field_from_json(Obj,"states",states);
field_from_json(Obj,"connected",connected);
field_from_json(Obj,"connectionIp",connectionIp);
field_from_json(Obj,"associations_2g",associations_2g);
field_from_json(Obj,"associations_5g",associations_5g);
field_from_json(Obj,"associations_6g",associations_6g);
field_from_json(Obj,"health",health);
field_from_json(Obj,"lastHealth",lastHealth);
field_from_json(Obj,"locale",locale);
field_from_json(Obj,"uptime",uptime);
field_from_json(Obj,"memory",memory);
return true;
} catch(...) {
}
return false;
}
void DeviceInfoList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"devices",devices);
}
bool DeviceInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"devices",devices);
return true;
} catch(...) {
}
return false;
}
void UE_rate::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"bitrate",bitrate);
field_to_json(Obj,"mcs",mcs);
field_to_json(Obj,"nss",nss);
field_to_json(Obj,"ht",ht);
field_to_json(Obj,"sgi",sgi);
field_to_json(Obj,"chwidth",chwidth);
}
bool UE_rate::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"bitrate",bitrate);
field_from_json(Obj,"mcs",mcs);
field_from_json(Obj,"nss",nss);
field_from_json(Obj,"ht",ht);
field_from_json(Obj,"sgi",sgi);
field_from_json(Obj,"chwidth",chwidth);
return true;
} catch(...) {
}
return false;
}
void UETimePoint::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"station",station);
field_to_json(Obj,"rssi",rssi);
field_to_json(Obj,"tx_bytes",tx_bytes);
field_to_json(Obj,"rx_bytes",rx_bytes);
field_to_json(Obj,"tx_duration",tx_duration);
field_to_json(Obj,"rx_packets",rx_packets);
field_to_json(Obj,"tx_packets",tx_packets);
field_to_json(Obj,"tx_retries",tx_retries);
field_to_json(Obj,"tx_failed",tx_failed);
field_to_json(Obj,"connected",connected);
field_to_json(Obj,"inactive",inactive);
field_to_json(Obj,"tx_rate",tx_rate);
field_to_json(Obj,"rx_rate",rx_rate);
// field_to_json(Obj, "tidstats", tidstats);
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
field_to_json(Obj,"tx_failed_pct",tx_failed_pct);
field_to_json(Obj,"tx_retries_pct",tx_retries_pct);
field_to_json(Obj,"tx_duration_pct",tx_duration_pct);
field_to_json(Obj,"tx_bytes_delta",tx_bytes_delta);
field_to_json(Obj,"rx_bytes_delta",rx_bytes_delta);
field_to_json(Obj,"tx_packets_delta",tx_packets_delta);
field_to_json(Obj,"rx_packets_delta",rx_packets_delta);
field_to_json(Obj,"tx_failed_delta",tx_failed_delta);
field_to_json(Obj,"tx_retries_delta",tx_retries_delta);
field_to_json(Obj,"tx_duration_delta",tx_duration_delta);
}
bool UETimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"station",station);
field_from_json(Obj,"rssi",rssi);
field_from_json(Obj,"tx_bytes",tx_bytes);
field_from_json(Obj,"rx_bytes",rx_bytes);
field_from_json(Obj,"tx_duration",tx_duration);
field_from_json(Obj,"rx_packets",rx_packets);
field_from_json(Obj,"tx_packets",tx_packets);
field_from_json(Obj,"tx_retries",tx_retries);
field_from_json(Obj,"tx_failed",tx_failed);
field_from_json(Obj,"connected",connected);
field_from_json(Obj,"inactive",inactive);
field_from_json(Obj,"tx_rate",tx_rate);
field_from_json(Obj,"rx_rate",rx_rate);
// field_from_json(Obj,"tidstats",tidstats);
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
field_from_json(Obj,"tx_failed_pct",tx_failed_pct);
field_from_json(Obj,"tx_retries_pct",tx_retries_pct);
field_from_json(Obj,"tx_duration_pct",tx_duration_pct);
field_from_json(Obj,"tx_bytes_delta",tx_bytes_delta);
field_from_json(Obj,"rx_bytes_delta",rx_bytes_delta);
field_from_json(Obj,"tx_packets_delta",tx_packets_delta);
field_from_json(Obj,"rx_packets_delta",rx_packets_delta);
field_from_json(Obj,"tx_failed_delta",tx_failed_delta);
field_from_json(Obj,"tx_retries_delta",tx_retries_delta);
field_from_json(Obj,"tx_duration_delta",tx_duration_delta);
return true;
} catch(...) {
}
return false;
}
void APTimePoint::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"collisions",collisions);
field_to_json(Obj,"multicast",multicast);
field_to_json(Obj,"rx_bytes",rx_bytes);
field_to_json(Obj,"rx_dropped",rx_dropped);
field_to_json(Obj,"rx_errors",rx_errors);
field_to_json(Obj,"rx_packets",rx_packets);
field_to_json(Obj,"tx_bytes",tx_bytes);
field_to_json(Obj,"tx_packets",tx_packets);
field_to_json(Obj,"tx_dropped",tx_dropped);
field_to_json(Obj,"tx_errors",tx_errors);
field_to_json(Obj,"tx_packets",tx_packets);
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
field_to_json(Obj,"rx_dropped_pct",rx_dropped_pct);
field_to_json(Obj,"tx_dropped_pct",tx_dropped_pct);
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
field_to_json(Obj,"rx_errors_pct",rx_errors_pct);
field_to_json(Obj,"tx_errors_pct",tx_errors_pct);
field_to_json(Obj,"tx_bytes_delta",tx_bytes_delta);
field_to_json(Obj,"rx_bytes_delta",rx_bytes_delta);
field_to_json(Obj,"rx_dropped_delta",rx_dropped_delta);
field_to_json(Obj,"tx_dropped_delta",tx_dropped_delta);
field_to_json(Obj,"rx_packets_delta",rx_packets_delta);
field_to_json(Obj,"tx_packets_delta",tx_packets_delta);
field_to_json(Obj,"rx_errors_delta",rx_errors_delta);
field_to_json(Obj,"tx_errors_delta",tx_errors_delta);
}
bool APTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"collisions",collisions);
field_from_json(Obj,"multicast",multicast);
field_from_json(Obj,"rx_bytes",rx_bytes);
field_from_json(Obj,"rx_dropped",rx_dropped);
field_from_json(Obj,"rx_errors",rx_errors);
field_from_json(Obj,"rx_packets",rx_packets);
field_from_json(Obj,"tx_bytes",tx_bytes);
field_from_json(Obj,"tx_packets",tx_packets);
field_from_json(Obj,"tx_dropped",tx_dropped);
field_from_json(Obj,"tx_errors",tx_errors);
field_from_json(Obj,"tx_packets",tx_packets);
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
field_from_json(Obj,"rx_dropped_pct",rx_dropped_pct);
field_from_json(Obj,"tx_dropped_pct",tx_dropped_pct);
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
field_from_json(Obj,"rx_errors_pct",rx_errors_pct);
field_from_json(Obj,"tx_errors_pct",tx_errors_pct);
field_from_json(Obj,"tx_bytes_delta",tx_bytes_delta);
field_from_json(Obj,"rx_bytes_delta",rx_bytes_delta);
field_from_json(Obj,"rx_dropped_delta",rx_dropped_delta);
field_from_json(Obj,"tx_dropped_delta",tx_dropped_delta);
field_from_json(Obj,"rx_packets_delta",rx_packets_delta);
field_from_json(Obj,"tx_packets_delta",tx_packets_delta);
field_from_json(Obj,"rx_errors_delta",rx_errors_delta);
field_from_json(Obj,"tx_errors_delta",tx_errors_delta);
return true;
} catch(...) {
}
return false;
}
void TIDstat_entry::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"rx_msdu",rx_msdu);
field_to_json(Obj,"tx_msdu",tx_msdu);
field_to_json(Obj,"tx_msdu_failed",tx_msdu_failed);
field_to_json(Obj,"tx_msdu_retries",tx_msdu_retries);
}
bool TIDstat_entry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"rx_msdu",rx_msdu);
field_from_json(Obj,"tx_msdu",tx_msdu);
field_from_json(Obj,"tx_msdu_failed",tx_msdu_failed);
field_from_json(Obj,"tx_msdu_retries",tx_msdu_retries);
return true;
} catch(...) {
}
return false;
}
void RadioTimePoint::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"band",band);
field_to_json(Obj,"channel_width",channel_width);
field_to_json(Obj,"active_ms",active_ms);
field_to_json(Obj,"busy_ms",busy_ms);
field_to_json(Obj,"receive_ms",receive_ms);
field_to_json(Obj,"transmit_ms",transmit_ms);
field_to_json(Obj,"tx_power",tx_power);
field_to_json(Obj,"channel",channel);
field_to_json(Obj,"temperature",temperature);
field_to_json(Obj,"noise",noise);
field_to_json(Obj,"active_pct",active_pct);
field_to_json(Obj,"busy_pct",busy_pct);
field_to_json(Obj,"receive_pct",receive_pct);
field_to_json(Obj,"transmit_pct",transmit_pct);
}
bool RadioTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"band",band);
field_from_json(Obj,"channel_width",channel_width);
field_from_json(Obj,"active_ms",active_ms);
field_from_json(Obj,"busy_ms",busy_ms);
field_from_json(Obj,"receive_ms",receive_ms);
field_from_json(Obj,"transmit_ms",transmit_ms);
field_from_json(Obj,"tx_power",tx_power);
field_from_json(Obj,"channel",channel);
field_from_json(Obj,"temperature",temperature);
field_from_json(Obj,"noise",noise);
field_from_json(Obj,"active_pct",active_pct);
field_from_json(Obj,"busy_pct",busy_pct);
field_from_json(Obj,"receive_pct",receive_pct);
field_from_json(Obj,"transmit_pct",transmit_pct);
return true;
} catch(...) {
}
return false;
}
void AveragePoint::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"min",min);
field_to_json(Obj,"max",max);
field_to_json(Obj,"avg",avg);
}
bool AveragePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"min",min);
field_from_json(Obj,"max",max);
field_from_json(Obj,"avg",avg);
return true;
} catch(...) {
}
return false;
}
void SSIDTimePoint::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"bssid",bssid);
field_to_json(Obj,"mode",mode);
field_to_json(Obj,"ssid",ssid);
field_to_json(Obj,"band",band);
field_to_json(Obj,"channel",channel);
field_to_json(Obj,"associations",associations);
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
field_to_json(Obj,"tx_failed_pct",tx_failed_pct);
field_to_json(Obj,"tx_retries_pct",tx_retries_pct);
field_to_json(Obj,"tx_duration_pct",tx_duration_pct);
}
bool SSIDTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"bssid",bssid);
field_from_json(Obj,"mode",mode);
field_from_json(Obj,"ssid",ssid);
field_from_json(Obj,"band",band);
field_from_json(Obj,"channel",channel);
field_from_json(Obj,"associations",associations);
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
field_from_json(Obj,"tx_failed_pct",tx_failed_pct);
field_from_json(Obj,"tx_retries_pct",tx_retries_pct);
field_from_json(Obj,"tx_duration_pct",tx_duration_pct);
return true;
} catch(...) {
}
return false;
}
void DeviceTimePoint::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"id",id);
field_to_json(Obj,"boardId",boardId);
field_to_json(Obj,"timestamp",timestamp);
field_to_json(Obj,"ap_data",ap_data);
field_to_json(Obj,"ssid_data",ssid_data);
field_to_json(Obj,"radio_data",radio_data);
field_to_json(Obj,"device_info",device_info);
field_to_json(Obj,"serialNumber",serialNumber);
}
bool DeviceTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"id",id);
field_from_json(Obj,"boardId",boardId);
field_from_json(Obj,"timestamp",timestamp);
field_from_json(Obj,"ap_data",ap_data);
field_from_json(Obj,"ssid_data",ssid_data);
field_from_json(Obj,"radio_data",radio_data);
field_from_json(Obj,"device_info",device_info);
field_from_json(Obj,"serialNumber",serialNumber);
return true;
} catch(...) {
}
return false;
}
void DeviceTimePointAnalysis::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"noise",noise);
field_to_json(Obj,"temperature",temperature);
field_to_json(Obj,"active_pct",active_pct);
field_to_json(Obj,"busy_pct",busy_pct);
field_to_json(Obj,"receive_pct",receive_pct);
field_to_json(Obj,"transmit_pct",transmit_pct);
field_to_json(Obj,"tx_power",tx_power);
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
field_to_json(Obj,"rx_dropped_pct",rx_dropped_pct);
field_to_json(Obj,"tx_dropped_pct",tx_dropped_pct);
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
field_to_json(Obj,"rx_errors_pct",rx_errors_pct);
field_to_json(Obj,"tx_errors_pct",tx_errors_pct);
}
bool DeviceTimePointAnalysis::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"noise",noise);
field_from_json(Obj,"temperature",temperature);
field_from_json(Obj,"active_pct",active_pct);
field_from_json(Obj,"busy_pct",busy_pct);
field_from_json(Obj,"receive_pct",receive_pct);
field_from_json(Obj,"transmit_pct",transmit_pct);
field_from_json(Obj,"tx_power",tx_power);
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
field_from_json(Obj,"rx_dropped_pct",rx_dropped_pct);
field_from_json(Obj,"tx_dropped_pct",tx_dropped_pct);
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
field_from_json(Obj,"rx_errors_pct",rx_errors_pct);
field_from_json(Obj,"tx_errors_pct",tx_errors_pct);
return true;
} catch(...) {
}
return false;
}
void DeviceTimePointList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"points",points);
field_to_json(Obj,"stats",stats);
}
bool DeviceTimePointList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"points",points);
field_from_json(Obj,"stats",stats);
return true;
} catch(...) {
}
return false;
}
void DeviceTimePointStats::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"firstPoint",firstPoint);
field_to_json(Obj,"lastPoint",lastPoint);
field_to_json(Obj,"count",count);
}
bool DeviceTimePointStats::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"firstPoint",firstPoint);
field_from_json(Obj,"lastPoint",lastPoint);
field_from_json(Obj,"count",count);
return true;
} catch(...) {
}
return false;
}
void WifiClientRate::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"bitrate",bitrate);
field_to_json(Obj,"chwidth",chwidth);
field_to_json(Obj,"mcs",mcs);
field_to_json(Obj,"nss",nss);
field_to_json(Obj,"vht",vht);
}
bool WifiClientRate::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"bitrate",bitrate);
field_from_json(Obj,"chwidth",chwidth);
field_from_json(Obj,"mcs",mcs);
field_from_json(Obj,"nss",nss);
field_from_json(Obj,"vht",vht);
return true;
} catch(...) {
}
return false;
}
void WifiClientHistory::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"timestamp",timestamp);
field_to_json(Obj,"station_id",station_id);
field_to_json(Obj,"bssid",bssid);
field_to_json(Obj,"ssid",ssid);
field_to_json(Obj,"rssi",rssi);
field_to_json(Obj,"rx_bitrate",rx_bitrate);
field_to_json(Obj,"rx_chwidth",rx_chwidth);
field_to_json(Obj,"rx_mcs",rx_mcs);
field_to_json(Obj,"rx_nss",rx_nss);
field_to_json(Obj,"rx_vht",rx_vht);
field_to_json(Obj,"tx_bitrate",tx_bitrate);
field_to_json(Obj,"tx_chwidth",tx_chwidth);
field_to_json(Obj,"tx_mcs",tx_mcs);
field_to_json(Obj,"tx_nss",tx_nss);
field_to_json(Obj,"tx_vht",tx_vht);
field_to_json(Obj,"rx_bytes",rx_bytes);
field_to_json(Obj,"tx_bytes",tx_bytes);
field_to_json(Obj,"rx_duration",rx_duration);
field_to_json(Obj,"tx_duration",tx_duration);
field_to_json(Obj,"rx_packets",rx_packets);
field_to_json(Obj,"tx_packets",tx_packets);
field_to_json(Obj,"ipv4",ipv4);
field_to_json(Obj,"ipv6",ipv6);
field_to_json(Obj,"channel_width",channel_width);
field_to_json(Obj,"noise",noise);
field_to_json(Obj,"tx_power",tx_power);
field_to_json(Obj,"channel",channel);
field_to_json(Obj,"active_ms",active_ms);
field_to_json(Obj,"busy_ms",busy_ms);
field_to_json(Obj,"receive_ms",receive_ms);
field_to_json(Obj,"mode",mode);
field_to_json(Obj,"ack_signal",ack_signal);
field_to_json(Obj,"ack_signal_avg",ack_signal_avg);
field_to_json(Obj,"connected",connected);
field_to_json(Obj,"inactive",inactive);
field_to_json(Obj,"tx_retries",tx_retries);
field_to_json(Obj,"venue_id",venue_id);
}
bool WifiClientHistory::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"timestamp",timestamp);
field_from_json(Obj,"station_id",station_id);
field_from_json(Obj,"bssid",bssid);
field_from_json(Obj,"ssid",ssid);
field_from_json(Obj,"rssi",rssi);
field_from_json(Obj,"rx_bitrate",rx_bitrate);
field_from_json(Obj,"rx_chwidth",rx_chwidth);
field_from_json(Obj,"rx_mcs",rx_mcs);
field_from_json(Obj,"rx_nss",rx_nss);
field_from_json(Obj,"rx_vht",rx_vht);
field_from_json(Obj,"tx_bitrate",tx_bitrate);
field_from_json(Obj,"tx_chwidth",tx_chwidth);
field_from_json(Obj,"tx_mcs",tx_mcs);
field_from_json(Obj,"tx_nss",tx_nss);
field_from_json(Obj,"tx_vht",tx_vht);
field_from_json(Obj,"rx_bytes",rx_bytes);
field_from_json(Obj,"tx_bytes",tx_bytes);
field_from_json(Obj,"rx_duration",rx_duration);
field_from_json(Obj,"tx_duration",tx_duration);
field_from_json(Obj,"rx_packets",rx_packets);
field_from_json(Obj,"tx_packets",tx_packets);
field_from_json(Obj,"ipv4",ipv4);
field_from_json(Obj,"ipv6",ipv6);
field_from_json(Obj,"channel_width",channel_width);
field_from_json(Obj,"noise",noise);
field_from_json(Obj,"tx_power",tx_power);
field_from_json(Obj,"channel",channel);
field_from_json(Obj,"active_ms",active_ms);
field_from_json(Obj,"busy_ms",busy_ms);
field_from_json(Obj,"receive_ms",receive_ms);
field_from_json(Obj,"mode",mode);
field_from_json(Obj,"ack_signal",ack_signal);
field_from_json(Obj,"ack_signal_avg",ack_signal_avg);
field_from_json(Obj,"connected",connected);
field_from_json(Obj,"inactive",inactive);
field_from_json(Obj,"tx_retries",tx_retries);
field_from_json(Obj,"venue_id",venue_id);
return true;
} catch(...) {
}
return false;
}
}

View File

@@ -0,0 +1,422 @@
//
// Created by stephane bourque on 2022-01-10.
//
#pragma once
#include "RESTAPI_ProvObjects.h"
#include <vector>
namespace OpenWifi {
namespace AnalyticsObjects {
struct Report {
uint64_t snapShot = 0;
void reset();
void to_json(Poco::JSON::Object &Obj) const;
};
struct VenueInfo {
OpenWifi::Types::UUID_t id;
std::string name;
std::string description;
uint64_t retention = 0;
uint64_t interval = 0;
bool monitorSubVenues = false;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct BoardInfo {
ProvObjects::ObjectInfo info;
std::vector<VenueInfo> venueList;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
inline bool operator<(const BoardInfo &bb) const {
return info.id < bb.info.id;
}
inline bool operator==(const BoardInfo &bb) const {
return info.id == bb.info.id;
}
};
struct DeviceInfo {
std::string boardId;
std::string type;
std::string serialNumber;
std::string deviceType;
uint64_t lastContact = 0 ;
uint64_t lastPing = 0;
uint64_t lastState = 0;
std::string lastFirmware;
uint64_t lastFirmwareUpdate = 0;
uint64_t lastConnection = 0;
uint64_t lastDisconnection = 0;
uint64_t pings = 0;
uint64_t states = 0;
bool connected = false;
std::string connectionIp;
uint64_t associations_2g = 0;
uint64_t associations_5g = 0;
uint64_t associations_6g = 0;
uint64_t health = 0;
uint64_t lastHealth = 0;
std::string locale;
uint64_t uptime = 0;
double memory = 0.0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DeviceInfoList {
std::vector<DeviceInfo> devices;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
enum wifi_band {
band_2g = 0, band_5g = 1, band_6g = 2
};
struct TIDstat_entry {
uint64_t rx_msdu = 0,
tx_msdu = 0,
tx_msdu_failed = 0,
tx_msdu_retries = 0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct UE_rate {
uint64_t bitrate=0;
uint64_t mcs=0;
uint64_t nss=0;
bool ht=false;
bool sgi=false;
uint64_t chwidth=0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct AveragePoint {
double min = 0.0,
max = 0.0,
avg = 0.0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct UETimePoint {
std::string station;
int64_t rssi = 0;
uint64_t tx_bytes = 0,
rx_bytes = 0,
tx_duration = 0,
rx_packets = 0,
tx_packets = 0,
tx_retries = 0,
tx_failed = 0,
connected = 0,
inactive = 0;
double tx_bytes_bw = 0.0 ,
rx_bytes_bw = 0.0 ,
tx_packets_bw = 0.0 ,
rx_packets_bw = 0.0 ,
tx_failed_pct = 0.0 ,
tx_retries_pct = 0.0 ,
tx_duration_pct = 0.0;
uint64_t tx_bytes_delta = 0,
rx_bytes_delta = 0,
tx_duration_delta = 0,
rx_packets_delta = 0,
tx_packets_delta = 0,
tx_retries_delta = 0,
tx_failed_delta = 0;
UE_rate tx_rate,
rx_rate;
std::vector<TIDstat_entry> tidstats;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
enum SSID_MODES {
unknown = 0,
ap,
mesh,
sta,
wds_ap,
wds_sta,
wds_repeater
};
inline SSID_MODES SSID_Mode(const std::string &m) {
if (m == "ap")
return ap;
if (m == "sta")
return sta;
if (m == "mesh")
return mesh;
if (m == "wds-ap")
return wds_ap;
if (m == "wds-sta")
return wds_sta;
if (m == "wds-repeater")
return wds_repeater;
return unknown;
}
struct SSIDTimePoint {
std::string bssid,
mode,
ssid;
uint64_t band=0,
channel=0;
std::vector<UETimePoint> associations;
AveragePoint tx_bytes_bw,
rx_bytes_bw,
tx_packets_bw,
rx_packets_bw,
tx_failed_pct,
tx_retries_pct,
tx_duration_pct;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct APTimePoint {
uint64_t collisions = 0,
multicast = 0,
rx_bytes = 0,
rx_dropped = 0,
rx_errors = 0,
rx_packets = 0,
tx_bytes = 0,
tx_dropped = 0,
tx_errors = 0,
tx_packets = 0;
double tx_bytes_bw = 0.0 ,
rx_bytes_bw = 0.0 ,
rx_dropped_pct = 0.0,
tx_dropped_pct = 0.0,
rx_packets_bw = 0.0,
tx_packets_bw = 0.0,
rx_errors_pct = 0.0 ,
tx_errors_pct = 0.0;
uint64_t tx_bytes_delta = 0,
rx_bytes_delta = 0 ,
rx_dropped_delta = 0,
tx_dropped_delta = 0,
rx_packets_delta = 0,
tx_packets_delta = 0,
rx_errors_delta = 0,
tx_errors_delta = 0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct RadioTimePoint {
uint64_t band = 0,
channel_width = 0;
uint64_t active_ms = 0,
busy_ms = 0,
receive_ms = 0,
transmit_ms = 0,
tx_power = 0,
channel = 0;
int64_t temperature = 0,
noise = 0;
double active_pct = 0.0 ,
busy_pct = 0.0,
receive_pct = 0.0,
transmit_pct = 0.0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DeviceTimePoint {
std::string id;
std::string boardId;
uint64_t timestamp = 0;
APTimePoint ap_data;
std::vector<SSIDTimePoint> ssid_data;
std::vector<RadioTimePoint> radio_data;
AnalyticsObjects::DeviceInfo device_info;
std::string serialNumber;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
inline bool operator<(const DeviceTimePoint &rhs) const {
if(timestamp < rhs.timestamp)
return true;
if(timestamp > rhs.timestamp)
return false;
if(device_info.serialNumber < rhs.device_info.serialNumber)
return true;
return false;
}
inline bool operator==(const DeviceTimePoint &rhs) const {
return timestamp==rhs.timestamp && device_info.serialNumber==rhs.device_info.serialNumber;
}
inline bool operator>(const DeviceTimePoint &rhs) const {
if(timestamp > rhs.timestamp)
return true;
if(timestamp < rhs.timestamp)
return false;
if(device_info.serialNumber > rhs.device_info.serialNumber)
return true;
return false;
}
};
struct DeviceTimePointAnalysis {
uint64_t timestamp;
AveragePoint noise;
AveragePoint temperature;
AveragePoint active_pct;
AveragePoint busy_pct;
AveragePoint receive_pct;
AveragePoint transmit_pct;
AveragePoint tx_power;
AveragePoint tx_bytes_bw;
AveragePoint rx_bytes_bw;
AveragePoint rx_dropped_pct;
AveragePoint tx_dropped_pct;
AveragePoint rx_packets_bw;
AveragePoint tx_packets_bw;
AveragePoint rx_errors_pct;
AveragePoint tx_errors_pct;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DeviceTimePointList {
std::vector<DeviceTimePoint> points;
std::vector<DeviceTimePointAnalysis> stats;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct BandwidthAnalysisEntry {
uint64_t timestamp = 0;
};
struct BandwidthAnalysis {
};
struct AverageValueSigned {
int64_t peak=0, avg=0, low=0;
};
struct AverageValueUnsigned {
uint64_t peak=0, avg=0, low=0;
};
struct RadioAnalysis {
uint64_t timestamp=0;
AverageValueSigned noise, temperature;
AverageValueUnsigned active_ms,
busy_ms,
transmit_ms,
receive_ms;
};
struct DeviceTimePointStats {
uint64_t firstPoint=0;
uint64_t lastPoint=0;
uint64_t count=0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct WifiClientRate {
uint32_t bitrate=0;
uint32_t chwidth=0;
uint16_t mcs=0;
uint16_t nss=0;
bool vht=false;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct WifiClientHistory {
uint64_t timestamp=OpenWifi::Now();
std::string station_id;
std::string bssid;
std::string ssid;
int64_t rssi=0;
uint32_t rx_bitrate=0;
uint32_t rx_chwidth=0;
uint16_t rx_mcs=0;
uint16_t rx_nss=0;
bool rx_vht=false;
uint32_t tx_bitrate=0;
uint32_t tx_chwidth=0;
uint16_t tx_mcs=0;
uint16_t tx_nss=0;
bool tx_vht=false;
uint64_t rx_bytes=0;
uint64_t tx_bytes=0;
uint64_t rx_duration=0;
uint64_t tx_duration=0;
uint64_t rx_packets=0;
uint64_t tx_packets=0;
std::string ipv4;
std::string ipv6;
uint64_t channel_width=0;
int64_t noise=0;
uint64_t tx_power=0;
uint64_t channel=0;
uint64_t active_ms=0;
uint64_t busy_ms=0;
uint64_t receive_ms=0;
std::string mode;
int64_t ack_signal=0;
int64_t ack_signal_avg=0;
uint64_t connected=0;
uint64_t inactive=0;
uint64_t tx_retries=0;
std::string venue_id;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
}
}

View File

@@ -3,176 +3,206 @@
// //
#include "RESTAPI_CertObjects.h" #include "RESTAPI_CertObjects.h"
#include "framework/MicroService.h"
using OpenWifi::RESTAPI_utils::field_to_json; using OpenWifi::RESTAPI_utils::field_to_json;
using OpenWifi::RESTAPI_utils::field_from_json; using OpenWifi::RESTAPI_utils::field_from_json;
namespace OpenWifi { namespace OpenWifi::CertObjects {
namespace CertObjects { void CertificateEntry::to_json(Poco::JSON::Object &Obj) const {
void CertificateEntry::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj,"id", id);
field_to_json(Obj,"id", id); field_to_json(Obj,"entity", entity);
field_to_json(Obj,"entity", entity); field_to_json(Obj,"creator", creator);
field_to_json(Obj,"creator", creator); field_to_json(Obj,"type", type);
field_to_json(Obj,"type", type); field_to_json(Obj,"status", status);
field_to_json(Obj,"status", status); field_to_json(Obj,"certificate", certificate);
field_to_json(Obj,"certificate", certificate); field_to_json(Obj,"key", key);
field_to_json(Obj,"key", key); field_to_json(Obj,"devid", devid);
field_to_json(Obj,"devid", devid); field_to_json(Obj,"cas", cas);
field_to_json(Obj,"cas", cas); field_to_json(Obj,"manufacturer", manufacturer);
field_to_json(Obj,"manufacturer", manufacturer); field_to_json(Obj,"model", model);
field_to_json(Obj,"model", model); field_to_json(Obj,"redirector", redirector);
field_to_json(Obj,"redirector", redirector); field_to_json(Obj,"commonName", commonName);
field_to_json(Obj,"commonName", commonName); field_to_json(Obj,"certificateId", certificateId);
field_to_json(Obj,"certificateId", certificateId); field_to_json(Obj,"batch", batch);
field_to_json(Obj,"batch", batch); field_to_json(Obj,"created", created);
field_to_json(Obj,"created", created); field_to_json(Obj,"modified", modified);
field_to_json(Obj,"modified", modified); field_to_json(Obj,"revoked", revoked);
field_to_json(Obj,"revoked", revoked); field_to_json(Obj,"revokeCount", revokeCount);
field_to_json(Obj,"revokeCount", revokeCount); field_to_json(Obj,"synched", synched);
} }
bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"id", id); field_from_json(Obj,"id", id);
field_from_json(Obj,"entity", entity); field_from_json(Obj,"entity", entity);
field_from_json(Obj,"creator", creator); field_from_json(Obj,"creator", creator);
field_from_json(Obj,"type", type); field_from_json(Obj,"type", type);
field_from_json(Obj,"status", status); field_from_json(Obj,"status", status);
field_from_json(Obj,"certificate", certificate); field_from_json(Obj,"certificate", certificate);
field_from_json(Obj,"key", key); field_from_json(Obj,"key", key);
field_from_json(Obj,"devid", devid); field_from_json(Obj,"devid", devid);
field_from_json(Obj,"cas", cas); field_from_json(Obj,"cas", cas);
field_from_json(Obj,"manufacturer", manufacturer); field_from_json(Obj,"manufacturer", manufacturer);
field_from_json(Obj,"model", model); field_from_json(Obj,"model", model);
field_from_json(Obj,"redirector", redirector); field_from_json(Obj,"redirector", redirector);
field_from_json(Obj,"commonName", commonName); field_from_json(Obj,"commonName", commonName);
field_from_json(Obj,"certificateId", certificateId); field_from_json(Obj,"certificateId", certificateId);
field_from_json(Obj,"batch", batch); field_from_json(Obj,"batch", batch);
field_from_json(Obj,"created", created); field_from_json(Obj,"created", created);
field_from_json(Obj,"modified", modified); field_from_json(Obj,"modified", modified);
field_from_json(Obj,"revoked", revoked); field_from_json(Obj,"revoked", revoked);
field_from_json(Obj,"revokeCount", revokeCount); field_from_json(Obj,"revokeCount", revokeCount);
return true; field_from_json(Obj,"synched", synched);
} catch (...) { return true;
} } catch (...) {
return false;
} }
return false;
}
void EntityEntry::to_json(Poco::JSON::Object &Obj) const { void EntityEntry::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"id", id); field_to_json(Obj,"id", id);
field_to_json(Obj,"creator", creator); field_to_json(Obj,"creator", creator);
field_to_json(Obj,"name", name); field_to_json(Obj,"name", name);
field_to_json(Obj,"description", description); field_to_json(Obj,"description", description);
field_to_json(Obj,"defaultRedirector", defaultRedirector); field_to_json(Obj,"defaultRedirector", defaultRedirector);
field_to_json(Obj,"apiKey", apiKey); field_to_json(Obj,"apiKey", apiKey);
field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
field_to_json(Obj,"organization", organization); field_to_json(Obj,"organization", organization);
field_to_json(Obj,"created", created); field_to_json(Obj,"created", created);
field_to_json(Obj,"modified", modified); field_to_json(Obj,"modified", modified);
field_to_json(Obj,"suspended", suspended); field_to_json(Obj,"suspended", suspended);
field_to_json(Obj,"deleted", deleted); field_to_json(Obj,"deleted", deleted);
field_to_json(Obj,"notes", notes); field_to_json(Obj,"notes", notes);
} }
bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"id", id); field_from_json(Obj,"id", id);
field_from_json(Obj,"creator", creator); field_from_json(Obj,"creator", creator);
field_from_json(Obj,"name", name); field_from_json(Obj,"name", name);
field_from_json(Obj,"description", description); field_from_json(Obj,"description", description);
field_from_json(Obj,"defaultRedirector", defaultRedirector); field_from_json(Obj,"defaultRedirector", defaultRedirector);
field_from_json(Obj,"apiKey", apiKey); field_from_json(Obj,"apiKey", apiKey);
field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
field_from_json(Obj,"organization", organization); field_from_json(Obj,"organization", organization);
field_from_json(Obj,"created", created); field_from_json(Obj,"created", created);
field_from_json(Obj,"modified", modified); field_from_json(Obj,"modified", modified);
field_from_json(Obj,"suspended", suspended); field_from_json(Obj,"suspended", suspended);
field_from_json(Obj,"deleted", deleted); field_from_json(Obj,"deleted", deleted);
field_from_json(Obj,"notes", notes); field_from_json(Obj,"notes", notes);
return true; return true;
} catch (...) { } catch (...) {
}
return false;
} }
return false;
}
void BatchEntry::to_json(Poco::JSON::Object &Obj) const { void BatchEntry::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"id", id); field_to_json(Obj,"id", id);
field_to_json(Obj,"entity", entity); field_to_json(Obj,"entity", entity);
field_to_json(Obj,"creator", creator); field_to_json(Obj,"creator", creator);
field_to_json(Obj,"name", name); field_to_json(Obj,"name", name);
field_to_json(Obj,"description", description); field_to_json(Obj,"description", description);
field_to_json(Obj,"manufacturer", manufacturer); field_to_json(Obj,"manufacturer", manufacturer);
field_to_json(Obj,"model", model); field_to_json(Obj,"model", model);
field_to_json(Obj,"redirector", redirector); field_to_json(Obj,"redirector", redirector);
field_to_json(Obj,"commonNames", commonNames); field_to_json(Obj,"commonNames", commonNames);
field_to_json(Obj,"jobHistory", jobHistory); field_to_json(Obj,"jobHistory", jobHistory);
field_to_json(Obj,"notes", notes); field_to_json(Obj,"notes", notes);
field_to_json(Obj,"submitted", submitted); field_to_json(Obj,"submitted", submitted);
field_to_json(Obj,"started", started); field_to_json(Obj,"started", started);
field_to_json(Obj,"completed", completed); field_to_json(Obj,"completed", completed);
field_to_json(Obj,"modified", modified); field_to_json(Obj,"modified", modified);
} }
bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"id", id); field_from_json(Obj,"id", id);
field_from_json(Obj,"entity", entity); field_from_json(Obj,"entity", entity);
field_from_json(Obj,"creator", creator); field_from_json(Obj,"creator", creator);
field_from_json(Obj,"name", name); field_from_json(Obj,"name", name);
field_from_json(Obj,"description", description); field_from_json(Obj,"description", description);
field_from_json(Obj,"manufacturer", manufacturer); field_from_json(Obj,"manufacturer", manufacturer);
field_from_json(Obj,"model", model); field_from_json(Obj,"model", model);
field_from_json(Obj,"redirector", redirector); field_from_json(Obj,"redirector", redirector);
field_from_json(Obj,"commonNames", commonNames); field_from_json(Obj,"commonNames", commonNames);
field_from_json(Obj,"jobHistory", jobHistory); field_from_json(Obj,"jobHistory", jobHistory);
field_from_json(Obj,"notes", notes); field_from_json(Obj,"notes", notes);
field_from_json(Obj,"submitted", submitted); field_from_json(Obj,"submitted", submitted);
field_from_json(Obj,"started", started); field_from_json(Obj,"started", started);
field_from_json(Obj,"completed", completed); field_from_json(Obj,"completed", completed);
field_from_json(Obj,"modified", modified); field_from_json(Obj,"modified", modified);
return true; return true;
} catch (...) { } catch (...) {
}
return false;
} }
return false;
}
void JobEntry::to_json(Poco::JSON::Object &Obj) const { void JobEntry::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"id", id); field_to_json(Obj,"id", id);
field_to_json(Obj,"entity", entity); field_to_json(Obj,"entity", entity);
field_to_json(Obj,"creator", creator); field_to_json(Obj,"creator", creator);
field_to_json(Obj,"batch", batch); field_to_json(Obj,"batch", batch);
field_to_json(Obj,"commonNames", commonNames); field_to_json(Obj,"commonNames", commonNames);
field_to_json(Obj,"completedNames", completedNames); field_to_json(Obj,"completedNames", completedNames);
field_to_json(Obj,"errorNames", errorNames); field_to_json(Obj,"errorNames", errorNames);
field_to_json(Obj,"status", status); field_to_json(Obj,"status", status);
field_to_json(Obj,"command", command); field_to_json(Obj,"command", command);
field_to_json(Obj,"parameters", parameters); field_to_json(Obj,"parameters", parameters);
field_to_json(Obj,"submitted", submitted); field_to_json(Obj,"submitted", submitted);
field_to_json(Obj,"started", started); field_to_json(Obj,"started", started);
field_to_json(Obj,"completed", completed); field_to_json(Obj,"completed", completed);
} }
bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"id", id); field_from_json(Obj,"id", id);
field_from_json(Obj,"entity", entity); field_from_json(Obj,"entity", entity);
field_from_json(Obj,"creator", creator); field_from_json(Obj,"creator", creator);
field_from_json(Obj,"batch", batch); field_from_json(Obj,"batch", batch);
field_from_json(Obj,"commonNames", commonNames); field_from_json(Obj,"commonNames", commonNames);
field_from_json(Obj,"completedNames", completedNames); field_from_json(Obj,"completedNames", completedNames);
field_from_json(Obj,"errorNames", errorNames); field_from_json(Obj,"errorNames", errorNames);
field_from_json(Obj,"status", status); field_from_json(Obj,"status", status);
field_from_json(Obj,"command", command); field_from_json(Obj,"command", command);
field_from_json(Obj,"parameters", parameters); field_from_json(Obj,"parameters", parameters);
field_from_json(Obj,"submitted", submitted); field_from_json(Obj,"submitted", submitted);
field_from_json(Obj,"started", started); field_from_json(Obj,"started", started);
field_from_json(Obj,"completed", completed); field_from_json(Obj,"completed", completed);
return true; return true;
} catch (...) { } catch (...) {
}
return false;
} }
return false;
}
void DashBoardYearlyStats::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "year", year);
field_to_json(Obj, "activeCerts", activeCerts);
field_to_json(Obj, "revokedCerts", revokedCerts);
}
void Dashboard::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"snapshot", snapshot);
field_to_json(Obj,"numberOfIssuedCerts", numberOfIssuedCerts);
field_to_json(Obj,"numberOfRevokedCerts", numberOfRevokedCerts);
field_to_json(Obj,"activeCertsPerOrganization", activeCertsPerOrganization);
field_to_json(Obj,"revokedCertsPerOrganization", revokedCertsPerOrganization);
field_to_json(Obj,"numberOfRedirectors", numberOfRedirectors);
field_to_json(Obj,"deviceTypes", deviceTypes);
field_to_json(Obj,"monthlyNumberOfCerts", monthlyNumberOfCerts);
field_to_json(Obj,"monthlyNumberOfCertsPerOrgPerYear", monthlyNumberOfCertsPerOrgPerYear);
}
void Dashboard::reset() {
snapshot=0;
numberOfRevokedCerts = numberOfIssuedCerts = 0;
activeCertsPerOrganization.clear();
revokedCertsPerOrganization.clear();
numberOfRedirectors.clear();
deviceTypes.clear();
monthlyNumberOfCerts.clear();
monthlyNumberOfCertsPerOrgPerYear.clear();
} }
} }

View File

@@ -5,97 +5,118 @@
#pragma once #pragma once
#include <string> #include <string>
#include "framework/MicroService.h"
#include "framework/OpenWifiTypes.h" #include "framework/OpenWifiTypes.h"
#include "RESTObjects/RESTAPI_SecurityObjects.h" #include "RESTObjects/RESTAPI_SecurityObjects.h"
namespace OpenWifi { namespace OpenWifi::CertObjects {
namespace CertObjects { struct CertificateEntry {
OpenWifi::Types::UUID_t id;
OpenWifi::Types::UUID_t entity;
OpenWifi::Types::UUID_t creator;
std::string type;
std::string status;
std::string certificate;
std::string key;
std::string devid;
std::string cas;
std::string manufacturer;
std::string model;
std::string redirector;
std::string commonName;
std::string certificateId;
OpenWifi::Types::UUID_t batch;
uint64_t created = 0;
uint64_t modified = 0;
uint64_t revoked = 0;
uint64_t revokeCount = 0;
uint64_t synched = 0;
struct CertificateEntry { void to_json(Poco::JSON::Object &Obj) const;
OpenWifi::Types::UUID_t id; bool from_json(const Poco::JSON::Object::Ptr &Obj);
OpenWifi::Types::UUID_t entity; };
OpenWifi::Types::UUID_t creator;
std::string type;
std::string status;
std::string certificate;
std::string key;
std::string devid;
std::string cas;
std::string manufacturer;
std::string model;
std::string redirector;
std::string commonName;
std::string certificateId;
OpenWifi::Types::UUID_t batch;
uint64_t created = 0;
uint64_t modified = 0;
uint64_t revoked = 0;
uint64_t revokeCount = 0;
void to_json(Poco::JSON::Object &Obj) const; struct EntityEntry {
bool from_json(const Poco::JSON::Object::Ptr &Obj); OpenWifi::Types::UUID_t id;
}; OpenWifi::Types::UUID_t creator;
std::string name;
std::string description;
std::string defaultRedirector;
std::string apiKey;
std::string serverEnrollmentProfile;
std::string clientEnrollmentProfile;
std::string organization;
SecurityObjects::NoteInfoVec notes;
bool suspended=false;
bool deleted=false;
uint64_t created = 0 ;
uint64_t modified = 0 ;
struct EntityEntry { void to_json(Poco::JSON::Object &Obj) const;
OpenWifi::Types::UUID_t id; bool from_json(const Poco::JSON::Object::Ptr &Obj);
OpenWifi::Types::UUID_t creator; };
std::string name;
std::string description;
std::string defaultRedirector;
std::string apiKey;
std::string serverEnrollmentProfile;
std::string clientEnrollmentProfile;
std::string organization;
SecurityObjects::NoteInfoVec notes;
bool suspended=false;
bool deleted=false;
uint64_t created = 0 ;
uint64_t modified = 0 ;
void to_json(Poco::JSON::Object &Obj) const; struct BatchEntry {
bool from_json(const Poco::JSON::Object::Ptr &Obj); OpenWifi::Types::UUID_t id;
}; OpenWifi::Types::UUID_t entity;
OpenWifi::Types::UUID_t creator;
std::string name;
std::string description;
std::string manufacturer;
std::string model;
std::string redirector;
std::vector<std::string> commonNames;
std::vector<std::string> jobHistory;
SecurityObjects::NoteInfoVec notes;
uint64_t submitted = 0 ;
uint64_t started = 0 ;
uint64_t completed = 0 ;
uint64_t modified = 0 ;
struct BatchEntry { void to_json(Poco::JSON::Object &Obj) const;
OpenWifi::Types::UUID_t id; bool from_json(const Poco::JSON::Object::Ptr &Obj);
OpenWifi::Types::UUID_t entity; };
OpenWifi::Types::UUID_t creator;
std::string name;
std::string description;
std::string manufacturer;
std::string model;
std::string redirector;
std::vector<std::string> commonNames;
std::vector<std::string> jobHistory;
SecurityObjects::NoteInfoVec notes;
uint64_t submitted = 0 ;
uint64_t started = 0 ;
uint64_t completed = 0 ;
uint64_t modified = 0 ;
void to_json(Poco::JSON::Object &Obj) const; struct JobEntry {
bool from_json(const Poco::JSON::Object::Ptr &Obj); OpenWifi::Types::UUID_t id;
}; OpenWifi::Types::UUID_t entity;
OpenWifi::Types::UUID_t creator;
OpenWifi::Types::UUID_t batch;
std::string command;
OpenWifi::Types::StringVec commonNames;
OpenWifi::Types::StringVec completedNames;
OpenWifi::Types::StringVec errorNames;
Types::StringPairVec parameters;
std::string status;
uint64_t submitted=0;
uint64_t started=0;
uint64_t completed=0;
struct JobEntry { void to_json(Poco::JSON::Object &Obj) const;
OpenWifi::Types::UUID_t id; bool from_json(const Poco::JSON::Object::Ptr &Obj);
OpenWifi::Types::UUID_t entity; };
OpenWifi::Types::UUID_t creator;
OpenWifi::Types::UUID_t batch; struct DashBoardYearlyStats {
std::string command; uint64_t year=0;
OpenWifi::Types::StringVec commonNames; OpenWifi::Types::Counted3DMapSII activeCerts;
OpenWifi::Types::StringVec completedNames; OpenWifi::Types::Counted3DMapSII revokedCerts;
OpenWifi::Types::StringVec errorNames;
Types::StringPairVec parameters; void to_json(Poco::JSON::Object &Obj) const;
std::string status; };
uint64_t submitted=0;
uint64_t started=0; struct Dashboard {
uint64_t completed=0; uint64_t snapshot=0;
uint64_t numberOfIssuedCerts=0;
uint64_t numberOfRevokedCerts=0;
OpenWifi::Types::CountedMap activeCertsPerOrganization;
OpenWifi::Types::CountedMap revokedCertsPerOrganization;
OpenWifi::Types::CountedMap numberOfRedirectors;
OpenWifi::Types::CountedMap deviceTypes;
OpenWifi::Types::CountedMap monthlyNumberOfCerts;
std::vector<DashBoardYearlyStats> monthlyNumberOfCertsPerOrgPerYear;
void to_json(Poco::JSON::Object &Obj) const;
void reset();
};
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
}
} }

View File

@@ -233,10 +233,10 @@ namespace OpenWifi::FMSObjects {
UnknownFirmwares_.clear(); UnknownFirmwares_.clear();
totalSecondsOld_.clear(); totalSecondsOld_.clear();
numberOfDevices = 0 ; numberOfDevices = 0 ;
snapshot = std::time(nullptr); snapshot = OpenWifi::Now();
} }
bool DeviceReport::from_json(const Poco::JSON::Object::Ptr &Obj) { bool DeviceReport::from_json([[maybe_unused]] const Poco::JSON::Object::Ptr &Obj) {
try { try {
return true; return true;
@@ -245,4 +245,65 @@ namespace OpenWifi::FMSObjects {
} }
return false; return false;
} }
void DeviceInformation::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "serialNumber",serialNumber);
field_to_json(Obj, "history", history);
field_to_json(Obj, "currentFirmware", currentFirmware);
field_to_json(Obj, "currentFirmwareDate", currentFirmwareDate);
field_to_json(Obj, "latestFirmware", latestFirmware);
field_to_json(Obj, "latestFirmwareDate", latestFirmwareDate);
field_to_json(Obj, "latestFirmwareAvailable",latestFirmwareAvailable);
field_to_json(Obj, "latestFirmwareURI",latestFirmwareURI);
}
bool DeviceInformation::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "serialNumber",serialNumber);
field_from_json(Obj, "history", history);
field_from_json(Obj, "currentFirmware", currentFirmware);
field_from_json(Obj, "currentFirmwareDate", currentFirmwareDate);
field_from_json(Obj, "latestFirmware", latestFirmware);
field_from_json(Obj, "latestFirmwareDate", latestFirmwareDate);
field_from_json(Obj, "latestFirmwareAvailable",latestFirmwareAvailable);
field_from_json(Obj, "latestFirmwareURI",latestFirmwareURI);
return true;
} catch(...) {
}
return false;
}
void DeviceCurrentInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "serialNumber",serialNumber);
field_to_json(Obj, "revision", revision);
field_to_json(Obj, "upgraded", upgraded);
}
bool DeviceCurrentInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "serialNumber",serialNumber);
field_from_json(Obj, "revision", revision);
field_from_json(Obj, "upgraded", upgraded);
return true;
} catch(...) {
}
return false;
}
void DeviceCurrentInfoList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "devices",devices);
}
bool DeviceCurrentInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "devices",devices);
return true;
} catch(...) {
}
return false;
}
} }

View File

@@ -4,9 +4,7 @@
#include <string> #include <string>
#ifndef UCENTRALFMS_RESTAPI_FMSOBJECTS_H #pragma once
#define UCENTRALFMS_RESTAPI_FMSOBJECTS_H
#include "RESTAPI_SecurityObjects.h" #include "RESTAPI_SecurityObjects.h"
#include "framework/OpenWifiTypes.h" #include "framework/OpenWifiTypes.h"
@@ -29,7 +27,7 @@ namespace OpenWifi::FMSObjects {
std::string location; std::string location;
std::string uploader; std::string uploader;
std::string digest; std::string digest;
bool latest=0; bool latest=false;
SecurityObjects::NoteInfoVec notes; SecurityObjects::NoteInfoVec notes;
uint64_t created=0; uint64_t created=0;
@@ -127,7 +125,35 @@ namespace OpenWifi::FMSObjects {
void reset(); void reset();
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct DeviceInformation {
std::string serialNumber;
RevisionHistoryEntryList history;
std::string currentFirmware;
uint64_t currentFirmwareDate=0;
std::string latestFirmware;
uint64_t latestFirmwareDate=0;
bool latestFirmwareAvailable;
std::string latestFirmwareURI;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DeviceCurrentInfo {
std::string serialNumber;
std::string revision;
uint64_t upgraded=0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct DeviceCurrentInfoList {
std::vector<DeviceCurrentInfo> devices;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
} }
#endif //UCENTRALFMS_RESTAPI_FMSOBJECTS_H

View File

@@ -27,7 +27,7 @@ namespace OpenWifi::GWObjects {
void Device::to_json(Poco::JSON::Object &Obj) const { void Device::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"serialNumber", SerialNumber); field_to_json(Obj,"serialNumber", SerialNumber);
#ifdef TIP_GATEWAY_SERVICE #ifdef TIP_GATEWAY_SERVICE
field_to_json(Obj,"deviceType", CapabilitiesCache::instance()->Get(Compatible)); field_to_json(Obj,"deviceType", CapabilitiesCache::instance()->GetPlatform(Compatible));
#endif #endif
field_to_json(Obj,"macAddress", MACAddress); field_to_json(Obj,"macAddress", MACAddress);
field_to_json(Obj,"manufacturer", Manufacturer); field_to_json(Obj,"manufacturer", Manufacturer);
@@ -45,6 +45,10 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"compatible", Compatible); field_to_json(Obj,"compatible", Compatible);
field_to_json(Obj,"fwUpdatePolicy", FWUpdatePolicy); field_to_json(Obj,"fwUpdatePolicy", FWUpdatePolicy);
field_to_json(Obj,"devicePassword", DevicePassword); field_to_json(Obj,"devicePassword", DevicePassword);
field_to_json(Obj,"subscriber", subscriber);
field_to_json(Obj,"entity", entity);
field_to_json(Obj,"modified", modified);
field_to_json(Obj,"locale", locale);
} }
void Device::to_json_with_status(Poco::JSON::Object &Obj) const { void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
@@ -69,7 +73,7 @@ namespace OpenWifi::GWObjects {
#endif #endif
} }
bool Device::from_json(Poco::JSON::Object::Ptr &Obj) { bool Device::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"serialNumber",SerialNumber); field_from_json(Obj,"serialNumber",SerialNumber);
field_from_json(Obj,"deviceType",DeviceType); field_from_json(Obj,"deviceType",DeviceType);
@@ -81,6 +85,9 @@ namespace OpenWifi::GWObjects {
field_from_json(Obj,"location",Location); field_from_json(Obj,"location",Location);
field_from_json(Obj,"venue",Venue); field_from_json(Obj,"venue",Venue);
field_from_json(Obj,"compatible",Compatible); field_from_json(Obj,"compatible",Compatible);
field_from_json(Obj,"subscriber", subscriber);
field_from_json(Obj,"entity", entity);
field_from_json(Obj,"locale", locale);
return true; return true;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
} }
@@ -149,7 +156,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"executionTime", executionTime); field_to_json(Obj,"executionTime", executionTime);
} }
bool DefaultConfiguration::from_json(Poco::JSON::Object::Ptr &Obj) { bool DefaultConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"name",Name); field_from_json(Obj,"name",Name);
field_from_json(Obj,"configuration",Configuration); field_from_json(Obj,"configuration",Configuration);
@@ -168,7 +175,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"created", created); field_to_json(Obj,"created", created);
} }
bool BlackListedDevice::from_json(Poco::JSON::Object::Ptr &Obj) { bool BlackListedDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"serialNumber",serialNumber); field_from_json(Obj,"serialNumber",serialNumber);
field_from_json(Obj,"author",author); field_from_json(Obj,"author",author);
@@ -195,6 +202,11 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"websocketPackets", websocketPackets); field_to_json(Obj,"websocketPackets", websocketPackets);
field_to_json(Obj,"kafkaClients", kafkaClients); field_to_json(Obj,"kafkaClients", kafkaClients);
field_to_json(Obj,"kafkaPackets", kafkaPackets); field_to_json(Obj,"kafkaPackets", kafkaPackets);
field_to_json(Obj,"locale", locale);
field_to_json(Obj,"started", started);
field_to_json(Obj,"sessionId", sessionId);
field_to_json(Obj,"connectionCompletionTime", connectionCompletionTime);
field_to_json(Obj,"totalConnectionTime", OpenWifi::Now() - started);
switch(VerifiedCertificate) { switch(VerifiedCertificate) {
case NO_CERTIFICATE: case NO_CERTIFICATE:
@@ -210,6 +222,21 @@ namespace OpenWifi::GWObjects {
} }
} }
void DeviceConnectionStatistics::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"averageConnectionTime", averageConnectionTime);
field_to_json(Obj,"connectedDevices", connectedDevices );
}
bool DeviceConnectionStatistics::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"averageConnectionTime", averageConnectionTime);
field_from_json(Obj,"connectedDevices", connectedDevices );
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RttySessionDetails::to_json(Poco::JSON::Object &Obj) const { void RttySessionDetails::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"serialNumber", SerialNumber); field_to_json(Obj,"serialNumber", SerialNumber);
field_to_json(Obj,"server", Server); field_to_json(Obj,"server", Server);
@@ -256,7 +283,7 @@ namespace OpenWifi::GWObjects {
lastContact.clear(); lastContact.clear();
associations.clear(); associations.clear();
numberOfDevices = 0 ; numberOfDevices = 0 ;
snapshot = std::time(nullptr); snapshot = OpenWifi::Now();
} }
void CapabilitiesModel::to_json(Poco::JSON::Object &Obj) const{ void CapabilitiesModel::to_json(Poco::JSON::Object &Obj) const{
@@ -264,5 +291,123 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"capabilities", capabilities); field_to_json(Obj,"capabilities", capabilities);
}; };
void ScriptRequest::to_json(Poco::JSON::Object &Obj) const {
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,"when",when);
}
bool ScriptRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"serialNumber",serialNumber);
field_from_json(Obj,"timeout",timeout);
field_from_json(Obj,"type",type);
field_from_json(Obj,"script",script);
field_from_json(Obj,"scriptId",scriptId);
field_from_json(Obj,"when",when);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RadiusProxyPoolList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"pools",pools);
}
bool RadiusProxyPoolList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"pools",pools);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RadiusProxyPool::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"name",name);
field_to_json(Obj,"description",description);
field_to_json(Obj,"authConfig",authConfig);
field_to_json(Obj,"acctConfig",acctConfig);
field_to_json(Obj,"coaConfig",coaConfig);
field_to_json(Obj,"useByDefault",useByDefault);
}
bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"name",name);
field_from_json(Obj,"description",description);
field_from_json(Obj,"authConfig",authConfig);
field_from_json(Obj,"acctConfig",acctConfig);
field_from_json(Obj,"coaConfig",coaConfig);
field_from_json(Obj,"useByDefault",useByDefault);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RadiusProxyServerConfig::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"strategy",strategy);
field_to_json(Obj,"monitor",monitor);
field_to_json(Obj,"monitorMethod",monitorMethod);
field_to_json(Obj,"methodParameters",methodParameters);
field_to_json(Obj,"servers",servers);
}
bool RadiusProxyServerConfig::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"strategy",strategy);
field_from_json(Obj,"monitor",monitor);
field_from_json(Obj,"monitorMethod",monitorMethod);
field_from_json(Obj,"methodParameters",methodParameters);
field_from_json(Obj,"servers",servers);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
void RadiusProxyServerEntry::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"name",name);
field_to_json(Obj,"ip",ip);
field_to_json(Obj,"port",port);
field_to_json(Obj,"weight",weight);
field_to_json(Obj,"secret",secret);
field_to_json(Obj,"certificate",certificate);
field_to_json(Obj,"radsec",radsec);
field_to_json(Obj,"radsecPort",radsecPort);
field_to_json(Obj,"radsecSecret",radsecSecret);
field_to_json(Obj,"radsecCacerts",radsecCacerts);
field_to_json(Obj,"radsecCert",radsecCert);
field_to_json(Obj,"radsecKey",radsecKey);
field_to_json(Obj,"radsecRealms",radsecRealms);
field_to_json(Obj,"ignore",ignore);
}
bool RadiusProxyServerEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"name",name);
field_from_json(Obj,"ip",ip);
field_from_json(Obj,"port",port);
field_from_json(Obj,"weight",weight);
field_from_json(Obj,"secret",secret);
field_from_json(Obj,"certificate",certificate);
field_from_json(Obj,"radsec",radsec);
field_from_json(Obj,"radsecSecret",radsecSecret);
field_from_json(Obj,"radsecPort",radsecPort);
field_from_json(Obj,"radsecCacerts",radsecCacerts);
field_from_json(Obj,"radsecCert",radsecCert);
field_from_json(Obj,"radsecKey",radsecKey);
field_from_json(Obj,"radsecRealms",radsecRealms);
field_from_json(Obj,"ignore",ignore);
return true;
} catch (const Poco::Exception &E) {
}
return false;
}
} }

View File

@@ -37,6 +37,11 @@ namespace OpenWifi::GWObjects {
uint64_t webSocketClients=0; uint64_t webSocketClients=0;
uint64_t kafkaPackets=0; uint64_t kafkaPackets=0;
uint64_t websocketPackets=0; uint64_t websocketPackets=0;
std::string locale;
uint64_t started=0;
uint64_t sessionId=0;
double connectionCompletionTime=0.0;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
}; };
@@ -59,12 +64,24 @@ namespace OpenWifi::GWObjects {
uint64_t LastFWUpdate = 0 ; uint64_t LastFWUpdate = 0 ;
std::string Venue; std::string Venue;
std::string DevicePassword; std::string DevicePassword;
std::string subscriber;
std::string entity;
uint64_t modified=0;
std::string locale;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
void to_json_with_status(Poco::JSON::Object &Obj) const; void to_json_with_status(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
void Print() const; void Print() const;
}; };
struct DeviceConnectionStatistics {
std::uint64_t connectedDevices = 0;
std::uint64_t averageConnectionTime = 0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct Statistics { struct Statistics {
std::string SerialNumber; std::string SerialNumber;
uint64_t UUID = 0 ; uint64_t UUID = 0 ;
@@ -118,7 +135,7 @@ namespace OpenWifi::GWObjects {
uint64_t Created; uint64_t Created;
uint64_t LastModified; uint64_t LastModified;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct CommandDetails { struct CommandDetails {
@@ -150,7 +167,7 @@ namespace OpenWifi::GWObjects {
std::string author; std::string author;
uint64_t created; uint64_t created;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct RttySessionDetails { struct RttySessionDetails {
@@ -193,4 +210,65 @@ namespace OpenWifi::GWObjects {
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
}; };
struct ScriptRequest {
uint64_t timeout=30;
std::string serialNumber;
std::string type;
std::string script;
std::string scriptId;
uint64_t when=0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct RadiusProxyServerEntry {
std::string name;
std::string ip;
uint16_t port=0;
uint64_t weight=0;
std::string secret;
std::string certificate;
bool radsec=false;
uint16_t radsecPort=2083;
std::string radsecSecret;
std::string radsecKey;
std::string radsecCert;
std::vector<std::string> radsecCacerts;
std::vector<std::string> radsecRealms;
bool ignore=false;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct RadiusProxyServerConfig {
std::string strategy;
bool monitor=false;
std::string monitorMethod;
std::vector<std::string> methodParameters;
std::vector<RadiusProxyServerEntry> servers;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct RadiusProxyPool {
std::string name;
std::string description;
RadiusProxyServerConfig authConfig;
RadiusProxyServerConfig acctConfig;
RadiusProxyServerConfig coaConfig;
bool useByDefault=false;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct RadiusProxyPoolList {
std::vector<RadiusProxyPool> pools;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
} }

View File

@@ -91,8 +91,13 @@ namespace OpenWifi::ProvObjects {
field_to_json( Obj,"managementPolicy",managementPolicy); field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"deviceConfiguration",deviceConfiguration); field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
field_to_json( Obj,"devices",devices); field_to_json( Obj,"devices",devices);
field_to_json( Obj,"rrm",rrm); field_to_json( Obj,"deviceRules",deviceRules);
field_to_json( Obj,"sourceIP",sourceIP); field_to_json( Obj,"sourceIP",sourceIP);
field_to_json( Obj,"variables", variables);
field_to_json( Obj,"managementPolicies", managementPolicies);
field_to_json( Obj,"managementRoles", managementRoles);
field_to_json( Obj,"maps", maps);
field_to_json( Obj,"configurations", configurations);
} }
bool Entity::from_json(const Poco::JSON::Object::Ptr &Obj) { bool Entity::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -106,8 +111,13 @@ namespace OpenWifi::ProvObjects {
field_from_json( Obj,"managementPolicy",managementPolicy); field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"deviceConfiguration",deviceConfiguration); field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
field_from_json( Obj,"devices",devices); field_from_json( Obj,"devices",devices);
field_from_json( Obj,"rrm",rrm); field_from_json( Obj,"deviceRules",deviceRules);
field_from_json( Obj,"sourceIP",sourceIP); field_from_json( Obj,"sourceIP",sourceIP);
field_from_json( Obj,"variables", variables);
field_from_json( Obj,"managementPolicies", managementPolicies);
field_from_json( Obj,"managementRoles", managementRoles);
field_from_json( Obj,"maps", maps);
field_from_json( Obj,"configurations", configurations);
return true; return true;
} catch(...) { } catch(...) {
@@ -142,10 +152,16 @@ namespace OpenWifi::ProvObjects {
field_to_json( Obj,"design",design); field_to_json( Obj,"design",design);
field_to_json( Obj,"managementPolicy",managementPolicy); field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"deviceConfiguration",deviceConfiguration); field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
field_to_json( Obj,"contact",contact); field_to_json( Obj,"contacts",contacts);
field_to_json( Obj,"location",location); field_to_json( Obj,"location",location);
field_to_json( Obj,"rrm",rrm); field_to_json( Obj,"deviceRules",deviceRules);
field_to_json( Obj,"sourceIP",sourceIP); field_to_json( Obj,"sourceIP",sourceIP);
field_to_json( Obj,"variables", variables);
field_to_json( Obj,"managementPolicies", managementPolicies);
field_to_json( Obj,"managementRoles", managementRoles);
field_to_json( Obj,"maps", maps);
field_to_json( Obj,"configurations", configurations);
field_to_json( Obj,"boards", boards);
} }
bool Venue::from_json(const Poco::JSON::Object::Ptr &Obj) { bool Venue::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -160,10 +176,16 @@ namespace OpenWifi::ProvObjects {
field_from_json( Obj,"design",design); field_from_json( Obj,"design",design);
field_from_json( Obj,"managementPolicy",managementPolicy); field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"deviceConfiguration",deviceConfiguration); field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
field_from_json( Obj,"contact",contact); field_from_json( Obj,"contacts",contacts);
field_from_json( Obj,"location",location); field_from_json( Obj,"location",location);
field_from_json( Obj,"rrm",rrm); field_from_json( Obj,"deviceRules",deviceRules);
field_from_json( Obj,"sourceIP",sourceIP); field_from_json( Obj,"sourceIP",sourceIP);
field_from_json( Obj,"variables", variables);
field_from_json( Obj,"managementPolicies", managementPolicies);
field_from_json( Obj,"managementRoles", managementRoles);
field_from_json( Obj,"maps", maps);
field_from_json( Obj,"configurations", configurations);
field_from_json( Obj,"boards", boards);
return true; return true;
} catch (...) { } catch (...) {
@@ -171,6 +193,89 @@ namespace OpenWifi::ProvObjects {
return false; return false;
} }
void Operator::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"managementRoles",managementRoles);
field_to_json( Obj,"deviceRules",deviceRules);
field_to_json( Obj,"variables",variables);
field_to_json( Obj,"defaultOperator",defaultOperator);
field_to_json( Obj,"sourceIP",sourceIP);
field_to_json( Obj,"registrationId",registrationId);
}
bool Operator::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"managementRoles",managementRoles);
field_from_json( Obj,"deviceRules",deviceRules);
field_from_json( Obj,"variables",variables);
field_from_json( Obj,"defaultOperator",defaultOperator);
field_from_json( Obj,"sourceIP",sourceIP);
field_from_json( Obj,"registrationId",registrationId);
return true;
} catch(...) {
}
return false;
}
void OperatorList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"operators",operators);
}
bool OperatorList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"operators",operators);
return true;
} catch(...) {
}
return false;
}
void ServiceClass::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json( Obj,"operatorId",operatorId);
field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"cost",cost);
field_to_json( Obj,"currency",currency);
field_to_json( Obj,"period",period);
field_to_json( Obj,"billingCode",billingCode);
field_to_json( Obj,"variables",variables);
field_to_json( Obj,"defaultService",defaultService);
}
bool ServiceClass::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json( Obj,"operatorId",operatorId);
field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"cost",cost);
field_from_json( Obj,"currency",currency);
field_from_json( Obj,"period",period);
field_from_json( Obj,"billingCode",billingCode);
field_from_json( Obj,"variables",variables);
field_from_json( Obj,"defaultService",defaultService);
return true;
} catch(...) {
}
return false;
}
void ServiceClassList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"serviceClasses",serviceClasses);
}
bool ServiceClassList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"serviceClasses",serviceClasses);
return true;
} catch(...) {
}
return false;
}
void UserInfoDigest::to_json(Poco::JSON::Object &Obj) const { void UserInfoDigest::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"id",id); field_to_json( Obj,"id",id);
field_to_json( Obj,"entity",loginId); field_to_json( Obj,"entity",loginId);
@@ -193,6 +298,7 @@ namespace OpenWifi::ProvObjects {
field_to_json( Obj,"managementPolicy",managementPolicy); field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"users",users); field_to_json( Obj,"users",users);
field_to_json( Obj,"entity",entity); field_to_json( Obj,"entity",entity);
field_to_json( Obj,"venue",venue);
} }
bool ManagementRole::from_json(const Poco::JSON::Object::Ptr &Obj) { bool ManagementRole::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -201,6 +307,7 @@ namespace OpenWifi::ProvObjects {
field_from_json( Obj,"managementPolicy",managementPolicy); field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"users",users); field_from_json( Obj,"users",users);
field_from_json( Obj,"entity",entity); field_from_json( Obj,"entity",entity);
field_from_json( Obj,"venue",venue);
return true; return true;
} catch(...) { } catch(...) {
} }
@@ -249,6 +356,92 @@ namespace OpenWifi::ProvObjects {
return false; return false;
} }
void OperatorLocation::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json( Obj,"type",type);
field_to_json( Obj,"buildingName",buildingName);
field_to_json( Obj,"addressLines",addressLines);
field_to_json( Obj,"city",city);
field_to_json( Obj,"state",state);
field_to_json( Obj,"postal",postal);
field_to_json( Obj,"country",country);
field_to_json( Obj,"phones",phones);
field_to_json( Obj,"mobiles",mobiles);
field_to_json( Obj,"geoCode",geoCode);
field_to_json( Obj,"operatorId",operatorId);
field_to_json( Obj,"subscriberDeviceId",subscriberDeviceId);
field_to_json( Obj,"managementPolicy",managementPolicy);
}
bool OperatorLocation::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json( Obj,"type", type);
field_from_json( Obj,"buildingName",buildingName);
field_from_json( Obj,"addressLines",addressLines);
field_from_json( Obj,"city",city);
field_from_json( Obj,"state",state);
field_from_json( Obj,"postal",postal);
field_from_json( Obj,"country",country);
field_from_json( Obj,"phones",phones);
field_from_json( Obj,"mobiles",mobiles);
field_from_json( Obj,"geoCode",geoCode);
field_from_json( Obj,"operatorId",operatorId);
field_from_json( Obj,"subscriberDeviceId",subscriberDeviceId);
field_from_json( Obj,"managementPolicy",managementPolicy);
return true;
} catch (...) {
}
return false;
}
void SubLocation::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"type",type);
field_to_json( Obj,"buildingName",buildingName);
field_to_json( Obj,"addressLines",addressLines);
field_to_json( Obj,"city",city);
field_to_json( Obj,"state",state);
field_to_json( Obj,"postal",postal);
field_to_json( Obj,"country",country);
field_to_json( Obj,"phones",phones);
field_to_json( Obj,"mobiles",mobiles);
field_to_json( Obj,"geoCode",geoCode);
}
bool SubLocation::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"type", type);
field_from_json( Obj,"buildingName",buildingName);
field_from_json( Obj,"addressLines",addressLines);
field_from_json( Obj,"city",city);
field_from_json( Obj,"state",state);
field_from_json( Obj,"postal",postal);
field_from_json( Obj,"country",country);
field_from_json( Obj,"phones",phones);
field_from_json( Obj,"mobiles",mobiles);
field_from_json( Obj,"geoCode",geoCode);
return true;
} catch (...) {
}
return false;
}
void OperatorLocationList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj, "locations", locations);
}
bool OperatorLocationList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj, "locations", locations);
return true;
} catch(...) {
}
return false;
}
void Contact::to_json(Poco::JSON::Object &Obj) const { void Contact::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj); info.to_json(Obj);
field_to_json( Obj,"type", to_string(type)); field_to_json( Obj,"type", to_string(type));
@@ -295,21 +488,118 @@ namespace OpenWifi::ProvObjects {
return false; return false;
} }
void OperatorContact::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json( Obj,"type", type);
field_to_json( Obj,"title",title);
field_to_json( Obj,"salutation",salutation);
field_to_json( Obj,"firstname",firstname);
field_to_json( Obj,"lastname",lastname);
field_to_json( Obj,"initials",initials);
field_to_json( Obj,"visual",visual);
field_to_json( Obj,"mobiles",mobiles);
field_to_json( Obj,"phones",phones);
field_to_json( Obj,"primaryEmail",primaryEmail);
field_to_json( Obj,"secondaryEmail",secondaryEmail);
field_to_json( Obj,"accessPIN",accessPIN);
field_to_json( Obj,"operatorId",operatorId);
field_to_json( Obj,"subscriberDeviceId",subscriberDeviceId);
field_to_json( Obj,"managementPolicy",managementPolicy);
}
bool OperatorContact::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json( Obj,"type", type);
field_from_json( Obj,"title",title);
field_from_json( Obj,"salutation",salutation);
field_from_json( Obj,"firstname",firstname);
field_from_json( Obj,"lastname",lastname);
field_from_json( Obj,"initials",initials);
field_from_json( Obj,"visual",visual);
field_from_json( Obj,"mobiles",mobiles);
field_from_json( Obj,"phones",phones);
field_from_json( Obj,"primaryEmail",primaryEmail);
field_from_json( Obj,"secondaryEmail",secondaryEmail);
field_from_json( Obj,"accessPIN",accessPIN);
field_from_json( Obj,"operatorId",operatorId);
field_from_json( Obj,"subscriberDeviceId",subscriberDeviceId);
field_from_json( Obj,"managementPolicy",managementPolicy);
return true;
} catch (...) {
}
return false;
}
void SubContact::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"type", type);
field_to_json( Obj,"title",title);
field_to_json( Obj,"salutation",salutation);
field_to_json( Obj,"firstname",firstname);
field_to_json( Obj,"lastname",lastname);
field_to_json( Obj,"initials",initials);
field_to_json( Obj,"visual",visual);
field_to_json( Obj,"mobiles",mobiles);
field_to_json( Obj,"phones",phones);
field_to_json( Obj,"primaryEmail",primaryEmail);
field_to_json( Obj,"secondaryEmail",secondaryEmail);
field_to_json( Obj,"accessPIN",accessPIN);
}
bool SubContact::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"type", type);
field_from_json( Obj,"title",title);
field_from_json( Obj,"salutation",salutation);
field_from_json( Obj,"firstname",firstname);
field_from_json( Obj,"lastname",lastname);
field_from_json( Obj,"initials",initials);
field_from_json( Obj,"visual",visual);
field_from_json( Obj,"mobiles",mobiles);
field_from_json( Obj,"phones",phones);
field_from_json( Obj,"primaryEmail",primaryEmail);
field_from_json( Obj,"secondaryEmail",secondaryEmail);
field_from_json( Obj,"accessPIN",accessPIN);
return true;
} catch (...) {
}
return false;
}
void OperatorContactList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj, "contacts", contacts);
}
bool OperatorContactList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj, "contacts", contacts);
return true;
} catch(...) {
}
return false;
}
void InventoryTag::to_json(Poco::JSON::Object &Obj) const { void InventoryTag::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj); info.to_json(Obj);
field_to_json(Obj, "serialNumber", serialNumber); field_to_json( Obj, "serialNumber", serialNumber);
field_to_json(Obj, "venue", venue); field_to_json( Obj, "venue", venue);
field_to_json(Obj, "entity", entity); field_to_json( Obj, "entity", entity);
field_to_json(Obj, "subscriber", subscriber); field_to_json( Obj, "subscriber", subscriber);
field_to_json(Obj, "deviceType", deviceType); field_to_json( Obj, "deviceType", deviceType);
field_to_json(Obj, "qrCode", qrCode); field_to_json( Obj, "qrCode", qrCode);
field_to_json(Obj, "geoCode", geoCode); field_to_json( Obj, "geoCode", geoCode);
field_to_json(Obj, "location", location); field_to_json( Obj, "location", location);
field_to_json(Obj, "contact", contact); field_to_json( Obj, "contact", contact);
field_to_json( Obj,"deviceConfiguration",deviceConfiguration); field_to_json( Obj, "deviceConfiguration",deviceConfiguration);
field_to_json( Obj,"rrm",rrm); field_to_json( Obj,"deviceRules",deviceRules);
field_to_json( Obj,"managementPolicy",managementPolicy); field_to_json( Obj, "managementPolicy",managementPolicy);
field_to_json( Obj,"state",state); field_to_json( Obj, "state",state);
field_to_json( Obj, "devClass",devClass);
field_to_json( Obj, "locale",locale);
field_to_json( Obj, "realMacAddress",realMacAddress);
} }
bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) { bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -320,14 +610,17 @@ namespace OpenWifi::ProvObjects {
field_from_json( Obj,"entity",entity); field_from_json( Obj,"entity",entity);
field_from_json( Obj,"subscriber",subscriber); field_from_json( Obj,"subscriber",subscriber);
field_from_json( Obj,"deviceType",deviceType); field_from_json( Obj,"deviceType",deviceType);
field_from_json(Obj, "qrCode", qrCode); field_from_json( Obj,"qrCode", qrCode);
field_from_json( Obj,"geoCode",geoCode); field_from_json( Obj,"geoCode",geoCode);
field_from_json( Obj,"location",location); field_from_json( Obj,"location",location);
field_from_json( Obj,"contact",contact); field_from_json( Obj,"contact",contact);
field_from_json( Obj,"deviceConfiguration",deviceConfiguration); field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
field_from_json( Obj,"rrm",rrm); field_from_json( Obj,"deviceRules",deviceRules);
field_from_json( Obj,"managementPolicy",managementPolicy); field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"state",state); field_from_json( Obj,"state",state);
field_from_json( Obj,"devClass",devClass);
field_from_json( Obj,"locale",locale);
field_from_json( Obj,"realMacAddress",realMacAddress);
return true; return true;
} catch(...) { } catch(...) {
@@ -335,6 +628,26 @@ namespace OpenWifi::ProvObjects {
return false; return false;
} }
void InventoryConfigApplyResult::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj, "appliedConfiguration", appliedConfiguration);
field_to_json( Obj, "warnings", warnings);
field_to_json( Obj, "errors", errors);
field_to_json( Obj, "errorCode", errorCode);
}
bool InventoryConfigApplyResult::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj, "appliedConfiguration", appliedConfiguration);
field_from_json( Obj, "warnings", warnings);
field_from_json( Obj, "errors", errors);
field_from_json( Obj, "errorCode", errorCode);
return true;
} catch (...) {
}
return false;
}
void InventoryTagList::to_json(Poco::JSON::Object &Obj) const { void InventoryTagList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"taglist",taglist); field_to_json( Obj,"taglist",taglist);
} }
@@ -342,7 +655,7 @@ namespace OpenWifi::ProvObjects {
bool InventoryTagList::from_json(const Poco::JSON::Object::Ptr &Obj) { bool InventoryTagList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json( Obj,"taglist",taglist); field_from_json( Obj,"taglist",taglist);
return false; return true;
} catch (...) { } catch (...) {
} }
@@ -373,12 +686,14 @@ namespace OpenWifi::ProvObjects {
info.to_json(Obj); info.to_json(Obj);
field_to_json( Obj,"managementPolicy",managementPolicy); field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"deviceTypes",deviceTypes); field_to_json( Obj,"deviceTypes",deviceTypes);
field_to_json( Obj,"subscriberOnly",subscriberOnly);
field_to_json( Obj,"entity", entity);
field_to_json( Obj,"venue", venue);
field_to_json( Obj,"subscriber", subscriber);
field_to_json( Obj,"configuration",configuration); field_to_json( Obj,"configuration",configuration);
field_to_json( Obj,"inUse",inUse); field_to_json( Obj,"inUse",inUse);
field_to_json( Obj,"variables",variables); field_to_json( Obj,"variables",variables);
field_to_json( Obj,"rrm",rrm); field_to_json( Obj,"deviceRules",deviceRules);
field_to_json( Obj,"firmwareUpgrade",firmwareUpgrade);
field_to_json( Obj,"firmwareRCOnly",firmwareRCOnly);
} }
bool DeviceConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) { bool DeviceConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -386,12 +701,14 @@ namespace OpenWifi::ProvObjects {
info.from_json(Obj); info.from_json(Obj);
field_from_json( Obj,"managementPolicy",managementPolicy); field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"deviceTypes",deviceTypes); field_from_json( Obj,"deviceTypes",deviceTypes);
field_from_json( Obj,"configuration",configuration);
field_from_json( Obj,"inUse",inUse); field_from_json( Obj,"inUse",inUse);
field_from_json( Obj,"variables",variables); field_from_json( Obj,"variables",variables);
field_from_json( Obj,"rrm",rrm); field_from_json( Obj,"subscriberOnly",subscriberOnly);
field_from_json( Obj,"firmwareUpgrade",firmwareUpgrade); field_from_json( Obj,"entity", entity);
field_from_json( Obj,"firmwareRCOnly",firmwareRCOnly); field_from_json( Obj,"venue", venue);
field_from_json( Obj,"subscriber", subscriber);
field_from_json( Obj,"configuration",configuration);
field_from_json( Obj,"deviceRules",deviceRules);
return true; return true;
} catch(...) { } catch(...) {
@@ -470,46 +787,16 @@ namespace OpenWifi::ProvObjects {
return false; return false;
} }
void field_to_json(Poco::JSON::Object &Obj, const char * FieldName, ACLACCESS A) {
switch(A) {
case READ: Obj.set(FieldName,"read"); break;
case MODIFY: Obj.set(FieldName,"modify"); break;
case CREATE: Obj.set(FieldName,"create"); break;
case DELETE: Obj.set(FieldName,"delete"); break;
case NONE:
default:
Obj.set(FieldName,"none");
}
}
void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char * FieldName, ACLACCESS &A) {
if(Obj->has(FieldName)) {
auto V = Obj->getValue<std::string>(FieldName);
if(V=="read")
A = READ;
else if(V=="modify")
A = MODIFY;
else if(V=="create")
A = CREATE;
else if(V=="delete")
A = DELETE;
else if(V=="none")
A = NONE;
else
throw Poco::Exception("invalid JSON");
}
}
void ObjectACL::to_json(Poco::JSON::Object &Obj) const { void ObjectACL::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj, "users", users); field_to_json(Obj, "users", users);
RESTAPI_utils::field_to_json(Obj, "roles", roles); field_to_json(Obj, "roles", roles);
field_to_json(Obj, "access", access); field_to_json(Obj, "access", access);
} }
bool ObjectACL::from_json(const Poco::JSON::Object::Ptr &Obj) { bool ObjectACL::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
RESTAPI_utils::field_from_json(Obj, "users", users); field_from_json(Obj, "users", users);
RESTAPI_utils::field_from_json(Obj, "roles", roles); field_from_json(Obj, "roles", roles);
field_from_json(Obj, "access", access); field_from_json(Obj, "access", access);
return true; return true;
} catch(...) { } catch(...) {
@@ -519,12 +806,12 @@ namespace OpenWifi::ProvObjects {
} }
void ObjectACLList::to_json(Poco::JSON::Object &Obj) const { void ObjectACLList::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj, "list", list); field_to_json(Obj, "list", list);
} }
bool ObjectACLList::from_json(const Poco::JSON::Object::Ptr &Obj) { bool ObjectACLList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
RESTAPI_utils::field_from_json(Obj, "list", list); field_from_json(Obj, "list", list);
return true; return true;
} catch(...) { } catch(...) {
@@ -532,44 +819,15 @@ namespace OpenWifi::ProvObjects {
return false; return false;
} }
std::string to_string(VISIBILITY A) {
switch(A) {
case PUBLIC: return "public";
case SELECT: return "select";
case PRIVATE:
default:
return "private";
}
}
void field_to_json(Poco::JSON::Object &Obj, const char * FieldName, VISIBILITY A) {
Obj.set(FieldName,to_string(A));
}
VISIBILITY visibility_from_string(const std::string &V) {
if(V=="public")
return PUBLIC;
else if(V=="select")
return SELECT;
else if(V=="private")
return PRIVATE;
throw Poco::Exception("invalid json");
}
void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char * FieldName, VISIBILITY &A) {
if(Obj->has(FieldName)) {
auto V = Obj->getValue<std::string>(FieldName);
A = visibility_from_string(V);
}
}
void Map::to_json(Poco::JSON::Object &Obj) const { void Map::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj); info.to_json(Obj);
RESTAPI_utils::field_to_json( Obj,"data",data); field_to_json( Obj,"data",data);
RESTAPI_utils::field_to_json( Obj,"entity",entity); field_to_json( Obj,"entity",entity);
RESTAPI_utils::field_to_json( Obj,"creator",creator); field_to_json( Obj,"creator",creator);
field_to_json( Obj,"visibility",visibility); field_to_json( Obj,"visibility",visibility);
RESTAPI_utils::field_to_json( Obj,"access",access); field_to_json( Obj,"access",access);
field_to_json( Obj,"managementPolicy", managementPolicy);
field_to_json( Obj,"venue", venue);
} }
bool Map::from_json(const Poco::JSON::Object::Ptr &Obj) { bool Map::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -578,8 +836,24 @@ namespace OpenWifi::ProvObjects {
RESTAPI_utils::field_from_json( Obj,"data",data); RESTAPI_utils::field_from_json( Obj,"data",data);
RESTAPI_utils::field_from_json( Obj,"entity",entity); RESTAPI_utils::field_from_json( Obj,"entity",entity);
RESTAPI_utils::field_from_json( Obj,"creator",creator); RESTAPI_utils::field_from_json( Obj,"creator",creator);
field_from_json( Obj,"visibility",visibility); RESTAPI_utils::field_from_json( Obj,"visibility",visibility);
RESTAPI_utils::field_from_json( Obj,"access",access); RESTAPI_utils::field_from_json( Obj,"access",access);
RESTAPI_utils::field_from_json( Obj,"managementPolicy", managementPolicy);
RESTAPI_utils::field_from_json( Obj,"venue", venue);
return true;
} catch(...) {
}
return false;
}
void SerialNumberList::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json( Obj,"serialNumbers",serialNumbers);
}
bool SerialNumberList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json( Obj,"serialNumbers",serialNumbers);
return true; return true;
} catch(...) { } catch(...) {
@@ -601,8 +875,223 @@ namespace OpenWifi::ProvObjects {
return false; return false;
} }
void SignupEntry::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json( Obj,"email", email);
field_to_json( Obj,"userId", userId);
field_to_json( Obj,"macAddress", macAddress);
field_to_json( Obj,"serialNumber", serialNumber);
field_to_json( Obj,"submitted", submitted);
field_to_json( Obj,"completed", completed);
field_to_json( Obj,"status", status);
field_to_json( Obj,"error", error);
field_to_json( Obj,"statusCode", statusCode);
field_to_json( Obj,"deviceID", deviceID);
field_to_json( Obj,"registrationId",registrationId);
field_to_json( Obj,"operatorId",operatorId);
}
bool SignupEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json( Obj,"email", email);
field_from_json( Obj,"userId", userId);
field_from_json( Obj,"macAddress", macAddress);
field_from_json( Obj,"serialNumber", serialNumber);
field_from_json( Obj,"submitted", submitted);
field_from_json( Obj,"completed", completed);
field_from_json( Obj,"status", status);
field_from_json( Obj,"error", error);
field_from_json( Obj,"statusCode", statusCode);
field_from_json( Obj,"deviceID", deviceID);
field_from_json( Obj,"registrationId",registrationId);
field_from_json( Obj,"operatorId",operatorId);
return true;
} catch(...) {
}
return false;
}
void Variable::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"type", type);
field_to_json( Obj,"weight", weight);
field_to_json( Obj,"prefix", prefix);
field_to_json( Obj,"value", value);
}
bool Variable::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"type", type);
field_from_json( Obj,"weight", weight);
field_from_json( Obj,"prefix", prefix);
field_from_json( Obj,"value", value);
return true;
} catch(...) {
}
return false;
}
void VariableList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"variables", variables);
}
bool VariableList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"variables", variables);
return true;
} catch(...) {
}
return false;
}
void VariableBlock::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json( Obj,"variables", variables);
field_to_json( Obj,"entity", entity);
field_to_json( Obj,"venue", venue);
field_to_json( Obj,"subscriber", subscriber);
field_to_json( Obj,"inventory", inventory);
field_to_json( Obj,"configurations", configurations);
field_to_json( Obj,"managementPolicy", managementPolicy);
}
bool VariableBlock::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json( Obj,"variables", variables);
field_from_json( Obj,"entity", entity);
field_from_json( Obj,"venue", venue);
field_from_json( Obj,"subscriber", subscriber);
field_from_json( Obj,"inventory", inventory);
field_from_json( Obj,"configurations", configurations);
field_from_json( Obj,"managementPolicy", managementPolicy);
return true;
} catch(...) {
}
return false;
}
void VariableBlockList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"variableBlocks", variableBlocks);
}
bool VariableBlockList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"variableBlocks", variableBlocks);
return true;
} catch(...) {
}
return false;
}
void ConfigurationDetails::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"configuration", configuration);
field_to_json( Obj,"rrm", rrm);
field_to_json( Obj,"firmwareRCOnly", firmwareRCOnly);
field_to_json( Obj,"firmwareUpgrade", firmwareUpgrade);
}
bool ConfigurationDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"configuration", configuration);
field_from_json( Obj,"rrm", rrm);
field_from_json( Obj,"firmwareRCOnly", firmwareRCOnly);
field_from_json( Obj,"firmwareUpgrade", firmwareUpgrade);
return true;
} catch(...) {
}
return false;
}
void SubscriberDevice::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json( Obj,"serialNumber", serialNumber);
field_to_json( Obj,"deviceType", deviceType);
field_to_json( Obj,"operatorId", operatorId);
field_to_json( Obj,"subscriberId", subscriberId);
field_to_json( Obj,"location", location);
field_to_json( Obj,"contact", contact);
field_to_json( Obj,"managementPolicy", managementPolicy);
field_to_json( Obj,"serviceClass", serviceClass);
field_to_json( Obj,"qrCode", qrCode);
field_to_json( Obj,"geoCode", geoCode);
field_to_json( Obj,"deviceRules",deviceRules);
field_to_json( Obj,"state", state);
field_to_json( Obj,"locale", locale);
field_to_json( Obj,"billingCode", billingCode);
field_to_json( Obj,"configuration", configuration);
field_to_json( Obj,"suspended", suspended);
field_to_json( Obj,"realMacAddress", realMacAddress);
}
bool SubscriberDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json( Obj,"serialNumber", serialNumber);
field_from_json( Obj,"deviceType", deviceType);
field_from_json( Obj,"operatorId", operatorId);
field_from_json( Obj,"subscriberId", subscriberId);
field_from_json( Obj,"location", location);
field_from_json( Obj,"contact", contact);
field_from_json( Obj,"managementPolicy", managementPolicy);
field_from_json( Obj,"serviceClass", serviceClass);
field_from_json( Obj,"qrCode", qrCode);
field_from_json( Obj,"geoCode", geoCode);
field_from_json( Obj,"deviceRules",deviceRules);
field_from_json( Obj,"state", state);
field_from_json( Obj,"locale", locale);
field_from_json( Obj,"billingCode", billingCode);
field_from_json( Obj,"configuration", configuration);
field_from_json( Obj,"suspended", suspended);
field_from_json( Obj,"realMacAddress", realMacAddress);
return true;
} catch(...) {
}
return false;
}
void SubscriberDeviceList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"subscriberDevices", subscriberDevices);
}
bool SubscriberDeviceList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"subscriberDevices", subscriberDevices);
return true;
} catch(...) {
}
return false;
}
void VenueDeviceList::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,"devices",devices);
}
bool VenueDeviceList::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,"devices",devices);
return true;
} catch(...) {
}
return false;
}
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) { bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
uint64_t Now = std::time(nullptr); uint64_t Now = OpenWifi::Now();
if(O->has("name")) if(O->has("name"))
I.name = O->get("name").toString(); I.name = O->get("name").toString();
@@ -623,7 +1112,7 @@ namespace OpenWifi::ProvObjects {
} }
bool CreateObjectInfo(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) {
uint64_t Now = std::time(nullptr); uint64_t Now = OpenWifi::Now();
if(O->has("name")) if(O->has("name"))
I.name = O->get("name").toString(); I.name = O->get("name").toString();
@@ -645,5 +1134,30 @@ namespace OpenWifi::ProvObjects {
return true; return true;
} }
bool CreateObjectInfo([[maybe_unused]] const SecurityObjects::UserInfo &U, ObjectInfo &I) {
I.modified = I.created = OpenWifi::Now();
I.id = MicroService::CreateUUID();
return true;
}
void DeviceRules::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"rcOnly",rcOnly);
field_to_json(Obj,"rrm",rrm);
field_to_json(Obj,"firmwareUpgrade",firmwareUpgrade);
}
bool DeviceRules::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"rcOnly",rcOnly);
field_from_json(Obj,"rrm",rrm);
field_from_json(Obj,"firmwareUpgrade",firmwareUpgrade);
return true;
} catch(...) {
}
return false;
}
} }

View File

@@ -33,6 +33,13 @@ namespace OpenWifi::ProvObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct SerialNumberList {
Types::UUIDvec_t serialNumbers;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ManagementPolicyEntry { struct ManagementPolicyEntry {
Types::UUIDvec_t users; Types::UUIDvec_t users;
Types::UUIDvec_t resources; Types::UUIDvec_t resources;
@@ -48,12 +55,22 @@ namespace OpenWifi::ProvObjects {
std::vector<ManagementPolicyEntry> entries; std::vector<ManagementPolicyEntry> entries;
Types::StringVec inUse; Types::StringVec inUse;
Types::UUID_t entity; Types::UUID_t entity;
Types::UUID_t venue;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
typedef std::vector<ManagementPolicy> ManagementPolicyVec; typedef std::vector<ManagementPolicy> ManagementPolicyVec;
struct DeviceRules {
std::string rcOnly{"inherit"};
std::string rrm{"inherit"};
std::string firmwareUpgrade{"inherit"};
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct Entity { struct Entity {
ObjectInfo info; ObjectInfo info;
Types::UUID_t parent; Types::UUID_t parent;
@@ -64,8 +81,13 @@ namespace OpenWifi::ProvObjects {
Types::UUID_t managementPolicy; Types::UUID_t managementPolicy;
Types::UUIDvec_t deviceConfiguration; Types::UUIDvec_t deviceConfiguration;
Types::UUIDvec_t devices; Types::UUIDvec_t devices;
std::string rrm; DeviceRules deviceRules;
Types::StringVec sourceIP; Types::StringVec sourceIP;
Types::UUIDvec_t variables;
Types::UUIDvec_t managementPolicies;
Types::UUIDvec_t managementRoles;
Types::UUIDvec_t maps;
Types::UUIDvec_t configurations;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -92,10 +114,16 @@ namespace OpenWifi::ProvObjects {
DiGraph topology; DiGraph topology;
std::string design; std::string design;
Types::UUIDvec_t deviceConfiguration; Types::UUIDvec_t deviceConfiguration;
std::string contact; Types::UUIDvec_t contacts;
std::string location; std::string location;
std::string rrm; DeviceRules deviceRules;
Types::StringVec sourceIP; Types::StringVec sourceIP;
Types::UUIDvec_t variables;
Types::UUIDvec_t configurations;
Types::UUIDvec_t maps;
Types::UUIDvec_t managementPolicies;
Types::UUIDvec_t managementRoles;
Types::UUIDvec_t boards;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -117,6 +145,7 @@ namespace OpenWifi::ProvObjects {
Types::UUIDvec_t users; Types::UUIDvec_t users;
Types::StringVec inUse; Types::StringVec inUse;
Types::UUID_t entity; Types::UUID_t entity;
Types::UUID_t venue;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -180,6 +209,51 @@ namespace OpenWifi::ProvObjects {
}; };
typedef std::vector<Location> LocationVec; typedef std::vector<Location> LocationVec;
struct OperatorLocation {
ObjectInfo info;
std::string type;
std::string buildingName;
Types::StringVec addressLines;
std::string city;
std::string state;
std::string postal;
std::string country;
Types::StringVec phones;
Types::StringVec mobiles;
std::string geoCode;
Types::UUID_t operatorId;
Types::UUID_t subscriberDeviceId;
Types::UUID_t managementPolicy;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
typedef std::vector<Location> LocationVec;
struct SubLocation {
std::string type;
std::string buildingName;
Types::StringVec addressLines;
std::string city;
std::string state;
std::string postal;
std::string country;
Types::StringVec phones;
Types::StringVec mobiles;
std::string geoCode;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct OperatorLocationList {
std::vector<OperatorLocation> locations;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
enum ContactType { enum ContactType {
CT_SUBSCRIBER, CT_USER, CT_INSTALLER, CT_CSR, CT_MANAGER, CT_SUBSCRIBER, CT_USER, CT_INSTALLER, CT_CSR, CT_MANAGER,
CT_BUSINESSOWNER, CT_TECHNICIAN, CT_CORPORATE, CT_UNKNOWN CT_BUSINESSOWNER, CT_TECHNICIAN, CT_CORPORATE, CT_UNKNOWN
@@ -243,6 +317,55 @@ namespace OpenWifi::ProvObjects {
}; };
typedef std::vector<Contact> ContactVec; typedef std::vector<Contact> ContactVec;
struct OperatorContact {
ObjectInfo info;
std::string type;
std::string title;
std::string salutation;
std::string firstname;
std::string lastname;
std::string initials;
std::string visual;
Types::StringVec mobiles;
Types::StringVec phones;
std::string primaryEmail;
std::string secondaryEmail;
std::string accessPIN;
Types::UUID_t operatorId;
Types::UUID_t subscriberDeviceId;
Types::UUID_t managementPolicy;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct SubContact {
std::string type;
std::string title;
std::string salutation;
std::string firstname;
std::string lastname;
std::string initials;
std::string visual;
Types::StringVec mobiles;
Types::StringVec phones;
std::string primaryEmail;
std::string secondaryEmail;
std::string accessPIN;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct OperatorContactList {
std::vector<OperatorContact> contacts;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
typedef std::vector<OperatorContact> OperatorContactVec;
struct DeviceConfigurationElement { struct DeviceConfigurationElement {
std::string name; std::string name;
std::string description; std::string description;
@@ -255,21 +378,24 @@ namespace OpenWifi::ProvObjects {
typedef std::vector<DeviceConfigurationElement> DeviceConfigurationElementVec; typedef std::vector<DeviceConfigurationElement> DeviceConfigurationElementVec;
struct DeviceConfiguration { struct DeviceConfiguration {
ObjectInfo info; ObjectInfo info;
Types::UUID_t managementPolicy; Types::UUID_t managementPolicy;
Types::StringVec deviceTypes; Types::StringVec deviceTypes;
DeviceConfigurationElementVec configuration; DeviceConfigurationElementVec configuration;
Types::StringVec inUse; Types::StringVec inUse;
Types::StringPairVec variables; Types::UUIDvec_t variables;
std::string rrm; DeviceRules deviceRules;
std::string firmwareUpgrade; bool subscriberOnly=false;
bool firmwareRCOnly=false; std::string venue;
std::string entity;
std::string subscriber;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
typedef std::vector<DeviceConfiguration> DeviceConfigurationVec; typedef std::vector<DeviceConfiguration> DeviceConfigurationVec;
struct InventoryTag { struct InventoryTag {
ObjectInfo info; ObjectInfo info;
std::string serialNumber; std::string serialNumber;
@@ -282,9 +408,12 @@ namespace OpenWifi::ProvObjects {
std::string location; std::string location;
std::string contact; std::string contact;
std::string deviceConfiguration; std::string deviceConfiguration;
std::string rrm; DeviceRules deviceRules;
Types::UUID_t managementPolicy; Types::UUID_t managementPolicy;
std::string state; std::string state;
std::string devClass;
std::string locale;
std::string realMacAddress;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -299,6 +428,15 @@ namespace OpenWifi::ProvObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct InventoryConfigApplyResult {
std::string appliedConfiguration;
Types::StringVec errors;
Types::StringVec warnings;
uint64_t errorCode;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct Report { struct Report {
uint64_t snapShot=0; uint64_t snapShot=0;
@@ -333,20 +471,20 @@ namespace OpenWifi::ProvObjects {
}; };
struct UuidList { struct UuidList {
std::vector<std::string> list; Types::UUIDvec_t list;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
enum ACLACCESS { enum ACLACCESS {
NONE, READ, MODIFY, CREATE, DELETE NONE = 0, READ=1, MODIFY=2, CREATE=3, DELETE=4
}; };
struct ObjectACL { struct ObjectACL {
UuidList users; UuidList users;
UuidList roles; UuidList roles;
ACLACCESS access = NONE; uint64_t access = (uint64_t) NONE;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -359,20 +497,15 @@ namespace OpenWifi::ProvObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
enum VISIBILITY {
PUBLIC, PRIVATE, SELECT
};
std::string to_string(VISIBILITY A);
VISIBILITY visibility_from_string(const std::string &V);
struct Map { struct Map {
ObjectInfo info; ObjectInfo info;
std::string data; std::string data;
std::string entity; std::string entity;
std::string creator; std::string creator;
VISIBILITY visibility = PRIVATE; std::string visibility{"private"};
ObjectACLList access; ObjectACLList access;
Types::UUID_t managementPolicy;
std::string venue;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -385,6 +518,168 @@ namespace OpenWifi::ProvObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
enum SignupStatusCodes {
SignupCreated = 0 ,
SignupWaitingForEmail,
SignupWaitingForDevice,
SignupSuccess,
SignupFailure,
SignupCanceled,
SignupTimedOut
};
struct SignupEntry {
ObjectInfo info;
std::string email;
std::string userId;
std::string macAddress;
std::string serialNumber;
uint64_t submitted = 0 ;
uint64_t completed = 0 ;
std::string status;
uint64_t error=0;
uint64_t statusCode=0;
std::string deviceID;
std::string registrationId;
std::string operatorId;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct Variable {
std::string type;
uint64_t weight=0;
std::string prefix;
std::string value;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct VariableList {
std::vector<Variable> variables;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct VariableBlock {
ObjectInfo info;
std::vector<Variable> variables;
std::string entity;
std::string venue;
std::string subscriber;
std::string inventory;
Types::UUIDvec_t configurations;
Types::UUID_t managementPolicy;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct VariableBlockList {
std::vector<VariableBlock> variableBlocks;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct Operator {
ObjectInfo info;
Types::UUID_t managementPolicy;
Types::UUIDvec_t managementRoles;
DeviceRules deviceRules;
std::vector<Variable> variables;
bool defaultOperator=false;
Types::StringVec sourceIP;
std::string registrationId;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct OperatorList {
std::vector<Operator> operators;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct VenueDeviceList {
std::string id;
std::string name;
std::string description;
Types::UUIDvec_t devices;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ServiceClass {
ObjectInfo info;
Types::UUID_t operatorId;
Types::UUID_t managementPolicy;
double cost=0.0;
std::string currency;
std::string period;
std::string billingCode;
std::vector<Variable> variables;
bool defaultService=false;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ServiceClassList {
std::vector<ServiceClass> serviceClasses;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ConfigurationDetails {
DeviceConfigurationElementVec configuration;
std::string rrm{"inherit"};
std::string firmwareUpgrade{"inherit"};
std::string firmwareRCOnly{"inherit"};
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct SubscriberDevice {
ObjectInfo info;
std::string serialNumber;
std::string deviceType;
Types::UUID_t operatorId;
Types::UUID_t subscriberId;
SubLocation location;
SubContact contact;
Types::UUID_t managementPolicy;
Types::UUID_t serviceClass;
std::string qrCode;
std::string geoCode;
DeviceRules deviceRules;
std::string state;
std::string locale;
std::string billingCode;
DeviceConfigurationElementVec configuration;
bool suspended=false;
std::string realMacAddress;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct SubscriberDeviceList {
std::vector<SubscriberDevice> subscriberDevices;
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 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 Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I);
}; };

View File

@@ -95,6 +95,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj, "PortalLogin", PortalLogin_); field_from_json(Obj, "PortalLogin", PortalLogin_);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: AclTemplate" << std::endl;
} }
return false; return false;
} }
@@ -112,6 +113,8 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"userMustChangePassword",userMustChangePassword); field_to_json(Obj,"userMustChangePassword",userMustChangePassword);
field_to_json(Obj,"errorCode", errorCode); field_to_json(Obj,"errorCode", errorCode);
Obj.set("aclTemplate",AclTemplateObj); Obj.set("aclTemplate",AclTemplateObj);
field_to_json(Obj,"errorCode", errorCode);
field_to_json(Obj,"lastRefresh", lastRefresh_);
} }
bool WebToken::from_json(const Poco::JSON::Object::Ptr &Obj) { bool WebToken::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -128,9 +131,10 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj, "created", created_); field_from_json(Obj, "created", created_);
field_from_json(Obj, "username", username_); field_from_json(Obj, "username", username_);
field_from_json(Obj, "userMustChangePassword",userMustChangePassword); field_from_json(Obj, "userMustChangePassword",userMustChangePassword);
field_from_json(Obj,"lastRefresh", lastRefresh_);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: WebToken" << std::endl;
} }
return false; return false;
} }
@@ -141,14 +145,14 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"primary", primary); field_to_json(Obj,"primary", primary);
} }
bool MobilePhoneNumber::from_json(Poco::JSON::Object::Ptr &Obj) { bool MobilePhoneNumber::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"number",number); field_from_json(Obj,"number",number);
field_from_json(Obj,"verified",verified); field_from_json(Obj,"verified",verified);
field_from_json(Obj,"primary",primary); field_from_json(Obj,"primary",primary);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: MobilePhoneNumber" << std::endl;
} }
return false; return false;
}; };
@@ -158,13 +162,13 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"method", method); field_to_json(Obj,"method", method);
} }
bool MfaAuthInfo::from_json(Poco::JSON::Object::Ptr &Obj) { bool MfaAuthInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"enabled",enabled); field_from_json(Obj,"enabled",enabled);
field_from_json(Obj,"method",method); field_from_json(Obj,"method",method);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: MfaAuthInfo" << std::endl;
} }
return false; return false;
} }
@@ -175,14 +179,14 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj, "authenticatorSecret", authenticatorSecret); field_to_json(Obj, "authenticatorSecret", authenticatorSecret);
} }
bool UserLoginLoginExtensions::from_json(Poco::JSON::Object::Ptr &Obj) { bool UserLoginLoginExtensions::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"mobiles",mobiles); field_from_json(Obj, "mobiles",mobiles);
field_from_json(Obj,"mfa",mfa); field_from_json(Obj, "mfa",mfa);
field_from_json(Obj, "authenticatorSecret", authenticatorSecret); field_from_json(Obj, "authenticatorSecret", authenticatorSecret);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: UserLoginLoginExtensions" << std::endl;
} }
return false; return false;
} }
@@ -194,7 +198,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj, "method", method); field_to_json(Obj, "method", method);
} }
bool MFAChallengeRequest::from_json(Poco::JSON::Object::Ptr &Obj) { bool MFAChallengeRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"uuid",uuid); field_from_json(Obj,"uuid",uuid);
field_from_json(Obj,"question",question); field_from_json(Obj,"question",question);
@@ -202,7 +206,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj,"method",method); field_from_json(Obj,"method",method);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: MFAChallengeRequest" << std::endl;
} }
return false; return false;
}; };
@@ -210,16 +214,15 @@ namespace OpenWifi::SecurityObjects {
void MFAChallengeResponse::to_json(Poco::JSON::Object &Obj) const { void MFAChallengeResponse::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "uuid", uuid); field_to_json(Obj, "uuid", uuid);
field_to_json(Obj, "answer", answer); field_to_json(Obj, "answer", answer);
} }
bool MFAChallengeResponse::from_json(Poco::JSON::Object::Ptr &Obj) { bool MFAChallengeResponse::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"uuid",uuid); field_from_json(Obj,"uuid",uuid);
field_from_json(Obj,"answer",answer); field_from_json(Obj,"answer",answer);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: MFAChallengeResponse" << std::endl;
} }
return false; return false;
@@ -257,6 +260,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"oauthType",oauthType); field_to_json(Obj,"oauthType",oauthType);
field_to_json(Obj,"oauthUserInfo",oauthUserInfo); field_to_json(Obj,"oauthUserInfo",oauthUserInfo);
field_to_json(Obj,"modified",modified); field_to_json(Obj,"modified",modified);
field_to_json(Obj,"signingUp",signingUp);
}; };
bool UserInfo::from_json(const Poco::JSON::Object::Ptr &Obj) { bool UserInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -292,13 +296,28 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj,"oauthType",oauthType); field_from_json(Obj,"oauthType",oauthType);
field_from_json(Obj,"oauthUserInfo",oauthUserInfo); field_from_json(Obj,"oauthUserInfo",oauthUserInfo);
field_from_json(Obj,"modified",modified); field_from_json(Obj,"modified",modified);
field_from_json(Obj,"signingUp",signingUp);
return true; return true;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
std::cout << "Cannot parse: UserInfo" << std::endl;
} }
return false; return false;
}; };
void UserInfoList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"users",users);
}
bool UserInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"users",users);
return true;
} catch (...) {
std::cout << "Cannot parse: InternalServiceInfo" << std::endl;
}
return false;
}
void InternalServiceInfo::to_json(Poco::JSON::Object &Obj) const { void InternalServiceInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"privateURI",privateURI); field_to_json(Obj,"privateURI",privateURI);
field_to_json(Obj,"publicURI",publicURI); field_to_json(Obj,"publicURI",publicURI);
@@ -312,7 +331,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj,"token",token); field_from_json(Obj,"token",token);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: InternalServiceInfo" << std::endl;
} }
return false; return false;
}; };
@@ -330,7 +349,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj, "services", services); field_from_json(Obj, "services", services);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: InternalSystemServices" << std::endl;
} }
return false; return false;
}; };
@@ -352,7 +371,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj, "authenticationType", authenticationType); field_from_json(Obj, "authenticationType", authenticationType);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: SystemEndpoint" << std::endl;
} }
return false; return false;
}; };
@@ -366,7 +385,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj, "endpoints", endpoints); field_from_json(Obj, "endpoints", endpoints);
return true; return true;
} catch (...) { } catch (...) {
std::cout << "Cannot parse: SystemEndpointList" << std::endl;
} }
return false; return false;
} }
@@ -385,7 +404,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj, "userInfo", userinfo); field_from_json(Obj, "userInfo", userinfo);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: UserInfoAndPolicy" << std::endl;
} }
return false; return false;
} }
@@ -396,14 +415,14 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"note", note); field_to_json(Obj,"note", note);
} }
bool NoteInfo::from_json(Poco::JSON::Object::Ptr &Obj) { bool NoteInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"created",created); field_from_json(Obj,"created",created);
field_from_json(Obj,"createdBy",createdBy); field_from_json(Obj,"createdBy",createdBy);
field_from_json(Obj,"note",note); field_from_json(Obj,"note", note);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: NoteInfo" << std::endl;
} }
return false; return false;
} }
@@ -414,20 +433,20 @@ namespace OpenWifi::SecurityObjects {
SecurityObjects::NoteInfoVec NIV; SecurityObjects::NoteInfoVec NIV;
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString()); NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString());
for(auto const &i:NIV) { for(auto const &i:NIV) {
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note}; SecurityObjects::NoteInfo ii{.created=(uint64_t)OpenWifi::Now(), .createdBy=UInfo.email, .note=i.note};
Notes.push_back(ii); Notes.push_back(ii);
} }
} }
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: MergeNotes" << std::endl;
} }
return false; return false;
} }
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes) { bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes) {
for(auto const &i:NewNotes) { for(auto const &i:NewNotes) {
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note}; SecurityObjects::NoteInfo ii{.created=(uint64_t)OpenWifi::Now(), .createdBy=UInfo.email, .note=i.note};
ExistingNotes.push_back(ii); ExistingNotes.push_back(ii);
} }
return true; return true;
@@ -438,13 +457,13 @@ namespace OpenWifi::SecurityObjects {
field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString); field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString);
} }
bool ProfileAction::from_json(Poco::JSON::Object::Ptr &Obj) { bool ProfileAction::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"resource",resource); field_from_json(Obj,"resource",resource);
field_from_json<ResourceAccessType>(Obj,"access",access,ResourceAccessTypeFromString ); field_from_json<ResourceAccessType>(Obj,"access",access,ResourceAccessTypeFromString );
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: ProfileAction" << std::endl;
} }
return false; return false;
} }
@@ -458,7 +477,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"notes", notes); field_to_json(Obj,"notes", notes);
} }
bool SecurityProfile::from_json(Poco::JSON::Object::Ptr &Obj) { bool SecurityProfile::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"id",id); field_from_json(Obj,"id",id);
field_from_json(Obj,"name",name); field_from_json(Obj,"name",name);
@@ -468,7 +487,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj,"notes",notes); field_from_json(Obj,"notes",notes);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: SecurityProfile" << std::endl;
} }
return false; return false;
} }
@@ -477,12 +496,12 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj, "profiles", profiles); field_to_json(Obj, "profiles", profiles);
} }
bool SecurityProfileList::from_json(Poco::JSON::Object::Ptr &Obj) { bool SecurityProfileList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"profiles",profiles); field_from_json(Obj,"profiles",profiles);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: SecurityProfileList" << std::endl;
} }
return false; return false;
} }
@@ -503,7 +522,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"userAction",userAction); field_to_json(Obj,"userAction",userAction);
} }
bool ActionLink::from_json(Poco::JSON::Object::Ptr &Obj) { bool ActionLink::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"id",id); field_from_json(Obj,"id",id);
field_from_json(Obj,"action",action); field_from_json(Obj,"action",action);
@@ -520,7 +539,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj,"userAction",userAction); field_from_json(Obj,"userAction",userAction);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: ActionLink" << std::endl;
} }
return false; return false;
} }
@@ -531,14 +550,14 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"data",data); field_to_json(Obj,"data",data);
} }
bool Preferences::from_json(Poco::JSON::Object::Ptr &Obj) { bool Preferences::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"id",id); field_from_json(Obj,"id",id);
field_from_json(Obj,"modified",modified); field_from_json(Obj,"modified",modified);
field_from_json(Obj,"data",data); field_from_json(Obj,"data",data);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: Preferences" << std::endl;
} }
return false; return false;
} }
@@ -550,7 +569,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"email",email); field_to_json(Obj,"email",email);
} }
bool SubMfaConfig::from_json(Poco::JSON::Object::Ptr &Obj) { bool SubMfaConfig::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"id",id); field_from_json(Obj,"id",id);
field_from_json(Obj,"type",type); field_from_json(Obj,"type",type);
@@ -558,7 +577,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj,"email",email); field_from_json(Obj,"email",email);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: SubMfaConfig" << std::endl;
} }
return false; return false;
} }
@@ -572,9 +591,10 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"expires",expires); field_to_json(Obj,"expires",expires);
field_to_json(Obj,"idleTimeout",idleTimeout); field_to_json(Obj,"idleTimeout",idleTimeout);
field_to_json(Obj,"revocationDate",revocationDate); field_to_json(Obj,"revocationDate",revocationDate);
field_to_json(Obj,"lastRefresh", lastRefresh);
} }
bool Token::from_json(Poco::JSON::Object::Ptr &Obj) { bool Token::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj,"token",token); field_from_json(Obj,"token",token);
field_from_json(Obj,"refreshToken",refreshToken); field_from_json(Obj,"refreshToken",refreshToken);
@@ -584,9 +604,10 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj,"expires",expires); field_from_json(Obj,"expires",expires);
field_from_json(Obj,"idleTimeout",idleTimeout); field_from_json(Obj,"idleTimeout",idleTimeout);
field_from_json(Obj,"revocationDate",revocationDate); field_from_json(Obj,"revocationDate",revocationDate);
field_from_json(Obj,"lastRefresh", lastRefresh);
return true; return true;
} catch(...) { } catch(...) {
std::cout << "Cannot parse: Token" << std::endl;
} }
return false; return false;
} }

View File

@@ -9,14 +9,16 @@
#pragma once #pragma once
#include <string> #include <string>
#include <type_traits>
#include "framework/OpenWifiTypes.h" #include "framework/OpenWifiTypes.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "Poco/Data/LOB.h" #include "Poco/Data/LOB.h"
#include "Poco/Data/LOBStream.h" #include "Poco/Data/LOBStream.h"
namespace OpenWifi { namespace OpenWifi {
uint64_t Now();
namespace SecurityObjects { namespace SecurityObjects {
typedef std::string USER_ID_TYPE; typedef std::string USER_ID_TYPE;
struct AclTemplate { struct AclTemplate {
@@ -26,8 +28,13 @@ namespace OpenWifi {
bool Delete_ = true; bool Delete_ = true;
bool PortalLogin_ = true; bool PortalLogin_ = true;
AclTemplate() noexcept = default;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); }; bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
static_assert( std::is_nothrow_move_constructible_v<AclTemplate> );
struct WebToken { struct WebToken {
std::string access_token_; std::string access_token_;
@@ -41,6 +48,7 @@ namespace OpenWifi {
uint64_t idle_timeout_=0; uint64_t idle_timeout_=0;
AclTemplate acl_template_; AclTemplate acl_template_;
uint64_t created_=0; uint64_t created_=0;
uint64_t lastRefresh_=0;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -54,11 +62,12 @@ namespace OpenWifi {
std::string UserTypeToString(USER_ROLE U); std::string UserTypeToString(USER_ROLE U);
struct NoteInfo { struct NoteInfo {
uint64_t created = std::time(nullptr); uint64_t created=0; // = OpenWifi::Now();
std::string createdBy; std::string createdBy;
std::string note; std::string note;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
typedef std::vector<NoteInfo> NoteInfoVec; typedef std::vector<NoteInfo> NoteInfoVec;
@@ -68,7 +77,7 @@ namespace OpenWifi {
bool primary = false; bool primary = false;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct MfaAuthInfo { struct MfaAuthInfo {
@@ -76,7 +85,7 @@ namespace OpenWifi {
std::string method; std::string method;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct UserLoginLoginExtensions { struct UserLoginLoginExtensions {
@@ -85,17 +94,17 @@ namespace OpenWifi {
std::string authenticatorSecret; std::string authenticatorSecret;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct MFAChallengeRequest { struct MFAChallengeRequest {
std::string uuid; std::string uuid;
std::string question; std::string question;
std::string method; std::string method;
uint64_t created = std::time(nullptr); uint64_t created = OpenWifi::Now();
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct MFAChallengeResponse { struct MFAChallengeResponse {
@@ -103,7 +112,7 @@ namespace OpenWifi {
std::string answer; std::string answer;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct UserInfo { struct UserInfo {
@@ -138,12 +147,20 @@ namespace OpenWifi {
std::string oauthType; std::string oauthType;
std::string oauthUserInfo; std::string oauthUserInfo;
uint64_t modified; uint64_t modified;
std::string signingUp;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
typedef std::vector<UserInfo> UserInfoVec; typedef std::vector<UserInfo> UserInfoVec;
struct UserInfoList {
std::vector<UserInfo> users;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
// bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes); // bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes); bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes); bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes);
@@ -207,7 +224,7 @@ namespace OpenWifi {
std::string resource; std::string resource;
ResourceAccessType access; ResourceAccessType access;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
typedef std::vector<ProfileAction> ProfileActionVec; typedef std::vector<ProfileAction> ProfileActionVec;
@@ -219,21 +236,22 @@ namespace OpenWifi {
std::string role; std::string role;
NoteInfoVec notes; NoteInfoVec notes;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
typedef std::vector<SecurityProfile> SecurityProfileVec; typedef std::vector<SecurityProfile> SecurityProfileVec;
struct SecurityProfileList { struct SecurityProfileList {
SecurityProfileVec profiles; SecurityProfileVec profiles;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
enum LinkActions { enum LinkActions {
FORGOT_PASSWORD=1, FORGOT_PASSWORD=1,
VERIFY_EMAIL, VERIFY_EMAIL,
SUB_FORGOT_PASSWORD, SUB_FORGOT_PASSWORD,
SUB_VERIFY_EMAIL SUB_VERIFY_EMAIL,
SUB_SIGNUP
}; };
struct ActionLink { struct ActionLink {
@@ -245,14 +263,14 @@ namespace OpenWifi {
std::string locale; std::string locale;
std::string message; std::string message;
uint64_t sent=0; uint64_t sent=0;
uint64_t created=std::time(nullptr); uint64_t created=OpenWifi::Now();
uint64_t expires=0; uint64_t expires=0;
uint64_t completed=0; uint64_t completed=0;
uint64_t canceled=0; uint64_t canceled=0;
bool userAction=true; bool userAction=true;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct Preferences { struct Preferences {
@@ -260,7 +278,7 @@ namespace OpenWifi {
uint64_t modified; uint64_t modified;
Types::StringPairVec data; Types::StringPairVec data;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct SubMfaConfig { struct SubMfaConfig {
@@ -270,7 +288,7 @@ namespace OpenWifi {
std::string email; std::string email;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct Token { struct Token {
@@ -282,9 +300,10 @@ namespace OpenWifi {
uint64_t expires=0; uint64_t expires=0;
uint64_t idleTimeout=0; uint64_t idleTimeout=0;
uint64_t revocationDate=0; uint64_t revocationDate=0;
uint64_t lastRefresh=0;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct Avatar { struct Avatar {
@@ -292,7 +311,7 @@ namespace OpenWifi {
std::string type; std::string type;
uint64_t created=0; uint64_t created=0;
std::string name; std::string name;
Poco::Data::LOB<char> avatar; Poco::Data::BLOB avatar;
}; };
struct LoginRecordInfo { struct LoginRecordInfo {

View File

@@ -280,6 +280,7 @@ namespace OpenWifi::SubObjects {
field_to_json(Obj, "ipv6", ipv6); field_to_json(Obj, "ipv6", ipv6);
field_to_json(Obj, "tx", tx); field_to_json(Obj, "tx", tx);
field_to_json(Obj, "rx", rx); field_to_json(Obj, "rx", rx);
field_to_json(Obj, "manufacturer", manufacturer);
} }
bool Association::from_json(const Poco::JSON::Object::Ptr &Obj) { bool Association::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -293,6 +294,7 @@ namespace OpenWifi::SubObjects {
field_from_json(Obj, "ipv6", ipv6); field_from_json(Obj, "ipv6", ipv6);
field_from_json(Obj, "tx", tx); field_from_json(Obj, "tx", tx);
field_from_json(Obj, "rx", rx); field_from_json(Obj, "rx", rx);
field_from_json(Obj, "manufacturer", manufacturer);
return true; return true;
} catch (...) { } catch (...) {
} }
@@ -324,6 +326,7 @@ namespace OpenWifi::SubObjects {
field_to_json(Obj, "ipv6", ipv6); field_to_json(Obj, "ipv6", ipv6);
field_to_json(Obj, "tx", tx); field_to_json(Obj, "tx", tx);
field_to_json(Obj, "rx", rx); field_to_json(Obj, "rx", rx);
field_to_json(Obj, "manufacturer", manufacturer);
} }
bool Client::from_json(const Poco::JSON::Object::Ptr &Obj) { bool Client::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -335,6 +338,7 @@ namespace OpenWifi::SubObjects {
field_from_json(Obj, "ipv6", ipv6); field_from_json(Obj, "ipv6", ipv6);
field_from_json(Obj, "tx", tx); field_from_json(Obj, "tx", tx);
field_from_json(Obj, "rx", rx); field_from_json(Obj, "rx", rx);
field_from_json(Obj, "manufacturer", manufacturer);
return true; return true;
} catch (...) { } catch (...) {
} }
@@ -433,6 +437,8 @@ namespace OpenWifi::SubObjects {
field_to_json(Obj, "rates", rates); field_to_json(Obj, "rates", rates);
field_to_json(Obj, "he", he); field_to_json(Obj, "he", he);
field_to_json(Obj, "rawInfo", rawInfo); field_to_json(Obj, "rawInfo", rawInfo);
field_to_json(Obj, "allowDFS", allowDFS);
field_to_json(Obj, "mimo", mimo);
} }
bool RadioInformation::from_json(const Poco::JSON::Object::Ptr &Obj) { bool RadioInformation::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -452,6 +458,8 @@ namespace OpenWifi::SubObjects {
field_from_json(Obj, "rates", rates); field_from_json(Obj, "rates", rates);
field_from_json(Obj, "he", he); field_from_json(Obj, "he", he);
field_from_json(Obj, "rawInfo", rawInfo); field_from_json(Obj, "rawInfo", rawInfo);
field_from_json(Obj, "allowDFS", allowDFS);
field_from_json(Obj, "mimo", mimo);
return true; return true;
} catch (...) { } catch (...) {
} }
@@ -461,6 +469,7 @@ namespace OpenWifi::SubObjects {
void AccessPoint::to_json(Poco::JSON::Object &Obj) const { void AccessPoint::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "id", id); field_to_json(Obj, "id", id);
field_to_json(Obj, "macAddress", macAddress); field_to_json(Obj, "macAddress", macAddress);
field_to_json(Obj, "serialNumber", serialNumber);
field_to_json(Obj, "name", name); field_to_json(Obj, "name", name);
field_to_json(Obj, "deviceType", deviceType); field_to_json(Obj, "deviceType", deviceType);
field_to_json(Obj, "subscriberDevices", subscriberDevices); field_to_json(Obj, "subscriberDevices", subscriberDevices);
@@ -473,12 +482,19 @@ namespace OpenWifi::SubObjects {
field_to_json(Obj, "radios", radios); field_to_json(Obj, "radios", radios);
field_to_json(Obj, "automaticUpgrade", automaticUpgrade); field_to_json(Obj, "automaticUpgrade", automaticUpgrade);
field_to_json(Obj, "configurationUUID", configurationUUID); field_to_json(Obj, "configurationUUID", configurationUUID);
field_to_json(Obj, "currentFirmware", currentFirmware);
field_to_json(Obj, "currentFirmwareDate", currentFirmwareDate);
field_to_json(Obj, "latestFirmware", latestFirmware);
field_to_json(Obj, "latestFirmwareDate", latestFirmwareDate);
field_to_json(Obj, "newFirmwareAvailable", newFirmwareAvailable);
field_to_json(Obj, "latestFirmwareURI", latestFirmwareURI);
} }
bool AccessPoint::from_json(const Poco::JSON::Object::Ptr &Obj) { bool AccessPoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
try { try {
field_from_json(Obj, "id", id); field_from_json(Obj, "id", id);
field_from_json(Obj, "macAddress", macAddress); field_from_json(Obj, "macAddress", macAddress);
field_from_json(Obj, "serialNumber", serialNumber);
field_from_json(Obj, "name", name); field_from_json(Obj, "name", name);
field_from_json(Obj, "deviceType", deviceType); field_from_json(Obj, "deviceType", deviceType);
field_from_json(Obj, "subscriberDevices", subscriberDevices); field_from_json(Obj, "subscriberDevices", subscriberDevices);
@@ -491,6 +507,12 @@ namespace OpenWifi::SubObjects {
field_from_json(Obj, "radios", radios); field_from_json(Obj, "radios", radios);
field_from_json(Obj, "automaticUpgrade", automaticUpgrade); field_from_json(Obj, "automaticUpgrade", automaticUpgrade);
field_from_json(Obj, "configurationUUID", configurationUUID); field_from_json(Obj, "configurationUUID", configurationUUID);
field_from_json(Obj, "currentFirmware", currentFirmware);
field_from_json(Obj, "currentFirmwareDate", currentFirmwareDate);
field_from_json(Obj, "latestFirmware", latestFirmware);
field_from_json(Obj, "latestFirmwareDate", latestFirmwareDate);
field_from_json(Obj, "newFirmwareAvailable", newFirmwareAvailable);
field_from_json(Obj, "latestFirmwareURI", latestFirmwareURI);
return true; return true;
} catch (...) { } catch (...) {
} }
@@ -544,4 +566,38 @@ namespace OpenWifi::SubObjects {
} }
return false; return false;
} }
void StatsEntry::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "timestamp", timestamp);
field_to_json(Obj, "tx", tx);
field_to_json(Obj, "rx", rx);
}
bool StatsEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "timestamp", timestamp);
field_from_json(Obj, "tx", tx);
field_from_json(Obj, "rx", rx);
return true;
} catch (...) {
}
return false;
}
void StatsBlock::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "modified", modified);
field_to_json(Obj, "external", external);
field_to_json(Obj, "internal", internal);
}
bool StatsBlock::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "modified", modified);
field_from_json(Obj, "external", external);
field_from_json(Obj, "internal", internal);
return true;
} catch (...) {
}
return false;
}
} }

View File

@@ -24,6 +24,7 @@ namespace OpenWifi::SubObjects {
int subnetMaskV6=0; int subnetMaskV6=0;
std::string startIPV6; std::string startIPV6;
std::string endIPV6; std::string endIPV6;
std::string leaseTime;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -156,6 +157,7 @@ namespace OpenWifi::SubObjects {
std::string ipv6; std::string ipv6;
uint64_t tx=0; uint64_t tx=0;
uint64_t rx=0; uint64_t rx=0;
std::string manufacturer;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -178,6 +180,7 @@ namespace OpenWifi::SubObjects {
std::string ipv6; std::string ipv6;
uint64_t tx=0; uint64_t tx=0;
uint64_t rx=0; uint64_t rx=0;
std::string manufacturer;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -238,6 +241,8 @@ namespace OpenWifi::SubObjects {
uint64_t maximumClients = 64; uint64_t maximumClients = 64;
RadioRates rates; RadioRates rates;
RadioHE he; RadioHE he;
bool allowDFS=false;
std::string mimo;
std::vector<std::string> rawInfo; std::vector<std::string> rawInfo;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
@@ -247,6 +252,7 @@ namespace OpenWifi::SubObjects {
struct AccessPoint { struct AccessPoint {
std::string id; std::string id;
std::string macAddress; std::string macAddress;
std::string serialNumber;
std::string name; std::string name;
std::string deviceType; std::string deviceType;
SubscriberDeviceList subscriberDevices; SubscriberDeviceList subscriberDevices;
@@ -259,6 +265,12 @@ namespace OpenWifi::SubObjects {
std::vector<RadioInformation> radios; std::vector<RadioInformation> radios;
bool automaticUpgrade = true; bool automaticUpgrade = true;
std::string configurationUUID; std::string configurationUUID;
std::string currentFirmware;
uint64_t currentFirmwareDate;
std::string latestFirmware;
uint64_t latestFirmwareDate;
bool newFirmwareAvailable;
std::string latestFirmwareURI;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
@@ -288,6 +300,23 @@ namespace OpenWifi::SubObjects {
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
struct StatsEntry {
uint64_t timestamp=0;
uint64_t tx=0;
uint64_t rx=0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct StatsBlock {
uint64_t modified=0;
std::vector<StatsEntry> external, internal;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
} }
#endif //OWSUB_RESTAPI_SUBOBJECTS_H #endif //OWSUB_RESTAPI_SUBOBJECTS_H

View File

@@ -8,7 +8,7 @@
namespace OpenWifi::SDK::GW { namespace OpenWifi::SDK::GW {
bool SendFirmwareUpgradeCommand( const std::string & serialNumber, const std::string & URI, uint64_t When ) { bool SendFirmwareUpgradeCommand( const std::string & serialNumber, const std::string & URI, [[maybe_unused]] uint64_t When ) {
Types::StringPairVec QueryData; Types::StringPairVec QueryData;
Poco::JSON::Object Body; Poco::JSON::Object Body;

View File

@@ -11,6 +11,7 @@
namespace OpenWifi { namespace OpenWifi {
int Storage::Start() { int Storage::Start() {
poco_information(Logger(),"Starting...");
std::lock_guard Guard(Mutex_); std::lock_guard Guard(Mutex_);
StorageClass::Start(); StorageClass::Start();
@@ -27,9 +28,10 @@ namespace OpenWifi {
} }
void Storage::Stop() { void Storage::Stop() {
poco_information(Logger(),"Stopping...");
std::lock_guard Guard(Mutex_); std::lock_guard Guard(Mutex_);
Logger().notice("Stopping.");
StorageClass::Stop(); StorageClass::Stop();
poco_information(Logger(),"Stopped...");
} }
std::string Storage::TrimRevision(const std::string &R) { std::string Storage::TrimRevision(const std::string &R) {

File diff suppressed because it is too large Load Diff

View File

@@ -14,9 +14,8 @@ namespace OpenWifi {
class ConfigurationValidator : public SubSystemServer { class ConfigurationValidator : public SubSystemServer {
public: public:
static ConfigurationValidator *instance() { static auto instance() {
if(instance_== nullptr) static auto instance_ = new ConfigurationValidator;
instance_ = new ConfigurationValidator;
return instance_; return instance_;
} }
@@ -27,18 +26,17 @@ namespace OpenWifi {
void reinitialize(Poco::Util::Application &self) override; void reinitialize(Poco::Util::Application &self) override;
private: private:
static ConfigurationValidator * instance_;
bool Initialized_=false; bool Initialized_=false;
bool Working_=false; bool Working_=false;
void Init(); void Init();
std::unique_ptr<json_validator> Validator_=std::make_unique<json_validator>(nullptr, my_format_checker); nlohmann::json RootSchema_;
ConfigurationValidator(): ConfigurationValidator():
SubSystemServer("configvalidator", "CFG-VALIDATOR", "config.validator") { SubSystemServer("configvalidator", "CFG-VALIDATOR", "config.validator") {
} }
}; };
inline ConfigurationValidator * ConfigurationValidator() { return ConfigurationValidator::instance(); } inline auto ConfigurationValidator() { return ConfigurationValidator::instance(); }
inline bool ValidateUCentralConfiguration(const std::string &C, std::string &Error) { return ConfigurationValidator::instance()->Validate(C, Error); } inline bool ValidateUCentralConfiguration(const std::string &C, std::string &Error) { return ConfigurationValidator::instance()->Validate(C, Error); }
} }

View File

@@ -18,6 +18,7 @@ namespace OpenWifi::KafkaTopics {
static const std::string SERVICE_EVENTS{"service_events"}; static const std::string SERVICE_EVENTS{"service_events"};
static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"}; static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"};
static const std::string DEVICE_TELEMETRY{"device_telemetry"}; static const std::string DEVICE_TELEMETRY{"device_telemetry"};
static const std::string PROVISIONING_CHANGE{"provisioning_change"};
namespace ServiceEvents { namespace ServiceEvents {
static const std::string EVENT_JOIN{"join"}; static const std::string EVENT_JOIN{"join"};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,169 @@
//
// Created by stephane bourque on 2022-09-29.
//
#pragma once
#include "fmt/format.h"
#include "Poco/Util/Application.h"
#include "Poco/ErrorHandler.h"
#include "Poco/Net/NetException.h"
#include "Poco/Net/SSLException.h"
#include "Poco/JSON/Template.h"
#include "Poco/Thread.h"
namespace OpenWifi {
class MicroServiceErrorHandler : public Poco::ErrorHandler {
public:
explicit MicroServiceErrorHandler(Poco::Util::Application &App) : App_(App) {
}
inline void exception(const Poco::Exception & Base) override {
try {
if(Poco::Thread::current()!= nullptr) {
t_name = Poco::Thread::current()->getName();
t_id = Poco::Thread::current()->id();
} else {
t_name = "startup_code";
t_id = 0;
}
App_.logger().log(Base);
Base.rethrow();
} catch (const Poco::Net::InvalidCertificateException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::InvalidCertificateException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::InvalidSocketException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::InvalidSocketException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::WebSocketException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::WebSocketException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::ConnectionResetException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::ConnectionResetException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::CertificateValidationException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::CertificateValidationException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::SSLConnectionUnexpectedlyClosedException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::SSLConnectionUnexpectedlyClosedException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::SSLContextException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::SSLContextException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::SSLException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::SSLException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::InvalidAddressException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::InvalidAddressException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Net::NetException &E) {
poco_error(App_.logger(), fmt::format("Poco::Net::NetException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::IOException &E) {
poco_error(App_.logger(), fmt::format("Poco::IOException 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(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::JSON::JSONTemplateException &E) {
poco_error(App_.logger(), fmt::format("Poco::JSON::JSONTemplateException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::JSON::JSONException &E) {
poco_error(App_.logger(), fmt::format("Poco::JSON::JSONException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::ApplicationException &E) {
poco_error(App_.logger(), fmt::format("Poco::ApplicationException thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (const Poco::Exception &E) {
poco_error(App_.logger(), fmt::format("Poco::Exception thr_name={} thr_id={} code={} text={} msg={} what={}",
t_name, t_id, E.code(),
E.displayText(),
E.message(),
E.what()));
} catch (...) {
poco_error(App_.logger(), fmt::format("Poco:Generic thr_name={}",t_name, t_id));
}
}
inline void exception(const std::exception & E) override {
if(Poco::Thread::current()!= nullptr) {
t_name = Poco::Thread::current()->getName();
t_id = Poco::Thread::current()->id();
} else {
t_name = "startup_code";
t_id = 0;
}
poco_warning(App_.logger(), fmt::format("std::exception in {}: {} thr_id={}",
t_name,E.what(),
t_id));
}
inline void exception() override {
if(Poco::Thread::current()!= nullptr) {
t_name = Poco::Thread::current()->getName();
t_id = Poco::Thread::current()->id();
} else {
t_name = "startup_code";
t_id = 0;
}
poco_warning(App_.logger(), fmt::format("generic exception in {} thr_id={}",
t_name, t_id));
}
private:
Poco::Util::Application &App_;
std::string t_name;
int t_id=0;
};
}

View File

@@ -1,68 +0,0 @@
//
// Created by stephane bourque on 2021-09-12.
//
#pragma once
namespace OpenWifi::RESTAPI::Errors {
static const std::string MissingUUID{"Missing UUID."};
static const std::string MissingSerialNumber{"Missing Serial Number."};
static const std::string InternalError{"Internal error. Please try later."};
static const std::string InvalidJSONDocument{"Invalid JSON document."};
static const std::string UnsupportedHTTPMethod{"Unsupported HTTP Method"};
static const std::string StillInUse{"Element still in use."};
static const std::string CouldNotBeDeleted{"Element could not be deleted."};
static const std::string NameMustBeSet{"The name property must be set."};
static const std::string ConfigBlockInvalid{"Configuration block type invalid."};
static const std::string UnknownId{"Unknown UUID."};
static const std::string InvalidDeviceTypes{"Unknown or invalid device type(s)."};
static const std::string RecordNotCreated{"Record could not be created."};
static const std::string RecordNotUpdated{"Record could not be updated."};
static const std::string UnknownManagementPolicyUUID{"Unknown management policy UUID."};
static const std::string CannotDeleteRoot{"Root Entity cannot be removed, only modified."};
static const std::string MustCreateRootFirst{"Root entity must be created first."};
static const std::string ParentUUIDMustExist{"Parent UUID must exist."};
static const std::string ConfigurationMustExist{"Configuration must exist."};
static const std::string MissingOrInvalidParameters{"Invalid or missing parameters."};
static const std::string UnknownSerialNumber{"Unknown Serial Number."};
static const std::string InvalidSerialNumber{"Invalid Serial Number."};
static const std::string SerialNumberExists{"Serial Number already exists."};
static const std::string ValidNonRootUUID{"Must be a non-root, and valid UUID."};
static const std::string VenueMustExist{"Venue does not exist."};
static const std::string NotBoth{"You cannot specify both Entity and Venue"};
static const std::string EntityMustExist{"Entity must exist."};
static const std::string ParentOrEntityMustBeSet{"Parent or Entity must be set."};
static const std::string ContactMustExist{"Contact must exist."};
static const std::string LocationMustExist{"Location must exist."};
static const std::string OnlyWSSupported{"This endpoint only supports WebSocket."};
static const std::string SerialNumberMismatch{"Serial Number mismatch."};
static const std::string InvalidCommand{"Invalid command."};
static const std::string NoRecordsDeleted{"No records deleted."};
static const std::string DeviceNotConnected{"Device is not currently connected."};
static const std::string CannotCreateWS{"Telemetry system could not create WS endpoint. Please try again."};
static const std::string BothDeviceTypeRevision{"Both deviceType and revision must be set."};
static const std::string IdOrSerialEmpty{"SerialNumber and Id must not be empty."};
static const std::string MissingUserID{"Missing user ID."};
static const std::string IdMustBe0{"To create a user, you must set the ID to 0"};
static const std::string InvalidUserRole{"Invalid userRole."};
static const std::string InvalidEmailAddress{"Invalid email address."};
static const std::string PasswordRejected{"Password was rejected. This maybe an old password."};
static const std::string InvalidIPRanges{"Invalid IP range specifications."};
static const std::string InvalidLOrderBy{"Invalid orderBy specification."};
static const std::string NeedMobileNumber{"You must provide at least one validated phone number."};
static const std::string BadMFAMethod{"MFA only supports sms or email."};
static const std::string InvalidCredentials{"Invalid credentials (username/password)."};
static const std::string InvalidPassword{"Password does not conform to basic password rules."};
static const std::string UserPendingVerification{"User access denied pending email verification."};
static const std::string PasswordMustBeChanged{"Password must be changed."};
static const std::string UnrecognizedRequest{"Ill-formed request. Please consult documentation."};
static const std::string MissingAuthenticationInformation{"Missing authentication information."};
static const std::string InsufficientAccessRights{"Insufficient access rights to complete the operation."};
static const std::string ExpiredToken{"Token has expired, user must login."};
static const std::string SubscriberMustExist{"Subscriber must exist."};
static const std::string AuthenticatorVerificationIncomplete{"Authenticator validation is not complete."};
static const std::string SMSCouldNotBeSentRetry{"SMS could not be sent to validate device, try later or change the phone number."};
static const std::string SMSCouldNotValidate{"Code and number could not be validated"};
static const std::string InvalidDeviceClass{"Invalid device class. Must be: any, venue, entity, or subscriber"};
}

View File

@@ -1,139 +0,0 @@
//
// License type: BSD 3-Clause License
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
//
// Created by Stephane Bourque on 2021-03-04.
// Arilia Wireless Inc.
//
#pragma once
namespace OpenWifi::RESTAPI::Protocol {
static const char * CAPABILITIES = "capabilities";
static const char * LOGS = "logs";
static const char * HEALTHCHECKS = "healthchecks";
static const char * STATISTICS = "statistics";
static const char * STATUS = "status";
static const char * SERIALNUMBER = "serialNumber";
static const char * PERFORM = "perform";
static const char * CONFIGURE = "configure";
static const char * UPGRADE = "upgrade";
static const char * REBOOT = "reboot";
static const char * FACTORY = "factory";
static const char * LEDS = "leds";
static const char * TRACE = "trace";
static const char * REQUEST = "request";
static const char * WIFISCAN = "wifiscan";
static const char * EVENTQUEUE = "eventqueue";
static const char * RTTY = "rtty";
static const char * COMMAND = "command";
static const char * STARTDATE = "startDate";
static const char * ENDDATE = "endDate";
static const char * OFFSET = "offset";
static const char * LIMIT = "limit";
static const char * LIFETIME = "lifetime";
static const char * UUID = "UUID";
static const char * DATA = "data";
static const char * CONFIGURATION = "configuration";
static const char * WHEN = "when";
static const char * URI = "uri";
static const char * LOGTYPE = "logType";
static const char * VALUES = "values";
static const char * TYPES = "types";
static const char * PAYLOAD = "payload";
static const char * KEEPREDIRECTOR = "keepRedirector";
static const char * NETWORK = "network";
static const char * INTERFACE = "interface";
static const char * BANDS = "bands";
static const char * CHANNELS = "channels";
static const char * VERBOSE = "verbose";
static const char * MESSAGE = "message";
static const char * STATE = "state";
static const char * HEALTHCHECK = "healthcheck";
static const char * PCAP_FILE_TYPE = "pcap";
static const char * DURATION = "duration";
static const char * NUMBEROFPACKETS = "numberOfPackets";
static const char * FILTER = "filter";
static const char * SELECT = "select";
static const char * SERIALONLY = "serialOnly";
static const char * COUNTONLY = "countOnly";
static const char * DEVICEWITHSTATUS = "deviceWithStatus";
static const char * DEVICESWITHSTATUS = "devicesWithStatus";
static const char * DEVICES = "devices";
static const char * COUNT = "count";
static const char * SERIALNUMBERS = "serialNumbers";
static const char * CONFIGURATIONS = "configurations";
static const char * NAME = "name";
static const char * COMMANDS = "commands";
static const char * COMMANDUUID = "commandUUID";
static const char * FIRMWARES = "firmwares";
static const char * TOPIC = "topic";
static const char * HOST = "host";
static const char * OS = "os";
static const char * HOSTNAME = "hostname";
static const char * PROCESSORS = "processors";
static const char * REASON = "reason";
static const char * RELOAD = "reload";
static const char * SUBSYSTEMS = "subsystems";
static const char * FILEUUID = "uuid";
static const char * USERID = "userId";
static const char * PASSWORD = "password";
static const char * TOKEN = "token";
static const char * SETLOGLEVEL = "setloglevel";
static const char * GETLOGLEVELS = "getloglevels";
static const char * GETSUBSYSTEMNAMES = "getsubsystemnames";
static const char * GETLOGLEVELNAMES = "getloglevelnames";
static const char * STATS = "stats";
static const char * PING = "ping";
static const char * PARAMETERS = "parameters";
static const char * VALUE = "value";
static const char * LASTONLY = "lastOnly";
static const char * NEWEST = "newest";
static const char * ACTIVESCAN = "activeScan";
static const char * OVERRIDEDFS = "override_dfs";
static const char * LIST = "list";
static const char * TAG = "tag";
static const char * TAGLIST = "tagList";
static const char * DESCRIPTION = "description";
static const char * NOTES = "notes";
static const char * DEVICETYPE = "deviceType";
static const char * REVISION = "revision";
static const char * AGES = "ages";
static const char * REVISIONS = "revisions";
static const char * DEVICETYPES = "deviceTypes";
static const char * LATESTONLY = "latestOnly";
static const char * IDONLY = "idOnly";
static const char * REVISIONSET = "revisionSet";
static const char * DEVICESET = "deviceSet";
static const char * HISTORY = "history";
static const char * ID = "id";
static const char * VERSION = "version";
static const char * TIMES = "times";
static const char * UPTIME = "uptime";
static const char * START = "start";
static const char * NEWPASSWORD = "newPassword";
static const char * USERS = "users";
static const char * WITHEXTENDEDINFO = "withExtendedInfo";
static const char * ERRORTEXT = "errorText";
static const char * ERRORCODE = "errorCode";
static const char * AVATARID = "avatarId";
static const char * UNNAMED = "(unnamed)";
static const char * UNSPECIFIED = "(unspecified)";
static const char * CONTENTDISPOSITION = "Content-Disposition";
static const char * CONTENTTYPE = "Content-Type";
static const char * REQUIREMENTS = "requirements";
static const char * PASSWORDPATTERN = "passwordPattern";
static const char * ACCESSPOLICY = "accessPolicy";
static const char * PASSWORDPOLICY = "passwordPolicy";
static const char * FORGOTPASSWORD = "forgotPassword";
static const char * RESENDMFACODE = "resendMFACode";
static const char * COMPLETEMFACHALLENGE = "completeMFAChallenge";
static const char * ME = "me";
static const char * TELEMETRY = "telemetry";
static const char * INTERVAL = "interval";
static const char * UI = "UI";
}

View File

@@ -33,7 +33,6 @@ namespace OpenWifi {
int Start() override { int Start() override {
std::lock_guard Guard(Mutex_); std::lock_guard Guard(Mutex_);
Logger().setLevel(Poco::Message::PRIO_INFORMATION);
Logger().notice("Starting."); Logger().notice("Starting.");
std::string DBType = MicroService::instance().ConfigGetString("storage.type"); std::string DBType = MicroService::instance().ConfigGetString("storage.type");
@@ -51,13 +50,14 @@ namespace OpenWifi {
Pool_->shutdown(); Pool_->shutdown();
} }
DBType Type() const { return dbType_; };
private: private:
inline int Setup_SQLite(); inline int Setup_SQLite();
inline int Setup_MySQL(); inline int Setup_MySQL();
inline int Setup_PostgreSQL(); inline int Setup_PostgreSQL();
protected: protected:
Poco::SharedPtr<Poco::Data::SessionPool> Pool_; std::unique_ptr<Poco::Data::SessionPool> Pool_;
Poco::Data::SQLite::Connector SQLiteConn_; Poco::Data::SQLite::Connector SQLiteConn_;
Poco::Data::PostgreSQL::Connector PostgresConn_; Poco::Data::PostgreSQL::Connector PostgresConn_;
Poco::Data::MySQL::Connector MySQLConn_; Poco::Data::MySQL::Connector MySQLConn_;
@@ -73,18 +73,22 @@ namespace OpenWifi {
Logger().notice("SQLite StorageClass enabled."); Logger().notice("SQLite StorageClass enabled.");
dbType_ = sqlite; dbType_ = sqlite;
auto DBName = MicroService::instance().DataDir() + "/" + MicroService::instance().ConfigGetString("storage.type.sqlite.db"); auto DBName = MicroService::instance().DataDir() + "/" + MicroService::instance().ConfigGetString("storage.type.sqlite.db");
auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.sqlite.maxsessions", 64); int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.sqlite.maxsessions", 64);
auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.sqlite.idletime", 60); int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.sqlite.idletime", 60);
SQLiteConn_.registerConnector();
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 4, NumSessions, IdleTime)); Poco::Data::SQLite::Connector::registerConnector();
// Pool_ = std::make_unique<Poco::Data::SessionPool>(new Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 8,
// (int)NumSessions, (int)IdleTime));
Pool_ = std::make_unique<Poco::Data::SessionPool>(SQLiteConn_.name(), DBName, 8,
(int)NumSessions, (int)IdleTime);
return 0; return 0;
} }
inline int StorageClass::Setup_MySQL() { inline int StorageClass::Setup_MySQL() {
Logger().notice("MySQL StorageClass enabled."); Logger().notice("MySQL StorageClass enabled.");
dbType_ = mysql; dbType_ = mysql;
auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.mysql.maxsessions", 64); int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.mysql.maxsessions", 64);
auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.mysql.idletime", 60); int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.mysql.idletime", 60);
auto Host = MicroService::instance().ConfigGetString("storage.type.mysql.host"); auto Host = MicroService::instance().ConfigGetString("storage.type.mysql.host");
auto Username = MicroService::instance().ConfigGetString("storage.type.mysql.username"); auto Username = MicroService::instance().ConfigGetString("storage.type.mysql.username");
auto Password = MicroService::instance().ConfigGetString("storage.type.mysql.password"); auto Password = MicroService::instance().ConfigGetString("storage.type.mysql.password");
@@ -99,8 +103,8 @@ namespace OpenWifi {
";port=" + Port + ";port=" + Port +
";compress=true;auto-reconnect=true"; ";compress=true;auto-reconnect=true";
MySQLConn_.registerConnector(); Poco::Data::MySQL::Connector::registerConnector();
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(MySQLConn_.name(), ConnectionStr, 4, NumSessions, IdleTime)); Pool_ = std::make_unique<Poco::Data::SessionPool>(MySQLConn_.name(), ConnectionStr, 8, NumSessions, IdleTime);
return 0; return 0;
} }
@@ -108,8 +112,8 @@ namespace OpenWifi {
inline int StorageClass::Setup_PostgreSQL() { inline int StorageClass::Setup_PostgreSQL() {
Logger().notice("PostgreSQL StorageClass enabled."); Logger().notice("PostgreSQL StorageClass enabled.");
dbType_ = pgsql; dbType_ = pgsql;
auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.postgresql.maxsessions", 64); int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.postgresql.maxsessions", 64);
auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.postgresql.idletime", 60); int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.postgresql.idletime", 60);
auto Host = MicroService::instance().ConfigGetString("storage.type.postgresql.host"); auto Host = MicroService::instance().ConfigGetString("storage.type.postgresql.host");
auto Username = MicroService::instance().ConfigGetString("storage.type.postgresql.username"); auto Username = MicroService::instance().ConfigGetString("storage.type.postgresql.username");
auto Password = MicroService::instance().ConfigGetString("storage.type.postgresql.password"); auto Password = MicroService::instance().ConfigGetString("storage.type.postgresql.password");
@@ -125,8 +129,8 @@ namespace OpenWifi {
" port=" + Port + " port=" + Port +
" connect_timeout=" + ConnectionTimeout; " connect_timeout=" + ConnectionTimeout;
PostgresConn_.registerConnector(); Poco::Data::PostgreSQL::Connector::registerConnector();
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(PostgresConn_.name(), ConnectionStr, 4, NumSessions, IdleTime)); Pool_ = std::make_unique<Poco::Data::SessionPool>(PostgresConn_.name(), ConnectionStr, 8, NumSessions, IdleTime);
return 0; return 0;
} }

View File

@@ -0,0 +1,250 @@
//
// Created by stephane bourque on 2022-05-05.
//
#pragma once
#include "framework/MicroService.h"
namespace OpenWifi {
struct WebNotificationSingleDevice {
std::string serialNumber;
inline void to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"serialNumber", serialNumber);
}
inline bool from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"serialNumber", serialNumber);
return true;
} catch (...) {
}
return false;
}
};
struct WebNotificationSingleDeviceConfigurationChange {
std::string serialNumber;
uint64_t oldUUID;
uint64_t newUUID;
inline void 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 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);
RESTAPI_utils::field_from_json(Obj,"newUUID", newUUID);
return true;
} catch (...) {
}
return false;
}
};
struct WebNotificationSingleDeviceFirmwareChange {
std::string serialNumber;
std::string newFirmware;
inline void 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 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);
return true;
} catch (...) {
}
return false;
}
};
inline void WebSocketClientNotificationDeviceConfigurationChange(const std::string &SerialNumber, uint64_t oldUUID, uint64_t newUUID) {
WebSocketNotification<WebNotificationSingleDeviceConfigurationChange> N;
N.content.serialNumber = SerialNumber;
N.content.oldUUID = oldUUID;
N.content.newUUID = newUUID;
N.type = "device_configuration_upgrade";
WebSocketClientServer()->SendNotification(N);
}
inline void WebSocketClientNotificationDeviceFirmwareUpdated(const std::string &SerialNumber, const std::string &Firmware) {
WebSocketNotification<WebNotificationSingleDeviceFirmwareChange> N;
N.content.serialNumber = SerialNumber;
N.content.newFirmware = Firmware;
N.type = "device_firmware_upgrade";
WebSocketClientServer()->SendNotification(N);
}
inline void WebSocketClientNotificationDeviceConnected(const std::string &SerialNumber) {
WebSocketNotification<WebNotificationSingleDevice> N;
N.content.serialNumber = SerialNumber;
N.type = "device_connection";
WebSocketClientServer()->SendNotification(N);
}
inline void WebSocketClientNotificationDeviceDisconnected(const std::string & SerialNumber) {
WebSocketNotification<WebNotificationSingleDevice> N;
N.content.serialNumber = SerialNumber;
N.type = "device_disconnection";
WebSocketClientServer()->SendNotification(N);
}
struct WebSocketNotificationJobContent {
std::string title,
details,
jobId;
std::vector<std::string> success,
error,
warning;
uint64_t timeStamp=OpenWifi::Now();
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
inline void WebSocketNotificationJobContent::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"title",title);
RESTAPI_utils::field_to_json(Obj,"jobId",jobId);
RESTAPI_utils::field_to_json(Obj,"success",success);
RESTAPI_utils::field_to_json(Obj,"error",error);
RESTAPI_utils::field_to_json(Obj,"warning",warning);
RESTAPI_utils::field_to_json(Obj,"timeStamp",timeStamp);
RESTAPI_utils::field_to_json(Obj,"details",details);
}
inline bool WebSocketNotificationJobContent::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"title",title);
RESTAPI_utils::field_from_json(Obj,"jobId",jobId);
RESTAPI_utils::field_from_json(Obj,"success",success);
RESTAPI_utils::field_from_json(Obj,"error",error);
RESTAPI_utils::field_from_json(Obj,"warning",warning);
RESTAPI_utils::field_from_json(Obj,"timeStamp",timeStamp);
RESTAPI_utils::field_from_json(Obj,"details",details);
return true;
} catch(...) {
}
return false;
}
typedef WebSocketNotification<WebSocketNotificationJobContent> WebSocketClientNotificationVenueUpdateJob_t;
inline void WebSocketClientNotificationVenueUpdateJobCompletionToUser( const std::string & User, WebSocketClientNotificationVenueUpdateJob_t &N) {
N.type = "venue_configuration_update";
WebSocketClientServer()->SendUserNotification(User,N);
}
/////
/////
/////
struct WebSocketNotificationRebootList {
std::string title,
details,
jobId;
std::vector<std::string> success,
warning;
uint64_t timeStamp=OpenWifi::Now();
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
typedef WebSocketNotification<WebSocketNotificationRebootList> WebSocketClientNotificationVenueRebootList_t;
inline void WebSocketNotificationRebootList::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"title",title);
RESTAPI_utils::field_to_json(Obj,"jobId",jobId);
RESTAPI_utils::field_to_json(Obj,"success",success);
RESTAPI_utils::field_to_json(Obj,"warning",warning);
RESTAPI_utils::field_to_json(Obj,"timeStamp",timeStamp);
RESTAPI_utils::field_to_json(Obj,"details",details);
}
inline bool WebSocketNotificationRebootList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"title",title);
RESTAPI_utils::field_from_json(Obj,"jobId",jobId);
RESTAPI_utils::field_from_json(Obj,"success",success);
RESTAPI_utils::field_from_json(Obj,"warning",warning);
RESTAPI_utils::field_from_json(Obj,"timeStamp",timeStamp);
RESTAPI_utils::field_from_json(Obj,"details",details);
return true;
} catch(...) {
}
return false;
}
inline void WebSocketClientNotificationVenueRebootCompletionToUser( const std::string & User, WebSocketClientNotificationVenueRebootList_t &N) {
N.type = "venue_rebooter";
WebSocketClientServer()->SendUserNotification(User,N);
}
/////
/////
/////
struct WebSocketNotificationUpgradeList {
std::string title,
details,
jobId;
std::vector<std::string> success,
skipped,
no_firmware,
not_connected;
uint64_t timeStamp=OpenWifi::Now();
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
typedef WebSocketNotification<WebSocketNotificationUpgradeList> WebSocketClientNotificationVenueUpgradeList_t;
inline void WebSocketNotificationUpgradeList::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"title",title);
RESTAPI_utils::field_to_json(Obj,"jobId",jobId);
RESTAPI_utils::field_to_json(Obj,"success",success);
RESTAPI_utils::field_to_json(Obj,"notConnected",not_connected);
RESTAPI_utils::field_to_json(Obj,"noFirmware",no_firmware);
RESTAPI_utils::field_to_json(Obj,"skipped",skipped);
RESTAPI_utils::field_to_json(Obj,"timeStamp",timeStamp);
RESTAPI_utils::field_to_json(Obj,"details",details);
}
inline bool WebSocketNotificationUpgradeList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"title",title);
RESTAPI_utils::field_from_json(Obj,"jobId",jobId);
RESTAPI_utils::field_from_json(Obj,"success",success);
RESTAPI_utils::field_from_json(Obj,"notConnected",not_connected);
RESTAPI_utils::field_from_json(Obj,"noFirmware",no_firmware);
RESTAPI_utils::field_from_json(Obj,"skipped",skipped);
RESTAPI_utils::field_from_json(Obj,"timeStamp",timeStamp);
RESTAPI_utils::field_from_json(Obj,"details",details);
return true;
} catch(...) {
}
return false;
}
inline void WebSocketClientNotificationVenueUpgradeCompletionToUser( const std::string & User, WebSocketClientNotificationVenueUpgradeList_t &N) {
N.type = "venue_upgrader";
WebSocketClientServer()->SendUserNotification(User,N);
}
} // namespace OpenWifi

View File

@@ -33,7 +33,8 @@ namespace ORM {
FT_TEXT, FT_TEXT,
FT_VARCHAR, FT_VARCHAR,
FT_BLOB, FT_BLOB,
FT_BOOLEAN FT_BOOLEAN,
FT_REAL
}; };
enum Indextype { enum Indextype {
@@ -81,14 +82,14 @@ namespace ORM {
typedef std::vector<Field> FieldVec; typedef std::vector<Field> FieldVec;
struct IndexEntry { struct IndexEntry {
std::string FieldName; std::string FieldName;
Indextype Type; Indextype Type;
}; };
typedef std::vector<IndexEntry> IndexEntryVec; typedef std::vector<IndexEntry> IndexEntryVec;
struct Index { struct Index {
std::string Name; std::string Name;
IndexEntryVec Entries; IndexEntryVec Entries;
}; };
typedef std::vector<Index> IndexVec; typedef std::vector<Index> IndexVec;
@@ -108,11 +109,13 @@ namespace ORM {
return "LONGBLOB"; return "LONGBLOB";
else if(Type==OpenWifi::DBType::pgsql) else if(Type==OpenWifi::DBType::pgsql)
return "BYTEA"; return "BYTEA";
else if(Type==OpenWifi::DBType::sqlite) else
return "BLOB"; return "BLOB";
default: case FT_REAL:
assert(false); return "REAL";
return ""; default:
assert(false);
} }
assert(false); assert(false);
return ""; return "";
@@ -121,12 +124,44 @@ namespace ORM {
inline std::string Escape(const std::string &S) { inline std::string Escape(const std::string &S) {
std::string R; std::string R;
for(const auto &i:S) for(const auto &i:S) {
if(i=='\'') if (i == '\'')
R += "''"; R += "''";
else else
R += i; R += i;
return R; }
return R;
}
inline std::string WHERE_AND_(std::string Result) {
return Result;
}
template <typename T, typename... Args> std::string WHERE_AND_(std::string Result, const char *fieldName, const T &Value, Args... args) {
if constexpr(std::is_same_v<T,std::string>)
{
if(!Value.empty()) {
if(!Result.empty())
Result += " and ";
Result += fieldName;
Result += '=';
Result += "'";
Result += Escape(Value);
Result += "'";
}
} else {
if(!Result.empty())
Result += " and ";
Result += fieldName ;
Result += '=';
Result += std::to_string(Value);
}
return WHERE_AND_(Result,args...);
}
template <typename... Args> std::string WHERE_AND(Args... args) {
std::string Result;
return WHERE_AND_(Result, args...);
} }
enum SqlComparison { EQ = 0, NEQ, LT, LTE, GT, GTE }; enum SqlComparison { EQ = 0, NEQ, LT, LTE, GT, GTE };
@@ -151,13 +186,21 @@ namespace ORM {
return S; return S;
} }
inline std::string to_string(const Poco::Data::BLOB &blob) {
std::string result;
result.assign(blob.begin(),blob.end());
return result;
}
inline std::string to_string(const char * S) { inline std::string to_string(const char * S) {
return S; return S;
} }
template <typename RecordType> class DBCache { template <typename RecordType> class DBCache {
public: public:
DBCache(unsigned Size, unsigned Timeout) DBCache(unsigned Size, unsigned Timeout) :
Size_(Size),
Timeout_(Timeout)
{ {
} }
@@ -166,7 +209,8 @@ namespace ORM {
virtual void UpdateCache(const RecordType &R)=0; virtual void UpdateCache(const RecordType &R)=0;
virtual void Delete(const std::string &FieldName, const std::string &Value)=0; virtual void Delete(const std::string &FieldName, const std::string &Value)=0;
private: private:
size_t Size_=0;
uint64_t Timeout_=0;
}; };
template <typename RecordTuple, typename RecordType> class DB { template <typename RecordTuple, typename RecordType> class DB {
@@ -182,8 +226,8 @@ namespace ORM {
Poco::Logger &L, Poco::Logger &L,
const char *Prefix, const char *Prefix,
DBCache<RecordType> * Cache=nullptr): DBCache<RecordType> * Cache=nullptr):
Type_(dbtype),
TableName_(TableName), TableName_(TableName),
Type_(dbtype),
Pool_(Pool), Pool_(Pool),
Logger_(L), Logger_(L),
Prefix_(Prefix), Prefix_(Prefix),
@@ -195,7 +239,8 @@ namespace ORM {
int Place=0; int Place=0;
for(const auto &i:Fields) { for(const auto &i:Fields) {
FieldNames_[i.Name] = Place; std::string FieldName = Poco::toLower(i.Name);
FieldNames_[FieldName] = Place;
if(!first) { if(!first) {
CreateFields_ += ", "; CreateFields_ += ", ";
SelectFields_ += ", "; SelectFields_ += ", ";
@@ -205,9 +250,9 @@ namespace ORM {
SelectList_ += "("; SelectList_ += "(";
} }
CreateFields_ += i.Name + " " + FieldTypeToChar(Type_, i.Type,i.Size) + (i.Index ? " unique primary key" : ""); CreateFields_ += FieldName + " " + FieldTypeToChar(Type_, i.Type,i.Size) + (i.Index ? " unique primary key" : "");
SelectFields_ += i.Name ; SelectFields_ += FieldName ;
UpdateFields_ += i.Name + "=?"; UpdateFields_ += FieldName + "=?";
SelectList_ += "?"; SelectList_ += "?";
first = false; first = false;
Place++; Place++;
@@ -222,12 +267,13 @@ namespace ORM {
IndexLine = std::string("CREATE INDEX IF NOT EXISTS ") + j.Name + std::string(" ON ") + TableName_+ " ("; IndexLine = std::string("CREATE INDEX IF NOT EXISTS ") + j.Name + std::string(" ON ") + TableName_+ " (";
bool first_entry=true; bool first_entry=true;
for(const auto &k:j.Entries) { for(const auto &k:j.Entries) {
assert(FieldNames_.find(k.FieldName) != FieldNames_.end()); auto IndexFieldName = Poco::toLower(k.FieldName);
assert(ValidFieldName(IndexFieldName));
if(!first_entry) { if(!first_entry) {
IndexLine += " , "; IndexLine += " , ";
} }
first_entry = false; first_entry = false;
IndexLine += k.FieldName + std::string(" ") + std::string(k.Type == Indextype::ASC ? "ASC" : "DESC") ; IndexLine += IndexFieldName + std::string(" ") + std::string(k.Type == Indextype::ASC ? "ASC" : "DESC") ;
} }
IndexLine += " )"; IndexLine += " )";
IndexCreation_.template emplace_back(IndexLine); IndexCreation_.template emplace_back(IndexLine);
@@ -242,12 +288,13 @@ namespace ORM {
IndexLine += " INDEX " + j.Name + " ( " ; IndexLine += " INDEX " + j.Name + " ( " ;
bool first_entry=true; bool first_entry=true;
for(const auto &k:j.Entries) { for(const auto &k:j.Entries) {
assert(FieldNames_.find(k.FieldName) != FieldNames_.end()); auto IndexFieldName = Poco::toLower(k.FieldName);
assert(FieldNames_.find(IndexFieldName) != FieldNames_.end());
if(!first_entry) { if(!first_entry) {
IndexLine += " ,"; IndexLine += " ,";
} }
first_entry = false; first_entry = false;
IndexLine += k.FieldName + std::string(k.Type == Indextype::ASC ? " ASC" : " DESC"); IndexLine += IndexFieldName + std::string(k.Type == Indextype::ASC ? " ASC" : " DESC");
} }
IndexLine += " ) "; IndexLine += " ) ";
} }
@@ -262,27 +309,27 @@ namespace ORM {
[[nodiscard]] const std::string & UpdateFields() const { return UpdateFields_; }; [[nodiscard]] const std::string & UpdateFields() const { return UpdateFields_; };
inline std::string OP(field_name_t F, SqlComparison O , bool V) { inline std::string OP(field_name_t F, SqlComparison O , bool V) {
assert( FieldNames_.find(F) != FieldNames_.end() ); assert(ValidFieldName(F));
return std::string{"("} + F + SQLCOMPS[O] + (V ? "true" : "false") + ")" ; return std::string{"("} + F + SQLCOMPS[O] + (V ? "true" : "false") + ")" ;
} }
inline std::string OP(field_name_t F, SqlComparison O , int V) { inline std::string OP(field_name_t F, SqlComparison O , int V) {
assert( FieldNames_.find(F) != FieldNames_.end() ); assert(ValidFieldName(F));
return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ; return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ;
} }
inline std::string OP(field_name_t F, SqlComparison O , uint64_t V) { inline std::string OP(field_name_t F, SqlComparison O , uint64_t V) {
assert( FieldNames_.find(F) != FieldNames_.end() ); assert(ValidFieldName(F));
return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ; return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ;
} }
std::string OP(field_name_t F, SqlComparison O , const std::string & V) { std::string OP(field_name_t F, SqlComparison O , const std::string & V) {
assert( FieldNames_.find(F) != FieldNames_.end() ); assert(ValidFieldName(F));
return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ; return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ;
} }
std::string OP(field_name_t F, SqlComparison O , const char * V) { std::string OP(field_name_t F, SqlComparison O , const char * V) {
assert( FieldNames_.find(F) != FieldNames_.end() ); assert(ValidFieldName(F));
return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ; return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ;
} }
@@ -290,7 +337,7 @@ namespace ORM {
return std::string("(")+P1 + BOPS[BOP] + P2 +")"; return std::string("(")+P1 + BOPS[BOP] + P2 +")";
} }
std::string OP( bool Paran, const std::string &P1, SqlBinaryOp BOP , const std::string &P2) { std::string OP( [[maybe_unused]] bool Paran, const std::string &P1, SqlBinaryOp BOP , const std::string &P2) {
return P1 + BOPS[BOP] + P2 +")"; return P1 + BOPS[BOP] + P2 +")";
} }
@@ -404,7 +451,7 @@ namespace ORM {
template<typename T> bool GetRecord(field_name_t FieldName, const T & Value, RecordType & R) { template<typename T> bool GetRecord(field_name_t FieldName, const T & Value, RecordType & R) {
try { try {
assert( FieldNames_.find(FieldName) != FieldNames_.end() ); assert(ValidFieldName(FieldName));
if(Cache_) { if(Cache_) {
if(Cache_->GetFromCache(FieldName, Value, R)) if(Cache_->GetFromCache(FieldName, Value, R))
@@ -415,7 +462,7 @@ namespace ORM {
Poco::Data::Statement Select(Session); Poco::Data::Statement Select(Session);
RecordTuple RT; RecordTuple RT;
std::string St = "select " + SelectFields_ + " from " + TableName_ + " where " + FieldName + "=?" ; std::string St = "select " + SelectFields_ + " from " + TableName_ + " where " + FieldName + "=?" + " limit 1";
auto tValue{Value}; auto tValue{Value};
@@ -424,13 +471,12 @@ namespace ORM {
Poco::Data::Keywords::use(tValue); Poco::Data::Keywords::use(tValue);
Select.execute(); Select.execute();
if(Select.rowsExtracted()==1) { if(Select.execute()==1) {
Convert(RT,R); Convert(RT,R);
if(Cache_) if(Cache_)
Cache_->UpdateCache(R); Cache_->UpdateCache(R);
return true; return true;
} }
return false;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.log(E); Logger_.log(E);
} }
@@ -443,7 +489,7 @@ namespace ORM {
typename T0, typename T1> bool GR(field_name_t FieldName, T & R,T0 &V0, T1 &V1) { typename T0, typename T1> bool GR(field_name_t FieldName, T & R,T0 &V0, T1 &V1) {
try { try {
assert( FieldNames_.find(FieldName) != FieldNames_.end() ); assert( ValidFieldName(FieldName) );
Poco::Data::Session Session = Pool_.get(); Poco::Data::Session Session = Pool_.get();
Poco::Data::Statement Select(Session); Poco::Data::Statement Select(Session);
@@ -467,9 +513,11 @@ namespace ORM {
return false; return false;
} }
typedef std::vector<RecordTuple> RecordList; typedef std::vector<RecordTuple> RecordList;
typedef std::vector<RecordType> RecordVec;
typedef RecordType RecordName;
bool GetRecords( uint64_t Offset, uint64_t HowMany, std::vector<RecordType> & Records, const std::string & Where = "", const std::string & OrderBy = "") { bool GetRecords( uint64_t Offset, uint64_t HowMany, RecordVec & Records, const std::string & Where = "", const std::string & OrderBy = "") {
try { try {
Poco::Data::Session Session = Pool_.get(); Poco::Data::Session Session = Pool_.get();
Poco::Data::Statement Select(Session); Poco::Data::Statement Select(Session);
@@ -499,7 +547,7 @@ namespace ORM {
template <typename T> bool UpdateRecord(field_name_t FieldName, const T & Value, const RecordType & R) { template <typename T> bool UpdateRecord(field_name_t FieldName, const T & Value, const RecordType & R) {
try { try {
assert( FieldNames_.find(FieldName) != FieldNames_.end() ); assert( ValidFieldName(FieldName) );
Poco::Data::Session Session = Pool_.get(); Poco::Data::Session Session = Pool_.get();
Poco::Data::Statement Update(Session); Poco::Data::Statement Update(Session);
@@ -524,6 +572,21 @@ namespace ORM {
return false; return false;
} }
bool RunStatement(const std::string &St) {
try {
Poco::Data::Session Session = Pool_.get();
Poco::Data::Statement Command(Session);
Command << St ;
Command.execute();
return true;
} catch (const Poco::Exception &E) {
Logger_.log(E);
}
return false;
}
template <typename T> bool ReplaceRecord(field_name_t FieldName, const T & Value, RecordType & R) { template <typename T> bool ReplaceRecord(field_name_t FieldName, const T & Value, RecordType & R) {
try { try {
if(Exists(FieldName, Value)) { if(Exists(FieldName, Value)) {
@@ -538,7 +601,7 @@ namespace ORM {
template <typename T> bool GetNameAndDescription(field_name_t FieldName, const T & Value, std::string & Name, std::string & Description ) { template <typename T> bool GetNameAndDescription(field_name_t FieldName, const T & Value, std::string & Name, std::string & Description ) {
try { try {
assert( FieldNames_.find(FieldName) != FieldNames_.end() ); assert( ValidFieldName(FieldName) );
Poco::Data::Session Session = Pool_.get(); Poco::Data::Session Session = Pool_.get();
Poco::Data::Statement Select(Session); Poco::Data::Statement Select(Session);
RecordTuple RT; RecordTuple RT;
@@ -565,7 +628,7 @@ namespace ORM {
template <typename T> bool DeleteRecord(field_name_t FieldName, const T & Value) { template <typename T> bool DeleteRecord(field_name_t FieldName, const T & Value) {
try { try {
assert( FieldNames_.find(FieldName) != FieldNames_.end() ); assert( ValidFieldName(FieldName) );
Poco::Data::Session Session = Pool_.get(); Poco::Data::Session Session = Pool_.get();
Poco::Data::Statement Delete(Session); Poco::Data::Statement Delete(Session);
@@ -603,7 +666,7 @@ namespace ORM {
bool Exists(field_name_t FieldName, const std::string & Value) { bool Exists(field_name_t FieldName, const std::string & Value) {
try { try {
assert( FieldNames_.find(FieldName) != FieldNames_.end() ); assert( ValidFieldName(FieldName) );
RecordType R; RecordType R;
if(GetRecord(FieldName,Value,R)) if(GetRecord(FieldName,Value,R))
@@ -656,7 +719,7 @@ namespace ORM {
} }
if(!ItemList.empty()) if(!ItemList.empty())
ItemList += " , "; ItemList += " , ";
auto hint = FieldNames_.find(T[0]); auto hint = FieldNames_.find(Poco::toLower(T[0]));
if(hint==FieldNames_.end()) { if(hint==FieldNames_.end()) {
return false; return false;
} }
@@ -666,9 +729,6 @@ namespace ORM {
if(!ItemList.empty()) { if(!ItemList.empty()) {
OrderByString = " ORDER BY " + ItemList; OrderByString = " ORDER BY " + ItemList;
} }
std::cout << OrderByString << std::endl;
return true; return true;
} }
@@ -695,7 +755,7 @@ namespace ORM {
template <typename X> bool ManipulateVectorMember( X T, field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID, bool Add) { template <typename X> bool ManipulateVectorMember( X T, field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID, bool Add) {
try { try {
assert( FieldNames_.find(FieldName) != FieldNames_.end() ); assert( ValidFieldName(FieldName) );
RecordType R; RecordType R;
if(GetRecord(FieldName, ParentUUID, R)) { if(GetRecord(FieldName, ParentUUID, R)) {
@@ -729,11 +789,11 @@ namespace ORM {
try { try {
Command << i, Poco::Data::Keywords::now; Command << i, Poco::Data::Keywords::now;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.log(E); // Logger_.log(E);
Logger_.error(Poco::format("The following statement '%s' generated an exception during a table upgrade. This maya or may not be a problem.", i)); // Logger_.error(Poco::format("The following statement '%s' generated an exception during a table upgrade. This may or may not be a problem.", i));
} if(!IgnoreExceptions) {
if(!IgnoreExceptions) { return false;
return false; }
} }
Command.reset(Session); Command.reset(Session);
} }
@@ -809,32 +869,32 @@ namespace ORM {
return ManipulateVectorMember(&RecordType::users, FieldName, ParentUUID, ChildUUID, false); return ManipulateVectorMember(&RecordType::users, FieldName, ParentUUID, ChildUUID, false);
} }
inline bool AddInUse(field_name_t FieldName, std::string & ParentUUID, const std::string & Prefix, const std::string & ChildUUID) { inline bool AddConfiguration(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
return ManipulateVectorMember(&RecordType::deviceConfiguration, FieldName, ParentUUID, ChildUUID, true);
}
inline bool DelConfiguration(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
return ManipulateVectorMember(&RecordType::deviceConfiguration, FieldName, ParentUUID, ChildUUID, false);
}
inline bool AddVariable(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
return ManipulateVectorMember(&RecordType::variables, FieldName, ParentUUID, ChildUUID, true);
}
inline bool DelVariable(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
return ManipulateVectorMember(&RecordType::variables, FieldName, ParentUUID, ChildUUID, false);
}
inline bool AddInUse(field_name_t FieldName, const std::string & ParentUUID, const std::string & Prefix, const std::string & ChildUUID) {
std::string FakeUUID{ Prefix + ":" + ChildUUID}; std::string FakeUUID{ Prefix + ":" + ChildUUID};
return ManipulateVectorMember(&RecordType::inUse,FieldName, ParentUUID, FakeUUID, true); return ManipulateVectorMember(&RecordType::inUse,FieldName, ParentUUID, FakeUUID, true);
} }
inline bool DeleteInUse(field_name_t FieldName, std::string & ParentUUID, const std::string & Prefix, const std::string & ChildUUID) { inline bool DeleteInUse(field_name_t FieldName, const std::string & ParentUUID, const std::string & Prefix, const std::string & ChildUUID) {
std::string FakeUUID{ Prefix + ":" + ChildUUID}; std::string FakeUUID{ Prefix + ":" + ChildUUID};
return ManipulateVectorMember(&RecordType::inUse,FieldName, ParentUUID, FakeUUID, false); return ManipulateVectorMember(&RecordType::inUse,FieldName, ParentUUID, FakeUUID, false);
} }
inline bool DeleteContact(field_name_t FieldName, std::string & ParentUUID, const std::string & ChildUUID) {
return ManipulateVectorMember(&RecordType::contacts,FieldName, ParentUUID, ChildUUID, false);
}
inline bool AddContact(field_name_t FieldName, std::string & ParentUUID, const std::string & ChildUUID) {
return ManipulateVectorMember(&RecordType::contacts,FieldName, ParentUUID, ChildUUID, true);
}
inline bool DeleteLocation(field_name_t FieldName, std::string & ParentUUID, const std::string & ChildUUID) {
return ManipulateVectorMember(&RecordType::locations,FieldName, ParentUUID, ChildUUID, false);
}
inline bool AddLocation(field_name_t FieldName, std::string & ParentUUID, const std::string & ChildUUID) {
return ManipulateVectorMember(&RecordType::locations,FieldName, ParentUUID, ChildUUID, true);
}
inline bool GetInUse(field_name_t FieldName, const std::string & UUID, std::vector<std::string> & UUIDs ) { inline bool GetInUse(field_name_t FieldName, const std::string & UUID, std::vector<std::string> & UUIDs ) {
RecordType R; RecordType R;
if(GetRecord(FieldName,UUID,R)) { if(GetRecord(FieldName,UUID,R)) {
@@ -844,6 +904,15 @@ namespace ORM {
return false; return false;
} }
inline bool ValidFieldName(const std::string &FieldName) {
return FieldNames_.find(Poco::toLower(FieldName)) != FieldNames_.end();
}
inline bool ValidFieldName(const char *FieldName) {
std::string Field{FieldName};
return ValidFieldName(Field);
}
[[nodiscard]] inline std::string ComputeRange(uint64_t From, uint64_t HowMany) { [[nodiscard]] inline std::string ComputeRange(uint64_t From, uint64_t HowMany) {
if(From<1) From=0; if(From<1) From=0;
switch(Type_) { switch(Type_) {
@@ -860,26 +929,31 @@ namespace ORM {
Poco::Logger & Logger() { return Logger_; } Poco::Logger & Logger() { return Logger_; }
bool DeleteRecordsFromCache(const char *FieldName, const std::string &Value ) { inline bool DeleteRecordsFromCache(const char *FieldName, const std::string &Value ) {
if(Cache_) if(Cache_)
Cache_->Delete(FieldName, Value); Cache_->Delete(FieldName, Value);
return true; return true;
} }
inline void GetFieldNames( OpenWifi::Types::StringVec & F) {
for(const auto &[field,_]:FieldNames_)
F.push_back(field);
}
protected: protected:
std::string TableName_;
OpenWifi::DBType Type_;
Poco::Data::SessionPool &Pool_; Poco::Data::SessionPool &Pool_;
Poco::Logger &Logger_; Poco::Logger &Logger_;
std::string TableName_; std::string Prefix_;
DBCache<RecordType> *Cache_= nullptr; DBCache<RecordType> *Cache_= nullptr;
private: private:
OpenWifi::DBType Type_;
std::string CreateFields_; std::string CreateFields_;
std::string SelectFields_; std::string SelectFields_;
std::string SelectList_; std::string SelectList_;
std::string UpdateFields_; std::string UpdateFields_;
std::vector<std::string> IndexCreation_; std::vector<std::string> IndexCreation_;
std::map<std::string,int> FieldNames_; std::map<std::string,int> FieldNames_;
std::string Prefix_;
}; };
} }

View File

@@ -0,0 +1,516 @@
//
// Created by stephane bourque on 2022-02-21.
//
#pragma once
#include <string>
#include <cstring>
#include "Poco/String.h"
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
#endif
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
#endif
namespace OpenWifi::RESTAPI::Errors {
struct msg { uint64_t err_num; std::string err_txt; };
static const struct msg Error404{404,"Resource does not exist."};
static const struct msg SUCCESS{0,"No error."};
static const struct msg PASSWORD_CHANGE_REQUIRED{1,"Password change required"};
static const struct msg INVALID_CREDENTIALS{2,"Invalid credentials."};
static const struct msg PASSWORD_ALREADY_USED{3,"Password already used."};
static const struct msg USERNAME_PENDING_VERIFICATION{4,"Username pending verification."};
static const struct msg PASSWORD_INVALID{5,"Password is invalid"};
static const struct msg INTERNAL_ERROR{6,"Internal error."};
static const struct msg ACCESS_DENIED{7,"Access denied."};
static const struct msg INVALID_TOKEN{8,"Invalid token."};
static const struct msg EXPIRED_TOKEN{9,"Expired token."};
static const struct msg RATE_LIMIT_EXCEEDED{10,"Rate limit exceeded."};
static const struct msg BAD_MFA_TRANSACTION{11,"Bad MFA transaction."};
static const struct msg MFA_FAILURE{12,"MFA failure."};
static const struct msg SECURITY_SERVICE_UNREACHABLE{13,"Security service is unreachable, try again later."};
static const struct msg CANNOT_REFRESH_TOKEN{14,"Cannot refresh token."};
static const struct msg MissingUUID{1000,"Missing UUID."};
static const struct msg MissingSerialNumber{1001,"Missing Serial Number."};
static const struct msg InternalError{1002,"Internal error. Please try later."};
static const struct msg InvalidJSONDocument{1003,"Invalid JSON document."};
static const struct msg UnsupportedHTTPMethod{1004,"Unsupported HTTP Method"};
static const struct msg StillInUse{1005,"Element still in use."};
static const struct msg CouldNotBeDeleted{1006,"Element could not be deleted."};
static const struct msg NameMustBeSet{1007,"The name property must be set."};
static const struct msg ConfigBlockInvalid{1008,"Configuration block type invalid."};
static const struct msg UnknownId{1009,"Unknown UUID."};
static const struct msg InvalidDeviceTypes{1010,"Unknown or invalid device type(s)."};
static const struct msg RecordNotCreated{1011,"Record could not be created."};
static const struct msg RecordNotUpdated{1012,"Record could not be updated."};
static const struct msg UnknownManagementPolicyUUID{1013,"Unknown management policy UUID."};
static const struct msg CannotDeleteRoot{1014,"Root Entity cannot be removed, only modified."};
static const struct msg MustCreateRootFirst{1015,"Root entity must be created first."};
static const struct msg ParentUUIDMustExist{1016,"Parent UUID must exist."};
static const struct msg ConfigurationMustExist{1017,"Configuration must exist."};
static const struct msg MissingOrInvalidParameters{1018,"Invalid or missing parameters."};
static const struct msg UnknownSerialNumber{1019,"Unknown Serial Number."};
static const struct msg InvalidSerialNumber{1020,"Invalid Serial Number."};
static const struct msg SerialNumberExists{1021,"Serial Number already exists."};
static const struct msg ValidNonRootUUID{1022,"Must be a non-root, and valid UUID."};
static const struct msg VenueMustExist{1023,"Venue does not exist."};
static const struct msg NotBoth{1024,"You cannot specify both Entity and Venue"};
static const struct msg EntityMustExist{1025,"Entity must exist."};
static const struct msg ParentOrEntityMustBeSet{1026,"Parent or Entity must be set."};
static const struct msg ContactMustExist{1027,"Contact must exist."};
static const struct msg LocationMustExist{1028,"Location must exist."};
static const struct msg OnlyWSSupported{1029,"This endpoint only supports WebSocket."};
static const struct msg SerialNumberMismatch{1030,"Serial Number mismatch."};
static const struct msg InvalidCommand{1031,"Invalid command."};
static const struct msg NoRecordsDeleted{1032,"No records deleted."};
static const struct msg DeviceNotConnected{1033,"Device is not currently connected."};
static const struct msg CannotCreateWS{1034,"Telemetry system could not create WS endpoint. Please try again."};
static const struct msg BothDeviceTypeRevision{1035,"Both deviceType and revision must be set."};
static const struct msg IdOrSerialEmpty{1036,"SerialNumber and Id must not be empty."};
static const struct msg MissingUserID{1037,"Missing user ID."};
static const struct msg IdMustBe0{1038,"To create a user, you must set the ID to 0"};
static const struct msg InvalidUserRole{1039,"Invalid userRole."};
static const struct msg InvalidEmailAddress{1040,"Invalid email address."};
static const struct msg PasswordRejected{1041,"Password was rejected. This maybe an old password."};
static const struct msg InvalidIPRanges{1042,"Invalid IP range specifications."};
static const struct msg InvalidLOrderBy{1043,"Invalid orderBy specification."};
static const struct msg NeedMobileNumber{1044,"You must provide at least one validated phone number."};
static const struct msg BadMFAMethod{1045,"MFA only supports sms or email."};
static const struct msg InvalidCredentials{1046,"Invalid credentials (username/password)."};
static const struct msg InvalidPassword{1047,"Password does not conform to basic password rules."};
static const struct msg UserPendingVerification{1048,"User access denied pending email verification."};
static const struct msg PasswordMustBeChanged{1049,"Password must be changed."};
static const struct msg UnrecognizedRequest{1050,"Ill-formed request. Please consult documentation."};
static const struct msg MissingAuthenticationInformation{1051,"Missing authentication information."};
static const struct msg InsufficientAccessRights{1052,"Insufficient access rights to complete the operation."};
static const struct msg ExpiredToken{1053,"Token has expired, user must login."};
static const struct msg SubscriberMustExist{1054,"Subscriber must exist."};
static const struct msg AuthenticatorVerificationIncomplete{1055,"Authenticator validation is not complete."};
static const struct msg SMSCouldNotBeSentRetry{1056,"SMS could not be sent to validate device, try later or change the phone number."};
static const struct msg SMSCouldNotValidate{1057,"Code and number could not be validated"};
static const struct msg InvalidDeviceClass{1058,"Invalid device class. Must be: any, venue, entity, or subscriber"};
static const struct msg SerialNumberAlreadyProvisioned{1059,"This device has already been provisioned to a subscriber."};
static const struct msg SerialNumberNotTheProperClass{1060,"Device is not available to subscribers. It ahs been assigned to another class of devices."};
static const struct msg UserAlreadyExists{1061,"Username already exists."};
static const struct msg NotImplemented{1062,"Function not implemented."};
static const struct msg VariableMustExist{1063,"Specified variable does not exist."};
static const struct msg InvalidEntityType{1064,"Invalid entity type."};
static const struct msg CannotDeleteSubEntity{1065,"Cannot delete the default subscriber entity."};
static const struct msg OperatorIdMustExist{1066,"Missing or bad Operator ID"};
static const struct msg CannotDeleteDefaultOperator{1067,"Cannot delete the default operator."};
static const struct msg CannotCreateDefaultOperator{1068,"Cannot create the default operator."};
static const struct msg InvalidRRM{1069,"Invalid RRM value."};
static const struct msg InvalidIPAddresses{1070,"Invalid IP addresses."};
static const struct msg InvalidBillingCode{1071,"Empty of invalid billing code."};
static const struct msg InvalidBillingPeriod{1072,"Invalid billing period."};
static const struct msg InvalidSubscriberId{1073,"Invalid subscriber ID."};
static const struct msg InvalidContactId{1074,"Invalid contact ID."};
static const struct msg InvalidLocationId{1075,"Invalid location ID."};
static const struct msg InvalidContactType{1076,"Invalid contact type."};
static const struct msg InvalidLocationType{1077,"Invalid location type."};
static const struct msg InvalidOperatorId{1078,"Invalid operator ID."};
static const struct msg InvalidServiceClassId{1079,"Invalid service class ID."};
static const struct msg InvalidSubscriberDeviceId{1080,"Invalid subscriber device ID."};
static const struct msg InvalidRegistrationOperatorId{1081,"Invalid registration operator ID."};
static const struct msg InvalidRegistrationOperatorName{1082,"Invalid registration operator name."};
static const struct msg RegistrationNameDuplicate{1083,"Registration name must be unique."};
static const struct msg SMSMFANotEnabled{1084,"SMS is not enabled in the security service."};
static const struct msg EMailMFANotEnabled{1085,"email is not enabled in the security service."};
static const struct msg TOTInvalidCode{1086,"Invalid code."};
static const struct msg TOTInvalidIndex{1087,"Invalid index."};
static const struct msg TOTRepeatedCode{1088,"Code is repeated. Must be new code."};
static const struct msg TOTInvalidProtocol{1089,"Invalid protocol sequence."};
static const struct msg TOTNoSession{1090,"No validation session present."};
static const struct msg SignupAlreadySigned{1091,"Code is repeated. Must be new code."};
static const struct msg SignupEmailCheck{1092,"Waiting for email check completion."};
static const struct msg SignupWaitingForDevice{1093,"Waiting for device."};
static const struct msg SMSMissingPhoneNumber{1094,"Missing phone number"};
static const struct msg SMSTryLater{1095,"SMS could not be sent. Verify the number or try again later."};
static const struct msg SMSMissingChallenge{1096,"Missing 'challengeCode'"};
static const struct msg MustHaveConfigElement{1097,"Must have 'configuration' element."};
static const struct msg ModelIDListCannotBeEmpty{1098,"Model ID list cannot be empty."};
static const struct msg DefConfigNameExists{1099,"Configuration name already exists."};
static const struct msg SubNoDeviceActivated{1100,"No devices activated yet."};
static const struct msg SubConfigNotRefreshed{1101,"Configuration could not be refreshed."};
static const struct msg ProvServiceNotAvailable{1102,"Provisioning service not available yet."};
static const struct msg SSIDInvalidPassword{1103,"Invalid password length. Must be 8 characters or greater, and a maximum of 32 characters."};
static const struct msg InvalidStartingIPAddress{1104,"Invalid starting/ending IP address."};
static const struct msg SubnetFormatError{1105,"Subnet must be in format like 192.168.1.1/24."};
static const struct msg DeviceModeError{1106,"Device mode subnet must be of the form 192.168.1.1/24."};
static const struct msg BadDeviceMode{1107,"Mode must be bridge, nat, or manual."};
static const struct msg DefaultGatewayFormat{1108,"Default gateway must be in format like 192.168.1.1."};
static const struct msg PrimaryDNSFormat{1109,"Primary DNS must be an IP address i.e. 192.168.1.1."};
static const struct msg SecondaryDNSFormat{1110,"Secondary DNS must be an IP address i.e. 192.168.1.1."};
static const struct msg BadConnectionType{1111,"Internet Connection must be automatic, bridge, pppoe, or manual."};
static const struct msg InvalidDeviceID{1112,"Invalid deviceID."};
static const struct msg InvalidVisibilityAttribute{1113,"Invalid visibility attribute."};
static const struct msg UnknownConfigurationSection{1114,"Unknown section."};
static const struct msg CannotValidatePhoneNumber{1115,"Phone number could not be validated."};
static const struct msg RootUsersNoOwners{1116,"ROOT users may not have owners."};
static const struct msg PartnerMustHaveEntity{1118,"Partner user must belong to an entity."};
static const struct msg RootCannotModifyUsers{1119,"ROOT may not modify user roles."};
static const struct msg CertificateNotIssued{1120,"Certificate was not issued."};
static const struct msg IncompleteCertificate{1121,"Incomplete certificate information. Cannot be downloaded. You must delete and recreate."};
static const struct msg InvalidCertificateType{1122,"Invalid certificate type."};
static const struct msg InvalidDeviceName{1123,"Invalid device name."};
static const struct msg InvalidRedirectorName{1124,"Invalid redirector name"};
static const struct msg CommonNameAlreadyExists{1125,"A device/server of this name already exists"};
static const struct msg CertificateAlreadyExists{1126,"A certificate for this device already exists."};
static const struct msg CannotCreateCertTryAgain{1127,"Device certificate could not be created. Please try later."};
static const struct msg CouldNotRevoke{1128,"Certificate could not be revoked."};
static const struct msg CouldNotModifyCert{1129,"Certificate could not me modified. Please verify the information you supplied."};
static const struct msg BatchCertNoCreated{1130,"Certificates have not been created for this batch."};
static const struct msg BatchTooBig{1131,"Illegal number of MAC Addresses: must be between 1 and 1000."};
static const struct msg OutstandingJobs{1132,"Batch has running outstanding jobs. Please wait until job is finished."};
static const struct msg InvalidSMSNotificationList{1133,"Invalid SMS Notification list."};
static const struct msg InvalidEMailNotificationList{1134,"Invalid email Notification list."};
static const struct msg CannotChangeCommanNames{1135,"You cannot provide new/modified common names after jobs have been run for a batch."};
static const struct msg FailedToVerifyDigicert{1136,"Failed to verify the DigiCert information provided."};
static const struct msg CouldNotPerformCommand{1137,"Could not perform command."};
static const struct msg PoolNameInvalid{1138,"Pool name is invalid."};
static const struct msg InvalidRadiusProxyStrategy{1139,"Strategy name must be: random, round_robin, weighted."};
static const struct msg InvalidRadiusProxyMonitorMethod{1140,"monitorMethod must be: none, https, radius."};
static const struct msg MustHaveAtLeastOneRadiusServer{1141,"Must have at least one RADIUS server."};
static const struct msg InvalidRadiusServerEntry{1142,"RADIUS Server IP address invalid or port missing."};
static const struct msg InvalidRadiusServerWeigth{1143,"RADIUS Server IP weight cannot be 0."};
static const struct msg MaximumRTTYSessionsReached{1144,"Too many RTTY sessions currently active"};
static const struct msg DeviceIsAlreadyBusy{1145,"Device is already executing a command. Please try later."};
}
namespace OpenWifi::RESTAPI::Protocol {
static const char * CAPABILITIES = "capabilities";
static const char * LOGS = "logs";
static const char * HEALTHCHECKS = "healthchecks";
static const char * STATISTICS = "statistics";
static const char * STATUS = "status";
static const char * SERIALNUMBER = "serialNumber";
static const char * PERFORM = "perform";
static const char * CONFIGURE = "configure";
static const char * UPGRADE = "upgrade";
static const char * REBOOT = "reboot";
static const char * FACTORY = "factory";
static const char * LEDS = "leds";
static const char * TRACE = "trace";
static const char * REQUEST = "request";
static const char * WIFISCAN = "wifiscan";
static const char * EVENTQUEUE = "eventqueue";
static const char * RTTY = "rtty";
static const char * COMMAND = "command";
static const char * STARTDATE = "startDate";
static const char * ENDDATE = "endDate";
static const char * OFFSET = "offset";
static const char * LIMIT = "limit";
static const char * LIFETIME = "lifetime";
static const char * UUID = "UUID";
static const char * DATA = "data";
static const char * CONFIGURATION = "configuration";
static const char * WHEN = "when";
static const char * URI = "uri";
static const char * LOGTYPE = "logType";
static const char * VALUES = "values";
static const char * TYPES = "types";
static const char * PAYLOAD = "payload";
static const char * KEEPREDIRECTOR = "keepRedirector";
static const char * NETWORK = "network";
static const char * INTERFACE = "interface";
static const char * BANDS = "bands";
static const char * CHANNELS = "channels";
static const char * VERBOSE = "verbose";
static const char * MESSAGE = "message";
static const char * STATE = "state";
static const char * HEALTHCHECK = "healthcheck";
static const char * PCAP_FILE_TYPE = "pcap";
static const char * DURATION = "duration";
static const char * NUMBEROFPACKETS = "numberOfPackets";
static const char * FILTER = "filter";
static const char * SELECT = "select";
static const char * SERIALONLY = "serialOnly";
static const char * COUNTONLY = "countOnly";
static const char * DEVICEWITHSTATUS = "deviceWithStatus";
static const char * DEVICESWITHSTATUS = "devicesWithStatus";
static const char * DEVICES = "devices";
static const char * COUNT = "count";
static const char * SERIALNUMBERS = "serialNumbers";
static const char * CONFIGURATIONS = "configurations";
static const char * NAME = "name";
static const char * COMMANDS = "commands";
static const char * COMMANDUUID = "commandUUID";
static const char * FIRMWARES = "firmwares";
static const char * TOPIC = "topic";
static const char * HOST = "host";
static const char * OS = "os";
static const char * HOSTNAME = "hostname";
static const char * PROCESSORS = "processors";
static const char * REASON = "reason";
static const char * RELOAD = "reload";
static const char * SUBSYSTEMS = "subsystems";
static const char * FILEUUID = "uuid";
static const char * USERID = "userId";
static const char * PASSWORD = "password";
static const char * TOKEN = "token";
static const char * SETLOGLEVEL = "setloglevel";
static const char * GETLOGLEVELS = "getloglevels";
static const char * GETSUBSYSTEMNAMES = "getsubsystemnames";
static const char * GETLOGLEVELNAMES = "getloglevelnames";
static const char * STATS = "stats";
static const char * PING = "ping";
static const char * PARAMETERS = "parameters";
static const char * VALUE = "value";
static const char * LASTONLY = "lastOnly";
static const char * NEWEST = "newest";
static const char * ACTIVESCAN = "activeScan";
static const char * OVERRIDEDFS = "override_dfs";
static const char * LIST = "list";
static const char * TAG = "tag";
static const char * TAGLIST = "tagList";
static const char * DESCRIPTION = "description";
static const char * NOTES = "notes";
static const char * DEVICETYPE = "deviceType";
static const char * REVISION = "revision";
static const char * AGES = "ages";
static const char * REVISIONS = "revisions";
static const char * DEVICETYPES = "deviceTypes";
static const char * LATESTONLY = "latestOnly";
static const char * IDONLY = "idOnly";
static const char * REVISIONSET = "revisionSet";
static const char * DEVICESET = "deviceSet";
static const char * HISTORY = "history";
static const char * ID = "id";
static const char * VERSION = "version";
static const char * TIMES = "times";
static const char * UPTIME = "uptime";
static const char * START = "start";
static const char * DEBUG = "debug";
static const char * SCRIPT = "script";
static const char * TIMEOUT = "timeout";
static const char * NEWPASSWORD = "newPassword";
static const char * USERS = "users";
static const char * WITHEXTENDEDINFO = "withExtendedInfo";
static const char * ERRORTEXT = "errorText";
static const char * ERRORCODE = "errorCode";
static const char * AVATARID = "avatarId";
static const char * UNNAMED = "(unnamed)";
static const char * UNSPECIFIED = "(unspecified)";
static const char * CONTENTDISPOSITION = "Content-Disposition";
static const char * CONTENTTYPE = "Content-Type";
static const char * REQUIREMENTS = "requirements";
static const char * PASSWORDPATTERN = "passwordPattern";
static const char * ACCESSPOLICY = "accessPolicy";
static const char * PASSWORDPOLICY = "passwordPolicy";
static const char * FORGOTPASSWORD = "forgotPassword";
static const char * RESENDMFACODE = "resendMFACode";
static const char * COMPLETEMFACHALLENGE = "completeMFAChallenge";
static const char * ME = "me";
static const char * TELEMETRY = "telemetry";
static const char * INTERVAL = "interval";
static const char * UI = "UI";
static const char * BANDWIDTH = "bandwidth";
}
namespace OpenWifi::uCentralProtocol {
const int SERIAL_NUMBER_LENGTH = 30;
// vocabulary used in the PROTOCOL.md file
static const char *JSONRPC = "jsonrpc";
static const char *ID = "id";
static const char *UUID = "uuid";
static const char *JSONRPC_VERSION = "2.0";
static const char *METHOD = "method";
static const char *PARAMS = "params";
static const char *SERIAL = "serial";
static const char *FIRMWARE = "firmware";
static const char *CONNECT = "connect";
static const char *STATE = "state";
static const char *STATUS = "status";
static const char *ERROR = "error";
static const char *TEXT = "text";
static const char *HEALTHCHECK = "healthcheck";
static const char *LOG = "log";
static const char *CRASHLOG = "crashlog";
static const char *PING = "ping";
static const char *CFGPENDING = "cfgpending";
static const char *RECOVERY = "recovery";
static const char *COMPRESS_64 = "compress_64";
static const char *CAPABILITIES = "capabilities";
static const char *REQUEST_UUID = "request_uuid";
static const char *SANITY = "sanity";
static const char *DATA = "data";
static const char *LOGLINES = "loglines";
static const char *SEVERITY = "severity";
static const char *ACTIVE = "active";
static const char *OVERRIDEDFS = "override_dfs";
static const char *REBOOT = "reboot";
static const char *WHEN = "when";
static const char *CONFIG = "config";
static const char *EMPTY_JSON_DOC = "{}";
static const char *RESULT = "result";
static const char *RESULT_64 = "result_64";
static const char *RESULT_SZ = "result_sz";
static const char *REQUEST = "request";
static const char *PERFORM = "perform";
static const char *CONFIGURE = "configure";
static const char *PENDING = "pending";
static const char *SUBMITTED_BY_SYSTEM = "*system";
static const char *URI = "uri";
static const char *COMMAND = "command";
static const char *PAYLOAD = "payload";
static const char *KEEP_REDIRECTOR = "keep_redirector";
static const char *DURATION = "duration";
static const char *PATTERN = "pattern";
static const char *LEDS = "leds";
static const char *DEBUG = "debug";
static const char *ON = "on";
static const char *OFF = "off";
static const char *BLINK = "blink";
static const char *PACKETS = "packets";
static const char *NETWORK = "network";
static const char *INTERFACE = "interface";
static const char *TRACE = "trace";
static const char *WIFISCAN = "wifiscan";
static const char *TYPES = "types";
static const char *EVENT = "event";
static const char *MESSAGE = "message";
static const char *RTTY = "rtty";
static const char *TOKEN = "token";
static const char *SERVER = "server";
static const char *PORT = "port";
static const char *USER = "user";
static const char *TIMEOUT = "timeout";
static const char *UPGRADE = "upgrade";
static const char *FACTORY = "factory";
static const char *VERBOSE = "verbose";
static const char *BANDS = "bands";
static const char *CHANNELS = "channels";
static const char *PASSWORD = "password";
static const char *DEVICEUPDATE = "deviceupdate";
static const char *SERIALNUMBER = "serialNumber";
static const char *COMPATIBLE = "compatible";
static const char *DISCONNECTION = "disconnection";
static const char *TIMESTAMP = "timestamp";
static const char *SYSTEM = "system";
static const char *HOST = "host";
static const char *CONNECTIONIP = "connectionIp";
static const char *TELEMETRY = "telemetry";
static const char *BANDWIDTH = "bandwidth";
static const char *SCRIPT = "script";
static const char *TYPE = "type";
static const char *RADIUS = "radius";
static const char *RADIUSDATA = "data";
static const char *RADIUSACCT = "acct";
static const char *RADIUSAUTH = "auth";
static const char *RADIUSCOA = "coa";
static const char *RADIUSDST = "dst";
static const char *IES = "ies";
}
namespace OpenWifi::uCentralProtocol::Events {
static const char *CONNECT = "connect";
static const char *STATE = "state";
static const char *HEALTHCHECK = "healthcheck";
static const char *LOG = "log";
static const char *CRASHLOG = "crashlog";
static const char *PING = "ping";
static const char *CFGPENDING = "cfgpending";
static const char *RECOVERY = "recovery";
static const char *TELEMETRY = "telemetry";
static const char *DEVICEUPDATE = "deviceupdate";
static const char *VENUE_BROADCAST = "venue_broadcast";
enum EVENT_MSG {
ET_UNKNOWN,
ET_CONNECT,
ET_STATE,
ET_HEALTHCHECK,
ET_LOG,
ET_CRASHLOG,
ET_PING,
ET_CFGPENDING,
ET_RECOVERY,
ET_DEVICEUPDATE,
ET_TELEMETRY,
ET_VENUEBROADCAST
};
inline EVENT_MSG EventFromString(const std::string & Method) {
if(strcmp(STATE,Method.c_str())==0)
return ET_STATE;
else if(strcmp(HEALTHCHECK,Method.c_str())==0)
return ET_HEALTHCHECK;
else if(strcmp(CONNECT,Method.c_str())==0)
return ET_CONNECT;
else if(strcmp(CFGPENDING,Method.c_str())==0)
return ET_CFGPENDING;
else if(strcmp(CRASHLOG,Method.c_str())==0)
return ET_CRASHLOG;
else if(strcmp(DEVICEUPDATE,Method.c_str())==0)
return ET_DEVICEUPDATE;
else if(strcmp(LOG,Method.c_str())==0)
return ET_LOG;
else if(strcmp(PING,Method.c_str())==0)
return ET_PING;
else if(strcmp(RECOVERY,Method.c_str())==0)
return ET_RECOVERY;
else if(strcmp(TELEMETRY,Method.c_str())==0)
return ET_TELEMETRY;
else if(strcmp(VENUE_BROADCAST,Method.c_str())==0)
return ET_VENUEBROADCAST;
return ET_UNKNOWN;
};
}
namespace OpenWifi::Provisioning::DeviceClass {
static const char * ANY = "any";
static const char * SUBSCRIBER = "subscriber";
static const char * VENUE = "venue";
static const char * ENTITY = "entity";
inline bool Validate(const char *s) {
static std::vector<std::string> Values{ ANY, ENTITY, SUBSCRIBER, VENUE };
return std::find(cbegin(Values), cend(Values), s) != cend(Values);
}
}
#if defined(__GNUC__ )
#pragma GCC diagnostic pop
#endif
#if defined(__clang__)
#pragma clang diagnostic pop
#endif

View File

@@ -1,131 +0,0 @@
//
// License type: BSD 3-Clause License
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
//
// Created by Stephane Bourque on 2021-03-04.
// Arilia Wireless Inc.
//
#pragma once
#include "Poco/String.h"
namespace OpenWifi::uCentralProtocol {
const int SERIAL_NUMBER_LENGTH = 30;
// vocabulary used in the PROTOCOL.md file
static const char * JSONRPC = "jsonrpc";
static const char * ID = "id";
static const char * UUID = "uuid";
static const char * JSONRPC_VERSION = "2.0";
static const char * METHOD = "method";
static const char * PARAMS = "params";
static const char * SERIAL = "serial";
static const char * FIRMWARE = "firmware";
static const char * CONNECT = "connect";
static const char * STATE = "state";
static const char * HEALTHCHECK = "healthcheck";
static const char * LOG = "log";
static const char * CRASHLOG = "crashlog";
static const char * PING = "ping";
static const char * CFGPENDING = "cfgpending";
static const char * RECOVERY = "recovery";
static const char * COMPRESS_64 = "compress_64";
static const char * CAPABILITIES = "capabilities";
static const char * REQUEST_UUID = "request_uuid";
static const char * SANITY = "sanity";
static const char * DATA = "data";
static const char * LOGLINES = "loglines";
static const char * SEVERITY = "severity";
static const char * ACTIVE = "active";
static const char * OVERRIDEDFS = "override_dfs";
static const char * REBOOT = "reboot";
static const char * WHEN = "when";
static const char * CONFIG = "config";
static const char * EMPTY_JSON_DOC = "{}";
static const char * RESULT = "result";
static const char * REQUEST = "request";
static const char * PERFORM = "perform";
static const char * CONFIGURE = "configure";
static const char * PENDING = "pending";
static const char * SUBMITTED_BY_SYSTEM = "*system";
static const char * URI = "uri";
static const char * COMMAND = "command";
static const char * PAYLOAD = "payload";
static const char * KEEP_REDIRECTOR = "keep_redirector";
static const char * DURATION = "duration";
static const char * PATTERN = "pattern";
static const char * LEDS = "leds";
static const char * ON = "on";
static const char * OFF = "off";
static const char * BLINK = "blink";
static const char * PACKETS = "packets";
static const char * NETWORK = "network";
static const char * INTERFACE = "interface";
static const char * TRACE = "trace";
static const char * WIFISCAN = "wifiscan";
static const char * TYPES = "types";
static const char * EVENT = "event";
static const char * MESSAGE = "message";
static const char * RTTY = "rtty";
static const char * TOKEN = "token";
static const char * SERVER = "server";
static const char * PORT = "port";
static const char * USER = "user";
static const char * TIMEOUT = "timeout";
static const char * UPGRADE = "upgrade";
static const char * FACTORY = "factory";
static const char * VERBOSE = "verbose";
static const char * BANDS = "bands";
static const char * CHANNELS = "channels";
static const char * PASSWORD = "password";
static const char * DEVICEUPDATE = "deviceupdate";
static const char * SERIALNUMBER = "serialNumber";
static const char * COMPATIBLE = "compatible";
static const char * DISCONNECTION = "disconnection";
static const char * TIMESTAMP = "timestamp";
static const char * SYSTEM = "system";
static const char * HOST = "host";
static const char * CONNECTIONIP = "connectionIp";
static const char * TELEMETRY = "telemetry";
enum EVENT_MSG {
ET_UNKNOWN,
ET_CONNECT,
ET_STATE,
ET_HEALTHCHECK,
ET_LOG,
ET_CRASHLOG,
ET_PING,
ET_CFGPENDING,
ET_RECOVERY,
ET_DEVICEUPDATE,
ET_TELEMETRY
};
inline static EVENT_MSG EventFromString(const std::string & Method) {
if (!Poco::icompare(Method, CONNECT)) {
return ET_CONNECT;
} else if (!Poco::icompare(Method, STATE)) {
return ET_STATE;
} else if (!Poco::icompare(Method, HEALTHCHECK)) {
return ET_HEALTHCHECK;
} else if (!Poco::icompare(Method, LOG)) {
return ET_LOG;
} else if (!Poco::icompare(Method, CRASHLOG)) {
return ET_CRASHLOG;
} else if (!Poco::icompare(Method, PING)) {
return ET_PING;
} else if (!Poco::icompare(Method, CFGPENDING)) {
return ET_CFGPENDING;
} else if (!Poco::icompare(Method, RECOVERY)) {
return ET_RECOVERY;
} else if (!Poco::icompare(Method, DEVICEUPDATE)) {
return ET_DEVICEUPDATE;
} else if (!Poco::icompare(Method, TELEMETRY)) {
return ET_TELEMETRY;
} else
return ET_UNKNOWN;
};
}

View File

@@ -47,7 +47,7 @@ namespace OpenWifi {
.revision = Revision, .revision = Revision,
.deviceType = DeviceType, .deviceType = DeviceType,
.endPoint = EndPoint, .endPoint = EndPoint,
.lastUpdate = (uint64_t)std::time(nullptr), .lastUpdate = (uint64_t)OpenWifi::Now(),
.status = "connected"}; .status = "connected"};
return CreateRecord(DI); return CreateRecord(DI);
} }

View File

@@ -20,7 +20,7 @@ namespace OpenWifi {
class DevicesDB : public ORM::DB<DevicesRecordTuple, FMSObjects::DeviceConnectionInformation> { class DevicesDB : public ORM::DB<DevicesRecordTuple, FMSObjects::DeviceConnectionInformation> {
public: public:
DevicesDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L); DevicesDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L);
virtual ~DevicesDB() {};
bool SetDeviceRevision(std::string &SerialNumber, std::string & Revision, std::string & DeviceType, std::string &EndPoint); bool SetDeviceRevision(std::string &SerialNumber, std::string & Revision, std::string & DeviceType, std::string &EndPoint);
bool DeleteDevice( std::string & SerialNumber); bool DeleteDevice( std::string & SerialNumber);
bool SetDeviceDisconnected(std::string &SerialNumber, std::string &EndPoint); bool SetDeviceDisconnected(std::string &SerialNumber, std::string &EndPoint);

View File

@@ -84,7 +84,7 @@ namespace OpenWifi {
} }
void FirmwaresDB::RemoveOldFirmware() { void FirmwaresDB::RemoveOldFirmware() {
uint64_t Limit = std::time(nullptr) - ManifestCreator()->MaxAge(); uint64_t Limit = OpenWifi::Now() - ManifestCreator()->MaxAge();
std::string WhereClause{"imageDate < " + std::to_string(Limit)}; std::string WhereClause{"imageDate < " + std::to_string(Limit)};
DeleteRecords(WhereClause); DeleteRecords(WhereClause);
} }

View File

@@ -32,6 +32,7 @@ namespace OpenWifi {
class FirmwaresDB : public ORM::DB<FirmwaresRecordTuple, FMSObjects::Firmware> { class FirmwaresDB : public ORM::DB<FirmwaresRecordTuple, FMSObjects::Firmware> {
public: public:
FirmwaresDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L); FirmwaresDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L);
virtual ~FirmwaresDB() {};
bool AddFirmware(FMSObjects::Firmware & F); bool AddFirmware(FMSObjects::Firmware & F);
bool UpdateFirmware(std::string & ID, FMSObjects::Firmware & F); bool UpdateFirmware(std::string & ID, FMSObjects::Firmware & F);

View File

@@ -44,15 +44,17 @@ namespace OpenWifi {
return CreateRecord(History); return CreateRecord(History);
} }
bool HistoryDB::AddHistory(std::string &SerialNumber, std::string &DeviceType, std::string &PreviousRevision, bool HistoryDB::AddHistory(const std::string &SerialNumber, const std::string &DeviceType, const std::string &PreviousRevision,
std::string &NewVersion) { const std::string &NewVersion) {
FMSObjects::RevisionHistoryEntry History{ FMSObjects::RevisionHistoryEntry History{
.id = MicroService::CreateUUID(), .id = MicroService::CreateUUID(),
.serialNumber = SerialNumber, .serialNumber = SerialNumber,
.fromRelease = PreviousRevision, .fromRelease = PreviousRevision,
.toRelease = NewVersion, .toRelease = NewVersion,
.upgraded = (uint64_t) std::time(nullptr)}; .commandUUID = "",
.revisionId = "",
.upgraded = OpenWifi::Now()};
FMSObjects::Firmware F; FMSObjects::Firmware F;
if (StorageService()->FirmwaresDB().GetFirmwareByRevision(NewVersion, DeviceType, F)) { if (StorageService()->FirmwaresDB().GetFirmwareByRevision(NewVersion, DeviceType, F)) {
@@ -60,19 +62,81 @@ namespace OpenWifi {
} else { } else {
History.revisionId = "unknown"; History.revisionId = "unknown";
} }
return AddHistory(History); return AddHistory(History);
} }
bool HistoryDB::DeleteHistory(std::string &SerialNumber, std::string &Id) { bool HistoryDB::DeleteHistory([[maybe_unused]] const std::string &SerialNumber, const std::string &Id) {
return DeleteRecord("id", Id); return DeleteRecord("id", Id);
} }
bool HistoryDB::DeleteHistory(std::string &SerialNumber) { bool HistoryDB::DeleteHistory(const std::string &SerialNumber) {
std::string WhereClause{" serialNumber='" + SerialNumber + "' "}; std::string WhereClause{" serialNumber='" + SerialNumber + "' "};
return DeleteRecords(WhereClause); return DeleteRecords(WhereClause);
} }
bool HistoryDB::GetUnknownDeviceFirmwares(uint64_t offset, uint64_t limit,
std::vector<FMSObjects::DeviceCurrentInfo> &Devices) {
typedef Poco::Tuple<std::string, std::string, uint64_t > RecInfo;
std::vector<RecInfo> RecList;
try {
Poco::Data::Session sql_session = Pool_.get();
auto sql_query = fmt::format("select max(upgraded), serialnumber from history where revisionid='unknown' group by serialnumber order by serialnumber offset={} limit={};)", offset, limit);
Poco::Data::Statement sql_statement(sql_session);
sql_statement << sql_query,
Poco::Data::Keywords::into(RecList),
Poco::Data::Keywords::now;
for(const auto &record:RecList) {
FMSObjects::DeviceCurrentInfo entry{
.serialNumber = record.get<1>(),
.revision = "unknown",
.upgraded = record.get<2>()
};
Devices.emplace_back(entry);
}
return true;
} catch (const Poco::Exception &E) {
Logger().log(E);
}
return false;
}
bool HistoryDB::GetDeviceFirmwares(uint64_t offset, uint64_t limit,
std::vector<FMSObjects::DeviceCurrentInfo> &Devices) {
typedef Poco::Tuple<uint64_t, std::string, std::string> RecInfo;
std::vector<RecInfo> RecList;
try {
Poco::Data::Session sql_session = Pool_.get();
auto sql_query = fmt::format("select max(upgraded), serialNumber, toRelease from history where "
"revisionId!='unknown' group by serialNumber, toRelease order by serialNumber, "
"toRelease offset={} limit={};)", offset, limit);
Poco::Data::Statement sql_statement(sql_session);
sql_statement << sql_query,
Poco::Data::Keywords::into(RecList),
Poco::Data::Keywords::now;
for(const auto &record:RecList) {
FMSObjects::DeviceCurrentInfo entry{
.serialNumber = record.get<1>(),
.revision = record.get<2>(),
.upgraded = record.get<0>()
};
Devices.emplace_back(entry);
}
return true;
} catch (const Poco::Exception &E) {
Logger().log(E);
}
return false;
}
} }
template<> void ORM::DB<OpenWifi::HistoryRecordTuple, OpenWifi::FMSObjects::RevisionHistoryEntry>::Convert(const OpenWifi::HistoryRecordTuple &T, OpenWifi::FMSObjects::RevisionHistoryEntry &F ) { template<> void ORM::DB<OpenWifi::HistoryRecordTuple, OpenWifi::FMSObjects::RevisionHistoryEntry>::Convert(const OpenWifi::HistoryRecordTuple &T, OpenWifi::FMSObjects::RevisionHistoryEntry &F ) {

View File

@@ -22,14 +22,18 @@ namespace OpenWifi {
class HistoryDB : public ORM::DB<HistoryRecordTuple, FMSObjects::RevisionHistoryEntry> { class HistoryDB : public ORM::DB<HistoryRecordTuple, FMSObjects::RevisionHistoryEntry> {
public: public:
HistoryDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L); HistoryDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L);
virtual ~HistoryDB() {};
bool GetHistory(const std::string &SerialNumber, uint64_t From, uint64_t HowMany, bool GetHistory(const std::string &SerialNumber, uint64_t From, uint64_t HowMany,
FMSObjects::RevisionHistoryEntryVec &History); FMSObjects::RevisionHistoryEntryVec &History);
bool AddHistory(FMSObjects::RevisionHistoryEntry &History); bool AddHistory(FMSObjects::RevisionHistoryEntry &History);
bool AddHistory(std::string &SerialNumber, std::string &DeviceType, std::string &PreviousRevision, bool AddHistory(const std::string &SerialNumber, const std::string &DeviceType, const std::string &PreviousRevision,
std::string &NewVersion); const std::string &NewVersion);
bool DeleteHistory(std::string &SerialNumber, std::string &Id); bool DeleteHistory(const std::string &SerialNumber, const std::string &Id);
bool DeleteHistory(std::string &SerialNumber); bool DeleteHistory(const std::string &SerialNumber);
bool GetUnknownDeviceFirmwares(uint64_t offset, uint64_t limit, std::vector<FMSObjects::DeviceCurrentInfo> & Devices);
bool GetDeviceFirmwares(uint64_t offset, uint64_t limit, std::vector<FMSObjects::DeviceCurrentInfo> & Devices);
private: private:
}; };

View File

@@ -49,16 +49,16 @@ else
fi fi
login() { login() {
payload="{ \"userId\" : \"$username\" , \"password\" : \"$password\" }" payload="{ \"userId\" : \"$username\" , \"password\" : \"$password\" }"
token=$(curl ${FLAGS} -X POST -H "Content-Type: application/json" -d "$payload" "https://${OWSEC}/api/v1/oauth2" | jq -r '.access_token') token=$(curl ${FLAGS} -X POST -H "Content-Type: application/json" -d "$payload" "https://${OWSEC}/api/v1/oauth2" | jq -r '.access_token')
if [[ "${token}" == "" ]] if [[ "${token}" == "" ]]
then then
echo "Could not login. Please verify the host and username/password." echo "Could not login. Please verify the host and username/password."
exit 13 exit 13
fi fi
echo "${token}" > token.json echo "${token}" > token.json
setfms setfms
} }
findbrowser() { findbrowser() {
@@ -84,7 +84,7 @@ findbrowser() {
setfms() { setfms() {
if [ -z ${OWFMS_OVERRIDE+x} ]; then if [ -z ${OWFMS_OVERRIDE+x} ]; then
curl ${FLAGS} -X GET "https://${OWSEC}/api/v1/systemEndpoints" \ curl ${FLAGS} -X GET "https://${OWSEC}/api/v1/systemEndpoints" \
-H "accept: application/json" \ -H "accept: Application/json" \
-H "Authorization: Bearer ${token}" > ${result_file} -H "Authorization: Bearer ${token}" > ${result_file}
rawurl="$(cat ${result_file} | jq -r '.endpoints[] | select( .type == "owfms" ) | .uri')" rawurl="$(cat ${result_file} | jq -r '.endpoints[] | select( .type == "owfms" ) | .uri')"
if [[ ! -z "${rawurl}" ]]; then if [[ ! -z "${rawurl}" ]]; then
@@ -110,37 +110,41 @@ fi
} }
logout() { logout() {
curl ${FLAGS} -X DELETE -H "Content-Type: application/json" \ curl ${FLAGS} -X DELETE "https://${OWSEC}/api/v1/oauth2/${token}" \
-H "Authorization: Bearer ${token}" \ -H "Content-Type: application/json" \
"https://${OWSEC}/api/v1/oauth2/${token}" -H "Authorization: Bearer ${token}"
rm -rf token.json rm -rf token.json
} }
getfirmwares() { getfirmwares() {
curl ${FLAGS} -X GET -H "Content-Type: application/json" \ curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/firmwares?deviceType=$1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
"https://${OWFMS}/api/v1/firmwares?deviceType=$1" > ${result_file} -H "Accept: application/json" > ${result_file}
jq < ${result_file} jq < ${result_file}
} }
latestfirmware() { latestfirmware() {
curl ${FLAGS} -X GET -H "Content-Type: application/json" \ curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/firmwares?latestOnly=true&deviceType=$1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
"https://${OWFMS}/api/v1/firmwares?latestOnly=true&deviceType=$1" > ${result_file} -H "Accept: application/json" > ${result_file}
jq < ${result_file} jq < ${result_file}
} }
revisions() { revisions() {
curl ${FLAGS} -X GET -H "Content-Type: application/json" \ curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/firmwares?revisionSet=true" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
"https://${OWFMS}/api/v1/firmwares?revisionSet=true" > ${result_file} -H "Accept: application/json" > ${result_file}
jq < ${result_file} jq < ${result_file}
} }
devicetypes() { devicetypes() {
curl ${FLAGS} -X GET -H "Content-Type: application/json" \ curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/firmwares?deviceSet=true" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
"https://${OWFMS}/api/v1/firmwares?deviceSet=true" > ${result_file} -H "Accept: application/json" > ${result_file}
jq < ${result_file} jq < ${result_file}
} }
@@ -152,9 +156,10 @@ firmwareage() {
} }
gethistory() { gethistory() {
curl ${FLAGS} -X GET -H "Content-Type: application/json" \ curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/revisionHistory/$1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
"https://${OWFMS}/api/v1/revisionHistory/$1" > ${result_file} -H "Accept: application/json" > ${result_file}
jq < ${result_file} jq < ${result_file}
} }
@@ -166,64 +171,159 @@ connecteddevice() {
} }
connecteddevices() { connecteddevices() {
curl ${FLAGS} -X GET -H "Content-Type: application/json" \ curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/connectedDevices" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
"https://${OWFMS}/api/v1/connectedDevices" > ${result_file} -H "Accept: application/json" > ${result_file}
jq < ${result_file} jq < ${result_file}
} }
devicereport() { devicereport() {
curl ${FLAGS} -X GET -H "Content-Type: application/json" \ curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/deviceReport" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
"https://${OWFMS}/api/v1/deviceReport" > ${result_file} -H "Accept: application/json" > ${result_file}
jq < ${result_file} jq < ${result_file}
} }
setloglevel() { setloglevel() {
payload="{ \"command\" : \"setloglevel\" , \"subsystems\" : [ { \"tag\" : \"$1\" , \"value\" : \"$2\" } ] }" payload="{ \"command\" : \"setloglevel\" , \"subsystems\" : [ { \"tag\" : \"$1\" , \"value\" : \"$2\" } ] }"
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \ curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
-H "accept: application/json" \ -H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
-d "$payload" -H "Accept: application/json" \
-d "$payload"
} }
getloglevels() { getloglevels() {
payload="{ \"command\" : \"getloglevels\" }" payload="{ \"command\" : \"getloglevels\" }"
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \ curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
-H "accept: application/json" \ -H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
-d "$payload" -H "Accept: application/json" \
-d "$payload"
} }
getloglevelnames() { getloglevelnames() {
payload="{ \"command\" : \"getloglevelnames\" }" payload="{ \"command\" : \"getloglevelnames\" }"
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \ curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
-H "accept: application/json" \ -H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
-d "$payload" -H "Accept: application/json" \
-d "$payload"
} }
getsubsystemnames() { getsubsystemnames() {
payload="{ \"command\" : \"getsubsystemnames\" }" payload="{ \"command\" : \"getsubsystemnames\" }"
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \ curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
-H "accept: application/json" \ -H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
-d "$payload" -H "Accept: application/json" \
-d "$payload"
} }
systeminfo() { systeminfo() {
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/system?command=info" \ curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/system?command=info" \
-H "accept: application/json" \ -H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file} -H "Authorization: Bearer ${token}" \
-H "Accept: application/json" > ${result_file}
jq < ${result_file}
}
getdeviceinfo() {
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/deviceInformation/$1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \
-H "Accept: application/json" > ${result_file}
jq < ${result_file} jq < ${result_file}
} }
reloadsubsystem() { reloadsubsystem() {
payload="{ \"command\" : \"reload\", \"subsystems\" : [ \"$1\" ] }" payload="{ \"command\" : \"reload\", \"subsystems\" : [ \"$1\" ] }"
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \ curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
-H "accept: application/json" \ -H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \ -H "Authorization: Bearer ${token}" \
-d "$payload" -H "Accept: application/json" \
-d "$payload"
}
check_response() {
if [ -s "$1" ]; then
ERROR_CODE="$(jq -r '.ErrorCode' < $1)"
if [[ -n "$ERROR_CODE" && "$ERROR_CODE" != 'null' ]]; then
echo "Error: got HTTP error code $ERROR_CODE, exiting"
exit 1
fi
else
echo "Error: result file not found or empty"
exit 1
fi
}
test_service() {
echo
echo "----------------------"
echo "Get system information"
echo "----------------------"
systeminfo
check_response $result_file
echo
echo "-----------------"
echo "Get device status"
echo "-----------------"
SECONDS=0
TIMEOUT_SECONDS=900
while (( $SECONDS < $TIMEOUT_SECONDS )); do
connecteddevice $1 &>/dev/null
DEVICE_STATUS="$(jq -r '.status' < $result_file)"
if [ "$DEVICE_STATUS" != 'connected' ]; then
echo "Waiting for firmware service to report device status, $SECONDS seconds elapsed"
sleep 30
else
jq < $result_file
break
fi
done
if (( $SECONDS >= $TIMEOUT_SECONDS )); then
echo "Error: timed out getting firmware list"
exit 1
fi
echo
echo "-----------------"
echo "Get firmware list"
echo "-----------------"
SECONDS=0
TIMEOUT_SECONDS=900
while (( $SECONDS < $TIMEOUT_SECONDS )); do
getfirmwares &>/dev/null
check_response $result_file
FIRMWARE_STATUS="$(jq -r '.firmwares' < $result_file)"
if [ "$FIRMWARE_STATUS" == '[]' ]; then
echo "Waiting for service to retrieve firmware list, $SECONDS seconds elapsed"
sleep 30
else
jq < $result_file
break
fi
done
if (( $SECONDS >= $TIMEOUT_SECONDS )); then
echo "Error: timed out getting firmware list"
exit 1
fi
} }
help() { help() {
@@ -245,6 +345,7 @@ help() {
echo "getsubsystemnames Get the list of subsystems." echo "getsubsystemnames Get the list of subsystems."
echo "systeminfo Get basic system information." echo "systeminfo Get basic system information."
echo "reloadsubsystem <subsystem name> Reload the configuration for a subsystem." echo "reloadsubsystem <subsystem name> Reload the configuration for a subsystem."
echo "test_service <serial> Run a set of CLI commands for testing purposes."
echo echo
echo echo
} }
@@ -267,6 +368,8 @@ case "$1" in
"getsubsystemnames") login; getsubsystemnames; logout ;; "getsubsystemnames") login; getsubsystemnames; logout ;;
"reloadsubsystem") login; reloadsubsystem "$2"; logout ;; "reloadsubsystem") login; reloadsubsystem "$2"; logout ;;
"systeminfo") login; systeminfo ; logout;; "systeminfo") login; systeminfo ; logout;;
"test_service") login; test_service $2; logout;;
"getdeviceinfo") login; getdeviceinfo $2; logout;;
*) help ;; *) help ;;
esac esac

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
# wait-for-postgres.sh # wait-for-postgres.sh
set -e set -e
@@ -20,7 +20,7 @@ if [ "$1" = '/openwifi/owfms' -a "$(id -u)" = '0' ]; then
if [ "$RUN_CHOWN" = 'true' ]; then if [ "$RUN_CHOWN" = 'true' ]; then
chown -R "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG" chown -R "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
fi fi
exec su-exec "$OWFMS_USER" "$@" exec gosu "$OWFMS_USER" "$@"
fi fi
exec "$@" exec "$@"