agilicus 1.245.0__py3-none-any.whl → 1.246.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
@@ -38,6 +38,7 @@ def create_or_update(
38
38
  create_method: Callable,
39
39
  update_method: Callable = None,
40
40
  to_dict=True,
41
+ guid_finder=find_guid,
41
42
  ) -> [dict, str]:
42
43
  """A helper method that handles duplicate (409)
43
44
  creation of objects. On 409, if the update_method is provided,
@@ -70,7 +71,7 @@ def create_or_update(
70
71
  raise
71
72
  result = json.loads(body)
72
73
  if update_method:
73
- guid = find_guid(result)
74
+ guid = guid_finder(result)
74
75
  if to_dict:
75
76
  return update_method(guid, obj).to_dict(), 200
76
77
  else:
@@ -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.245.0/python'
80
+ self.user_agent = 'OpenAPI-Generator/1.246.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.03.19\n"\
390
- "SDK Package Version: 1.245.0".\
390
+ "SDK Package Version: 1.246.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.03.19
7
- - Package version: 1.245.0
7
+ - Package version: 1.246.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/main.py CHANGED
@@ -75,6 +75,7 @@ from .labels import labels_main
75
75
  from .rules import rules_main
76
76
  from .products import products_main
77
77
  from .features import features_main
78
+ from .policy import policy_main
78
79
  from .features.features import format_features
79
80
  from .credentials_commands import credentials_main
80
81
  from .files_pkg import files_main
@@ -7939,6 +7940,7 @@ def main():
7939
7940
  hosts_main.add_commands(cli)
7940
7941
  labels_main.add_commands(cli)
7941
7942
  rules_main.add_commands(cli)
7943
+ policy_main.add_commands(cli)
7942
7944
  products_main.add_commands(cli)
7943
7945
  credentials_main.add_commands(cli)
7944
7946
  features_main.add_commands(cli)
@@ -0,0 +1,97 @@
1
+ from ..input_helpers import (
2
+ get_org_from_input_or_ctx,
3
+ )
4
+
5
+ from .. import context
6
+ from ..rules.rules import (
7
+ add_list_resources_sdk,
8
+ list_rules,
9
+ list_rule_trees,
10
+ list_rulesets,
11
+ RuleAddInfo,
12
+ RulesetAddInfo,
13
+ RuleTreeAddInfo,
14
+ )
15
+
16
+ from ..output.table import (
17
+ format_table,
18
+ column,
19
+ )
20
+
21
+ from .templates import MultifactorTemplate, MFA_LABEL
22
+
23
+
24
+ class LabelAddInfo:
25
+ def __init__(self, apiclient):
26
+ super().__init__()
27
+ self.create_fn = lambda obj: apiclient.rules_api.create_ruleset_label(obj)
28
+ # Can't replace. Just return the object
29
+ self.replace_fn = lambda guid, obj: obj
30
+ self.name_getter = lambda obj: obj.spec.name
31
+ self.guid_finder = lambda obj_as_dict: obj_as_dict["spec"]["name"]
32
+
33
+
34
+ def set_multifactor_policy(ctx, name, duration, label=None, **kwargs):
35
+ org_id = get_org_from_input_or_ctx(ctx, **kwargs)
36
+ tmpl = MultifactorTemplate(name, duration, org_id=org_id, labels=label)
37
+
38
+ token = context.get_token(ctx)
39
+ apiclient = context.get_apiclient(ctx, token)
40
+ add_list_resources_sdk(
41
+ ctx,
42
+ tmpl.get_rules(),
43
+ RuleAddInfo(apiclient),
44
+ handle_failure=False,
45
+ )
46
+ add_list_resources_sdk(
47
+ ctx, tmpl.get_trees(), RuleTreeAddInfo(apiclient), handle_failure=False
48
+ )
49
+ add_list_resources_sdk(
50
+ ctx, tmpl.get_labels(), LabelAddInfo(apiclient), handle_failure=False
51
+ )
52
+
53
+ add_list_resources_sdk(
54
+ ctx, tmpl.get_sets(), RulesetAddInfo(apiclient), handle_failure=False
55
+ )
56
+
57
+ return tmpl
58
+
59
+
60
+ def ruleset_labelled(ruleset, label):
61
+ for ruleset_label in ruleset.spec.labels or []:
62
+ if str(ruleset_label) == label:
63
+ return True
64
+ return False
65
+
66
+
67
+ def list_multifactor_policies(ctx, **kwargs):
68
+ org_id = get_org_from_input_or_ctx(ctx, **kwargs)
69
+ rules = list_rules(ctx, org_id=org_id)
70
+ trees = list_rule_trees(ctx, org_id=org_id)
71
+ sets = list_rulesets(ctx, org_id=org_id)
72
+
73
+ names = []
74
+ for ruleset in sets:
75
+ if ruleset_labelled(ruleset, MFA_LABEL):
76
+ names.append(str(ruleset.spec.name))
77
+
78
+ templates = []
79
+ for name in names:
80
+ tmpl = MultifactorTemplate.from_api(
81
+ name=name, rules=rules, trees=trees, sets=sets, org_id=org_id
82
+ )
83
+ if tmpl:
84
+ templates.append(tmpl)
85
+
86
+ return templates
87
+
88
+
89
+ def format_multifactor_policies(ctx, templates):
90
+ columns = [
91
+ column("name"),
92
+ column("org_id"),
93
+ column("duration"),
94
+ column("labels"),
95
+ ]
96
+
97
+ return format_table(ctx, templates, columns)
@@ -0,0 +1,31 @@
1
+ import click
2
+
3
+ from . import policies
4
+ from ..output.table import output_entry
5
+
6
+
7
+ @click.command(name="set-multifactor-policy")
8
+ @click.option("--name", required=True)
9
+ @click.option("--label", multiple=True, type=str)
10
+ @click.option("--duration", required=True, type=int)
11
+ @click.option("--org-id", default=None)
12
+ @click.pass_context
13
+ def cli_command_set_multifactor_policy(ctx, **kwargs):
14
+ output_entry(ctx, policies.set_multifactor_policy(ctx, **kwargs).to_dict())
15
+
16
+
17
+ @click.command(name="list-multifactor-policies")
18
+ @click.option("--org-id", default=None)
19
+ @click.pass_context
20
+ def cli_command_list_multifactor_policies(ctx, **kwargs):
21
+ results = policies.list_multifactor_policies(ctx, **kwargs)
22
+ print(policies.format_multifactor_policies(ctx, results))
23
+
24
+
25
+ all_funcs = [func for func in dir() if "cli_command_" in func]
26
+
27
+
28
+ def add_commands(cli):
29
+ glob = globals()
30
+ for func in all_funcs:
31
+ cli.add_command(glob[func])
@@ -0,0 +1,194 @@
1
+ import regex
2
+
3
+ from abc import abstractmethod
4
+ from typing import Optional
5
+
6
+ from agilicus import (
7
+ RuleAction,
8
+ RuleCondition,
9
+ RuleConfig,
10
+ MaxMFAProofRuleCondition,
11
+ StandaloneObjectConditions,
12
+ StandaloneRule,
13
+ StandaloneRuleName,
14
+ StandaloneRuleScope,
15
+ StandaloneRuleSpec,
16
+ StandaloneRuleTree,
17
+ StandaloneRuleTreeSpec,
18
+ StandaloneRuleTreeRef,
19
+ StandaloneRuleTreeRuleRef,
20
+ StandaloneRuleTreeNode,
21
+ StandaloneRuleset,
22
+ StandaloneRulesetLabelName,
23
+ StandaloneRulesetLabelSpec,
24
+ StandaloneRulesetLabel,
25
+ StandaloneRulesetSpec,
26
+ )
27
+
28
+
29
+ class PolicyTemplate:
30
+ @abstractmethod
31
+ def get_rules(self) -> list[StandaloneRule]:
32
+ pass
33
+
34
+ @abstractmethod
35
+ def get_trees(self) -> list[StandaloneRuleTree]:
36
+ pass
37
+
38
+ @abstractmethod
39
+ def get_sets(self) -> list[StandaloneRuleset]:
40
+ pass
41
+
42
+ @abstractmethod
43
+ def get_labels(self) -> list[StandaloneRulesetLabel]:
44
+ pass
45
+
46
+
47
+ def mfa_cond(max_seconds):
48
+ return MaxMFAProofRuleCondition(
49
+ condition_type="mfa_rule_condition", max_seconds=max_seconds
50
+ )
51
+
52
+
53
+ MFA_LABEL = "global-multifactor"
54
+ LABEL_REGEX = regex.compile(r"urn:agilicus:label:(?P<label>[a-zA-Z0-9\-\._:]+)")
55
+
56
+
57
+ def parse_label(scope):
58
+ match = LABEL_REGEX.match(str(scope))
59
+ if not match:
60
+ return None
61
+ return match.group("label")
62
+
63
+
64
+ def parse_labels(scopes):
65
+ result = []
66
+ for scope in scopes:
67
+ label = parse_label(scope)
68
+ if not label:
69
+ continue
70
+ result.append(label)
71
+ return result
72
+
73
+
74
+ class MultifactorTemplate(PolicyTemplate):
75
+ name_regex = regex.compile(r"agilicus-mfa-tmpl-(?P<name>[a-zA-Z0-9\-\._]+)")
76
+
77
+ def __init__(self, name, duration, org_id, labels: Optional[list[str]] = None):
78
+ self.name = name
79
+ self.duration = duration
80
+ self.labels = labels or []
81
+ self.org_id = org_id
82
+
83
+ def to_dict(self):
84
+ return {
85
+ "name": self.name,
86
+ "duration": self.duration,
87
+ "labels": self.labels,
88
+ "org_id": self.org_id,
89
+ }
90
+
91
+ @classmethod
92
+ def build_name(cls, name):
93
+ return f"agilicus-mfa-tmpl-{name}"
94
+
95
+ def get_name(self):
96
+ return self.build_name(self.name)
97
+
98
+ @classmethod
99
+ def parse_name(cls, name):
100
+ match = cls.name_regex.match(name)
101
+ if not match:
102
+ return None
103
+ return match.group("name")
104
+
105
+ def get_rules(self) -> list[StandaloneRule]:
106
+ cond = mfa_cond(self.duration)
107
+ action = RuleAction(action="mfa")
108
+ extended_condition = RuleCondition(negated=True, condition=cond)
109
+ spec = StandaloneRuleSpec(
110
+ rule=RuleConfig(
111
+ name=self.get_name(),
112
+ extended_condition=extended_condition,
113
+ actions=[action],
114
+ ),
115
+ org_id=self.org_id,
116
+ )
117
+
118
+ rule = StandaloneRule(spec=spec)
119
+ return [rule]
120
+
121
+ def get_trees(self) -> list[StandaloneRuleTree]:
122
+ spec = StandaloneRuleTreeSpec(
123
+ tree=StandaloneRuleTreeNode(
124
+ rules=[
125
+ StandaloneRuleTreeRuleRef(
126
+ rule_name=StandaloneRuleName(self.get_name()),
127
+ )
128
+ ],
129
+ children=[],
130
+ ),
131
+ name=StandaloneRuleName(self.get_name()),
132
+ org_id=self.org_id,
133
+ object_conditions=StandaloneObjectConditions(),
134
+ # object_conditions=StandaloneObjectConditions(
135
+ # scopes=[StandaloneRuleScope("urn:agilicus:scope:any_resource_user")]
136
+ # )
137
+ )
138
+
139
+ return [StandaloneRuleTree(spec=spec)]
140
+
141
+ def get_sets(self) -> list[StandaloneRuleset]:
142
+ spec = StandaloneRulesetSpec(
143
+ rule_trees=[
144
+ StandaloneRuleTreeRef(
145
+ rule_tree_name=StandaloneRuleName(self.get_name()),
146
+ priority=0,
147
+ )
148
+ ],
149
+ labels=[StandaloneRulesetLabelName(MFA_LABEL)],
150
+ name=StandaloneRuleName(self.get_name()),
151
+ org_id=self.org_id,
152
+ )
153
+ scopes = [
154
+ StandaloneRuleScope(f"urn:agilicus:label:{label}") for label in self.labels
155
+ ]
156
+ if scopes:
157
+ object_conditions = StandaloneObjectConditions(scopes=scopes)
158
+ spec.object_conditions = object_conditions
159
+
160
+ return [StandaloneRuleset(spec=spec)]
161
+
162
+ def get_labels(self) -> list[StandaloneRulesetLabel]:
163
+ spec = StandaloneRulesetLabelSpec(
164
+ name=StandaloneRulesetLabelName(MFA_LABEL),
165
+ org_id=self.org_id,
166
+ )
167
+
168
+ return [
169
+ StandaloneRulesetLabel(spec=spec),
170
+ ]
171
+
172
+ @classmethod
173
+ def from_api(cls, name, rules, org_id, trees, sets):
174
+ found_sets = list(filter(lambda s: str(s.spec.name) == name, sets))
175
+ found_trees = list(filter(lambda s: str(s.spec.name) == name, trees))
176
+ found_rules = list(filter(lambda s: str(s.spec.rule.name) == name, rules))
177
+
178
+ if len(found_sets) == 0 or len(found_rules) == 0 or len(found_trees) == 0:
179
+ return None
180
+
181
+ # There should be only one, given that names are unique.
182
+ ruleset = found_sets[0]
183
+ labels = []
184
+ if ruleset.spec.object_conditions:
185
+ labels = parse_labels(ruleset.spec.object_conditions.scopes)
186
+ rule = found_rules[0]
187
+ try:
188
+ duration = rule.spec.rule.extended_condition.condition.max_seconds
189
+ except Exception:
190
+ return None
191
+
192
+ return MultifactorTemplate(
193
+ name=cls.parse_name(name), duration=duration, labels=labels, org_id=org_id
194
+ )
agilicus/rules/rules.py CHANGED
@@ -18,7 +18,7 @@ from ..output.table import (
18
18
  column,
19
19
  )
20
20
 
21
- from agilicus import create_or_update
21
+ from agilicus import create_or_update, find_guid
22
22
 
23
23
  ACTIONS = ["allow", "deny", "redirect", "log", "none", "revocation_check", "mfa"]
24
24
 
@@ -116,29 +116,80 @@ def _obj_from_dict(klass, obj_dict, org_id):
116
116
  return model_from_dict(klass, obj_dict)
117
117
 
118
118
 
119
+ class AddInfo:
120
+ def __init__(self):
121
+ super().__init__()
122
+ self.name_getter = name_in_spec
123
+ self.guid_finder = find_guid
124
+
125
+
119
126
  def name_in_spec(obj):
120
127
  return obj.spec.name
121
128
 
122
129
 
123
- def add_list_of_resouces(
124
- ctx, as_dicts, klass, create_fn, replace_fn, name_getter=name_in_spec, **kwargs
125
- ):
130
+ class RuleAddInfo(AddInfo):
131
+ def __init__(self, apiclient):
132
+ super().__init__()
133
+ self.create_fn = lambda obj: apiclient.rules_api.create_standalone_rule(obj)
134
+ self.replace_fn = lambda guid, obj: apiclient.rules_api.replace_standalone_rule(
135
+ guid, standalone_rule=obj
136
+ )
137
+ self.name_getter = lambda obj: obj.spec.rule.name
138
+
139
+
140
+ class RuleTreeAddInfo(AddInfo):
141
+ def __init__(self, apiclient):
142
+ super().__init__()
143
+ self.create_fn = lambda obj: apiclient.rules_api.create_standalone_rule_tree(obj)
144
+ self.replace_fn = (
145
+ lambda guid, obj: apiclient.rules_api.replace_standalone_rule_tree(
146
+ guid, standalone_rule_tree=obj
147
+ )
148
+ )
149
+
150
+
151
+ class RulesetAddInfo(AddInfo):
152
+ def __init__(self, apiclient):
153
+ super().__init__()
154
+ self.create_fn = lambda obj: apiclient.rules_api.create_standalone_ruleset(obj)
155
+ self.replace_fn = (
156
+ lambda guid, obj: apiclient.rules_api.replace_standalone_ruleset(
157
+ guid, standalone_ruleset=obj
158
+ )
159
+ )
160
+
161
+
162
+ def add_list_of_resouces(ctx, as_dicts, klass, add_info, **kwargs):
126
163
  org_id = get_org_from_input_or_ctx(ctx, **kwargs)
127
164
  objs = [_obj_from_dict(klass, obj, org_id) for obj in as_dicts]
165
+
166
+ return add_list_resources_sdk(ctx, objs, add_info)
167
+
168
+
169
+ def add_list_resources_sdk(ctx, objs, add_info, handle_failure=True):
128
170
  results = []
129
171
  for obj in objs:
130
172
  try:
131
- result, _ = create_or_update(obj, create_fn, replace_fn, to_dict=False)
173
+ result, _ = create_or_update(
174
+ obj,
175
+ add_info.create_fn,
176
+ add_info.replace_fn,
177
+ to_dict=False,
178
+ guid_finder=add_info.guid_finder,
179
+ )
132
180
  results.append(
133
181
  AddResult(
134
- result_name=name_getter(result),
135
- result_id=result.metadata.id,
182
+ result_name=add_info.name_getter(result),
183
+ result_id=add_info.guid_finder(result),
136
184
  )
137
185
  )
138
186
  except Exception as exc:
187
+ if not handle_failure:
188
+ raise
189
+
139
190
  results.append(
140
191
  AddResult(
141
- result_name=name_getter(obj),
192
+ result_name=add_info.name_getter(obj),
142
193
  exc=str(exc),
143
194
  )
144
195
  )
@@ -155,11 +206,7 @@ def add_rules(ctx, rules, **kwargs):
155
206
  ctx,
156
207
  rules,
157
208
  agilicus.StandaloneRule,
158
- lambda obj: apiclient.rules_api.create_standalone_rule(obj),
159
- lambda guid, obj: apiclient.rules_api.replace_standalone_rule(
160
- guid, standalone_rule=obj
161
- ),
162
- name_getter=lambda obj: obj.spec.rule.name,
209
+ RuleAddInfo(apiclient),
163
210
  )
164
211
 
165
212
 
@@ -296,10 +343,7 @@ def add_trees(ctx, trees, **kwargs):
296
343
  ctx,
297
344
  trees,
298
345
  agilicus.StandaloneRuleTree,
299
- lambda obj: apiclient.rules_api.create_standalone_rule_tree(obj),
300
- lambda guid, obj: apiclient.rules_api.replace_standalone_rule_tree(
301
- guid, standalone_rule_tree=obj
302
- ),
346
+ RuleTreeAddInfo(apiclient),
303
347
  )
304
348
 
305
349
 
@@ -426,10 +470,7 @@ def add_rulesets(ctx, rulesets, **kwargs):
426
470
  ctx,
427
471
  rulesets,
428
472
  agilicus.StandaloneRuleset,
429
- lambda obj: apiclient.rules_api.create_standalone_ruleset(obj),
430
- lambda guid, obj: apiclient.rules_api.replace_standalone_ruleset(
431
- guid, standalone_ruleset=obj
432
- ),
473
+ RulesetAddInfo(apiclient),
433
474
  )
434
475
 
435
476
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: agilicus
3
- Version: 1.245.0
3
+ Version: 1.246.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=K8BDgVDJIh7xUpYphJsmb-ZM2ny3_oJKBn1oEEe70Qk,107380
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=_H58rxzMyqBJq8B0TpwzyVIYDlPaLOqGTcwp-GDaDSM,4949
5
+ agilicus/__init__.py,sha256=S2_3WLG9tTuRxTPcP_0eNzBALnu9MMiZnFUEbv-dAqE,4978
6
6
  agilicus/access.py,sha256=UEHHhE3cCaCjxXQDjhKxQAoUEMWandygN0d-yEIIf8A,5457
7
7
  agilicus/admin.py,sha256=Gd4HfM7vQktFOuYOoOV_5uAZXEKWOgL_79Ndnlvxhyw,9340
8
8
  agilicus/agilicus_api/__init__.py,sha256=jmFa7Pr4rMPhCT_QFsO408OQ2RrZZFgrrzWKyABULPI,60973
@@ -67,9 +67,9 @@ agilicus/agilicus_api/api/users_api.py,sha256=zLwPF_gsWfKZeSmDL3dnJOcp66DlQolvwq
67
67
  agilicus/agilicus_api/api/users_api_mock.py,sha256=wA_xiqL3Pz3KjljKlsmf5NveLZS1FpbaKJHBp7QvarY,15411
68
68
  agilicus/agilicus_api/api/whoami_api.py,sha256=Xnn2HjfIbO7FoNQZ_q3UbOTuC6YoPNw1IiSLqYDPu2g,7941
69
69
  agilicus/agilicus_api/api/whoami_api_mock.py,sha256=rlvZoWnMCqORMZBg7SOv6d3xp52kELdh6wXcCaIZ93w,346
70
- agilicus/agilicus_api/api_client.py,sha256=dbcb-TsCvbyxB-5lyRAnijSs0C70SCblnokHc9qut30,38845
70
+ agilicus/agilicus_api/api_client.py,sha256=ZhXs4O8uzqMg8bANYTiZIPy1IV4BYzDNupEYGLoB4NQ,38845
71
71
  agilicus/agilicus_api/apis/__init__.py,sha256=m_hg6OJsEsMp6mZ1mn9OlaTflLjrU3Jc-jvYD9gi_PA,2092
72
- agilicus/agilicus_api/configuration.py,sha256=-dMQT6vSYm-xNwvcT2pPcFNicBLYUCDfMkXtc7v1SPs,18447
72
+ agilicus/agilicus_api/configuration.py,sha256=kbAOkGmULb3zsdgXMW0JVeQo0VQOX9ZIR_EL7xwLrFk,18447
73
73
  agilicus/agilicus_api/docs/APIKey.md,sha256=4cKuz4_l9HcEDnUrLwYbEnn9C2WoDayrjfrY1Ixgaf4,1747
74
74
  agilicus/agilicus_api/docs/APIKeyIntrospect.md,sha256=nJ-zkuFm3JMbWFDYYN_vYyQk1snGBtBvIxtCQxamhAU,1019
75
75
  agilicus/agilicus_api/docs/APIKeyIntrospectAuthorizationInfo.md,sha256=7RApOOLjvWQs5sw2jb25g7i3Kta1BiEY-s8VRXfppH8,725
@@ -2398,7 +2398,7 @@ agilicus/agilicus_api/test/test_x509_root_certificate.py,sha256=AqH9tZ825V2RHtNc
2398
2398
  agilicus/agilicus_api/test/test_x509_root_certificate_spec.py,sha256=8PCPuXVkHrLCXqnaOJm64WGuSnpqIL0zj1AVQSBgf9U,2832
2399
2399
  agilicus/agilicus_api/test/test_x509_root_certificate_status.py,sha256=s8Ups8bxho__nuXR86gwXAtBlAjrmZqA1-YkJwmmCEg,2846
2400
2400
  agilicus/agilicus_api/test/test_xss_settings.py,sha256=kj4qWEH4k8kQWZ4Zb-S6mEvK1e18dN7kPowJ5uyqFE4,2746
2401
- agilicus/agilicus_api_README.md,sha256=fp493wyGmiT1roLLrA3GjHCZF9eMuNbvWXadT4fzI1I,154557
2401
+ agilicus/agilicus_api_README.md,sha256=JLOX2uGzj0NMTZqeVI8iegBhWTZuoa7mtjUxv8MdED8,154557
2402
2402
  agilicus/aliases.ini,sha256=MxqiVo2f2xdUDVF1YDkNW36AIqN8hrYjlTVfraEUZXY,455
2403
2403
  agilicus/amq.py,sha256=yxi-YTbJPVl10s78Hlr1dmrQR63iaSIoROGVILzFPmE,1775
2404
2404
  agilicus/apps.py,sha256=8k_tGraPUVKJURksZwKR8eNGW-4CSPv54FYcApQ3Ly8,50857
@@ -2447,7 +2447,7 @@ agilicus/labels/labels_main.py,sha256=i3HA1ZuMG6N28mwmlhAMt4N95RNpm4eDS3EVRChjRu
2447
2447
  agilicus/launchers.py,sha256=XRW8cO_S7HHs-Cc6_baol9AOOsuGlMto7bLcsKYk6qA,11199
2448
2448
  agilicus/logs.py,sha256=tS8c_sdre1Dncrl59GVGQ0L3d2jtwlVjvIMl3SHJraY,766
2449
2449
  agilicus/lookups.py,sha256=MNmNsKpP7Fq_poLAnL9xo_iptFilKM9ziGLyIe8VKaw,669
2450
- agilicus/main.py,sha256=ZvTEn8D5Bl5pU-wybGWBnyZD51cD_VJdQRxIEkVH4RQ,263647
2450
+ agilicus/main.py,sha256=WbKlV5agX3-aJnOHgOVaRGKenCDtIteYk02HWJv7ddA,263713
2451
2451
  agilicus/messages.py,sha256=Ydm-VhAsK23UnYdstv_HsOybBODfui5ubKc7F8R_dsw,5187
2452
2452
  agilicus/metrics.py,sha256=v4rwpvqDzeNG5GKNoZ7t34X5qUgly5IW2s-kXlS2vQM,2315
2453
2453
  agilicus/orgs.py,sha256=rwTuumHWz0_QPqWNdDPPdAJRGTTNUxVw7bBkxU5a8n8,12874
@@ -2461,6 +2461,9 @@ agilicus/output/tests/column_builder_test.py,sha256=fKP4V5sqXtmEIr-Q0gWVSFdBqCUt
2461
2461
  agilicus/pagination/pagination.py,sha256=hC7eLHxXKe4Iv7LdOZK3Dh8R_fKQIr9PPiWKJVyP4Nk,1672
2462
2462
  agilicus/patches.py,sha256=qTqLOgCAcFZPcPOkgfqMnK9bnqTXMvj_0ERsjRFcZug,1384
2463
2463
  agilicus/permissions.py,sha256=uB65yuDFICp1N10m0cdUjgizx9MQzAbLbAsBSTw1Rcc,2117
2464
+ agilicus/policy/policies.py,sha256=-Sf7I4Qs2jGk6qxLuuKrR5a7hnTJ8I8kuTM4Z7guKZ0,2570
2465
+ agilicus/policy/policy_main.py,sha256=eY0mc445ct5Nv4Jinee4oWersIpj2TncS1TG-b5ZjRo,931
2466
+ agilicus/policy/templates.py,sha256=EUvAhOhSjDuLAe2UKIFEzBp5pNpOT5y1r7uyV_GG6uI,5638
2464
2467
  agilicus/products/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2465
2468
  agilicus/products/products.py,sha256=he27jN3MUyXBdTdV2HRyvUYb0zD3W1TGsuC7NHLKngQ,5365
2466
2469
  agilicus/products/products_main.py,sha256=saa2-e5oeHW6D5AWPcld99KwgQ9nBY3hoW8Jz_5nfMQ,3421
@@ -2468,7 +2471,7 @@ agilicus/regions.py,sha256=21SzUJ9_hC8DiWLSLJ-vtSb1tWLhlcPXH9JhmXD_ypU,3343
2468
2471
  agilicus/resource_helpers.py,sha256=fyfqAxjfnIth1KlHNALlLtYYXIZzlWEJmSZNLdj2JV0,380
2469
2472
  agilicus/resources.py,sha256=nlH4cezzfaiq4M7BK7iwXFUYF3kG9_Su6sFEEXX6I2M,10163
2470
2473
  agilicus/response.py,sha256=tI2-dAJwhBuuDplSsouuMmCmKHSwR_Mx71af8tgsuYo,468
2471
- agilicus/rules/rules.py,sha256=pES0ElnxjYtJwRc_QvmaUpR-Cz4cwww-1dbcTe6LWJc,19992
2474
+ agilicus/rules/rules.py,sha256=ALHJr_tX2iGDKGKUMTteAp0iUQExqNGAhz3hcypxaF0,21019
2472
2475
  agilicus/rules/rules_main.py,sha256=hHyeY0WzFT2l1AQlA1C1PJQLuaEAgRhSbIUALHIyaa8,10750
2473
2476
  agilicus/scopes.py,sha256=OgPUksJSOSaJ3XcHPP8WJQ3e_p8B9wVmRXr-oZDfZP0,1344
2474
2477
  agilicus/service_configuration.py,sha256=WlsvTKA_bkle1PthJK0S96lpPK7GNr-BWWp8a_-MgtM,490
@@ -2484,8 +2487,8 @@ agilicus/trusted_certs/trusted_certs_main.py,sha256=6dHHWXvNIcUa_nA9ptigL4Vibe4n
2484
2487
  agilicus/users.py,sha256=cBqZwqNz_9lcEJuFL5YTUFpbN56kL0-maBlM29KWWrQ,38728
2485
2488
  agilicus/version.py,sha256=G9OFdL1v_4dLDfk6I6taDNypM5bbO-JHAwilsu9LYgg,23
2486
2489
  agilicus/whoami.py,sha256=kqghtWMgZOd2rhKmfguDwCTm6A3gNS8Kj-S2IBxBtl0,206
2487
- agilicus-1.245.0.dist-info/LICENSE.txt,sha256=Zq4tqiCroC2CVrBB_PWjapRdvpae23nljdiaSkOzUho,1061
2488
- agilicus-1.245.0.dist-info/METADATA,sha256=sS-sA0q1EHaBJ_5mHwJ80HkkCZrw3wC2c4WYhbAGXck,3822
2489
- agilicus-1.245.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
2490
- agilicus-1.245.0.dist-info/entry_points.txt,sha256=a66hGozzLkHu0IewFzIMbSAhMTNTddUaA2T3_16Gb_s,51
2491
- agilicus-1.245.0.dist-info/RECORD,,
2490
+ agilicus-1.246.0.dist-info/LICENSE.txt,sha256=Zq4tqiCroC2CVrBB_PWjapRdvpae23nljdiaSkOzUho,1061
2491
+ agilicus-1.246.0.dist-info/METADATA,sha256=tTBFD6BkRJPQ23J8nAiRnf_bQAP2mVOBgtv9eYBS9PA,3822
2492
+ agilicus-1.246.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
2493
+ agilicus-1.246.0.dist-info/entry_points.txt,sha256=a66hGozzLkHu0IewFzIMbSAhMTNTddUaA2T3_16Gb_s,51
2494
+ agilicus-1.246.0.dist-info/RECORD,,