Compare commits

...

460 Commits

Author SHA1 Message Date
Dmitry Dunaev
acad0cd99f Merge pull request #96 from Telecominfraproject/fix/wifi-9174--dep-charts-2.5
[WIFI-9174] Fix: switch from deprecated bitnami charts to mirrored ones
2022-06-03 15:52:43 +03:00
Dmitry Dunaev
7f675733df [WIFI-9174] Fix: switch from deprecated bitnami charts to mirrored ones
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-06-03 15:51:56 +03:00
Johann Hoffmann
4f1d05467f Update image tag in helm values to v2.5.1
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-04-29 19:06:38 +02:00
Johann Hoffmann
27bffaa734 Update image tag in helm values to v2.5.1-RC1
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-04-29 18:10:44 +02:00
stephb9959
b005b57137 Fixing https://telecominfraproject.atlassian.net/browse/WIFI-7812 2022-04-28 14:28:19 -07:00
TIP Automation User
2bae52e67e Chg: update image tag in helm values to v2.5.0 2022-03-30 13:48:16 +00:00
TIP Automation User
7766fe08cd Chg: update image tag in helm values to v2.5.0-RC1 2022-02-11 16:02:37 +00:00
stephb9959
f677c8765b Framework Update 2022-02-10 11:12:07 -08:00
stephb9959
c0c5dd7ac6 Framework Update 2022-02-10 08:08:28 -08:00
stephb9959
9c619367c3 Adding reverse serialnumber matching 2022-02-10 07:18:45 -08:00
stephb9959
a0a0a15f07 Adding reverse serialnumber matching 2022-02-10 07:10:18 -08:00
stephb9959
ab047be875 Adding reverse serialnumber matching 2022-02-10 07:02:48 -08:00
stephb9959
567b440db7 Adding reverse serialnumber matching 2022-02-10 06:59:41 -08:00
stephb9959
35fa62c8cc Adding reverse serialnumber matching 2022-02-10 06:56:39 -08:00
stephb9959
be374d683e Adding reverse serialnumber matching 2022-02-10 06:47:56 -08:00
stephb9959
cd3b867370 Fixing repeated commands getting into command list. 2022-02-09 23:01:25 -08:00
stephb9959
42bca6842c Fixing repeated commands getting into command list. 2022-02-09 22:47:47 -08:00
stephb9959
de3a96b62d Adding reverse serial number search 2022-02-09 15:08:38 -08:00
stephb9959
600ba8a2b5 Adding reverse serial number search 2022-02-09 15:03:50 -08:00
stephb9959
95a536dc1e Merge remote-tracking branch 'origin/master' 2022-02-08 22:21:16 -08:00
stephb9959
0639d09163 Framework update 2022-02-08 22:10:59 -08:00
Johann Hoffmann
f723ea719d Cut build lib copying
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-08 15:36:32 +01:00
stephb9959
5c83d76680 Adding capabilities file library for known device types. 2022-02-07 22:15:41 -08:00
stephb9959
ad977ad5eb Fixing capabilities cache for Provisioning. 2022-02-07 16:23:01 -08:00
stephb9959
a1c3e087c6 Fixing capabilities cache for Provisioning. 2022-02-07 16:17:06 -08:00
stephb9959
78d8af27b6 Fixing capabilities cache for Provisioning. 2022-02-07 16:13:40 -08:00
stephb9959
ac59ce3eda Fixing capabilities cache for Provisioning. 2022-02-07 15:57:37 -08:00
stephb9959
e473395cfe Fixing capabilities cache for Provisioning. 2022-02-07 15:51:09 -08:00
stephb9959
a9d89c7039 Fixing capabilities cache for Provisioning. 2022-02-07 15:40:12 -08:00
stephb9959
fdc66405c0 Improving serial number cache 2022-02-07 08:42:18 -08:00
stephb9959
f17f66db93 Merge remote-tracking branch 'origin/master' 2022-02-07 07:31:57 -08:00
stephb9959
07efbfcdd4 Removing debug messages. 2022-02-07 07:31:47 -08:00
Johann Hoffmann
a4d3b61799 Remove branch since PR was merged in composite actions repo
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-07 14:02:39 +01:00
stephb9959
096c2aafc7 Removing debug messages. 2022-02-06 23:24:53 -08:00
stephb9959
025c486b6c Removing debug messages. 2022-02-06 23:18:24 -08:00
stephb9959
70150d13e4 Removing debug messages. 2022-02-06 23:10:05 -08:00
stephb9959
374cab1b1c Adding IPtocountry API. 2022-02-06 23:02:05 -08:00
stephb9959
e17c59d844 Adding IPtocountry API. 2022-02-06 22:55:17 -08:00
stephb9959
db60feacc8 Adding IPtocountry API. 2022-02-05 20:51:48 -08:00
stephb9959
5420e23832 Adding IPtocountry API. 2022-02-05 20:47:05 -08:00
stephb9959
d6e5656e5a Adding "ipdata.co" as IP Info provider. 2022-02-05 11:35:27 -08:00
stephb9959
c9b7edcdd9 Fixed failure to connect for brand new devices. 2022-02-05 09:45:56 -08:00
stephb9959
5333f45f93 Reducing memory footprint. 2022-02-05 09:41:38 -08:00
stephb9959
737c432446 Reducing memory footprint. 2022-02-05 09:36:12 -08:00
stephb9959
4f44e17ee0 Merge remote-tracking branch 'origin/master' 2022-02-05 09:32:43 -08:00
stephb9959
262011e7bf Reducing memory footprint. 2022-02-05 09:32:35 -08:00
Stephane Bourque
d48a97673a Merge pull request #78 from Telecominfraproject/WIFI-6729-speed-up-image-build
[WIFI-6729] Speed up Docker image build time
2022-02-04 13:33:09 -08:00
stephb9959
19c8773768 Reducing memory footprint. 2022-02-04 11:42:14 -08:00
stephb9959
498f2aa1b5 Reducing memory footprint. 2022-02-04 11:28:47 -08:00
stephb9959
b696c50097 Reducing memory footprint. 2022-02-04 11:27:44 -08:00
stephb9959
585b4ae09e Reducing memory footprint. 2022-02-04 11:20:42 -08:00
stephb9959
9bf5dcad21 Reducing memory footprint. 2022-02-04 11:17:31 -08:00
stephb9959
0ad253bb3a Reducing memory footprint. 2022-02-04 11:10:32 -08:00
stephb9959
16894d4fb4 Reducing memory footprint. 2022-02-04 11:03:33 -08:00
stephb9959
976149bbde Reducing memory footpring. 2022-02-04 10:57:15 -08:00
stephb9959
fd4105127c Reducing memory footpring. 2022-02-04 09:48:19 -08:00
Johann Hoffmann
a7f77f3d91 Remove directory listing
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-04 16:25:19 +01:00
Johann Hoffmann
bbb7687f8b Revert "Try workaround"
This reverts commit 6333ca48d8.

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-04 15:51:46 +01:00
Johann Hoffmann
6333ca48d8 Try workaround
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-04 15:33:31 +01:00
Johann Hoffmann
c19499deaa Add step for debugging
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-04 14:40:19 +01:00
Johann Hoffmann
358abb2a83 Revert "Add branch name to used composite action"
This reverts commit c259fdae8e.

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-04 13:03:17 +01:00
Johann Hoffmann
c259fdae8e Add branch name to used composite action
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-03 18:58:58 +01:00
Johann Hoffmann
f17a83a5cf Also check out PR branch for trigger-testing job to avoid post-action failure
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-03 18:32:57 +01:00
stephb9959
611e384117 Refactoring into smaller files. 2022-02-03 08:31:34 -08:00
Johann Hoffmann
e47756ab68 Check out PR branch for composite action
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-03 14:53:33 +01:00
Johann Hoffmann
3709ea9a92 Re-structure Dockerfile and use docker-image-build composite action
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-02-03 14:50:52 +01:00
stephb9959
62a2fbd6d7 Trying to solve https://telecominfraproject.atlassian.net/browse/WIFI-6850 2022-02-02 23:14:09 -08:00
stephb9959
c34a88343e Trying to solve https://telecominfraproject.atlassian.net/browse/WIFI-6850 2022-02-02 23:11:47 -08:00
stephb9959
7cd36da795 Trying to solve https://telecominfraproject.atlassian.net/browse/WIFI-6850 2022-02-02 22:55:39 -08:00
stephb9959
6f4a34c78d Framework update. 2022-02-02 11:03:06 -08:00
stephb9959
4d65beb440 Framework update. 2022-01-31 14:25:04 -08:00
stephb9959
15cdeb3578 Fixing https://telecominfraproject.atlassian.net/browse/WIFI-6811 2022-01-30 21:23:19 -08:00
stephb9959
1148705294 Fixing docker startup crash. 2022-01-30 21:00:25 -08:00
stephb9959
d0cd33af47 Extra logging 2022-01-30 20:26:22 -08:00
stephb9959
161758eca6 Extra logging 2022-01-30 20:24:21 -08:00
stephb9959
1cb4df113a Extra logging 2022-01-30 16:03:16 -08:00
stephb9959
8b1c053e7a Extra logging 2022-01-30 15:37:31 -08:00
stephb9959
f95f1dd501 Slight modification to default configuration initialization. 2022-01-30 12:49:00 -08:00
stephb9959
bdb4a218ee Slight modification to default configuration initialization. 2022-01-30 12:44:11 -08:00
stephb9959
970fabb604 Slight modification to default configuration initialization. 2022-01-30 12:33:11 -08:00
stephb9959
56e151481a Slight modification to default configuration initialization. 2022-01-30 12:29:50 -08:00
stephb9959
7e6e6c6884 Slight modification to default configuration initialization. 2022-01-30 12:24:10 -08:00
stephb9959
d977decd79 Changing startup for websocket connection and adding more logging... 2022-01-28 12:43:28 -08:00
stephb9959
876c50c916 Changing startup for websocket connection and adding more logging... 2022-01-28 10:37:41 -08:00
stephb9959
e3331a8fc2 Changing startup order... 2022-01-28 09:58:52 -08:00
stephb9959
39fa84e6ae Changing startup order... 2022-01-28 09:57:29 -08:00
stephb9959
037e3a01a4 Merge remote-tracking branch 'origin/master' 2022-01-28 09:38:06 -08:00
stephb9959
819d74c0d9 Changing startup order... 2022-01-28 09:37:57 -08:00
Dmitry Dunaev
4c753893c9 Merge pull request #77 from Telecominfraproject/feature/wifi-6837--chart-improvements
[WIFI-6837] Chg: modify readiness to make some envs optional, switch default helm service type to ClusterIP
2022-01-28 16:04:51 +03:00
Johann Hoffmann
037c82c689 Revert "Merge pull request #76 from Telecominfraproject/WIFI-6729-speed-up-image-build"
This reverts commit d3a6dc9161, reversing
changes made to 8f6e64e256.

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-01-28 12:47:53 +01:00
Dmitry Dunaev
88acbf449d [WIFI-6837] Chg: modify readiness to make some envs optional, switch default helm service type to ClusterIP
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-01-28 13:50:02 +03:00
stephb9959
aa13cfa41b Merge remote-tracking branch 'origin/master' 2022-01-27 21:56:01 -08:00
stephb9959
c1522b9b0d Improving parsing of illegal JSON State messages 2022-01-27 21:55:51 -08:00
Stephane Bourque
d3a6dc9161 Merge pull request #76 from Telecominfraproject/WIFI-6729-speed-up-image-build
[WIFI-6729] Speed up Docker image build time
2022-01-27 14:43:01 -08:00
stephb9959
8f6e64e256 Fixing command manager janitor. 2022-01-27 11:46:53 -08:00
stephb9959
69488bdac1 Fixing command manager 2022-01-27 10:22:57 -08:00
stephb9959
ba3ff1577d Fixing command manager 2022-01-27 10:20:46 -08:00
stephb9959
8aa9cf8449 Adding new WiFI Scan. 2022-01-27 09:52:55 -08:00
stephb9959
dabefb781a Command manager update. 2022-01-27 09:04:34 -08:00
stephb9959
c247344faa Framework update. 2022-01-26 23:17:07 -08:00
stephb9959
f3532141da Framework update. 2022-01-26 15:10:45 -08:00
stephb9959
e049e2e5c7 Framework update. 2022-01-24 22:16:43 -08:00
stephb9959
481f18cb29 Framework update. 2022-01-23 22:51:12 -08:00
stephb9959
b783158b23 Framework update. 2022-01-23 10:20:30 -08:00
stephb9959
f982ef10d1 Adding kafka logging in framework. 2022-01-22 23:24:43 -08:00
stephb9959
6047364525 Adding kafka logging in framework. 2022-01-22 23:21:01 -08:00
stephb9959
0594f3310e Adding kafka logging in framework. 2022-01-22 23:14:36 -08:00
stephb9959
f888018a0b Adding kafka logging in framework. 2022-01-22 23:11:47 -08:00
stephb9959
54e308d3c5 Adding kafka logging in framework. 2022-01-22 23:07:15 -08:00
stephb9959
687b0a95a6 Adding kafka logging in framework. 2022-01-22 10:46:30 -08:00
stephb9959
5abfa205c9 Adding kafka logging in framework. 2022-01-22 10:43:06 -08:00
stephb9959
eb029b7b09 Adding kafka logging in framework. 2022-01-22 10:39:46 -08:00
stephb9959
92218e764c Adding kafka logging in framework. 2022-01-22 10:37:44 -08:00
stephb9959
66b75b8d9b Adding kafka logging in framework. 2022-01-22 10:27:47 -08:00
stephb9959
bfd76cd6be Adding kafka logging in framework. 2022-01-22 10:26:34 -08:00
stephb9959
3cf7609092 Adding kafka logging in framework. 2022-01-22 10:25:07 -08:00
Johann Hoffmann
cb61821f7b Re-structure Dockerfile and use Github Actions cache when building image
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-01-21 17:11:10 +01:00
stephb9959
86ec85ebd8 Merge remote-tracking branch 'origin/master' 2022-01-20 22:51:45 -08:00
stephb9959
ba8b02e630 Adding kafka logging in framework. 2022-01-20 22:51:37 -08:00
Dmitry Dunaev
ce26e48773 [WIFI-6752] Add: archiving for the database
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-01-20 12:41:10 +03:00
stephb9959
cc04b861ac OUI Server improvements. 2022-01-18 11:42:25 -08:00
stephb9959
3277451e8e OUI Server improvements. 2022-01-18 11:39:31 -08:00
stephb9959
eb5a5563c0 OUI Server improvements. 2022-01-18 11:37:25 -08:00
stephb9959
5f09b47b68 OUI Server improvements. 2022-01-18 11:19:23 -08:00
stephb9959
e2ad19c670 OUI Server improvements. 2022-01-18 11:11:28 -08:00
stephb9959
ee6273c248 Removing LifeTimeStats due to change in AP reporting. 2022-01-18 11:10:25 -08:00
stephb9959
c9f211439e Removing LifeTimeStats due to change in AP reporting. 2022-01-18 11:06:35 -08:00
stephb9959
f656296a9a Removing LifeTimeStats due to change in AP reporting. 2022-01-18 11:05:11 -08:00
stephb9959
764f3f3bef Removing LifeTimeStats due to change in AP reporting. 2022-01-18 09:49:50 -08:00
stephb9959
36dce2112b Telemetry fix 2022-01-18 00:00:43 -08:00
stephb9959
24709e45a6 Telemetry fix 2022-01-17 23:51:46 -08:00
stephb9959
a3dba734d3 Telemetry fix 2022-01-17 23:46:32 -08:00
stephb9959
07e2231763 Telemetry fix 2022-01-17 23:42:02 -08:00
stephb9959
0ba7a03bd5 Telemetry fix 2022-01-17 23:36:57 -08:00
stephb9959
39901ed547 Transition from counters -> deltas. 2022-01-17 23:28:55 -08:00
stephb9959
d9d03fe111 Transition from counters -> deltas. 2022-01-17 23:23:17 -08:00
stephb9959
1999838420 Transition from counters -> deltas. 2022-01-17 23:08:42 -08:00
stephb9959
05fa6a5806 Transition from counters -> deltas. 2022-01-17 23:03:39 -08:00
stephb9959
398bf0a94f Transition from counters -> deltas. 2022-01-17 22:08:17 -08:00
stephb9959
04a15eb629 Transition from counters -> deltas. 2022-01-17 22:04:44 -08:00
stephb9959
e84582a0d5 Merge remote-tracking branch 'origin/master' 2022-01-17 15:11:07 -08:00
stephb9959
b61a35d70d Transition from counters -> deltas. 2022-01-17 15:10:59 -08:00
Stephane Bourque
34304c2b80 Merge pull request #74 from Telecominfraproject/WIFI-5775-test-sdk-on-pr
[WIFI-5775] Run SDK tests on a PR level
2022-01-17 08:39:14 -08:00
Johann Hoffmann
d5ca25a3da Remove ref since PR was merged
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-01-17 17:38:45 +01:00
Johann Hoffmann
7f196193cc Pass versions as one JSON string
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-01-17 17:38:24 +01:00
Johann Hoffmann
b5ddcef66a Use trigger-workflow-and-wait composite action
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-01-17 17:38:24 +01:00
Johann Hoffmann
0b61d0f943 Adapt logging configuration to newest changes
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-01-17 11:51:10 +01:00
Dmitry Dunaev
e2e75c3223 Merge pull request #73 from Telecominfraproject/feature/wifi-6393--add-wait-kafka-initcontainer
[WIFI-6393] Add: initContainer to wait for Kafka to be ready
2022-01-13 12:18:02 +03:00
Dmitry Dunaev
457802c56d [WIFI-6393] Add: initContainer to wait for Kafka to be ready
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-01-12 11:24:11 +03:00
stephb9959
88b13a8d0c Framework update 2022-01-11 23:17:16 -08:00
stephb9959
8c22f3576b Framework update 2022-01-10 22:42:53 -08:00
stephb9959
4c392361a9 Framework update 2022-01-10 14:21:47 -08:00
stephb9959
021ba4963b Framework update 2022-01-10 12:27:21 -08:00
stephb9959
d9868d47f7 Adding ThreadPool naming for debugging. 2022-01-10 09:01:34 -08:00
stephb9959
c2d2955538 Removing superfluous log messages. 2022-01-10 08:51:13 -08:00
stephb9959
1f20e12a56 Removing superfluous log messages. 2022-01-10 08:17:49 -08:00
stephb9959
3d733b861b Removing superfluous log messages. 2022-01-10 08:08:50 -08:00
stephb9959
333d20365d Removing superfluous log messages. 2022-01-09 23:24:26 -08:00
stephb9959
f3b00cd5c9 Removing superfluous log messages. 2022-01-09 23:21:37 -08:00
stephb9959
7b85d617aa Enabling new logging format. 2022-01-09 22:30:55 -08:00
stephb9959
9eb3b67064 Adding Kafka telemetry 2022-01-09 22:06:24 -08:00
stephb9959
4ed12d1f5b Adding Kafka telemetry 2022-01-09 21:44:52 -08:00
stephb9959
d2ede19e4a Adding Kafka telemetry 2022-01-09 21:35:42 -08:00
stephb9959
de028b8dc0 Adding Kafka telemetry 2022-01-09 21:23:35 -08:00
stephb9959
4ebd8b451b Adding Kafka telemetry 2022-01-09 21:21:29 -08:00
stephb9959
7889017579 Adding Kafka telemetry 2022-01-09 21:16:46 -08:00
stephb9959
7fb9c8c675 Adding Kafka telemetry 2022-01-09 21:12:26 -08:00
stephb9959
268c542602 Adding Kafka telemetry 2022-01-09 21:07:11 -08:00
stephb9959
01bf9ed000 Adding Kafka telemetry 2022-01-09 21:00:22 -08:00
stephb9959
00e1d15203 Adding Kafka telemetry 2022-01-09 20:50:01 -08:00
stephb9959
21bdeab870 Adding Kafka telemetry 2022-01-09 16:14:11 -08:00
stephb9959
467261b9ca Adding thread naming. 2022-01-09 09:58:12 -08:00
stephb9959
ae336478c0 Adding thread naming. 2022-01-09 09:35:47 -08:00
stephb9959
1479f8bde2 Adding thread naming. 2022-01-09 00:09:36 -08:00
stephb9959
10359d5de4 Adding thread naming. 2022-01-08 23:59:21 -08:00
stephb9959
fff323aee4 Adding thread naming. 2022-01-08 23:53:59 -08:00
stephb9959
9c87371535 Adding thread naming. 2022-01-08 23:43:43 -08:00
stephb9959
7ca1a0c6a9 Adding safer command execution code. 2022-01-08 22:11:04 -08:00
stephb9959
2238ba3c64 Adding safer command execution code. 2022-01-08 22:06:42 -08:00
stephb9959
4d3f0ee4d6 Adding PING command 2022-01-08 21:31:59 -08:00
stephb9959
2ea9c98b7b Adding PING command and execution time for RPC. 2022-01-08 21:28:07 -08:00
stephb9959
b6da3cb016 Adding PING command and execution time for RPC. 2022-01-08 21:15:15 -08:00
stephb9959
b841bdb6ca Adding PING command and execution time for RPC. 2022-01-08 21:13:05 -08:00
stephb9959
70978f577f Adding PING command and execution time for RPC. 2022-01-08 21:11:09 -08:00
stephb9959
846d55417f Adding PING command and execution time for RPC. 2022-01-08 21:07:05 -08:00
stephb9959
e3884ba062 Adding PING command and execution time for RPC. 2022-01-08 15:41:26 -08:00
stephb9959
0bf0186e50 Adding PING command and execution time for RPC. 2022-01-08 15:33:10 -08:00
stephb9959
1d0a0a0bd0 Changing RPC Command execution. 2022-01-08 10:33:11 -08:00
stephb9959
41f3f08432 Changing RPC Command execution. 2022-01-08 10:26:11 -08:00
stephb9959
e9403d878d Changing RPC Command execution. 2022-01-08 10:20:05 -08:00
stephb9959
d555600c75 Adding FIFO for telemetry 2022-01-06 22:24:30 -08:00
stephb9959
e18b57857d Adding FIFO for telemetry 2022-01-06 21:18:02 -08:00
stephb9959
7eb8d0d971 Adding FIFO for telemetry 2022-01-06 21:15:58 -08:00
stephb9959
865759f0dd Adding FIFO for telemetry 2022-01-06 21:05:42 -08:00
stephb9959
055549290b Adding FIFO for telemetry 2022-01-06 21:00:09 -08:00
stephb9959
ca702a172e Adding FIFO for telemetry 2022-01-06 13:29:33 -08:00
stephb9959
f4e8ef10a9 Adding FIFO for telemetry 2022-01-06 13:25:56 -08:00
stephb9959
7adc77d881 Adding FIFO for telemetry 2022-01-06 13:19:46 -08:00
stephb9959
a64e0418f9 Adding FIFO for telemetry 2022-01-06 12:03:51 -08:00
stephb9959
0b1d66c413 Adding FIFO for telemetry 2022-01-06 11:51:09 -08:00
stephb9959
1aafde15b4 ORM Update 2022-01-06 09:43:11 -08:00
stephb9959
03f0af07c8 Fixing typo 2022-01-05 22:23:05 -08:00
stephb9959
fa9eafc33b Fix for https://telecominfraproject.atlassian.net/browse/WIFI-6198 2022-01-04 18:01:02 -08:00
stephb9959
09fb78765c Fix for https://telecominfraproject.atlassian.net/browse/WIFI-6198 2022-01-04 09:06:18 -08:00
stephb9959
e7bfb960dc Fix for https://telecominfraproject.atlassian.net/browse/WIFI-6206 2022-01-04 08:55:44 -08:00
stephb9959
5e95f4eb67 Fix for https://telecominfraproject.atlassian.net/browse/WIFI-5992 2022-01-04 08:45:06 -08:00
stephb9959
eaaa8dbc15 Merge remote-tracking branch 'origin/master' 2022-01-04 08:32:57 -08:00
stephb9959
e93ce14f6e Framework update 2022-01-04 08:32:48 -08:00
Dmitry Dunaev
7c06be78fb Merge pull request #72 from Telecominfraproject/feature/wifi-6183--cli-review
[WIFI-6183] Chg: cli review and usage enhancement
2022-01-04 14:46:45 +03:00
Johann Hoffmann
b97da20446 Add curl cli script to Docker image
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2022-01-04 11:32:17 +01:00
Dmitry Dunaev
d7c17fbab1 [WIFI-6183] Chg: cli review and usage enhancement
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2022-01-03 15:48:44 +03:00
Dmitry Dunaev
68789fe9de Merge pull request #71 from Telecominfraproject/feature/wifi-4977--introduce-revisionHistoryLimit
[WIFI-4977] Add: helm add revisionHistoryLimit support
2021-12-23 16:27:11 +03:00
Dmitry Dunaev
724beb607c [WIFI-4977] Add: helm add revisionHistoryLimit support
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2021-12-23 16:08:25 +03:00
stephb9959
3ba845cf06 Framework update 2021-12-22 21:57:19 -08:00
stephb9959
4f6deba793 Framework update 2021-12-21 21:47:21 -08:00
stephb9959
ba1e735290 Framework update 2021-12-20 22:34:01 -08:00
stephb9959
be8877d346 Framework update 2021-12-20 22:30:07 -08:00
stephb9959
5922727336 Framework update 2021-12-20 22:26:35 -08:00
stephb9959
6f5902b3f0 Merge remote-tracking branch 'origin/master' 2021-12-20 22:10:42 -08:00
stephb9959
9c37930c99 Framework update 2021-12-20 22:10:34 -08:00
Johann Hoffmann
87ada37a76 [WIFI-6170] Add OpenWifi Docker Compose deployment with PostgreSQL (#70)
* Add wait-for-postgres.sh wrapper script

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>

* Copy wait-for-postgres.sh into Docker image

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-12-16 17:21:12 +01:00
stephb9959
c082910438 Merge remote-tracking branch 'origin/master' 2021-12-13 07:59:40 -08:00
stephb9959
777d67a649 Framework update 2021-12-13 07:59:32 -08:00
Johann Hoffmann
563032eecc Add config property to templating mechanism
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-12-13 16:46:27 +01:00
stephb9959
88dd85cf26 Framework update 2021-12-12 19:06:52 -08:00
stephb9959
33c7da572e Framework update 2021-12-11 23:25:36 -08:00
stephb9959
d8bfa28a21 Framework update 2021-12-10 13:17:20 -08:00
stephb9959
09f482a3d4 Framework update 2021-12-07 20:38:46 -08:00
stephb9959
93e09cc2dd Unitialied counters in healthcheck. 2021-12-07 10:28:42 -08:00
stephb9959
a71adc417c Build number fix 2021-12-07 08:51:09 -08:00
Dmitry Dunaev
0dae09ac9a Add: .git dir to build image to expose git hash for version
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2021-12-07 14:05:58 +03:00
stephb9959
771bd51be7 Add git hash 2021-12-06 08:00:22 -08:00
stephb9959
7d5d6177d2 Adding "completeInfo" on device get and list. 2021-12-06 06:30:02 -08:00
stephb9959
0530a4c03f Adding "completeInfo" on device get and list. 2021-12-06 06:17:27 -08:00
stephb9959
6eead07d1c Adding "completeInfo" on device get and list. 2021-12-06 06:11:01 -08:00
stephb9959
c7452aeeb9 Merge remote-tracking branch 'origin/master' 2021-12-06 06:05:30 -08:00
stephb9959
669638a4e3 Adding "completeInfo" on device get and list. 2021-12-06 06:05:21 -08:00
Dmitry Dunaev
d2bfc38736 [WIFI-5840] Chg: failureThreshold for readiness_check up to 3 2021-12-06 15:18:32 +03:00
stephb9959
58a1740294 Adding "completeInfo" on device get and list. 2021-12-05 23:05:41 -08:00
stephb9959
c00effc8bc Adding "completeInfo" on device get and list. 2021-12-05 22:54:33 -08:00
stephb9959
8b22611142 Adding "completeInfo" on device get. 2021-12-05 22:36:46 -08:00
stephb9959
6a4bbc3362 Adding "completeInfo" on device get. 2021-12-05 22:32:13 -08:00
stephb9959
88867aea73 Fixing OWLS security hole. 2021-12-02 10:17:52 -08:00
stephb9959
d7ece096ac Assigning proper names. 2021-12-02 08:59:15 -08:00
stephb9959
227114f247 Adding image library 2021-12-01 20:29:09 -08:00
stephb9959
8b2741d624 Merge remote-tracking branch 'origin/master' 2021-11-30 23:40:40 -08:00
stephb9959
2e18694e40 Improving build instructions. 2021-11-30 23:40:11 -08:00
Stephane Bourque
1715703c4e Merge pull request #68 from Telecominfraproject/WIFI-5775-test-sdk-on-pr
[WIFI-5775] Run SDK tests on a PR level
2021-11-30 20:57:08 -08:00
stephb9959
a5e7c1dc8a Framework update 2021-11-30 20:46:04 -08:00
stephb9959
5f325e75d5 Framework update 2021-11-30 20:15:43 -08:00
stephb9959
49aeddb186 Framework update 2021-11-30 10:27:04 -08:00
stephb9959
5413e2cdf3 Merge remote-tracking branch 'origin/master' 2021-11-29 15:55:06 -08:00
stephb9959
2190652029 Adding proper status report when a device is not connected. 2021-11-29 15:54:55 -08:00
Johann Hoffmann
77229ee248 Switch to trigger-workflow-and-wait Community action
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-29 14:28:40 +01:00
Johann Hoffmann
9db7fea7cd Revert "Merge pull request #67 from Telecominfraproject/WIFI-5775-test-sdk-on-pr"
This reverts commit 65811c5e7f, reversing
changes made to e70303f986.
2021-11-29 13:38:03 +01:00
Stephane Bourque
65811c5e7f Merge pull request #67 from Telecominfraproject/WIFI-5775-test-sdk-on-pr
Test trigger of wlan-testing workflow
2021-11-28 08:29:37 -08:00
stephb9959
e70303f986 Initial commit of dependent files for rtty built-in server 2021-11-27 21:27:47 -08:00
stephb9959
b55b0a23d7 Removing RTTY debug logs. 2021-11-27 21:13:36 -08:00
stephb9959
f66a2d0bdc Removing RTTY debug logs. 2021-11-27 21:07:27 -08:00
stephb9959
200f0cbe79 Removing RTTY debug logs. 2021-11-27 20:57:00 -08:00
stephb9959
2d833c33d3 Support both internal and external rttys 2021-11-27 20:53:21 -08:00
stephb9959
9d7afe9fa4 Support both internal and external rttys 2021-11-27 20:50:25 -08:00
stephb9959
42bc5321aa Support both internal and external rttys 2021-11-27 20:37:55 -08:00
stephb9959
dabfb9b949 Support both internal and external rttys 2021-11-27 20:29:19 -08:00
stephb9959
f344a23f3a Support both internal and external rttys 2021-11-27 17:58:57 -08:00
stephb9959
0c83ed528a Support both internal and external rttys 2021-11-27 17:30:40 -08:00
stephb9959
bdf37c7f8a Support both internal and external rttys 2021-11-27 17:19:22 -08:00
stephb9959
fff91dd572 Support both internal and external rttys 2021-11-27 17:15:48 -08:00
stephb9959
2a7ce8c297 Support both internal and external rttys 2021-11-27 17:12:47 -08:00
stephb9959
5a17f7e727 Support both internal and external rttys 2021-11-27 17:06:09 -08:00
stephb9959
a25e456b8b Support both internal and external rttys 2021-11-27 16:47:16 -08:00
stephb9959
7d68dd40c3 Support both internal and external rttys 2021-11-27 16:40:31 -08:00
stephb9959
5784a6297b Support both internal and external rttys 2021-11-27 13:26:34 -08:00
stephb9959
b6b3fbaac9 Support both internal and external rttys 2021-11-27 13:19:42 -08:00
stephb9959
617d018252 Support both internal and external rttys 2021-11-27 13:06:07 -08:00
stephb9959
a1e4019ee8 Support both internal and external rttys 2021-11-27 11:43:14 -08:00
stephb9959
11a63628b3 Support both internal and external rttys 2021-11-27 11:41:05 -08:00
stephb9959
49f523d831 Support both internal and external rttys 2021-11-27 11:17:25 -08:00
stephb9959
7ac0866f4c Support both internal and external rttys 2021-11-27 11:15:20 -08:00
stephb9959
6ae29a7b5f Support both internal and external rttys 2021-11-27 11:12:10 -08:00
stephb9959
d88fe4eea3 Support both internal and external rttys 2021-11-27 11:07:36 -08:00
stephb9959
89a5a0efc9 Support both internal and external rttys 2021-11-27 11:03:41 -08:00
stephb9959
6f6e365393 Support both internal and external rttys 2021-11-27 10:53:10 -08:00
stephb9959
d56acf1ffe Support both internal and external rttys 2021-11-27 10:35:31 -08:00
stephb9959
a10ce9f304 Support both internal and external rttys 2021-11-27 10:32:52 -08:00
stephb9959
d40e926971 Support both internal and external rttys 2021-11-27 10:28:21 -08:00
stephb9959
e96f222c45 Support both internal and external rttys 2021-11-27 10:01:34 -08:00
stephb9959
30fc21e6cb Support both internal and external rttys 2021-11-27 09:46:12 -08:00
stephb9959
deea40cbc4 Support both internal and external rttys 2021-11-27 09:27:49 -08:00
stephb9959
9a36ad60e1 Support both internal and external rttys 2021-11-27 09:23:40 -08:00
stephb9959
53cea05c95 Support both internal and external rttys 2021-11-27 09:18:56 -08:00
stephb9959
9b96b88de2 Support both internal and external rttys 2021-11-27 09:11:22 -08:00
stephb9959
2cc70a6af1 Support both internal and external rttys 2021-11-27 09:00:19 -08:00
stephb9959
f6653cf818 Support both internal and external rttys 2021-11-27 08:56:43 -08:00
stephb9959
127fe2100c Support both internal and external rttys 2021-11-27 08:50:41 -08:00
stephb9959
3645718352 Support both internal and external rttys 2021-11-27 08:45:17 -08:00
stephb9959
724ae46752 Support both internal and external rttys 2021-11-27 08:42:31 -08:00
stephb9959
70ff02fea2 Support both internal and external rttys 2021-11-27 08:35:05 -08:00
stephb9959
5d6ed11cd9 Support both internal and external rttys 2021-11-27 08:30:59 -08:00
stephb9959
23f6b34fe9 Support both internal and external rttys 2021-11-27 08:19:43 -08:00
stephb9959
a864502c3e Support both internal and external rttys 2021-11-26 23:56:14 -08:00
stephb9959
33ba38938c Support both internal and external rttys 2021-11-26 23:48:52 -08:00
stephb9959
9f65476795 Support both internal and external rttys 2021-11-26 23:44:16 -08:00
stephb9959
712459e5eb Support both internal and external rttys 2021-11-26 23:39:35 -08:00
stephb9959
68e4df6de3 Support both internal and external rttys 2021-11-26 23:21:51 -08:00
stephb9959
4a49ed347c Support both internal and external rttys 2021-11-26 23:20:02 -08:00
stephb9959
5a8ac97d9a Support both internal and external rttys 2021-11-26 23:10:35 -08:00
stephb9959
1ac3fb2f44 Support both internal and external rttys 2021-11-26 22:57:05 -08:00
stephb9959
88cd05b629 Support both internal and external rttys 2021-11-26 22:55:25 -08:00
stephb9959
c74efb0287 Support both internal and external rttys 2021-11-26 22:38:47 -08:00
stephb9959
5e8b23cbeb Support both internal and external rttys 2021-11-26 22:35:12 -08:00
stephb9959
e47c9ea07a Support both internal and external rttys 2021-11-26 22:23:12 -08:00
stephb9959
4a4ed2039b Support both internal and external rttys 2021-11-26 22:19:56 -08:00
stephb9959
e65987dd8f Support both internal and external rttys 2021-11-26 22:05:35 -08:00
stephb9959
d07608c7a1 Support both internal and external rttys 2021-11-26 19:54:42 -08:00
stephb9959
4b49e0d4b1 Support both internal and external rttys 2021-11-26 18:55:42 -08:00
stephb9959
9f21328d55 Support both internal and external rttys 2021-11-26 16:00:02 -08:00
stephb9959
eed4263076 Support both internal and external rttys 2021-11-26 15:25:47 -08:00
stephb9959
3e84e8fde5 Support both internal and external rttys 2021-11-26 15:23:53 -08:00
stephb9959
fc28bcffd2 Support both internal and external rttys 2021-11-26 14:56:54 -08:00
stephb9959
dae71c0ca9 Support both internal and external rttys 2021-11-26 14:56:13 -08:00
stephb9959
78d2f16e4e Support both internal and external rttys 2021-11-26 14:52:26 -08:00
Johann Hoffmann
a61962d1ff Switch to latest version
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-26 13:01:15 +01:00
Johann Hoffmann
36a5f9bcdd Fix input names
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-26 12:29:09 +01:00
Johann Hoffmann
c09d65b25d Add branch input
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-26 11:53:56 +01:00
stephb9959
ecc39b6a6f srtty 2021-11-26 00:02:52 -08:00
stephb9959
b0947c973d srtty 2021-11-25 23:58:48 -08:00
stephb9959
328bec9948 srtty 2021-11-25 23:43:58 -08:00
stephb9959
4920f293f5 srtty 2021-11-25 23:40:34 -08:00
stephb9959
9e4af88bc3 srtty 2021-11-25 22:35:54 -08:00
stephb9959
063ceada41 srtty 2021-11-25 22:21:01 -08:00
stephb9959
4749345f49 srtty 2021-11-25 22:08:40 -08:00
stephb9959
14dc41b8ce srtty 2021-11-25 21:42:58 -08:00
stephb9959
48a56c7802 srtty 2021-11-25 21:38:40 -08:00
stephb9959
e8fb42644d srtty 2021-11-25 21:30:47 -08:00
stephb9959
3e663de7fa srtty 2021-11-25 21:11:44 -08:00
stephb9959
409c0e1f90 srtty 2021-11-25 21:07:27 -08:00
stephb9959
1a67850aec srtty 2021-11-25 20:15:33 -08:00
stephb9959
3bb67b3a62 srtty 2021-11-25 20:13:57 -08:00
stephb9959
a864b8170d srtty 2021-11-25 19:58:14 -08:00
stephb9959
72b3b0c119 srtty 2021-11-25 19:55:29 -08:00
stephb9959
8039243cb3 srtty 2021-11-25 19:51:30 -08:00
stephb9959
a90e89b16b srtty 2021-11-25 19:46:38 -08:00
stephb9959
1742535a71 srtty 2021-11-25 19:30:37 -08:00
stephb9959
b96c4f74ec srtty 2021-11-25 17:24:10 -08:00
stephb9959
f224097c17 srtty 2021-11-25 17:09:08 -08:00
stephb9959
2815f2c3a2 srtty 2021-11-25 17:07:35 -08:00
stephb9959
43b933bc39 srtty 2021-11-25 17:01:02 -08:00
stephb9959
0e169a92eb srtty 2021-11-25 16:23:05 -08:00
stephb9959
73a9802ed9 srtty 2021-11-25 16:05:46 -08:00
stephb9959
b760b6451c srtty 2021-11-25 15:55:24 -08:00
stephb9959
73c317ce49 srtty 2021-11-25 13:52:06 -08:00
stephb9959
9ad45b0f73 srtty 2021-11-25 13:45:50 -08:00
stephb9959
bd27d4403f srtty 2021-11-25 13:24:45 -08:00
stephb9959
b676310e4b srtty 2021-11-25 13:12:42 -08:00
stephb9959
69d41fd14d srtty 2021-11-25 13:10:23 -08:00
stephb9959
46ad6c0933 srtty 2021-11-25 13:01:45 -08:00
stephb9959
b5b97adbed srtty 2021-11-25 12:49:39 -08:00
stephb9959
527897fe5b srtty 2021-11-25 12:06:20 -08:00
stephb9959
5f58594f1c srtty 2021-11-25 12:03:38 -08:00
stephb9959
7f7326e876 srtty 2021-11-25 11:56:37 -08:00
stephb9959
fda7b14a62 srtty 2021-11-25 11:52:24 -08:00
stephb9959
04b2ee926c srtty 2021-11-25 11:47:26 -08:00
stephb9959
e4aca1a137 srtty 2021-11-25 11:44:07 -08:00
stephb9959
4af688de77 srtty 2021-11-25 11:38:17 -08:00
stephb9959
7c20f22f46 srtty 2021-11-25 11:18:56 -08:00
stephb9959
d7171daaa7 srtty 2021-11-25 11:10:34 -08:00
stephb9959
3a5c406f1c srtty 2021-11-25 11:01:54 -08:00
stephb9959
5643d237fd srtty 2021-11-25 10:52:40 -08:00
stephb9959
cec893466e srtty 2021-11-25 10:35:14 -08:00
stephb9959
f390075e92 srtty 2021-11-25 10:25:19 -08:00
stephb9959
c4d47a0ebf srtty 2021-11-25 10:24:38 -08:00
stephb9959
ab75abfef4 srtty 2021-11-25 10:01:56 -08:00
stephb9959
714d8fc857 Perform Device Existence check before accepting commands. 2021-11-25 09:15:28 -08:00
stephb9959
c1ca8421b5 Perform Device Existence check before accepting commands. 2021-11-25 09:08:15 -08:00
stephb9959
6d9c5eae46 Perform Device Existence check before accepting commands. 2021-11-25 08:40:42 -08:00
stephb9959
d64032785a Perform Device Existence check before accepting commands. 2021-11-25 08:32:31 -08:00
stephb9959
9865e19385 Perform Device Existence check before accepting commands. 2021-11-25 08:04:21 -08:00
Johann Hoffmann
f88ac7711f Add required input
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-25 17:03:58 +01:00
Johann Hoffmann
d91c7e61be Remove input
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-25 17:01:39 +01:00
Johann Hoffmann
d02fff040b Test another community Github action
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-25 16:59:48 +01:00
Johann Hoffmann
1fb4d0d633 Fix input names
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-25 16:29:44 +01:00
Johann Hoffmann
81d76536fb Test dispatch-and-wait community Github Action
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-25 16:27:06 +01:00
stephb9959
36e4e36188 RTTYS fixes 2021-11-24 23:33:50 -08:00
stephb9959
b3f3c87f7e RTTYS fixes 2021-11-24 23:20:05 -08:00
stephb9959
599c8787c3 RTTYS fixes 2021-11-24 23:11:37 -08:00
stephb9959
ba4edde793 RTTYS fixes 2021-11-24 22:56:46 -08:00
stephb9959
66680636f3 RTTYS fixes 2021-11-24 22:46:20 -08:00
stephb9959
cdd29fa6e2 RTTYS fixes 2021-11-24 22:45:24 -08:00
stephb9959
f4e5b4b0ed RTTYS fixes 2021-11-24 22:34:15 -08:00
stephb9959
d9bba781d4 RTTYS fixes 2021-11-24 21:42:38 -08:00
stephb9959
ded5c3c0f5 RTTYS fixes 2021-11-24 21:36:15 -08:00
stephb9959
093e92fbb6 RTTYS fixes 2021-11-24 21:27:21 -08:00
stephb9959
6fd6941860 RTTYS fixes 2021-11-24 21:22:53 -08:00
stephb9959
f46337a35e RTTYS fixes 2021-11-24 21:12:32 -08:00
stephb9959
8c9332c109 RTTYS fixes 2021-11-24 21:04:20 -08:00
stephb9959
4902bb2583 RTTYS fixes 2021-11-24 20:52:20 -08:00
stephb9959
933cf82a41 RTTYS fixes 2021-11-24 20:47:55 -08:00
stephb9959
3e828ac11f RTTYS fixes 2021-11-24 20:30:13 -08:00
stephb9959
0929851ed8 fixing OUIserver startup. 2021-11-24 20:16:56 -08:00
stephb9959
d7c08f1068 fixing OUIserver startup. 2021-11-24 19:54:52 -08:00
stephb9959
b656c59962 fixing OUIserver startup. 2021-11-24 19:43:25 -08:00
stephb9959
3356dbb2e3 fixing OUIserver startup. 2021-11-24 19:40:16 -08:00
stephb9959
ca87dcb9a1 rttys v1 2021-11-24 10:04:05 -08:00
stephb9959
07ffc5e8b5 rttys v1 2021-11-24 09:34:21 -08:00
stephb9959
14fa2e3543 rttys v1 2021-11-24 09:26:50 -08:00
stephb9959
38934cdfc2 rttys v1 2021-11-24 09:25:33 -08:00
stephb9959
43d1574fdc rttys v1 2021-11-24 09:11:17 -08:00
stephb9959
d40567b7ff rttys v1 2021-11-24 09:10:31 -08:00
stephb9959
5e9a631789 rttys v1 2021-11-24 09:07:51 -08:00
Johann Hoffmann
6859a90fa1 Fix variable syntax
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-24 16:11:49 +01:00
Johann Hoffmann
769438a383 Re-add job condition
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-24 15:59:44 +01:00
Johann Hoffmann
34385c5ab6 Test manual repository dispatch API call
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-24 15:55:02 +01:00
Johann Hoffmann
b082617924 Dummy commit to test PR workflow run
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-23 17:49:35 +01:00
stephb9959
356e97b856 Optimizing websocket connect. 2021-11-22 23:05:29 -08:00
stephb9959
e50a1efb86 Improving performance with less DB calls. 2021-11-22 22:34:44 -08:00
stephb9959
ed3355eea7 Adding blacklist cache. 2021-11-22 22:13:02 -08:00
stephb9959
9ae63a8c7e Adding blacklist cache. 2021-11-22 22:11:04 -08:00
stephb9959
5c89d08669 Fixing capabilities on first contact. 2021-11-22 19:56:37 -08:00
stephb9959
068934eaa3 Improving Capabilities Insert call. 2021-11-22 15:57:14 -08:00
stephb9959
f75f6d5844 Improving Capabilities Insert call. 2021-11-22 14:19:58 -08:00
stephb9959
32fdd0f1a9 Added kafka message about deleting a device. 2021-11-21 23:37:25 -08:00
stephb9959
04141c3e4d Adding radio regulatory auto setup. 2021-11-21 09:30:20 -08:00
stephb9959
4b3654b05e Adding find IP. 2021-11-21 00:25:48 -08:00
stephb9959
2b9f9e16ae Adding find IP. 2021-11-21 00:23:07 -08:00
stephb9959
c08d06c3c3 Adding find IP. 2021-11-21 00:19:45 -08:00
stephb9959
e47979ed6d Adding find IP. 2021-11-21 00:11:15 -08:00
stephb9959
563e84aede Adding find IP. 2021-11-21 00:04:25 -08:00
stephb9959
380f1df811 Addressing mesh nodes appearing as disconnected after a perdio of time while they are still connected. 2021-11-20 22:07:23 -08:00
stephb9959
4419af1e0f Merge remote-tracking branch 'origin/master' 2021-11-20 21:40:05 -08:00
stephb9959
629b53c4e9 Addressing mesh nodes appearing as disconnected after a perdio of time while they are still connected. 2021-11-20 21:39:56 -08:00
Stephane Bourque
2cbab49c87 Merge pull request #65 from Telecominfraproject/WIFI-5775-pr-sdk-tests
[WIFI-5775] Run SDK tests on a PR level
2021-11-19 11:53:37 -08:00
stephb9959
d064b7c889 Detecting duplicate names. 2021-11-19 10:42:53 -08:00
stephb9959
80b6391e75 Detecting duplicate names. 2021-11-19 10:30:25 -08:00
stephb9959
82441dc289 Fixing LOG statements for SQL exceptions. 2021-11-19 10:13:35 -08:00
stephb9959
4cbfe039fc Fixing default configuration validation. 2021-11-19 09:47:30 -08:00
stephb9959
bfca4ccd6f Fixing default configuration validation. 2021-11-19 09:19:57 -08:00
stephb9959
b540172e0b Fixing default configuration validation. 2021-11-19 09:12:23 -08:00
stephb9959
5361ab05a3 Merge remote-tracking branch 'origin/master' 2021-11-19 09:10:34 -08:00
stephb9959
8e169067d2 Fixing default configuration validation. 2021-11-19 09:10:25 -08:00
Dmitry Dunaev
59fd796458 [WIFI-4860] Chg: switch enforce-jira-issue-key to composite action 2021-11-19 16:22:37 +03:00
Dmitry Dunaev
fa6c227d04 Merge pull request #64 from Telecominfraproject/feature/wifi-4860--add-ensure-jira-issue-key-workflow
[WIFI-4860] Add: enforce-jira-issue-key workflow
2021-11-19 15:50:12 +03:00
Dmitry Dunaev
001fcd311d Merge pull request #63 from Telecominfraproject/feature/wifi-5420--add-sysctl-context
[WIFI-5420] Add: support for unsafe sysctls with psp
2021-11-19 14:27:36 +03:00
Dmitry Dunaev
e9d3cc8796 [WIFI-4860] Add: enforce-jira-issue-key workflow
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2021-11-19 13:18:19 +03:00
Dmitry Dunaev
f639ea9b39 Merge branch 'master' into feature/wifi-5420--add-sysctl-context
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2021-11-19 12:48:51 +03:00
stephb9959
20201d366b Adding "leep redirector" to firmware upgrade. 2021-11-18 21:26:51 -08:00
stephb9959
a4db631031 Adding proper capabilities/platform cache. 2021-11-18 20:42:37 -08:00
stephb9959
963dabbb14 Adding proper capabilities/platform cache. 2021-11-18 20:40:07 -08:00
stephb9959
4f944cc0af Adding proper capabilities/platform cache. 2021-11-18 20:19:26 -08:00
Johann Hoffmann
b413368c6c Trigger testing with Docker Compose deployment
Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
2021-11-18 15:38:49 +01:00
Dmitry Dunaev
87b054f98d [WIFI-5420] Add: support for unsafe sysctls with psp 2021-11-18 12:34:55 +03:00
stephb9959
b8c0f95bc5 Adding proper capabilities/platform cache. 2021-11-17 23:09:28 -08:00
stephb9959
c192b90caa Adding proper capabilities/platform cache. 2021-11-17 22:56:27 -08:00
stephb9959
0f3a8810cf Fixing DB offset/limit computation. 2021-11-17 15:49:57 -08:00
stephb9959
a2d483eff3 Fixing DB offset/limit computation. 2021-11-17 15:41:31 -08:00
stephb9959
bd09e72707 Framework update. 2021-11-17 15:29:01 -08:00
stephb9959
9b1d184be9 Framework update. 2021-11-17 15:27:10 -08:00
stephb9959
d25bc2c6a3 Framework update. 2021-11-17 13:56:10 -08:00
stephb9959
b02f54badc Framework update. 2021-11-17 07:50:34 -08:00
stephb9959
23b3e9b279 New UUIDv4 Generator 2021-11-16 22:15:18 -08:00
200 changed files with 9442 additions and 5662 deletions

View File

@@ -25,105 +25,44 @@ jobs:
DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
DOCKER_REGISTRY_USERNAME: ucentral
steps:
- uses: actions/checkout@v2
- name: Build Docker image
run: docker build -t wlan-cloud-owgw:${{ github.sha }} .
- 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-owgw:${{ github.sha }} ${{ env.DOCKER_REGISTRY_URL }}/owgw:$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
- name: Checkout actions repo
uses: actions/checkout@v2
with:
registry: ${{ env.DOCKER_REGISTRY_URL }}
username: ${{ env.DOCKER_REGISTRY_USERNAME }}
password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
repository: Telecominfraproject/.github
path: github
- name: Push Docker images
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
run: |
docker images | grep ${{ env.DOCKER_REGISTRY_URL }}/owgw | awk -F ' ' '{print $1":"$2}' | xargs -I {} docker push {}
- name: Build and push Docker image
uses: ./github/composite-actions/docker-image-build
with:
image_name: owgw
registry: tip-tip-wlan-cloud-ucentral.jfrog.io
registry_user: ucentral
registry_password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
docker-compose:
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
runs-on: ubuntu-20.04
trigger-testing:
if: startsWith(github.ref, 'refs/pull/')
runs-on: ubuntu-latest
needs: docker
steps:
- name: Check out wlan-cloud-ucentral-deploy repository
- name: Get base branch name and set as output
id: get_base_branch
run: |
echo ::set-output name=branch::$(echo ${GITHUB_BASE_REF##*/} | sed 's/master/main/g')
- name: Checkout actions repo
uses: actions/checkout@v2
with:
repository: Telecominfraproject/wlan-cloud-ucentral-deploy
path: wlan-cloud-ucentral-deploy
repository: Telecominfraproject/.github
path: github
- name: Instantiate Docker Compose deployment
working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
- name: Trigger testing of OpenWifi Docker Compose deployment and wait for result
uses: ./github/composite-actions/trigger-workflow-and-wait
env:
OWGW_TAG: ${{ github.sha }}
run: |
docker-compose up -d
- name: Wait for OWSec to be alive and kicking
run: |
n=0
until [ "$n" -ge 3 ]
do
curl -s 127.0.0.1:16102 && break
n=$((n+1))
if [ "$n" -eq 3]; then
exit 1
else
sleep 3
fi
done
- name: Check out wlan-cloud-ucentralgw repository
uses: actions/checkout@v2
BASE_BRANCH: ${{ steps.get_base_branch.outputs.branch }}
with:
path: wlan-cloud-ucentralgw
- name: Check functionality of microservices
env:
OWSEC: "openwifi.wlan.local:16001"
FLAGS: "-s --cacert ./wlan-cloud-ucentral-deploy/docker-compose/certs/restapi-ca.pem --resolve openwifi.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
working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
if: always()
run: |
docker-compose ps -a
docker-compose logs
# disable until repo is public
#- name: export Docker image
# run: docker image save -o wlan-cloud-ucentralgw-${{ github.sha }}.tar wlan-cloud-ucentralgw:${{ github.sha }}
#- uses: actions/upload-artifact@v2
# with:
# name: docker-image
# path: wlan-cloud-ucentralgw-${{ github.sha }}.tar
owner: Telecominfraproject
repo: wlan-testing
workflow: ow_docker-compose.yml
token: ${{ secrets.WLAN_TESTING_PAT }}
ref: master
inputs: '{"owgw_version": "${{ github.sha }}", "owgwui_version": "${{ env.BASE_BRANCH }}", "owsec_version": "${{ env.BASE_BRANCH }}", "owfms_version": "${{ env.BASE_BRANCH }}", "owprov_version": "main", "owprovui_version": "main"}'

View File

@@ -0,0 +1,24 @@
name: Ensure Jira issue is linked
on:
pull_request:
types: [opened, edited, reopened, synchronize]
branches:
- 'release/*'
jobs:
check_for_issue_key:
runs-on: ubuntu-latest
steps:
- name: Checkout actions repo
uses: actions/checkout@v2
with:
repository: Telecominfraproject/.github
path: github
- name: Run JIRA check
uses: ./github/composite-actions/enforce-jira-issue-key
with:
jira_base_url: ${{ secrets.TIP_JIRA_URL }}
jira_user_email: ${{ secrets.TIP_JIRA_USER_EMAIL }}
jira_api_token: ${{ secrets.TIP_JIRA_API_TOKEN }}

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.13)
project(owgw VERSION 2.4.0)
project(owgw VERSION 2.5.0)
set(CMAKE_CXX_STANDARD 17)
@@ -20,16 +20,28 @@ endif()
# Auto build increment. You must define BUILD_INCREMENT with cmake -DBUILD_INCREMENT=1
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build)
file(READ build BUILD_NUM)
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/build BUILD_NUM)
if(BUILD_INCREMENT)
MATH(EXPR BUILD_NUM "${BUILD_NUM}+1")
file(WRITE build ${BUILD_NUM})
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
endif()
else()
set(BUILD_NUM 1)
file(WRITE build ${BUILD_NUM})
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
endif()
add_definitions(-DAPP_VERSION="${CMAKE_PROJECT_VERSION}" -DBUILD_NUMBER="${BUILD_NUM}")
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --tags
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_HASH)
if(NOT GIT_RESULT EQUAL "0")
message(FATAL_ERROR "git describe --always --tags failed with ${GIT_RESULT}")
endif()
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
endif()
add_definitions(-DTIP_GATEWAY_SERVICE="1")
set(Boost_USE_STATIC_LIBS OFF)
@@ -52,8 +64,11 @@ endif()
include_directories(/usr/local/include /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include)
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
add_executable( owgw
build
src/ow_version.h.in
src/framework/CountryCodes.h
src/framework/KafkaTopics.h
src/framework/MicroService.h
@@ -81,17 +96,15 @@ add_executable( owgw
src/RESTAPI/RESTAPI_capabilities_handler.cpp src/RESTAPI/RESTAPI_capabilities_handler.h
src/RESTAPI/RESTAPI_RPC.cpp src/RESTAPI/RESTAPI_RPC.h
src/RESTAPI/RESTAPI_deviceDashboardHandler.cpp src/RESTAPI/RESTAPI_deviceDashboardHandler.h
src/RESTAPI/RESTAPI_TelemetryWebSocket.cpp src/RESTAPI/RESTAPI_TelemetryWebSocket.h
src/RESTAPI/RESTAPI_telemetryWebSocket.cpp src/RESTAPI/RESTAPI_telemetryWebSocket.h
src/RESTAPI/RESTAPI_webSocketServer.cpp src/RESTAPI/RESTAPI_webSocketServer.h
src/storage/storage_blacklist.cpp src/storage/storage_tables.cpp src/storage/storage_logs.cpp
src/storage/storage_command.cpp src/storage/storage_healthcheck.cpp src/storage/storage_statistics.cpp
src/storage/storage_device.cpp src/storage/storage_capabilities.cpp src/storage/storage_defconfig.cpp
src/storage/storage_tables.cpp
src/APIServers.cpp
src/RESTAPI/RESTAPI_routers.cpp
src/Daemon.cpp src/Daemon.h
src/StateProcessor.cpp src/StateProcessor.h
src/storage/storage_lifetime_stats.cpp
src/WebSocketServer.cpp src/WebSocketServer.h
src/WS_Server.cpp src/WS_Server.h
src/StorageService.cpp src/StorageService.h
src/DeviceRegistry.cpp src/DeviceRegistry.h
src/CommandManager.cpp src/CommandManager.h
@@ -103,8 +116,8 @@ add_executable( owgw
src/SerialNumberCache.cpp src/SerialNumberCache.h
src/TelemetryStream.cpp src/TelemetryStream.h
src/framework/ConfigurationValidator.cpp src/framework/ConfigurationValidator.h
src/ConfigurationCache.cpp src/ConfigurationCache.h
)
src/ConfigurationCache.h
src/CapabilitiesCache.h src/FindCountry.h src/rttys/RTTYS_server.cpp src/rttys/RTTYS_server.h src/rttys/RTTYS_device.cpp src/rttys/RTTYS_device.h src/rttys/RTTYS_ClientConnection.cpp src/rttys/RTTYS_ClientConnection.h src/rttys/RTTYS_WebServer.cpp src/rttys/RTTYS_WebServer.h src/RESTAPI/RESTAPI_device_helper.h src/SDKcalls.cpp src/SDKcalls.h src/StateUtils.cpp src/StateUtils.h src/WS_ReactorPool.h src/WS_Connection.h src/WS_Connection.cpp src/TelemetryClient.h src/TelemetryClient.cpp src/RESTAPI/RESTAPI_iptocountry_handler.cpp src/RESTAPI/RESTAPI_iptocountry_handler.h)
if(NOT SMALL_BUILD)

View File

@@ -1,25 +1,15 @@
FROM alpine AS builder
FROM alpine:3.15 AS build-base
RUN apk add --update --no-cache \
openssl openssh \
ncurses-libs \
bash util-linux coreutils curl \
make cmake gcc g++ libstdc++ libgcc git zlib-dev yaml-cpp-dev \
openssl-dev boost-dev unixodbc-dev postgresql-dev mariadb-dev \
apache2-utils yaml-dev apr-util-dev \
lua-dev librdkafka-dev \
nlohmann-json
make cmake g++ git \
unixodbc-dev postgresql-dev mariadb-dev \
librdkafka-dev boost-dev openssl-dev \
zlib-dev nlohmann-json
FROM build-base AS poco-build
ADD https://api.github.com/repos/stephb9959/poco/git/refs/heads/master version.json
RUN git clone https://github.com/stephb9959/poco /poco
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
WORKDIR /cppkafka
RUN mkdir cmake-build
WORKDIR cmake-build
RUN cmake ..
RUN cmake --build . --config Release -j8
RUN cmake --build . --target install
WORKDIR /poco
RUN mkdir cmake-build
@@ -28,6 +18,23 @@ RUN cmake ..
RUN cmake --build . --config Release -j8
RUN cmake --build . --target install
FROM build-base AS cppkafka-build
ADD https://api.github.com/repos/stephb9959/cppkafka/git/refs/heads/master version.json
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
WORKDIR /cppkafka
RUN mkdir cmake-build
WORKDIR cmake-build
RUN cmake ..
RUN cmake --build . --config Release -j8
RUN cmake --build . --target install
FROM build-base AS json-schema-validator-build
ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/heads/master version.json
RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
WORKDIR /json-schema-validator
RUN mkdir cmake-build
WORKDIR cmake-build
@@ -35,9 +42,19 @@ RUN cmake ..
RUN make
RUN make install
FROM build-base AS owgw-build
ADD CMakeLists.txt build /owgw/
ADD cmake /owgw/cmake
ADD src /owgw/src
ADD .git /owgw/.git
COPY --from=poco-build /usr/local/include /usr/local/include
COPY --from=poco-build /usr/local/lib /usr/local/lib
COPY --from=cppkafka-build /usr/local/include /usr/local/include
COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
COPY --from=json-schema-validator-build /usr/local/include /usr/local/include
COPY --from=json-schema-validator-build /usr/local/lib /usr/local/lib
WORKDIR /owgw
RUN mkdir cmake-build
@@ -45,7 +62,7 @@ WORKDIR /owgw/cmake-build
RUN cmake ..
RUN cmake --build . --config Release -j8
FROM alpine
FROM alpine:3.15
ENV OWGW_USER=owgw \
OWGW_ROOT=/owgw-data \
@@ -57,18 +74,22 @@ RUN addgroup -S "$OWGW_USER" && \
RUN mkdir /openwifi
RUN mkdir -p "$OWGW_ROOT" "$OWGW_CONFIG" && \
chown "$OWGW_USER": "$OWGW_ROOT" "$OWGW_CONFIG"
RUN apk add --update --no-cache librdkafka mariadb-connector-c libpq unixodbc su-exec gettext ca-certificates bash jq curl
COPY --from=builder /owgw/cmake-build/owgw /openwifi/owgw
COPY --from=builder /cppkafka/cmake-build/src/lib/* /lib/
COPY --from=builder /poco/cmake-build/lib/* /lib/
RUN apk add --update --no-cache librdkafka su-exec gettext ca-certificates bash jq curl \
mariadb-connector-c libpq unixodbc postgresql-client
COPY readiness_check /readiness_check
COPY test_scripts/curl/cli /cli
COPY owgw.properties.tmpl /
COPY docker-entrypoint.sh /
COPY wait-for-postgres.sh /
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.pem
COPY readiness_check /readiness_check
COPY --from=owgw-build /owgw/cmake-build/owgw /openwifi/owgw
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib /usr/local/lib/
COPY --from=poco-build /poco/cmake-build/lib /usr/local/lib
EXPOSE 15002 16002 16003 17002 16102

View File

@@ -609,6 +609,32 @@ The device should answer:
"id" : <same number>
}
```
#### Controller wants to ping the device
Controller sends this command when it tries to establish latency to the device.
```
{ "jsonrpc" : "2.0" ,
"method" : "ping" ,
"params" : {
"serial" : <serial number>
},
"id" : <some number>
}
```
The device should answer:
```
{ "jsonrpc" : "2.0" ,
"result" : {
"serial" : <serial number> ,
"uuid" : <uuid of the current active configuration>,
"deviceUTCTime" : <UTC Time on device in milliseconds>
},
"id" : <same number>
}
```
#### `rtty server`
More information about the [rtty server](https://github.com/zhaojh329/rtty) can be found here.

View File

@@ -28,8 +28,9 @@ These instructions have proven to work on Ubuntu 20.4.
```
sudo apt install git cmake g++ libssl-dev libmariadb-dev
sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
sudo apt install librdkafka-dev libmysqlclient-dev default-libmysqlclient-dev
sudo apt install librdkafka-dev // default-libmysqlclient-dev
cd ~
git clone https://github.com/stephb9959/poco
cd poco
mkdir cmake-build
@@ -38,6 +39,7 @@ cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/stephb9959/cppkafka
cd cppkafka
mkdir cmake-build
@@ -46,13 +48,33 @@ cmake ..
cmake --build . --config Release
sudo cmake --build . --target install
cd ~
git clone https://github.com/nlohmann/json.git
cd json
mkdir cmake-build
cd cmake-build
cmake ..
make -j
sudo make install
cd ~
git clone https://github.com/pboettch/json-schema-validator.git
cd json-schema-validator
mkdir cmake-build
cd cmake-build
cmake ..
make -j
sudo make install
cd ~
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
cd wlan-cloud-ucentralgw
mkdir cmake-build
cd cmake-build
cmake ..
make
make -j 8
```
### Fedora

2
build
View File

@@ -1 +1 @@
33
171

View File

@@ -0,0 +1 @@
{"compatible":"edgecore_eap101","model":"EdgeCore EAP101","network":{"lan":["eth1","eth2"],"wan":["eth0"]},"platform":"ap","switch":{"switch0":{"enable":false,"reset":false}},"wifi":{"platform/soc/c000000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"he_mac_capa":[13,-26104,4160],"he_phy_capa":[7168,19568,8072,-31807,260,44],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","HE20","HE40","HE80","HE160","HE80+80"],"rx_ant":3,"tx_ant":3,"vht_capa":1939470770},"platform/soc/c000000.wifi+1":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"he_mac_capa":[13,-26104,4160],"he_phy_capa":[512,3184,8072,-31807,260,44],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","HE20","HE40"],"rx_ant":3,"tx_ant":3,"vht_capa":1939437970}}}

View File

@@ -0,0 +1 @@
{"compatible":"edgecore_eap102","model":"Edgecore EAP102","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","switch":{"switch0":{"enable":false,"reset":false}},"wifi":{"platform/soc/c000000.wifi1":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"he_mac_capa":[13,-26088,4160],"he_phy_capa":[1024,19552,32648,-31781,412,12],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","HE20","HE40","HE80"],"rx_ant":240,"tx_ant":240,"vht_capa":1939601842},"platform/soc/c000000.wifi1+1":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"he_mac_capa":[13,-26088,4160],"he_phy_capa":[512,19552,32648,-31807,412,12],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","HE20","HE40"],"rx_ant":3,"tx_ant":3,"vht_capa":1939437970}}}

View File

@@ -0,0 +1 @@
{"compatible":"edgecore_ecw5211","model":"Edgecore ECW5211","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986}}}

View File

@@ -0,0 +1 @@
{"compatible":"edgecore_ecw5410","model":"Edgecore ECW5410","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","wifi":{"soc/1b700000.pci/pci0001:00/0001:00:00.0/0001:01:00.0":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","VHT80+80","VHT160"],"rx_ant":15,"tx_ant":15,"vht_capa":865827322},"soc/1b900000.pci/pci0002:00/0002:00:00.0/0002:01:00.0":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":15,"tx_ant":15,"vht_capa":865827250}}}

View File

@@ -0,0 +1 @@
{"compatible":"edgecore_spw2ac1200-lan-poe","model":"Edgecore SPW2AC1200","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986}}}

View File

@@ -0,0 +1 @@
{"compatible":"edgecore_spw2ac1200","model":"Edgecore SPW2AC1200","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986}}}

View File

@@ -0,0 +1 @@
{"compatible":"edgecore_ssw2ac2600","model":"Edgecore SSW2AC2600","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","wifi":{"soc/1b700000.pci/pci0001:00/0001:00:00.0/0001:01:00.0":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","VHT80+80","VHT160"],"rx_ant":15,"tx_ant":15,"vht_capa":865827322},"soc/1b900000.pci/pci0002:00/0002:00:00.0/0002:01:00.0":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":15,"tx_ant":15,"vht_capa":865827250}}}

View File

@@ -0,0 +1 @@
{"compatible":"linksys_ea6350-v4","model":"Linksys EA6350 v4","network":{"lan":["lan1","lan2","lan3","lan4"],"wan":["wan"]},"platform":"ap","wifi":{"1e140000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":510,"htmode":["HT20","HT40"],"rx_ant":3,"tx_ant":3},"1e140000.pcie/pci0000:00/0000:00:01.0/0000:02:00.0":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":511,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","VHT80+80","VHT160"],"rx_ant":3,"tx_ant":3,"vht_capa":864027128}}}

View File

@@ -0,0 +1 @@
{"compatible":"linksys_ea8300","model":"Linksys EA8300 (Dallas)","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","switch":{"switch0":{"enable":true,"ports":[{"device":"eth0","need_tag":false,"num":0,"want_untag":true},{"num":1,"role":"lan"},{"num":2,"role":"lan"},{"num":3,"role":"lan"},{"num":4,"role":"lan"}],"reset":true,"roles":[{"device":"eth0","ports":"1 2 3 4 0","role":"lan"}]}},"wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64],"dfs_channels":[52,56,60,64],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["5G"],"channels":[100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865696178}}}

View File

@@ -0,0 +1 @@
{"compatible":"wallys_dr40x9","model":"Wallys DR40X9","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986}}}

View File

@@ -38,6 +38,7 @@ if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWGW_CONFIG"/owgw.properties ]]; the
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"} \
SIMULATORID=${SIMULATORID:-""} \
RTTY_ENABLED=${RTTY_ENABLED:-"false"} \
RTTY_SERVER=${RTTY_SERVER:-"localhost"} \
RTTY_PORT=${RTTY_PORT:-"5912"} \

View File

@@ -1,12 +1,12 @@
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 10.9.2
- name: mysql
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 8.8.3
- name: mariadb
repository: https://charts.bitnami.com/bitnami
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
version: 9.4.2
digest: sha256:1fdae7cbea906e41dccd8618ff9e2c68d0c684724ae27c79a12bb6089968df5c
generated: "2021-08-17T12:18:40.341427893+03:00"
digest: sha256:e9df5a5d8a0a193bfda33ea06060203aace01f0f7df9eda662a84185322c7ab5
generated: "2022-06-03T15:38:31.063022252+03:00"

View File

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

View File

@@ -13,6 +13,7 @@ spec:
replicas: {{ .Values.replicaCount }}
strategy:
type: {{ .Values.strategyType }}
revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "owgw.name" . }}
@@ -24,6 +25,9 @@ spec:
metadata:
annotations:
checksum/config: {{ include "owgw.config" . | sha256sum }}
{{- if .Values.podSecurityPolicy.enabled }}
kubernetes.io/psp: {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
{{- end }}
{{- with .Values.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
@@ -35,6 +39,16 @@ spec:
{{- end }}
spec:
initContainers:
- name: wait-kafka
image: "{{ .Values.images.dockerize.repository }}:{{ .Values.images.dockerize.tag }}"
imagePullPolicy: {{ .Values.images.dockerize.pullPolicy }}
args:
- -wait
- tcp://{{ index .Values.configProperties "openwifi.kafka.brokerlist" }}
- -timeout
- 600s
containers:
- name: owgw

28
helm/templates/psp.yaml Normal file
View File

@@ -0,0 +1,28 @@
{{- if .Values.podSecurityPolicy.enabled }}
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
labels:
app.kubernetes.io/name: {{ include "owgw.name" . }}
helm.sh/chart: {{ include "owgw.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
allowedUnsafeSysctls:
{{- range $unsafeSysctl := .Values.securityContext.sysctls }}
- {{ $unsafeSysctl.name }}
{{- end }}
privileged: false
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
{{- end }}

16
helm/templates/role.yaml Normal file
View File

@@ -0,0 +1,16 @@
{{- if .Values.podSecurityPolicy.enabled }}
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl
rules:
- apiGroups:
- policy
resources:
- podsecuritypolicies
verbs:
- use
resourceNames:
- {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
{{- end }}

View File

@@ -0,0 +1,15 @@
{{- if .Values.podSecurityPolicy.enabled }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl-to-default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl
subjects:
- kind: ServiceAccount
name: default
namespace: {{ .Release.Namespace }}
{{- end }}

View File

@@ -1,6 +1,7 @@
# System
replicaCount: 1
strategyType: Recreate
revisionHistoryLimit: 2
nameOverride: ""
fullnameOverride: ""
@@ -8,16 +9,20 @@ fullnameOverride: ""
images:
owgw:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
tag: master
tag: v2.5.1
pullPolicy: Always
# regcred:
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
# username: username
# password: password
dockerize:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/dockerize
tag: 0.16.0
pullPolicy: IfNotPresent
services:
owgw:
type: LoadBalancer
type: ClusterIP
ports:
websocket:
servicePort: 15002
@@ -46,7 +51,6 @@ checks:
exec:
command:
- /readiness_check
failureThreshold: 1
ingresses:
restapi:
@@ -112,6 +116,17 @@ resources: {}
securityContext:
fsGroup: 101
# Usage of unsafe sysctls requires multiple things:
# - allow these unsafe sysctls on kubelet level (by adding --allowed-unsafe-sysctls flag)
# - enabling addition of PodSecurityContext setting podSecurityPolicy.enabled to "true" below
# - uncommenting parameters below
#sysctls:
#- name: net.ipv4.tcp_keepalive_intvl
# value: "5"
#- name: net.ipv4.tcp_keepalive_probes
# value: "2"
#- name: net.ipv4.tcp_keepalive_time
# value: "45"
nodeSelector: {}
@@ -121,6 +136,9 @@ affinity: {}
podAnnotations: {}
podSecurityPolicy:
enabled: false
persistence:
enabled: true
# storageClassName: "-"
@@ -240,22 +258,20 @@ configProperties:
openwifi.system.uri.public: https://localhost:16002
openwifi.system.commandchannel: /tmp/app_owgw
# Logging
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
logging.channels.c2.class: FileChannel
logging.channels.c2.path: /tmp/log_owgw
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"
logging.loggers.root.channel: c1
logging.loggers.root.level: debug
logging.type: console
logging.path: $OWGW_ROOT/logs
logging.level: debug
# Archiving
archiver.enabled: "true"
archiver.schedule: 03:00
archiver.db.0.name: healthchecks
archiver.db.0.keep: 7
archiver.db.1.name: statistics
archiver.db.1.keep: 7
archiver.db.2.name: devicelogs
archiver.db.2.keep: 7
archiver.db.3.name: commandlist
archiver.db.3.keep: 7
# -> Secret part
# Websocket

View File

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

Before

Width:  |  Height:  |  Size: 7.5 KiB

View File

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

Before

Width:  |  Height:  |  Size: 8.0 KiB

View File

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

Before

Width:  |  Height:  |  Size: 8.0 KiB

View File

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

Before

Width:  |  Height:  |  Size: 8.2 KiB

View File

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

Before

Width:  |  Height:  |  Size: 7.9 KiB

View File

@@ -1,130 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
<g>
<path d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6c0-11.9-9.7-21.6-21.6-21.6
c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0c14.3,0,25.9,11.6,25.9,25.9
c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
<path d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6c0-7.7-6.3-14.1-14.1-14.1
c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0c10.2,0,18.4,8.3,18.4,18.4
c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
<path d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3c-0.1,0-0.3,0-0.5,0
c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
C206.4,42.4,205.4,43.3,204.3,43.3z"/>
<g>
<g>
<g>
<path d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
</g>
<g>
<path d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
</g>
<g>
<path d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
</g>
<g>
<path d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
</g>
<g>
<path d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8c-1.1,0-1.9,0.8-1.9,2
c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z"/>
</g>
<g>
<path d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z M90.2,87.1
c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
</g>
<g>
<path d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
</g>
<g>
<path d="M103,89.9v-5.6h1v5.6H103z"/>
</g>
<g>
<path d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
</g>
<g>
<path d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
</g>
<g>
<path d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z M120.4,86.1
c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
</g>
<g>
<path d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
</g>
<g>
<path d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86c0-0.7-0.5-1.2-1.2-1.2
h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
</g>
<g>
<path d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z M139.4,86
c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
</g>
<g>
<path d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9C142.3,90,141.2,88.8,141.2,87.1z
M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5C145.2,89.6,146.1,88.5,146.1,87.1z"/>
</g>
<g>
<path d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
C147.9,90,147.4,89.8,147,89.3z"/>
</g>
<g>
<path d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
</g>
<g>
<path d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8c-1.3,0-2.3,1-2.3,2.5
c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"/>
</g>
<g>
<path d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
</g>
</g>
<g>
<polygon points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 "/>
<polygon points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 "/>
<polygon points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 "/>
<polygon points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 "/>
</g>
</g>
</g>
<g>
<path d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
<path d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
C72.8,60.7,74.1,60.2,75.1,59.1z"/>
<path d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
<path d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1c-1.5,0-2.7,0.5-3.6,1.5
s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
<path d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5L156.5,39.9z"/>
<path d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
V45.7z"/>
<path d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
<path d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
h-4.5V45.7z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -1,140 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FED206;}
.st1{fill:#EB6F53;}
.st2{fill:#3BA9B6;}
.st3{fill:#414141;}
</style>
<g>
<path class="st0" d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6
c0-11.9-9.7-21.6-21.6-21.6c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0
c14.3,0,25.9,11.6,25.9,25.9c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
<path class="st1" d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6
c0-7.7-6.3-14.1-14.1-14.1c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0
c10.2,0,18.4,8.3,18.4,18.4c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
<path class="st2" d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3
c-0.1,0-0.3,0-0.5,0c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
C206.4,42.4,205.4,43.3,204.3,43.3z"/>
<g>
<g>
<g>
<path class="st3" d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
</g>
<g>
<path class="st3" d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
</g>
<g>
<path class="st3" d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
</g>
<g>
<path class="st3" d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
</g>
<g>
<path class="st3" d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8
c-1.1,0-1.9,0.8-1.9,2c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z
"/>
</g>
<g>
<path class="st3" d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z
M90.2,87.1c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
</g>
<g>
<path class="st3" d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
</g>
<g>
<path class="st3" d="M103,89.9v-5.6h1v5.6H103z"/>
</g>
<g>
<path class="st3" d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
</g>
<g>
<path class="st3" d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
</g>
<g>
<path class="st3" d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z
M120.4,86.1c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
</g>
<g>
<path class="st3" d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
</g>
<g>
<path class="st3" d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86
c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
</g>
<g>
<path class="st3" d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z
M139.4,86c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
</g>
<g>
<path class="st3" d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9
C142.3,90,141.2,88.8,141.2,87.1z M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5
C145.2,89.6,146.1,88.5,146.1,87.1z"/>
</g>
<g>
<path class="st3" d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
C147.9,90,147.4,89.8,147,89.3z"/>
</g>
<g>
<path class="st3" d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
</g>
<g>
<path class="st3" d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8
c-1.3,0-2.3,1-2.3,2.5c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"
/>
</g>
<g>
<path class="st3" d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
</g>
</g>
<g>
<polygon class="st3" points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 "/>
<polygon class="st3" points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 "/>
<polygon class="st3" points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 "/>
<polygon class="st3" points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 "/>
</g>
</g>
</g>
<g>
<path class="st3" d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
<path class="st3" d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
C72.8,60.7,74.1,60.2,75.1,59.1z"/>
<path class="st3" d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
<path class="st3" d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1
c-1.5,0-2.7,0.5-3.6,1.5s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
<path class="st3" d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5
L156.5,39.9z"/>
<path class="st3" d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
V45.7z"/>
<path class="st3" d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
<path class="st3" d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
h-4.5V45.7z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -1,137 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6
c0-11.9-9.7-21.6-21.6-21.6c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0
c14.3,0,25.9,11.6,25.9,25.9c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
<path class="st0" d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6
c0-7.7-6.3-14.1-14.1-14.1c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0
c10.2,0,18.4,8.3,18.4,18.4c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
<path class="st0" d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3
c-0.1,0-0.3,0-0.5,0c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
C206.4,42.4,205.4,43.3,204.3,43.3z"/>
<g>
<g>
<g>
<path class="st0" d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
</g>
<g>
<path class="st0" d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
</g>
<g>
<path class="st0" d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
</g>
<g>
<path class="st0" d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
</g>
<g>
<path class="st0" d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8
c-1.1,0-1.9,0.8-1.9,2c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z
"/>
</g>
<g>
<path class="st0" d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z
M90.2,87.1c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
</g>
<g>
<path class="st0" d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
</g>
<g>
<path class="st0" d="M103,89.9v-5.6h1v5.6H103z"/>
</g>
<g>
<path class="st0" d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
</g>
<g>
<path class="st0" d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
</g>
<g>
<path class="st0" d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z
M120.4,86.1c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
</g>
<g>
<path class="st0" d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
</g>
<g>
<path class="st0" d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86
c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
</g>
<g>
<path class="st0" d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z
M139.4,86c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
</g>
<g>
<path class="st0" d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9
C142.3,90,141.2,88.8,141.2,87.1z M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5
C145.2,89.6,146.1,88.5,146.1,87.1z"/>
</g>
<g>
<path class="st0" d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
C147.9,90,147.4,89.8,147,89.3z"/>
</g>
<g>
<path class="st0" d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
</g>
<g>
<path class="st0" d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8
c-1.3,0-2.3,1-2.3,2.5c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"
/>
</g>
<g>
<path class="st0" d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
</g>
</g>
<g>
<polygon class="st0" points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 "/>
<polygon class="st0" points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 "/>
<polygon class="st0" points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 "/>
<polygon class="st0" points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 "/>
</g>
</g>
</g>
<g>
<path class="st0" d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
<path class="st0" d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
C72.8,60.7,74.1,60.2,75.1,59.1z"/>
<path class="st0" d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
<path class="st0" d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1
c-1.5,0-2.7,0.5-3.6,1.5s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
<path class="st0" d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5
L156.5,39.9z"/>
<path class="st0" d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
V45.7z"/>
<path class="st0" d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
<path class="st0" d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
h-4.5V45.7z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -1,140 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FED206;}
.st1{fill:#EB6F53;}
.st2{fill:#3BA9B6;}
.st3{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6
c0-11.9-9.7-21.6-21.6-21.6c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0
c14.3,0,25.9,11.6,25.9,25.9c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
<path class="st1" d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6
c0-7.7-6.3-14.1-14.1-14.1c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0
c10.2,0,18.4,8.3,18.4,18.4c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
<path class="st2" d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3
c-0.1,0-0.3,0-0.5,0c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
C206.4,42.4,205.4,43.3,204.3,43.3z"/>
<g>
<g>
<g>
<path class="st3" d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
</g>
<g>
<path class="st3" d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
</g>
<g>
<path class="st3" d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
</g>
<g>
<path class="st3" d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
</g>
<g>
<path class="st3" d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8
c-1.1,0-1.9,0.8-1.9,2c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z
"/>
</g>
<g>
<path class="st3" d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z
M90.2,87.1c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
</g>
<g>
<path class="st3" d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
</g>
<g>
<path class="st3" d="M103,89.9v-5.6h1v5.6H103z"/>
</g>
<g>
<path class="st3" d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
</g>
<g>
<path class="st3" d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
</g>
<g>
<path class="st3" d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z
M120.4,86.1c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
</g>
<g>
<path class="st3" d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
</g>
<g>
<path class="st3" d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86
c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
</g>
<g>
<path class="st3" d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z
M139.4,86c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
</g>
<g>
<path class="st3" d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9
C142.3,90,141.2,88.8,141.2,87.1z M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5
C145.2,89.6,146.1,88.5,146.1,87.1z"/>
</g>
<g>
<path class="st3" d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
C147.9,90,147.4,89.8,147,89.3z"/>
</g>
<g>
<path class="st3" d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
</g>
<g>
<path class="st3" d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8
c-1.3,0-2.3,1-2.3,2.5c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"
/>
</g>
<g>
<path class="st3" d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
</g>
</g>
<g>
<polygon class="st3" points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 "/>
<polygon class="st3" points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 "/>
<polygon class="st3" points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 "/>
<polygon class="st3" points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 "/>
</g>
</g>
</g>
<g>
<path class="st3" d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
<path class="st3" d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
C72.8,60.7,74.1,60.2,75.1,59.1z"/>
<path class="st3" d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
<path class="st3" d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1
c-1.5,0-2.7,0.5-3.6,1.5s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
<path class="st3" d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5
L156.5,39.9z"/>
<path class="st3" d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
V45.7z"/>
<path class="st3" d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
<path class="st3" d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
h-4.5V45.7z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -2,7 +2,7 @@ openapi: 3.0.1
info:
title: uCentral gateway API
description: A process to manage configuration for devices.
version: 2.0.0
version: 2.5.0
license:
name: BSD3
url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
@@ -61,6 +61,11 @@ components:
- 6 # INTERNAL_ERROR,
- 7 # ACCESS_DENIED,
- 8 # INVALID_TOKEN
- 9 # EXPIRED_TOKEN
- 10 # RATE_LIMIT_EXCEEDED
- 11 # BAD_MFA_TRANSACTION
- 12 # MFA_FAILURE
- 13 # SECURITY_SERVICE_UNREACHABLE
ErrorDetails:
type: string
ErrorDescription:
@@ -339,16 +344,6 @@ components:
items:
$ref: '#/components/schemas/NameValuePair'
LifetimeStatistics:
type: object
properties:
serialNumber:
type: string
interfaces:
type: array
items:
$ref: '#/components/schemas/InterfaceStatistics'
CommandDetails:
type: object
properties:
@@ -446,7 +441,9 @@ components:
name:
type: string
modelIds:
type: string
type: array
items:
type: string
description:
type: string
configuration:
@@ -475,6 +472,8 @@ components:
when:
type: integer
format: int64
keepRedirector:
type: boolean
RebootRequest:
type: object
@@ -651,8 +650,16 @@ components:
type: string
interval:
type: integer
example:
description:
0 - means to stop streaming, values 1-120 in seconds.
lifetime:
type: integer
format: int64
description: how long should the telemetry run
kafka:
type: boolean
default: false
description: set to true to start kafka telemetry, false to start websocket telemetry
types:
type: array
items:
@@ -663,7 +670,8 @@ components:
- state
uuid:
type: string
example:
format: uuid
description:
only valid when terminating a stream
TelemetryStreamResponse:
@@ -679,6 +687,24 @@ components:
format: uri
example:
wss://host.domain:port/endpoint
action:
type: string
description: what action resulted from running the command
status:
type: object
properties:
running:
type: boolean
interval:
type: integer
websocketTimer:
type: integer
kafkaTimer:
type: integer
websocketClients:
type: integer
kafkaClients:
type: integer
#########################################################################################
##
@@ -990,7 +1016,7 @@ components:
CapabilitiesModelList:
type: object
properties:
devices:
device_types:
type: array
items:
$ref: '#/components/schemas/CapabilitiesModel'
@@ -1703,13 +1729,7 @@ paths:
format: int64
required: false
- in: query
description: Selecting this option means the LifetimeStatistics will be returned. All other parameters will be ignored.
name: lifetime
schema:
type: boolean
required: false
- in: query
description: Selecting this option means the LifetimeStatistics will be returned. All other parameters will be ignored.
description: Selecting this option means the Last Statistics block
name: lastOnly
schema:
type: boolean
@@ -1729,7 +1749,6 @@ paths:
schema:
oneOf:
- $ref: '#/components/schemas/StatisticsRecords'
- $ref: '#/components/schemas/LifetimeStatistics'
403:
$ref: '#/components/responses/Unauthorized'
404:
@@ -1847,6 +1866,54 @@ paths:
404:
$ref: '#/components/responses/NotFound'
/device/{serialNumber}/ping:
post:
tags:
- Commands
summary: Configure a device.
operationId: createConfigurationForADevice
parameters:
- in: path
name: serialNumber
schema:
type: string
required: true
requestBody:
description: Command details
content:
application/json:
schema:
type: object
properties:
serialNumber:
type: string
responses:
200:
description:
Successfull ping os a device
content:
application/json:
schema:
type: object
properties:
serialNumber:
type: string
currentUTCTime:
type: integer
format: int64
deviceUTCTime:
type: integer
format: int64
latency:
type: number
configurationUUID:
type: integer
format: int64
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
/device/{serialNumber}/upgrade:
post:
tags:
@@ -2067,6 +2134,12 @@ paths:
schema:
type: string
required: true
- in: query
name: statusOnly
schema:
type: boolean
default: false
required: false
requestBody:
description: Message request details
content:
@@ -2348,6 +2421,39 @@ paths:
404:
$ref: '#/components/responses/NotFound'
/iptocountry:
get:
tags:
- Utility
summary: Get the country code for an IP address
operationId: getIpToCountry
parameters:
- in: query
name: iplist
schema:
type: string
example:
10.2.2.2,10.3.4.3
required: true
responses:
200:
description: List of country codes.
content:
application/json:
schema:
type: object
properties:
enabled:
type: boolean
countryCodes:
type: array
items:
type: string
403:
$ref: '#/components/responses/Unauthorized'
404:
$ref: '#/components/responses/NotFound'
#########################################################################################
##
## These are endpoints that all services in the uCentral stack must provide

View File

@@ -75,17 +75,26 @@ openwifi.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2 = IOT:esp32
oui.download.uri = https://linuxnet.ca/ieee/oui.txt
firmware.autoupdate.policy.default = auto
iptocountry.default = US
iptocountry.provider = ipinfo
#iptocountry.provider = ipdata
iptocountry.ipinfo.token =
iptocountry.ipdata.apikey =
autoprovisioning.process = prov,default
#
# rtty
#
rtty.internal = true
rtty.enabled = true
rtty.server = rtty-tip.arilia.com
rtty.port = 5912
rtty.token = 96181c567b4d0d98c50f127230068fa8
rtty.timeout = 60
rtty.viewport = 5913
rtty.assets = $OWGW_ROOT/rtty_ui
#############################
# Generic information for all micro services
@@ -155,38 +164,6 @@ archiver.db.3.keep = 7
# Logging: please leave as is for now.
#
########################################################################
logging.formatters.f1.class = PatternFormatter
logging.formatters.f1.pattern = %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 = $OWGW_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 = c2
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
logging.type = file
logging.path = $OWGW_ROOT/logs
logging.level = debug

View File

@@ -76,6 +76,7 @@ openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
openwifi.devicetypes.2 = IOT:esp32
oui.download.uri = https://linuxnet.ca/ieee/oui.txt
firmware.autoupdate.policy.default = auto
simulatorid = ${SIMULATORID}
#
# rtty
@@ -152,38 +153,6 @@ archiver.db.3.keep = 7
# 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 = $OWGW_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
logging.type = console
logging.path = $OWGW_ROOT/logs
logging.level = debug

View File

@@ -13,29 +13,30 @@ then
exit 1
fi
if [[ "${OWSEC}" == "" ]]
then
echo "You must set the variable OWSEC in order to use this script. Something like"
echo "OWSEC=security.isp.com:16001"
exit 1
fi
if [[ "${OWSEC_USERNAME}" == "" ]]
then
echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
echo "OWSEC_USERNAME=tip@ucentral.com"
exit 1
fi
if [[ "${OWSEC_PASSWORD}" == "" ]]
then
echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
echo "OWSEC_PASSWORD=openwifi"
exit 1
fi
if [[ "${READINESS_METHOD}" == "systeminfo" ]]
then
if [[ "${OWSEC}" == "" ]]
then
echo "You must set the variable OWSEC in order to use this script. Something like"
echo "OWSEC=security.isp.com:16001"
exit 1
fi
if [[ "${OWSEC_USERNAME}" == "" ]]
then
echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
echo "OWSEC_USERNAME=tip@ucentral.com"
exit 1
fi
if [[ "${OWSEC_PASSWORD}" == "" ]]
then
echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
echo "OWSEC_PASSWORD=openwifi"
exit 1
fi
# Get OAuth token from OWSEC and cache it or use cached one
payload="{ \"userId\" : \"$OWSEC_USERNAME\" , \"password\" : \"$OWSEC_PASSWORD\" }"
if [[ -f "/tmp/token" ]]

Binary file not shown.

Binary file not shown.

BIN
rtty_ui/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2013-9-30: Created.
-->
<svg>
<metadata>
Created by iconfont
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
ascent="896"
descent="-128"
/>
<missing-glyph />
<glyph glyph-name="web" unicode="&#59626;" d="M983.806 667.807c19.143 71.103 27.347 207.84-98.45 226.982-103.92 10.94-224.249-54.694-287.147-98.45-19.144 2.735-43.756 5.47-65.634 5.47-164.084 2.734-270.738-51.96-363.72-172.289-32.816-43.755-62.898-117.593-73.837-199.635 46.49 79.307 188.697 224.248 336.372 281.677 0 0-226.983-161.349-336.372-391.066v-2.735c-5.47-10.939-10.939-19.143-16.408-32.817-109.39-270.738-19.143-388.331 62.899-407.475 76.572-19.143 183.226 16.409 268.003 109.39 144.94-32.817 289.882 5.47 341.841 32.816C852.54 74.37 923.642 175.555 940.05 276.74H663.842s-13.674-87.511-161.349-87.511c-136.737 0-144.94 158.614-144.94 158.614h590.701s10.939 172.288-73.838 287.147c-49.225 62.899-112.124 120.328-199.635 150.41 27.347 19.143 73.838 51.96 114.859 60.164 76.572 19.143 125.797 8.204 158.614-49.225 43.756-76.572-24.612-251.595-24.612-251.595s38.286 49.225 60.164 123.063z m-612.58-672.744c-117.594-95.716-213.31-84.777-251.595-27.347-32.817 51.96-38.287 139.47 0 262.534 19.143-46.49 46.49-92.981 87.511-134.002 49.225-49.225 106.655-82.042 164.084-101.185z m-5.47 494.986s5.47 114.859 128.533 123.063c109.389 10.939 164.084-38.286 180.492-128.532l-309.025 5.47z" horiz-adv-x="1024" />
<glyph glyph-name="shell" unicode="&#59047;" d="M810.666667 768c46.933333 0 85.333333-38.4 85.333333-85.333333v-597.333334c0-46.933333-38.4-85.333333-85.333333-85.333333H213.333333c-46.933333 0-85.333333 38.4-85.333333 85.333333V682.666667c0 46.933333 38.4 85.333333 85.333333 85.333333z m-18.090667-597.333333h-267.434667v-55.722667h267.434667V170.666667zM250.666667 469.034667v-69.717334l176.469333-64.426666 5.546667-1.194667-0.298667-1.706667-5.248-0.597333-176.469333-65.92v-69.717333l251.989333 108.501333v56.32l-251.989333 108.458667z" horiz-adv-x="1024" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 542 KiB

1
rtty_ui/index.html Normal file
View File

@@ -0,0 +1 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>Rttys</title><link href="/css/app.0e046291.css" rel="preload" as="style"><link href="/css/chunk-vendors.b221ddbd.css" rel="preload" as="style"><link href="/js/app.79bf330a.js" rel="preload" as="script"><link href="/js/chunk-vendors.7fd2577a.js" rel="preload" as="script"><link href="/css/chunk-vendors.b221ddbd.css" rel="stylesheet"><link href="/css/app.0e046291.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but Rttys doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.7fd2577a.js"></script><script src="/js/app.79bf330a.js"></script></body></html>

BIN
rtty_ui/js/app.79bf330a.js Normal file

Binary file not shown.

Binary file not shown.

147
src/CapabilitiesCache.h Normal file
View File

@@ -0,0 +1,147 @@
//
// Created by stephane bourque on 2021-11-17.
//
#pragma once
#include "framework/MicroService.h"
#include "nlohmann/json.hpp"
namespace OpenWifi {
const std::string PlatformCacheFileName{"/plat_cache.json"};
const std::string CapabilitiesCacheFileName{"/caps_cache.json"};
typedef std::map<std::string,nlohmann::json> CapabilitiesCache_t;
class CapabilitiesCache {
public:
static auto instance() {
static auto instance = new CapabilitiesCache;
return instance;
}
inline void Add(const std::string & DeviceType, const std::string & Platform, const std::string & FullCapabilities) {
if(DeviceType.empty() || Platform.empty())
return;
std::lock_guard G(Mutex_);
if(!PlatformsLoaded_)
LoadPlatforms();
auto P = Poco::toUpper(Platform);
auto Hint = Platforms_.find(DeviceType);
if(Hint==Platforms_.end()) {
Platforms_.insert(std::make_pair(DeviceType,P));
SavePlatforms();
} else if(Hint->second != P) {
Hint->second = P;
SavePlatforms();
}
if(!CapabilitiesLoaded_)
LoadCapabilities();
auto CapHint = Capabilities_.find(DeviceType);
if(CapHint==Capabilities_.end()) {
Capabilities_[DeviceType] = nlohmann::json::parse(FullCapabilities);
SaveCapabilities();
} else {
CapHint->second = nlohmann::json::parse(FullCapabilities);
SaveCapabilities();
}
}
inline std::string GetPlatform(const std::string & DeviceType) {
std::lock_guard G(Mutex_);
if(!PlatformsLoaded_) {
LoadPlatforms();
}
auto Hint = Platforms_.find(DeviceType);
if(Hint==Platforms_.end())
return "AP";
return Hint->second;
}
inline nlohmann::json GetCapabilities(const std::string & DeviceType) {
std::lock_guard G(Mutex_);
if(!CapabilitiesLoaded_) {
LoadCapabilities();
}
auto Hint = Capabilities_.find(DeviceType);
if(Hint==Capabilities_.end())
return nlohmann::json{};
return Hint->second;
}
inline const CapabilitiesCache_t & AllCapabilities() {
std::lock_guard G(Mutex_);
if(!CapabilitiesLoaded_) {
LoadCapabilities();
}
return Capabilities_;
}
private:
std::recursive_mutex Mutex_;
std::atomic_bool PlatformsLoaded_=false;
std::atomic_bool CapabilitiesLoaded_=false;
std::map<std::string,std::string> Platforms_;
CapabilitiesCache_t Capabilities_;
std::string PlatformCacheFileName_{ MicroService::instance().DataDir()+PlatformCacheFileName };
std::string CapabilitiesCacheFileName_{ MicroService::instance().DataDir()+CapabilitiesCacheFileName };
inline void LoadPlatforms() {
try {
std::ifstream i(PlatformCacheFileName_);
nlohmann::json cache;
i >> cache;
for(const auto &[Type,Platform]:cache.items()) {
Platforms_[Type] = Platform;
}
} catch(...) {
}
PlatformsLoaded_ = true;
}
inline void SavePlatforms() {
try {
std::ofstream i(PlatformCacheFileName_);
nlohmann::json cache(Platforms_);
i << cache;
} catch (...) {
}
}
inline void LoadCapabilities() {
try {
std::ifstream i(CapabilitiesCacheFileName_, std::ios_base::binary|std::ios_base::in);
nlohmann::json cache;
i >> cache;
for(const auto &[Type,Caps]:cache.items()) {
Capabilities_[Type] = Caps;
}
} catch(...) {
}
CapabilitiesLoaded_ = true;
}
inline void SaveCapabilities() {
try {
std::ofstream i(CapabilitiesCacheFileName_, std::ios_base::trunc | std::ios_base::out | std::ios_base::binary );
nlohmann::json cache(Capabilities_);
i << cache;
} catch (...) {
}
}
};
}

View File

@@ -17,138 +17,136 @@
namespace OpenWifi::Config {
static std::string DefaultConfiguration;
static std::string BasicConfig {
R"lit({
"uuid": 1,
"radios": [
{
"band": "5G",
"country": "CA",
"channel-mode": "HE",
"channel-width": 80,
"channel": 32
}
],
"interfaces": [
{
"name": "WAN",
"role": "upstream",
"services": [ "lldp" ],
"ethernet": [
const static std::string BasicConfig {
R"lit({
"uuid": 1,
"radios": [
{
"select-ports": [
"WAN*"
]
"band": "5G",
"country": "CA",
"channel-mode": "HE",
"channel-width": 80,
"channel": 32
}
],
"ipv4": {
"addressing": "dynamic"
},
"ssids": [
"interfaces": [
{
"name": "OpenWifi",
"wifi-bands": [
"5G"
"name": "WAN",
"role": "upstream",
"services": [ "lldp" ],
"ethernet": [
{
"select-ports": [
"WAN*"
]
}
],
"bss-mode": "ap",
"encryption": {
"proto": "psk2",
"key": "OpenWifi",
"ieee80211w": "optional"
}
}
]
},
{
"name": "LAN",
"role": "downstream",
"services": [ "ssh", "lldp" ],
"ethernet": [
{
"select-ports": [
"LAN*"
"ipv4": {
"addressing": "dynamic"
},
"ssids": [
{
"name": "OpenWifi",
"wifi-bands": [
"5G"
],
"bss-mode": "ap",
"encryption": {
"proto": "psk2",
"key": "OpenWifi",
"ieee80211w": "optional"
}
}
]
},
{
"name": "LAN",
"role": "downstream",
"services": [ "ssh", "lldp" ],
"ethernet": [
{
"select-ports": [
"LAN*"
]
}
],
"ipv4": {
"addressing": "static",
"subnet": "192.168.1.1/24",
"dhcp": {
"lease-first": 10,
"lease-count": 100,
"lease-time": "6h"
}
},
"ssids": [
{
"name": "OpenWifi",
"wifi-bands": [
"5G"
],
"bss-mode": "ap",
"encryption": {
"proto": "psk2",
"key": "OpenWifi",
"ieee80211w": "optional"
}
}
]
}
],
"ipv4": {
"addressing": "static",
"subnet": "192.168.1.1/24",
"dhcp": {
"lease-first": 10,
"lease-count": 100,
"lease-time": "6h"
"metrics": {
"statistics": {
"interval": 120,
"types": [ "ssids", "lldp", "clients" ]
},
"health": {
"interval": 120
}
},
"ssids": [
{
"name": "OpenWifi",
"wifi-bands": [
"5G"
],
"bss-mode": "ap",
"encryption": {
"proto": "psk2",
"key": "OpenWifi",
"ieee80211w": "optional"
}
"services": {
"lldp": {
"describe": "uCentral",
"location": "universe"
},
"ssh": {
"port": 22
}
]
}
})lit"};
void Config::SetBasicConfigFile() {
try {
Poco::File DefaultConfigFileName{MicroService::instance().DataDir() + "/default_config.json"};
DefaultConfiguration_ = BasicConfig;
std::ofstream OS(DefaultConfigFileName.path(), std::ios::binary | std::ios::trunc );
std::istringstream IS(DefaultConfiguration_);
Poco::StreamCopier::copyStream(IS, OS);
} catch (...) {
DefaultConfiguration_ = BasicConfig;
}
],
"metrics": {
"statistics": {
"interval": 120,
"types": [ "ssids", "lldp", "clients" ]
},
"health": {
"interval": 120
}
},
"services": {
"lldp": {
"describe": "uCentral",
"location": "universe"
},
"ssh": {
"port": 22
}
}
})lit"};
void SetBasicConfigFile() {
Poco::File DefaultConfigFileName{MicroService::instance().DataDir()+"/default_config.json"};
DefaultConfiguration = BasicConfig;
std::ofstream F;
F.open(DefaultConfigFileName.path(),std::ios::binary);
F << BasicConfig ;
F.close();
}
Config::Config() {
Config_ = DefaultConfiguration;
if(DefaultConfiguration_.empty())
Init();
Config_ = DefaultConfiguration_;
}
void Config::Init() {
if(DefaultConfiguration.empty()) {
if(DefaultConfiguration_.empty()) {
// open the file
Poco::File DefaultConfigFileName{MicroService::instance().DataDir()+"/default_config.json"};
try {
Poco::File DefaultConfigFileName{MicroService::instance().DataDir()+"/default_config.json"};
if (!DefaultConfigFileName.exists()) {
SetBasicConfigFile();
} else {
std::ifstream F;
F.open(DefaultConfigFileName.path(),std::ios::binary);
while(!F.eof()) {
std::string Line;
F >> Line;
DefaultConfiguration += Line + "\n" ;
}
F.close();
// std::cout << "Default config: " << DefaultConfiguration << std::endl;
std::ifstream F(DefaultConfigFileName.path(),std::ios::binary | std::ios::in);
std::ostringstream C;
Poco::StreamCopier::copyStream(F,C);
DefaultConfiguration_ = C.str();
}
} catch (...) {
SetBasicConfigFile();
@@ -159,13 +157,13 @@ namespace OpenWifi::Config {
bool Config::SetUUID(uint64_t UUID) {
try {
Poco::JSON::Parser Parser;
Poco::JSON::Object::Ptr Object = Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
Object->set("uuid",UUID);
auto Object = Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
Object->set("uuid", UUID);
std::ostringstream NewConfig;
Poco::JSON::Stringifier Stringifier;
Stringifier.condense(Object, NewConfig);
Config_ = NewConfig.str();
return true;
Config_ = NewConfig.str();
return true;
}
catch(const Poco::Exception &E)
{
@@ -182,9 +180,9 @@ namespace OpenWifi::Config {
return true;
return false;
}
catch (const Poco::Exception &E)
catch (...)
{
return false;
return false;
}
}
@@ -193,7 +191,11 @@ namespace OpenWifi::Config {
return Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
}
std::string Config::Default() { return DefaultConfiguration; }
std::string Config::Default() {
if(DefaultConfiguration_.empty())
Init();
return DefaultConfiguration_;
}
std::string Capabilities::Default() {
return std::string(R"lit({"model":{"id":"linksys,ea8300","name":"Linksys EA8300 (Dallas)"},

View File

@@ -6,8 +6,7 @@
// Arilia Wireless Inc.
//
#ifndef UCENTRAL_UCENTRALCONFIG_H
#define UCENTRAL_UCENTRALCONFIG_H
#pragma once
#include <string>
#include "Poco/JSON/Object.h"
@@ -17,19 +16,21 @@ namespace OpenWifi::Config {
class Config {
public:
explicit Config(const std::string &Config)
:Config_(Config) {}
:Config_(Config) {
}
Config();
static void Init();
bool SetUUID(uint64_t UUID);
[[nodiscard]] bool Valid();
[[nodiscard]] std::string get() { return Config_; };
[[nodiscard]] static std::string Default();
[[nodiscard]] std::string Default();
[[nodiscard]] Poco::JSON::Object::Ptr to_json();
private:
std::string Config_;
void Init();
void SetBasicConfigFile();
inline static std::string DefaultConfiguration_ = "";
std::string Config_;
};
class Capabilities {
@@ -63,4 +64,3 @@ namespace OpenWifi::Config {
} // namespace
#endif //UCENTRAL_UCENTRALCONFIG_H

View File

@@ -17,7 +17,6 @@
#include "framework/MicroService.h"
#include "framework/uCentral_Protocol.h"
namespace OpenWifi {
void CommandManager::run() {
@@ -29,131 +28,156 @@ namespace OpenWifi {
break;
std::vector<GWObjects::CommandDetails> Commands;
if(StorageService()->GetReadyToExecuteCommands(1,200,Commands))
if(StorageService()->GetReadyToExecuteCommands(0,200,Commands))
{
for(auto & Cmd: Commands)
{
if(!Running_)
break;
uint64_t RPC_Id;
Poco::JSON::Parser P;
auto Params = P.parse(Cmd.Details).extract<Poco::JSON::Object::Ptr>();
if(SendCommand( Cmd.SerialNumber,
Cmd.Command,
*Params,
Cmd.UUID,
RPC_Id)) {
try {
Poco::JSON::Parser P;
bool Sent;
Logger().information(Poco::format("Parsing: %s", Cmd.UUID));
auto Params = P.parse(Cmd.Details).extract<Poco::JSON::Object::Ptr>();
Logger().information(Poco::format("Parsed: %s", Cmd.UUID));
auto Result = PostCommandDisk( Cmd.SerialNumber,
Cmd.Command,
*Params,
Cmd.UUID,
Sent);
if(Sent) {
StorageService()->SetCommandExecuted(Cmd.UUID);
Logger().information(Poco::format("%s: Sent command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
} else {
Logger().information(Poco::format("%s: Could not send command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
}
} catch (const Poco::Exception &E) {
Logger().information(Poco::format("%s: Failed command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
Logger().log(E);
StorageService()->SetCommandExecuted(Cmd.UUID);
Logger_.information(Poco::format("Sent command '%s' to '%s'",Cmd.Command,Cmd.SerialNumber));
} else {
Logger_.information(Poco::format("Failed to send command '%s' to %s",Cmd.Command,Cmd.SerialNumber));
}
} catch (...) {
Logger().information(Poco::format("%s: Exception - hard fail - Failed command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
StorageService()->SetCommandExecuted(Cmd.UUID);
}
}
}
Janitor();
}
}
int CommandManager::Start() {
Logger_.notice("Starting...");
Logger().notice("Starting...");
ManagerThread.start(*this);
JanitorCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(*this,&CommandManager::onTimer);
Timer_.setStartInterval( 10000 );
Timer_.setPeriodicInterval(5 * 60 * 1000); // 1 hours
Timer_.start(*JanitorCallback_);
return 0;
}
void CommandManager::Stop() {
Logger_.notice("Stopping...");
Logger().notice("Stopping...");
Running_ = false;
Timer_.stop();
ManagerThread.wakeUp();
ManagerThread.join();
}
void CommandManager::WakeUp() {
Logger_.notice("Waking up..");
Logger().notice("Waking up...");
ManagerThread.wakeUp();
}
void CommandManager::Janitor() {
void CommandManager::onTimer(Poco::Timer & timer) {
std::lock_guard G(Mutex_);
uint64_t Now = time(nullptr);
Logger_.information("Janitor starting.");
Logger().information("Removing expired commands: start");
auto Now = std::chrono::high_resolution_clock::now();
for(auto i=OutStandingRequests_.begin();i!=OutStandingRequests_.end();) {
if((Now-i->second.Submitted)>120)
std::chrono::duration<double, std::milli> delta = Now - i->second->submitted;
if(delta > 120000ms) {
i = OutStandingRequests_.erase(i);
else
} else {
++i;
}
}
Logger_.information("Janitor finished.");
Logger().information("Removing expired commands: done");
}
bool CommandManager::GetCommand(uint64_t Id, const std::string &SerialNumber, CommandTag &T) {
std::lock_guard G(Mutex_);
CommandTagIndex TI{.Id=Id,.SerialNumber=SerialNumber};
auto Hint=OutStandingRequests_.find(TI);
if(Hint==OutStandingRequests_.end() || Hint->second.Completed==0)
return false;
T = Hint->second;
OutStandingRequests_.erase(Hint);
return true;
}
bool CommandManager::SendCommand( const std::string &SerialNumber,
std::shared_ptr<CommandManager::promise_type_t> CommandManager::PostCommand( const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
uint64_t & Id,
bool oneway_rpc) {
bool oneway_rpc,
bool disk_only,
bool & Sent) {
std::stringstream ToSend;
std::unique_lock G(Mutex_);
if(oneway_rpc)
Id = 1;
else
Id = ++Id_;
Poco::JSON::Object CompleteRPC;
CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
CompleteRPC.set(uCentralProtocol::ID, Id);
CompleteRPC.set(uCentralProtocol::METHOD, Method);
CompleteRPC.set(uCentralProtocol::PARAMS, Params);
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
Logger_.information(
Poco::format("(%s): Sending command '%s', ID: %lu", SerialNumber, Method, Id));
CommandTagIndex Idx{.Id = Id, .SerialNumber = SerialNumber};
CommandTag Tag;
Tag.UUID = UUID;
Tag.Submitted = std::time(nullptr);
Tag.Completed = 0;
Tag.Result = Poco::makeShared<Poco::JSON::Object>();
OutStandingRequests_[Idx] = Tag;
G.unlock();
return DeviceRegistry()->SendFrame(SerialNumber, ToSend.str());
Sent=false;
if(!DeviceRegistry()->Connected(SerialNumber)) {
return nullptr;
}
std::stringstream ToSend;
auto Object = std::make_shared<RpcObject>();
CommandTagIndex Idx;
{
std::lock_guard M(Mutex_);
if (oneway_rpc)
Idx.Id = 1;
else
Idx.Id = ++Id_;
Idx.SerialNumber = SerialNumber;
Poco::JSON::Object CompleteRPC;
CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
CompleteRPC.set(uCentralProtocol::ID, Idx.Id);
CompleteRPC.set(uCentralProtocol::METHOD, Method);
CompleteRPC.set(uCentralProtocol::PARAMS, Params);
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
Logger().information(
Poco::format("(%s): Sending command '%s', ID: %lu", SerialNumber, Method, Idx.Id));
Object->submitted = std::chrono::high_resolution_clock::now();
Object->uuid = UUID;
if(disk_only) {
Object->rpc_entry = nullptr;
} else {
Object->rpc_entry = std::make_shared<CommandManager::promise_type_t>();
}
OutStandingRequests_[Idx] = Object;
}
if(DeviceRegistry()->SendFrame(SerialNumber, ToSend.str())) {
Sent=true;
return Object->rpc_entry;
}
return nullptr;
}
void CommandManager::PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj) {
if(!Obj->has(uCentralProtocol::ID)){
Logger_.error(Poco::format("(%s): Invalid RPC response.",SerialNumber));
Logger().error(Poco::format("(%s): Invalid RPC response.",SerialNumber));
return;
}
uint64_t ID = Obj->get(uCentralProtocol::ID);
if(ID<2) {
Logger_.error(Poco::format("(%s): Ignoring RPC response.",SerialNumber));
Logger().error(Poco::format("(%s): Ignoring RPC response.",SerialNumber));
return;
}
std::unique_lock G(Mutex_);
std::lock_guard G(Mutex_);
auto Idx = CommandTagIndex{.Id = ID, .SerialNumber = SerialNumber};
auto RPC = OutStandingRequests_.find(Idx);
if (RPC == OutStandingRequests_.end()) {
Logger_.warning(Poco::format("(%s): Outdated RPC %lu", SerialNumber, ID));
Logger().warning(Poco::format("(%s): Outdated RPC %lu", SerialNumber, ID));
return;
}
RPC->second.Completed = std::time(nullptr);
RPC->second.Result = Obj;
Logger_.information(Poco::format("(%s): Received RPC answer %lu", SerialNumber, ID));
G.unlock();
StorageService()->CommandCompleted(RPC->second.UUID, Obj, true);
std::chrono::duration<double, std::milli> rpc_execution_time = std::chrono::high_resolution_clock::now() - RPC->second->submitted;
StorageService()->CommandCompleted(RPC->second->uuid, Obj, rpc_execution_time, true);
if(RPC->second->rpc_entry) {
RPC->second->rpc_entry->set_value(Obj);
}
Logger().information(Poco::format("(%s): Received RPC answer %lu", SerialNumber, ID));
}
} // namespace

View File

@@ -6,8 +6,7 @@
// Arilia Wireless Inc.
//
#ifndef UCENTRAL_UCOMMANDMANAGER_H
#define UCENTRAL_UCOMMANDMANAGER_H
#pragma once
#include <chrono>
#include <future>
@@ -18,6 +17,7 @@
#include "Poco/JSON/Object.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Timer.h"
#include "RESTObjects//RESTAPI_GWobjects.h"
#include "framework/MicroService.h"
@@ -43,50 +43,108 @@ namespace OpenWifi {
return false;
}
struct CommandTag {
std::string UUID;
Poco::JSON::Object::Ptr Result;
uint64_t Submitted=0;
uint64_t Completed=0;
};
class CommandManager : public SubSystemServer, Poco::Runnable {
public:
typedef Poco::JSON::Object::Ptr objtype_t;
typedef std::promise<objtype_t> promise_type_t;
struct RpcObject {
std::string uuid;
std::chrono::time_point<std::chrono::high_resolution_clock> submitted = std::chrono::high_resolution_clock::now();
std::shared_ptr<promise_type_t> rpc_entry;
};
int Start() override;
void Stop() override;
void WakeUp();
void PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj);
bool SendCommand( const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
uint64_t & Id,
bool oneway_rpc=false);
void Janitor();
std::shared_ptr<promise_type_t> PostCommandOneWayDisk(
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(SerialNumber,
Method,
Params,
UUID,
true, true, Sent );
}
std::shared_ptr<promise_type_t> PostCommandDisk(
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(SerialNumber,
Method,
Params,
UUID,
false, true, Sent );
}
std::shared_ptr<promise_type_t> PostCommand(
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(SerialNumber,
Method,
Params,
UUID,
false,
false, Sent );
}
std::shared_ptr<promise_type_t> PostCommandOneWay(
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool & Sent) {
return PostCommand(SerialNumber,
Method,
Params,
UUID,
true,
false, Sent );
}
void run() override;
bool GetCommand(uint64_t Id, const std::string & SerialNumber, CommandTag &T);
static CommandManager *instance() {
static CommandManager *instance_ = new CommandManager;
static auto instance() {
static auto instance_ = new CommandManager;
return instance_;
}
inline bool Running() const { return Running_; }
void onTimer(Poco::Timer & timer);
private:
std::atomic_bool Running_ = false;
Poco::Thread ManagerThread;
uint64_t Id_=2; // do not start @1. We ignore ID=1 & 0 is illegal..
std::map<CommandTagIndex,CommandTag> OutStandingRequests_;
std::atomic_bool Running_ = false;
Poco::Thread ManagerThread;
uint64_t Id_=3; // do not start @1. We ignore ID=1 & 0 is illegal..
std::map<CommandTagIndex,std::shared_ptr<RpcObject>> OutStandingRequests_;
Poco::Timer Timer_;
std::unique_ptr<Poco::TimerCallback<CommandManager>> JanitorCallback_;
std::shared_ptr<promise_type_t> PostCommand(
const std::string &SerialNumber,
const std::string &Method,
const Poco::JSON::Object &Params,
const std::string &UUID,
bool oneway_rpc,
bool disk_only,
bool & Sent);
CommandManager() noexcept:
SubSystemServer("CommandManager", "CMD-MGR", "command.manager")
{
}
SubSystemServer("CommandManager", "CMD-MGR", "command.manager") {
}
};
inline CommandManager * CommandManager() { return CommandManager::instance(); }
inline auto CommandManager() { return CommandManager::instance(); }
} // namespace
#endif //UCENTRAL_UCOMMANDMANAGER_H

View File

@@ -1,8 +0,0 @@
//
// Created by stephane bourque on 2021-09-21.
//
#include "ConfigurationCache.h"
namespace OpenWifi {
}

View File

@@ -2,12 +2,12 @@
// Created by stephane bourque on 2021-09-21.
//
#ifndef OWGW_CONFIGURATIONCACHE_H
#define OWGW_CONFIGURATIONCACHE_H
#pragma once
#include <map>
#include <string>
#include <mutex>
#include "framework/MicroService.h"
namespace OpenWifi {
class ConfigurationCache {
@@ -18,7 +18,7 @@ namespace OpenWifi {
return instance;
}
inline uint64_t CurrentConfig(const std::string &SerialNumber) {
inline uint64_t CurrentConfig(uint64_t SerialNumber) {
std::lock_guard G(Mutex_);
const auto Hint = Cache_.find(SerialNumber);
if(Hint==end(Cache_))
@@ -26,17 +26,25 @@ namespace OpenWifi {
return Hint->second;
}
inline void Add(const std::string &SerialNumber, uint64_t Id) {
inline void Add(uint64_t SerialNumber, uint64_t Id) {
std::lock_guard G(Mutex_);
Cache_[SerialNumber]=Id;
}
private:
std::mutex Mutex_;
std::map<std::string,uint64_t> Cache_;
std::recursive_mutex Mutex_;
std::map<uint64_t,uint64_t> Cache_;
};
inline uint64_t GetCurrentConfigurationID(const std::string &S) { return ConfigurationCache::instance().CurrentConfig(S); }
inline void SetCurrentConfigurationID(const std::string &S, uint64_t ID) { ConfigurationCache::instance().Add(S,ID); }
inline uint64_t GetCurrentConfigurationID(uint64_t SerialNumber) {
return ConfigurationCache::instance().CurrentConfig(SerialNumber);
}
inline void SetCurrentConfigurationID(const std::string & SerialNumber, uint64_t ID) {
return ConfigurationCache::instance().Add(Utils::SerialNumberToInt(SerialNumber), ID);
}
inline void SetCurrentConfigurationID(uint64_t SerialNumber, uint64_t ID) {
return ConfigurationCache::instance().Add(SerialNumber, ID);
}
}
#endif // OWGW_CONFIGURATIONCACHE_H

View File

@@ -21,9 +21,11 @@
#include "StorageArchiver.h"
#include "StorageService.h"
#include "TelemetryStream.h"
#include "WebSocketServer.h"
#include "WS_Server.h"
#include "framework/ConfigurationValidator.h"
#include "framework/MicroService.h"
#include "FindCountry.h"
#include "rttys/RTTYS_server.h"
namespace OpenWifi {
class Daemon *Daemon::instance() {
@@ -33,45 +35,58 @@ namespace OpenWifi {
vDAEMON_APP_NAME,
vDAEMON_BUS_TIMER,
SubSystemVec{
StorageService(),
SerialNumberCache(),
ConfigurationValidator(),
DeviceRegistry(),
WebSocketServer(),
CommandManager(),
FileUploader(),
OUIServer(),
StorageArchiver(),
TelemetryStream()
});
StorageService(),
SerialNumberCache(),
ConfigurationValidator(),
OUIServer(),
FindCountryFromIP(),
DeviceRegistry(),
CommandManager(),
FileUploader(),
StorageArchiver(),
TelemetryStream(),
RTTYS_server(),
WebSocketServer()
});
return &instance;
}
static const std::vector<std::pair<std::string,std::string>> DefaultDeviceTypes{
{"cig_wf160d","AP"},
{"cig_wf188","AP"},
{"cig_wf188n","AP"},
{"cig_wf194c","AP"},
{"cig_wf194c4","AP"},
{"edgecore_eap101","AP"},
{"edgecore_eap102","AP"},
{"edgecore_ecs4100-12ph","AP"},
{"edgecore_ecw5211","AP"},
{"edgecore_ecw5410","AP"},
{"edgecore_oap100","AP"},
{"edgecore_spw2ac1200","SWITCH"},
{"edgecore_spw2ac1200-lan-poe","SWITCH"},
{"edgecore_ssw2ac2600","SWITCH"},
{"hfcl_ion4","AP"},
{"indio_um-305ac","AP"},
{"linksys_e8450-ubi","AP"},
{"linksys_ea6350","AP"},
{"linksys_ea6350-v4","AP"},
{"linksys_ea8300","AP"},
{"mikrotik_nand","AP"},
{"tp-link_ec420-g1","AP"},
{"tplink_cpe210_v3","AP"},
{"tplink_cpe510_v3","AP"},
{"tplink_eap225_outdoor_v1","AP"},
{"tplink_ec420","AP"},
{"tplink_ex227","AP"},
{"tplink_ex228","AP"},
{"tplink_ex447","AP"},
{"wallys_dr40x9","AP"}
};
void Daemon::initialize() {
Config::Config::Init();
AutoProvisioning_ = config().getBool("openwifi.autoprovisioning",false);
// DeviceTypeIdentifications_
Types::StringVec Keys;
config().keys("openwifi.devicetypes",Keys);
for(const auto & i:Keys)
{
std::string Line = config().getString("openwifi.devicetypes."+i);
auto P1 = Line.find_first_of(':');
auto Type = Line.substr(0, P1);
auto List = Line.substr(P1+1);
Types::StringVec Tokens = Utils::Split(List);
auto Entry = DeviceTypeIdentifications_.find(Type);
if(DeviceTypeIdentifications_.end() == Entry) {
std::set<std::string> S;
S.insert(Tokens.begin(),Tokens.end());
DeviceTypeIdentifications_[Type] = S;
} else {
Entry->second.insert(Tokens.begin(),Tokens.end());
}
}
DeviceTypes_ = DefaultDeviceTypes;
}
void MicroServicePostInitialization() {
@@ -79,16 +94,15 @@ namespace OpenWifi {
}
[[nodiscard]] std::string Daemon::IdentifyDevice(const std::string & Id ) const {
for(const auto &[Type,List]:DeviceTypeIdentifications_)
for(const auto &[DeviceType,Type]:DeviceTypes_)
{
if(List.find(Id)!=List.end())
return Type;
if(Id == DeviceType)
return Type;
}
return "AP";
}
}
int main(int argc, char **argv) {
try {

View File

@@ -6,8 +6,7 @@
// Arilia Wireless Inc.
//
#ifndef UCENTRAL_UCENTRAL_H
#define UCENTRAL_UCENTRAL_H
#pragma once
#include <array>
#include <iostream>
@@ -55,7 +54,7 @@ namespace OpenWifi {
Poco::Logger & Log() { return Poco::Logger::get(AppName()); }
private:
bool AutoProvisioning_ = false;
Types::StringMapStringSet DeviceTypeIdentifications_;
std::vector<std::pair<std::string,std::string>> DeviceTypes_;
DeviceDashboard DB_;
};
@@ -63,4 +62,3 @@ namespace OpenWifi {
inline Daemon * Daemon() { return Daemon::instance(); }
}
#endif //UCENTRAL_UCENTRAL_H

View File

@@ -2,8 +2,7 @@
// Created by stephane bourque on 2021-07-21.
//
#ifndef UCENTRALGW_DASHBOARD_H
#define UCENTRALGW_DASHBOARD_H
#pragma once
#include "RESTObjects//RESTAPI_GWobjects.h"
#include "framework/OpenWifiTypes.h"
@@ -21,4 +20,3 @@ namespace OpenWifi {
};
}
#endif // UCENTRALGW_DASHBOARD_H

View File

@@ -10,39 +10,35 @@
#include "Poco/JSON/Parser.h"
#include "DeviceRegistry.h"
#include "WebSocketServer.h"
#include "framework/MicroService.h"
#include "WS_Server.h"
#include "OUIServer.h"
namespace OpenWifi {
int DeviceRegistry::Start() {
std::lock_guard Guard(Mutex_);
Logger_.notice("Starting ");
Logger().notice("Starting ");
return 0;
}
void DeviceRegistry::Stop() {
std::lock_guard Guard(Mutex_);
Logger_.notice("Stopping ");
Logger().notice("Stopping ");
}
bool DeviceRegistry::GetStatistics(const std::string &SerialNumber, std::string & Statistics) {
bool DeviceRegistry::GetStatistics(uint64_t SerialNumber, std::string & Statistics) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device == Devices_.end())
return false;
Statistics = Device->second->LastStats;
return true;
}
void DeviceRegistry::SetStatistics(const std::string &SerialNumber, const std::string &Statistics) {
void DeviceRegistry::SetStatistics(uint64_t SerialNumber, const std::string &Statistics) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end())
{
Device->second->Conn_.LastContact = time(nullptr);
@@ -50,7 +46,7 @@ namespace OpenWifi {
}
}
bool DeviceRegistry::GetState(const std::string &SerialNumber, GWObjects::ConnectionState & State) {
bool DeviceRegistry::GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device == Devices_.end())
@@ -60,7 +56,7 @@ namespace OpenWifi {
return true;
}
void DeviceRegistry::SetState(const std::string & SerialNumber, GWObjects::ConnectionState & State) {
void DeviceRegistry::SetState(uint64_t SerialNumber, const GWObjects::ConnectionState & State) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end())
@@ -70,7 +66,7 @@ namespace OpenWifi {
}
}
bool DeviceRegistry::GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) {
bool DeviceRegistry::GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
@@ -81,71 +77,59 @@ namespace OpenWifi {
return false;
}
void DeviceRegistry::SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck & CheckData) {
void DeviceRegistry::SetHealthcheck(uint64_t SerialNumber, const GWObjects::HealthCheck & CheckData) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end())
{
Device->second->LastHealthcheck = CheckData;
}
}
std::shared_ptr<DeviceRegistry::ConnectionEntry> DeviceRegistry::Register(const std::string & SerialNumber, WSConnection *Ptr)
std::shared_ptr<DeviceRegistry::ConnectionEntry> DeviceRegistry::Register(uint64_t SerialNumber, WSConnection *Ptr, uint64_t & ConnectionId )
{
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if( Device == Devices_.end()) {
auto E = Devices_[SerialNumber] = std::make_shared<ConnectionEntry>();
E->WSConn_ = Ptr;
E->Conn_.SerialNumber = SerialNumber;
E->Conn_.LastContact = std::time(nullptr);
E->Conn_.Connected = true ;
E->Conn_.UUID = 0 ;
E->Conn_.MessageCount = 0 ;
E->Conn_.Address = "";
E->Conn_.TX = 0 ;
E->Conn_.RX = 0;
E->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
return E;
}
else
{
Device->second->WSConn_ = Ptr;
Device->second->Conn_.Connected = true;
Device->second->Conn_.LastContact = std::time(nullptr);
Device->second->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
return Device->second;
}
const auto & E = Devices_[SerialNumber] = std::make_shared<ConnectionEntry>();
E->WSConn_ = Ptr;
E->Conn_.LastContact = std::time(nullptr);
E->Conn_.Connected = true ;
E->Conn_.UUID = 0 ;
E->Conn_.MessageCount = 0 ;
E->Conn_.Address = "";
E->Conn_.TX = 0 ;
E->Conn_.RX = 0;
E->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
ConnectionId = E->ConnectionId = ++Id_;
return E;
}
bool DeviceRegistry::Connected(const std::string & SerialNumber) {
bool DeviceRegistry::Connected(uint64_t SerialNumber) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device == Devices_.end())
return false;
return Device->second->Conn_.Connected;
}
void DeviceRegistry::UnRegister(const std::string & SerialNumber, WSConnection *Ptr) {
void DeviceRegistry::UnRegister(uint64_t SerialNumber, uint64_t ConnectionId) {
std::lock_guard Guard(Mutex_);
Devices_.erase(SerialNumber);
}
auto It = Devices_.find(SerialNumber);
if(It!=Devices_.end()) {
if(It->second->ConnectionId == ConnectionId)
Devices_.erase(SerialNumber);
}
}
bool DeviceRegistry::SendFrame(const std::string & SerialNumber, const std::string & Payload) {
bool DeviceRegistry::SendFrame(uint64_t SerialNumber, const std::string & Payload) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device!=Devices_.end() && Device->second->WSConn_!= nullptr) {
try {
return Device->second->WSConn_->Send(Payload);
} catch (...) {
Logger_.debug(Poco::format("Could not send data to device '%s'", SerialNumber));
Logger().debug(Poco::format("Could not send data to device '%s'", SerialNumber));
Device->second->Conn_.Address = "";
Device->second->WSConn_ = nullptr;
Device->second->Conn_.Connected = false;
@@ -155,7 +139,7 @@ namespace OpenWifi {
return false;
}
void DeviceRegistry::SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID) {
void DeviceRegistry::SetPendingUUID(uint64_t SerialNumber, uint64_t PendingUUID) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device!=Devices_.end()) {
@@ -163,103 +147,4 @@ namespace OpenWifi {
}
}
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) {
std::lock_guard Guard(Mutex_);
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;
}
} // namespace

View File

@@ -6,8 +6,7 @@
// Arilia Wireless Inc.
//
#ifndef UCENTRAL_UDEVICEREGISTRY_H
#define UCENTRAL_UDEVICEREGISTRY_H
#pragma once
#include "Poco/JSON/Object.h"
@@ -22,44 +21,98 @@ namespace OpenWifi {
class DeviceRegistry : public SubSystemServer {
public:
struct ConnectionEntry {
WSConnection *WSConn_;
WSConnection * WSConn_ = nullptr;
GWObjects::ConnectionState Conn_;
std::string LastStats;
GWObjects::HealthCheck LastHealthcheck;
uint64_t ConnectionId=0;
};
static DeviceRegistry *instance() {
static DeviceRegistry *instance_ = new DeviceRegistry;
static auto instance() {
static auto instance_ = new DeviceRegistry;
return instance_;
}
int Start() override;
void Stop() override;
bool GetStatistics(const std::string &SerialNumber, std::string & Statistics);
void SetStatistics(const std::string &SerialNumber, const std::string &stats);
bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
void SetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData);
void SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck &H);
std::shared_ptr<ConnectionEntry> Register(const std::string & SerialNumber, WSConnection *);
void UnRegister(const std::string & SerialNumber, WSConnection *);
bool SendCommand(GWObjects::CommandDetails & Command);
bool Connected(const std::string & SerialNumber);
bool SendFrame(const std::string & SerialNumber, const std::string & Payload);
void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID);
bool AnalyzeRegistry(GWObjects::Dashboard &D);
inline bool GetStatistics(const std::string &SerialNumber, std::string & Statistics) {
return GetStatistics(Utils::SerialNumberToInt(SerialNumber),Statistics);
}
bool GetStatistics(uint64_t SerialNumber, std::string & Statistics);
inline void SetStatistics(const std::string &SerialNumber, const std::string &Statistics) {
return SetStatistics(Utils::SerialNumberToInt(SerialNumber),Statistics);
}
void SetStatistics(uint64_t SerialNumber, const std::string &stats);
inline bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State) {
return GetState(Utils::SerialNumberToInt(SerialNumber), State);
}
bool GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State);
inline void SetState(const std::string & SerialNumber, const GWObjects::ConnectionState & State) {
return SetState(Utils::SerialNumberToInt(SerialNumber), State);
}
void SetState(uint64_t SerialNumber, const GWObjects::ConnectionState & State);
inline bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) {
return GetHealthcheck(Utils::SerialNumberToInt(SerialNumber), CheckData);
}
bool GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData);
inline void SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck &H) {
return SetHealthcheck(Utils::SerialNumberToInt(SerialNumber),H);
}
void SetHealthcheck(uint64_t SerialNumber, const GWObjects::HealthCheck &H);
std::shared_ptr<ConnectionEntry> Register(uint64_t SerialNumber, WSConnection *Conn, uint64_t & ConnectionId);
inline void UnRegister(const std::string & SerialNumber, uint64_t ConnectionId) {
return UnRegister(Utils::SerialNumberToInt(SerialNumber),ConnectionId);
}
void UnRegister(uint64_t SerialNumber, uint64_t ConnectionId);
inline bool Connected(const std::string & SerialNumber) {
return Connected(Utils::SerialNumberToInt(SerialNumber));
}
bool Connected(uint64_t SerialNumber);
inline bool SendFrame(const std::string & SerialNumber, const std::string & Payload) {
return SendFrame(Utils::SerialNumberToInt(SerialNumber), Payload);
}
bool SendFrame(uint64_t SerialNumber, const std::string & Payload);
inline void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID) {
return SetPendingUUID(Utils::SerialNumberToInt(SerialNumber), PendingUUID);
}
void SetPendingUUID(uint64_t SerialNumber, uint64_t PendingUUID);
[[nodiscard]] inline std::shared_ptr<ConnectionEntry> GetDeviceConnection(const std::string & SerialNumber) {
return GetDeviceConnection(Utils::SerialNumberToInt(SerialNumber));
}
[[nodiscard]] inline std::shared_ptr<ConnectionEntry> GetDeviceConnection(uint64_t SerialNumber) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device!=Devices_.end() && Device->second->WSConn_!= nullptr) {
return Device->second;
}
return nullptr;
}
private:
std::map<std::string,std::shared_ptr<ConnectionEntry>> Devices_;
inline static std::atomic_uint64_t Id_=1;
std::map<uint64_t ,std::shared_ptr<ConnectionEntry>> Devices_;
DeviceRegistry() noexcept:
SubSystemServer("DeviceRegistry", "DevStatus", "devicestatus") {
}
};
inline DeviceRegistry * DeviceRegistry() { return DeviceRegistry::instance(); }
inline auto DeviceRegistry() { return DeviceRegistry::instance(); }
} // namespace
#endif //UCENTRAL_UDEVICEREGISTRY_H

View File

@@ -29,7 +29,7 @@ namespace OpenWifi {
static const std::string URI_BASE{"/v1/upload/"};
int FileUploader::Start() {
Logger_.notice("Starting.");
Logger().notice("Starting.");
Poco::File UploadsDir(MicroService::instance().ConfigPath("openwifi.fileuploader.path","/tmp"));
Path_ = UploadsDir.path();
@@ -37,7 +37,7 @@ namespace OpenWifi {
try {
UploadsDir.createDirectory();
} catch (const Poco::Exception &E) {
Logger_.log(E);
Logger().log(E);
Path_ = "/tmp";
}
}
@@ -46,13 +46,13 @@ namespace OpenWifi {
Svr.Address() + ":" + std::to_string(Svr.Port()) +
" key:" + Svr.KeyFile() +
" cert:" + Svr.CertFile()};
Logger_.information(l);
Logger().information(l);
auto Sock{Svr.CreateSecureSocket(Logger_)};
auto Sock{Svr.CreateSecureSocket(Logger())};
Svr.LogCert(Logger_);
Svr.LogCert(Logger());
if(!Svr.RootCA().empty())
Svr.LogCas(Logger_);
Svr.LogCas(Logger());
auto Params = new Poco::Net::HTTPServerParams;
Params->setMaxThreads(16);
@@ -66,10 +66,10 @@ namespace OpenWifi {
} else {
FullName_ = TmpName + URI_BASE ;
}
Logger_.information(Poco::format("Uploader URI base is '%s'", FullName_));
Logger().information(Poco::format("Uploader URI base is '%s'", FullName_));
}
auto NewServer = std::make_unique<Poco::Net::HTTPServer>(new FileUpLoaderRequestHandlerFactory(Logger_), Pool_, Sock, Params);
auto NewServer = std::make_unique<Poco::Net::HTTPServer>(new FileUpLoaderRequestHandlerFactory(Logger()), Pool_, Sock, Params);
NewServer->start();
Servers_.push_back(std::move(NewServer));
}
@@ -81,7 +81,7 @@ namespace OpenWifi {
void FileUploader::reinitialize(Poco::Util::Application &self) {
MicroService::instance().LoadConfigurationFile();
Logger_.information("Reinitializing.");
Logger().information("Reinitializing.");
Stop();
Start();
}
@@ -144,7 +144,7 @@ namespace OpenWifi {
std::string FinalFileName = FileUploader()->Path() + "/" + UUID_;
Logger_.information(Poco::format("FILE-UPLOADER: uploading trace for %s", FinalFileName));
Logger().information(Poco::format("FILE-UPLOADER: uploading trace for %s", FinalFileName));
Poco::CountingInputStream InputStream(Stream);
std::ofstream OutputStream(FinalFileName, std::ofstream::out);
Poco::StreamCopier::copyStream(InputStream, OutputStream);
@@ -159,7 +159,7 @@ namespace OpenWifi {
}
return;
} catch (const Poco::Exception &E ) {
Logger_.log(E);
Logger().log(E);
Error_ = std::string("Upload caused an internal error: ") + E.what() ;
}
}
@@ -168,6 +168,7 @@ namespace OpenWifi {
[[nodiscard]] const std::string& Name() const { return Name_; }
[[nodiscard]] bool Good() const { return Good_; }
std::string & Error() { return Error_; }
inline Poco::Logger & Logger() { return Logger_; }
private:
uint64_t Length_=0;
@@ -191,7 +192,7 @@ namespace OpenWifi {
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override
{
try {
FileUploaderPartHandler partHandler(UUID_,Logger_);
FileUploaderPartHandler partHandler(UUID_,Logger());
Poco::Net::HTMLForm form(Request, Request.stream(), partHandler);
@@ -215,12 +216,13 @@ namespace OpenWifi {
}
catch( const Poco::Exception & E )
{
Logger_.warning(Poco::format("Error occurred while performing upload. Error='%s'",E.displayText()));
Logger().warning(Poco::format("Error occurred while performing upload. Error='%s'",E.displayText()));
}
catch( ... )
{
}
}
inline Poco::Logger & Logger() { return Logger_; }
private:
std::string UUID_;
Poco::Logger & Logger_;
@@ -228,7 +230,7 @@ namespace OpenWifi {
Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
Logger_.debug(Poco::format("REQUEST(%s): %s %s", 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...
auto UUIDLocation = Request.getURI().find_first_of(URI_BASE);
@@ -240,18 +242,18 @@ namespace OpenWifi {
{
// make sure we do not allow anyone else to overwrite our file
FileUploader()->RemoveRequest(UUID);
return new FormRequestHandler(UUID,Logger_);
return new FormRequestHandler(UUID,Logger());
}
else
{
Logger_.warning(Poco::format("Unknown UUID=%s",UUID));
Logger().warning(Poco::format("Unknown UUID=%s",UUID));
}
}
return nullptr;
}
void FileUploader::Stop() {
Logger_.notice("Stopping ");
Logger().notice("Stopping ");
for( const auto & svr : Servers_ )
svr->stop();
Servers_.clear();

View File

@@ -6,8 +6,7 @@
// Arilia Wireless Inc.
//
#ifndef UCENTRAL_UFILEUPLOADER_H
#define UCENTRAL_UFILEUPLOADER_H
#pragma once
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h"
@@ -29,8 +28,8 @@ namespace OpenWifi {
void RemoveRequest(const std::string &UUID);
const std::string & Path() { return Path_; };
static FileUploader *instance() {
static FileUploader * instance_ = new FileUploader;
static auto instance() {
static auto instance_ = new FileUploader;
return instance_;
}
@@ -45,7 +44,8 @@ namespace OpenWifi {
uint64_t MaxSize_=10000000;
explicit FileUploader() noexcept:
SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader")
SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader"),
Pool_("FileUpLoaderPool")
{
}
};
@@ -56,11 +56,11 @@ namespace OpenWifi {
Logger_(L){}
Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &request) override;
inline Poco::Logger & Logger() { return Logger_; }
private:
Poco::Logger & Logger_;
};
inline FileUploader * FileUploader() { return FileUploader::instance(); }
inline auto FileUploader() { return FileUploader::instance(); }
} // namespace
#endif //UCENTRAL_UFILEUPLOADER_H

198
src/FindCountry.h Normal file
View File

@@ -0,0 +1,198 @@
//
// Created by stephane bourque on 2021-11-20.
//
#pragma once
#include "framework/MicroService.h"
#include "Poco/Net/IPAddress.h"
#include "nlohmann/json.hpp"
namespace OpenWifi {
class IPToCountryProvider {
public:
virtual bool Init() = 0 ;
virtual Poco::URI URI(const std::string & IPAddress) = 0;
virtual std::string Country( const std::string & Response ) = 0 ;
virtual ~IPToCountryProvider() {
};
};
class IPInfo : public IPToCountryProvider {
public:
static std::string Name() { return "ipinfo"; }
inline bool Init() override {
Key_ = MicroService::instance().ConfigGetString("iptocountry.ipinfo.token", "");
return !Key_.empty();
}
[[nodiscard]] inline Poco::URI URI(const std::string & IPAddress) override {
Poco::URI U("https://ipinfo.io");
U.setPath("/" + IPAddress);
U.addQueryParameter("token",Key_);
return U;
}
inline std::string Country( const std::string & Response ) override {
try {
nlohmann::json IPInfo = nlohmann::json::parse(Response);
if (IPInfo.contains("country") && IPInfo["country"].is_string()) {
return IPInfo["country"];
}
} catch (...) {
}
return "";
}
private:
std::string Key_;
};
class IPData : public IPToCountryProvider {
public:
static std::string Name() { return "ipdata"; }
inline bool Init() override {
Key_ = MicroService::instance().ConfigGetString("iptocountry.ipdata.apikey", "");
return !Key_.empty();
}
[[nodiscard]] inline Poco::URI URI(const std::string & IPAddress) override {
Poco::URI U("https://api.ipdata.co");
U.setPath("/" + IPAddress);
U.addQueryParameter("api-key",Key_);
return U;
}
inline std::string Country( const std::string & Response ) override {
try {
nlohmann::json IPInfo = nlohmann::json::parse(Response);
if (IPInfo.contains("country_code") && IPInfo["country_code"].is_string()) {
return IPInfo["country_code"];
}
} catch (...) {
}
return "";
}
private:
std::string Key_;
};
class IP2Location : public IPToCountryProvider {
public:
static std::string Name() { return "ip2location"; }
inline bool Init() override {
Key_ = MicroService::instance().ConfigGetString("iptocountry.ip2location.apikey", "");
return !Key_.empty();
}
[[nodiscard]] inline Poco::URI URI(const std::string & IPAddress) override {
Poco::URI U("https://api.ip2location.com/v2");
U.setPath("/");
U.addQueryParameter("ip", IPAddress);
U.addQueryParameter("package", "WS1");
U.addQueryParameter("key",Key_);
return U;
}
inline std::string Country( const std::string & Response ) override {
try {
nlohmann::json IPInfo = nlohmann::json::parse(Response);
if (IPInfo.contains("country_code") && IPInfo["country_code"].is_string()) {
return IPInfo["country_code"];
}
} catch (...) {
}
return "";
}
private:
std::string Key_;
};
template<typename BaseClass, typename T, typename... Args>
std::unique_ptr<BaseClass> IPLocationProvider(const std::string & RequestProvider ) {
if(T::Name()==RequestProvider) {
return std::make_unique<T>();
}
if constexpr (sizeof...(Args) == 0) {
return nullptr;
} else {
return IPLocationProvider<BaseClass, Args...>(RequestProvider);
}
}
class FindCountryFromIP : public SubSystemServer {
public:
static auto instance() {
static auto instance_ = new FindCountryFromIP;
return instance_;
}
inline int Start() final {
ProviderName_ = MicroService::instance().ConfigGetString("iptocountry.provider","");
if(!ProviderName_.empty()) {
Provider_ = IPLocationProvider<IPToCountryProvider, IPInfo, IPData, IP2Location>(ProviderName_);
if(Provider_!= nullptr) {
Enabled_ = Provider_->Init();
}
}
Default_ = MicroService::instance().ConfigGetString("iptocountry.default", "US");
return 0;
}
inline void Stop() final {
}
[[nodiscard]] static inline std::string ReformatAddress(const std::string & I )
{
if(I.substr(0,7) == "::ffff:")
{
std::string ip = I.substr(7 );
return ip;
}
return I;
}
inline std::string Get(const Poco::Net::IPAddress & IP) {
if (!Enabled_)
return Default_;
return Get(ReformatAddress(IP.toString()));
}
inline std::string Get(const std::string & IP) {
if (!Enabled_)
return Default_;
try {
std::string URL = Provider_->URI(IP).toString();
std::string Response;
if (Utils::wgets(URL, Response)) {
auto Answer = Provider_->Country(Response);
if(!Answer.empty())
return Answer;
}
} catch(...) {
}
return Default_;
}
inline auto Enabled() const { return Enabled_; }
private:
bool Enabled_=false;
std::string Default_;
std::unique_ptr<IPToCountryProvider> Provider_;
std::string ProviderName_;
FindCountryFromIP() noexcept:
SubSystemServer("IpToCountry", "IPTOC-SVR", "iptocountry")
{
}
};
inline auto FindCountryFromIP() { return FindCountryFromIP::instance(); }
}

View File

@@ -20,32 +20,29 @@
namespace OpenWifi {
int OUIServer::Start() {
Running_=true;
std::thread Updater([this]() { this->UpdateImpl(); });
Updater.detach();
Running_ = true;
UpdaterCallBack_ = std::make_unique<Poco::TimerCallback<OUIServer>>(*this, &OUIServer::onTimer);
Timer_.setStartInterval(30 * 1000); // first run in 5 minutes
Timer_.setPeriodicInterval(7 * 24 * 60 * 60 * 1000);
Timer_.start(*UpdaterCallBack_);
return 0;
}
void OUIServer::Stop() {
Running_=false;
}
void OUIServer::Update() {
if(!Running_)
return;
std::thread Updater([this]() { this->UpdateImpl(); });
Updater.detach();
Timer_.stop();
}
void OUIServer::reinitialize(Poco::Util::Application &self) {
MicroService::instance().LoadConfigurationFile();
Logger_.information("Reinitializing.");
Logger().information("Reinitializing.");
Stop();
Start();
}
bool OUIServer::GetFile(const std::string &FileName) {
try {
Logger().information(Poco::format("Start: Retrieving OUI file: %s",MicroService::instance().ConfigGetString("oui.download.uri")));
std::unique_ptr<std::istream> pStr(
Poco::URIStreamOpener::defaultOpener().open(MicroService::instance().ConfigGetString("oui.download.uri")));
std::ofstream OS;
@@ -55,10 +52,10 @@ namespace OpenWifi {
OS.open(FileName);
Poco::StreamCopier::copyStream(*pStr, OS);
OS.close();
Logger().information(Poco::format("Done: Retrieving OUI file: %s",MicroService::instance().ConfigGetString("oui.download.uri")));
return true;
} catch (const Poco::Exception &E) {
Logger_.log(E);
Logger().log(E);
}
return false;
}
@@ -69,7 +66,9 @@ namespace OpenWifi {
Input.open(FileName, std::ios::binary);
while (!Input.eof()) {
char buf[256];
if(!Running_)
return false;
char buf[1024];
Input.getline(buf, sizeof(buf));
std::string Line{buf};
auto Tokens = Poco::StringTokenizer(Line, " \t",
@@ -92,12 +91,12 @@ namespace OpenWifi {
}
return true;
} catch ( const Poco::Exception &E) {
Logger_.log(E);
Logger().log(E);
}
return false;
}
void OUIServer::UpdateImpl() {
void OUIServer::onTimer(Poco::Timer & timer) {
if(Updating_)
return;
Updating_ = true;
@@ -110,16 +109,16 @@ namespace OpenWifi {
if(GetFile(LatestOUIFileName) && ProcessFile(LatestOUIFileName, TmpOUIs)) {
std::lock_guard G(Mutex_);
OUIs_ = std::move(TmpOUIs);
LastUpdate_ = time(nullptr);
LastUpdate_ = std::time(nullptr);
Poco::File F1(CurrentOUIFileName);
if(F1.exists())
F1.remove();
Poco::File F2(LatestOUIFileName);
F2.renameTo(CurrentOUIFileName);
Logger_.information(Poco::format("New OUI file %s downloaded.",LatestOUIFileName));
Logger().information(Poco::format("New OUI file %s downloaded.",LatestOUIFileName));
} else if(OUIs_.empty()) {
if(ProcessFile(CurrentOUIFileName, TmpOUIs)) {
LastUpdate_ = time(nullptr);
LastUpdate_ = std::time(nullptr);
std::lock_guard G(Mutex_);
OUIs_ = std::move(TmpOUIs);
}

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