mrok 0.1.7__py3-none-any.whl → 0.1.9__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.
@@ -1,10 +1,12 @@
1
1
  import typer
2
2
 
3
3
  from mrok.cli.commands.admin import bootstrap
4
+ from mrok.cli.commands.admin.list import app as list_app
4
5
  from mrok.cli.commands.admin.register import app as register_app
5
6
  from mrok.cli.commands.admin.unregister import app as unregister_app
6
7
 
7
8
  app = typer.Typer(help="mrok administrative commands.")
8
9
  app.add_typer(register_app)
9
10
  app.add_typer(unregister_app)
11
+ app.add_typer(list_app)
10
12
  bootstrap.register(app)
@@ -0,0 +1,8 @@
1
+ import typer
2
+
3
+ from mrok.cli.commands.admin.list import extensions, instances
4
+
5
+ app = typer.Typer(name="list", help="Show resources in OpenZiti.")
6
+
7
+ extensions.register(app)
8
+ instances.register(app)
@@ -0,0 +1,144 @@
1
+ import asyncio
2
+ from typing import Annotated
3
+
4
+ import typer
5
+ from rich import box
6
+ from rich.table import Table
7
+
8
+ from mrok.cli.commands.admin.utils import (
9
+ extract_names,
10
+ format_tags,
11
+ format_timestamp,
12
+ tags_to_filter,
13
+ )
14
+ from mrok.cli.rich import get_console
15
+ from mrok.conf import Settings
16
+ from mrok.ziti.api import ZitiManagementAPI
17
+
18
+
19
+ async def get_extensions(
20
+ settings: Settings, detailed: bool, tags: list[str] | None = None
21
+ ) -> list[dict]:
22
+ async with ZitiManagementAPI(settings) as api:
23
+ if tags is None:
24
+ params = None
25
+ else:
26
+ params = {"filter": tags_to_filter(tags)}
27
+
28
+ services = [service async for service in api.services(params=params)]
29
+ if detailed:
30
+ for service in services:
31
+ service["configs"] = [
32
+ config
33
+ async for config in api.collection_iterator(
34
+ f"/services/{service['id']}/configs",
35
+ )
36
+ ]
37
+ service["policies"] = [
38
+ policy
39
+ async for policy in api.collection_iterator(
40
+ f"/services/{service['id']}/service-policies",
41
+ )
42
+ ]
43
+ return services
44
+
45
+
46
+ def render_tsv(extensions: list[dict], detailed: bool) -> None:
47
+ console = get_console()
48
+ if detailed:
49
+ console.print("id\tname\tconfigurations\tpolicies\ttags\tcreated\tupdated")
50
+ for extension in extensions:
51
+ console.print(
52
+ f"{extension['id']}\t{extension['name']}\t"
53
+ f"{extract_names(extension['configs'], ', ')}\t"
54
+ f"{extract_names(extension['policies'], ', ')}\t"
55
+ f"{format_tags(extension['tags'], ', ')}\t"
56
+ f"{format_timestamp(extension['createdAt'])}\t"
57
+ f"{format_timestamp(extension['updatedAt'])}"
58
+ )
59
+ else:
60
+ console.print("id\tname\ttags\tcreated")
61
+ for extension in extensions:
62
+ console.print(
63
+ f"{extension['id']}\t{extension['name']}\t"
64
+ f"{format_tags(extension['tags'], ', ')}\t"
65
+ f"{format_timestamp(extension['createdAt'])}\t"
66
+ )
67
+
68
+
69
+ def render_table(extensions: list[dict], detailed: bool) -> None:
70
+ table = Table(
71
+ box=box.ROUNDED,
72
+ title="🔍 Extensions in OpenZiti (services):",
73
+ title_justify="left",
74
+ border_style="#472AFF",
75
+ show_lines=True,
76
+ )
77
+ table.add_column("Id", style="green")
78
+ table.add_column("Name", style="bold cyan")
79
+ if detailed:
80
+ table.add_column("Configurations")
81
+ table.add_column("Service Policies")
82
+ table.add_column("Tags")
83
+ table.add_column("Created", style="dim")
84
+ if detailed:
85
+ table.add_column("Updated", style="dim")
86
+
87
+ for extension in extensions:
88
+ row = [
89
+ extension["id"],
90
+ extension["name"],
91
+ ]
92
+ if detailed:
93
+ row += [
94
+ extract_names(extension["configs"]),
95
+ extract_names(extension["policies"]),
96
+ ]
97
+ row += [
98
+ format_tags(extension["tags"]),
99
+ format_timestamp(extension["createdAt"]),
100
+ ]
101
+ if detailed:
102
+ row.append(format_timestamp(extension["updatedAt"]))
103
+
104
+ table.add_row(*row)
105
+
106
+ get_console().print(table)
107
+
108
+
109
+ def register(app: typer.Typer) -> None:
110
+ @app.command("extensions")
111
+ def list_extensions(
112
+ ctx: typer.Context,
113
+ detailed: bool = typer.Option(
114
+ False,
115
+ "--detailed",
116
+ "-d",
117
+ help="Output detailed information",
118
+ ),
119
+ tags: Annotated[
120
+ list[str] | None,
121
+ typer.Option(
122
+ "--tag",
123
+ "-t",
124
+ help="Add tag",
125
+ show_default=True,
126
+ ),
127
+ ] = None,
128
+ tsv_output: bool = typer.Option(
129
+ False,
130
+ "--tsv",
131
+ help="Output as TSV",
132
+ ),
133
+ ):
134
+ """List extensions in OpenZiti (service)."""
135
+ extensions = asyncio.run(get_extensions(ctx.obj, detailed, tags))
136
+
137
+ if len(extensions) == 0:
138
+ get_console().print("No extensions found.")
139
+ return
140
+
141
+ if tsv_output:
142
+ render_tsv(extensions, detailed)
143
+ else:
144
+ render_table(extensions, detailed)
@@ -0,0 +1,167 @@
1
+ import asyncio
2
+ from typing import Annotated
3
+
4
+ import typer
5
+ from rich import box
6
+ from rich.table import Table
7
+
8
+ from mrok.cli.commands.admin.utils import (
9
+ extract_names,
10
+ format_tags,
11
+ format_timestamp,
12
+ tags_to_filter,
13
+ )
14
+ from mrok.cli.rich import get_console
15
+ from mrok.conf import Settings
16
+ from mrok.ziti.api import ZitiManagementAPI
17
+ from mrok.ziti.constants import (
18
+ MROK_IDENTITY_TYPE_TAG_NAME,
19
+ MROK_IDENTITY_TYPE_TAG_VALUE_INSTANCE,
20
+ )
21
+
22
+
23
+ async def get_instances(
24
+ settings: Settings, detailed: bool, extension: str | None = None, tags: list[str] | None = None
25
+ ) -> list[dict]:
26
+ async with ZitiManagementAPI(settings) as api:
27
+ tags = tags or []
28
+ tags.append(f"{MROK_IDENTITY_TYPE_TAG_NAME}={MROK_IDENTITY_TYPE_TAG_VALUE_INSTANCE}")
29
+ identities = [
30
+ identity async for identity in api.identities(params={"filter": tags_to_filter(tags)})
31
+ ]
32
+ if detailed or extension:
33
+ for identity in identities:
34
+ identity["services"] = [
35
+ service
36
+ async for service in api.collection_iterator(
37
+ f"/identities/{identity['id']}/services"
38
+ )
39
+ ]
40
+ identity["policies"] = [
41
+ policy
42
+ async for policy in api.collection_iterator(
43
+ f"/identities/{identity['id']}/service-policies"
44
+ )
45
+ ]
46
+
47
+ if extension:
48
+ return [
49
+ identity
50
+ for identity in identities
51
+ if any(
52
+ service["id"] == extension or service["name"] == extension
53
+ for service in identity["services"]
54
+ )
55
+ ]
56
+
57
+ return identities
58
+
59
+
60
+ def render_tsv(instances: list[dict], detailed: bool) -> None:
61
+ console = get_console()
62
+ if detailed:
63
+ console.print("id\tname\tservices\tpolicies\ttags\tcreated\tupdated")
64
+ for instance in instances:
65
+ console.print(
66
+ f"{instance['id']}\t{instance['name']}\t"
67
+ f"{extract_names(instance['services'], ', ')}\t"
68
+ f"{extract_names(instance['policies'], ', ')}\t"
69
+ f"{format_tags(instance['tags'], ', ')}\t"
70
+ f"{format_timestamp(instance['createdAt'])}\t"
71
+ f"{format_timestamp(instance['updatedAt'])}"
72
+ )
73
+ else:
74
+ console.print("id\tname\ttags\tcreated")
75
+ for instance in instances:
76
+ console.print(
77
+ f"{instance['id']}\t{instance['name']}\t"
78
+ f"{format_tags(instance['tags'], ', ')}\t"
79
+ f"{format_timestamp(instance['createdAt'])}\t"
80
+ )
81
+
82
+
83
+ def render_table(instances: list[dict], detailed: bool) -> None:
84
+ table = Table(
85
+ box=box.ROUNDED,
86
+ title="🔍 Instances in OpenZiti (identities):",
87
+ title_justify="left",
88
+ border_style="#472AFF",
89
+ show_lines=True,
90
+ )
91
+ table.add_column("Id", style="green")
92
+ table.add_column("Name", style="bold cyan")
93
+ if detailed:
94
+ table.add_column("Associated services")
95
+ table.add_column("Associated service policies")
96
+ table.add_column("Tags")
97
+ table.add_column("Created", style="dim")
98
+ if detailed:
99
+ table.add_column("Updated", style="dim")
100
+
101
+ for instance in instances:
102
+ row = [
103
+ instance["id"],
104
+ instance["name"],
105
+ ]
106
+ if detailed:
107
+ row += [
108
+ extract_names(instance["services"]),
109
+ extract_names(instance["policies"]),
110
+ ]
111
+ row += [
112
+ format_tags(instance["tags"]),
113
+ format_timestamp(instance["createdAt"]),
114
+ ]
115
+ if detailed:
116
+ row.append(format_timestamp(instance["updatedAt"]))
117
+
118
+ table.add_row(*row)
119
+
120
+ get_console().print(table)
121
+
122
+
123
+ def register(app: typer.Typer) -> None:
124
+ @app.command("instances")
125
+ def list_instances(
126
+ ctx: typer.Context,
127
+ extension: Annotated[
128
+ str | None,
129
+ typer.Option(
130
+ "--extension",
131
+ "-e",
132
+ help="Filter instances by extension",
133
+ show_default=True,
134
+ ),
135
+ ] = None,
136
+ tags: Annotated[
137
+ list[str] | None,
138
+ typer.Option(
139
+ "--tag",
140
+ "-t",
141
+ help="Add tag",
142
+ show_default=True,
143
+ ),
144
+ ] = None,
145
+ detailed: bool = typer.Option(
146
+ False,
147
+ "--detailed",
148
+ "-d",
149
+ help="Output detailed information",
150
+ ),
151
+ tsv_output: bool = typer.Option(
152
+ False,
153
+ "--tsv",
154
+ help="Output as TSV",
155
+ ),
156
+ ):
157
+ """List instances in OpenZiti (identities)."""
158
+ instances = asyncio.run(get_instances(ctx.obj, detailed, extension, tags))
159
+
160
+ if len(instances) == 0:
161
+ get_console().print("No instances found.")
162
+ return
163
+
164
+ if tsv_output:
165
+ render_tsv(instances, detailed)
166
+ else:
167
+ render_table(instances, detailed)
@@ -1,3 +1,5 @@
1
+ from datetime import datetime
2
+
1
3
  import typer
