mrok 0.1.7__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.
- mrok/cli/commands/admin/__init__.py +2 -0
- mrok/cli/commands/admin/list/__init__.py +8 -0
- mrok/cli/commands/admin/list/extensions.py +144 -0
- mrok/cli/commands/admin/list/instances.py +167 -0
- mrok/cli/commands/admin/utils.py +26 -0
- mrok/ziti/api.py +20 -6
- mrok/ziti/constants.py +4 -1
- mrok/ziti/identities.py +9 -1
- {mrok-0.1.7.dist-info → mrok-0.1.8.dist-info}/METADATA +1 -1
- {mrok-0.1.7.dist-info → mrok-0.1.8.dist-info}/RECORD +13 -10
- {mrok-0.1.7.dist-info → mrok-0.1.8.dist-info}/WHEEL +0 -0
- {mrok-0.1.7.dist-info → mrok-0.1.8.dist-info}/entry_points.txt +0 -0
- {mrok-0.1.7.dist-info → mrok-0.1.8.dist-info}/licenses/LICENSE.txt +0 -0
|
@@ -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,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)
|
mrok/cli/commands/admin/utils.py
CHANGED
|
@@ -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(
|
|
85
|
-
|
|
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(
|
|
262
|
-
|
|
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(
|
|
265
|
-
|
|
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)
|
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
|
|
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
|
|
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}'")
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
53
|
+
mrok/ziti/api.py,sha256=3y8mTruJupr6k1fMKnLFmEKcHBF42VKvp5jLQ6BYLhc,16018
|
|
51
54
|
mrok/ziti/bootstrap.py,sha256=pg-8tt2t2Xt-o85UZe2ixfEtX_6eDuK5gqaCbfuCD6Q,2522
|
|
52
|
-
mrok/ziti/constants.py,sha256=
|
|
55
|
+
mrok/ziti/constants.py,sha256=Urq1X3bCBQZfw8NbnEa1pqmY4oq1wmzkwPfzam3kbTw,339
|
|
53
56
|
mrok/ziti/errors.py,sha256=yYCbVDwktnR0AYduqtynIjo73K3HOhIrwA_vQimvEd4,368
|
|
54
|
-
mrok/ziti/identities.py,sha256=
|
|
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.
|
|
58
|
-
mrok-0.1.
|
|
59
|
-
mrok-0.1.
|
|
60
|
-
mrok-0.1.
|
|
61
|
-
mrok-0.1.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|