catocli 1.0.1__py3-none-any.whl → 1.0.2__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.

Files changed (251) hide show
  1. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/Utils/clidriver.py +103 -0
  2. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/__init__.py +2 -0
  3. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/__main__.py +11 -0
  4. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/custom/__init__.py +42 -0
  5. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/custom/customLib.py +71 -0
  6. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_admin/__init__.py +51 -0
  7. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_policy/__init__.py +357 -0
  8. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_site/__init__.py +219 -0
  9. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/parserApiClient.py +309 -0
  10. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_accountBySubdomain/__init__.py +17 -0
  11. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_accountMetrics/__init__.py +17 -0
  12. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_accountRoles/__init__.py +17 -0
  13. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_accountSnapshot/__init__.py +17 -0
  14. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_admin/__init__.py +17 -0
  15. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_admins/__init__.py +17 -0
  16. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_appStats/__init__.py +17 -0
  17. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_appStatsTimeSeries/__init__.py +17 -0
  18. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_auditFeed/__init__.py +17 -0
  19. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_entityLookup/__init__.py +17 -0
  20. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_events/__init__.py +17 -0
  21. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_eventsFeed/__init__.py +17 -0
  22. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_eventsTimeSeries/__init__.py +17 -0
  23. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_hardwareManagement/__init__.py +17 -0
  24. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_licensing/__init__.py +17 -0
  25. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_policy/__init__.py +17 -0
  26. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_siteLocation/__init__.py +17 -0
  27. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_subDomains/__init__.py +17 -0
  28. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_xdr/__init__.py +37 -0
  29. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/raw/__init__.py +9 -0
  30. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/__init__.py +11 -0
  31. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/api/__init__.py +3 -0
  32. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/api/call_api.py +73 -0
  33. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/api_client.py +192 -0
  34. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/api_client_types.py +404 -0
  35. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/configuration.py +230 -0
  36. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/models/__init__.py +13 -0
  37. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/models/no_schema.py +71 -0
  38. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/schema/catolib.py +1004 -0
  39. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/schema/importSchema.py +60 -0
  40. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/certifi/__init__.py +4 -0
  41. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/certifi/__main__.py +12 -0
  42. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/certifi/core.py +114 -0
  43. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/certifi/py.typed +0 -0
  44. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/six.py +998 -0
  45. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/__init__.py +211 -0
  46. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/_base_connection.py +172 -0
  47. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/_collections.py +483 -0
  48. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/_request_methods.py +278 -0
  49. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/_version.py +16 -0
  50. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/connection.py +1033 -0
  51. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/connectionpool.py +1182 -0
  52. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/__init__.py +0 -0
  53. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/__init__.py +16 -0
  54. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/connection.py +254 -0
  55. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/fetch.py +418 -0
  56. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/request.py +22 -0
  57. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/response.py +285 -0
  58. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/pyopenssl.py +552 -0
  59. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/socks.py +228 -0
  60. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/exceptions.py +321 -0
  61. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/fields.py +341 -0
  62. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/filepost.py +89 -0
  63. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/http2/__init__.py +53 -0
  64. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/http2/connection.py +356 -0
  65. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/http2/probe.py +87 -0
  66. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/poolmanager.py +637 -0
  67. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/py.typed +2 -0
  68. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/response.py +1265 -0
  69. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/__init__.py +42 -0
  70. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/connection.py +137 -0
  71. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/proxy.py +43 -0
  72. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/request.py +256 -0
  73. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/response.py +101 -0
  74. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/retry.py +533 -0
  75. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/ssl_.py +513 -0
  76. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/ssl_match_hostname.py +159 -0
  77. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/ssltransport.py +276 -0
  78. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/timeout.py +275 -0
  79. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/url.py +471 -0
  80. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/util.py +42 -0
  81. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/wait.py +124 -0
  82. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/Utils/clidriver.py +103 -0
  83. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/__init__.py +2 -0
  84. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/__main__.py +11 -0
  85. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/custom/__init__.py +42 -0
  86. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/custom/customLib.py +71 -0
  87. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_admin/__init__.py +51 -0
  88. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_container/__init__.py +23 -0
  89. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_policy/__init__.py +357 -0
  90. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_site/__init__.py +219 -0
  91. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_sites/__init__.py +219 -0
  92. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/parserApiClient.py +309 -0
  93. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_accountBySubdomain/__init__.py +17 -0
  94. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_accountMetrics/__init__.py +17 -0
  95. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_accountRoles/__init__.py +17 -0
  96. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_accountSnapshot/__init__.py +17 -0
  97. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_admin/__init__.py +17 -0
  98. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_admins/__init__.py +17 -0
  99. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_appStats/__init__.py +17 -0
  100. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_appStatsTimeSeries/__init__.py +17 -0
  101. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_auditFeed/__init__.py +17 -0
  102. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_container/__init__.py +17 -0
  103. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_entityLookup/__init__.py +17 -0
  104. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_events/__init__.py +17 -0
  105. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_eventsFeed/__init__.py +17 -0
  106. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_eventsTimeSeries/__init__.py +17 -0
  107. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_hardwareManagement/__init__.py +17 -0
  108. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_licensing/__init__.py +17 -0
  109. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_policy/__init__.py +17 -0
  110. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_siteLocation/__init__.py +17 -0
  111. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_subDomains/__init__.py +17 -0
  112. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_xdr/__init__.py +37 -0
  113. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/raw/__init__.py +9 -0
  114. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/__init__.py +11 -0
  115. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/api/__init__.py +3 -0
  116. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/api/call_api.py +73 -0
  117. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/api_client.py +192 -0
  118. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/api_client_types.py +404 -0
  119. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/configuration.py +230 -0
  120. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/models/__init__.py +13 -0
  121. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/graphql_client/models/no_schema.py +71 -0
  122. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/schema/catolib.py +1004 -0
  123. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/schema/importSchema.py +60 -0
  124. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/certifi/__init__.py +4 -0
  125. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/certifi/__main__.py +12 -0
  126. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/certifi/core.py +114 -0
  127. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/certifi/py.typed +0 -0
  128. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/six.py +998 -0
  129. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/__init__.py +211 -0
  130. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/_base_connection.py +172 -0
  131. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/_collections.py +483 -0
  132. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/_request_methods.py +278 -0
  133. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/_version.py +16 -0
  134. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/connection.py +1033 -0
  135. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/connectionpool.py +1182 -0
  136. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/__init__.py +0 -0
  137. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/__init__.py +16 -0
  138. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/connection.py +254 -0
  139. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/fetch.py +418 -0
  140. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/request.py +22 -0
  141. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/response.py +285 -0
  142. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/pyopenssl.py +552 -0
  143. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/socks.py +228 -0
  144. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/exceptions.py +321 -0
  145. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/fields.py +341 -0
  146. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/filepost.py +89 -0
  147. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/http2/__init__.py +53 -0
  148. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/http2/connection.py +356 -0
  149. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/http2/probe.py +87 -0
  150. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/poolmanager.py +637 -0
  151. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/py.typed +2 -0
  152. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/response.py +1265 -0
  153. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/__init__.py +42 -0
  154. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/connection.py +137 -0
  155. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/proxy.py +43 -0
  156. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/request.py +256 -0
  157. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/response.py +101 -0
  158. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/retry.py +533 -0
  159. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/ssl_.py +513 -0
  160. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/ssl_match_hostname.py +159 -0
  161. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/ssltransport.py +276 -0
  162. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/timeout.py +275 -0
  163. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/url.py +471 -0
  164. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/util.py +42 -0
  165. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/util/wait.py +124 -0
  166. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_container/__init__.py +23 -0
  167. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/mutation_sites/__init__.py +219 -0
  168. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/cato/parsers/query_container/__init__.py +17 -0
  169. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/__init__.py +2 -0
  170. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/vendor/urllib3/contrib/emscripten/__init__.py +2 -0
  171. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/Utils/clidriver.py +103 -0
  172. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +2 -0
  173. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__main__.py +11 -0
  174. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/custom/__init__.py +42 -0
  175. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/custom/customLib.py +71 -0
  176. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_admin/__init__.py +51 -0
  177. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_container/__init__.py +23 -0
  178. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_policy/__init__.py +357 -0
  179. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_site/__init__.py +219 -0
  180. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_sites/__init__.py +219 -0
  181. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/parserApiClient.py +309 -0
  182. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_accountBySubdomain/__init__.py +17 -0
  183. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_accountMetrics/__init__.py +17 -0
  184. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_accountRoles/__init__.py +17 -0
  185. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_accountSnapshot/__init__.py +17 -0
  186. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_admin/__init__.py +17 -0
  187. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_admins/__init__.py +17 -0
  188. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_appStats/__init__.py +17 -0
  189. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_appStatsTimeSeries/__init__.py +17 -0
  190. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_auditFeed/__init__.py +17 -0
  191. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_container/__init__.py +17 -0
  192. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_entityLookup/__init__.py +17 -0
  193. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_events/__init__.py +17 -0
  194. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_eventsFeed/__init__.py +17 -0
  195. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_eventsTimeSeries/__init__.py +17 -0
  196. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_hardwareManagement/__init__.py +17 -0
  197. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_licensing/__init__.py +17 -0
  198. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_policy/__init__.py +17 -0
  199. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_siteLocation/__init__.py +17 -0
  200. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_subDomains/__init__.py +17 -0
  201. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_xdr/__init__.py +37 -0
  202. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/raw/__init__.py +9 -0
  203. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/Utils/clidriver.py +103 -0
  204. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +2 -0
  205. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__main__.py +11 -0
  206. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/custom/__init__.py +42 -0
  207. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/custom/customLib.py +71 -0
  208. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_admin/__init__.py +51 -0
  209. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_container/__init__.py +23 -0
  210. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_policy/__init__.py +357 -0
  211. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_site/__init__.py +219 -0
  212. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/mutation_sites/__init__.py +219 -0
  213. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/parserApiClient.py +309 -0
  214. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_accountBySubdomain/__init__.py +17 -0
  215. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_accountMetrics/__init__.py +17 -0
  216. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_accountRoles/__init__.py +17 -0
  217. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_accountSnapshot/__init__.py +17 -0
  218. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_admin/__init__.py +17 -0
  219. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_admins/__init__.py +17 -0
  220. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_appStats/__init__.py +17 -0
  221. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_appStatsTimeSeries/__init__.py +17 -0
  222. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_auditFeed/__init__.py +17 -0
  223. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_container/__init__.py +17 -0
  224. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_entityLookup/__init__.py +17 -0
  225. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_events/__init__.py +17 -0
  226. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_eventsFeed/__init__.py +17 -0
  227. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_eventsTimeSeries/__init__.py +17 -0
  228. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_hardwareManagement/__init__.py +17 -0
  229. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_licensing/__init__.py +17 -0
  230. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_policy/__init__.py +17 -0
  231. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_siteLocation/__init__.py +17 -0
  232. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_subDomains/__init__.py +17 -0
  233. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/query_xdr/__init__.py +37 -0
  234. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/parsers/raw/__init__.py +9 -0
  235. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +1 -1
  236. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +1 -1
  237. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +1 -1
  238. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +1 -1
  239. build/lib/build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +1 -1
  240. build/lib/build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +1 -1
  241. build/lib/build/lib/build/lib/build/lib/catocli/__init__.py +1 -1
  242. build/lib/build/lib/build/lib/catocli/__init__.py +1 -1
  243. build/lib/build/lib/catocli/__init__.py +1 -1
  244. build/lib/catocli/__init__.py +1 -1
  245. catocli/__init__.py +1 -1
  246. {catocli-1.0.1.dist-info → catocli-1.0.2.dist-info}/METADATA +2 -2
  247. {catocli-1.0.1.dist-info → catocli-1.0.2.dist-info}/RECORD +251 -19
  248. {catocli-1.0.1.dist-info → catocli-1.0.2.dist-info}/LICENSE +0 -0
  249. {catocli-1.0.1.dist-info → catocli-1.0.2.dist-info}/WHEEL +0 -0
  250. {catocli-1.0.1.dist-info → catocli-1.0.2.dist-info}/entry_points.txt +0 -0
  251. {catocli-1.0.1.dist-info → catocli-1.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1004 @@
1
+ #!/usr/bin/python
2
+ import datetime
3
+ import json
4
+ import ssl
5
+ import sys
6
+ import time
7
+ import urllib.parse
8
+ import urllib.request
9
+ import logging
10
+ from optparse import OptionParser
11
+ import os
12
+ import sys
13
+ import copy
14
+
15
+ api_call_count = 0
16
+ start = datetime.datetime.now()
17
+ catoApiIntrospection = {
18
+ "enums": {},
19
+ "scalars": {},
20
+ "objects": {},
21
+ "input_objects": {},
22
+ "unions": {},
23
+ "interfaces": {},
24
+ "unknowns": {}
25
+ }
26
+ catoApiSchema = {
27
+ "query": {},
28
+ "mutation": {}
29
+ }
30
+
31
+ def initParser():
32
+ if "CATO_TOKEN" not in os.environ:
33
+ print("Missing authentication, please set the CATO_TOKEN environment variable with your api key.")
34
+ exit()
35
+
36
+ # Process options
37
+ parser = OptionParser()
38
+ parser.add_option("-I", dest="ID", help="Account ID")
39
+ parser.add_option("-P", dest="prettify", action="store_true", help="Prettify output")
40
+ parser.add_option("-p", dest="print_entities", action="store_true", help="Print entity records")
41
+ parser.add_option("-v", dest="verbose", action="store_true", help="Print debug info")
42
+ (options, args) = parser.parse_args()
43
+ options.api_key = os.getenv("CATO_TOKEN")
44
+ if options.ID is None is None:
45
+ parser.print_help()
46
+ sys.exit()
47
+ if options.verbose:
48
+ logging.getLogger().setLevel(logging.DEBUG)
49
+ else:
50
+ logging.getLogger().setLevel(logging.INFO)
51
+ return options
52
+
53
+ def loadJSON(file):
54
+ CONFIG = {}
55
+ try:
56
+ with open(file, 'r') as data:
57
+ CONFIG = json.load(data)
58
+ logging.warning("Loaded "+file+" data")
59
+ return CONFIG
60
+ except:
61
+ logging.warning("File \""+file+"\" not found.")
62
+ exit()
63
+
64
+ def writeFile(fileName, data):
65
+ open(fileName, 'w+').close()
66
+ file=open(fileName,"w+")
67
+ file.write(data)
68
+
69
+ def openFile(fileName, readMode="rt"):
70
+ try:
71
+ with open(fileName, readMode) as f:
72
+ fileTxt = f.read()
73
+ f.closed
74
+ return fileTxt
75
+ except:
76
+ print('[ERROR] File path "'+fileName+'" in csv not found, or script unable to read.')
77
+ exit()
78
+
79
+ ############ parsing schema ############
80
+
81
+ def parseSchema(schema):
82
+ mutationOperationsTMP = {}
83
+ queryOperationsTMP = {}
84
+ for i, type in enumerate(schema["data"]["__schema"]["types"]):
85
+ if type["kind"] == "ENUM":
86
+ catoApiIntrospection["enums"][type["name"]] = copy.deepcopy(type)
87
+ elif type["kind"] == "SCALAR":
88
+ catoApiIntrospection["scalars"][type["name"]] = copy.deepcopy(type)
89
+ elif type["kind"] == "INPUT_OBJECT":
90
+ catoApiIntrospection["input_objects"][type["name"]] = copy.deepcopy(type)
91
+ elif type["kind"] == "INTERFACE":
92
+ catoApiIntrospection["interfaces"][type["name"]] = copy.deepcopy(type)
93
+ elif type["kind"] == "UNION":
94
+ catoApiIntrospection["unions"][type["name"]] = copy.deepcopy(type)
95
+ elif type["kind"] == "OBJECT":
96
+ if type["name"] == "Query":
97
+ for field in type["fields"]:
98
+ if field["name"] =="xdr":
99
+ queryOperationsTMP[field["name"]] = copy.deepcopy(field)
100
+ else:
101
+ catoApiSchema["query"]["query."+field["name"]] = copy.deepcopy(field)
102
+ # catoParserMapping["query"][field["name"]]
103
+ elif type["name"] == "Mutation":
104
+ for field in type["fields"]:
105
+ mutationOperationsTMP[field["name"]] = copy.deepcopy(field)
106
+ else:
107
+ catoApiIntrospection["objects"][type["name"]] = copy.deepcopy(type)
108
+
109
+ for queryType in queryOperationsTMP:
110
+ parentQueryOperationType = copy.deepcopy(queryOperationsTMP[queryType])
111
+ getChildOperations("query", parentQueryOperationType, parentQueryOperationType, "query." + queryType)
112
+
113
+ for mutationType in mutationOperationsTMP:
114
+ parentMutationOperationType = copy.deepcopy(mutationOperationsTMP[mutationType])
115
+ getChildOperations("mutation", parentMutationOperationType, parentMutationOperationType, "mutation." + mutationType)
116
+
117
+ for operationType in catoApiSchema:
118
+ for operationName in catoApiSchema[operationType]:
119
+ # if operationName=="query.xdr.stories":
120
+ childOperations = catoApiSchema[operationType][operationName]["childOperations"].keys() if "childOperations" in catoApiSchema[operationType][operationName] and catoApiSchema[operationType][operationName]!=None else []
121
+ parsedOperation = parseOperation(catoApiSchema[operationType][operationName],childOperations)
122
+ parsedOperation = getOperationArgs(parsedOperation["type"]["definition"],parsedOperation)
123
+ parsedOperation["path"] = operationName
124
+ for argName in parsedOperation["args"]:
125
+ arg = parsedOperation["args"][argName]
126
+ parsedOperation["operationArgs"][arg["varName"]] = arg
127
+ parsedOperation["variablesPayload"] = generateExampleVariables(parsedOperation)
128
+ writeFile("../models/"+operationName+".json",json.dumps(parsedOperation, indent=4, sort_keys=True))
129
+ writeFile("../queryPayloads/"+operationName+".json",json.dumps(generateGraphqlPayload(parsedOperation["variablesPayload"],parsedOperation,operationName),indent=4,sort_keys=True))
130
+ payload = generateGraphqlPayload(parsedOperation["variablesPayload"],parsedOperation,operationName)
131
+ writeFile("../queryPayloads/"+operationName+".txt",payload["query"])
132
+
133
+ def getChildOperations(operationType, curType, parentType, parentPath):
134
+ # Parse fields for nested args to map out all child operations
135
+ # This will separate fields like stories and story for query.xdr,
136
+ # and all fields which are actually sub operations from mutation.internetFirewall, etc
137
+ if "childOperations" not in parentType:
138
+ parentType["childOperations"] = {}
139
+ curOfType = None
140
+ if "kind" in curType:
141
+ curOfType = copy.deepcopy(catoApiIntrospection[curType["kind"].lower() + "s"][curType["name"]])
142
+ elif "type" in curType and curType["type"]["ofType"]==None:
143
+ curOfType = copy.deepcopy(catoApiIntrospection[curType["type"]["kind"].lower() + "s"][curType["type"]["name"]])
144
+ elif "type" in curType and curType["type"]["ofType"]["ofType"]==None:
145
+ curOfType = copy.deepcopy(catoApiIntrospection[curType["type"]["ofType"]["kind"].lower() + "s"][curType["type"]["ofType"]["name"]])
146
+ elif "type" in curType and curType["type"]["ofType"]["ofType"]["ofType"]==None:
147
+ curOfType = copy.deepcopy(catoApiIntrospection[curType["type"]["ofType"]["ofType"]["kind"].lower() + "s"][curType["type"]["ofType"]["ofType"]["name"]])
148
+ elif "type" in curType and curType["type"]["ofType"]["ofType"]["ofType"]["ofType"]==None:
149
+ curOfType = copy.deepcopy(catoApiIntrospection[curType["type"]["ofType"]["ofType"]["ofType"]["kind"].lower() + "s"][curType["type"]["ofType"]["ofType"]["ofType"]["name"]])
150
+ else:
151
+ curOfType = copy.deepcopy(catoApiIntrospection[curType["type"]["ofType"]["ofType"]["ofType"]["ofType"]["kind"].lower() + "s"][curType["type"]["ofType"]["ofType"]["ofType"]["ofType"]["name"]])
152
+ hasChildren = False
153
+
154
+ if "fields" in curOfType and curOfType["fields"] != None:
155
+ parentFields = []
156
+ for field in curOfType["fields"]:
157
+ curFieldObject = copy.deepcopy(field)
158
+ if "args" in curFieldObject and len(curFieldObject["args"])>0:
159
+ hasChildren = True
160
+ curParentType = copy.deepcopy(parentType)
161
+ curFieldObject["args"] = getNestedArgDefinitions(curFieldObject["args"], curFieldObject["name"],None,None)
162
+ curParentType["childOperations"][curFieldObject["name"]] = curFieldObject
163
+ getChildOperations(operationType, curFieldObject, curParentType, parentPath + "." + curFieldObject["name"])
164
+ if not hasChildren:
165
+ catoApiSchema[operationType][parentPath] = parentType
166
+
167
+ def getNestedArgDefinitions(argsAry, parentParamPath, childOperations, parentFields):
168
+ newArgsList = {}
169
+ for arg in argsAry:
170
+ curParamPath = arg["name"] if (parentParamPath == None or parentParamPath == "") else parentParamPath.replace("___",".") + "." + arg["name"]
171
+ if "path" in arg and '.' not in arg["path"]:
172
+ arg["child"] = True
173
+ arg["parent"] = arg["path"]
174
+ arg["type"] = getOfType(arg["type"], { "non_null": False, "kind": [], "name": None }, curParamPath, childOperations, parentFields)
175
+ arg["path"] = curParamPath
176
+ arg["id_str"] = curParamPath.replace(".","___")
177
+ if isinstance(arg["type"]["kind"], list):
178
+ arg["required"] = True if arg["type"]["kind"][0] == "NON_NULL" else False
179
+ else:
180
+ arg["required"] = True if arg["type"]["kind"] == "NON_NULL" else False
181
+ required1 = "!" if arg["required"] else ""
182
+ required2 = "!" if "NON_NULL" in arg["type"]["kind"][1:] else ""
183
+ if "SCALAR" in arg["type"]["kind"] or "ENUM" in arg["type"]["kind"]:
184
+ arg["varName"] = renderCamelCase(arg["name"])
185
+ # arg["id_str"] = arg["varName"]
186
+ else:
187
+ arg["varName"] = renderCamelCase(arg["type"]["name"])
188
+ arg["responseStr"] = arg["name"] + ":$" + arg["varName"] + " "
189
+ if "LIST" in arg["type"]["kind"]:
190
+ arg["requestStr"] = "$" + arg["varName"] + ":" + "[" + arg["type"]["name"] + required2 + "]" + required1 + " "
191
+ else:
192
+ arg["requestStr"] = "$" + arg["varName"] + ":" + arg["type"]["name"] + required1 + " "
193
+ newArgsList[arg["id_str"]] = arg
194
+ # print("getNestedArgDefinitions()",newArgsList.keys())
195
+ return newArgsList
196
+
197
+ def getOfType(curType, ofType, parentParamPath, childOperations, parentFields):
198
+ ofType["kind"].append(copy.deepcopy(curType["kind"]))
199
+ curParamPath = "" if (parentParamPath == None) else parentParamPath + "___"
200
+ if curType["ofType"] != None:
201
+ ofType = getOfType(copy.deepcopy(curType["ofType"]), ofType, parentParamPath,childOperations,parentFields)
202
+ else:
203
+ ofType["name"] = curType["name"]
204
+ parentFields = []
205
+ if "definition" in ofType and "fields" in ofType["definition"] and ofType["definition"]["fields"]!=None:
206
+ for fieldName in ofType["definition"]["fields"]:
207
+ field = ofType["definition"]["fields"][fieldName]
208
+ parentFields.append(field["name"])
209
+ if "INPUT_OBJECT" in ofType["kind"]:
210
+ ofType["indexType"] = "input_object"
211
+ ofType["definition"] = copy.deepcopy(catoApiIntrospection["input_objects"][ofType["name"]])
212
+ if ofType["definition"]["inputFields"] != None:
213
+ ofType["definition"]["inputFields"] = getNestedFieldDefinitions(copy.deepcopy(ofType["definition"]["inputFields"]), curParamPath, childOperations, parentFields)
214
+ elif "UNION" in ofType["kind"]:
215
+ ofType["indexType"] = "interface"
216
+ ofType["definition"] = copy.deepcopy(catoApiIntrospection["unions"][ofType["name"]])
217
+ if ofType["definition"]["possibleTypes"] != None:
218
+ ofType["definition"]["possibleTypes"] = getNestedInterfaceDefinitions(copy.deepcopy(ofType["definition"]["possibleTypes"]), curParamPath,childOperations, parentFields)
219
+ # strip out each nested interface attribute from parent oftype fields,
220
+ # this is to prevent duplicate fields causing the query to fail
221
+ for interfaceName in ofType["definition"]["possibleTypes"]:
222
+ possibleType = ofType["definition"]["possibleTypes"][interfaceName]
223
+ if ofType["definition"]["fields"]!=None:
224
+ for fieldName in ofType["definition"]["fields"]:
225
+ field = ofType["definition"]["fields"][fieldName]
226
+ nestedFieldPath = parentParamPath + interfaceName + "___" + field["name"]
227
+ # aliasLogic
228
+ # if field["name"] in parentFields:
229
+ # field["alias"] = renderCamelCase(interfaceName+"."+field["name"])+": "+field["name"]
230
+ # if "SCALAR" in field["type"]["kind"] or "ENUM" in field["type"]["kind"]:
231
+ # possibleType["fields"][nestedFieldPath]["alias"] = renderCamelCase(interfaceName+"."+field["name"])+": "+field["name"]
232
+ # else:
233
+ # possibleType["fields"][nestedFieldPath]["alias"] = renderCamelCase(field["type"]["name"])+": "+field["name"]
234
+ ofType["definition"]["possibleTypes"][interfaceName] = copy.deepcopy(possibleType)
235
+ elif "OBJECT" in ofType["kind"]:
236
+ ofType["indexType"] = "object"
237
+ ofType["definition"] = copy.deepcopy(catoApiIntrospection["objects"][ofType["name"]])
238
+ if ofType["definition"]["fields"] != None and childOperations!=None:
239
+ ofType["definition"]["fields"] = checkForChildOperation(copy.deepcopy(ofType["definition"]["fields"]),childOperations)
240
+ ofType["definition"]["fields"] = getNestedFieldDefinitions(copy.deepcopy(ofType["definition"]["fields"]), curParamPath,childOperations, parentFields)
241
+ if ofType["definition"]["interfaces"] != None:
242
+ ofType["definition"]["interfaces"] = getNestedInterfaceDefinitions(copy.deepcopy(ofType["definition"]["interfaces"]), curParamPath,childOperations, parentFields)
243
+ elif "INTERFACE" in ofType["kind"]:
244
+ ofType["indexType"] = "interface"
245
+ ofType["definition"] = copy.deepcopy(catoApiIntrospection["interfaces"][ofType["name"]])
246
+ if ofType["definition"]["fields"] != None:
247
+ ofType["definition"]["fields"] = getNestedFieldDefinitions(copy.deepcopy(ofType["definition"]["fields"]), curParamPath, childOperations, parentFields)
248
+ if ofType["definition"]["possibleTypes"] != None:
249
+ ofType["definition"]["possibleTypes"] = getNestedInterfaceDefinitions(copy.deepcopy(ofType["definition"]["possibleTypes"]), curParamPath, childOperations, parentFields)
250
+ for interfaceName in ofType["definition"]["possibleTypes"]:
251
+ possibleType = copy.deepcopy(ofType["definition"]["possibleTypes"][interfaceName])
252
+ for fieldName in ofType["definition"]["fields"]:
253
+ field = ofType["definition"]["fields"][fieldName]
254
+ nestedFieldPath = parentParamPath + interfaceName + "." + field["name"]
255
+ nestedFieldPath = nestedFieldPath.replace(".","___")
256
+ if "args" in field and len(field["args"])>0:
257
+ field["args"] = getNestedArgDefinitions(copy.deepcopy(field["args"]), nestedFieldPath, curParamPath, parentFields)
258
+ # aliasLogic MUST
259
+ # CatoEndpointUser
260
+ if field["name"] in possibleType["fields"] and possibleType["fields"][field["name"]] != None:
261
+ # del possibleType["fields"][field["name"]]
262
+ if "SCALAR" in field["type"]["kind"] or "ENUM" in field["type"]["kind"]:
263
+ possibleType["fields"][field["name"]]["alias"] = renderCamelCase(interfaceName+"."+field["name"])+": "+field["name"]
264
+ else:
265
+ possibleType["fields"][field["name"]]["alias"] = renderCamelCase(field["type"]["name"])+": "+field["name"]
266
+ ofType["definition"]["possibleTypes"][interfaceName] = copy.deepcopy(possibleType)
267
+ if ofType["definition"]["interfaces"] != None:
268
+ ofType["definition"]["interfaces"] = getNestedInterfaceDefinitions(copy.deepcopy(ofType["definition"]["interfaces"]), curParamPath,childOperations, parentFields)
269
+ elif "ENUM" in ofType["kind"]:
270
+ ofType["indexType"] = "enum"
271
+ ofType["definition"] = copy.deepcopy(catoApiIntrospection["enums"][ofType["name"]])
272
+ return ofType
273
+
274
+ def getNestedFieldDefinitions(fieldsAry, parentParamPath,childOperations, parentFields):
275
+ newFieldsList = {}
276
+ for field in fieldsAry:
277
+ if isinstance(field,str):
278
+ field = fieldsAry[field]
279
+ curParamPath = field["name"] if (parentParamPath == None) else (parentParamPath.replace("___",".") + field["name"])
280
+ # curParamPath = field["name"] if (parentParamPath == None) else (parentParamPath + "." + field["name"])
281
+ field["type"] = getOfType(field["type"], { "non_null": False, "kind": [], "name": None }, curParamPath,childOperations, parentFields)
282
+ field["path"] = curParamPath
283
+ field["id_str"] = curParamPath.replace(".","___")
284
+ if isinstance(field["type"]["kind"], list):
285
+ field["required"] = True if field["type"]["kind"][0] == "NON_NULL" else False
286
+ else:
287
+ field["required"] = True if field["type"]["kind"] == "NON_NULL" else False
288
+ required1 = "!" if field["required"] else ""
289
+ required2 = "!" if field["type"]["kind"][1:] == "NON_NULL" else ""
290
+ if "SCALAR" in field["type"]["kind"] or "ENUM" in field["type"]["kind"]:
291
+ field["varName"] = renderCamelCase(field["name"])
292
+ # field["id_str"] = field["varName"]
293
+ else:
294
+ field["varName"] = renderCamelCase(field["type"]["name"])
295
+ field["responseStr"] = field["name"] + ":$" + field["varName"] + " "
296
+ if "LIST" in field["type"]["kind"]:
297
+ field["requestStr"] = "$" + field["varName"] + ":" + "[" + field["type"]["name"] + required2 + "]" + required1 + " "
298
+ else:
299
+ field["requestStr"] = "$" + field["varName"] + ":" + field["type"]["name"] + required1 + " "
300
+ if "args" in field:
301
+ field["args"] = getNestedArgDefinitions(field["args"], field["name"],childOperations, parentFields)
302
+ ## aliasLogic must
303
+ if parentFields!=None and field["name"] in parentFields and "SCALAR" not in field["type"]["kind"]:
304
+ # if field["name"]=="records":
305
+ # raise ValueError('A very specific bad thing happened.')
306
+ # print(json.dumps(field,indent=2,sort_keys=True))
307
+ # print(field["path"],parentFields)
308
+ # field["alias"] = renderCamelCase(field["type"]["name"]+"."+field["name"])+": "+field["name"]
309
+ field["alias"] = renderCamelCase(field["type"]["name"]+"."+field["name"])+": "+field["name"]
310
+ if "records.fields" not in field["path"]:
311
+ newFieldsList[field["name"]] = field
312
+ # for (fieldPath in newFieldList) {
313
+ # var field = newFieldList[fieldPath];
314
+ # if (curOperationObj.fieldTypes && field.type.name != null) curOperationObj.fieldTypes[field.type.name] = true;
315
+ # field.type = getOfType(field.type, { non_null: false, kind: [], name: null }, field.path);
316
+ # }
317
+ return newFieldsList
318
+
319
+ def getNestedInterfaceDefinitions(possibleTypesAry, parentParamPath,childOperations, parentFields):
320
+ curInterfaces = {}
321
+ for possibleType in possibleTypesAry:
322
+ if "OBJECT" in possibleType["kind"]:
323
+ curInterfaces[possibleType["name"]] = copy.deepcopy(catoApiIntrospection["objects"][possibleType["name"]])
324
+ # for curInterface in curInterfaces:
325
+ # curParamPath = "" if parentParamPath == None else parentParamPath + curInterface["name"] + "___"
326
+ for curInterfaceName in curInterfaces:
327
+ curInterface = curInterfaces[curInterfaceName]
328
+ curParamPath = "" if parentParamPath == None else parentParamPath + curInterface["name"] + "___"
329
+ if "fields" in curInterface and curInterface["fields"] != None:
330
+ curInterface["fields"] = getNestedFieldDefinitions(copy.deepcopy(curInterface["fields"]), curParamPath,childOperations, parentFields)
331
+ if "inputFields" in curInterface and curInterface["inputFields"] != None:
332
+ curInterface["inputFields"] = getNestedFieldDefinitions(copy.deepcopy(curInterface["inputFields"]), curParamPath,childOperations, parentFields)
333
+ if "interfaces" in curInterface and curInterface["interfaces"] != None:
334
+ curInterface["interfaces"] = getNestedInterfaceDefinitions(copy.deepcopy(curInterface["interfaces"]), curParamPath,childOperations, parentFields)
335
+ if "possibleTypes" in curInterface and curInterface["possibleTypes"] != None:
336
+ curInterface["possibleTypes"] = getNestedInterfaceDefinitions(copy.deepcopy(curInterface["possibleTypes"]), curParamPath,childOperations, parentFields)
337
+ return curInterfaces
338
+
339
+ def parseOperation(curOperation,childOperations):
340
+ if "operationArgs" not in curOperation:
341
+ curOperation["operationArgs"] = {}
342
+ curOperation["fieldTypes"] = {}
343
+ curOfType = getOfType(curOperation["type"], { "non_null": False, "kind": [], "name": None }, None,childOperations,None)
344
+ curOperation["type"] = copy.deepcopy(curOfType)
345
+ if curOfType["name"] in catoApiIntrospection["objects"]:
346
+ curOperation["args"] = getNestedArgDefinitions(curOperation["args"], None,childOperations,None)
347
+ curOperation["type"]["definition"] = copy.deepcopy(catoApiIntrospection["objects"][curOperation["type"]["name"]])
348
+ if "fields" in curOperation["type"]["definition"] and curOperation["type"]["definition"]["fields"] != None:
349
+ # aliasLogic
350
+ # parentFields = []
351
+ # for field in curOperation["type"]["definition"]["fields"]:
352
+ # parentFields.append(field["name"])
353
+ curOperation["type"]["definition"]["fields"] = checkForChildOperation(copy.deepcopy(curOperation["type"]["definition"]["fields"]),childOperations)
354
+ curOperation["type"]["definition"]["fields"] = copy.deepcopy(getNestedFieldDefinitions(curOperation["type"]["definition"]["fields"], None,childOperations,[]))
355
+ if "inputFields" in curOperation["type"]["definition"] and curOperation["type"]["definition"]["inputFields"] != None:
356
+ parentFields = curOperation["type"]["definition"]["inputFields"].keys()
357
+ curOperation["type"]["definition"]["inputFields"] = copy.deepcopy(getNestedFieldDefinitions(curOperation["type"]["definition"]["inputFields"], None,childOperations,parentFields))
358
+ return curOperation
359
+
360
+ def checkForChildOperation(fieldsAry,childOperations):
361
+ newFieldList = {}
362
+ subOperation = False
363
+ for i, field in enumerate(fieldsAry):
364
+ if field["name"] in childOperations:
365
+ subOperation = field
366
+ newFieldList[field["name"]] = copy.deepcopy(field)
367
+ if subOperation != False:
368
+ newFieldList = {}
369
+ newFieldList[subOperation["name"]] = subOperation
370
+ return newFieldList
371
+
372
+ def getOperationArgs(curType,curOperation):
373
+ if curType.get('fields'):
374
+ for fieldName in curType["fields"]:
375
+ field = curType["fields"][fieldName]
376
+ ## aliasLogic
377
+ if "type" in field and "definition" in field["type"]:
378
+ curOperation["fieldTypes"][field["type"]["definition"]["name"]] = True
379
+ curOperation = getOperationArgs(field["type"]["definition"],curOperation)
380
+ if "args" in field:
381
+ for argName in field["args"]:
382
+ arg = field["args"][argName]
383
+ curOperation["operationArgs"][arg["varName"]] = arg
384
+ if "type" in arg and "definition" in arg["type"]:
385
+ curOperation = getOperationArgs(arg["type"]["definition"],curOperation)
386
+ if curType.get('inputFields'):
387
+ for inputFieldName in curType["inputFields"]:
388
+ inputField = curType["inputFields"][inputFieldName]
389
+ if "type" in inputField and "definition" in inputField["type"]:
390
+ curOperation["fieldTypes"][inputField["type"]["definition"]["name"]] = True
391
+ curOperation = getOperationArgs(inputField["type"]["definition"],curOperation)
392
+ if "args" in inputField:
393
+ for argName in inputField["args"]:
394
+ arg = inputField["args"][argName]
395
+ curOperation["operationArgs"][arg["varName"]] = arg
396
+ if "type" in arg and "definition" in arg["type"]:
397
+ curOperation = getOperationArgs(arg["type"]["definition"],curOperation)
398
+ if curType.get('interfaces'):
399
+ for interface in curType["interfaces"]:
400
+ if "type" in interface and "definition" in interface["type"]:
401
+ curOperation["fieldTypes"][interface["type"]["definition"]["name"]] = True
402
+ curOperation = getOperationArgs(interface["type"]["definition"],curOperation)
403
+ if "args" in interface:
404
+ for argName in interface["args"]:
405
+ arg = interface["args"][argName]
406
+ curOperation["operationArgs"][arg["varName"]] = arg
407
+ if "type" in arg and "definition" in arg["type"]:
408
+ curOperation = getOperationArgs(arg["type"]["definition"],curOperation)
409
+ if curType.get('possibleTypes'):
410
+ for possibleTypeName in curType["possibleTypes"]:
411
+ possibleType = curType["possibleTypes"][possibleTypeName]
412
+ curOperation = getOperationArgs(possibleType,curOperation)
413
+ if possibleType.get('fields'):
414
+ for fieldName in possibleType["fields"]:
415
+ field = possibleType["fields"][fieldName]
416
+ ## aliasLogic
417
+ # if "type" in curOperation and "definition" in curOperation["type"] and "fields" in curOperation["type"]["definition"] and field["name"] in curOperation["type"]["definition"]["fields"]:
418
+ # # if field["type"]["definition"]["fields"]==None or field["type"]["definition"]["inputFields"]:
419
+ # # if "SCALAR" not in field["type"]["kind"] or "ENUM" not in field["type"]["kind"]:
420
+ # field["alias"] = renderCamelCase(possibleTypeName+"."+field["name"])+": "+field["name"]
421
+ if "args" in possibleType:
422
+ for argName in possibleType["args"]:
423
+ arg = possibleType["args"][argName]
424
+ curOperation["operationArgs"][arg["varName"]] = arg
425
+ if "type" in arg and "definition" in arg["type"]:
426
+ curOperation = getOperationArgs(arg["type"]["definition"],curOperation)
427
+ return curOperation
428
+
429
+ def renderCamelCase(pathStr):
430
+ str = ""
431
+ pathAry = pathStr.split(".")
432
+ for i, path in enumerate(pathAry):
433
+ if i == 0:
434
+ str += path[0].lower() + path[1:]
435
+ else:
436
+ str += path[0].upper() + path[1:]
437
+ return str
438
+
439
+ ## Functions to create sample nested variable objects for cli arguments ##
440
+ def generateExampleVariables(operation):
441
+ variablesObj = {}
442
+ for argName in operation["operationArgs"]:
443
+ arg = operation["operationArgs"][argName]
444
+ if "SCALAR" in arg["type"]["kind"] or "ENUM" in arg["type"]["kind"]:
445
+ variablesObj[arg["name"]] = renderInputFieldVal(arg)
446
+ else:
447
+ argTD = arg["type"]["definition"]
448
+ variablesObj[arg["varName"]] = {}
449
+ if "inputFields" in argTD and argTD["inputFields"] != None:
450
+ for inputFieldName in argTD["inputFields"]:
451
+ inputField = argTD["inputFields"][inputFieldName]
452
+ variablesObj[arg["varName"]][inputField["varName"]] = parseNestedArgFields(inputField)
453
+ if "fields" in argTD and argTD["fields"] != None:
454
+ for fieldName in argTD["fields"]:
455
+ field = argTD["fields"][fieldName]
456
+ variablesObj[arg["varName"]][field["varName"]] = parseNestedArgFields(field)
457
+ if "possibleTypes" in argTD and argTD["possibleTypes"] != None:
458
+ for possibleTypeName in argTD["possibleTypes"]:
459
+ possibleType = argTD["possibleTypes"][possibleTypeName]
460
+ variablesObj[arg["varName"]][possibleType["varName"]] = parseNestedArgFields(possibleTypeName)
461
+ if "accountID" in variablesObj:
462
+ del variablesObj["accountID"]
463
+ if "accountId" in variablesObj:
464
+ del variablesObj["accountId"]
465
+ return variablesObj
466
+
467
+ def parseNestedArgFields(fieldObj):
468
+ subVariableObj = {}
469
+ if "SCALAR" in fieldObj["type"]["kind"] or "ENUM" in fieldObj["type"]["kind"]:
470
+ subVariableObj[fieldObj["name"]] = renderInputFieldVal(fieldObj)
471
+ else:
472
+ fieldTD = fieldObj["type"]["definition"]
473
+ if "inputFields" in fieldTD and fieldTD["inputFields"] != None:
474
+ for inputFieldName in fieldTD["inputFields"]:
475
+ inputField = fieldTD["inputFields"][inputFieldName]
476
+ subVariableObj[inputField["name"]] = parseNestedArgFields(inputField)
477
+ if "fields" in fieldTD and fieldTD["fields"] != None:
478
+ for fieldName in fieldTD["fields"]:
479
+ field = fieldTD["fields"][fieldName]
480
+ subVariableObj[field["name"]] = parseNestedArgFields(field)
481
+ if "possibleTypes" in fieldTD and fieldTD["possibleTypes"] != None:
482
+ for possibleTypeName in fieldTD["possibleTypes"]:
483
+ possibleType = fieldTD["possibleTypes"][possibleTypeName]
484
+ subVariableObj[possibleType["name"]] = parseNestedArgFields(possibleTypeName)
485
+ return subVariableObj
486
+
487
+ def renderInputFieldVal(arg):
488
+ value = "string"
489
+ if "SCALAR" in arg["type"]["kind"]:
490
+ if "LIST" in arg["type"]["kind"]:
491
+ value = [arg["type"]["name"]]
492
+ else:
493
+ value = arg["type"]["name"]
494
+ elif "ENUM" in arg["type"]["kind"]:
495
+ value = "enum("+arg["type"]["name"]+")"
496
+ # arg["type"]["definition"]["enumValues"][0]["name"]
497
+ return value
498
+
499
+ def writeCliDriver(catoApiSchema):
500
+ parsersIndex = {}
501
+ for operationType in catoApiSchema:
502
+ for operation in catoApiSchema[operationType]:
503
+ operationNameAry = operation.split(".")
504
+ parsersIndex[operationNameAry[0]+"_"+operationNameAry[1]] = True
505
+ parsers = list(parsersIndex.keys())
506
+ cliDriverStr = """
507
+ import os
508
+ import argparse
509
+ import json
510
+ import catocli
511
+ from graphql_client import Configuration
512
+ from graphql_client.api_client import ApiException
513
+ from ..parsers.parserApiClient import get_help
514
+ import sys
515
+ sys.path.insert(0, 'vendor')
516
+ import urllib3
517
+ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
518
+ if "CATO_TOKEN" not in os.environ:
519
+ print("Missing authentication, please set the CATO_TOKEN environment variable with your api key.")
520
+ exit()
521
+ CATO_TOKEN = os.getenv("CATO_TOKEN")
522
+ CATO_DEBUG = bool(os.getenv("CATO_DEBUG", False))
523
+ from ..parsers.raw import raw_parse
524
+ #from ..parsers.custom import custom_parse
525
+ from ..parsers.query_siteLocation import query_siteLocation_parse
526
+ """
527
+ for parserName in parsers:
528
+ cliDriverStr += "from ..parsers."+parserName+" import "+parserName+"_parse\n"
529
+
530
+ cliDriverStr += """
531
+ configuration = Configuration()
532
+ configuration.verify_ssl = False
533
+ configuration.api_key["x-api-key"] = CATO_TOKEN
534
+ configuration.host = "{}".format(catocli.__cato_host__)
535
+ configuration.debug = CATO_DEBUG
536
+ configuration.version = "{}".format(catocli.__version__)
537
+
538
+ parser = argparse.ArgumentParser(prog='catocli', usage='%(prog)s <operationType> <operationName> [options]', description="CLI for query on CATO via API.")
539
+ parser.add_argument('--version', action='version', version=catocli.__version__)
540
+ subparsers = parser.add_subparsers()
541
+ #custom_parsers = custom_parse(subparsers)
542
+ raw_parsers = subparsers.add_parser('raw', help='Raw GraphQL', usage=get_help("raw"))
543
+ raw_parser = raw_parse(raw_parsers)
544
+ query_parser = subparsers.add_parser('query', help='Query', usage='catocli query <operationName> [options]')
545
+ query_subparsers = query_parser.add_subparsers(description='valid subcommands', help='additional help')
546
+ query_siteLocation_parser = query_siteLocation_parse(query_subparsers)
547
+ mutation_parser = subparsers.add_parser('mutation', help='Mutation', usage='catocli mutation <operationName> [options]')
548
+ mutation_subparsers = mutation_parser.add_subparsers(description='valid subcommands', help='additional help')
549
+
550
+ """
551
+ for parserName in parsers:
552
+ cliDriverStr += parserName+"_parser = "+parserName+"_parse("+parserName.split("_").pop(0)+"_subparsers)\n"
553
+
554
+ cliDriverStr += """
555
+
556
+ def main(args=None):
557
+ args = parser.parse_args(args=args)
558
+ try:
559
+ response = args.func(args, configuration)
560
+
561
+ if type(response) == ApiException:
562
+ print("ERROR! Status code: {}".format(response.status))
563
+ print(response)
564
+ else:
565
+ if response!=None:
566
+ print(json.dumps(response[0], sort_keys=True, indent=4))
567
+ except AttributeError:
568
+ print('Missing arguments. Usage: catocli <operation> -h')
569
+ """
570
+ writeFile("../catocli/Utils/clidriver.py",cliDriverStr)
571
+
572
+ def writeOperationParsers(catoApiSchema):
573
+ parserMapping = {"query":{},"mutation":{}}
574
+ ## Write the raw query parser ##
575
+ cliDriverStr =f"""
576
+ from ..parserApiClient import createRawRequest, get_help
577
+
578
+ def raw_parse(raw_parser):
579
+ raw_parser.add_argument('json', help='Query, Variables and opertaionName in JSON format.')
580
+ raw_parser.add_argument('-t', const=True, default=False, nargs='?', help='Print test request preview without sending api call')
581
+ raw_parser.add_argument('-v', const=True, default=False, nargs='?', help='Verbose output')
582
+ raw_parser.add_argument('-p', const=True, default=False, nargs='?', help='Pretty print')
583
+ raw_parser.set_defaults(func=createRawRequest,operation_name='raw')
584
+ """
585
+ parserPath = "../catocli/parsers/raw"
586
+ if not os.path.exists(parserPath):
587
+ os.makedirs(parserPath)
588
+ writeFile(parserPath+"/__init__.py",cliDriverStr)
589
+
590
+ ## Write the siteLocation query parser ##
591
+ cliDriverStr =f"""
592
+ from ..parserApiClient import querySiteLocation, get_help
593
+
594
+ def query_siteLocation_parse(query_subparsers):
595
+ query_siteLocation_parser = query_subparsers.add_parser('siteLocation',
596
+ help='siteLocation local cli query',
597
+ usage=get_help("query_siteLocation"))
598
+
599
+ query_siteLocation_parser.add_argument('accountID', help='The Account ID.')
600
+ query_siteLocation_parser.add_argument('json', help='Variables in JSON format.')
601
+ query_siteLocation_parser.add_argument('-t', const=True, default=False, nargs='?',
602
+ help='Print test request preview without sending api call')
603
+ query_siteLocation_parser.add_argument('-v', const=True, default=False, nargs='?',
604
+ help='Verbose output')
605
+ query_siteLocation_parser.add_argument('-p', const=True, default=False, nargs='?',
606
+ help='Pretty print')
607
+ query_siteLocation_parser.set_defaults(func=querySiteLocation,operation_name='query.siteLocation')
608
+ """
609
+ parserPath = "../catocli/parsers/query_siteLocation"
610
+ if not os.path.exists(parserPath):
611
+ os.makedirs(parserPath)
612
+ writeFile(parserPath+"/__init__.py",cliDriverStr)
613
+
614
+
615
+
616
+ for operationType in parserMapping:
617
+ operationAry = catoApiSchema[operationType]
618
+ for operationName in operationAry:
619
+ parserMapping = getParserMapping(parserMapping,operationName,operationName,operationAry[operationName])
620
+ for operationType in parserMapping:
621
+ for operationName in parserMapping[operationType]:
622
+ parserName = operationType+"_"+operationName
623
+ parser = parserMapping[operationType][operationName]
624
+ cliDriverStr = f"""
625
+ from ..parserApiClient import createRequest, get_help
626
+
627
+ def {parserName}_parse({operationType}_subparsers):
628
+ {parserName}_parser = {operationType}_subparsers.add_parser('{operationName}',
629
+ help='{operationName}() {operationType} operation',
630
+ usage=get_help("{operationType}_{operationName}"))
631
+ """
632
+ if "path" in parser:
633
+ cliDriverStr += f"""
634
+ {parserName}_parser.add_argument('accountID', help='The Account ID.')
635
+ {parserName}_parser.add_argument('json', help='Variables in JSON format.')
636
+ {parserName}_parser.add_argument('-t', const=True, default=False, nargs='?',
637
+ help='Print test request preview without sending api call')
638
+ {parserName}_parser.add_argument('-v', const=True, default=False, nargs='?',
639
+ help='Verbose output')
640
+ {parserName}_parser.add_argument('-p', const=True, default=False, nargs='?',
641
+ help='Pretty print')
642
+ {parserName}_parser.set_defaults(func=createRequest,operation_name='{parserName.replace("_",".")}')
643
+ """
644
+ else:
645
+ cliDriverStr += renderSubParser(parser,operationType+"_"+operationName)
646
+ parserPath = "../catocli/parsers/"+parserName
647
+ if not os.path.exists(parserPath):
648
+ os.makedirs(parserPath)
649
+ writeFile(parserPath+"/__init__.py",cliDriverStr)
650
+
651
+ def renderSubParser(subParser,parentParserPath):
652
+ cliDriverStr = f"""
653
+ {parentParserPath}_subparsers = {parentParserPath}_parser.add_subparsers()
654
+ """
655
+ for subOperationName in subParser:
656
+ subOperation = subParser[subOperationName]
657
+ subParserPath = parentParserPath.replace(".","_")+"_"+subOperationName
658
+ cliDriverStr += f"""
659
+ {subParserPath}_parser = {parentParserPath}_subparsers.add_parser('{subOperationName}',
660
+ help='{subOperationName}() {parentParserPath.split('_').pop()} operation',
661
+ usage=get_help("{subParserPath}"))
662
+ """
663
+ if "path" in subOperation:
664
+ command = parentParserPath.replace("_"," ")+" "+subOperationName
665
+ cliDriverStr += f"""
666
+ {subParserPath}_parser.add_argument('accountID', help='The Account ID.')
667
+ {subParserPath}_parser.add_argument('json', help='Variables in JSON format.')
668
+ {subParserPath}_parser.add_argument('-t', const=True, default=False, nargs='?',
669
+ help='Print test request preview without sending api call')
670
+ {subParserPath}_parser.add_argument('-v', const=True, default=False, nargs='?',
671
+ help='Verbose output')
672
+ {subParserPath}_parser.add_argument('-p', const=True, default=False, nargs='?',
673
+ help='Pretty print')
674
+ {subParserPath}_parser.set_defaults(func=createRequest,operation_name='{subOperation["path"]}')
675
+ """
676
+ else:
677
+ cliDriverStr += renderSubParser(subOperation,subParserPath)
678
+ return cliDriverStr
679
+
680
+ def writeReadmes(catoApiSchema):
681
+ parserMapping = {"query":{},"mutation":{}}
682
+
683
+ ## Write the raw query readme ##
684
+ readmeStr = """
685
+ ## CATO-CLI - raw.graphql
686
+ [Click here](https://api.catonetworks.com/documentation/) for documentation on this operation.
687
+
688
+ ### Usage for raw.graphql
689
+
690
+ `catocli raw -h`
691
+
692
+ `catocli raw <json>`
693
+
694
+ `catocli raw "$(cat < rawGraphqQL.json)"`
695
+
696
+ `catocli raw '{ "query": "query operationNameHere($yourArgument:String!) { field1 field2 }", "variables": { "yourArgument": "string", "accountID": "10949" }, "operationName": "operationNameHere" } '`
697
+
698
+ `catocli raw '{ "query": "mutation operationNameHere($yourArgument:String!) { field1 field2 }", "variables": { "yourArgument": "string", "accountID": "10949" }, "operationName": "operationNameHere" } '`
699
+ """
700
+ parserPath = "../catocli/parsers/raw"
701
+ if not os.path.exists(parserPath):
702
+ os.makedirs(parserPath)
703
+ writeFile(parserPath+"/README.md",readmeStr)
704
+
705
+ ## Write the query.siteLocation readme ##
706
+ readmeStr = """
707
+
708
+ ## CATO-CLI - query.siteLocation:
709
+
710
+ ### Usage for query.siteLocation:
711
+
712
+ `catocli query siteLocation -h`
713
+
714
+ `catocli query siteLocation <accountID> <json>`
715
+
716
+ `catocli query siteLocation 12345 "$(cat < siteLocation.json)"`
717
+
718
+ `catocli query siteLocation 12345 '{"filters":[{"search": "Your city here","field":"city","operation":"exact"}]}'`
719
+
720
+ `catocli query siteLocation 12345 '{"filters":[{"search": "Your Country here","field":"countryName","operation":"startsWith"}]}'`
721
+
722
+ `catocli query siteLocation 12345 '{"filters":[{"search": "Your stateName here","field":"stateName","operation":"endsWith"}]}'`
723
+
724
+ `catocli query siteLocation 12345 '{filters:[{"search": "Your City here","field":"city","operation":"startsWith"},{"search": "Your StateName here","field":"stateName","operation":"endsWith"},{"search": "Your Country here","field":"countryName","operation":"contains"}}'`
725
+
726
+ #### Operation Arguments for query.siteLocation ####
727
+ `accountID` [ID] - (optional) Unique Identifier of Account.
728
+ `filters[]` [Array] - (optional) Array of objects consisting of `search`, `field` and `operation` attributes.
729
+ `filters[].search` [String] - (required) String to match countryName, stateName, or city specificed in `filters[].field`.
730
+ `filters[].field` [String] - (required) Specify field to match query against, defaults to look for any. Possible values: `countryName`, `stateName`, or `city`.
731
+ `filters[].operation` [string] - (required) If a field is specified, operation to match the field value. Possible values: `startsWith`,`endsWith`,`exact`, `contains`.
732
+ """
733
+ parserPath = "../catocli/parsers/query_siteLocation"
734
+ if not os.path.exists(parserPath):
735
+ os.makedirs(parserPath)
736
+ writeFile(parserPath+"/README.md",readmeStr)
737
+
738
+ for operationType in parserMapping:
739
+ operationAry = catoApiSchema[operationType]
740
+ for operationName in operationAry:
741
+ parserMapping = getParserMapping(parserMapping,operationName,operationName,operationAry[operationName])
742
+ for operationType in parserMapping:
743
+ for operationName in parserMapping[operationType]:
744
+ parserName = operationType+"_"+operationName
745
+ parser = parserMapping[operationType][operationName]
746
+ operationPath = operationType+"."+operationName
747
+ operationCmd = operationType+" "+operationName
748
+ readmeStr = f"""
749
+ ## CATO-CLI - {operationPath}:
750
+ [Click here](https://api.catonetworks.com/documentation/#{operationType}-{operationName}) for documentation on this operation.
751
+
752
+ ### Usage for {operationPath}:
753
+
754
+ `catocli {operationCmd} -h`
755
+ """
756
+ if "path" in parser:
757
+ readmeStr += f"""
758
+ `catocli {operationCmd} <accountID> <json>`
759
+
760
+ `catocli {operationCmd} 12345 "$(cat < {operationName}.json)"`
761
+
762
+ `catocli {operationCmd} 12345 '{json.dumps(parser["example"])}'`
763
+
764
+ #### Operation Arguments for {operationPath} ####
765
+ """
766
+ for argName in parser["args"]:
767
+ arg = parser["args"][argName]
768
+ readmeStr += '`'+argName+'` ['+arg["type"]+'] - '
769
+ readmeStr += '('+arg["required"]+') '+arg["description"]+' '
770
+ readmeStr += 'Default Value: '+str(arg["values"]) if len(arg["values"])>0 else ""
771
+ readmeStr += "\n"
772
+ parserPath = "../catocli/parsers/"+parserName
773
+ if not os.path.exists(parserPath):
774
+ os.makedirs(parserPath)
775
+ writeFile(parserPath+"/README.md",readmeStr)
776
+ else:
777
+ parserPath = "../catocli/parsers/"+parserName
778
+ if not os.path.exists(parserPath):
779
+ os.makedirs(parserPath)
780
+ writeFile(parserPath+"/README.md",readmeStr)
781
+ renderSubReadme(parser,operationType,operationType+"."+operationName)
782
+
783
+ def renderSubReadme(subParser,operationType,parentOperationPath):
784
+ for subOperationName in subParser:
785
+ subOperation = subParser[subOperationName]
786
+ subOperationPath = parentOperationPath+"."+subOperationName
787
+ subOperationCmd = parentOperationPath.replace("."," ")+" "+subOperationName
788
+ parserPath = "../catocli/parsers/"+subOperationPath.replace(".","_")
789
+ readmeStr = f"""
790
+ ## CATO-CLI - {parentOperationPath}.{subOperationName}:
791
+ [Click here](https://api.catonetworks.com/documentation/#{operationType}-{subOperationName}) for documentation on this operation.
792
+
793
+ ### Usage for {subOperationPath}:
794
+
795
+ `catocli {subOperationCmd} -h`
796
+ """
797
+ if "path" in subOperation:
798
+ readmeStr += f"""
799
+ `catocli {subOperationCmd} <accountID> <json>`
800
+
801
+ `catocli {subOperationCmd} 12345 "$(cat < {subOperationName}.json)"`
802
+
803
+ `catocli {subOperationCmd} 12345 '{json.dumps(subOperation["example"])}'`
804
+
805
+ #### Operation Arguments for {subOperationPath} ####
806
+ """
807
+ for argName in subOperation["args"]:
808
+ arg = subOperation["args"][argName]
809
+ readmeStr += '`'+argName+'` ['+arg["type"]+'] - '
810
+ readmeStr += '('+arg["required"]+') '+arg["description"]+' '
811
+ readmeStr += 'Default Value: '+str(arg["values"]) if len(arg["values"])>0 else ""
812
+ readmeStr += "\n"
813
+ if not os.path.exists(parserPath):
814
+ os.makedirs(parserPath)
815
+ writeFile(parserPath+"/README.md",readmeStr)
816
+ else:
817
+ if not os.path.exists(parserPath):
818
+ os.makedirs(parserPath)
819
+ writeFile(parserPath+"/README.md",readmeStr)
820
+ renderSubReadme(subOperation,operationType,subOperationPath)
821
+
822
+ def getParserMapping(curParser,curPath,operationFullPath,operation):
823
+ parserObj = {
824
+ "path":operationFullPath,
825
+ "args":{},
826
+ # "example":"N/A",
827
+ "example":operation["variablesPayload"]
828
+ }
829
+ for argName in operation["operationArgs"]:
830
+ arg = operation["operationArgs"][argName]
831
+ values = []
832
+ if "definition" in arg["type"] and "enumValues" in arg["type"]["definition"] and arg["type"]["definition"]["enumValues"]!=None:
833
+ for enumValue in arg["type"]["definition"]["enumValues"]:
834
+ values.append(enumValue["name"])
835
+ parserObj["args"][arg["varName"]] = {
836
+ "name":arg["name"],
837
+ "description":"N/A" if arg["description"]==None else arg["description"],
838
+ "type":arg["type"]["name"]+("[]" if "LIST" in arg["type"]["kind"] else ""),
839
+ "required": "required" if arg["required"]==True else "optional",
840
+ "values":values
841
+ }
842
+ pAry = curPath.split(".")
843
+ pathCount = len(curPath.split("."))
844
+ if pAry[0] not in curParser:
845
+ curParser[pAry[0]] = {}
846
+ if pathCount == 2:
847
+ curParser[pAry[0]][pAry[1]] = parserObj
848
+ else:
849
+ if pAry[1] not in curParser[pAry[0]]:
850
+ curParser[pAry[0]][pAry[1]] = {}
851
+ if pathCount == 3:
852
+ curParser[pAry[0]][pAry[1]][pAry[2]] = parserObj
853
+ else:
854
+ if pAry[2] not in curParser[pAry[0]][pAry[1]]:
855
+ curParser[pAry[0]][pAry[1]][pAry[2]] = {}
856
+ if pathCount == 4:
857
+ curParser[pAry[0]][pAry[1]][pAry[2]][pAry[3]] = parserObj
858
+ else:
859
+ if pAry[3] not in curParser[pAry[0]][pAry[1]][pAry[2]]:
860
+ curParser[pAry[0]][pAry[1]][pAry[2]][pAry[3]] = {}
861
+ if pathCount == 5:
862
+ curParser[pAry[0]][pAry[1]][pAry[2]][pAry[3]][pAry[4]] = parserObj
863
+ else:
864
+ if pAry[4] not in curParser[pAry[0]][pAry[1]][pAry[2]][pAry[3]]:
865
+ curParser[pAry[0]][pAry[1]][pAry[2]][pAry[3]][pAry[4]] = {}
866
+ if pathCount == 6:
867
+ curParser[pAry[0]][pAry[1]][pAry[2]][pAry[3]][pAry[4]][pAry[5]] = parserObj
868
+ return curParser
869
+
870
+ def send(api_key,query,variables={},operationName=None):
871
+ headers = { 'x-api-key': api_key,'Content-Type':'application/json'}
872
+ no_verify = ssl._create_unverified_context()
873
+ request = urllib.request.Request(url='https://api.catonetworks.com/api/v1/graphql2',
874
+ data=json.dumps(query).encode("ascii"),headers=headers)
875
+ response = urllib.request.urlopen(request, context=no_verify, timeout=60)
876
+ result_data = response.read()
877
+ result = json.loads(result_data)
878
+ if "errors" in result:
879
+ logging.warning(f"API error: {result_data}")
880
+ return False,result
881
+ return True,result
882
+
883
+
884
+ ################### adding functions local to generate dynamic payloads ####################
885
+ def generateGraphqlPayload(variablesObj,operation,operationName):
886
+ indent = " "
887
+ queryStr = ""
888
+ variableStr = ""
889
+ for varName in variablesObj:
890
+ if (varName in operation["operationArgs"]):
891
+ variableStr += operation["operationArgs"][varName]["requestStr"]
892
+ operationAry = operationName.split(".")
893
+ operationType = operationAry.pop(0)
894
+ queryStr = operationType + " "
895
+ queryStr += renderCamelCase(".".join(operationAry))
896
+ queryStr += " ( " + variableStr + ") {\n"
897
+ queryStr += indent + operation["name"] + " ( "
898
+ for argName in operation["args"]:
899
+ arg = operation["args"][argName]
900
+ if arg["varName"] in variablesObj:
901
+ queryStr += arg["responseStr"]
902
+ queryStr += ") {\n" + renderArgsAndFields("", variablesObj, operation, operation["type"]["definition"], " ") + " }"
903
+ queryStr += indent + "\n}";
904
+ body = {
905
+ "query":queryStr.replace("\n", " ").replace("\t", " ").replace(" ", " ").replace(" ", " ").replace(" ", " "),
906
+ "variables":variablesObj,
907
+ "operationName":renderCamelCase(".".join(operationAry)),
908
+ }
909
+ return body
910
+
911
+ def renderCamelCase(pathStr):
912
+ str = "";
913
+ pathAry = pathStr.split(".")
914
+ for i, path in enumerate(pathAry):
915
+ if i == 0:
916
+ str += path
917
+ else:
918
+ str += path[0].upper() + path[1:]
919
+ return str
920
+
921
+ def renderArgsAndFields(responseArgStr, variablesObj, curOperation, definition, indent):
922
+ for fieldName in definition['fields']:
923
+ field = definition['fields'][fieldName]
924
+ field_name = field['alias'] if 'alias' in field else field['name']
925
+ responseArgStr += indent + field_name
926
+ if field.get("args") and not isinstance(field['args'], list):
927
+ if (len(list(field['args'].keys()))>0):
928
+ argsPresent = False
929
+ argStr = " ( "
930
+ for argName in field['args']:
931
+ arg = field['args'][argName]
932
+ if arg["varName"] in variablesObj:
933
+ argStr += arg['responseStr'] + " "
934
+ argsPresent = True
935
+ argStr += ") "
936
+ if argsPresent==True:
937
+ responseArgStr += argStr
938
+ if field.get("type") and field['type'].get('definition') and field['type']['definition']['fields'] is not None:
939
+ responseArgStr += " {\n"
940
+ for subfieldIndex in field['type']['definition']['fields']:
941
+ subfield = field['type']['definition']['fields'][subfieldIndex]
942
+ subfield_name = subfield['alias'] if 'alias' in subfield else subfield['name']
943
+ responseArgStr += indent + " " + subfield_name
944
+ if subfield.get("args") and len(list(subfield["args"].keys()))>0:
945
+ argsPresent = False
946
+ subArgStr = " ( "
947
+ for argName in subfield['args']:
948
+ arg = subfield['args'][argName]
949
+ if arg["varName"] in variablesObj:
950
+ argsPresent = True
951
+ subArgStr += arg['responseStr'] + " "
952
+ subArgStr += " )"
953
+ if argsPresent==True:
954
+ responseArgStr += subArgStr
955
+ if subfield.get("type") and subfield['type'].get("definition") and (subfield['type']['definition'].get("fields") or subfield['type']['definition'].get('inputFields')):
956
+ responseArgStr += " {\n"
957
+ responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, subfield['type']['definition'], indent + " ")
958
+ if subfield['type']['definition'].get('possibleTypes'):
959
+ for possibleTypeName in subfield['type']['definition']['possibleTypes']:
960
+ possibleType = subfield['type']['definition']['possibleTypes'][possibleTypeName]
961
+ responseArgStr += indent + " ... on " + possibleType['name'] + " {\n"
962
+ if possibleType.get('fields') or possibleType.get('inputFields'):
963
+ responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, possibleType, indent + " ")
964
+ responseArgStr += indent + " }\n"
965
+ responseArgStr += indent + " }"
966
+ elif subfield.get('type') and subfield['type'].get('definition') and subfield['type']['definition'].get('possibleTypes'):
967
+ responseArgStr += " {\n"
968
+ responseArgStr += indent + " __typename\n"
969
+ for possibleTypeName in subfield['type']['definition']['possibleTypes']:
970
+ possibleType = subfield['type']['definition']['possibleTypes'][possibleTypeName]
971
+ responseArgStr += indent + " ... on " + possibleType['name'] + " {\n"
972
+ if possibleType.get('fields') or possibleType.get('inputFields'):
973
+ responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, possibleType, indent + " ")
974
+ responseArgStr += indent + " }\n"
975
+ responseArgStr += indent + " }\n"
976
+ responseArgStr += "\n"
977
+ if field['type']['definition'].get('possibleTypes'):
978
+ for possibleTypeName in field['type']['definition']['possibleTypes']:
979
+ possibleType = field['type']['definition']['possibleTypes'][possibleTypeName]
980
+ responseArgStr += indent + " ... on " + possibleType['name'] + " {\n"
981
+ if possibleType.get('fields') or possibleType.get('inputFields'):
982
+ responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, possibleType, indent + " ")
983
+ responseArgStr += indent + " }\n"
984
+ responseArgStr += indent + "}\n"
985
+ if field.get('type') and field['type'].get('definition') and field['type']['definition'].get('inputFields'):
986
+ responseArgStr += " {\n"
987
+ for subfieldName in field['type']['definition'].get('inputFields'):
988
+ subfield = field['type']['definition']['inputFields'][subfieldName]
989
+ subfield_name = subfield['alias'] if 'alias' in subfield else subfield['name']
990
+ responseArgStr += indent + " " + subfield_name
991
+ if subfield.get('type') and subfield['type'].get('definition') and (subfield['type']['definition'].get('fields') or subfield['type']['definition'].get('inputFields')):
992
+ responseArgStr += " {\n"
993
+ responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, subfield['type']['definition'], indent + " ")
994
+ responseArgStr += indent + " }\n"
995
+ if field['type']['definition'].get('possibleTypes'):
996
+ for possibleTypeName in field['type']['definition']['possibleTypes']:
997
+ possibleType = field['type']['definition']['possibleTypes'][possibleTypeName]
998
+ responseArgStr += indent + "... on " + possibleType['name'] + " {\n"
999
+ if possibleType.get('fields') or possibleType.get('inputFields'):
1000
+ responseArgStr = renderArgsAndFields(responseArgStr, variablesObj, curOperation, possibleType, indent + " ")
1001
+ responseArgStr += indent + " }\n"
1002
+ responseArgStr += indent + "}\n"
1003
+ responseArgStr += "\n"
1004
+ return responseArgStr