agilicus 1.245.0__py3-none-any.whl → 1.246.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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
|