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 +2 -1
- agilicus/agilicus_api/api_client.py +1 -1
- agilicus/agilicus_api/configuration.py +1 -1
- agilicus/agilicus_api_README.md +1 -1
- agilicus/main.py +2 -0
- agilicus/policy/policies.py +97 -0
- agilicus/policy/policy_main.py +31 -0
- agilicus/policy/templates.py +194 -0
- agilicus/rules/rules.py +62 -21
- {agilicus-1.245.0.dist-info → agilicus-1.246.0.dist-info}/METADATA +1 -1
- {agilicus-1.245.0.dist-info → agilicus-1.246.0.dist-info}/RECORD +14 -11
- {agilicus-1.245.0.dist-info → agilicus-1.246.0.dist-info}/LICENSE.txt +0 -0
- {agilicus-1.245.0.dist-info → agilicus-1.246.0.dist-info}/WHEEL +0 -0
- {agilicus-1.245.0.dist-info → agilicus-1.246.0.dist-info}/entry_points.txt +0 -0
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 =
|
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.
|
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.
|
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):
|
agilicus/agilicus_api_README.md
CHANGED
@@ -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.
|
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
|
-
|
124
|
-
|
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(
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
|
@@ -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=
|
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=
|
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
|
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=
|
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=
|
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=
|
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.
|
2488
|
-
agilicus-1.
|
2489
|
-
agilicus-1.
|
2490
|
-
agilicus-1.
|
2491
|
-
agilicus-1.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|