2
4
 
3
5
  from mrok.ziti.api import TagsType
@@ -21,3 +23,27 @@ def parse_tags(pairs: list[str] | None) -> TagsType | None:
21
23
  val = raw
22
24
  result[key.strip()] = val
23
25
  return result
26
+
27
+
28
+ def tags_to_filter(tags: list[str]) -> str:
29
+ parsed_tags = parse_tags(tags)
30
+ return " and ".join([f'tags.{key}="{value}"' for key, value in parsed_tags.items()])
31
+
32
+
33
+ def format_timestamp(iso_timestamp: str) -> str:
34
+ dt = datetime.strptime(iso_timestamp, "%Y-%m-%dT%H:%M:%S.%fZ")
35
+ return dt.strftime("%Y-%m-%d %H:%M:%S")
36
+
37
+
38
+ def format_tags(tags: dict, delimiter: str = "\n") -> str:
39
+ if not tags:
40
+ return "-"
41
+
42
+ return f"{delimiter}".join(f"{k}: {v}" for k, v in tags.items())
43
+
44
+
45
+ def extract_names(data: list[dict], delimiter: str = "\n") -> str:
46
+ if not data:
47
+ return "-"
48
+
49
+ return f"{delimiter}".join(item["name"] for item in data if item.get("name"))
mrok/ziti/api.py CHANGED
@@ -81,8 +81,16 @@ class BaseZitiAPI(ABC):
81
81
  response.raise_for_status()
