catocli 2.0.3__py3-none-any.whl → 2.0.4__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 catocli might be problematic. Click here for more details.
- catocli/__init__.py +1 -1
- catocli/parsers/custom/export_rules/__init__.py +2 -0
- catocli/parsers/custom/export_rules/export_rules.py +29 -5
- catocli/parsers/custom/export_sites/__init__.py +1 -0
- catocli/parsers/custom/export_sites/export_sites.py +8 -1
- catocli/parsers/parserApiClient.py +163 -1
- catocli/parsers/raw/README.md +14 -0
- catocli/parsers/raw/__init__.py +2 -0
- {catocli-2.0.3.dist-info → catocli-2.0.4.dist-info}/METADATA +1 -1
- {catocli-2.0.3.dist-info → catocli-2.0.4.dist-info}/RECORD +14 -14
- {catocli-2.0.3.dist-info → catocli-2.0.4.dist-info}/LICENSE +0 -0
- {catocli-2.0.3.dist-info → catocli-2.0.4.dist-info}/WHEEL +0 -0
- {catocli-2.0.3.dist-info → catocli-2.0.4.dist-info}/entry_points.txt +0 -0
- {catocli-2.0.3.dist-info → catocli-2.0.4.dist-info}/top_level.txt +0 -0
catocli/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = "2.0.
|
|
1
|
+
__version__ = "2.0.4"
|
|
2
2
|
__cato_host__ = "https://api.catonetworks.com/api/v1/graphql2"
|
|
@@ -20,6 +20,7 @@ def export_rules_parse(subparsers):
|
|
|
20
20
|
|
|
21
21
|
if_rules_parser.add_argument('-accountID', help='Account ID to export rules from (uses CATO_ACCOUNT_ID environment variable if not specified)', required=False)
|
|
22
22
|
if_rules_parser.add_argument('--output-file-path', help='Full path including filename and extension for output file. If not specified, uses default: config_data/all_ifw_rules_and_sections_{account_id}.json')
|
|
23
|
+
if_rules_parser.add_argument('--append-timestamp', action='store_true', help='Append timestamp to the filename after account ID (format: YYYY-MM-DD_HH-MM-SS)')
|
|
23
24
|
if_rules_parser.add_argument('-v', '--verbose', action='store_true', help='Verbose output')
|
|
24
25
|
|
|
25
26
|
if_rules_parser.set_defaults(func=export_rules.export_if_rules_to_json)
|
|
@@ -33,6 +34,7 @@ def export_rules_parse(subparsers):
|
|
|
33
34
|
|
|
34
35
|
wf_rules_parser.add_argument('-accountID', help='Account ID to export rules from (uses CATO_ACCOUNT_ID environment variable if not specified)', required=False)
|
|
35
36
|
wf_rules_parser.add_argument('--output-file-path', help='Full path including filename and extension for output file. If not specified, uses default: config_data/all_wf_rules_and_sections_{account_id}.json')
|
|
37
|
+
wf_rules_parser.add_argument('--append-timestamp', action='store_true', help='Append timestamp to the filename after account ID (format: YYYY-MM-DD_HH-MM-SS)')
|
|
36
38
|
wf_rules_parser.add_argument('-v', '--verbose', action='store_true', help='Verbose output')
|
|
37
39
|
|
|
38
40
|
wf_rules_parser.set_defaults(func=export_rules.export_wf_rules_to_json)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import json
|
|
3
3
|
import sys
|
|
4
|
+
from datetime import datetime
|
|
4
5
|
from graphql_client.api.call_api import ApiClient, CallApi
|
|
5
6
|
from graphql_client.api_client import ApiException
|
|
6
7
|
from ..customLib import writeDataToFile, makeCall, getAccountID
|
|
@@ -64,10 +65,15 @@ def export_if_rules_to_json(args, configuration):
|
|
|
64
65
|
processed_data['data']['policy']['internetFirewall']['policy']['rules'] = filtered_rules
|
|
65
66
|
|
|
66
67
|
# Add index_in_section to each rule
|
|
67
|
-
#
|
|
68
|
+
# Handle empty section names by assigning a default section name
|
|
68
69
|
section_counters = {}
|
|
69
70
|
for rule_data in processed_data['data']['policy']['internetFirewall']['policy']['rules']:
|
|
70
71
|
section_name = rule_data['rule']['section']['name']
|
|
72
|
+
# If section name is empty, use "Default Section" as the section name
|
|
73
|
+
if not section_name or section_name.strip() == "":
|
|
74
|
+
section_name = "Default Section"
|
|
75
|
+
rule_data['rule']['section']['name'] = section_name
|
|
76
|
+
|
|
71
77
|
if section_name not in section_counters:
|
|
72
78
|
section_counters[section_name] = 0
|
|
73
79
|
section_counters[section_name] += 1
|
|
@@ -104,12 +110,18 @@ def export_if_rules_to_json(args, configuration):
|
|
|
104
110
|
|
|
105
111
|
# Replace the original sections array with the reformatted one
|
|
106
112
|
processed_data['data']['policy']['internetFirewall']['policy']['sections'] = processed_sections
|
|
113
|
+
|
|
114
|
+
# Handle timestamp in filename if requested
|
|
115
|
+
filename_template = "all_ifw_rules_and_sections_{account_id}.json"
|
|
116
|
+
if hasattr(args, 'append_timestamp') and args.append_timestamp:
|
|
117
|
+
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
|
118
|
+
filename_template = "all_ifw_rules_and_sections_{account_id}_" + timestamp + ".json"
|
|
107
119
|
|
|
108
120
|
output_file = writeDataToFile(
|
|
109
121
|
data=processed_data,
|
|
110
122
|
args=args,
|
|
111
123
|
account_id=account_id,
|
|
112
|
-
default_filename_template=
|
|
124
|
+
default_filename_template=filename_template,
|
|
113
125
|
default_directory="config_data"
|
|
114
126
|
)
|
|
115
127
|
|
|
@@ -157,9 +169,15 @@ def export_wf_rules_to_json(args, configuration):
|
|
|
157
169
|
processed_data['data']['policy']['wanFirewall']['policy']['rules'] = filtered_rules
|
|
158
170
|
|
|
159
171
|
# Add index_in_section to each rule
|
|
172
|
+
# Handle empty section names by assigning a default section name
|
|
160
173
|
section_counters = {}
|
|
161
174
|
for rule_data in processed_data['data']['policy']['wanFirewall']['policy']['rules']:
|
|
162
175
|
section_name = rule_data['rule']['section']['name']
|
|
176
|
+
# If section name is empty, use "Default Section" as the section name
|
|
177
|
+
if not section_name or section_name.strip() == "":
|
|
178
|
+
section_name = "Default Section"
|
|
179
|
+
rule_data['rule']['section']['name'] = section_name
|
|
180
|
+
|
|
163
181
|
if section_name not in section_counters:
|
|
164
182
|
section_counters[section_name] = 0
|
|
165
183
|
section_counters[section_name] += 1
|
|
@@ -174,8 +192,8 @@ def export_wf_rules_to_json(args, configuration):
|
|
|
174
192
|
"section_name": rule_info['section']['name'],
|
|
175
193
|
"rule_name": rule_info['name']
|
|
176
194
|
})
|
|
177
|
-
|
|
178
|
-
|
|
195
|
+
rule_info.pop("index_in_section", None)
|
|
196
|
+
rule_info.pop("index", None)
|
|
179
197
|
# rule_info["enabled"] = True
|
|
180
198
|
|
|
181
199
|
# Add rules_in_sections to the policy structure
|
|
@@ -194,12 +212,18 @@ def export_wf_rules_to_json(args, configuration):
|
|
|
194
212
|
|
|
195
213
|
# Replace the original sections array with the reformatted one
|
|
196
214
|
processed_data['data']['policy']['wanFirewall']['policy']['sections'] = processed_sections
|
|
215
|
+
|
|
216
|
+
# Handle timestamp in filename if requested
|
|
217
|
+
filename_template = "all_wf_rules_and_sections_{account_id}.json"
|
|
218
|
+
if hasattr(args, 'append_timestamp') and args.append_timestamp:
|
|
219
|
+
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
|
220
|
+
filename_template = "all_wf_rules_and_sections_{account_id}_" + timestamp + ".json"
|
|
197
221
|
|
|
198
222
|
output_file = writeDataToFile(
|
|
199
223
|
data=processed_data,
|
|
200
224
|
args=args,
|
|
201
225
|
account_id=account_id,
|
|
202
|
-
default_filename_template=
|
|
226
|
+
default_filename_template=filename_template,
|
|
203
227
|
default_directory="config_data"
|
|
204
228
|
)
|
|
205
229
|
|
|
@@ -13,6 +13,7 @@ def export_sites_parse(subparsers):
|
|
|
13
13
|
socket_sites_parser.add_argument('-accountID', help='Account ID to export data from (uses CATO_ACCOUNT_ID environment variable if not specified)', required=False)
|
|
14
14
|
socket_sites_parser.add_argument('-siteIDs', help='Comma-separated list of site IDs to export (e.g., "132606,132964,133511")', required=False)
|
|
15
15
|
socket_sites_parser.add_argument('--output-file-path', help='Full path including filename and extension for output file. If not specified, uses default: config_data/socket_site_data_{account_id}.json')
|
|
16
|
+
socket_sites_parser.add_argument('--append-timestamp', action='store_true', help='Append timestamp to the filename after account ID (format: YYYY-MM-DD_HH-MM-SS)')
|
|
16
17
|
socket_sites_parser.add_argument('-v', '--verbose', action='store_true', help='Verbose output')
|
|
17
18
|
|
|
18
19
|
socket_sites_parser.set_defaults(func=export_sites.export_socket_site_to_json)
|
|
@@ -2,6 +2,7 @@ import os
|
|
|
2
2
|
import json
|
|
3
3
|
import traceback
|
|
4
4
|
import sys
|
|
5
|
+
from datetime import datetime
|
|
5
6
|
from graphql_client.api.call_api import ApiClient, CallApi
|
|
6
7
|
from graphql_client.api_client import ApiException
|
|
7
8
|
from ..customLib import writeDataToFile, makeCall, getAccountID
|
|
@@ -200,12 +201,18 @@ def export_socket_site_to_json(args, configuration):
|
|
|
200
201
|
print(f"This is usually caused by data inconsistencies and can be safely ignored if the export completes successfully.")
|
|
201
202
|
print(f"=========================\n")
|
|
202
203
|
|
|
204
|
+
# Handle timestamp in filename if requested
|
|
205
|
+
filename_template = "socket_sites_{account_id}.json"
|
|
206
|
+
if hasattr(args, 'append_timestamp') and args.append_timestamp:
|
|
207
|
+
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
|
208
|
+
filename_template = "socket_sites_{account_id}_" + timestamp + ".json"
|
|
209
|
+
|
|
203
210
|
# Write the processed data to file using the general-purpose function
|
|
204
211
|
output_file = writeDataToFile(
|
|
205
212
|
data=processed_data,
|
|
206
213
|
args=args,
|
|
207
214
|
account_id=account_id,
|
|
208
|
-
default_filename_template=
|
|
215
|
+
default_filename_template=filename_template,
|
|
209
216
|
default_directory="config_data"
|
|
210
217
|
)
|
|
211
218
|
|
|
@@ -6,6 +6,8 @@ from graphql_client import ApiClient, CallApi
|
|
|
6
6
|
from graphql_client.api_client import ApiException
|
|
7
7
|
import logging
|
|
8
8
|
import pprint
|
|
9
|
+
import uuid
|
|
10
|
+
from urllib3.filepost import encode_multipart_formdata
|
|
9
11
|
|
|
10
12
|
def createRequest(args, configuration):
|
|
11
13
|
params = vars(args)
|
|
@@ -134,6 +136,11 @@ def createRawRequest(args, configuration):
|
|
|
134
136
|
# Handle endpoint override
|
|
135
137
|
if hasattr(args, 'endpoint') and args.endpoint:
|
|
136
138
|
configuration.host = args.endpoint
|
|
139
|
+
|
|
140
|
+
# Check if binary/multipart mode is enabled
|
|
141
|
+
if hasattr(args, 'binary') and args.binary:
|
|
142
|
+
return createRawBinaryRequest(args, configuration)
|
|
143
|
+
|
|
137
144
|
instance = CallApi(ApiClient(configuration))
|
|
138
145
|
isOk = False
|
|
139
146
|
try:
|
|
@@ -334,4 +341,159 @@ def renderArgsAndFields(responseArgStr, variablesObj, curOperation, definition,
|
|
|
334
341
|
responseArgStr += indent + " }\n"
|
|
335
342
|
responseArgStr += indent + "}\n"
|
|
336
343
|
responseArgStr += "\n"
|
|
337
|
-
|
|
344
|
+
return responseArgStr
|
|
345
|
+
|
|
346
|
+
def createRawBinaryRequest(args, configuration):
|
|
347
|
+
"""Handle multipart/form-data requests for file uploads and binary content"""
|
|
348
|
+
params = vars(args)
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
# Parse the JSON body
|
|
352
|
+
try:
|
|
353
|
+
body = json.loads(params["json"])
|
|
354
|
+
except ValueError as e:
|
|
355
|
+
print("ERROR: JSON argument must be valid json. ", e)
|
|
356
|
+
return
|
|
357
|
+
except Exception as e:
|
|
358
|
+
print("ERROR: ", e)
|
|
359
|
+
return
|
|
360
|
+
|
|
361
|
+
# Build form data
|
|
362
|
+
form_fields = {}
|
|
363
|
+
files = []
|
|
364
|
+
|
|
365
|
+
# Add the operations field containing the GraphQL payload
|
|
366
|
+
form_fields['operations'] = json.dumps(body)
|
|
367
|
+
|
|
368
|
+
# Handle file mappings if files are specified
|
|
369
|
+
if hasattr(args, 'files') and args.files:
|
|
370
|
+
# Build the map object for file uploads
|
|
371
|
+
file_map = {}
|
|
372
|
+
for i, (field_name, file_path) in enumerate(args.files):
|
|
373
|
+
file_index = str(i + 1)
|
|
374
|
+
file_map[file_index] = [field_name]
|
|
375
|
+
|
|
376
|
+
# Read file content
|
|
377
|
+
try:
|
|
378
|
+
with open(file_path, 'rb') as f:
|
|
379
|
+
file_content = f.read()
|
|
380
|
+
files.append((file_index, (os.path.basename(file_path), file_content, 'application/octet-stream')))
|
|
381
|
+
except IOError as e:
|
|
382
|
+
print(f"ERROR: Could not read file {file_path}: {e}")
|
|
383
|
+
return
|
|
384
|
+
|
|
385
|
+
# Add the map field
|
|
386
|
+
form_fields['map'] = json.dumps(file_map)
|
|
387
|
+
|
|
388
|
+
# Test mode - just print the request structure
|
|
389
|
+
if params.get("t") == True:
|
|
390
|
+
print("Multipart form data request:")
|
|
391
|
+
if params.get("p") == True:
|
|
392
|
+
print(f"Operations: {json.dumps(json.loads(form_fields.get('operations')), indent=2)}")
|
|
393
|
+
else:
|
|
394
|
+
print(f"Operations: {form_fields.get('operations')}")
|
|
395
|
+
if 'map' in form_fields:
|
|
396
|
+
print(f"Map: {form_fields.get('map')}")
|
|
397
|
+
if files:
|
|
398
|
+
print(f"Files: {[f[0] + ': ' + f[1][0] for f in files]}")
|
|
399
|
+
return None
|
|
400
|
+
|
|
401
|
+
# Perform the multipart request
|
|
402
|
+
try:
|
|
403
|
+
return sendMultipartRequest(configuration, form_fields, files, params)
|
|
404
|
+
except Exception as e:
|
|
405
|
+
# Safely handle exception string conversion
|
|
406
|
+
try:
|
|
407
|
+
error_str = str(e)
|
|
408
|
+
except Exception:
|
|
409
|
+
error_str = f"Exception of type {type(e).__name__}"
|
|
410
|
+
|
|
411
|
+
if params.get("v") == True:
|
|
412
|
+
import traceback
|
|
413
|
+
print(f"ERROR: Failed to send multipart request: {error_str}")
|
|
414
|
+
traceback.print_exc()
|
|
415
|
+
else:
|
|
416
|
+
print(f"ERROR: Failed to send multipart request: {error_str}")
|
|
417
|
+
return None
|
|
418
|
+
|
|
419
|
+
def sendMultipartRequest(configuration, form_fields, files, params):
|
|
420
|
+
"""Send a multipart/form-data request directly using urllib3"""
|
|
421
|
+
import urllib3
|
|
422
|
+
|
|
423
|
+
# Create pool manager
|
|
424
|
+
pool_manager = urllib3.PoolManager(
|
|
425
|
+
cert_reqs='CERT_NONE' if not getattr(configuration, 'verify_ssl', False) else 'CERT_REQUIRED'
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
# Prepare form data
|
|
429
|
+
fields = []
|
|
430
|
+
for key, value in form_fields.items():
|
|
431
|
+
fields.append((key, value))
|
|
432
|
+
|
|
433
|
+
for file_key, (filename, content, content_type) in files:
|
|
434
|
+
fields.append((file_key, (filename, content, content_type)))
|
|
435
|
+
|
|
436
|
+
# Encode multipart data
|
|
437
|
+
body_data, content_type = encode_multipart_formdata(fields)
|
|
438
|
+
|
|
439
|
+
# Prepare headers
|
|
440
|
+
headers = {
|
|
441
|
+
'Content-Type': content_type,
|
|
442
|
+
'User-Agent': f"Cato-CLI-v{getattr(configuration, 'version', 'unknown')}"
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
# Add API key if not using headers file
|
|
446
|
+
if hasattr(configuration, 'api_key') and hasattr(configuration, 'api_key') and configuration.api_key and 'x-api-key' in configuration.api_key:
|
|
447
|
+
headers['x-api-key'] = configuration.api_key['x-api-key']
|
|
448
|
+
|
|
449
|
+
# Add custom headers
|
|
450
|
+
if hasattr(configuration, 'custom_headers') and configuration.custom_headers:
|
|
451
|
+
headers.update(configuration.custom_headers)
|
|
452
|
+
|
|
453
|
+
# Verbose output
|
|
454
|
+
if params.get("v") == True:
|
|
455
|
+
print(f"Host: {getattr(configuration, 'host', 'unknown')}")
|
|
456
|
+
masked_headers = headers.copy()
|
|
457
|
+
if 'x-api-key' in masked_headers:
|
|
458
|
+
masked_headers['x-api-key'] = '***MASKED***'
|
|
459
|
+
print(f"Request Headers: {json.dumps(masked_headers, indent=4, sort_keys=True)}")
|
|
460
|
+
print(f"Content-Type: {content_type}")
|
|
461
|
+
print(f"Form fields: {list(form_fields.keys())}")
|
|
462
|
+
print(f"Files: {[f[0] for f in files]}\n")
|
|
463
|
+
|
|
464
|
+
try:
|
|
465
|
+
# Make the request
|
|
466
|
+
resp = pool_manager.request(
|
|
467
|
+
'POST',
|
|
468
|
+
getattr(configuration, 'host', 'https://api.catonetworks.com/api/v1/graphql'),
|
|
469
|
+
body=body_data,
|
|
470
|
+
headers=headers
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
# Parse response
|
|
474
|
+
if resp.status < 200 or resp.status >= 300:
|
|
475
|
+
reason = resp.reason if resp.reason is not None else "Unknown Error"
|
|
476
|
+
error_msg = f"HTTP {resp.status}: {reason}"
|
|
477
|
+
if resp.data:
|
|
478
|
+
try:
|
|
479
|
+
error_msg += f"\n{resp.data.decode('utf-8')}"
|
|
480
|
+
except Exception:
|
|
481
|
+
error_msg += f"\n{resp.data}"
|
|
482
|
+
print(f"ERROR: {error_msg}")
|
|
483
|
+
return None
|
|
484
|
+
|
|
485
|
+
try:
|
|
486
|
+
response_data = json.loads(resp.data.decode('utf-8'))
|
|
487
|
+
except json.JSONDecodeError:
|
|
488
|
+
response_data = resp.data.decode('utf-8')
|
|
489
|
+
|
|
490
|
+
return [response_data]
|
|
491
|
+
|
|
492
|
+
except Exception as e:
|
|
493
|
+
# Safely handle exception string conversion
|
|
494
|
+
try:
|
|
495
|
+
error_str = str(e)
|
|
496
|
+
except Exception:
|
|
497
|
+
error_str = f"Exception of type {type(e).__name__}"
|
|
498
|
+
print(f"ERROR: Network/request error: {error_str}")
|
|
499
|
+
return None
|
catocli/parsers/raw/README.md
CHANGED
|
@@ -17,3 +17,17 @@
|
|
|
17
17
|
#### Override API endpoint
|
|
18
18
|
|
|
19
19
|
`catocli raw --endpoint https://custom-api.example.com/graphql '<json>'`
|
|
20
|
+
|
|
21
|
+
#### Binary content and file uploads
|
|
22
|
+
|
|
23
|
+
Use `--binary` flag for multipart/form-data requests with file uploads:
|
|
24
|
+
|
|
25
|
+
`catocli raw --binary --file privateKey /path/to/file.pem '{ "operationName": "accountUpdate", "variables": { "update": { "cloudAccessConfiguration": { "cloudApplications": { "items": [{ "privateKey": null }] } } } }, "query": "mutation accountUpdate($update: AccountInput!) { accountUpdate(update: $update) { id } }" }'`
|
|
26
|
+
|
|
27
|
+
`catocli raw --binary --file 1 /path/to/file.pem '{ "operationName": "accountUpdate", "variables": { "update": { "version": "1234" } }, "query": "mutation { accountUpdate { id } }" }'`
|
|
28
|
+
|
|
29
|
+
The `--binary` flag enables multipart/form-data mode which is required for file uploads. Files are specified using `--file field_name file_path` where:
|
|
30
|
+
- `field_name` is the GraphQL variable path where the file should be mapped
|
|
31
|
+
- `file_path` is the local path to the file to upload
|
|
32
|
+
|
|
33
|
+
Multiple files can be uploaded by using multiple `--file` arguments.
|
catocli/parsers/raw/__init__.py
CHANGED
|
@@ -9,4 +9,6 @@ def raw_parse(raw_parser):
|
|
|
9
9
|
raw_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
10
10
|
raw_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
11
11
|
raw_parser.add_argument('--endpoint', dest='endpoint', help='Override the API endpoint URL (e.g., https://api.catonetworks.com/api/v1/graphql2)')
|
|
12
|
+
raw_parser.add_argument('--binary', action='store_true', help='Send multipart/form-data request for file uploads and binary content')
|
|
13
|
+
raw_parser.add_argument('--file', action='append', nargs=2, metavar=('FIELD', 'PATH'), dest='files', help='Add file for multipart upload. Format: --file field_name file_path')
|
|
12
14
|
raw_parser.set_defaults(func=createRawRequest,operation_name='raw')
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
catocli/__init__.py,sha256
|
|
1
|
+
catocli/__init__.py,sha256=ajGxorfEwiU3tSC5f62zkinuEGSJny5SM4XGqKHMzpA,85
|
|
2
2
|
catocli/__main__.py,sha256=6Z0ns_k_kUcz1Qtrn1u7UyUnqB-3e85jM_nppOwFsv4,217
|
|
3
3
|
catocli/Utils/clidriver.py,sha256=736sqgZf7hszFTWJ0BGTaoPILziFdd_eAOp0Uz9ArXc,12655
|
|
4
4
|
catocli/Utils/profile_manager.py,sha256=Stch-cU2rLA7r07hETIRsvG_JxpQx3Q42QwpfD7Qd2I,6379
|
|
5
5
|
catocli/Utils/version_checker.py,sha256=rakF8LIeB1D_bbsT1cX6q4IaxYpGw4Yeq35BWa7QbEA,6698
|
|
6
|
-
catocli/parsers/parserApiClient.py,sha256=
|
|
6
|
+
catocli/parsers/parserApiClient.py,sha256=Ux-tpkMNQ_pL-RNHAOhI-YGsscqm7w92yynQf6AOCsU,19444
|
|
7
7
|
catocli/parsers/configure/__init__.py,sha256=Kq4OYGq_MXOQBHm8vxNkzJqCXp7zremYBfQ4Ai3_Lb4,3286
|
|
8
8
|
catocli/parsers/configure/configure.py,sha256=GyaOeuf0ZK3-wsZaczmO1OsKVJiPK04h6iI1u-EaKQc,12217
|
|
9
9
|
catocli/parsers/custom/README.md,sha256=UvCWAtF3Yh0UsvADb0ve1qJupgYHeyGu6V3Z0O5HEvo,8180
|
|
10
10
|
catocli/parsers/custom/__init__.py,sha256=HUI8WSjPs_GAN3ZtOQMtzK68-018zoe8qACt0yeVwp8,2889
|
|
11
11
|
catocli/parsers/custom/customLib.py,sha256=sR1aECqyrLjq-1YykUtY8PtzqM_E5LjrVpVtOuWx-Qk,24092
|
|
12
|
-
catocli/parsers/custom/export_rules/__init__.py,sha256=
|
|
13
|
-
catocli/parsers/custom/export_rules/export_rules.py,sha256=
|
|
14
|
-
catocli/parsers/custom/export_sites/__init__.py,sha256=
|
|
15
|
-
catocli/parsers/custom/export_sites/export_sites.py,sha256=
|
|
12
|
+
catocli/parsers/custom/export_rules/__init__.py,sha256=Cci1LwMN9VzwPuHOXqUDFORujDI96dJuN-YSccGlQZU,2564
|
|
13
|
+
catocli/parsers/custom/export_rules/export_rules.py,sha256=gXig4NC29yC5nW48ri-j0FEnaTz_kxKiuLF5y-5fZ_4,15646
|
|
14
|
+
catocli/parsers/custom/export_sites/__init__.py,sha256=WnTRNA4z4IS0rKR9r_UfuGv3bxp8nlt4YNH1Sed4toU,1378
|
|
15
|
+
catocli/parsers/custom/export_sites/export_sites.py,sha256=gjkXsx2LRYBvXGXm42Nib0Wz8tS_UNAe2Fp1Jno1vfQ,23521
|
|
16
16
|
catocli/parsers/custom/import_rules_to_tf/__init__.py,sha256=jFCFceFv8zDW7nGLZOXkFE6NXAMPYRwKQwTbhSawYdM,3908
|
|
17
17
|
catocli/parsers/custom/import_rules_to_tf/import_rules_to_tf.py,sha256=kHzd3Iw9H6UeuSB-HE6vp3ZY38kGJk_ATgnDI2kus7k,18135
|
|
18
18
|
catocli/parsers/custom/import_sites_to_tf/__init__.py,sha256=xK4CMO0QhZJnOGPreagFL46ORl8113jpnM4UgwyNMc0,2739
|
|
@@ -264,8 +264,8 @@ catocli/parsers/query_xdr/README.md,sha256=bmaw_sVCQgN-3hiyLtbB4xlsXKxHfy-vbnt1q
|
|
|
264
264
|
catocli/parsers/query_xdr/__init__.py,sha256=ro911nrCCXHUL8K5LYjN7BD3XbWdRQuIRseg59OVAQk,2662
|
|
265
265
|
catocli/parsers/query_xdr_stories/README.md,sha256=kbnrCmTq7o0T1LMgN0w8lAoiwB3NZiod7jvcONGNSLs,2432
|
|
266
266
|
catocli/parsers/query_xdr_story/README.md,sha256=Csl2tE511miGOrISgIJyJXVEz2v1ONrMdvYywMeKv1Q,930
|
|
267
|
-
catocli/parsers/raw/README.md,sha256=
|
|
268
|
-
catocli/parsers/raw/__init__.py,sha256=
|
|
267
|
+
catocli/parsers/raw/README.md,sha256=nBI2tdiieuP45iPDKaiNdH3XdZwiuUJJAlplY8Qs2sg,1712
|
|
268
|
+
catocli/parsers/raw/__init__.py,sha256=tcVsBs7LowyNzBoAlWa-IWu287xOH3N58Ge5qhBxwAc,1389
|
|
269
269
|
graphql_client/__init__.py,sha256=2nxD4YsWoOnALXi5cXbmtIN_i0NL_eyDTQRTxs52mkI,315
|
|
270
270
|
graphql_client/api_client.py,sha256=2Rc1Zo1xH9Jnk1AO68kLSofTShkZwSVF-WkVtczfIc4,5786
|
|
271
271
|
graphql_client/api_client_types.py,sha256=dM3zl6FA5SSp6nR6KmLfTL1BKaXX9uPMCZAm4v_FiUs,11569
|
|
@@ -514,9 +514,9 @@ vendor/urllib3/util/timeout.py,sha256=4eT1FVeZZU7h7mYD1Jq2OXNe4fxekdNvhoWUkZusRp
|
|
|
514
514
|
vendor/urllib3/util/url.py,sha256=wHORhp80RAXyTlAIkTqLFzSrkU7J34ZDxX-tN65MBZk,15213
|
|
515
515
|
vendor/urllib3/util/util.py,sha256=j3lbZK1jPyiwD34T8IgJzdWEZVT-4E-0vYIJi9UjeNA,1146
|
|
516
516
|
vendor/urllib3/util/wait.py,sha256=_ph8IrUR3sqPqi0OopQgJUlH4wzkGeM5CiyA7XGGtmI,4423
|
|
517
|
-
catocli-2.0.
|
|
518
|
-
catocli-2.0.
|
|
519
|
-
catocli-2.0.
|
|
520
|
-
catocli-2.0.
|
|
521
|
-
catocli-2.0.
|
|
522
|
-
catocli-2.0.
|
|
517
|
+
catocli-2.0.4.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
518
|
+
catocli-2.0.4.dist-info/METADATA,sha256=l7Cws67VB5uIhEAHiG4vCIZCCfq_RUw8sNIEr7zwmz4,1264
|
|
519
|
+
catocli-2.0.4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
520
|
+
catocli-2.0.4.dist-info/entry_points.txt,sha256=p4k9Orre6aWcqVrNmBbckmCs39h-1naMxRo2AjWmWZ4,50
|
|
521
|
+
catocli-2.0.4.dist-info/top_level.txt,sha256=uiIWEVkizgM3Fo8b4cWwGhXaLi-mGzETdeLd4-yNOdE,66
|
|
522
|
+
catocli-2.0.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|