catocli 2.0.4__py3-none-any.whl → 2.0.5__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.
- build/lib/catocli/Utils/clidriver.py +268 -0
- build/lib/catocli/Utils/profile_manager.py +188 -0
- build/lib/catocli/Utils/version_checker.py +192 -0
- build/lib/catocli/__init__.py +2 -0
- build/lib/catocli/__main__.py +12 -0
- build/lib/catocli/parsers/configure/__init__.py +115 -0
- build/lib/catocli/parsers/configure/configure.py +307 -0
- build/lib/catocli/parsers/custom/__init__.py +57 -0
- build/lib/catocli/parsers/custom/customLib.py +561 -0
- build/lib/catocli/parsers/custom/export_rules/__init__.py +42 -0
- build/lib/catocli/parsers/custom/export_rules/export_rules.py +234 -0
- build/lib/catocli/parsers/custom/export_sites/__init__.py +21 -0
- build/lib/catocli/parsers/custom/export_sites/export_sites.py +372 -0
- build/lib/catocli/parsers/custom/import_rules_to_tf/__init__.py +58 -0
- build/lib/catocli/parsers/custom/import_rules_to_tf/import_rules_to_tf.py +451 -0
- build/lib/catocli/parsers/custom/import_sites_to_tf/__init__.py +45 -0
- build/lib/catocli/parsers/custom/import_sites_to_tf/import_sites_to_tf.py +891 -0
- build/lib/catocli/parsers/mutation_accountManagement/__init__.py +48 -0
- build/lib/catocli/parsers/mutation_admin/__init__.py +48 -0
- build/lib/catocli/parsers/mutation_container/__init__.py +138 -0
- build/lib/catocli/parsers/mutation_hardware/__init__.py +22 -0
- build/lib/catocli/parsers/mutation_policy/__init__.py +1305 -0
- build/lib/catocli/parsers/mutation_sandbox/__init__.py +35 -0
- build/lib/catocli/parsers/mutation_site/__init__.py +373 -0
- build/lib/catocli/parsers/mutation_sites/__init__.py +373 -0
- build/lib/catocli/parsers/mutation_xdr/__init__.py +48 -0
- build/lib/catocli/parsers/parserApiClient.py +513 -0
- build/lib/catocli/parsers/query_accountBySubdomain/__init__.py +16 -0
- build/lib/catocli/parsers/query_accountManagement/__init__.py +16 -0
- build/lib/catocli/parsers/query_accountMetrics/__init__.py +16 -0
- build/lib/catocli/parsers/query_accountRoles/__init__.py +16 -0
- build/lib/catocli/parsers/query_accountSnapshot/__init__.py +16 -0
- build/lib/catocli/parsers/query_admin/__init__.py +16 -0
- build/lib/catocli/parsers/query_admins/__init__.py +16 -0
- build/lib/catocli/parsers/query_appStats/__init__.py +16 -0
- build/lib/catocli/parsers/query_appStatsTimeSeries/__init__.py +16 -0
- build/lib/catocli/parsers/query_auditFeed/__init__.py +16 -0
- build/lib/catocli/parsers/query_catalogs/__init__.py +16 -0
- build/lib/catocli/parsers/query_container/__init__.py +16 -0
- build/lib/catocli/parsers/query_devices/__init__.py +16 -0
- build/lib/catocli/parsers/query_entityLookup/__init__.py +16 -0
- build/lib/catocli/parsers/query_events/__init__.py +16 -0
- build/lib/catocli/parsers/query_eventsFeed/__init__.py +16 -0
- build/lib/catocli/parsers/query_eventsTimeSeries/__init__.py +16 -0
- build/lib/catocli/parsers/query_hardware/__init__.py +16 -0
- build/lib/catocli/parsers/query_hardwareManagement/__init__.py +16 -0
- build/lib/catocli/parsers/query_licensing/__init__.py +16 -0
- build/lib/catocli/parsers/query_policy/__init__.py +161 -0
- build/lib/catocli/parsers/query_sandbox/__init__.py +16 -0
- build/lib/catocli/parsers/query_site/__init__.py +100 -0
- build/lib/catocli/parsers/query_siteLocation/__init__.py +13 -0
- build/lib/catocli/parsers/query_subDomains/__init__.py +16 -0
- build/lib/catocli/parsers/query_xdr/__init__.py +35 -0
- build/lib/catocli/parsers/raw/__init__.py +12 -0
- build/lib/graphql_client/__init__.py +11 -0
- build/lib/graphql_client/api/__init__.py +3 -0
- build/lib/graphql_client/api/call_api.py +84 -0
- build/lib/graphql_client/api_client.py +192 -0
- build/lib/graphql_client/api_client_types.py +409 -0
- build/lib/graphql_client/configuration.py +232 -0
- build/lib/graphql_client/models/__init__.py +13 -0
- build/lib/graphql_client/models/no_schema.py +71 -0
- build/lib/schema/catolib.py +1141 -0
- build/lib/schema/importSchema.py +60 -0
- build/lib/schema/remove_policyid.py +89 -0
- build/lib/schema/remove_policyid_mutations.py +89 -0
- build/lib/scripts/catolib.py +62 -0
- build/lib/scripts/export_if_rules_to_json.py +188 -0
- build/lib/scripts/export_wf_rules_to_json.py +111 -0
- build/lib/scripts/import_wf_rules_to_tfstate.py +331 -0
- build/lib/vendor/certifi/__init__.py +4 -0
- build/lib/vendor/certifi/__main__.py +12 -0
- build/lib/vendor/certifi/core.py +114 -0
- build/lib/vendor/certifi/py.typed +0 -0
- build/lib/vendor/six.py +998 -0
- build/lib/vendor/urllib3/__init__.py +211 -0
- build/lib/vendor/urllib3/_base_connection.py +172 -0
- build/lib/vendor/urllib3/_collections.py +483 -0
- build/lib/vendor/urllib3/_request_methods.py +278 -0
- build/lib/vendor/urllib3/_version.py +16 -0
- build/lib/vendor/urllib3/connection.py +1033 -0
- build/lib/vendor/urllib3/connectionpool.py +1182 -0
- build/lib/vendor/urllib3/contrib/__init__.py +0 -0
- build/lib/vendor/urllib3/contrib/emscripten/__init__.py +18 -0
- build/lib/vendor/urllib3/contrib/emscripten/connection.py +254 -0
- build/lib/vendor/urllib3/contrib/emscripten/fetch.py +418 -0
- build/lib/vendor/urllib3/contrib/emscripten/request.py +22 -0
- build/lib/vendor/urllib3/contrib/emscripten/response.py +285 -0
- build/lib/vendor/urllib3/contrib/pyopenssl.py +552 -0
- build/lib/vendor/urllib3/contrib/socks.py +228 -0
- build/lib/vendor/urllib3/exceptions.py +321 -0
- build/lib/vendor/urllib3/fields.py +341 -0
- build/lib/vendor/urllib3/filepost.py +89 -0
- build/lib/vendor/urllib3/http2/__init__.py +53 -0
- build/lib/vendor/urllib3/http2/connection.py +356 -0
- build/lib/vendor/urllib3/http2/probe.py +87 -0
- build/lib/vendor/urllib3/poolmanager.py +637 -0
- build/lib/vendor/urllib3/py.typed +2 -0
- build/lib/vendor/urllib3/response.py +1265 -0
- build/lib/vendor/urllib3/util/__init__.py +42 -0
- build/lib/vendor/urllib3/util/connection.py +137 -0
- build/lib/vendor/urllib3/util/proxy.py +43 -0
- build/lib/vendor/urllib3/util/request.py +256 -0
- build/lib/vendor/urllib3/util/response.py +101 -0
- build/lib/vendor/urllib3/util/retry.py +533 -0
- build/lib/vendor/urllib3/util/ssl_.py +513 -0
- build/lib/vendor/urllib3/util/ssl_match_hostname.py +159 -0
- build/lib/vendor/urllib3/util/ssltransport.py +276 -0
- build/lib/vendor/urllib3/util/timeout.py +275 -0
- build/lib/vendor/urllib3/util/url.py +471 -0
- build/lib/vendor/urllib3/util/util.py +42 -0
- build/lib/vendor/urllib3/util/wait.py +124 -0
- catocli/Utils/clidriver.py +1 -4
- catocli/__init__.py +1 -1
- catocli/parsers/custom/export_sites/export_sites.py +2 -2
- catocli/parsers/mutation_container/__init__.py +116 -0
- catocli/parsers/mutation_container_fqdn/README.md +7 -0
- catocli/parsers/mutation_container_fqdn_addValues/README.md +17 -0
- catocli/parsers/mutation_container_fqdn_createFromFile/README.md +17 -0
- catocli/parsers/mutation_container_fqdn_removeValues/README.md +17 -0
- catocli/parsers/mutation_container_fqdn_updateFromFile/README.md +17 -0
- catocli/parsers/mutation_container_ipAddressRange/README.md +7 -0
- catocli/parsers/mutation_container_ipAddressRange_addValues/README.md +17 -0
- catocli/parsers/mutation_container_ipAddressRange_createFromFile/README.md +17 -0
- catocli/parsers/mutation_container_ipAddressRange_removeValues/README.md +17 -0
- catocli/parsers/mutation_container_ipAddressRange_updateFromFile/README.md +17 -0
- catocli/parsers/mutation_policy_internetFirewall_addRule/README.md +1 -1
- catocli/parsers/mutation_policy_internetFirewall_updateRule/README.md +1 -1
- catocli/parsers/mutation_policy_wanFirewall_addRule/README.md +1 -1
- catocli/parsers/mutation_policy_wanFirewall_updateRule/README.md +1 -1
- catocli/parsers/parserApiClient.py +25 -11
- catocli/parsers/query_policy/README.md +0 -17
- catocli/parsers/query_policy/__init__.py +153 -8
- catocli/parsers/query_policy_appTenantRestriction/README.md +7 -0
- catocli/parsers/query_policy_appTenantRestriction_policy/README.md +17 -0
- catocli/parsers/query_policy_dynamicIpAllocation/README.md +7 -0
- catocli/parsers/query_policy_dynamicIpAllocation_policy/README.md +17 -0
- catocli/parsers/query_policy_internetFirewall/README.md +7 -0
- catocli/parsers/query_policy_internetFirewall_policy/README.md +17 -0
- catocli/parsers/query_policy_remotePortFwd/README.md +7 -0
- catocli/parsers/query_policy_remotePortFwd_policy/README.md +17 -0
- catocli/parsers/query_policy_socketLan/README.md +7 -0
- catocli/parsers/query_policy_socketLan_policy/README.md +17 -0
- catocli/parsers/query_policy_terminalServer/README.md +7 -0
- catocli/parsers/query_policy_terminalServer_policy/README.md +17 -0
- catocli/parsers/query_policy_wanFirewall/README.md +7 -0
- catocli/parsers/query_policy_wanFirewall_policy/README.md +17 -0
- catocli/parsers/query_policy_wanNetwork/README.md +7 -0
- catocli/parsers/query_policy_wanNetwork_policy/README.md +17 -0
- catocli/parsers/query_site/README.md +0 -16
- catocli/parsers/query_site/__init__.py +92 -8
- catocli/parsers/query_site_availableVersionList/README.md +17 -0
- catocli/parsers/query_site_bgpPeer/README.md +17 -0
- catocli/parsers/query_site_bgpPeerList/README.md +17 -0
- catocli/parsers/query_site_cloudInterconnectConnectionConnectivity/README.md +17 -0
- catocli/parsers/query_site_cloudInterconnectPhysicalConnection/README.md +17 -0
- catocli/parsers/query_site_cloudInterconnectPhysicalConnectionId/README.md +17 -0
- catocli/parsers/query_site_siteBgpStatus/README.md +17 -0
- catocli/parsers/raw/README.md +0 -14
- catocli/parsers/raw/__init__.py +0 -2
- {catocli-2.0.4.dist-info → catocli-2.0.5.dist-info}/METADATA +1 -1
- {catocli-2.0.4.dist-info → catocli-2.0.5.dist-info}/RECORD +290 -120
- {catocli-2.0.4.dist-info → catocli-2.0.5.dist-info}/top_level.txt +1 -0
- graphql_client/api/call_api.py +4 -3
- models/mutation.container.fqdn.addValues.json +866 -0
- models/mutation.container.fqdn.createFromFile.json +819 -0
- models/mutation.container.fqdn.removeValues.json +866 -0
- models/mutation.container.fqdn.updateFromFile.json +1045 -0
- models/mutation.container.ipAddressRange.addValues.json +1020 -0
- models/mutation.container.ipAddressRange.createFromFile.json +819 -0
- models/mutation.container.ipAddressRange.removeValues.json +1020 -0
- models/mutation.container.ipAddressRange.updateFromFile.json +1045 -0
- models/mutation.policy.appTenantRestriction.addRule.json +8 -8
- models/mutation.policy.appTenantRestriction.addSection.json +1 -1
- models/mutation.policy.appTenantRestriction.createPolicyRevision.json +2 -2
- models/mutation.policy.appTenantRestriction.discardPolicyRevision.json +2 -2
- models/mutation.policy.appTenantRestriction.moveRule.json +2 -2
- models/mutation.policy.appTenantRestriction.moveSection.json +1 -1
- models/mutation.policy.appTenantRestriction.publishPolicyRevision.json +2 -2
- models/mutation.policy.appTenantRestriction.removeRule.json +2 -2
- models/mutation.policy.appTenantRestriction.removeSection.json +1 -1
- models/mutation.policy.appTenantRestriction.updatePolicy.json +2 -2
- models/mutation.policy.appTenantRestriction.updateRule.json +8 -8
- models/mutation.policy.appTenantRestriction.updateSection.json +1 -1
- models/mutation.policy.dynamicIpAllocation.addRule.json +1 -1
- models/mutation.policy.dynamicIpAllocation.addSection.json +1 -1
- models/mutation.policy.dynamicIpAllocation.createPolicyRevision.json +1 -1
- models/mutation.policy.dynamicIpAllocation.discardPolicyRevision.json +1 -1
- models/mutation.policy.dynamicIpAllocation.moveRule.json +1 -1
- models/mutation.policy.dynamicIpAllocation.moveSection.json +1 -1
- models/mutation.policy.dynamicIpAllocation.publishPolicyRevision.json +1 -1
- models/mutation.policy.dynamicIpAllocation.removeRule.json +1 -1
- models/mutation.policy.dynamicIpAllocation.removeSection.json +1 -1
- models/mutation.policy.dynamicIpAllocation.updatePolicy.json +1 -1
- models/mutation.policy.dynamicIpAllocation.updateRule.json +1 -1
- models/mutation.policy.dynamicIpAllocation.updateSection.json +1 -1
- models/mutation.policy.internetFirewall.addRule.json +502 -55
- models/mutation.policy.internetFirewall.addSection.json +1 -1
- models/mutation.policy.internetFirewall.createPolicyRevision.json +127 -10
- models/mutation.policy.internetFirewall.discardPolicyRevision.json +127 -10
- models/mutation.policy.internetFirewall.moveRule.json +127 -10
- models/mutation.policy.internetFirewall.moveSection.json +1 -1
- models/mutation.policy.internetFirewall.publishPolicyRevision.json +127 -10
- models/mutation.policy.internetFirewall.removeRule.json +127 -10
- models/mutation.policy.internetFirewall.removeSection.json +1 -1
- models/mutation.policy.internetFirewall.updatePolicy.json +127 -10
- models/mutation.policy.internetFirewall.updateRule.json +493 -55
- models/mutation.policy.internetFirewall.updateSection.json +1 -1
- models/mutation.policy.remotePortFwd.addRule.json +5 -5
- models/mutation.policy.remotePortFwd.addSection.json +1 -1
- models/mutation.policy.remotePortFwd.createPolicyRevision.json +2 -2
- models/mutation.policy.remotePortFwd.discardPolicyRevision.json +2 -2
- models/mutation.policy.remotePortFwd.moveRule.json +2 -2
- models/mutation.policy.remotePortFwd.moveSection.json +1 -1
- models/mutation.policy.remotePortFwd.publishPolicyRevision.json +2 -2
- models/mutation.policy.remotePortFwd.removeRule.json +2 -2
- models/mutation.policy.remotePortFwd.removeSection.json +1 -1
- models/mutation.policy.remotePortFwd.updatePolicy.json +2 -2
- models/mutation.policy.remotePortFwd.updateRule.json +5 -5
- models/mutation.policy.remotePortFwd.updateSection.json +1 -1
- models/mutation.policy.socketLan.addRule.json +16 -16
- models/mutation.policy.socketLan.addSection.json +1 -1
- models/mutation.policy.socketLan.createPolicyRevision.json +4 -4
- models/mutation.policy.socketLan.discardPolicyRevision.json +4 -4
- models/mutation.policy.socketLan.moveRule.json +4 -4
- models/mutation.policy.socketLan.moveSection.json +1 -1
- models/mutation.policy.socketLan.publishPolicyRevision.json +4 -4
- models/mutation.policy.socketLan.removeRule.json +4 -4
- models/mutation.policy.socketLan.removeSection.json +1 -1
- models/mutation.policy.socketLan.updatePolicy.json +4 -4
- models/mutation.policy.socketLan.updateRule.json +16 -16
- models/mutation.policy.socketLan.updateSection.json +1 -1
- models/mutation.policy.terminalServer.addRule.json +1 -1
- models/mutation.policy.terminalServer.addSection.json +1 -1
- models/mutation.policy.terminalServer.createPolicyRevision.json +1 -1
- models/mutation.policy.terminalServer.discardPolicyRevision.json +1 -1
- models/mutation.policy.terminalServer.moveRule.json +1 -1
- models/mutation.policy.terminalServer.moveSection.json +1 -1
- models/mutation.policy.terminalServer.publishPolicyRevision.json +1 -1
- models/mutation.policy.terminalServer.removeRule.json +1 -1
- models/mutation.policy.terminalServer.removeSection.json +1 -1
- models/mutation.policy.terminalServer.updatePolicy.json +1 -1
- models/mutation.policy.terminalServer.updateRule.json +1 -1
- models/mutation.policy.terminalServer.updateSection.json +1 -1
- models/mutation.policy.wanFirewall.addRule.json +500 -53
- models/mutation.policy.wanFirewall.addSection.json +1 -1
- models/mutation.policy.wanFirewall.createPolicyRevision.json +128 -11
- models/mutation.policy.wanFirewall.discardPolicyRevision.json +128 -11
- models/mutation.policy.wanFirewall.moveRule.json +128 -11
- models/mutation.policy.wanFirewall.moveSection.json +1 -1
- models/mutation.policy.wanFirewall.publishPolicyRevision.json +128 -11
- models/mutation.policy.wanFirewall.removeRule.json +128 -11
- models/mutation.policy.wanFirewall.removeSection.json +1 -1
- models/mutation.policy.wanFirewall.updatePolicy.json +128 -11
- models/mutation.policy.wanFirewall.updateRule.json +491 -53
- models/mutation.policy.wanFirewall.updateSection.json +1 -1
- models/mutation.policy.wanNetwork.addRule.json +13 -13
- models/mutation.policy.wanNetwork.addSection.json +1 -1
- models/mutation.policy.wanNetwork.createPolicyRevision.json +1 -1
- models/mutation.policy.wanNetwork.discardPolicyRevision.json +1 -1
- models/mutation.policy.wanNetwork.moveRule.json +1 -1
- models/mutation.policy.wanNetwork.moveSection.json +1 -1
- models/mutation.policy.wanNetwork.publishPolicyRevision.json +1 -1
- models/mutation.policy.wanNetwork.removeRule.json +1 -1
- models/mutation.policy.wanNetwork.removeSection.json +1 -1
- models/mutation.policy.wanNetwork.updatePolicy.json +1 -1
- models/mutation.policy.wanNetwork.updateRule.json +13 -13
- models/mutation.policy.wanNetwork.updateSection.json +1 -1
- models/query.policy.appTenantRestriction.policy.json +3086 -0
- models/query.policy.dynamicIpAllocation.policy.json +1934 -0
- models/query.policy.internetFirewall.policy.json +7833 -0
- models/query.policy.json +233 -0
- models/query.policy.remotePortFwd.policy.json +2387 -0
- models/query.policy.socketLan.policy.json +7140 -0
- models/query.policy.terminalServer.policy.json +1632 -0
- models/query.policy.wanFirewall.policy.json +9212 -0
- models/query.policy.wanNetwork.policy.json +8010 -0
- models/query.site.availableVersionList.json +365 -0
- models/query.site.bgpPeer.json +1917 -0
- models/query.site.bgpPeerList.json +2076 -0
- models/query.site.cloudInterconnectConnectionConnectivity.json +298 -0
- models/query.site.cloudInterconnectPhysicalConnection.json +728 -0
- models/query.site.cloudInterconnectPhysicalConnectionId.json +660 -0
- models/query.site.siteBgpStatus.json +869 -0
- schema/catolib.py +13 -6
- schema/remove_policyid.py +89 -0
- schema/remove_policyid_mutations.py +89 -0
- {catocli-2.0.4.dist-info → catocli-2.0.5.dist-info}/LICENSE +0 -0
- {catocli-2.0.4.dist-info → catocli-2.0.5.dist-info}/WHEEL +0 -0
- {catocli-2.0.4.dist-info → catocli-2.0.5.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import codecs
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from graphql_client import ApiClient, CallApi
|
|
6
|
+
from graphql_client.api_client import ApiException
|
|
7
|
+
import logging
|
|
8
|
+
import pprint
|
|
9
|
+
import uuid
|
|
10
|
+
from urllib3.filepost import encode_multipart_formdata
|
|
11
|
+
|
|
12
|
+
def createRequest(args, configuration):
|
|
13
|
+
params = vars(args)
|
|
14
|
+
instance = CallApi(ApiClient(configuration))
|
|
15
|
+
operationName = params["operation_name"]
|
|
16
|
+
operation = loadJSON("models/"+operationName+".json")
|
|
17
|
+
variablesObj = {}
|
|
18
|
+
if params["json"] and not params["t"]:
|
|
19
|
+
try:
|
|
20
|
+
variablesObj = json.loads(params["json"])
|
|
21
|
+
except ValueError as e:
|
|
22
|
+
print("ERROR: Query argument must be valid json in quotes. ",e,'\n\nExample: \'{"yourKey":"yourValue"}\'')
|
|
23
|
+
exit()
|
|
24
|
+
elif not params["t"] and params["json"] is None:
|
|
25
|
+
# Default to empty object if no json provided and not using -t flag
|
|
26
|
+
variablesObj = {}
|
|
27
|
+
if "accountId" in operation["args"]:
|
|
28
|
+
variablesObj["accountId"] = configuration.accountID
|
|
29
|
+
else:
|
|
30
|
+
variablesObj["accountID"] = configuration.accountID
|
|
31
|
+
if params["t"]==True:
|
|
32
|
+
# Skip validation when using -t flag
|
|
33
|
+
isOk = True
|
|
34
|
+
else:
|
|
35
|
+
isOk, invalidVars, message = validateArgs(variablesObj,operation)
|
|
36
|
+
if isOk==True:
|
|
37
|
+
body = generateGraphqlPayload(variablesObj,operation,operationName)
|
|
38
|
+
if params["t"]==True:
|
|
39
|
+
# Load query from queryPayloads file
|
|
40
|
+
try:
|
|
41
|
+
queryPayloadFile = "queryPayloads/" + operationName + ".json"
|
|
42
|
+
queryPayload = loadJSON(queryPayloadFile)
|
|
43
|
+
if queryPayload and "query" in queryPayload:
|
|
44
|
+
print(queryPayload["query"])
|
|
45
|
+
else:
|
|
46
|
+
print("ERROR: Query not found in " + queryPayloadFile)
|
|
47
|
+
except Exception as e:
|
|
48
|
+
print("ERROR: Could not load query from " + queryPayloadFile + ": " + str(e))
|
|
49
|
+
return None
|
|
50
|
+
else:
|
|
51
|
+
try:
|
|
52
|
+
return instance.call_api(body,params)
|
|
53
|
+
except ApiException as e:
|
|
54
|
+
return e
|
|
55
|
+
else:
|
|
56
|
+
print("ERROR: "+message,", ".join(invalidVars))
|
|
57
|
+
try:
|
|
58
|
+
queryPayloadFile = "queryPayloads/" + operationName + ".json"
|
|
59
|
+
queryPayload = loadJSON(queryPayloadFile)
|
|
60
|
+
print("\nExample: catocli "+operationName.replace(".", " "), json.dumps(queryPayload['variables']))
|
|
61
|
+
except Exception as e:
|
|
62
|
+
print("ERROR: Could not load query from " + queryPayloadFile + ": " + str(e))
|
|
63
|
+
|
|
64
|
+
def querySiteLocation(args, configuration):
|
|
65
|
+
params = vars(args)
|
|
66
|
+
operationName = params["operation_name"]
|
|
67
|
+
operation = loadJSON("models/"+operationName+".json")
|
|
68
|
+
try:
|
|
69
|
+
variablesObj = json.loads(params["json"])
|
|
70
|
+
except ValueError as e:
|
|
71
|
+
print("ERROR: Query argument must be valid json in quotes. ",e,'\n\nExample: \'{"filters":[{"search": "Your city here","field":"city","opeation":"exact"}}\'')
|
|
72
|
+
exit()
|
|
73
|
+
if not variablesObj.get("filters"):
|
|
74
|
+
print("ERROR: Missing argument, must include filters array. ",e,'\n\nExample: \'{"filters":[{"search": "Your city here","field":"city","opeation":"exact"}}\'')
|
|
75
|
+
exit()
|
|
76
|
+
if not isinstance(variablesObj.get("filters"), list):
|
|
77
|
+
print("ERROR: Invalid argument, must include filters array. ",e,'\n\nExample: \'{"filters":[{"search": "Your city here","field":"city","opeation":"exact"}}\'')
|
|
78
|
+
exit()
|
|
79
|
+
requiredFields = ["search","field","operation"]
|
|
80
|
+
for filter in variablesObj["filters"]:
|
|
81
|
+
if not isinstance(filter, dict):
|
|
82
|
+
print("ERROR: Invalid filter '"+str(filter)+"', filters must be valid json and include 'search', 'field', and 'operation'. ",'\n\nExample: \'{"filters":[{"search": "Your city here","field":"city","opeation":"exact"}}\'',type(filter))
|
|
83
|
+
exit()
|
|
84
|
+
for param in filter:
|
|
85
|
+
if param not in requiredFields:
|
|
86
|
+
print("ERROR: Invalid field '"+param+"', filters must include 'search', 'field', and 'operation'. ",'\n\nExample: \'{"filters":[{"search": "Your city here","field":"city","opeation":"exact"}}\'')
|
|
87
|
+
exit()
|
|
88
|
+
for filter in variablesObj["filters"]:
|
|
89
|
+
for param in filter:
|
|
90
|
+
val = filter.get(param)
|
|
91
|
+
if param=="search" and (not isinstance(val, str) or len(val)<3):
|
|
92
|
+
print("ERROR: Invalid search '"+val+"', must be a string value and at least 3 characters in lengh. ",'\n\nExample: \'{"filters":[{"search": "Your city here","field":"city","opeation":"exact"}}\'')
|
|
93
|
+
exit()
|
|
94
|
+
if param=="field" and (not isinstance(val, str) or val not in [ 'countryName', 'stateName', 'city']):
|
|
95
|
+
print("ERROR: Invalid field '"+val+"', must be one of the following: 'countryName', 'stateName', or 'city'.",'\n\nExample: \'{"search":"your query here","field":"city"}\'')
|
|
96
|
+
exit()
|
|
97
|
+
if param=="operation" and (not isinstance(val, str) or val not in [ 'startsWith', 'endsWith', 'exact', 'contains' ]):
|
|
98
|
+
print("ERROR: Invalid operation '"+val+"', must be one of the following: 'startsWith', 'endsWith', 'exact', 'contains'.",'\n\nExample: \'{"search": "Your search here","field":"city","operation":"exact"}\'')
|
|
99
|
+
exit()
|
|
100
|
+
response = {"data":[]}
|
|
101
|
+
for key, siteObj in operation.items():
|
|
102
|
+
isOk = True
|
|
103
|
+
for filter in variablesObj["filters"]:
|
|
104
|
+
search = filter.get("search")
|
|
105
|
+
field = filter.get("field")
|
|
106
|
+
operation = filter.get("operation")
|
|
107
|
+
if field in siteObj:
|
|
108
|
+
if operation=="startsWith" and not siteObj[field].startswith(search):
|
|
109
|
+
isOk = False
|
|
110
|
+
break
|
|
111
|
+
elif operation=="endsWith" and not siteObj[field].endswith(search):
|
|
112
|
+
isOk = False
|
|
113
|
+
break
|
|
114
|
+
elif operation=="exact" and not siteObj[field]==search:
|
|
115
|
+
isOk = False
|
|
116
|
+
break
|
|
117
|
+
elif operation=="contains" and not search in siteObj[field]:
|
|
118
|
+
isOk = False
|
|
119
|
+
break
|
|
120
|
+
else:
|
|
121
|
+
isOk = False
|
|
122
|
+
break
|
|
123
|
+
if isOk==False:
|
|
124
|
+
break
|
|
125
|
+
if isOk==True:
|
|
126
|
+
response["data"].append(siteObj)
|
|
127
|
+
if params["p"]==True:
|
|
128
|
+
responseStr = json.dumps(response,indent=2,sort_keys=True,ensure_ascii=False).encode('utf8')
|
|
129
|
+
print(responseStr.decode())
|
|
130
|
+
else:
|
|
131
|
+
responseStr = json.dumps(response,ensure_ascii=False).encode('utf8')
|
|
132
|
+
print(responseStr.decode())
|
|
133
|
+
|
|
134
|
+
def createRawRequest(args, configuration):
|
|
135
|
+
params = vars(args)
|
|
136
|
+
# Handle endpoint override
|
|
137
|
+
if hasattr(args, 'endpoint') and args.endpoint:
|
|
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
|
+
|
|
144
|
+
instance = CallApi(ApiClient(configuration))
|
|
145
|
+
isOk = False
|
|
146
|
+
try:
|
|
147
|
+
body = json.loads(params["json"])
|
|
148
|
+
isOk = True
|
|
149
|
+
except ValueError as e:
|
|
150
|
+
print("ERROR: Argument must be valid json. ",e)
|
|
151
|
+
isOk=False
|
|
152
|
+
except Exception as e:
|
|
153
|
+
isOk=False
|
|
154
|
+
print("ERROR: ",e)
|
|
155
|
+
if isOk==True:
|
|
156
|
+
if params["t"]==True:
|
|
157
|
+
if params["p"]==True:
|
|
158
|
+
print(json.dumps(body,indent=2,sort_keys=True).replace("\\n", "\n").replace("\\t", "\t"))
|
|
159
|
+
else:
|
|
160
|
+
print(json.dumps(body).replace("\\n", " ").replace("\\t", " ").replace(" "," ").replace(" "," "))
|
|
161
|
+
return None
|
|
162
|
+
else:
|
|
163
|
+
try:
|
|
164
|
+
return instance.call_api(body,params)
|
|
165
|
+
except ApiException as e:
|
|
166
|
+
print(e)
|
|
167
|
+
exit()
|
|
168
|
+
|
|
169
|
+
def generateGraphqlPayload(variablesObj,operation,operationName):
|
|
170
|
+
indent = " "
|
|
171
|
+
queryStr = ""
|
|
172
|
+
variableStr = ""
|
|
173
|
+
for varName in variablesObj:
|
|
174
|
+
if (varName in operation["operationArgs"]):
|
|
175
|
+
variableStr += operation["operationArgs"][varName]["requestStr"]
|
|
176
|
+
operationAry = operationName.split(".")
|
|
177
|
+
operationType = operationAry.pop(0)
|
|
178
|
+
queryStr = operationType + " "
|
|
179
|
+
queryStr += renderCamelCase(".".join(operationAry))
|
|
180
|
+
queryStr += " ( " + variableStr + ") {\n"
|
|
181
|
+
queryStr += indent + operation["name"] + " ( "
|
|
182
|
+
for argName in operation["args"]:
|
|
183
|
+
arg = operation["args"][argName]
|
|
184
|
+
if arg["varName"] in variablesObj:
|
|
185
|
+
queryStr += arg["responseStr"]
|
|
186
|
+
queryStr += ") {\n" + renderArgsAndFields("", variablesObj, operation, operation["type"]["definition"], " ") + " }"
|
|
187
|
+
queryStr += indent + "\n}";
|
|
188
|
+
body = {
|
|
189
|
+
"query":queryStr,
|
|
190
|
+
"variables":variablesObj,
|
|
191
|
+
"operationName":renderCamelCase(".".join(operationAry)),
|
|
192
|
+
}
|
|
193
|
+
return body
|
|
194
|
+
|
|
195
|
+
def get_help(path):
|
|
196
|
+
matchCmd = "catocli "+path.replace("_"," ")
|
|
197
|
+
import os
|
|
198
|
+
pwd = os.path.dirname(__file__)
|
|
199
|
+
doc = path+"/README.md"
|
|
200
|
+
abs_path = os.path.join(pwd, doc)
|
|
201
|
+
new_line = "\nEXAMPLES:\n"
|
|
202
|
+
lines = open(abs_path, "r").readlines()
|
|
203
|
+
for line in lines:
|
|
204
|
+
if f"{matchCmd}" in line:
|
|
205
|
+
clean_line = line.replace("<br /><br />", "").replace("`","")
|
|
206
|
+
new_line += f"{clean_line}\n"
|
|
207
|
+
# matchArg = path.replace("_",".")
|
|
208
|
+
# for line in lines:
|
|
209
|
+
# if f"`{matchArg}" in line:
|
|
210
|
+
# clean_line = line.replace("<br /><br />", "").replace("`","")
|
|
211
|
+
# new_line += f"{clean_line}\n"
|
|
212
|
+
return new_line
|
|
213
|
+
|
|
214
|
+
def validateArgs(variablesObj,operation):
|
|
215
|
+
isOk = True
|
|
216
|
+
invalidVars = []
|
|
217
|
+
message = "Arguments are missing or have invalid values: "
|
|
218
|
+
for varName in variablesObj:
|
|
219
|
+
if varName not in operation["operationArgs"]:
|
|
220
|
+
isOk = False
|
|
221
|
+
invalidVars.append('"'+varName+'"')
|
|
222
|
+
message = "Invalid argument names. Looking for: "+", ".join(list(operation["operationArgs"].keys()))
|
|
223
|
+
|
|
224
|
+
if isOk==True:
|
|
225
|
+
for varName in operation["operationArgs"]:
|
|
226
|
+
if operation["operationArgs"][varName]["required"] and varName not in variablesObj:
|
|
227
|
+
isOk = False
|
|
228
|
+
invalidVars.append('"'+varName+'"')
|
|
229
|
+
else:
|
|
230
|
+
if varName in variablesObj:
|
|
231
|
+
value = variablesObj[varName]
|
|
232
|
+
if operation["operationArgs"][varName]["required"] and value=="":
|
|
233
|
+
isOk = False
|
|
234
|
+
invalidVars.append('"'+varName+'":"'+str(value)+'"')
|
|
235
|
+
return isOk, invalidVars, message
|
|
236
|
+
|
|
237
|
+
def loadJSON(file):
|
|
238
|
+
CONFIG = {}
|
|
239
|
+
module_dir_ary = os.path.dirname(__file__).split("/")
|
|
240
|
+
del module_dir_ary[-1]
|
|
241
|
+
del module_dir_ary[-1]
|
|
242
|
+
module_dir = "/".join(module_dir_ary)
|
|
243
|
+
try:
|
|
244
|
+
with open(module_dir+'/'+file, 'r') as data:
|
|
245
|
+
CONFIG = json.load(data)
|
|
246
|
+
return CONFIG
|
|
247
|
+
except:
|
|
248
|
+
logging.warning("File \""+module_dir+'/'+file+"\" not found.")
|
|
249
|
+
exit()
|
|
250
|
+
|
|
251
|
+
def renderCamelCase(pathStr):
|
|
252
|
+
str = ""
|
|
253
|
+
pathAry = pathStr.split(".")
|
|
254
|
+
for i, path in enumerate(pathAry):
|
|
255
|
+
if i == 0:
|
|
256
|
+
str += path[0].lower() + path[1:]
|
|
257
|
+
else:
|
|
258
|
+
str += path[0].upper() + path[1:]
|
|
259
|
+
return str
|
|
260
|
+
|
|
261
|
+
def renderArgsAndFields(responseArgStr, variablesObj, curOperation, definition, indent):
|
|
262
|
+
for fieldName in definition['fields']:
|
|
263
|
+
field = definition['fields'][fieldName]
|
|
264
|
+
field_name = field['alias'] if 'alias' in field else field['name']
|
|
265
|
+
|
|
266
|
+
# Check if field has arguments and whether they are present in variables
|
|
267
|
+
should_include_field = True
|
|
268
|
+
argsPresent = False
|
|
269
|
+
argStr = ""
|
|
270
|
+
|
|
271
|
+
if field.get("args") and not isinstance(field['args'], list):
|
|
272
|
+
if (len(list(field['args'].keys()))>0):
|
|
273
|
+
# Field has arguments - only include if arguments are present in variables
|
|
274
|
+
argStr = " ( "
|
|
275
|
+
for argName in field['args']:
|
|
276
|
+
arg = field['args'][argName]
|
|
277
|
+
if arg["varName"] in variablesObj:
|
|
278
|
+
argStr += arg['responseStr'] + " "
|
|
279
|
+
argsPresent = True
|
|
280
|
+
argStr += ") "
|
|
281
|
+
# Only include fields with arguments if the arguments are present
|
|
282
|
+
should_include_field = argsPresent
|
|
283
|
+
|
|
284
|
+
# Only process field if we should include it
|
|
285
|
+
if should_include_field:
|
|
286
|
+
responseArgStr += indent + field_name
|
|
287
|
+
if argsPresent:
|
|
288
|
+
responseArgStr += argStr
|
|
289
|
+
|
|
290
|
+
if should_include_field and field.get("type") and field['type'].get('definition') and field['type']['definition']['fields'] is not None:
|
|
291
|
+
responseArgStr += " {\n"
|
|
292
|
+
for subfieldIndex in field['type']['definition']['fields']:
|
|
293
|
+
subfield = field['type']['definition']['fields'][subfieldIndex]
|
|
294
|
+
subfield_name = subfield['alias'] if 'alias' in subfield else subfield['name']
|
|
295
|
+
responseArgStr += indent + " " + subfield_name
|
|
296
|
+
if subfield.get("args") and len(list(subfield["args"].keys()))>0:
|
|
297
|
+
argsPresent = False
|
|
298
|
+
subArgStr = " ( "
|
|
299
|
+
for argName in subfield['args']:
|
|
300
|
+
arg = subfield['args'][argName]
|
|
301
|
+
if arg["varName"] in variablesObj:
|
|
302
|
+
argsPresent = True
|
|
303
|
+
subArgStr += arg['responseStr'] + " "
|
|
304
|
+
subArgStr += " )"
|
|
305
|
+
if argsPresent==True:
|
|
306
|
+
responseArgStr += subArgStr
|
|
307
|
+
if subfield.get("type") and subfield['type'].get("definition") and (subfield['type']['definition'].get("fields") or subfield['type']['definition'].get('inputFields')):
|
|
308
|
+
responseArgStr += " {\n"
|
|
309
|
+
responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, subfield['type']['definition'], indent + " ")
|
|
310
|
+
if subfield['type']['definition'].get('possibleTypes'):
|
|
311
|
+
for possibleTypeName in subfield['type']['definition']['possibleTypes']:
|
|
312
|
+
possibleType = subfield['type']['definition']['possibleTypes'][possibleTypeName]
|
|
313
|
+
responseArgStr += indent + " ... on " + possibleType['name'] + " {\n"
|
|
314
|
+
if possibleType.get('fields') or possibleType.get('inputFields'):
|
|
315
|
+
responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, possibleType, indent + " ")
|
|
316
|
+
responseArgStr += indent + " }\n"
|
|
317
|
+
responseArgStr += indent + " }"
|
|
318
|
+
elif subfield.get('type') and subfield['type'].get('definition') and subfield['type']['definition'].get('possibleTypes'):
|
|
319
|
+
responseArgStr += " {\n"
|
|
320
|
+
responseArgStr += indent + " __typename\n"
|
|
321
|
+
for possibleTypeName in subfield['type']['definition']['possibleTypes']:
|
|
322
|
+
possibleType = subfield['type']['definition']['possibleTypes'][possibleTypeName]
|
|
323
|
+
responseArgStr += indent + " ... on " + possibleType['name'] + " {\n"
|
|
324
|
+
if possibleType.get('fields') or possibleType.get('inputFields'):
|
|
325
|
+
responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, possibleType, indent + " ")
|
|
326
|
+
responseArgStr += indent + " }\n"
|
|
327
|
+
responseArgStr += indent + " }\n"
|
|
328
|
+
responseArgStr += "\n"
|
|
329
|
+
if field['type']['definition'].get('possibleTypes'):
|
|
330
|
+
for possibleTypeName in field['type']['definition']['possibleTypes']:
|
|
331
|
+
possibleType = field['type']['definition']['possibleTypes'][possibleTypeName]
|
|
332
|
+
responseArgStr += indent + " ... on " + possibleType['name'] + " {\n"
|
|
333
|
+
if possibleType.get('fields') or possibleType.get('inputFields'):
|
|
334
|
+
responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, possibleType, indent + " ")
|
|
335
|
+
responseArgStr += indent + " }\n"
|
|
336
|
+
responseArgStr += indent + "}\n"
|
|
337
|
+
if should_include_field and field.get('type') and field['type'].get('definition') and field['type']['definition'].get('inputFields'):
|
|
338
|
+
responseArgStr += " {\n"
|
|
339
|
+
for subfieldName in field['type']['definition'].get('inputFields'):
|
|
340
|
+
subfield = field['type']['definition']['inputFields'][subfieldName]
|
|
341
|
+
subfield_name = subfield['alias'] if 'alias' in subfield else subfield['name']
|
|
342
|
+
responseArgStr += indent + " " + subfield_name
|
|
343
|
+
if subfield.get('type') and subfield['type'].get('definition') and (subfield['type']['definition'].get('fields') or subfield['type']['definition'].get('inputFields')):
|
|
344
|
+
responseArgStr += " {\n"
|
|
345
|
+
responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, subfield['type']['definition'], indent + " ")
|
|
346
|
+
responseArgStr += indent + " }\n"
|
|
347
|
+
if field['type']['definition'].get('possibleTypes'):
|
|
348
|
+
for possibleTypeName in field['type']['definition']['possibleTypes']:
|
|
349
|
+
possibleType = field['type']['definition']['possibleTypes'][possibleTypeName]
|
|
350
|
+
responseArgStr += indent + "... on " + possibleType['name'] + " {\n"
|
|
351
|
+
if possibleType.get('fields') or possibleType.get('inputFields'):
|
|
352
|
+
responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, possibleType, indent + " ")
|
|
353
|
+
responseArgStr += indent + " }\n"
|
|
354
|
+
responseArgStr += indent + "}\n"
|
|
355
|
+
if should_include_field:
|
|
356
|
+
responseArgStr += "\n"
|
|
357
|
+
return responseArgStr
|
|
358
|
+
|
|
359
|
+
def createRawBinaryRequest(args, configuration):
|
|
360
|
+
"""Handle multipart/form-data requests for file uploads and binary content"""
|
|
361
|
+
params = vars(args)
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
# Parse the JSON body
|
|
365
|
+
try:
|
|
366
|
+
body = json.loads(params["json"])
|
|
367
|
+
except ValueError as e:
|
|
368
|
+
print("ERROR: JSON argument must be valid json. ", e)
|
|
369
|
+
return
|
|
370
|
+
except Exception as e:
|
|
371
|
+
print("ERROR: ", e)
|
|
372
|
+
return
|
|
373
|
+
|
|
374
|
+
# Build form data
|
|
375
|
+
form_fields = {}
|
|
376
|
+
files = []
|
|
377
|
+
|
|
378
|
+
# Add the operations field containing the GraphQL payload
|
|
379
|
+
form_fields['operations'] = json.dumps(body)
|
|
380
|
+
|
|
381
|
+
# Handle file mappings if files are specified
|
|
382
|
+
if hasattr(args, 'files') and args.files:
|
|
383
|
+
# Build the map object for file uploads
|
|
384
|
+
file_map = {}
|
|
385
|
+
for i, (field_name, file_path) in enumerate(args.files):
|
|
386
|
+
file_index = str(i + 1)
|
|
387
|
+
file_map[file_index] = [field_name]
|
|
388
|
+
|
|
389
|
+
# Read file content
|
|
390
|
+
try:
|
|
391
|
+
with open(file_path, 'rb') as f:
|
|
392
|
+
file_content = f.read()
|
|
393
|
+
files.append((file_index, (os.path.basename(file_path), file_content, 'application/octet-stream')))
|
|
394
|
+
except IOError as e:
|
|
395
|
+
print(f"ERROR: Could not read file {file_path}: {e}")
|
|
396
|
+
return
|
|
397
|
+
|
|
398
|
+
# Add the map field
|
|
399
|
+
form_fields['map'] = json.dumps(file_map)
|
|
400
|
+
|
|
401
|
+
# Test mode - just print the request structure
|
|
402
|
+
if params.get("t") == True:
|
|
403
|
+
print("Multipart form data request:")
|
|
404
|
+
if params.get("p") == True:
|
|
405
|
+
print(f"Operations: {json.dumps(json.loads(form_fields.get('operations')), indent=2)}")
|
|
406
|
+
else:
|
|
407
|
+
print(f"Operations: {form_fields.get('operations')}")
|
|
408
|
+
if 'map' in form_fields:
|
|
409
|
+
print(f"Map: {form_fields.get('map')}")
|
|
410
|
+
if files:
|
|
411
|
+
print(f"Files: {[f[0] + ': ' + f[1][0] for f in files]}")
|
|
412
|
+
return None
|
|
413
|
+
|
|
414
|
+
# Perform the multipart request
|
|
415
|
+
try:
|
|
416
|
+
return sendMultipartRequest(configuration, form_fields, files, params)
|
|
417
|
+
except Exception as e:
|
|
418
|
+
# Safely handle exception string conversion
|
|
419
|
+
try:
|
|
420
|
+
error_str = str(e)
|
|
421
|
+
except Exception:
|
|
422
|
+
error_str = f"Exception of type {type(e).__name__}"
|
|
423
|
+
|
|
424
|
+
if params.get("v") == True:
|
|
425
|
+
import traceback
|
|
426
|
+
print(f"ERROR: Failed to send multipart request: {error_str}")
|
|
427
|
+
traceback.print_exc()
|
|
428
|
+
else:
|
|
429
|
+
print(f"ERROR: Failed to send multipart request: {error_str}")
|
|
430
|
+
return None
|
|
431
|
+
|
|
432
|
+
def sendMultipartRequest(configuration, form_fields, files, params):
|
|
433
|
+
"""Send a multipart/form-data request directly using urllib3"""
|
|
434
|
+
import urllib3
|
|
435
|
+
|
|
436
|
+
# Create pool manager
|
|
437
|
+
pool_manager = urllib3.PoolManager(
|
|
438
|
+
cert_reqs='CERT_NONE' if not getattr(configuration, 'verify_ssl', False) else 'CERT_REQUIRED'
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
# Prepare form data
|
|
442
|
+
fields = []
|
|
443
|
+
for key, value in form_fields.items():
|
|
444
|
+
fields.append((key, value))
|
|
445
|
+
|
|
446
|
+
for file_key, (filename, content, content_type) in files:
|
|
447
|
+
fields.append((file_key, (filename, content, content_type)))
|
|
448
|
+
|
|
449
|
+
# Encode multipart data
|
|
450
|
+
body_data, content_type = encode_multipart_formdata(fields)
|
|
451
|
+
|
|
452
|
+
# Prepare headers
|
|
453
|
+
headers = {
|
|
454
|
+
'Content-Type': content_type,
|
|
455
|
+
'User-Agent': f"Cato-CLI-v{getattr(configuration, 'version', 'unknown')}"
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
# Add API key if not using headers file or custom headers
|
|
459
|
+
using_custom_headers = hasattr(configuration, 'custom_headers') and configuration.custom_headers
|
|
460
|
+
if not using_custom_headers and hasattr(configuration, 'api_key') and hasattr(configuration, 'api_key') and configuration.api_key and 'x-api-key' in configuration.api_key:
|
|
461
|
+
headers['x-api-key'] = configuration.api_key['x-api-key']
|
|
462
|
+
|
|
463
|
+
# Add custom headers
|
|
464
|
+
if using_custom_headers:
|
|
465
|
+
headers.update(configuration.custom_headers)
|
|
466
|
+
|
|
467
|
+
# Verbose output
|
|
468
|
+
if params.get("v") == True:
|
|
469
|
+
print(f"Host: {getattr(configuration, 'host', 'unknown')}")
|
|
470
|
+
masked_headers = headers.copy()
|
|
471
|
+
if 'x-api-key' in masked_headers:
|
|
472
|
+
masked_headers['x-api-key'] = '***MASKED***'
|
|
473
|
+
print(f"Request Headers: {json.dumps(masked_headers, indent=4, sort_keys=True)}")
|
|
474
|
+
print(f"Content-Type: {content_type}")
|
|
475
|
+
print(f"Form fields: {list(form_fields.keys())}")
|
|
476
|
+
print(f"Files: {[f[0] for f in files]}\n")
|
|
477
|
+
|
|
478
|
+
try:
|
|
479
|
+
# Make the request
|
|
480
|
+
resp = pool_manager.request(
|
|
481
|
+
'POST',
|
|
482
|
+
getattr(configuration, 'host', 'https://api.catonetworks.com/api/v1/graphql'),
|
|
483
|
+
body=body_data,
|
|
484
|
+
headers=headers
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
# Parse response
|
|
488
|
+
if resp.status < 200 or resp.status >= 300:
|
|
489
|
+
reason = resp.reason if resp.reason is not None else "Unknown Error"
|
|
490
|
+
error_msg = f"HTTP {resp.status}: {reason}"
|
|
491
|
+
if resp.data:
|
|
492
|
+
try:
|
|
493
|
+
error_msg += f"\n{resp.data.decode('utf-8')}"
|
|
494
|
+
except Exception:
|
|
495
|
+
error_msg += f"\n{resp.data}"
|
|
496
|
+
print(f"ERROR: {error_msg}")
|
|
497
|
+
return None
|
|
498
|
+
|
|
499
|
+
try:
|
|
500
|
+
response_data = json.loads(resp.data.decode('utf-8'))
|
|
501
|
+
except json.JSONDecodeError:
|
|
502
|
+
response_data = resp.data.decode('utf-8')
|
|
503
|
+
|
|
504
|
+
return [response_data]
|
|
505
|
+
|
|
506
|
+
except Exception as e:
|
|
507
|
+
# Safely handle exception string conversion
|
|
508
|
+
try:
|
|
509
|
+
error_str = str(e)
|
|
510
|
+
except Exception:
|
|
511
|
+
error_str = f"Exception of type {type(e).__name__}"
|
|
512
|
+
print(f"ERROR: Network/request error: {error_str}")
|
|
513
|
+
return None
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
from ..parserApiClient import createRequest, get_help
|
|
3
|
+
|
|
4
|
+
def query_accountBySubdomain_parse(query_subparsers):
|
|
5
|
+
query_accountBySubdomain_parser = query_subparsers.add_parser('accountBySubdomain',
|
|
6
|
+
help='accountBySubdomain() query operation',
|
|
7
|
+
usage=get_help("query_accountBySubdomain"))
|
|
8
|
+
|
|
9
|
+
query_accountBySubdomain_parser.add_argument('json', nargs='?', default='{}', help='Variables in JSON format (defaults to empty object if not provided).')
|
|
10
|
+
query_accountBySubdomain_parser.add_argument('-accountID', help='Override the CATO_ACCOUNT_ID environment variable with this value.')
|
|
11
|
+
query_accountBySubdomain_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print GraphQL query without sending API call')
|
|
12
|
+
query_accountBySubdomain_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
|
|
13
|
+
query_accountBySubdomain_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
|
|
14
|
+
query_accountBySubdomain_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
15
|
+
query_accountBySubdomain_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
16
|
+
query_accountBySubdomain_parser.set_defaults(func=createRequest,operation_name='query.accountBySubdomain')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
from ..parserApiClient import createRequest, get_help
|
|
3
|
+
|
|
4
|
+
def query_accountManagement_parse(query_subparsers):
|
|
5
|
+
query_accountManagement_parser = query_subparsers.add_parser('accountManagement',
|
|
6
|
+
help='accountManagement() query operation',
|
|
7
|
+
usage=get_help("query_accountManagement"))
|
|
8
|
+
|
|
9
|
+
query_accountManagement_parser.add_argument('json', nargs='?', default='{}', help='Variables in JSON format (defaults to empty object if not provided).')
|
|
10
|
+
query_accountManagement_parser.add_argument('-accountID', help='Override the CATO_ACCOUNT_ID environment variable with this value.')
|
|
11
|
+
query_accountManagement_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print GraphQL query without sending API call')
|
|
12
|
+
query_accountManagement_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
|
|
13
|
+
query_accountManagement_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
|
|
14
|
+
query_accountManagement_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
15
|
+
query_accountManagement_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
16
|
+
query_accountManagement_parser.set_defaults(func=createRequest,operation_name='query.accountManagement')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
from ..parserApiClient import createRequest, get_help
|
|
3
|
+
|
|
4
|
+
def query_accountMetrics_parse(query_subparsers):
|
|
5
|
+
query_accountMetrics_parser = query_subparsers.add_parser('accountMetrics',
|
|
6
|
+
help='accountMetrics() query operation',
|
|
7
|
+
usage=get_help("query_accountMetrics"))
|
|
8
|
+
|
|
9
|
+
query_accountMetrics_parser.add_argument('json', nargs='?', default='{}', help='Variables in JSON format (defaults to empty object if not provided).')
|
|
10
|
+
query_accountMetrics_parser.add_argument('-accountID', help='Override the CATO_ACCOUNT_ID environment variable with this value.')
|
|
11
|
+
query_accountMetrics_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print GraphQL query without sending API call')
|
|
12
|
+
query_accountMetrics_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
|
|
13
|
+
query_accountMetrics_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
|
|
14
|
+
query_accountMetrics_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
15
|
+
query_accountMetrics_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
16
|
+
query_accountMetrics_parser.set_defaults(func=createRequest,operation_name='query.accountMetrics')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
from ..parserApiClient import createRequest, get_help
|
|
3
|
+
|
|
4
|
+
def query_accountRoles_parse(query_subparsers):
|
|
5
|
+
query_accountRoles_parser = query_subparsers.add_parser('accountRoles',
|
|
6
|
+
help='accountRoles() query operation',
|
|
7
|
+
usage=get_help("query_accountRoles"))
|
|
8
|
+
|
|
9
|
+
query_accountRoles_parser.add_argument('json', nargs='?', default='{}', help='Variables in JSON format (defaults to empty object if not provided).')
|
|
10
|
+
query_accountRoles_parser.add_argument('-accountID', help='Override the CATO_ACCOUNT_ID environment variable with this value.')
|
|
11
|
+
query_accountRoles_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print GraphQL query without sending API call')
|
|
12
|
+
query_accountRoles_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
|
|
13
|
+
query_accountRoles_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
|
|
14
|
+
query_accountRoles_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
15
|
+
query_accountRoles_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
16
|
+
query_accountRoles_parser.set_defaults(func=createRequest,operation_name='query.accountRoles')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
from ..parserApiClient import createRequest, get_help
|
|
3
|
+
|
|
4
|
+
def query_accountSnapshot_parse(query_subparsers):
|
|
5
|
+
query_accountSnapshot_parser = query_subparsers.add_parser('accountSnapshot',
|
|
6
|
+
help='accountSnapshot() query operation',
|
|
7
|
+
usage=get_help("query_accountSnapshot"))
|
|
8
|
+
|
|
9
|
+
query_accountSnapshot_parser.add_argument('json', nargs='?', default='{}', help='Variables in JSON format (defaults to empty object if not provided).')
|
|
10
|
+
query_accountSnapshot_parser.add_argument('-accountID', help='Override the CATO_ACCOUNT_ID environment variable with this value.')
|
|
11
|
+
query_accountSnapshot_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print GraphQL query without sending API call')
|
|
12
|
+
query_accountSnapshot_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
|
|
13
|
+
query_accountSnapshot_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
|
|
14
|
+
query_accountSnapshot_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
15
|
+
query_accountSnapshot_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
16
|
+
query_accountSnapshot_parser.set_defaults(func=createRequest,operation_name='query.accountSnapshot')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
from ..parserApiClient import createRequest, get_help
|
|
3
|
+
|
|
4
|
+
def query_admin_parse(query_subparsers):
|
|
5
|
+
query_admin_parser = query_subparsers.add_parser('admin',
|
|
6
|
+
help='admin() query operation',
|
|
7
|
+
usage=get_help("query_admin"))
|
|
8
|
+
|
|
9
|
+
query_admin_parser.add_argument('json', nargs='?', default='{}', help='Variables in JSON format (defaults to empty object if not provided).')
|
|
10
|
+
query_admin_parser.add_argument('-accountID', help='Override the CATO_ACCOUNT_ID environment variable with this value.')
|
|
11
|
+
query_admin_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print GraphQL query without sending API call')
|
|
12
|
+
query_admin_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
|
|
13
|
+
query_admin_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
|
|
14
|
+
query_admin_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
15
|
+
query_admin_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
16
|
+
query_admin_parser.set_defaults(func=createRequest,operation_name='query.admin')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
from ..parserApiClient import createRequest, get_help
|
|
3
|
+
|
|
4
|
+
def query_admins_parse(query_subparsers):
|
|
5
|
+
query_admins_parser = query_subparsers.add_parser('admins',
|
|
6
|
+
help='admins() query operation',
|
|
7
|
+
usage=get_help("query_admins"))
|
|
8
|
+
|
|
9
|
+
query_admins_parser.add_argument('json', nargs='?', default='{}', help='Variables in JSON format (defaults to empty object if not provided).')
|
|
10
|
+
query_admins_parser.add_argument('-accountID', help='Override the CATO_ACCOUNT_ID environment variable with this value.')
|
|
11
|
+
query_admins_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print GraphQL query without sending API call')
|
|
12
|
+
query_admins_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
|
|
13
|
+
query_admins_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
|
|
14
|
+
query_admins_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
15
|
+
query_admins_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
16
|
+
query_admins_parser.set_defaults(func=createRequest,operation_name='query.admins')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
from ..parserApiClient import createRequest, get_help
|
|
3
|
+
|
|
4
|
+
def query_appStats_parse(query_subparsers):
|
|
5
|
+
query_appStats_parser = query_subparsers.add_parser('appStats',
|
|
6
|
+
help='appStats() query operation',
|
|
7
|
+
usage=get_help("query_appStats"))
|
|
8
|
+
|
|
9
|
+
query_appStats_parser.add_argument('json', nargs='?', default='{}', help='Variables in JSON format (defaults to empty object if not provided).')
|
|
10
|
+
query_appStats_parser.add_argument('-accountID', help='Override the CATO_ACCOUNT_ID environment variable with this value.')
|
|
11
|
+
query_appStats_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print GraphQL query without sending API call')
|
|
12
|
+
query_appStats_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
|
|
13
|
+
query_appStats_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
|
|
14
|
+
query_appStats_parser.add_argument('-H', '--header', action='append', dest='headers', help='Add custom headers in "Key: Value" format. Can be used multiple times.')
|
|
15
|
+
query_appStats_parser.add_argument('--headers-file', dest='headers_file', help='Load headers from a file. Each line should contain a header in "Key: Value" format.')
|
|
16
|
+
query_appStats_parser.set_defaults(func=createRequest,operation_name='query.appStats')
|