agilicus 1.251.4__py3-none-any.whl → 1.253.0__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.
agilicus/__init__.py CHANGED
@@ -19,68 +19,9 @@ from .agilicus_api import exceptions # noqa
19
19
  from . import patches # noqa
20
20
  from .pagination.pagination import get_many_entries
21
21
 
22
- ApiClient = patches.patched_api_client()
23
-
24
-
25
- def find_guid(obj: dict):
26
- guid = obj.get("id", None)
27
- if guid:
28
- return guid
29
- md = obj.get("metadata", {})
30
- guid = md.get("id", None)
31
- if guid:
32
- return guid
33
- raise Exception(f"GUID cannot be found in obj {obj}")
22
+ from .create import create_or_update, add_list_resources, AddInfo, AddResult, find_guid
34
23
 
35
-
36
- def create_or_update(
37
- obj,
38
- create_method: Callable,
39
- update_method: Callable = None,
40
- to_dict=True,
41
- guid_finder=find_guid,
42
- ) -> [dict, str]:
43
- """A helper method that handles duplicate (409)
44
- creation of objects. On 409, if the update_method is provided,
45
- it will apply a PUT on the resource to update it with
46
- the new requested data. The guid is searched for in the object
47
- returned from the 409, and this is then provided
48
- to the update method as an argument, along with the original
49
- object that should be applied.
50
- param: obj: the object to be created or updated
51
- param: create_method(obj, ...)
52
- param: update_method(guid, obj, ...)
53
- returns: tuple, the object, with the status code.
54
-
55
- Note the status code could be:
56
- 409: a duplicate, no update was performed
57
- 201: a create was succesfully made
58
- 200: a duplicate occured, and the object was updated accordingly
59
- """
60
- result = None
61
- try:
62
- result = create_method(obj)
63
- if to_dict:
64
- return result.to_dict(), 201
65
- else:
66
- return result, 201
67
- except ApiException as exc:
68
- if exc.status == 409:
69
- body = exc.body
70
- if not body:
71
- raise
72
- result = json.loads(body)
73
- if update_method:
74
- guid = guid_finder(result)
75
- if to_dict:
76
- return update_method(guid, obj).to_dict(), 200
77
- else:
78
- return update_method(guid, obj), 200
79
- else:
80
- return result, 409
81
- else:
82
- raise
83
- return result
24
+ ApiClient = patches.patched_api_client()
84
25
 
85
26
 