82
82
  return response.json()["data"]["id"]
83
83
 
84
- async def get(self, endpoint: str, id: str) -> dict[str, Any]:
85
- response = await self.httpx_client.get(f"{endpoint}/{id}")
84
+ async def get(
85
+ self,
86
+ endpoint: str,
87
+ id: str,
88
+ additional_path: str | None = None,
89
+ ) -> dict[str, Any]:
90
+ url = f"{endpoint}/{id}"
91
+ if additional_path:
92
+ url = f"{url}/{additional_path}"
93
+ response = await self.httpx_client.get(url)
86
94
  response.raise_for_status()
87
95
  return response.json()["data"]
88
96
 
@@ -258,11 +266,17 @@ class ZitiManagementAPI(BaseZitiAPI):
258
266
  def base_url(self):
259
267
  return f"{self.settings.ziti.api.management}/edge/management/v1"
260
268
 
261
- def services(self) -> AsyncGenerator[dict[str, Any], None]:
262
- return self.collection_iterator("/services")
269
+ def services(
270
+ self,
271
+ params: dict[str, Any] | None = None,
272
+ ) -> AsyncGenerator[dict[str, Any], None]:
273
+ return self.collection_iterator("/services", params=params)
263
274
 
264
- def identities(self) -> AsyncGenerator[dict[str, Any], None]:
265
- return self.collection_iterator("/identities")
275
+ def identities(
276
+ self,
277
+ params: dict[str, Any] | None = None,
278
+ ) -> AsyncGenerator[dict[str, Any], None]:
279
+ return self.collection_iterator("/identities", params=params)
266
280
 
