Compare commits

...

215 Commits

Author SHA1 Message Date
jaspreetsachdev
9dde85495e Updated values to RC3 for ucentralgw 2021-09-07 15:55:32 -04:00
Stephane Bourque
6faec0718b Merge pull request #50 from Telecominfraproject/master
Fixes for AP disconnects
2021-09-07 11:47:37 -07:00
stephb9959
e4e2075021 Merge remote-tracking branch 'origin/master' 2021-09-03 08:03:23 -07:00
stephb9959
314ae21d6a Fixing disconnection bug. 2021-09-03 08:03:12 -07:00
Johann Hoffmann
935cc78bb4 [WIFI-3016] Add support for configuration through environment variables (#48)
* Add template and envsubst call in docker-entrypoint.sh

* Fix env variable name
2021-09-02 19:01:36 +02:00
jaspreetsachdev
417d94476b Updated to 2.1.0-RC2 2021-09-01 23:24:59 -04:00
Stephane Bourque
6318cd0c33 Merge pull request #49 from Telecominfraproject/master
Fix for disconnects
2021-09-01 19:31:37 -07:00
stephb9959
7892489e96 Addressing the failure to close a socket and duplicte logs messages. Docker problem. 2021-09-01 17:25:27 -07:00
stephb9959
24785e2f63 Addressing the failure to close a socket and duplicte logs messages. Docker problem. 2021-09-01 17:05:03 -07:00
stephb9959
52736f4a4c Addressing the failure to close a socket and duplicte logs messages. Docker problem. 2021-09-01 16:38:13 -07:00
stephb9959
e7334122b5 Addressing the failure to close a socket and duplicte logs messages. Docker problem. 2021-09-01 16:14:25 -07:00
stephb9959
33168f35d5 Addressing the failure to close a socket and duplicte logs messages. Docker problem. 2021-09-01 12:05:32 -07:00
oblom0v
cf69a47195 Change image tag to rc version 2021-08-30 18:53:41 +02:00
Johann Hoffmann
df71d60c2c Change ownership of uCentralGW root directory inside Dockerfile (#47) 2021-08-30 14:52:35 +02:00
Dmitry Dunaev
9eef500eb9 [WIFI-3202] Fix: helm path for fileuploader should be in persist dir 2021-08-30 12:11:40 +03:00
Stephane Bourque
8172b9c55e Merge pull request #46 from Telecominfraproject/dev-2.1
Fixing uploads dir
2021-08-26 09:25:06 -07:00
stephb9959
a35d3d73c2 Fixing DB setup 2021-08-26 09:22:21 -07:00
Stephane Bourque
5ae99dd04b Merge pull request #45 from Telecominfraproject/dev-2.1
Merging Dev 2.1 into master
2021-08-26 08:21:19 -07:00
Dmitry Dunaev
5f118b51d4 Merge pull request #42 from Telecominfraproject/feature/wifi-5150--external-db
[WIFI-3150] Add: external databases as optional dependencies for Helm chart
2021-08-24 14:21:48 +03:00
stephb9959
b7a762ad44 Fixing DB setup 2021-08-23 21:42:18 -07:00
stephb9959
a236bd7e4a Fixing DB setup 2021-08-22 08:30:28 -07:00
stephb9959
25af9bee46 Fixing wrong microservice type 2021-08-21 15:15:31 -07:00
stephb9959
897f5076b2 Fixing wrong microservice type 2021-08-21 14:40:03 -07:00
stephb9959
dd7a7bbc74 Moving to OpenWifi namespace 2021-08-21 11:42:36 -07:00
stephb9959
ef4af5b379 Adding example to OpenAPI 2021-08-19 07:45:15 -07:00
stephb9959
cfb562bb7a Fixing the eventqueue command 2021-08-19 07:42:15 -07:00
stephb9959
0675192f2c Microservice bus cleanup 2021-08-18 23:21:41 -07:00
stephb9959
27f0c5fe75 Microservice bus cleanup 2021-08-18 23:21:30 -07:00
stephb9959
5153f16d00 Microservice bus cleanup 2021-08-17 14:24:16 -07:00
stephb9959
deff8e5253 Microservice bus cleanup 2021-08-17 14:15:47 -07:00
stephb9959
152ba10a13 Fixing dashboard associations not being reset between runs. 2021-08-17 09:23:44 -07:00
Dmitry Dunaev
36cb68fef7 [WIFI-3150] Add: external databases as optional dependencies for Helm chart 2021-08-17 13:08:34 +03:00
stephb9959
7874cf3bd0 Adding authenticated web socket interface. 2021-08-13 11:15:42 -07:00
stephb9959
6ea7e93cb0 Adding authenticated web socket interface. 2021-08-13 09:25:33 -07:00
stephb9959
3520fb5ed4 Adding authenticated web socket interface. 2021-08-13 09:20:55 -07:00
stephb9959
c2266581b9 Adding authenticated web socket interface. 2021-08-13 09:02:43 -07:00
stephb9959
389de28cfb Adding authenticated web socket interface. 2021-08-13 08:58:15 -07:00
stephb9959
595dc5d42b Adding authenticated web socket interface. 2021-08-13 08:48:49 -07:00
stephb9959
c1d75c09be Adding authenticated web socket interface. 2021-08-13 08:41:35 -07:00
stephb9959
c0941512ae Adding authenticated web socket interface. 2021-08-13 08:39:38 -07:00
stephb9959
1f83f954dd Adding a command to test the WebSocket interface: wstest 2021-08-12 23:43:31 -07:00
stephb9959
3f7385d248 Fixing WebSocket interface for serial number cache. 2021-08-12 23:34:07 -07:00
stephb9959
25d13d3cb2 Fixing WebSocket interface for serial number cache. 2021-08-12 23:30:46 -07:00
stephb9959
5120b2cb64 Fixing WebSocket interface for serial number cache. 2021-08-12 23:26:09 -07:00
stephb9959
bca4f6cfcd Fixing WebSocket interface for serial number cache. 2021-08-12 22:47:56 -07:00
stephb9959
0b2ca909ed Adding WebSocket generic interface for SerialNumber Search for inventory. 2021-08-12 10:58:11 -07:00
stephb9959
3a5a5ae7bc Adding WebSocket generic interface for SerialNumber Search for inventory. 2021-08-12 10:12:41 -07:00
stephb9959
1d102cf1e9 Adding WebSocket generic interface for SerialNumber Search for inventory. 2021-08-12 10:04:45 -07:00
stephb9959
4644d231c4 Fixing no associations returned for not connected devices. 2021-08-11 15:56:03 -07:00
stephb9959
c50ed2f252 Fixing no associations returned for not connected devices. 2021-08-11 15:42:44 -07:00
stephb9959
7bba3da732 Fixing no associations returned for not connected devices. 2021-08-11 14:15:33 -07:00
stephb9959
6f9abd32e7 Fixing bug where we were still expecting a file after a trace that generated an error. 2021-08-11 09:45:36 -07:00
stephb9959
1c3e98619a Adding Associations in device status. 2021-08-11 08:45:29 -07:00
stephb9959
20fe93fcdc Fixing return values for delete 2021-08-11 07:54:07 -07:00
stephb9959
57a9114ac5 Fixing some minor corner cases error validation for REST calls. 2021-08-05 08:26:16 -07:00
stephb9959
4b2eecf8b0 Addressing Trace issues. 2021-08-04 20:04:38 -07:00
stephb9959
ed88cbfce6 Addressing Trace issues. 2021-08-04 19:52:00 -07:00
stephb9959
f7e70f5839 Addressing Trace issues. 2021-08-04 19:50:11 -07:00
stephb9959
d76ef5e1d0 Addressing Trace issues. 2021-08-04 19:40:47 -07:00
stephb9959
a4cf28c858 Addressing Trace issues. 2021-08-04 11:40:13 -07:00
stephb9959
4f5e21d658 Merge remote-tracking branch 'origin/master' 2021-08-04 11:39:32 -07:00
stephb9959
bd5f7cd373 Addressing Trace issues. 2021-08-04 11:39:24 -07:00
Dmitry Dunaev
d74795fd96 Merge pull request #41 from Telecominfraproject/fix/k8s-security-context
Fix: add securityContext to make mounted volumes accessible by the application user
2021-08-04 18:12:40 +03:00
stephb9959
3fe17e58de Addressing Trace issues. 2021-08-03 23:34:14 -07:00
stephb9959
adba0fbe22 Addressing Trace issues. 2021-08-03 23:22:05 -07:00
stephb9959
64a99e5079 Addressing Trace issues. 2021-08-03 23:12:42 -07:00
stephb9959
34def33f69 Addressing Trace issues. 2021-08-03 23:04:29 -07:00
stephb9959
de34051cd4 Addressing Trace issues. 2021-08-03 22:56:42 -07:00
stephb9959
346d845ee9 Addressing Trace issues. 2021-08-03 22:36:26 -07:00
stephb9959
83ada431de Fixing DB Range settings 2021-08-03 15:38:53 -07:00
stephb9959
2563d7e9b3 Fixing DB Range settings 2021-08-03 15:35:27 -07:00
stephb9959
1f0f3e8f38 Fixing DB Range settings 2021-08-03 14:57:28 -07:00
stephb9959
f13ecd0d1c Fixing DB Range settings 2021-08-03 14:54:37 -07:00
stephb9959
54f35de99f Fixing DB Range settings 2021-08-03 14:53:52 -07:00
stephb9959
f7b6c6f90f Fixing DB Range settings 2021-08-03 14:16:41 -07:00
stephb9959
f003149b8d Fixing DB Range settings 2021-08-03 14:07:11 -07:00
stephb9959
4f9e7c9677 Fixing DB Range settings 2021-08-03 14:05:08 -07:00
stephb9959
14d7aad56c Fixing DB Range settings 2021-08-03 14:00:08 -07:00
stephb9959
aa4d2ae764 Fixing DB Range settings 2021-08-03 12:35:22 -07:00
stephb9959
4e60b248ca Fixing DB Range settings 2021-08-03 12:13:44 -07:00
stephb9959
685f9024d7 Fixing DB Range settings 2021-08-03 11:47:15 -07:00
stephb9959
104d429b69 Fixing DB Range settings 2021-08-03 11:30:51 -07:00
stephb9959
8cf5672a73 Improving OpenSSL support. 2021-08-03 10:48:55 -07:00
stephb9959
186f7624a6 Improving OpenSSL support. 2021-08-03 10:28:42 -07:00
stephb9959
8986cde273 Improving OpenSSL support. 2021-08-03 10:11:02 -07:00
stephb9959
0abc3de4cd Improving OpenSSL support. 2021-08-03 10:07:49 -07:00
stephb9959
d219fab455 Improving OpenSSL support. 2021-08-03 09:54:45 -07:00
stephb9959
3b3e79ac14 Improving OpenSSL support. 2021-08-03 09:39:30 -07:00
stephb9959
2ff32a69e6 Improving OpenSSL support. 2021-08-03 09:32:18 -07:00
stephb9959
2b66f15bda Improving OpenSSL support. 2021-08-03 09:28:14 -07:00
stephb9959
508ff00663 Improving OpenSSL support. 2021-08-03 09:21:32 -07:00
stephb9959
d0fc391cde Improving OpenSSL support. 2021-08-03 09:14:29 -07:00
Dmitry Dunaev
77a031eaa3 [WIFI-3332] Fix: add securityContext to make mounted volumes accessible by the application user 2021-08-03 18:47:59 +03:00
stephb9959
a6f6421992 Improving OpenSSL support. 2021-08-03 08:03:14 -07:00
stephb9959
fdf497397e Improving OpenSSL support. 2021-08-03 07:54:43 -07:00
stephb9959
ab605655e1 Improving OpenSSL support. 2021-08-03 07:47:28 -07:00
stephb9959
422574ed65 Improving OpenSSL support. 2021-08-03 07:38:12 -07:00
stephb9959
34f9b6f761 Improving OpenSSL support. 2021-08-03 07:33:31 -07:00
stephb9959
27e8178444 Improving OpenSSL support. 2021-08-03 07:29:08 -07:00
stephb9959
ba6796cd16 Improving OpenSSL support. 2021-08-03 07:25:13 -07:00
stephb9959
816d5da3ba Improving OpenSSL support. 2021-08-03 07:17:47 -07:00
stephb9959
c9c3c16e0b Improving OpenSSL support. 2021-08-02 23:00:13 -07:00
stephb9959
35dc055c40 Improving OpenSSL support. 2021-08-02 22:57:48 -07:00
stephb9959
6760ca1da1 Improving OpenSSL support. 2021-08-02 22:47:58 -07:00
stephb9959
36e6ee3ac4 Improving OpenSSL support. 2021-08-02 22:18:09 -07:00
stephb9959
362d97de1f Improving OpenSSL support. 2021-08-02 22:15:23 -07:00
stephb9959
530a2bb772 Improving OpenSSL support. 2021-08-02 22:12:15 -07:00
stephb9959
b333af3465 Improving OpenSSL support. 2021-08-02 22:10:46 -07:00
stephb9959
1b405987bf Improving OpenSSL support. 2021-08-02 22:07:29 -07:00
stephb9959
6dd52f86b9 Improving OpenSSL support. 2021-08-02 21:12:38 -07:00
stephb9959
76081e82af Improving OpenSSL support. 2021-08-02 20:54:47 -07:00
stephb9959
ebe2d16a87 Improving OpenSSL support. 2021-08-02 15:40:34 -07:00
stephb9959
60e4ced29a Improving OpenSSL support. 2021-08-02 15:33:24 -07:00
stephb9959
5683054349 Improving OpenSSL support. 2021-08-02 15:29:44 -07:00
stephb9959
210a96c143 Improving OpenSSL support. 2021-08-02 15:00:54 -07:00
stephb9959
92e108aa6b Improving OpenSSL support. 2021-08-02 14:54:49 -07:00
stephb9959
691b82589d Improving OpenSSL support. 2021-08-02 14:54:01 -07:00
stephb9959
4b471af065 Improving OpenSSL support. 2021-08-02 14:51:15 -07:00
stephb9959
3c556da991 Improving OpenSSL support. 2021-08-02 14:48:04 -07:00
stephb9959
9ddd371c86 Improving OpenSSL support. 2021-08-02 14:42:52 -07:00
stephb9959
5391468ea2 Improving OpenSSL support. 2021-08-02 14:37:36 -07:00
stephb9959
8daffc2ccf Improving OpenSSL support. 2021-08-02 14:36:15 -07:00
stephb9959
f58c204f51 Improving OpenSSL support. 2021-08-02 14:28:13 -07:00
stephb9959
5e857d6019 Improving OpenSSL support. 2021-08-02 14:16:47 -07:00
stephb9959
a7fe50f956 Improving OpenSSL support. 2021-08-02 14:15:07 -07:00
stephb9959
40239079a4 Improving OpenSSL support. 2021-08-02 10:09:42 -07:00
stephb9959
27c4602fca Improving OpenSSL support. 2021-08-02 09:52:38 -07:00
stephb9959
c107c6da93 Improving OpenSSL support. 2021-08-02 09:50:29 -07:00
stephb9959
f67995b4a9 Improving OpenSSL support. 2021-08-02 09:49:19 -07:00
stephb9959
851fdb1f1d Improving OpenSSL support. 2021-08-02 09:43:17 -07:00
stephb9959
8f52dc57ba Improving OpenSSL support. 2021-08-02 09:39:52 -07:00
stephb9959
427ee37b16 Improving OpenSSL support. 2021-08-02 09:37:29 -07:00
stephb9959
fc153f7fc9 Merge remote-tracking branch 'origin/master' 2021-08-02 09:31:04 -07:00
stephb9959
5c9f571565 Improving OpenSSL support. 2021-08-02 09:30:52 -07:00
stephb9959
ab3905f6d8 Improving OpenSSL support. 2021-08-02 09:29:56 -07:00
Dmitry Dunaev
9cee7d4588 [WIFI-3286] Fix: set default logging to stdout 2021-08-02 15:32:43 +03:00
stephb9959
dd95731b22 Improving OpenSSL support. 2021-08-01 22:43:01 -07:00
stephb9959
101384d595 Improving OpenSSL support. 2021-08-01 22:41:21 -07:00
stephb9959
77297d5a3e Improving OpenSSL support. 2021-08-01 22:36:53 -07:00
stephb9959
8b3c3a50ed Improving OpenSSL support. 2021-08-01 22:29:28 -07:00
stephb9959
4b5128e41d Trying to improve connection speed. 2021-07-31 20:38:33 -07:00
stephb9959
b11d713e5b Adding associations in the dashboard 2021-07-30 22:17:18 -07:00
stephb9959
143c4078d4 Fixing dashboard. 2021-07-29 22:24:50 -07:00
stephb9959
b6babaa2f8 Fixing dashboard. 2021-07-29 16:28:47 -07:00
stephb9959
57f0425bc0 Chaning mutex types. 2021-07-29 14:29:05 -07:00
stephb9959
c28159ebe7 Chaning mutex types. 2021-07-29 14:18:37 -07:00
stephb9959
2a0be33c23 Chaning mutex types. 2021-07-29 13:24:46 -07:00
stephb9959
f1c77c0a63 Chaning mutex types. 2021-07-29 11:47:59 -07:00
stephb9959
64fd80f489 Changing version 2021-07-28 11:08:11 -07:00
stephb9959
840481f0d0 Changing version 2021-07-28 08:34:40 -07:00
stephb9959
f7e450a66e Merge remote-tracking branch 'origin/master' 2021-07-28 08:31:47 -07:00
stephb9959
2d8f925115 Chaning version 2021-07-28 08:31:38 -07:00
Dmitry Dunaev
3988f6c38c Fix: use more accessable path for logs 2021-07-28 11:37:06 +03:00
Dmitry Dunaev
4d1ebd398a Fix: logging.channels.c2.path for helm deployment 2021-07-28 11:23:46 +03:00
Dmitry Dunaev
2790fb0de1 Merge pull request #40 from Telecominfraproject/fix/make-chown-optional
Fix: make chown execution optional in docker-entrypoint
2021-07-28 10:58:12 +03:00
Dmitry Dunaev
02c40835f5 Fix: make chown execution optional in docker-entrypoint 2021-07-28 10:58:00 +03:00
stephb9959
4c75a2cd71 Adding systemd script. 2021-07-27 20:09:56 -07:00
stephb9959
d0df73fa86 Fixing uptime. 2021-07-27 15:42:12 -07:00
stephb9959
660570df44 Merge remote-tracking branch 'origin/master' 2021-07-27 12:02:47 -07:00
stephb9959
5f8f4137b0 Fixed wrong header in Kafka message 2021-07-27 12:02:34 -07:00
Johann Hoffmann
de164d30dd [WIFI-3232] Fix Docker Compose deployment (#39)
* Add entrypoint script with chown and the possibility to run as a non-priviliged user

* Fix docker-entrypoint.sh permissions

* Set permissions on docker-entrypoint.sh since Git preserves executable bit

* Change to colon separator
2021-07-27 15:12:28 +02:00
stephb9959
a69c51afd3 Merge remote-tracking branch 'origin/master' 2021-07-23 18:43:11 -07:00
stephb9959
161ddd281e Fixed wrong header in Kafka message 2021-07-23 18:43:04 -07:00
Dmitry Dunaev
5e36935f3b Merge pull request #38 from Telecominfraproject/feature/add-build
[WIFI-3223] Add: build file for correct versioning
2021-07-23 19:27:56 +03:00
Dmitry Dunaev
91dd93fcd5 [WIFI-3223] Add: build file for correct versioning 2021-07-23 19:27:44 +03:00
cbuschfb
12152a6a6e Merge branch 'master' of https://github.com/Telecominfraproject/wlan-cloud-ucentralgw 2021-07-23 08:20:38 -04:00
cbuschfb
326b33ce63 expressWiFi config example
Signed-off-by: cbuschfb <chrisbusch@fb.com>
2021-07-23 08:20:02 -04:00
stephb9959
9effac0c6e Fixed wrong header in Kafka message 2021-07-22 09:24:28 -07:00
stephb9959
4bc8788df2 Fixed wrong header in Kafka message 2021-07-21 16:47:54 -07:00
stephb9959
e8cfcbb507 Fixed wrong header in Kafka message 2021-07-21 14:41:48 -07:00
stephb9959
44f427fcc7 Fixed wrong header in Kafka message 2021-07-21 14:37:45 -07:00
stephb9959
487e043e4f Fixed wrong header in Kafka message 2021-07-21 14:31:58 -07:00
stephb9959
6d294e6add Fixed wrong header in Kafka message 2021-07-21 12:10:27 -07:00
stephb9959
d39fe0b07c Fixed wrong header in Kafka message 2021-07-21 12:04:17 -07:00
stephb9959
64719877f3 Fixed wrong header in Kafka message 2021-07-21 12:01:23 -07:00
stephb9959
127e455fe5 Fixed wrong header in Kafka message 2021-07-21 11:51:23 -07:00
stephb9959
e7b625d058 Fixed wrong header in Kafka message 2021-07-21 11:45:58 -07:00
stephb9959
fdccb31482 Fixed wrong header in Kafka message 2021-07-21 11:35:38 -07:00
stephb9959
fc1daade6e Merge remote-tracking branch 'origin/master' 2021-07-21 11:32:42 -07:00
stephb9959
99e937614b Fixed wrong header in Kafka message 2021-07-21 11:32:35 -07:00
Dmitry Dunaev
f341598056 Merge pull request #37 from Telecominfraproject/feature/helm-docs
[WIFI-2592] Add: Helm README
2021-07-21 14:28:29 +03:00
Dmitry Dunaev
0f6ec15fa2 [WIFI-2592] Add: Helm README 2021-07-21 14:11:13 +03:00
Johann Hoffmann
34a04b406c [WIFI-3045] Move docker-compose including documentation to wlan-cloud-ucentral-deploy (#36)
* Move Docker Compose deployment to wlan-cloud-ucentral-deploy repo

* Fixed CA cert path

* Remove working-directory since both repositories are used
2021-07-20 14:02:19 +02:00
stephb9959
a2ae90a7cb Fixed wrong header in Kafka message 2021-07-19 23:57:24 -07:00
stephb9959
52e252576a Fixed wrong header in Kafka message 2021-07-19 21:48:11 -07:00
stephb9959
9345c4892d Fixing security on internal web service & kafka. 2021-07-19 09:38:04 -07:00
stephb9959
89c325190a Merge remote-tracking branch 'origin/master' 2021-07-19 09:27:45 -07:00
stephb9959
add35585e0 Fixing security on internal web service & kafka. 2021-07-19 09:27:38 -07:00
Dmitry Dunaev
b8fe3e41fa Merge pull request #35 from Telecominfraproject/feature/git-release
[WIFI-2622] Add: branching release model in CI
2021-07-19 17:08:07 +03:00
stephb9959
bb4effa518 Fixing slow Kafka and removing callback system (replaced by Kafka). 2021-07-18 21:15:35 -07:00
stephb9959
997f2c4787 Fixing slow Kafka and removing callback system (replaced by Kafka). 2021-07-18 21:14:11 -07:00
stephb9959
56f0a3f46a Fixing slow Kafka and removing callback system (replaced by Kafka). 2021-07-18 21:12:12 -07:00
stephb9959
ff911cb478 Fixing --version command line option. 2021-07-17 20:09:49 -07:00
stephb9959
f31aa8711e Merge remote-tracking branch 'origin/master' 2021-07-17 17:35:21 -07:00
stephb9959
523bbbcb84 Removing ODBC dependencies, removing stray debug statement. 2021-07-17 17:35:11 -07:00
Dmitry Dunaev
0010a5fc02 [WIFI-2622] Add: branching release model in CI 2021-07-16 18:17:25 +03:00
cbuschfb
8a440cfcd8 type wifi-frames 2GHz
Signed-off-by: cbuschfb <chrisbusch@fb.com>
2021-07-16 09:47:56 -04:00
cbuschfb
3ebd5426f4 Add wifi-frames as metrics service to SSIDs
Signed-off-by: cbuschfb <chrisbusch@fb.com>
2021-07-16 09:38:53 -04:00
cbuschfb
46b3cad88b Basic metrics with NAT mode Dual SSID (2ghz/5Ghz)
Signed-off-by: cbuschfb <chrisbusch@fb.com>
2021-07-16 09:25:18 -04:00
stephb9959
e756a7c1cd Merge remote-tracking branch 'origin/master' 2021-07-15 21:03:02 -07:00
stephb9959
8e216417f7 Fixed a Kafka startup bug 2021-07-15 21:02:54 -07:00
Johann Hoffmann
3a7a386a87 Add ucentralgw user in Dockerfile and adapt script (#34) 2021-07-15 10:46:52 +02:00
stephb9959
ebc6af17b3 Merge remote-tracking branch 'origin/master' 2021-07-14 07:23:46 -07:00
stephb9959
c3d17499b1 Final refactor of namespace before merge. 2021-07-14 07:23:39 -07:00
Johann Hoffmann
01473a337b Update README.md 2021-07-14 14:07:06 +02:00
oblom0v
4e9dfe53d5 Fix script path 2021-07-14 13:17:15 +02:00
oblom0v
39a6daecf5 Fix Docker Compose CI workflow 2021-07-14 12:59:50 +02:00
stephb9959
897dc735d1 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-ucentralgw 2021-07-13 18:07:34 -07:00
stephb9959
8c406c57e0 Removed extra apostrophe 2021-07-14 01:06:20 +00:00
stephb9959
923386a06f Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-ucentralgw 2021-07-13 17:51:56 -07:00
stephb9959
ca52d187ca Final refactor of namespace before merge. 2021-07-13 17:50:20 -07:00
Stephane Bourque
925285b7db Merge pull request #33 from Telecominfraproject/dev-microservice
Moving microservice into main
2021-07-13 08:15:26 -07:00
oblom0v
f8fd154dd8 Fix script name 2021-07-13 17:11:08 +02:00
oblom0v
8b0586b122 Adapt new config file changes 2021-07-13 17:05:10 +02:00
oblom0v
4d119fabd5 Remove duplicate ucentralgw-ui entry and adapt Docker Compose CI job to microservice structure 2021-07-13 16:55:31 +02:00
147 changed files with 3328 additions and 2726 deletions

View File

@@ -7,11 +7,12 @@ on:
- '**.md' - '**.md'
branches: branches:
- master - master
- dev-microservice - 'release/*'
tags:
- 'v*'
pull_request: pull_request:
branches: branches:
- master - master
- dev-microservice
defaults: defaults:
run: run:
@@ -26,87 +27,102 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: build Docker image - name: Build Docker image
run: docker build -t wlan-cloud-ucentralgw:${{ github.sha }} . run: docker build -t wlan-cloud-ucentralgw:${{ github.sha }} .
- name: log into Docker registry - name: Tag Docker image
run: |
TAGS="${{ github.sha }}"
if [[ ${GITHUB_REF} == "refs/heads/"* ]]
then
CURRENT_TAG=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')
TAGS="$TAGS $CURRENT_TAG"
else
if [[ ${GITHUB_REF} == "refs/tags/"* ]]
then
CURRENT_TAG=$(echo ${GITHUB_REF#refs/tags/} | tr '/' '-')
TAGS="$TAGS $CURRENT_TAG"
else # PR build
CURRENT_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
TAGS="$TAGS $CURRENT_TAG"
fi
fi
echo "Result tags: $TAGS"
for tag in $TAGS; do
docker tag wlan-cloud-ucentralgw:${{ github.sha }} ${{ env.DOCKER_REGISTRY_URL }}/ucentralgw:$tag
done
- name: Log into Docker registry
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
uses: docker/login-action@v1 uses: docker/login-action@v1
with: with:
registry: ${{ env.DOCKER_REGISTRY_URL }} registry: ${{ env.DOCKER_REGISTRY_URL }}
username: ${{ env.DOCKER_REGISTRY_USERNAME }} username: ${{ env.DOCKER_REGISTRY_USERNAME }}
password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }} password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
- name: push Docker image - name: Push Docker images
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
run: | run: |
TAGS="${{ github.sha }}" docker images | grep ${{ env.DOCKER_REGISTRY_URL }}/ucentralgw | awk -F ' ' '{print $1":"$2}' | xargs -I {} docker push {}
if [ ${GITHUB_REF} == "refs/heads/master" ]
then
TAGS="$TAGS ${GITHUB_REF#refs/heads/}"
else # PR build
CURRENT_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
TAGS="$TAGS $CURRENT_TAG"
fi
echo "Pushing tags $TAGS"
for tag in $TAGS; do
docker tag wlan-cloud-ucentralgw:${{ github.sha }} ${{ env.DOCKER_REGISTRY_URL }}/ucentralgw:$tag
docker push ${{ env.DOCKER_REGISTRY_URL }}/ucentralgw:$tag
done
docker-compose: docker-compose:
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
needs: docker needs: docker
steps: steps:
- name: Check out repository - name: Check out wlan-cloud-ucentral-deploy repository
uses: actions/checkout@v2 uses: actions/checkout@v2
with:
- name: Create certificate and key files from Github secrets repository: Telecominfraproject/wlan-cloud-ucentral-deploy
env: path: wlan-cloud-ucentral-deploy
DIGICERT_TIP_WILDCARD_CERT: ${{ secrets.DIGICERT_TIP_WILDCARD_CERT }}
DIGICERT_TIP_WILDCARD_KEY: ${{ secrets.DIGICERT_TIP_WILDCARD_KEY }}
run: |
cat certificates/issuer.pem certificates/root.pem > docker-compose/ucentral-data/certs/restapi-ca.pem
echo "$DIGICERT_TIP_WILDCARD_CERT" > docker-compose/ucentral-data/certs/websocket-cert.pem
echo "$DIGICERT_TIP_WILDCARD_CERT" > docker-compose/ucentral-data/certs/restapi-cert.pem
echo "$DIGICERT_TIP_WILDCARD_KEY" > docker-compose/ucentral-data/certs/websocket-key.pem
echo "$DIGICERT_TIP_WILDCARD_KEY" > docker-compose/ucentral-data/certs/restapi-key.pem
- name: Instantiate Docker Compose deployment - name: Instantiate Docker Compose deployment
working-directory: ./docker-compose working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
env: env:
UCENTRALGW_TAG: ${{ github.sha }} UCENTRALGW_TAG: ${{ github.sha }}
run: | run: |
docker-compose up -d docker-compose up -d
- name: Wait for uCentralGW to be alive and kicking - name: Wait for uCentralSec to be alive and kicking
run: | run: |
n=0 n=0
until [ "$n" -ge 3 ] until [ "$n" -ge 3 ]
do do
curl -s 127.0.0.1:15015 && break curl -s 127.0.0.1:16102 && break
n=$((n+1)) n=$((n+1))
if [ "$n" -eq 3]; then if [ "$n" -eq 3]; then
exit 1 exit 1
else else
sleep 3 sleep 3
fi fi
done done
- name: Check functionality of uCentralGW - name: Add self-signed certificates to system trust store of containers
env: working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
UCENTRALGW: "ucentral.cicd.lab.wlan.tip.build:16001"
FLAGS: "-s --cacert docker-compose/ucentral-data/certs/restapi-ca.pem --resolve ucentral.cicd.lab.wlan.tip.build:16001:127.0.0.1"
run: | run: |
./test_scripts/curl/cli listdevices ./add-ca-cert.sh
- name: Check out wlan-cloud-ucentralgw repository
uses: actions/checkout@v2
with:
path: wlan-cloud-ucentralgw
- name: Check functionality of microservices
env:
UCENTRALSEC: "ucentral.wlan.local:16001"
FLAGS: "-s --cacert ./wlan-cloud-ucentral-deploy/docker-compose/certs/restapi-ca.pem --resolve ucentral.wlan.local:16001:127.0.0.1"
run: |
./wlan-cloud-ucentralgw/test_scripts/curl/cli listdevices
- name: Display information about running containers and log ucentralgw output - name: Display information about running containers and log ucentralgw output
working-directory: ./docker-compose working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
if: always() if: always()
run: | run: |
docker-compose ps -a docker-compose ps -a
docker-compose logs docker-compose logs
# disable until repo is public # disable until repo is public
#- name: export Docker image #- name: export Docker image

View File

@@ -4,7 +4,6 @@ on:
pull_request: pull_request:
branches: branches:
- master - master
- dev-microservice
types: [ closed ] types: [ closed ]
defaults: defaults:

3
.gitignore vendored
View File

@@ -25,3 +25,6 @@ _deps
test_scripts/curl/token.json test_scripts/curl/token.json
.vscode/c_cpp_properties.json .vscode/c_cpp_properties.json
test_scripts/curl/result.json test_scripts/curl/result.json
*.swp
helm/charts/*
!helm/charts/.gitkeep

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.13) cmake_minimum_required(VERSION 3.13)
project(ucentralgw VERSION 0.4.0) project(ucentralgw VERSION 2.1.0)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
@@ -45,8 +45,7 @@ else()
find_package(CppKafka REQUIRED) find_package(CppKafka REQUIRED)
find_package(PostgreSQL REQUIRED) find_package(PostgreSQL REQUIRED)
find_package(MySQL REQUIRED) find_package(MySQL REQUIRED)
find_package(ODBC REQUIRED) find_package(Poco REQUIRED COMPONENTS JSON Crypto JWT Net Util NetSSL Data DataSQLite DataPostgreSQL DataMySQL)
find_package(Poco REQUIRED COMPONENTS JSON Crypto JWT Net Util NetSSL Data DataSQLite DataPostgreSQL DataMySQL DataODBC)
endif() endif()
include_directories(/usr/local/include /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include) include_directories(/usr/local/include /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include)
@@ -64,7 +63,7 @@ add_executable( ucentralgw
src/RESTAPI_device_handler.cpp src/RESTAPI_device_handler.h src/RESTAPI_device_handler.cpp src/RESTAPI_device_handler.h
src/RESTAPI_handler.cpp src/RESTAPI_handler.h src/RESTAPI_handler.cpp src/RESTAPI_handler.h
src/RESTAPI_device_commandHandler.cpp src/RESTAPI_device_commandHandler.h src/RESTAPI_device_commandHandler.cpp src/RESTAPI_device_commandHandler.h
src/RESTAPI_GWobjects.h src/RESTAPI_GWobjects.cpp src/RESTAPI_GWobjects.h src/RESTAPI_GWobjects.cpp
src/CentralConfig.cpp src/CentralConfig.h src/CentralConfig.cpp src/CentralConfig.h
src/RESTAPI_default_configuration.cpp src/RESTAPI_default_configuration.cpp
src/RESTAPI_InternalServer.cpp src/RESTAPI_InternalServer.h src/RESTAPI_InternalServer.cpp src/RESTAPI_InternalServer.h
@@ -74,21 +73,29 @@ add_executable( ucentralgw
src/RESTAPI_command.cpp src/RESTAPI_command.h src/RESTAPI_command.cpp src/RESTAPI_command.h
src/FileUploader.cpp src/FileUploader.h src/FileUploader.cpp src/FileUploader.h
src/RESTAPI_file.cpp src/RESTAPI_file.h src/RESTAPI_file.cpp src/RESTAPI_file.h
src/CommandChannel.cpp src/CommandChannel.h
src/RESTAPI_system_command.cpp src/RESTAPI_system_command.h src/RESTAPI_system_command.cpp src/RESTAPI_system_command.h
src/RESTAPI_BlackList.cpp src/RESTAPI_BlackList.h src/RESTAPI_BlackList.cpp src/RESTAPI_BlackList.h
src/Utils.h src/Utils.cpp src/storage_blacklist.cpp src/Utils.h src/Utils.cpp src/storage_blacklist.cpp
src/storage_command.cpp src/storage_healthcheck.cpp src/storage_statistics.cpp src/storage_logs.cpp src/storage_command.cpp src/storage_healthcheck.cpp src/storage_statistics.cpp src/storage_logs.cpp
src/storage_device.cpp src/storage_capabilities.cpp src/storage_defconfig.cpp src/storage_sqlite.cpp src/storage_device.cpp src/storage_capabilities.cpp src/storage_defconfig.cpp
src/storage_mysql.cpp src/storage_pgql.cpp src/storage_odbc.cpp src/storage_tables.cpp src/RESTAPI_callback.cpp src/storage_tables.cpp
src/RESTAPI_callback.h src/CallbackManager.cpp src/CallbackManager.h src/storage_setup.cpp
src/StateProcessor.cpp src/StateProcessor.h src/StateProcessor.cpp src/StateProcessor.h
src/storage_lifetime_stats.cpp src/uCentralProtocol.h src/RESTAPI_protocol.h src/storage_lifetime_stats.cpp src/uCentralProtocol.h src/RESTAPI_protocol.h
src/ALBHealthCheckServer.h src/Kafka_topics.h src/uCentralTypes.h src/ALBHealthCheckServer.h src/Kafka_topics.h
src/OUIServer.cpp src/OUIServer.h src/OUIServer.cpp src/OUIServer.h
src/RESTAPI_ouis.cpp src/RESTAPI_ouis.h src/RESTAPI_ouis.cpp src/RESTAPI_ouis.h
src/MicroService.cpp src/MicroService.h src/MicroService.cpp src/MicroService.h
src/RESTAPI_RPC.cpp src/RESTAPI_RPC.h src/AuthClient.cpp src/AuthClient.h src/OpenAPIRequest.cpp src/OpenAPIRequest.h src/RESTAPI_utils.h src/RESTAPI_utils.cpp src/StorageArchiver.cpp src/StorageArchiver.h) src/RESTAPI_RPC.cpp src/RESTAPI_RPC.h
src/AuthClient.cpp src/AuthClient.h
src/OpenAPIRequest.cpp src/OpenAPIRequest.h
src/RESTAPI_utils.h src/RESTAPI_utils.cpp
src/StorageArchiver.cpp src/StorageArchiver.h
src/Dashboard.cpp src/Dashboard.h
src/RESTAPI_deviceDashboardHandler.cpp src/RESTAPI_deviceDashboardHandler.h
src/SerialNumberCache.cpp src/SerialNumberCache.h
src/RESTAPI_webSocketServer.cpp src/RESTAPI_webSocketServer.h
src/OpenWifiTypes.h)
if(NOT SMALL_BUILD) if(NOT SMALL_BUILD)
target_sources(ucentralgw PUBLIC src/KafkaManager.cpp src/KafkaManager.h) target_sources(ucentralgw PUBLIC src/KafkaManager.cpp src/KafkaManager.h)
@@ -102,7 +109,7 @@ target_link_libraries(ucentralgw PUBLIC
${Poco_LIBRARIES} ${Boost_LIBRARIES} ${ZLIB_LIBRARIES}) ${Poco_LIBRARIES} ${Boost_LIBRARIES} ${ZLIB_LIBRARIES})
if(NOT SMALL_BUILD) if(NOT SMALL_BUILD)
target_link_libraries(ucentralgw PUBLIC target_link_libraries(ucentralgw PUBLIC
${MySQL_LIBRARIES} ${ODBC_LIBRARIES} ${ZLIB_LIBRARIES} ${MySQL_LIBRARIES} ${ZLIB_LIBRARIES}
CppKafka::cppkafka CppKafka::cppkafka
) )
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)

View File

@@ -1,13 +1,13 @@
FROM alpine AS builder FROM alpine AS builder
RUN apk update && \ RUN apk add --update --no-cache \
apk add --no-cache openssl openssh && \ openssl openssh \
apk add --no-cache ncurses-libs && \ ncurses-libs \
apk add --no-cache bash util-linux coreutils curl && \ bash util-linux coreutils curl \
apk add --no-cache make cmake gcc g++ libstdc++ libgcc git zlib-dev yaml-cpp-dev && \ make cmake gcc g++ libstdc++ libgcc git zlib-dev yaml-cpp-dev \
apk add --no-cache openssl-dev boost-dev unixodbc-dev postgresql-dev mariadb-dev && \ openssl-dev boost-dev unixodbc-dev postgresql-dev mariadb-dev \
apk add --no-cache apache2-utils yaml-dev apr-util-dev && \ apache2-utils yaml-dev apr-util-dev \
apk add --no-cache lua-dev librdkafka-dev lua-dev librdkafka-dev
RUN git clone https://github.com/stephb9959/poco /poco RUN git clone https://github.com/stephb9959/poco /poco
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
@@ -26,7 +26,7 @@ RUN cmake ..
RUN cmake --build . --config Release -j8 RUN cmake --build . --config Release -j8
RUN cmake --build . --target install RUN cmake --build . --target install
ADD CMakeLists.txt /ucentralgw/ ADD CMakeLists.txt build /ucentralgw/
ADD cmake /ucentralgw/cmake ADD cmake /ucentralgw/cmake
ADD src /ucentralgw/src ADD src /ucentralgw/src
@@ -38,18 +38,26 @@ RUN cmake --build . --config Release -j8
FROM alpine FROM alpine
ENV UCENTRALGW_USER=ucentralgw \
UCENTRALGW_ROOT=/ucentralgw-data \
UCENTRALGW_CONFIG=/ucentralgw-data
RUN addgroup -S "$UCENTRALGW_USER" && \
adduser -S -G "$UCENTRALGW_USER" "$UCENTRALGW_USER"
RUN mkdir /ucentral RUN mkdir /ucentral
RUN mkdir /ucentralgw-data RUN mkdir -p "$UCENTRALGW_ROOT" "$UCENTRALGW_CONFIG" && \
RUN apk add --update --no-cache librdkafka mariadb-connector-c libpq unixodbc chown "$UCENTRALGW_USER": "$UCENTRALGW_ROOT" "$UCENTRALGW_CONFIG"
RUN apk add --update --no-cache librdkafka mariadb-connector-c libpq unixodbc su-exec gettext
COPY --from=builder /ucentralgw/cmake-build/ucentralgw /ucentral/ucentralgw COPY --from=builder /ucentralgw/cmake-build/ucentralgw /ucentral/ucentralgw
COPY --from=builder /cppkafka/cmake-build/src/lib/* /lib/ COPY --from=builder /cppkafka/cmake-build/src/lib/* /lib/
COPY --from=builder /poco/cmake-build/lib/* /lib/ COPY --from=builder /poco/cmake-build/lib/* /lib/
EXPOSE 15002 COPY ucentralgw.properties.tmpl ${UCENTRALGW_CONFIG}/
EXPOSE 16002 COPY docker-entrypoint.sh /
EXPOSE 16003
EXPOSE 17002
EXPOSE 16102
ENTRYPOINT /ucentral/ucentralgw EXPOSE 15002 16002 16003 17002 16102
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["/ucentral/ucentralgw"]

View File

@@ -26,9 +26,9 @@ Poco may take several minutes depending on the platform you are building on.
### Ubuntu ### Ubuntu
These instructions have proven to work on Ubuntu 20.4. These instructions have proven to work on Ubuntu 20.4.
``` ```
sudo apt install git cmake g++ libssl-dev libmariabd-dev unixodbc-dev sudo apt install git cmake g++ libssl-dev libmariadb-dev unixodbc-dev
sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
sudo apt install librdkafka-dev liblua5.3-dev sudo apt install librdkafka-dev liblua5.3-dev libmysqlclient-dev
git clone https://github.com/stephb9959/poco git clone https://github.com/stephb9959/poco
cd poco cd poco
@@ -153,8 +153,8 @@ cmake -DSMALL_BUILD=1 ..
make make
``` ```
### After the build step is completed ### After completing the build
Once your build is done. You can remove the Poco source as it is no longer needed. After completing the build, you can remove the Poco source as it is no longer needed.
#### Expected directory layout #### Expected directory layout
From the directory where your cloned source is, you will need to create the `certs`, `logs`, and `uploads` directories. From the directory where your cloned source is, you will need to create the `certs`, `logs`, and `uploads` directories.
@@ -220,13 +220,13 @@ in your browner
#### Configuration #### Configuration
The configuration for this service is kept in a properties file. This file is called `ucentralgw.properties` and you can The configuration for this service is kept in a properties file. This file is called `ucentralgw.properties` and you can
see the latest version [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/ucentralgw.properties). The file will be loaded from see the latest version [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/ucentralgw.properties). The file will be loaded from
the directory set by the environment variable `UCENTRAL_CONFIG`. To use environment variables in the configuration, the directory set by the environment variable `UCENTRALGW_CONFIG`. To use environment variables in the configuration,
you must use `$<varname>`. Only `path names` support the use of environment variables. The sample configuration requires very you must use `$<varname>`. Only `path names` support the use of environment variables. The sample configuration requires very
little changes if you keep the suggested directory structure. For the sample configuration to work, you need to define 2 little changes if you keep the suggested directory structure. For the sample configuration to work, you need to define 2
environment variables. environment variables.
``` ```
export UCENTRAL_ROOT=`pwd` export UCENTRALGW_ROOT=`pwd`
export UCENTRAL_CONFIG=`pwd` export UCENTRALGW_CONFIG=`pwd`
``` ```
If you current working directory is the root of the project, this will set the variables properly. Otherwise, you can set the variables If you current working directory is the root of the project, this will set the variables properly. Otherwise, you can set the variables
to point to wherever is necessary. to point to wherever is necessary.
@@ -234,7 +234,7 @@ to point to wherever is necessary.
##### Important config entries ##### Important config entries
###### This is the logging directory ###### This is the logging directory
``` ```
logging.channels.c2.path = $UCENTRAL_ROOT/logs/sample.log logging.channels.c2.path = $UCENTRALGW_ROOT/logs/sample.log
``` ```
###### This is the type of storage in use ###### This is the type of storage in use
@@ -255,11 +255,11 @@ ucentral.devicetypes.2 = IOT:esp32
```asm ```asm
ucentral.restapi.host.0.backlog = 100 ucentral.restapi.host.0.backlog = 100
ucentral.restapi.host.0.security = relaxed ucentral.restapi.host.0.security = relaxed
ucentral.restapi.host.0.rootca = $UCENTRAL_ROOT/certs/restapi-ca.pem ucentral.restapi.host.0.rootca = $UCENTRALGW_ROOT/certs/restapi-ca.pem
ucentral.restapi.host.0.address = * ucentral.restapi.host.0.address = *
ucentral.restapi.host.0.port = 16002 ucentral.restapi.host.0.port = 16002
ucentral.restapi.host.0.cert = $UCENTRAL_ROOT/certs/restapi-cert.pem ucentral.restapi.host.0.cert = $UCENTRALGW_ROOT/certs/restapi-cert.pem
ucentral.restapi.host.0.key = $UCENTRAL_ROOT/certs/restapi-key.pem ucentral.restapi.host.0.key = $UCENTRALGW_ROOT/certs/restapi-key.pem
ucentral.restapi.host.0.key.password = mypassword ucentral.restapi.host.0.key.password = mypassword
``` ```
@@ -309,12 +309,12 @@ You will need to get the `cert.pem` and `key.pem` from Digicert. The rest is her
```asm ```asm
ucentral.websocket.host.0.backlog = 500 ucentral.websocket.host.0.backlog = 500
ucentral.websocket.host.0.rootca = $UCENTRAL_ROOT/certs/root.pem ucentral.websocket.host.0.rootca = $UCENTRALGW_ROOT/certs/root.pem
ucentral.websocket.host.0.issuer = $UCENTRAL_ROOT/certs/issuer.pem ucentral.websocket.host.0.issuer = $UCENTRALGW_ROOT/certs/issuer.pem
ucentral.websocket.host.0.cert = $UCENTRAL_ROOT/certs/websocket-cert.pem ucentral.websocket.host.0.cert = $UCENTRALGW_ROOT/certs/websocket-cert.pem
ucentral.websocket.host.0.key = $UCENTRAL_ROOT/certs/websocket-key.pem ucentral.websocket.host.0.key = $UCENTRALGW_ROOT/certs/websocket-key.pem
ucentral.websocket.host.0.clientcas = $UCENTRAL_ROOT/certs/clientcas.pem ucentral.websocket.host.0.clientcas = $UCENTRALGW_ROOT/certs/clientcas.pem
ucentral.websocket.host.0.cas = $UCENTRAL_ROOT/certs/cas ucentral.websocket.host.0.cas = $UCENTRALGW_ROOT/certs/cas
ucentral.websocket.host.0.address = * ucentral.websocket.host.0.address = *
ucentral.websocket.host.0.port = 15002 ucentral.websocket.host.0.port = 15002
ucentral.websocket.host.0.security = strict ucentral.websocket.host.0.security = strict
@@ -325,15 +325,15 @@ ucentral.websocket.maxreactors = 20
###### This is the end point for the devices when uploading files ###### This is the end point for the devices when uploading files
```asm ```asm
ucentral.fileuploader.host.0.backlog = 100 ucentral.fileuploader.host.0.backlog = 100
ucentral.fileuploader.host.0.rootca = $UCENTRAL_ROOT/certs/restapi-ca.pem ucentral.fileuploader.host.0.rootca = $UCENTRALGW_ROOT/certs/restapi-ca.pem
ucentral.fileuploader.host.0.security = relaxed ucentral.fileuploader.host.0.security = relaxed
ucentral.fileuploader.host.0.address = * ucentral.fileuploader.host.0.address = *
ucentral.fileuploader.host.0.name = 192.168.1.176 ucentral.fileuploader.host.0.name = 192.168.1.176
ucentral.fileuploader.host.0.port = 16003 ucentral.fileuploader.host.0.port = 16003
ucentral.fileuploader.host.0.cert = $UCENTRAL_ROOT/certs/restapi-cert.pem ucentral.fileuploader.host.0.cert = $UCENTRALGW_ROOT/certs/restapi-cert.pem
ucentral.fileuploader.host.0.key = $UCENTRAL_ROOT/certs/restapi-key.pem ucentral.fileuploader.host.0.key = $UCENTRALGW_ROOT/certs/restapi-key.pem
ucentral.fileuploader.host.0.key.password = mypassword ucentral.fileuploader.host.0.key.password = mypassword
ucentral.fileuploader.path = $UCENTRAL_ROOT/uploads ucentral.fileuploader.path = $UCENTRALGW_ROOT/uploads
ucentral.fileuploader.maxsize = 10000 ucentral.fileuploader.maxsize = 10000
``` ```
@@ -369,7 +369,7 @@ can be any of the keys you are already using. You must keep that keep secret and
this is the entry this is the entry
```asm ```asm
ucentral.service.key = $UCENTRAL_ROOT/certs/websocket-key.pem ucentral.service.key = $UCENTRALGW_ROOT/certs/websocket-key.pem
``` ```
#### Command line options #### Command line options
@@ -391,7 +391,7 @@ A uCentral gateway implementation for TIP.
``` ```
##### file ##### file
This allows you to point to another file without specifying the UCENTRAL_CONFIG variable. The file name must end in `.properties`. This allows you to point to another file without specifying the UCENTRALGW_CONFIG variable. The file name must end in `.properties`.
##### daemon ##### daemon
Run this as a UNIX service Run this as a UNIX service
##### pidfile ##### pidfile
@@ -452,7 +452,7 @@ docker run -d -p 15002:15002 \
--init \ --init \
--volume="$PWD:/ucentral-data" \ --volume="$PWD:/ucentral-data" \
-e UCENTRAL_ROOT="/ucentral-data" \ -e UCENTRAL_ROOT="/ucentral-data" \
-e UCENTRAL_CONFIG="/ucentral-data" \ -e UCENTRALGW_CONFIG="/ucentral-data" \
--name="ucentralgw" $DOCKER_NAME --name="ucentralgw" $DOCKER_NAME
``` ```
@@ -493,29 +493,11 @@ Please refer to the `certs` directory from the sections above.
The configuration for this service is kept in a properties file. Currently, this configuration file must be kept in the The configuration for this service is kept in a properties file. Currently, this configuration file must be kept in the
current directory of uCentral or one level up. This file is called `ucentralgw.properties` and you can see the latest version current directory of uCentral or one level up. This file is called `ucentralgw.properties` and you can see the latest version
[here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/ucentralgw.properties). The file will be loaded from [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/ucentralgw.properties). The file will be loaded from
the directory set by the environment variable `UCENTRAL_CONFIG`. To use environment variables in the configuration, the directory set by the environment variable `UCENTRALGW_CONFIG`. To use environment variables in the configuration,
you must use `$<varname>`. The path for the logs for the service must exist prior to starting the you must use `$<varname>`. The path for the logs for the service must exist prior to starting the
service. The path is defined under `logging.channels.c2.path`. Only `path names` support the use of service. The path is defined under `logging.channels.c2.path`. Only `path names` support the use of
environment variables. Here is a sample configuration: environment variables. Here is a sample configuration:
### Docker Compose
The repository also contains a Docker Compose file, which you can use to instantiate a complete deployment of the uCentral microservices and related components for local development purposes. To spin up a local development environment:
1. Switch into the project directory with `cd docker-compose/`.
2. This repository contains a gateway certificate signed by TIP and a self-signed certificate for the REST API and other components which are used by default in the Compose deployment. The certificates are valid for the `*.wlan.local` domain and the Docker Compose uCentral microservice configs use `ucentral.wlan.local` as a hostname, so make sure you add an entry in your hosts file (or in your local DNS solution) which points to `127.0.0.1`.
3. If you have your own certificates and want to use the deployment for anything other than local development copy your certs into the `certs/` directory and reference them in the appropriate sections of the microservice configuration files. Make sure to also adapt the sections which reference the hostname. For more information on certificates please see the [certificates section](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw#certificates) of this README and/or [CERTIFICATES.md](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/CERTIFICATES.md).
4. Docker Compose pulls the microservice images from the JFrog repository. If you want to change the image tag or some of the image versions which are used for the other services, have a look into the `.env` file. You'll also find service specific `.env` files in this directory. Edit them if you want to change database passwords (highly recommended!) or other configuration data. Don't forget to adapt your changes in the application configuration files.
5. Open `docker-compose/ucentralgw-data/ucentral.properties` to change [authentication data](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw#default-username-and-password) for uCentralGW (again highly recommended!).
6. Spin up the deployment with `docker-compose up -d`.
7. Navigate to the UI which listens to `127.0.0.1` and login with your uCentralGW authentication data.
8. To use the [curl test script](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/TEST_CURL.md) to talk to the API set the following environment variables:
```
export UCENTRALSEC="ucentral.wlan.local:16001"
export FLAGS="-s --cacert docker-compose/ucentral-data/certs/restapi-ca.pem"
```
The `--cacert` option is necessary since the REST API certificates are self-signed. Omit the option if you provide your own signed certificates.
PS: The Docker Compose deployment creates five local volumes to persist mostly database data and data for Zookeeper and Kafka. If you want re-create the deployment and remove all persistent application and database data just delete the volumes with `docker volume rm $(docker volume ls -qf name=ucentral)` after you stopped the services with `docker-compose down`.
## uCentral communication protocol ## uCentral communication protocol
The communication protocol between the device and the controller is detailed in this [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/PROTOCOL.md). The communication protocol between the device and the controller is detailed in this [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/PROTOCOL.md).

2
build
View File

@@ -1 +1 @@
113 48

View File

@@ -84,8 +84,9 @@
<Option type="1"/> <Option type="1"/>
<Option compiler="gcc"/> <Option compiler="gcc"/>
<Compiler> <Compiler>
<Add option="-DAPP_VERSION=&quot;0.4.0&quot;"/> <Add option="-DAPP_VERSION=&quot;0.7.0&quot;"/>
<Add option="-DBUILD_NUMBER=&quot;61&quot;"/> <Add option="-DBUILD_NUMBER=&quot;120&quot;"/>
<Add option="-DTIP_GATEWAY_SERVICE=&quot;1&quot;"/>
<Add option="-D_DEBUG"/> <Add option="-D_DEBUG"/>
<Add option="-DPOCO_ENABLE_CPP14"/> <Add option="-DPOCO_ENABLE_CPP14"/>
<Add option="-DPOCO_ENABLE_CPP11"/> <Add option="-DPOCO_ENABLE_CPP11"/>
@@ -98,6 +99,7 @@
<Add option="-DBOOST_ALL_NO_LIB"/> <Add option="-DBOOST_ALL_NO_LIB"/>
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src"/> <Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src"/>
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/include/kafka"/> <Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/include/kafka"/>
<Add directory="/usr/local/opt/mysql-client/include"/>
<Add directory="/usr/local/include"/> <Add directory="/usr/local/include"/>
<Add directory="/usr/local/opt/openssl/include"/> <Add directory="/usr/local/opt/openssl/include"/>
<Add directory="/usr/local/opt/mysql-client/include/mysql"/> <Add directory="/usr/local/opt/mysql-client/include/mysql"/>
@@ -121,8 +123,9 @@
<Option type="1"/> <Option type="1"/>
<Option compiler="gcc"/> <Option compiler="gcc"/>
<Compiler> <Compiler>
<Add option="-DAPP_VERSION=&quot;0.4.0&quot;"/> <Add option="-DAPP_VERSION=&quot;0.7.0&quot;"/>
<Add option="-DBUILD_NUMBER=&quot;61&quot;"/> <Add option="-DBUILD_NUMBER=&quot;120&quot;"/>
<Add option="-DTIP_GATEWAY_SERVICE=&quot;1&quot;"/>
<Add option="-D_DEBUG"/> <Add option="-D_DEBUG"/>
<Add option="-DPOCO_ENABLE_CPP14"/> <Add option="-DPOCO_ENABLE_CPP14"/>
<Add option="-DPOCO_ENABLE_CPP11"/> <Add option="-DPOCO_ENABLE_CPP11"/>
@@ -135,6 +138,7 @@
<Add option="-DBOOST_ALL_NO_LIB"/> <Add option="-DBOOST_ALL_NO_LIB"/>
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src"/> <Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src"/>
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/include/kafka"/> <Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/include/kafka"/>
<Add directory="/usr/local/opt/mysql-client/include"/>
<Add directory="/usr/local/include"/> <Add directory="/usr/local/include"/>
<Add directory="/usr/local/opt/openssl/include"/> <Add directory="/usr/local/opt/openssl/include"/>
<Add directory="/usr/local/opt/mysql-client/include/mysql"/> <Add directory="/usr/local/opt/mysql-client/include/mysql"/>
@@ -155,16 +159,106 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/build"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/build">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/ALBHealthCheckServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/AuthClient.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/AuthClient.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CentralConfig.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CentralConfig.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandChannel.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandChannel.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandManager.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandManager.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Daemon.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Daemon.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/DeviceRegistry.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/DeviceRegistry.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/FileUploader.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/FileUploader.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/KafkaManager.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/KafkaManager.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Kafka_topics.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/MicroService.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/MicroService.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OUIServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OUIServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OpenAPIRequest.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OpenAPIRequest.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_BlackList.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_BlackList.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_BlackList.h"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_BlackList.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_callback.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_GWobjects.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_callback.h"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_GWobjects.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_InternalServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_InternalServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_RPC.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_RPC.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_SecurityObjects.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_SecurityObjects.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_command.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_command.cpp">
@@ -221,16 +315,13 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_handler.h"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_handler.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_oauth2Handler.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_ouis.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_oauth2Handler.h"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_ouis.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_objects.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_protocol.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_objects.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_server.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_server.cpp">
@@ -245,16 +336,46 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_system_command.h"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_system_command.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_unknownRequestHandler.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_utils.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_unknownRequestHandler.h"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_utils.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/kafka_service.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StateProcessor.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/kafka_service.h"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StateProcessor.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageArchiver.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageArchiver.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageService.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageService.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/SubSystemServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/SubSystemServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Utils.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Utils.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/WebSocketServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/WebSocketServer.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_blacklist.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_blacklist.cpp">
@@ -272,13 +393,10 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_device.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_device.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_firmware_updates.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_healthcheck.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_healthcheck.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_identity.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_lifetime_stats.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_logs.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_logs.cpp">
@@ -287,9 +405,6 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_mysql.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_mysql.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_odbc.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_pgql.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_pgql.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
@@ -302,82 +417,10 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_tables.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_tables.cpp">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uAuthService.cpp"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralProtocol.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uAuthService.h"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralTypes.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCallbackManager.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCallbackManager.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentral.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentral.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralConfig.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralConfig.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralWebSocketServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralWebSocketServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCommandChannel.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCommandChannel.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCommandManager.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCommandManager.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uDeviceRegistry.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uDeviceRegistry.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uFileUploader.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uFileUploader.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uFirmwareManager.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uFirmwareManager.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uStorageService.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uStorageService.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uSubSystemServer.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uSubSystemServer.h">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uUtils.cpp">
<Option target="ucentralgw"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uUtils.h">
<Option target="ucentralgw"/> <Option target="ucentralgw"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/CMakeLists.txt"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/CMakeLists.txt">
@@ -440,12 +483,6 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
@@ -464,48 +501,18 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLConfig.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLConfig.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
@@ -518,24 +525,12 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
@@ -548,12 +543,6 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
@@ -566,12 +555,6 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
@@ -584,12 +567,6 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
@@ -608,24 +585,12 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
@@ -638,12 +603,6 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
@@ -656,12 +615,6 @@
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLConfigVersion.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLConfigVersion.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets-debug.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets-release.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit>
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets-relwithdebinfo.cmake"> <Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets-relwithdebinfo.cmake">
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/> <Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
</Unit> </Unit>

View File

@@ -1,9 +0,0 @@
COMPOSE_PROJECT_NAME=ucentral
POSTGRES_TAG=latest
MYSQL_TAG=latest
UCENTRALGW_TAG=master
UCENTRALGWUI_TAG=main
UCENTRALSEC_TAG=main
RTTYS_TAG=3.6.0
KAFKA_TAG=latest
ZOOKEEPER_TAG=latest

View File

@@ -1,2 +0,0 @@
KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
ALLOW_PLAINTEXT_LISTENER=yes

View File

@@ -1,4 +0,0 @@
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=rttys
MYSQL_PASSWORD=rttys
MYSQL_DATABASE=rttys

View File

@@ -1,5 +0,0 @@
POSTGRES_PASSWORD=ucentralgw
POSTGRES_USER=ucentralgw
UCENTRALSEC_DB=ucentralsec
UCENTRALSEC_DB_USER=ucentralsec
UCENTRALSEC_DB_PASSWORD=ucentralsec

View File

@@ -1,2 +0,0 @@
UCENTRALGW_ROOT=/ucentralgw-data
UCENTRALGW_CONFIG=/ucentralgw-data

View File

@@ -1,2 +0,0 @@
DEFAULT_UCENTRALSEC_URL=https://ucentral.wlan.local:16001
ALLOW_UCENTRALSEC_CHANGE=false

View File

@@ -1,2 +0,0 @@
UCENTRALSEC_ROOT=/ucentralsec-data
UCENTRALSEC_CONFIG=/ucentralsec-data

View File

@@ -1,10 +0,0 @@
#!/usr/bin/env bash
set -e
SERVICES="ucentralgw.wlan.local ucentralsec.wlan.local"
for i in $SERVICES; do
docker-compose exec $i apk add ca-certificates
docker cp certs/restapi-ca.pem ucentral_$i\_1:/usr/local/share/ca-certificates/
docker-compose exec $i update-ca-certificates
done

View File

@@ -1,3 +0,0 @@
*
!.gitignore
!cas/

View File

@@ -1,2 +0,0 @@
*
!.gitignore

View File

@@ -1,18 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIC4DCCAcgCCQC7oc+4dT4WlTANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJD
QTEMMAoGA1UECgwDVElQMRUwEwYDVQQDDAwqLndsYW4ubG9jYWwwHhcNMjEwNzA3
MDkyOTAxWhcNMzEwNzA1MDkyOTAxWjAyMQswCQYDVQQGEwJDQTEMMAoGA1UECgwD
VElQMRUwEwYDVQQDDAwqLndsYW4ubG9jYWwwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQD67KEKKHj1xyj0Sc+/WSFeXluhp+76V/8njnGcTus8IsaHWeAj
O1T1/PnqNMNP3CSgCpAZRn7Eom33HH89pC7iIE5t3aGrFzxZ6AxFgECUCkby1j9D
j7PawapJ7XNqT4P4ZGEGOWlLGE9oUpF2pr3B3jBwmV9t9d/Zp8na23K7rnsr5kNn
RXp6iPNPpynppNQFBwzsovyhu9tzk/zz3gohSY9f6oyNNaKcZwN/yrG4B8FnRfa7
WFNvkPi5zAjJ3oEXMp+Im2/SvSqzptYwZhplb14ILZ5ClkSwAslG8FiOAzXr887r
hgEPzqP6SNIOwy/B/AMOFQl6wPvXBwz9eNW1AgMBAAEwDQYJKoZIhvcNAQELBQAD
ggEBAA8Oa8jannqNRdqOuY460Pum1B61kGmf2OK2ZiMaddlxqL3ZBdXPqF02hwSd
q6uxCVP5NgvqSm+pTHaDcODJiCBrMmGQqHT82LuoCyk1BMqH/PYm+kfazPhKF31x
Me7E47DQzk4tMyV28HBCHH6UicQ05ryT1yBfmj8JmYNx9ezmJcanu0/eyI2Lv8Ar
Y7mrgblfOUnsif2w/aUaOsoY1t6/ThgTBc3BTMtUXXAcMiPLu4mSdN6nCm75Qp5q
4zl/SNPjLnmtpHhLDtr4swf6vZw0RG7ECCf6Av8lv8mJG6g53YM8jfe0EzLqbAFf
iSuQbt5n6lMWVgv+FKwXjwAda+Q=
-----END CERTIFICATE-----

View File

@@ -1,18 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIC4DCCAcgCCQC7oc+4dT4WlTANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJD
QTEMMAoGA1UECgwDVElQMRUwEwYDVQQDDAwqLndsYW4ubG9jYWwwHhcNMjEwNzA3
MDkyOTAxWhcNMzEwNzA1MDkyOTAxWjAyMQswCQYDVQQGEwJDQTEMMAoGA1UECgwD
VElQMRUwEwYDVQQDDAwqLndsYW4ubG9jYWwwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQD67KEKKHj1xyj0Sc+/WSFeXluhp+76V/8njnGcTus8IsaHWeAj
O1T1/PnqNMNP3CSgCpAZRn7Eom33HH89pC7iIE5t3aGrFzxZ6AxFgECUCkby1j9D
j7PawapJ7XNqT4P4ZGEGOWlLGE9oUpF2pr3B3jBwmV9t9d/Zp8na23K7rnsr5kNn
RXp6iPNPpynppNQFBwzsovyhu9tzk/zz3gohSY9f6oyNNaKcZwN/yrG4B8FnRfa7
WFNvkPi5zAjJ3oEXMp+Im2/SvSqzptYwZhplb14ILZ5ClkSwAslG8FiOAzXr887r
hgEPzqP6SNIOwy/B/AMOFQl6wPvXBwz9eNW1AgMBAAEwDQYJKoZIhvcNAQELBQAD
ggEBAA8Oa8jannqNRdqOuY460Pum1B61kGmf2OK2ZiMaddlxqL3ZBdXPqF02hwSd
q6uxCVP5NgvqSm+pTHaDcODJiCBrMmGQqHT82LuoCyk1BMqH/PYm+kfazPhKF31x
Me7E47DQzk4tMyV28HBCHH6UicQ05ryT1yBfmj8JmYNx9ezmJcanu0/eyI2Lv8Ar
Y7mrgblfOUnsif2w/aUaOsoY1t6/ThgTBc3BTMtUXXAcMiPLu4mSdN6nCm75Qp5q
4zl/SNPjLnmtpHhLDtr4swf6vZw0RG7ECCf6Av8lv8mJG6g53YM8jfe0EzLqbAFf
iSuQbt5n6lMWVgv+FKwXjwAda+Q=
-----END CERTIFICATE-----

View File

@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD67KEKKHj1xyj0
Sc+/WSFeXluhp+76V/8njnGcTus8IsaHWeAjO1T1/PnqNMNP3CSgCpAZRn7Eom33
HH89pC7iIE5t3aGrFzxZ6AxFgECUCkby1j9Dj7PawapJ7XNqT4P4ZGEGOWlLGE9o
UpF2pr3B3jBwmV9t9d/Zp8na23K7rnsr5kNnRXp6iPNPpynppNQFBwzsovyhu9tz
k/zz3gohSY9f6oyNNaKcZwN/yrG4B8FnRfa7WFNvkPi5zAjJ3oEXMp+Im2/SvSqz
ptYwZhplb14ILZ5ClkSwAslG8FiOAzXr887rhgEPzqP6SNIOwy/B/AMOFQl6wPvX
Bwz9eNW1AgMBAAECggEAZdJT3u1heEqjAc5Z8QnYEpUzlbuxrAC9V23kCEu2BScP
bKk53NIcvd00BKf4gZWRfygKJVeH5X8MJHR55aeUJsp5SPfgvK6nHMye/iz3B5vM
AoqSDXZow2JHGcyzQvaVVNxWytHNOl3ZCzpGMOGkquDgwzBZmyNk/Muri5X1TtbH
DgeYdht2YiHqHdGWsLNU1vZAgzlwD8fXg65XOmNehjWnowhpNRCgpcDeJCtEuNzt
6iXFWffjO6YTbVnoM5xhLROjLv6gYP4wxsQSZc/NGz9Jow7VxlYZg9wCE75bduFn
7D5O4OgVgPgYbyCutpB/o4PMNURb4V/5p2OAEgLX2QKBgQD+kHYRAaawRbaY4jGf
isj0oh2C/Z99Mqf/nnpPwmUwrhpmnQ+pRdWBw940tPrEpVoOcCPWQ5hO1zUET18d
xQqs3zd6lEhJogmMqkjOT670YBEX/wyALd3M5F3HT/K2aixL1XaCCpAl97JB9RyB
zGIr5c+mIOVK/uYrlFO28thXzwKBgQD8VumZIYZpWeE7pTyCg0PcDYlNATA/VKoD
9YrGqEEHGgFNJEWj8Xj8aqBzaPoUk+eGp7NfSoOchVM+Bf3ktWy5doZCmNuxlOyq
Ix5yrB2jyYceaSf2nxHqlD2VhKB/YJx0yTU1UkB5dG4nYnqiUg7c5JeQOVzwFKm1
t6/Hk/cXOwKBgGT+yWjL3+cVcXFMZGWouTudSdobZ3hTbaWTqXEVbfIXUPAfJgSB
aUi3feQpXUhBVe5efUlXvgihhy4zk0gLUcXuNWOTiu5ztBgzwvjfUkkwB/geP0Zn
bBULEU2vIVtP2k0n3oGPUUtO71ENvwacIOLLpUuCx5WudYEasu/lfwGvAoGBAOiE
manuF3HaTU3tu20z0YLiwkK/tpqUxDjzuBXIEmudzdcsdjNUHbzR79mIwO/XPf95
ZjKHcfD3dbXwRXzKpE3dZmfVfJMM/GrmA3d9G67B04z1Lsr01siGIp004cOd3W1L
vojMqvZ/j8Ug3InX/TQUO4i9IuNi1uLISOQpdwTjAoGAG33swIFnH/mz7ubu8wfE
9nwe8NNf56kbFBG2FMuHvo8GYj0sqylwtZnh4TCwlTzqUO8e6oFdK8Ot6z7H9Fa3
vnDD2WRwEFydRP5fbW5eFmGbzLfHlzUY+Do81qrUMF47LEN94X7yaXdb/vNW57lp
K9hGF1Bdk8089Knm3l1Fc4w=
-----END PRIVATE KEY-----

View File

@@ -1,27 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIEgDCCA2igAwIBAgIUaKVB2xg9gr/sS6FvzMex0xSbEzswDQYJKoZIhvcNAQEL
BQAwbDELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG1RlbGVjb20gSW5mcmEgUHJvamVj
dCwgSW5jLjEMMAoGA1UECxMDVElQMSkwJwYDVQQDEyBUZWxlY29tIEluZnJhIFBy
b2plY3QgSXNzdWluZyBDQTAeFw0yMTA3MDgxMDQ5MTVaFw0yNTA3MDgxMDQ5MTVa
MDIxCzAJBgNVBAYTAlVTMQwwCgYDVQQKEwNUSVAxFTATBgNVBAMMDCoud2xhbi5s
b2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL2rlMfV7/Si2Svx
J1YOEz6KJLvey995/0MkQvAG0RM6TpFwgUNnpYFFozcWME8MGSxws+6hOzDoMmHC
pgpP/KZ/Fyu9iUdzTxsJMyMxIW9sYbBMkQgBmvjkBlXDk5NfHh+yJBVxb7JlJ6vJ
oT7EJMzgKpYpFnO+bddalUVsDp3qQIjSvJIxl77vwgZQUJx0qCm17VTBhyM2RTJ3
jtr7kcWDm3jyyTVUvlM9g3DM9g0hUPMN0R5PP2HuqDdtYoY51krsm2mmVIYYnyAN
BDawmwYnZJfcC4gFzZJ5wK5NFjSKmd1mYp0damlSh0/uHxPyd4rm2QhUCQH92yKM
+9qYU70CAwEAAaOCAVIwggFOMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFM0mIZuE
6aly7ZKXl0KWjprcO9/uMB8GA1UdIwQYMBaAFLMbVLjgR6s98ziA5Dzl/QBhbdHo
MA4GA1UdDwEB/wQEAwIFoDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATCBhgYIKwYB
BQUHAQEEejB4MCgGCCsGAQUFBzABhhxodHRwOi8vb2NzcC5vbmUuZGlnaWNlcnQu
Y29tMEwGCCsGAQUFBzAChkBodHRwOi8vY2FjZXJ0cy5vbmUuZGlnaWNlcnQuY29t
L1RlbGVjb21JbmZyYVByb2plY3RJc3N1aW5nQ0EuY3J0ME0GA1UdHwRGMEQwQqBA
oD6GPGh0dHA6Ly9jcmwub25lLmRpZ2ljZXJ0LmNvbS9UZWxlY29tSW5mcmFQcm9q
ZWN0SXNzdWluZ0NBLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAAyb7X9qW0z0QJrl2
oAalMCh/gSJy5oER3L7iu/pnP3GREbr6bh6+1/MAf2bgnN2CUOKQHbozB7yCkM6V
8m5RnL4ePKVP5yIrbs48uM5Hl14QFLU4ZtFao6js0haoWWEgMo3sfbeyfOU0ScyW
ET5zfbDub3gUbWYmlz6hyV5aJoznaFjJTNP7SRQ9CHMTMHh3wAPfVlvG2TdcwwbM
ZKkdAHpl1NwRxyiBPJfkejGWrY3ZAs10te7u9Lsc9yZZKL8SU9J/mrO9tM5HLeUr
nCJN4RI7RyTuDw4LdMZW1Ju5QBXoZL9mj4KXIbUkDwryhbAxdQ1OnwD4O/avMChk
TNJzIw==
-----END CERTIFICATE-----

View File

@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9q5TH1e/0otkr
8SdWDhM+iiS73svfef9DJELwBtETOk6RcIFDZ6WBRaM3FjBPDBkscLPuoTsw6DJh
wqYKT/ymfxcrvYlHc08bCTMjMSFvbGGwTJEIAZr45AZVw5OTXx4fsiQVcW+yZSer
yaE+xCTM4CqWKRZzvm3XWpVFbA6d6kCI0rySMZe+78IGUFCcdKgpte1UwYcjNkUy
d47a+5HFg5t48sk1VL5TPYNwzPYNIVDzDdEeTz9h7qg3bWKGOdZK7JtpplSGGJ8g
DQQ2sJsGJ2SX3AuIBc2SecCuTRY0ipndZmKdHWppUodP7h8T8neK5tkIVAkB/dsi
jPvamFO9AgMBAAECggEBAJgYoaRmcJfShyhvp8WgX9pE2RQ2o3I/2Gy1BWCJdtte
ZGbIuz+cO+IgP7QK/Q5Ge2Fht0hizp53dP9kIdYfMlEplSEkSpObahIaHIHaAh/h
36yKmbq73tQ7tsDLpuoE2pk8Nydi4dlCuL9PXxiAHaqVEFF9/V0vldGd+BnFfyst
retXgockCH+fqddM5Kp+H0bmjXzLke/b8T9KsdSBz7lg1Z67kmMrHLe14Q4Hgmr/
pFBkGGWKTFn48OXfncrv+oQAGED7r9c5UEdpOB6SBDxuddfzgkw9urnpKrYC/KOs
HLBTaGew73O81BsbaZlUiVxTdewrmFk2nG6UIPoGaxkCgYEA7IYOjIfNJOEPIWYP
zj4eipTy6zFk4L7tX3wX4wsor93rz8ArlF8sgNoyUhbKm6H++ZfVezLs2jcjJJ8Q
sXLwQ6L/D8aVb6AOVeC1WYJu5+wXIDX0H+1318a5+3bKVPn+hktJGEgCBvplVRnh
yzpQ+2v1SBp9qEzoSl1sV6gm1tsCgYEAzUnZcjUhHvoXLXJ1lfagCC6QsmjqzpJv
VdTKJlDuZ0qQGC6Ts+wKfM3MoiOsXW0pByC5lWwE43c/KU8J358j3OSSNafIFeD1
cxtYzJlMgnw5Y2Zt9tj+QW/1BOMdOftnPSOnsk6rpdCBMW6a2tYubJjbAuge+a2O
939XGnV0R0cCgYEA0bvmNtNNJAC2LAWWymnnJzgBWHFKZMipMNyXSethPuHo8yYS
/tSOYAwcRxKSwwMZWDY9RavYv3/ZF+Y9JT0otLFav6B2bq9dRuWlqiOxONLvhs6R
Faa7eIlt7gBeVpAAFRG5VWC0+38aUCZNRKsHmIsYy8FB3/Winh7NrcUb+7UCgYBi
egCTZqUixPmFVZjOfWY7Rosm6mlo+pnp5I+sXbpfVkdVMlKsRpipUdfOF6rBjnHV
937PDOgzbaqg2Ed2PFLpzcPNdVToGefkdcPdMdSf65Nj+WjatzEQlvJEi+YjQFQ/
4fC5+j8g5apz2gjy3Teb5J96/3qMbxNb6nwQNzO2VQKBgHyHUJOrhvv9+vs7v8nu
9DgV0b5eNO0g6Q4Ji7oqs24PssPQRA4gMtwmPT8Ha+wWGVzQt2U5LmjsLlrqAO6O
+Fa3c63sgmt672A8BJ3PL8LI8E2keZiH6rwADSUFp3TZoU2SHamw5NEruNRMIF1R
0LMsuAs2KEdnwAth2ZmUF2+S
-----END PRIVATE KEY-----

View File

@@ -1,120 +0,0 @@
version: '3'
volumes:
postgresql_data:
driver: local
mysql_data:
driver: local
zookeeper_data:
driver: local
zookeeper_datalog:
driver: local
kafka_data:
driver: local
services:
postgresql:
image: "postgres:${POSTGRES_TAG}"
env_file:
- .env_postgresql
restart: unless-stopped
volumes:
- postgresql_data:/var/lib/postgresql/data
- ./init-ucentralsec-db.sh:/docker-entrypoint-initdb.d/init-ucentralsec-db.sh
mysql:
image: "mysql:${MYSQL_TAG}"
env_file:
- .env_mysql
restart: unless-stopped
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- mysql_data:/var/lib/mysql
ucentralgw.wlan.local:
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw:${UCENTRALGW_TAG}"
env_file:
- .env_ucentralgw
depends_on:
- postgresql
- kafka
- rttys
restart: unless-stopped
ports:
- "127.0.0.1:15002:15002"
- "127.0.0.1:16002:16002"
- "127.0.0.1:16003:16003"
- "127.0.0.1:16102:16102"
volumes:
- ./ucentralgw-data:/ucentralgw-data
- ./certs:/ucentralgw-data/certs
- ../certificates/root.pem:/ucentralgw-data/certs/root.pem
- ../certificates/issuer.pem:/ucentralgw-data/certs/issuer.pem
- ../certificates/clientcas.pem:/ucentralgw-data/certs/clientcas.pem
ucentralgw-ui:
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw-ui:${UCENTRALGWUI_TAG}"
env_file:
- .env_ucentralgw-ui
depends_on:
- ucentralgw.wlan.local
restart: unless-stopped
ports:
- "127.0.0.1:80:80"
ucentralsec.wlan.local:
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralsec:${UCENTRALSEC_TAG}"
env_file:
- .env_ucentralsec
depends_on:
- postgresql
- kafka
- rttys
- ucentralgw.wlan.local
restart: unless-stopped
ports:
- "127.0.0.1:16001:16001"
- "127.0.0.1:16101:16101"
volumes:
- ./ucentralsec-data:/ucentralsec-data
- ./certs:/ucentralsec-data/certs
- ../certificates/root.pem:/ucentralsec-data/certs/root.pem
- ../certificates/issuer.pem:/ucentralsec-data/certs/issuer.pem
- ../certificates/clientcas.pem:/ucentralsec-data/certs/clientcas.pem
ucentralgw-ui:
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw-ui:${UCENTRALGWUI_TAG}"
env_file:
- .env_ucentralgw-ui
depends_on:
- ucentralgw
restart: unless-stopped
ports:
- "127.0.0.1:80:80"
rttys:
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/rttys:${RTTYS_TAG}"
depends_on:
- mysql
restart: unless-stopped
volumes:
- ./certs/restapi-cert.pem:/etc/rttys/restapi-cert.pem
- ./certs/restapi-key.pem:/etc/rttys/restapi-key.pem
- ./rttys/rttys.conf:/rttys/rttys.conf
zookeeper:
image: "zookeeper:${ZOOKEEPER_TAG}"
restart: unless-stopped
volumes:
- zookeeper_data:/data
- zookeeper_datalog:/datalog
kafka:
image: "docker.io/bitnami/kafka:${KAFKA_TAG}"
env_file:
- .env_kafka
restart: unless-stopped
depends_on:
- zookeeper
volumes:
- kafka_data:/bitnami/kafka

View File

@@ -1,8 +0,0 @@
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE USER $UCENTRALSEC_DB_USER WITH ENCRYPTED PASSWORD '$UCENTRALSEC_DB_PASSWORD';
CREATE DATABASE $UCENTRALSEC_DB;
GRANT ALL PRIVILEGES ON DATABASE $UCENTRALSEC_DB TO $UCENTRALSEC_DB_USER;
EOSQL

View File

@@ -1,18 +0,0 @@
addr-dev: :5912
addr-user: :5913
#addr-web: :5914
#web-redir-url:# Auth for http
http-username: rttys
http-password: rttys
ssl-cert: /etc/rttys/restapi-cert.pem
ssl-key: /etc/rttys/restapi-key.pem
token: 96181c567b4d0d98c50f127230068fa8
# font-size: 16
# No login required to connect device.
# Values can be device IDs separated by spaces,
# or a "*" indicates that all devices do not require login
# http://localhost:5913/connect/rtty1
white-list: "*"
#white-list: rtty1 rtty2
# mysql database source
db: rttys:rttys@tcp(mysql)/rttys

View File

@@ -1,145 +0,0 @@
#
# uCentral protocol server for devices. This is where you point
# all your devices. You can replace the * for address by the specific
# address of one of your interfaces
#
#
# REST API access
#
ucentral.restapi.host.0.backlog = 100
ucentral.restapi.host.0.security = relaxed
ucentral.restapi.host.0.rootca = $UCENTRALSEC_ROOT/certs/restapi-ca.pem
ucentral.restapi.host.0.address = *
ucentral.restapi.host.0.port = 16001
ucentral.restapi.host.0.cert = $UCENTRALSEC_ROOT/certs/restapi-cert.pem
ucentral.restapi.host.0.key = $UCENTRALSEC_ROOT/certs/restapi-key.pem
ucentral.restapi.host.0.key.password = mypassword
ucentral.internal.restapi.host.0.backlog = 100
ucentral.internal.restapi.host.0.security = relaxed
ucentral.internal.restapi.host.0.rootca = $UCENTRALSEC_ROOT/certs/restapi-ca.pem
ucentral.internal.restapi.host.0.address = *
ucentral.internal.restapi.host.0.port = 17001
ucentral.internal.restapi.host.0.cert = $UCENTRALSEC_ROOT/certs/restapi-cert.pem
ucentral.internal.restapi.host.0.key = $UCENTRALSEC_ROOT/certs/restapi-key.pem
ucentral.internal.restapi.host.0.key.password = mypassword
#
# Generic section that all microservices must have
#
authentication.enabled = true
authentication.default.username = tip@ucentral.com
authentication.default.password = 13268b7daa751240369d125e79c873bd8dd3bef7981bdfd38ea03dbb1fbe7dcf
authentication.default.access = master
authentication.service.type = internal
ucentral.system.data = $UCENTRALSEC_ROOT/data
ucentral.system.debug = true
ucentral.system.uri.private = https://ucentralsec.wlan.local:17001
ucentral.system.uri.public = https://ucentral.wlan.local:16001
ucentral.system.commandchannel = /tmp/app.ucentralsec
ucentral.service.key = $UCENTRALSEC_ROOT/certs/restapi-key.pem
#
# Security Microservice Specific Section
#
mailer.hostname = smtp.gmail.com
mailer.username = no-reply@arilia.com
mailer.password = **************************
mailer.loginmethod = login
mailer.port = 587
#############################
# Generic information for all micro services
#############################
#
# NLB Support
#
alb.enable = true
alb.port = 16101
#
# Kafka
#
ucentral.kafka.group.id = security
ucentral.kafka.client.id = security1
ucentral.kafka.enable = true
# ucentral.kafka.brokerlist = a1.arilia.com:9092
ucentral.kafka.brokerlist = kafka:9092
ucentral.kafka.auto.commit = false
ucentral.kafka.queue.buffering.max.ms = 50
#
# This section select which form of persistence you need
# Only one selected at a time. If you select multiple, this service will die if a horrible
# death and might make your beer flat.
#
#storage.type = sqlite
storage.type = postgresql
#storage.type = mysql
#storage.type = odbc
storage.type.sqlite.db = security.db
storage.type.sqlite.idletime = 120
storage.type.sqlite.maxsessions = 128
storage.type.postgresql.maxsessions = 64
storage.type.postgresql.idletime = 60
storage.type.postgresql.host = postgresql
storage.type.postgresql.username = ucentralsec
storage.type.postgresql.password = ucentralsec
storage.type.postgresql.database = ucentralsec
storage.type.postgresql.port = 5432
storage.type.postgresql.connectiontimeout = 60
storage.type.mysql.maxsessions = 64
storage.type.mysql.idletime = 60
storage.type.mysql.host = localhost
storage.type.mysql.username = stephb
storage.type.mysql.password = snoopy99
storage.type.mysql.database = ucentral
storage.type.mysql.port = 3306
storage.type.mysql.connectiontimeout = 60
########################################################################
########################################################################
#
# Logging: please leave as is for now.
#
########################################################################
logging.formatters.f1.class = PatternFormatter
logging.formatters.f1.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
logging.formatters.f1.times = UTC
logging.channels.c1.class = ConsoleChannel
logging.channels.c1.formatter = f1
# This is where the logs will be written. This path MUST exist
logging.channels.c2.class = FileChannel
logging.channels.c2.path = $UCENTRALSEC_ROOT/logs/log
logging.channels.c2.formatter.class = PatternFormatter
logging.channels.c2.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
logging.channels.c2.rotation = 20 M
logging.channels.c2.archive = timestamp
logging.channels.c2.purgeCount = 20
logging.channels.c3.class = ConsoleChannel
logging.channels.c3.pattern = %s: [%p] %t
# External Channel
logging.loggers.root.channel = c1
logging.loggers.root.level = debug
# Inline Channel with PatternFormatter
# logging.loggers.l1.name = logger1
# logging.loggers.l1.channel.class = ConsoleChannel
# logging.loggers.l1.channel.pattern = %s: [%p] %t
# logging.loggers.l1.level = information
# SplitterChannel
# logging.channels.splitter.class = SplitterChannel
# logging.channels.splitter.channels = l1,l2
# logging.loggers.l2.name = logger2
# logging.loggers.l2.channel = splitter

65
docker-entrypoint.sh Executable file
View File

@@ -0,0 +1,65 @@
#!/bin/sh
set -e
if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$UCENTRALGW_CONFIG"/ucentralgw.properties ]]; then
WEBSOCKET_HOST_ROOTCA=${WEBSOCKET_HOST_ROOTCA:-"\$UCENTRALGW_ROOT/certs/root.pem"} \
WEBSOCKET_HOST_ISSUER=${WEBSOCKET_HOST_ISSUER:-"\$UCENTRALGW_ROOT/certs/issuer.pem"} \
WEBSOCKET_HOST_CERT=${WEBSOCKET_HOST_CERT:-"\$UCENTRALGW_ROOT/certs/websocket-cert.pem"} \
WEBSOCKET_HOST_KEY=${WEBSOCKET_HOST_KEY:-"\$UCENTRALGW_ROOT/certs/websocket-key.pem"} \
WEBSOCKET_HOST_CLIENTCAS=${WEBSOCKET_HOST_CLIENTCAS:-"\$UCENTRALGW_ROOT/certs/clientcas.pem"} \
WEBSOCKET_HOST_CAS=${WEBSOCKET_HOST_CAS:-"\$UCENTRALGW_ROOT/certs/cas"} \
WEBSOCKET_HOST_PORT=${WEBSOCKET_HOST_PORT:-"15002"} \
WEBSOCKET_HOST_KEY_PASSWORD=${WEBSOCKET_HOST_KEY_PASSWORD:-"mypassword"} \
RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$UCENTRALGW_ROOT/certs/restapi-ca.pem"} \
RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16002"} \
RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$UCENTRALGW_ROOT/certs/restapi-cert.pem"} \
RESTAPI_HOST_KEY=${RESTAPI_HOST_KEY:-"\$UCENTRALGW_ROOT/certs/restapi-key.pem"} \
RESTAPI_HOST_KEY_PASSWORD=${RESTAPI_HOST_KEY_PASSWORD:-"mypassword"} \
INTERNAL_RESTAPI_HOST_ROOTCA=${INTERNAL_RESTAPI_HOST_ROOTCA:-"\$UCENTRALGW_ROOT/certs/restapi-ca.pem"} \
INTERNAL_RESTAPI_HOST_PORT=${INTERNAL_RESTAPI_HOST_PORT:-"17002"} \
INTERNAL_RESTAPI_HOST_CERT=${INTERNAL_RESTAPI_HOST_CERT:-"\$UCENTRALGW_ROOT/certs/restapi-cert.pem"} \
INTERNAL_RESTAPI_HOST_KEY=${INTERNAL_RESTAPI_HOST_KEY:-"\$UCENTRALGW_ROOT/certs/restapi-key.pem"} \
INTERNAL_RESTAPI_HOST_KEY_PASSWORD=${INTERNAL_RESTAPI_HOST_KEY_PASSWORD:-"mypassword"} \
FILEUPLOADER_HOST_ROOTCA=${FILEUPLOADER_HOST_ROOTCA:-"\$UCENTRALGW_ROOT/certs/restapi-ca.pem"} \
FILEUPLOADER_HOST_NAME=${FILEUPLOADER_HOST_NAME:-"localhost"} \
FILEUPLOADER_HOST_PORT=${FILEUPLOADER_HOST_PORT:-"16003"} \
FILEUPLOADER_HOST_CERT=${FILEUPLOADER_HOST_CERT:-"\$UCENTRALGW_ROOT/certs/restapi-cert.pem"} \
FILEUPLOADER_HOST_KEY=${FILEUPLOADER_HOST_KEY:-"\$UCENTRALGW_ROOT/certs/restapi-key.pem"} \
FILEUPLOADER_HOST_KEY_PASSWORD=${FILEUPLOADER_HOST_KEY_PASSWORD:-"mypassword"} \
FILEUPLOADER_PATH=${FILEUPLOADER_PATH:-"\$UCENTRALGW_ROOT/uploads"} \
SERVICE_KEY=${SERVICE_KEY:-"\$UCENTRALGW_ROOT/certs/restapi-key.pem"} \
SERVICE_KEY_PASSWORD=${SERVICE_KEY_PASSWORD:-"mypassword"} \
SYSTEM_DATA=${SYSTEM_DATA:-"\$UCENTRALGW_ROOT/data"} \
SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17002"} \
SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16002"} \
SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
RTTY_ENABLED=${RTTY_ENABLED:-"false"} \
RTTY_SERVER=${RTTY_SERVER:-"localhost"} \
RTTY_PORT=${RTTY_PORT:-"5912"} \
RTTY_TOKEN=${RTTY_TOKEN:-"96181c567b4d0d98c50f127230068fa8"} \
RTTY_TIMEOUT=${RTTY_TIMEOUT:-"60"} \
RTTY_VIEWPORT=${RTTY_VIEWPORT:-"5913"} \
KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \
KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \
STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \
STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \
STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"ucentralgw"} \
STORAGE_TYPE_POSTGRESQL_PASSWORD=${STORAGE_TYPE_POSTGRESQL_PASSWORD:-"ucentralgw"} \
STORAGE_TYPE_POSTGRESQL_DATABASE=${STORAGE_TYPE_POSTGRESQL_DATABASE:-"ucentralgw"} \
STORAGE_TYPE_POSTGRESQL_PORT=${STORAGE_TYPE_POSTGRESQL_PORT:-"5432"} \
STORAGE_TYPE_MYSQL_HOST=${STORAGE_TYPE_MYSQL_HOST:-"localhost"} \
STORAGE_TYPE_MYSQL_USERNAME=${STORAGE_TYPE_MYSQL_USERNAME:-"ucentralgw"} \
STORAGE_TYPE_MYSQL_PASSWORD=${STORAGE_TYPE_MYSQL_PASSWORD:-"ucentralgw"} \
STORAGE_TYPE_MYSQL_DATABASE=${STORAGE_TYPE_MYSQL_DATABASE:-"ucentralgw"} \
STORAGE_TYPE_MYSQL_PORT=${STORAGE_TYPE_MYSQL_PORT:-"3306"} \
envsubst < $UCENTRALGW_CONFIG/ucentralgw.properties.tmpl > $UCENTRALGW_CONFIG/ucentralgw.properties
fi
if [ "$1" = '/ucentral/ucentralgw' -a "$(id -u)" = '0' ]; then
if [ "$RUN_CHOWN" = 'true' ]; then
chown -R "$UCENTRALGW_USER": "$UCENTRALGW_ROOT" "$UCENTRALGW_CONFIG"
fi
exec su-exec "$UCENTRALGW_USER" "$@"
fi
exec "$@"

View File

@@ -26,7 +26,7 @@ then
exit 1 exit 1
fi fi
if [[ ! -f ucentral.properties ]] if [[ ! -f ucentralgw.properties ]]
then then
echo "Configuration file ucentral.properties is missing in the current directory" echo "Configuration file ucentral.properties is missing in the current directory"
exit 2 exit 2
@@ -37,7 +37,7 @@ docker run -d -p 15002:15002 \
-p 16003:16003 \ -p 16003:16003 \
--init \ --init \
--volume="$PWD:/ucentral-data" \ --volume="$PWD:/ucentral-data" \
-e UCENTRAL_ROOT="/ucentral-data" \ -e UCENTRALGW_ROOT="/ucentral-data" \
-e UCENTRAL_CONFIG="/ucentral-data" \ -e UCENTRALGW_CONFIG="/ucentral-data" \
--name="ucentralgw" $DOCKER_NAME --name="ucentralgw" $DOCKER_NAME

0
helm/.gitkeep Normal file
View File

12
helm/Chart.lock Normal file
View File

@@ -0,0 +1,12 @@
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
version: 10.9.2
- name: mysql
repository: https://charts.bitnami.com/bitnami
version: 8.8.3
- name: mariadb
repository: https://charts.bitnami.com/bitnami
version: 9.4.2
digest: sha256:1fdae7cbea906e41dccd8618ff9e2c68d0c684724ae27c79a12bb6089968df5c
generated: "2021-08-17T12:18:40.341427893+03:00"

View File

@@ -1,5 +1,18 @@
apiVersion: v1 apiVersion: v2
appVersion: "1.0" appVersion: "1.0"
description: A Helm chart for Kubernetes description: A Helm chart for Kubernetes
name: ucentralgw name: ucentralgw
version: 0.1.0 version: 0.1.0
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
version: 10.9.2
condition: postgresql.enabled
- name: mysql
repository: https://charts.bitnami.com/bitnami
version: 8.8.3
condition: mysql.enabled
- name: mariadb
repository: https://charts.bitnami.com/bitnami
version: 9.4.2
condition: mariadb.enabled

104
helm/README.md Normal file
View File

@@ -0,0 +1,104 @@
# ucentralgw
This Helm chart helps to deploy uCentralGW to the Kubernetes clusters. It is mainly used in [assembly chart](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/main/chart) as uCentralGW requires other services as dependencies that are considered in that Helm chart. This chart is purposed to define deployment logic close to the application code itself and define default values that could be overriden during deployment.
## TL;DR;
```bash
$ helm install .
```
## Introduction
This chart bootstraps an ucentralgw on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
## Installing the Chart
Currently this chart is not assembled in charts archives, so [helm-git](https://github.com/aslafy-z/helm-git) is required for remote the installation
To install the chart with the release name `my-release`:
```bash
$ helm install --name my-release git+https://github.com/Telecominfraproject/wlan-cloud-ucentralgw@helm?ref=master
```
The command deploys ucentralgw on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
> **Tip**: List all releases using `helm list`
## Uninstalling the Chart
To uninstall/delete the `my-release` deployment:
```bash
$ helm delete my-release
```
The command removes all the Kubernetes components associated with the chart and deletes the release.
## Configuration
The following table lists the configurable parameters of the chart and their default values. If Default value is not listed in the table, please refer to the [Values](values.yaml) files for details.
| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| replicaCount | number | Amount of replicas to be deployed | `1` |
| strategyType | string | Application deployment strategy | `'Recreate'` |
| nameOverride | string | Override to be used for application deployment | |
| fullnameOverride | string | Override to be used for application deployment (has priority over nameOverride) | |
| images.ucentralgw.repository | string | Docker image repository | |
| images.ucentralgw.tag | string | Docker image tag | `'master'` |
| images.ucentralgw.pullPolicy | string | Docker image pull policy | `'Always'` |
| services.ucentralgw.type | string | uCentralGW service type | `'LoadBalancer'` |
| services.ucentralgw.ports.websocket.servicePort | number | Websocket endpoint port to be exposed on service | `15002` |
| services.ucentralgw.ports.websocket.targetPort | number | Websocket endpoint port to be targeted by service | `15002` |
| services.ucentralgw.ports.websocket.protocol | string | Websocket endpoint protocol | `'TCP'` |
| services.ucentralgw.ports.restapi.servicePort | number | REST API endpoint port to be exposed on service | `16002` |
| services.ucentralgw.ports.restapi.targetPort | number | REST API endpoint port to be targeted by service | `16002` |
| services.ucentralgw.ports.restapi.protocol | string | REST API endpoint protocol | `'TCP'` |
| services.ucentralgw.ports.restapiinternal.servicePort | string | Internal REST API endpoint port to be exposed on service | `17002` |
| services.ucentralgw.ports.restapiinternal.targetPort | number | Internal REST API endpoint port to be targeted by service | `17002` |
| services.ucentralgw.ports.restapiinternal.protocol | string | Internal REST API endpoint protocol | `'TCP'` |
| services.ucentralgw.ports.fileuploader.servicePort | string | Fileuploader endpoint port to be exposed on service | `16003` |
| services.ucentralgw.ports.fileuploader.targetPort | number | Fileuploader endpoint port to be targeted by service | `16003` |
| services.ucentralgw.ports.fileuploader.protocol | string | Fileuploader endpoint protocol | `'TCP'` |
| checks.ucentralgw.liveness.httpGet.path | string | Liveness check path to be used | `'/'` |
| checks.ucentralgw.liveness.httpGet.port | number | Liveness check port to be used (should be pointint to ALB endpoint) | `16102` |
| checks.ucentralgw.readiness.httpGet.path | string | Readiness check path to be used | `'/'` |
| checks.ucentralgw.readiness.httpGet.port | number | Readiness check port to be used (should be pointint to ALB endpoint) | `16102` |
| ingresses.restapi.enabled | boolean | Defines if REST API endpoint should be exposed via Ingress controller | `False` |
| ingresses.restapi.hosts | array | List of hosts for exposed REST API | |
| ingresses.restapi.paths | array | List of paths to be exposed for REST API | |
| ingresses.fileuploader.enabled | boolean | Defines if Fileuploader endpoint should be exposed via Ingress controller | `False` |
| ingresses.fileuploader.hosts | array | List of hosts for exposed Fileuploader | |
| ingresses.fileuploader.paths | array | List of paths for exposed Fileuploader | |
| volumes.ucentralgw | array | Defines list of volumes to be attached to uCentralGW | |
| persistence.enabled | boolean | Defines if uCentralGW requires Persistent Volume (required for permanent files storage and SQLite DB if enabled) | `True` |
| persistence.accessModes | array | Defines PV access modes | |
| persistence.size | string | Defines PV size | `'10Gi'` |
| public_env_variables | hash | Defines list of environment variables to be passed to uCentralGW | |
| configProperties | hash | Configuration properties that should be passed to the application in `ucentralgw.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 uCentralGW (PEM format is adviced to be used) (see `volumes.ucentralgw` on where it is mounted) | |
| certsCAs | hash | Defines files with CAs that should be passed to uCentralGW (see `volumes.ucentralgw` on where it is mounted) | |
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
```bash
$ helm install --name my-release \
--set replicaCount=1 \
.
```
The above command sets that only 1 instance of your app should be running
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
```bash
$ helm install --name my-release -f values.yaml .
```
> **Tip**: You can use the default [values.yaml](values.yaml) as a base for customization.

View File

@@ -83,6 +83,11 @@ spec:
{{- toYaml . | nindent 12 }} {{- toYaml . | nindent 12 }}
{{- end }} {{- end }}
{{- with .Values.securityContext }}
securityContext:
{{- toYaml . | nindent 8 }}
{{- end }}
imagePullSecrets: imagePullSecrets:
{{- range $image, $imageValue := .Values.images }} {{- range $image, $imageValue := .Values.images }}
{{- if $imageValue.regcred }} {{- if $imageValue.regcred }}

View File

@@ -8,7 +8,7 @@ fullnameOverride: ""
images: images:
ucentralgw: ucentralgw:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw repository: tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw
tag: master tag: v2.1.0-RC3
pullPolicy: Always pullPolicy: Always
# regcred: # regcred:
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io # registry: tip-tip-wlan-cloud-ucentral.jfrog.io
@@ -109,6 +109,9 @@ resources: {}
# cpu: 100m # cpu: 100m
# memory: 128Mi # memory: 128Mi
securityContext:
fsGroup: 101
nodeSelector: {} nodeSelector: {}
tolerations: [] tolerations: []
@@ -168,7 +171,7 @@ configProperties:
ucentral.fileuploader.host.0.port: 16003 ucentral.fileuploader.host.0.port: 16003
ucentral.fileuploader.host.0.cert: $UCENTRALGW_ROOT/certs/restapi-cert.pem ucentral.fileuploader.host.0.cert: $UCENTRALGW_ROOT/certs/restapi-cert.pem
ucentral.fileuploader.host.0.key: $UCENTRALGW_ROOT/certs/restapi-key.pem ucentral.fileuploader.host.0.key: $UCENTRALGW_ROOT/certs/restapi-key.pem
ucentral.fileuploader.path: $UCENTRALGW_ROOT/uploads ucentral.fileuploader.path: $UCENTRALGW_ROOT/persist/uploads
ucentral.fileuploader.maxsize: 10000 ucentral.fileuploader.maxsize: 10000
# Auto provisioning # Auto provisioning
ucentral.autoprovisioning: "true" ucentral.autoprovisioning: "true"
@@ -227,12 +230,12 @@ configProperties:
ucentral.system.commandchannel: /tmp/app_ucentralgw ucentral.system.commandchannel: /tmp/app_ucentralgw
# Logging # Logging
logging.formatters.f1.class: PatternFormatter logging.formatters.f1.class: PatternFormatter
logging.formatters.f1.pattern: "%s: [%p] %t" logging.formatters.f1.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
logging.formatters.f1.times: UTC logging.formatters.f1.times: UTC
logging.channels.c1.class: ConsoleChannel logging.channels.c1.class: ConsoleChannel
logging.channels.c1.formatter: f1 logging.channels.c1.formatter: f1
logging.channels.c2.class: FileChannel logging.channels.c2.class: FileChannel
logging.channels.c2.path: /dev/stdout logging.channels.c2.path: /tmp/log_ucentralgw
logging.channels.c2.formatter.class: PatternFormatter logging.channels.c2.formatter.class: PatternFormatter
logging.channels.c2.formatter.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t" logging.channels.c2.formatter.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
logging.channels.c2.rotation: "20 M" logging.channels.c2.rotation: "20 M"
@@ -240,7 +243,7 @@ configProperties:
logging.channels.c2.purgeCount: 20 logging.channels.c2.purgeCount: 20
logging.channels.c3.class: ConsoleChannel logging.channels.c3.class: ConsoleChannel
logging.channels.c3.pattern: "%s: [%p] %t" logging.channels.c3.pattern: "%s: [%p] %t"
logging.loggers.root.channel: c2 logging.loggers.root.channel: c1
logging.loggers.root.level: debug logging.loggers.root.level: debug
# -> Secret part # -> Secret part
@@ -425,3 +428,64 @@ certsCAs:
L+/DtiR5fDVMNdBSGU89UNTi0wHY9+RFuNlIuvZC+x/swF0V9R5mN+ywquTPtDLA L+/DtiR5fDVMNdBSGU89UNTi0wHY9+RFuNlIuvZC+x/swF0V9R5mN+ywquTPtDLA
5IOM7ItsRmen6u3qu+JXros54e4juQ== 5IOM7ItsRmen6u3qu+JXros54e4juQ==
-----END CERTIFICATE----- -----END CERTIFICATE-----
# PostgreSQL (https://github.com/bitnami/charts/tree/master/bitnami/postgresql)
postgresql:
enabled: false
image:
registry: docker.io
repository: bitnami/postgresql
tag: 11.13.0-debian-10-r0
postgresqlPostgresPassword: ""
postgresqlUsername: postgres
postgresqlPassword: ""
postgresqlDatabase: ""
persistence:
enabled: true
storageClass: ""
size: 8Gi
# MySQL (https://github.com/bitnami/charts/tree/master/bitnami/mysql)
mysql:
enabled: false
image:
registry: docker.io
repository: bitnami/mysql
tag: 8.0.26-debian-10-r10
auth:
rootPassword: ""
database: my_database
username: ""
password: ""
primary:
persistence:
enabled: true
storageClass: ""
size: 8Gi
# MariaDB (https://github.com/bitnami/charts/tree/master/bitnami/mariadb)
mariadb:
enabled: false
image:
registry: docker.io
repository: bitnami/mariadb
tag: 10.5.12-debian-10-r0
auth:
rootPassword: ""
database: my_database
username: ""
password: ""
primary:
persistence:
enabled: true
storageClass: ""
size: 8Gi

View File

@@ -2,7 +2,7 @@ openapi: 3.0.1
info: info:
title: uCentral gateway API title: uCentral gateway API
description: A process to manage configuration for devices. description: A process to manage configuration for devices.
version: 0.0.8 version: 2.0.0
license: license:
name: BSD3 name: BSD3
url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
@@ -180,6 +180,12 @@ components:
rxBytes: rxBytes:
type: integer type: integer
format: int64 format: int64
associations_2G:
type: integer
format: int64
associations_5G:
type: integer
format: int64
devicePassword: devicePassword:
type: string type: string
lastContact: lastContact:
@@ -248,6 +254,12 @@ components:
format: int64 format: int64
firmware: firmware:
type: string type: string
associations_2G:
type: integer
format: int64
associations_5G:
type: integer
format: int64
verifiedCertificate: verifiedCertificate:
type: string type: string
enum: enum:
@@ -581,6 +593,44 @@ components:
items: items:
$ref: '#/components/schemas/CommandInfo' $ref: '#/components/schemas/CommandInfo'
DeviceDashboard:
type: object
properties:
snapshot:
type: integer
format: int64
numberOfDevices:
type: integer
format: int64
commands:
$ref: '#/components/schemas/TagIntPairList'
upTimes:
$ref: '#/components/schemas/TagIntPairList'
memoryUsed:
$ref: '#/components/schemas/TagIntPairList'
load1:
$ref: '#/components/schemas/TagIntPairList'
load5:
$ref: '#/components/schemas/TagIntPairList'
load15:
$ref: '#/components/schemas/TagIntPairList'
vendors:
$ref: '#/components/schemas/TagIntPairList'
status:
$ref: '#/components/schemas/TagIntPairList'
type:
$ref: '#/components/schemas/TagIntPairList'
deviceType:
$ref: '#/components/schemas/TagIntPairList'
healths:
$ref: '#/components/schemas/TagIntPairList'
certificates:
$ref: '#/components/schemas/TagIntPairList'
lastContact:
$ref: '#/components/schemas/TagIntPairList'
associations:
$ref: '#/components/schemas/TagIntPairList'
######################################################################################### #########################################################################################
## ##
## These are endpoints that all services in the uCentral stack must provide ## These are endpoints that all services in the uCentral stack must provide
@@ -616,6 +666,23 @@ components:
items: items:
$ref: '#/components/schemas/TagValuePair' $ref: '#/components/schemas/TagValuePair'
TagIntPair:
type: object
properties:
tag:
type: string
value:
type: integer
format: int64
TagIntPairList:
type: object
properties:
tagList:
type: array
items:
$ref: '#/components/schemas/TagIntPair'
SystemCommandDetails: SystemCommandDetails:
type: object type: object
properties: properties:
@@ -805,6 +872,7 @@ paths:
name: countOnly name: countOnly
schema: schema:
type: boolean type: boolean
example: countOnly=true
- in: query - in: query
description: Return extra information with the device information description: Return extra information with the device information
name: deviceWithStatus name: deviceWithStatus
@@ -903,7 +971,7 @@ paths:
format: int64 format: int64
responses: responses:
200: 204:
description: Successfully deleted commands for the device. description: Successfully deleted commands for the device.
content: content:
application/json: application/json:
@@ -954,7 +1022,7 @@ paths:
format: uuid format: uuid
required: true required: true
responses: responses:
200: 204:
description: Delete command success description: Delete command success
content: content:
application/json: application/json:
@@ -1049,7 +1117,7 @@ paths:
type: string type: string
required: true required: true
responses: responses:
200: 204:
$ref: '#/components/responses/Success' $ref: '#/components/responses/Success'
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
@@ -1177,7 +1245,7 @@ paths:
type: string type: string
required: true required: true
responses: responses:
200: 204:
$ref: '#/components/responses/Success' $ref: '#/components/responses/Success'
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
@@ -1272,7 +1340,7 @@ paths:
format: int64 format: int64
responses: responses:
200: 204:
description: Successfully deleted logs for the device. description: Successfully deleted logs for the device.
content: content:
application/json: application/json:
@@ -1369,7 +1437,7 @@ paths:
required: false required: false
responses: responses:
200: 204:
description: Successfully deleted health checks for the device. description: Successfully deleted health checks for the device.
content: content:
application/json: application/json:
@@ -1416,7 +1484,7 @@ paths:
type: string type: string
required: true required: true
responses: responses:
200: 204:
description: List of logs for this device description: List of logs for this device
content: content:
application/json: application/json:
@@ -1521,7 +1589,7 @@ paths:
required: false required: false
responses: responses:
200: 204:
description: Array of statistics for this device description: Array of statistics for this device
content: content:
application/json: application/json:
@@ -1790,7 +1858,7 @@ paths:
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
/device/{serialNumber}/eventrequest: /device/{serialNumber}/eventqueue:
post: post:
tags: tags:
- Commands - Commands
@@ -1909,7 +1977,7 @@ paths:
type: string type: string
required: true required: true
responses: responses:
200: 204:
$ref: '#/components/responses/Success' $ref: '#/components/responses/Success'
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
@@ -1986,13 +2054,27 @@ paths:
type: string type: string
required: true required: true
responses: responses:
200: 204:
$ref: '#/components/responses/Success' $ref: '#/components/responses/Success'
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
/deviceDashboard:
get:
tags:
- Dashboards
summary: Get the last version of the dashboard
operationId: getDeviceDashboard
responses:
200:
$ref: '#/components/schemas/DeviceDashboard'
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
@@ -2022,53 +2104,30 @@ paths:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'
get:
/callbackChannel:
post:
tags: tags:
- Callback - System Commands
summary: Generic callback hook summary: Retrieve different values from the running service.
operationId: postCallback operationId: getSystemCommand
parameters: parameters:
- in: query - in: query
name: subscribe description: Get a value
schema: name: command
type: boolean
required: false
- in: query
name: uri
schema: schema:
type: string type: string
format: uri enum:
- in: query - version
name: key - times
schema: required: true
type: string
- in: query
name: topics
schema:
type: string
- in: query
name: id
schema:
type: string
- in: query
name: topic
schema:
type: string
requestBody:
description: A generic JSONDocument, may be empty too {}
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AnyPayload'
responses: responses:
200: 200:
$ref: '#/components/responses/Success' description: Successfull command execution
content:
application/json:
schema:
$ref: '#/components/schemas/TagValuePair'
403: 403:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
404: 404:
$ref: '#/components/responses/NotFound' $ref: '#/components/responses/NotFound'

View File

@@ -20,7 +20,7 @@
#include "Daemon.h" #include "Daemon.h"
#include "SubSystemServer.h" #include "SubSystemServer.h"
namespace uCentral { namespace OpenWifi {
class ALBRequestHandler: public Poco::Net::HTTPRequestHandler class ALBRequestHandler: public Poco::Net::HTTPRequestHandler
/// Return a HTML document with the current date and time. /// Return a HTML document with the current date and time.

View File

@@ -8,7 +8,7 @@
#include "Daemon.h" #include "Daemon.h"
#include "OpenAPIRequest.h" #include "OpenAPIRequest.h"
namespace uCentral { namespace OpenWifi {
class AuthClient * AuthClient::instance_ = nullptr; class AuthClient * AuthClient::instance_ = nullptr;
int AuthClient::Start() { int AuthClient::Start() {
@@ -38,7 +38,7 @@ namespace uCentral {
} else { } else {
Types::StringPairVec QueryData; Types::StringPairVec QueryData;
QueryData.push_back(std::make_pair("token",SessionToken)); QueryData.push_back(std::make_pair("token",SessionToken));
OpenAPIRequestGet Req(uSERVICE_SECURITY, OpenAPIRequestGet Req( uSERVICE_SECURITY,
"/api/v1/validateToken", "/api/v1/validateToken",
QueryData, QueryData,
5000); 5000);
@@ -56,4 +56,33 @@ namespace uCentral {
} }
return false; return false;
} }
bool AuthClient::IsTokenAuthorized(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo) {
SubMutexGuard G(Mutex_);
auto User = UserCache_.find(SessionToken);
if(User != UserCache_.end() && !IsTokenExpired(User->second.webtoken)) {
UInfo = User->second;
return true;
} else {
Types::StringPairVec QueryData;
QueryData.push_back(std::make_pair("token",SessionToken));
OpenAPIRequestGet Req(uSERVICE_SECURITY,
"/api/v1/validateToken",
QueryData,
5000);
Poco::JSON::Object::Ptr Response;
if(Req.Do(Response)==Poco::Net::HTTPResponse::HTTP_OK) {
if(Response->has("tokenInfo") && Response->has("userInfo")) {
SecurityObjects::UserInfoAndPolicy P;
P.from_json(Response);
UserCache_[SessionToken] = P;
UInfo = P;
}
return true;
}
}
return false;
}
} }

View File

@@ -13,9 +13,9 @@
#include "RESTAPI_SecurityObjects.h" #include "RESTAPI_SecurityObjects.h"
#include "SubSystemServer.h" #include "SubSystemServer.h"
namespace uCentral { namespace OpenWifi {
class AuthClient : public SubSystemServer { class AuthClient : public SubSystemServer {
public: public:
explicit AuthClient() noexcept: explicit AuthClient() noexcept:
SubSystemServer("Authentication", "AUTH-CLNT", "authentication") SubSystemServer("Authentication", "AUTH-CLNT", "authentication")
@@ -31,12 +31,12 @@ namespace uCentral {
int Start() override; int Start() override;
void Stop() override; void Stop() override;
bool IsAuthorized(Poco::Net::HTTPServerRequest & Request, std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo ); bool IsAuthorized(Poco::Net::HTTPServerRequest & Request, std::string &SessionToken, OpenWifi::SecurityObjects::UserInfoAndPolicy & UInfo );
void RemovedCachedToken(const std::string &Token); void RemovedCachedToken(const std::string &Token);
bool IsTokenAuthorized(const std::string &Token, SecurityObjects::UserInfoAndPolicy & UInfo);
private: private:
static AuthClient *instance_; static AuthClient *instance_;
SecurityObjects::UserInfoCache UserCache_; OpenWifi::SecurityObjects::UserInfoCache UserCache_;
}; };
inline AuthClient * AuthClient() { return AuthClient::instance(); } inline AuthClient * AuthClient() { return AuthClient::instance(); }

View File

@@ -1,170 +0,0 @@
//
// License type: BSD 3-Clause License
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
//
// Created by Stephane Bourque on 2021-03-04.
// Arilia Wireless Inc.
//
#include "CallbackManager.h"
#include "Daemon.h"
#include "Poco/Net/HTTPClientSession.h"
#include "Poco/Net/HTTPSClientSession.h"
#include "Poco/Net/HTTPRequest.h"
#include "Poco/Net/HTTPResponse.h"
#include "Poco/URI.h"
namespace uCentral {
class CallbackManager *CallbackManager::instance_ = nullptr;
CallbackManager::CallbackManager() noexcept:
SubSystemServer("CallbackManager", "CBACK-MGR", "ucentral.callback")
{
}
int CallbackManager::Start() {
Logger_.notice("Starting...");
Mgr_.start(*this);
return 0;
}
bool CallbackManager::InitHosts() {
// get all the hosts we are registering with and register ourselves...
if(Daemon()->ConfigGetString("ucentral.callback.enable","false") == "false") {
Logger_.information("CALLBACK system disabled.");
return false;
}
MyIDCallbackId_ = Daemon()->ConfigGetString("ucentral.callback.id","");
if(MyIDCallbackId_.empty()) {
Logger_.information("CALLBACK system disabled. No CallbackID present in ucentral.callback.id");
return false;
}
// now get all the hosts we need to register with...
auto Index = 0 ;
while(true) {
std::string root = "ucentral.callback." + std::to_string(Index);
auto Local = Daemon()->ConfigGetString(root + ".local","");
auto Remote = Daemon()->ConfigGetString(root + ".remote","");
auto LocalKey = Daemon()->ConfigGetString(root + ".localkey","");
auto RemoteKey = Daemon()->ConfigGetString(root + ".localkey","");
auto Topics = Daemon()->ConfigGetString(root + ".topics","");
if(Local.empty() || Remote.empty() || LocalKey.empty() || Topics.empty() || RemoteKey.empty())
break;
CallbackHost H{
.Local = "https://" + Local + "/api/v1/callbackChannel",
.LocalKey = LocalKey,
.Remote = "https://" + Remote + "/api/v1/callbackChannel",
.RemoteKey = RemoteKey,
.Topics = Topics,
.LastContact = 0,
.NextContact = 0,
.Registered = false
};
Hosts_.push_back(H);
Index++;
}
return true;
}
bool DoRequest(Poco::Net::HTTPSClientSession& Session, Poco::Net::HTTPRequest& Request, Poco::Net::HTTPResponse& Response)
{
std::string Content{R"lit({ "comment" : "registration from uCentralGW" })lit"};
std::stringstream Body(Content);
Request.setContentType("application/json");
Request.setContentLength(Content.length());
std::ostream& OS = Session.sendRequest(Request);
Poco::StreamCopier::copyStream(Body, OS);
Session.receiveResponse(Response);
return (Response.getStatus() == Poco::Net::HTTPResponse::HTTP_OK);
}
bool CallbackManager::RegisterHosts() {
if(MyIDCallbackId_.empty())
return false;
for(auto &i:Hosts_) {
if(!i.Registered || (time(nullptr)-i.LastContact)>300) {
Poco::URI Uri(i.Remote);
Uri.addQueryParameter("subscribe", "true");
Uri.addQueryParameter("uri", i.Local);
Uri.addQueryParameter("topics", i.Topics);
Uri.addQueryParameter("key", i.LocalKey);
Uri.addQueryParameter("id", MyIDCallbackId_);
Poco::Net::HTTPSClientSession Session(Uri.getHost(), Uri.getPort());
Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_POST,
Uri.getPathAndQuery(),
Poco::Net::HTTPMessage::HTTP_1_1);
Request.add("X-API-KEY", i.RemoteKey);
Poco::Net::HTTPResponse Response;
i.LastContact = time(nullptr);
i.Registered = DoRequest(Session, Request, Response);
}
}
return true;
}
void CallbackManager::run() {
Running_ = true;
uint64_t LastContact = time(nullptr);
InitHosts();
RegisterHosts();
while(Running_) {
if((time(nullptr) - LastContact) >300) {
RegisterHosts();
LastContact = time(nullptr);
}
if(Calls_.empty()) {
Poco::Thread::sleep(2000);
} else {
CallBackMessage E;
{
SubMutexGuard Guard(Mutex_);
E = Calls_.front();
}
std::cout << "Call: " << E.Message << " JSON:" << E.JSONDoc << std::endl;
{
SubMutexGuard Guard(Mutex_);
Calls_.pop();
}
}
}
}
void CallbackManager::Stop() {
SubMutexGuard Guard(Mutex_);
Logger_.notice("Stopping...");
Running_ = false ;
Mgr_.join();
}
bool CallbackManager::AddMessage(const CallBackMessage &Msg) {
SubMutexGuard Guard(Mutex_);
Calls_.push(Msg);
return true;
}
} // end of namespace

View File

@@ -1,65 +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.
//
#ifndef UCENTRALGW_CALLBACKMANAGER_H
#define UCENTRALGW_CALLBACKMANAGER_H
#include <queue>
#include "SubSystemServer.h"
namespace uCentral {
class CallbackManager : public SubSystemServer, Poco::Runnable {
public:
struct CallBackMessage {
std::string Message;
std::string JSONDoc;
};
struct CallbackHost {
std::string Local;
std::string LocalKey;
std::string Remote;
std::string RemoteKey;
std::string Topics;
uint64_t LastContact;
uint64_t NextContact;
bool Registered;
};
static CallbackManager *instance() {
if (instance_ == nullptr) {
instance_ = new CallbackManager;
}
return instance_;
}
void run() override;
int Start() override;
void Stop() override;
bool AddMessage(const CallBackMessage &Msg);
bool InitHosts();
bool RegisterHosts();
private:
static CallbackManager *instance_;
Poco::Thread Mgr_;
std::atomic_bool Running_ = false;
std::queue<CallBackMessage> Calls_;
std::string MyIDCallbackId_;
std::vector<CallbackHost> Hosts_;
CallbackManager() noexcept;
};
inline CallbackManager * CallbackManager() { return CallbackManager::instance(); }
} // end of namespace
#endif // UCENTRALGW_CALLBACKMANAGER_H

View File

@@ -14,7 +14,7 @@
#include "Poco/JSON/Parser.h" #include "Poco/JSON/Parser.h"
#include "Poco/File.h" #include "Poco/File.h"
namespace uCentral::Config { namespace OpenWifi::Config {
static std::string DefaultConfiguration; static std::string DefaultConfiguration;
@@ -232,7 +232,7 @@ namespace uCentral::Config {
} }
catch ( const Poco::Exception & E ) catch ( const Poco::Exception & E )
{ {
uCentral::Daemon::instance()->logger().warning(Poco::format("%s: Failed with: %s", std::string(__func__) , E.displayText())); Daemon::instance()->logger().warning(Poco::format("%s: Failed with: %s", std::string(__func__) , E.displayText()));
} }
} }

View File

@@ -12,7 +12,7 @@
#include <string> #include <string>
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
namespace uCentral::Config { namespace OpenWifi::Config {
class Config { class Config {
public: public:

View File

@@ -1,164 +0,0 @@
//
// License type: BSD 3-Clause License
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
//
// Created by Stephane Bourque on 2021-03-04.
// Arilia Wireless Inc.
//
#include "CommandChannel.h"
#include "AuthClient.h"
#include "CommandManager.h"
#include "Daemon.h"
#include "FileUploader.h"
#include "RESTAPI_server.h"
#include "StorageService.h"
#include "WebSocketServer.h"
#include <boost/algorithm/string.hpp>
namespace uCentral {
class CommandChannel * CommandChannel::instance_ = nullptr;
std::string CommandChannel::ProcessCommand(const std::string &Command) {
std::vector<std::string> Tokens{};
std::string Result{"OK"};
try {
size_t pos, old_pos = 0 ;
Logger_.notice(Poco::format("COMMAND: %s",Command));
while((pos = Command.find(' ', old_pos)) != std::string::npos) {
Tokens.push_back(Command.substr(old_pos,pos-old_pos));
old_pos = pos + 1 ;
}
Tokens.push_back(Command.substr(old_pos));
boost::algorithm::to_lower(Tokens[0]);
boost::algorithm::to_lower(Tokens[1]);
if(Tokens[0]=="set") {
if(Tokens[1]=="loglevel") {
if(!Daemon()->SetSubsystemLogLevel(Tokens[3],Tokens[2]))
Result = "ERROR: Invalid: set logLevel subsystem name:" + Tokens[3];
}
} else if(Tokens[0]=="get") {
if(Tokens[1]=="loglevel") {
std::cout << "LogLevels:" << std::endl;
std::cout << " Auth: " << AuthClient()->Logger().getLevel() << std::endl;
std::cout << " uFileUploader: " << FileUploader()->Logger().getLevel() << std::endl;
std::cout << " WebSocket: " << WebSocketServer()->Logger().getLevel() << std::endl;
std::cout << " Storage: " << Storage()->Logger().getLevel() << std::endl;
std::cout << " RESTAPI: " << RESTAPI_server()->Logger().getLevel() << std::endl;
std::cout << " CommandManager: " << Logger_.getLevel() << std::endl;
std::cout << " DeviceRegistry: " << DeviceRegistry()->Logger().getLevel() << std::endl;
} else if (Tokens[1]=="stats") {
} else {
Result = "ERROR: Invalid: get command:" + Tokens[1];
}
} else if(Tokens[0]=="restart") {
Logger_.information("RESTART...");
} else if(Tokens[0]=="stop") {
Logger_.information("STOP...");
} else if(Tokens[0]=="stats") {
Logger_.information("STATS...");
} else {
Result = "ERROR: Invalid command: " + Tokens[0];
}
Logger_.notice(Poco::format("COMMAND-RESULT: %s",Result));
}
catch ( const Poco::Exception & E) {
Logger_.warning(Poco::format("COMMAND: Poco exception %s in performing command.",E.displayText()));
}
catch ( const std::exception & E) {
Logger_.warning(Poco::format("COMMAND: std::exception %s in performing command.",std::string(E.what())));
}
return Result;
}
/// This class handles all client connections.
class UnixSocketServerConnection: public Poco::Net::TCPServerConnection
{
public:
explicit UnixSocketServerConnection(const Poco::Net::StreamSocket & S, Poco::Logger & Logger):
TCPServerConnection(S),
Logger_(Logger)
{
}
void run() override
{
try
{
std::string Message;
std::vector<char> buffer(1024);
int n = 1;
while (n > 0)
{
n = socket().receiveBytes(&buffer[0], (int)buffer.size());
buffer[n] = '\0';
Message += &buffer[0];
Logger_.information(Poco::format("COMMAND-CHANNEL: %s",Message));
if(buffer.size() > n && !Message.empty())
{
CommandChannel()->ProcessCommand(Message);
Message.clear();
}
}
}
catch (const Poco::Exception & E)
{
Logger_.log(E);
}
}
private:
Poco::Logger & Logger_;
};
class UnixSocketServerConnectionFactory: public Poco::Net::TCPServerConnectionFactory
{
public:
explicit UnixSocketServerConnectionFactory() :
Logger_(CommandChannel()->Logger())
{
}
Poco::Net::TCPServerConnection* createConnection(const Poco::Net::StreamSocket& socket) override
{
return new UnixSocketServerConnection(socket,Logger_);
}
private:
Poco::Logger & Logger_;
};
CommandChannel::CommandChannel() noexcept:
SubSystemServer("CommandChannel", "COMMAND-CHANNEL", "commandchannel")
{
}
void CommandChannel::Stop() {
Logger_.notice("Stopping...");
Srv_->stop();
}
int CommandChannel::Start() {
Poco::File F(Daemon()->ConfigPath("ucentral.system.commandchannel","/tmp/app.ucentralgw"));
try {
if (F.exists())
F.remove();
} catch (const Poco::Exception &E ) {
}
SocketFile_ = std::make_unique<Poco::File>(F);
UnixSocket_ = std::make_unique<Poco::Net::SocketAddress>(Poco::Net::SocketAddress::UNIX_LOCAL, SocketFile_->path());
Svs_ = std::make_unique<Poco::Net::ServerSocket>(*UnixSocket_);
Srv_ = std::make_unique<Poco::Net::TCPServer>(new UnixSocketServerConnectionFactory, *Svs_);
Srv_->start();
Logger_.notice("Starting...");
return 0;
}
}

View File

@@ -1,51 +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.
//
#ifndef UCENTRALGW_COMMANDCHANNEL_H
#define UCENTRALGW_COMMANDCHANNEL_H
#include "SubSystemServer.h"
#include "Poco/File.h"
#include "Poco/Net/Socket.h"
#include "Poco/Net/SocketAddress.h"
#include "Poco/Net/TCPServer.h"
#include "Poco/Net/TCPServerConnection.h"
#include "Poco/Net/TCPServerConnectionFactory.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/ServerSocket.h"
namespace uCentral {
class CommandChannel : public SubSystemServer {
public:
static CommandChannel *instance() {
if (instance_ == nullptr) {
instance_ = new CommandChannel;
}
return instance_;
}
int Start() override;
void Stop() override;
std::string ProcessCommand(const std::string &Command);
private:
static CommandChannel * instance_;
std::unique_ptr<Poco::File> SocketFile_;
std::unique_ptr<Poco::Net::SocketAddress> UnixSocket_;
std::unique_ptr<Poco::Net::ServerSocket> Svs_;
std::unique_ptr<Poco::Net::TCPServer> Srv_;
CommandChannel() noexcept;
};
inline CommandChannel * CommandChannel() { return CommandChannel::instance(); }
} //namespace
#endif // UCENTRALGW_COMMANDCHANNEL_H

View File

@@ -18,9 +18,7 @@
#include "Poco/JSON/Parser.h" #include "Poco/JSON/Parser.h"
#define DBG std::cout << __LINE__ << " " __FILE__ << std::endl; namespace OpenWifi {
namespace uCentral {
class CommandManager * CommandManager::instance_ = nullptr; class CommandManager * CommandManager::instance_ = nullptr;
@@ -33,15 +31,18 @@ namespace uCentral {
Running_ = true; Running_ = true;
while(Running_) while(Running_)
{ {
Poco::Thread::trySleep(10000); Poco::Thread::trySleep(30000);
if(!Running_) if(!Running_)
break; break;
std::vector<GWObjects::CommandDetails> Commands; std::vector<GWObjects::CommandDetails> Commands;
if(Storage()->GetReadyToExecuteCommands(0,1000,Commands)) if(Storage()->GetReadyToExecuteCommands(1,200,Commands))
{ {
for(auto & Cmd: Commands) for(auto & Cmd: Commands)
{ {
if(!Running_)
break;
if(!SendCommand(Cmd)) { if(!SendCommand(Cmd)) {
Logger_.information(Poco::format("Failed to send command '%s' to %s",Cmd.Command,Cmd.SerialNumber)); Logger_.information(Poco::format("Failed to send command '%s' to %s",Cmd.Command,Cmd.SerialNumber));
} }
@@ -95,8 +96,6 @@ namespace uCentral {
std::stringstream ToSend; std::stringstream ToSend;
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend); Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
std::cout << "Count: " << Promise.use_count() << std::endl;
OutStandingRequests_[Id_] = std::make_pair(std::move(Promise),UUID); OutStandingRequests_[Id_] = std::make_pair(std::move(Promise),UUID);
Age_[Id_] = time(nullptr); Age_[Id_] = time(nullptr);
Id_++; Id_++;

View File

@@ -22,7 +22,7 @@
#include "RESTAPI_GWobjects.h" #include "RESTAPI_GWobjects.h"
#include "SubSystemServer.h" #include "SubSystemServer.h"
namespace uCentral { namespace OpenWifi {
class CommandManager : public SubSystemServer, Poco::Runnable { class CommandManager : public SubSystemServer, Poco::Runnable {
public: public:

View File

@@ -14,8 +14,6 @@
#include "Daemon.h" #include "Daemon.h"
#include "CallbackManager.h"
#include "CommandChannel.h"
#include "CommandManager.h" #include "CommandManager.h"
#include "DeviceRegistry.h" #include "DeviceRegistry.h"
#include "FileUploader.h" #include "FileUploader.h"
@@ -29,8 +27,9 @@
#include "RESTAPI_InternalServer.h" #include "RESTAPI_InternalServer.h"
#include "AuthClient.h" #include "AuthClient.h"
#include "StorageArchiver.h" #include "StorageArchiver.h"
#include "SerialNumberCache.h"
namespace uCentral { namespace OpenWifi {
class Daemon *Daemon::instance_ = nullptr; class Daemon *Daemon::instance_ = nullptr;
class Daemon *Daemon::instance() { class Daemon *Daemon::instance() {
@@ -42,6 +41,7 @@ namespace uCentral {
vDAEMON_BUS_TIMER, vDAEMON_BUS_TIMER,
Types::SubSystemVec{ Types::SubSystemVec{
Storage(), Storage(),
SerialNumberCache(),
AuthClient(), AuthClient(),
DeviceRegistry(), DeviceRegistry(),
RESTAPI_server(), RESTAPI_server(),
@@ -50,8 +50,6 @@ namespace uCentral {
CommandManager(), CommandManager(),
FileUploader(), FileUploader(),
OUIServer(), OUIServer(),
CommandChannel(),
CallbackManager(),
StorageArchiver(), StorageArchiver(),
}); });
} }
@@ -73,7 +71,7 @@ namespace uCentral {
auto Type = Line.substr(0, P1); auto Type = Line.substr(0, P1);
auto List = Line.substr(P1+1); auto List = Line.substr(P1+1);
Types::StringVec Tokens = uCentral::Utils::Split(List); Types::StringVec Tokens = Utils::Split(List);
auto Entry = DeviceTypeIdentifications_.find(Type); auto Entry = DeviceTypeIdentifications_.find(Type);
if(DeviceTypeIdentifications_.end() == Entry) { if(DeviceTypeIdentifications_.end() == Entry) {
@@ -98,7 +96,7 @@ namespace uCentral {
int main(int argc, char **argv) { int main(int argc, char **argv) {
try { try {
auto App = uCentral::Daemon::instance(); auto App = OpenWifi::Daemon::instance();
auto ExitCode = App->run(argc, argv); auto ExitCode = App->run(argc, argv);
delete App; delete App;

View File

@@ -25,10 +25,11 @@
#include "Poco/Crypto/CipherFactory.h" #include "Poco/Crypto/CipherFactory.h"
#include "Poco/Crypto/Cipher.h" #include "Poco/Crypto/Cipher.h"
#include "Dashboard.h"
#include "MicroService.h" #include "MicroService.h"
#include "uCentralTypes.h" #include "OpenWifiTypes.h"
namespace uCentral { namespace OpenWifi {
static const char * vDAEMON_PROPERTIES_FILENAME = "ucentralgw.properties"; static const char * vDAEMON_PROPERTIES_FILENAME = "ucentralgw.properties";
static const char * vDAEMON_ROOT_ENV_VAR = "UCENTRALGW_ROOT"; static const char * vDAEMON_ROOT_ENV_VAR = "UCENTRALGW_ROOT";
@@ -50,10 +51,13 @@ namespace uCentral {
[[nodiscard]] std::string IdentifyDevice(const std::string & Compatible) const; [[nodiscard]] std::string IdentifyDevice(const std::string & Compatible) const;
void initialize(Poco::Util::Application &self); void initialize(Poco::Util::Application &self);
static Daemon *instance(); static Daemon *instance();
inline DeviceDashboard & GetDashboard() { return DB_; }
private: private:
static Daemon *instance_; static Daemon *instance_;
bool AutoProvisioning_ = false; bool AutoProvisioning_ = false;
Types::StringMapStringSet DeviceTypeIdentifications_; Types::StringMapStringSet DeviceTypeIdentifications_;
DeviceDashboard DB_;
}; };
inline Daemon * Daemon() { return Daemon::instance(); } inline Daemon * Daemon() { return Daemon::instance(); }

21
src/Dashboard.cpp Normal file
View File

@@ -0,0 +1,21 @@
//
// Created by stephane bourque on 2021-07-21.
//
#include "Dashboard.h"
#include "DeviceRegistry.h"
#include "StorageService.h"
namespace OpenWifi {
void DeviceDashboard::Create() {
uint64_t Now = std::time(nullptr);
if(LastRun_==0 || (Now-LastRun_)>120) {
DB_.reset();
Storage()->AnalyzeCommands(DB_.commands);
// DeviceRegistry()->AnalyzeRegistry(DB_);
Storage()->AnalyzeDevices(DB_);
LastRun_ = Now;
}
}
}

23
src/Dashboard.h Normal file
View File

@@ -0,0 +1,23 @@
//
// Created by stephane bourque on 2021-07-21.
//
#ifndef UCENTRALGW_DASHBOARD_H
#define UCENTRALGW_DASHBOARD_H
#include "OpenWifiTypes.h"
#include "RESTAPI_GWobjects.h"
namespace OpenWifi {
class DeviceDashboard {
public:
void Create();
const GWObjects::Dashboard & Report() const { return DB_;}
private:
GWObjects::Dashboard DB_;
uint64_t LastRun_=0;
inline void Reset() { DB_.reset(); }
};
}
#endif // UCENTRALGW_DASHBOARD_H

View File

@@ -12,8 +12,11 @@
#include "WebSocketServer.h" #include "WebSocketServer.h"
#include "DeviceRegistry.h" #include "DeviceRegistry.h"
#include "OUIServer.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h"
namespace uCentral { namespace OpenWifi {
class DeviceRegistry *DeviceRegistry::instance_ = nullptr; class DeviceRegistry *DeviceRegistry::instance_ = nullptr;
DeviceRegistry::DeviceRegistry() noexcept: DeviceRegistry::DeviceRegistry() noexcept:
@@ -78,7 +81,7 @@ namespace uCentral {
} }
} }
bool DeviceRegistry::GetHealthcheck(const std::string &SerialNumber, std::string & CheckData) { bool DeviceRegistry::GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) {
SubMutexGuard Guard(Mutex_); SubMutexGuard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber); auto Device = Devices_.find(SerialNumber);
@@ -89,7 +92,7 @@ namespace uCentral {
return false; return false;
} }
void DeviceRegistry::SetHealthcheck(const std::string &SerialNumber, const std::string &CheckData) { void DeviceRegistry::SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck & CheckData) {
SubMutexGuard Guard(Mutex_); SubMutexGuard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber); auto Device = Devices_.find(SerialNumber);
@@ -152,7 +155,6 @@ namespace uCentral {
Device->second->Conn_.Address = ""; Device->second->Conn_.Address = "";
Device->second->WSConn_ = nullptr; Device->second->WSConn_ = nullptr;
Device->second->Conn_.Connected = false; Device->second->Conn_.Connected = false;
Device->second->Conn_.LastContact = time(nullptr);
Device->second->Conn_.VerifiedCertificate = GWObjects::NO_CERTIFICATE; Device->second->Conn_.VerifiedCertificate = GWObjects::NO_CERTIFICATE;
} }
@@ -177,26 +179,103 @@ namespace uCentral {
} }
} }
/* bool Service::SendCommand(uCentral::Objects::CommandDetails & Cmd) std::string ComputeCertificateTag( GWObjects::CertificateValidation V) {
{ switch(V) {
case GWObjects::NO_CERTIFICATE: return "no certificate";
case GWObjects::VALID_CERTIFICATE: return "non TIP certificate";
case GWObjects::MISMATCH_SERIAL: return "serial mismatch";
case GWObjects::VERIFIED: return "verified";
}
return "unknown";
}
const uint64_t SECONDS_MONTH = 30*24*60*60;
const uint64_t SECONDS_WEEK = 7*24*60*60;
const uint64_t SECONDS_DAY = 1*24*60*60;
const uint64_t SECONDS_HOUR = 1*24*60*60;
std::string ComputeUpLastContactTag(uint64_t T1) {
uint64_t T = T1 - std::time(nullptr);
if( T>SECONDS_MONTH) return ">month";
if( T>SECONDS_WEEK) return ">week";
if( T>SECONDS_DAY) return ">day";
if( T>SECONDS_HOUR) return ">hour";
return "now";
}
std::string ComputeSanityTag(uint64_t T) {
if( T==100) return "100%";
if( T>90) return ">90%";
if( T>60) return ">60%";
return "<60%";
}
std::string ComputeUpTimeTag(uint64_t T) {
if( T>SECONDS_MONTH) return ">month";
if( T>SECONDS_WEEK) return ">week";
if( T>SECONDS_DAY) return ">day";
if( T>SECONDS_HOUR) return ">hour";
return "now";
}
std::string ComputeLoadTag(uint64_t T) {
float V=100.0*((float)T/65536.0);
if(V<5.0) return "< 5%";
if(V<25.0) return "< 25%";
if(V<50.0) return "< 50%";
if(V<75.0) return "< 75%";
return ">75%";
}
std::string ComputeFreeMemoryTag(uint64_t Free, uint64_t Total) {
float V = 100.0 * ((float)Free/(float(Total)));
if(V<5.0) return "< 5%";
if(V<25.0) return "< 25%";
if(V<50.0) return "< 50%";
if(V<75.0) return "< 75%";
return ">75%";
}
bool DeviceRegistry::AnalyzeRegistry(GWObjects::Dashboard &D) {
SubMutexGuard Guard(Mutex_); SubMutexGuard Guard(Mutex_);
auto Device = Devices_.find(Cmd.SerialNumber); for(auto const &[SerialNumber,Connection]:Devices_) {
Types::UpdateCountedMap(D.status, Connection->Conn_.Connected ? "connected" : "not connected");
Types::UpdateCountedMap(D.vendors, OUIServer()->GetManufacturer(SerialNumber));
Types::UpdateCountedMap(D.certificates, ComputeCertificateTag(Connection->Conn_.VerifiedCertificate));
Types::UpdateCountedMap(D.lastContact, ComputeUpLastContactTag(Connection->Conn_.LastContact));
Types::UpdateCountedMap(D.healths, ComputeSanityTag(Connection->LastHealthcheck.Sanity));
Types::UpdateCountedMap(D.deviceType, Connection->Conn_.Compatible);
if(!Connection->LastStats.empty()) {
Poco::JSON::Parser P;
auto RawObject = P.parse(Connection->LastStats).extract<Poco::JSON::Object::Ptr>();
if(RawObject->has("unit")) {
auto Unit = RawObject->getObject("unit");
if (Unit->has("uptime")) {
Types::UpdateCountedMap(D.upTimes, ComputeUpTimeTag(Unit->get("uptime")));
}
if (Unit->has("memory")) {
auto Memory = Unit->getObject("memory");
uint64_t Free = Memory->get("free");
uint64_t Total = Memory->get("total");
Types::UpdateCountedMap(D.memoryUsed, ComputeFreeMemoryTag(Free, Total));
}
if (Unit->has("load")) {
auto Load = Unit->getArray("load");
Types::UpdateCountedMap(D.load1,
ComputeLoadTag(Load->getElement<uint64_t>(0)));
Types::UpdateCountedMap(D.load5,
ComputeLoadTag(Load->getElement<uint64_t>(1)));
Types::UpdateCountedMap(D.load15,
ComputeLoadTag(Load->getElement<uint64_t>(2)));
}
}
}
}
return false;
}
try {
if (Device != Devices_.end()) {
if (Device->second->Conn_.Connected) {
if (Device->second->WSConn_ != nullptr) {
auto *WSConn = static_cast<uCentral::WebSocket::WSConnection *>(Device->second->WSConn_);
WSConn->SendCommand(Cmd);
return true;
}
}
}
} catch(...) {
Logger_.error(Poco::format("COMMAND(%s): Cannot send command %s.",Cmd.SerialNumber, Cmd.Command));
}
return false;
}
*/
} // namespace } // namespace

View File

@@ -16,7 +16,7 @@
// class uCentral::WebSocket::WSConnection; // class uCentral::WebSocket::WSConnection;
namespace uCentral { namespace OpenWifi {
class WSConnection; class WSConnection;
class DeviceRegistry : public SubSystemServer { class DeviceRegistry : public SubSystemServer {
@@ -25,7 +25,7 @@ namespace uCentral {
WSConnection *WSConn_; WSConnection *WSConn_;
GWObjects::ConnectionState Conn_; GWObjects::ConnectionState Conn_;
std::string LastStats; std::string LastStats;
std::string LastHealthcheck; GWObjects::HealthCheck LastHealthcheck;
}; };
static DeviceRegistry *instance() { static DeviceRegistry *instance() {
@@ -41,8 +41,8 @@ namespace uCentral {
void SetStatistics(const std::string &SerialNumber, const std::string &stats); void SetStatistics(const std::string &SerialNumber, const std::string &stats);
bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State); bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
void SetState(const std::string & SerialNumber, GWObjects::ConnectionState & State); void SetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
bool GetHealthcheck(const std::string &SerialNumber, std::string & Statistics); bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData);
void SetHealthcheck(const std::string &SerialNumber, const std::string &stats); void SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck &H);
GWObjects::ConnectionState * Register(const std::string & SerialNumber, WSConnection *); GWObjects::ConnectionState * Register(const std::string & SerialNumber, WSConnection *);
void UnRegister(const std::string & SerialNumber, WSConnection *); void UnRegister(const std::string & SerialNumber, WSConnection *);
bool SendCommand(GWObjects::CommandDetails & Command); bool SendCommand(GWObjects::CommandDetails & Command);
@@ -50,6 +50,8 @@ namespace uCentral {
bool SendFrame(const std::string & SerialNumber, const std::string & Payload); bool SendFrame(const std::string & SerialNumber, const std::string & Payload);
void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID); void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID);
bool AnalyzeRegistry(GWObjects::Dashboard &D);
private: private:
static DeviceRegistry *instance_; static DeviceRegistry *instance_;
std::map<std::string,std::unique_ptr<ConnectionEntry>> Devices_; std::map<std::string,std::unique_ptr<ConnectionEntry>> Devices_;

View File

@@ -26,15 +26,9 @@
#include "Utils.h" #include "Utils.h"
namespace uCentral { namespace OpenWifi {
class FileUploader *FileUploader::instance_ = nullptr; class FileUploader *FileUploader::instance_ = nullptr;
FileUploader::FileUploader() noexcept:
SubSystemServer("FileUploader", "FILE-UPLOAD", "ucentral.fileuploader")
{
SubMutexGuard Guard(Mutex_);
}
static const std::string URI_BASE{"/v1/upload/"}; static const std::string URI_BASE{"/v1/upload/"};
int FileUploader::Start() { int FileUploader::Start() {
@@ -48,7 +42,16 @@ namespace uCentral {
Logger_.information(l); Logger_.information(l);
Path_ = Daemon()->ConfigPath("ucentral.fileuploader.path","/tmp"); Poco::File UploadsDir(Daemon()->ConfigPath("ucentral.fileuploader.path","/tmp"));
Path_ = UploadsDir.path();
if(!UploadsDir.exists()) {
try {
UploadsDir.createDirectory();
} catch (const Poco::Exception &E) {
Logger_.log(E);
Path_ = "/tmp";
}
}
auto Sock{Svr.CreateSecureSocket(Logger_)}; auto Sock{Svr.CreateSecureSocket(Logger_)};
@@ -69,6 +72,8 @@ namespace uCentral {
Servers_.push_back(std::move(NewServer)); Servers_.push_back(std::move(NewServer));
} }
MaxSize_ = 1000 * Daemon()->ConfigGetInt("ucentral.fileuploader.maxsize", 10000);
return 0; return 0;
} }
@@ -107,10 +112,10 @@ namespace uCentral {
OutStandingUploads_.erase(UUID); OutStandingUploads_.erase(UUID);
} }
class MyPartHandler: public Poco::Net::PartHandler class FileUploaderPartHandler: public Poco::Net::PartHandler
{ {
public: public:
MyPartHandler(std::string UUID, Poco::Logger & Logger): FileUploaderPartHandler(std::string UUID, Poco::Logger & Logger):
UUID_(std::move(UUID)), UUID_(std::move(UUID)),
Logger_(Logger) Logger_(Logger)
{ {
@@ -118,42 +123,54 @@ namespace uCentral {
void handlePart(const Poco::Net::MessageHeader& Header, std::istream& Stream) override void handlePart(const Poco::Net::MessageHeader& Header, std::istream& Stream) override
{ {
FileType_ = Header.get("Content-Type", "(unspecified)"); try {
if (Header.has("Content-Disposition")) Name_ = "(unnamed)";
{ if (Header.has("Content-Disposition")) {
std::string Disposition; std::string Disposition;
Poco::Net::NameValueCollection Parameters; Poco::Net::NameValueCollection Parameters;
Poco::Net::MessageHeader::splitParameters(Header["Content-Disposition"], Disposition, Parameters); Poco::Net::MessageHeader::splitParameters(Header["Content-Disposition"],
Name_ = Parameters.get("name", "(unnamed)"); Disposition, Parameters);
} Name_ = Parameters.get("filename", "(unnamed)");
}
Poco::CountingInputStream InputStream(Stream); Poco::TemporaryFile TmpFile;
std::string TmpFileName = FileUploader()->Path() + "/" + UUID_ + ".upload.start" ; std::string FinalFileName = FileUploader()->Path() + "/" + UUID_;
std::string FinalFileName = FileUploader()->Path() + "/" + UUID_ ; Logger_.information(Poco::format("FILE-UPLOADER: uploading trace for %s", UUID_));
Logger_.information(Poco::format("FILE-UPLOADER: uploading %s",TmpFileName)); Poco::CountingInputStream InputStream(Stream);
std::ofstream OutputStream(TmpFile.path(), std::ofstream::out);
Poco::StreamCopier::copyStream(InputStream, OutputStream);
Length_ = TmpFile.getSize();
std::ofstream OutputStream(TmpFileName, std::ofstream::out); if (Length_ < FileUploader()->MaxSize()) {
Poco::StreamCopier::copyStream(InputStream, OutputStream); rename(TmpFile.path().c_str(), FinalFileName.c_str());
Length_ = InputStream.chars(); Good_=true;
rename(TmpFileName.c_str(),FinalFileName.c_str()); } else {
} Error_ = "File is too large.";
}
return;
} catch (const Poco::Exception &E ) {
Logger_.log(E);
Error_ = std::string("Upload caused an internal error: ") + E.what() ;
}
}
[[nodiscard]] uint64_t Length() const { return Length_; } [[nodiscard]] uint64_t Length() const { return Length_; }
[[nodiscard]] const std::string& Name() const { return Name_; } [[nodiscard]] const std::string& Name() const { return Name_; }
[[nodiscard]] const std::string& ContentType() const { return FileType_; } [[nodiscard]] bool Good() const { return Good_; }
std::string & Error() { return Error_; }
private: private:
uint64_t Length_=0; uint64_t Length_=0;
std::string FileType_; bool Good_=false;
std::string Name_; std::string Name_;
std::string UUID_; std::string UUID_;
std::string Error_;
Poco::Logger & Logger_; Poco::Logger & Logger_;
}; };
class FormRequestHandler: public Poco::Net::HTTPRequestHandler class FormRequestHandler: public Poco::Net::HTTPRequestHandler
/// Return a HTML document with the current date and time.
{ {
public: public:
explicit FormRequestHandler(std::string UUID, Poco::Logger & L): explicit FormRequestHandler(std::string UUID, Poco::Logger & L):
@@ -165,62 +182,27 @@ namespace uCentral {
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override
{ {
try { try {
MyPartHandler partHandler(UUID_,Logger_); FileUploaderPartHandler partHandler(UUID_,Logger_);
Poco::Net::HTMLForm form(Request, Request.stream(), partHandler); Poco::Net::HTMLForm form(Request, Request.stream(), partHandler);
Response.setChunkedTransferEncoding(true);
Response.setContentType("text/html");
std::ostream &ResponseStream = Response.send();
ResponseStream << Response.setChunkedTransferEncoding(true);
"<html>\n" Response.setContentType("application/json");
"<head>\n"
"<title>POCO Form Server Sample</title>\n"
"</head>\n"
"<body>\n"
"<h1>POCO Form Server Sample</h1>\n"
"<h2>GET Form</h2>\n"
"<form method=\"GET\" action=\"/form\">\n"
"<input type=\"text\" name=\"text\" size=\"31\">\n"
"<input type=\"submit\" value=\"GET\">\n"
"</form>\n"
"<h2>POST Form</h2>\n"
"<form method=\"POST\" action=\"/form\">\n"
"<input type=\"text\" name=\"text\" size=\"31\">\n"
"<input type=\"submit\" value=\"POST\">\n"
"</form>\n"
"<h2>File Upload</h2>\n"
"<form method=\"POST\" action=\"/form\" enctype=\"multipart/form-data\">\n"
"<input type=\"file\" name=\"file\" size=\"31\"> \n"
"<input type=\"submit\" value=\"Upload\">\n"
"</form>\n";
ResponseStream << "<h2>Request</h2><p>\n"; Poco::JSON::Object Answer;
ResponseStream << "Method: " << Request.getMethod() << "<br>\n"; if (partHandler.Good()) {
ResponseStream << "URI: " << Request.getURI() << "<br>\n"; Answer.set("filename", UUID_);
for (auto & i:Request) { Answer.set("error", 0);
ResponseStream << i.first << ": " << i.second << "<br>\n"; Storage()->AttachFileToCommand(UUID_);
} } else {
Answer.set("filename", UUID_);
ResponseStream << "</p>"; Answer.set("error", 13);
Answer.set("errorText", partHandler.Error() );
if (!form.empty()) { Storage()->CancelWaitFile(UUID_, partHandler.Error() );
ResponseStream << "<h2>Form</h2><p>\n"; }
for (const auto & i:form) std::ostream &ResponseStream = Response.send();
ResponseStream << i.first << ": " << i.second << "<br>\n"; Poco::JSON::Stringifier::stringify(Answer, ResponseStream);
ResponseStream << "</p>"; return;
}
if (!partHandler.Name().empty()) {
ResponseStream << "<h2>Upload</h2><p>\n";
ResponseStream << "Name: " << partHandler.Name() << "<br>\n";
ResponseStream << "Type: " << partHandler.ContentType() << "<br>\n";
ResponseStream << "Size: " << partHandler.Length() << "<br>\n";
ResponseStream << "</p>";
}
ResponseStream << "</body>\n";
Storage()->AttachFileToCommand(UUID_);
} }
catch( const Poco::Exception & E ) catch( const Poco::Exception & E )
{ {
@@ -237,7 +219,7 @@ namespace uCentral {
Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) { Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
Logger_.debug(Poco::format("REQUEST(%s): %s %s", uCentral::Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI())); Logger_.debug(Poco::format("REQUEST(%s): %s %s", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
// The UUID should be after the /v1/upload/ part... // The UUID should be after the /v1/upload/ part...
auto UUIDLocation = Request.getURI().find_first_of(URI_BASE); auto UUIDLocation = Request.getURI().find_first_of(URI_BASE);

View File

@@ -15,8 +15,9 @@
#include "Poco/Net/HTTPRequestHandler.h" #include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h" #include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class FileUploader : public SubSystemServer { class FileUploader : public SubSystemServer {
public: public:
@@ -35,6 +36,8 @@ namespace uCentral {
return instance_; return instance_;
} }
[[nodiscard]] inline uint64_t MaxSize() const { return MaxSize_; }
private: private:
static FileUploader *instance_; static FileUploader *instance_;
std::vector<std::unique_ptr<Poco::Net::HTTPServer>> Servers_; std::vector<std::unique_ptr<Poco::Net::HTTPServer>> Servers_;
@@ -42,8 +45,13 @@ namespace uCentral {
std::string FullName_; std::string FullName_;
std::map<std::string,uint64_t> OutStandingUploads_; std::map<std::string,uint64_t> OutStandingUploads_;
std::string Path_; std::string Path_;
uint64_t MaxSize_=10000000;
FileUploader() noexcept; explicit FileUploader() noexcept:
SubSystemServer("FileUploader", "FILE-UPLOAD", "ucentral.fileuploader")
{
SubMutexGuard Guard(Mutex_);
}
}; };
class FileUpLoaderRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory { class FileUpLoaderRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {

View File

@@ -12,7 +12,7 @@
#include "Daemon.h" #include "Daemon.h"
#include "Utils.h" #include "Utils.h"
namespace uCentral { namespace OpenWifi {
class KafkaManager *KafkaManager::instance_ = nullptr; class KafkaManager *KafkaManager::instance_ = nullptr;
@@ -61,7 +61,7 @@ namespace uCentral {
SystemInfoWrapper_ = R"lit({ "system" : { "id" : )lit" + SystemInfoWrapper_ = R"lit({ "system" : { "id" : )lit" +
std::to_string(Daemon()->ID()) + std::to_string(Daemon()->ID()) +
R"lit( , "host" : ")lit" + Daemon()->PrivateEndPoint() + R"lit( , "host" : ")lit" + Daemon()->PrivateEndPoint() +
R"lit(" } , "payload" : ")lit" ; R"lit(" } , "payload" : )lit" ;
cppkafka::Producer Producer(Config); cppkafka::Producer Producer(Config);
ProducerRunning_ = true; ProducerRunning_ = true;
while(ProducerRunning_) { while(ProducerRunning_) {
@@ -87,6 +87,13 @@ namespace uCentral {
} }
} }
void KafkaManager::PartitionAssignment(const cppkafka::TopicPartitionList& partitions) {
Logger_.information(Poco::format("Partition assigned: %Lu...",(uint64_t )partitions.front().get_partition()));
}
void KafkaManager::PartitionRevocation(const cppkafka::TopicPartitionList& partitions) {
Logger_.information(Poco::format("Partition revocation: %Lu...",(uint64_t )partitions.front().get_partition()));
}
void KafkaManager::ConsumerThr() { void KafkaManager::ConsumerThr() {
cppkafka::Configuration Config({ cppkafka::Configuration Config({
{ "client.id", Daemon()->ConfigGetString("ucentral.kafka.client.id") }, { "client.id", Daemon()->ConfigGetString("ucentral.kafka.client.id") },
@@ -105,14 +112,23 @@ namespace uCentral {
Config.set_default_topic_configuration(topic_config); Config.set_default_topic_configuration(topic_config);
cppkafka::Consumer Consumer(Config); cppkafka::Consumer Consumer(Config);
Consumer.set_assignment_callback([this](const cppkafka::TopicPartitionList& partitions) { Consumer.set_assignment_callback([this](cppkafka::TopicPartitionList& partitions) {
Logger_.information(Poco::format("Partition assigned: %Lu...",(uint64_t )partitions.front().get_partition())); if(!partitions.empty()) {
Logger_.information(Poco::format("Partition assigned: %Lu...",
(uint64_t)partitions.front().get_partition()));
}
}); });
Consumer.set_revocation_callback([this](const cppkafka::TopicPartitionList& partitions) { Consumer.set_revocation_callback([this](const cppkafka::TopicPartitionList& partitions) {
Logger_.information(Poco::format("Partition revocation: %Lu...",(uint64_t )partitions.front().get_partition())); if(!partitions.empty()) {
Logger_.information(Poco::format("Partition revocation: %Lu...",
(uint64_t)partitions.front().get_partition()));
}
}); });
Types::StringVec Topics; bool AutoCommit = Daemon()->ConfigGetBool("ucentral.kafka.auto.commit",false);
auto BatchSize = Daemon()->ConfigGetInt("ucentral.kafka.consumer.batchsize",20);
Types::StringVec Topics;
for(const auto &i:Notifiers_) for(const auto &i:Notifiers_)
Topics.push_back(i.first); Topics.push_back(i.first);
@@ -121,28 +137,31 @@ namespace uCentral {
ConsumerRunning_ = true; ConsumerRunning_ = true;
while(ConsumerRunning_) { while(ConsumerRunning_) {
try { try {
cppkafka::Message Msg = Consumer.poll(std::chrono::milliseconds(200)); std::vector<cppkafka::Message> MsgVec = Consumer.poll_batch(BatchSize, std::chrono::milliseconds(200));
if (!Msg) for(auto const &Msg:MsgVec) {
continue; if (!Msg)
if (Msg.get_error()) { continue;
if (!Msg.is_eof()) { if (Msg.get_error()) {
Logger_.error(Poco::format("Error: %s", Msg.get_error().to_string())); if (!Msg.is_eof()) {
} Logger_.error(Poco::format("Error: %s", Msg.get_error().to_string()));
Consumer.commit(Msg); }if(!AutoCommit)
continue; Consumer.async_commit(Msg);
} continue;
SubMutexGuard G(ConsumerMutex_); }
auto It = Notifiers_.find(Msg.get_topic()); SubMutexGuard G(ConsumerMutex_);
if (It != Notifiers_.end()) { auto It = Notifiers_.find(Msg.get_topic());
Types::TopicNotifyFunctionList &FL = It->second; if (It != Notifiers_.end()) {
std::string Key{Msg.get_key()}; Types::TopicNotifyFunctionList &FL = It->second;
std::string Payload{Msg.get_payload()}; std::string Key{Msg.get_key()};
for (auto &F : FL) { std::string Payload{Msg.get_payload()};
std::thread T(F.first, Key, Payload); for (auto &F : FL) {
T.detach(); std::thread T(F.first, Key, Payload);
} T.detach();
} }
Consumer.commit(Msg); }
if (!AutoCommit)
Consumer.async_commit(Msg);
}
} catch (const cppkafka::HandleException &E) { } catch (const cppkafka::HandleException &E) {
Logger_.warning(Poco::format("Caught a Kafka exception (consumer): %s",std::string{E.what()})); Logger_.warning(Poco::format("Caught a Kafka exception (consumer): %s",std::string{E.what()}));
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {

View File

@@ -13,11 +13,11 @@
#include <thread> #include <thread>
#include "SubSystemServer.h" #include "SubSystemServer.h"
#include "uCentralTypes.h" #include "OpenWifiTypes.h"
#include "cppkafka/cppkafka.h" #include "cppkafka/cppkafka.h"
namespace uCentral { namespace OpenWifi {
class KafkaManager : public SubSystemServer { class KafkaManager : public SubSystemServer {
public: public:
@@ -47,6 +47,8 @@ namespace uCentral {
int RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction & F); int RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction & F);
void UnregisterTopicWatcher(const std::string &Topic, int FunctionId); void UnregisterTopicWatcher(const std::string &Topic, int FunctionId);
void WakeUp(); void WakeUp();
void PartitionAssignment(const cppkafka::TopicPartitionList& partitions);
void PartitionRevocation(const cppkafka::TopicPartitionList& partitions);
private: private:
static KafkaManager *instance_; static KafkaManager *instance_;

View File

@@ -5,7 +5,7 @@
#ifndef UCENTRALGW_KAFKA_TOPICS_H #ifndef UCENTRALGW_KAFKA_TOPICS_H
#define UCENTRALGW_KAFKA_TOPICS_H #define UCENTRALGW_KAFKA_TOPICS_H
namespace uCentral::KafkaTopics { namespace OpenWifi::KafkaTopics {
static const std::string HEALTHCHECK{"healthcheck"}; static const std::string HEALTHCHECK{"healthcheck"};
static const std::string STATE{"state"}; static const std::string STATE{"state"};
static const std::string CONNECTION{"connection"}; static const std::string CONNECTION{"connection"};
@@ -13,6 +13,7 @@ namespace uCentral::KafkaTopics {
static const std::string ALERTS{"alerts"}; static const std::string ALERTS{"alerts"};
static const std::string COMMAND{"command"}; static const std::string COMMAND{"command"};
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"};
namespace ServiceEvents { namespace ServiceEvents {
static const std::string EVENT_JOIN{"join"}; static const std::string EVENT_JOIN{"join"};

View File

@@ -34,7 +34,7 @@
#include "AuthClient.h" #include "AuthClient.h"
#endif #endif
namespace uCentral { namespace OpenWifi {
void MyErrorHandler::exception(const Poco::Exception & E) { void MyErrorHandler::exception(const Poco::Exception & E) {
Poco::Thread * CurrentThread = Poco::Thread::current(); Poco::Thread * CurrentThread = Poco::Thread::current();
@@ -112,6 +112,16 @@ namespace uCentral {
} else { } else {
logger().error("Bad bus message."); logger().error("Bad bus message.");
} }
auto i=Services_.begin();
auto Now = (uint64_t )std::time(nullptr);
for(;i!=Services_.end();) {
if((Now - i->second.LastUpdate)>60) {
i = Services_.erase(i);
} else
++i;
}
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
logger().log(E); logger().log(E);
} }
@@ -140,11 +150,6 @@ namespace uCentral {
} }
void MicroService::initialize(Poco::Util::Application &self) { void MicroService::initialize(Poco::Util::Application &self) {
std::string V{APP_VERSION};
std::string B{BUILD_NUMBER};
Version_ = V + "(" + B + ")";
// add the default services // add the default services
SubSystems_.push_back(KafkaManager()); SubSystems_.push_back(KafkaManager());
SubSystems_.push_back(ALBHealthCheckServer()); SubSystems_.push_back(ALBHealthCheckServer());
@@ -187,7 +192,8 @@ namespace uCentral {
} }
} }
std::string KeyFile = ConfigPath("ucentral.service.key"); std::string KeyFile = ConfigPath("ucentral.service.key");
AppKey_ = Poco::SharedPtr<Poco::Crypto::RSAKey>(new Poco::Crypto::RSAKey("", KeyFile, "")); std::string KeyFilePassword = ConfigPath("ucentral.service.key.password" , "" );
AppKey_ = Poco::SharedPtr<Poco::Crypto::RSAKey>(new Poco::Crypto::RSAKey("", KeyFile, KeyFilePassword));
Cipher_ = CipherFactory_.createCipher(*AppKey_); Cipher_ = CipherFactory_.createCipher(*AppKey_);
ID_ = Utils::GetSystemId(); ID_ = Utils::GetSystemId();
if(!DebugMode_) if(!DebugMode_)

View File

@@ -24,14 +24,16 @@
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Process.h" #include "Poco/Process.h"
#include "uCentralTypes.h" #include "OpenWifiTypes.h"
#include "SubSystemServer.h" #include "SubSystemServer.h"
namespace uCentral { namespace OpenWifi {
static const std::string uSERVICE_SECURITY{"ucentralsec"}; static const std::string uSERVICE_SECURITY{"ucentralsec"};
static const std::string uSERVICE_GATEWAY{"ucentralgw"}; static const std::string uSERVICE_GATEWAY{"ucentralgw"};
static const std::string uSERVICE_FIRMWARE{ "ucentralfws"}; static const std::string uSERVICE_FIRMWARE{ "ucentralfms"};
static const std::string uSERVICE_TOPOLOGY{ "owtopo"};
static const std::string uSERVICE_PROVISIONING{ "owprov"};
class MyErrorHandler : public Poco::ErrorHandler { class MyErrorHandler : public Poco::ErrorHandler {
public: public:
@@ -79,7 +81,11 @@ namespace uCentral {
DAEMON_CONFIG_ENV_VAR(std::move(ConfigVar)), DAEMON_CONFIG_ENV_VAR(std::move(ConfigVar)),
DAEMON_APP_NAME(std::move(AppName)), DAEMON_APP_NAME(std::move(AppName)),
DAEMON_BUS_TIMER(BusTimer), DAEMON_BUS_TIMER(BusTimer),
SubSystems_(std::move(Subsystems)) {} SubSystems_(std::move(Subsystems)) {
std::string V{APP_VERSION};
std::string B{BUILD_NUMBER};
Version_ = V + "(" + B + ")";
}
int main(const ArgVec &args) override; int main(const ArgVec &args) override;
void initialize(Application &self) override; void initialize(Application &self) override;

View File

@@ -17,7 +17,7 @@
#include "Utils.h" #include "Utils.h"
namespace uCentral { namespace OpenWifi {
class OUIServer * OUIServer::instance_; class OUIServer * OUIServer::instance_;
int OUIServer::Start() { int OUIServer::Start() {

View File

@@ -7,7 +7,7 @@
#include "SubSystemServer.h" #include "SubSystemServer.h"
namespace uCentral { namespace OpenWifi {
class OUIServer : public SubSystemServer { class OUIServer : public SubSystemServer {
public: public:

View File

@@ -17,7 +17,7 @@
#include "Utils.h" #include "Utils.h"
#include "Daemon.h" #include "Daemon.h"
namespace uCentral { namespace OpenWifi {
OpenAPIRequestGet::OpenAPIRequestGet( const std::string & ServiceType, OpenAPIRequestGet::OpenAPIRequestGet( const std::string & ServiceType,
const std::string & EndPoint, const std::string & EndPoint,
@@ -32,7 +32,7 @@ namespace uCentral {
int OpenAPIRequestGet::Do(Poco::JSON::Object::Ptr &ResponseObject) { int OpenAPIRequestGet::Do(Poco::JSON::Object::Ptr &ResponseObject) {
try { try {
auto Services = Daemon()->GetServices(Type_); auto Services = Daemon()->GetServices(Type_);
for(auto const &Svc:Services) { for(auto const &Svc:Services) {
Poco::URI URI(Svc.PrivateEndPoint); Poco::URI URI(Svc.PrivateEndPoint);
Poco::Net::HTTPSClientSession Session(URI.getHost(), URI.getPort()); Poco::Net::HTTPSClientSession Session(URI.getHost(), URI.getPort());
@@ -42,7 +42,7 @@ namespace uCentral {
URI.addQueryParameter(qp.first, qp.second); URI.addQueryParameter(qp.first, qp.second);
std::string Path(URI.getPathAndQuery()); std::string Path(URI.getPathAndQuery());
Session.setTimeout(Poco::Timespan(5, 0)); Session.setTimeout(Poco::Timespan(msTimeout_/1000, msTimeout_ % 1000));
Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_GET,
Path, Path,

View File

@@ -7,9 +7,9 @@
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "uCentralTypes.h" #include "OpenWifiTypes.h"
namespace uCentral { namespace OpenWifi {
class OpenAPIRequestGet { class OpenAPIRequestGet {
public: public:

68
src/OpenWifiTypes.h Normal file
View File

@@ -0,0 +1,68 @@
//
// Created by stephane bourque on 2021-06-13.
//
#ifndef UCENTRALGW_UCENTRALTYPES_H
#define UCENTRALGW_UCENTRALTYPES_H
#include "SubSystemServer.h"
#include <vector>
#include <string>
#include <map>
#include <functional>
#include <list>
#include <utility>
#include <queue>
#include "Poco/StringTokenizer.h"
namespace OpenWifi::Types {
typedef std::pair<std::string,std::string> StringPair;
typedef std::vector<StringPair> StringPairVec;
typedef std::queue<StringPair> StringPairQueue;
typedef std::vector<std::string> StringVec;
typedef std::set<std::string> StringSet;
typedef std::vector<SubSystemServer*> SubSystemVec;
typedef std::map<std::string,std::set<std::string>> StringMapStringSet;
typedef std::function<void(std::string, std::string)> TopicNotifyFunction;
typedef std::list<std::pair<TopicNotifyFunction,int>> TopicNotifyFunctionList;
typedef std::map<std::string, TopicNotifyFunctionList> NotifyTable;
typedef std::map<std::string,uint64_t> CountedMap;
typedef std::string UUID_t;
typedef std::vector<UUID_t> UUIDvec_t;
inline void UpdateCountedMap(CountedMap &M, const std::string &S, uint64_t Increment=1) {
auto it = M.find(S);
if(it==M.end())
M[S] = Increment;
else
it->second += Increment;
}
inline std::string to_string( const StringVec &V) {
std::string Result;
bool first=true;
for(const auto &i:V) {
if(first) {
Result += i;
first = false;
} else {
Result += ",";
Result += i;
}
}
return Result;
}
inline void from_string(const std::string &S, StringVec &V) {
Poco::StringTokenizer Tokens(S,",",Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY);
for(auto const &i:Tokens)
V.emplace_back(i);
}
};
#endif // UCENTRALGW_UCENTRALTYPES_H

View File

@@ -14,7 +14,7 @@
#include "RESTAPI_protocol.h" #include "RESTAPI_protocol.h"
#include "StorageService.h" #include "StorageService.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_BlackList::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_BlackList::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
@@ -44,7 +44,7 @@ namespace uCentral {
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
try { try {
auto SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); auto SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if (!SerialNumber.empty()) { if (!SerialNumber.empty()) {
if (Storage()->DeleteBlackListDevice(SerialNumber)) { if (Storage()->DeleteBlackListDevice(SerialNumber)) {
@@ -63,7 +63,10 @@ namespace uCentral {
void RESTAPI_BlackList::DoGet(Poco::Net::HTTPServerRequest &Request, void RESTAPI_BlackList::DoGet(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
try { try {
InitQueryBlock(); if(!InitQueryBlock()) {
BadRequest(Request, Response, "Illegal parameter value.");
return;
}
std::vector<GWObjects::BlackListedDevice> Devices; std::vector<GWObjects::BlackListedDevice> Devices;
Poco::JSON::Array Objects; Poco::JSON::Array Objects;
@@ -75,7 +78,7 @@ namespace uCentral {
} }
} }
Poco::JSON::Object RetObj; Poco::JSON::Object RetObj;
RetObj.set(uCentral::RESTAPI::Protocol::DEVICES, Objects); RetObj.set(RESTAPI::Protocol::DEVICES, Objects);
ReturnObject(Request, RetObj, Response); ReturnObject(Request, RetObj, Response);
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
@@ -91,18 +94,18 @@ namespace uCentral {
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::DEVICES) && if (Obj->has(RESTAPI::Protocol::DEVICES) &&
Obj->isArray(uCentral::RESTAPI::Protocol::DEVICES)) { Obj->isArray(RESTAPI::Protocol::DEVICES)) {
std::vector<GWObjects::BlackListedDevice> Devices; std::vector<GWObjects::BlackListedDevice> Devices;
auto DeviceArray = Obj->getArray(uCentral::RESTAPI::Protocol::DEVICES); auto DeviceArray = Obj->getArray(RESTAPI::Protocol::DEVICES);
for (const auto &i : *DeviceArray) { for (const auto &i : *DeviceArray) {
Poco::JSON::Parser pp; Poco::JSON::Parser pp;
auto InnerObj = pp.parse(i).extract<Poco::JSON::Object::Ptr>(); auto InnerObj = pp.parse(i).extract<Poco::JSON::Object::Ptr>();
Poco::DynamicStruct Vars = *InnerObj; Poco::DynamicStruct Vars = *InnerObj;
if (Vars.contains(uCentral::RESTAPI::Protocol::SERIALNUMBER) && if (Vars.contains(RESTAPI::Protocol::SERIALNUMBER) &&
Vars.contains(uCentral::RESTAPI::Protocol::REASON)) { Vars.contains(RESTAPI::Protocol::REASON)) {
auto SerialNumber = Vars[uCentral::RESTAPI::Protocol::SERIALNUMBER].toString(); auto SerialNumber = Vars[RESTAPI::Protocol::SERIALNUMBER].toString();
auto Reason = Vars[uCentral::RESTAPI::Protocol::REASON].toString(); auto Reason = Vars[RESTAPI::Protocol::REASON].toString();
GWObjects::BlackListedDevice D{.SerialNumber = SerialNumber, GWObjects::BlackListedDevice D{.SerialNumber = SerialNumber,
.Reason = Reason, .Reason = Reason,
.Author = UserInfo_.webtoken.username_, .Author = UserInfo_.webtoken.username_,

View File

@@ -11,15 +11,16 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_BlackList : public RESTAPIHandler { class RESTAPI_BlackList : public RESTAPIHandler {
public: public:
RESTAPI_BlackList(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_BlackList(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_POST, Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_DELETE, Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {} Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;

View File

@@ -19,16 +19,16 @@
#include "RESTAPI_utils.h" #include "RESTAPI_utils.h"
#include "Utils.h" #include "Utils.h"
using uCentral::RESTAPI_utils::field_to_json; using OpenWifi::RESTAPI_utils::field_to_json;
using uCentral::RESTAPI_utils::field_from_json; using OpenWifi::RESTAPI_utils::field_from_json;
using uCentral::RESTAPI_utils::EmbedDocument; using OpenWifi::RESTAPI_utils::EmbedDocument;
namespace uCentral::GWObjects { 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", uCentral::Daemon::instance()->IdentifyDevice(Compatible)); field_to_json(Obj,"deviceType", Daemon::instance()->IdentifyDevice(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);
@@ -57,13 +57,15 @@ namespace uCentral::GWObjects {
if (DeviceRegistry()->GetState(SerialNumber, ConState)) { if (DeviceRegistry()->GetState(SerialNumber, ConState)) {
ConState.to_json(Obj); ConState.to_json(Obj);
} else { } else {
field_to_json(Obj,"ipAddress", "N/A"); field_to_json(Obj,"ipAddress", "");
field_to_json(Obj,"txBytes", (uint64_t) 0); field_to_json(Obj,"txBytes", (uint64_t) 0);
field_to_json(Obj,"rxBytes", (uint64_t )0); field_to_json(Obj,"rxBytes", (uint64_t )0);
field_to_json(Obj,"messageCount", (uint64_t )0); field_to_json(Obj,"messageCount", (uint64_t )0);
field_to_json(Obj,"connected", false); field_to_json(Obj,"connected", false);
field_to_json(Obj,"lastContact", "N/A"); field_to_json(Obj,"lastContact", "");
field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE"); field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE");
field_to_json(Obj,"associations_2G", (uint64_t) 0);
field_to_json(Obj,"associations_5G", (uint64_t) 0);
} }
#endif #endif
} }
@@ -176,6 +178,9 @@ namespace uCentral::GWObjects {
field_to_json(Obj,"connected", Connected); field_to_json(Obj,"connected", Connected);
field_to_json(Obj,"firmware", Firmware); field_to_json(Obj,"firmware", Firmware);
field_to_json(Obj,"lastContact", LastContact); field_to_json(Obj,"lastContact", LastContact);
field_to_json(Obj,"associations_2G", Associations_2G);
field_to_json(Obj,"associations_5G", Associations_5G);
switch(VerifiedCertificate) { switch(VerifiedCertificate) {
case NO_CERTIFICATE: case NO_CERTIFICATE:
field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE"); break; field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE"); break;
@@ -203,5 +208,40 @@ namespace uCentral::GWObjects {
field_to_json(Obj,"password",DevicePassword); field_to_json(Obj,"password",DevicePassword);
} }
void Dashboard::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"commands",commands);
field_to_json(Obj,"upTimes",upTimes);
field_to_json(Obj,"memoryUsed",memoryUsed);
field_to_json(Obj,"load1",load1);
field_to_json(Obj,"load5",load5);
field_to_json(Obj,"load15",load15);
field_to_json(Obj,"vendors",vendors);
field_to_json(Obj,"status",status);
field_to_json(Obj,"deviceType",deviceType);
field_to_json(Obj,"healths",healths);
field_to_json(Obj,"certificates",certificates);
field_to_json(Obj,"lastContact",lastContact);
field_to_json(Obj,"associations",associations);
field_to_json(Obj,"snapshot",snapshot);
field_to_json(Obj,"numberOfDevices",numberOfDevices);
}
void Dashboard::reset() {
commands.clear();
upTimes.clear();
memoryUsed.clear();
load1.clear();
load5.clear();
load15.clear();
vendors.clear();
status.clear();
deviceType.clear();
healths.clear();
certificates.clear();
lastContact.clear();
associations.clear();
numberOfDevices = 0 ;
snapshot = std::time(nullptr);
}
} }

View File

@@ -12,7 +12,7 @@
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "RESTAPI_SecurityObjects.h" #include "RESTAPI_SecurityObjects.h"
namespace uCentral::GWObjects { namespace OpenWifi::GWObjects {
enum CertificateValidation { enum CertificateValidation {
NO_CERTIFICATE, NO_CERTIFICATE,
@@ -24,14 +24,17 @@ namespace uCentral::GWObjects {
struct ConnectionState { struct ConnectionState {
uint64_t MessageCount = 0 ; uint64_t MessageCount = 0 ;
std::string SerialNumber; std::string SerialNumber;
std::string Address = "N/A"; std::string Address;
uint64_t UUID = 0 ; uint64_t UUID = 0 ;
uint64_t PendingUUID = 0 ; uint64_t PendingUUID = 0 ;
uint64_t TX = 0, RX = 0; uint64_t TX = 0, RX = 0;
uint64_t Associations_2G=0;
uint64_t Associations_5G=0;
bool Connected = false; bool Connected = false;
uint64_t LastContact=0; uint64_t LastContact=0;
std::string Firmware; std::string Firmware;
CertificateValidation VerifiedCertificate = NO_CERTIFICATE; CertificateValidation VerifiedCertificate = NO_CERTIFICATE;
std::string Compatible;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
}; };
@@ -156,6 +159,26 @@ namespace uCentral::GWObjects {
std::string DevicePassword; std::string DevicePassword;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
}; };
struct Dashboard {
uint64_t snapshot;
uint64_t numberOfDevices;
Types::CountedMap commands;
Types::CountedMap upTimes;
Types::CountedMap memoryUsed;
Types::CountedMap load1;
Types::CountedMap load5;
Types::CountedMap load15;
Types::CountedMap vendors;
Types::CountedMap status;
Types::CountedMap deviceType;
Types::CountedMap healths;
Types::CountedMap certificates;
Types::CountedMap lastContact;
Types::CountedMap associations;
void to_json(Poco::JSON::Object &Obj) const;
void reset();
};
} }
#endif //UCENTRAL_RESTAPI_OBJECTS_H #endif //UCENTRAL_RESTAPI_OBJECTS_H

View File

@@ -7,7 +7,6 @@
#include "Poco/URI.h" #include "Poco/URI.h"
#include "RESTAPI_BlackList.h" #include "RESTAPI_BlackList.h"
#include "RESTAPI_callback.h"
#include "RESTAPI_command.h" #include "RESTAPI_command.h"
#include "RESTAPI_commands.h" #include "RESTAPI_commands.h"
#include "RESTAPI_default_configuration.h" #include "RESTAPI_default_configuration.h"
@@ -16,11 +15,10 @@
#include "RESTAPI_device_handler.h" #include "RESTAPI_device_handler.h"
#include "RESTAPI_devices_handler.h" #include "RESTAPI_devices_handler.h"
#include "RESTAPI_file.h" #include "RESTAPI_file.h"
#include "RESTAPI_system_command.h"
#include "RESTAPI_ouis.h" #include "RESTAPI_ouis.h"
#include "Utils.h" #include "Utils.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_InternalServer *RESTAPI_InternalServer::instance_ = nullptr; class RESTAPI_InternalServer *RESTAPI_InternalServer::instance_ = nullptr;
@@ -61,13 +59,13 @@ namespace uCentral {
Poco::Net::HTTPRequestHandler *InternalRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) { Poco::Net::HTTPRequestHandler *InternalRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
Logger_.debug(Poco::format("REQUEST(%s): %s %s", uCentral::Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI())); Logger_.debug(Poco::format("REQUEST(%s): %s %s", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
Poco::URI uri(Request.getURI()); Poco::URI uri(Request.getURI());
const auto & Path = uri.getPath(); const auto & Path = uri.getPath();
RESTAPIHandler::BindingMap Bindings; RESTAPIHandler::BindingMap Bindings;
return RESTAPI_Router< return RESTAPI_Router_I<
RESTAPI_devices_handler, RESTAPI_devices_handler,
RESTAPI_device_handler, RESTAPI_device_handler,
RESTAPI_device_commandHandler, RESTAPI_device_commandHandler,

View File

@@ -12,7 +12,7 @@
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/NetException.h" #include "Poco/Net/NetException.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_InternalServer : public SubSystemServer { class RESTAPI_InternalServer : public SubSystemServer {

View File

@@ -13,8 +13,9 @@
#include "StorageService.h" #include "StorageService.h"
#include "DeviceRegistry.h" #include "DeviceRegistry.h"
#include "CommandManager.h" #include "CommandManager.h"
#include "uCentralProtocol.h"
namespace uCentral::RESTAPI_RPC { namespace OpenWifi::RESTAPI_RPC {
void SetCommandAsPending(GWObjects::CommandDetails &Cmd, void SetCommandAsPending(GWObjects::CommandDetails &Cmd,
Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response, RESTAPIHandler *Handler) { Poco::Net::HTTPServerResponse &Response, RESTAPIHandler *Handler) {
@@ -70,6 +71,12 @@ namespace uCentral::RESTAPI_RPC {
Cmd.Status = "completed"; Cmd.Status = "completed";
Cmd.Completed = time(nullptr); Cmd.Completed = time(nullptr);
if(Cmd.ErrorCode && Cmd.Command==uCentralProtocol::TRACE) {
Cmd.WaitingForFile = 0;
Cmd.AttachDate = Cmd.AttachSize = 0 ;
Cmd.AttachType = "";
}
// Add the completed command to the database... // Add the completed command to the database...
Storage()->AddCommand(Cmd.SerialNumber, Cmd,Storage::COMMAND_COMPLETED); Storage()->AddCommand(Cmd.SerialNumber, Cmd,Storage::COMMAND_COMPLETED);

View File

@@ -18,7 +18,7 @@
#include "RESTAPI_GWobjects.h" #include "RESTAPI_GWobjects.h"
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral::RESTAPI_RPC { namespace OpenWifi::RESTAPI_RPC {
bool WaitForRPC(GWObjects::CommandDetails &Cmd, bool WaitForRPC(GWObjects::CommandDetails &Cmd,
Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerRequest &Request,

View File

@@ -12,10 +12,10 @@
#include "RESTAPI_SecurityObjects.h" #include "RESTAPI_SecurityObjects.h"
#include "RESTAPI_utils.h" #include "RESTAPI_utils.h"
using uCentral::RESTAPI_utils::field_to_json; using OpenWifi::RESTAPI_utils::field_to_json;
using uCentral::RESTAPI_utils::field_from_json; using OpenWifi::RESTAPI_utils::field_from_json;
namespace uCentral::SecurityObjects { namespace OpenWifi::SecurityObjects {
void AclTemplate::to_json(Poco::JSON::Object &Obj) const { void AclTemplate::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"Read",Read_); field_to_json(Obj,"Read",Read_);
@@ -26,12 +26,12 @@ namespace uCentral::SecurityObjects {
} }
ResourceAccessType ResourceAccessTypeFromString(const std::string &s) { ResourceAccessType ResourceAccessTypeFromString(const std::string &s) {
if(s=="READ") return READ; if(!Poco::icompare(s,"READ")) return READ;
if(s=="MODIFY") return MODIFY; if(!Poco::icompare(s,"MODIFY")) return MODIFY;
if(s=="DELETE") return DELETE; if(!Poco::icompare(s,"DELETE")) return DELETE;
if(s=="CREATE") return CREATE; if(!Poco::icompare(s,"CREATE")) return CREATE;
if(s=="TEST") return TEST; if(!Poco::icompare(s,"TEST")) return TEST;
if(s=="MOVE") return MOVE; if(!Poco::icompare(s,"MOVE")) return MOVE;
return NONE; return NONE;
} }
@@ -48,17 +48,17 @@ namespace uCentral::SecurityObjects {
} }
USER_ROLE UserTypeFromString(const std::string &U) { USER_ROLE UserTypeFromString(const std::string &U) {
if (U=="root") if (!Poco::icompare(U,"root"))
return ROOT; return ROOT;
else if (U=="admin") else if (!Poco::icompare(U,"admin"))
return ADMIN; return ADMIN;
else if (U=="subscriber") else if (!Poco::icompare(U,"subscriber"))
return SUBSCRIBER; return SUBSCRIBER;
else if (U=="csr") else if (!Poco::icompare(U,"csr"))
return CSR; return CSR;
else if (U=="system") else if (!Poco::icompare(U, "system"))
return SYSTEM; return SYSTEM;
else if (U=="special") else if (!Poco::icompare(U, "special"))
return SPECIAL; return SPECIAL;
return UNKNOWN; return UNKNOWN;
} }
@@ -71,6 +71,7 @@ namespace uCentral::SecurityObjects {
case CSR: return "csr"; case CSR: return "csr";
case SYSTEM: return "system"; case SYSTEM: return "system";
case SPECIAL: return "special"; case SPECIAL: return "special";
case ADMIN: return "admin";
default: return "unknown"; default: return "unknown";
} }
} }
@@ -302,6 +303,20 @@ namespace uCentral::SecurityObjects {
return false; return false;
} }
bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes) {
try {
SecurityObjects::NoteInfoVec NIV;
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString());
for(auto const &i:NIV) {
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note};
Notes.push_back(ii);
}
} catch(...) {
}
return false;
}
void ProfileAction::to_json(Poco::JSON::Object &Obj) const { void ProfileAction::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"resource", resource); field_to_json(Obj,"resource", resource);
field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString); field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString);

View File

@@ -10,9 +10,9 @@
#define UCENTRAL_RESTAPI_SECURITYOBJECTS_H #define UCENTRAL_RESTAPI_SECURITYOBJECTS_H
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "uCentralTypes.h" #include "OpenWifiTypes.h"
namespace uCentral::SecurityObjects { namespace OpenWifi::SecurityObjects {
struct AclTemplate { struct AclTemplate {
bool Read_ = true; bool Read_ = true;
@@ -41,16 +41,6 @@ namespace uCentral::SecurityObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(const Poco::JSON::Object::Ptr &Obj);
}; };
enum AUTH_ERROR {
SUCCESS,
PASSWORD_CHANGE_REQUIRED,
PASSWORD_DOES_NOT_MATCH,
PASSWORD_ALREADY_USED,
USERNAME_PENDING_VERIFICATION,
PASSWORD_INVALID,
INTERNAL_ERROR
};
enum USER_ROLE { enum USER_ROLE {
UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, SPECIAL UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, SPECIAL
}; };
@@ -104,6 +94,8 @@ namespace uCentral::SecurityObjects {
}; };
typedef std::vector<UserInfo> UserInfoVec; typedef std::vector<UserInfo> UserInfoVec;
bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
struct InternalServiceInfo { struct InternalServiceInfo {
std::string privateURI; std::string privateURI;
std::string publicURI; std::string publicURI;
@@ -124,9 +116,9 @@ namespace uCentral::SecurityObjects {
struct SystemEndpoint { struct SystemEndpoint {
std::string type; std::string type;
uint64_t id = 0; uint64_t id = 0;
std::string vendor; std::string vendor{"OpenWiFi"};
std::string uri; std::string uri;
std::string authenticationType; std::string authenticationType{"internal_v1"};
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);
}; };

View File

@@ -1,66 +0,0 @@
//
// License type: BSD 3-Clause License
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
//
// Created by Stephane Bourque on 2021-03-04.
// Arilia Wireless Inc.
//
#include "RESTAPI_callback.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Parser.h"
#include "RESTAPI_protocol.h"
#include "StorageService.h"
namespace uCentral {
void RESTAPI_callback::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response))
return;
if (!ValidateAPIKey(Request, Response))
return;
ParseParameters(Request);
try {
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST)
DoPost(Request, Response);
return;
} catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
}
BadRequest(Request, Response);
}
void RESTAPI_callback::DoPost(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) {
try {
Poco::JSON::Parser parser;
Poco::JSON::Object::Ptr Obj =
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
Poco::DynamicStruct ds = *Obj;
auto Topic = GetParameter(uCentral::RESTAPI::Protocol::TOPIC, "");
if (Topic == "ucentralfws") {
if (ds.contains(uCentral::RESTAPI::Protocol::FIRMWARES) &&
ds[uCentral::RESTAPI::Protocol::FIRMWARES].isArray()) {
std::cout << "Proper manifest received..." << std::endl;
Logger_.information("New manifest...");
OK(Request, Response);
return;
} else {
std::cout << __LINE__ << std::endl;
Logger_.information("Bad manifest. JSON does not contain firmwares");
}
} else {
Logger_.information("Missing topic in callback.");
}
} catch (const Poco::Exception &E) {
Logger_.log(E);
}
BadRequest(Request, Response);
}
}

View File

@@ -1,28 +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.
//
#ifndef UCENTRALGW_RESTAPI_CALLBACK_H
#define UCENTRALGW_RESTAPI_CALLBACK_H
#include "RESTAPI_handler.h"
namespace uCentral {
class RESTAPI_callback : public RESTAPIHandler {
public:
RESTAPI_callback(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
: RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override;
void DoPost(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response);
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/callbackChannel"};}
};
}
#endif // UCENTRALGW_RESTAPI_CALLBACK_H

View File

@@ -11,7 +11,7 @@
#include "RESTAPI_protocol.h" #include "RESTAPI_protocol.h"
#include "StorageService.h" #include "StorageService.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_command::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_command::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response)) if (!ContinueProcessing(Request, Response))
@@ -24,7 +24,7 @@ void RESTAPI_command::handleRequest(Poco::Net::HTTPServerRequest &Request,
ParseParameters(Request); ParseParameters(Request);
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
auto CommandUUID = GetBinding(uCentral::RESTAPI::Protocol::COMMANDUUID, ""); auto CommandUUID = GetBinding(RESTAPI::Protocol::COMMANDUUID, "");
GWObjects::CommandDetails Command; GWObjects::CommandDetails Command;
if (Storage()->GetCommand(CommandUUID, Command)) { if (Storage()->GetCommand(CommandUUID, Command)) {
Poco::JSON::Object RetObj; Poco::JSON::Object RetObj;
@@ -33,7 +33,7 @@ void RESTAPI_command::handleRequest(Poco::Net::HTTPServerRequest &Request,
} else } else
NotFound(Request, Response); NotFound(Request, Response);
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) { } else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) {
auto CommandUUID = GetBinding(uCentral::RESTAPI::Protocol::COMMANDUUID, ""); auto CommandUUID = GetBinding(RESTAPI::Protocol::COMMANDUUID, "");
if (Storage()->DeleteCommand(CommandUUID)) { if (Storage()->DeleteCommand(CommandUUID)) {
OK(Request, Response); OK(Request, Response);
} else { } else {

View File

@@ -11,14 +11,15 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_command : public RESTAPIHandler { class RESTAPI_command : public RESTAPIHandler {
public: public:
RESTAPI_command(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_command(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_DELETE, Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {} Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/command/{commandUUID}"};} static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/command/{commandUUID}"};}

View File

@@ -11,7 +11,7 @@
#include "StorageService.h" #include "StorageService.h"
#include "Utils.h" #include "Utils.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_commands::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_commands::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response)) if (!ContinueProcessing(Request, Response))
@@ -22,9 +22,12 @@ void RESTAPI_commands::handleRequest(Poco::Net::HTTPServerRequest &Request,
try { try {
ParseParameters(Request); ParseParameters(Request);
InitQueryBlock(); if(!InitQueryBlock()) {
BadRequest(Request, Response, "Illegal parameter value.");
return;
}
auto SerialNumber = GetParameter(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); auto SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
std::vector<GWObjects::CommandDetails> Commands; std::vector<GWObjects::CommandDetails> Commands;
@@ -41,7 +44,7 @@ void RESTAPI_commands::handleRequest(Poco::Net::HTTPServerRequest &Request,
ArrayObj.add(Obj); ArrayObj.add(Obj);
} }
Poco::JSON::Object RetObj; Poco::JSON::Object RetObj;
RetObj.set(uCentral::RESTAPI::Protocol::COMMANDS, ArrayObj); RetObj.set(RESTAPI::Protocol::COMMANDS, ArrayObj);
ReturnObject(Request, RetObj, Response); ReturnObject(Request, RetObj, Response);
return; return;

View File

@@ -11,14 +11,15 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_commands : public RESTAPIHandler { class RESTAPI_commands : public RESTAPIHandler {
public: public:
RESTAPI_commands(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_commands(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_DELETE, Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {} Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/commands"};} static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/commands"};}

View File

@@ -14,7 +14,7 @@
#include "RESTAPI_protocol.h" #include "RESTAPI_protocol.h"
#include "StorageService.h" #include "StorageService.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_default_configuration::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_default_configuration::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response)) if (!ContinueProcessing(Request, Response))
@@ -23,7 +23,7 @@ void RESTAPI_default_configuration::handleRequest(Poco::Net::HTTPServerRequest &
if (!IsAuthorized(Request, Response)) if (!IsAuthorized(Request, Response))
return; return;
std::string Name = GetBinding(uCentral::RESTAPI::Protocol::NAME, ""); std::string Name = GetBinding(RESTAPI::Protocol::NAME, "");
ParseParameters(Request); ParseParameters(Request);
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {

View File

@@ -11,15 +11,16 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_default_configuration : public RESTAPIHandler { class RESTAPI_default_configuration : public RESTAPIHandler {
public: public:
RESTAPI_default_configuration(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_default_configuration(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{ std::vector<std::string>{
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST, Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE, Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {} Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/default_configuration/{name}"};} static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/default_configuration/{name}"};}

View File

@@ -13,45 +13,49 @@
#include "RESTAPI_protocol.h" #include "RESTAPI_protocol.h"
#include "StorageService.h" #include "StorageService.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_default_configurations::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_default_configurations::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response)) if (!ContinueProcessing(Request, Response))
return; return;
if (!IsAuthorized(Request, Response)) if (!IsAuthorized(Request, Response))
return; return;
try { try {
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
ParseParameters(Request); ParseParameters(Request);
InitQueryBlock(); if(!InitQueryBlock()) {
BadRequest(Request, Response, "Illegal parameter value.");
return;
}
Logger_.information( Logger_.information(
Poco::format("DEFAULT_CONFIGURATIONS: from %Lu, limit of %Lu, filter=%s.", Poco::format("DEFAULT_CONFIGURATIONS: from %Lu, limit of %Lu, filter=%s.",
(int64_t)QB_.Offset, (int64_t)QB_.Limit, QB_.Filter)); (int64_t)QB_.Offset, (int64_t)QB_.Limit, QB_.Filter));
RESTAPIHandler::PrintBindings(); RESTAPIHandler::PrintBindings();
std::vector<GWObjects::DefaultConfiguration> DefConfigs; std::vector<GWObjects::DefaultConfiguration> DefConfigs;
Storage()->GetDefaultConfigurations(QB_.Offset, QB_.Limit, DefConfigs); Storage()->GetDefaultConfigurations(QB_.Offset, QB_.Limit, DefConfigs);
Poco::JSON::Array Objects; Poco::JSON::Array Objects;
for (const auto &i : DefConfigs) { for (const auto &i : DefConfigs) {
Poco::JSON::Object Obj; Poco::JSON::Object Obj;
i.to_json(Obj); i.to_json(Obj);
Objects.add(Obj); Objects.add(Obj);
} }
Poco::JSON::Object RetObj; Poco::JSON::Object RetObj;
RetObj.set(uCentral::RESTAPI::Protocol::CONFIGURATIONS, Objects); RetObj.set(RESTAPI::Protocol::CONFIGURATIONS, Objects);
ReturnObject(Request, RetObj, Response); ReturnObject(Request, RetObj, Response);
} else } else
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.warning( Logger_.warning(
Poco::format("%s: Failed with: %s", std::string(__func__), E.displayText())); Poco::format("%s: Failed with: %s", std::string(__func__), E.displayText()));
}
BadRequest(Request, Response);
} }
} }
}

View File

@@ -11,13 +11,14 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_default_configurations : public RESTAPIHandler { class RESTAPI_default_configurations : public RESTAPIHandler {
public: public:
RESTAPI_default_configurations(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_default_configurations(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_OPTIONS}){}; Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal){};
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/default_configurations"};} static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/default_configurations"};}

View File

@@ -0,0 +1,32 @@
//
// Created by stephane bourque on 2021-07-21.
//
#include "RESTAPI_deviceDashboardHandler.h"
#include "Daemon.h"
#include "Dashboard.h"
namespace OpenWifi {
void RESTAPI_deviceDashboardHandler::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response))
return;
if (!IsAuthorized(Request, Response))
return;
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
DoGet(Request, Response);
} else {
BadRequest(Request, Response, "Unsupported method.");
}
}
void RESTAPI_deviceDashboardHandler::DoGet(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) {
Daemon()->GetDashboard().Create();
Poco::JSON::Object Answer;
Daemon()->GetDashboard().Report().to_json(Answer);
ReturnObject(Request, Answer, Response);
}
}

View File

@@ -0,0 +1,26 @@
//
// Created by stephane bourque on 2021-07-21.
//
#ifndef UCENTRALGW_RESTAPI_DEVICEDASHBOARDHANDLER_H
#define UCENTRALGW_RESTAPI_DEVICEDASHBOARDHANDLER_H
#include "RESTAPI_handler.h"
namespace OpenWifi {
class RESTAPI_deviceDashboardHandler : public RESTAPIHandler {
public:
RESTAPI_deviceDashboardHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L,
std::vector<std::string>{
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_OPTIONS}, Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/deviceDashboard"};}
void DoGet(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response);
};
}
#endif // UCENTRALGW_RESTAPI_DEVICEDASHBOARDHANDLER_H

View File

@@ -29,7 +29,7 @@
#include "KafkaManager.h" #include "KafkaManager.h"
#include "Kafka_topics.h" #include "Kafka_topics.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
@@ -40,14 +40,14 @@ void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &
if (!IsAuthorized(Request, Response)) if (!IsAuthorized(Request, Response))
return; return;
std::string Command = GetBinding(uCentral::RESTAPI::Protocol::COMMAND, ""); std::string Command = GetBinding(RESTAPI::Protocol::COMMAND, "");
if (Command.empty()) { if (Command.empty()) {
Logger_.error(Poco::format("Unrecognized command '%s'", Command)); Logger_.error(Poco::format("Unrecognized command '%s'", Command));
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
SerialNumber_ = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); SerialNumber_ = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if (SerialNumber_.empty()) { if (SerialNumber_.empty()) {
Logger_.error(Poco::format("Missing serial number for command '%s'", Command)); Logger_.error(Poco::format("Missing serial number for command '%s'", Command));
BadRequest(Request, Response); BadRequest(Request, Response);
@@ -55,66 +55,69 @@ void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &
} }
ParseParameters(Request); ParseParameters(Request);
InitQueryBlock(); if(!InitQueryBlock()) {
BadRequest(Request, Response, "Illegal parameter value.");
return;
}
if (Command == uCentral::RESTAPI::Protocol::CAPABILITIES && if (Command == RESTAPI::Protocol::CAPABILITIES &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
GetCapabilities(Request, Response); GetCapabilities(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::CAPABILITIES && } else if (Command == RESTAPI::Protocol::CAPABILITIES &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) {
DeleteCapabilities(Request, Response); DeleteCapabilities(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::LOGS && } else if (Command == RESTAPI::Protocol::LOGS &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
GetLogs(Request, Response); GetLogs(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::LOGS && } else if (Command == RESTAPI::Protocol::LOGS &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) {
DeleteLogs(Request, Response); DeleteLogs(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::HEALTHCHECKS && } else if (Command == RESTAPI::Protocol::HEALTHCHECKS &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
GetChecks(Request, Response); GetChecks(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::HEALTHCHECKS && } else if (Command == RESTAPI::Protocol::HEALTHCHECKS &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) {
DeleteChecks(Request, Response); DeleteChecks(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::STATISTICS && } else if (Command == RESTAPI::Protocol::STATISTICS &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
GetStatistics(Request, Response); GetStatistics(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::STATISTICS && } else if (Command == RESTAPI::Protocol::STATISTICS &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) {
DeleteStatistics(Request, Response); DeleteStatistics(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::STATUS && } else if (Command == RESTAPI::Protocol::STATUS &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
GetStatus(Request, Response); GetStatus(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::PERFORM && } else if (Command == RESTAPI::Protocol::PERFORM &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
ExecuteCommand(Request, Response); ExecuteCommand(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::CONFIGURE && } else if (Command == RESTAPI::Protocol::CONFIGURE &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
Configure(Request, Response); Configure(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::UPGRADE && } else if (Command == RESTAPI::Protocol::UPGRADE &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
Upgrade(Request, Response); Upgrade(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::REBOOT && } else if (Command == RESTAPI::Protocol::REBOOT &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
Reboot(Request, Response); Reboot(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::FACTORY && } else if (Command == RESTAPI::Protocol::FACTORY &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
Factory(Request, Response); Factory(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::LEDS && } else if (Command == RESTAPI::Protocol::LEDS &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
LEDs(Request, Response); LEDs(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::TRACE && } else if (Command == RESTAPI::Protocol::TRACE &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
Trace(Request, Response); Trace(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::REQUEST && } else if (Command == RESTAPI::Protocol::REQUEST &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
MakeRequest(Request, Response); MakeRequest(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::WIFISCAN && } else if (Command == RESTAPI::Protocol::WIFISCAN &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
WifiScan(Request, Response); WifiScan(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::EVENTQUEUE && } else if (Command == RESTAPI::Protocol::EVENTQUEUE &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
EventQueue(Request, Response); EventQueue(Request, Response);
} else if (Command == uCentral::RESTAPI::Protocol::RTTY && } else if (Command == RESTAPI::Protocol::RTTY &&
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) { Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
Rtty(Request, Response); Rtty(Request, Response);
} else { } else {
@@ -122,7 +125,7 @@ void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &
} }
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -134,14 +137,14 @@ void RESTAPI_device_commandHandler::GetCapabilities(Poco::Net::HTTPServerRequest
if (Storage()->GetDeviceCapabilities(SerialNumber_, Caps)) { if (Storage()->GetDeviceCapabilities(SerialNumber_, Caps)) {
Poco::JSON::Object RetObj; Poco::JSON::Object RetObj;
Caps.to_json(RetObj); Caps.to_json(RetObj);
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBER, SerialNumber_); RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
ReturnObject(Request, RetObj, Response); ReturnObject(Request, RetObj, Response);
} else { } else {
NotFound(Request, Response); NotFound(Request, Response);
} }
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -155,7 +158,7 @@ void RESTAPI_device_commandHandler::DeleteCapabilities(Poco::Net::HTTPServerRequ
NotFound(Request, Response); NotFound(Request, Response);
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -168,7 +171,7 @@ void RESTAPI_device_commandHandler::GetStatistics(Poco::Net::HTTPServerRequest &
Storage()->GetLifetimeStats(SerialNumber_, Stats); Storage()->GetLifetimeStats(SerialNumber_, Stats);
Poco::JSON::Parser P; Poco::JSON::Parser P;
if (Stats.empty()) if (Stats.empty())
Stats = uCentral::uCentralProtocol::EMPTY_JSON_DOC; Stats = uCentralProtocol::EMPTY_JSON_DOC;
auto Obj = P.parse(Stats).extract<Poco::JSON::Object::Ptr>(); auto Obj = P.parse(Stats).extract<Poco::JSON::Object::Ptr>();
ReturnObject(Request, *Obj, Response); ReturnObject(Request, *Obj, Response);
} else if (QB_.LastOnly) { } else if (QB_.LastOnly) {
@@ -176,7 +179,7 @@ void RESTAPI_device_commandHandler::GetStatistics(Poco::Net::HTTPServerRequest &
if (DeviceRegistry()->GetStatistics(SerialNumber_, Stats)) { if (DeviceRegistry()->GetStatistics(SerialNumber_, Stats)) {
Poco::JSON::Parser P; Poco::JSON::Parser P;
if (Stats.empty()) if (Stats.empty())
Stats = uCentral::uCentralProtocol::EMPTY_JSON_DOC; Stats = uCentralProtocol::EMPTY_JSON_DOC;
auto Obj = P.parse(Stats).extract<Poco::JSON::Object::Ptr>(); auto Obj = P.parse(Stats).extract<Poco::JSON::Object::Ptr>();
ReturnObject(Request, *Obj, Response); ReturnObject(Request, *Obj, Response);
} else { } else {
@@ -197,13 +200,13 @@ void RESTAPI_device_commandHandler::GetStatistics(Poco::Net::HTTPServerRequest &
ArrayObj.add(Obj); ArrayObj.add(Obj);
} }
Poco::JSON::Object RetObj; Poco::JSON::Object RetObj;
RetObj.set(uCentral::RESTAPI::Protocol::DATA, ArrayObj); RetObj.set(RESTAPI::Protocol::DATA, ArrayObj);
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBER, SerialNumber_); RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
ReturnObject(Request, RetObj, Response); ReturnObject(Request, RetObj, Response);
} }
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -227,7 +230,7 @@ void RESTAPI_device_commandHandler::DeleteStatistics(Poco::Net::HTTPServerReques
} }
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -246,7 +249,7 @@ void RESTAPI_device_commandHandler::GetStatus(Poco::Net::HTTPServerRequest &Requ
} }
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -258,19 +261,19 @@ void RESTAPI_device_commandHandler::Configure(Poco::Net::HTTPServerRequest &Requ
Poco::JSON::Parser Parser; Poco::JSON::Parser Parser;
auto Obj = Parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); auto Obj = Parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) && if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
Obj->has(uCentral::RESTAPI::Protocol::UUID) && Obj->has(RESTAPI::Protocol::UUID) &&
Obj->has(uCentral::RESTAPI::Protocol::CONFIGURATION)) { Obj->has(RESTAPI::Protocol::CONFIGURATION)) {
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) { if (SerialNumber_ != SNum) {
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
auto UUID = Obj->get(uCentral::RESTAPI::Protocol::UUID); auto UUID = Obj->get(RESTAPI::Protocol::UUID);
auto Configuration = GetS(uCentral::RESTAPI::Protocol::CONFIGURATION, Obj, auto Configuration = GetS(RESTAPI::Protocol::CONFIGURATION, Obj,
uCentral::uCentralProtocol::EMPTY_JSON_DOC); uCentralProtocol::EMPTY_JSON_DOC);
auto When = GetWhen(Obj); auto When = GetWhen(Obj);
uint64_t NewUUID; uint64_t NewUUID;
@@ -283,17 +286,17 @@ void RESTAPI_device_commandHandler::Configure(Poco::Net::HTTPServerRequest &Requ
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = Daemon()->CreateUUID(); Cmd.UUID = Daemon()->CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentral::uCentralProtocol::CONFIGURE; Cmd.Command = uCentralProtocol::CONFIGURE;
Cmd.RunAt = When; Cmd.RunAt = When;
uCentral::Config::Config Cfg(Configuration); Config::Config Cfg(Configuration);
Poco::JSON::Object Params; Poco::JSON::Object Params;
Poco::JSON::Object CfgObj; Poco::JSON::Object CfgObj;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::UUID, NewUUID); Params.set(uCentralProtocol::UUID, NewUUID);
Params.set(uCentral::uCentralProtocol::WHEN, When); Params.set(uCentralProtocol::WHEN, When);
Params.set(uCentral::uCentralProtocol::CONFIG, Cfg.to_json()); Params.set(uCentralProtocol::CONFIG, Cfg.to_json());
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
@@ -305,7 +308,7 @@ void RESTAPI_device_commandHandler::Configure(Poco::Net::HTTPServerRequest &Requ
} }
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -316,16 +319,16 @@ void RESTAPI_device_commandHandler::Upgrade(Poco::Net::HTTPServerRequest &Reques
Poco::JSON::Parser parser; Poco::JSON::Parser parser;
auto Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); auto Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::URI) && if (Obj->has(RESTAPI::Protocol::URI) &&
Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER)) { Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) { if (SerialNumber_ != SNum) {
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
auto URI = GetS(uCentral::RESTAPI::Protocol::URI, Obj); auto URI = GetS(RESTAPI::Protocol::URI, Obj);
auto When = GetWhen(Obj); auto When = GetWhen(Obj);
GWObjects::CommandDetails Cmd; GWObjects::CommandDetails Cmd;
@@ -333,14 +336,14 @@ void RESTAPI_device_commandHandler::Upgrade(Poco::Net::HTTPServerRequest &Reques
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = Daemon()->CreateUUID(); Cmd.UUID = Daemon()->CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentral::uCentralProtocol::UPGRADE; Cmd.Command = uCentralProtocol::UPGRADE;
Cmd.RunAt = When; Cmd.RunAt = When;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::URI, URI); Params.set(uCentralProtocol::URI, URI);
Params.set(uCentral::uCentralProtocol::WHEN, When); Params.set(uCentralProtocol::WHEN, When);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
@@ -350,7 +353,7 @@ void RESTAPI_device_commandHandler::Upgrade(Poco::Net::HTTPServerRequest &Reques
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -374,13 +377,13 @@ void RESTAPI_device_commandHandler::GetLogs(Poco::Net::HTTPServerRequest &Reques
ArrayObj.add(Obj); ArrayObj.add(Obj);
} }
Poco::JSON::Object RetObj; Poco::JSON::Object RetObj;
RetObj.set(uCentral::RESTAPI::Protocol::VALUES, ArrayObj); RetObj.set(RESTAPI::Protocol::VALUES, ArrayObj);
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBER, SerialNumber_); RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
ReturnObject(Request, RetObj, Response); ReturnObject(Request, RetObj, Response);
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -394,7 +397,7 @@ void RESTAPI_device_commandHandler::DeleteLogs(Poco::Net::HTTPServerRequest &Req
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -405,13 +408,11 @@ void RESTAPI_device_commandHandler::GetChecks(Poco::Net::HTTPServerRequest &Requ
std::vector<GWObjects::HealthCheck> Checks; std::vector<GWObjects::HealthCheck> Checks;
if (QB_.LastOnly) { if (QB_.LastOnly) {
std::string Healthcheck; GWObjects::HealthCheck HC;
if (DeviceRegistry()->GetHealthcheck(SerialNumber_, Healthcheck)) { if (DeviceRegistry()->GetHealthcheck(SerialNumber_, HC)) {
Poco::JSON::Parser P; Poco::JSON::Object Answer;
if (Healthcheck.empty()) HC.to_json(Answer);
Healthcheck = uCentral::uCentralProtocol::EMPTY_JSON_DOC; ReturnObject(Request, Answer, Response);
auto Obj = P.parse(Healthcheck).extract<Poco::JSON::Object::Ptr>();
ReturnObject(Request, *Obj, Response);
} else { } else {
NotFound(Request, Response); NotFound(Request, Response);
} }
@@ -431,13 +432,13 @@ void RESTAPI_device_commandHandler::GetChecks(Poco::Net::HTTPServerRequest &Requ
} }
Poco::JSON::Object RetObj; Poco::JSON::Object RetObj;
RetObj.set(uCentral::RESTAPI::Protocol::VALUES, ArrayObj); RetObj.set(RESTAPI::Protocol::VALUES, ArrayObj);
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBER, SerialNumber_); RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
ReturnObject(Request, RetObj, Response); ReturnObject(Request, RetObj, Response);
} }
return; return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -450,7 +451,7 @@ void RESTAPI_device_commandHandler::DeleteChecks(Poco::Net::HTTPServerRequest &R
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -462,18 +463,18 @@ void RESTAPI_device_commandHandler::ExecuteCommand(Poco::Net::HTTPServerRequest
Poco::JSON::Parser parser; Poco::JSON::Parser parser;
auto Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); auto Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::COMMAND) && if (Obj->has(RESTAPI::Protocol::COMMAND) &&
Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) && Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
Obj->has(uCentral::RESTAPI::Protocol::PAYLOAD)) { Obj->has(RESTAPI::Protocol::PAYLOAD)) {
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) { if (SerialNumber_ != SNum) {
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
auto Command = GetS(uCentral::RESTAPI::Protocol::COMMAND, Obj); auto Command = GetS(RESTAPI::Protocol::COMMAND, Obj);
auto Payload = GetS(uCentral::RESTAPI::Protocol::PAYLOAD, Obj); auto Payload = GetS(RESTAPI::Protocol::PAYLOAD, Obj);
auto When = GetWhen(Obj); auto When = GetWhen(Obj);
GWObjects::CommandDetails Cmd; GWObjects::CommandDetails Cmd;
@@ -492,10 +493,10 @@ void RESTAPI_device_commandHandler::ExecuteCommand(Poco::Net::HTTPServerRequest
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::COMMAND, Command); Params.set(uCentralProtocol::COMMAND, Command);
Params.set(uCentral::uCentralProtocol::WHEN, When); Params.set(uCentralProtocol::WHEN, When);
Params.set(uCentral::uCentralProtocol::PAYLOAD, PayloadObject); Params.set(uCentralProtocol::PAYLOAD, PayloadObject);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
@@ -505,7 +506,7 @@ void RESTAPI_device_commandHandler::ExecuteCommand(Poco::Net::HTTPServerRequest
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -517,8 +518,8 @@ void RESTAPI_device_commandHandler::Reboot(Poco::Net::HTTPServerRequest &Request
Poco::JSON::Parser IncomingParser; Poco::JSON::Parser IncomingParser;
auto Obj = IncomingParser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); auto Obj = IncomingParser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER)) { if (Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) { if (SerialNumber_ != SNum) {
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
@@ -529,13 +530,13 @@ void RESTAPI_device_commandHandler::Reboot(Poco::Net::HTTPServerRequest &Request
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = Daemon()->CreateUUID(); Cmd.UUID = Daemon()->CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentral::uCentralProtocol::REBOOT; Cmd.Command = uCentralProtocol::REBOOT;
Cmd.RunAt = When; Cmd.RunAt = When;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::WHEN, When); Params.set(uCentralProtocol::WHEN, When);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
@@ -545,7 +546,7 @@ void RESTAPI_device_commandHandler::Reboot(Poco::Net::HTTPServerRequest &Request
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -558,17 +559,17 @@ void RESTAPI_device_commandHandler::Factory(Poco::Net::HTTPServerRequest &Reques
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::KEEPREDIRECTOR) && if (Obj->has(RESTAPI::Protocol::KEEPREDIRECTOR) &&
Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER)) { Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) { if (SerialNumber_ != SNum) {
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
auto KeepRedirector = GetB(uCentral::RESTAPI::Protocol::KEEPREDIRECTOR, Obj, true); auto KeepRedirector = GetB(RESTAPI::Protocol::KEEPREDIRECTOR, Obj, true);
uint64_t When = GetWhen(Obj); uint64_t When = GetWhen(Obj);
GWObjects::CommandDetails Cmd; GWObjects::CommandDetails Cmd;
@@ -576,14 +577,14 @@ void RESTAPI_device_commandHandler::Factory(Poco::Net::HTTPServerRequest &Reques
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = Daemon()->CreateUUID(); Cmd.UUID = Daemon()->CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentral::uCentralProtocol::FACTORY; Cmd.Command = uCentralProtocol::FACTORY;
Cmd.RunAt = When; Cmd.RunAt = When;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::KEEP_REDIRECTOR, KeepRedirector ? 1 : 0); Params.set(uCentralProtocol::KEEP_REDIRECTOR, KeepRedirector ? 1 : 0);
Params.set(uCentral::uCentralProtocol::WHEN, When); Params.set(uCentralProtocol::WHEN, When);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
@@ -593,7 +594,7 @@ void RESTAPI_device_commandHandler::Factory(Poco::Net::HTTPServerRequest &Reques
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -605,26 +606,26 @@ void RESTAPI_device_commandHandler::LEDs(Poco::Net::HTTPServerRequest &Request,
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::uCentralProtocol::PATTERN) && if (Obj->has(uCentralProtocol::PATTERN) &&
Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER)) { Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) { if (SerialNumber_ != SNum) {
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
auto Pattern = auto Pattern =
GetS(uCentral::uCentralProtocol::PATTERN, Obj, uCentral::uCentralProtocol::BLINK); GetS(uCentralProtocol::PATTERN, Obj, uCentralProtocol::BLINK);
if (Pattern != uCentral::uCentralProtocol::ON && if (Pattern != uCentralProtocol::ON &&
Pattern != uCentral::uCentralProtocol::OFF && Pattern != uCentralProtocol::OFF &&
Pattern != uCentral::uCentralProtocol::BLINK) { Pattern != uCentralProtocol::BLINK) {
Logger_.warning(Poco::format("LEDs(%s): Bad pattern", SerialNumber_)); Logger_.warning(Poco::format("LEDs(%s): Bad pattern", SerialNumber_));
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
auto Duration = Get(uCentral::uCentralProtocol::DURATION, Obj, 30); auto Duration = Get(uCentralProtocol::DURATION, Obj, 30);
auto When = GetWhen(Obj); auto When = GetWhen(Obj);
Logger_.information(Poco::format("LEDS(%s): Pattern:%s Duration: %Lu", SerialNumber_, Logger_.information(Poco::format("LEDS(%s): Pattern:%s Duration: %Lu", SerialNumber_,
Pattern, Duration)); Pattern, Duration));
@@ -634,14 +635,14 @@ void RESTAPI_device_commandHandler::LEDs(Poco::Net::HTTPServerRequest &Request,
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = Daemon()->CreateUUID(); Cmd.UUID = Daemon()->CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentral::uCentralProtocol::LEDS; Cmd.Command = uCentralProtocol::LEDS;
Cmd.RunAt = When; Cmd.RunAt = When;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::DURATION, Duration); Params.set(uCentralProtocol::DURATION, Duration);
Params.set(uCentral::uCentralProtocol::WHEN, When); Params.set(uCentralProtocol::WHEN, When);
Params.set(uCentral::uCentralProtocol::PATTERN, Pattern); Params.set(uCentralProtocol::PATTERN, Pattern);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
@@ -651,7 +652,7 @@ void RESTAPI_device_commandHandler::LEDs(Poco::Net::HTTPServerRequest &Request,
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -663,22 +664,22 @@ void RESTAPI_device_commandHandler::Trace(Poco::Net::HTTPServerRequest &Request,
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) && if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
(Obj->has(uCentral::RESTAPI::Protocol::NETWORK) || (Obj->has(RESTAPI::Protocol::NETWORK) ||
Obj->has(uCentral::RESTAPI::Protocol::INTERFACE))) { Obj->has(RESTAPI::Protocol::INTERFACE))) {
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) { if (SerialNumber_ != SNum) {
BadRequest(Request, Response); BadRequest(Request, Response, "Missing serial number.");
return; return;
} }
auto Duration = Get(uCentral::RESTAPI::Protocol::DURATION, Obj); auto Duration = Get(RESTAPI::Protocol::DURATION, Obj, 30);
auto When = GetWhen(Obj); auto When = GetWhen(Obj);
auto NumberOfPackets = Get(uCentral::RESTAPI::Protocol::NUMBEROFPACKETS, Obj); auto NumberOfPackets = Get(RESTAPI::Protocol::NUMBEROFPACKETS, Obj, 100);
auto Network = GetS(uCentral::RESTAPI::Protocol::NETWORK, Obj); auto Network = GetS(RESTAPI::Protocol::NETWORK, Obj);
auto Interface = GetS(uCentral::RESTAPI::Protocol::INTERFACE, Obj); auto Interface = GetS(RESTAPI::Protocol::INTERFACE, Obj);
auto UUID = Daemon()->CreateUUID(); auto UUID = Daemon()->CreateUUID();
auto URI = FileUploader()->FullName() + UUID; auto URI = FileUploader()->FullName() + UUID;
@@ -686,31 +687,33 @@ void RESTAPI_device_commandHandler::Trace(Poco::Net::HTTPServerRequest &Request,
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = UUID; Cmd.UUID = UUID;
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentral::uCentralProtocol::TRACE; Cmd.Command = uCentralProtocol::TRACE;
Cmd.RunAt = When; Cmd.RunAt = When;
Cmd.WaitingForFile = 1; Cmd.WaitingForFile = 1;
Cmd.AttachType = uCentral::RESTAPI::Protocol::PCAP_FILE_TYPE; Cmd.AttachType = RESTAPI::Protocol::PCAP_FILE_TYPE;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::DURATION, Duration); Params.set(uCentralProtocol::DURATION, Duration);
Params.set(uCentral::uCentralProtocol::WHEN, When); Params.set(uCentralProtocol::WHEN, When);
Params.set(uCentral::uCentralProtocol::PACKETS, NumberOfPackets); Params.set(uCentralProtocol::PACKETS, NumberOfPackets);
Params.set(uCentral::uCentralProtocol::NETWORK, Network); Params.set(uCentralProtocol::NETWORK, Network);
Params.set(uCentral::uCentralProtocol::INTERFACE, Interface); Params.set(uCentralProtocol::INTERFACE, Interface);
Params.set(uCentral::uCentralProtocol::URI, URI); Params.set(uCentralProtocol::URI, URI);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
Cmd.Details = ParamStream.str(); Cmd.Details = ParamStream.str();
FileUploader()->AddUUID(UUID); FileUploader()->AddUUID(UUID);
RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(3000), nullptr, this); RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(5000), nullptr, this);
return; } else {
BadRequest(Request, Response, "Missing SerialNumber, Network, or Interface.");
} }
return;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -723,62 +726,64 @@ void RESTAPI_device_commandHandler::WifiScan(Poco::Net::HTTPServerRequest &Reque
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
if (SerialNumber_ != SNum) { if (SerialNumber_ != SNum) {
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
if ((Obj->has(uCentral::RESTAPI::Protocol::BANDS) && if ((Obj->has(RESTAPI::Protocol::BANDS) &&
Obj->isArray(uCentral::RESTAPI::Protocol::BANDS) || Obj->isArray(RESTAPI::Protocol::BANDS) ||
(Obj->has(uCentral::RESTAPI::Protocol::CHANNELS) && (Obj->has(RESTAPI::Protocol::CHANNELS) &&
Obj->isArray(uCentral::RESTAPI::Protocol::CHANNELS)) || Obj->isArray(RESTAPI::Protocol::CHANNELS)) ||
(!Obj->has(uCentral::RESTAPI::Protocol::BANDS) && (!Obj->has(RESTAPI::Protocol::BANDS) &&
!Obj->has(uCentral::RESTAPI::Protocol::CHANNELS)))) { !Obj->has(RESTAPI::Protocol::CHANNELS)))) {
bool Verbose = GetB(uCentral::RESTAPI::Protocol::VERBOSE, Obj); bool Verbose = GetB(RESTAPI::Protocol::VERBOSE, Obj);
auto UUID = Daemon()->CreateUUID(); auto UUID = Daemon()->CreateUUID();
GWObjects::CommandDetails Cmd; GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = UUID; Cmd.UUID = UUID;
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentral::uCentralProtocol::WIFISCAN; Cmd.Command = uCentralProtocol::WIFISCAN;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::VERBOSE, Verbose); Params.set(uCentralProtocol::VERBOSE, Verbose);
if (Obj->has(uCentral::uCentralProtocol::BANDS)) { if (Obj->has(uCentralProtocol::BANDS)) {
Params.set(uCentral::uCentralProtocol::BANDS, Params.set(uCentralProtocol::BANDS,
Obj->get(uCentral::RESTAPI::Protocol::BANDS)); Obj->get(RESTAPI::Protocol::BANDS));
} else if (Obj->has(uCentral::uCentralProtocol::CHANNELS)) { } else if (Obj->has(uCentralProtocol::CHANNELS)) {
Params.set(uCentral::uCentralProtocol::CHANNELS, Params.set(uCentralProtocol::CHANNELS,
Obj->get(uCentral::RESTAPI::Protocol::CHANNELS)); Obj->get(RESTAPI::Protocol::CHANNELS));
} }
if (Obj->has(uCentral::RESTAPI::Protocol::ACTIVESCAN)) { if (Obj->has(RESTAPI::Protocol::ACTIVESCAN)) {
Params.set( Params.set(
uCentral::uCentralProtocol::ACTIVE, uCentralProtocol::ACTIVE,
(int)(Obj->get(uCentral::RESTAPI::Protocol::ACTIVESCAN).toString() == "true") (int)(Obj->get(RESTAPI::Protocol::ACTIVESCAN).toString() == "true")
? 1 ? 1
: 0); : 0);
} else { } else {
Params.set(uCentral::uCentralProtocol::ACTIVE, 0); Params.set(uCentralProtocol::ACTIVE, 0);
} }
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
Cmd.Details = ParamStream.str(); Cmd.Details = ParamStream.str();
RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(20000), nullptr, this); RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(20000), nullptr, this);
KafkaManager()->PostMessage(uCentral::KafkaTopics::WIFISCAN, SerialNumber_, if(Cmd.ErrorCode==0) {
Cmd.Results); KafkaManager()->PostMessage(KafkaTopics::WIFISCAN, SerialNumber_,
Cmd.Results);
}
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -791,11 +796,11 @@ void RESTAPI_device_commandHandler::EventQueue(Poco::Net::HTTPServerRequest &Req
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) && if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
Obj->has(uCentral::RESTAPI::Protocol::TYPES) && Obj->isArray(RESTAPI::Protocol::TYPES)) {
Obj->isArray(uCentral::RESTAPI::Protocol::TYPES)) {
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString(); auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
auto Types = Obj->getArray(uCentral::RESTAPI::Protocol::TYPES); auto Types = Obj->getArray(RESTAPI::Protocol::TYPES);
if (SerialNumber_ == SNum) { if (SerialNumber_ == SNum) {
auto UUID = Daemon()->CreateUUID(); auto UUID = Daemon()->CreateUUID();
@@ -804,23 +809,26 @@ void RESTAPI_device_commandHandler::EventQueue(Poco::Net::HTTPServerRequest &Req
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = UUID; Cmd.UUID = UUID;
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentral::uCentralProtocol::EVENT; Cmd.Command = uCentralProtocol::EVENT;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::TYPES, Types);
Params.set(uCentral::uCentralProtocol::TYPES, Types);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
Cmd.Details = ParamStream.str(); Cmd.Details = ParamStream.str();
RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(20000), nullptr, this); RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(20000), nullptr, this);
if(Cmd.ErrorCode==0) {
KafkaManager()->PostMessage(KafkaTopics::DEVICE_EVENT_QUEUE, SerialNumber_,
Cmd.Results);
}
return; return;
} }
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -833,15 +841,15 @@ void RESTAPI_device_commandHandler::MakeRequest(Poco::Net::HTTPServerRequest &Re
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) && if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
Obj->has(uCentral::uCentralProtocol::MESSAGE)) { Obj->has(uCentralProtocol::MESSAGE)) {
auto SNum = GetS(uCentral::RESTAPI::Protocol::SERIALNUMBER, Obj); auto SNum = GetS(RESTAPI::Protocol::SERIALNUMBER, Obj);
auto MessageType = GetS(uCentral::uCentralProtocol::MESSAGE, Obj); auto MessageType = GetS(uCentralProtocol::MESSAGE, Obj);
if ((SerialNumber_ != SNum) || if ((SerialNumber_ != SNum) ||
(MessageType != uCentral::uCentralProtocol::STATE && (MessageType != uCentralProtocol::STATE &&
MessageType != uCentral::uCentralProtocol::HEALTHCHECK)) { MessageType != uCentralProtocol::HEALTHCHECK)) {
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
} }
@@ -852,15 +860,15 @@ void RESTAPI_device_commandHandler::MakeRequest(Poco::Net::HTTPServerRequest &Re
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.UUID = Daemon()->CreateUUID(); Cmd.UUID = Daemon()->CreateUUID();
Cmd.Command = uCentral::uCentralProtocol::REQUEST; Cmd.Command = uCentralProtocol::REQUEST;
Cmd.RunAt = When; Cmd.RunAt = When;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::WHEN, When); Params.set(uCentralProtocol::WHEN, When);
Params.set(uCentral::uCentralProtocol::MESSAGE, MessageType); Params.set(uCentralProtocol::MESSAGE, MessageType);
Params.set(uCentral::uCentralProtocol::REQUEST_UUID, Cmd.UUID); Params.set(uCentralProtocol::REQUEST_UUID, Cmd.UUID);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
@@ -870,7 +878,7 @@ void RESTAPI_device_commandHandler::MakeRequest(Poco::Net::HTTPServerRequest &Re
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }
@@ -881,7 +889,7 @@ void RESTAPI_device_commandHandler::Rtty(Poco::Net::HTTPServerRequest &Request,
if (Daemon()->ConfigGetString("rtty.enabled", "false") == "true") { if (Daemon()->ConfigGetString("rtty.enabled", "false") == "true") {
GWObjects::Device Device; GWObjects::Device Device;
if (Storage()->GetDevice(SerialNumber_, Device)) { if (Storage()->GetDevice(SerialNumber_, Device)) {
auto CommandUUID = uCentral::Daemon::instance()->CreateUUID(); auto CommandUUID = Daemon::instance()->CreateUUID();
GWObjects::RttySessionDetails Rtty{ GWObjects::RttySessionDetails Rtty{
.SerialNumber = SerialNumber_, .SerialNumber = SerialNumber_,
@@ -904,19 +912,19 @@ void RESTAPI_device_commandHandler::Rtty(Poco::Net::HTTPServerRequest &Request,
Cmd.SerialNumber = SerialNumber_; Cmd.SerialNumber = SerialNumber_;
Cmd.SubmittedBy = UserInfo_.webtoken.username_; Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.UUID = CommandUUID; Cmd.UUID = CommandUUID;
Cmd.Command = uCentral::uCentralProtocol::RTTY; Cmd.Command = uCentralProtocol::RTTY;
Poco::JSON::Object Params; Poco::JSON::Object Params;
Params.set(uCentral::uCentralProtocol::METHOD, uCentral::uCentralProtocol::RTTY); Params.set(uCentralProtocol::METHOD, uCentralProtocol::RTTY);
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_); Params.set(uCentralProtocol::SERIAL, SerialNumber_);
Params.set(uCentral::uCentralProtocol::ID, Rtty.ConnectionId); Params.set(uCentralProtocol::ID, Rtty.ConnectionId);
Params.set(uCentral::uCentralProtocol::TOKEN, Rtty.Token); Params.set(uCentralProtocol::TOKEN, Rtty.Token);
Params.set(uCentral::uCentralProtocol::SERVER, Rtty.Server); Params.set(uCentralProtocol::SERVER, Rtty.Server);
Params.set(uCentral::uCentralProtocol::PORT, Rtty.Port); Params.set(uCentralProtocol::PORT, Rtty.Port);
Params.set(uCentral::uCentralProtocol::USER, UserInfo_.webtoken.username_); Params.set(uCentralProtocol::USER, UserInfo_.webtoken.username_);
Params.set(uCentral::uCentralProtocol::TIMEOUT, Rtty.TimeOut); Params.set(uCentralProtocol::TIMEOUT, Rtty.TimeOut);
Params.set(uCentral::uCentralProtocol::PASSWORD, Device.DevicePassword); Params.set(uCentralProtocol::PASSWORD, Device.DevicePassword);
std::stringstream ParamStream; std::stringstream ParamStream;
Params.stringify(ParamStream); Params.stringify(ParamStream);
@@ -932,7 +940,7 @@ void RESTAPI_device_commandHandler::Rtty(Poco::Net::HTTPServerRequest &Request,
return; return;
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText())); Logger_.log(E);
} }
BadRequest(Request, Response); BadRequest(Request, Response);
} }

View File

@@ -11,15 +11,16 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_device_commandHandler : public RESTAPIHandler { class RESTAPI_device_commandHandler : public RESTAPIHandler {
public: public:
RESTAPI_device_commandHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_device_commandHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{ std::vector<std::string>{
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST, Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE, Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {} Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &Request, void handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) override; Poco::Net::HTTPServerResponse &Response) override;

View File

@@ -12,7 +12,7 @@
#include "StorageService.h" #include "StorageService.h"
#include "Utils.h" #include "Utils.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response)) if (!ContinueProcessing(Request, Response))
@@ -23,7 +23,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
ParseParameters(Request); ParseParameters(Request);
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
std::string SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
GWObjects::Device Device; GWObjects::Device Device;
if (Storage()->GetDevice(SerialNumber, Device)) { if (Storage()->GetDevice(SerialNumber, Device)) {
@@ -34,7 +34,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
NotFound(Request, Response); NotFound(Request, Response);
} }
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) { } else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) {
std::string SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
if (Storage()->DeleteDevice(SerialNumber)) { if (Storage()->DeleteDevice(SerialNumber)) {
OK(Request, Response); OK(Request, Response);
@@ -42,7 +42,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
NotFound(Request, Response); NotFound(Request, Response);
} }
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST) { } else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST) {
std::string SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
Poco::JSON::Parser IncomingParser; Poco::JSON::Parser IncomingParser;
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =
@@ -57,7 +57,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
for(auto &i:Device.Notes) for(auto &i:Device.Notes)
i.createdBy = UserInfo_.userinfo.email; i.createdBy = UserInfo_.userinfo.email;
if (!uCentral::Utils::ValidSerialNumber(Device.SerialNumber)) { if (!Utils::ValidSerialNumber(Device.SerialNumber)) {
Logger_.warning(Poco::format("CREATE-DEVICE(%s): Illegal name.", Device.SerialNumber)); Logger_.warning(Poco::format("CREATE-DEVICE(%s): Illegal name.", Device.SerialNumber));
BadRequest(Request, Response); BadRequest(Request, Response);
return; return;
@@ -74,7 +74,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
BadRequest(Request, Response); BadRequest(Request, Response);
} }
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_PUT) { } else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_PUT) {
std::string SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
Poco::JSON::Parser IncomingParser; Poco::JSON::Parser IncomingParser;
Poco::JSON::Object::Ptr Obj = Poco::JSON::Object::Ptr Obj =

View File

@@ -10,19 +10,19 @@
#define UCENTRAL_RESTAPI_DEVICEHANDLER_H #define UCENTRAL_RESTAPI_DEVICEHANDLER_H
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
#include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h" #include "Poco/Net/HTTPServerResponse.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_device_handler : public RESTAPIHandler { class RESTAPI_device_handler : public RESTAPIHandler {
public: public:
RESTAPI_device_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_device_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{ std::vector<std::string>{
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST, Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE, Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {} Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/device/{serialNumber}"}; }; static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/device/{serialNumber}"}; };

View File

@@ -16,7 +16,7 @@
#include "Utils.h" #include "Utils.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_devices_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_devices_handler::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
@@ -29,11 +29,14 @@ namespace uCentral {
try { try {
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
ParseParameters(Request); ParseParameters(Request);
InitQueryBlock(); if(!InitQueryBlock()) {
auto serialOnly = GetBoolParameter(uCentral::RESTAPI::Protocol::SERIALONLY, false); BadRequest(Request, Response, "Illegal parameter value.");
auto countOnly = GetBoolParameter(uCentral::RESTAPI::Protocol::COUNTONLY, false); return;
}
auto serialOnly = GetBoolParameter(RESTAPI::Protocol::SERIALONLY, false);
auto countOnly = GetBoolParameter(RESTAPI::Protocol::COUNTONLY, false);
auto deviceWithStatus = auto deviceWithStatus =
GetBoolParameter(uCentral::RESTAPI::Protocol::DEVICEWITHSTATUS, false); GetBoolParameter(RESTAPI::Protocol::DEVICEWITHSTATUS, false);
Logger_.debug(Poco::format("DEVICES: from %Lu, limit of %Lu, filter='%s'.", Logger_.debug(Poco::format("DEVICES: from %Lu, limit of %Lu, filter='%s'.",
(uint64_t)QB_.Offset, (uint64_t)QB_.Limit, QB_.Filter)); (uint64_t)QB_.Offset, (uint64_t)QB_.Limit, QB_.Filter));
@@ -45,7 +48,7 @@ namespace uCentral {
if (!QB_.Select.empty()) { if (!QB_.Select.empty()) {
Poco::JSON::Array Objects; Poco::JSON::Array Objects;
std::vector<std::string> Numbers = uCentral::Utils::Split(QB_.Select); std::vector<std::string> Numbers = Utils::Split(QB_.Select);
for (auto &i : Numbers) { for (auto &i : Numbers) {
GWObjects::Device D; GWObjects::Device D;
if (Storage()->GetDevice(i, D)) { if (Storage()->GetDevice(i, D)) {
@@ -62,14 +65,14 @@ namespace uCentral {
} }
if (deviceWithStatus) if (deviceWithStatus)
RetObj.set(uCentral::RESTAPI::Protocol::DEVICESWITHSTATUS, Objects); RetObj.set(RESTAPI::Protocol::DEVICESWITHSTATUS, Objects);
else else
RetObj.set(uCentral::RESTAPI::Protocol::DEVICES, Objects); RetObj.set(RESTAPI::Protocol::DEVICES, Objects);
} else if (countOnly == true) { } else if (countOnly == true) {
uint64_t Count = 0; uint64_t Count = 0;
if (Storage()->GetDeviceCount(Count)) { if (Storage()->GetDeviceCount(Count)) {
RetObj.set(uCentral::RESTAPI::Protocol::COUNT, Count); RetObj.set(RESTAPI::Protocol::COUNT, Count);
} }
} else if (serialOnly) { } else if (serialOnly) {
std::vector<std::string> SerialNumbers; std::vector<std::string> SerialNumbers;
@@ -78,7 +81,7 @@ namespace uCentral {
for (const auto &i : SerialNumbers) { for (const auto &i : SerialNumbers) {
Objects.add(i); Objects.add(i);
} }
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBERS, Objects); RetObj.set(RESTAPI::Protocol::SERIALNUMBERS, Objects);
} else { } else {
std::vector<GWObjects::Device> Devices; std::vector<GWObjects::Device> Devices;
Storage()->GetDevices(QB_.Offset, QB_.Limit, Devices); Storage()->GetDevices(QB_.Offset, QB_.Limit, Devices);
@@ -92,9 +95,9 @@ namespace uCentral {
Objects.add(Obj); Objects.add(Obj);
} }
if (deviceWithStatus) if (deviceWithStatus)
RetObj.set(uCentral::RESTAPI::Protocol::DEVICESWITHSTATUS, Objects); RetObj.set(RESTAPI::Protocol::DEVICESWITHSTATUS, Objects);
else else
RetObj.set(uCentral::RESTAPI::Protocol::DEVICES, Objects); RetObj.set(RESTAPI::Protocol::DEVICES, Objects);
} }
ReturnObject(Request, RetObj, Response); ReturnObject(Request, RetObj, Response);
return; return;

View File

@@ -11,13 +11,14 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_devices_handler : public RESTAPIHandler { class RESTAPI_devices_handler : public RESTAPIHandler {
public: public:
RESTAPI_devices_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_devices_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_OPTIONS}){}; Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal){};
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/devices"}; }; static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/devices"}; };

View File

@@ -15,7 +15,7 @@
#include <fstream> #include <fstream>
#include "RESTAPI_protocol.h" #include "RESTAPI_protocol.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_file::handleRequest(Poco::Net::HTTPServerRequest &Request, void RESTAPI_file::handleRequest(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response)) if (!ContinueProcessing(Request, Response))
@@ -28,8 +28,8 @@ namespace uCentral {
ParseParameters(Request); ParseParameters(Request);
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
auto UUID = GetBinding(uCentral::RESTAPI::Protocol::FILEUUID, ""); auto UUID = GetBinding(RESTAPI::Protocol::FILEUUID, "");
auto SerialNumber = GetParameter(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); auto SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
// does the file exist // does the file exist
Poco::File DownloadFile(FileUploader()->Path() + "/" + UUID); Poco::File DownloadFile(FileUploader()->Path() + "/" + UUID);
@@ -45,7 +45,7 @@ namespace uCentral {
return; return;
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) { } else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) {
auto UUID = GetBinding(uCentral::RESTAPI::Protocol::FILEUUID, ""); auto UUID = GetBinding(RESTAPI::Protocol::FILEUUID, "");
if (UUID.empty()) { if (UUID.empty()) {
BadRequest(Request, Response); BadRequest(Request, Response);

View File

@@ -11,14 +11,15 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_file : public RESTAPIHandler { class RESTAPI_file : public RESTAPIHandler {
public: public:
RESTAPI_file(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_file(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
Poco::Net::HTTPRequest::HTTP_DELETE, Poco::Net::HTTPRequest::HTTP_DELETE,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {} Poco::Net::HTTPRequest::HTTP_OPTIONS},
Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/file/{uuid}"};} static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/file/{uuid}"};}

View File

@@ -25,17 +25,18 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
#include "RESTAPI_protocol.h" #include "RESTAPI_protocol.h"
#include "Utils.h" #include "Utils.h"
#include "Daemon.h"
namespace uCentral { namespace OpenWifi {
bool RESTAPIHandler::ParseBindings(const std::string & Request, const std::list<const char *> & EndPoints, BindingMap &bindings) { bool RESTAPIHandler::ParseBindings(const std::string & Request, const std::list<const char *> & EndPoints, BindingMap &bindings) {
std::string Param, Value; std::string Param, Value;
bindings.clear(); bindings.clear();
std::vector<std::string> PathItems = uCentral::Utils::Split(Request, '/'); std::vector<std::string> PathItems = Utils::Split(Request, '/');
for(const auto &EndPoint:EndPoints) { for(const auto &EndPoint:EndPoints) {
std::vector<std::string> ParamItems = uCentral::Utils::Split(EndPoint, '/'); std::vector<std::string> ParamItems = Utils::Split(EndPoint, '/');
if (PathItems.size() != ParamItems.size()) if (PathItems.size() != ParamItems.size())
continue; continue;
@@ -63,9 +64,9 @@ namespace uCentral {
} }
void RESTAPIHandler::ParseParameters(Poco::Net::HTTPServerRequest &request) { void RESTAPIHandler::ParseParameters(Poco::Net::HTTPServerRequest &request) {
Poco::URI uri(request.getURI()); Poco::URI uri(request.getURI());
Parameters_ = uri.getQueryParameters(); Parameters_ = uri.getQueryParameters();
InitQueryBlock();
} }
static bool is_number(const std::string &s) { static bool is_number(const std::string &s) {
@@ -110,6 +111,26 @@ namespace uCentral {
return Default; return Default;
} }
bool RESTAPIHandler::HasParameter(const std::string &Name, std::string &Value) {
for (const auto &i : Parameters_) {
if (i.first == Name) {
Value = i.second;
return true;
}
}
return false;
}
bool RESTAPIHandler::HasParameter(const std::string &Name, uint64_t & Value) {
for (const auto &i : Parameters_) {
if (i.first == Name) {
Value = std::stoi(i.second);
return true;
}
}
return false;
}
const std::string &RESTAPIHandler::GetBinding(const std::string &Name, const std::string &Default) { const std::string &RESTAPIHandler::GetBinding(const std::string &Name, const std::string &Default) {
auto E = Bindings_.find(Poco::toLower(Name)); auto E = Bindings_.find(Poco::toLower(Name));
if (E == Bindings_.end()) if (E == Bindings_.end())
@@ -246,18 +267,33 @@ namespace uCentral {
} }
void RESTAPIHandler::SendFile(Poco::File & File, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { void RESTAPIHandler::SendFile(Poco::File & File, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) {
Response.set("Content-Type",Utils::FindMediaType(File));
Poco::Path P(File.path()); Poco::Path P(File.path());
Response.set("Content-Disposition", "attachment; filename=" + P.getBaseName() ); auto MT = Utils::FindMediaType(File);
Response.set("Content-Transfer-Encoding","binary"); if(MT.Encoding==Utils::BINARY) {
Response.set("Content-Transfer-Encoding","binary");
Response.set("Accept-Ranges", "bytes");
}
Response.set("Cache-Control", "private");
Response.set("Pragma", "private");
Response.set("Expires", "Mon, 26 Jul 2027 05:00:00 GMT");
AddCORS(Request, Response);
Response.sendFile(File.path(),MT.ContentType);
}
void RESTAPIHandler::SendFile(Poco::TemporaryFile &TempAvatar, const std::string &Type, const std::string & Name, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) {
auto MT = Utils::FindMediaType(Name);
if(MT.Encoding==Utils::BINARY) {
Response.set("Content-Transfer-Encoding","binary");
Response.set("Accept-Ranges", "bytes");
}
Response.set("Content-Disposition", "attachment; filename=" + Name );
Response.set("Accept-Ranges", "bytes"); Response.set("Accept-Ranges", "bytes");
Response.set("Cache-Control", "private"); Response.set("Cache-Control", "private");
Response.set("Pragma", "private"); Response.set("Pragma", "private");
Response.set("Expires", "Mon, 26 Jul 2027 05:00:00 GMT"); Response.set("Expires", "Mon, 26 Jul 2027 05:00:00 GMT");
Response.set("Content-Length", std::to_string(File.getSize()));
AddCORS(Request, Response); AddCORS(Request, Response);
Response.sendFile(File.path(),Utils::FindMediaType(File)); Response.sendFile(TempAvatar.path(),MT.ContentType);
} }
void RESTAPIHandler::SendHTMLFileBack(Poco::File & File, void RESTAPIHandler::SendHTMLFileBack(Poco::File & File,
Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerRequest &Request,
@@ -291,10 +327,6 @@ namespace uCentral {
bool RESTAPIHandler::ContinueProcessing(Poco::Net::HTTPServerRequest &Request, bool RESTAPIHandler::ContinueProcessing(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_OPTIONS) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_OPTIONS) {
/* std::cout << "REQUEST:" << std::endl;
for(const auto &[f,s]:Request)
std::cout << "First: " << f << " second:" << s << std::endl;
*/
ProcessOptions(Request, Response); ProcessOptions(Request, Response);
return false; return false;
} else if (std::find(Methods_.begin(), Methods_.end(), Request.getMethod()) == Methods_.end()) { } else if (std::find(Methods_.begin(), Methods_.end(), Request.getMethod()) == Methods_.end()) {
@@ -307,45 +339,34 @@ namespace uCentral {
bool RESTAPIHandler::IsAuthorized(Poco::Net::HTTPServerRequest &Request, bool RESTAPIHandler::IsAuthorized(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
if(SessionToken_.empty()) { if(Internal_) {
try { return Daemon()->IsValidAPIKEY(Request);
Poco::Net::OAuth20Credentials Auth(Request); } else {
if (SessionToken_.empty()) {
try {
Poco::Net::OAuth20Credentials Auth(Request);
if (Auth.getScheme() == "Bearer") { if (Auth.getScheme() == "Bearer") {
SessionToken_ = Auth.getBearerToken(); SessionToken_ = Auth.getBearerToken();
} }
} catch(const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.log(E); Logger_.log(E);
} }
} }
#ifdef TIP_SECURITY_SERVICE #ifdef TIP_SECURITY_SERVICE
if (AuthService()->IsAuthorized(Request, SessionToken_, UserInfo_)) { if (AuthService()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
#else #else
if (AuthClient()->IsAuthorized(Request, SessionToken_, UserInfo_)) { if (AuthClient()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
#endif #endif
return true; return true;
} else { } else {
UnAuthorized(Request, Response); UnAuthorized(Request, Response);
} }
return false; return false;
} }
bool RESTAPIHandler::IsAuthorized(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response, std::string &UserName) {
#ifdef TIP_SECURITY_SERVICE
if (AuthService()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
#else
if (AuthClient()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
#endif
UserName = UserInfo_.webtoken.username_;
return true;
} else {
UnAuthorized(Request, Response);
}
return false;
} }
/*
bool RESTAPIHandler::ValidateAPIKey(Poco::Net::HTTPServerRequest &Request, bool RESTAPIHandler::ValidateAPIKey(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
auto Key = Request.get("X-API-KEY", ""); auto Key = Request.get("X-API-KEY", "");
@@ -355,7 +376,7 @@ namespace uCentral {
return true; return true;
} }
*/
void RESTAPIHandler::ReturnObject(Poco::Net::HTTPServerRequest &Request, Poco::JSON::Object &Object, void RESTAPIHandler::ReturnObject(Poco::Net::HTTPServerRequest &Request, Poco::JSON::Object &Object,
Poco::Net::HTTPServerResponse &Response) { Poco::Net::HTTPServerResponse &Response) {
PrepareResponse(Request, Response); PrepareResponse(Request, Response);
@@ -363,18 +384,25 @@ namespace uCentral {
Poco::JSON::Stringifier::stringify(Object, Answer); Poco::JSON::Stringifier::stringify(Object, Answer);
} }
void RESTAPIHandler::InitQueryBlock() { bool RESTAPIHandler::InitQueryBlock() {
QB_.SerialNumber = GetParameter(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); if(QueryBlockInitialized_)
QB_.StartDate = GetParameter(uCentral::RESTAPI::Protocol::STARTDATE, 0); return true;
QB_.EndDate = GetParameter(uCentral::RESTAPI::Protocol::ENDDATE, 0); QueryBlockInitialized_=true;
QB_.Offset = GetParameter(uCentral::RESTAPI::Protocol::OFFSET, 0); QB_.SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
QB_.Limit = GetParameter(uCentral::RESTAPI::Protocol::LIMIT, 100); QB_.StartDate = GetParameter(RESTAPI::Protocol::STARTDATE, 0);
QB_.Filter = GetParameter(uCentral::RESTAPI::Protocol::FILTER, ""); QB_.EndDate = GetParameter(RESTAPI::Protocol::ENDDATE, 0);
QB_.Select = GetParameter(uCentral::RESTAPI::Protocol::SELECT, ""); QB_.Offset = GetParameter(RESTAPI::Protocol::OFFSET, 1);
QB_.Lifetime = GetBoolParameter(uCentral::RESTAPI::Protocol::LIFETIME,false); QB_.Limit = GetParameter(RESTAPI::Protocol::LIMIT, 100);
QB_.LogType = GetParameter(uCentral::RESTAPI::Protocol::LOGTYPE,0); QB_.Filter = GetParameter(RESTAPI::Protocol::FILTER, "");
QB_.LastOnly = GetBoolParameter(uCentral::RESTAPI::Protocol::LASTONLY,false); QB_.Select = GetParameter(RESTAPI::Protocol::SELECT, "");
QB_.Newest = GetBoolParameter(uCentral::RESTAPI::Protocol::NEWEST,false); QB_.Lifetime = GetBoolParameter(RESTAPI::Protocol::LIFETIME,false);
QB_.LogType = GetParameter(RESTAPI::Protocol::LOGTYPE,0);
QB_.LastOnly = GetBoolParameter(RESTAPI::Protocol::LASTONLY,false);
QB_.Newest = GetBoolParameter(RESTAPI::Protocol::NEWEST,false);
if(QB_.Offset<1)
QB_.Offset=1;
return true;
} }
[[nodiscard]] uint64_t RESTAPIHandler::Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default){ [[nodiscard]] uint64_t RESTAPIHandler::Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default){
@@ -396,7 +424,7 @@ namespace uCentral {
} }
[[nodiscard]] uint64_t RESTAPIHandler::GetWhen(const Poco::JSON::Object::Ptr &Obj) { [[nodiscard]] uint64_t RESTAPIHandler::GetWhen(const Poco::JSON::Object::Ptr &Obj) {
return RESTAPIHandler::Get(uCentral::RESTAPI::Protocol::WHEN, Obj); return RESTAPIHandler::Get(RESTAPI::Protocol::WHEN, Obj);
} }

View File

@@ -19,13 +19,14 @@
#include "Poco/Logger.h" #include "Poco/Logger.h"
#include "Poco/File.h" #include "Poco/File.h"
#include "Poco/TemporaryFile.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "Poco/CountingStream.h" #include "Poco/CountingStream.h"
#include "Poco/NullStream.h" #include "Poco/NullStream.h"
#include "RESTAPI_SecurityObjects.h" #include "RESTAPI_SecurityObjects.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_PartHandler: public Poco::Net::PartHandler class RESTAPI_PartHandler: public Poco::Net::PartHandler
{ {
@@ -90,8 +91,8 @@ namespace uCentral {
typedef std::map<std::string, std::string> BindingMap; typedef std::map<std::string, std::string> BindingMap;
RESTAPIHandler(BindingMap map, Poco::Logger &l, std::vector<std::string> Methods) RESTAPIHandler(BindingMap map, Poco::Logger &l, std::vector<std::string> Methods, bool Internal=false)
: Bindings_(std::move(map)), Logger_(l), Methods_(std::move(Methods)) {} : Bindings_(std::move(map)), Logger_(l), Methods_(std::move(Methods)), Internal_(Internal) {}
static bool ParseBindings(const std::string & Request, const std::list<const char *> & EndPoints, BindingMap &Keys); static bool ParseBindings(const std::string & Request, const std::list<const char *> & EndPoints, BindingMap &Keys);
void PrintBindings(); void PrintBindings();
@@ -110,10 +111,8 @@ namespace uCentral {
bool IsAuthorized(Poco::Net::HTTPServerRequest &Request, bool IsAuthorized(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response); Poco::Net::HTTPServerResponse &Response);
bool IsAuthorized(Poco::Net::HTTPServerRequest &Request, /* bool ValidateAPIKey(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response, std::string &UserName); Poco::Net::HTTPServerResponse &Response); */
bool ValidateAPIKey(Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response);
uint64_t GetParameter(const std::string &Name, uint64_t Default); uint64_t GetParameter(const std::string &Name, uint64_t Default);
std::string GetParameter(const std::string &Name, const std::string &Default); std::string GetParameter(const std::string &Name, const std::string &Default);
@@ -136,16 +135,19 @@ namespace uCentral {
Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerRequest &Request,
Poco::Net::HTTPServerResponse &Response , Poco::Net::HTTPServerResponse &Response ,
const Types::StringPairVec & FormVars); const Types::StringPairVec & FormVars);
void SendFile(Poco::TemporaryFile &TempAvatar, const std::string &Type, const std::string & Name, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response);
void SendFile(Poco::File & File, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response); void SendFile(Poco::File & File, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response);
const std::string &GetBinding(const std::string &Name, const std::string &Default); const std::string &GetBinding(const std::string &Name, const std::string &Default);
void InitQueryBlock(); bool InitQueryBlock();
[[nodiscard]] static uint64_t Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default=0); [[nodiscard]] static uint64_t Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default=0);
[[nodiscard]] static std::string GetS(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, const std::string & Default=""); [[nodiscard]] static std::string GetS(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, const std::string & Default="");
[[nodiscard]] static bool GetB(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, bool Default=false); [[nodiscard]] static bool GetB(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, bool Default=false);
[[nodiscard]] static uint64_t GetWhen(const Poco::JSON::Object::Ptr &Obj); [[nodiscard]] static uint64_t GetWhen(const Poco::JSON::Object::Ptr &Obj);
bool HasParameter(const std::string &QueryParameter, std::string &Value);
bool HasParameter(const std::string &QueryParameter, uint64_t & Value);
protected: protected:
BindingMap Bindings_; BindingMap Bindings_;
@@ -155,6 +157,8 @@ namespace uCentral {
SecurityObjects::UserInfoAndPolicy UserInfo_; SecurityObjects::UserInfoAndPolicy UserInfo_;
std::vector<std::string> Methods_; std::vector<std::string> Methods_;
QueryBlock QB_; QueryBlock QB_;
bool Internal_=false;
bool QueryBlockInitialized_=false;
}; };
class RESTAPI_UnknownRequestHandler : public RESTAPIHandler { class RESTAPI_UnknownRequestHandler : public RESTAPIHandler {
@@ -165,7 +169,7 @@ namespace uCentral {
Poco::Net::HTTPServerResponse &Response) override { Poco::Net::HTTPServerResponse &Response) override {
if (!IsAuthorized(Request, Response)) if (!IsAuthorized(Request, Response))
return; return;
BadRequest(Request, Response); BadRequest(Request, Response, "Unknown API endpoint");
} }
}; };
@@ -181,10 +185,10 @@ namespace uCentral {
} }
template<typename T, typename... Args> template<typename T, typename... Args>
RESTAPIHandler * RESTAPI_Router(const std::string & RequestedPath, RESTAPIHandler::BindingMap &Bindings, Poco::Logger & Logger) { RESTAPIHandler * RESTAPI_Router(const std::string & RequestedPath, RESTAPIHandler::BindingMap &Bindings, Poco::Logger & Logger ) {
static_assert(test_has_PathName_method((T*)nullptr), "Class must have a static PathName() method."); static_assert(test_has_PathName_method((T*)nullptr), "Class must have a static PathName() method.");
if(RESTAPIHandler::ParseBindings(RequestedPath,T::PathName(),Bindings)) { if(RESTAPIHandler::ParseBindings(RequestedPath,T::PathName(),Bindings)) {
return new T(Bindings, Logger); return new T(Bindings, Logger, false);
} }
if constexpr (sizeof...(Args) == 0) { if constexpr (sizeof...(Args) == 0) {
@@ -194,6 +198,21 @@ namespace uCentral {
} }
} }
template<typename T, typename... Args>
RESTAPIHandler * RESTAPI_Router_I(const std::string & RequestedPath, RESTAPIHandler::BindingMap &Bindings, Poco::Logger & Logger) {
static_assert(test_has_PathName_method((T*)nullptr), "Class must have a static PathName() method.");
if(RESTAPIHandler::ParseBindings(RequestedPath,T::PathName(),Bindings)) {
return new T(Bindings, Logger, true);
}
if constexpr (sizeof...(Args) == 0) {
return new RESTAPI_UnknownRequestHandler(Bindings,Logger);
} else {
return RESTAPI_Router_I<Args...>(RequestedPath, Bindings, Logger);
}
}
} }
#endif //UCENTRAL_RESTAPI_HANDLER_H #endif //UCENTRAL_RESTAPI_HANDLER_H

View File

@@ -7,7 +7,7 @@
#include "Utils.h" #include "Utils.h"
#include "OUIServer.h" #include "OUIServer.h"
namespace uCentral { namespace OpenWifi {
void RESTAPI_ouis::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { void RESTAPI_ouis::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) {
if (!ContinueProcessing(Request, Response)) if (!ContinueProcessing(Request, Response))
@@ -21,7 +21,7 @@ namespace uCentral {
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
Poco::JSON::Array Objects; Poco::JSON::Array Objects;
auto Select = GetParameter("macList",""); auto Select = GetParameter("macList","");
std::vector<std::string> Macs = uCentral::Utils::Split(Select); std::vector<std::string> Macs = Utils::Split(Select);
for (auto &i : Macs) { for (auto &i : Macs) {
Poco::JSON::Object O; Poco::JSON::Object O;
auto Manufacturer = OUIServer()->GetManufacturer(i); auto Manufacturer = OUIServer()->GetManufacturer(i);

View File

@@ -7,14 +7,14 @@
#include "RESTAPI_handler.h" #include "RESTAPI_handler.h"
namespace uCentral { namespace OpenWifi {
class RESTAPI_ouis : public RESTAPIHandler { class RESTAPI_ouis : public RESTAPIHandler {
public: public:
RESTAPI_ouis(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L) RESTAPI_ouis(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
: RESTAPIHandler(bindings, L, : RESTAPIHandler(bindings, L,
std::vector<std::string>{ std::vector<std::string>{
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST, Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {} Poco::Net::HTTPRequest::HTTP_OPTIONS}, Internal) {}
void handleRequest(Poco::Net::HTTPServerRequest &request, void handleRequest(Poco::Net::HTTPServerRequest &request,
Poco::Net::HTTPServerResponse &response) override; Poco::Net::HTTPServerResponse &response) override;
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/ouis"};} static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/ouis"};}

View File

@@ -9,7 +9,7 @@
#ifndef UCENTRALGW_RESTAPI_PROTOCOL_H #ifndef UCENTRALGW_RESTAPI_PROTOCOL_H
#define UCENTRALGW_RESTAPI_PROTOCOL_H #define UCENTRALGW_RESTAPI_PROTOCOL_H
namespace uCentral::RESTAPI::Protocol { namespace OpenWifi::RESTAPI::Protocol {
static const char * CAPABILITIES = "capabilities"; static const char * CAPABILITIES = "capabilities";
static const char * LOGS = "logs"; static const char * LOGS = "logs";
static const char * HEALTHCHECKS = "healthchecks"; static const char * HEALTHCHECKS = "healthchecks";
@@ -72,9 +72,7 @@ namespace uCentral::RESTAPI::Protocol {
static const char * REASON = "reason"; static const char * REASON = "reason";
static const char * FILEUUID = "uuid"; static const char * FILEUUID = "uuid";
static const char * USERID = "userId"; static const char * USERID = "userId";
static const char * USERS = "users";
static const char * PASSWORD = "password"; static const char * PASSWORD = "password";
static const char * NEWPASSWORD = "newPassword";
static const char * TOKEN = "token"; static const char * TOKEN = "token";
static const char * SETLOGLEVEL = "setloglevel"; static const char * SETLOGLEVEL = "setloglevel";
static const char * GETLOGLEVELS = "getloglevels"; static const char * GETLOGLEVELS = "getloglevels";
@@ -89,6 +87,42 @@ namespace uCentral::RESTAPI::Protocol {
static const char * LIST = "list"; static const char * LIST = "list";
static const char * TAG = "tag"; static const char * TAG = "tag";
static const char * TAGLIST = "tagList"; 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 * 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 * ME = "me";
} }
#endif // UCENTRALGW_RESTAPI_PROTOCOL_H #endif // UCENTRALGW_RESTAPI_PROTOCOL_H

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