86
27
  def GetClient(
@@ -77,7 +77,7 @@ class ApiClient(object):
77
77
  self.default_headers[header_name] = header_value
78
78
  self.cookie = cookie
79
79
  # Set default User-Agent.
80
- self.user_agent = 'OpenAPI-Generator/1.251.4/python'
80
+ self.user_agent = 'OpenAPI-Generator/1.253.0/python'
81
81
 
82
82
  def __enter__(self):
83
83
  return self
@@ -387,7 +387,7 @@ class Configuration(object):
387
387
  "OS: {env}\n"\
388
388
  "Python Version: {pyversion}\n"\
389
389
  "Version of the API: 2024.04.11\n"\
390
- "SDK Package Version: 1.251.4".\
390
+ "SDK Package Version: 1.253.0".\
391
391
  format(env=sys.platform, pyversion=sys.version)
392
392
 
393
393
  def get_host_settings(self):
@@ -4,7 +4,7 @@ Agilicus is API-first. Modern software is controlled by other software, is open,
4
4
  The `agilicus_api` package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
5
5
 
6
6
  - API version: 2024.04.11
7
- - Package version: 1.251.4
7
+ - Package version: 1.253.0
8
8
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
9
9
  For more information, please visit [https://www.agilicus.com/api](https://www.agilicus.com/api)
10
10
 
agilicus/create.py ADDED
@@ -0,0 +1,108 @@
1
+ import json
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Callable, Optional, Any, Union
5
+ from agilicus_api import ApiException
6
+
7
+
8
+ def find_guid(obj: dict):
9
+ guid = obj.get("id", None)
10
+ if guid:
11
+ return guid
12
+ md = obj.get("metadata", {})
13
+ guid = md.get("id", None)
14
+ if guid:
15
+ return guid
16
+ raise Exception(f"GUID cannot be found in obj {obj}")
17
+
18
+
19
+ def create_or_update(
20
+ obj,
21
+ create_method: Callable,
22
+ update_method: Optional[Callable] = None,
23
+ to_dict=True,
24
+ guid_finder=find_guid,
25
+ ) -> tuple[Union[dict, object], int]:
26
+ """A helper method that handles duplicate (409)
27
+ creation of objects. On 409, if the update_method is provided,
28
+ it will apply a PUT on the resource to update it with
29
+ the new requested data. The guid is searched for in the object
30
+ returned from the 409, and this is then provided
31
+ to the update method as an argument, along with the original
32
+ object that should be applied.
33
+ param: obj: the object to be created or updated
34
+ param: create_method(obj, ...)
35
+ param: update_method(guid, obj, ...)
36
+ returns: tuple, the object, with the status code.
37
+
38
+ Note the status code could be:
39
+ 409: a duplicate, no update was performed
40
+ 201: a create was succesfully made
41
+ 200: a duplicate occured, and the object was updated accordingly
42
+ """
43
+ result = None
44
+ try:
45
+ result = create_method(obj)
46
+ if to_dict:
47
+ return result.to_dict(), 201
48
+ else:
49
+ return result, 201
50
+ except ApiException as exc:
51
+ if exc.status == 409:
52
+ body = exc.body
53
+ if not body:
54
+ raise
55
+ result = json.loads(body)
56
+ if update_method:
57
+ guid = guid_finder(result)
58
+ if to_dict:
59
+ return update_method(guid, obj).to_dict(), 200
60
+ else:
61
+ return update_method(guid, obj), 200
62
+ else:
63
+ return result, 409
64
+ else:
65
+ raise
66
+ return result
67
+
68
+
69
+ def add_list_resources(objs, add_info):
70
+ results: list[AddResult] = []
71
+ for obj in objs:
72
+ result, status = create_or_update(
73
+ obj,
74
+ add_info.create_fn,
75
+ add_info.replace_fn,
76
+ to_dict=False,
77
+ guid_finder=add_info.guid_finder,
78
+ )
79
+ results.append(
80
+ AddResult(
81
+ obj=result,
82
+ result_name=add_info.name_getter(result),
83
+ result_id=add_info.guid_finder(result),
84
+ created=status != 409,
85
+ )
86
+ )
87
+
88
+ return results
89
+
90
+
91
+ class AddInfo:
92
+ def __init__(self):
93
+ super().__init__()
94
+ self.name_getter = name_in_spec
95
+ self.guid_finder = find_guid
96
+
97
+
98
+ @dataclass
99
+ class AddResult:
100
+ obj: Any
101
+ result_name: str
102
+ created: bool
103
+ result_id: Optional[str] = None
104
+ exc: Optional[str] = None
105
+
106
+
107
+ def name_in_spec(obj):
108
+ return obj.spec.name
@@ -11,6 +11,7 @@ from agilicus import (
11
11
  PolicyTemplateInstance,
12
12
  PolicyTemplateInstanceSpec,
13
13
  MFAPolicyTemplate,
14
+ SourceInfoPolicyTemplate,
14
15
  )
15
16
 
16
17
  from ..output.table import (
@@ -132,3 +133,54 @@ def format_policy_templates(ctx, templates):
132
133
  ]
133
134
 
134
135
  return format_table(ctx, templates, columns)
136
+
137
+
138
+ def set_source_info_policy(
139
+ ctx,
140
+ name,
141
+ action,
142
+ source_subnet,
143
+ iso_country_code,
144
+ invert,
145
+ log_message=None,
146
+ label=None,
147
+ description=None,
148
+ **kwargs,
149
+ ):
150
+ org_id = get_org_from_input_or_ctx(ctx, **kwargs)
151
+
152
+ token = context.get_token(ctx)
153
+ apiclient = context.get_apiclient(ctx, token)
154
+
155
+ tmpl = SourceInfoPolicyTemplate(
156
+ action=action,
157
+ source_subnets=list(source_subnet or []),
158
+ iso_country_codes=list(iso_country_code or []),
159
+ invert=invert,
160
+ labels=[LabelName(la) for la in (label or [])],
161
+ template_type="source_info",
162
+ )
163
+
164
+ if log_message:
165
+ tmpl.log_message = log_message
166
+
167
+ spec = PolicyTemplateInstanceSpec(
168
+ org_id=org_id,
169
+ name=name,
170
+ template=tmpl,
171
+ )
172
+
173
+ if description is not None:
174
+ spec.description = description
175
+
176
+ tmpl = PolicyTemplateInstance(spec=spec)
177
+ templates_api = apiclient.policy_templates_api
178
+ resp, _ = create_or_update(
179
+ tmpl,
180
+ lambda obj: templates_api.create_policy_template_instance(obj),
181
+ lambda guid, obj: templates_api.replace_policy_template_instance(
182
+ guid, policy_template_instance=obj
183
+ ),
184
+ to_dict=False,
185
+ )
186
+ return resp
@@ -15,6 +15,21 @@ def cli_command_set_multifactor_policy(ctx, **kwargs):
15
15
  output_entry(ctx, policies.set_multifactor_policy(ctx, **kwargs).to_dict())
16
16
 
17
17
 
18
+ @click.command(name="set-source-info-policy")
19
+ @click.option("--name", required=True)
20
+ @click.option("--action", type=click.Choice(["allow", "deny"]), required=True)
21
+ @click.option("--label", multiple=True, type=str)
22
+ @click.option("--description", default=None)
23
+ @click.option("--org-id", default=None)
24
+ @click.option("--source-subnet", multiple=True, type=str)
25
+ @click.option("--iso-country-code", multiple=True, type=str)
26
+ @click.option("--log-message", default=None)
27
+ @click.option("--invert", type=bool, default=False)
28
+ @click.pass_context
29
+ def cli_command_set_source_info_policy(ctx, **kwargs):
30
+ output_entry(ctx, policies.set_source_info_policy(ctx, **kwargs).to_dict())
31
+
32
+
18
33
  @click.command(name="list-multifactor-policies")
19
34
  @click.option("--org-id", default=None)
20
35
  @click.pass_context
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: agilicus
3
- Version: 1.251.4
3
+ Version: 1.253.0
4
4
  Summary: Agilicus SDK
5
5
  Home-page: https://www.agilicus.com/
6
6
  License: MIT
@@ -2,7 +2,7 @@ agilicus/.gitignore,sha256=TyHq6BCuVrFiqgUb1QAayLxWcBseKwEOoKJTQb_-iW8,5
2
2
  agilicus/.openapi-generator/FILES,sha256=Z-r9T67MUUFuhU8dAaieYz8TdhwDztVdqJEQcs4LDB8,110119
3
3
  agilicus/.openapi-generator/VERSION,sha256=LXsIFraL1muXBEww1sZWaewc9ji87Ih3gIa04Z37RYM,14
4
4
  agilicus/.openapi-generator-ignore,sha256=pu2PTide7pJtJ-DFLzDy0cTYQJRlrB-8RRH3zGLeUds,1040
5
- agilicus/__init__.py,sha256=EiVvVQh2UNOkISQKIO2K6s_OXNB0tPFUnpIGfQa5bJQ,5037
5
+ agilicus/__init__.py,sha256=AqC7DwkeKW_DniiaZfh5nbDeDQ4E_lW3frheyfmH8Mc,3207
6
6
  agilicus/access.py,sha256=UEHHhE3cCaCjxXQDjhKxQAoUEMWandygN0d-yEIIf8A,5457
7
7
  agilicus/admin.py,sha256=oQNL_k0dyI_y4oxWtmHsEnavpesiLP0EL_cKC4ABN_4,9922
8
8
  agilicus/agilicus_api/__init__.py,sha256=vBy427pkTqJ603GbAcD8l5EB8Er_jQd3XIRSEU_eiaA,62439
@@ -71,9 +71,9 @@ agilicus/agilicus_api/api/users_api.py,sha256=UVNZwoYz6f400eh-3ePelA0ppFpflrzTxz
71
71
  agilicus/agilicus_api/api/users_api_mock.py,sha256=wA_xiqL3Pz3KjljKlsmf5NveLZS1FpbaKJHBp7QvarY,15411
72
72
  agilicus/agilicus_api/api/whoami_api.py,sha256=8CgAP5sfBwXuyfcyJRx7_0k7maRvzmos7hqqVWnhLio,7941
73
73
  agilicus/agilicus_api/api/whoami_api_mock.py,sha256=rlvZoWnMCqORMZBg7SOv6d3xp52kELdh6wXcCaIZ93w,346
74
- agilicus/agilicus_api/api_client.py,sha256=WHGVlVPU5h2Z7H3VIP9E1-PRbcOeVWGqcrgJbrDAmNQ,38845
74
+ agilicus/agilicus_api/api_client.py,sha256=KU-40S7-VmA6-MfxIJ20Qpe8xB4jELMYLKDtiy0Wtrw,38845
75
75
  agilicus/agilicus_api/apis/__init__.py,sha256=aJZD7x-umdSni6ZBr4XxzpH8pwtU9hA5LlCDxcqa1Q8,2224
76
- agilicus/agilicus_api/configuration.py,sha256=zqtUfDap0pj3Nn8V_QBhxK25G9O_nprzqQXQ7KwsS6A,18447
76
+ agilicus/agilicus_api/configuration.py,sha256=9ltB_6PTmjPj5jwILWqCCsC1pW12gG6IT5KTeeoSpzk,18447
77
77
  agilicus/agilicus_api/docs/APIKey.md,sha256=4cKuz4_l9HcEDnUrLwYbEnn9C2WoDayrjfrY1Ixgaf4,1747
78
78
  agilicus/agilicus_api/docs/APIKeyIntrospect.md,sha256=nJ-zkuFm3JMbWFDYYN_vYyQk1snGBtBvIxtCQxamhAU,1019
79
79
  agilicus/agilicus_api/docs/APIKeyIntrospectAuthorizationInfo.md,sha256=7RApOOLjvWQs5sw2jb25g7i3Kta1BiEY-s8VRXfppH8,725
@@ -2457,7 +2457,7 @@ agilicus/agilicus_api/test/test_x509_root_certificate.py,sha256=0hnwn-PQn0mBdoeS
2457
2457
  agilicus/agilicus_api/test/test_x509_root_certificate_spec.py,sha256=45tuo6GHC_4V88Zle_dFQ-0bYas412T-JRSjuBqX8Yk,2832
2458
2458
  agilicus/agilicus_api/test/test_x509_root_certificate_status.py,sha256=yY7C4F-oLokoBltUxNSUaNin3Ajjj-IexZfZtqFEmjo,2846
2459
2459
  agilicus/agilicus_api/test/test_xss_settings.py,sha256=YbRSwHp5Gbl1XK-UPKWNsbJ-bqQsFLWMWhFqrm0Ggl4,2746
2460
- agilicus/agilicus_api_README.md,sha256=TEVlJxq4uqu3MXI0gr3tbCg71ec6Krc6YAdOMqxUYtE,158240
2460
+ agilicus/agilicus_api_README.md,sha256=KUU_QPiy330-hQZpWhDBlSwfXZL6wFu4t5mj4BWLYJ8,158240
2461
2461
  agilicus/aliases.ini,sha256=MxqiVo2f2xdUDVF1YDkNW36AIqN8hrYjlTVfraEUZXY,455
2462
2462
  agilicus/amq.py,sha256=yxi-YTbJPVl10s78Hlr1dmrQR63iaSIoROGVILzFPmE,1775
2463
2463
  agilicus/apps.py,sha256=8k_tGraPUVKJURksZwKR8eNGW-4CSPv54FYcApQ3Ly8,50857
@@ -2471,6 +2471,7 @@ agilicus/click_extension.py,sha256=uE57TjMqJxO9VFPBJO5-bTo9UrQiHPjIdI_iwKSaw6Q,2
2471
2471
  agilicus/client_secrets.json,sha256=eyPFVzziH48RuwWl66cfi0JE4jpmoec0Vo_F2TzYOeI,414
2472
2472
  agilicus/connectors.py,sha256=RhnLMxQNNEgmkh9lCSQazL0uovt7lFuJJ1Eo1Wv9qqE,41229
2473
2473
  agilicus/context.py,sha256=5nf4_EZ3sEpKvhQAHn4DA0HNMotChtxlcmjbPErbNV4,7953
2474
+ agilicus/create.py,sha256=ZBZS0FmGhtBO7HUST5ljri2R786y80cDeg8sd1uJnd0,3004
2474
2475
  agilicus/credentials.py,sha256=F3yPAwoMcziP1OLmzeJ8jIz1W-91-HXu4zcymyMp1E4,4730
2475
2476
  agilicus/credentials_commands/credentials.py,sha256=YduI2SJR8nJgFuAloNowy16_s-rdVLZLDkuQvk_YmAg,3574
2476
2477
  agilicus/credentials_commands/credentials_main.py,sha256=V8Nm-WptM_3BuIcS5AGg62x0ffi_FoiKBTWzBlKooTc,2961
@@ -2520,8 +2521,8 @@ agilicus/output/tests/column_builder_test.py,sha256=fKP4V5sqXtmEIr-Q0gWVSFdBqCUt
2520
2521
  agilicus/pagination/pagination.py,sha256=hC7eLHxXKe4Iv7LdOZK3Dh8R_fKQIr9PPiWKJVyP4Nk,1672
2521
2522
  agilicus/patches.py,sha256=qTqLOgCAcFZPcPOkgfqMnK9bnqTXMvj_0ERsjRFcZug,1384
2522
2523
  agilicus/permissions.py,sha256=uB65yuDFICp1N10m0cdUjgizx9MQzAbLbAsBSTw1Rcc,2117
2523
- agilicus/policy/policies.py,sha256=Hq4t9bhJbHxdMpZUzgA-1WB5dHLyjI0zeWj33hBRy4I,3730
2524
- agilicus/policy/policy_main.py,sha256=Zjc8gir2UbCjVZOG5-Sx8HDPJ5aPlsj6VnkuRc5yXCw,1943
2524
+ agilicus/policy/policies.py,sha256=g6nuLIXpeq0fjx6zX_aKqgv8GjFC0lHmEV8t-MF26yo,5015
2525
+ agilicus/policy/policy_main.py,sha256=fQ5W3w0WulBzuAzz4Cta5xNMT030z1Wl1Vwfjmsgc8g,2615
2525
2526
  agilicus/policy/templates.py,sha256=EUvAhOhSjDuLAe2UKIFEzBp5pNpOT5y1r7uyV_GG6uI,5638
2526
2527
  agilicus/policy_config/policy_config.py,sha256=fjiyAmZ9TEGNGHQzEtLgLT7ZnPm_KgdG24oQXObsBSM,583
2527
2528
  agilicus/policy_config/policy_config_main.py,sha256=s9wBRtGNY5l4rIES_x2hQ-BTZ5hoIZ7SQZQeFU2so24,767
@@ -2547,8 +2548,8 @@ agilicus/trusted_certs/trusted_certs_main.py,sha256=6dHHWXvNIcUa_nA9ptigL4Vibe4n
2547
2548
  agilicus/users.py,sha256=JT7TIiUOtSFXPOdxmIVFm7ygZTH1FjsIkD9j-vjLuMM,38474
2548
2549
  agilicus/version.py,sha256=G9OFdL1v_4dLDfk6I6taDNypM5bbO-JHAwilsu9LYgg,23
2549
2550
  agilicus/whoami.py,sha256=kqghtWMgZOd2rhKmfguDwCTm6A3gNS8Kj-S2IBxBtl0,206
2550
- agilicus-1.251.4.dist-info/LICENSE.txt,sha256=Zq4tqiCroC2CVrBB_PWjapRdvpae23nljdiaSkOzUho,1061
2551
- agilicus-1.251.4.dist-info/METADATA,sha256=_-hEUFB8gzHxRbPNM-qEv47KO2g0wRR6tIl2ZHWL2g8,3822
2552
- agilicus-1.251.4.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
2553
- agilicus-1.251.4.dist-info/entry_points.txt,sha256=a66hGozzLkHu0IewFzIMbSAhMTNTddUaA2T3_16Gb_s,51
2554
- agilicus-1.251.4.dist-info/RECORD,,
2551
+ agilicus-1.253.0.dist-info/LICENSE.txt,sha256=Zq4tqiCroC2CVrBB_PWjapRdvpae23nljdiaSkOzUho,1061
2552
+ agilicus-1.253.0.dist-info/METADATA,sha256=GYd-hlk1FxaDh05ns_rUuoie9fcIq7ruXAEWkqxZHe8,3822
2553
+ agilicus-1.253.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
2554
+ agilicus-1.253.0.dist-info/entry_points.txt,sha256=a66hGozzLkHu0IewFzIMbSAhMTNTddUaA2T3_16Gb_s,51
2555
+ agilicus-1.253.0.dist-info/RECORD,,