267
281
  async def search_config(self, id_or_name) -> dict[str, Any] | None:
268
282
  return await self.search_by_id_or_name("/configs", id_or_name)
@@ -383,6 +397,9 @@ class ZitiManagementAPI(BaseZitiAPI):
383
397
  async def search_config_type(self, id_or_name: str) -> dict[str, Any] | None:
384
398
  return await self.search_by_id_or_name("/config-types", id_or_name)
385
399
 
400
+ async def delete_config_type(self, config_type_id: str) -> dict[str, Any] | None:
401
+ return await self.delete("/config-types", config_type_id)
402
+
386
403
  async def get_identity(self, identity_id: str) -> dict[str, Any]:
387
404
  return await self.get("/identities", identity_id)
388
405
 
mrok/ziti/bootstrap.py CHANGED
@@ -19,19 +19,27 @@ async def bootstrap_identity(
19
19
 
20
20
  identity_json = None
21
21
  existing_identity = await mgmt_api.search_identity(identity_name)
22
+ policy = await mgmt_api.search_router_policy(identity_name)
23
+ config_type_name = f"{mode}.proxy.v1"
24
+ config_type = await mgmt_api.search_config_type(config_type_name)
22
25
 
23
26
  if forced and existing_identity:
24
27
  logger.info(f"Deleting existing identity '{identity_name}' ({existing_identity['id']})")
25
28
 
26
- policy = await mgmt_api.search_router_policy(identity_name)
27
29
  if policy:
28
30
  await mgmt_api.delete_router_policy(policy["id"])
29
31
  logger.info(f"Deleted existing ERP '{policy['name']}' ({policy['id']})")
32
+ policy = None
30
33
 
31
34
  await mgmt_api.delete_identity(existing_identity["id"])
32
35
  logger.info("Deleted existing identity")
33
36
  existing_identity = None
34
37
 
38
+ if forced and config_type:
39
+ await mgmt_api.delete_config_type(config_type["id"])
40
+ logger.info(f"Deleted existing config type '{config_type_name}' ({config_type['id']})")
41
+ config_type = None
42
+
35
43
  if existing_identity:
36
44
  frontend_id = existing_identity["id"]
37
45
  logger.info(f"Identity '{identity_name}' ({frontend_id}) is already enrolled")
@@ -44,7 +52,6 @@ async def bootstrap_identity(
44
52
  )
45
53
  logger.info(f"Identity '{identity_name}' ({frontend_id}) successfully enrolled")
46
54
 
47
- policy = await mgmt_api.search_router_policy(identity_name)
48
55
  if not policy:
49
56
  policy_id = await mgmt_api.create_router_policy(
50
57
  identity_name,
@@ -55,8 +62,6 @@ async def bootstrap_identity(
55
62
  else:
56
63
  logger.info(f"Found ERP '{policy['name']}' ({policy['id']})")
57
64
 
58
- config_type_name = f"{mode}.proxy.v1"
59
- config_type = await mgmt_api.search_config_type(config_type_name)
60
65
  if config_type is None:
61
66
  config_type_id = await mgmt_api.create_config_type(config_type_name, tags=tags)
62
67
  logger.info(f"Created '{config_type_name}' ({config_type_id}) config type")
mrok/ziti/constants.py CHANGED
@@ -3,4 +3,7 @@ import mrok
3
3
  MROK_VERSION_TAG_NAME = "mrok"
4
4
  MROK_VERSION_TAG_VALUE = mrok.__version__
5
5
  MROK_VERSION_TAG = {MROK_VERSION_TAG_NAME: MROK_VERSION_TAG_VALUE}
6
- MROK_SERVICE_TAG_NAME = "mrok.service"
6
+ MROK_SERVICE_TAG_NAME = "mrok-service"
7
+ MROK_IDENTITY_TYPE_TAG_NAME = "mrok-identity-type"
8
+ MROK_IDENTITY_TYPE_TAG_VALUE_INSTANCE = "instance"
9
+ MROK_IDENTITY_TYPE_TAG_VALUE_PROXY = "proxy"
mrok/ziti/identities.py CHANGED
@@ -5,7 +5,12 @@ import jwt
5
5
 
6
6
  from mrok.ziti import pki
7
7
  from mrok.ziti.api import TagsType, ZitiClientAPI, ZitiManagementAPI
8
- from mrok.ziti.constants import MROK_SERVICE_TAG_NAME
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
+ )
9
14
  from mrok.ziti.errors import (
10
15
  ProxyIdentityAlreadyExistsError,
11
16
  ServiceNotFoundError,
@@ -25,6 +30,7 @@ async def register_instance(
25
30
  service_name = extension_id.lower()
26
31
  tags = tags or {}
27
32
  tags[MROK_SERVICE_TAG_NAME] = service_name
33
+ tags[MROK_IDENTITY_TYPE_TAG_NAME] = MROK_IDENTITY_TYPE_TAG_VALUE_INSTANCE
28
34
  service = await mgmt_api.search_service(service_name)
29
35
  if not service:
30
36
  raise ServiceNotFoundError(f"A service with name `{extension_id}` does not exists.")
@@ -100,6 +106,8 @@ async def enroll_proxy_identity(
100
106
  raise ProxyIdentityAlreadyExistsError(
101
107
  f"A proxy identity with name `{identity_name}` already exists."
102
108
  )
109
+ tags = tags or {}
110
+ tags[MROK_IDENTITY_TYPE_TAG_NAME] = MROK_IDENTITY_TYPE_TAG_VALUE_PROXY
103
111
  identity_id = await mgmt_api.create_device_identity(identity_name, tags=tags)
104
112
  identity_json = await _enroll_identity(mgmt_api, client_api, identity_id)
105
113
  logger.info(f"Enrolled proxy identity '{identity_name}'")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mrok
3
- Version: 0.1.7
3
+ Version: 0.1.9
4
4
  Summary: MPT Extensions OpenZiti Orchestrator
5
5
  Author: SoftwareOne AG
6
6
  License: Apache License
@@ -11,9 +11,12 @@ mrok/cli/__init__.py,sha256=mtFEa8IeS1x6Gm4dUYoSnAxyEzNqbUVSmWxtuZUMR84,61
11
11
  mrok/cli/main.py,sha256=DFcYPwDskXi8SKAgEsuP4GMFzaniIf_6bZaSDWvYKDk,2724
12
12
  mrok/cli/rich.py,sha256=P3Dyu8EArUR9_0j7DPK7LRx85TWdYdZ1SaJzD_S1ZCE,511
13
13
  mrok/cli/commands/__init__.py,sha256=M6Sypb2vAh6qxQQJNIO9xop2DrD6zt6TEp8rbbD7LS0,114
14
- mrok/cli/commands/admin/__init__.py,sha256=dc5oZVdcLzG0Jroq1eIzX3VslcgP58fBX8aWzZHKYF4,333
14
+ mrok/cli/commands/admin/__init__.py,sha256=WU49jpMF9p18UONjYywWEFzjF57zLpLKJ0qAZvrzcR4,414
15
15
  mrok/cli/commands/admin/bootstrap.py,sha256=iOnHctYajgcHrG_Idjn5Y7VVSaWYRIhdgqKSw9TWq9I,1680
16
- mrok/cli/commands/admin/utils.py,sha256=yd6FWHqsyfgWu8ch9WX8Js18Hvlx7LdzwMHCaB1ExXU,645
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
17
20
  mrok/cli/commands/admin/register/__init__.py,sha256=5Jb_bc2L47MEpQIrOcquzduTFWQ01Jd1U1MpqaR-Ekw,209
18
21
  mrok/cli/commands/admin/register/extensions.py,sha256=nX2PUX8hmsWjyp2dGgge2YmkfeGgGXhqk7fwUx99o9o,1489
19
22
  mrok/cli/commands/admin/register/instances.py,sha256=_9xpa4rZYmf7SZ58hx103EuEbA3o2FZYbAVmpT8oRhM,1930
@@ -47,15 +50,15 @@ mrok/http/master.py,sha256=o_0Sxe2XuTgVAwvBbWkYcO3HkCcfvYP4rgxcuIDPwXo,2426
47
50
  mrok/http/protocol.py,sha256=ap8jbLUvgbAH81ZJZCBkQiYR7mkV_eL3rpfwEkoE8sU,392
48
51
  mrok/http/server.py,sha256=Mj7C85fc-DXp-WTBWaOd7ag808oliLmFBH5bf-G2FHg,370
49
52
  mrok/ziti/__init__.py,sha256=20OWMiexRhOovZOX19zlX87-V78QyWnEnSZfyAftUdE,263
50
- mrok/ziti/api.py,sha256=vWu9XXptPCcuaoI0c0VM4QFd_vmh2ZgdmqQSzZ-kIPk,15700
51
- mrok/ziti/bootstrap.py,sha256=pg-8tt2t2Xt-o85UZe2ixfEtX_6eDuK5gqaCbfuCD6Q,2522
52
- mrok/ziti/constants.py,sha256=VO0LnsXZse2q4TW6HYqO6nrSQ8wX1673iEy-s9Y7jPU,192
53
+ mrok/ziti/api.py,sha256=onVOSgcqALTeC3EBX-RPJvkqQ3OhhzvJ91HPsGaIJC4,16171
54
+ mrok/ziti/bootstrap.py,sha256=QIDhlkIxPW2QRuumFq2D1WDbD003P5f3z24pAUsyeBI,2696
55
+ mrok/ziti/constants.py,sha256=Urq1X3bCBQZfw8NbnEa1pqmY4oq1wmzkwPfzam3kbTw,339
53
56
  mrok/ziti/errors.py,sha256=yYCbVDwktnR0AYduqtynIjo73K3HOhIrwA_vQimvEd4,368
54
- mrok/ziti/identities.py,sha256=nVdXVeAGnW8slwy_X2N52vSDXbIF_TMD46751ajJpgE,5088
57
+ mrok/ziti/identities.py,sha256=oE_3j6Y4xCr6uKNdprW55bxGsyKnmJt-MrxrylB2Ey4,5388
55
58
  mrok/ziti/pki.py,sha256=-V3LDAtntYZ4C6IH2rqfAANxmzpOZ32Rd0MK_27YNME,1906
56
59
  mrok/ziti/services.py,sha256=JnznLTHNZjgbFwnBtv7y2XIp4NiQxLVawwP9EfWdVuM,3208
57
- mrok-0.1.7.dist-info/METADATA,sha256=Z0jLZf_ZJeUJ8pTe6xy64GDbToee3XDCX72HM242ZjU,15506
58
- mrok-0.1.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
59
- mrok-0.1.7.dist-info/entry_points.txt,sha256=tloXwvU1uJicBJR2h-8HoVclPgwJWDwuREMHN8Zq-nU,38
60
- mrok-0.1.7.dist-info/licenses/LICENSE.txt,sha256=6PaICaoA3yNsZKLv5G6OKqSfLSoX7MakYqTDgJoTCBs,11346
61
- mrok-0.1.7.dist-info/RECORD,,
60
+ mrok-0.1.9.dist-info/METADATA,sha256=C6efuUa5kHfw19OLwZVawjLZEcGXBMCH7vV3YniB9Fw,15506
61
+ mrok-0.1.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
62
+ mrok-0.1.9.dist-info/entry_points.txt,sha256=tloXwvU1uJicBJR2h-8HoVclPgwJWDwuREMHN8Zq-nU,38
63
+ mrok-0.1.9.dist-info/licenses/LICENSE.txt,sha256=6PaICaoA3yNsZKLv5G6OKqSfLSoX7MakYqTDgJoTCBs,11346
64
+ mrok-0.1.9.dist-info/RECORD,,
File without changes