mrok 0.1.6__py3-none-any.whl → 0.1.8__py3-none-any.whl

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.
Files changed (66) hide show
  1. mrok/__init__.py +6 -0
  2. mrok/agent/__init__.py +0 -0
  3. mrok/agent/sidecar/__init__.py +3 -0
  4. mrok/agent/sidecar/app.py +30 -0
  5. mrok/agent/sidecar/main.py +27 -0
  6. mrok/agent/ziticorn.py +29 -0
  7. mrok/cli/__init__.py +3 -0
  8. mrok/cli/commands/__init__.py +7 -0
  9. mrok/cli/commands/admin/__init__.py +12 -0
  10. mrok/cli/commands/admin/bootstrap.py +58 -0
  11. mrok/cli/commands/admin/list/__init__.py +8 -0
  12. mrok/cli/commands/admin/list/extensions.py +144 -0
  13. mrok/cli/commands/admin/list/instances.py +167 -0
  14. mrok/cli/commands/admin/register/__init__.py +8 -0
  15. mrok/cli/commands/admin/register/extensions.py +46 -0
  16. mrok/cli/commands/admin/register/instances.py +60 -0
  17. mrok/cli/commands/admin/unregister/__init__.py +8 -0
  18. mrok/cli/commands/admin/unregister/extensions.py +33 -0
  19. mrok/cli/commands/admin/unregister/instances.py +34 -0
  20. mrok/cli/commands/admin/utils.py +49 -0
  21. mrok/cli/commands/agent/__init__.py +6 -0
  22. mrok/cli/commands/agent/run/__init__.py +7 -0
  23. mrok/cli/commands/agent/run/asgi.py +49 -0
  24. mrok/cli/commands/agent/run/sidecar.py +54 -0
  25. mrok/cli/commands/controller/__init__.py +7 -0
  26. mrok/cli/commands/controller/openapi.py +47 -0
  27. mrok/cli/commands/controller/run.py +87 -0
  28. mrok/cli/main.py +97 -0
  29. mrok/cli/rich.py +18 -0
  30. mrok/conf.py +32 -0
  31. mrok/controller/__init__.py +0 -0
  32. mrok/controller/app.py +62 -0
  33. mrok/controller/auth.py +87 -0
  34. mrok/controller/dependencies/__init__.py +4 -0
  35. mrok/controller/dependencies/conf.py +7 -0
  36. mrok/controller/dependencies/ziti.py +27 -0
  37. mrok/controller/openapi/__init__.py +3 -0
  38. mrok/controller/openapi/examples.py +44 -0
  39. mrok/controller/openapi/utils.py +35 -0
  40. mrok/controller/pagination.py +79 -0
  41. mrok/controller/routes.py +294 -0
  42. mrok/controller/schemas.py +67 -0
  43. mrok/errors.py +2 -0
  44. mrok/http/__init__.py +0 -0
  45. mrok/http/config.py +65 -0
  46. mrok/http/forwarder.py +299 -0
  47. mrok/http/lifespan.py +10 -0
  48. mrok/http/master.py +90 -0
  49. mrok/http/protocol.py +11 -0
  50. mrok/http/server.py +14 -0
  51. mrok/logging.py +76 -0
  52. mrok/ziti/__init__.py +15 -0
  53. mrok/ziti/api.py +481 -0
  54. mrok/ziti/bootstrap.py +71 -0
  55. mrok/ziti/constants.py +9 -0
  56. mrok/ziti/errors.py +25 -0
  57. mrok/ziti/identities.py +169 -0
  58. mrok/ziti/pki.py +52 -0
  59. mrok/ziti/services.py +87 -0
  60. {mrok-0.1.6.dist-info → mrok-0.1.8.dist-info}/METADATA +7 -9
  61. mrok-0.1.8.dist-info/RECORD +64 -0
  62. {mrok-0.1.6.dist-info → mrok-0.1.8.dist-info}/WHEEL +1 -2
  63. mrok-0.1.6.dist-info/RECORD +0 -6
  64. mrok-0.1.6.dist-info/top_level.txt +0 -1
  65. {mrok-0.1.6.dist-info → mrok-0.1.8.dist-info}/entry_points.txt +0 -0
  66. {mrok-0.1.6.dist-info → mrok-0.1.8.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,169 @@
1
+ import logging
2
+ from typing import Any
3
+
4
+ import jwt
5
+
6
+ from mrok.ziti import pki
7
+ from mrok.ziti.api import TagsType, ZitiClientAPI, ZitiManagementAPI
8
+ from mrok.ziti.constants import (
9
+ MROK_IDENTITY_TYPE_TAG_NAME,
10
+ MROK_IDENTITY_TYPE_TAG_VALUE_INSTANCE,
11
+ MROK_IDENTITY_TYPE_TAG_VALUE_PROXY,
12
+ MROK_SERVICE_TAG_NAME,
13
+ )
14
+ from mrok.ziti.errors import (
15
+ ProxyIdentityAlreadyExistsError,
16
+ ServiceNotFoundError,
17
+ UserIdentityNotFoundError,
18
+ )
19
+
20
+ logger = logging.getLogger("mrok.ziti")
21
+
22
+
23
+ async def register_instance(
24
+ mgmt_api: ZitiManagementAPI,
25
+ client_api: ZitiClientAPI,
26
+ extension_id: str,
27
+ instance_id: str,
28
+ tags: TagsType | None = None,
29
+ ):
30
+ service_name = extension_id.lower()
31
+ tags = tags or {}
32
+ tags[MROK_SERVICE_TAG_NAME] = service_name
33
+ tags[MROK_IDENTITY_TYPE_TAG_NAME] = MROK_IDENTITY_TYPE_TAG_VALUE_INSTANCE
34
+ service = await mgmt_api.search_service(service_name)
35
+ if not service:
36
+ raise ServiceNotFoundError(f"A service with name `{extension_id}` does not exists.")
37
+
38
+ identity_name = f"{instance_id.lower()}.{service_name}"
39
+ service_policy_name = f"{identity_name}:bind"
40
+
41
+ identity = await mgmt_api.search_identity(identity_name)
42
+ if identity:
43
+ service_policy = await mgmt_api.search_service_policy(service_policy_name)
44
+ if service_policy:
45
+ await mgmt_api.delete_service_policy(service_policy["id"])
46
+ router_policy = await mgmt_api.search_router_policy(identity_name)
47
+ if router_policy:
48
+ await mgmt_api.delete_router_policy(router_policy["id"])
49
+ await mgmt_api.delete_identity(identity["id"])
50
+
51
+ identity_id = await mgmt_api.create_user_identity(identity_name, tags=tags)
52
+ identity = await mgmt_api.get_identity(identity_id)
53
+
54
+ identity_json = await _enroll_identity(
55
+ mgmt_api,
56
+ client_api,
57
+ identity_id,
58
+ identity,
59
+ mrok={
60
+ "identity": identity_name,
61
+ "extension": extension_id,
62
+ "instance": instance_id,
63
+ },
64
+ )
65
+
66
+ await mgmt_api.create_bind_service_policy(service_policy_name, service["id"], identity_id)
67
+ await mgmt_api.create_router_policy(identity_name, identity_id)
68
+
69
+ return identity, identity_json
70
+
71
+
72
+ async def unregister_instance(
73
+ mgmt_api: ZitiManagementAPI,
74
+ extension_id: str,
75
+ instance_id: str,
76
+ ):
77
+ service_name = extension_id.lower()
78
+ service = await mgmt_api.search_service(service_name)
79
+ if not service:
80
+ raise ServiceNotFoundError(f"A service with name `{extension_id}` does not exists.")
81
+
82
+ identity_name = f"{instance_id.lower()}.{service_name}"
83
+ service_policy_name = f"{identity_name}:bind"
84
+
85
+ identity = await mgmt_api.search_identity(identity_name)
86
+ if not identity:
87
+ raise UserIdentityNotFoundError(f"Instance `{instance_id}` not found.")
88
+
89
+ service_policy = await mgmt_api.search_service_policy(service_policy_name)
90
+ if service_policy:
91
+ await mgmt_api.delete_service_policy(service_policy["id"])
92
+ router_policy = await mgmt_api.search_router_policy(identity_name)
93
+ if router_policy:
94
+ await mgmt_api.delete_router_policy(router_policy["id"])
95
+ await mgmt_api.delete_identity(identity["id"])
96
+
97
+
98
+ async def enroll_proxy_identity(
99
+ mgmt_api: ZitiManagementAPI,
100
+ client_api: ZitiClientAPI,
101
+ identity_name: str,
102
+ tags: TagsType | None = None,
103
+ ):
104
+ identity = await mgmt_api.search_identity(identity_name)
105
+ if identity:
106
+ raise ProxyIdentityAlreadyExistsError(
107
+ f"A proxy identity with name `{identity_name}` already exists."
108
+ )
109
+ tags = tags or {}
110
+ tags[MROK_IDENTITY_TYPE_TAG_NAME] = MROK_IDENTITY_TYPE_TAG_VALUE_PROXY
111
+ identity_id = await mgmt_api.create_device_identity(identity_name, tags=tags)
112
+ identity_json = await _enroll_identity(mgmt_api, client_api, identity_id)
113
+ logger.info(f"Enrolled proxy identity '{identity_name}'")
114
+
115
+ return identity_id, identity_json
116
+
117
+
118
+ async def _enroll_identity(
119
+ mgmt_api: ZitiManagementAPI,
120
+ client_api: ZitiClientAPI,
121
+ identity_id: str,
122
+ identity: dict[str, Any] | None = None,
123
+ mrok: dict[str, str] | None = None,
124
+ ):
125
+ if identity is None:
126
+ identity = await mgmt_api.get_identity(identity_id)
127
+
128
+ claims = _get_enroll_token_claims(identity)
129
+ pkey_pem, csr_pem = pki.generate_key_and_csr(identity_id)
130
+
131
+ enroll_response = await client_api.enroll_identity(claims["jti"], csr_pem)
132
+ certificate_pem = enroll_response["data"]["cert"]
133
+ ca_pem = await pki.get_ca_certificates(mgmt_api)
134
+
135
+ return _generate_identity_json(
136
+ client_api.base_url,
137
+ pkey_pem,
138
+ certificate_pem,
139
+ ca_pem,
140
+ mrok=mrok,
141
+ )
142
+
143
+
144
+ def _get_enroll_token_claims(identity: dict[str, Any]):
145
+ jwt_token = identity["enrollment"]["ott"]["jwt"]
146
+ return jwt.decode(jwt_token, algorithms=["RS256"], options={"verify_signature": False})
147
+
148
+
149
+ def _generate_identity_json(
150
+ ziti_api_url: str,
151
+ pkey_pem: str,
152
+ certificate_pem: str,
153
+ ca_pem: str,
154
+ mrok: dict | None = None,
155
+ ) -> dict[str, Any]:
156
+ identity = {
157
+ "ztAPI": ziti_api_url,
158
+ "ztAPIs": None,
159
+ "configTypes": None,
160
+ "id": {
161
+ "key": f"pem:{pkey_pem}",
162
+ "cert": f"pem:{certificate_pem}",
163
+ "ca": f"pem:{ca_pem}",
164
+ },
165
+ "enableHa": False,
166
+ }
167
+ if mrok:
168
+ identity["mrok"] = mrok
169
+ return identity
mrok/ziti/pki.py ADDED
@@ -0,0 +1,52 @@
1
+ import base64
2
+
3
+ from cryptography import x509
4
+ from cryptography.hazmat.primitives import hashes, serialization
5
+ from cryptography.hazmat.primitives.asymmetric import rsa
6
+ from cryptography.hazmat.primitives.serialization.pkcs7 import load_der_pkcs7_certificates
7
+ from cryptography.x509.oid import NameOID
8
+
9
+ from mrok.ziti.api import ZitiManagementAPI
10
+
11
+ _ca_certificates = None
12
+
13
+
14
+ async def get_ca_certificates(mgmt_api: ZitiManagementAPI) -> str:
15
+ global _ca_certificates
16
+ if not _ca_certificates:
17
+ cas_pkcs7 = await mgmt_api.fetch_ca_certificates()
18
+ pkcs7_bytes = base64.b64decode(cas_pkcs7)
19
+ pkcs7_certs = load_der_pkcs7_certificates(pkcs7_bytes)
20
+ ca_certificates = []
21
+ for cert in pkcs7_certs:
22
+ cert_pem = cert.public_bytes(serialization.Encoding.PEM)
23
+ ca_certificates.append(cert_pem.decode("utf-8"))
24
+ _ca_certificates = "\n".join(ca_certificates)
25
+ return _ca_certificates
26
+
27
+
28
+ def generate_key_and_csr(identity_id: str, key_size: int = 4096) -> tuple[str, str]:
29
+ private_key = rsa.generate_private_key(public_exponent=65537, key_size=key_size)
30
+ subject = x509.Name(
31
+ [
32
+ x509.NameAttribute(NameOID.COUNTRY_NAME, "CH"),
33
+ x509.NameAttribute(NameOID.ORGANIZATION_NAME, "SoftwareOne"),
34
+ x509.NameAttribute(NameOID.ORGANIZATIONAL_UNIT_NAME, "Marketplace Platform"),
35
+ x509.NameAttribute(NameOID.COMMON_NAME, identity_id),
36
+ ]
37
+ )
38
+ csr = (
39
+ x509.CertificateSigningRequestBuilder()
40
+ .subject_name(subject)
41
+ .sign(private_key, hashes.SHA256())
42
+ )
43
+
44
+ key_pem = private_key.private_bytes(
45
+ encoding=serialization.Encoding.PEM,
46
+ format=serialization.PrivateFormat.PKCS8,
47
+ encryption_algorithm=serialization.NoEncryption(),
48
+ ).decode()
49
+
50
+ csr_pem = csr.public_bytes(serialization.Encoding.PEM).decode()
51
+
52
+ return key_pem, csr_pem
mrok/ziti/services.py ADDED
@@ -0,0 +1,87 @@
1
+ import logging
2
+ from typing import Any
3
+
4
+ from mrok.conf import Settings
5
+ from mrok.ziti.api import TagsType, ZitiManagementAPI
6
+ from mrok.ziti.errors import (
7
+ ConfigTypeNotFoundError,
8
+ ProxyIdentityNotFoundError,
9
+ ServiceAlreadyRegisteredError,
10
+ ServiceNotFoundError,
11
+ )
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ async def register_extension(
17
+ settings: Settings, mgmt_api: ZitiManagementAPI, extension_id: str, tags: TagsType | None
18
+ ) -> dict[str, Any]:
19
+ service_name = extension_id.lower()
20
+ registered = False
21
+ proxy_identity = await mgmt_api.search_identity(settings.proxy.identity)
22
+ if not proxy_identity:
23
+ raise ProxyIdentityNotFoundError(
24
+ f"Identity for proxy `{settings.proxy.identity}` not found.",
25
+ )
26
+
27
+ config_type = await mgmt_api.search_config_type(f"{settings.proxy.mode}.proxy.v1")
28
+ if not config_type:
29
+ raise ConfigTypeNotFoundError(f"Config type `{settings.proxy.mode}.proxy.v1` not found.")
30
+
31
+ config = await mgmt_api.search_config(service_name)
32
+ if not config:
33
+ config_id = await mgmt_api.create_config(service_name, config_type["id"], tags=tags)
34
+ registered = True
35
+ else:
36
+ config_id = config["id"]
37
+ service = await mgmt_api.search_service(service_name)
38
+ if not service:
39
+ service_id = await mgmt_api.create_service(service_name, config_id, tags=tags)
40
+ service = await mgmt_api.get_service(service_id)
41
+ registered = True
42
+ else:
43
+ service_id = service["id"]
44
+ proxy_identity_id = proxy_identity["id"]
45
+ service_policy_name = f"{service_name}:{settings.proxy.identity}:dial"
46
+ dial_service_policy = await mgmt_api.search_service_policy(service_policy_name)
47
+ if not dial_service_policy:
48
+ await mgmt_api.create_dial_service_policy(
49
+ service_policy_name,
50
+ service_id,
51
+ proxy_identity_id,
52
+ tags=tags,
53
+ )
54
+ registered = True
55
+
56
+ router_policy = await mgmt_api.search_service_router_policy(service_name)
57
+ if not router_policy:
58
+ await mgmt_api.create_service_router_policy(service_name, service_id, tags=tags)
59
+ registered = True
60
+ if not registered:
61
+ raise ServiceAlreadyRegisteredError(f"Extension `{extension_id}` already registered.")
62
+ return service
63
+
64
+
65
+ async def unregister_extension(
66
+ settings: Settings, mgmt_api: ZitiManagementAPI, extension_id: str
67
+ ) -> None:
68
+ service_name = extension_id.lower()
69
+ service = await mgmt_api.search_service(service_name)
70
+ if not service:
71
+ raise ServiceNotFoundError(f"Extension `{extension_id}` not found.")
72
+
73
+ router_policy = await mgmt_api.search_service_router_policy(service_name)
74
+ if router_policy:
75
+ await mgmt_api.delete_service_router_policy(router_policy["id"])
76
+
77
+ service_policy_name = f"{service_name}:{settings.proxy.identity}:dial"
78
+
79
+ dial_service_policy = await mgmt_api.search_service_policy(service_policy_name)
80
+ if dial_service_policy:
81
+ await mgmt_api.delete_service_policy(dial_service_policy["id"])
82
+
83
+ config = await mgmt_api.search_config(service_name)
84
+ if config:
85
+ await mgmt_api.delete_config(config["id"])
86
+
87
+ await mgmt_api.delete_service(service["id"])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mrok
3
- Version: 0.1.6
3
+ Version: 0.1.8
4
4
  Summary: MPT Extensions OpenZiti Orchestrator
5
5
  Author: SoftwareOne AG
6
6
  License: Apache License
@@ -204,16 +204,14 @@ License: Apache License
204
204
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
205
205
  See the License for the specific language governing permissions and
206
206
  limitations under the License.
207
-
208
- Requires-Python: <4,>=3.12
209
- Description-Content-Type: text/markdown
210
207
  License-File: LICENSE.txt
208
+ Requires-Python: <4,>=3.12
211
209
  Requires-Dist: cryptography<46.0.0,>=45.0.7
212
210
  Requires-Dist: dynaconf<4.0.0,>=3.2.11
213
211
  Requires-Dist: fastapi-pagination<0.15.0,>=0.14.1
214
- Requires-Dist: fastapi[standard]<0.117.0,>=0.116.1
212
+ Requires-Dist: fastapi[standard]<0.120.0,>=0.119.0
215
213
  Requires-Dist: gunicorn<24.0.0,>=23.0.0
216
- Requires-Dist: httptools<0.7.0,>=0.6.4
214
+ Requires-Dist: httptools<0.8.0,>=0.7.1
217
215
  Requires-Dist: httpx<0.29.0,>=0.28.1
218
216
  Requires-Dist: openziti<2.0.0,>=1.3.1
219
217
  Requires-Dist: pydantic<3.0.0,>=2.11.7
@@ -221,9 +219,9 @@ Requires-Dist: pyfiglet<2.0.0,>=1.0.4
221
219
  Requires-Dist: pyjwt<3.0.0,>=2.10.1
222
220
  Requires-Dist: pyyaml<7.0.0,>=6.0.2
223
221
  Requires-Dist: rich<15.0.0,>=14.1.0
224
- Requires-Dist: typer<0.17.0,>=0.16.1
225
- Requires-Dist: uvicorn-worker<0.4.0,>=0.3.0
226
- Dynamic: license-file
222
+ Requires-Dist: typer<0.20.0,>=0.19.2
223
+ Requires-Dist: uvicorn-worker<0.5.0,>=0.4.0
224
+ Description-Content-Type: text/markdown
227
225
 
228
226
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=softwareone-platform_mrok&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=softwareone-platform_mrok) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=softwareone-platform_mrok&metric=coverage)](https://sonarcloud.io/summary/new_code?id=softwareone-platform_mrok)
229
227
 
@@ -0,0 +1,64 @@
1
+ mrok/__init__.py,sha256=D1PUs3KtMCqG4bFLceVNG62L3RN53NS95uSCNXpgvzs,181
2
+ mrok/conf.py,sha256=iDMxJtorJWxK0mI-pGEi1TBd_064R-VLcWzHB4esUlE,661
3
+ mrok/errors.py,sha256=ruNMDFr2_0ezCGXuCG1OswCEv-bHOIzMMd02J_0ABcs,37
4
+ mrok/logging.py,sha256=4F5rviPK1-MWWMZuHfzNNQmGxg-emAPRdKz0PsWDSww,2261
5
+ mrok/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ mrok/agent/ziticorn.py,sha256=sWtX7cyaIks8_Re3RmLlcgFPGOZ7-xBqdv6TZ50I1ac,765
7
+ mrok/agent/sidecar/__init__.py,sha256=DrjJGhqFyxsVODW06KI20Wpr6HsD2lD6qFCKUXc7GIE,59
8
+ mrok/agent/sidecar/app.py,sha256=QEfPdeFwlerxDbjAqUNtMsnslVUu2h4nCoOVCBFVsy0,992
9
+ mrok/agent/sidecar/main.py,sha256=6HVJRqtxNOKrCQ0XQhQdfWCfjzHJMgBn_zPqtLsIxWw,798
10
+ mrok/cli/__init__.py,sha256=mtFEa8IeS1x6Gm4dUYoSnAxyEzNqbUVSmWxtuZUMR84,61
11
+ mrok/cli/main.py,sha256=DFcYPwDskXi8SKAgEsuP4GMFzaniIf_6bZaSDWvYKDk,2724
12
+ mrok/cli/rich.py,sha256=P3Dyu8EArUR9_0j7DPK7LRx85TWdYdZ1SaJzD_S1ZCE,511
13
+ mrok/cli/commands/__init__.py,sha256=M6Sypb2vAh6qxQQJNIO9xop2DrD6zt6TEp8rbbD7LS0,114
14
+ mrok/cli/commands/admin/__init__.py,sha256=WU49jpMF9p18UONjYywWEFzjF57zLpLKJ0qAZvrzcR4,414
15
+ mrok/cli/commands/admin/bootstrap.py,sha256=iOnHctYajgcHrG_Idjn5Y7VVSaWYRIhdgqKSw9TWq9I,1680
16
+ mrok/cli/commands/admin/utils.py,sha256=wQ-qQJGFyhikMJY_CWT-G6sTEIZb-LUdj1AUZisLPBw,1363
17
+ mrok/cli/commands/admin/list/__init__.py,sha256=kjCMcpn1gopcrQaaHxfFh8Kyngldepnle8R2br5dJ_0,195
18
+ mrok/cli/commands/admin/list/extensions.py,sha256=16fhDB5ucL8su2WQnSaQ1E6MhgC4vkP9-nuHAcPpzyE,4405
19
+ mrok/cli/commands/admin/list/instances.py,sha256=HpEXk7DfeAXeUwi8Z4qnOmQCB1_lPm2JVBl8k0tjvUk,5179
20
+ mrok/cli/commands/admin/register/__init__.py,sha256=5Jb_bc2L47MEpQIrOcquzduTFWQ01Jd1U1MpqaR-Ekw,209
21
+ mrok/cli/commands/admin/register/extensions.py,sha256=nX2PUX8hmsWjyp2dGgge2YmkfeGgGXhqk7fwUx99o9o,1489
22
+ mrok/cli/commands/admin/register/instances.py,sha256=_9xpa4rZYmf7SZ58hx103EuEbA3o2FZYbAVmpT8oRhM,1930
23
+ mrok/cli/commands/admin/unregister/__init__.py,sha256=-GjjCPX1pISbWmJK6GpKO3ijGsDQb21URjU1hNu99O4,215
24
+ mrok/cli/commands/admin/unregister/extensions.py,sha256=AVBjHu-Zc7bUZ_YSbvEk41fKByvRl2Hggip1E2c11Mk,1020
25
+ mrok/cli/commands/admin/unregister/instances.py,sha256=UvMEDOw7FhZYz2AZci79sSVKfDxOS7d5GY5iCUtUZRM,1128
26
+ mrok/cli/commands/agent/__init__.py,sha256=Jr9RDSDdRPjbVJ7NhzgjRD-jtr5hD2vvKzDe7XsLnVo,140
27
+ mrok/cli/commands/agent/run/__init__.py,sha256=E_IJCl3BfMffqFASe8gzJwhhQgt5bQfjhuyekVwdEBA,164
28
+ mrok/cli/commands/agent/run/asgi.py,sha256=aqwu_h9WyCDI2Ts8D4zTvawCETNmcke7cX3zIUyRww4,1265
29
+ mrok/cli/commands/agent/run/sidecar.py,sha256=VC6o1Xw6XXB25xh5F2PyPsDe5Sii0cWLVLDrpNIC5hU,1490
30
+ mrok/cli/commands/controller/__init__.py,sha256=2xw-YVN0akiLiuGUU3XbYyZZ0ugOjQ6XhtTkzEKSmMA,161
31
+ mrok/cli/commands/controller/openapi.py,sha256=QLjVao9UkB2vBaGkFi_q_jrlg4Np4ldMRwDIJsrJ7A8,1175
32
+ mrok/cli/commands/controller/run.py,sha256=osyjssb81xNMYZLPb6dfPR4W_BQlCxKDfvl-BIhG_1A,2460
33
+ mrok/controller/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
+ mrok/controller/app.py,sha256=-GPOu7SV3kWDDzMhwvr7hK0oP8m-HWtMmtivpNUppEg,1635
35
+ mrok/controller/auth.py,sha256=Kg94W8yNMs6TvUmLRYv1QeUjDy4qlGZ-_6OHa4KH1zg,2648
36
+ mrok/controller/pagination.py,sha256=raYpYa34q8Ckl4BXBOEdpWlKkFj6z7e6QLWr2HT7dzI,2187
37
+ mrok/controller/routes.py,sha256=j-dLO4yLkUj-rdjnGhO2suvmR690-UdaNvokDZ7ZpF0,8670
38
+ mrok/controller/schemas.py,sha256=zk91PIJ0zncpBgs4bhU-n-76EWlRKo87r3VVx15JxPc,1320
39
+ mrok/controller/dependencies/__init__.py,sha256=voewk6gjkA0OarL6HFmfT_RLqBns0Fpl-VIqK5xVAEI,202
40
+ mrok/controller/dependencies/conf.py,sha256=2Pa8fxJHkZ29q6UL-w6hUP_wr7WnNELfw5LlzWg1Tec,162
41
+ mrok/controller/dependencies/ziti.py,sha256=fYoxeJb4s6p2_3gxbExbFSRabjpvp_gZMBb3ocXZV3Y,702
42
+ mrok/controller/openapi/__init__.py,sha256=U1dw45w76CcoQagyqg_FXdMuJF3qJZZM6wG8TeTe3Zo,101
43
+ mrok/controller/openapi/examples.py,sha256=ZI0BP7L6sI0z7Mq1I3uc2UrweGpzpPeGSIuf1bUKkgg,1419
44
+ mrok/controller/openapi/utils.py,sha256=Kn55ISAWlMJNwrJTum7iFrBvJvr81To76pCK8W-s79Q,1114
45
+ mrok/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ mrok/http/config.py,sha256=k8mjvD3ninJn-v1t-co-GSa3upm4b70bWyk3fwdcOh8,2161
47
+ mrok/http/forwarder.py,sha256=mo-Z8B8Zg6kdDX-lWEiptRv-9kJU9cEdmg6gt6eF0cc,11374
48
+ mrok/http/lifespan.py,sha256=9qevhD_5Y0f8fGTh2axdfWx7v1K4vnWtiUNyJLesOHE,262
49
+ mrok/http/master.py,sha256=o_0Sxe2XuTgVAwvBbWkYcO3HkCcfvYP4rgxcuIDPwXo,2426
50
+ mrok/http/protocol.py,sha256=ap8jbLUvgbAH81ZJZCBkQiYR7mkV_eL3rpfwEkoE8sU,392
51
+ mrok/http/server.py,sha256=Mj7C85fc-DXp-WTBWaOd7ag808oliLmFBH5bf-G2FHg,370
52
+ mrok/ziti/__init__.py,sha256=20OWMiexRhOovZOX19zlX87-V78QyWnEnSZfyAftUdE,263
53
+ mrok/ziti/api.py,sha256=3y8mTruJupr6k1fMKnLFmEKcHBF42VKvp5jLQ6BYLhc,16018
54
+ mrok/ziti/bootstrap.py,sha256=pg-8tt2t2Xt-o85UZe2ixfEtX_6eDuK5gqaCbfuCD6Q,2522
55
+ mrok/ziti/constants.py,sha256=Urq1X3bCBQZfw8NbnEa1pqmY4oq1wmzkwPfzam3kbTw,339
56
+ mrok/ziti/errors.py,sha256=yYCbVDwktnR0AYduqtynIjo73K3HOhIrwA_vQimvEd4,368
57
+ mrok/ziti/identities.py,sha256=oE_3j6Y4xCr6uKNdprW55bxGsyKnmJt-MrxrylB2Ey4,5388
58
+ mrok/ziti/pki.py,sha256=-V3LDAtntYZ4C6IH2rqfAANxmzpOZ32Rd0MK_27YNME,1906
59
+ mrok/ziti/services.py,sha256=JnznLTHNZjgbFwnBtv7y2XIp4NiQxLVawwP9EfWdVuM,3208
60
+ mrok-0.1.8.dist-info/METADATA,sha256=Ew2luIRV0rEXgMZl9DXtp0w84GGiAdaYC3zM14FjgxY,15506
61
+ mrok-0.1.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
62
+ mrok-0.1.8.dist-info/entry_points.txt,sha256=tloXwvU1uJicBJR2h-8HoVclPgwJWDwuREMHN8Zq-nU,38
63
+ mrok-0.1.8.dist-info/licenses/LICENSE.txt,sha256=6PaICaoA3yNsZKLv5G6OKqSfLSoX7MakYqTDgJoTCBs,11346
64
+ mrok-0.1.8.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
@@ -1,6 +0,0 @@
1
- mrok-0.1.6.dist-info/licenses/LICENSE.txt,sha256=6PaICaoA3yNsZKLv5G6OKqSfLSoX7MakYqTDgJoTCBs,11346
2
- mrok-0.1.6.dist-info/METADATA,sha256=612vzGsGs1T4QCTV5gFoA9NEaUBj4OsPngEbsWWgQdQ,15537
3
- mrok-0.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
4
- mrok-0.1.6.dist-info/entry_points.txt,sha256=tloXwvU1uJicBJR2h-8HoVclPgwJWDwuREMHN8Zq-nU,38
5
- mrok-0.1.6.dist-info/top_level.txt,sha256=sNZMiNdOxFlZFRGJlEErzMWaCb2wTJXuQVeGigF66Us,5
6
- mrok-0.1.6.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- mrok