catocli 3.0.22__py3-none-any.whl → 3.0.24__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 (155) hide show
  1. catocli/Utils/clidriver.py +8 -8
  2. catocli/__init__.py +1 -1
  3. catocli/parsers/customParserApiClient.py +6 -2
  4. catocli/parsers/utils/export_utils.py +6 -2
  5. catocli-3.0.24.dist-info/METADATA +184 -0
  6. {catocli-3.0.22.dist-info → catocli-3.0.24.dist-info}/RECORD +154 -154
  7. models/mutation.policy.antiMalwareFileHash.addRule.json +0 -20
  8. models/mutation.policy.antiMalwareFileHash.addSection.json +0 -103
  9. models/mutation.policy.antiMalwareFileHash.createPolicyRevision.json +0 -123
  10. models/mutation.policy.antiMalwareFileHash.discardPolicyRevision.json +0 -123
  11. models/mutation.policy.antiMalwareFileHash.moveRule.json +0 -20
  12. models/mutation.policy.antiMalwareFileHash.moveSection.json +0 -103
  13. models/mutation.policy.antiMalwareFileHash.publishPolicyRevision.json +0 -123
  14. models/mutation.policy.antiMalwareFileHash.removeRule.json +0 -20
  15. models/mutation.policy.antiMalwareFileHash.removeSection.json +0 -103
  16. models/mutation.policy.antiMalwareFileHash.updatePolicy.json +0 -123
  17. models/mutation.policy.antiMalwareFileHash.updateRule.json +0 -20
  18. models/mutation.policy.antiMalwareFileHash.updateSection.json +0 -103
  19. models/mutation.policy.appTenantRestriction.addRule.json +0 -20
  20. models/mutation.policy.appTenantRestriction.addSection.json +0 -103
  21. models/mutation.policy.appTenantRestriction.createPolicyRevision.json +0 -123
  22. models/mutation.policy.appTenantRestriction.discardPolicyRevision.json +0 -123
  23. models/mutation.policy.appTenantRestriction.moveRule.json +0 -20
  24. models/mutation.policy.appTenantRestriction.moveSection.json +0 -103
  25. models/mutation.policy.appTenantRestriction.publishPolicyRevision.json +0 -123
  26. models/mutation.policy.appTenantRestriction.removeRule.json +0 -20
  27. models/mutation.policy.appTenantRestriction.removeSection.json +0 -103
  28. models/mutation.policy.appTenantRestriction.updatePolicy.json +0 -123
  29. models/mutation.policy.appTenantRestriction.updateRule.json +0 -20
  30. models/mutation.policy.appTenantRestriction.updateSection.json +0 -103
  31. models/mutation.policy.applicationControl.addRule.json +0 -20
  32. models/mutation.policy.applicationControl.addSection.json +0 -103
  33. models/mutation.policy.applicationControl.createPolicyRevision.json +0 -123
  34. models/mutation.policy.applicationControl.discardPolicyRevision.json +0 -123
  35. models/mutation.policy.applicationControl.moveRule.json +0 -20
  36. models/mutation.policy.applicationControl.moveSection.json +0 -103
  37. models/mutation.policy.applicationControl.publishPolicyRevision.json +0 -123
  38. models/mutation.policy.applicationControl.removeRule.json +0 -20
  39. models/mutation.policy.applicationControl.removeSection.json +0 -103
  40. models/mutation.policy.applicationControl.updatePolicy.json +0 -123
  41. models/mutation.policy.applicationControl.updateRule.json +0 -20
  42. models/mutation.policy.applicationControl.updateSection.json +0 -103
  43. models/mutation.policy.dynamicIpAllocation.addRule.json +0 -20
  44. models/mutation.policy.dynamicIpAllocation.addSection.json +0 -103
  45. models/mutation.policy.dynamicIpAllocation.createPolicyRevision.json +0 -123
  46. models/mutation.policy.dynamicIpAllocation.discardPolicyRevision.json +0 -123
  47. models/mutation.policy.dynamicIpAllocation.moveRule.json +0 -20
  48. models/mutation.policy.dynamicIpAllocation.moveSection.json +0 -103
  49. models/mutation.policy.dynamicIpAllocation.publishPolicyRevision.json +0 -123
  50. models/mutation.policy.dynamicIpAllocation.removeRule.json +0 -20
  51. models/mutation.policy.dynamicIpAllocation.removeSection.json +0 -103
  52. models/mutation.policy.dynamicIpAllocation.updatePolicy.json +0 -123
  53. models/mutation.policy.dynamicIpAllocation.updateRule.json +0 -20
  54. models/mutation.policy.dynamicIpAllocation.updateSection.json +0 -103
  55. models/mutation.policy.internetFirewall.addRule.json +0 -20
  56. models/mutation.policy.internetFirewall.addSection.json +0 -103
  57. models/mutation.policy.internetFirewall.createPolicyRevision.json +0 -123
  58. models/mutation.policy.internetFirewall.discardPolicyRevision.json +0 -123
  59. models/mutation.policy.internetFirewall.moveRule.json +0 -20
  60. models/mutation.policy.internetFirewall.moveSection.json +0 -103
  61. models/mutation.policy.internetFirewall.publishPolicyRevision.json +0 -123
  62. models/mutation.policy.internetFirewall.removeRule.json +0 -20
  63. models/mutation.policy.internetFirewall.removeSection.json +0 -103
  64. models/mutation.policy.internetFirewall.updatePolicy.json +0 -123
  65. models/mutation.policy.internetFirewall.updateRule.json +0 -20
  66. models/mutation.policy.internetFirewall.updateSection.json +0 -103
  67. models/mutation.policy.remotePortFwd.addRule.json +0 -20
  68. models/mutation.policy.remotePortFwd.addSection.json +0 -103
  69. models/mutation.policy.remotePortFwd.createPolicyRevision.json +0 -123
  70. models/mutation.policy.remotePortFwd.discardPolicyRevision.json +0 -123
  71. models/mutation.policy.remotePortFwd.moveRule.json +0 -20
  72. models/mutation.policy.remotePortFwd.moveSection.json +0 -103
  73. models/mutation.policy.remotePortFwd.publishPolicyRevision.json +0 -123
  74. models/mutation.policy.remotePortFwd.removeRule.json +0 -20
  75. models/mutation.policy.remotePortFwd.removeSection.json +0 -103
  76. models/mutation.policy.remotePortFwd.updatePolicy.json +0 -123
  77. models/mutation.policy.remotePortFwd.updateRule.json +0 -20
  78. models/mutation.policy.remotePortFwd.updateSection.json +0 -103
  79. models/mutation.policy.socketLan.addRule.json +0 -40
  80. models/mutation.policy.socketLan.addSection.json +0 -103
  81. models/mutation.policy.socketLan.createPolicyRevision.json +0 -143
  82. models/mutation.policy.socketLan.discardPolicyRevision.json +0 -143
  83. models/mutation.policy.socketLan.moveRule.json +0 -40
  84. models/mutation.policy.socketLan.moveSection.json +0 -103
  85. models/mutation.policy.socketLan.publishPolicyRevision.json +0 -143
  86. models/mutation.policy.socketLan.removeRule.json +0 -40
  87. models/mutation.policy.socketLan.removeSection.json +0 -103
  88. models/mutation.policy.socketLan.updatePolicy.json +0 -143
  89. models/mutation.policy.socketLan.updateRule.json +0 -40
  90. models/mutation.policy.socketLan.updateSection.json +0 -103
  91. models/mutation.policy.terminalServer.addRule.json +0 -20
  92. models/mutation.policy.terminalServer.addSection.json +0 -103
  93. models/mutation.policy.terminalServer.createPolicyRevision.json +0 -123
  94. models/mutation.policy.terminalServer.discardPolicyRevision.json +0 -123
  95. models/mutation.policy.terminalServer.moveRule.json +0 -20
  96. models/mutation.policy.terminalServer.moveSection.json +0 -103
  97. models/mutation.policy.terminalServer.publishPolicyRevision.json +0 -123
  98. models/mutation.policy.terminalServer.removeRule.json +0 -20
  99. models/mutation.policy.terminalServer.removeSection.json +0 -103
  100. models/mutation.policy.terminalServer.updatePolicy.json +0 -123
  101. models/mutation.policy.terminalServer.updateRule.json +0 -20
  102. models/mutation.policy.terminalServer.updateSection.json +0 -103
  103. models/mutation.policy.tlsInspect.addRule.json +0 -20
  104. models/mutation.policy.tlsInspect.addSection.json +0 -103
  105. models/mutation.policy.tlsInspect.createPolicyRevision.json +0 -123
  106. models/mutation.policy.tlsInspect.discardPolicyRevision.json +0 -123
  107. models/mutation.policy.tlsInspect.moveRule.json +0 -20
  108. models/mutation.policy.tlsInspect.moveSection.json +0 -103
  109. models/mutation.policy.tlsInspect.publishPolicyRevision.json +0 -123
  110. models/mutation.policy.tlsInspect.removeRule.json +0 -20
  111. models/mutation.policy.tlsInspect.removeSection.json +0 -103
  112. models/mutation.policy.tlsInspect.updatePolicy.json +0 -123
  113. models/mutation.policy.tlsInspect.updateRule.json +0 -20
  114. models/mutation.policy.tlsInspect.updateSection.json +0 -103
  115. models/mutation.policy.wanFirewall.addRule.json +0 -20
  116. models/mutation.policy.wanFirewall.addSection.json +0 -103
  117. models/mutation.policy.wanFirewall.createPolicyRevision.json +0 -123
  118. models/mutation.policy.wanFirewall.discardPolicyRevision.json +0 -123
  119. models/mutation.policy.wanFirewall.moveRule.json +0 -20
  120. models/mutation.policy.wanFirewall.moveSection.json +0 -103
  121. models/mutation.policy.wanFirewall.publishPolicyRevision.json +0 -123
  122. models/mutation.policy.wanFirewall.removeRule.json +0 -20
  123. models/mutation.policy.wanFirewall.removeSection.json +0 -103
  124. models/mutation.policy.wanFirewall.updatePolicy.json +0 -123
  125. models/mutation.policy.wanFirewall.updateRule.json +0 -20
  126. models/mutation.policy.wanFirewall.updateSection.json +0 -103
  127. models/mutation.policy.wanNetwork.addRule.json +0 -20
  128. models/mutation.policy.wanNetwork.addSection.json +0 -103
  129. models/mutation.policy.wanNetwork.createPolicyRevision.json +0 -123
  130. models/mutation.policy.wanNetwork.discardPolicyRevision.json +0 -123
  131. models/mutation.policy.wanNetwork.moveRule.json +0 -20
  132. models/mutation.policy.wanNetwork.moveSection.json +0 -103
  133. models/mutation.policy.wanNetwork.publishPolicyRevision.json +0 -123
  134. models/mutation.policy.wanNetwork.removeRule.json +0 -20
  135. models/mutation.policy.wanNetwork.removeSection.json +0 -103
  136. models/mutation.policy.wanNetwork.updatePolicy.json +0 -123
  137. models/mutation.policy.wanNetwork.updateRule.json +0 -20
  138. models/mutation.policy.wanNetwork.updateSection.json +0 -103
  139. models/query.policy.antiMalwareFileHash.policy.json +0 -123
  140. models/query.policy.appTenantRestriction.policy.json +0 -123
  141. models/query.policy.applicationControl.policy.json +0 -123
  142. models/query.policy.dynamicIpAllocation.policy.json +0 -123
  143. models/query.policy.internetFirewall.policy.json +0 -123
  144. models/query.policy.remotePortFwd.policy.json +0 -123
  145. models/query.policy.socketLan.policy.json +0 -143
  146. models/query.policy.terminalServer.policy.json +0 -123
  147. models/query.policy.tlsInspect.policy.json +0 -123
  148. models/query.policy.wanFirewall.policy.json +0 -123
  149. models/query.policy.wanNetwork.policy.json +0 -123
  150. schema/catolib.py +64 -56
  151. catocli-3.0.22.dist-info/METADATA +0 -124
  152. {catocli-3.0.22.dist-info → catocli-3.0.24.dist-info}/WHEEL +0 -0
  153. {catocli-3.0.22.dist-info → catocli-3.0.24.dist-info}/entry_points.txt +0 -0
  154. {catocli-3.0.22.dist-info → catocli-3.0.24.dist-info}/licenses/LICENSE +0 -0
  155. {catocli-3.0.22.dist-info → catocli-3.0.24.dist-info}/top_level.txt +0 -0
