primitive 0.2.66__py3-none-any.whl → 0.2.70__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.
Potentially problematic release.
This version of primitive might be problematic. Click here for more details.
- primitive/__about__.py +1 -1
- primitive/agent/actions.py +8 -5
- primitive/agent/runner.py +61 -17
- primitive/cli.py +2 -0
- primitive/client.py +2 -0
- primitive/files/actions.py +23 -1
- primitive/hardware/actions.py +226 -1
- primitive/hardware/commands.py +13 -2
- primitive/monitor/actions.py +10 -5
- primitive/network/actions.py +83 -34
- primitive/network/commands.py +17 -6
- primitive/network/ssh.py +126 -0
- primitive/network/ui.py +9 -3
- primitive/operating_systems/__init__.py +0 -0
- primitive/operating_systems/actions.py +260 -0
- primitive/operating_systems/commands.py +268 -0
- primitive/operating_systems/graphql/__init__.py +0 -0
- primitive/operating_systems/graphql/mutations.py +32 -0
- primitive/operating_systems/graphql/queries.py +36 -0
- primitive/organizations/actions.py +6 -0
- primitive/utils/cache.py +11 -0
- primitive/utils/checksums.py +44 -0
- {primitive-0.2.66.dist-info → primitive-0.2.70.dist-info}/METADATA +1 -1
- {primitive-0.2.66.dist-info → primitive-0.2.70.dist-info}/RECORD +27 -19
- {primitive-0.2.66.dist-info → primitive-0.2.70.dist-info}/WHEEL +0 -0
- {primitive-0.2.66.dist-info → primitive-0.2.70.dist-info}/entry_points.txt +0 -0
- {primitive-0.2.66.dist-info → primitive-0.2.70.dist-info}/licenses/LICENSE.txt +0 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
import typing
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
7
|
+
from ..utils.cache import get_operating_systems_cache
|
|
8
|
+
from ..utils.text import slugify
|
|
9
|
+
|
|
10
|
+
if typing.TYPE_CHECKING:
|
|
11
|
+
from ..client import Primitive
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@click.group("operating-systems")
|
|
15
|
+
@click.pass_context
|
|
16
|
+
def cli(context):
|
|
17
|
+
"Operating Systems"
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@cli.command("download")
|
|
22
|
+
@click.option("--id", help="Operating system ID", required=False)
|
|
23
|
+
@click.option("--slug", help="Operating system slug", required=False)
|
|
24
|
+
@click.option("--organization-slug", help="Organization slug", required=False)
|
|
25
|
+
@click.option(
|
|
26
|
+
"--directory",
|
|
27
|
+
help="Directory to download the operating system files to",
|
|
28
|
+
required=False,
|
|
29
|
+
)
|
|
30
|
+
@click.pass_context
|
|
31
|
+
def download(context, id, slug, organization_slug, directory):
|
|
32
|
+
if not (id or slug):
|
|
33
|
+
raise click.UsageError("You must provide either --id or --slug.")
|
|
34
|
+
if id and slug:
|
|
35
|
+
raise click.UsageError("You can only specify one of --id or --slug.")
|
|
36
|
+
|
|
37
|
+
primitive: Primitive = context.obj.get("PRIMITIVE")
|
|
38
|
+
|
|
39
|
+
organization = (
|
|
40
|
+
primitive.organizations.get_organization(slug=organization_slug)
|
|
41
|
+
if organization_slug
|
|
42
|
+
else primitive.organizations.get_default_organization()
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
if not organization:
|
|
46
|
+
if organization_slug:
|
|
47
|
+
logger.error(f"No organization found with slug {slug}")
|
|
48
|
+
else:
|
|
49
|
+
logger.error("Failed to fetch default organization")
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
operating_system = primitive.operating_systems.get_operating_system(
|
|
53
|
+
organization_id=organization["id"], slug=slug, id=id
|
|
54
|
+
)
|
|
55
|
+
except Exception:
|
|
56
|
+
logger.error("Unable to fetch operating system")
|
|
57
|
+
return
|
|
58
|
+
|
|
59
|
+
is_cached = primitive.operating_systems.is_operating_system_cached(
|
|
60
|
+
slug=operating_system["slug"],
|
|
61
|
+
directory=directory,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
if is_cached:
|
|
65
|
+
logger.info("Operating system already exists in cache, aborting download.")
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
operating_system_directory = (
|
|
69
|
+
Path(directory) / operating_system["slug"]
|
|
70
|
+
if directory
|
|
71
|
+
else (get_operating_systems_cache() / operating_system["slug"])
|
|
72
|
+
)
|
|
73
|
+
checksum_directory = operating_system_directory / "checksum"
|
|
74
|
+
checksum_file_path = (
|
|
75
|
+
checksum_directory / operating_system["checksumFile"]["fileName"]
|
|
76
|
+
)
|
|
77
|
+
iso_directory = operating_system_directory / "iso"
|
|
78
|
+
iso_file_path = iso_directory / operating_system["isoFile"]["fileName"]
|
|
79
|
+
|
|
80
|
+
if not iso_directory.exists():
|
|
81
|
+
iso_directory.mkdir(parents=True)
|
|
82
|
+
|
|
83
|
+
if not checksum_directory.exists():
|
|
84
|
+
checksum_directory.mkdir(parents=True)
|
|
85
|
+
|
|
86
|
+
logger.info("Downloading operating system iso")
|
|
87
|
+
primitive.files.download_file(
|
|
88
|
+
file_id=operating_system["isoFile"]["id"],
|
|
89
|
+
output_path=iso_directory,
|
|
90
|
+
organization_id=organization["id"],
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
logger.info("Downloading operating system checksum")
|
|
94
|
+
primitive.files.download_file(
|
|
95
|
+
file_id=operating_system["checksumFile"]["id"],
|
|
96
|
+
output_path=checksum_directory,
|
|
97
|
+
organization_id=organization["id"],
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
logger.info("Validating iso checksum")
|
|
101
|
+
try:
|
|
102
|
+
checksum_file_type = (
|
|
103
|
+
primitive.operating_systems.OperatingSystemChecksumFileType[
|
|
104
|
+
operating_system["checksumFileType"]
|
|
105
|
+
]
|
|
106
|
+
)
|
|
107
|
+
checksum_valid = primitive.operating_systems.validate_checksum(
|
|
108
|
+
operating_system["slug"],
|
|
109
|
+
iso_file_path,
|
|
110
|
+
checksum_file_path,
|
|
111
|
+
checksum_file_type=checksum_file_type,
|
|
112
|
+
)
|
|
113
|
+
except Exception:
|
|
114
|
+
logger.error("Failed to validate checksum.")
|
|
115
|
+
return
|
|
116
|
+
|
|
117
|
+
if not checksum_valid:
|
|
118
|
+
logger.error(
|
|
119
|
+
"Checksums did not match: file may have been corrupted during download."
|
|
120
|
+
+ f"\nTry deleting the directory {get_operating_systems_cache()}/{operating_system['slug']} and running this command again."
|
|
121
|
+
)
|
|
122
|
+
return
|
|
123
|
+
|
|
124
|
+
logger.success(
|
|
125
|
+
f"Successfully downloaded operating system to {operating_system_directory}"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@cli.group("remotes")
|
|
130
|
+
@click.pass_context
|
|
131
|
+
def remotes(context):
|
|
132
|
+
"Remotes"
|
|
133
|
+
pass
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@remotes.command("mirror")
|
|
137
|
+
@click.pass_context
|
|
138
|
+
@click.argument("operating-system")
|
|
139
|
+
@click.option("--slug", help="Slug of the operating system", required=False)
|
|
140
|
+
@click.option(
|
|
141
|
+
"--organization-slug",
|
|
142
|
+
help="Slug of the organization to upload the operating system to",
|
|
143
|
+
required=False,
|
|
144
|
+
)
|
|
145
|
+
def operating_system_mirror_command(
|
|
146
|
+
context, operating_system, slug=None, organization_slug=None
|
|
147
|
+
):
|
|
148
|
+
primitive: Primitive = context.obj.get("PRIMITIVE")
|
|
149
|
+
|
|
150
|
+
operating_system_slug = slugify(slug) if slug else slugify(operating_system)
|
|
151
|
+
|
|
152
|
+
organization = (
|
|
153
|
+
primitive.organizations.get_organization(slug=organization_slug)
|
|
154
|
+
if organization_slug
|
|
155
|
+
else primitive.organizations.get_default_organization()
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
if not organization:
|
|
159
|
+
if organization_slug:
|
|
160
|
+
logger.error(f"No organization found with slug {slug}.")
|
|
161
|
+
else:
|
|
162
|
+
logger.error("Failed to fetch default organization.")
|
|
163
|
+
|
|
164
|
+
is_slug_available = primitive.operating_systems.is_slug_available(
|
|
165
|
+
slug=operating_system_slug,
|
|
166
|
+
organization_id=organization["id"],
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
if not is_slug_available:
|
|
170
|
+
logger.error(
|
|
171
|
+
f"Operating system slug {operating_system_slug} already exists."
|
|
172
|
+
+ " Please specify the --slug parameter to mirror the operating system with a different slug."
|
|
173
|
+
)
|
|
174
|
+
return
|
|
175
|
+
|
|
176
|
+
try:
|
|
177
|
+
iso_file_path, checksum_file_path = (
|
|
178
|
+
primitive.operating_systems.download_from_remote(operating_system)
|
|
179
|
+
)
|
|
180
|
+
except Exception:
|
|
181
|
+
logger.error("Unable to download operating system")
|
|
182
|
+
return
|
|
183
|
+
|
|
184
|
+
logger.info("Validating iso checksum")
|
|
185
|
+
try:
|
|
186
|
+
checksum_valid = primitive.operating_systems.validate_checksum(
|
|
187
|
+
operating_system, iso_file_path, checksum_file_path
|
|
188
|
+
)
|
|
189
|
+
except Exception:
|
|
190
|
+
logger.error("Failed to validate checksum.")
|
|
191
|
+
return
|
|
192
|
+
|
|
193
|
+
if not checksum_valid:
|
|
194
|
+
logger.error(
|
|
195
|
+
"Checksums did not match: file may have been corrupted during download."
|
|
196
|
+
+ f"\nTry deleting the directory {get_operating_systems_cache()}/{operating_system} and running this command again."
|
|
197
|
+
)
|
|
198
|
+
return
|
|
199
|
+
|
|
200
|
+
logger.info("Checksum valid")
|
|
201
|
+
|
|
202
|
+
logger.info("Uploading operating system files to primitive.")
|
|
203
|
+
file_key_prefix = "operating-systems"
|
|
204
|
+
|
|
205
|
+
iso_upload_result = primitive.files.upload_file_direct(
|
|
206
|
+
path=iso_file_path,
|
|
207
|
+
organization_id=organization["id"],
|
|
208
|
+
key_prefix=file_key_prefix,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
if iso_upload_result and iso_upload_result.data is not None:
|
|
212
|
+
iso_upload_data = iso_upload_result.data
|
|
213
|
+
iso_file_id = iso_upload_data.get("fileUpdate", {}).get("id")
|
|
214
|
+
|
|
215
|
+
if not iso_file_id:
|
|
216
|
+
logger.error("Unable to upload iso file")
|
|
217
|
+
return
|
|
218
|
+
|
|
219
|
+
checksum_upload_response = primitive.files.upload_file_via_api(
|
|
220
|
+
path=checksum_file_path,
|
|
221
|
+
organization_id=organization["id"],
|
|
222
|
+
key_prefix=file_key_prefix,
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
if not checksum_upload_response.ok:
|
|
226
|
+
logger.error("Unable to upload checksum file")
|
|
227
|
+
return
|
|
228
|
+
|
|
229
|
+
checksum_file_id = (
|
|
230
|
+
checksum_upload_response.json()
|
|
231
|
+
.get("data", {})
|
|
232
|
+
.get("fileUpload", {})
|
|
233
|
+
.get("id", {})
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
if not checksum_file_id:
|
|
237
|
+
logger.error("Unable to upload checksum file")
|
|
238
|
+
return
|
|
239
|
+
|
|
240
|
+
logger.info("Creating operating system in primitive.")
|
|
241
|
+
operating_system_create_response = (
|
|
242
|
+
primitive.operating_systems.create_operating_system(
|
|
243
|
+
slug=operating_system_slug,
|
|
244
|
+
checksum_file_id=checksum_file_id,
|
|
245
|
+
checksum_file_type=primitive.operating_systems.get_checksum_file_type(
|
|
246
|
+
operating_system
|
|
247
|
+
).value,
|
|
248
|
+
organization_id=organization["id"],
|
|
249
|
+
iso_file_id=iso_file_id,
|
|
250
|
+
)
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
if "id" not in operating_system_create_response:
|
|
254
|
+
logger.error("Failed to create operating system")
|
|
255
|
+
return
|
|
256
|
+
|
|
257
|
+
logger.success("Operating system created in primitive.")
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@remotes.command("list")
|
|
261
|
+
@click.pass_context
|
|
262
|
+
def operating_system_list_command(context):
|
|
263
|
+
primitive: Primitive = context.obj.get("PRIMITIVE")
|
|
264
|
+
remote_operating_system_names = (
|
|
265
|
+
primitive.operating_systems.get_remote_operating_system_names()
|
|
266
|
+
)
|
|
267
|
+
logger.info("Remote operating systems available for download:")
|
|
268
|
+
logger.info("\n".join(remote_operating_system_names))
|
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from primitive.graphql.utility_fragments import operation_info_fragment
|
|
2
|
+
|
|
3
|
+
operating_system_create_mutation = (
|
|
4
|
+
operation_info_fragment
|
|
5
|
+
+ """
|
|
6
|
+
mutation operatingSystemCreate($input: OperatingSystemInput!) {
|
|
7
|
+
operatingSystemCreate(input: $input) {
|
|
8
|
+
... on OperatingSystem {
|
|
9
|
+
id
|
|
10
|
+
pk
|
|
11
|
+
createdAt
|
|
12
|
+
updatedAt
|
|
13
|
+
slug
|
|
14
|
+
organization {
|
|
15
|
+
id
|
|
16
|
+
slug
|
|
17
|
+
}
|
|
18
|
+
isoFile {
|
|
19
|
+
id
|
|
20
|
+
fileName
|
|
21
|
+
}
|
|
22
|
+
checksumFile {
|
|
23
|
+
id
|
|
24
|
+
fileName
|
|
25
|
+
}
|
|
26
|
+
checksumFileType
|
|
27
|
+
}
|
|
28
|
+
...OperationInfoFragment
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
"""
|
|
32
|
+
)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
operating_system_list_query = """
|
|
2
|
+
query operatingSystemList(
|
|
3
|
+
$filters: OperatingSystemFilters
|
|
4
|
+
) {
|
|
5
|
+
operatingSystemList(
|
|
6
|
+
filters: $filters
|
|
7
|
+
) {
|
|
8
|
+
totalCount
|
|
9
|
+
edges {
|
|
10
|
+
cursor
|
|
11
|
+
node {
|
|
12
|
+
... on OperatingSystem {
|
|
13
|
+
id
|
|
14
|
+
pk
|
|
15
|
+
createdAt
|
|
16
|
+
updatedAt
|
|
17
|
+
slug
|
|
18
|
+
organization {
|
|
19
|
+
id
|
|
20
|
+
slug
|
|
21
|
+
}
|
|
22
|
+
isoFile {
|
|
23
|
+
id
|
|
24
|
+
fileName
|
|
25
|
+
}
|
|
26
|
+
checksumFile {
|
|
27
|
+
id
|
|
28
|
+
fileName
|
|
29
|
+
}
|
|
30
|
+
checksumFileType
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
"""
|
|
@@ -67,3 +67,9 @@ class Organizations(BaseAction):
|
|
|
67
67
|
)
|
|
68
68
|
organizations = [edge["node"] for edge in result.data["organizations"]["edges"]]
|
|
69
69
|
return organizations[0]
|
|
70
|
+
|
|
71
|
+
@guard
|
|
72
|
+
def get_default_organization(self):
|
|
73
|
+
whoami_result = self.primitive.auth.whoami()
|
|
74
|
+
default_organization = whoami_result.data["whoami"]["defaultOrganization"]
|
|
75
|
+
return default_organization
|
primitive/utils/cache.py
CHANGED
|
@@ -67,3 +67,14 @@ def get_deps_cache() -> Path:
|
|
|
67
67
|
deps_dir.mkdir(parents=True, exist_ok=True)
|
|
68
68
|
|
|
69
69
|
return deps_dir
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def get_operating_systems_cache() -> Path:
|
|
73
|
+
cache_dir = get_cache_dir()
|
|
74
|
+
|
|
75
|
+
deps_dir = cache_dir / "operating-systems"
|
|
76
|
+
|
|
77
|
+
if not deps_dir.exists():
|
|
78
|
+
deps_dir.mkdir(parents=True, exist_ok=True)
|
|
79
|
+
|
|
80
|
+
return deps_dir
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import re
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def calculate_sha256(file_path: str) -> str:
|
|
9
|
+
file_path = Path(file_path)
|
|
10
|
+
|
|
11
|
+
if not file_path.exists():
|
|
12
|
+
logger.error(f"File '{file_path}' does not exist.")
|
|
13
|
+
raise FileNotFoundError(file_path)
|
|
14
|
+
|
|
15
|
+
sha256_hash = hashlib.sha256()
|
|
16
|
+
with file_path.open("rb") as f:
|
|
17
|
+
for byte_block in iter(lambda: f.read(8192), b""):
|
|
18
|
+
sha256_hash.update(byte_block)
|
|
19
|
+
return sha256_hash.hexdigest()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ChecksumNotFoundInFile(Exception):
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_checksum_from_file(checksum_file_path: str, file_name: str) -> str | None:
|
|
27
|
+
checksum_file_path = Path(checksum_file_path)
|
|
28
|
+
|
|
29
|
+
if not checksum_file_path.exists():
|
|
30
|
+
logger.error(f"File '{checksum_file_path}' does not exist.")
|
|
31
|
+
raise FileNotFoundError(checksum_file_path)
|
|
32
|
+
|
|
33
|
+
with checksum_file_path.open("r") as f:
|
|
34
|
+
for line in f:
|
|
35
|
+
match = re.match(r"^([a-fA-F0-9]{64})\s+\*?(.*)$", line.strip())
|
|
36
|
+
if match:
|
|
37
|
+
sha256_hash, current_file_name = match.groups()
|
|
38
|
+
if current_file_name == file_name:
|
|
39
|
+
return sha256_hash
|
|
40
|
+
|
|
41
|
+
logger.error(
|
|
42
|
+
f"No matching checksum entry found for {file_name} in {checksum_file_path}."
|
|
43
|
+
)
|
|
44
|
+
raise ChecksumNotFoundInFile(checksum_file_path)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: primitive
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.70
|
|
4
4
|
Project-URL: Documentation, https://github.com//primitivecorp/primitive-cli#readme
|
|
5
5
|
Project-URL: Issues, https://github.com//primitivecorp/primitive-cli/issues
|
|
6
6
|
Project-URL: Source, https://github.com//primitivecorp/primitive-cli
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
primitive/__about__.py,sha256=
|
|
1
|
+
primitive/__about__.py,sha256=NOrCGYjwMjgYW_AaVMV1_PDAVaXvQrgfkCKN6ly7xDM,130
|
|
2
2
|
primitive/__init__.py,sha256=bwKdgggKNVssJFVPfKSxqFMz4IxSr54WWbmiZqTMPNI,106
|
|
3
|
-
primitive/cli.py,sha256=
|
|
4
|
-
primitive/client.py,sha256=
|
|
3
|
+
primitive/cli.py,sha256=ga1TcPKyUkGNGZ76CjIQqTKWn1r9di5k_uRbLljY07w,2745
|
|
4
|
+
primitive/client.py,sha256=EyXLOFwKUT_ZB3at5m4hbdtjgaKVVFoiDdE0bP0_JfI,3966
|
|
5
5
|
primitive/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
primitive/agent/actions.py,sha256=
|
|
6
|
+
primitive/agent/actions.py,sha256=SnYJQKOQgzGL2-zopWT2ioy9w7OP9pqAbS3itMq-614,9528
|
|
7
7
|
primitive/agent/commands.py,sha256=o847pK7v7EWQGG67tky6a33qtwoutX6LZrP2FIS_NOk,388
|
|
8
|
-
primitive/agent/runner.py,sha256=
|
|
8
|
+
primitive/agent/runner.py,sha256=bYDH_kjoR8XrsxNsE2RfkGOJqfqX2M8jXyaFp3zGxqk,17760
|
|
9
9
|
primitive/agent/uploader.py,sha256=DT_Nzt5eOTm_uRcYKm1sjBBaQZzp5iNZ_uN5XktfQ30,3382
|
|
10
10
|
primitive/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
primitive/auth/actions.py,sha256=9NIEXJ1BNJutJs6AMMSjMN_ziONUAUhY_xHwojYJCLA,942
|
|
@@ -23,7 +23,7 @@ primitive/exec/actions.py,sha256=rcAMP7hxJZhQUwx-orduCUratzMwVRknX14QSyQLdcA,434
|
|
|
23
23
|
primitive/exec/commands.py,sha256=66LO2kkJC-ynNZQpUCXv4Ol15QoacdSZAHblePDcmLo,510
|
|
24
24
|
primitive/exec/interactive.py,sha256=TscY6s2ZysijidKPheq6y-fCErUVLS0zcdTW8XyFWGI,2435
|
|
25
25
|
primitive/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
-
primitive/files/actions.py,sha256=
|
|
26
|
+
primitive/files/actions.py,sha256=56I4tbGjXH117uZLghu2vgz6-ziM-UzZmCYpQndo1bg,15705
|
|
27
27
|
primitive/files/commands.py,sha256=-U0ArpZXDWltmkELG2SYIOLbaiMC6Zv24X9zZ29aqCE,3021
|
|
28
28
|
primitive/files/ui.py,sha256=lYnfu6gnZ5f-C28wps_egVDz8tdjL5P4361uxpSyfvY,919
|
|
29
29
|
primitive/files/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -40,9 +40,9 @@ primitive/graphql/relay.py,sha256=bmij2AjdpURQ6GGVCxwWhauF-r_SxuAU2oJ4sDbLxpI,72
|
|
|
40
40
|
primitive/graphql/sdk.py,sha256=dE4TD8KiTKw3Y0uiw5XrIcuZGqexE47eSlPaPD6jDGo,1545
|
|
41
41
|
primitive/graphql/utility_fragments.py,sha256=uIjwILC4QtWNyO5vu77VjQf_p0jvP3A9q_6zRq91zqs,303
|
|
42
42
|
primitive/hardware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
|
-
primitive/hardware/actions.py,sha256=
|
|
43
|
+
primitive/hardware/actions.py,sha256=B0mkqNsjeMPFZsAgI23X1I8th2U1cqCg4Ugm3w6dxfk,44255
|
|
44
44
|
primitive/hardware/android.py,sha256=tu7pBPxWFrIwb_mm5CEdFFf1_veNDOKjOCQg13i_Lh4,2758
|
|
45
|
-
primitive/hardware/commands.py,sha256=
|
|
45
|
+
primitive/hardware/commands.py,sha256=ZAbrqGuK4c4aCYPySaTUt51qFsf_F3Zsb0KaLfeVnmA,5045
|
|
46
46
|
primitive/hardware/ui.py,sha256=12rucuZ2s-w5R4bKyxON5dEbrdDnVf5sbj3K_nbdo44,2473
|
|
47
47
|
primitive/hardware/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
48
|
primitive/hardware/graphql/fragments.py,sha256=FRPAKB3KBfVxVm69HeYCxvvrdkW-O8CR46Inbk3wgc8,481
|
|
@@ -57,15 +57,22 @@ primitive/jobs/graphql/mutations.py,sha256=8ASvCmwQh7cMeeiykOdYaYVryG8FRIuVF6v_J
|
|
|
57
57
|
primitive/jobs/graphql/queries.py,sha256=57B5mSnAYjNEFFk1P69odON0fqkf7FyhsA316pcxb6g,1712
|
|
58
58
|
primitive/messaging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
59
|
primitive/messaging/provider.py,sha256=NkR4hnQzEZ0SItno1TgYNvzTwgKZq03iNrnIpLK7MTg,4400
|
|
60
|
-
primitive/monitor/actions.py,sha256=
|
|
60
|
+
primitive/monitor/actions.py,sha256=HO45Q1Cw9VTd2dITp-ftYJ4wJKt3YHHLdeJSqY-qhos,11085
|
|
61
61
|
primitive/monitor/commands.py,sha256=VDlEL_Qpm_ysHxug7VpI0cVAZ0ny6AS91Y58D7F1zkU,409
|
|
62
62
|
primitive/network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
|
-
primitive/network/actions.py,sha256=
|
|
64
|
-
primitive/network/commands.py,sha256=
|
|
63
|
+
primitive/network/actions.py,sha256=8JuArc8kRF-UjatxI1SbrD-F72ywGypmwDeijiXLTzw,18994
|
|
64
|
+
primitive/network/commands.py,sha256=wVszHkmmY85dwlEJR726vqx6rDcfD4XtAptgiHf5p4U,1361
|
|
65
65
|
primitive/network/redfish.py,sha256=uOtAS_Dwc4I4bnWKNSTCQ_xsj5LTtRzW5v2P_fWaSJM,4248
|
|
66
|
-
primitive/network/
|
|
66
|
+
primitive/network/ssh.py,sha256=vVopUr7PoZsu2-n8BQfwr_IF39HgPbrxz9dKKoJqsdE,4095
|
|
67
|
+
primitive/network/ui.py,sha256=-AV6OD1O3_nsTrgS-W49R6LfDN0vmXmz0Dli_S--LxE,685
|
|
68
|
+
primitive/operating_systems/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
69
|
+
primitive/operating_systems/actions.py,sha256=68YUAowtvJ8jm5HBXHjnQ_K8q0Z83J2hS5rfPkoJ53A,9127
|
|
70
|
+
primitive/operating_systems/commands.py,sha256=blZlHPKd1bfUImXP-AKUc7WGzMZ3Cm9wUI1--Q59JiQ,8523
|
|
71
|
+
primitive/operating_systems/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
72
|
+
primitive/operating_systems/graphql/mutations.py,sha256=L2ZeWEfBK22QAv2AsfDQWHKcwH5SWvMvcmOOftiEM7w,699
|
|
73
|
+
primitive/operating_systems/graphql/queries.py,sha256=TJzcYbFP4SowsFJb8Wv8Q1r5_gCZRKbobEzniu9LWFk,738
|
|
67
74
|
primitive/organizations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
|
-
primitive/organizations/actions.py,sha256=
|
|
75
|
+
primitive/organizations/actions.py,sha256=jkuAUoQexh4antNQd-0JWsAzCFy-e9yQeBc1JlaqqfU,2087
|
|
69
76
|
primitive/organizations/commands.py,sha256=_dwgVEJCqMa5VgB_7P1wLPFc0AuT1p9dtyR9JRr4kpw,487
|
|
70
77
|
primitive/organizations/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
78
|
primitive/organizations/graphql/fragments.py,sha256=a1qKq4FZB5qze0XTo1fOUeGAscIasjn_Ig4gA2_vStY,142
|
|
@@ -92,7 +99,8 @@ primitive/reservations/graphql/queries.py,sha256=BP7ON6QfChZRlY_YTyUbxM_tEPSfJqc
|
|
|
92
99
|
primitive/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
93
100
|
primitive/utils/actions.py,sha256=Gm84YgXFSpilpYqjG5nxcQTdRSp3waN7ZorzIzMBLtc,208
|
|
94
101
|
primitive/utils/auth.py,sha256=uBIZNPF2CpbaPV2UMi6eWVUKghV6WIm-pG3-UM29bNs,1465
|
|
95
|
-
primitive/utils/cache.py,sha256=
|
|
102
|
+
primitive/utils/cache.py,sha256=61FwFdUXBGGDT5ezM0dUDFDcWPoCKcUFDcesuKNu0ew,1804
|
|
103
|
+
primitive/utils/checksums.py,sha256=KoSdD6TaW70O67DfbFAoT9BAr7zN4txYg7P8xJC19F4,1333
|
|
96
104
|
primitive/utils/chunk_size.py,sha256=PAuVuirUTA9oRXyjo1c6MWxo31WVBRkWMuWw-AS58Bw,2914
|
|
97
105
|
primitive/utils/config.py,sha256=DlFM5Nglo22WPtbpZSVtH7NX-PTMaKYlcrUE7GPRG4c,1058
|
|
98
106
|
primitive/utils/daemons.py,sha256=mSoSHitiGfS4KYAEK9sKsiv_YcACHKgY3qISnDpUUIE,1086
|
|
@@ -104,8 +112,8 @@ primitive/utils/psutil.py,sha256=xa7ef435UL37jyjmUPbEqCO2ayQMpCs0HCrxVEvLcuM,763
|
|
|
104
112
|
primitive/utils/shell.py,sha256=Z4zxmOaSyGCrS0D6I436iQci-ewHLt4UxVg1CD9Serc,2171
|
|
105
113
|
primitive/utils/text.py,sha256=XiESMnlhjQ534xE2hMNf08WehE1SKaYFRNih0MmnK0k,829
|
|
106
114
|
primitive/utils/x509.py,sha256=HwHRPqakTHWd40ny-9O_yNknSL1Cxo50O0UCjXHFq04,3796
|
|
107
|
-
primitive-0.2.
|
|
108
|
-
primitive-0.2.
|
|
109
|
-
primitive-0.2.
|
|
110
|
-
primitive-0.2.
|
|
111
|
-
primitive-0.2.
|
|
115
|
+
primitive-0.2.70.dist-info/METADATA,sha256=6RjEuCX8ocvGe1cuwHtM3UN82KuKN5iLSyCtIlJavjQ,3569
|
|
116
|
+
primitive-0.2.70.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
117
|
+
primitive-0.2.70.dist-info/entry_points.txt,sha256=p1K8DMCWka5FqLlqP1sPek5Uovy9jq8u51gUsP-z334,48
|
|
118
|
+
primitive-0.2.70.dist-info/licenses/LICENSE.txt,sha256=B8kmQMJ2sxYygjCLBk770uacaMci4mPSoJJ8WoDBY_c,1098
|
|
119
|
+
primitive-0.2.70.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|