zscaler-sdk-python 1.0.0__py2.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.
- zscaler/__init__.py +34 -0
- zscaler/cache/__init__.py +0 -0
- zscaler/cache/cache.py +105 -0
- zscaler/cache/no_op_cache.py +68 -0
- zscaler/cache/zscaler_cache.py +161 -0
- zscaler/constants.py +26 -0
- zscaler/errors/__init__.py +0 -0
- zscaler/errors/error.py +10 -0
- zscaler/errors/http_error.py +20 -0
- zscaler/errors/zscaler_api_error.py +24 -0
- zscaler/exceptions/__init__.py +1 -0
- zscaler/exceptions/exceptions.py +101 -0
- zscaler/logger.py +57 -0
- zscaler/ratelimiter/__init__.py +0 -0
- zscaler/ratelimiter/ratelimiter.py +39 -0
- zscaler/user_agent.py +23 -0
- zscaler/utils.py +577 -0
- zscaler/zia/__init__.py +657 -0
- zscaler/zia/activate.py +52 -0
- zscaler/zia/admin_and_role_management.py +344 -0
- zscaler/zia/apptotal.py +71 -0
- zscaler/zia/audit_logs.py +95 -0
- zscaler/zia/authentication_settings.py +98 -0
- zscaler/zia/client.py +88 -0
- zscaler/zia/cloud_apps.py +406 -0
- zscaler/zia/device_management.py +90 -0
- zscaler/zia/dlp.py +784 -0
- zscaler/zia/errors.py +37 -0
- zscaler/zia/firewall.py +1104 -0
- zscaler/zia/forwarding_control.py +271 -0
- zscaler/zia/isolation_profile.py +83 -0
- zscaler/zia/labels.py +180 -0
- zscaler/zia/locations.py +661 -0
- zscaler/zia/sandbox.py +180 -0
- zscaler/zia/security.py +236 -0
- zscaler/zia/ssl_inspection.py +175 -0
- zscaler/zia/traffic.py +853 -0
- zscaler/zia/url_categories.py +442 -0
- zscaler/zia/url_filtering.py +310 -0
- zscaler/zia/users.py +386 -0
- zscaler/zia/web_dlp.py +295 -0
- zscaler/zia/workload_groups.py +58 -0
- zscaler/zia/zpa_gateway.py +187 -0
- zscaler/zpa/__init__.py +683 -0
- zscaler/zpa/app_segments.py +331 -0
- zscaler/zpa/app_segments_inspection.py +311 -0
- zscaler/zpa/app_segments_pra.py +310 -0
- zscaler/zpa/certificates.py +234 -0
- zscaler/zpa/client.py +113 -0
- zscaler/zpa/cloud_connector_groups.py +75 -0
- zscaler/zpa/connectors.py +518 -0
- zscaler/zpa/emergency_access.py +178 -0
- zscaler/zpa/errors.py +37 -0
- zscaler/zpa/idp.py +83 -0
- zscaler/zpa/inspection.py +1012 -0
- zscaler/zpa/isolation_profile.py +85 -0
- zscaler/zpa/lss.py +568 -0
- zscaler/zpa/machine_groups.py +79 -0
- zscaler/zpa/policies.py +848 -0
- zscaler/zpa/posture_profiles.py +122 -0
- zscaler/zpa/privileged_remote_access.py +862 -0
- zscaler/zpa/provisioning.py +271 -0
- zscaler/zpa/saml_attributes.py +100 -0
- zscaler/zpa/scim_attributes.py +117 -0
- zscaler/zpa/scim_groups.py +146 -0
- zscaler/zpa/segment_groups.py +191 -0
- zscaler/zpa/server_groups.py +217 -0
- zscaler/zpa/servers.py +202 -0
- zscaler/zpa/service_edges.py +404 -0
- zscaler/zpa/trusted_networks.py +127 -0
- zscaler_sdk_python-1.0.0.dist-info/LICENSE.md +21 -0
- zscaler_sdk_python-1.0.0.dist-info/METADATA +59 -0
- zscaler_sdk_python-1.0.0.dist-info/RECORD +75 -0
- zscaler_sdk_python-1.0.0.dist-info/WHEEL +6 -0
- zscaler_sdk_python-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
# Copyright (c) 2023, Zscaler Inc.
|
|
4
|
+
#
|
|
5
|
+
# Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
# purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
# copyright notice and this permission notice appear in all copies.
|
|
8
|
+
#
|
|
9
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
15
|
+
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from box import Box, BoxList
|
|
19
|
+
from requests import Response
|
|
20
|
+
|
|
21
|
+
from zscaler.utils import add_id_groups, pick_version_profile, snake_to_camel
|
|
22
|
+
from zscaler.zpa.client import ZPAClient
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ServiceEdgesAPI:
|
|
26
|
+
# Parameter names that will be reformatted to be compatible with ZPAs API
|
|
27
|
+
reformat_params = [
|
|
28
|
+
("service_edge_ids", "serviceEdges"),
|
|
29
|
+
("trusted_network_ids", "trustedNetworks"),
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
def __init__(self, client: ZPAClient):
|
|
33
|
+
self.rest = client
|
|
34
|
+
|
|
35
|
+
def list_service_edges(self, **kwargs) -> BoxList:
|
|
36
|
+
"""
|
|
37
|
+
Returns information on all configured ZPA Service Edges.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
**kwargs: Optional keyword args.
|
|
41
|
+
|
|
42
|
+
Keyword Args:
|
|
43
|
+
**max_items (int, optional):
|
|
44
|
+
The maximum number of items to request before stopping iteration.
|
|
45
|
+
**max_pages (int, optional):
|
|
46
|
+
The maximum number of pages to request before stopping iteration.
|
|
47
|
+
**pagesize (int, optional):
|
|
48
|
+
Specifies the page size. The default size is 100, but the maximum size is 1000.
|
|
49
|
+
**search (str, optional):
|
|
50
|
+
The search string used to match against a department's name or comments attributes.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
:obj:`BoxList`: List containing information on all configured ZPA Service Edges.
|
|
54
|
+
|
|
55
|
+
Examples:
|
|
56
|
+
>>> for service_edge in zpa.service_edges.list_service_edges():
|
|
57
|
+
... print(service_edge)
|
|
58
|
+
|
|
59
|
+
"""
|
|
60
|
+
list, _ = self.rest.get_paginated_data(
|
|
61
|
+
path="/serviceEdge", **kwargs, api_version="v1"
|
|
62
|
+
)
|
|
63
|
+
return list
|
|
64
|
+
|
|
65
|
+
def get_service_edge(self, service_edge_id: str) -> Box:
|
|
66
|
+
"""
|
|
67
|
+
Returns information on the specified Service Edge.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
service_edge_id (str): The unique id of the ZPA Service Edge.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
:obj:`Box`: The Service Edge resource record.
|
|
74
|
+
|
|
75
|
+
Examples:
|
|
76
|
+
>>> service_edge = zpa.service_edges.get_service_edge('999999')
|
|
77
|
+
|
|
78
|
+
"""
|
|
79
|
+
response = self.rest.get("/serviceEdge/%s" % (service_edge_id))
|
|
80
|
+
if isinstance(response, Response):
|
|
81
|
+
status_code = response.status_code
|
|
82
|
+
if status_code != 200:
|
|
83
|
+
return None
|
|
84
|
+
return response
|
|
85
|
+
|
|
86
|
+
def get_service_edge_by_name(self, name):
|
|
87
|
+
apps = self.list_service_edges()
|
|
88
|
+
for app in apps:
|
|
89
|
+
if app.get("name") == name:
|
|
90
|
+
return app
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
def update_service_edge(self, service_edge_id: str, **kwargs) -> Box:
|
|
94
|
+
"""
|
|
95
|
+
Updates the specified ZPA Service Edge.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
service_edge_id (str): The unique id of the Service Edge that will be updated in ZPA.
|
|
99
|
+
**kwargs: Optional keyword args.
|
|
100
|
+
|
|
101
|
+
Keyword Args:
|
|
102
|
+
**description (str): Additional information about the Service Edge.
|
|
103
|
+
**enabled (bool): Enable the Service Edge. Defaults to ``True``.
|
|
104
|
+
**name (str): The name of the Service Edge in ZPA.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
:obj:`Box`: The updated Service Edge resource record.
|
|
108
|
+
|
|
109
|
+
Examples:
|
|
110
|
+
>>> updated_service_edge = zpa.service_edge.update_service_edge('99999',
|
|
111
|
+
... description="Updated Description",
|
|
112
|
+
... name="Updated Name")
|
|
113
|
+
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
# Set payload to equal existing record
|
|
117
|
+
payload = {
|
|
118
|
+
snake_to_camel(k): v
|
|
119
|
+
for k, v in self.get_service_edge(service_edge_id).items()
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
# Add optional parameters to payload
|
|
123
|
+
for key, value in kwargs.items():
|
|
124
|
+
payload[snake_to_camel(key)] = value
|
|
125
|
+
|
|
126
|
+
# Add optional parameters to payload
|
|
127
|
+
for key, value in kwargs.items():
|
|
128
|
+
payload[snake_to_camel(key)] = value
|
|
129
|
+
|
|
130
|
+
resp = self.rest.put(
|
|
131
|
+
"/serviceEdge/%s" % (service_edge_id), json=payload
|
|
132
|
+
).status_code
|
|
133
|
+
if not isinstance(resp, Response):
|
|
134
|
+
return self.get_service_edge(service_edge_id)
|
|
135
|
+
|
|
136
|
+
def delete_service_edge(self, service_edge_id: str) -> int:
|
|
137
|
+
"""
|
|
138
|
+
Deletes the specified Service Edge from ZPA.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
service_edge_id (str): The unique id of the ZPA Service Edge that will be deleted.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
:obj:`int`: The status code of the operation.
|
|
145
|
+
|
|
146
|
+
Examples:
|
|
147
|
+
>>> zpa.service_edges.delete_service_edge('99999')
|
|
148
|
+
|
|
149
|
+
"""
|
|
150
|
+
return self.rest.delete(f"serviceEdge/{service_edge_id}").status_code
|
|
151
|
+
|
|
152
|
+
def bulk_delete_service_edges(self, service_edge_ids: list) -> int:
|
|
153
|
+
"""
|
|
154
|
+
Bulk deletes the specified Service Edges from ZPA.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
service_edge_ids (list): A list of Service Edge ids that will be deleted from ZPA.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
:obj:`int`: The status code for the operation.
|
|
161
|
+
|
|
162
|
+
Examples:
|
|
163
|
+
>>> zpa.service_edges.bulk_delete_service_edges(['99999', '88888'])
|
|
164
|
+
|
|
165
|
+
"""
|
|
166
|
+
payload = {
|
|
167
|
+
"ids": service_edge_ids,
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return self.rest.post("connector/bulkDelete", json=payload).status_code
|
|
171
|
+
|
|
172
|
+
def list_service_edge_groups(self, **kwargs) -> BoxList:
|
|
173
|
+
"""
|
|
174
|
+
Returns information on all configured Service Edge Groups in ZPA.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
**kwargs: Optional keyword args.
|
|
178
|
+
|
|
179
|
+
Keyword Args:
|
|
180
|
+
**max_items (int, optional):
|
|
181
|
+
The maximum number of items to request before stopping iteration.
|
|
182
|
+
**max_pages (int, optional):
|
|
183
|
+
The maximum number of pages to request before stopping iteration.
|
|
184
|
+
**pagesize (int, optional):
|
|
185
|
+
Specifies the page size. The default size is 100, but the maximum size is 1000.
|
|
186
|
+
**search (str, optional):
|
|
187
|
+
The search string used to match against a department's name or comments attributes.
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
:obj:`BoxList`: A list of all ZPA Service Edge Group resource records.
|
|
191
|
+
|
|
192
|
+
Examples:
|
|
193
|
+
Print all Service Edge Groups in ZPA.
|
|
194
|
+
|
|
195
|
+
>>> for group in zpa.service_edges.list_service_edge_groups():
|
|
196
|
+
... print(group)
|
|
197
|
+
|
|
198
|
+
"""
|
|
199
|
+
list, _ = self.rest.get_paginated_data(
|
|
200
|
+
path="/serviceEdgeGroup", **kwargs, api_version="v1"
|
|
201
|
+
)
|
|
202
|
+
return list
|
|
203
|
+
|
|
204
|
+
def get_service_edge_group(self, group_id: str) -> Box:
|
|
205
|
+
"""
|
|
206
|
+
Returns information on the specified ZPA Service Edge Group.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
group_id (str): The unique id of the ZPA Service Edge Group.
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
:obj:`Box`: The specified ZPA Service Edge Group resource record.
|
|
213
|
+
|
|
214
|
+
Examples:
|
|
215
|
+
>>> group = zpa.service_edges.get_service_edge_group("99999")
|
|
216
|
+
|
|
217
|
+
"""
|
|
218
|
+
response = self.rest.get("/serviceEdgeGroup/%s" % (group_id))
|
|
219
|
+
if isinstance(response, Response):
|
|
220
|
+
status_code = response.status_code
|
|
221
|
+
if status_code != 200:
|
|
222
|
+
return None
|
|
223
|
+
return response
|
|
224
|
+
|
|
225
|
+
def get_service_edge_group_by_name(self, name):
|
|
226
|
+
groups = self.list_service_edge_groups()
|
|
227
|
+
for group in groups:
|
|
228
|
+
if group.get("name") == name:
|
|
229
|
+
return group
|
|
230
|
+
return None
|
|
231
|
+
|
|
232
|
+
def add_service_edge_group(
|
|
233
|
+
self, name: str, latitude: str, longitude: str, location: str, **kwargs
|
|
234
|
+
):
|
|
235
|
+
"""
|
|
236
|
+
Adds a new Service Edge Group to ZPA.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
latitude (str): The latitude representing the physical location of the ZPA Service Edges in this group.
|
|
240
|
+
longitude (str): The longitude representing the physical location of the ZPA Service Edges in this group.
|
|
241
|
+
location (str): The name of the physical location of the ZPA Service Edges in this group.
|
|
242
|
+
name (str): The name of the Service Edge Group.
|
|
243
|
+
**kwargs: Optional keyword args.
|
|
244
|
+
|
|
245
|
+
Keyword Args:
|
|
246
|
+
**cityCountry (str):
|
|
247
|
+
The City and Country for where the App Connectors are located. Format is:
|
|
248
|
+
|
|
249
|
+
``<City>, <Country Code>`` e.g. ``Sydney, AU``
|
|
250
|
+
**country_code (str):
|
|
251
|
+
The ISO<std> Country Code that represents the country where the App Connectors are located.
|
|
252
|
+
**enabled (bool):
|
|
253
|
+
Is the Service Edge Group enabled? Defaults to ``True``.
|
|
254
|
+
**is_public (bool):
|
|
255
|
+
Is the Service Edge publicly accessible? Defaults to ``False``.
|
|
256
|
+
**override_version_profile (bool):
|
|
257
|
+
Override the local App Connector version according to ``version_profile``. Defaults to ``False``.
|
|
258
|
+
**service_edge_ids (list):
|
|
259
|
+
A list of unique ids of ZPA Service Edges that belong to this Service Edge Group.
|
|
260
|
+
**trusted_network_ids (list):
|
|
261
|
+
A list of unique ids of Trusted Networks that are associated with this Service Edge Group.
|
|
262
|
+
**upgrade_day (str):
|
|
263
|
+
The day of the week that upgrades will be pushed to the App Connector.
|
|
264
|
+
**upgrade_time_in_secs (str):
|
|
265
|
+
The time of the day that upgrades will be pushed to the App Connector.
|
|
266
|
+
**version_profile (str):
|
|
267
|
+
The version profile to use. This will automatically set ``override_version_profile`` to True.
|
|
268
|
+
Accepted values are:
|
|
269
|
+
|
|
270
|
+
``default``, ``previous_default`` and ``new_release``
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
:obj:`Box`: The resource record of the newly created Service Edge Group.
|
|
274
|
+
|
|
275
|
+
Examples:
|
|
276
|
+
Add a new Service Edge Group for Service Edges in Sydney and set the version profile to new releases.
|
|
277
|
+
|
|
278
|
+
>>> group = zpa.service_edges.add_service_edge_group(name="My SE Group",
|
|
279
|
+
... latitude="33.8688",
|
|
280
|
+
... longitude="151.2093",
|
|
281
|
+
... location="Sydney",
|
|
282
|
+
... version_profile="new_release)
|
|
283
|
+
|
|
284
|
+
"""
|
|
285
|
+
payload = {
|
|
286
|
+
"name": name,
|
|
287
|
+
"latitude": latitude,
|
|
288
|
+
"longitude": longitude,
|
|
289
|
+
"location": location,
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
# Perform formatting on simplified params
|
|
293
|
+
add_id_groups(self.reformat_params, kwargs, payload)
|
|
294
|
+
pick_version_profile(kwargs, payload)
|
|
295
|
+
|
|
296
|
+
# Add optional parameters to payload
|
|
297
|
+
for key, value in kwargs.items():
|
|
298
|
+
payload[snake_to_camel(key)] = value
|
|
299
|
+
|
|
300
|
+
response = self.rest.post("serviceEdgeGroup", json=payload)
|
|
301
|
+
if isinstance(response, Response):
|
|
302
|
+
# this is only true when the creation failed (status code is not 2xx)
|
|
303
|
+
status_code = response.status_code
|
|
304
|
+
# Handle error response
|
|
305
|
+
raise Exception(
|
|
306
|
+
f"API call failed with status {status_code}: {response.json()}"
|
|
307
|
+
)
|
|
308
|
+
return response
|
|
309
|
+
|
|
310
|
+
def update_service_edge_group(self, group_id: str, **kwargs) -> Box:
|
|
311
|
+
"""
|
|
312
|
+
Updates the specified ZPA Service Edge Group.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
group_id (str): The unique id of the ZPA Service Edge Group that will be updated.
|
|
316
|
+
**kwargs: Optional keyword args.
|
|
317
|
+
|
|
318
|
+
Keyword Args:
|
|
319
|
+
**cityCountry (str):
|
|
320
|
+
The City and Country for where the App Connectors are located. Format is:
|
|
321
|
+
|
|
322
|
+
``<City>, <Country Code>`` e.g. ``Sydney, AU``
|
|
323
|
+
**country_code (str):
|
|
324
|
+
The ISO<std> Country Code that represents the country where the App Connectors are located.
|
|
325
|
+
**enabled (bool):
|
|
326
|
+
Is the Service Edge Group enabled? Defaults to ``True``.
|
|
327
|
+
**is_public (bool):
|
|
328
|
+
Is the Service Edge publicly accessible? Defaults to ``False``.
|
|
329
|
+
**latitude (str):
|
|
330
|
+
The latitude representing the physical location of the ZPA Service Edges in this group.
|
|
331
|
+
**longitude (str):
|
|
332
|
+
The longitude representing the physical location of the ZPA Service Edges in this group.
|
|
333
|
+
**location (str): T
|
|
334
|
+
he name of the physical location of the ZPA Service Edges in this group.
|
|
335
|
+
**name (str):
|
|
336
|
+
The name of the Service Edge Group.
|
|
337
|
+
**override_version_profile (bool):
|
|
338
|
+
Override the local App Connector version according to ``version_profile``. Defaults to ``False``.
|
|
339
|
+
**service_edge_ids (list):
|
|
340
|
+
A list of unique ids of ZPA Service Edges that belong to this Service Edge Group.
|
|
341
|
+
**trusted_network_ids (list):
|
|
342
|
+
A list of unique ids of Trusted Networks that are associated with this Service Edge Group.
|
|
343
|
+
**upgrade_day (str):
|
|
344
|
+
The day of the week that upgrades will be pushed to the Service Edges in this group.
|
|
345
|
+
**upgrade_time_in_secs (str):
|
|
346
|
+
The time of the day that upgrades will be pushed to the Service Edges in this group.
|
|
347
|
+
**version_profile (str):
|
|
348
|
+
The version profile to use. This will automatically set ``override_version_profile`` to True.
|
|
349
|
+
Accepted values are:
|
|
350
|
+
|
|
351
|
+
``default``, ``previous_default`` and ``new_release``
|
|
352
|
+
|
|
353
|
+
Returns:
|
|
354
|
+
:obj:`Box`: The updated ZPA Service Edge Group resource record.
|
|
355
|
+
|
|
356
|
+
Examples:
|
|
357
|
+
Update the name of a Service Edge Group, change the Version Profile to 'default' and the upgrade day to
|
|
358
|
+
Friday.
|
|
359
|
+
|
|
360
|
+
>>> group = zpa.service_edges.update_service_edge_group('99999',
|
|
361
|
+
... name="Updated Name",
|
|
362
|
+
... version_profile="default",
|
|
363
|
+
... upgrade_day="friday")
|
|
364
|
+
|
|
365
|
+
"""
|
|
366
|
+
# Set payload to equal existing record
|
|
367
|
+
payload = {
|
|
368
|
+
snake_to_camel(k): v
|
|
369
|
+
for k, v in self.get_service_edge_group(group_id).items()
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
# Perform formatting on simplified params
|
|
373
|
+
add_id_groups(self.reformat_params, kwargs, payload)
|
|
374
|
+
pick_version_profile(kwargs, payload)
|
|
375
|
+
|
|
376
|
+
# Add optional parameters to payload
|
|
377
|
+
for key, value in kwargs.items():
|
|
378
|
+
payload[snake_to_camel(key)] = value
|
|
379
|
+
|
|
380
|
+
# Add optional parameters to payload
|
|
381
|
+
for key, value in kwargs.items():
|
|
382
|
+
payload[snake_to_camel(key)] = value
|
|
383
|
+
|
|
384
|
+
resp = self.rest.put(f"serviceEdgeGroup/{group_id}", json=payload).status_code
|
|
385
|
+
|
|
386
|
+
# Return the object if it was updated successfully
|
|
387
|
+
if not isinstance(resp, Response):
|
|
388
|
+
return self.get_service_edge_group(group_id)
|
|
389
|
+
|
|
390
|
+
def delete_service_edge_group(self, service_edge_group_id: str) -> int:
|
|
391
|
+
"""
|
|
392
|
+
Deletes the specified Service Edge Group from ZPA.
|
|
393
|
+
|
|
394
|
+
Args:
|
|
395
|
+
service_edge_group_id (str): The unique id of the ZPA Service Edge Group.
|
|
396
|
+
|
|
397
|
+
Returns:
|
|
398
|
+
:obj:`int`: The status code for the operation.
|
|
399
|
+
|
|
400
|
+
Examples:
|
|
401
|
+
>>> zpa.service_edges.delete_service_edge_group("99999")
|
|
402
|
+
|
|
403
|
+
"""
|
|
404
|
+
return self.rest.delete(f"serviceEdgeGroup/{service_edge_group_id}").status_code
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
# Copyright (c) 2023, Zscaler Inc.
|
|
4
|
+
#
|
|
5
|
+
# Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
# purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
# copyright notice and this permission notice appear in all copies.
|
|
8
|
+
#
|
|
9
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
15
|
+
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from typing import Union
|
|
19
|
+
|
|
20
|
+
from box import Box, BoxList
|
|
21
|
+
from requests import Response
|
|
22
|
+
|
|
23
|
+
from zscaler.zpa.client import ZPAClient
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TrustedNetworksAPI:
|
|
27
|
+
def __init__(self, client: ZPAClient):
|
|
28
|
+
self.rest = client
|
|
29
|
+
|
|
30
|
+
def list_networks(self, **kwargs) -> BoxList:
|
|
31
|
+
"""
|
|
32
|
+
Returns a list of all configured trusted networks.
|
|
33
|
+
|
|
34
|
+
Keyword Args:
|
|
35
|
+
**max_items (int):
|
|
36
|
+
The maximum number of items to request before stopping iteration.
|
|
37
|
+
**max_pages (int):
|
|
38
|
+
The maximum number of pages to request before stopping iteration.
|
|
39
|
+
**pagesize (int):
|
|
40
|
+
Specifies the page size. The default size is 20, but the maximum size is 500.
|
|
41
|
+
**search (str, optional):
|
|
42
|
+
The search string used to match against features and fields.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
:obj:`BoxList`: A list of all configured trusted networks.
|
|
46
|
+
|
|
47
|
+
Examples:
|
|
48
|
+
>>> for trusted_network in zpa.trusted_networks.list_networks():
|
|
49
|
+
... pprint(trusted_network)
|
|
50
|
+
|
|
51
|
+
"""
|
|
52
|
+
list, _ = self.rest.get_paginated_data(
|
|
53
|
+
path="/network", **kwargs, api_version="v2"
|
|
54
|
+
)
|
|
55
|
+
return list
|
|
56
|
+
|
|
57
|
+
def get_network_by_name(self, name):
|
|
58
|
+
networks = self.list_networks()
|
|
59
|
+
for network in networks:
|
|
60
|
+
if network.get("name") == name:
|
|
61
|
+
return network
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
def get_network(self, network_id: str) -> Box:
|
|
65
|
+
"""
|
|
66
|
+
Returns information on the specified trusted network.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
network_id (str):
|
|
70
|
+
The unique identifier for the trusted network.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
:obj:`Box`: The resource record for the trusted network.
|
|
74
|
+
|
|
75
|
+
Examples:
|
|
76
|
+
>>> pprint(zpa.trusted_networks.get_network('99999'))
|
|
77
|
+
|
|
78
|
+
"""
|
|
79
|
+
response = self.rest.get("/network/%s" % (network_id))
|
|
80
|
+
if isinstance(response, Response):
|
|
81
|
+
status_code = response.status_code
|
|
82
|
+
if status_code != 200:
|
|
83
|
+
return None
|
|
84
|
+
return response
|
|
85
|
+
|
|
86
|
+
def get_by_network_id(self, network_id: str, **kwargs) -> Union[Box, None]:
|
|
87
|
+
"""
|
|
88
|
+
Returns the trusted network based on the networkId.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
network_id (str): The unique Network ID for the network ID.
|
|
92
|
+
|
|
93
|
+
Keyword Args:
|
|
94
|
+
**max_items (int): The maximum number of items to request before stopping iteration.
|
|
95
|
+
**max_pages (int): The maximum number of pages to request before stopping iteration.
|
|
96
|
+
**pagesize (int): Specifies the page size. The default size is 100, but the maximum size is 500.
|
|
97
|
+
**search (str, optional): The search string used to match against features and fields.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Union[Box, None]: The resource record for the trusted networks.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
page = 0
|
|
104
|
+
page_size = kwargs.get("pagesize", 100) # default page size changed to 100
|
|
105
|
+
max_pages = kwargs.get("max_pages", None)
|
|
106
|
+
|
|
107
|
+
while True:
|
|
108
|
+
params = {
|
|
109
|
+
"pagesize": page_size,
|
|
110
|
+
"page": page,
|
|
111
|
+
"search": network_id, # use the search parameter if supported
|
|
112
|
+
**kwargs,
|
|
113
|
+
}
|
|
114
|
+
networks = self.list_networks(**params)
|
|
115
|
+
|
|
116
|
+
if not networks:
|
|
117
|
+
break # exit if no more networks
|
|
118
|
+
|
|
119
|
+
for network in networks:
|
|
120
|
+
if network.get("networkId") == network_id:
|
|
121
|
+
return Box(network)
|
|
122
|
+
|
|
123
|
+
page += 1
|
|
124
|
+
if max_pages and page >= max_pages:
|
|
125
|
+
break
|
|
126
|
+
|
|
127
|
+
return None
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 [Zscaler](https://github.com/zscaler)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: zscaler-sdk-python
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Official Python SDK for the Zscaler Products
|
|
5
|
+
Home-page: https://github.com/zscaler/zscaler-sdk-python
|
|
6
|
+
Author: Zscaler, Inc.
|
|
7
|
+
Author-email: devrel@zscaler.com
|
|
8
|
+
License: MIT
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Programming Language :: Python
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
17
|
+
Requires-Python: >=3.8
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE.md
|
|
20
|
+
Requires-Dist: arrow
|
|
21
|
+
Requires-Dist: certifi
|
|
22
|
+
Requires-Dist: charset-normalizer
|
|
23
|
+
Requires-Dist: idna
|
|
24
|
+
Requires-Dist: python-box
|
|
25
|
+
Requires-Dist: python-dateutil
|
|
26
|
+
Requires-Dist: requests
|
|
27
|
+
Requires-Dist: responses
|
|
28
|
+
Requires-Dist: restfly
|
|
29
|
+
Requires-Dist: six
|
|
30
|
+
Requires-Dist: urllib3
|
|
31
|
+
Requires-Dist: flatdict
|
|
32
|
+
Requires-Dist: pyyaml
|
|
33
|
+
Requires-Dist: xmltodict
|
|
34
|
+
Requires-Dist: yarl
|
|
35
|
+
Requires-Dist: pycryptodomex
|
|
36
|
+
Requires-Dist: aenum
|
|
37
|
+
Requires-Dist: pydash
|
|
38
|
+
Requires-Dist: flake8
|
|
39
|
+
|
|
40
|
+
Zscaler SDK Python
|
|
41
|
+
===============
|
|
42
|
+
|
|
43
|
+
Zscaler SDK Python provides a uniform and easy-to-use interface for each of the Zscaler product APIs.
|
|
44
|
+
|
|
45
|
+
Getting Started
|
|
46
|
+
---------------
|
|
47
|
+
``` $ pip install zscaler ```
|
|
48
|
+
|
|
49
|
+
What you need
|
|
50
|
+
--------------------
|
|
51
|
+
|
|
52
|
+
Before you can interact with any of the Zscaler APIs, you need to generate API keys or retrieve tenancy information for each product that you are interfacing with. Once you have the requirements and you have installed Zscaler SDK Python, you're ready to go.
|
|
53
|
+
|
|
54
|
+
- [ZPA API Credentials](https://help.zscaler.com/zpa/getting-started-zpa-api)
|
|
55
|
+
- [ZIA API Credentials](https://help.zscaler.com/zia/getting-started-zia-api)
|
|
56
|
+
|
|
57
|
+
Look for our quickstart guide here!
|
|
58
|
+
- https://github.com/zscaler/zscaler-sdk-python
|
|
59
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
zscaler/__init__.py,sha256=rbfP9vyasPGXegRNb-KTUs9WL5efkAv1yfOeFNqRcko,1248
|
|
2
|
+
zscaler/constants.py,sha256=WDclU-MTk3MfJw6qZePPTuvQF7hFRy1VGGrLdFU0Ss0,738
|
|
3
|
+
zscaler/logger.py,sha256=Xfhuv1adJ0p0QknCUqw55i7HRER1Aq2JSwrBsZuA3Xw,2099
|
|
4
|
+
zscaler/user_agent.py,sha256=IDJ1OM8RqOD6V8NkU8o6U5smU-GsJyshKoMDf-94iUw,663
|
|
5
|
+
zscaler/utils.py,sha256=A_WQMA0rCGJkxLCfyfZx-xhH60S72ZwKnACyg4mlfYk,19443
|
|
6
|
+
zscaler/cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
zscaler/cache/cache.py,sha256=tsDhf-SSF6MRA68CVIyjMdjaK9XndoSPf8qRqTTXsAw,3195
|
|
8
|
+
zscaler/cache/no_op_cache.py,sha256=GxtlCSLrkDaNrsAFQvpj0QkoqwCUK1tGO8tfbrXFvU8,1485
|
|
9
|
+
zscaler/cache/zscaler_cache.py,sha256=WbUmlRqffH3hvEPpHL48vSA0zt80gODiPnMc5QI2jL4,4997
|
|
10
|
+
zscaler/errors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
+
zscaler/errors/error.py,sha256=A9W-WYfvXQShRqFZXYT_VXKYboAMMNPajtUUcPCPOrI,172
|
|
12
|
+
zscaler/errors/http_error.py,sha256=sPz9jyyb8_zd1OegNYxqwkWZfjCLsI_M-kjf2CJ5vPY,638
|
|
13
|
+
zscaler/errors/zscaler_api_error.py,sha256=NwWVbUcByW17CLqmC7855md7wduNCs1FiJMYnYuK2YU,664
|
|
14
|
+
zscaler/exceptions/__init__.py,sha256=NnbvMschucQKxWiuwtFtRQIZx2o0uwnoAmGo_YqF_-E,63
|
|
15
|
+
zscaler/exceptions/exceptions.py,sha256=G5P8eOiiOsk940_K4AwKYVZ4qYZMkX9OzMmpSGWqxB4,2025
|
|
16
|
+
zscaler/ratelimiter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
zscaler/ratelimiter/ratelimiter.py,sha256=rMWQYx9q0l-IssnkITMXceMjAkByH3oLA59JGpCOTUs,1487
|
|
18
|
+
zscaler/zia/__init__.py,sha256=OToQVbSkLs2ml892RJgIj2WpnqPtUlmsVnLhe3Ri3sg,22024
|
|
19
|
+
zscaler/zia/activate.py,sha256=YKXDK9OqbuqgLC2M7pA5VEBut60X23u948UBq7wuBn4,1535
|
|
20
|
+
zscaler/zia/admin_and_role_management.py,sha256=Zllh1Y8H0r52zXIgNLT2iPmTbrGBCzS5z7VrBveMu3o,14292
|
|
21
|
+
zscaler/zia/apptotal.py,sha256=fIKAHvKITfAE7oAQ5KF_lACswVguSNVzo7TLs2kMo1I,2372
|
|
22
|
+
zscaler/zia/audit_logs.py,sha256=HwsqfisMsrUVPRdKkIyfXMyf_gitpxrQAPtcbv2qIEA,3014
|
|
23
|
+
zscaler/zia/authentication_settings.py,sha256=C0jws_aV1A0W5PLRaIZdI6fb68-PCPG0AaxSSeuO3uQ,3184
|
|
24
|
+
zscaler/zia/client.py,sha256=ULSYnpoOa3Bl0cOXEcB3B4NcTd24LzZKpFVwYTImpeI,2754
|
|
25
|
+
zscaler/zia/cloud_apps.py,sha256=gHp0svgL5J-Vwu2QUSihJq8NDzey8rVykBC8fqiEfoU,18549
|
|
26
|
+
zscaler/zia/device_management.py,sha256=kO6ZTQwedOCKwcpO52RnF_oZRmTbvz3J8xO80jclsE8,2872
|
|
27
|
+
zscaler/zia/dlp.py,sha256=thuVfLW5datF8bTV2N4oqbI-ms2V-InmuQBJnUuXcSA,27588
|
|
28
|
+
zscaler/zia/errors.py,sha256=UyDWvN39SBImtlE6HumYLC3D7jaTQ_KtZr5DJ3dWV6E,794
|
|
29
|
+
zscaler/zia/firewall.py,sha256=ZbMVOrRM2jcOv8FYTDSIYpZaAiKtSElKjptCCwsaWs4,40386
|
|
30
|
+
zscaler/zia/forwarding_control.py,sha256=puetg5ciOXxcXd595DoVomkl3Adqd2yGggarGg2vcEc,11754
|
|
31
|
+
zscaler/zia/isolation_profile.py,sha256=fh6-FXpp00T4KzEEKzitRflprHkw9AK7vH_mdyvnOQk,2917
|
|
32
|
+
zscaler/zia/labels.py,sha256=skrusuigbeYKX-GiNEEgf-VlfZlzKuUDbpsKO3jwB_U,5865
|
|
33
|
+
zscaler/zia/locations.py,sha256=s2UQUWYW9P4mb8mqc5ENTMzmU6daOp2pUQuqMJ7KIwM,30972
|
|
34
|
+
zscaler/zia/sandbox.py,sha256=WFjQy7OmGsZcxqv9FqOpViFoa8NmbPrWROtzcxVnOGA,5796
|
|
35
|
+
zscaler/zia/security.py,sha256=tgGTE16LwUFHLEEzjiU8Q-SOvskpNijVEs2jL1vA7VY,6846
|
|
36
|
+
zscaler/zia/ssl_inspection.py,sha256=Z_BSy1zXFnsyRmrer9tu1UcvE0aLjwG86zwmcwkW7hg,5364
|
|
37
|
+
zscaler/zia/traffic.py,sha256=7pjfqiXuVT28UJkt5u1UCXnDvdrQQB8NDEl9isjZ7cw,31279
|
|
38
|
+
zscaler/zia/url_categories.py,sha256=FeiNf4wJ25e1W5F6Xak0BDiaLSRlrVeszr5CQ_0YGhk,14744
|
|
39
|
+
zscaler/zia/url_filtering.py,sha256=qr5pwJrpj4mr7Uatf13yqoRfWntYgoR-ikerODG7Zpg,14387
|
|
40
|
+
zscaler/zia/users.py,sha256=OPVNi5DXo_RSyzJb2zp-zCorhKgo6FM69DtOkjTxs-k,13841
|
|
41
|
+
zscaler/zia/web_dlp.py,sha256=smbIwJdzNjlzPxm5TyoDdu035SZShrtzlQqdnQUsobk,12436
|
|
42
|
+
zscaler/zia/workload_groups.py,sha256=kB246OyIZZEr2NEzg_xSWpKhFRsvphoIDFslJFJXrng,1897
|
|
43
|
+
zscaler/zia/zpa_gateway.py,sha256=HLa6vchAbS5O06D5qMO9OLgsSPl3gsjL5wuof1KdWJ4,6972
|
|
44
|
+
zscaler/zpa/__init__.py,sha256=bi5JrvsO_UMUDet3aaPYW8UMLN-VtL8qwwzsYy69o94,24826
|
|
45
|
+
zscaler/zpa/app_segments.py,sha256=8Wk1YAx2KBb9Mt918Xu5GV6vJvNKiwe945HdKCBXTGk,13391
|
|
46
|
+
zscaler/zpa/app_segments_inspection.py,sha256=WpEMO834XO0KOutRLKlV7f5V6tYj7rRZjL1RmYhbnuQ,12655
|
|
47
|
+
zscaler/zpa/app_segments_pra.py,sha256=J2umhfvth_JgbrDKJjfVUbXVPD0399ooStokxJOcGHY,12215
|
|
48
|
+
zscaler/zpa/certificates.py,sha256=LxtnCOY6guAcWpGJRxkrdYJ4krdEy8zaVKGLxEKeqx0,8006
|
|
49
|
+
zscaler/zpa/client.py,sha256=zYNerhB5Zw5eVsJKM4ZDKc3RXYkvWuUsdKwaE9YJ_sY,3804
|
|
50
|
+
zscaler/zpa/cloud_connector_groups.py,sha256=hl0WPu-FWjF4Qjm8EMPIw72O8EtZw7XBNiSTmv_q01c,2667
|
|
51
|
+
zscaler/zpa/connectors.py,sha256=bjnQuFl7iNxRQttPDv-Z6lnfGyskto_9NDFIcIJLS-s,20602
|
|
52
|
+
zscaler/zpa/emergency_access.py,sha256=a769aIg0d-eL7UImZfkcCIxCrO3jVuIrh35BISXfEbA,6293
|
|
53
|
+
zscaler/zpa/errors.py,sha256=Hj_ACGQTUJDJmOZXlQnpbh9kldNeX2_SLkJV1xtMI8k,844
|
|
54
|
+
zscaler/zpa/idp.py,sha256=5aWh2fzd0Mc8Ctm07IfBfy3p5i7TW4Gsq28cc_jNyMg,2764
|
|
55
|
+
zscaler/zpa/inspection.py,sha256=IvICQWanzfY5XermKr46ZnmkDkGmSd0kxp6QQ7dKihs,34889
|
|
56
|
+
zscaler/zpa/isolation_profile.py,sha256=JlrRe_S2ylOC8fqMqlsHaZNwijOF1qHFoGNC5uARj1U,3176
|
|
57
|
+
zscaler/zpa/lss.py,sha256=YW88W6CZZoHTeX7KdGSxhNabBeRpgO9dURPaTx7izTI,21471
|
|
58
|
+
zscaler/zpa/machine_groups.py,sha256=wtagZaftkxkDof-FuHvhSc0shPKSGcEK2lRdCSjF0DI,2734
|
|
59
|
+
zscaler/zpa/policies.py,sha256=6BUQFwr8XaHJoEuRq4Lt212s9vAD8eOzpJIyPunuqNc,30654
|
|
60
|
+
zscaler/zpa/posture_profiles.py,sha256=N6IZarDVV51Uk12Pk0-uTUGuHBBXYyfv2Afo-sAh0D0,4339
|
|
61
|
+
zscaler/zpa/privileged_remote_access.py,sha256=leeMigDedb4uDlGyk1oX326eWpRgGrWLnL5WBAYlDZ4,32836
|
|
62
|
+
zscaler/zpa/provisioning.py,sha256=9ydpSnYCNkk6zUxiH1nOJ8NxEIe0rWrctN8J1CT-vs4,9995
|
|
63
|
+
zscaler/zpa/saml_attributes.py,sha256=kin_p-Fw-xTM8meutJ50qByP3oXYwJo4LutVib_zEYQ,3678
|
|
64
|
+
zscaler/zpa/scim_attributes.py,sha256=3nmQg2xi1NSEKvvlGortizcTuJPgrZAW8Sx5diufHVA,4194
|
|
65
|
+
zscaler/zpa/scim_groups.py,sha256=pS_uGnj6ToenkPJqJ96yxfD-rZGLMBn1S-weDkf_748,5451
|
|
66
|
+
zscaler/zpa/segment_groups.py,sha256=PEvS0GVPuHbFsxuXRkbmsQaowKP_WkjTPwB1Usw0CPg,6215
|
|
67
|
+
zscaler/zpa/server_groups.py,sha256=zKTBIX4ZBYOecyIFjsrLexZrg8c3Px7c6QHV5_GNPRc,7858
|
|
68
|
+
zscaler/zpa/servers.py,sha256=n9JX7Re71j_aqcd9k4Q9FwTwd4WKyte-kbwfMKZXaFI,6513
|
|
69
|
+
zscaler/zpa/service_edges.py,sha256=38xjarYV-EYMeFLSWkvugHFleKLTgXiNECksIKoN82g,15606
|
|
70
|
+
zscaler/zpa/trusted_networks.py,sha256=lGEVi_NHJUkwM3SJbK4jLRSFAElBLxAnmbiJCsBRSpA,4399
|
|
71
|
+
zscaler_sdk_python-1.0.0.dist-info/LICENSE.md,sha256=PsKhqhGwHHCdmu9iI_4vmqcfXY0bJJi8rgpgGaNOhR8,1113
|
|
72
|
+
zscaler_sdk_python-1.0.0.dist-info/METADATA,sha256=qBim2EjZslqTxQtNnja6LdQSEw1Rey__Pl3-hTugvFY,1941
|
|
73
|
+
zscaler_sdk_python-1.0.0.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
|
|
74
|
+
zscaler_sdk_python-1.0.0.dist-info/top_level.txt,sha256=lqy3vKlb4AKAJL5UkTmOk6CIGGBa1WGpJIRNP-3_8Xw,8
|
|
75
|
+
zscaler_sdk_python-1.0.0.dist-info/RECORD,,
|