@@ -48,15 +48,15 @@ from ..parsers.query_enterpriseDirectory import query_enterpriseDirectory_parse
48
48
  from ..parsers.query_devices import query_devices_parse
49
49
  from ..parsers.query_accountSnapshot import query_accountSnapshot_parse
50
50
  from ..parsers.query_catalogs import query_catalogs_parse
51
- from ..parsers.query_xdr import query_xdr_parse
52
51
  from ..parsers.query_site import query_site_parse
53
- from ..parsers.query_policy import query_policy_parse
52
+ from ..parsers.query_xdr import query_xdr_parse
54
53
  from ..parsers.query_groups import query_groups_parse
54
+ from ..parsers.query_policy import query_policy_parse
55
55
  from ..parsers.mutation_xdr import mutation_xdr_parse
56
- from ..parsers.mutation_site import mutation_site_parse
57
- from ..parsers.mutation_sites import mutation_sites_parse
58
56
  from ..parsers.mutation_policy import mutation_policy_parse
57
+ from ..parsers.mutation_site import mutation_site_parse
59
58
  from ..parsers.mutation_container import mutation_container_parse
59
+ from ..parsers.mutation_sites import mutation_sites_parse
60
60
  from ..parsers.mutation_admin import mutation_admin_parse
61
61
  from ..parsers.mutation_accountManagement import mutation_accountManagement_parse
