ul-data-gateway-sdk 0.4.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ul-data-gateway-sdk-0.4.5/PKG-INFO +276 -0
- ul-data-gateway-sdk-0.4.5/README.md +259 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/__tests__/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/__tests__/test_encryption.py +13 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/__tests__/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/__tests__/crypto_test.py +80 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/constants/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/constants/constants_aes.py +45 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/constants/constants_kuz.py +88 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/constants/kuz_tables.bin +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/crypto_aes.py +371 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/crypto_kuznechik.py +219 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/crypto_xtea.py +113 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/extensions/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/extensions/errors.py +19 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/crypto_algorithms/extensions/type_alias.py +5 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/device_data.py +387 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/device_data_encryption.py +57 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/device_data_protocol.py +86 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/errors.py +19 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/messages/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/messages/input_bs_http_nero_message.py +7 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/nero_bs_protocol.py +37 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/__tests__/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/__tests__/test_device_protocol.py +1081 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/device_packet.py +55 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/ncp_smp_device_packet.py +57 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/smp_device_packet.py +63 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/smpm_device_packet.py +119 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/device_packet/water5_device_packet.py +118 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/__tests__/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/__tests__/http_nero_bs_packet.py +282 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/__tests__/test_bs_protocol.py +258 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/http_nero_bs_packet.py +317 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/kafka_nero_bs_packet.py +143 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/nero_bs_packet/nero_bs_packet.py +16 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_3phase_consumed.py +107 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_3phase_generated.py +107 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_daily.py +106 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_info.py +34 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_journal.py +23 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h1_energy.py +35 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h2_energy.py +35 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h3_energy.py +35 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h_ar.py +34 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h_f.py +22 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_profile_8h_pqs.py +34 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_tariff_consumed.py +107 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_energy_16b_tariff_generated.py +107 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_gaz_flow_08b_daily.py +32 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_gaz_flow_16b_daily.py +779 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_heat_proxy_meter_16b_daily.py +104 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_internal_info.py +11 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_08b_counter.py +20 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_08b_counter_ch1.py +32 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_08b_counter_ch2.py +32 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_12b_counter.py +56 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_jupiter_16b_counter.py +394 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_04b_event.py +20 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_08b_daily.py +32 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_08b_info.py +20 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_12b_daily.py +394 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/smpm_ul_device_water_meter_16b_daily.py +778 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/__tests__/test_self_package_tests.py +22 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_3phase_consumed.py +145 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_3phase_generated.py +141 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_daily.py +236 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_info.py +107 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_journal.py +453 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h1_energy.py +223 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h2_energy.py +222 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h3_energy.py +222 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h_ar.py +308 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h_f.py +281 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_profile_8h_pqs.py +431 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_tariff_consumed.py +173 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_energy_16b_tariff_generated.py +172 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_gaz_flow_08b_daily.py +146 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_gaz_flow_16b_daily.py +253 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_heat_proxy_meter_16b_daily.py +143 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_internal_info.py +100 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_08b_counter.py +93 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_08b_counter_ch1.py +103 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_08b_counter_ch2.py +103 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_12b_counter.py +126 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_jupiter_16b_counter.py +175 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_04b_event.py +117 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_08b_daily.py +172 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_08b_info.py +100 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_12b_daily.py +240 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/smpm/smpm_ul_device_water_meter_16b_daily.py +262 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/udp_wrapper/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/udp_wrapper/__tests__/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/udp_wrapper/__tests__/unbp_len.py +20 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/udp_wrapper/unbp_len.py +115 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/test_self_package_tests.py +22 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_cold_reset.py +13 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_daily.py +13 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_info_ch1.py +13 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_info_ch2.py +13 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_magnet.py +9 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_fluo_a.py +39 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_fluo_freescale.py +72 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_fluo_stm.py +72 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_jupiter_freescale.py +72 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_jupiter_stm.py +40 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_warm_reset_v_metano_a.py +72 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch1.py +43 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch1_impulse.py +43 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch1_impulse_v2.py +44 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch2.py +43 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch2_impulse.py +43 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/__tests__/water5_device_weekly_ch2_impulse_v2.py +44 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_cold_reset.py +64 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_daily.py +63 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_info_ch1.py +64 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_info_ch2.py +65 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_magnet.py +47 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_fluo_a.py +88 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_fluo_freescale.py +97 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_fluo_stm.py +93 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_jupiter_freescale.py +89 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_jupiter_stm.py +86 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_warm_reset_v_metano_a.py +97 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch1.py +83 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch1_impulse.py +84 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch1_impulse_v2.py +85 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch2.py +83 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch2_impulse.py +85 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/protocols/water5_v_nero/water5_device_weekly_ch2_impulse_v2.py +84 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/py.typed +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/__tests__/__init__.py +0 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/__tests__/timestamp_calculation.py +36 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/buf_ref.py +48 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/days_ago_calculation.py +11 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/packet.py +42 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/timestamp_calculation.py +31 -0
- ul-data-gateway-sdk-0.4.5/data_gateway_sdk/utils/true_round.py +2 -0
- ul-data-gateway-sdk-0.4.5/setup.cfg +4 -0
- ul-data-gateway-sdk-0.4.5/setup.py +41 -0
- ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/PKG-INFO +276 -0
- ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/SOURCES.txt +153 -0
- ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/dependency_links.txt +1 -0
- ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/requires.txt +4 -0
- ul-data-gateway-sdk-0.4.5/ul_data_gateway_sdk.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: ul-data-gateway-sdk
|
|
3
|
+
Version: 0.4.5
|
|
4
|
+
Summary: Data gateway sdk
|
|
5
|
+
Author: Unic-lab
|
|
6
|
+
License: MIT
|
|
7
|
+
Platform: any
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Programming Language :: Python
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.6
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
# Data adapter
|
|
19
|
+
Входной слой поступления данных от приборов или других источников
|
|
20
|
+
|
|
21
|
+
Примерный флоу данных от прибора такой:
|
|
22
|
+
- данные поступают от прибора в балансирощик данных
|
|
23
|
+
- попадают в сервис юдп
|
|
24
|
+
- сервис юдп отправляет пакет в очередь в виде сообщения, оформляя сообщение в нужную структуру, выдавая идентификатор конкретному запросу
|
|
25
|
+
- воркер разбора конкретного протокола разбирает пакет
|
|
26
|
+
- воркер рассылает в распределитель сообщение уже с распаршенными данными, если они валидны, так же отправляет его же в сбор метаданных
|
|
27
|
+
- воркер метаданных сохраняет логи по конкретному прибору
|
|
28
|
+
- воркер распределителя отправляет сообщение в нужную интеграцию
|
|
29
|
+
- воркер интеграции конкретного провайдера читает из очереди и отправляет в нужный сервис
|
|
30
|
+
|
|
31
|
+
____
|
|
32
|
+
|
|
33
|
+
## Сервисы
|
|
34
|
+
|
|
35
|
+
Сервис это библиотека, сервис это то что в рантайме всегда
|
|
36
|
+
|
|
37
|
+
### data_gateway__broker__amqp
|
|
38
|
+
сервис брокера очередей сообщений
|
|
39
|
+
|
|
40
|
+
### data_gateway__device_smp__udp_server
|
|
41
|
+
сервис приложения, написанный на GO. слушает порт UDP и отправляет в очередь на разбор пакета. Технически ему не важен протокол. Ожидает сообщения из очереди с айди сообщения запроса. так же слушает очередь прибора для отправки к конкретному прибору
|
|
42
|
+
|
|
43
|
+
### data_gateway__balancer
|
|
44
|
+
Балансировщик нагрузки.
|
|
45
|
+
|
|
46
|
+
ВСЕ ВНЕШНИЕ ПОРТЫ ДОЛЖНЫ ПРОБРАСЫВАТЬСЯ ЧЕРЕЗ НЕГО
|
|
47
|
+
|
|
48
|
+
### mon_*
|
|
49
|
+
`mon__metrics__aggregator`, `mon__metrics__dashboard`, `mon__process_explorer__server`, `mon__process_explorer__container`, `mon__log__aggregator`
|
|
50
|
+
|
|
51
|
+
сервисы сбора аналитических данных
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
____
|
|
55
|
+
|
|
56
|
+
## Переменные среды для деплоя
|
|
57
|
+
`DD_API_KEY` - api ключ datadog
|
|
58
|
+
|
|
59
|
+
`DH_PARAM` - для шифрования в nginx
|
|
60
|
+
|
|
61
|
+
`SSH_ID_RSA` - приватный ключ доступа на сервер для развертывания
|
|
62
|
+
|
|
63
|
+
`{CI_BRANCH}_DATABASE_ENDPOINT` - эндпоинт для коннекта к базе данных. Содержит в себе юзернейм, пароль и название самой базы данных
|
|
64
|
+
`{CI_BRANCH}_APPLICATION_BROKER_ENDPOINT` - эндпоинт для коннекта к броокеру сообщений (rabbitmq). Содержит в себе юзернейм и пароль
|
|
65
|
+
|
|
66
|
+
## Глобальные зависимости
|
|
67
|
+
- ubuntu 20.04
|
|
68
|
+
- bash
|
|
69
|
+
- make
|
|
70
|
+
- python `3.8.6`
|
|
71
|
+
- pyenv
|
|
72
|
+
- pipenv
|
|
73
|
+
- docker-compose `1.27.4`
|
|
74
|
+
- docker `19.03.13`
|
|
75
|
+
|
|
76
|
+
## Команды
|
|
77
|
+
|
|
78
|
+
### обновление репозитория до последнего состояния в ветке
|
|
79
|
+
```bash
|
|
80
|
+
make cleanup
|
|
81
|
+
```
|
|
82
|
+
Это обновит пакеты и почистит все необходимое
|
|
83
|
+
|
|
84
|
+
### Запуск локально
|
|
85
|
+
```bash
|
|
86
|
+
make up
|
|
87
|
+
```
|
|
88
|
+
Запустит все необходимые контейнеры
|
|
89
|
+
|
|
90
|
+
### Тестовая нагрузка на сервисы
|
|
91
|
+
|
|
92
|
+
нагрузит воркер СМП одним тестовым сообщением. добавит его в очередь
|
|
93
|
+
```bash
|
|
94
|
+
make worker_SMP_load
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
нагрузит воркер СМП одним реальным сообщением от прибора. добавит его в очередь
|
|
98
|
+
```bash
|
|
99
|
+
make worker_SMP_load_real_raw_data
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
нагрузит воркер распределителя интеграции
|
|
103
|
+
```bash
|
|
104
|
+
make integration_router_load
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
make load_UDP_SMP_getset
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
make DEV_load_UDP_SMP_getset
|
|
113
|
+
```
|
|
114
|
+
### Системные команды
|
|
115
|
+
```bash
|
|
116
|
+
make update-ci-images
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Работа с Grafana
|
|
120
|
+
|
|
121
|
+
В данный момент графана крутится на 4011 порту, т.е. дабы получить туда доступ, то небходимо, например, перейти по адресу 192.168.10.92:4011
|
|
122
|
+
|
|
123
|
+
Рабочих дашборда 2 - Docker and system monitoring && RabbitMQ-Overview
|
|
124
|
+
#### Docker and system monitoring
|
|
125
|
+
На данном дашборде указаныф все метрики по серверу и контейнерам, кол-во свободного дискового пространства, ЦПУ. RAM, SWAP и т.д. как для сервера, так и для контейнера
|
|
126
|
+
Алерты приходяи при превышении пороговых значений по ЦПУ, RAM, Disc Space, а также если кол-во контейнеров падает ниже 14 (необходима ручная подстройка, если в какой-то момент добавятся ещё сервисы)
|
|
127
|
+
|
|
128
|
+
#### RabbitMQ-Overview
|
|
129
|
+
Дублирует админку RabbitMQ с точки зрения сбора показателей
|
|
130
|
+
|
|
131
|
+
# KAFKA
|
|
132
|
+
Если речь идёт о наших сертификатах - всё описано в файле kafka_ssl_startup.sh и kafka_generate_client_ssl.sh
|
|
133
|
+
Это создание сертификатов как серверных, так и клиентскихз с использованием нашего CA севрера
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
Следующий блок посвящён генерации SSL ключей для kafka. Основным источником информации послужили [туториал один](https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/KafkaIntegrationGuide/TLS-SSL/KafkaTLS-SSLExamplePart1CreateRootCA.htm?TocPath=Integrating%20with%20Apache%20Kafka|Using%20TLS%2FSSL%20Encryption%20with%20Kafka|_____5 "Тык один") и [туториал два](https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/KafkaIntegrationGuide/TLS-SSL/KafkaTLS-SSLExamplePart3ConfigureKafka.htm?tocpath=Integrating%20with%20Apache%20Kafka%7CUsing%20TLS%2FSSL%20Encryption%20with%20Kafka%7C_____7 "Тык два")
|
|
137
|
+
А также личный опыт
|
|
138
|
+
|
|
139
|
+
Для генерации калючей, необходимы `keytool` и `openssl`
|
|
140
|
+
Первым шагом - необходимо сгенерировать CA ключ (приватный)
|
|
141
|
+
```bash
|
|
142
|
+
openssl genrsa -out root.key
|
|
143
|
+
```
|
|
144
|
+
и самим же его подписать
|
|
145
|
+
```bash
|
|
146
|
+
openssl req -new -x509 -key root.key -out root.crt
|
|
147
|
+
```
|
|
148
|
+
и для безопасности
|
|
149
|
+
```bash
|
|
150
|
+
chmod 600 root.key
|
|
151
|
+
chmod 644 root.crt
|
|
152
|
+
```
|
|
153
|
+
Запомним эти два ключа, они нам ещё пригодятся
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
Для простоты использования и копирования, в дальнейшщих командах используется переменная `DOMAIN`, в которой лежит URL, на котором будет в будущем торчать KAFKA
|
|
158
|
+
|
|
159
|
+
Создаём хранилище сертификатов. Оно одно для всех брокеров Kafka. В нашем случае, там должен лежать только CA сертификат
|
|
160
|
+
```bash
|
|
161
|
+
keytool -keystore kafka.truststore.jks -alias CARoot -import -file root.crt
|
|
162
|
+
```
|
|
163
|
+
>Use the fully-qualified domain name (FQDN)
|
|
164
|
+
|
|
165
|
+
Создаём хранилище ключей для брокера, их может быть много, так что длоя каждого брокера оно должно быть своё
|
|
166
|
+
На вопрос
|
|
167
|
+
>What is your first and last name?
|
|
168
|
+
|
|
169
|
+
Отвечаем DNS именем
|
|
170
|
+
```bash
|
|
171
|
+
keytool -keystore kafka01.keystore.jks -alias $DOMAIN -validity 365 -genkey -keyalg RSA -ext SAN=DNS:$DOMAIN
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Достаём из хранилища сертификат брокера...
|
|
175
|
+
```bash
|
|
176
|
+
keytool -keystore kafka01.keystore.jks -alias $DOMAIN -certreq -file kafka01.unsigned.crt
|
|
177
|
+
```
|
|
178
|
+
...подписываем его нашим CA сертификатом...
|
|
179
|
+
```bash
|
|
180
|
+
openssl x509 -req -CA root.crt -CAkey root.key -in kafka01.unsigned.crt -out kafka01.signed.crt -days 365 -CAcreateserial
|
|
181
|
+
```
|
|
182
|
+
...и кладём сертификат брокера обратно в его хранилище, вместе с CA сертификатом
|
|
183
|
+
```bash
|
|
184
|
+
keytool -keystore kafka01.keystore.jks -alias CARoot -import -file root.crt
|
|
185
|
+
keytool -keystore kafka01.keystore.jks -alias $DOMAIN -import -file kafka01.signed.crt
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
В сухом остатке, для корректной работы SSL, нам нобходимы только пароли, а также truestore & keystore(s)
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
И генерация Ключей для клиента. Надеюсь, вы ещё не потеряли ваши CA ключи, они вам сейчас понадобятся
|
|
193
|
+
Начинаем генерацию клиентского интерфейса с генерации RSA 2048 ключа в паре с сертификатом (Всё это добро сразу кладётся в хранилище)
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
keytool -keystore kafka.keystore.jks -alias localhost -genkeypair -keyalg rsa
|
|
197
|
+
```
|
|
198
|
+
Достаём неподписаный ключ из хранилища и полдписываем его CA сертифифкатом
|
|
199
|
+
```bash
|
|
200
|
+
keytool -keystore kafka.keystore.jks -alias localhost -certreq -file cert-req-file
|
|
201
|
+
openssl x509 -req -CA root.crt -CAkey root.key -in cert-req-file -out certificate.pem -days 365 -CAcreateserial
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Для авторизации по SSL вам, как клиенту, понадобится ещё и приватник, так что и его достаём из хранилища
|
|
205
|
+
```bash
|
|
206
|
+
keytool -importkeystore -srckeystore kafka.keystore.jks -srcalias localhost -destalias notebook -destkeystore client.p12 -deststoretype PKCS12
|
|
207
|
+
openssl pkcs12 -in client.p12 -nodes -nocerts -out ca-key
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
### Именование сервисов
|
|
213
|
+
`%prefix%__%pod_name%__%pod_service_name%`
|
|
214
|
+
|
|
215
|
+
* %**prefix**%
|
|
216
|
+
* mon - мониторинг, вспомогательный сервис
|
|
217
|
+
* service - приложение, которое работает автономно, обрабатывает запросы или работает в фоне
|
|
218
|
+
* manager - приложение, которое запускается только ради команды, затем гаснет
|
|
219
|
+
* %**pod_name**%
|
|
220
|
+
* data_logger
|
|
221
|
+
* integration
|
|
222
|
+
* integration_*
|
|
223
|
+
* mts
|
|
224
|
+
* device_*
|
|
225
|
+
* ncp_smp
|
|
226
|
+
* smp
|
|
227
|
+
* water5
|
|
228
|
+
* communication
|
|
229
|
+
* %**pod_service_name**%
|
|
230
|
+
* *_%semantic_name%_worker
|
|
231
|
+
* push
|
|
232
|
+
* pull
|
|
233
|
+
* chrono
|
|
234
|
+
* *_%transport_protocol%_server
|
|
235
|
+
* *_%semantic_name%_db
|
|
236
|
+
* state
|
|
237
|
+
* cache
|
|
238
|
+
* common
|
|
239
|
+
* *_api
|
|
240
|
+
* *_web
|
|
241
|
+
* *_app
|
|
242
|
+
* broker
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
### Работа с Kubernetes
|
|
246
|
+
|
|
247
|
+
Т.к. удалённо все наши сервисы уже работают в кубере, надол уметь с ним работать. Минимально я вам уже рассказал про то, как оно изнутри
|
|
248
|
+
рабоатет и как писать конфиги, то сейчас о полезных командах
|
|
249
|
+
|
|
250
|
+
Выдаёт список подов/сервисов/секретов/деплойментов одного неймспейса:
|
|
251
|
+
```bash
|
|
252
|
+
kubectl get pods/svc/secrets/deployments
|
|
253
|
+
```
|
|
254
|
+
В любую команду, связанную с сервисами, деплойментами. подами или секретами можно докинуть ключ `-A` или `--all-namespaces` для получения списка подов со всех неймспейсов
|
|
255
|
+
или `-n <namespace>` `--namespace=<namespace>` для пролучения списка подов с конкретного неймспейса
|
|
256
|
+
Выдаёт список нейсмспейсов
|
|
257
|
+
```bash
|
|
258
|
+
kubectl get namespaces
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
ВЫдаёт конфиг конкретного пода (перемнные проброшенные, контейнера и их порты)
|
|
262
|
+
```bash
|
|
263
|
+
kubectl describe pod <pod_name>
|
|
264
|
+
```
|
|
265
|
+
Меняет рабочий неймспейс на тот, что вы уукажите
|
|
266
|
+
```bash
|
|
267
|
+
kubectl config set-context --current --namespace=<namespace>
|
|
268
|
+
```
|
|
269
|
+
Заходим внутрь пода
|
|
270
|
+
```bash
|
|
271
|
+
kubectl exec -it <pod_name> -- /bin/bash
|
|
272
|
+
```
|
|
273
|
+
Получение логов пода
|
|
274
|
+
```bash
|
|
275
|
+
kubectl logs <pod_name>
|
|
276
|
+
```
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Data adapter
|
|
2
|
+
Входной слой поступления данных от приборов или других источников
|
|
3
|
+
|
|
4
|
+
Примерный флоу данных от прибора такой:
|
|
5
|
+
- данные поступают от прибора в балансирощик данных
|
|
6
|
+
- попадают в сервис юдп
|
|
7
|
+
- сервис юдп отправляет пакет в очередь в виде сообщения, оформляя сообщение в нужную структуру, выдавая идентификатор конкретному запросу
|
|
8
|
+
- воркер разбора конкретного протокола разбирает пакет
|
|
9
|
+
- воркер рассылает в распределитель сообщение уже с распаршенными данными, если они валидны, так же отправляет его же в сбор метаданных
|
|
10
|
+
- воркер метаданных сохраняет логи по конкретному прибору
|
|
11
|
+
- воркер распределителя отправляет сообщение в нужную интеграцию
|
|
12
|
+
- воркер интеграции конкретного провайдера читает из очереди и отправляет в нужный сервис
|
|
13
|
+
|
|
14
|
+
____
|
|
15
|
+
|
|
16
|
+
## Сервисы
|
|
17
|
+
|
|
18
|
+
Сервис это библиотека, сервис это то что в рантайме всегда
|
|
19
|
+
|
|
20
|
+
### data_gateway__broker__amqp
|
|
21
|
+
сервис брокера очередей сообщений
|
|
22
|
+
|
|
23
|
+
### data_gateway__device_smp__udp_server
|
|
24
|
+
сервис приложения, написанный на GO. слушает порт UDP и отправляет в очередь на разбор пакета. Технически ему не важен протокол. Ожидает сообщения из очереди с айди сообщения запроса. так же слушает очередь прибора для отправки к конкретному прибору
|
|
25
|
+
|
|
26
|
+
### data_gateway__balancer
|
|
27
|
+
Балансировщик нагрузки.
|
|
28
|
+
|
|
29
|
+
ВСЕ ВНЕШНИЕ ПОРТЫ ДОЛЖНЫ ПРОБРАСЫВАТЬСЯ ЧЕРЕЗ НЕГО
|
|
30
|
+
|
|
31
|
+
### mon_*
|
|
32
|
+
`mon__metrics__aggregator`, `mon__metrics__dashboard`, `mon__process_explorer__server`, `mon__process_explorer__container`, `mon__log__aggregator`
|
|
33
|
+
|
|
34
|
+
сервисы сбора аналитических данных
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
____
|
|
38
|
+
|
|
39
|
+
## Переменные среды для деплоя
|
|
40
|
+
`DD_API_KEY` - api ключ datadog
|
|
41
|
+
|
|
42
|
+
`DH_PARAM` - для шифрования в nginx
|
|
43
|
+
|
|
44
|
+
`SSH_ID_RSA` - приватный ключ доступа на сервер для развертывания
|
|
45
|
+
|
|
46
|
+
`{CI_BRANCH}_DATABASE_ENDPOINT` - эндпоинт для коннекта к базе данных. Содержит в себе юзернейм, пароль и название самой базы данных
|
|
47
|
+
`{CI_BRANCH}_APPLICATION_BROKER_ENDPOINT` - эндпоинт для коннекта к броокеру сообщений (rabbitmq). Содержит в себе юзернейм и пароль
|
|
48
|
+
|
|
49
|
+
## Глобальные зависимости
|
|
50
|
+
- ubuntu 20.04
|
|
51
|
+
- bash
|
|
52
|
+
- make
|
|
53
|
+
- python `3.8.6`
|
|
54
|
+
- pyenv
|
|
55
|
+
- pipenv
|
|
56
|
+
- docker-compose `1.27.4`
|
|
57
|
+
- docker `19.03.13`
|
|
58
|
+
|
|
59
|
+
## Команды
|
|
60
|
+
|
|
61
|
+
### обновление репозитория до последнего состояния в ветке
|
|
62
|
+
```bash
|
|
63
|
+
make cleanup
|
|
64
|
+
```
|
|
65
|
+
Это обновит пакеты и почистит все необходимое
|
|
66
|
+
|
|
67
|
+
### Запуск локально
|
|
68
|
+
```bash
|
|
69
|
+
make up
|
|
70
|
+
```
|
|
71
|
+
Запустит все необходимые контейнеры
|
|
72
|
+
|
|
73
|
+
### Тестовая нагрузка на сервисы
|
|
74
|
+
|
|
75
|
+
нагрузит воркер СМП одним тестовым сообщением. добавит его в очередь
|
|
76
|
+
```bash
|
|
77
|
+
make worker_SMP_load
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
нагрузит воркер СМП одним реальным сообщением от прибора. добавит его в очередь
|
|
81
|
+
```bash
|
|
82
|
+
make worker_SMP_load_real_raw_data
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
нагрузит воркер распределителя интеграции
|
|
86
|
+
```bash
|
|
87
|
+
make integration_router_load
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
make load_UDP_SMP_getset
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
make DEV_load_UDP_SMP_getset
|
|
96
|
+
```
|
|
97
|
+
### Системные команды
|
|
98
|
+
```bash
|
|
99
|
+
make update-ci-images
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Работа с Grafana
|
|
103
|
+
|
|
104
|
+
В данный момент графана крутится на 4011 порту, т.е. дабы получить туда доступ, то небходимо, например, перейти по адресу 192.168.10.92:4011
|
|
105
|
+
|
|
106
|
+
Рабочих дашборда 2 - Docker and system monitoring && RabbitMQ-Overview
|
|
107
|
+
#### Docker and system monitoring
|
|
108
|
+
На данном дашборде указаныф все метрики по серверу и контейнерам, кол-во свободного дискового пространства, ЦПУ. RAM, SWAP и т.д. как для сервера, так и для контейнера
|
|
109
|
+
Алерты приходяи при превышении пороговых значений по ЦПУ, RAM, Disc Space, а также если кол-во контейнеров падает ниже 14 (необходима ручная подстройка, если в какой-то момент добавятся ещё сервисы)
|
|
110
|
+
|
|
111
|
+
#### RabbitMQ-Overview
|
|
112
|
+
Дублирует админку RabbitMQ с точки зрения сбора показателей
|
|
113
|
+
|
|
114
|
+
# KAFKA
|
|
115
|
+
Если речь идёт о наших сертификатах - всё описано в файле kafka_ssl_startup.sh и kafka_generate_client_ssl.sh
|
|
116
|
+
Это создание сертификатов как серверных, так и клиентскихз с использованием нашего CA севрера
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
Следующий блок посвящён генерации SSL ключей для kafka. Основным источником информации послужили [туториал один](https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/KafkaIntegrationGuide/TLS-SSL/KafkaTLS-SSLExamplePart1CreateRootCA.htm?TocPath=Integrating%20with%20Apache%20Kafka|Using%20TLS%2FSSL%20Encryption%20with%20Kafka|_____5 "Тык один") и [туториал два](https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/KafkaIntegrationGuide/TLS-SSL/KafkaTLS-SSLExamplePart3ConfigureKafka.htm?tocpath=Integrating%20with%20Apache%20Kafka%7CUsing%20TLS%2FSSL%20Encryption%20with%20Kafka%7C_____7 "Тык два")
|
|
120
|
+
А также личный опыт
|
|
121
|
+
|
|
122
|
+
Для генерации калючей, необходимы `keytool` и `openssl`
|
|
123
|
+
Первым шагом - необходимо сгенерировать CA ключ (приватный)
|
|
124
|
+
```bash
|
|
125
|
+
openssl genrsa -out root.key
|
|
126
|
+
```
|
|
127
|
+
и самим же его подписать
|
|
128
|
+
```bash
|
|
129
|
+
openssl req -new -x509 -key root.key -out root.crt
|
|
130
|
+
```
|
|
131
|
+
и для безопасности
|
|
132
|
+
```bash
|
|
133
|
+
chmod 600 root.key
|
|
134
|
+
chmod 644 root.crt
|
|
135
|
+
```
|
|
136
|
+
Запомним эти два ключа, они нам ещё пригодятся
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
Для простоты использования и копирования, в дальнейшщих командах используется переменная `DOMAIN`, в которой лежит URL, на котором будет в будущем торчать KAFKA
|
|
141
|
+
|
|
142
|
+
Создаём хранилище сертификатов. Оно одно для всех брокеров Kafka. В нашем случае, там должен лежать только CA сертификат
|
|
143
|
+
```bash
|
|
144
|
+
keytool -keystore kafka.truststore.jks -alias CARoot -import -file root.crt
|
|
145
|
+
```
|
|
146
|
+
>Use the fully-qualified domain name (FQDN)
|
|
147
|
+
|
|
148
|
+
Создаём хранилище ключей для брокера, их может быть много, так что длоя каждого брокера оно должно быть своё
|
|
149
|
+
На вопрос
|
|
150
|
+
>What is your first and last name?
|
|
151
|
+
|
|
152
|
+
Отвечаем DNS именем
|
|
153
|
+
```bash
|
|
154
|
+
keytool -keystore kafka01.keystore.jks -alias $DOMAIN -validity 365 -genkey -keyalg RSA -ext SAN=DNS:$DOMAIN
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Достаём из хранилища сертификат брокера...
|
|
158
|
+
```bash
|
|
159
|
+
keytool -keystore kafka01.keystore.jks -alias $DOMAIN -certreq -file kafka01.unsigned.crt
|
|
160
|
+
```
|
|
161
|
+
...подписываем его нашим CA сертификатом...
|
|
162
|
+
```bash
|
|
163
|
+
openssl x509 -req -CA root.crt -CAkey root.key -in kafka01.unsigned.crt -out kafka01.signed.crt -days 365 -CAcreateserial
|
|
164
|
+
```
|
|
165
|
+
...и кладём сертификат брокера обратно в его хранилище, вместе с CA сертификатом
|
|
166
|
+
```bash
|
|
167
|
+
keytool -keystore kafka01.keystore.jks -alias CARoot -import -file root.crt
|
|
168
|
+
keytool -keystore kafka01.keystore.jks -alias $DOMAIN -import -file kafka01.signed.crt
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
В сухом остатке, для корректной работы SSL, нам нобходимы только пароли, а также truestore & keystore(s)
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
И генерация Ключей для клиента. Надеюсь, вы ещё не потеряли ваши CA ключи, они вам сейчас понадобятся
|
|
176
|
+
Начинаем генерацию клиентского интерфейса с генерации RSA 2048 ключа в паре с сертификатом (Всё это добро сразу кладётся в хранилище)
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
keytool -keystore kafka.keystore.jks -alias localhost -genkeypair -keyalg rsa
|
|
180
|
+
```
|
|
181
|
+
Достаём неподписаный ключ из хранилища и полдписываем его CA сертифифкатом
|
|
182
|
+
```bash
|
|
183
|
+
keytool -keystore kafka.keystore.jks -alias localhost -certreq -file cert-req-file
|
|
184
|
+
openssl x509 -req -CA root.crt -CAkey root.key -in cert-req-file -out certificate.pem -days 365 -CAcreateserial
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Для авторизации по SSL вам, как клиенту, понадобится ещё и приватник, так что и его достаём из хранилища
|
|
188
|
+
```bash
|
|
189
|
+
keytool -importkeystore -srckeystore kafka.keystore.jks -srcalias localhost -destalias notebook -destkeystore client.p12 -deststoretype PKCS12
|
|
190
|
+
openssl pkcs12 -in client.p12 -nodes -nocerts -out ca-key
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
### Именование сервисов
|
|
196
|
+
`%prefix%__%pod_name%__%pod_service_name%`
|
|
197
|
+
|
|
198
|
+
* %**prefix**%
|
|
199
|
+
* mon - мониторинг, вспомогательный сервис
|
|
200
|
+
* service - приложение, которое работает автономно, обрабатывает запросы или работает в фоне
|
|
201
|
+
* manager - приложение, которое запускается только ради команды, затем гаснет
|
|
202
|
+
* %**pod_name**%
|
|
203
|
+
* data_logger
|
|
204
|
+
* integration
|
|
205
|
+
* integration_*
|
|
206
|
+
* mts
|
|
207
|
+
* device_*
|
|
208
|
+
* ncp_smp
|
|
209
|
+
* smp
|
|
210
|
+
* water5
|
|
211
|
+
* communication
|
|
212
|
+
* %**pod_service_name**%
|
|
213
|
+
* *_%semantic_name%_worker
|
|
214
|
+
* push
|
|
215
|
+
* pull
|
|
216
|
+
* chrono
|
|
217
|
+
* *_%transport_protocol%_server
|
|
218
|
+
* *_%semantic_name%_db
|
|
219
|
+
* state
|
|
220
|
+
* cache
|
|
221
|
+
* common
|
|
222
|
+
* *_api
|
|
223
|
+
* *_web
|
|
224
|
+
* *_app
|
|
225
|
+
* broker
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
### Работа с Kubernetes
|
|
229
|
+
|
|
230
|
+
Т.к. удалённо все наши сервисы уже работают в кубере, надол уметь с ним работать. Минимально я вам уже рассказал про то, как оно изнутри
|
|
231
|
+
рабоатет и как писать конфиги, то сейчас о полезных командах
|
|
232
|
+
|
|
233
|
+
Выдаёт список подов/сервисов/секретов/деплойментов одного неймспейса:
|
|
234
|
+
```bash
|
|
235
|
+
kubectl get pods/svc/secrets/deployments
|
|
236
|
+
```
|
|
237
|
+
В любую команду, связанную с сервисами, деплойментами. подами или секретами можно докинуть ключ `-A` или `--all-namespaces` для получения списка подов со всех неймспейсов
|
|
238
|
+
или `-n <namespace>` `--namespace=<namespace>` для пролучения списка подов с конкретного неймспейса
|
|
239
|
+
Выдаёт список нейсмспейсов
|
|
240
|
+
```bash
|
|
241
|
+
kubectl get namespaces
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
ВЫдаёт конфиг конкретного пода (перемнные проброшенные, контейнера и их порты)
|
|
245
|
+
```bash
|
|
246
|
+
kubectl describe pod <pod_name>
|
|
247
|
+
```
|
|
248
|
+
Меняет рабочий неймспейс на тот, что вы уукажите
|
|
249
|
+
```bash
|
|
250
|
+
kubectl config set-context --current --namespace=<namespace>
|
|
251
|
+
```
|
|
252
|
+
Заходим внутрь пода
|
|
253
|
+
```bash
|
|
254
|
+
kubectl exec -it <pod_name> -- /bin/bash
|
|
255
|
+
```
|
|
256
|
+
Получение логов пода
|
|
257
|
+
```bash
|
|
258
|
+
kubectl logs <pod_name>
|
|
259
|
+
```
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from data_gateway_sdk.device_data_encryption import EncryptionType
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def test_decrypt_xtea_v_nero_v0() -> None:
|
|
5
|
+
assert EncryptionType.XTEA_V_NERO_V0.decrypt(bytes.fromhex('8725024c66319b82'), bytes.fromhex('19208f5fd151c0b7e7c7890610f994b5c4fe697620b67e509b0ea2bd942b1fd6')) == bytes.fromhex('73086e0a000000a5') # noqa: W391
|
|
6
|
+
assert EncryptionType.XTEA_V_NERO_V0.decrypt(bytes.fromhex('461dee8050910076'), bytes.fromhex('6b4095ae9e35c7f4cbbd31de33a023e3f2d01d7c6041a885a13d202643118812')) == bytes.fromhex('7b3a00000000001f') # noqa: W391
|
|
7
|
+
assert EncryptionType.XTEA_V_NERO_V0.decrypt(bytes.fromhex('1ff19c361fd435cb'), bytes.fromhex('21dfdaae138b13c4c40fa2a560e51cbeca849f5b0d5b02232c27559125ddb124')) == bytes.fromhex('54c2000000000000') # noqa: W391
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_encrypt_xtea_v_nero_v0() -> None:
|
|
11
|
+
assert EncryptionType.XTEA_V_NERO_V0.encrypt(bytes.fromhex('73086e0a000000a5'), bytes.fromhex('19208f5fd151c0b7e7c7890610f994b5c4fe697620b67e509b0ea2bd942b1fd6')) == bytes.fromhex('8725024c66319b82') # noqa: W391
|
|
12
|
+
assert EncryptionType.XTEA_V_NERO_V0.encrypt(bytes.fromhex('7b3a00000000001f'), bytes.fromhex('6b4095ae9e35c7f4cbbd31de33a023e3f2d01d7c6041a885a13d202643118812')) == bytes.fromhex('461dee8050910076') # noqa: W391
|
|
13
|
+
assert EncryptionType.XTEA_V_NERO_V0.encrypt(bytes.fromhex('54c2000000000000'), bytes.fromhex('21dfdaae138b13c4c40fa2a560e51cbeca849f5b0d5b02232c27559125ddb124')) == bytes.fromhex('1ff19c361fd435cb') # noqa: W391
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from data_gateway_sdk.crypto_algorithms.crypto_aes import aes_ecb_decryption, aes_ecb_encryption, AesError
|
|
4
|
+
from data_gateway_sdk.crypto_algorithms.crypto_kuznechik import kuznechik_encryption, kuznechik_decryption, KuznechikError
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TestCrypto(unittest.TestCase):
|
|
8
|
+
def test_aes_128(self) -> None:
|
|
9
|
+
# ECB-AES-128 test
|
|
10
|
+
plaintext = bytes.fromhex('6bc1bee22e409f96e93d7e117393172a'
|
|
11
|
+
'ae2d8a571e03ac9c9eb76fac45af8e51'
|
|
12
|
+
'30c81c46a35ce411e5fbc1191a0a52ef'
|
|
13
|
+
'f69f2445df4f9b17ad2b417be66c3710')
|
|
14
|
+
|
|
15
|
+
key = bytes.fromhex('2b7e151628aed2a6abf7158809cf4f3c')
|
|
16
|
+
|
|
17
|
+
expected_ciphertext = bytes.fromhex('3ad77bb40d7a3660a89ecaf32466ef97'
|
|
18
|
+
'f5d3d58503b9699de785895a96fdbaaf'
|
|
19
|
+
'43b1cd7f598ece23881b00e3ed030688'
|
|
20
|
+
'7b0c785e27e8ad3f8223207104725dd4')
|
|
21
|
+
|
|
22
|
+
ciphertext = aes_ecb_encryption(plaintext, key)
|
|
23
|
+
self.assertEqual(ciphertext, expected_ciphertext)
|
|
24
|
+
|
|
25
|
+
recovered_plaintext = aes_ecb_decryption(ciphertext, key)
|
|
26
|
+
self.assertEqual(recovered_plaintext, plaintext)
|
|
27
|
+
|
|
28
|
+
def test_aes_256(self) -> None:
|
|
29
|
+
# ECB-AES-256 test
|
|
30
|
+
plaintext = bytes.fromhex('00112233445566778899aabbccddeeff'
|
|
31
|
+
'00112233445566778899aabbccddeeff'
|
|
32
|
+
'00112233445566778899aabbccddeeff'
|
|
33
|
+
'00112233445566778899aabbccddeeff')
|
|
34
|
+
|
|
35
|
+
key = bytes.fromhex('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f')
|
|
36
|
+
|
|
37
|
+
expected_ciphertext = bytes.fromhex('8ea2b7ca516745bfeafc49904b496089'
|
|
38
|
+
'8ea2b7ca516745bfeafc49904b496089'
|
|
39
|
+
'8ea2b7ca516745bfeafc49904b496089'
|
|
40
|
+
'8ea2b7ca516745bfeafc49904b496089')
|
|
41
|
+
|
|
42
|
+
ciphertext = aes_ecb_encryption(plaintext, key)
|
|
43
|
+
self.assertEqual(ciphertext, expected_ciphertext)
|
|
44
|
+
|
|
45
|
+
recovered_plaintext = aes_ecb_decryption(ciphertext, key)
|
|
46
|
+
self.assertEqual(recovered_plaintext, plaintext)
|
|
47
|
+
|
|
48
|
+
with self.assertRaises(AesError):
|
|
49
|
+
plaintext = bytes.fromhex('00112233445566778899aabbccddeeff'
|
|
50
|
+
'00112233445566778899aabbccddeeff'
|
|
51
|
+
'00112233445566778899aabbccddeeff'
|
|
52
|
+
'00112233445566778899aabbccddeeff')
|
|
53
|
+
key = bytes.fromhex('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e')
|
|
54
|
+
aes_ecb_encryption(plaintext, key)
|
|
55
|
+
|
|
56
|
+
def test_kuznechik(self) -> None:
|
|
57
|
+
mtest = bytes.fromhex('1122334455667700ffeeddccbbaa9988')
|
|
58
|
+
ktest = bytes.fromhex('8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef')
|
|
59
|
+
|
|
60
|
+
encrypted_block = kuznechik_encryption(mtest, ktest)
|
|
61
|
+
expected_enc = bytes.fromhex('7f679d90bebc24305a468d42b9d4edcd')
|
|
62
|
+
self.assertEqual(encrypted_block, expected_enc)
|
|
63
|
+
|
|
64
|
+
decrypted_block = kuznechik_decryption(encrypted_block, ktest)
|
|
65
|
+
expected_dec = bytes.fromhex('1122334455667700ffeeddccbbaa9988')
|
|
66
|
+
self.assertEqual(decrypted_block, expected_dec)
|
|
67
|
+
|
|
68
|
+
with self.assertRaises(KuznechikError):
|
|
69
|
+
mtest = bytes.fromhex('1122334455667700ffeeddccbbaa9988')
|
|
70
|
+
ktest = bytes.fromhex('8899aabbccddeeff0011223344556677fedcba98765432100123456789abcd')
|
|
71
|
+
kuznechik_encryption(mtest, ktest)
|
|
72
|
+
|
|
73
|
+
with self.assertRaises(KuznechikError):
|
|
74
|
+
mtest = bytes.fromhex('1122334455667700ffeeddccbbaa99')
|
|
75
|
+
ktest = bytes.fromhex('8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef')
|
|
76
|
+
kuznechik_encryption(mtest, ktest)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if __name__ == "__main__":
|
|
80
|
+
unittest.main()
|
|
File without changes
|