62
62
  from ..parsers.mutation_sandbox import mutation_sandbox_parse
@@ -183,15 +183,15 @@ query_enterpriseDirectory_parser = query_enterpriseDirectory_parse(query_subpars
183
183
  query_devices_parser = query_devices_parse(query_subparsers)
184
184
  query_accountSnapshot_parser = query_accountSnapshot_parse(query_subparsers)
185
185
  query_catalogs_parser = query_catalogs_parse(query_subparsers)
186
- query_xdr_parser = query_xdr_parse(query_subparsers)
187
186
  query_site_parser = query_site_parse(query_subparsers)
188
- query_policy_parser = query_policy_parse(query_subparsers)
187
+ query_xdr_parser = query_xdr_parse(query_subparsers)
189
188
  query_groups_parser = query_groups_parse(query_subparsers)
189
+ query_policy_parser = query_policy_parse(query_subparsers)
190
190
  mutation_xdr_parser = mutation_xdr_parse(mutation_subparsers)
191
- mutation_site_parser = mutation_site_parse(mutation_subparsers)
192
- mutation_sites_parser = mutation_sites_parse(mutation_subparsers)
193
191
  mutation_policy_parser = mutation_policy_parse(mutation_subparsers)
192
+ mutation_site_parser = mutation_site_parse(mutation_subparsers)
194
193
  mutation_container_parser = mutation_container_parse(mutation_subparsers)
194
+ mutation_sites_parser = mutation_sites_parse(mutation_subparsers)
195
195
  mutation_admin_parser = mutation_admin_parse(mutation_subparsers)
196
196
  mutation_accountManagement_parser = mutation_accountManagement_parse(mutation_subparsers)
197
197
  mutation_sandbox_parser = mutation_sandbox_parse(mutation_subparsers)
catocli/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "3.0.22"
1
+ __version__ = "3.0.24"
2
2
  __cato_host__ = "https://api.catonetworks.com/api/v1/graphql2"
@@ -350,7 +350,9 @@ def createRequest(args, configuration):
350
350
  print(f"Saved CSV report to: {output_path}")
351
351
 
352
352
  # Return structured response similar to export functions
353
- return [{"success": True, "output_file": output_path, "operation": operation_name}]
353
+ # Normalize path separators for better cross-platform display
354
+ display_path = output_path.replace(os.sep, '/')
355
+ return [{"success": True, "output_file": display_path, "operation": operation_name}]
354
356
  elif csv_output is None:
355
357
  # Formatter returned None, indicating we should fall back to raw response
356
358
  print("INFO: No processable data found, returning raw API response")
@@ -1844,7 +1846,9 @@ def createPrivateRequest(args, configuration):
1844
1846
  print(f"Saved CSV report to: {output_path}")
1845
1847
 
1846
1848
  # Return structured response similar to export functions
1847
- return [{"success": True, "output_file": output_path, "operation": csv_operation, "private_command": private_command}]
1849
+ # Normalize path separators for better cross-platform display
1850
+ display_path = output_path.replace(os.sep, '/')
1851
+ return [{"success": True, "output_file": display_path, "operation": csv_operation, "private_command": private_command}]
1848
1852
  else:
1849
1853
  print("WARNING: CSV formatter returned empty result")
1850
1854
  return response
@@ -183,9 +183,11 @@ def write_json_export(
183
183
  if verbose:
184
184
  print(f"Successfully exported data to JSON: {filepath}")
185
185
 
186
+ # Normalize path separators for better cross-platform display
187
+ display_path = filepath.replace(os.sep, '/')
186
188
  return {
187
189
  'success': True,
188
- 'output_file': filepath,
190
+ 'output_file': display_path,
189
191
  'format': 'json',
190
192
  'record_count': len(data) if isinstance(data, (list, dict)) else 1
191
193
  }
@@ -232,9 +234,11 @@ def write_csv_export(
232
234
  if verbose:
233
235
  print(f"Successfully exported {len(data)} records to CSV: {filepath}")
234
236
 
237
+ # Normalize path separators for better cross-platform display
238
+ display_path = filepath.replace(os.sep, '/')
235
239
  return {
236
240
  'success': True,
237
- 'output_file': filepath,
241
+ 'output_file': display_path,
238
242
  'format': 'csv',
239
243
  'record_count': len(data)
240
244
  }
@@ -0,0 +1,184 @@
1
+ Metadata-Version: 2.4
2
+ Name: catocli
3
+ Version: 3.0.24
4
+ Summary: Cato Networks cli wrapper for the GraphQL API.
5
+ Home-page: https://github.com/Cato-Networks/cato-cli
6
+ Author: Cato Networks
7
+ Author-email: [email protected]
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: License :: OSI Approved :: Apache Software License
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python :: 3.6
12
+ Classifier: Programming Language :: Python :: 3.7
13
+ Classifier: Programming Language :: Python :: 3.8
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Requires-Python: >=3.6
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+ Requires-Dist: urllib3
22
+ Requires-Dist: certifi
23
+ Requires-Dist: six
24
+ Dynamic: author
25
+ Dynamic: author-email
26
+ Dynamic: classifier
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: license-file
31
+ Dynamic: requires-dist
32
+ Dynamic: requires-python
33
+ Dynamic: summary
34
+
35
+ # Cato Networks GraphQL API CLI
36
+
37
+ The package provides a simple to use CLI that reflects industry standards (such as the AWS cli), and enables customers to manage Cato Networks configurations and processes via the [Cato Networks GraphQL API](https://api.catonetworks.com/api/v1/graphql2) easily integrating into configurations management, orchestration or automation frameworks to support the DevOps model.
38
+
39
+ ## Overview
40
+
41
+ CatoCLI is a command-line interface that provides access to the Cato Networks GraphQL API, enabling you to:
42
+ - Generate detailed network and security reports
43
+ - Analyze user and application activity
44
+ - Monitor network performance and events
45
+ - Export data in multiple formats (JSON, CSV)
46
+ - Automate reporting and monitoring tasks
47
+
48
+ ## Prerequisites
49
+
50
+ - Python 3.6 or higher
51
+ - CatoCLI installed (`pip3 install catocli`)
52
+ - Valid Cato Networks API token and Account ID
53
+ - Proper authentication configuration (see [Authentication Setup](#authentication-setup))
54
+
55
+ ## Installation
56
+
57
+ `pip3 install catocli`
58
+
59
+ ## Authentication Setup
60
+
61
+ Configure your CatoCLI profile before using any query operations:
62
+
63
+ ```bash
64
+ # Interactive configuration
65
+ catocli configure set
66
+
67
+ # Non-interactive configuration
68
+ catocli configure set --cato-token "your-api-token" --account-id "12345"
69
+
70
+ # List configured profiles
71
+ catocli configure list
72
+
73
+ # Show current profile
74
+ catocli configure show
75
+ ```
76
+
77
+ ### Documentation
78
+
79
+ For detailed information about profile management, see [PROFILES.md](PROFILES.md).
80
+
81
+ [CLICK HERE](https://support.catonetworks.com/hc/en-us/articles/4413280536081-Generating-API-Keys-for-the-Cato-API) to see how create an API key to authenticate.
82
+
83
+ ## Running the CLI
84
+ catocli -h
85
+ catocli query -h
86
+ catocli query entityLookup -h
87
+ catocli query entityLookup '{"type":"country"}`
88
+
89
+ // Override the accountID value as a cli argument
90
+ catocli query entityLookup -accountID=12345 '{"type":"country"}`
91
+
92
+ ## Check out run locally not as pip package
93
+ git clone git@github.com:Cato-Networks/cato-cli.git
94
+ cd cato-cli
95
+ python3 -m catocli -h
96
+
97
+ ## Query Operations
98
+
99
+ ### Core Analytics Queries
100
+
101
+ | Operation | Description | Guide |
102
+ |-----------|-------------|--------|
103
+ | [Account Metrics](./catocli_user_guide/account-metrics.md) | Network performance metrics by site, user, or interface | 📊 |
104
+ | [Application Statistics](./catocli_user_guide/app-stats.md) | User activity and application usage analysis | 📱 |
105
+ | [Application Time Series](./catocli_user_guide/app-stats-timeseries.md) | Traffic analysis over time with hourly/daily breakdowns | 📈 |
106
+ | [Events Time Series](./catocli_user_guide/events-timeseries.md) | Security events, connectivity, and threat analysis | 🔒 |
107
+ | [Socket Port Metrics](./catocli_user_guide/socket-port-metrics.md) | Socket interface performance and traffic analysis | 🔌 |
108
+ | [Socket Port Time Series](./catocli_user_guide/socket-port-timeseries.md) | Socket performance metrics over time | ⏱️ |
109
+
110
+ ### Advanced Topics
111
+
112
+ - [Common Patterns & Best Practices](./catocli_user_guide/common-patterns.md) - Output formats, time frames, filtering patterns
113
+ - [Python Integration - Windows](./catocli_user_guide/python-integration-windows.md) - Windows-specific Python automation examples
114
+ - [Python Integration - Unix/Linux/macOS](./catocli_user_guide/python-integration-unix.md) - Unix-based Python integration guide
115
+ - [SIEM Integration Guide](./catocli_user_guide/siem-integration.md) - Real-time security event streaming to SIEM platforms
116
+
117
+ ## Quick Start Examples
118
+
119
+ ### Basic Network Health Check
120
+ ```bash
121
+ # Get last hour account metrics
122
+ catocli query accountMetrics '{"timeFrame":"last.PT1H"}'
123
+ ```
124
+
125
+ ### User Activity Report (csv format)
126
+ ```bash
127
+ # Export user activity for the last month to CSV
128
+ catocli query appStats '{
129
+ "dimension": [{"fieldName": "user_name"}],
130
+ "measure": [{"aggType": "sum", "fieldName": "flows_created"}],
131
+ "timeFrame": "last.P1M"
132
+ }' -f csv --csv-filename user_activity_report.csv
133
+ ```
134
+
135
+ ### Security Events Analysis
136
+ ```bash
137
+ # Weekly security events breakdown
138
+ catocli query eventsTimeSeries '{
139
+ "buckets": 7,
140
+ "eventsFilter": [{"fieldName": "event_type", "operator": "is", "values": ["Security"]}],
141
+ "eventsMeasure": [{"aggType": "sum", "fieldName": "event_count"}],
142
+ "timeFrame": "last.P7D"
143
+ }'
144
+ ```
145
+
146
+ ## Output Formats
147
+
148
+ CatoCLI supports multiple output formats:
149
+
150
+ - **Enhanced JSON** (default): Formatted with granularity adjustments
151
+ - **Raw JSON**: Original API response with `-raw` flag
152
+ - **CSV**: Structured data export with `-f csv`
153
+ - **Custom CSV**: Named files with `--csv-filename` and `--append-timestamp`
154
+
155
+ ## Time Frame Options
156
+
157
+ Common time frame patterns:
158
+ - `last.PT1H` - Last hour
159
+ - `last.P1D` - Last day
160
+ - `last.P7D` - Last week
161
+ - `last.P1M` - Last month
162
+ - `utc.2023-02-{28/00:00:00--28/23:59:59}` - Custom UTC range
163
+
164
+ ## Getting Help
165
+
166
+ - Use `-h` or `--help` with any command for detailed usage
167
+ - Check the [Cato API Documentation](https://api.catonetworks.com/documentation/)
168
+ - Review individual operation guides linked above
169
+
170
+
171
+ This CLI is a Python 3 application and has been tested with Python 3.6 -> 3.8
172
+
173
+ ## Requirements:
174
+ python 3.6 or higher
175
+
176
+ ## Confirm your version of python if installed:
177
+ Open a terminal
178
+ Enter: python -V or python3 -V
179
+
180
+ ## Installing the correct version for environment:
181
+ https://www.python.org/downloads/
182
+
183
+
184
+